From 6a903ceb0fe29ef3a33cef35bba7975f98b42dc6 Mon Sep 17 00:00:00 2001 From: Taekyun Kim Date: Mon, 11 Apr 2016 17:01:34 +0900 Subject: [PATCH] surface: Basic surface implementation Just simple memory allocation and initialization Change-Id: I00966409bc83d0f8e8d5d0b611fa77214a5f0d8c --- src/wsi/surface.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/wsi/wsi.h | 25 ++++++++++++++++++ 2 files changed, 104 insertions(+) diff --git a/src/wsi/surface.c b/src/wsi/surface.c index 2c52eb0..9f03c85 100644 --- a/src/wsi/surface.c +++ b/src/wsi/surface.c @@ -29,7 +29,11 @@ vk_DestroySurfaceKHR(VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks *allocator) { + vk_surface_t *sfc = (vk_surface_t *)surface; + /* TODO: */ + + vk_free(&sfc->allocator, sfc); } #ifdef VK_USE_PLATFORM_XLIB_KHR @@ -39,7 +43,22 @@ vk_CreateXlibSurfaceKHR(VkInstance instance, const VkAllocationCallbacks *allocator, VkSurfaceKHR *surface) { + vk_surface_t *sfc; + + allocator = vk_get_allocator(instance, allocator); + + sfc = vk_alloc(allocator, sizeof(vk_surface_t), VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + VK_CHECK(sfc, return VK_ERROR_OUT_OF_HOST_MEMORY, "vk_alloc() failed.\n"); + + sfc->allocator = *allocator; + sfc->platform.base.platform = VK_ICD_WSI_PLATFORM_XLIB; + sfc->platform.xlib.dpy = info->dpy; + sfc->platform.xlib.window = info->window; + + *surface = (VkSurfaceKHR)sfc; + /* TODO: */ + return VK_SUCCESS; } @@ -61,7 +80,22 @@ vk_CreateXcbSurfaceKHR(VkInstance instance, const VkAllocationCallbacks *allocator, VkSurfaceKHR *surface) { + vk_surface_t *sfc; + + allocator = vk_get_allocator(instance, allocator); + + sfc = vk_alloc(allocator, sizeof(vk_surface_t), VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + VK_CHECK(sfc, return VK_ERROR_OUT_OF_HOST_MEMORY, "vk_alloc() failed.\n"); + + sfc->allocator = *allocator; + sfc->platform.base.platform = VK_ICD_WSI_PLATFORM_XCB; + sfc->platform.xcb.connection = info->connection; + sfc->platform.xcb.window = info->window; + + *surface = (VkSurfaceKHR)sfc; + /* TODO: */ + return VK_SUCCESS; } @@ -83,7 +117,22 @@ vk_CreateWaylandSurfaceKHR(VkInstance instance, const VkAllocationCallbacks *allocator, VkSurfaceKHR *surface) { + vk_surface_t *sfc; + + allocator = vk_get_allocator(instance, allocator); + + sfc = vk_alloc(allocator, sizeof(vk_surface_t), VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + VK_CHECK(sfc, return VK_ERROR_OUT_OF_HOST_MEMORY, "vk_alloc() failed.\n"); + + sfc->allocator = *allocator; + sfc->platform.base.platform = VK_ICD_WSI_PLATFORM_WAYLAND; + sfc->platform.wayland.display = info->display; + sfc->platform.wayland.surface = info->surface; + + *surface = (VkSurfaceKHR)sfc; + /* TODO: */ + return VK_SUCCESS; } @@ -98,6 +147,36 @@ vk_GetPhysicalDeviceWaylandPresentationSupportKHR(VkPhysicalDevice pdev, #endif VKAPI_ATTR VkResult VKAPI_CALL +vk_CreateDisplayPlaneSurfaceKHR(VkInstance instance, + const VkDisplaySurfaceCreateInfoKHR *info, + const VkAllocationCallbacks *allocator, + VkSurfaceKHR *surface) +{ + vk_surface_t *sfc; + + allocator = vk_get_allocator(instance, allocator); + + sfc = vk_alloc(allocator, sizeof(vk_surface_t), VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); + VK_CHECK(sfc, return VK_ERROR_OUT_OF_HOST_MEMORY, "vk_alloc() failed.\n"); + + sfc->allocator = *allocator; + sfc->platform.base.platform = VK_ICD_WSI_PLATFORM_DISPLAY; + sfc->platform.display.displayMode = info->displayMode; + sfc->platform.display.planeIndex = info->planeIndex; + sfc->platform.display.planeStackIndex = info->planeStackIndex; + sfc->platform.display.transform = info->transform; + sfc->platform.display.globalAlpha = info->globalAlpha; + sfc->platform.display.alphaMode = info->alphaMode; + sfc->platform.display.imageExtent = info->imageExtent; + + *surface = (VkSurfaceKHR)sfc; + + /* TODO: */ + + return VK_SUCCESS; +} + +VKAPI_ATTR VkResult VKAPI_CALL vk_GetPhysicalDeviceSurfaceSupportKHR(VkPhysicalDevice pdev, uint32_t queue_family_index, VkSurfaceKHR surface, diff --git a/src/wsi/wsi.h b/src/wsi/wsi.h index 00d4c7b..a2228df 100644 --- a/src/wsi/wsi.h +++ b/src/wsi/wsi.h @@ -27,8 +27,33 @@ #include #include +#include +#include #include +typedef struct vk_surface vk_surface_t; + +struct vk_surface { + union { + VkIcdSurfaceBase base; + VkIcdSurfaceDisplay display; + +#ifdef VK_USE_PLATFORM_XLIB_KHR + VkIcdSurfaceXlib xlib; +#endif + +#ifdef VK_USE_PLATFORM_XCB_KHR + VkIcdSurfaceXcb xcb; +#endif + +#ifdef VK_USE_PLATFORM_WAYLAND_KHR + VkIcdSurfaceWayland wayland; +#endif + } platform; + + VkAllocationCallbacks allocator; +}; + VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vk_icdGetInstanceProcAddr(VkInstance instance, const char *name); -- 2.7.4