diff --git a/layersvt/VkLayer_DebugMarker.def b/layersvt/VkLayer_DebugMarker.def new file mode 100644 index 0000000000..a00a872d02 --- /dev/null +++ b/layersvt/VkLayer_DebugMarker.def @@ -0,0 +1,20 @@ +; Copyright (C) 2026 Google Inc. +; +; Licensed under the Apache License, Version 2.0 (the "License"); +; you may not use this file except in compliance with the License. +; You may obtain a copy of the License at +; +; http://www.apache.org/licenses/LICENSE-2.0 +; +; Unless required by applicable law or agreed to in writing, software +; distributed under the License is distributed on an "AS IS" BASIS, +; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +; See the License for the specific language governing permissions and +; limitations under the License. + +LIBRARY VkLayer_DebugMarker +EXPORTS +vkGetInstanceProcAddr +vkGetDeviceProcAddr +vkEnumerateInstanceLayerProperties +vkEnumerateInstanceExtensionProperties diff --git a/layersvt/debug_marker_handwritten_dispatch.cpp b/layersvt/debug_marker_handwritten_dispatch.cpp index 560321eeb6..a320032500 100644 --- a/layersvt/debug_marker_handwritten_dispatch.cpp +++ b/layersvt/debug_marker_handwritten_dispatch.cpp @@ -22,6 +22,7 @@ extern "C" { static PFN_vkVoidFunction debug_marker_known_instance_functions(const char* pName) { + if (strcmp(pName, "vkGetInstanceProcAddr") == 0) return reinterpret_cast(vkGetInstanceProcAddr); if (strcmp(pName, "vkCreateInstance") == 0) return reinterpret_cast(vkCreateInstance); if (strcmp(pName, "vkDestroyInstance") == 0) return reinterpret_cast(vkDestroyInstance); if (strcmp(pName, "vkEnumeratePhysicalDevices") == 0) return reinterpret_cast(vkEnumeratePhysicalDevices); @@ -35,6 +36,7 @@ static PFN_vkVoidFunction debug_marker_known_instance_functions(const char* pNam } static PFN_vkVoidFunction debug_marker_known_device_functions(const char* pName) { + if (strcmp(pName, "vkGetDeviceProcAddr") == 0) return reinterpret_cast(vkGetDeviceProcAddr); if (strcmp(pName, "vkCreateDevice") == 0) return reinterpret_cast(vkCreateDevice); if (strcmp(pName, "vkEnumerateDeviceLayerProperties") == 0) return reinterpret_cast(vkEnumerateDeviceLayerProperties); if (strcmp(pName, "vkEnumerateDeviceExtensionProperties") == 0) return reinterpret_cast(vkEnumerateDeviceExtensionProperties); diff --git a/layersvt/debug_marker_handwritten_functions.h b/layersvt/debug_marker_handwritten_functions.h index 7f2dd82a11..55d390fd26 100644 --- a/layersvt/debug_marker_handwritten_functions.h +++ b/layersvt/debug_marker_handwritten_functions.h @@ -162,7 +162,7 @@ EXPORT_FUNCTION VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionPrope return util_GetExtensionProperties(ARRAY_SIZE(instanceExtensions), instanceExtensions, pPropertyCount, pProperties); } - return VK_ERROR_LAYER_NOT_PRESENT; + return util_GetExtensionProperties(0, nullptr, pPropertyCount, pProperties); } EXPORT_FUNCTION VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t* pPropertyCount, @@ -196,6 +196,7 @@ EXPORT_FUNCTION VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionPropert VkExtensionProperties* pProperties) { static const VkExtensionProperties deviceExtensions[] = { {VK_EXT_DEBUG_MARKER_EXTENSION_NAME, VK_EXT_DEBUG_MARKER_SPEC_VERSION}, + {VK_EXT_DEBUG_UTILS_EXTENSION_NAME, VK_EXT_DEBUG_UTILS_SPEC_VERSION}, }; if (pLayerName != nullptr && strcmp(pLayerName, "VK_LAYER_GOOGLE_DebugMarker") == 0) { @@ -209,7 +210,7 @@ EXPORT_FUNCTION VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionPropert if (pProperties == nullptr) { VkResult res = instance_dispatch_table(vk_instance)->EnumerateDeviceExtensionProperties(physicalDevice, pLayerName, pPropertyCount, pProperties); if (res == VK_SUCCESS) { - (*pPropertyCount) += 1; + (*pPropertyCount) += ARRAY_SIZE(deviceExtensions); } return res; } @@ -219,9 +220,26 @@ EXPORT_FUNCTION VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionPropert VkResult res = instance_dispatch_table(vk_instance)->EnumerateDeviceExtensionProperties(physicalDevice, pLayerName, pPropertyCount, pProperties); if (res == VK_SUCCESS) { uint32_t originalCount = *pPropertyCount; - *pPropertyCount = std::min(originalCount + 1, requestedCount); - if (*pPropertyCount > originalCount) { - pProperties[originalCount] = deviceExtensions[0]; + uint32_t additionalCount = 0; + + for (uint32_t i = 0; i < ARRAY_SIZE(deviceExtensions); ++i) { + bool found = false; + for (uint32_t j = 0; j < originalCount; ++j) { + if (strcmp(pProperties[j].extensionName, deviceExtensions[i].extensionName) == 0) { + found = true; + break; + } + } + if (!found) { + if (originalCount + additionalCount < requestedCount) { + pProperties[originalCount + additionalCount] = deviceExtensions[i]; + } + additionalCount++; + } + } + *pPropertyCount = originalCount + additionalCount; + if (*pPropertyCount > requestedCount) { + *pPropertyCount = requestedCount; } } return res;