27 #include "../../SDL_internal.h"
29 #if SDL_VIDEO_VULKAN && SDL_VIDEO_DRIVER_KMSDRM
38 #include "sys/ioctl.h"
40 #if defined(__OpenBSD__)
41 #define DEFAULT_VULKAN "libvulkan.so"
43 #define DEFAULT_VULKAN "libvulkan.so.1"
46 int KMSDRM_Vulkan_LoadLibrary(
_THIS,
const char *
path)
61 path = DEFAULT_VULKAN;
85 extensions = SDL_Vulkan_CreateInstanceExtensionsList(
93 for(
i = 0;
i < extensionCount;
i++)
103 if(!hasSurfaceExtension)
109 else if(!hasDisplayExtension)
124 void KMSDRM_Vulkan_UnloadLibrary(
_THIS)
148 static const char *
const extensionsForKMSDRM[] = {
156 return SDL_Vulkan_GetInstanceExtensions_Helper(
158 extensionsForKMSDRM);
185 VkPhysicalDevice gpu;
191 VkPhysicalDevice *physical_devices =
NULL;
200 VkDisplayModeKHR display_mode;
211 int display_index = 0;
223 instance,
"vkCreateDisplayPlaneSurfaceKHR");
227 instance,
"vkEnumeratePhysicalDevices");
231 instance,
"vkGetPhysicalDeviceDisplayPropertiesKHR");
235 instance,
"vkGetDisplayModePropertiesKHR");
239 instance,
"vkGetPhysicalDeviceDisplayPlanePropertiesKHR");
252 instance,
"vkCreateDisplayModeKHR");
272 " extension is not enabled in the Vulkan instance.");
279 if (gpu_count == 0) {
280 SDL_SetError(
"Vulkan can't find physical devices (gpus).");
285 physical_devices =
malloc(
sizeof(VkPhysicalDevice) * gpu_count);
292 gpu = physical_devices[viddata->
devindex];
298 if (display_count == 0) {
311 displays_props[display_index].display,
314 if (mode_count == 0) {
315 SDL_SetError(
"Vulkan can't find any video modes for display %i (%s)\n", 0,
316 displays_props[display_index].displayName);
323 displays_props[display_index].display,
324 &mode_count, modes_props);
328 if (plane_count == 0) {
342 for (
i = 0;
i < mode_count;
i++) {
343 if (modes_props[
i].parameters.visibleRegion.width <=
window->w &&
344 modes_props[
i].parameters.visibleRegion.height <=
window->h)
346 display_mode_props = modes_props[
i];
354 SDL_SetError(
"Vulkan can't find a proper display mode for the window size.");
362 displays_props[display_index].display,
363 &display_mode_create_info,
364 NULL, &display_mode);
376 display_plane_surface_create_info.
displayMode = display_mode;
378 display_plane_surface_create_info.
planeIndex = 0;
379 display_plane_surface_create_info.
imageExtent = image_size;
381 &display_plane_surface_create_info,
387 SDL_Vulkan_GetResultString(
result));
394 if (physical_devices)
395 free (physical_devices);
397 free (displays_props);
void * SDL_LoadFunction(void *handle, const char *name)
GLuint GLuint GLsizei count
GLsizei const GLchar *const * path
GLfloat GLfloat GLfloat GLfloat h
GLubyte GLubyte GLubyte GLubyte w
#define SDL_arraysize(array)
static SDL_VideoDevice * _this
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
EGLSurface EGLNativeWindowType * window
struct SDL_VideoDevice::@441 vulkan_config
PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr
PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties
The type used to identify a window.
VkDisplayModeParametersKHR parameters
VkDisplayModeParametersKHR parameters
VkDisplayModeKHR displayMode
VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *pName)
VkResult(VKAPI_PTR * PFN_vkCreateDisplayPlaneSurfaceKHR)(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface)
VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceDisplayPropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount, VkDisplayPropertiesKHR *pProperties)
#define VK_KHR_SURFACE_EXTENSION_NAME
VkResult(VKAPI_PTR * PFN_vkEnumeratePhysicalDevices)(VkInstance instance, uint32_t *pPhysicalDeviceCount, VkPhysicalDevice *pPhysicalDevices)
VKAPI_ATTR VkResult VKAPI_CALL vkCreateDisplayModeKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display, const VkDisplayModeCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode)
VkResult(VKAPI_PTR * PFN_vkGetPhysicalDeviceDisplayPlanePropertiesKHR)(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount, VkDisplayPlanePropertiesKHR *pProperties)
VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceDisplayPlanePropertiesKHR(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount, VkDisplayPlanePropertiesKHR *pProperties)
VkResult(VKAPI_PTR * PFN_vkGetPhysicalDeviceDisplayPropertiesKHR)(VkPhysicalDevice physicalDevice, uint32_t *pPropertyCount, VkDisplayPropertiesKHR *pProperties)
VkResult(VKAPI_PTR * PFN_vkGetDisplayModePropertiesKHR)(VkPhysicalDevice physicalDevice, VkDisplayKHR display, uint32_t *pPropertyCount, VkDisplayModePropertiesKHR *pProperties)
VKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount, VkPhysicalDevice *pPhysicalDevices)
#define VK_KHR_DISPLAY_EXTENSION_NAME
VKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayModePropertiesKHR(VkPhysicalDevice physicalDevice, VkDisplayKHR display, uint32_t *pPropertyCount, VkDisplayModePropertiesKHR *pProperties)
VKAPI_ATTR VkResult VKAPI_CALL vkCreateDisplayPlaneSurfaceKHR(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface)
VkResult(VKAPI_PTR * PFN_vkEnumerateInstanceExtensionProperties)(const char *pLayerName, uint32_t *pPropertyCount, VkExtensionProperties *pProperties)
VkResult(VKAPI_PTR * PFN_vkCreateDisplayModeKHR)(VkPhysicalDevice physicalDevice, VkDisplayKHR display, const VkDisplayModeCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDisplayModeKHR *pMode)
PFN_vkVoidFunction(VKAPI_PTR * PFN_vkGetInstanceProcAddr)(VkInstance instance, const char *pName)
@ VK_STRUCTURE_TYPE_DISPLAY_MODE_CREATE_INFO_KHR
@ VK_STRUCTURE_TYPE_DISPLAY_SURFACE_CREATE_INFO_KHR