From 922a0fac69a54ab79203e4047ed358c76b6950c0 Mon Sep 17 00:00:00 2001 From: Courtney Goeltzenleuchter Date: Wed, 10 Jun 2015 17:39:03 -0600 Subject: extensions: begin changes for extension support This patch starts restructuring the various components (loader, driver, layers, etc.) to support global and device extensions. Require GetProcAddr to access the extension functions and related support. --- layers/basic.cpp | 68 ++++++++++++++++---------------------------------------- 1 file changed, 19 insertions(+), 49 deletions(-) (limited to 'layers/basic.cpp') diff --git a/layers/basic.cpp b/layers/basic.cpp index f5edf7c0..0742cb21 100644 --- a/layers/basic.cpp +++ b/layers/basic.cpp @@ -91,15 +91,25 @@ VK_LAYER_EXPORT VkResult VKAPI vkLayerExtension1(VkDevice device) return VK_SUCCESS; } -struct extProps { - uint32_t version; - const char * const name; -}; #define BASIC_LAYER_EXT_ARRAY_SIZE 2 -static const struct extProps basicExts[BASIC_LAYER_EXT_ARRAY_SIZE] = { - // TODO what is the version? - 0x10, "Basic", - 0x10, "vkLayerExtension1" + +static const VkExtensionProperties basicExts[BASIC_LAYER_EXT_ARRAY_SIZE] = { + { + VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES, + "Basic", + 0x10, + "Sample layer: Basic ", +// 0, +// NULL, + }, + { + VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES, + "vkLayerExtension1", + 0x10, + "Sample layer: Basic", +// 0, +// NULL, + } }; VK_LAYER_EXPORT VkResult VKAPI vkGetGlobalExtensionInfo( @@ -109,7 +119,6 @@ VK_LAYER_EXPORT VkResult VKAPI vkGetGlobalExtensionInfo( void* pData) { /* This entrypoint is NOT going to init it's own dispatch table since loader calls here early */ - VkExtensionProperties *ext_props; uint32_t *count; if (pDataSize == NULL) @@ -129,11 +138,7 @@ VK_LAYER_EXPORT VkResult VKAPI vkGetGlobalExtensionInfo( return VK_SUCCESS; if (extensionIndex >= BASIC_LAYER_EXT_ARRAY_SIZE) return VK_ERROR_INVALID_VALUE; - ext_props = (VkExtensionProperties *) pData; - ext_props->version = basicExts[extensionIndex].version; - strncpy(ext_props->extName, basicExts[extensionIndex].name, - VK_MAX_EXTENSION_NAME); - ext_props->extName[VK_MAX_EXTENSION_NAME - 1] = '\0'; + memcpy((VkExtensionProperties *) pData, &basicExts[extensionIndex], sizeof(VkExtensionProperties)); break; default: return VK_ERROR_INVALID_VALUE; @@ -197,39 +202,6 @@ VK_LAYER_EXPORT VkResult VKAPI vkGetFormatInfo(VkDevice device, VkFormat format, return result; } -VK_LAYER_EXPORT VkResult VKAPI vkEnumerateLayers(VkPhysicalDevice gpu, size_t maxStringSize, size_t* pLayerCount, char* const* pOutLayers, void* pReserved) -{ - if (gpu != NULL) - { - VkLayerInstanceDispatchTable* pTable = initLayerInstanceTable((const VkBaseLayerObject *) gpu); - - printf("At start of wrapped vkEnumerateLayers() call w/ gpu: %p\n", gpu); - VkResult result = pTable->EnumerateLayers(gpu, maxStringSize, pLayerCount, pOutLayers, pReserved); - return result; - } else - { - if (pLayerCount == NULL || pOutLayers == NULL || pOutLayers[0] == NULL || pReserved == NULL) - return VK_ERROR_INVALID_POINTER; - - // Example of a layer that is only compatible with Intel's GPUs - VkBaseLayerObject* gpuw = (VkBaseLayerObject*) pReserved; - PFN_vkGetPhysicalDeviceInfo fpGetGpuInfo; - VkPhysicalDeviceProperties gpuProps; - size_t dataSize = sizeof(VkPhysicalDeviceProperties); - fpGetGpuInfo = (PFN_vkGetPhysicalDeviceInfo) gpuw->pGPA((VkPhysicalDevice) gpuw->nextObject, "vkGetPhysicalDeviceInfo"); - fpGetGpuInfo((VkPhysicalDevice) gpuw->nextObject, VK_PHYSICAL_DEVICE_INFO_TYPE_PROPERTIES, &dataSize, &gpuProps); - if (gpuProps.vendorId == 0x8086) - { - *pLayerCount = 1; - strncpy((char *) pOutLayers[0], "Basic", maxStringSize); - } else - { - *pLayerCount = 0; - } - return VK_SUCCESS; - } -} - VK_LAYER_EXPORT void * VKAPI vkGetDeviceProcAddr(VkDevice device, const char* pName) { if (device == NULL) @@ -270,8 +242,6 @@ VK_LAYER_EXPORT void * VKAPI vkGetInstanceProcAddr(VkInstance instance, const ch return (void*) vkGetGlobalExtensionInfo; if (!strcmp("vkCreateDevice", pName)) return (void *) vkCreateDevice; - if (!strcmp("vkEnumerateLayers", pName)) - return (void *) vkEnumerateLayers; else { VkBaseLayerObject* instancew = (VkBaseLayerObject *) instance; if (instancew->pGPA == NULL) -- cgit v1.2.3