From dc13c21b1e49ca1e16251d01bd1062157c5c1c2b Mon Sep 17 00:00:00 2001 From: Greg Daniel Date: Thu, 28 Jun 2018 23:29:35 +0000 Subject: Revert "Reland "Let client pass in full extension to GrVkBackendContext."" This reverts commit a782dcb3c407a7e30d7c1263bf9965792088e786. Reason for revert: fuchsia changes reverted Original change's description: > Reland "Let client pass in full extension to GrVkBackendContext." > > This reverts commit cb92b26e5ca6063bcf1a922109b8224e0b6eb4da. > > Reason for revert: > > Original change's description: > > Revert "Let client pass in full extension to GrVkBackendContext." > > > > This reverts commit 45c9dab4c3ec43cedb28d1b8c08e166fe0c2e767. > > > > Reason for revert: fucshia uses GrVkBackendContext. Need to revert earlier changes > > > > Original change's description: > > > Let client pass in full extension to GrVkBackendContext. > > > > > > Bug: skia: > > > Change-Id: I772ab4ccbca0f4f7e7d429d6c421b07d97f0606f > > > Reviewed-on: https://skia-review.googlesource.com/131880 > > > Reviewed-by: Jim Van Verth > > > Commit-Queue: Greg Daniel > > > > TBR=egdaniel@google.com,jvanverth@google.com,bsalomon@google.com > > > > Change-Id: I1a765ff406c83cb234c3614b804fbed677d5a382 > > No-Presubmit: true > > No-Tree-Checks: true > > No-Try: true > > Bug: skia: > > Reviewed-on: https://skia-review.googlesource.com/137901 > > Reviewed-by: Greg Daniel > > Commit-Queue: Greg Daniel > > TBR=egdaniel@google.com,jvanverth@google.com,bsalomon@google.com > > # Not skipping CQ checks because original CL landed > 1 day ago. > > Bug: skia: > Change-Id: I0af797c51dde705473e9afaccb1d4b4423e8c41e > Reviewed-on: https://skia-review.googlesource.com/138302 > Commit-Queue: Greg Daniel > Reviewed-by: Greg Daniel TBR=egdaniel@google.com,jvanverth@google.com,bsalomon@google.com Change-Id: Idf760d5ac6b82df33a4408079a0223be833058ad No-Presubmit: true No-Tree-Checks: true No-Try: true Bug: skia: Reviewed-on: https://skia-review.googlesource.com/138420 Reviewed-by: Greg Daniel Commit-Queue: Greg Daniel --- tools/gpu/vk/VkTestUtils.cpp | 318 ++++++++--------------------------- tools/sk_app/VulkanWindowContext.cpp | 5 +- 2 files changed, 74 insertions(+), 249 deletions(-) (limited to 'tools') diff --git a/tools/gpu/vk/VkTestUtils.cpp b/tools/gpu/vk/VkTestUtils.cpp index 9421b002cd..e6ddda2fce 100644 --- a/tools/gpu/vk/VkTestUtils.cpp +++ b/tools/gpu/vk/VkTestUtils.cpp @@ -59,22 +59,36 @@ const char* kDebugLayerNames[] = { "VK_LAYER_GOOGLE_threading", "VK_LAYER_LUNARG_parameter_validation", "VK_LAYER_LUNARG_object_tracker", + "VK_LAYER_LUNARG_image", "VK_LAYER_LUNARG_core_validation", + "VK_LAYER_LUNARG_swapchain", "VK_LAYER_GOOGLE_unique_objects", // not included in standard_validation //"VK_LAYER_LUNARG_api_dump", //"VK_LAYER_LUNARG_vktrace", //"VK_LAYER_LUNARG_screenshot", }; +#endif -static bool should_include_debug_layer(const VkLayerProperties& layerProps) { - for (size_t i = 0; i < SK_ARRAY_COUNT(kDebugLayerNames); ++i) { - if (!strcmp(layerProps.layerName, kDebugLayerNames[i])) { - return true; - } +// the minimum version of Vulkan supported +#ifdef SK_BUILD_FOR_ANDROID +const uint32_t kGrVkMinimumVersion = VK_MAKE_VERSION(1, 0, 3); +#else +const uint32_t kGrVkMinimumVersion = VK_MAKE_VERSION(1, 0, 8); +#endif + +#define ACQUIRE_VK_PROC(name, instance, device) \ + PFN_vk##name grVk##name = \ + reinterpret_cast(getProc("vk" #name, instance, device)); \ + if (grVk##name == nullptr) { \ + SkDebugf("Function ptr for vk%s could not be acquired\n", #name); \ + if (device != VK_NULL_HANDLE) { \ + destroy_instance(getProc, inst, debugCallback, hasDebugExtension); \ + } \ + return false; \ } - return false; -} + +#ifdef SK_ENABLE_VK_LAYERS VKAPI_ATTR VkBool32 VKAPI_CALL DebugReportCallback( VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, @@ -98,202 +112,6 @@ VKAPI_ATTR VkBool32 VKAPI_CALL DebugReportCallback( } #endif -#define GET_PROC_LOCAL(F, inst, device) PFN_vk ## F F = (PFN_vk ## F) getProc("vk" #F, inst, device) - -#ifdef SK_ENABLE_VK_LAYERS -static uint32_t remove_patch_version(uint32_t specVersion) { - return (specVersion >> 12) << 12; -} -#endif - -static bool init_instance_extensions_and_layers(GrVkInterface::GetProc getProc, - uint32_t specVersion, - SkTArray* instanceExtensions, - SkTArray* instanceLayers) { - if (getProc == nullptr) { - return false; - } - - GET_PROC_LOCAL(EnumerateInstanceExtensionProperties, VK_NULL_HANDLE, VK_NULL_HANDLE); - GET_PROC_LOCAL(EnumerateInstanceLayerProperties, VK_NULL_HANDLE, VK_NULL_HANDLE); - - if (!EnumerateInstanceExtensionProperties || - !EnumerateInstanceLayerProperties) { - return false; - } - - VkResult res; - uint32_t layerCount = 0; -#ifdef SK_ENABLE_VK_LAYERS - // instance layers - res = EnumerateInstanceLayerProperties(&layerCount, nullptr); - if (VK_SUCCESS != res) { - return false; - } - VkLayerProperties* layers = new VkLayerProperties[layerCount]; - res = EnumerateInstanceLayerProperties(&layerCount, layers); - if (VK_SUCCESS != res) { - delete[] layers; - return false; - } - - uint32_t nonPatchVersion = remove_patch_version(specVersion); - for (uint32_t i = 0; i < layerCount; ++i) { - if (nonPatchVersion <= remove_patch_version(layers[i].specVersion) && - should_include_debug_layer(layers[i])) { - instanceLayers->push_back() = layers[i]; - } - } - delete[] layers; -#endif - - // instance extensions - // via Vulkan implementation and implicitly enabled layers - uint32_t extensionCount = 0; - res = EnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr); - if (VK_SUCCESS != res) { - return false; - } - VkExtensionProperties* extensions = new VkExtensionProperties[extensionCount]; - res = EnumerateInstanceExtensionProperties(nullptr, &extensionCount, extensions); - if (VK_SUCCESS != res) { - delete[] extensions; - return false; - } - for (uint32_t i = 0; i < extensionCount; ++i) { - instanceExtensions->push_back() = extensions[i]; - } - delete [] extensions; - - // via explicitly enabled layers - layerCount = instanceLayers->count(); - for (uint32_t layerIndex = 0; layerIndex < layerCount; ++layerIndex) { - uint32_t extensionCount = 0; - res = EnumerateInstanceExtensionProperties((*instanceLayers)[layerIndex].layerName, - &extensionCount, nullptr); - if (VK_SUCCESS != res) { - return false; - } - VkExtensionProperties* extensions = new VkExtensionProperties[extensionCount]; - res = EnumerateInstanceExtensionProperties((*instanceLayers)[layerIndex].layerName, - &extensionCount, extensions); - if (VK_SUCCESS != res) { - delete[] extensions; - return false; - } - for (uint32_t i = 0; i < extensionCount; ++i) { - instanceExtensions->push_back() = extensions[i]; - } - delete[] extensions; - } - - return true; -} - -static bool init_device_extensions_and_layers(GrVkInterface::GetProc getProc, uint32_t specVersion, - VkInstance inst, VkPhysicalDevice physDev, - SkTArray* deviceExtensions, - SkTArray* deviceLayers) { - if (getProc == nullptr) { - return false; - } - - GET_PROC_LOCAL(EnumerateDeviceExtensionProperties, inst, VK_NULL_HANDLE); - GET_PROC_LOCAL(EnumerateDeviceLayerProperties, inst, VK_NULL_HANDLE); - - if (!EnumerateDeviceExtensionProperties || - !EnumerateDeviceLayerProperties) { - return false; - } - - VkResult res; - // device layers - uint32_t layerCount = 0; -#ifdef SK_ENABLE_VK_LAYERS - res = EnumerateDeviceLayerProperties(physDev, &layerCount, nullptr); - if (VK_SUCCESS != res) { - return false; - } - VkLayerProperties* layers = new VkLayerProperties[layerCount]; - res = EnumerateDeviceLayerProperties(physDev, &layerCount, layers); - if (VK_SUCCESS != res) { - delete[] layers; - return false; - } - - uint32_t nonPatchVersion = remove_patch_version(specVersion); - for (uint32_t i = 0; i < layerCount; ++i) { - if (nonPatchVersion <= remove_patch_version(layers[i].specVersion) && - should_include_debug_layer(layers[i])) { - deviceLayers->push_back() = layers[i]; - } - } - delete[] layers; -#endif - - // device extensions - // via Vulkan implementation and implicitly enabled layers - uint32_t extensionCount = 0; - res = EnumerateDeviceExtensionProperties(physDev, nullptr, &extensionCount, nullptr); - if (VK_SUCCESS != res) { - return false; - } - VkExtensionProperties* extensions = new VkExtensionProperties[extensionCount]; - res = EnumerateDeviceExtensionProperties(physDev, nullptr, &extensionCount, extensions); - if (VK_SUCCESS != res) { - delete[] extensions; - return false; - } - for (uint32_t i = 0; i < extensionCount; ++i) { - deviceExtensions->push_back() = extensions[i]; - } - delete[] extensions; - - // via explicitly enabled layers - layerCount = deviceLayers->count(); - for (uint32_t layerIndex = 0; layerIndex < layerCount; ++layerIndex) { - uint32_t extensionCount = 0; - res = EnumerateDeviceExtensionProperties(physDev, - (*deviceLayers)[layerIndex].layerName, - &extensionCount, nullptr); - if (VK_SUCCESS != res) { - return false; - } - VkExtensionProperties* extensions = new VkExtensionProperties[extensionCount]; - res = EnumerateDeviceExtensionProperties(physDev, - (*deviceLayers)[layerIndex].layerName, - &extensionCount, extensions); - if (VK_SUCCESS != res) { - delete[] extensions; - return false; - } - for (uint32_t i = 0; i < extensionCount; ++i) { - deviceExtensions->push_back() = extensions[i]; - } - delete[] extensions; - } - - return true; -} - -// the minimum version of Vulkan supported -#ifdef SK_BUILD_FOR_ANDROID -const uint32_t kGrVkMinimumVersion = VK_MAKE_VERSION(1, 0, 3); -#else -const uint32_t kGrVkMinimumVersion = VK_MAKE_VERSION(1, 0, 8); -#endif - -#define ACQUIRE_VK_PROC(name, instance, device) \ - PFN_vk##name grVk##name = \ - reinterpret_cast(getProc("vk" #name, instance, device)); \ - if (grVk##name == nullptr) { \ - SkDebugf("Function ptr for vk%s could not be acquired\n", #name); \ - if (device != VK_NULL_HANDLE) { \ - destroy_instance(getProc, inst, debugCallback, hasDebugExtension); \ - } \ - return false; \ - } - #define ACQUIRE_VK_PROC_LOCAL(name, instance, device) \ PFN_vk##name grVk##name = \ reinterpret_cast(getProc("vk" #name, instance, device)); \ @@ -343,25 +161,50 @@ bool CreateVkBackendContext(const GrVkInterface::GetInstanceProc& getInstancePro kGrVkMinimumVersion, // apiVersion }; - SkTArray instanceLayers; - SkTArray instanceExtensions; - - if (!init_instance_extensions_and_layers(getProc, kGrVkMinimumVersion, - &instanceExtensions, - &instanceLayers)) { - return false; - } + GrVkExtensions extensions(getProc); + extensions.initInstance(kGrVkMinimumVersion); SkTArray instanceLayerNames; SkTArray instanceExtensionNames; - for (int i = 0; i < instanceLayers.count(); ++i) { - instanceLayerNames.push_back(instanceLayers[i].layerName); - } - for (int i = 0; i < instanceExtensions.count(); ++i) { - if (strncmp(instanceExtensions[i].extensionName, "VK_KHX", 6)) { - instanceExtensionNames.push_back(instanceExtensions[i].extensionName); + uint32_t extensionFlags = 0; + bool hasDebugExtension = false; +#ifdef SK_ENABLE_VK_LAYERS + for (size_t i = 0; i < SK_ARRAY_COUNT(kDebugLayerNames); ++i) { + if (extensions.hasInstanceLayer(kDebugLayerNames[i])) { + instanceLayerNames.push_back(kDebugLayerNames[i]); } } + if (extensions.hasInstanceExtension(VK_EXT_DEBUG_REPORT_EXTENSION_NAME)) { + instanceExtensionNames.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME); + extensionFlags |= kEXT_debug_report_GrVkExtensionFlag; + hasDebugExtension = true; + } +#endif + + if (extensions.hasInstanceExtension(VK_KHR_SURFACE_EXTENSION_NAME)) { + instanceExtensionNames.push_back(VK_KHR_SURFACE_EXTENSION_NAME); + extensionFlags |= kKHR_surface_GrVkExtensionFlag; + } + if (extensions.hasInstanceExtension(VK_KHR_SWAPCHAIN_EXTENSION_NAME)) { + instanceExtensionNames.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME); + extensionFlags |= kKHR_swapchain_GrVkExtensionFlag; + } +#ifdef SK_BUILD_FOR_WIN + if (extensions.hasInstanceExtension(VK_KHR_WIN32_SURFACE_EXTENSION_NAME)) { + instanceExtensionNames.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); + extensionFlags |= kKHR_win32_surface_GrVkExtensionFlag; + } +#elif defined(SK_BUILD_FOR_ANDROID) + if (extensions.hasInstanceExtension(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME)) { + instanceExtensionNames.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME); + extensionFlags |= kKHR_android_surface_GrVkExtensionFlag; + } +#elif defined(SK_BUILD_FOR_UNIX) && !defined(__Fuchsia__) + if (extensions.hasInstanceExtension(VK_KHR_XCB_SURFACE_EXTENSION_NAME)) { + instanceExtensionNames.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME); + extensionFlags |= kKHR_xcb_surface_GrVkExtensionFlag; + } +#endif const VkInstanceCreateInfo instance_create = { VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, // sType @@ -374,8 +217,6 @@ bool CreateVkBackendContext(const GrVkInterface::GetInstanceProc& getInstancePro instanceExtensionNames.begin(), // ppEnabledExtensionNames }; - bool hasDebugExtension = false; - ACQUIRE_VK_PROC(CreateInstance, VK_NULL_HANDLE, VK_NULL_HANDLE); err = grVkCreateInstance(&instance_create, nullptr, &inst); if (err < 0) { @@ -409,6 +250,7 @@ bool CreateVkBackendContext(const GrVkInterface::GetInstanceProc& getInstancePro } #endif + ACQUIRE_VK_PROC(DestroyInstance, inst, VK_NULL_HANDLE); ACQUIRE_VK_PROC(EnumeratePhysicalDevices, inst, VK_NULL_HANDLE); ACQUIRE_VK_PROC(GetPhysicalDeviceQueueFamilyProperties, inst, VK_NULL_HANDLE); ACQUIRE_VK_PROC(GetPhysicalDeviceFeatures, inst, VK_NULL_HANDLE); @@ -490,29 +332,17 @@ bool CreateVkBackendContext(const GrVkInterface::GetInstanceProc& getInstancePro presentQueueIndex = graphicsQueueIndex; } - SkTArray deviceLayers; - SkTArray deviceExtensions; - if (!init_device_extensions_and_layers(getProc, kGrVkMinimumVersion, - inst, physDev, - &deviceExtensions, - &deviceLayers)) { - destroy_instance(getProc, inst, debugCallback, hasDebugExtension); - return false; - } + extensions.initDevice(kGrVkMinimumVersion, inst, physDev); SkTArray deviceLayerNames; SkTArray deviceExtensionNames; - for (int i = 0; i < deviceLayers.count(); ++i) { - deviceLayerNames.push_back(deviceLayers[i].layerName); + if (extensions.hasDeviceExtension(VK_KHR_SWAPCHAIN_EXTENSION_NAME)) { + deviceExtensionNames.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME); + extensionFlags |= kKHR_swapchain_GrVkExtensionFlag; } - for (int i = 0; i < deviceExtensions.count(); ++i) { - // Don't use experimental extensions since they typically don't work with debug layers and - // often are missing dependecy requirements for other extensions. Additionally, these are - // often left behind in the driver even after they've been promoted to real extensions. - if (strncmp(deviceExtensions[i].extensionName, "VK_KHX", 6) && - strncmp(deviceExtensions[i].extensionName, "VK_NVX", 6)) { - deviceExtensionNames.push_back(deviceExtensions[i].extensionName); - } + if (extensions.hasDeviceExtension("VK_NV_glsl_shader")) { + deviceExtensionNames.push_back("VK_NV_glsl_shader"); + extensionFlags |= kNV_glsl_shader_GrVkExtensionFlag; } // query to get the physical device properties @@ -576,13 +406,9 @@ bool CreateVkBackendContext(const GrVkInterface::GetInstanceProc& getInstancePro return false; } - auto interface = sk_make_sp(getProc, inst, device, - (uint32_t) instanceExtensionNames.count(), - instanceExtensionNames.begin(), - (uint32_t) deviceExtensionNames.count(), - deviceExtensionNames.begin()); - - if (!interface->validate()) { + auto interface = + sk_make_sp(getProc, inst, device, extensionFlags); + if (!interface->validate(extensionFlags)) { SkDebugf("Vulkan interface validation failed\n"); grVkDeviceWaitIdle(device); grVkDestroyDevice(device, nullptr); @@ -599,7 +425,7 @@ bool CreateVkBackendContext(const GrVkInterface::GetInstanceProc& getInstancePro ctx->fQueue = queue; ctx->fGraphicsQueueIndex = graphicsQueueIndex; ctx->fMinAPIVersion = kGrVkMinimumVersion; - ctx->fExtensions = 0; + ctx->fExtensions = extensionFlags; ctx->fFeatures = featureFlags; ctx->fInterface.reset(interface.release()); ctx->fOwnsInstanceAndDevice = false; diff --git a/tools/sk_app/VulkanWindowContext.cpp b/tools/sk_app/VulkanWindowContext.cpp index d038c97e34..8e0749ec1b 100644 --- a/tools/sk_app/VulkanWindowContext.cpp +++ b/tools/sk_app/VulkanWindowContext.cpp @@ -12,7 +12,6 @@ #include "SkSurface.h" #include "VulkanWindowContext.h" -#include "vk/GrVkExtensions.h" #include "vk/GrVkImage.h" #include "vk/GrVkUtil.h" #include "vk/GrVkTypes.h" @@ -57,8 +56,8 @@ void VulkanWindowContext::initializeContext() { return; } - if (!backendContext.fInterface->fExtensions.hasExtension(VK_KHR_SURFACE_EXTENSION_NAME) || - !backendContext.fInterface->fExtensions.hasExtension(VK_KHR_SWAPCHAIN_EXTENSION_NAME)) { + if (!(backendContext.fExtensions & kKHR_surface_GrVkExtensionFlag) || + !(backendContext.fExtensions & kKHR_swapchain_GrVkExtensionFlag)) { return; } -- cgit v1.2.3