From 731c5f47f42b977f2a8287d858182cbaaccf9b14 Mon Sep 17 00:00:00 2001 From: Jon Ashburn Date: Mon, 16 May 2016 14:40:36 -0600 Subject: misc: Update to version 1.0.13, header, xml, JSON files Change-Id: Id70c1b709d35b2f508e0dde5f862102c87c80521 --- include/vulkan/vulkan.h | 11 ++--- layers/linux/VkLayer_core_validation.json | 2 +- layers/linux/VkLayer_device_limits.json | 2 +- layers/linux/VkLayer_image.json | 2 +- layers/linux/VkLayer_object_tracker.json | 2 +- layers/linux/VkLayer_parameter_validation.json | 2 +- layers/linux/VkLayer_swapchain.json | 2 +- layers/linux/VkLayer_threading.json | 2 +- layers/linux/VkLayer_unique_objects.json | 2 +- layers/windows/VkLayer_core_validation.json | 2 +- layers/windows/VkLayer_device_limits.json | 2 +- layers/windows/VkLayer_image.json | 2 +- layers/windows/VkLayer_object_tracker.json | 2 +- layers/windows/VkLayer_parameter_validation.json | 2 +- layers/windows/VkLayer_swapchain.json | 2 +- layers/windows/VkLayer_threading.json | 2 +- layers/windows/VkLayer_unique_objects.json | 2 +- vk.xml | 54 ++++++++++++++---------- 18 files changed, 53 insertions(+), 44 deletions(-) diff --git a/include/vulkan/vulkan.h b/include/vulkan/vulkan.h index 741da4ce..2f180768 100644 --- a/include/vulkan/vulkan.h +++ b/include/vulkan/vulkan.h @@ -43,7 +43,7 @@ extern "C" { #define VK_VERSION_MINOR(version) (((uint32_t)(version) >> 12) & 0x3ff) #define VK_VERSION_PATCH(version) ((uint32_t)(version) & 0xfff) // Version of this file -#define VK_HEADER_VERSION 12 +#define VK_HEADER_VERSION 13 #define VK_NULL_HANDLE 0 @@ -3172,13 +3172,14 @@ VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSurfaceKHR) #define VK_KHR_SURFACE_SPEC_VERSION 25 #define VK_KHR_SURFACE_EXTENSION_NAME "VK_KHR_surface" +#define VK_COLORSPACE_SRGB_NONLINEAR_KHR VK_COLOR_SPACE_SRGB_NONLINEAR_KHR typedef enum VkColorSpaceKHR { - VK_COLORSPACE_SRGB_NONLINEAR_KHR = 0, - VK_COLOR_SPACE_BEGIN_RANGE_KHR = VK_COLORSPACE_SRGB_NONLINEAR_KHR, - VK_COLOR_SPACE_END_RANGE_KHR = VK_COLORSPACE_SRGB_NONLINEAR_KHR, - VK_COLOR_SPACE_RANGE_SIZE_KHR = (VK_COLORSPACE_SRGB_NONLINEAR_KHR - VK_COLORSPACE_SRGB_NONLINEAR_KHR + 1), + VK_COLOR_SPACE_SRGB_NONLINEAR_KHR = 0, + VK_COLOR_SPACE_BEGIN_RANGE_KHR = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, + VK_COLOR_SPACE_END_RANGE_KHR = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, + VK_COLOR_SPACE_RANGE_SIZE_KHR = (VK_COLOR_SPACE_SRGB_NONLINEAR_KHR - VK_COLOR_SPACE_SRGB_NONLINEAR_KHR + 1), VK_COLOR_SPACE_MAX_ENUM_KHR = 0x7FFFFFFF } VkColorSpaceKHR; diff --git a/layers/linux/VkLayer_core_validation.json b/layers/linux/VkLayer_core_validation.json index 0053bd83..66b76604 100644 --- a/layers/linux/VkLayer_core_validation.json +++ b/layers/linux/VkLayer_core_validation.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_core_validation", "type": "INSTANCE", "library_path": "./libVkLayer_core_validation.so", - "api_version": "1.0.11", + "api_version": "1.0.13", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff --git a/layers/linux/VkLayer_device_limits.json b/layers/linux/VkLayer_device_limits.json index e89fa2ea..f114c6ce 100644 --- a/layers/linux/VkLayer_device_limits.json +++ b/layers/linux/VkLayer_device_limits.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_device_limits", "type": "INSTANCE", "library_path": "./libVkLayer_device_limits.so", - "api_version": "1.0.11", + "api_version": "1.0.13", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff --git a/layers/linux/VkLayer_image.json b/layers/linux/VkLayer_image.json index 3e0953a1..bfa4ea1b 100644 --- a/layers/linux/VkLayer_image.json +++ b/layers/linux/VkLayer_image.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_image", "type": "INSTANCE", "library_path": "./libVkLayer_image.so", - "api_version": "1.0.11", + "api_version": "1.0.13", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff --git a/layers/linux/VkLayer_object_tracker.json b/layers/linux/VkLayer_object_tracker.json index f2030cd5..4a4e7df9 100644 --- a/layers/linux/VkLayer_object_tracker.json +++ b/layers/linux/VkLayer_object_tracker.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_object_tracker", "type": "INSTANCE", "library_path": "./libVkLayer_object_tracker.so", - "api_version": "1.0.11", + "api_version": "1.0.13", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff --git a/layers/linux/VkLayer_parameter_validation.json b/layers/linux/VkLayer_parameter_validation.json index 04e914df..2372b714 100644 --- a/layers/linux/VkLayer_parameter_validation.json +++ b/layers/linux/VkLayer_parameter_validation.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_parameter_validation", "type": "INSTANCE", "library_path": "./libVkLayer_parameter_validation.so", - "api_version": "1.0.11", + "api_version": "1.0.13", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff --git a/layers/linux/VkLayer_swapchain.json b/layers/linux/VkLayer_swapchain.json index 07e12485..896611a2 100644 --- a/layers/linux/VkLayer_swapchain.json +++ b/layers/linux/VkLayer_swapchain.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_swapchain", "type": "INSTANCE", "library_path": "./libVkLayer_swapchain.so", - "api_version": "1.0.11", + "api_version": "1.0.13", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff --git a/layers/linux/VkLayer_threading.json b/layers/linux/VkLayer_threading.json index d8352a7c..450f7803 100644 --- a/layers/linux/VkLayer_threading.json +++ b/layers/linux/VkLayer_threading.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_GOOGLE_threading", "type": "INSTANCE", "library_path": "./libVkLayer_threading.so", - "api_version": "1.0.11", + "api_version": "1.0.13", "implementation_version": "1", "description": "Google Validation Layer", "instance_extensions": [ diff --git a/layers/linux/VkLayer_unique_objects.json b/layers/linux/VkLayer_unique_objects.json index 85a438b7..f5f13995 100644 --- a/layers/linux/VkLayer_unique_objects.json +++ b/layers/linux/VkLayer_unique_objects.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_GOOGLE_unique_objects", "type": "INSTANCE", "library_path": "./libVkLayer_unique_objects.so", - "api_version": "1.0.11", + "api_version": "1.0.13", "implementation_version": "1", "description": "Google Validation Layer" } diff --git a/layers/windows/VkLayer_core_validation.json b/layers/windows/VkLayer_core_validation.json index 01139ae6..7d2090dc 100644 --- a/layers/windows/VkLayer_core_validation.json +++ b/layers/windows/VkLayer_core_validation.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_core_validation", "type": "INSTANCE", "library_path": ".\\VkLayer_core_validation.dll", - "api_version": "1.0.11", + "api_version": "1.0.13", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff --git a/layers/windows/VkLayer_device_limits.json b/layers/windows/VkLayer_device_limits.json index 71d5ca9e..26d3cae3 100644 --- a/layers/windows/VkLayer_device_limits.json +++ b/layers/windows/VkLayer_device_limits.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_device_limits", "type": "INSTANCE", "library_path": ".\\VkLayer_device_limits.dll", - "api_version": "1.0.11", + "api_version": "1.0.13", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff --git a/layers/windows/VkLayer_image.json b/layers/windows/VkLayer_image.json index 58f64731..e597f5ec 100644 --- a/layers/windows/VkLayer_image.json +++ b/layers/windows/VkLayer_image.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_image", "type": "INSTANCE", "library_path": ".\\VkLayer_image.dll", - "api_version": "1.0.11", + "api_version": "1.0.13", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff --git a/layers/windows/VkLayer_object_tracker.json b/layers/windows/VkLayer_object_tracker.json index 1f539049..398d06b7 100644 --- a/layers/windows/VkLayer_object_tracker.json +++ b/layers/windows/VkLayer_object_tracker.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_object_tracker", "type": "INSTANCE", "library_path": ".\\VkLayer_object_tracker.dll", - "api_version": "1.0.11", + "api_version": "1.0.13", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff --git a/layers/windows/VkLayer_parameter_validation.json b/layers/windows/VkLayer_parameter_validation.json index 496945be..8e600ca5 100644 --- a/layers/windows/VkLayer_parameter_validation.json +++ b/layers/windows/VkLayer_parameter_validation.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_parameter_validation", "type": "INSTANCE", "library_path": ".\\VkLayer_parameter_validation.dll", - "api_version": "1.0.11", + "api_version": "1.0.13", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff --git a/layers/windows/VkLayer_swapchain.json b/layers/windows/VkLayer_swapchain.json index 53f749ed..346d0e46 100644 --- a/layers/windows/VkLayer_swapchain.json +++ b/layers/windows/VkLayer_swapchain.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_swapchain", "type": "INSTANCE", "library_path": ".\\VkLayer_swapchain.dll", - "api_version": "1.0.11", + "api_version": "1.0.13", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff --git a/layers/windows/VkLayer_threading.json b/layers/windows/VkLayer_threading.json index a915ea14..ba48671b 100644 --- a/layers/windows/VkLayer_threading.json +++ b/layers/windows/VkLayer_threading.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_GOOGLE_threading", "type": "INSTANCE", "library_path": ".\\VkLayer_threading.dll", - "api_version": "1.0.11", + "api_version": "1.0.13", "implementation_version": "1", "description": "Google Validation Layer", "instance_extensions": [ diff --git a/layers/windows/VkLayer_unique_objects.json b/layers/windows/VkLayer_unique_objects.json index e77e4377..1dd7276c 100644 --- a/layers/windows/VkLayer_unique_objects.json +++ b/layers/windows/VkLayer_unique_objects.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_GOOGLE_unique_objects", "type": "INSTANCE", "library_path": ".\\VkLayer_unique_objects.dll", - "api_version": "1.0.11", + "api_version": "1.0.13", "implementation_version": "1", "description": "Google Validation Layer" } diff --git a/vk.xml b/vk.xml index 6aecf317..b179211f 100644 --- a/vk.xml +++ b/vk.xml @@ -3,17 +3,24 @@ Copyright (c) 2015-2016 The Khronos Group 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 +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and/or associated documentation files (the +"Materials"), to deal in the Materials without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Materials, and to +permit persons to whom the Materials are furnished to do so, subject to +the following conditions: - http://www.apache.org/licenses/LICENSE-2.0 +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Materials. - 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. +THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. ------------------------------------------------------------------------ @@ -94,7 +101,7 @@ maintained in the master branch of the Khronos Vulkan Github project. // Vulkan 1.0 version number #define VK_API_VERSION_1_0 VK_MAKE_VERSION(1, 0, 0) // Version of this file -#define VK_HEADER_VERSION 12 +#define VK_HEADER_VERSION 13 #define VK_DEFINE_HANDLE(object) typedef struct object##_T* object; @@ -498,7 +505,7 @@ maintained in the master branch of the Khronos Vulkan Github project. const char* const* ppEnabledExtensionNames const VkPhysicalDeviceFeatures* pEnabledFeatures - Any given element of pname:ppEnabledLayerNames must: be the name of a layer present on the system, exactly matching a string returned in the sname:VkLayerProperties structure by fname:vkEnumerateDeviceLayerProperties + pname:ppEnabledLayerNames must: either be sname:NULL or contain the same sequence of layer names that was enabled when creating the parent instance Any given element of pname:ppEnabledExtensionNames must: be the name of an extension present on the system, exactly matching a string returned in the sname:VkExtensionProperties structure by fname:vkEnumerateDeviceExtensionProperties If an extension listed in pname:ppEnabledExtensionNames is provided as part of a layer, then both the layer and extension must: be enabled to enable that extension The pname:queueFamilyIndex member of any given element of pname:pQueueCreateInfos must: be unique within pname:pQueueCreateInfos @@ -1919,7 +1926,7 @@ maintained in the master branch of the Khronos Vulkan Github project. uint32_t signalSemaphoreCount const VkSemaphore* pSignalSemaphores - Any given element of pname:pSignalSemaphores must: currently be unsignalled + Any given element of pname:pSignalSemaphores must: currently be unsignaled Any given element of pname:pCommandBuffers must: either have been recorded with the ename:VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, or not currently be executing on the device Any given element of pname:pCommandBuffers must: be in the executable state If any given element of pname:pCommandBuffers contains commands that execute secondary command buffers, those secondary command buffers must: have been recorded with the ename:VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, or not currently be executing on the device @@ -2088,7 +2095,7 @@ maintained in the master branch of the Khronos Vulkan Github project. VkSwapchainKHR oldSwapchain pname:surface must: be a surface that is supported by the device as determined using fname:vkGetPhysicalDeviceSurfaceSupportKHR - The native window referred to by pname:surface mustnot: already be associated with a swapchain other than pname:oldSwapchain, or with a non-{apiname} graphics API surface + The native window referred to by pname:surface mustnot: already be associated with a swapchain other than pname:oldSwapchain, or with a non-Vulkan graphics API surface pname:minImageCount must: be greater than or equal to the value returned in the pname:minImageCount member of the sname:VkSurfaceCapabilitiesKHR structure returned by fname:vkGetPhysicalDeviceSurfaceCapabilitiesKHR for the surface pname:minImageCount must: be less than or equal to the value returned in the pname:maxImageCount member of the sname:VkSurfaceCapabilitiesKHR structure returned by fname:vkGetPhysicalDeviceSurfaceCapabilitiesKHR for the surface if the returned pname:maxImageCount is not zero pname:imageFormat and pname:imageColorspace must: match the pname:format and pname:colorSpace members, respectively, of one of the sname:VkSurfaceFormatKHR structures returned by fname:vkGetPhysicalDeviceSurfaceFormatsKHR for the surface @@ -2650,7 +2657,7 @@ maintained in the master branch of the Khronos Vulkan Github project. - + @@ -2887,7 +2894,7 @@ maintained in the master branch of the Khronos Vulkan Github project. - + @@ -3065,7 +3072,7 @@ maintained in the master branch of the Khronos Vulkan Github project. uint32_t* pPropertyCount VkExtensionProperties* pProperties - If pname:pLayerName is not `NULL`, it must: be the name of an instance layer returned by flink:vkEnumerateInstanceLayerProperties + If pname:pLayerName is not `NULL`, it must: be the name of a layer returned by flink:vkEnumerateInstanceLayerProperties @@ -3081,7 +3088,7 @@ maintained in the master branch of the Khronos Vulkan Github project. uint32_t* pPropertyCount VkExtensionProperties* pProperties - If pname:pLayerName is not `NULL`, it must: be the name of a device layer returned by flink:vkEnumerateDeviceLayerProperties + If pname:pLayerName is not `NULL`, it must: be the name of a layer returned by flink:vkEnumerateDeviceLayerProperties @@ -3102,7 +3109,7 @@ maintained in the master branch of the Khronos Vulkan Github project. const VkSubmitInfo* pSubmits VkFence fence - If pname:fence is not sname:VK_NULL_HANDLE, pname:fence must: be unsignalled + If pname:fence is not sname:VK_NULL_HANDLE, pname:fence must: be unsignaled If pname:fence is not sname:VK_NULL_HANDLE, pname:fence mustnot: be associated with any other queue command that has not yet completed execution on that queue @@ -3258,7 +3265,7 @@ maintained in the master branch of the Khronos Vulkan Github project. const VkBindSparseInfo* pBindInfo VkFence fence - pname:fence must: be unsignalled + pname:fence must: be unsignaled pname:fence mustnot: be associated with any other queue command that has not yet completed execution on that queue @@ -4592,7 +4599,7 @@ maintained in the master branch of the Khronos Vulkan Github project. pname:queueFamilyIndex must: be less than pname:pQueueFamilyPropertyCount returned by fname:vkGetPhysicalDeviceQueueFamilyProperties for the given pname:physicalDevice - + VkResult vkGetPhysicalDeviceSurfaceCapabilitiesKHR VkPhysicalDevice physicalDevice VkSurfaceKHR surface @@ -4646,8 +4653,8 @@ maintained in the master branch of the Khronos Vulkan Github project. VkFence fence uint32_t* pImageIndex - If pname:semaphore is not sname:VK_NULL_HANDLE it must: be unsignalled - If pname:fence is not sname:VK_NULL_HANDLE it must: be unsignalled and mustnot: be associated with any other queue command that has not yet completed execution on that queue + If pname:semaphore is not sname:VK_NULL_HANDLE it must: be unsignaled + If pname:fence is not sname:VK_NULL_HANDLE it must: be unsignaled and mustnot: be associated with any other queue command that has not yet completed execution on that queue @@ -4754,7 +4761,7 @@ maintained in the master branch of the Khronos Vulkan Github project. pname:instance must: be a valid sname:VkInstance handle pname:flags must: be a combination of one or more of sname:VkDebugReportFlagBitsEXT pname:objType must: be one of sname:VkDebugReportObjectTypeEXT, ename:VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT if pname:object is `NULL` - pname:object may: be a {apiname} object + pname:object may: be a Vulkan object pname:pLayerPrefix must: be a `NULL` terminated string. pname:pMsg must: be a `NULL` terminated string. @@ -5036,6 +5043,7 @@ maintained in the master branch of the Khronos Vulkan Github project. + -- cgit v1.2.3 From bacc359a6097dd7a70e023c75a21245992bee4ef Mon Sep 17 00:00:00 2001 From: Rene Lindsay Date: Fri, 13 May 2016 09:19:41 -0700 Subject: git: Ignore Qt generated files Change-Id: I5970f83e8316e3f13e79e103cc17c96e31fef95e --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index 3c8b7652..2ff8e41a 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,8 @@ build build32 dbuild external +*.config +*.creator +*.creator.user +*.files +*.includes -- cgit v1.2.3 From c24a21bc846f0c222267becede558ded91267e5f Mon Sep 17 00:00:00 2001 From: GregF Date: Mon, 16 May 2016 17:26:26 -0600 Subject: update glslang and spirv-tools revisions --- glslang_revision | 2 +- spirv-tools_revision | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/glslang_revision b/glslang_revision index 56c5bed5..ac7412cb 100644 --- a/glslang_revision +++ b/glslang_revision @@ -1 +1 @@ -d99524197f3b68dbd6267bd3f4d7e8a0f49167b4 +4678ca9dacfec7a084dbc69bbe568bdad6889f1b diff --git a/spirv-tools_revision b/spirv-tools_revision index 9a829b9c..fa8390ba 100644 --- a/spirv-tools_revision +++ b/spirv-tools_revision @@ -1 +1 @@ -469f0e8fd53b527ad410c46bf18eee327c9256a3 +0d512bbef58dfcdb1a6bcde7fe17fcc4a33a1aa7 -- cgit v1.2.3 From 9e7488ecfe5ca0eab69da1c0031dc8b125871945 Mon Sep 17 00:00:00 2001 From: Jon Ashburn Date: Mon, 16 May 2016 17:35:43 -0600 Subject: loader: reduce message level if GDPA of a layer is not found Change-Id: Ic4dd99015f5f3a07a6657f196fde89181d66c0f6 --- loader/loader.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/loader/loader.c b/loader/loader.c index c8e91531..cff4353a 100644 --- a/loader/loader.c +++ b/loader/loader.c @@ -3279,7 +3279,7 @@ loader_create_device_chain(const struct loader_physical_device_tramp *pd, loader_platform_get_proc_address( lib_handle, layer_prop->functions.str_gdpa); if (!fpGDPA) { - loader_log(inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0, + loader_log(inst, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, 0, "Failed to find vkGetDeviceProcAddr in layer %s", layer_prop->lib_name); continue; -- cgit v1.2.3 From cff1cd36aa64b0713c068d82380bd6554984fa67 Mon Sep 17 00:00:00 2001 From: Tony Barbour Date: Mon, 16 May 2016 15:47:56 -0600 Subject: demos: Make sure shaderClipDistance is available before requesting Change-Id: Id0b58d54a553fce4914ddc1097f1e1c8ac3c337f --- demos/tri.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/demos/tri.c b/demos/tri.c index 1c80a22b..789ec2bd 100644 --- a/demos/tri.c +++ b/demos/tri.c @@ -199,6 +199,7 @@ struct demo { VkDevice device; VkQueue queue; VkPhysicalDeviceProperties gpu_props; + VkPhysicalDeviceFeatures gpu_features; VkQueueFamilyProperties *queue_props; uint32_t graphics_queue_node_index; @@ -2161,8 +2162,7 @@ static void demo_init_vk(struct demo *demo) { demo->queue_props); assert(demo->queue_count >= 1); - VkPhysicalDeviceFeatures features; - vkGetPhysicalDeviceFeatures(demo->gpu, &features); + vkGetPhysicalDeviceFeatures(demo->gpu, &demo->gpu_features); // Graphics queue and MemMgr queue can be separate. // TODO: Add support for separate queues, including synchronization, @@ -2180,9 +2180,12 @@ static void demo_init_device(struct demo *demo) { .queueCount = 1, .pQueuePriorities = queue_priorities}; - VkPhysicalDeviceFeatures features = { - .shaderClipDistance = VK_TRUE, - }; + + VkPhysicalDeviceFeatures features; + memset(&features, 0, sizeof(features)); + if (demo->gpu_features.shaderClipDistance) { + features.shaderClipDistance = VK_TRUE; + } VkDeviceCreateInfo device = { .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, -- cgit v1.2.3 From c39f89e8d87f06d7c1eae647b699c3cf0ab1aac7 Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Tue, 17 May 2016 08:42:03 -0600 Subject: layers: GH485, Strengthen image format validation CreateImage was checking that format caps weren't null, but was not validating against color or depth/stencil attachment types. Change-Id: Ic8996829033f552f6ef7477bdefdaba702ae2403 --- layers/image.cpp | 91 ++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 69 insertions(+), 22 deletions(-) diff --git a/layers/image.cpp b/layers/image.cpp index 2fce6500..b420cad1 100644 --- a/layers/image.cpp +++ b/layers/image.cpp @@ -229,9 +229,9 @@ static inline uint32_t validate_VkImageLayoutKHR(VkImageLayout input_value) { return ((validate_VkImageLayout(input_value) == 1) || (input_value == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)); } -VKAPI_ATTR VkResult VKAPI_CALL -CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkImage *pImage) { - bool skipCall = false; +VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, VkImage *pImage) { + bool skip_call = false; VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; VkImageFormatProperties ImageFormatProperties; @@ -243,13 +243,60 @@ CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo, const VkAlloc VkFormatProperties properties; phy_dev_data->instance_dispatch_table->GetPhysicalDeviceFormatProperties(device_data->physicalDevice, pCreateInfo->format, &properties); - if ((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0)) { - char const str[] = "vkCreateImage parameter, VkFormat pCreateInfo->format, contains unsupported format"; + std::stringstream ss; + ss << "vkCreateImage format parameter (" << string_VkFormat(pCreateInfo->format) << ") is an unsupported format"; // TODO: Verify against Valid Use section of spec. Generally if something yield an undefined result, it's invalid - skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, - IMAGE_FORMAT_UNSUPPORTED, "IMAGE", str); + skip_call |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, + 0, __LINE__, IMAGE_FORMAT_UNSUPPORTED, "IMAGE", "%s", ss.str().c_str()); } + + // Validate that format supports usage as color attachment + if (pCreateInfo->usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) { + if ((pCreateInfo->tiling == VK_IMAGE_TILING_OPTIMAL) && + ((properties.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) == 0)) { + std::stringstream ss; + ss << "vkCreateImage: VkFormat for TILING_OPTIMAL image (" << string_VkFormat(pCreateInfo->format) + << ") does not support requested Image usage type VK_IMAGE_USAGE_COLOR_ATTACHMENT"; + skip_call |= + log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + __LINE__, IMAGE_INVALID_FORMAT, "IMAGE", "%s", ss.str().c_str()); + } + if ((pCreateInfo->tiling == VK_IMAGE_TILING_LINEAR) && + ((properties.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) == 0)) { + std::stringstream ss; + ss << "vkCreateImage: VkFormat for TILING_LINEAR image (" << string_VkFormat(pCreateInfo->format) + << ") does not support requested Image usage type VK_IMAGE_USAGE_COLOR_ATTACHMENT"; + skip_call |= + log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + __LINE__, IMAGE_INVALID_FORMAT, "IMAGE", "%s", ss.str().c_str()); + } + } + // Validate that format supports usage as depth/stencil attachment + if (pCreateInfo->usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) { + if ((pCreateInfo->tiling == VK_IMAGE_TILING_OPTIMAL) && + ((properties.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) == 0)) { + std::stringstream ss; + ss << "vkCreateImage: VkFormat for TILING_OPTIMAL image (" << string_VkFormat(pCreateInfo->format) + << ") does not support requested Image usage type VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT"; + skip_call |= + log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + __LINE__, IMAGE_INVALID_FORMAT, "IMAGE", "%s", ss.str().c_str()); + } + if ((pCreateInfo->tiling == VK_IMAGE_TILING_LINEAR) && + ((properties.linearTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) == 0)) { + std::stringstream ss; + ss << "vkCreateImage: VkFormat for TILING_LINEAR image (" << string_VkFormat(pCreateInfo->format) + << ") does not support requested Image usage type VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT"; + skip_call |= + log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + __LINE__, IMAGE_INVALID_FORMAT, "IMAGE", "%s", ss.str().c_str()); + } + } + } else { + skip_call |= + log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, + IMAGE_INVALID_FORMAT, "IMAGE", "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED"); } // Internal call to get format info. Still goes through layers, could potentially go directly to ICD. @@ -282,9 +329,9 @@ CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo, const VkAlloc break; } if (failedMinSize) { - skipCall |= + skip_call |= log_msg(phy_dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - (uint64_t)pImage, __LINE__, IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, "Image", + 0, __LINE__, IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, "Image", "CreateImage extents is 0 for at least one required dimension for image of type %d: " "Width = %d Height = %d Depth = %d.", pCreateInfo->imageType, pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth); @@ -293,8 +340,8 @@ CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo, const VkAlloc if ((pCreateInfo->extent.depth > ImageFormatProperties.maxExtent.depth) || (pCreateInfo->extent.width > ImageFormatProperties.maxExtent.width) || (pCreateInfo->extent.height > ImageFormatProperties.maxExtent.height)) { - skipCall |= log_msg(phy_dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - (uint64_t)pImage, __LINE__, IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, "Image", + skip_call |= log_msg(phy_dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + 0, __LINE__, IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, "Image", "CreateImage extents exceed allowable limits for format: " "Width = %d Height = %d Depth = %d: Limits for Width = %d Height = %d Depth = %d for format %s.", pCreateInfo->extent.width, pCreateInfo->extent.height, pCreateInfo->extent.depth, @@ -309,42 +356,42 @@ CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo, const VkAlloc ~(uint64_t)imageGranularity; if (totalSize > ImageFormatProperties.maxResourceSize) { - skipCall |= log_msg(phy_dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - (uint64_t)pImage, __LINE__, IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, "Image", + skip_call |= log_msg(phy_dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + 0, __LINE__, IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, "Image", "CreateImage resource size exceeds allowable maximum " "Image resource size = 0x%" PRIxLEAST64 ", maximum resource size = 0x%" PRIxLEAST64 " ", totalSize, ImageFormatProperties.maxResourceSize); } if (pCreateInfo->mipLevels > ImageFormatProperties.maxMipLevels) { - skipCall |= log_msg(phy_dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - (uint64_t)pImage, __LINE__, IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, "Image", + skip_call |= log_msg(phy_dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + 0, __LINE__, IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, "Image", "CreateImage mipLevels=%d exceeds allowable maximum supported by format of %d", pCreateInfo->mipLevels, ImageFormatProperties.maxMipLevels); } if (pCreateInfo->arrayLayers > ImageFormatProperties.maxArrayLayers) { - skipCall |= log_msg(phy_dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - (uint64_t)pImage, __LINE__, IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, "Image", + skip_call |= log_msg(phy_dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + 0, __LINE__, IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, "Image", "CreateImage arrayLayers=%d exceeds allowable maximum supported by format of %d", pCreateInfo->arrayLayers, ImageFormatProperties.maxArrayLayers); } if ((pCreateInfo->samples & ImageFormatProperties.sampleCounts) == 0) { - skipCall |= log_msg(phy_dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - (uint64_t)pImage, __LINE__, IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, "Image", + skip_call |= log_msg(phy_dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + 0, __LINE__, IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, "Image", "CreateImage samples %s is not supported by format 0x%.8X", string_VkSampleCountFlagBits(pCreateInfo->samples), ImageFormatProperties.sampleCounts); } if (pCreateInfo->initialLayout != VK_IMAGE_LAYOUT_UNDEFINED && pCreateInfo->initialLayout != VK_IMAGE_LAYOUT_PREINITIALIZED) { - skipCall |= log_msg(phy_dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, - (uint64_t)pImage, __LINE__, IMAGE_INVALID_LAYOUT, "Image", + skip_call |= log_msg(phy_dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + 0, __LINE__, IMAGE_INVALID_LAYOUT, "Image", "vkCreateImage parameter, pCreateInfo->initialLayout, must be VK_IMAGE_LAYOUT_UNDEFINED or " "VK_IMAGE_LAYOUT_PREINITIALIZED"); } - if (!skipCall) { + if (!skip_call) { result = device_data->device_dispatch_table->CreateImage(device, pCreateInfo, pAllocator, pImage); } if (result == VK_SUCCESS) { -- cgit v1.2.3 From d3b932c28d1cefac406562adcf7ea5b2f24978f9 Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Tue, 17 May 2016 08:44:09 -0600 Subject: layers: GH485, Remove redundant format props check With new checks in place for CreateImage, old check in CreateRenderPass is redundant and can be removed. Change-Id: I53e5201f453041b3c8ba17edc193c1f3b142f4cb --- layers/image.cpp | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/layers/image.cpp b/layers/image.cpp index b420cad1..840c543e 100644 --- a/layers/image.cpp +++ b/layers/image.cpp @@ -414,23 +414,6 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderP VkRenderPass *pRenderPass) { layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); bool skipCall = false; - for (uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i) { - if (pCreateInfo->pAttachments[i].format != VK_FORMAT_UNDEFINED) { - VkFormatProperties properties; - get_my_data_ptr(get_dispatch_key(my_data->physicalDevice), layer_data_map) - ->instance_dispatch_table->GetPhysicalDeviceFormatProperties(my_data->physicalDevice, - pCreateInfo->pAttachments[i].format, &properties); - - if ((properties.linearTilingFeatures) == 0 && (properties.optimalTilingFeatures == 0)) { - std::stringstream ss; - ss << "vkCreateRenderPass parameter, VkFormat in pCreateInfo->pAttachments[" << i - << "], contains unsupported format"; - // TODO: Verify against Valid Use section of spec. Generally if something yield an undefined result, it's invalid - skipCall |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, - IMAGE_FORMAT_UNSUPPORTED, "IMAGE", "%s", ss.str().c_str()); - } - } - } for (uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i) { if (!validate_VkImageLayoutKHR(pCreateInfo->pAttachments[i].initialLayout) || -- cgit v1.2.3 From 0939555719cf25b17ac128626ab348bedef36506 Mon Sep 17 00:00:00 2001 From: Jon Ashburn Date: Tue, 17 May 2016 08:43:38 -0600 Subject: loader: Treat GLOBAL layers same as INSTANCE layers Also change validation layers type to be GLOBAL so they work with old loaders prior to device layer deprecation. Change-Id: I32788cb7788c8ad840ced15236c5ed792edfbbff --- layers/linux/VkLayer_core_validation.json | 2 +- layers/linux/VkLayer_device_limits.json | 2 +- layers/linux/VkLayer_image.json | 2 +- layers/linux/VkLayer_object_tracker.json | 2 +- layers/linux/VkLayer_parameter_validation.json | 2 +- layers/linux/VkLayer_swapchain.json | 2 +- layers/linux/VkLayer_threading.json | 2 +- layers/linux/VkLayer_unique_objects.json | 2 +- layers/windows/VkLayer_core_validation.json | 2 +- layers/windows/VkLayer_device_limits.json | 2 +- layers/windows/VkLayer_image.json | 2 +- layers/windows/VkLayer_object_tracker.json | 2 +- layers/windows/VkLayer_parameter_validation.json | 2 +- layers/windows/VkLayer_swapchain.json | 2 +- layers/windows/VkLayer_threading.json | 2 +- layers/windows/VkLayer_unique_objects.json | 2 +- loader/loader.c | 15 +++------------ 17 files changed, 19 insertions(+), 28 deletions(-) diff --git a/layers/linux/VkLayer_core_validation.json b/layers/linux/VkLayer_core_validation.json index 66b76604..1d8d305b 100644 --- a/layers/linux/VkLayer_core_validation.json +++ b/layers/linux/VkLayer_core_validation.json @@ -2,7 +2,7 @@ "file_format_version" : "1.0.0", "layer" : { "name": "VK_LAYER_LUNARG_core_validation", - "type": "INSTANCE", + "type": "GLOBAL", "library_path": "./libVkLayer_core_validation.so", "api_version": "1.0.13", "implementation_version": "1", diff --git a/layers/linux/VkLayer_device_limits.json b/layers/linux/VkLayer_device_limits.json index f114c6ce..6aab8a24 100644 --- a/layers/linux/VkLayer_device_limits.json +++ b/layers/linux/VkLayer_device_limits.json @@ -2,7 +2,7 @@ "file_format_version" : "1.0.0", "layer" : { "name": "VK_LAYER_LUNARG_device_limits", - "type": "INSTANCE", + "type": "GLOBAL", "library_path": "./libVkLayer_device_limits.so", "api_version": "1.0.13", "implementation_version": "1", diff --git a/layers/linux/VkLayer_image.json b/layers/linux/VkLayer_image.json index bfa4ea1b..125e3fc3 100644 --- a/layers/linux/VkLayer_image.json +++ b/layers/linux/VkLayer_image.json @@ -2,7 +2,7 @@ "file_format_version" : "1.0.0", "layer" : { "name": "VK_LAYER_LUNARG_image", - "type": "INSTANCE", + "type": "GLOBAL", "library_path": "./libVkLayer_image.so", "api_version": "1.0.13", "implementation_version": "1", diff --git a/layers/linux/VkLayer_object_tracker.json b/layers/linux/VkLayer_object_tracker.json index 4a4e7df9..e778c640 100644 --- a/layers/linux/VkLayer_object_tracker.json +++ b/layers/linux/VkLayer_object_tracker.json @@ -2,7 +2,7 @@ "file_format_version" : "1.0.0", "layer" : { "name": "VK_LAYER_LUNARG_object_tracker", - "type": "INSTANCE", + "type": "GLOBAL", "library_path": "./libVkLayer_object_tracker.so", "api_version": "1.0.13", "implementation_version": "1", diff --git a/layers/linux/VkLayer_parameter_validation.json b/layers/linux/VkLayer_parameter_validation.json index 2372b714..ba1f151b 100644 --- a/layers/linux/VkLayer_parameter_validation.json +++ b/layers/linux/VkLayer_parameter_validation.json @@ -2,7 +2,7 @@ "file_format_version" : "1.0.0", "layer" : { "name": "VK_LAYER_LUNARG_parameter_validation", - "type": "INSTANCE", + "type": "GLOBAL", "library_path": "./libVkLayer_parameter_validation.so", "api_version": "1.0.13", "implementation_version": "1", diff --git a/layers/linux/VkLayer_swapchain.json b/layers/linux/VkLayer_swapchain.json index 896611a2..059c028a 100644 --- a/layers/linux/VkLayer_swapchain.json +++ b/layers/linux/VkLayer_swapchain.json @@ -2,7 +2,7 @@ "file_format_version" : "1.0.0", "layer" : { "name": "VK_LAYER_LUNARG_swapchain", - "type": "INSTANCE", + "type": "GLOBAL", "library_path": "./libVkLayer_swapchain.so", "api_version": "1.0.13", "implementation_version": "1", diff --git a/layers/linux/VkLayer_threading.json b/layers/linux/VkLayer_threading.json index 450f7803..6b7ba32f 100644 --- a/layers/linux/VkLayer_threading.json +++ b/layers/linux/VkLayer_threading.json @@ -2,7 +2,7 @@ "file_format_version" : "1.0.0", "layer" : { "name": "VK_LAYER_GOOGLE_threading", - "type": "INSTANCE", + "type": "GLOBAL", "library_path": "./libVkLayer_threading.so", "api_version": "1.0.13", "implementation_version": "1", diff --git a/layers/linux/VkLayer_unique_objects.json b/layers/linux/VkLayer_unique_objects.json index f5f13995..8901ebd1 100644 --- a/layers/linux/VkLayer_unique_objects.json +++ b/layers/linux/VkLayer_unique_objects.json @@ -2,7 +2,7 @@ "file_format_version" : "1.0.0", "layer" : { "name": "VK_LAYER_GOOGLE_unique_objects", - "type": "INSTANCE", + "type": "GLOBAL", "library_path": "./libVkLayer_unique_objects.so", "api_version": "1.0.13", "implementation_version": "1", diff --git a/layers/windows/VkLayer_core_validation.json b/layers/windows/VkLayer_core_validation.json index 7d2090dc..e58dc0a8 100644 --- a/layers/windows/VkLayer_core_validation.json +++ b/layers/windows/VkLayer_core_validation.json @@ -2,7 +2,7 @@ "file_format_version" : "1.0.0", "layer" : { "name": "VK_LAYER_LUNARG_core_validation", - "type": "INSTANCE", + "type": "GLOBAL", "library_path": ".\\VkLayer_core_validation.dll", "api_version": "1.0.13", "implementation_version": "1", diff --git a/layers/windows/VkLayer_device_limits.json b/layers/windows/VkLayer_device_limits.json index 26d3cae3..18e5212d 100644 --- a/layers/windows/VkLayer_device_limits.json +++ b/layers/windows/VkLayer_device_limits.json @@ -2,7 +2,7 @@ "file_format_version" : "1.0.0", "layer" : { "name": "VK_LAYER_LUNARG_device_limits", - "type": "INSTANCE", + "type": "GLOBAL", "library_path": ".\\VkLayer_device_limits.dll", "api_version": "1.0.13", "implementation_version": "1", diff --git a/layers/windows/VkLayer_image.json b/layers/windows/VkLayer_image.json index e597f5ec..a8983176 100644 --- a/layers/windows/VkLayer_image.json +++ b/layers/windows/VkLayer_image.json @@ -2,7 +2,7 @@ "file_format_version" : "1.0.0", "layer" : { "name": "VK_LAYER_LUNARG_image", - "type": "INSTANCE", + "type": "GLOBAL", "library_path": ".\\VkLayer_image.dll", "api_version": "1.0.13", "implementation_version": "1", diff --git a/layers/windows/VkLayer_object_tracker.json b/layers/windows/VkLayer_object_tracker.json index 398d06b7..afe36bb1 100644 --- a/layers/windows/VkLayer_object_tracker.json +++ b/layers/windows/VkLayer_object_tracker.json @@ -2,7 +2,7 @@ "file_format_version" : "1.0.0", "layer" : { "name": "VK_LAYER_LUNARG_object_tracker", - "type": "INSTANCE", + "type": "GLOBAL", "library_path": ".\\VkLayer_object_tracker.dll", "api_version": "1.0.13", "implementation_version": "1", diff --git a/layers/windows/VkLayer_parameter_validation.json b/layers/windows/VkLayer_parameter_validation.json index 8e600ca5..b946ba24 100644 --- a/layers/windows/VkLayer_parameter_validation.json +++ b/layers/windows/VkLayer_parameter_validation.json @@ -2,7 +2,7 @@ "file_format_version" : "1.0.0", "layer" : { "name": "VK_LAYER_LUNARG_parameter_validation", - "type": "INSTANCE", + "type": "GLOBAL", "library_path": ".\\VkLayer_parameter_validation.dll", "api_version": "1.0.13", "implementation_version": "1", diff --git a/layers/windows/VkLayer_swapchain.json b/layers/windows/VkLayer_swapchain.json index 346d0e46..415146ad 100644 --- a/layers/windows/VkLayer_swapchain.json +++ b/layers/windows/VkLayer_swapchain.json @@ -2,7 +2,7 @@ "file_format_version" : "1.0.0", "layer" : { "name": "VK_LAYER_LUNARG_swapchain", - "type": "INSTANCE", + "type": "GLOBAL", "library_path": ".\\VkLayer_swapchain.dll", "api_version": "1.0.13", "implementation_version": "1", diff --git a/layers/windows/VkLayer_threading.json b/layers/windows/VkLayer_threading.json index ba48671b..206a2463 100644 --- a/layers/windows/VkLayer_threading.json +++ b/layers/windows/VkLayer_threading.json @@ -2,7 +2,7 @@ "file_format_version" : "1.0.0", "layer" : { "name": "VK_LAYER_GOOGLE_threading", - "type": "INSTANCE", + "type": "GLOBAL", "library_path": ".\\VkLayer_threading.dll", "api_version": "1.0.13", "implementation_version": "1", diff --git a/layers/windows/VkLayer_unique_objects.json b/layers/windows/VkLayer_unique_objects.json index 1dd7276c..3e0c47af 100644 --- a/layers/windows/VkLayer_unique_objects.json +++ b/layers/windows/VkLayer_unique_objects.json @@ -2,7 +2,7 @@ "file_format_version" : "1.0.0", "layer" : { "name": "VK_LAYER_GOOGLE_unique_objects", - "type": "INSTANCE", + "type": "GLOBAL", "library_path": ".\\VkLayer_unique_objects.dll", "api_version": "1.0.13", "implementation_version": "1", diff --git a/loader/loader.c b/loader/loader.c index cff4353a..151c7d73 100644 --- a/loader/loader.c +++ b/loader/loader.c @@ -1907,18 +1907,9 @@ loader_add_layer_properties(const struct loader_instance *inst, continue; } - if (!strcmp(type, "INSTANCE")) { - if (layer_instance_list == NULL) { - layer_node = layer_node->next; - continue; - } - props = loader_get_next_layer_property(inst, layer_instance_list); - props->type = (is_implicit) ? VK_LAYER_TYPE_INSTANCE_IMPLICIT - : VK_LAYER_TYPE_INSTANCE_EXPLICIT; - } - if (!strcmp(type, "GLOBAL")) { - loader_log(inst, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, 0, - "Global layers are treated the same as instance layers"); + // Allow either GLOBAL or INSTANCE type interchangeably to handle + // layers that must work with older loaders + if (!strcmp(type, "INSTANCE") || !strcmp(type, "GLOBAL")) { if (layer_instance_list == NULL) { layer_node = layer_node->next; continue; -- cgit v1.2.3 From 5f2b281d47038e3debb1d6b240d6ea3618cf61d8 Mon Sep 17 00:00:00 2001 From: Jeremy Hayes Date: Tue, 17 May 2016 09:32:12 -0600 Subject: loader: update linux so version Change-Id: I84656754952e7488712ca5bcd4701e2e85d92cce --- loader/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/loader/CMakeLists.txt b/loader/CMakeLists.txt index d9f99cc1..d6be9c11 100644 --- a/loader/CMakeLists.txt +++ b/loader/CMakeLists.txt @@ -72,6 +72,6 @@ else() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wpointer-arith") add_library(vulkan SHARED ${LOADER_SRCS}) - set_target_properties(vulkan PROPERTIES SOVERSION "1" VERSION "1.0.12") + set_target_properties(vulkan PROPERTIES SOVERSION "1" VERSION "1.0.13") target_link_libraries(vulkan -ldl -lpthread -lm) endif() -- cgit v1.2.3 From f671e517f7667c50ee9865267760a1fba26a0b6a Mon Sep 17 00:00:00 2001 From: Dustin Graves Date: Mon, 16 May 2016 18:35:55 -0600 Subject: layers: Fix transposed messages Fix parameter_validation::get_result_rescription utility function, which had the messages for VK_ERROR_DEVICE_LOST and VK_ERROR_INITIALIZATION_FAILED transposed. Change-Id: I47126389cbfafce663ec474fa04b899e6f2f663c --- layers/parameter_validation_utils.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/layers/parameter_validation_utils.h b/layers/parameter_validation_utils.h index 1683f31f..effd0530 100644 --- a/layers/parameter_validation_utils.h +++ b/layers/parameter_validation_utils.h @@ -717,8 +717,8 @@ static std::string get_result_description(VkResult result) { case VK_INCOMPLETE: return "a return array was too small for the result"; case VK_ERROR_OUT_OF_HOST_MEMORY: return "a host memory allocation has failed"; case VK_ERROR_OUT_OF_DEVICE_MEMORY: return "a device memory allocation has failed"; - case VK_ERROR_INITIALIZATION_FAILED: return "the logical device has been lost"; - case VK_ERROR_DEVICE_LOST: return "initialization of an object has failed"; + case VK_ERROR_INITIALIZATION_FAILED: return "initialization of an object has failed"; + case VK_ERROR_DEVICE_LOST: return "the logical device has been lost"; case VK_ERROR_MEMORY_MAP_FAILED: return "mapping of a memory object has failed"; case VK_ERROR_LAYER_NOT_PRESENT: return "the specified layer does not exist"; case VK_ERROR_EXTENSION_NOT_PRESENT: return "the specified extension does not exist"; -- cgit v1.2.3 From 4f7fe373328c9406410df11098593f27f0ed6f5e Mon Sep 17 00:00:00 2001 From: Dustin Graves Date: Mon, 16 May 2016 11:07:59 -0600 Subject: layers: Ignore 'noautovalidity' params w/codgen Add special handling to the parameter_validation layer's code generator for vk.xml parameters with the 'noautovalidty' attribute: - Ignore vk.xml parameters with the 'noautovalidity' attribute when generating code for the parameter_validation layer. - Implement custom validation routines for parameters with 'noautovalidity' tags. Issues-Addressed: GitHub 515 Change-Id: I1bd28cc79233fb8b040d6e107ed5e2176a84edb5 --- generator.py | 110 +++++---- layers/parameter_validation.cpp | 523 ++++++++++++++++++++++++++++++++++------ 2 files changed, 513 insertions(+), 120 deletions(-) diff --git a/generator.py b/generator.py index d9301dfa..eead2119 100644 --- a/generator.py +++ b/generator.py @@ -2863,7 +2863,7 @@ class ParamCheckerOutputGenerator(OutputGenerator): self.structMembers = [] # List of StructMemberData records for all Vulkan structs self.validatedStructs = dict() # Map of structs type names to generated validation code for that struct type self.enumRanges = dict() # Map of enum name to BEGIN/END range values - self.flags = dict() # Map of flags typenames to a Boolean value indicating that validation code is generated for a value of this type + self.flags = set() # Map of flags typenames self.flagBits = dict() # Map of flag bits typename to list of values # Named tuples to store struct and command data self.StructType = namedtuple('StructType', ['name', 'value']) @@ -2943,7 +2943,7 @@ class ParamCheckerOutputGenerator(OutputGenerator): self.structMembers = [] self.validatedStructs = dict() self.enumRanges = dict() - self.flags = dict() + self.flags = set() self.flagBits = dict() def endFeature(self): # C-specific @@ -2961,8 +2961,8 @@ class ParamCheckerOutputGenerator(OutputGenerator): self.processCmdData() # Write the declarations for the VkFlags values combining all flag bits for flag in sorted(self.flags): - if self.flags[flag]: - flagBits = flag.replace('Flags', 'FlagBits') + flagBits = flag.replace('Flags', 'FlagBits') + if flagBits in self.flagBits: bits = self.flagBits[flagBits] decl = 'const {} All{} = {}'.format(flag, flagBits, bits[0]) for bit in bits[1:]: @@ -3001,7 +3001,7 @@ class ParamCheckerOutputGenerator(OutputGenerator): elif (category == 'handle'): self.handleTypes.add(name) elif (category == 'bitmask'): - self.flags[name] = False + self.flags.add(name) # # Struct parameter check generation. # This is a special case of the tag where the contents are @@ -3212,7 +3212,7 @@ class ParamCheckerOutputGenerator(OutputGenerator): value = self.structTypes[typename].value else: value = self.genVkStructureType(typename) - #print('Generating {} for {} structure type that was not defined by the current feature'.format(value, typename)) + self.logMsg('diag', 'ParameterValidation: Generating {} for {} structure type that was not defined by the current feature'.format(value, typename)) return value # # Retrieve the value of the len tag @@ -3388,7 +3388,6 @@ class ParamCheckerOutputGenerator(OutputGenerator): else: allFlags = 'All' + flagBitsName checkExpr.append('skipCall |= validate_flags_array(report_data, "{}", "{}", "{}", "{}", {}, {pf}{}, {pf}{}, {}, {});\n'.format(funcPrintName, lenPrintName, valuePrintName, flagBitsName, allFlags, lenValue.name, value.name, lenValueRequired, valueRequired, pf=prefix)) - self.flags[value.type] = True return checkExpr # # Generate pNext check string @@ -3530,56 +3529,73 @@ class ParamCheckerOutputGenerator(OutputGenerator): if lenParam.isoptional: cvReq = 'false' # - # If this is a pointer to a struct with an sType field, verify the type - if value.type in self.structTypes: - usedLines += self.makeStructTypeCheck(valuePrefix, value, lenParam, req, cvReq, cpReq, funcName, lenDisplayName, valueDisplayName) - # If this is an input handle array that is not allowed to contain NULL handles, verify that none of the handles are VK_NULL_HANDLE - elif value.type in self.handleTypes and value.isconst and not self.isHandleOptional(value, lenParam): - usedLines += self.makeHandleCheck(valuePrefix, value, lenParam, req, cvReq, funcName, lenDisplayName, valueDisplayName) - elif value.type in self.flags and value.isconst: - usedLines += self.makeFlagsArrayCheck(valuePrefix, value, lenParam, req, cvReq, funcName, lenDisplayName, valueDisplayName) - elif value.isbool and value.isconst: - usedLines.append('skipCall |= validate_bool32_array(report_data, "{}", "{}", "{}", {pf}{}, {pf}{}, {}, {});\n'.format(funcName, lenDisplayName, valueDisplayName, lenParam.name, value.name, cvReq, req, pf=valuePrefix)) - elif value.israngedenum and value.isconst: - enumRange = self.enumRanges[value.type] - usedLines.append('skipCall |= validate_ranged_enum_array(report_data, "{}", "{}", "{}", "{}", {}, {}, {pf}{}, {pf}{}, {}, {});\n'.format(funcName, lenDisplayName, valueDisplayName, value.type, enumRange[0], enumRange[1], lenParam.name, value.name, cvReq, req, pf=valuePrefix)) - elif value.name == 'pNext': - # We need to ignore VkDeviceCreateInfo and VkInstanceCreateInfo, as the loader manipulates them in a way that is not documented in vk.xml - if not structTypeName in ['VkDeviceCreateInfo', 'VkInstanceCreateInfo']: - usedLines += self.makeStructNextCheck(valuePrefix, value, funcName, valueDisplayName) + # The parameter will not be processes when tagged as 'noautovalidity' + # For the pointer to struct case, the struct pointer will not be validated, but any + # members not tagged as 'noatuvalidity' will be validated + if value.noautovalidity: + # Log a diagnostic message when validation cannot be automatically generated and must be implemented manually + self.logMsg('diag', 'ParameterValidation: No validation for {} {}'.format(structTypeName if structTypeName else funcName, value.name)) else: - usedLines += self.makePointerCheck(valuePrefix, value, lenParam, req, cvReq, cpReq, funcName, lenDisplayName, valueDisplayName) + # + # If this is a pointer to a struct with an sType field, verify the type + if value.type in self.structTypes: + usedLines += self.makeStructTypeCheck(valuePrefix, value, lenParam, req, cvReq, cpReq, funcName, lenDisplayName, valueDisplayName) + # If this is an input handle array that is not allowed to contain NULL handles, verify that none of the handles are VK_NULL_HANDLE + elif value.type in self.handleTypes and value.isconst and not self.isHandleOptional(value, lenParam): + usedLines += self.makeHandleCheck(valuePrefix, value, lenParam, req, cvReq, funcName, lenDisplayName, valueDisplayName) + elif value.type in self.flags and value.isconst: + usedLines += self.makeFlagsArrayCheck(valuePrefix, value, lenParam, req, cvReq, funcName, lenDisplayName, valueDisplayName) + elif value.isbool and value.isconst: + usedLines.append('skipCall |= validate_bool32_array(report_data, "{}", "{}", "{}", {pf}{}, {pf}{}, {}, {});\n'.format(funcName, lenDisplayName, valueDisplayName, lenParam.name, value.name, cvReq, req, pf=valuePrefix)) + elif value.israngedenum and value.isconst: + enumRange = self.enumRanges[value.type] + usedLines.append('skipCall |= validate_ranged_enum_array(report_data, "{}", "{}", "{}", "{}", {}, {}, {pf}{}, {pf}{}, {}, {});\n'.format(funcName, lenDisplayName, valueDisplayName, value.type, enumRange[0], enumRange[1], lenParam.name, value.name, cvReq, req, pf=valuePrefix)) + elif value.name == 'pNext': + # We need to ignore VkDeviceCreateInfo and VkInstanceCreateInfo, as the loader manipulates them in a way that is not documented in vk.xml + if not structTypeName in ['VkDeviceCreateInfo', 'VkInstanceCreateInfo']: + usedLines += self.makeStructNextCheck(valuePrefix, value, funcName, valueDisplayName) + else: + usedLines += self.makePointerCheck(valuePrefix, value, lenParam, req, cvReq, cpReq, funcName, lenDisplayName, valueDisplayName) # # If this is a pointer to a struct (input), see if it contains members that need to be checked if value.type in self.validatedStructs and value.isconst: usedLines.append(self.expandStructPointerCode(valuePrefix, value, lenParam, funcName, valueDisplayName)) # Non-pointer types - elif (value.type in self.structTypes) or (value.type in self.validatedStructs): - if value.type in self.structTypes: - stype = self.structTypes[value.type] - usedLines.append('skipCall |= validate_struct_type(report_data, "{}", "{}", "{sv}", &({}{vn}), {sv}, false);\n'.format( - funcName, valueDisplayName, valuePrefix, vn=value.name, sv=stype.value)) + else: + # + # The parameter will not be processes when tagged as 'noautovalidity' + # For the struct case, the struct type will not be validated, but any + # members not tagged as 'noatuvalidity' will be validated + if value.noautovalidity: + # Log a diagnostic message when validation cannot be automatically generated and must be implemented manually + self.logMsg('diag', 'ParameterValidation: No validation for {} {}'.format(structTypeName if structTypeName else funcName, value.name)) + else: + if value.type in self.structTypes: + stype = self.structTypes[value.type] + usedLines.append('skipCall |= validate_struct_type(report_data, "{}", "{}", "{sv}", &({}{vn}), {sv}, false);\n'.format( + funcName, valueDisplayName, valuePrefix, vn=value.name, sv=stype.value)) + elif value.type in self.handleTypes: + if not self.isHandleOptional(value, None): + usedLines.append('skipCall |= validate_required_handle(report_data, "{}", "{}", {}{});\n'.format(funcName, valueDisplayName, valuePrefix, value.name)) + elif value.type in self.flags: + flagBitsName = value.type.replace('Flags', 'FlagBits') + if not flagBitsName in self.flagBits: + usedLines.append('skipCall |= validate_reserved_flags(report_data, "{}", "{}", {pf}{});\n'.format(funcName, valueDisplayName, value.name, pf=valuePrefix)) + else: + flagsRequired = 'false' if value.isoptional else 'true' + allFlagsName = 'All' + flagBitsName + usedLines.append('skipCall |= validate_flags(report_data, "{}", "{}", "{}", {}, {pf}{}, {});\n'.format(funcName, valueDisplayName, flagBitsName, allFlagsName, value.name, flagsRequired, pf=valuePrefix)) + elif value.isbool: + usedLines.append('skipCall |= validate_bool32(report_data, "{}", "{}", {}{});\n'.format(funcName, valueDisplayName, valuePrefix, value.name)) + elif value.israngedenum: + enumRange = self.enumRanges[value.type] + usedLines.append('skipCall |= validate_ranged_enum(report_data, "{}", "{}", "{}", {}, {}, {}{});\n'.format(funcName, valueDisplayName, value.type, enumRange[0], enumRange[1], valuePrefix, value.name)) + # + # If this is a pointer to a struct (input), see if it contains members that need to be checked if value.type in self.validatedStructs: memberNamePrefix = '{}{}.'.format(valuePrefix, value.name) memberDisplayNamePrefix = '{}.'.format(valueDisplayName) usedLines.append(self.expandStructCode(self.validatedStructs[value.type], funcName, memberNamePrefix, memberDisplayNamePrefix, '', [])) - elif value.type in self.handleTypes: - if not self.isHandleOptional(value, None): - usedLines.append('skipCall |= validate_required_handle(report_data, "{}", "{}", {}{});\n'.format(funcName, valueDisplayName, valuePrefix, value.name)) - elif value.type in self.flags: - flagBitsName = value.type.replace('Flags', 'FlagBits') - if not flagBitsName in self.flagBits: - usedLines.append('skipCall |= validate_reserved_flags(report_data, "{}", "{}", {pf}{});\n'.format(funcName, valueDisplayName, value.name, pf=valuePrefix)) - else: - flagsRequired = 'false' if value.isoptional else 'true' - allFlagsName = 'All' + flagBitsName - usedLines.append('skipCall |= validate_flags(report_data, "{}", "{}", "{}", {}, {pf}{}, {});\n'.format(funcName, valueDisplayName, flagBitsName, allFlagsName, value.name, flagsRequired, pf=valuePrefix)) - self.flags[value.type] = True - elif value.isbool: - usedLines.append('skipCall |= validate_bool32(report_data, "{}", "{}", {}{});\n'.format(funcName, valueDisplayName, valuePrefix, value.name)) - elif value.israngedenum: - enumRange = self.enumRanges[value.type] - usedLines.append('skipCall |= validate_ranged_enum(report_data, "{}", "{}", "{}", {}, {}, {}{});\n'.format(funcName, valueDisplayName, value.type, enumRange[0], enumRange[1], valuePrefix, value.name)) # # Append the parameter check to the function body for the current command if usedLines: diff --git a/layers/parameter_validation.cpp b/layers/parameter_validation.cpp index 20676b4a..035b9290 100644 --- a/layers/parameter_validation.cpp +++ b/layers/parameter_validation.cpp @@ -2237,16 +2237,31 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetEvent(VkDevice device, VkE VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; - bool skipCall = false; - layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); - assert(my_data != NULL); + bool skip_call = false; + layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); + assert(device_data != nullptr); + debug_report_data *report_data = device_data->report_data; - skipCall |= parameter_validation_vkCreateQueryPool(my_data->report_data, pCreateInfo, pAllocator, pQueryPool); + skip_call |= parameter_validation_vkCreateQueryPool(device_data->report_data, pCreateInfo, pAllocator, pQueryPool); - if (!skipCall) { + // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml + if (pCreateInfo != nullptr) { + // If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of + // VkQueryPipelineStatisticFlagBits values + if ((pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) && (pCreateInfo->pipelineStatistics != 0) && + ((pCreateInfo->pipelineStatistics & (~AllVkQueryPipelineStatisticFlagBits)) != 0)) { + skip_call |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, + UNRECOGNIZED_VALUE, LayerName, "vkCreateQueryPool: if pCreateInfo->queryType is " + "VK_QUERY_TYPE_PIPELINE_STATISTICS, pCreateInfo->pipelineStatistics must be " + "a valid combination of VkQueryPipelineStatisticFlagBits values"); + } + } + + if (!skip_call) { result = get_dispatch_table(pc_device_table_map, device)->CreateQueryPool(device, pCreateInfo, pAllocator, pQueryPool); - validate_result(my_data->report_data, "vkCreateQueryPool", result); + validate_result(report_data, "vkCreateQueryPool", result); } return result; @@ -2286,32 +2301,47 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetQueryPoolResults(VkDevice de return result; } -bool PreCreateBuffer(layer_data *device_data, const VkBufferCreateInfo *pCreateInfo) { - if (pCreateInfo != nullptr) { - if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) { - validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices", - pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices); - } - } - - return true; -} - VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; - bool skipCall = false; - layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); - assert(my_data != NULL); + bool skip_call = false; + layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); + assert(device_data != nullptr); + debug_report_data *report_data = device_data->report_data; - skipCall |= parameter_validation_vkCreateBuffer(my_data->report_data, pCreateInfo, pAllocator, pBuffer); + skip_call |= parameter_validation_vkCreateBuffer(report_data, pCreateInfo, pAllocator, pBuffer); - if (!skipCall) { - PreCreateBuffer(my_data, pCreateInfo); + if (pCreateInfo != nullptr) { + // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml + if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) { + // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1 + if (pCreateInfo->queueFamilyIndexCount <= 1) { + skip_call |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, + INVALID_USAGE, LayerName, "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, " + "pCreateInfo->queueFamilyIndexCount must be greater than 1"); + } + // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of + // queueFamilyIndexCount uint32_t values + if (pCreateInfo->pQueueFamilyIndices == nullptr) { + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + __LINE__, REQUIRED_PARAMETER, LayerName, + "vkCreateBuffer: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, " + "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of " + "pCreateInfo->queueFamilyIndexCount uint32_t values"); + } + + // Ensure that the queue family indices were specified at device creation + skip_call |= validate_queue_family_indices(device_data, "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices", + pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices); + } + } + + if (!skip_call) { result = get_dispatch_table(pc_device_table_map, device)->CreateBuffer(device, pCreateInfo, pAllocator, pBuffer); - validate_result(my_data->report_data, "vkCreateBuffer", result); + validate_result(report_data, "vkCreateBuffer", result); } return result; @@ -2366,20 +2396,31 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImage(VkDevice device, co VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skip_call = false; layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); - assert(device_data != NULL); + assert(device_data != nullptr); debug_report_data *report_data = device_data->report_data; skip_call |= parameter_validation_vkCreateImage(report_data, pCreateInfo, pAllocator, pImage); if (pCreateInfo != nullptr) { + // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT) { - // pQueueFamilyIndices must not be NULL - skip_call |= validate_required_pointer(report_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices", - pCreateInfo->pQueueFamilyIndices); + // If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1 + if (pCreateInfo->queueFamilyIndexCount <= 1) { + skip_call |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, + INVALID_USAGE, LayerName, "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, " + "pCreateInfo->queueFamilyIndexCount must be greater than 1"); + } - // queueFamilyIndexCount must be greater than 1 - skip_call |= ValidateGreaterThan(report_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices", - pCreateInfo->queueFamilyIndexCount, 1u); + // If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a pointer to an array of + // queueFamilyIndexCount uint32_t values + if (pCreateInfo->pQueueFamilyIndices == nullptr) { + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + __LINE__, REQUIRED_PARAMETER, LayerName, + "vkCreateImage: if pCreateInfo->sharingMode is VK_SHARING_MODE_CONCURRENT, " + "pCreateInfo->pQueueFamilyIndices must be a pointer to an array of " + "pCreateInfo->queueFamilyIndexCount uint32_t values"); + } skip_call |= validate_queue_family_indices(device_data, "vkCreateImage", "pCreateInfo->pQueueFamilyIndices", pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices); @@ -2730,20 +2771,185 @@ vkCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32 const VkGraphicsPipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; - bool skipCall = false; - layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); - assert(my_data != NULL); + bool skip_call = false; + layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); + assert(device_data != nullptr); + debug_report_data *report_data = device_data->report_data; - skipCall |= parameter_validation_vkCreateGraphicsPipelines(my_data->report_data, pipelineCache, createInfoCount, pCreateInfos, - pAllocator, pPipelines); + skip_call |= parameter_validation_vkCreateGraphicsPipelines(report_data, pipelineCache, createInfoCount, pCreateInfos, + pAllocator, pPipelines); - if (!skipCall) { + if (pCreateInfos != nullptr) { + for (uint32_t i = 0; i < createInfoCount; ++i) { + // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml + if (pCreateInfos[i].pTessellationState == nullptr) { + if (pCreateInfos[i].pStages != nullptr) { + // If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage, + // pTessellationState must not be NULL + bool has_control = false; + bool has_eval = false; + + for (uint32_t stage_index = 0; stage_index < pCreateInfos[i].stageCount; ++stage_index) { + if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT) { + has_control = true; + } else if (pCreateInfos[i].pStages[stage_index].stage == VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) { + has_eval = true; + } + } + + if (has_control && has_eval) { + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + __LINE__, REQUIRED_PARAMETER, LayerName, + "vkCreateGraphicsPipelines: if pCreateInfos[%d].pStages includes a tessellation " + "control shader stage and a tessellation evaluation shader stage, " + "pCreateInfos[%d].pTessellationState must not be NULL", + i, i); + } + } + } else if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) { + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + __LINE__, INVALID_STRUCT_STYPE, LayerName, + "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be " + "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO", + i); + } + + if (pCreateInfos[i].pViewportState == nullptr) { + // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a pointer to a + // valid VkPipelineViewportStateCreateInfo structure + if ((pCreateInfos[i].pRasterizationState != nullptr) && + (pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) { + skip_call |= log_msg( + report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, + REQUIRED_PARAMETER, LayerName, + "vkCreateGraphicsPipelines: if pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is VK_FALSE, " + "pCreateInfos[%d].pViewportState must be a pointer to a valid VkPipelineViewportStateCreateInfo structure", + i, i); + } + } else { + if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) { + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + __LINE__, INVALID_STRUCT_STYPE, LayerName, + "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pViewportState->sType must be " + "VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO", + i); + } + + if (pCreateInfos[i].pDynamicState != nullptr) { + bool has_dynamic_viewport = false; + bool has_dynamic_scissor = false; + + for (uint32_t state_index = 0; state_index < pCreateInfos[i].pDynamicState->dynamicStateCount; ++state_index) { + if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_VIEWPORT) { + has_dynamic_viewport = true; + } else if (pCreateInfos[i].pDynamicState->pDynamicStates[state_index] == VK_DYNAMIC_STATE_SCISSOR) { + has_dynamic_scissor = true; + } + } + + // viewportCount must be greater than 0 + // TODO: viewportCount must be 1 when multiple_viewport feature is not enabled + if (pCreateInfos[i].pViewportState->viewportCount == 0) { + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + __LINE__, REQUIRED_PARAMETER, LayerName, + "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates " + "contains VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->viewportCount " + "must be greater than 0", + i, i); + } + + // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports + // member of pViewportState must be a pointer to an array of pViewportState->viewportCount VkViewport structures + if (!has_dynamic_viewport && (pCreateInfos[i].pViewportState->pViewports == nullptr)) { + skip_call |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + __LINE__, REQUIRED_PARAMETER, LayerName, + "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates contains " + "VK_DYNAMIC_STATE_VIEWPORT, pCreateInfos[%d].pViewportState->pViewports must not be NULL", + i, i); + } + + // scissorCount must be greater than 0 + // TODO: scissorCount must be 1 when multiple_viewport feature is not enabled + if (pCreateInfos[i].pViewportState->scissorCount == 0) { + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + __LINE__, REQUIRED_PARAMETER, LayerName, + "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates " + "contains VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->scissorCount " + "must be greater than 0", + i, i); + } + + // If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member + // of pViewportState must be a pointer to an array of pViewportState->scissorCount VkRect2D structures + if (!has_dynamic_scissor && (pCreateInfos[i].pViewportState->pScissors == nullptr)) { + skip_call |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + __LINE__, REQUIRED_PARAMETER, LayerName, + "vkCreateGraphicsPipelines: if pCreateInfos[%d].pDynamicState->pDynamicStates contains " + "VK_DYNAMIC_STATE_SCISSOR, pCreateInfos[%d].pViewportState->pScissors must not be NULL", + i, i); + } + } + } + + if (pCreateInfos[i].pMultisampleState == nullptr) { + // If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a pointer to + // a valid VkPipelineMultisampleStateCreateInfo structure + if ((pCreateInfos[i].pRasterizationState != nullptr) && + pCreateInfos[i].pRasterizationState->rasterizerDiscardEnable == VK_FALSE) { + skip_call |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, + REQUIRED_PARAMETER, LayerName, "vkCreateGraphicsPipelines: if " + "pCreateInfos[%d].pRasterizationState->rasterizerDiscardEnable is " + "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL", + i, i); + } + } else if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) { + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + __LINE__, INVALID_STRUCT_STYPE, LayerName, + "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be " + "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO", + i); + } + + // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass + if ((pCreateInfos[i].pDepthStencilState != nullptr) && + (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO)) { + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + __LINE__, INVALID_STRUCT_STYPE, LayerName, + "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be " + "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO", + i); + } + + // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass + if (pCreateInfos[i].pColorBlendState != nullptr) { + if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) { + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + __LINE__, INVALID_STRUCT_STYPE, LayerName, + "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pColorBlendState->sType must be " + "VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO", + i); + } + + // If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value + if (pCreateInfos[i].pColorBlendState->logicOpEnable == VK_TRUE) { + skip_call |= validate_ranged_enum( + report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->logicOp", "VkLogicOp", + VK_LOGIC_OP_BEGIN_RANGE, VK_LOGIC_OP_END_RANGE, pCreateInfos[i].pColorBlendState->logicOp); + } + } + } + } + + if (!skip_call) { PreCreateGraphicsPipelines(device, pCreateInfos); result = get_dispatch_table(pc_device_table_map, device) ->CreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines); - validate_result(my_data->report_data, "vkCreateGraphicsPipelines", result); + validate_result(report_data, "vkCreateGraphicsPipelines", result); } return result; @@ -2834,16 +3040,35 @@ vkDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout, const VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; - bool skipCall = false; - layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); - assert(my_data != NULL); + bool skip_call = false; + layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); + assert(device_data != NULL); + debug_report_data *report_data = device_data->report_data; - skipCall |= parameter_validation_vkCreateSampler(my_data->report_data, pCreateInfo, pAllocator, pSampler); + skip_call |= parameter_validation_vkCreateSampler(report_data, pCreateInfo, pAllocator, pSampler); - if (!skipCall) { + // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml + if (pCreateInfo != nullptr) { + // If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value + if (pCreateInfo->compareEnable == VK_TRUE) { + skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp", + VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfo->compareOp); + } + + // If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a + // valid VkBorderColor value + if ((pCreateInfo->addressModeU == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) || + (pCreateInfo->addressModeV == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER) || + (pCreateInfo->addressModeW == VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) { + skip_call |= validate_ranged_enum(report_data, "vkCreateSampler", "pCreateInfo->borderColor", "VkBorderColor", + VK_BORDER_COLOR_BEGIN_RANGE, VK_BORDER_COLOR_END_RANGE, pCreateInfo->borderColor); + } + } + + if (!skip_call) { result = get_dispatch_table(pc_device_table_map, device)->CreateSampler(device, pCreateInfo, pAllocator, pSampler); - validate_result(my_data->report_data, "vkCreateSampler", result); + validate_result(report_data, "vkCreateSampler", result); } return result; @@ -2866,17 +3091,55 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDescriptorSetLayout *pSetLayout) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; - bool skipCall = false; - layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); - assert(my_data != NULL); + bool skip_call = false; + layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); + assert(device_data != nullptr); + debug_report_data *report_data = device_data->report_data; - skipCall |= parameter_validation_vkCreateDescriptorSetLayout(my_data->report_data, pCreateInfo, pAllocator, pSetLayout); + skip_call |= parameter_validation_vkCreateDescriptorSetLayout(report_data, pCreateInfo, pAllocator, pSetLayout); + + // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml + if ((pCreateInfo != nullptr) && (pCreateInfo->pBindings != nullptr)) { + for (uint32_t i = 0; i < pCreateInfo->bindingCount; ++i) { + if (pCreateInfo->pBindings[i].descriptorCount != 0) { + // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount + // is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a pointer to an array of descriptorCount + // valid VkSampler handles + if (((pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) || + (pCreateInfo->pBindings[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)) && + (pCreateInfo->pBindings[i].pImmutableSamplers != nullptr)) { + for (uint32_t descriptor_index = 0; descriptor_index < pCreateInfo->pBindings[i].descriptorCount; + ++descriptor_index) { + if (pCreateInfo->pBindings[i].pImmutableSamplers[descriptor_index] == VK_NULL_HANDLE) { + skip_call |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + __LINE__, REQUIRED_PARAMETER, LayerName, "vkCreateDescriptorSetLayout: required parameter " + "pCreateInfo->pBindings[%d].pImmutableSamplers[%d]" + " specified as VK_NULL_HANDLE", + i, descriptor_index); + } + } + } - if (!skipCall) { + // If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values + if ((pCreateInfo->pBindings[i].stageFlags != 0) && + ((pCreateInfo->pBindings[i].stageFlags & (~AllVkShaderStageFlagBits)) != 0)) { + skip_call |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, + UNRECOGNIZED_VALUE, LayerName, + "vkCreateDescriptorSetLayout: if pCreateInfo->pBindings[%d].descriptorCount is not 0, " + "pCreateInfo->pBindings[%d].stageFlags must be a valid combination of VkShaderStageFlagBits values", + i, i); + } + } + } + } + + if (!skip_call) { result = get_dispatch_table(pc_device_table_map, device)->CreateDescriptorSetLayout(device, pCreateInfo, pAllocator, pSetLayout); - validate_result(my_data->report_data, "vkCreateDescriptorSetLayout", result); + validate_result(report_data, "vkCreateDescriptorSetLayout", result); } return result; @@ -2970,17 +3233,24 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkFreeDescriptorSets(VkDevice dev uint32_t descriptorSetCount, const VkDescriptorSet *pDescriptorSets) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; - bool skipCall = false; - layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); - assert(my_data != NULL); + bool skip_call = false; + layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); + assert(device_data != nullptr); + debug_report_data *report_data = device_data->report_data; - skipCall |= parameter_validation_vkFreeDescriptorSets(my_data->report_data, descriptorPool, descriptorSetCount, pDescriptorSets); + skip_call |= parameter_validation_vkFreeDescriptorSets(report_data, descriptorPool, descriptorSetCount, pDescriptorSets); - if (!skipCall) { + // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml + // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond + // validate_array() + skip_call |= validate_array(report_data, "vkFreeDescriptorSets", "descriptorSetCount", "pDescriptorSets", descriptorSetCount, + pDescriptorSets, true, true); + + if (!skip_call) { result = get_dispatch_table(pc_device_table_map, device) ->FreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets); - validate_result(my_data->report_data, "vkFreeDescriptorSets", result); + validate_result(report_data, "vkFreeDescriptorSets", result); } return result; @@ -2989,14 +3259,96 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkFreeDescriptorSets(VkDevice dev VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkUpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pDescriptorCopies) { - bool skipCall = false; - layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); - assert(my_data != NULL); + bool skip_call = false; + layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); + assert(device_data != NULL); + debug_report_data *report_data = device_data->report_data; - skipCall |= parameter_validation_vkUpdateDescriptorSets(my_data->report_data, descriptorWriteCount, pDescriptorWrites, - descriptorCopyCount, pDescriptorCopies); + skip_call |= parameter_validation_vkUpdateDescriptorSets(report_data, descriptorWriteCount, pDescriptorWrites, + descriptorCopyCount, pDescriptorCopies); - if (!skipCall) { + // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml + if (pDescriptorWrites != NULL) { + for (uint32_t i = 0; i < descriptorWriteCount; ++i) { + // descriptorCount must be greater than 0 + if (pDescriptorWrites[i].descriptorCount == 0) { + skip_call |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, + REQUIRED_PARAMETER, LayerName, + "vkUpdateDescriptorSets: parameter pDescriptorWrites[%d].descriptorCount must be greater than 0", i); + } + + if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER) || + (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) || + (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) || + (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) || + (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) { + // If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, + // VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, + // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures + if (pDescriptorWrites[i].pImageInfo == nullptr) { + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + __LINE__, REQUIRED_PARAMETER, LayerName, + "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is " + "VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, " + "VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or " + "VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pDescriptorWrites[%d].pImageInfo must not be NULL", + i, i); + } else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) { + // If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, + // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout + // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively + for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount; + ++descriptor_index) { + skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets", + "pDescriptorWrites[i].pImageInfo[i].imageView", + pDescriptorWrites[i].pImageInfo[descriptor_index].imageView); + skip_call |= validate_ranged_enum(report_data, "vkUpdateDescriptorSets", + "pDescriptorWrites[i].pImageInfo[i].imageLayout", "VkImageLayout", + VK_IMAGE_LAYOUT_BEGIN_RANGE, VK_IMAGE_LAYOUT_END_RANGE, + pDescriptorWrites[i].pImageInfo[descriptor_index].imageLayout); + } + } + } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) || + (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) || + (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) || + (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) { + // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, + // VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a + // pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures + if (pDescriptorWrites[i].pBufferInfo == nullptr) { + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + __LINE__, REQUIRED_PARAMETER, LayerName, + "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is " + "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, " + "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, " + "pDescriptorWrites[%d].pBufferInfo must not be NULL", + i, i); + } + } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) || + (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) { + // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, + // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles + if (pDescriptorWrites[i].pTexelBufferView == nullptr) { + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + __LINE__, REQUIRED_PARAMETER, LayerName, + "vkUpdateDescriptorSets: if pDescriptorWrites[%d].descriptorType is " + "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, " + "pDescriptorWrites[%d].pTexelBufferView must not be NULL", + i, i); + } else { + for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount; + ++descriptor_index) { + skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets", + "pDescriptorWrites[i].pTexelBufferView[i]", + pDescriptorWrites[i].pTexelBufferView[descriptor_index]); + } + } + } + } + } + + if (!skip_call) { get_dispatch_table(pc_device_table_map, device) ->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies); } @@ -3153,13 +3505,20 @@ vkAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAl VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkFreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) { - bool skipCall = false; - layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); - assert(my_data != NULL); + bool skip_call = false; + layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); + assert(device_data != nullptr); + debug_report_data *report_data = device_data->report_data; - skipCall |= parameter_validation_vkFreeCommandBuffers(my_data->report_data, commandPool, commandBufferCount, pCommandBuffers); + skip_call |= parameter_validation_vkFreeCommandBuffers(report_data, commandPool, commandBufferCount, pCommandBuffers); - if (!skipCall) { + // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml + // This is an array of handles, where the elements are allowed to be VK_NULL_HANDLE, and does not require any validation beyond + // validate_array() + skip_call |= validate_array(report_data, "vkFreeCommandBuffers", "commandBufferCount", "pCommandBuffers", commandBufferCount, + pCommandBuffers, true, true); + + if (!skip_call) { get_dispatch_table(pc_device_table_map, device) ->FreeCommandBuffers(device, commandPool, commandBufferCount, pCommandBuffers); } @@ -3168,16 +3527,34 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkFreeCommandBuffers(VkDevice device, VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; - bool skipCall = false; - layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); - assert(my_data != NULL); + bool skip_call = false; + layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); + assert(device_data != nullptr); + debug_report_data *report_data = device_data->report_data; - skipCall |= parameter_validation_vkBeginCommandBuffer(my_data->report_data, pBeginInfo); + skip_call |= parameter_validation_vkBeginCommandBuffer(report_data, pBeginInfo); - if (!skipCall) { + // Validation for parameters excluded from the generated validation code due to a 'noautovalidity' tag in vk.xml + // TODO: pBeginInfo->pInheritanceInfo must not be NULL if commandBuffer is a secondary command buffer + skip_call |= validate_struct_type(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo", + "VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", pBeginInfo->pInheritanceInfo, + VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false); + + if (pBeginInfo->pInheritanceInfo != NULL) { + // TODO: This only needs to be validated when the inherited queries feature is enabled + // skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags", + // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false); + + // TODO: This must be 0 if the pipeline statistics queries feature is not enabled + skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pipelineStatistics", + "VkQueryPipelineStatisticFlagBits", AllVkQueryPipelineStatisticFlagBits, + pBeginInfo->pInheritanceInfo->pipelineStatistics, false); + } + + if (!skip_call) { result = get_dispatch_table(pc_device_table_map, commandBuffer)->BeginCommandBuffer(commandBuffer, pBeginInfo); - validate_result(my_data->report_data, "vkBeginCommandBuffer", result); + validate_result(report_data, "vkBeginCommandBuffer", result); } return result; -- cgit v1.2.3 From ced9af88ebb9c37d24cb6cfbaa77104f73f977f6 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Tue, 17 May 2016 06:43:48 -0600 Subject: layers: Add correct IsStorage() to TexelDescriptor Similar to Norbert's previous fix for ImageDescriptor, TexelDescriptor was also missing correct IsStorage() override function and so would always return false instead of actual storage_ value. Change-Id: I9006cdb614c5b78db0a68b71dcc4300f4c5c0d7f --- layers/descriptor_sets.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/layers/descriptor_sets.h b/layers/descriptor_sets.h index 4594a695..92fda958 100644 --- a/layers/descriptor_sets.h +++ b/layers/descriptor_sets.h @@ -231,7 +231,8 @@ class TexelDescriptor : public Descriptor { TexelDescriptor(const VkDescriptorType, const std::unordered_map *); bool WriteUpdate(const VkWriteDescriptorSet *, const uint32_t, std::string *) override; bool CopyUpdate(const Descriptor *, std::string *) override; - VkBufferView GetBufferView() const { return buffer_view_; }; + virtual bool IsStorage() const override { return storage_; } + VkBufferView GetBufferView() const { return buffer_view_; } private: VkBufferView buffer_view_; -- cgit v1.2.3 From f05d5d11e4a72e5ebae2c89461c22b5319a1afe7 Mon Sep 17 00:00:00 2001 From: Ian Elliott Date: Tue, 17 May 2016 12:03:35 -0600 Subject: demos: GH#559 fix for new Android windows On Android, treat a 1st-time new window differently from an nth-time new window. --- demos/cube.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/demos/cube.c b/demos/cube.c index bc391414..680e4245 100644 --- a/demos/cube.c +++ b/demos/cube.c @@ -3088,6 +3088,19 @@ static void processCommand(struct android_app* app, int32_t cmd) { switch(cmd) { case APP_CMD_INIT_WINDOW: { if (app->window) { + // We're getting a new window. If the app is starting up, we + // need to initialize. If the app has already been + // initialized, that means that we lost our previous window, + // which means that we have a lot of work to do. At a minimum, + // we need to destroy the swapchain and surface associated with + // the old window, and create a new surface and swapchain. + // However, since there are a lot of other objects/state that + // is tied to the swapchain, it's easiest to simply cleanup and + // start over (i.e. use a brute-force approach of re-starting + // the app) + if (demo.prepared) { + demo_cleanup(&demo); + } demo_init(&demo, 0, NULL); demo.window = (void*)app->window; demo_init_vk_swapchain(&demo); @@ -3117,6 +3130,8 @@ void android_main(struct android_app *app) return; #endif + demo.prepared = false; + app->onAppCmd = processCommand; app->onInputEvent = processInput; -- cgit v1.2.3 From be8751322d1c4e175fa40cb8c1a23a65f3db3c4a Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Tue, 17 May 2016 14:52:43 -0600 Subject: layers: Update layer README.md for release Updated language surrounding device/instance layer changes, fixed up some markdown formatting issues. Change-Id: I66353eeeef6789ab15c4e08c21f9da149f9ce09e --- layers/README.md | 53 ++++++++++++++++++++++------------------------------- 1 file changed, 22 insertions(+), 31 deletions(-) diff --git a/layers/README.md b/layers/README.md index c9182c98..44111967 100644 --- a/layers/README.md +++ b/layers/README.md @@ -13,80 +13,71 @@ Layer libraries can be written to intercept or hook VK entry points for various debug and validation purposes. One or more VK entry points can be defined in your Layer library. Undefined entrypoints in the Layer library will be passed to the next Layer which may be the driver. Multiple layer libraries can be chained (actually a hierarchy) together. -vkEnumerateInstanceLayerProperties and vkEnumerateDeviceLayerProperties can be called to list the -available layers and their properties. Layers can intercept Vulkan instance level entry points -in which case they are called an Instance Layer. Layers can intercept device entry points -in which case they are called a Device Layer. Instance level entry points are those with VkInstance -or VkPhysicalDevice as first parameter. Device level entry points are those with VkDevice, VkCommandBuffer, -or VkQueue as the first parameter. Layers that want to intercept both instance and device -level entrypoints are called Global Layers. vkXXXXGetProcAddr is used internally by the Layers and -Loader to initialize dispatch tables. Device Layers are activated at vkCreateDevice time. Instance -Layers are activated at vkCreateInstance time. Layers can also be activated via environment variables -(VK_INSTANCE_LAYERS or VK_DEVICE_LAYERS). +`vkEnumerateInstanceLayerProperties` can be called to list the available layers and their properties. +vkXXXXGetProcAddr is used internally by the Layers and Loader to initialize dispatch tables. +Layers can also be activated via the `VK_INSTANCE_LAYERS` environment variable. All validation layers work with the DEBUG_REPORT extension to provide the application or user with validation feedback. When a validation layer is enabled, it will look at the vk_layer_settings.txt file to determine its behavior. Such as outputing to a file, stdout or debug output (Windows). An application can also register callback functions via the DEBUG_REPORT extension to receive callbacks when the requested validation events happen. Application callbacks happen regardless of the -settings in vk_layer_settings.txt +settings in the vk_layer_settings.txt file. ### Layer library example code -Note that some layers are code-generated and will therefore exist in the directory (build_dir)/layers +Note that some layers are code-generated and will therefore exist in the directory `(build_dir)/layers` --include/vkLayer.h - header file for layer code. +`include/vkLayer.h` - header file for layer code. ### Layer Details -For complete details of current validation layers, including all of the validation checks that they perform, please refer to the document layers/vk_validation_layer_details.md. Below is a brief overview of each layer. +For complete details of current validation layers, including all of the validation checks that they perform, please refer to the document `layers/vk_validation_layer_details.md`. Below is a brief overview of each layer. ### Standard Validation -This is a meta-layer managed by the loader. (name = VK_LAYER_LUNARG_standard_validation) - specifying this layer name will cause the loader to load the all of the standard validation layers (listed below) in the following optimal order: VK_LAYER_GOOGLE_threading, VK_LAYER_LUNARG_parameter_validation, VK_LAYER_LUNARG_device_limits, VK_LAYER_LUNARG_object_tracker, VK_LAYER_LUNARG_image, VK_LAYER_LUNARG_core_validation, VK_LAYER_LUNARG_swapchain, and VK_LAYER_GOOGLE_unique_objects. Other layers can be specified and the loader will remove duplicates. +This is a meta-layer managed by the loader. (name = `VK_LAYER_LUNARG_standard_validation`) - specifying this layer name will cause the loader to load the all of the standard validation layers (listed below) in the following optimal order: `VK_LAYER_GOOGLE_threading`, `VK_LAYER_LUNARG_parameter_validation`, `VK_LAYER_LUNARG_device_limits`, `VK_LAYER_LUNARG_object_tracker`, `VK_LAYER_LUNARG_image`, `VK_LAYER_LUNARG_core_validation`,` VK_LAYER_LUNARG_swapchain`, and `VK_LAYER_GOOGLE_unique_objects`. Other layers can be specified and the loader will remove duplicates. ### Object Validation and Statistics -(build dir)/layers/object_tracker.cpp (name=VK_LAYER_LUNARG_object_tracker) - Track object creation, use, and destruction. As objects are created they are stored in a map. As objects are used the layer verifies they exist in the map, flagging errors for unknown objects. As objects are destroyed they are removed from the map. At vkDestroyDevice() and vkDestroyInstance() times, if any objects have not been destroyed they are reported as leaked objects. If a Dbg callback function is registered this layer will use callback function(s) for reporting, otherwise it will use stdout. +(build dir)/layers/object_tracker.cpp (name=`VK_LAYER_LUNARG_object_tracker`) - Track object creation, use, and destruction. As objects are created they are stored in a map. As objects are used the layer verifies they exist in the map, flagging errors for unknown objects. As objects are destroyed they are removed from the map. At `vkDestroyDevice()` and `vkDestroyInstance()` times, if any objects have not been destroyed they are reported as leaked objects. If a Dbg callback function is registered this layer will use callback function(s) for reporting, otherwise it will use stdout. ### Validate API State and Shaders -layers/core\_validation.cpp (name=VK\_LAYER\_LUNARG\_core\_validation) - The core\_validation layer does the bulk of the API validation that requires storing state. Some of the state it tracks includes the Descriptor Set, Pipeline State, Shaders, and dynamic state, and memory objects and bindings. It performs some point validation as states are created and used, and further validation Draw call and QueueSubmit time. Of primary interest is making sure that the resources bound to Descriptor Sets correctly align with the layout specified for the Set. Also, all of the image and buffer layouts are validated to make sure explicit layout transitions are properly managed. Related to memory, core\_validation includes tracking object bindings, memory hazards, and memory object lifetimes. It also validates several other hazard-related issues related to command buffers, fences, and memory mapping. Additionally core\_validation include shader validation (formerly separate shader\_checker layer) that inspects the SPIR-V shader images and fixed function pipeline stages at PSO creation time. It flags errors when inconsistencies are found across interfaces between shader stages. The exact behavior of the checks depends on the pair of pipeline stages involved. If a Dbg callback function is registered, this layer will use callback function(s) for reporting, otherwise uses stdout. +layers/core\_validation.cpp (name=`VK_LAYER_LUNARG_core_validation`) - The core\_validation layer does the bulk of the API validation that requires storing state. Some of the state it tracks includes the Descriptor Set, Pipeline State, Shaders, and dynamic state, and memory objects and bindings. It performs some point validation as states are created and used, and further validation Draw call and QueueSubmit time. Of primary interest is making sure that the resources bound to Descriptor Sets correctly align with the layout specified for the Set. Also, all of the image and buffer layouts are validated to make sure explicit layout transitions are properly managed. Related to memory, core\_validation includes tracking object bindings, memory hazards, and memory object lifetimes. It also validates several other hazard-related issues related to command buffers, fences, and memory mapping. Additionally core\_validation include shader validation (formerly separate shader\_checker layer) that inspects the SPIR-V shader images and fixed function pipeline stages at PSO creation time. It flags errors when inconsistencies are found across interfaces between shader stages. The exact behavior of the checks depends on the pair of pipeline stages involved. If a Dbg callback function is registered, this layer will use callback function(s) for reporting, otherwise uses stdout. ### Check parameters -layers/parameter_validation.cpp (name=VK_LAYER_LUNARG_parameter_validation) - Check the input parameters to API calls for validity. If a Dbg callback function is registered, this layer will use callback function(s) for reporting, otherwise uses stdout. +layers/parameter_validation.cpp (name=`VK_LAYER_LUNARG_parameter_validation`) - Check the input parameters to API calls for validity. If a Dbg callback function is registered, this layer will use callback function(s) for reporting, otherwise uses stdout. ### Image Validity -layers/image.cpp (name=VK_LAYER_LUNARG_image) - The image layer is intended to validate image parameters, formats, and correct use. Images are a significant enough area that they were given a separate layer. If a Dbg callback function is registered, this layer will use callback function(s) for reporting, otherwise uses stdout. +layers/image.cpp (name=`VK_LAYER_LUNARG_image`) - The image layer is intended to validate image parameters, formats, and correct use. Images are a significant enough area that they were given a separate layer. If a Dbg callback function is registered, this layer will use callback function(s) for reporting, otherwise uses stdout. ### Check threading -layers/threading.cpp (name=VK_LAYER_GOOGLE_threading) - Check multithreading of API calls for validity. Currently this checks that only one thread at a time uses an object in free-threaded API calls. If a Dbg callback function is registered, this layer will use callback function(s) for reporting, otherwise uses stdout. +layers/threading.cpp (name=`VK_LAYER_GOOGLE_threading`) - Check multithreading of API calls for validity. Currently this checks that only one thread at a time uses an object in free-threaded API calls. If a Dbg callback function is registered, this layer will use callback function(s) for reporting, otherwise uses stdout. ### Swapchain -layers/swapchain.cpp (name=VK_LAYER_LUNARG_swapchain) - Check that WSI extensions are being used correctly. +layers/swapchain.cpp (name=`VK_LAYER_LUNARG_swapchain`) - Check that WSI extensions are being used correctly. ### Device Limitations -layers/device_limits.cpp (name=VK_LAYER_LUNARG_device_limits) - This layer is intended to capture underlying device features and limitations and then flag errors if an app makes requests for unsupported features or exceeding limitations. This layer is a work in progress and currently only flags some high-level errors without flagging errors on specific feature and limitation. If a Dbg callback function is registered, this layer will use callback function(s) for reporting, otherwise uses stdout. +layers/device_limits.cpp (name=`VK_LAYER_LUNARG_device_limits`) - This layer is intended to capture underlying device features and limitations and then flag errors if an app makes requests for unsupported features or exceeding limitations. This layer is a work in progress and currently only flags some high-level errors without flagging errors on specific feature and limitation. If a Dbg callback function is registered, this layer will use callback function(s) for reporting, otherwise uses stdout. ### Unique Objects -(build dir)/layers/unique_objects.cpp (name=VK_LAYER_GOOGLE_unique_objects) - The Vulkan specification allows objects that have non-unique handles. This makes tracking object lifetimes difficult in that it is unclear which object is being referenced on deletion. The unique_objects layer was created to address this problem. If loaded in the correct position (last, which is closest to the display driver) it will wrap all objects with a unique object representation, allowing proper object lifetime tracking. This layer does no validation on its own, and may not be required for the proper operation of all layers or all platforms. One sign that it is needed is the appearance of errors emitted from the object_tracker layer indicating the use of previously destroyed objects. +(build dir)/layers/unique_objects.cpp (name=`VK_LAYER_GOOGLE_unique_objects`) - The Vulkan specification allows objects that have non-unique handles. This makes tracking object lifetimes difficult in that it is unclear which object is being referenced on deletion. The unique_objects layer was created to address this problem. If loaded in the correct position (last, which is closest to the display driver) it will alias all objects with a unique object representation, allowing proper object lifetime tracking. This layer does no validation on its own and may not be required for the proper operation of all layers or all platforms. One sign that it is needed is the appearance of errors emitted from the object_tracker layer indicating the use of previously destroyed objects. ## Using Layers 1. Build VK loader using normal steps (cmake and make) -2. Place libVkLayer_.so in the same directory as your VK test or app: +2. Place `libVkLayer_.so` in the same directory as your VK test or app: - cp build/layer/libVkLayer_threading.so build/tests + `cp build/layer/libVkLayer_threading.so build/tests` This is required for the Loader to be able to scan and enumerate your library. - Alternatively, use the VK\_LAYER\_PATH environment variable to specify where the layer libraries reside. + Alternatively, use the `VK_LAYER_PATH` environment variable to specify where the layer libraries reside. 3. Create a vk_layer_settings.txt file in the same directory to specify how your layers should behave. Model it after the following example: [*vk_layer_settings.txt*](vk_layer_settings.txt) -4. Specify which Layers to activate by using -vkCreateDevice and/or vkCreateInstance or environment variables. +4. Specify which layers to activate using environment variables. - export VK\_INSTANCE\_LAYERS=VK\_LAYER\_LUNARG\_parameter\_validation:VK\_LAYER\_LUNARG\_core\_validation - export VK\_DEVICE\_LAYERS=VK\_LAYER\_LUNARG\_parameter\_validation:VK\_LAYER\_LUNARG\_core\_validation - cd build/tests; ./vkinfo + `export VK\_INSTANCE\_LAYERS=VK\_LAYER\_LUNARG\_parameter\_validation:VK\_LAYER\_LUNARG\_core\_validation` + `cd build/tests; ./vkinfo` ## Status -- cgit v1.2.3 From fc39c5b846aecadfc7134ebeb8a26d4a16556f26 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Mon, 16 May 2016 11:23:01 -0600 Subject: layers: GH544 Allow INVALID cmd buffers to be reset BeginCommandBuffer performs an implicit reset of a command buffer. This allows command buffers in the INVALID state to undergo this implicit reset. In order to make sure that an invalid command buffer in the INVALID state has had EndCommandBuffer called, this commit adds a CMD_END command that's inserted at the end of a command. If a command buffer in the INVALID state has had EndCommandBuffer called and it is now having BeginCommandBuffer called, it's ok to implicitly reset the command buffer. buffer's vector of commands. --- layers/core_validation.cpp | 8 ++++---- layers/core_validation.h | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 51aaf88d..ebaa6b0d 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -3658,6 +3658,7 @@ static bool addCmd(const layer_data *my_data, GLOBAL_CB_NODE *pCB, const CMD_TYP case CMD_UPDATEBUFFER: case CMD_PIPELINEBARRIER: case CMD_EXECUTECOMMANDS: + case CMD_END: break; default: break; @@ -3665,6 +3666,7 @@ static bool addCmd(const layer_data *my_data, GLOBAL_CB_NODE *pCB, const CMD_TYP } if (pCB->state != CB_RECORDING) { skipCall |= report_error_no_cb_begin(my_data, pCB->commandBuffer, caller_name); + } else { skipCall |= validateCmdsInCmdBuffer(my_data, pCB, cmd); CMD_NODE cmdNode = {}; // init cmd node and append to end of cmd LL @@ -6197,7 +6199,7 @@ BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo "vkBeginCommandBuffer(): Cannot call Begin on CB (0x%" PRIxLEAST64 ") in the RECORDING state. Must first call vkEndCommandBuffer().", (uint64_t)commandBuffer); - } else if (CB_RECORDED == pCB->state) { + } else if (CB_RECORDED == pCB->state || (CB_INVALID == pCB->state && CMD_END == pCB->cmds.back().type)) { VkCommandPool cmdPool = pCB->createInfo.commandPool; if (!(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT & dev_data->commandPoolMap[cmdPool].createFlags)) { skipCall |= @@ -6251,9 +6253,7 @@ VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) { // https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/pull/516#discussion_r63013756 skipCall |= insideRenderPass(dev_data, pCB, "vkEndCommandBuffer"); } - if (pCB->state != CB_RECORDING) { - skipCall |= report_error_no_cb_begin(dev_data, commandBuffer, "vkEndCommandBuffer()"); - } + skipCall |= addCmd(dev_data, pCB, CMD_END, "vkEndCommandBuffer()"); for (auto query : pCB->activeQueries) { skipCall |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, DRAWSTATE_INVALID_QUERY, "DS", diff --git a/layers/core_validation.h b/layers/core_validation.h index 783ca98e..311736bb 100644 --- a/layers/core_validation.h +++ b/layers/core_validation.h @@ -418,6 +418,7 @@ typedef enum _CMD_TYPE { CMD_NEXTSUBPASS, CMD_ENDRENDERPASS, CMD_EXECUTECOMMANDS, + CMD_END, // Should be last command in any RECORDED cmd buffer } CMD_TYPE; // Data structure for holding sequence of cmds in cmd buffer typedef struct _CMD_NODE { -- cgit v1.2.3 From 42da1651be40dccc49027381acc809fe48d12240 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Tue, 17 May 2016 14:50:07 -0600 Subject: layers: Update cmds allowed in 2nd CB subpass If subpassContents are of type VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS then CmdNextSubpass and CmdEndRenderPass are accepatable cmds to be added to the secondary cmd buffer. Spec language is from section 7.4 Render Pass Commands: If contents is VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS, the contents are recorded in secondary command buffers that will be called from the primary command buffer, and vkCmdExecuteCommands is the only valid command on the command buffer until vkCmdNextSubpass or vkCmdEndRenderPass. --- layers/core_validation.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index ebaa6b0d..f81a0c37 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -3563,7 +3563,8 @@ bool validateCmdsInCmdBuffer(const layer_data *dev_data, const GLOBAL_CB_NODE *p if (!pCB->activeRenderPass) return false; bool skip_call = false; - if (pCB->activeSubpassContents == VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS && cmd_type != CMD_EXECUTECOMMANDS) { + if (pCB->activeSubpassContents == VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS && + (cmd_type != CMD_EXECUTECOMMANDS && cmd_type != CMD_NEXTSUBPASS && cmd_type != CMD_ENDRENDERPASS)) { skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, DRAWSTATE_INVALID_COMMAND_BUFFER, "DS", "Commands cannot be called in a subpass using secondary command buffers."); -- cgit v1.2.3 From 573a19d30de004f8c523696f9c6617483c97c721 Mon Sep 17 00:00:00 2001 From: Pavol Klacansky Date: Tue, 10 May 2016 03:08:19 -0600 Subject: Remove Xlib dependency when XCB is used Change-Id: I3626f299aae8acc2640e3f233a46d84cc819fd63 --- demos/cube.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/demos/cube.c b/demos/cube.c index 680e4245..9b256ce7 100644 --- a/demos/cube.c +++ b/demos/cube.c @@ -1917,7 +1917,7 @@ static void demo_cleanup(struct demo *demo) { } free(demo->atom_wm_delete_window); #elif defined(VK_USE_PLATFORM_XCB_KHR) - xcb_destroy_window(demo->connection, demo->window); + xcb_destroy_window(demo->connection, demo->xcb_window); xcb_disconnect(demo->connection); free(demo->atom_wm_delete_window); #endif @@ -2396,7 +2396,7 @@ static void demo_init_vk(struct demo *demo) { /* Look for instance extensions */ VkBool32 surfaceExtFound = 0; VkBool32 platformSurfaceExtFound = 0; -#if defined(VK_USE_PLATFORM_XLIB_KHR) | defined(VK_USE_PLATFORM_XCB_KHR) +#if defined(VK_USE_PLATFORM_XLIB_KHR) VkBool32 xlibSurfaceExtFound = 0; #endif memset(demo->extension_names, 0, sizeof(demo->extension_names)); @@ -2425,7 +2425,8 @@ static void demo_init_vk(struct demo *demo) { demo->extension_names[demo->enabled_extension_count++] = VK_KHR_WIN32_SURFACE_EXTENSION_NAME; } -#elif defined(VK_USE_PLATFORM_XLIB_KHR) | defined(VK_USE_PLATFORM_XCB_KHR) +#endif +#if defined(VK_USE_PLATFORM_XLIB_KHR) if (!strcmp(VK_KHR_XLIB_SURFACE_EXTENSION_NAME, instance_extensions[i].extensionName)) { platformSurfaceExtFound = 1; @@ -2433,14 +2434,16 @@ static void demo_init_vk(struct demo *demo) { demo->extension_names[demo->enabled_extension_count++] = VK_KHR_XLIB_SURFACE_EXTENSION_NAME; } - +#endif +#if defined(VK_USE_PLATFORM_XCB_KHR) if (!strcmp(VK_KHR_XCB_SURFACE_EXTENSION_NAME, instance_extensions[i].extensionName)) { platformSurfaceExtFound = 1; demo->extension_names[demo->enabled_extension_count++] = VK_KHR_XCB_SURFACE_EXTENSION_NAME; } -#elif defined(VK_USE_PLATFORM_ANDROID_KHR) +#endif +#if defined(VK_USE_PLATFORM_ANDROID_KHR) if (!strcmp(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, instance_extensions[i].extensionName)) { platformSurfaceExtFound = 1; -- cgit v1.2.3 From 948313be7ed40d9c4953a2613e3cbf25357b0a21 Mon Sep 17 00:00:00 2001 From: Jon Ashburn Date: Wed, 18 May 2016 14:07:47 -0600 Subject: doc: update layer and loader doc for device lyaer deprecation Change-Id: I53ff750a25fd5ea390c22f5ded2247dfbedce2aa --- layers/README.md | 7 ++- loader/LoaderAndLayerInterface.md | 102 ++++++++++++++++++-------------------- 2 files changed, 53 insertions(+), 56 deletions(-) diff --git a/layers/README.md b/layers/README.md index 44111967..e2cea90d 100644 --- a/layers/README.md +++ b/layers/README.md @@ -13,9 +13,12 @@ Layer libraries can be written to intercept or hook VK entry points for various debug and validation purposes. One or more VK entry points can be defined in your Layer library. Undefined entrypoints in the Layer library will be passed to the next Layer which may be the driver. Multiple layer libraries can be chained (actually a hierarchy) together. -`vkEnumerateInstanceLayerProperties` can be called to list the available layers and their properties. +vkEnumerateInstanceLayerProperties can be called to list the +available layers and their properties. Layers can intercept all Vulkan commands +that take a dispatchable object as it's first argument. I.e. VkInstance, VkPhysicalDevice, +VkDevice, VkCommandBuffer, and VkQueue. vkXXXXGetProcAddr is used internally by the Layers and Loader to initialize dispatch tables. -Layers can also be activated via the `VK_INSTANCE_LAYERS` environment variable. +Layers can also be activated via the VK_INSTANCE_LAYERS environment variable. All validation layers work with the DEBUG_REPORT extension to provide the application or user with validation feedback. When a validation layer is enabled, it will look at the vk_layer_settings.txt diff --git a/loader/LoaderAndLayerInterface.md b/loader/LoaderAndLayerInterface.md index 91094a06..d43111b9 100644 --- a/loader/LoaderAndLayerInterface.md +++ b/loader/LoaderAndLayerInterface.md @@ -151,24 +151,26 @@ Vulkan commands, but may offer extensions that do. A common use of layers is for API validation. A developer can use validation layers during application development, but during production the layers can be disabled by the application. Thus, eliminating the overhead of validating the application's -usage of the API. Layers discovered by the loader can be reported to the -application via vkEnumerateInstanceLayerProperties and -vkEnumerateDeviceLayerProperties, for instance and device layers respectively. -Instance layers are enabled at vkCreateInstance; device layers are enabled at -vkCreateDevice. For example, the ppEnabledLayerNames array in the -VkDeviceCreateInfo structure is used by the application to list the device -layer names to be enabled at vkCreateDevice. At vkCreateInstance and +usage of the API. Layers discovered by the loader are reported to the +application via vkEnumerateInstanceLayerProperties. +Layers are enabled at vkCreateInstance and are active for all Vulkan commands +that using the given VkIstance and any of it's child objects. +For example, the ppEnabledLayerNames array in the +VkInstanceCreateInfo structure is used by the application to list the +layer names to be enabled at vkCreateInstance. At vkCreateInstance and vkCreateDevice, the loader will construct call chains that include the -application specified (enabled) layers. Order is important in the +application specified (enabled) layers. vkCreateDevice will use the layers +specified at vkCreateInstance. vkEnumerateDeviceLayerProperties and +device layers are deprecated. Order is important in the ppEnabledLayerNames array; array element 0 is the topmost (closest to the application) layer inserted in the chain and the last array element is closest to the driver. Developers may want to enable layers that are not enabled by the given -application they are using. On Linux and Windows, the environment variables -“VK\_INSTANCE\_LAYERS” and “VK\_DEVICE\_LAYERS” can be used to enable +application they are using. On Linux and Windows, the environment variable +“VK\_INSTANCE\_LAYERS” can be used to enable additional layers which are not specified (enabled) by the application at -vkCreateInstance/vkCreateDevice. VK\_INSTANCE\_LAYERS is a colon +vkCreateInstance. VK\_INSTANCE\_LAYERS is a colon (Linux)/semi-colon (Windows) separated list of layer names to enable. Order is relevant with the first layer in the list being the topmost layer (closest to the application) and the last layer in the list being the bottommost layer @@ -180,20 +182,13 @@ layers. Layers specified via environment variable are topmost (closest to the application) while layers specified by the application are bottommost. An example of using these environment variables to activate the validation -layer VK\_LAYER\_LUNARG\_param\_checker on Windows or Linux is as follows: +layer VK\_LAYER\_LUNARG\_parameter\_validation on Windows or Linux is as follows: ``` > $ export VK_INSTANCE_LAYERS=VK_LAYER_LUNARG_parameter_validation -> $ export VK_DEVICE_LAYERS=VK_LAYER_LUNARG_parameter_validation ``` -**Note**: Many layers, including all LunarG validation layers are “global” -(i.e. both instance and device) layers and *must* be enabled on both the -instance and device chains to function properly. This is required for “global” -layers regardless of which method is used to enable the layer (application or -environment variable). - Some platforms, including Linux and Windows, support layers which are enabled automatically by the loader rather than explicitly by the application (or via environment variable). Explicit layers are those layers enabled by the @@ -745,9 +740,11 @@ version can vary independently for ICDs and layers. - (required) "name" - layer name -- (required) "type" - which layer chains should the layer be activated on. -Allowable values are "INSTANCE", "DEVICE", "GLOBAL". Global means activate on -both device and instance chains. +- (required and deprecated) "type" - which layer chains should the layer be activated on. +Distinct instance and device layers are deprecated; there are now just layers. +Allowable values for type (both before and after deprecation) are "INSTANCE", "GLOBAL" and, "DEVICE." +"DEVICE" layers are skipped over by the loader as if they were not found. +Thus, layers must have a type of "GLOBAL" or "INSTANCE" for the loader to include the layer in it's discovery. - (required) "library\_path" - filename / full path / relative path to the library file @@ -793,7 +790,7 @@ implicit layer(s). - (required for implicit layers) "disable\_environment" requirement(s) - environment variable and value required to disable an implicit layer. Note: in rare cases of an application not working with an implicit layer, the -application can set this environment variable (before calling Vulkan functions) +application can set this environment variable (before calling Vulkan commands) in order to "blacklist" the layer. This environment variable (which should vary with each "version" of the layer, as in "DISABLE\_LAYER\_FOO\_1") must be set (not particularly to any value). If both the "enable\_environment" and @@ -805,8 +802,8 @@ For example: { "file_format_version" : "1.0.0", "layer": { - "name": "VK_LAYER_LUNARG_OverlayLayer", - "type": "DEVICE", + "name": "VK_LAYER_LUNARG_overlay", + "type": "INSTANCE", "library_path": "vkOverlayLayer.dll" "api_version" : "1.0.5", "implementation_version" : "2", @@ -914,9 +911,11 @@ version can vary independently for ICDs and layers. - (required) "name" - layer name -- (required) "type" - which layer chains should the layer be activated on. -Allowable values are "INSTANCE", "DEVICE", "GLOBAL". Global means activate on -both device and instance chains. +- (required and deprecated) "type" - which layer chains should the layer be activated on. +Distinct instance and device layers are deprecated; there are now just layers. +Allowable values for type (both before and after deprecation) are "INSTANCE", "GLOBAL" and, "DEVICE." +"DEVICE" layers are skipped over by the loader as if they were not found. +Thus, layers must have a type of "GLOBAL" or "INSTANCE" for the loader to include the layer in it's discovery. - (required) "library\_path" - filename / full path / relative path to the text file @@ -960,7 +959,7 @@ implicit layer(s). - (required for implicit layers) "disable\_environment" requirement(s) - environment variable and value required to disable an implicit layer. Note: in rare cases of an application not working with an implicit layer, the -application can set this environment variable (before calling Vulkan functions) +application can set this environment variable (before calling Vulkan commands) in order to "blacklist" the layer. This environment variable (which should vary with each "version" of the layer, as in "DISABLE\_LAYER\_FOO\_1") must be set (not particularly to any value). If both the "enable\_environment" and @@ -971,8 +970,8 @@ For example: { "file_format_version" : "1.0.0", "layer": { - "name": "VK_LAYER_LUNARG_OverlayLayer", - "type": "DEVICE", + "name": "VK_LAYER_LUNARG_overlay", + "type": "INSTANCE", "library_path": "vkOverlayLayer.dll" "api_version" : "1.0.5", "implementation_version" : "2", @@ -1040,7 +1039,7 @@ NOTE: these environment variables will be ignored for suid programs. The recommended way to enable layers is for applications to programatically enable them. The layers are provided by the application and must live in the application's library folder. The application -enables the layers at vkCreateInstance and vkCreateDevice as any Vulkan +enables the layers at vkCreateInstance as any Vulkan application would. An application enabled for debug has more options. It can enumerate and enable layers located in /data/local/vulkan/debug. @@ -1060,12 +1059,11 @@ to layer module with the loader and or the ICD being the bottom most command. Call chains are constructed at both the instance level and the device level by the loader with cooperation from the layer libraries. Instance call chains are constructed by the loader when layers are enabled at vkCreateInstance. Device -call chains are constructed by the loader when layers are enabled at +call chains are constructed by the loader when layers are enabled, by the loader, at vkCreateDevice. A layer can intercept Vulkan instance commands, device commands or both. For a layer to intercept instance commands, it must participate in the instance call chain. For a layer to intercept device commands, it must -participate in the device chain. Layers which participate in intercepting calls -in both the instance and device chains are called global layers. +participate in the device chain. Normally, when a layer intercepts a given Vulkan command, it will call down the instance or device chain as needed. The loader and all layer libraries that @@ -1204,21 +1202,20 @@ The following table associates the desktop JSON nodes with the Android layer lib | Property | JSON node | Android library query | Notes | |----------|-----------|-----------------------|-------| -| layers in library | layer | vkEnumerate*LayerProperties | one node required for each layer in the library | -|layer name | name | vkEnumerate*LayerProperties | one node is required | -| layer type | type | vkEnumerate*LayerProperties | one node is required | +| layers in library | layer | vkEnumerateInstanceLayerProperties | one node required for each layer in the library | +|layer name | name | vkEnumerateInstanceLayerProperties | one node is required | +| layer type | type | vkEnumerateInstanceLayerProperties | one node is required (deprecated) | | library location | library_path | N/A | one node is required | -| vulkan spec version | api_version | vkEnumerate*LayerProperties | one node is required | -| layer implementation version | api_version | vkEnumerate*LayerProperties | one node is required | -| layer description | description | vkEnumerate*LayerProperties | one node is required | +| vulkan spec version | api_version | vkEnumerateInstanceLayerProperties | one node is required | +| layer implementation version | api_version | vkEnumerateInstanceLayerProperties | one node is required | +| layer description | description | vkEnumerateInstanceLayerProperties | one node is required | | chaining functions | functions | vkGet*ProcAddr | see Note 1 | | instance extensions | instance_extensions | vkEnumerateInstanceExtensionProperties | see Note 2 | | device extensions | device_extensions | vkEnumerateDeviceExtensionProperties | see Note 3 | Note 1: The "functions" node is required if the layer is using alternative -names for vkGetInstanceProcAddr or vkGetDeviceProcAddr. vkGetInstanceProcAddr is -required for all layer types. vkGetDeviceProcAddr is required for -device or global (both instance and device) layers. See further requirements below. +names for vkGetInstanceProcAddr or vkGetDeviceProcAddr. vkGetInstanceProcAddr and vkGetDeviceProcAddr +are required for all layers. See further requirements below. Note 2: One "instance_extensions" node with an array of 1 or more elements required if any instance @@ -1252,9 +1249,8 @@ of the "file_format_version" and includes the semantics of the nodes in the JSON vkGetInstanceProcAddr requirements: -Irregardless of the name, this function must be implemented and exported in the library for all layers. --This function must return -the local entry points for all instance level Vulkan commands it intercepts. At -a minimum, this includes vkGetInstanceProcAddr and vkCreateInstance. +-This function must return the local entry points for all instance level Vulkan commands it intercepts. +At a minimum, this includes vkGetInstanceProcAddr and vkCreateInstance. Optionally, this function may return intercepted device level Vulkan commands. -Vulkan commands that a layer doesn't intercept must be passed to the next @@ -1263,10 +1259,8 @@ entity in the chain. That is, the next layer/ICD's GetInstanceProcAddr must be c to NULL for instance level commands it intercepts including vkCreateDevice. VkGetDeviceProcAddr requirements: --Irregardless of the name, a layer intercepting device level Vulkan commands -(aka a device level layer) must implement vkGetDeviceProcAddr type of function. --This vkGetDeviceProcAddr type function must be exported by the layer library. --This function must return the entry points for all device level Vulkan +-Irregardless of the name, this function must be implemented and exported in the library for all layers. +-This function must return the local entry points for all device level Vulkan commands it intercepts. At a minimum, this includes vkGetDeviceProcAddr and vkCreateDevice. -Vulkan commands that a layer doesn't intercept must be passed to the next entity in the chain. That is, the next layer/ICD's GetDeviceProcAddr must be called. @@ -1282,8 +1276,8 @@ All layers within a library must support [`vk_layer.h`][]. - Layers intercept a Vulkan command by defining a C/C++ function with signature identical to the Vulkan API for that command. -- An instance layer must intercept at least vkGetInstanceProcAddr and -vkCreateInstance. A device layer must intercept at least vkGetInstanceProcAddr, vkGetDeviceProcAddr and vkCreateDevice. +- A layer must intercept at least vkGetInstanceProcAddr and +vkCreateInstance. Additionally, a layer would also intercept vkGetDeviceProcAddr and vkCreateDevice to participate in the device chain. - Other than the two vkGet*ProcAddr, all other functions intercepted by a layer need NOT be exported by the layer. - For any Vulkan command a layer intercepts which has a non-void return value, @@ -1374,7 +1368,7 @@ VkResult vkCreateInstance( PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr; PFN_vkCreateInstance fpCreateInstance = - (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance"); + (PFN_vkCreateInstance)fpGetInstanceProcAddr(*pInstance, "vkCreateInstance"); if (fpCreateInstance == NULL) { return VK_ERROR_INITIALIZATION_FAILED; } -- cgit v1.2.3 From 8a3b5f27ba6bf642a010d269a8d5b19bad3d7b23 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Tue, 17 May 2016 07:58:01 -0600 Subject: layers: Const correctness for debug_report_data param debug_report_data pointer passed to various log functions can be const. --- layers/vk_layer_logging.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/layers/vk_layer_logging.h b/layers/vk_layer_logging.h index dd80dfe3..49470b18 100644 --- a/layers/vk_layer_logging.h +++ b/layers/vk_layer_logging.h @@ -43,7 +43,7 @@ template debug_report_data *get_my_data_ptr(void *data_key, std::unordered_map &data_map); // Utility function to handle reporting -static inline bool debug_report_log_msg(debug_report_data *debug_data, VkFlags msgFlags, VkDebugReportObjectTypeEXT objectType, +static inline bool debug_report_log_msg(const debug_report_data *debug_data, VkFlags msgFlags, VkDebugReportObjectTypeEXT objectType, uint64_t srcObject, size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg) { bool bail = false; @@ -308,11 +308,11 @@ static inline int vasprintf(char **strp, char const *fmt, va_list ap) { * is only computed if a message needs to be logged */ #ifndef WIN32 -static inline bool log_msg(debug_report_data *debug_data, VkFlags msgFlags, VkDebugReportObjectTypeEXT objectType, +static inline bool log_msg(const debug_report_data *debug_data, VkFlags msgFlags, VkDebugReportObjectTypeEXT objectType, uint64_t srcObject, size_t location, int32_t msgCode, const char *pLayerPrefix, const char *format, ...) __attribute__((format(printf, 8, 9))); #endif -static inline bool log_msg(debug_report_data *debug_data, VkFlags msgFlags, VkDebugReportObjectTypeEXT objectType, +static inline bool log_msg(const debug_report_data *debug_data, VkFlags msgFlags, VkDebugReportObjectTypeEXT objectType, uint64_t srcObject, size_t location, int32_t msgCode, const char *pLayerPrefix, const char *format, ...) { if (!debug_data || !(debug_data->active_flags & msgFlags)) { -- cgit v1.2.3 From a065acff1f1b8e9d9a5590b924fb17858f118167 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Tue, 17 May 2016 08:01:41 -0600 Subject: layers: Migrate types from core_validation.h This change just moves a few types from core_validation.h to core_validation_types.h. This is preparation for migrating DescriptorSet class to store GLOBAL_CB_NODE ptrs directly. --- layers/core_validation.h | 290 +---------------------------------------- layers/core_validation_types.h | 290 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 291 insertions(+), 289 deletions(-) diff --git a/layers/core_validation.h b/layers/core_validation.h index 311736bb..f0878f33 100644 --- a/layers/core_validation.h +++ b/layers/core_validation.h @@ -58,6 +58,7 @@ #include #include #include +#include #if MTMERGE @@ -97,12 +98,6 @@ struct MT_FB_ATTACHMENT_INFO { VkDeviceMemory mem; }; -struct MT_PASS_ATTACHMENT_INFO { - uint32_t attachment; - VkAttachmentLoadOp load_op; - VkAttachmentStoreOp store_op; -}; - struct MT_DESCRIPTOR_SET_INFO { std::vector images; std::vector buffers; @@ -113,17 +108,7 @@ struct MT_SWAP_CHAIN_INFO { VkSwapchainCreateInfoKHR createInfo; std::vector images; }; - #endif -typedef enum _DRAW_TYPE { - DRAW = 0, - DRAW_INDEXED = 1, - DRAW_INDIRECT = 2, - DRAW_INDEXED_INDIRECT = 3, - DRAW_BEGIN_RANGE = DRAW, - DRAW_END_RANGE = DRAW_INDEXED_INDIRECT, - NUM_DRAW_TYPES = (DRAW_END_RANGE - DRAW_BEGIN_RANGE + 1), -} DRAW_TYPE; typedef struct _SHADER_DS_MAPPING { uint32_t slotCount; @@ -140,59 +125,6 @@ typedef struct _IMAGE_LAYOUT_NODE { VkFormat format; } IMAGE_LAYOUT_NODE; -class IMAGE_CMD_BUF_LAYOUT_NODE { - public: - IMAGE_CMD_BUF_LAYOUT_NODE() {} - IMAGE_CMD_BUF_LAYOUT_NODE(VkImageLayout initialLayoutInput, VkImageLayout layoutInput) - : initialLayout(initialLayoutInput), layout(layoutInput) {} - - VkImageLayout initialLayout; - VkImageLayout layout; -}; - -// Store the DAG. -struct DAGNode { - uint32_t pass; - std::vector prev; - std::vector next; -}; - -struct RENDER_PASS_NODE { - VkRenderPass renderPass; - VkRenderPassCreateInfo const *pCreateInfo; - std::vector hasSelfDependency; - std::vector subpassToNode; - std::vector> subpassColorFormats; - std::vector attachments; - std::unordered_map attachment_first_read; - std::unordered_map attachment_first_layout; - - RENDER_PASS_NODE(VkRenderPassCreateInfo const *pCreateInfo) : pCreateInfo(pCreateInfo) { - uint32_t i; - - subpassColorFormats.reserve(pCreateInfo->subpassCount); - for (i = 0; i < pCreateInfo->subpassCount; i++) { - const VkSubpassDescription *subpass = &pCreateInfo->pSubpasses[i]; - std::vector color_formats; - uint32_t j; - - color_formats.reserve(subpass->colorAttachmentCount); - for (j = 0; j < subpass->colorAttachmentCount; j++) { - const uint32_t att = subpass->pColorAttachments[j].attachment; - - if (att != VK_ATTACHMENT_UNUSED) { - color_formats.push_back(pCreateInfo->pAttachments[att].format); - } - else { - color_formats.push_back(VK_FORMAT_UNDEFINED); - } - } - - subpassColorFormats.push_back(color_formats); - } - } -}; - // Store layouts and pushconstants for PipelineLayout struct PIPELINE_LAYOUT_NODE { std::vector descriptorSetLayouts; @@ -367,228 +299,8 @@ typedef struct _DESCRIPTOR_POOL_NODE { } } DESCRIPTOR_POOL_NODE; -// Cmd Buffer Tracking -typedef enum _CMD_TYPE { - CMD_BINDPIPELINE, - CMD_BINDPIPELINEDELTA, - CMD_SETVIEWPORTSTATE, - CMD_SETSCISSORSTATE, - CMD_SETLINEWIDTHSTATE, - CMD_SETDEPTHBIASSTATE, - CMD_SETBLENDSTATE, - CMD_SETDEPTHBOUNDSSTATE, - CMD_SETSTENCILREADMASKSTATE, - CMD_SETSTENCILWRITEMASKSTATE, - CMD_SETSTENCILREFERENCESTATE, - CMD_BINDDESCRIPTORSETS, - CMD_BINDINDEXBUFFER, - CMD_BINDVERTEXBUFFER, - CMD_DRAW, - CMD_DRAWINDEXED, - CMD_DRAWINDIRECT, - CMD_DRAWINDEXEDINDIRECT, - CMD_DISPATCH, - CMD_DISPATCHINDIRECT, - CMD_COPYBUFFER, - CMD_COPYIMAGE, - CMD_BLITIMAGE, - CMD_COPYBUFFERTOIMAGE, - CMD_COPYIMAGETOBUFFER, - CMD_CLONEIMAGEDATA, - CMD_UPDATEBUFFER, - CMD_FILLBUFFER, - CMD_CLEARCOLORIMAGE, - CMD_CLEARATTACHMENTS, - CMD_CLEARDEPTHSTENCILIMAGE, - CMD_RESOLVEIMAGE, - CMD_SETEVENT, - CMD_RESETEVENT, - CMD_WAITEVENTS, - CMD_PIPELINEBARRIER, - CMD_BEGINQUERY, - CMD_ENDQUERY, - CMD_RESETQUERYPOOL, - CMD_COPYQUERYPOOLRESULTS, - CMD_WRITETIMESTAMP, - CMD_PUSHCONSTANTS, - CMD_INITATOMICCOUNTERS, - CMD_LOADATOMICCOUNTERS, - CMD_SAVEATOMICCOUNTERS, - CMD_BEGINRENDERPASS, - CMD_NEXTSUBPASS, - CMD_ENDRENDERPASS, - CMD_EXECUTECOMMANDS, - CMD_END, // Should be last command in any RECORDED cmd buffer -} CMD_TYPE; -// Data structure for holding sequence of cmds in cmd buffer -typedef struct _CMD_NODE { - CMD_TYPE type; - uint64_t cmdNumber; -} CMD_NODE; - -typedef enum _CB_STATE { - CB_NEW, // Newly created CB w/o any cmds - CB_RECORDING, // BeginCB has been called on this CB - CB_RECORDED, // EndCB has been called on this CB - CB_INVALID // CB had a bound descriptor set destroyed or updated -} CB_STATE; -// CB Status -- used to track status of various bindings on cmd buffer objects -typedef VkFlags CBStatusFlags; -typedef enum _CBStatusFlagBits { - // clang-format off - CBSTATUS_NONE = 0x00000000, // No status is set - CBSTATUS_VIEWPORT_SET = 0x00000001, // Viewport has been set - CBSTATUS_LINE_WIDTH_SET = 0x00000002, // Line width has been set - CBSTATUS_DEPTH_BIAS_SET = 0x00000004, // Depth bias has been set - CBSTATUS_BLEND_CONSTANTS_SET = 0x00000008, // Blend constants state has been set - CBSTATUS_DEPTH_BOUNDS_SET = 0x00000010, // Depth bounds state object has been set - CBSTATUS_STENCIL_READ_MASK_SET = 0x00000020, // Stencil read mask has been set - CBSTATUS_STENCIL_WRITE_MASK_SET = 0x00000040, // Stencil write mask has been set - CBSTATUS_STENCIL_REFERENCE_SET = 0x00000080, // Stencil reference has been set - CBSTATUS_INDEX_BUFFER_BOUND = 0x00000100, // Index buffer has been set - CBSTATUS_SCISSOR_SET = 0x00000200, // Scissor has been set - CBSTATUS_ALL = 0x000003FF, // All dynamic state set - // clang-format on -} CBStatusFlagBits; - typedef struct stencil_data { uint32_t compareMask; uint32_t writeMask; uint32_t reference; } CBStencilData; - -typedef struct _DRAW_DATA { std::vector buffers; } DRAW_DATA; - -struct ImageSubresourcePair { - VkImage image; - bool hasSubresource; - VkImageSubresource subresource; -}; - -bool operator==(const ImageSubresourcePair &img1, const ImageSubresourcePair &img2) { - if (img1.image != img2.image || img1.hasSubresource != img2.hasSubresource) - return false; - return !img1.hasSubresource || - (img1.subresource.aspectMask == img2.subresource.aspectMask && img1.subresource.mipLevel == img2.subresource.mipLevel && - img1.subresource.arrayLayer == img2.subresource.arrayLayer); -} - -namespace std { -template <> struct hash { - size_t operator()(ImageSubresourcePair img) const throw() { - size_t hashVal = hash()(reinterpret_cast(img.image)); - hashVal ^= hash()(img.hasSubresource); - if (img.hasSubresource) { - hashVal ^= hash()(reinterpret_cast(img.subresource.aspectMask)); - hashVal ^= hash()(img.subresource.mipLevel); - hashVal ^= hash()(img.subresource.arrayLayer); - } - return hashVal; - } -}; -} - -struct QueryObject { - VkQueryPool pool; - uint32_t index; -}; - -bool operator==(const QueryObject &query1, const QueryObject &query2) { - return (query1.pool == query2.pool && query1.index == query2.index); -} - -namespace std { -template <> struct hash { - size_t operator()(QueryObject query) const throw() { - return hash()((uint64_t)(query.pool)) ^ hash()(query.index); - } -}; -} -// Track last states that are bound per pipeline bind point (Gfx & Compute) -struct LAST_BOUND_STATE { - VkPipeline pipeline; - VkPipelineLayout pipelineLayout; - // Track each set that has been bound - // TODO : can unique be global per CB? (do we care about Gfx vs. Compute?) - std::unordered_set uniqueBoundSets; - // Ordered bound set tracking where index is set# that given set is bound to - std::vector boundDescriptorSets; - // one dynamic offset per dynamic descriptor bound to this CB - std::vector> dynamicOffsets; - - void reset() { - pipeline = VK_NULL_HANDLE; - pipelineLayout = VK_NULL_HANDLE; - uniqueBoundSets.clear(); - boundDescriptorSets.clear(); - dynamicOffsets.clear(); - } -}; -// Cmd Buffer Wrapper Struct -struct GLOBAL_CB_NODE : public BASE_NODE { - VkCommandBuffer commandBuffer; - VkCommandBufferAllocateInfo createInfo; - VkCommandBufferBeginInfo beginInfo; - VkCommandBufferInheritanceInfo inheritanceInfo; - // VkFence fence; // fence tracking this cmd buffer - VkDevice device; // device this CB belongs to - uint64_t numCmds; // number of cmds in this CB - uint64_t drawCount[NUM_DRAW_TYPES]; // Count of each type of draw in this CB - CB_STATE state; // Track cmd buffer update state - uint64_t submitCount; // Number of times CB has been submitted - CBStatusFlags status; // Track status of various bindings on cmd buffer - std::vector cmds; // vector of commands bound to this command buffer - // Currently storing "lastBound" objects on per-CB basis - // long-term may want to create caches of "lastBound" states and could have - // each individual CMD_NODE referencing its own "lastBound" state - // VkPipeline lastBoundPipeline; - // VkPipelineLayout lastBoundPipelineLayout; - // // Capture unique std::set of descriptorSets that are bound to this CB. - // std::set uniqueBoundSets; - // vector boundDescriptorSets; // Index is set# that given set is bound to - // Store last bound state for Gfx & Compute pipeline bind points - LAST_BOUND_STATE lastBound[VK_PIPELINE_BIND_POINT_RANGE_SIZE]; - - std::vector viewports; - std::vector scissors; - VkRenderPassBeginInfo activeRenderPassBeginInfo; - uint64_t fenceId; - VkFence lastSubmittedFence; - VkQueue lastSubmittedQueue; - RENDER_PASS_NODE *activeRenderPass; - VkSubpassContents activeSubpassContents; - uint32_t activeSubpass; - VkFramebuffer activeFramebuffer; - std::unordered_set framebuffers; - // Track descriptor sets that are destroyed or updated while bound to CB - // TODO : These data structures relate to tracking resources that invalidate - // a cmd buffer that references them. Need to unify how we handle these - // cases so we don't have different tracking data for each type. - std::unordered_set destroyedSets; - std::unordered_set updatedSets; - std::unordered_set destroyedFramebuffers; - std::vector waitedEvents; - std::vector semaphores; - std::vector events; - std::unordered_map> waitedEventsBeforeQueryReset; - std::unordered_map queryToStateMap; // 0 is unavailable, 1 is available - std::unordered_set activeQueries; - std::unordered_set startedQueries; - std::unordered_map imageLayoutMap; - std::unordered_map> imageSubresourceMap; - std::unordered_map eventToStageMap; - std::vector drawData; - DRAW_DATA currentDrawData; - VkCommandBuffer primaryCommandBuffer; - // Track images and buffers that are updated by this CB at the point of a draw - std::unordered_set updateImages; - std::unordered_set updateBuffers; - // If cmd buffer is primary, track secondary command buffers pending - // execution - std::unordered_set secondaryCommandBuffers; - // MTMTODO : Scrub these data fields and merge active sets w/ lastBound as appropriate - std::vector> validate_functions; - std::unordered_set memObjs; - std::vector> eventUpdates; -}; - diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index 43f7de62..ff3a781c 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -48,7 +48,9 @@ #include #include #include +#include #include +#include class BASE_NODE { public: @@ -147,4 +149,292 @@ class SWAPCHAIN_NODE { } ~SWAPCHAIN_NODE() { delete[] pQueueFamilyIndices; } }; +typedef enum _DRAW_TYPE { + DRAW = 0, + DRAW_INDEXED = 1, + DRAW_INDIRECT = 2, + DRAW_INDEXED_INDIRECT = 3, + DRAW_BEGIN_RANGE = DRAW, + DRAW_END_RANGE = DRAW_INDEXED_INDIRECT, + NUM_DRAW_TYPES = (DRAW_END_RANGE - DRAW_BEGIN_RANGE + 1), +} DRAW_TYPE; + +class IMAGE_CMD_BUF_LAYOUT_NODE { + public: + IMAGE_CMD_BUF_LAYOUT_NODE() {} + IMAGE_CMD_BUF_LAYOUT_NODE(VkImageLayout initialLayoutInput, VkImageLayout layoutInput) + : initialLayout(initialLayoutInput), layout(layoutInput) {} + + VkImageLayout initialLayout; + VkImageLayout layout; +}; + +struct MT_PASS_ATTACHMENT_INFO { + uint32_t attachment; + VkAttachmentLoadOp load_op; + VkAttachmentStoreOp store_op; +}; + +// Store the DAG. +struct DAGNode { + uint32_t pass; + std::vector prev; + std::vector next; +}; + +struct RENDER_PASS_NODE { + VkRenderPass renderPass; + VkRenderPassCreateInfo const *pCreateInfo; + std::vector hasSelfDependency; + std::vector subpassToNode; + std::vector> subpassColorFormats; + std::vector attachments; + std::unordered_map attachment_first_read; + std::unordered_map attachment_first_layout; + + RENDER_PASS_NODE(VkRenderPassCreateInfo const *pCreateInfo) : pCreateInfo(pCreateInfo) { + uint32_t i; + + subpassColorFormats.reserve(pCreateInfo->subpassCount); + for (i = 0; i < pCreateInfo->subpassCount; i++) { + const VkSubpassDescription *subpass = &pCreateInfo->pSubpasses[i]; + std::vector color_formats; + uint32_t j; + + color_formats.reserve(subpass->colorAttachmentCount); + for (j = 0; j < subpass->colorAttachmentCount; j++) { + const uint32_t att = subpass->pColorAttachments[j].attachment; + + if (att != VK_ATTACHMENT_UNUSED) { + color_formats.push_back(pCreateInfo->pAttachments[att].format); + } + else { + color_formats.push_back(VK_FORMAT_UNDEFINED); + } + } + + subpassColorFormats.push_back(color_formats); + } + } +}; +// Cmd Buffer Tracking +typedef enum _CMD_TYPE { + CMD_BINDPIPELINE, + CMD_BINDPIPELINEDELTA, + CMD_SETVIEWPORTSTATE, + CMD_SETSCISSORSTATE, + CMD_SETLINEWIDTHSTATE, + CMD_SETDEPTHBIASSTATE, + CMD_SETBLENDSTATE, + CMD_SETDEPTHBOUNDSSTATE, + CMD_SETSTENCILREADMASKSTATE, + CMD_SETSTENCILWRITEMASKSTATE, + CMD_SETSTENCILREFERENCESTATE, + CMD_BINDDESCRIPTORSETS, + CMD_BINDINDEXBUFFER, + CMD_BINDVERTEXBUFFER, + CMD_DRAW, + CMD_DRAWINDEXED, + CMD_DRAWINDIRECT, + CMD_DRAWINDEXEDINDIRECT, + CMD_DISPATCH, + CMD_DISPATCHINDIRECT, + CMD_COPYBUFFER, + CMD_COPYIMAGE, + CMD_BLITIMAGE, + CMD_COPYBUFFERTOIMAGE, + CMD_COPYIMAGETOBUFFER, + CMD_CLONEIMAGEDATA, + CMD_UPDATEBUFFER, + CMD_FILLBUFFER, + CMD_CLEARCOLORIMAGE, + CMD_CLEARATTACHMENTS, + CMD_CLEARDEPTHSTENCILIMAGE, + CMD_RESOLVEIMAGE, + CMD_SETEVENT, + CMD_RESETEVENT, + CMD_WAITEVENTS, + CMD_PIPELINEBARRIER, + CMD_BEGINQUERY, + CMD_ENDQUERY, + CMD_RESETQUERYPOOL, + CMD_COPYQUERYPOOLRESULTS, + CMD_WRITETIMESTAMP, + CMD_PUSHCONSTANTS, + CMD_INITATOMICCOUNTERS, + CMD_LOADATOMICCOUNTERS, + CMD_SAVEATOMICCOUNTERS, + CMD_BEGINRENDERPASS, + CMD_NEXTSUBPASS, + CMD_ENDRENDERPASS, + CMD_EXECUTECOMMANDS, + CMD_END, // Should be last command in any RECORDED cmd buffer +} CMD_TYPE; +// Data structure for holding sequence of cmds in cmd buffer +typedef struct _CMD_NODE { + CMD_TYPE type; + uint64_t cmdNumber; +} CMD_NODE; + +typedef enum _CB_STATE { + CB_NEW, // Newly created CB w/o any cmds + CB_RECORDING, // BeginCB has been called on this CB + CB_RECORDED, // EndCB has been called on this CB + CB_INVALID // CB had a bound descriptor set destroyed or updated +} CB_STATE; + +// CB Status -- used to track status of various bindings on cmd buffer objects +typedef VkFlags CBStatusFlags; +typedef enum _CBStatusFlagBits { + // clang-format off + CBSTATUS_NONE = 0x00000000, // No status is set + CBSTATUS_VIEWPORT_SET = 0x00000001, // Viewport has been set + CBSTATUS_LINE_WIDTH_SET = 0x00000002, // Line width has been set + CBSTATUS_DEPTH_BIAS_SET = 0x00000004, // Depth bias has been set + CBSTATUS_BLEND_CONSTANTS_SET = 0x00000008, // Blend constants state has been set + CBSTATUS_DEPTH_BOUNDS_SET = 0x00000010, // Depth bounds state object has been set + CBSTATUS_STENCIL_READ_MASK_SET = 0x00000020, // Stencil read mask has been set + CBSTATUS_STENCIL_WRITE_MASK_SET = 0x00000040, // Stencil write mask has been set + CBSTATUS_STENCIL_REFERENCE_SET = 0x00000080, // Stencil reference has been set + CBSTATUS_INDEX_BUFFER_BOUND = 0x00000100, // Index buffer has been set + CBSTATUS_SCISSOR_SET = 0x00000200, // Scissor has been set + CBSTATUS_ALL = 0x000003FF, // All dynamic state set + // clang-format on +} CBStatusFlagBits; + +// Track last states that are bound per pipeline bind point (Gfx & Compute) +struct LAST_BOUND_STATE { + VkPipeline pipeline; + VkPipelineLayout pipelineLayout; + // Track each set that has been bound + // TODO : can unique be global per CB? (do we care about Gfx vs. Compute?) + std::unordered_set uniqueBoundSets; + // Ordered bound set tracking where index is set# that given set is bound to + std::vector boundDescriptorSets; + // one dynamic offset per dynamic descriptor bound to this CB + std::vector> dynamicOffsets; + + void reset() { + pipeline = VK_NULL_HANDLE; + pipelineLayout = VK_NULL_HANDLE; + uniqueBoundSets.clear(); + boundDescriptorSets.clear(); + dynamicOffsets.clear(); + } +}; + +struct QueryObject { + VkQueryPool pool; + uint32_t index; +}; + +inline bool operator==(const QueryObject &query1, const QueryObject &query2) { + return (query1.pool == query2.pool && query1.index == query2.index); +} + +namespace std { +template <> struct hash { + size_t operator()(QueryObject query) const throw() { + return hash()((uint64_t)(query.pool)) ^ hash()(query.index); + } +}; +} +typedef struct _DRAW_DATA { std::vector buffers; } DRAW_DATA; + +struct ImageSubresourcePair { + VkImage image; + bool hasSubresource; + VkImageSubresource subresource; +}; + +inline bool operator==(const ImageSubresourcePair &img1, const ImageSubresourcePair &img2) { + if (img1.image != img2.image || img1.hasSubresource != img2.hasSubresource) + return false; + return !img1.hasSubresource || + (img1.subresource.aspectMask == img2.subresource.aspectMask && img1.subresource.mipLevel == img2.subresource.mipLevel && + img1.subresource.arrayLayer == img2.subresource.arrayLayer); +} + +namespace std { +template <> struct hash { + size_t operator()(ImageSubresourcePair img) const throw() { + size_t hashVal = hash()(reinterpret_cast(img.image)); + hashVal ^= hash()(img.hasSubresource); + if (img.hasSubresource) { + hashVal ^= hash()(reinterpret_cast(img.subresource.aspectMask)); + hashVal ^= hash()(img.subresource.mipLevel); + hashVal ^= hash()(img.subresource.arrayLayer); + } + return hashVal; + } +}; +} +// Cmd Buffer Wrapper Struct +struct GLOBAL_CB_NODE : public BASE_NODE { + VkCommandBuffer commandBuffer; + VkCommandBufferAllocateInfo createInfo; + VkCommandBufferBeginInfo beginInfo; + VkCommandBufferInheritanceInfo inheritanceInfo; + // VkFence fence; // fence tracking this cmd buffer + VkDevice device; // device this CB belongs to + uint64_t numCmds; // number of cmds in this CB + uint64_t drawCount[NUM_DRAW_TYPES]; // Count of each type of draw in this CB + CB_STATE state; // Track cmd buffer update state + uint64_t submitCount; // Number of times CB has been submitted + CBStatusFlags status; // Track status of various bindings on cmd buffer + std::vector cmds; // vector of commands bound to this command buffer + // Currently storing "lastBound" objects on per-CB basis + // long-term may want to create caches of "lastBound" states and could have + // each individual CMD_NODE referencing its own "lastBound" state + // VkPipeline lastBoundPipeline; + // VkPipelineLayout lastBoundPipelineLayout; + // // Capture unique std::set of descriptorSets that are bound to this CB. + // std::set uniqueBoundSets; + // vector boundDescriptorSets; // Index is set# that given set is bound to + // Store last bound state for Gfx & Compute pipeline bind points + LAST_BOUND_STATE lastBound[VK_PIPELINE_BIND_POINT_RANGE_SIZE]; + + std::vector viewports; + std::vector scissors; + VkRenderPassBeginInfo activeRenderPassBeginInfo; + uint64_t fenceId; + VkFence lastSubmittedFence; + VkQueue lastSubmittedQueue; + RENDER_PASS_NODE *activeRenderPass; + VkSubpassContents activeSubpassContents; + uint32_t activeSubpass; + VkFramebuffer activeFramebuffer; + std::unordered_set framebuffers; + // Track descriptor sets that are destroyed or updated while bound to CB + // TODO : These data structures relate to tracking resources that invalidate + // a cmd buffer that references them. Need to unify how we handle these + // cases so we don't have different tracking data for each type. + std::unordered_set destroyedSets; + std::unordered_set updatedSets; + std::unordered_set destroyedFramebuffers; + std::vector waitedEvents; + std::vector semaphores; + std::vector events; + std::unordered_map> waitedEventsBeforeQueryReset; + std::unordered_map queryToStateMap; // 0 is unavailable, 1 is available + std::unordered_set activeQueries; + std::unordered_set startedQueries; + std::unordered_map imageLayoutMap; + std::unordered_map> imageSubresourceMap; + std::unordered_map eventToStageMap; + std::vector drawData; + DRAW_DATA currentDrawData; + VkCommandBuffer primaryCommandBuffer; + // Track images and buffers that are updated by this CB at the point of a draw + std::unordered_set updateImages; + std::unordered_set updateBuffers; + // If cmd buffer is primary, track secondary command buffers pending + // execution + std::unordered_set secondaryCommandBuffers; + // MTMTODO : Scrub these data fields and merge active sets w/ lastBound as appropriate + std::vector> validate_functions; + std::unordered_set memObjs; + std::vector> eventUpdates; +}; + #endif // CORE_VALIDATION_TYPES_H_ \ No newline at end of file -- cgit v1.2.3 From b65d0cb5e70256ff3ca1504d5d2e441163658334 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Tue, 17 May 2016 10:38:45 -0600 Subject: layers: Fix intercepts of parameter_validation Make parameter_validation register vkFreeDescriptorSets() and vkUpdateDescriptorSets() functions as intercepted. --- layers/parameter_validation.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/layers/parameter_validation.cpp b/layers/parameter_validation.cpp index 035b9290..50443272 100644 --- a/layers/parameter_validation.cpp +++ b/layers/parameter_validation.cpp @@ -4417,6 +4417,10 @@ VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkD return (PFN_vkVoidFunction)vkResetDescriptorPool; if (!strcmp(funcName, "vkAllocateDescriptorSets")) return (PFN_vkVoidFunction)vkAllocateDescriptorSets; + if (!strcmp(funcName, "vkFreeDescriptorSets")) + return (PFN_vkVoidFunction)vkFreeDescriptorSets; + if (!strcmp(funcName, "vkUpdateDescriptorSets")) + return (PFN_vkVoidFunction)vkUpdateDescriptorSets; if (!strcmp(funcName, "vkCmdSetViewport")) return (PFN_vkVoidFunction)vkCmdSetViewport; if (!strcmp(funcName, "vkCmdSetScissor")) -- cgit v1.2.3 From 7ec3f530a68ce4ecedac6c17ba015f79b3b4a15e Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Tue, 17 May 2016 08:31:46 -0600 Subject: layers: Refactor DescriptorSet Update code This migrates code for DescriptorSet in_use and flagging bound command buffers as invalid from core_validation.cpp into DescriptorSet class. --- layers/core_validation.cpp | 96 ++++++++++++++++++++++++---------------------- layers/descriptor_sets.cpp | 33 ++++++++++++++-- layers/descriptor_sets.h | 17 +++++--- 3 files changed, 91 insertions(+), 55 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index f81a0c37..98c45c03 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -3381,61 +3381,67 @@ static bool validateIdleDescriptorSet(const layer_data *my_data, VkDescriptorSet } static void invalidateBoundCmdBuffers(layer_data *dev_data, const cvdescriptorset::DescriptorSet *pSet) { // Flag any CBs this set is bound to as INVALID - for (auto cb : pSet->GetBoundCmdBuffers()) { - auto cb_node = dev_data->commandBufferMap.find(cb); - if (cb_node != dev_data->commandBufferMap.end()) { - cb_node->second->state = CB_INVALID; - } + for (auto cb_node : pSet->GetBoundCmdBuffers()) { + cb_node->state = CB_INVALID; } } // update DS mappings based on write and copy update arrays static bool dsUpdate(layer_data *my_data, VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pWDS, uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pCDS) { - bool skipCall = false; + bool skip_call = false; // Validate Write updates uint32_t i = 0; for (i = 0; i < descriptorWriteCount; i++) { - VkDescriptorSet ds = pWDS[i].dstSet; - cvdescriptorset::DescriptorSet *pSet = my_data->setMap[ds]; - // Set being updated cannot be in-flight - if ((skipCall = validateIdleDescriptorSet(my_data, ds, "VkUpdateDescriptorSets")) == true) - return skipCall; - // If set is bound to any cmdBuffers, mark them invalid - invalidateBoundCmdBuffers(my_data, pSet); - GENERIC_HEADER *pUpdate = (GENERIC_HEADER *)&pWDS[i]; - // First verify valid update struct - if ((skipCall = validUpdateStruct(my_data, device, pUpdate)) == true) { - break; - } - string error_str; - if (!pSet->WriteUpdate(my_data->report_data, &pWDS[i], &error_str)) { - skipCall |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, - (uint64_t)(ds), __LINE__, DRAWSTATE_INVALID_UPDATE_INDEX, "DS", - "vkUpdateDescriptorsSets() failed write update for Descriptor Set 0x%" PRIx64 " with error: %s", - reinterpret_cast(ds), error_str.c_str()); + auto dest_set = pWDS[i].dstSet; + auto set_pair = my_data->setMap.find(dest_set); + if (set_pair == my_data->setMap.end()) { + skip_call |= + log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, + reinterpret_cast(dest_set), __LINE__, DRAWSTATE_DOUBLE_DESTROY, "DS", + "Cannot call vkUpdateDescriptorSets() on descriptor set 0x%" PRIxLEAST64 " that has not been allocated.", + reinterpret_cast(dest_set)); + } else { + string error_str; + if (!set_pair->second->WriteUpdate(my_data->report_data, &pWDS[i], &error_str)) { + skip_call |= + log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, + reinterpret_cast(dest_set), __LINE__, DRAWSTATE_INVALID_UPDATE_INDEX, "DS", + "vkUpdateDescriptorsSets() failed write update for Descriptor Set 0x%" PRIx64 " with error: %s", + reinterpret_cast(dest_set), error_str.c_str()); + } } } // Now validate copy updates for (i = 0; i < descriptorCopyCount; ++i) { - cvdescriptorset::DescriptorSet *pSrcSet = NULL, *pDstSet = NULL; - // For each copy make sure that update falls within given layout and that types match - pSrcSet = my_data->setMap[pCDS[i].srcSet]; - pDstSet = my_data->setMap[pCDS[i].dstSet]; - // Set being updated cannot be in-flight - if ((skipCall = validateIdleDescriptorSet(my_data, pDstSet->GetSet(), "VkUpdateDescriptorSets")) == true) - return skipCall; - invalidateBoundCmdBuffers(my_data, pDstSet); - std::string error_str; - if (!pDstSet->CopyUpdate(my_data->report_data, &pCDS[i], pSrcSet, &error_str)) { - skipCall |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, - reinterpret_cast(pCDS[i].dstSet), __LINE__, DRAWSTATE_INVALID_UPDATE_INDEX, "DS", - "vkUpdateDescriptorsSets() failed copy update from Descriptor Set 0x%" PRIx64 - " to Descriptor Set 0x%" PRIx64 " with error: %s", - reinterpret_cast(pCDS[i].srcSet), - reinterpret_cast(pCDS[i].dstSet), error_str.c_str()); + auto dst_set = pCDS[i].dstSet; + auto src_set = pCDS[i].srcSet; + auto src_pair = my_data->setMap.find(src_set); + auto dst_pair = my_data->setMap.find(dst_set); + if (src_pair == my_data->setMap.end()) { + skip_call |= log_msg( + my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, + reinterpret_cast(src_set), __LINE__, DRAWSTATE_DOUBLE_DESTROY, "DS", + "Cannot call vkUpdateDescriptorSets() to copy from descriptor set 0x%" PRIxLEAST64 " that has not been allocated.", + reinterpret_cast(src_set)); + } else if (dst_pair == my_data->setMap.end()) { + skip_call |= log_msg( + my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, + reinterpret_cast(dst_set), __LINE__, DRAWSTATE_DOUBLE_DESTROY, "DS", + "Cannot call vkUpdateDescriptorSets() to copy to descriptor set 0x%" PRIxLEAST64 " that has not been allocated.", + reinterpret_cast(dst_set)); + } else { + std::string error_str; + if (!dst_pair->second->CopyUpdate(my_data->report_data, &pCDS[i], src_pair->second, &error_str)) { + skip_call |= + log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, + reinterpret_cast(dst_set), __LINE__, DRAWSTATE_INVALID_UPDATE_INDEX, "DS", + "vkUpdateDescriptorsSets() failed copy update from Descriptor Set 0x%" PRIx64 + " to Descriptor Set 0x%" PRIx64 " with error: %s", + reinterpret_cast(src_set), reinterpret_cast(dst_set), error_str.c_str()); + } } } - return skipCall; + return skip_call; } // Verify that given pool has descriptors that are being requested for allocation. @@ -3701,7 +3707,7 @@ static void resetCB(layer_data *dev_data, const VkCommandBuffer cb) { for (auto set : pCB->lastBound[i].uniqueBoundSets) { auto set_node = dev_data->setMap.find(set); if (set_node != dev_data->setMap.end()) { - set_node->second->RemoveBoundCommandBuffer(pCB->commandBuffer); + set_node->second->RemoveBoundCommandBuffer(pCB); } } pCB->lastBound[i].reset(); @@ -5995,8 +6001,8 @@ AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllo } // Create new DescriptorSet instance and add to the pool's unordered_set of DescriptorSets cvdescriptorset::DescriptorSet *pNewNode = new cvdescriptorset::DescriptorSet( - pDescriptorSets[i], layout_pair->second, &dev_data->bufferMap, &dev_data->memObjMap, &dev_data->bufferViewMap, - &dev_data->samplerMap, &dev_data->imageViewMap, &dev_data->imageMap, + pDescriptorSets[i], layout_pair->second, dev_data->report_data, &dev_data->bufferMap, &dev_data->memObjMap, + &dev_data->bufferViewMap, &dev_data->samplerMap, &dev_data->imageViewMap, &dev_data->imageMap, &dev_data->device_extensions.imageToSwapchainMap, &dev_data->device_extensions.swapchainMap); if (NULL == pNewNode) { if (log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, @@ -6509,7 +6515,7 @@ CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelin cvdescriptorset::DescriptorSet *pSet = getSetNode(dev_data, pDescriptorSets[i]); if (pSet) { pCB->lastBound[pipelineBindPoint].uniqueBoundSets.insert(pDescriptorSets[i]); - pSet->BindCommandBuffer(commandBuffer); + pSet->BindCommandBuffer(pCB); pCB->lastBound[pipelineBindPoint].pipelineLayout = layout; pCB->lastBound[pipelineBindPoint].boundDescriptorSets[i + firstSet] = pDescriptorSets[i]; skipCall |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index 89c44c68..437dcdc3 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -260,6 +260,7 @@ bool cvdescriptorset::DescriptorSetLayout::VerifyUpdateConsistency(uint32_t curr } cvdescriptorset::DescriptorSet::DescriptorSet(const VkDescriptorSet set, const DescriptorSetLayout *layout, + const debug_report_data *debug_report_data, const std::unordered_map *buffer_map, const std::unordered_map *memory_map, const std::unordered_map *buffer_view_map, @@ -268,9 +269,9 @@ cvdescriptorset::DescriptorSet::DescriptorSet(const VkDescriptorSet set, const D const std::unordered_map *image_map, const std::unordered_map *image_to_swapchain_map, const std::unordered_map *swapchain_map) - : some_update_(false), set_(set), p_layout_(layout), buffer_map_(buffer_map), memory_map_(memory_map), - buffer_view_map_(buffer_view_map), sampler_map_(sampler_map), image_view_map_(image_view_map), image_map_(image_map), - image_to_swapchain_map_(image_to_swapchain_map), swapchain_map_(swapchain_map) { + : some_update_(false), set_(set), p_layout_(layout), report_data_(debug_report_data), buffer_map_(buffer_map), + memory_map_(memory_map), buffer_view_map_(buffer_view_map), sampler_map_(sampler_map), image_view_map_(image_view_map), + image_map_(image_map), image_to_swapchain_map_(image_to_swapchain_map), swapchain_map_(swapchain_map) { // Foreach binding, create default descriptors of given type for (uint32_t i = 0; i < p_layout_->GetBindingCount(); ++i) { auto type = p_layout_->GetTypeFromIndex(i); @@ -456,6 +457,14 @@ uint32_t cvdescriptorset::DescriptorSet::GetAllStorageUpdates(std::unordered_set bool cvdescriptorset::DescriptorSet::WriteUpdate(debug_report_data *report_data, const VkWriteDescriptorSet *update, std::string *error_msg) { auto num_updates = 0; + // Verify idle ds + if (in_use.load()) { + std::stringstream error_str; + error_str << "Cannot call vkUpdateDescriptorSets() to perform write update on descriptor set " << set_ + << " that is in use by a command buffer."; + *error_msg = error_str.str(); + return false; + } // Verify dst binding exists if (!p_layout_->HasBinding(update->dstBinding)) { std::stringstream error_str; @@ -505,12 +514,24 @@ bool cvdescriptorset::DescriptorSet::WriteUpdate(debug_report_data *report_data, if (num_updates != 0) { some_update_ = true; } + // Invalidate any bound command buffers + for (auto cb_node : bound_cmd_buffers_) { + cb_node->state = CB_INVALID; + } return true; } // Copy update bool cvdescriptorset::DescriptorSet::CopyUpdate(debug_report_data *report_data, const VkCopyDescriptorSet *update, const DescriptorSet *src_set, std::string *error) { auto num_updates = 0; + // Verify idle ds + if (in_use.load()) { + std::stringstream error_str; + error_str << "Cannot call vkUpdateDescriptorSets() to perform copy update on descriptor set " << set_ + << " that is in use by a command buffer."; + *error = error_str.str(); + return false; + } if (!p_layout_->HasBinding(update->dstBinding)) { std::stringstream error_str; error_str << "DescriptorSet " << set_ << " does not have copy update dest binding of " << update->dstBinding << "."; @@ -574,6 +595,10 @@ bool cvdescriptorset::DescriptorSet::CopyUpdate(debug_report_data *report_data, if (num_updates != 0) { some_update_ = true; } + // Invalidate any bound command buffers + for (auto cb_node : bound_cmd_buffers_) { + cb_node->state = CB_INVALID; + } return true; } cvdescriptorset::SamplerDescriptor::SamplerDescriptor( @@ -974,4 +999,4 @@ bool cvdescriptorset::TexelDescriptor::CopyUpdate(const Descriptor *src, std::st updated = true; buffer_view_ = buffer_view; return true; -} \ No newline at end of file +} diff --git a/layers/descriptor_sets.h b/layers/descriptor_sets.h index 92fda958..5b358d63 100644 --- a/layers/descriptor_sets.h +++ b/layers/descriptor_sets.h @@ -259,6 +259,9 @@ class BufferDescriptor : public Descriptor { VkDeviceSize range_; const std::unordered_map *buffer_map_; }; +// Helper function for Updating descriptor sets since it crosses multiple sets +void UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites, + uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pDescriptorCopies); /* * DescriptorSet class * @@ -279,8 +282,9 @@ class BufferDescriptor : public Descriptor { */ class DescriptorSet : public BASE_NODE { public: - DescriptorSet(const VkDescriptorSet, const DescriptorSetLayout *, const std::unordered_map *, - const std::unordered_map *, + using BASE_NODE::in_use; + DescriptorSet(const VkDescriptorSet, const DescriptorSetLayout *, const debug_report_data *, + const std::unordered_map *, const std::unordered_map *, const std::unordered_map *, const std::unordered_map> *, const std::unordered_map *, const std::unordered_map *, @@ -327,11 +331,11 @@ class DescriptorSet : public BASE_NODE { const DescriptorSetLayout *GetLayout() const { return p_layout_; }; VkDescriptorSet GetSet() const { return set_; }; // Return unordered_set of all command buffers that this set is bound to - std::unordered_set GetBoundCmdBuffers() const { return bound_cmd_buffers_; } + std::unordered_set GetBoundCmdBuffers() const { return bound_cmd_buffers_; } // Bind given cmd_buffer to this descriptor set - void BindCommandBuffer(const VkCommandBuffer cmd_buffer) { bound_cmd_buffers_.insert(cmd_buffer); } + void BindCommandBuffer(GLOBAL_CB_NODE *cb_node) { bound_cmd_buffers_.insert(cb_node); } // If given cmd_buffer is in the bound_cmd_buffers_ set, remove it - void RemoveBoundCommandBuffer(const VkCommandBuffer cmd_buffer) { bound_cmd_buffers_.erase(cmd_buffer); } + void RemoveBoundCommandBuffer(GLOBAL_CB_NODE *cb_node) { bound_cmd_buffers_.erase(cb_node); } VkSampler const *GetImmutableSamplerPtrFromBinding(const uint32_t index) const { return p_layout_->GetImmutableSamplerPtrFromBinding(index); }; @@ -351,8 +355,9 @@ class DescriptorSet : public BASE_NODE { VkDescriptorSet set_; uint32_t descriptor_count_; // Count of all descriptors in this set const DescriptorSetLayout *p_layout_; - std::unordered_set bound_cmd_buffers_; + std::unordered_set bound_cmd_buffers_; std::vector> descriptors_; + const debug_report_data *report_data_; // Ptrs to object containers to verify bound data const std::unordered_map *buffer_map_; const std::unordered_map *memory_map_; -- cgit v1.2.3 From d21e9eb3754861ae1fed39fe8a6d825e11e30b47 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Tue, 17 May 2016 10:41:55 -0600 Subject: layers: Reduce DescriptorSet map look-ups Migrate some data structures to refer to DescriptorSet class instead of raw VkDescriptorSet. This saves map look-ups. --- layers/core_validation.cpp | 64 ++++++++++++++++++++++-------------------- layers/core_validation_types.h | 59 +++++++++++++++++++------------------- 2 files changed, 63 insertions(+), 60 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 98c45c03..780d27de 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -70,6 +70,17 @@ using namespace std; +// TODO : CB really needs it's own class and files so this is just temp code until that happens +GLOBAL_CB_NODE::~GLOBAL_CB_NODE() { + for (uint32_t i=0; iRemoveBoundCommandBuffer(this); + } + lastBound[i].reset(); + } +} + namespace core_validation { using std::unordered_map; @@ -2612,14 +2623,11 @@ static bool validate_and_update_drawtime_descriptor_state( // When validate_and_update_draw_state() handles compute shaders so that active_slots is correct for compute pipelines, this // function can be killed and validate_and_update_draw_state() used instead static void update_shader_storage_images_and_buffers(layer_data *dev_data, GLOBAL_CB_NODE *pCB) { - cvdescriptorset::DescriptorSet *pSet = nullptr; // For the bound descriptor sets, pull off any storage images and buffers // This may be more than are actually updated depending on which are active, but for now this is a stop-gap for compute // pipelines for (auto set : pCB->lastBound[VK_PIPELINE_BIND_POINT_COMPUTE].uniqueBoundSets) { - // Get the set node - pSet = getSetNode(dev_data, set); - pSet->GetAllStorageUpdates(&pCB->updateBuffers, &pCB->updateImages); + set->GetAllStorageUpdates(&pCB->updateBuffers, &pCB->updateImages); } } @@ -2749,10 +2757,10 @@ static bool validate_and_update_draw_state(layer_data *my_data, GLOBAL_CB_NODE * DRAWSTATE_DESCRIPTOR_SET_NOT_BOUND, "DS", "VkPipeline 0x%" PRIxLEAST64 " uses set #%u but that set is not bound.", (uint64_t)pPipe->pipeline, setIndex); - } else if (!verify_set_layout_compatibility(my_data, my_data->setMap[state.boundDescriptorSets[setIndex]], + } else if (!verify_set_layout_compatibility(my_data, state.boundDescriptorSets[setIndex], pPipe->graphicsPipelineCI.layout, setIndex, errorString)) { // Set is bound but not compatible w/ overlapping pipelineLayout from PSO - VkDescriptorSet setHandle = my_data->setMap[state.boundDescriptorSets[setIndex]]->GetSet(); + VkDescriptorSet setHandle = state.boundDescriptorSets[setIndex]->GetSet(); result |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, (uint64_t)setHandle, __LINE__, DRAWSTATE_PIPELINE_LAYOUTS_INCOMPATIBLE, "DS", @@ -2761,7 +2769,7 @@ static bool validate_and_update_draw_state(layer_data *my_data, GLOBAL_CB_NODE * (uint64_t)setHandle, setIndex, (uint64_t)pPipe->graphicsPipelineCI.layout, errorString.c_str()); } else { // Valid set is bound and layout compatible, validate that it's updated // Pull the set node - cvdescriptorset::DescriptorSet *pSet = my_data->setMap[state.boundDescriptorSets[setIndex]]; + cvdescriptorset::DescriptorSet *pSet = state.boundDescriptorSets[setIndex]; // Save vector of all active sets to verify dynamicOffsets below activeSetBindingsPairs.push_back(std::make_tuple(pSet, setBindingPair.second, &state.dynamicOffsets[setIndex])); @@ -3379,10 +3387,13 @@ static bool validateIdleDescriptorSet(const layer_data *my_data, VkDescriptorSet } return skip_call; } -static void invalidateBoundCmdBuffers(layer_data *dev_data, const cvdescriptorset::DescriptorSet *pSet) { - // Flag any CBs this set is bound to as INVALID +static void invalidateBoundCmdBuffers(layer_data *dev_data, cvdescriptorset::DescriptorSet *pSet) { + // Flag any CBs this set is bound to as INVALID and remove set binding for (auto cb_node : pSet->GetBoundCmdBuffers()) { cb_node->state = CB_INVALID; + for (uint32_t i = 0; i < VK_PIPELINE_BIND_POINT_RANGE_SIZE; ++i) { + cb_node->lastBound[i].uniqueBoundSets.erase(pSet); + } } } // update DS mappings based on write and copy update arrays @@ -3546,7 +3557,6 @@ static GLOBAL_CB_NODE *getCBNode(layer_data const *my_data, const VkCommandBuffe } return it->second; } - // Free all CB Nodes // NOTE : Calls to this function should be wrapped in mutex static void deleteCommandBuffers(layer_data *my_data) { @@ -3705,10 +3715,7 @@ static void resetCB(layer_data *dev_data, const VkCommandBuffer cb) { for (uint32_t i = 0; i < VK_PIPELINE_BIND_POINT_RANGE_SIZE; ++i) { // Before clearing lastBoundState, remove any CB bindings from all uniqueBoundSets for (auto set : pCB->lastBound[i].uniqueBoundSets) { - auto set_node = dev_data->setMap.find(set); - if (set_node != dev_data->setMap.end()) { - set_node->second->RemoveBoundCommandBuffer(pCB); - } + set->RemoveBoundCommandBuffer(pCB); } pCB->lastBound[i].reset(); } @@ -4146,14 +4153,13 @@ static bool validateAndIncrementResources(layer_data *my_data, GLOBAL_CB_NODE *p } for (uint32_t i = 0; i < VK_PIPELINE_BIND_POINT_RANGE_SIZE; ++i) { for (auto set : pCB->lastBound[i].uniqueBoundSets) { - auto setNode = my_data->setMap.find(set); - if (setNode == my_data->setMap.end()) { + if (!my_data->setMap.count(set->GetSet())) { skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, (uint64_t)(set), __LINE__, DRAWSTATE_INVALID_DESCRIPTOR_SET, "DS", "Cannot submit cmd buffer using deleted descriptor set 0x%" PRIx64 ".", (uint64_t)(set)); } else { - setNode->second->in_use.fetch_add(1); + set->in_use.fetch_add(1); } } } @@ -4224,10 +4230,7 @@ static void decrementResources(layer_data *my_data, VkCommandBuffer cmdBuffer) { } for (uint32_t i = 0; i < VK_PIPELINE_BIND_POINT_RANGE_SIZE; ++i) { for (auto set : pCB->lastBound[i].uniqueBoundSets) { - auto setNode = my_data->setMap.find(set); - if (setNode != my_data->setMap.end()) { - setNode->second->in_use.fetch_sub(1); - } + set->in_use.fetch_sub(1); } } for (auto semaphore : pCB->semaphores) { @@ -6510,14 +6513,14 @@ CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelin pCB->lastBound[pipelineBindPoint].boundDescriptorSets.resize(lastSetIndex + 1); pCB->lastBound[pipelineBindPoint].dynamicOffsets.resize(lastSetIndex + 1); } - VkDescriptorSet oldFinalBoundSet = pCB->lastBound[pipelineBindPoint].boundDescriptorSets[lastSetIndex]; + auto oldFinalBoundSet = pCB->lastBound[pipelineBindPoint].boundDescriptorSets[lastSetIndex]; for (uint32_t i = 0; i < setCount; i++) { cvdescriptorset::DescriptorSet *pSet = getSetNode(dev_data, pDescriptorSets[i]); if (pSet) { - pCB->lastBound[pipelineBindPoint].uniqueBoundSets.insert(pDescriptorSets[i]); + pCB->lastBound[pipelineBindPoint].uniqueBoundSets.insert(pSet); pSet->BindCommandBuffer(pCB); pCB->lastBound[pipelineBindPoint].pipelineLayout = layout; - pCB->lastBound[pipelineBindPoint].boundDescriptorSets[i + firstSet] = pDescriptorSets[i]; + pCB->lastBound[pipelineBindPoint].boundDescriptorSets[i + firstSet] = pSet; skipCall |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, (uint64_t)pDescriptorSets[i], __LINE__, DRAWSTATE_NONE, "DS", "DS 0x%" PRIxLEAST64 " bound on pipeline %s", @@ -6610,9 +6613,8 @@ CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelin if (firstSet > 0) { // Check set #s below the first bound set for (uint32_t i = 0; i < firstSet; ++i) { if (pCB->lastBound[pipelineBindPoint].boundDescriptorSets[i] && - !verify_set_layout_compatibility( - dev_data, dev_data->setMap[pCB->lastBound[pipelineBindPoint].boundDescriptorSets[i]], layout, i, - errorString)) { + !verify_set_layout_compatibility(dev_data, pCB->lastBound[pipelineBindPoint].boundDescriptorSets[i], + layout, i, errorString)) { skipCall |= log_msg( dev_data->report_data, VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, @@ -6627,16 +6629,16 @@ CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelin // Check if newly last bound set invalidates any remaining bound sets if ((pCB->lastBound[pipelineBindPoint].boundDescriptorSets.size() - 1) > (lastSetIndex)) { if (oldFinalBoundSet && - !verify_set_layout_compatibility(dev_data, dev_data->setMap[oldFinalBoundSet], layout, lastSetIndex, - errorString)) { + !verify_set_layout_compatibility(dev_data, oldFinalBoundSet, layout, lastSetIndex, errorString)) { + auto old_set = oldFinalBoundSet->GetSet(); skipCall |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, (uint64_t)oldFinalBoundSet, __LINE__, + VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, reinterpret_cast(old_set), __LINE__, DRAWSTATE_NONE, "DS", "DescriptorSetDS 0x%" PRIxLEAST64 " previously bound as set #%u is incompatible with set 0x%" PRIxLEAST64 " newly bound as set #%u so set #%u and any subsequent sets were " "disturbed by newly bound pipelineLayout (0x%" PRIxLEAST64 ")", - (uint64_t)oldFinalBoundSet, lastSetIndex, + reinterpret_cast(old_set), lastSetIndex, (uint64_t)pCB->lastBound[pipelineBindPoint].boundDescriptorSets[lastSetIndex], lastSetIndex, lastSetIndex + 1, (uint64_t)layout); pCB->lastBound[pipelineBindPoint].boundDescriptorSets.resize(lastSetIndex + 1); diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index ff3a781c..6269f146 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -52,6 +52,11 @@ #include #include +// Fwd declarations +namespace cvdescriptorset { +class DescriptorSet; +}; + class BASE_NODE { public: std::atomic_int in_use; @@ -302,27 +307,6 @@ typedef enum _CBStatusFlagBits { // clang-format on } CBStatusFlagBits; -// Track last states that are bound per pipeline bind point (Gfx & Compute) -struct LAST_BOUND_STATE { - VkPipeline pipeline; - VkPipelineLayout pipelineLayout; - // Track each set that has been bound - // TODO : can unique be global per CB? (do we care about Gfx vs. Compute?) - std::unordered_set uniqueBoundSets; - // Ordered bound set tracking where index is set# that given set is bound to - std::vector boundDescriptorSets; - // one dynamic offset per dynamic descriptor bound to this CB - std::vector> dynamicOffsets; - - void reset() { - pipeline = VK_NULL_HANDLE; - pipelineLayout = VK_NULL_HANDLE; - uniqueBoundSets.clear(); - boundDescriptorSets.clear(); - dynamicOffsets.clear(); - } -}; - struct QueryObject { VkQueryPool pool; uint32_t index; @@ -369,7 +353,27 @@ template <> struct hash { } }; } -// Cmd Buffer Wrapper Struct +// Track last states that are bound per pipeline bind point (Gfx & Compute) +struct LAST_BOUND_STATE { + VkPipeline pipeline; + VkPipelineLayout pipelineLayout; + // Track each set that has been bound + // TODO : can unique be global per CB? (do we care about Gfx vs. Compute?) + std::unordered_set uniqueBoundSets; + // Ordered bound set tracking where index is set# that given set is bound to + std::vector boundDescriptorSets; + // one dynamic offset per dynamic descriptor bound to this CB + std::vector> dynamicOffsets; + + void reset() { + pipeline = VK_NULL_HANDLE; + pipelineLayout = VK_NULL_HANDLE; + uniqueBoundSets.clear(); + boundDescriptorSets.clear(); + dynamicOffsets.clear(); + } +}; +// Cmd Buffer Wrapper Struct - TODO : This desperately needs its own class struct GLOBAL_CB_NODE : public BASE_NODE { VkCommandBuffer commandBuffer; VkCommandBufferAllocateInfo createInfo; @@ -386,11 +390,6 @@ struct GLOBAL_CB_NODE : public BASE_NODE { // Currently storing "lastBound" objects on per-CB basis // long-term may want to create caches of "lastBound" states and could have // each individual CMD_NODE referencing its own "lastBound" state - // VkPipeline lastBoundPipeline; - // VkPipelineLayout lastBoundPipelineLayout; - // // Capture unique std::set of descriptorSets that are bound to this CB. - // std::set uniqueBoundSets; - // vector boundDescriptorSets; // Index is set# that given set is bound to // Store last bound state for Gfx & Compute pipeline bind points LAST_BOUND_STATE lastBound[VK_PIPELINE_BIND_POINT_RANGE_SIZE]; @@ -409,8 +408,8 @@ struct GLOBAL_CB_NODE : public BASE_NODE { // TODO : These data structures relate to tracking resources that invalidate // a cmd buffer that references them. Need to unify how we handle these // cases so we don't have different tracking data for each type. - std::unordered_set destroyedSets; - std::unordered_set updatedSets; + std::unordered_set destroyedSets; + std::unordered_set updatedSets; std::unordered_set destroyedFramebuffers; std::vector waitedEvents; std::vector semaphores; @@ -435,6 +434,8 @@ struct GLOBAL_CB_NODE : public BASE_NODE { std::vector> validate_functions; std::unordered_set memObjs; std::vector> eventUpdates; + + ~GLOBAL_CB_NODE(); }; #endif // CORE_VALIDATION_TYPES_H_ \ No newline at end of file -- cgit v1.2.3 From 8bfe8f2c5538e99939a8c5bccf7c1c59d69635ad Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Tue, 17 May 2016 14:23:46 -0600 Subject: layers: Improve DescriptorSet cleanup Create private helper function InvalidateBoundCmdBuffers() within the DescriptorSet class to unify invalidate cases due to set being updated or freed. Add a destructor for DescriptorSet to make sure that no bound cmd buffers hang on to deleted set references. --- layers/core_validation.cpp | 10 ---------- layers/descriptor_sets.cpp | 25 +++++++++++++++++-------- layers/descriptor_sets.h | 4 +++- 3 files changed, 20 insertions(+), 19 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 780d27de..3e5360ba 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -3387,15 +3387,6 @@ static bool validateIdleDescriptorSet(const layer_data *my_data, VkDescriptorSet } return skip_call; } -static void invalidateBoundCmdBuffers(layer_data *dev_data, cvdescriptorset::DescriptorSet *pSet) { - // Flag any CBs this set is bound to as INVALID and remove set binding - for (auto cb_node : pSet->GetBoundCmdBuffers()) { - cb_node->state = CB_INVALID; - for (uint32_t i = 0; i < VK_PIPELINE_BIND_POINT_RANGE_SIZE; ++i) { - cb_node->lastBound[i].uniqueBoundSets.erase(pSet); - } - } -} // update DS mappings based on write and copy update arrays static bool dsUpdate(layer_data *my_data, VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pWDS, uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pCDS) { @@ -3505,7 +3496,6 @@ static bool validate_descriptor_availability_in_pool(layer_data *dev_data, DESCR // Free the descriptor set, remove it from setMap and invalidate any cmd buffers that it was bound to static void freeDescriptorSet(layer_data *dev_data, cvdescriptorset::DescriptorSet *descriptor_set) { - invalidateBoundCmdBuffers(dev_data, descriptor_set); dev_data->setMap.erase(descriptor_set->GetSet()); delete descriptor_set; } diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index 437dcdc3..1d9eed64 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -324,6 +324,15 @@ cvdescriptorset::DescriptorSet::DescriptorSet(const VkDescriptorSet set, const D } } } +cvdescriptorset::DescriptorSet::~DescriptorSet() { + InvalidateBoundCmdBuffers(); + // Remove link to any cmd buffers + for (auto cb : bound_cmd_buffers_) { + for (uint32_t i=0; ilastBound[i].uniqueBoundSets.erase(this); + } + } +} // Is this sets underlying layout compatible with passed in layout according to "Pipeline Layout Compatibility" in spec? bool cvdescriptorset::DescriptorSet::IsCompatible(const DescriptorSetLayout *layout, std::string *error) const { return layout->IsCompatible(p_layout_, error); @@ -452,6 +461,12 @@ uint32_t cvdescriptorset::DescriptorSet::GetAllStorageUpdates(std::unordered_set p_layout_->FillBindingSet(&binding_set); return GetStorageUpdates(binding_set, buffer_set, image_set); } +// Set is being deleted or updates so invalidate all bound cmd buffers +void cvdescriptorset::DescriptorSet::InvalidateBoundCmdBuffers() { + for (auto cb_node : bound_cmd_buffers_) { + cb_node->state = CB_INVALID; + } +} // Perform write update in given update struct // If an error occurs, return false and fill in details in error_msg string bool cvdescriptorset::DescriptorSet::WriteUpdate(debug_report_data *report_data, const VkWriteDescriptorSet *update, @@ -514,10 +529,7 @@ bool cvdescriptorset::DescriptorSet::WriteUpdate(debug_report_data *report_data, if (num_updates != 0) { some_update_ = true; } - // Invalidate any bound command buffers - for (auto cb_node : bound_cmd_buffers_) { - cb_node->state = CB_INVALID; - } + InvalidateBoundCmdBuffers(); return true; } // Copy update @@ -595,10 +607,7 @@ bool cvdescriptorset::DescriptorSet::CopyUpdate(debug_report_data *report_data, if (num_updates != 0) { some_update_ = true; } - // Invalidate any bound command buffers - for (auto cb_node : bound_cmd_buffers_) { - cb_node->state = CB_INVALID; - } + InvalidateBoundCmdBuffers(); return true; } cvdescriptorset::SamplerDescriptor::SamplerDescriptor( diff --git a/layers/descriptor_sets.h b/layers/descriptor_sets.h index 5b358d63..5abe45fc 100644 --- a/layers/descriptor_sets.h +++ b/layers/descriptor_sets.h @@ -290,7 +290,7 @@ class DescriptorSet : public BASE_NODE { const std::unordered_map *, const std::unordered_map *, const std::unordered_map *, const std::unordered_map *); - ~DescriptorSet(){}; + ~DescriptorSet(); // A number of common Get* functions that return data based on layout from which this set was created uint32_t GetTotalDescriptorCount() const { return p_layout_ ? p_layout_->GetTotalDescriptorCount() : 0; }; uint32_t GetDynamicDescriptorCount() const { return p_layout_ ? p_layout_->GetDynamicDescriptorCount() : 0; }; @@ -351,6 +351,8 @@ class DescriptorSet : public BASE_NODE { private: bool ValidateUpdate(const VkWriteDescriptorSet *, const uint32_t, std::string *) const; + // Private helper to set all bound cmd buffers to INVALID state + void InvalidateBoundCmdBuffers(); bool some_update_; // has any part of the set ever been updated? VkDescriptorSet set_; uint32_t descriptor_count_; // Count of all descriptors in this set -- cgit v1.2.3 From d72b9acd6d857ee6e3e46f92f5f48c24b278923a Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 19 May 2016 06:58:13 -0600 Subject: layers: Remove lastBound state reset in destructor No need to reset this state right before GLOBAL_CB_NODE is destroyed. --- layers/core_validation.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 3e5360ba..934a2288 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -77,7 +77,6 @@ GLOBAL_CB_NODE::~GLOBAL_CB_NODE() { for (auto set : lastBound[i].uniqueBoundSets) { set->RemoveBoundCommandBuffer(this); } - lastBound[i].reset(); } } -- cgit v1.2.3 From 818c4b85891f8bded09b4d1178e508d39cb89bac Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Tue, 17 May 2016 11:02:24 +1200 Subject: layers: Unify cb lookup in CmdBeginRenderPass We already have a GLOBAL_CB_NODE ptr here, and we know it's not null. Signed-off-by: Chris Forbes --- layers/core_validation.cpp | 45 ++++++++++++++++++--------------------------- 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 934a2288..0715fda1 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -8857,40 +8857,31 @@ CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *p if (pass_data != dev_data->renderPassMap.end()) { RENDER_PASS_NODE* pRPNode = pass_data->second; pCB->activeFramebuffer = pRenderPassBegin->framebuffer; - auto cb_data = dev_data->commandBufferMap.find(commandBuffer); for (size_t i = 0; i < pRPNode->attachments.size(); ++i) { MT_FB_ATTACHMENT_INFO &fb_info = dev_data->frameBufferMap[pRenderPassBegin->framebuffer].attachments[i]; if (pRPNode->attachments[i].load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) { - if (cb_data != dev_data->commandBufferMap.end()) { - std::function function = [=]() { - set_memory_valid(dev_data, fb_info.mem, true, fb_info.image); - return false; - }; - cb_data->second->validate_functions.push_back(function); - } + std::function function = [=]() { + set_memory_valid(dev_data, fb_info.mem, true, fb_info.image); + return false; + }; + pCB->validate_functions.push_back(function); } else if (pRPNode->attachments[i].load_op == VK_ATTACHMENT_LOAD_OP_DONT_CARE) { - if (cb_data != dev_data->commandBufferMap.end()) { - std::function function = [=]() { - set_memory_valid(dev_data, fb_info.mem, false, fb_info.image); - return false; - }; - cb_data->second->validate_functions.push_back(function); - } + std::function function = [=]() { + set_memory_valid(dev_data, fb_info.mem, false, fb_info.image); + return false; + }; + pCB->validate_functions.push_back(function); } else if (pRPNode->attachments[i].load_op == VK_ATTACHMENT_LOAD_OP_LOAD) { - if (cb_data != dev_data->commandBufferMap.end()) { - std::function function = [=]() { - return validate_memory_is_valid(dev_data, fb_info.mem, "vkCmdBeginRenderPass()", fb_info.image); - }; - cb_data->second->validate_functions.push_back(function); - } + std::function function = [=]() { + return validate_memory_is_valid(dev_data, fb_info.mem, "vkCmdBeginRenderPass()", fb_info.image); + }; + pCB->validate_functions.push_back(function); } if (pRPNode->attachment_first_read[pRPNode->attachments[i].attachment]) { - if (cb_data != dev_data->commandBufferMap.end()) { - std::function function = [=]() { - return validate_memory_is_valid(dev_data, fb_info.mem, "vkCmdBeginRenderPass()", fb_info.image); - }; - cb_data->second->validate_functions.push_back(function); - } + std::function function = [=]() { + return validate_memory_is_valid(dev_data, fb_info.mem, "vkCmdBeginRenderPass()", fb_info.image); + }; + pCB->validate_functions.push_back(function); } } } -- cgit v1.2.3 From ae80a25e48e78ef39e439c9399fed27614d6bba4 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Tue, 17 May 2016 11:36:23 +1200 Subject: layers: Add getRenderPass helper Various similar functions exist, but this one was missing. Returns the RENDER_PASS_NODE ptr if it exists, or nullptr otherwise. Signed-off-by: Chris Forbes --- layers/core_validation.cpp | 161 +++++++++++++++++++++++---------------------- 1 file changed, 81 insertions(+), 80 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 0715fda1..6a4e3576 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -1965,7 +1965,7 @@ static bool validate_status(layer_data *my_data, GLOBAL_CB_NODE *pNode, CBStatus } // Retrieve pipeline node ptr for given pipeline object -static PIPELINE_NODE *getPipeline(layer_data const *my_data, const VkPipeline pipeline) { +static PIPELINE_NODE *getPipeline(layer_data const *my_data, VkPipeline pipeline) { auto it = my_data->pipelineMap.find(pipeline); if (it == my_data->pipelineMap.end()) { return nullptr; @@ -1973,6 +1973,14 @@ static PIPELINE_NODE *getPipeline(layer_data const *my_data, const VkPipeline pi return it->second; } +static RENDER_PASS_NODE *getRenderPass(layer_data const *my_data, VkRenderPass renderpass) { + auto it = my_data->renderPassMap.find(renderpass); + if (it == my_data->renderPassMap.end()) { + return nullptr; + } + return it->second; +} + // Return true if for a given PSO, the given state enum is dynamic, else return false static bool isDynamic(const PIPELINE_NODE *pPipeline, const VkDynamicState state) { if (pPipeline && pPipeline->graphicsPipelineCI.pDynamicState) { @@ -2057,12 +2065,17 @@ static bool attachment_references_compatible(const uint32_t index, const VkAttac // For give primary and secondary RenderPass objects, verify that they're compatible static bool verify_renderpass_compatibility(layer_data *my_data, const VkRenderPass primaryRP, const VkRenderPass secondaryRP, string &errorMsg) { - if (my_data->renderPassMap.find(primaryRP) == my_data->renderPassMap.end()) { + auto primary_render_pass = getRenderPass(my_data, primaryRP); + auto secondary_render_pass = getRenderPass(my_data, secondaryRP); + + if (!primary_render_pass) { stringstream errorStr; errorStr << "invalid VkRenderPass (" << primaryRP << ")"; errorMsg = errorStr.str(); return false; - } else if (my_data->renderPassMap.find(secondaryRP) == my_data->renderPassMap.end()) { + } + + if (!secondary_render_pass) { stringstream errorStr; errorStr << "invalid VkRenderPass (" << secondaryRP << ")"; errorMsg = errorStr.str(); @@ -2072,8 +2085,8 @@ static bool verify_renderpass_compatibility(layer_data *my_data, const VkRenderP if (primaryRP == secondaryRP) { return true; } - const VkRenderPassCreateInfo *primaryRPCI = my_data->renderPassMap[primaryRP]->pCreateInfo; - const VkRenderPassCreateInfo *secondaryRPCI = my_data->renderPassMap[secondaryRP]->pCreateInfo; + const VkRenderPassCreateInfo *primaryRPCI = primary_render_pass->pCreateInfo; + const VkRenderPassCreateInfo *secondaryRPCI = secondary_render_pass->pCreateInfo; if (primaryRPCI->subpassCount != secondaryRPCI->subpassCount) { stringstream errorStr; errorStr << "RenderPass for primary cmdBuffer has " << primaryRPCI->subpassCount @@ -2951,13 +2964,13 @@ static bool verifyPipelineCreateState(layer_data *my_data, const VkDevice device // Ensure the subpass index is valid. If not, then validate_and_capture_pipeline_shader_state // produces nonsense errors that confuse users. Other layers should already // emit errors for renderpass being invalid. - auto rp_data = my_data->renderPassMap.find(pPipeline->graphicsPipelineCI.renderPass); - if (rp_data != my_data->renderPassMap.end() && - pPipeline->graphicsPipelineCI.subpass >= rp_data->second->pCreateInfo->subpassCount) { + auto renderPass = getRenderPass(my_data, pPipeline->graphicsPipelineCI.renderPass); + if (renderPass && + pPipeline->graphicsPipelineCI.subpass >= renderPass->pCreateInfo->subpassCount) { skipCall |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, DRAWSTATE_INVALID_PIPELINE_CREATE_STATE, "DS", "Invalid Pipeline CreateInfo State: Subpass index %u " "is out of range for this renderpass (0..%u)", - pPipeline->graphicsPipelineCI.subpass, rp_data->second->pCreateInfo->subpassCount - 1); + pPipeline->graphicsPipelineCI.subpass, renderPass->pCreateInfo->subpassCount - 1); } if (!validate_and_capture_pipeline_shader_state(my_data->report_data, pPipeline, &my_data->phys_dev_properties.features, @@ -5672,11 +5685,7 @@ CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t for (i = 0; i < count; i++) { pPipeNode[i] = new PIPELINE_NODE; pPipeNode[i]->initGraphicsPipeline(&pCreateInfos[i]); - - auto renderpass_it = dev_data->renderPassMap.find(pCreateInfos[i].renderPass); - if (renderpass_it != dev_data->renderPassMap.end()) { - pPipeNode[i]->renderPass = renderpass_it->second; - } + pPipeNode[i]->renderPass = getRenderPass(dev_data, pCreateInfos[i].renderPass); auto pipeline_layout_it = dev_data->pipelineLayoutMap.find(pCreateInfos[i].layout); if (pipeline_layout_it != dev_data->pipelineLayoutMap.end()) { @@ -6178,15 +6187,15 @@ BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo } } if (pInfo && pInfo->renderPass != VK_NULL_HANDLE) { - auto rp_data = dev_data->renderPassMap.find(pInfo->renderPass); - if (rp_data != dev_data->renderPassMap.end() && rp_data->second && rp_data->second->pCreateInfo) { - if (pInfo->subpass >= rp_data->second->pCreateInfo->subpassCount) { + auto renderPass = getRenderPass(dev_data, pInfo->renderPass); + if (renderPass) { + if (pInfo->subpass >= renderPass->pCreateInfo->subpassCount) { skipCall |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, (uint64_t)commandBuffer, __LINE__, DRAWSTATE_BEGIN_CB_INVALID_STATE, "DS", "vkBeginCommandBuffer(): Secondary Command Buffers (0x%p) must has a subpass index (%d) " "that is less than the number of subpasses (%d).", - (void *)commandBuffer, pInfo->subpass, rp_data->second->pCreateInfo->subpassCount); + (void *)commandBuffer, pInfo->subpass, renderPass->pCreateInfo->subpassCount); } } } @@ -6220,8 +6229,7 @@ BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo // If we are a secondary command-buffer and inheriting. Update the items we should inherit. if ((pCB->createInfo.level != VK_COMMAND_BUFFER_LEVEL_PRIMARY) && (pCB->beginInfo.flags & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT)) { - auto inherited_render_pass_it = dev_data->renderPassMap.find(pCB->beginInfo.pInheritanceInfo->renderPass); - pCB->activeRenderPass = inherited_render_pass_it != dev_data->renderPassMap.end() ? inherited_render_pass_it->second : nullptr; + pCB->activeRenderPass = getRenderPass(dev_data, pCB->beginInfo.pInheritanceInfo->renderPass); pCB->activeSubpass = pCB->beginInfo.pInheritanceInfo->subpass; pCB->framebuffers.insert(pCB->beginInfo.pInheritanceInfo->framebuffer); } @@ -8251,10 +8259,11 @@ bool isRegionOverlapping(VkImageSubresourceRange range1, VkImageSubresourceRange } static bool ValidateDependencies(const layer_data *my_data, const VkRenderPassBeginInfo *pRenderPassBegin, - const std::vector &subpass_to_node) { + RENDER_PASS_NODE const * renderPass) { bool skip_call = false; const VkFramebufferCreateInfo *pFramebufferInfo = &my_data->frameBufferMap.at(pRenderPassBegin->framebuffer).createInfo; - const VkRenderPassCreateInfo *pCreateInfo = my_data->renderPassMap.at(pRenderPassBegin->renderPass)->pCreateInfo; + const VkRenderPassCreateInfo *pCreateInfo = renderPass->pCreateInfo; + auto const & subpass_to_node = renderPass->subpassToNode; std::vector> output_attachment_to_subpass(pCreateInfo->attachmentCount); std::vector> input_attachment_to_subpass(pCreateInfo->attachmentCount); std::vector> overlapping_attachments(pCreateInfo->attachmentCount); @@ -8771,17 +8780,16 @@ static void TransitionSubpassLayouts(VkCommandBuffer cmdBuffer, const VkRenderPa const int subpass_index) { layer_data *dev_data = get_my_data_ptr(get_dispatch_key(cmdBuffer), layer_data_map); GLOBAL_CB_NODE *pCB = getCBNode(dev_data, cmdBuffer); - auto render_pass_data = dev_data->renderPassMap.find(pRenderPassBegin->renderPass); - if (render_pass_data == dev_data->renderPassMap.end()) { + auto renderPass = getRenderPass(dev_data, pRenderPassBegin->renderPass); + if (!renderPass) return; - } - const VkRenderPassCreateInfo *pRenderPassInfo = render_pass_data->second->pCreateInfo; + auto framebuffer_data = dev_data->frameBufferMap.find(pRenderPassBegin->framebuffer); if (framebuffer_data == dev_data->frameBufferMap.end()) { return; } const VkFramebufferCreateInfo framebufferInfo = framebuffer_data->second.createInfo; - const VkSubpassDescription &subpass = pRenderPassInfo->pSubpasses[subpass_index]; + const VkSubpassDescription &subpass = renderPass->pCreateInfo->pSubpasses[subpass_index]; for (uint32_t j = 0; j < subpass.inputAttachmentCount; ++j) { const VkImageView &image_view = framebufferInfo.pAttachments[subpass.pInputAttachments[j].attachment]; SetLayout(dev_data, pCB, image_view, subpass.pInputAttachments[j].layout); @@ -8809,11 +8817,11 @@ static bool validatePrimaryCommandBuffer(const layer_data *my_data, const GLOBAL static void TransitionFinalSubpassLayouts(VkCommandBuffer cmdBuffer, const VkRenderPassBeginInfo *pRenderPassBegin) { layer_data *dev_data = get_my_data_ptr(get_dispatch_key(cmdBuffer), layer_data_map); GLOBAL_CB_NODE *pCB = getCBNode(dev_data, cmdBuffer); - auto render_pass_data = dev_data->renderPassMap.find(pRenderPassBegin->renderPass); - if (render_pass_data == dev_data->renderPassMap.end()) { + auto renderPass = getRenderPass(dev_data, pRenderPassBegin->renderPass); + if (!renderPass) return; - } - const VkRenderPassCreateInfo *pRenderPassInfo = render_pass_data->second->pCreateInfo; + + const VkRenderPassCreateInfo *pRenderPassInfo = renderPass->pCreateInfo; auto framebuffer_data = dev_data->frameBufferMap.find(pRenderPassBegin->framebuffer); if (framebuffer_data == dev_data->frameBufferMap.end()) { return; @@ -8850,53 +8858,46 @@ CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *p layer_data *dev_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); std::unique_lock lock(global_lock); GLOBAL_CB_NODE *pCB = getCBNode(dev_data, commandBuffer); + auto renderPass = pRenderPassBegin ? getRenderPass(dev_data, pRenderPassBegin->renderPass) : nullptr; if (pCB) { - if (pRenderPassBegin && pRenderPassBegin->renderPass) { + if (renderPass) { #if MTMERGE - auto pass_data = dev_data->renderPassMap.find(pRenderPassBegin->renderPass); - if (pass_data != dev_data->renderPassMap.end()) { - RENDER_PASS_NODE* pRPNode = pass_data->second; - pCB->activeFramebuffer = pRenderPassBegin->framebuffer; - for (size_t i = 0; i < pRPNode->attachments.size(); ++i) { - MT_FB_ATTACHMENT_INFO &fb_info = dev_data->frameBufferMap[pRenderPassBegin->framebuffer].attachments[i]; - if (pRPNode->attachments[i].load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) { - std::function function = [=]() { - set_memory_valid(dev_data, fb_info.mem, true, fb_info.image); - return false; - }; - pCB->validate_functions.push_back(function); - } else if (pRPNode->attachments[i].load_op == VK_ATTACHMENT_LOAD_OP_DONT_CARE) { - std::function function = [=]() { - set_memory_valid(dev_data, fb_info.mem, false, fb_info.image); - return false; - }; - pCB->validate_functions.push_back(function); - } else if (pRPNode->attachments[i].load_op == VK_ATTACHMENT_LOAD_OP_LOAD) { - std::function function = [=]() { - return validate_memory_is_valid(dev_data, fb_info.mem, "vkCmdBeginRenderPass()", fb_info.image); - }; - pCB->validate_functions.push_back(function); - } - if (pRPNode->attachment_first_read[pRPNode->attachments[i].attachment]) { - std::function function = [=]() { - return validate_memory_is_valid(dev_data, fb_info.mem, "vkCmdBeginRenderPass()", fb_info.image); - }; - pCB->validate_functions.push_back(function); - } + pCB->activeFramebuffer = pRenderPassBegin->framebuffer; + for (size_t i = 0; i < renderPass->attachments.size(); ++i) { + MT_FB_ATTACHMENT_INFO &fb_info = dev_data->frameBufferMap[pRenderPassBegin->framebuffer].attachments[i]; + if (renderPass->attachments[i].load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) { + std::function function = [=]() { + set_memory_valid(dev_data, fb_info.mem, true, fb_info.image); + return false; + }; + pCB->validate_functions.push_back(function); + } else if (renderPass->attachments[i].load_op == VK_ATTACHMENT_LOAD_OP_DONT_CARE) { + std::function function = [=]() { + set_memory_valid(dev_data, fb_info.mem, false, fb_info.image); + return false; + }; + pCB->validate_functions.push_back(function); + } else if (renderPass->attachments[i].load_op == VK_ATTACHMENT_LOAD_OP_LOAD) { + std::function function = [=]() { + return validate_memory_is_valid(dev_data, fb_info.mem, "vkCmdBeginRenderPass()", fb_info.image); + }; + pCB->validate_functions.push_back(function); + } + if (renderPass->attachment_first_read[renderPass->attachments[i].attachment]) { + std::function function = [=]() { + return validate_memory_is_valid(dev_data, fb_info.mem, "vkCmdBeginRenderPass()", fb_info.image); + }; + pCB->validate_functions.push_back(function); } } #endif skipCall |= VerifyRenderAreaBounds(dev_data, pRenderPassBegin); skipCall |= VerifyFramebufferAndRenderPassLayouts(commandBuffer, pRenderPassBegin); skipCall |= insideRenderPass(dev_data, pCB, "vkCmdBeginRenderPass"); - auto render_pass_data = dev_data->renderPassMap.find(pRenderPassBegin->renderPass); - if (render_pass_data != dev_data->renderPassMap.end()) { - skipCall |= ValidateDependencies(dev_data, pRenderPassBegin, render_pass_data->second->subpassToNode); - pCB->activeRenderPass = render_pass_data->second; - } - else { - pCB->activeRenderPass = nullptr; + if (renderPass) { + skipCall |= ValidateDependencies(dev_data, pRenderPassBegin, renderPass); } + pCB->activeRenderPass = renderPass; skipCall |= validatePrimaryCommandBuffer(dev_data, pCB, "vkCmdBeginRenderPass"); skipCall |= addCmd(dev_data, pCB, CMD_BEGINRENDERPASS, "vkCmdBeginRenderPass()"); // This is a shallow copy as that is all that is needed for now @@ -8908,8 +8909,8 @@ CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *p dev_data->frameBufferMap[pRenderPassBegin->framebuffer].referencingCmdBuffers.insert(pCB->commandBuffer); } else { skipCall |= - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, - DRAWSTATE_INVALID_RENDERPASS, "DS", "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()"); + log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, + DRAWSTATE_INVALID_RENDERPASS, "DS", "You cannot use a NULL RenderPass object in vkCmdBeginRenderPass()"); } } lock.unlock(); @@ -9089,9 +9090,9 @@ static bool validateRenderPassCompatibility(layer_data *dev_data, VkCommandBuffe // Early exit if renderPass objects are identical (and therefore compatible) if (primaryPass == secondaryPass) return skip_call; - auto primary_data = dev_data->renderPassMap.find(primaryPass); - auto secondary_data = dev_data->renderPassMap.find(secondaryPass); - if (primary_data == dev_data->renderPassMap.end() || primary_data->second == nullptr) { + auto primary_render_pass = getRenderPass(dev_data, primaryPass); + auto secondary_render_pass = getRenderPass(dev_data, secondaryPass); + if (!primary_render_pass) { skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, DRAWSTATE_INVALID_SECONDARY_COMMAND_BUFFER, "DS", @@ -9099,7 +9100,7 @@ static bool validateRenderPassCompatibility(layer_data *dev_data, VkCommandBuffe (void *)primaryBuffer, (uint64_t)(primaryPass)); return skip_call; } - if (secondary_data == dev_data->renderPassMap.end() || secondary_data->second == nullptr) { + if (!secondary_render_pass) { skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, DRAWSTATE_INVALID_SECONDARY_COMMAND_BUFFER, "DS", @@ -9107,7 +9108,7 @@ static bool validateRenderPassCompatibility(layer_data *dev_data, VkCommandBuffe (void *)secondaryBuffer, (uint64_t)(secondaryPass)); return skip_call; } - if (primary_data->second->pCreateInfo->subpassCount != secondary_data->second->pCreateInfo->subpassCount) { + if (primary_render_pass->pCreateInfo->subpassCount != secondary_render_pass->pCreateInfo->subpassCount) { skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, DRAWSTATE_INVALID_SECONDARY_COMMAND_BUFFER, "DS", "vkCmdExecuteCommands() called w/ invalid Cmd Buffer 0x%p which has a render pass 0x%" PRIx64 @@ -9116,10 +9117,10 @@ static bool validateRenderPassCompatibility(layer_data *dev_data, VkCommandBuffe (void *)secondaryBuffer, (uint64_t)(secondaryPass), (uint64_t)(primaryPass)); return skip_call; } - bool is_multi = primary_data->second->pCreateInfo->subpassCount > 1; - for (uint32_t i = 0; i < primary_data->second->pCreateInfo->subpassCount; ++i) { - skip_call |= - validateSubpassCompatibility(dev_data, primaryBuffer, primary_data->second, secondaryBuffer, secondary_data->second, i, is_multi); + auto subpassCount = primary_render_pass->pCreateInfo->subpassCount; + for (uint32_t i = 0; i < subpassCount; ++i) { + skip_call |= validateSubpassCompatibility(dev_data, primaryBuffer, primary_render_pass, secondaryBuffer, + secondary_render_pass, i, subpassCount > 1); } return skip_call; } -- cgit v1.2.3 From c8dc800e4aaeeb14a65822eb379740835c88daf2 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Tue, 17 May 2016 14:59:22 +1200 Subject: layers: Simplify CmdEndRenderPass Signed-off-by: Chris Forbes --- layers/core_validation.cpp | 46 +++++++++++++++++++++------------------------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 6a4e3576..782ab3e5 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -8941,38 +8941,34 @@ VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) { bool skipCall = false; layer_data *dev_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); std::unique_lock lock(global_lock); - auto cb_data = dev_data->commandBufferMap.find(commandBuffer); - if (cb_data != dev_data->commandBufferMap.end()) { - RENDER_PASS_NODE* pRPNode = cb_data->second->activeRenderPass; + auto pCB = getCBNode(dev_data, commandBuffer); + if (pCB) { + RENDER_PASS_NODE* pRPNode = pCB->activeRenderPass; if (pRPNode) { for (size_t i = 0; i < pRPNode->attachments.size(); ++i) { - MT_FB_ATTACHMENT_INFO &fb_info = dev_data->frameBufferMap[cb_data->second->activeFramebuffer].attachments[i]; + MT_FB_ATTACHMENT_INFO &fb_info = dev_data->frameBufferMap[pCB->activeFramebuffer].attachments[i]; if (pRPNode->attachments[i].store_op == VK_ATTACHMENT_STORE_OP_STORE) { - if (cb_data != dev_data->commandBufferMap.end()) { - std::function function = [=]() { - set_memory_valid(dev_data, fb_info.mem, true, fb_info.image); - return false; - }; - cb_data->second->validate_functions.push_back(function); - } + std::function function = [=]() { + set_memory_valid(dev_data, fb_info.mem, true, fb_info.image); + return false; + }; + pCB->validate_functions.push_back(function); } else if (pRPNode->attachments[i].store_op == VK_ATTACHMENT_STORE_OP_DONT_CARE) { - if (cb_data != dev_data->commandBufferMap.end()) { - std::function function = [=]() { - set_memory_valid(dev_data, fb_info.mem, false, fb_info.image); - return false; - }; - cb_data->second->validate_functions.push_back(function); - } + std::function function = [=]() { + set_memory_valid(dev_data, fb_info.mem, false, fb_info.image); + return false; + }; + pCB->validate_functions.push_back(function); } } } - skipCall |= outsideRenderPass(dev_data, cb_data->second, "vkCmdEndRenderpass"); - skipCall |= validatePrimaryCommandBuffer(dev_data, cb_data->second, "vkCmdEndRenderPass"); - skipCall |= addCmd(dev_data, cb_data->second, CMD_ENDRENDERPASS, "vkCmdEndRenderPass()"); - TransitionFinalSubpassLayouts(commandBuffer, &cb_data->second->activeRenderPassBeginInfo); - cb_data->second->activeRenderPass = nullptr; - cb_data->second->activeSubpass = 0; - cb_data->second->activeFramebuffer = VK_NULL_HANDLE; + skipCall |= outsideRenderPass(dev_data, pCB, "vkCmdEndRenderpass"); + skipCall |= validatePrimaryCommandBuffer(dev_data, pCB, "vkCmdEndRenderPass"); + skipCall |= addCmd(dev_data, pCB, CMD_ENDRENDERPASS, "vkCmdEndRenderPass()"); + TransitionFinalSubpassLayouts(commandBuffer, &pCB->activeRenderPassBeginInfo); + pCB->activeRenderPass = nullptr; + pCB->activeSubpass = 0; + pCB->activeFramebuffer = VK_NULL_HANDLE; } lock.unlock(); if (!skipCall) -- cgit v1.2.3 From 2d2af8c6299282d561e7e6815de5d36f44388f46 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Tue, 17 May 2016 15:27:58 +1200 Subject: layers: Add getFramebuffer() helper Signed-off-by: Chris Forbes --- layers/core_validation.cpp | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 782ab3e5..e64578b8 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -1981,6 +1981,14 @@ static RENDER_PASS_NODE *getRenderPass(layer_data const *my_data, VkRenderPass r return it->second; } +static FRAMEBUFFER_NODE *getFramebuffer(layer_data *my_data, VkFramebuffer framebuffer) { + auto it = my_data->frameBufferMap.find(framebuffer); + if (it == my_data->frameBufferMap.end()) { + return nullptr; + } + return &it->second; +} + // Return true if for a given PSO, the given state enum is dynamic, else return false static bool isDynamic(const PIPELINE_NODE *pPipeline, const VkDynamicState state) { if (pPipeline && pPipeline->graphicsPipelineCI.pDynamicState) { @@ -3756,10 +3764,9 @@ static void resetCB(layer_data *dev_data, const VkCommandBuffer cb) { // Remove this cmdBuffer's reference from each FrameBuffer's CB ref list for (auto framebuffer : pCB->framebuffers) { - auto fbNode = dev_data->frameBufferMap.find(framebuffer); - if (fbNode != dev_data->frameBufferMap.end()) { - fbNode->second.referencingCmdBuffers.erase(pCB->commandBuffer); - } + auto fbNode = getFramebuffer(dev_data, framebuffer); + if (fbNode) + fbNode->referencingCmdBuffers.erase(pCB->commandBuffer); } pCB->framebuffers.clear(); pCB->activeFramebuffer = VK_NULL_HANDLE; @@ -6154,9 +6161,9 @@ BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo reinterpret_cast(commandBuffer)); } else { string errorString = ""; - auto fbNode = dev_data->frameBufferMap.find(pInfo->framebuffer); - if (fbNode != dev_data->frameBufferMap.end()) { - VkRenderPass fbRP = fbNode->second.createInfo.renderPass; + auto framebuffer = getFramebuffer(dev_data, pInfo->framebuffer); + if (framebuffer) { + VkRenderPass fbRP = framebuffer->createInfo.renderPass; if (!verify_renderpass_compatibility(dev_data, fbRP, pInfo->renderPass, errorString)) { // renderPass that framebuffer was created with must be compatible with local renderPass skipCall |= @@ -6170,7 +6177,7 @@ BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo (uint64_t)(pInfo->framebuffer), (uint64_t)(fbRP), errorString.c_str()); } // Connect this framebuffer to this cmdBuffer - fbNode->second.referencingCmdBuffers.insert(pCB->commandBuffer); + framebuffer->referencingCmdBuffers.insert(pCB->commandBuffer); } } } @@ -8258,10 +8265,10 @@ bool isRegionOverlapping(VkImageSubresourceRange range1, VkImageSubresourceRange isRangeOverlapping(range1.baseArrayLayer, range1.layerCount, range2.baseArrayLayer, range2.layerCount)); } -static bool ValidateDependencies(const layer_data *my_data, const VkRenderPassBeginInfo *pRenderPassBegin, +static bool ValidateDependencies(const layer_data *my_data, FRAMEBUFFER_NODE const * framebuffer, RENDER_PASS_NODE const * renderPass) { bool skip_call = false; - const VkFramebufferCreateInfo *pFramebufferInfo = &my_data->frameBufferMap.at(pRenderPassBegin->framebuffer).createInfo; + const VkFramebufferCreateInfo *pFramebufferInfo = &framebuffer->createInfo; const VkRenderPassCreateInfo *pCreateInfo = renderPass->pCreateInfo; auto const & subpass_to_node = renderPass->subpassToNode; std::vector> output_attachment_to_subpass(pCreateInfo->attachmentCount); @@ -8814,9 +8821,7 @@ static bool validatePrimaryCommandBuffer(const layer_data *my_data, const GLOBAL return skip_call; } -static void TransitionFinalSubpassLayouts(VkCommandBuffer cmdBuffer, const VkRenderPassBeginInfo *pRenderPassBegin) { - layer_data *dev_data = get_my_data_ptr(get_dispatch_key(cmdBuffer), layer_data_map); - GLOBAL_CB_NODE *pCB = getCBNode(dev_data, cmdBuffer); +static void TransitionFinalSubpassLayouts(layer_data *dev_data, GLOBAL_CB_NODE *pCB, const VkRenderPassBeginInfo *pRenderPassBegin) { auto renderPass = getRenderPass(dev_data, pRenderPassBegin->renderPass); if (!renderPass) return; @@ -8859,12 +8864,13 @@ CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *p std::unique_lock lock(global_lock); GLOBAL_CB_NODE *pCB = getCBNode(dev_data, commandBuffer); auto renderPass = pRenderPassBegin ? getRenderPass(dev_data, pRenderPassBegin->renderPass) : nullptr; + auto framebuffer = pRenderPassBegin ? getFramebuffer(dev_data, pRenderPassBegin->framebuffer) : nullptr; if (pCB) { if (renderPass) { #if MTMERGE pCB->activeFramebuffer = pRenderPassBegin->framebuffer; for (size_t i = 0; i < renderPass->attachments.size(); ++i) { - MT_FB_ATTACHMENT_INFO &fb_info = dev_data->frameBufferMap[pRenderPassBegin->framebuffer].attachments[i]; + MT_FB_ATTACHMENT_INFO &fb_info = framebuffer->attachments[i]; if (renderPass->attachments[i].load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) { std::function function = [=]() { set_memory_valid(dev_data, fb_info.mem, true, fb_info.image); @@ -8895,7 +8901,7 @@ CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *p skipCall |= VerifyFramebufferAndRenderPassLayouts(commandBuffer, pRenderPassBegin); skipCall |= insideRenderPass(dev_data, pCB, "vkCmdBeginRenderPass"); if (renderPass) { - skipCall |= ValidateDependencies(dev_data, pRenderPassBegin, renderPass); + skipCall |= ValidateDependencies(dev_data, framebuffer, renderPass); } pCB->activeRenderPass = renderPass; skipCall |= validatePrimaryCommandBuffer(dev_data, pCB, "vkCmdBeginRenderPass"); @@ -8965,7 +8971,7 @@ VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) { skipCall |= outsideRenderPass(dev_data, pCB, "vkCmdEndRenderpass"); skipCall |= validatePrimaryCommandBuffer(dev_data, pCB, "vkCmdEndRenderPass"); skipCall |= addCmd(dev_data, pCB, CMD_ENDRENDERPASS, "vkCmdEndRenderPass()"); - TransitionFinalSubpassLayouts(commandBuffer, &pCB->activeRenderPassBeginInfo); + TransitionFinalSubpassLayouts(dev_data, pCB, &pCB->activeRenderPassBeginInfo); pCB->activeRenderPass = nullptr; pCB->activeSubpass = 0; pCB->activeFramebuffer = VK_NULL_HANDLE; -- cgit v1.2.3 From 75a872d3d227876a0b35857043b86017f5b98c4d Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Tue, 17 May 2016 15:31:00 +1200 Subject: layers: simplify TransitionSubpassLayouts Signed-off-by: Chris Forbes --- layers/core_validation.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index e64578b8..14a05f18 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -8783,10 +8783,8 @@ static bool VerifyFramebufferAndRenderPassLayouts(VkCommandBuffer cmdBuffer, con return skip_call; } -static void TransitionSubpassLayouts(VkCommandBuffer cmdBuffer, const VkRenderPassBeginInfo *pRenderPassBegin, +static void TransitionSubpassLayouts(layer_data *dev_data, GLOBAL_CB_NODE *pCB, const VkRenderPassBeginInfo *pRenderPassBegin, const int subpass_index) { - layer_data *dev_data = get_my_data_ptr(get_dispatch_key(cmdBuffer), layer_data_map); - GLOBAL_CB_NODE *pCB = getCBNode(dev_data, cmdBuffer); auto renderPass = getRenderPass(dev_data, pRenderPassBegin->renderPass); if (!renderPass) return; @@ -8935,7 +8933,7 @@ VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpa skipCall |= addCmd(dev_data, pCB, CMD_NEXTSUBPASS, "vkCmdNextSubpass()"); pCB->activeSubpass++; pCB->activeSubpassContents = contents; - TransitionSubpassLayouts(commandBuffer, &pCB->activeRenderPassBeginInfo, pCB->activeSubpass); + TransitionSubpassLayouts(dev_data, pCB, &pCB->activeRenderPassBeginInfo, pCB->activeSubpass); skipCall |= outsideRenderPass(dev_data, pCB, "vkCmdNextSubpass"); } lock.unlock(); -- cgit v1.2.3 From 339cb923b4a23a746d60d73a9624843362c4d0ec Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Tue, 17 May 2016 15:45:31 +1200 Subject: use getFramebuffer more Signed-off-by: Chris Forbes --- layers/core_validation.cpp | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 14a05f18..739398d1 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -8738,10 +8738,8 @@ static void deleteRenderPasses(layer_data *my_data) { my_data->renderPassMap.clear(); } -static bool VerifyFramebufferAndRenderPassLayouts(VkCommandBuffer cmdBuffer, const VkRenderPassBeginInfo *pRenderPassBegin) { +static bool VerifyFramebufferAndRenderPassLayouts(layer_data *dev_data, GLOBAL_CB_NODE *pCB, const VkRenderPassBeginInfo *pRenderPassBegin) { bool skip_call = false; - layer_data *dev_data = get_my_data_ptr(get_dispatch_key(cmdBuffer), layer_data_map); - GLOBAL_CB_NODE *pCB = getCBNode(dev_data, cmdBuffer); const VkRenderPassCreateInfo *pRenderPassInfo = dev_data->renderPassMap[pRenderPassBegin->renderPass]->pCreateInfo; const VkFramebufferCreateInfo framebufferInfo = dev_data->frameBufferMap[pRenderPassBegin->framebuffer].createInfo; if (pRenderPassInfo->attachmentCount != framebufferInfo.attachmentCount) { @@ -8789,11 +8787,11 @@ static void TransitionSubpassLayouts(layer_data *dev_data, GLOBAL_CB_NODE *pCB, if (!renderPass) return; - auto framebuffer_data = dev_data->frameBufferMap.find(pRenderPassBegin->framebuffer); - if (framebuffer_data == dev_data->frameBufferMap.end()) { + auto framebuffer = getFramebuffer(dev_data, pRenderPassBegin->framebuffer); + if (!framebuffer) return; - } - const VkFramebufferCreateInfo framebufferInfo = framebuffer_data->second.createInfo; + + const VkFramebufferCreateInfo &framebufferInfo = framebuffer->createInfo; const VkSubpassDescription &subpass = renderPass->pCreateInfo->pSubpasses[subpass_index]; for (uint32_t j = 0; j < subpass.inputAttachmentCount; ++j) { const VkImageView &image_view = framebufferInfo.pAttachments[subpass.pInputAttachments[j].attachment]; @@ -8825,13 +8823,12 @@ static void TransitionFinalSubpassLayouts(layer_data *dev_data, GLOBAL_CB_NODE * return; const VkRenderPassCreateInfo *pRenderPassInfo = renderPass->pCreateInfo; - auto framebuffer_data = dev_data->frameBufferMap.find(pRenderPassBegin->framebuffer); - if (framebuffer_data == dev_data->frameBufferMap.end()) { + auto framebuffer = getFramebuffer(dev_data, pRenderPassBegin->framebuffer); + if (!framebuffer) return; - } - const VkFramebufferCreateInfo framebufferInfo = framebuffer_data->second.createInfo; + for (uint32_t i = 0; i < pRenderPassInfo->attachmentCount; ++i) { - const VkImageView &image_view = framebufferInfo.pAttachments[i]; + const VkImageView &image_view = framebuffer->createInfo.pAttachments[i]; SetLayout(dev_data, pCB, image_view, pRenderPassInfo->pAttachments[i].finalLayout); } } @@ -8896,7 +8893,7 @@ CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *p } #endif skipCall |= VerifyRenderAreaBounds(dev_data, pRenderPassBegin); - skipCall |= VerifyFramebufferAndRenderPassLayouts(commandBuffer, pRenderPassBegin); + skipCall |= VerifyFramebufferAndRenderPassLayouts(dev_data, pCB, pRenderPassBegin); skipCall |= insideRenderPass(dev_data, pCB, "vkCmdBeginRenderPass"); if (renderPass) { skipCall |= ValidateDependencies(dev_data, framebuffer, renderPass); @@ -8910,7 +8907,7 @@ CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *p pCB->activeSubpassContents = contents; pCB->framebuffers.insert(pRenderPassBegin->framebuffer); // Connect this framebuffer to this cmdBuffer - dev_data->frameBufferMap[pRenderPassBegin->framebuffer].referencingCmdBuffers.insert(pCB->commandBuffer); + framebuffer->referencingCmdBuffers.insert(pCB->commandBuffer); } else { skipCall |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, @@ -8948,9 +8945,10 @@ VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) { auto pCB = getCBNode(dev_data, commandBuffer); if (pCB) { RENDER_PASS_NODE* pRPNode = pCB->activeRenderPass; + auto framebuffer = getFramebuffer(dev_data, pCB->activeFramebuffer); if (pRPNode) { for (size_t i = 0; i < pRPNode->attachments.size(); ++i) { - MT_FB_ATTACHMENT_INFO &fb_info = dev_data->frameBufferMap[pCB->activeFramebuffer].attachments[i]; + MT_FB_ATTACHMENT_INFO &fb_info = framebuffer->attachments[i]; if (pRPNode->attachments[i].store_op == VK_ATTACHMENT_STORE_OP_STORE) { std::function function = [=]() { set_memory_valid(dev_data, fb_info.mem, true, fb_info.image); @@ -9141,8 +9139,8 @@ static bool validateFramebuffer(layer_data *dev_data, VkCommandBuffer primaryBuf " that is not compatible with the current framebuffer 0x%" PRIx64 ".", (void *)secondaryBuffer, (uint64_t)(secondary_fb), (uint64_t)(primary_fb)); } - auto fb_data = dev_data->frameBufferMap.find(secondary_fb); - if (fb_data == dev_data->frameBufferMap.end()) { + auto fb = getFramebuffer(dev_data, secondary_fb); + if (!fb) { skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, DRAWSTATE_INVALID_SECONDARY_COMMAND_BUFFER, "DS", "vkCmdExecuteCommands() called w/ invalid Cmd Buffer 0x%p " @@ -9150,7 +9148,7 @@ static bool validateFramebuffer(layer_data *dev_data, VkCommandBuffer primaryBuf (void *)secondaryBuffer, (uint64_t)(secondary_fb)); return skip_call; } - skip_call |= validateRenderPassCompatibility(dev_data, secondaryBuffer, fb_data->second.createInfo.renderPass, + skip_call |= validateRenderPassCompatibility(dev_data, secondaryBuffer, fb->createInfo.renderPass, secondaryBuffer, pSubCB->beginInfo.pInheritanceInfo->renderPass); } return skip_call; -- cgit v1.2.3 From d2769d64be84e67a93a0df1503b4ea44c3d56f6b Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Tue, 17 May 2016 17:42:27 +1200 Subject: layers: More slight tidying Signed-off-by: Chris Forbes --- layers/core_validation.cpp | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 739398d1..4e584493 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -4104,10 +4104,8 @@ static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT // This validates that the initial layout specified in the command buffer for // the IMAGE is the same // as the global IMAGE layout -static bool ValidateCmdBufImageLayouts(VkCommandBuffer cmdBuffer) { +static bool ValidateCmdBufImageLayouts(layer_data *dev_data, GLOBAL_CB_NODE *pCB) { bool skip_call = false; - layer_data *dev_data = get_my_data_ptr(get_dispatch_key(cmdBuffer), layer_data_map); - GLOBAL_CB_NODE *pCB = getCBNode(dev_data, cmdBuffer); for (auto cb_image_data : pCB->imageLayoutMap) { VkImageLayout imageLayout; if (!FindLayout(dev_data, cb_image_data.first, imageLayout)) { @@ -4122,7 +4120,7 @@ static bool ValidateCmdBufImageLayouts(VkCommandBuffer cmdBuffer) { if (cb_image_data.first.hasSubresource) { skip_call |= log_msg( dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - reinterpret_cast(cmdBuffer), __LINE__, DRAWSTATE_INVALID_IMAGE_LAYOUT, "DS", + reinterpret_cast(pCB->commandBuffer), __LINE__, DRAWSTATE_INVALID_IMAGE_LAYOUT, "DS", "Cannot submit cmd buffer using image (0x%" PRIx64 ") [sub-resource: aspectMask 0x%X array layer %u, mip level %u], " "with layout %s when first use is %s.", reinterpret_cast(cb_image_data.first.image), cb_image_data.first.subresource.aspectMask, @@ -4132,7 +4130,7 @@ static bool ValidateCmdBufImageLayouts(VkCommandBuffer cmdBuffer) { } else { skip_call |= log_msg( dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, - reinterpret_cast(cmdBuffer), __LINE__, DRAWSTATE_INVALID_IMAGE_LAYOUT, "DS", + reinterpret_cast(pCB->commandBuffer), __LINE__, DRAWSTATE_INVALID_IMAGE_LAYOUT, "DS", "Cannot submit cmd buffer using image (0x%" PRIx64 ") with layout %s when " "first use is %s.", reinterpret_cast(cb_image_data.first.image), string_VkImageLayout(imageLayout), @@ -4552,7 +4550,6 @@ static bool validatePrimaryCommandBufferState(layer_data *dev_data, GLOBAL_CB_NO VKAPI_ATTR VkResult VKAPI_CALL QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) { bool skipCall = false; - GLOBAL_CB_NODE *pCBNode = NULL; layer_data *dev_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map); VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; std::unique_lock lock(global_lock); @@ -4619,8 +4616,8 @@ QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, V } } for (uint32_t i = 0; i < submit->commandBufferCount; i++) { - skipCall |= ValidateCmdBufImageLayouts(submit->pCommandBuffers[i]); - pCBNode = getCBNode(dev_data, submit->pCommandBuffers[i]); + auto pCBNode = getCBNode(dev_data, submit->pCommandBuffers[i]); + skipCall |= ValidateCmdBufImageLayouts(dev_data, pCBNode); if (pCBNode) { pCBNode->semaphores = semaphoreList; pCBNode->submitCount++; // increment submit count @@ -4952,10 +4949,9 @@ VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool VkQueryResultFlags flags) { layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); unordered_map> queriesInFlight; - GLOBAL_CB_NODE *pCB = nullptr; std::unique_lock lock(global_lock); for (auto cmdBuffer : dev_data->globalInFlightCmdBuffers) { - pCB = getCBNode(dev_data, cmdBuffer); + auto pCB = getCBNode(dev_data, cmdBuffer); for (auto queryStatePair : pCB->queryToStateMap) { queriesInFlight[queryStatePair.first].push_back(cmdBuffer); } @@ -4970,7 +4966,7 @@ VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool if (queryElement != queriesInFlight.end() && queryToStateElement != dev_data->queryToStateMap.end() && queryToStateElement->second) { for (auto cmdBuffer : queryElement->second) { - pCB = getCBNode(dev_data, cmdBuffer); + auto pCB = getCBNode(dev_data, cmdBuffer); auto queryEventElement = pCB->waitedEventsBeforeQueryReset.find(query); if (queryEventElement == pCB->waitedEventsBeforeQueryReset.end()) { skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, @@ -4989,7 +4985,7 @@ VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool // TODO : Can there be the same query in use by multiple command buffers in flight? bool make_available = false; for (auto cmdBuffer : queryElement->second) { - pCB = getCBNode(dev_data, cmdBuffer); + auto pCB = getCBNode(dev_data, cmdBuffer); make_available |= pCB->queryToStateMap[query]; } if (!(((flags & VK_QUERY_RESULT_PARTIAL_BIT) || (flags & VK_QUERY_RESULT_WAIT_BIT)) && make_available)) { -- cgit v1.2.3 From e4c92d5ab6ea4b6a36f4d142698da5cabaee154b Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Tue, 17 May 2016 18:47:09 +1200 Subject: layers: Simplify command buffer pool cleanup We don't need to carefully pick through the pool's buffers, removing them. We're about to throw away the whole container. Signed-off-by: Chris Forbes --- layers/core_validation.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 4e584493..6e05d480 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -5386,15 +5386,13 @@ DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocatio // Verify that command buffers in pool are complete (not in-flight) VkBool32 result = checkAndClearCommandBuffersInFlight(dev_data, commandPool, "destroy command pool with"); // Must remove cmdpool from cmdpoolmap, after removing all cmdbuffers in its list from the commandPoolMap - if (dev_data->commandPoolMap.find(commandPool) != dev_data->commandPoolMap.end()) { - for (auto poolCb = dev_data->commandPoolMap[commandPool].commandBuffers.begin(); - poolCb != dev_data->commandPoolMap[commandPool].commandBuffers.end();) { - clear_cmd_buf_and_mem_references(dev_data, *poolCb); - auto del_cb = dev_data->commandBufferMap.find(*poolCb); - delete (*del_cb).second; // delete CB info structure + auto pool_it = dev_data->commandPoolMap.find(commandPool); + if (pool_it != dev_data->commandPoolMap.end()) { + for (auto cb : pool_it->second.commandBuffers) { + clear_cmd_buf_and_mem_references(dev_data, cb); + auto del_cb = dev_data->commandBufferMap.find(cb); + delete del_cb->second; // delete CB info structure dev_data->commandBufferMap.erase(del_cb); // Remove this command buffer - poolCb = dev_data->commandPoolMap[commandPool].commandBuffers.erase( - poolCb); // Remove CB reference from commandPoolMap's list } } dev_data->commandPoolMap.erase(commandPool); -- cgit v1.2.3 From 6a453186cfb005b0b71ebb802fb1fae3bae327fa Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Tue, 17 May 2016 08:01:41 -0600 Subject: layers: Migrate types from core_validation.h This change just moves a few types from core_validation.h to core_validation_types.h. This is preparation for migrating DescriptorSet class to store GLOBAL_CB_NODE ptrs directly. --- layers/core_validation_types.h | 1 + 1 file changed, 1 insertion(+) diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index 6269f146..98fa5a8f 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -353,6 +353,7 @@ template <> struct hash { } }; } + // Track last states that are bound per pipeline bind point (Gfx & Compute) struct LAST_BOUND_STATE { VkPipeline pipeline; -- cgit v1.2.3 From 8ac68a5c55f9662b74db3826f97aa2f28d21503f Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Wed, 18 May 2016 13:43:26 -0600 Subject: layers: Refactor DescriptorSet update interface Mainly refactor and moving code in order to provide an interface to DescriptorSet class that matches top-level vkUpdateDescriptorSets() function. Split the validation of an update as a separate task from performing the update. This allows validation prior to calling down the chain and then only update the state if validation is clean. Hoisted all of the update validation into the DescriptorSet class which prevents having to copy all of the maps into the individual Descriptor classes. This simplifies both their creation and updating their contents. Updated the top-level core_validation UpdateDescriptorSets() code to match Vulkan Validation Layer Authoring Guidelines. As this is an initial POC for the architecture, I kept the Pre* & Post* functions in the core_validation.cpp file, but they should eventually be spun out. --- layers/core_validation.cpp | 94 +++---- layers/descriptor_sets.cpp | 674 ++++++++++++++++++++++++++------------------- layers/descriptor_sets.h | 90 +++--- 3 files changed, 467 insertions(+), 391 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 6e05d480..cd9388ae 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -3407,65 +3407,6 @@ static bool validateIdleDescriptorSet(const layer_data *my_data, VkDescriptorSet } return skip_call; } -// update DS mappings based on write and copy update arrays -static bool dsUpdate(layer_data *my_data, VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pWDS, - uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pCDS) { - bool skip_call = false; - // Validate Write updates - uint32_t i = 0; - for (i = 0; i < descriptorWriteCount; i++) { - auto dest_set = pWDS[i].dstSet; - auto set_pair = my_data->setMap.find(dest_set); - if (set_pair == my_data->setMap.end()) { - skip_call |= - log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, - reinterpret_cast(dest_set), __LINE__, DRAWSTATE_DOUBLE_DESTROY, "DS", - "Cannot call vkUpdateDescriptorSets() on descriptor set 0x%" PRIxLEAST64 " that has not been allocated.", - reinterpret_cast(dest_set)); - } else { - string error_str; - if (!set_pair->second->WriteUpdate(my_data->report_data, &pWDS[i], &error_str)) { - skip_call |= - log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, - reinterpret_cast(dest_set), __LINE__, DRAWSTATE_INVALID_UPDATE_INDEX, "DS", - "vkUpdateDescriptorsSets() failed write update for Descriptor Set 0x%" PRIx64 " with error: %s", - reinterpret_cast(dest_set), error_str.c_str()); - } - } - } - // Now validate copy updates - for (i = 0; i < descriptorCopyCount; ++i) { - auto dst_set = pCDS[i].dstSet; - auto src_set = pCDS[i].srcSet; - auto src_pair = my_data->setMap.find(src_set); - auto dst_pair = my_data->setMap.find(dst_set); - if (src_pair == my_data->setMap.end()) { - skip_call |= log_msg( - my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, - reinterpret_cast(src_set), __LINE__, DRAWSTATE_DOUBLE_DESTROY, "DS", - "Cannot call vkUpdateDescriptorSets() to copy from descriptor set 0x%" PRIxLEAST64 " that has not been allocated.", - reinterpret_cast(src_set)); - } else if (dst_pair == my_data->setMap.end()) { - skip_call |= log_msg( - my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, - reinterpret_cast(dst_set), __LINE__, DRAWSTATE_DOUBLE_DESTROY, "DS", - "Cannot call vkUpdateDescriptorSets() to copy to descriptor set 0x%" PRIxLEAST64 " that has not been allocated.", - reinterpret_cast(dst_set)); - } else { - std::string error_str; - if (!dst_pair->second->CopyUpdate(my_data->report_data, &pCDS[i], src_pair->second, &error_str)) { - skip_call |= - log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, - reinterpret_cast(dst_set), __LINE__, DRAWSTATE_INVALID_UPDATE_INDEX, "DS", - "vkUpdateDescriptorsSets() failed copy update from Descriptor Set 0x%" PRIx64 - " to Descriptor Set 0x%" PRIx64 " with error: %s", - reinterpret_cast(src_set), reinterpret_cast(dst_set), error_str.c_str()); - } - } - } - return skip_call; -} - // Verify that given pool has descriptors that are being requested for allocation. // NOTE : Calls to this function should be wrapped in mutex static bool validate_descriptor_availability_in_pool(layer_data *dev_data, DESCRIPTOR_POOL_NODE *pPoolNode, uint32_t count, @@ -6070,18 +6011,47 @@ FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t co // TODO : Any other clean-up or book-keeping to do here? return result; } +// TODO : This is a Proof-of-concept for core validation architecture +// Really we'll want to break out these functions to separate files but +// keeping it all together here to prove out design +// PreCallValidate* handles validating all of the state prior to calling down chain to UpdateDescriptorSets() +static bool PreCallValidateUpdateDescriptorSets(layer_data *dev_data, uint32_t descriptorWriteCount, + const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount, + const VkCopyDescriptorSet *pDescriptorCopies) { + // First thing to do is perform map look-ups. + // NOTE : UpdateDescriptorSets is somewhat unique in that it's operating on a number of DescriptorSets + // so we can't just do a single map look-up up-front, but do them individually in functions below + + // Now make call(s) that validate state, but don't perform state updates in this function + // Note, here DescriptorSets is unique in that we don't yet have an instance. Using a helper function in the + // namespace which will parse params and make calls into specific class instances + return cvdescriptorset::ValidateUpdateDescriptorSets(dev_data->report_data, dev_data->setMap, descriptorWriteCount, + pDescriptorWrites, descriptorCopyCount, pDescriptorCopies); +} +// PostCallRecord* handles recording state updates following call down chain to UpdateDescriptorSets() +static void PostCallRecordUpdateDescriptorSets(layer_data *dev_data, uint32_t descriptorWriteCount, + const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount, + const VkCopyDescriptorSet *pDescriptorCopies) { + cvdescriptorset::PerformUpdateDescriptorSets(dev_data->setMap, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, + pDescriptorCopies); +} VKAPI_ATTR void VKAPI_CALL UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pDescriptorCopies) { - // dsUpdate will return true only if a bailout error occurs, so we want to call down tree when update returns false + // Only map look-up at top level is for device-level layer_data layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); std::unique_lock lock(global_lock); - bool rtn = dsUpdate(dev_data, device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies); + bool skip_call = PreCallValidateUpdateDescriptorSets(dev_data, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, + pDescriptorCopies); lock.unlock(); - if (!rtn) { + if (!skip_call) { dev_data->device_dispatch_table->UpdateDescriptorSets(device, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies); + lock.lock(); + // Since UpdateDescriptorSets() is void, nothing to check prior to updating state + PostCallRecordUpdateDescriptorSets(dev_data, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, + pDescriptorCopies); } } diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index 1d9eed64..2955a6a3 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -280,9 +280,9 @@ cvdescriptorset::DescriptorSet::DescriptorSet(const VkDescriptorSet set, const D auto immut_sampler = p_layout_->GetImmutableSamplerPtrFromIndex(i); for (uint32_t di = 0; di < p_layout_->GetDescriptorCountFromIndex(i); ++di) { if (immut_sampler) - descriptors_.emplace_back(std::unique_ptr(new SamplerDescriptor(immut_sampler + di, sampler_map_))); + descriptors_.emplace_back(std::unique_ptr(new SamplerDescriptor(immut_sampler + di))); else - descriptors_.emplace_back(std::unique_ptr(new SamplerDescriptor(sampler_map_))); + descriptors_.emplace_back(std::unique_ptr(new SamplerDescriptor())); } break; } @@ -290,11 +290,9 @@ cvdescriptorset::DescriptorSet::DescriptorSet(const VkDescriptorSet set, const D auto immut = p_layout_->GetImmutableSamplerPtrFromIndex(i); for (uint32_t di = 0; di < p_layout_->GetDescriptorCountFromIndex(i); ++di) { if (immut) - descriptors_.emplace_back(std::unique_ptr(new ImageSamplerDescriptor( - immut + di, image_view_map_, image_map_, image_to_swapchain_map_, swapchain_map_, sampler_map_))); + descriptors_.emplace_back(std::unique_ptr(new ImageSamplerDescriptor(immut + di))); else - descriptors_.emplace_back(std::unique_ptr(new ImageSamplerDescriptor( - image_view_map_, image_map_, image_to_swapchain_map_, swapchain_map_, sampler_map_))); + descriptors_.emplace_back(std::unique_ptr(new ImageSamplerDescriptor())); } break; } @@ -303,20 +301,19 @@ cvdescriptorset::DescriptorSet::DescriptorSet(const VkDescriptorSet set, const D case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: for (uint32_t di = 0; di < p_layout_->GetDescriptorCountFromIndex(i); ++di) - descriptors_.emplace_back(std::unique_ptr( - new ImageDescriptor(type, image_view_map_, image_map_, image_to_swapchain_map_, swapchain_map_))); + descriptors_.emplace_back(std::unique_ptr(new ImageDescriptor(type))); break; case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: for (uint32_t di = 0; di < p_layout_->GetDescriptorCountFromIndex(i); ++di) - descriptors_.emplace_back(std::unique_ptr(new TexelDescriptor(type, buffer_view_map_))); + descriptors_.emplace_back(std::unique_ptr(new TexelDescriptor(type))); break; case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: for (uint32_t di = 0; di < p_layout_->GetDescriptorCountFromIndex(i); ++di) - descriptors_.emplace_back(std::unique_ptr(new BufferDescriptor(type, buffer_map_))); + descriptors_.emplace_back(std::unique_ptr(new BufferDescriptor(type))); break; default: assert(0); // Bad descriptor type specified @@ -468,74 +465,22 @@ void cvdescriptorset::DescriptorSet::InvalidateBoundCmdBuffers() { } } // Perform write update in given update struct -// If an error occurs, return false and fill in details in error_msg string -bool cvdescriptorset::DescriptorSet::WriteUpdate(debug_report_data *report_data, const VkWriteDescriptorSet *update, - std::string *error_msg) { +void cvdescriptorset::DescriptorSet::PerformWriteUpdate(const VkWriteDescriptorSet *update) { auto num_updates = 0; - // Verify idle ds - if (in_use.load()) { - std::stringstream error_str; - error_str << "Cannot call vkUpdateDescriptorSets() to perform write update on descriptor set " << set_ - << " that is in use by a command buffer."; - *error_msg = error_str.str(); - return false; - } - // Verify dst binding exists - if (!p_layout_->HasBinding(update->dstBinding)) { - std::stringstream error_str; - error_str << "DescriptorSet " << set_ << " does not have binding " << update->dstBinding << "."; - *error_msg = error_str.str(); - return false; - } else { - // We know that binding is valid, verify update and do update on each descriptor - auto start_idx = p_layout_->GetGlobalStartIndexFromBinding(update->dstBinding) + update->dstArrayElement; - auto type = p_layout_->GetTypeFromBinding(update->dstBinding); - if (type != update->descriptorType) { - std::stringstream error_str; - error_str << "Attempting write update to descriptor set " << set_ << " binding #" << update->dstBinding << " with type " - << string_VkDescriptorType(type) << " but update type is " << string_VkDescriptorType(update->descriptorType); - *error_msg = error_str.str(); - return false; - } - if ((start_idx + update->descriptorCount) > p_layout_->GetTotalDescriptorCount()) { - std::stringstream error_str; - error_str << "Attempting write update to descriptor set " << set_ << " binding #" << update->dstBinding << " with " - << p_layout_->GetTotalDescriptorCount() << " total descriptors but update of " << update->descriptorCount - << " descriptors starting at binding offset of " - << p_layout_->GetGlobalStartIndexFromBinding(update->dstBinding) - << " combined with update array element offset of " << update->dstArrayElement - << " oversteps the size of this descriptor set."; - *error_msg = error_str.str(); - return false; - } - // Verify consecutive bindings match (if needed) - if (!p_layout_->VerifyUpdateConsistency(update->dstBinding, update->dstArrayElement, update->descriptorCount, - "write update to", set_, error_msg)) - return false; - // Update is within bounds and consistent so perform update - for (uint32_t di = 0; di < update->descriptorCount; ++di) { - // TODO : Can we break this into a set-level "Validate" followed by Descriptor updating itself - // if the validate passes? That saves us all the map ptrs in each descriptor instance - if (!descriptors_[start_idx + di]->WriteUpdate(update, di, error_msg)) { - std::stringstream error_str; - error_str << "Write update to descriptor at global index " << start_idx + di << " within set " << set_ - << " binding #" << update->dstBinding << " failed with error message: " << error_msg->c_str(); - *error_msg = error_str.str(); - return false; - } - ++num_updates; - } + auto start_idx = p_layout_->GetGlobalStartIndexFromBinding(update->dstBinding) + update->dstArrayElement; + // perform update + for (uint32_t di = 0; di < update->descriptorCount; ++di) { + descriptors_[start_idx + di]->WriteUpdate(update, di); + ++num_updates; } if (num_updates != 0) { some_update_ = true; } InvalidateBoundCmdBuffers(); - return true; } -// Copy update -bool cvdescriptorset::DescriptorSet::CopyUpdate(debug_report_data *report_data, const VkCopyDescriptorSet *update, - const DescriptorSet *src_set, std::string *error) { - auto num_updates = 0; +// Validate Copy update +bool cvdescriptorset::DescriptorSet::ValidateCopyUpdate(const debug_report_data *report_data, const VkCopyDescriptorSet *update, + const DescriptorSet *src_set, std::string *error) { // Verify idle ds if (in_use.load()) { std::stringstream error_str; @@ -598,28 +543,34 @@ bool cvdescriptorset::DescriptorSet::CopyUpdate(debug_report_data *report_data, set_, error))) { return false; } + // Update parameters all look good so verify update contents + if (!VerifyCopyUpdateContents(update, src_set, src_start_idx, error)) + return false; + + // All checks passed so update is good + return true; +} +// Perform Copy update +void cvdescriptorset::DescriptorSet::PerformCopyUpdate(const VkCopyDescriptorSet *update, const DescriptorSet *src_set) { + auto num_updates = 0; + auto src_start_idx = src_set->GetGlobalStartIndexFromBinding(update->srcBinding) + update->srcArrayElement; + auto dst_start_idx = p_layout_->GetGlobalStartIndexFromBinding(update->dstBinding) + update->dstArrayElement; // Update parameters all look good so perform update for (uint32_t di = 0; di < update->descriptorCount; ++di) { - if (!descriptors_[dst_start_idx]->CopyUpdate(src_set->descriptors_[src_start_idx].get(), error)) - return false; + descriptors_[dst_start_idx + di]->CopyUpdate(src_set->descriptors_[src_start_idx + di].get()); ++num_updates; } if (num_updates != 0) { some_update_ = true; } InvalidateBoundCmdBuffers(); - return true; } -cvdescriptorset::SamplerDescriptor::SamplerDescriptor( - const std::unordered_map> *sampler_map) - : sampler_(VK_NULL_HANDLE), immutable_(false), sampler_map_(sampler_map) { +cvdescriptorset::SamplerDescriptor::SamplerDescriptor() : sampler_(VK_NULL_HANDLE), immutable_(false) { updated = false; descriptor_class = PlainSampler; }; -cvdescriptorset::SamplerDescriptor::SamplerDescriptor( - const VkSampler *immut, const std::unordered_map> *sampler_map) - : sampler_(VK_NULL_HANDLE), immutable_(false), sampler_map_(sampler_map) { +cvdescriptorset::SamplerDescriptor::SamplerDescriptor(const VkSampler *immut) : sampler_(VK_NULL_HANDLE), immutable_(false) { updated = false; descriptor_class = PlainSampler; if (immut) { @@ -726,75 +677,26 @@ bool cvdescriptorset::ValidateImageUpdate(const VkImageView image_view, const Vk } return true; } -bool cvdescriptorset::SamplerDescriptor::WriteUpdate(const VkWriteDescriptorSet *update, const uint32_t index, std::string *error) { - if (!immutable_) { - if (!ValidateSampler(update->pImageInfo[index].sampler, sampler_map_)) { - std::stringstream error_str; - error_str << "Attempted write update to sampler descriptor with invalid sampler: " << update->pImageInfo[index].sampler - << "."; - *error = error_str.str(); - return false; - } - sampler_ = update->pImageInfo[index].sampler; - } else { - if (!ValidateSampler(sampler_, sampler_map_)) { - std::stringstream error_str; - error_str << "Attempted write update to immutable sampler descriptor which has invalid immutable sampler: " << sampler_ - << "."; - *error = error_str.str(); - return false; - } - // TODO : Do we want a way to warn here in case of updating immutable sampler (which can't be updated)? - } +void cvdescriptorset::SamplerDescriptor::WriteUpdate(const VkWriteDescriptorSet *update, const uint32_t index) { + sampler_ = update->pImageInfo[index].sampler; updated = true; - return true; } -bool cvdescriptorset::SamplerDescriptor::CopyUpdate(const Descriptor *src, std::string *error) { +void cvdescriptorset::SamplerDescriptor::CopyUpdate(const Descriptor *src) { if (!immutable_) { auto update_sampler = static_cast(src)->sampler_; - if (!ValidateSampler(update_sampler, sampler_map_)) { - std::stringstream error_str; - error_str << "Attempted copy update to sampler descriptor with invalid sampler: " << update_sampler << "."; - *error = error_str.str(); - return false; - } sampler_ = update_sampler; - } else { - if (!ValidateSampler(sampler_, sampler_map_)) { - std::stringstream error_str; - error_str << "Attempted copy update to immutable sampler descriptor which has invalid immutable sampler: " << sampler_ - << "."; - *error = error_str.str(); - return false; - } - // TODO : Do we want a way to warn here in case of updating immutable sampler (which can't be updated)? } updated = true; - return true; } -cvdescriptorset::ImageSamplerDescriptor::ImageSamplerDescriptor( - const std::unordered_map *image_view_map, - const std::unordered_map *image_map, - const std::unordered_map *image_to_swapchain_map, - const std::unordered_map *swapchain_map, - const std::unordered_map> *sampler_map) - : sampler_(VK_NULL_HANDLE), immutable_(false), image_view_(VK_NULL_HANDLE), image_layout_(VK_IMAGE_LAYOUT_UNDEFINED), - sampler_map_(sampler_map), image_view_map_(image_view_map), image_map_(image_map), - image_to_swapchain_map_(image_to_swapchain_map), swapchain_map_(swapchain_map) { +cvdescriptorset::ImageSamplerDescriptor::ImageSamplerDescriptor() + : sampler_(VK_NULL_HANDLE), immutable_(false), image_view_(VK_NULL_HANDLE), image_layout_(VK_IMAGE_LAYOUT_UNDEFINED) { updated = false; descriptor_class = ImageSampler; } -cvdescriptorset::ImageSamplerDescriptor::ImageSamplerDescriptor( - const VkSampler *immut, const std::unordered_map *image_view_map, - const std::unordered_map *image_map, - const std::unordered_map *image_to_swapchain_map, - const std::unordered_map *swapchain_map, - const std::unordered_map> *sampler_map) - : sampler_(VK_NULL_HANDLE), immutable_(true), image_view_(VK_NULL_HANDLE), image_layout_(VK_IMAGE_LAYOUT_UNDEFINED), - sampler_map_(sampler_map), image_view_map_(image_view_map), image_map_(image_map), - image_to_swapchain_map_(image_to_swapchain_map), swapchain_map_(swapchain_map) { +cvdescriptorset::ImageSamplerDescriptor::ImageSamplerDescriptor(const VkSampler *immut) + : sampler_(VK_NULL_HANDLE), immutable_(true), image_view_(VK_NULL_HANDLE), image_layout_(VK_IMAGE_LAYOUT_UNDEFINED) { updated = false; descriptor_class = ImageSampler; if (immut) { @@ -803,134 +705,51 @@ cvdescriptorset::ImageSamplerDescriptor::ImageSamplerDescriptor( updated = true; } } -bool cvdescriptorset::ImageSamplerDescriptor::WriteUpdate(const VkWriteDescriptorSet *update, const uint32_t index, - std::string *error) { - // First check sampler - if (!immutable_) { - if (!ValidateSampler(update->pImageInfo[index].sampler, sampler_map_)) { - std::stringstream error_str; - error_str << "Attempted write update to combined image sampler descriptor with invalid sampler: " - << update->pImageInfo[index].sampler << "."; - *error = error_str.str(); - return false; - } - sampler_ = update->pImageInfo[index].sampler; - } else { - if (!ValidateSampler(sampler_, sampler_map_)) { - std::stringstream error_str; - error_str << "Attempted write update to combined image sampler descriptor with immutable sampler which has invalid " - "immutable sampler: " - << sampler_ << "."; - *error = error_str.str(); - return false; - } - // TODO : Do we want a way to warn here in case of updating immutable sampler (which can't be updated)? - } - // Now validate images - auto image_view = update->pImageInfo[index].imageView; - auto image_layout = update->pImageInfo[index].imageLayout; - if (!ValidateImageUpdate(image_view, image_layout, image_view_map_, image_map_, image_to_swapchain_map_, swapchain_map_, - error)) { - std::stringstream error_str; - error_str << "Attempted write update to combined image sampler descriptor failed due to: " << error->c_str(); - *error = error_str.str(); - return false; - } +void cvdescriptorset::ImageSamplerDescriptor::WriteUpdate(const VkWriteDescriptorSet *update, const uint32_t index) { updated = true; - image_view_ = image_view; - image_layout_ = image_layout; - return true; + auto image_info = update->pImageInfo[index]; + sampler_ = image_info.sampler; + image_view_ = image_info.imageView; + image_layout_ = image_info.imageLayout; } -bool cvdescriptorset::ImageSamplerDescriptor::CopyUpdate(const Descriptor *src, std::string *error) { +void cvdescriptorset::ImageSamplerDescriptor::CopyUpdate(const Descriptor *src) { if (!immutable_) { auto update_sampler = static_cast(src)->sampler_; - if (!ValidateSampler(update_sampler, sampler_map_)) { - std::stringstream error_str; - error_str << "Attempted copy update to combined image sampler descriptor with invalid sampler: " << update_sampler - << "."; - *error = error_str.str(); - return false; - } sampler_ = update_sampler; - } else { - if (!ValidateSampler(sampler_, sampler_map_)) { - std::stringstream error_str; - error_str << "Attempted copy update to combined image sampler descriptor with immutable sampler that has invalid " - "immutable sampler: " - << sampler_ << "."; - *error = error_str.str(); - return false; - } - // TODO : Do we want a way to warn here in case of updating immutable sampler (which can't be updated)? } - // Now validate images auto image_view = static_cast(src)->image_view_; auto image_layout = static_cast(src)->image_layout_; - if (!ValidateImageUpdate(image_view, image_layout, image_view_map_, image_map_, image_to_swapchain_map_, swapchain_map_, - error)) { - std::stringstream error_str; - error_str << "Attempted copy update to combined image sampler descriptor failed due to: " << error->c_str(); - *error = error_str.str(); - return false; - } updated = true; image_view_ = image_view; image_layout_ = image_layout; - return true; } -cvdescriptorset::ImageDescriptor::ImageDescriptor(const VkDescriptorType type, - const std::unordered_map *image_view_map, - const std::unordered_map *image_map, - const std::unordered_map *image_to_swapchain_map, - const std::unordered_map *swapchain_map) - : storage_(false), image_view_(VK_NULL_HANDLE), image_layout_(VK_IMAGE_LAYOUT_UNDEFINED), image_view_map_(image_view_map), - image_map_(image_map), image_to_swapchain_map_(image_to_swapchain_map), swapchain_map_(swapchain_map) { +cvdescriptorset::ImageDescriptor::ImageDescriptor(const VkDescriptorType type) + : storage_(false), image_view_(VK_NULL_HANDLE), image_layout_(VK_IMAGE_LAYOUT_UNDEFINED) { updated = false; descriptor_class = Image; if (VK_DESCRIPTOR_TYPE_STORAGE_IMAGE == type) storage_ = true; }; -bool cvdescriptorset::ImageDescriptor::WriteUpdate(const VkWriteDescriptorSet *update, const uint32_t index, std::string *error) { - // First validate that the write update is valid - auto image_view = update->pImageInfo[index].imageView; - auto image_layout = update->pImageInfo[index].imageLayout; - if (!ValidateImageUpdate(image_view, image_layout, image_view_map_, image_map_, image_to_swapchain_map_, swapchain_map_, - error)) { - std::stringstream error_str; - error_str << "Attempted write update to image descriptor failed due to: " << error->c_str(); - *error = error_str.str(); - return false; - } - // Update is clean so process it +void cvdescriptorset::ImageDescriptor::WriteUpdate(const VkWriteDescriptorSet *update, const uint32_t index) { updated = true; - image_view_ = image_view; - image_layout_ = image_layout; - return true; + auto image_info = update->pImageInfo[index]; + image_view_ = image_info.imageView; + image_layout_ = image_info.imageLayout; } -bool cvdescriptorset::ImageDescriptor::CopyUpdate(const Descriptor *src, std::string *error) { - // First validate update +void cvdescriptorset::ImageDescriptor::CopyUpdate(const Descriptor *src) { auto image_view = static_cast(src)->image_view_; auto image_layout = static_cast(src)->image_layout_; - if (!ValidateImageUpdate(image_view, image_layout, image_view_map_, image_map_, image_to_swapchain_map_, swapchain_map_, - error)) { - std::stringstream error_str; - error_str << "Attempted copy update to image descriptor failed due to: " << error->c_str(); - *error = error_str.str(); - return false; - } updated = true; image_view_ = image_view; image_layout_ = image_layout; - return true; } -cvdescriptorset::BufferDescriptor::BufferDescriptor(const VkDescriptorType type, - const std::unordered_map *buffer_map) - : storage_(false), dynamic_(false), buffer_(VK_NULL_HANDLE), offset_(0), range_(0), buffer_map_(buffer_map) { +cvdescriptorset::BufferDescriptor::BufferDescriptor(const VkDescriptorType type) + : storage_(false), dynamic_(false), buffer_(VK_NULL_HANDLE), offset_(0), range_(0) { updated = false; descriptor_class = GeneralBuffer; if (VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC == type) { @@ -942,70 +761,361 @@ cvdescriptorset::BufferDescriptor::BufferDescriptor(const VkDescriptorType type, storage_ = true; } } -bool cvdescriptorset::BufferDescriptor::WriteUpdate(const VkWriteDescriptorSet *update, const uint32_t index, std::string *error) { - // First validate bufferinfo - auto buffer = update->pBufferInfo[index].buffer; - if (!buffer_map_->count(buffer)) { - std::stringstream error_str; - error_str << "Attempted write update to buffer descriptor with invalid buffer: " << buffer; - *error = error_str.str(); - return false; - } +void cvdescriptorset::BufferDescriptor::WriteUpdate(const VkWriteDescriptorSet *update, const uint32_t index) { updated = true; - buffer_ = buffer; - offset_ = update->pBufferInfo[index].offset; - range_ = update->pBufferInfo[index].range; - return true; + auto buffer_info = update->pBufferInfo[index]; + buffer_ = buffer_info.buffer; + offset_ = buffer_info.offset; + range_ = buffer_info.range; } -bool cvdescriptorset::BufferDescriptor::CopyUpdate(const Descriptor *src, std::string *error) { - // First validate bufferinfo - auto buffer = static_cast(src)->buffer_; - if (!buffer_map_->count(buffer)) { - std::stringstream error_str; - error_str << "Attempted copy update to buffer descriptor with invalid buffer: " << buffer; - *error = error_str.str(); - return false; - } +void cvdescriptorset::BufferDescriptor::CopyUpdate(const Descriptor *src) { + auto buff_desc = static_cast(src); updated = true; - buffer_ = buffer; - offset_ = static_cast(src)->offset_; - range_ = static_cast(src)->range_; - return true; + buffer_ = buff_desc->buffer_; + offset_ = buff_desc->offset_; + range_ = buff_desc->range_; } -cvdescriptorset::TexelDescriptor::TexelDescriptor(const VkDescriptorType type, - const std::unordered_map *buffer_view_map) - : buffer_view_(VK_NULL_HANDLE), storage_(false), buffer_view_map_(buffer_view_map) { +cvdescriptorset::TexelDescriptor::TexelDescriptor(const VkDescriptorType type) : buffer_view_(VK_NULL_HANDLE), storage_(false) { updated = false; descriptor_class = TexelBuffer; if (VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER == type) storage_ = true; }; -bool cvdescriptorset::TexelDescriptor::WriteUpdate(const VkWriteDescriptorSet *update, const uint32_t index, std::string *error) { - // First validate buffer view - auto buffer_view = update->pTexelBufferView[index]; - if (!buffer_view_map_->count(buffer_view)) { - std::stringstream error_str; - error_str << "Attempted write update to texel buffer descriptor with invalid buffer view: " << buffer_view; - *error = error_str.str(); - return false; - } +void cvdescriptorset::TexelDescriptor::WriteUpdate(const VkWriteDescriptorSet *update, const uint32_t index) { updated = true; - buffer_view_ = buffer_view; - return true; + buffer_view_ = update->pTexelBufferView[index]; } -bool cvdescriptorset::TexelDescriptor::CopyUpdate(const Descriptor *src, std::string *error) { - // First validate buffer view - auto buffer_view = static_cast(src)->buffer_view_; - if (!buffer_view_map_->count(buffer_view)) { +void cvdescriptorset::TexelDescriptor::CopyUpdate(const Descriptor *src) { + updated = true; + buffer_view_ = static_cast(src)->buffer_view_; +} +// This is a helper function that iterates over a set of Write and Copy updates, pulls the DescriptorSet* for updated +// sets, and then calls their respective Validate[Write|Copy]Update functions. +// If the update hits an issue for which the callback returns "true", meaning that the call down the chain should +// be skipped, then true is returned. +// If there is no issue with the update, then false is returned. +bool cvdescriptorset::ValidateUpdateDescriptorSets( + const debug_report_data *report_data, const std::unordered_map &set_map, + const uint32_t write_count, const VkWriteDescriptorSet *p_wds, const uint32_t copy_count, const VkCopyDescriptorSet *p_cds) { + bool skip_call = false; + // Validate Write updates + uint32_t i = 0; + for (i = 0; i < write_count; i++) { + auto dest_set = p_wds[i].dstSet; + auto set_pair = set_map.find(dest_set); + if (set_pair == set_map.end()) { + skip_call |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, + reinterpret_cast(dest_set), __LINE__, DRAWSTATE_DOUBLE_DESTROY, "DS", + "Cannot call vkUpdateDescriptorSets() on descriptor set 0x%" PRIxLEAST64 " that has not been allocated.", + reinterpret_cast(dest_set)); + } else { + std::string error_str; + if (!set_pair->second->ValidateWriteUpdate(report_data, &p_wds[i], &error_str)) { + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, + reinterpret_cast(dest_set), __LINE__, DRAWSTATE_INVALID_UPDATE_INDEX, "DS", + "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x%" PRIx64 + " with error: %s", + reinterpret_cast(dest_set), error_str.c_str()); + } + } + } + // Now validate copy updates + for (i = 0; i < copy_count; ++i) { + auto dst_set = p_cds[i].dstSet; + auto src_set = p_cds[i].srcSet; + auto src_pair = set_map.find(src_set); + auto dst_pair = set_map.find(dst_set); + if (src_pair == set_map.end()) { + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, + reinterpret_cast(src_set), __LINE__, DRAWSTATE_DOUBLE_DESTROY, "DS", + "Cannot call vkUpdateDescriptorSets() to copy from descriptor set 0x%" PRIxLEAST64 + " that has not been allocated.", + reinterpret_cast(src_set)); + } else if (dst_pair == set_map.end()) { + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, + reinterpret_cast(dst_set), __LINE__, DRAWSTATE_DOUBLE_DESTROY, "DS", + "Cannot call vkUpdateDescriptorSets() to copy to descriptor set 0x%" PRIxLEAST64 + " that has not been allocated.", + reinterpret_cast(dst_set)); + } else { + std::string error_str; + if (!dst_pair->second->ValidateCopyUpdate(report_data, &p_cds[i], src_pair->second, &error_str)) { + skip_call |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, + reinterpret_cast(dst_set), __LINE__, DRAWSTATE_INVALID_UPDATE_INDEX, "DS", + "vkUpdateDescriptorsSets() failed copy update from Descriptor Set 0x%" PRIx64 + " to Descriptor Set 0x%" PRIx64 " with error: %s", + reinterpret_cast(src_set), reinterpret_cast(dst_set), error_str.c_str()); + } + } + } + return skip_call; +} +// This is a helper function that iterates over a set of Write and Copy updates, pulls the DescriptorSet* for updated +// sets, and then calls their respective Perform[Write|Copy]Update functions. +// Prerequisite : ValidateUpdateDescriptorSets() should be called and return "false" prior to calling PerformUpdateDescriptorSets() +// with the same set of updates. +// This is split from the validate code to allow validation prior to calling down the chain, and then update after +// calling down the chain. +void cvdescriptorset::PerformUpdateDescriptorSets( + const std::unordered_map &set_map, const uint32_t write_count, + const VkWriteDescriptorSet *p_wds, const uint32_t copy_count, const VkCopyDescriptorSet *p_cds) { + // Write updates first + uint32_t i = 0; + for (i = 0; i < write_count; ++i) { + auto dest_set = p_wds[i].dstSet; + auto set_pair = set_map.find(dest_set); + if (set_pair != set_map.end()) { + set_pair->second->PerformWriteUpdate(&p_wds[i]); + } + } + // Now copy updates + for (i = 0; i < copy_count; ++i) { + auto dst_set = p_cds[i].dstSet; + auto src_set = p_cds[i].srcSet; + auto src_pair = set_map.find(src_set); + auto dst_pair = set_map.find(dst_set); + if (src_pair != set_map.end() && dst_pair != set_map.end()) { + dst_pair->second->PerformCopyUpdate(&p_cds[i], src_pair->second); + } + } +} +// Validate the state for a given write update but don't actually perform the update +// If an error would occur for this update, return false and fill in details in error_msg string +bool cvdescriptorset::DescriptorSet::ValidateWriteUpdate(const debug_report_data *report_data, const VkWriteDescriptorSet *update, + std::string *error_msg) { + // Verify idle ds + if (in_use.load()) { std::stringstream error_str; - error_str << "Attempted write update to texel buffer descriptor with invalid buffer view: " << buffer_view; - *error = error_str.str(); + error_str << "Cannot call vkUpdateDescriptorSets() to perform write update on descriptor set " << set_ + << " that is in use by a command buffer."; + *error_msg = error_str.str(); return false; } - updated = true; - buffer_view_ = buffer_view; + // Verify dst binding exists + if (!p_layout_->HasBinding(update->dstBinding)) { + std::stringstream error_str; + error_str << "DescriptorSet " << set_ << " does not have binding " << update->dstBinding << "."; + *error_msg = error_str.str(); + return false; + } else { + // We know that binding is valid, verify update and do update on each descriptor + auto start_idx = p_layout_->GetGlobalStartIndexFromBinding(update->dstBinding) + update->dstArrayElement; + auto type = p_layout_->GetTypeFromBinding(update->dstBinding); + if (type != update->descriptorType) { + std::stringstream error_str; + error_str << "Attempting write update to descriptor set " << set_ << " binding #" << update->dstBinding << " with type " + << string_VkDescriptorType(type) << " but update type is " << string_VkDescriptorType(update->descriptorType); + *error_msg = error_str.str(); + return false; + } + if ((start_idx + update->descriptorCount) > p_layout_->GetTotalDescriptorCount()) { + std::stringstream error_str; + error_str << "Attempting write update to descriptor set " << set_ << " binding #" << update->dstBinding << " with " + << p_layout_->GetTotalDescriptorCount() << " total descriptors but update of " << update->descriptorCount + << " descriptors starting at binding offset of " + << p_layout_->GetGlobalStartIndexFromBinding(update->dstBinding) + << " combined with update array element offset of " << update->dstArrayElement + << " oversteps the size of this descriptor set."; + *error_msg = error_str.str(); + return false; + } + // Verify consecutive bindings match (if needed) + if (!p_layout_->VerifyUpdateConsistency(update->dstBinding, update->dstArrayElement, update->descriptorCount, + "write update to", set_, error_msg)) + return false; + // Update is within bounds and consistent so last step is to validate update contents + if (!VerifyWriteUpdateContents(update, start_idx, error_msg)) { + std::stringstream error_str; + error_str << "Write update to descriptor in set " << set_ << " binding #" << update->dstBinding + << " failed with error message: " << error_msg->c_str(); + *error_msg = error_str.str(); + return false; + } + } + // All checks passed, update is clean return true; } +// Verify that the contents of the update are ok, but don't perform actual update +bool cvdescriptorset::DescriptorSet::VerifyWriteUpdateContents(const VkWriteDescriptorSet *update, const uint32_t index, + std::string *error) const { + switch (update->descriptorType) { + case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: { + for (uint32_t di = 0; di < update->descriptorCount; ++di) { + // Validate image + auto image_view = update->pImageInfo[di].imageView; + auto image_layout = update->pImageInfo[di].imageLayout; + if (!ValidateImageUpdate(image_view, image_layout, image_view_map_, image_map_, image_to_swapchain_map_, swapchain_map_, + error)) { + std::stringstream error_str; + error_str << "Attempted write update to combined image sampler descriptor failed due to: " << error->c_str(); + *error = error_str.str(); + return false; + } + } + // Intentional fall-through to validate sampler + } + case VK_DESCRIPTOR_TYPE_SAMPLER: { + for (uint32_t di = 0; di < update->descriptorCount; ++di) { + if (!descriptors_[index + di].get()->IsImmutableSampler()) { + if (!ValidateSampler(update->pImageInfo[di].sampler, sampler_map_)) { + std::stringstream error_str; + error_str << "Attempted write update to sampler descriptor with invalid sampler: " + << update->pImageInfo[di].sampler << "."; + *error = error_str.str(); + return false; + } + } else { + // TODO : Warn here + } + } + break; + } + case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: + case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: + case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: { + for (uint32_t di = 0; di < update->descriptorCount; ++di) { + auto image_view = update->pImageInfo[di].imageView; + auto image_layout = update->pImageInfo[di].imageLayout; + if (!ValidateImageUpdate(image_view, image_layout, image_view_map_, image_map_, image_to_swapchain_map_, swapchain_map_, + error)) { + std::stringstream error_str; + error_str << "Attempted write update to image descriptor failed due to: " << error->c_str(); + *error = error_str.str(); + return false; + } + } + break; + } + case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: + case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: { + for (uint32_t di = 0; di < update->descriptorCount; ++di) { + auto buffer_view = update->pTexelBufferView[di]; + if (!buffer_view_map_->count(buffer_view)) { + std::stringstream error_str; + error_str << "Attempted write update to texel buffer descriptor with invalid buffer view: " << buffer_view; + *error = error_str.str(); + return false; + } + } + break; + } + case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: + case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: + case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: + case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: { + for (uint32_t di = 0; di < update->descriptorCount; ++di) { + auto buffer = update->pBufferInfo[di].buffer; + if (!buffer_map_->count(buffer)) { + std::stringstream error_str; + error_str << "Attempted write update to buffer descriptor with invalid buffer: " << buffer; + *error = error_str.str(); + return false; + } + } + break; + } + default: + assert(0); // We've already verified update type so should never get here + break; + } + // All checks passed so update contents are good + return true; +} +// Verify that the contents of the update are ok, but don't perform actual update +bool cvdescriptorset::DescriptorSet::VerifyCopyUpdateContents(const VkCopyDescriptorSet *update, const DescriptorSet *src_set, + const uint32_t index, std::string *error) const { + switch (src_set->descriptors_[index]->descriptor_class) { + case PlainSampler: { + for (uint32_t di = 0; di < update->descriptorCount; ++di) { + if (!src_set->descriptors_[index + di]->IsImmutableSampler()) { + auto update_sampler = static_cast(src_set->descriptors_[index + di].get())->GetSampler(); + if (!ValidateSampler(update_sampler, sampler_map_)) { + std::stringstream error_str; + error_str << "Attempted copy update to sampler descriptor with invalid sampler: " << update_sampler << "."; + *error = error_str.str(); + return false; + } + } else { + // TODO : Warn here + } + } + break; + } + case ImageSampler: { + for (uint32_t di = 0; di < update->descriptorCount; ++di) { + auto img_samp_desc = static_cast(src_set->descriptors_[index + di].get()); + // First validate sampler + if (!img_samp_desc->IsImmutableSampler()) { + auto update_sampler = img_samp_desc->GetSampler(); + if (!ValidateSampler(update_sampler, sampler_map_)) { + std::stringstream error_str; + error_str << "Attempted copy update to sampler descriptor with invalid sampler: " << update_sampler << "."; + *error = error_str.str(); + return false; + } + } else { + // TODO : Warn here + } + // Validate image + auto image_view = img_samp_desc->GetImageView(); + auto image_layout = img_samp_desc->GetImageLayout(); + if (!ValidateImageUpdate(image_view, image_layout, image_view_map_, image_map_, image_to_swapchain_map_, swapchain_map_, + error)) { + std::stringstream error_str; + error_str << "Attempted write update to combined image sampler descriptor failed due to: " << error->c_str(); + *error = error_str.str(); + return false; + } + } + } + case Image: { + for (uint32_t di = 0; di < update->descriptorCount; ++di) { + auto img_desc = static_cast(src_set->descriptors_[index + di].get()); + auto image_view = img_desc->GetImageView(); + auto image_layout = img_desc->GetImageLayout(); + if (!ValidateImageUpdate(image_view, image_layout, image_view_map_, image_map_, image_to_swapchain_map_, swapchain_map_, + error)) { + std::stringstream error_str; + error_str << "Attempted write update to image descriptor failed due to: " << error->c_str(); + *error = error_str.str(); + return false; + } + } + break; + } + case TexelBuffer: { + for (uint32_t di = 0; di < update->descriptorCount; ++di) { + auto buffer_view = static_cast(src_set->descriptors_[index + di].get())->GetBufferView(); + if (!buffer_view_map_->count(buffer_view)) { + std::stringstream error_str; + error_str << "Attempted write update to texel buffer descriptor with invalid buffer view: " << buffer_view; + *error = error_str.str(); + return false; + } + } + break; + } + case GeneralBuffer: { + for (uint32_t di = 0; di < update->descriptorCount; ++di) { + auto buffer = static_cast(src_set->descriptors_[index + di].get())->GetBuffer(); + if (!buffer_map_->count(buffer)) { + std::stringstream error_str; + error_str << "Attempted write update to buffer descriptor with invalid buffer: " << buffer; + *error = error_str.str(); + return false; + } + } + break; + } + default: + assert(0); // We've already verified update type so should never get here + break; + } + // All checks passed so update contents are good + return true; +} \ No newline at end of file diff --git a/layers/descriptor_sets.h b/layers/descriptor_sets.h index 5abe45fc..655d5720 100644 --- a/layers/descriptor_sets.h +++ b/layers/descriptor_sets.h @@ -146,8 +146,8 @@ typedef enum _DescriptorClass { PlainSampler, ImageSampler, Image, TexelBuffer, class Descriptor { public: virtual ~Descriptor(){}; - virtual bool WriteUpdate(const VkWriteDescriptorSet *, const uint32_t, std::string *) = 0; - virtual bool CopyUpdate(const Descriptor *, std::string *) = 0; + virtual void WriteUpdate(const VkWriteDescriptorSet *, const uint32_t) = 0; + virtual void CopyUpdate(const Descriptor *) = 0; virtual DescriptorClass GetClass() const { return descriptor_class; }; // Special fast-path check for SamplerDescriptors that are immutable virtual bool IsImmutableSampler() const { return false; }; @@ -167,51 +167,41 @@ bool ValidateImageUpdate(const VkImageView, const VkImageLayout, const std::unor class SamplerDescriptor : public Descriptor { public: - SamplerDescriptor(const std::unordered_map> *); - SamplerDescriptor(const VkSampler *, const std::unordered_map> *); - bool WriteUpdate(const VkWriteDescriptorSet *, const uint32_t, std::string *) override; - bool CopyUpdate(const Descriptor *, std::string *) override; + SamplerDescriptor(); + SamplerDescriptor(const VkSampler *); + void WriteUpdate(const VkWriteDescriptorSet *, const uint32_t) override; + void CopyUpdate(const Descriptor *) override; virtual bool IsImmutableSampler() const override { return immutable_; }; + VkSampler GetSampler() const { return sampler_; } private: // bool ValidateSampler(const VkSampler) const; VkSampler sampler_; bool immutable_; - const std::unordered_map> *sampler_map_; }; class ImageSamplerDescriptor : public Descriptor { public: - ImageSamplerDescriptor(const std::unordered_map *, - const std::unordered_map *, const std::unordered_map *, - const std::unordered_map *, - const std::unordered_map> *); - ImageSamplerDescriptor(const VkSampler *, const std::unordered_map *, - const std::unordered_map *, const std::unordered_map *, - const std::unordered_map *, - const std::unordered_map> *); - bool WriteUpdate(const VkWriteDescriptorSet *, const uint32_t, std::string *) override; - bool CopyUpdate(const Descriptor *, std::string *) override; + ImageSamplerDescriptor(); + ImageSamplerDescriptor(const VkSampler *); + void WriteUpdate(const VkWriteDescriptorSet *, const uint32_t) override; + void CopyUpdate(const Descriptor *) override; + VkSampler GetSampler() const { return sampler_; } + VkImageView GetImageView() const { return image_view_; } + VkImageLayout GetImageLayout() const { return image_layout_; } private: VkSampler sampler_; bool immutable_; VkImageView image_view_; VkImageLayout image_layout_; - const std::unordered_map> *sampler_map_; - const std::unordered_map *image_view_map_; - const std::unordered_map *image_map_; - const std::unordered_map *image_to_swapchain_map_; - const std::unordered_map *swapchain_map_; }; class ImageDescriptor : public Descriptor { public: - ImageDescriptor(const VkDescriptorType, const std::unordered_map *, - const std::unordered_map *, const std::unordered_map *, - const std::unordered_map *); - bool WriteUpdate(const VkWriteDescriptorSet *, const uint32_t, std::string *) override; - bool CopyUpdate(const Descriptor *, std::string *) override; + ImageDescriptor(const VkDescriptorType); + void WriteUpdate(const VkWriteDescriptorSet *, const uint32_t) override; + void CopyUpdate(const Descriptor *) override; virtual bool IsStorage() const override { return storage_; } VkImageView GetImageView() const { return image_view_; } VkImageLayout GetImageLayout() const { return image_layout_; } @@ -220,31 +210,26 @@ class ImageDescriptor : public Descriptor { bool storage_; VkImageView image_view_; VkImageLayout image_layout_; - const std::unordered_map *image_view_map_; - const std::unordered_map *image_map_; - const std::unordered_map *image_to_swapchain_map_; - const std::unordered_map *swapchain_map_; }; class TexelDescriptor : public Descriptor { public: - TexelDescriptor(const VkDescriptorType, const std::unordered_map *); - bool WriteUpdate(const VkWriteDescriptorSet *, const uint32_t, std::string *) override; - bool CopyUpdate(const Descriptor *, std::string *) override; + TexelDescriptor(const VkDescriptorType); + void WriteUpdate(const VkWriteDescriptorSet *, const uint32_t) override; + void CopyUpdate(const Descriptor *) override; virtual bool IsStorage() const override { return storage_; } VkBufferView GetBufferView() const { return buffer_view_; } private: VkBufferView buffer_view_; bool storage_; - const std::unordered_map *buffer_view_map_; }; class BufferDescriptor : public Descriptor { public: - BufferDescriptor(const VkDescriptorType, const std::unordered_map *); - bool WriteUpdate(const VkWriteDescriptorSet *, const uint32_t, std::string *) override; - bool CopyUpdate(const Descriptor *, std::string *) override; + BufferDescriptor(const VkDescriptorType); + void WriteUpdate(const VkWriteDescriptorSet *, const uint32_t) override; + void CopyUpdate(const Descriptor *) override; virtual bool IsDynamic() const override { return dynamic_; } virtual bool IsStorage() const override { return storage_; } VkBuffer GetBuffer() const { return buffer_; } @@ -257,11 +242,15 @@ class BufferDescriptor : public Descriptor { VkBuffer buffer_; VkDeviceSize offset_; VkDeviceSize range_; - const std::unordered_map *buffer_map_; }; -// Helper function for Updating descriptor sets since it crosses multiple sets -void UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites, - uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pDescriptorCopies); +// Helper functions for Updating descriptor sets since it crosses multiple sets +// Validate will make sure an update is ok without actually performing it +bool ValidateUpdateDescriptorSets(const debug_report_data *, + const std::unordered_map &, const uint32_t, + const VkWriteDescriptorSet *, const uint32_t, const VkCopyDescriptorSet *); +// Perform does the update with the assumption that ValidateUpdateDescriptorSets() has passed for the given update +void PerformUpdateDescriptorSets(const std::unordered_map &, const uint32_t, + const VkWriteDescriptorSet *, const uint32_t, const VkCopyDescriptorSet *); /* * DescriptorSet class * @@ -323,10 +312,16 @@ class DescriptorSet : public BASE_NODE { // For all descriptors in a set, add any buffers and images that may be updated to their respective unordered_sets & return // number of objects inserted uint32_t GetAllStorageUpdates(std::unordered_set *, std::unordered_set *) const; - // Perform write update based on update struct - bool WriteUpdate(debug_report_data *, const VkWriteDescriptorSet *, std::string *); - // Perform copy update, using 'this' set as the dest and the passed-in DescriptorSet as the src - bool CopyUpdate(debug_report_data *, const VkCopyDescriptorSet *, const DescriptorSet *, std::string *); + + // Descriptor Update functions. These functions validate state and perform update separately + // Validate contents of a WriteUpdate + bool ValidateWriteUpdate(const debug_report_data *, const VkWriteDescriptorSet *, std::string *); + // Perform a WriteUpdate whose contents were just validated using ValidateWriteUpdate + void PerformWriteUpdate(const VkWriteDescriptorSet *); + // Validate contents of a CopyUpdate + bool ValidateCopyUpdate(const debug_report_data *, const VkCopyDescriptorSet *, const DescriptorSet *, std::string *); + // Perform a CopyUpdate whose contents were just validated using ValidateCopyUpdate + void PerformCopyUpdate(const VkCopyDescriptorSet *, const DescriptorSet *); const DescriptorSetLayout *GetLayout() const { return p_layout_; }; VkDescriptorSet GetSet() const { return set_; }; @@ -350,7 +345,8 @@ class DescriptorSet : public BASE_NODE { bool IsUpdated() const { return some_update_; }; private: - bool ValidateUpdate(const VkWriteDescriptorSet *, const uint32_t, std::string *) const; + bool VerifyWriteUpdateContents(const VkWriteDescriptorSet *, const uint32_t, std::string *) const; + bool VerifyCopyUpdateContents(const VkCopyDescriptorSet *, const DescriptorSet *, const uint32_t, std::string *) const; // Private helper to set all bound cmd buffers to INVALID state void InvalidateBoundCmdBuffers(); bool some_update_; // has any part of the set ever been updated? -- cgit v1.2.3 From b5dd2356f3ecabaef208c7c013fac27aebaa061f Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 19 May 2016 07:56:18 -0600 Subject: layers: Verify that src of copy update is updated Before verifying source update comments make sure that the source descriptors have been updated. This guards against some obscure corner cases where a bad source descriptor could slip through the content verification. --- layers/descriptor_sets.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index 2955a6a3..d178a916 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -543,7 +543,17 @@ bool cvdescriptorset::DescriptorSet::ValidateCopyUpdate(const debug_report_data set_, error))) { return false; } - // Update parameters all look good so verify update contents + // First make sure source descriptors are updated + for (uint32_t i = 0; i < update->descriptorCount; ++i) { + if (!src_set->descriptors_[src_start_idx + i]) { + std::stringstream error_str; + error_str << "Attempting copy update from descriptorSet " << src_set << " binding #" << update->srcBinding << " but descriptor at array offset " + << update->srcArrayElement + i << " has not been updated."; + *error = error_str.str(); + return false; + } + } + // Update parameters all look good and descriptor updated so verify update contents if (!VerifyCopyUpdateContents(update, src_set, src_start_idx, error)) return false; -- cgit v1.2.3 From 84f4ee9f6ff75d1fa1127af0952709f858a5f5b3 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 19 May 2016 08:00:00 -0600 Subject: layers: DescriptorSet class clean-up Minor formatting improvements, removed some useless "const" decls and unused vars and updated a few error codes to be more appropriate. --- layers/core_validation.cpp | 4 ++-- layers/descriptor_sets.cpp | 51 ++++++++++++++++++++++++---------------------- layers/descriptor_sets.h | 14 ++++++------- 3 files changed, 35 insertions(+), 34 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index cd9388ae..62874f35 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -5944,8 +5944,8 @@ AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllo } // Create new DescriptorSet instance and add to the pool's unordered_set of DescriptorSets cvdescriptorset::DescriptorSet *pNewNode = new cvdescriptorset::DescriptorSet( - pDescriptorSets[i], layout_pair->second, dev_data->report_data, &dev_data->bufferMap, &dev_data->memObjMap, - &dev_data->bufferViewMap, &dev_data->samplerMap, &dev_data->imageViewMap, &dev_data->imageMap, + pDescriptorSets[i], layout_pair->second, &dev_data->bufferMap, &dev_data->memObjMap, &dev_data->bufferViewMap, + &dev_data->samplerMap, &dev_data->imageViewMap, &dev_data->imageMap, &dev_data->device_extensions.imageToSwapchainMap, &dev_data->device_extensions.swapchainMap); if (NULL == pNewNode) { if (log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index d178a916..5fc1de3f 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -59,6 +59,7 @@ void cvdescriptorset::DescriptorSetLayout::FillBindingSet(std::unordered_setinsert(binding_index_pair.first); } + VkDescriptorSetLayoutBinding const * cvdescriptorset::DescriptorSetLayout::GetDescriptorSetLayoutBindingPtrFromBinding(const uint32_t binding) const { const auto &bi_itr = binding_to_index_map_.find(binding); @@ -260,7 +261,6 @@ bool cvdescriptorset::DescriptorSetLayout::VerifyUpdateConsistency(uint32_t curr } cvdescriptorset::DescriptorSet::DescriptorSet(const VkDescriptorSet set, const DescriptorSetLayout *layout, - const debug_report_data *debug_report_data, const std::unordered_map *buffer_map, const std::unordered_map *memory_map, const std::unordered_map *buffer_view_map, @@ -269,9 +269,9 @@ cvdescriptorset::DescriptorSet::DescriptorSet(const VkDescriptorSet set, const D const std::unordered_map *image_map, const std::unordered_map *image_to_swapchain_map, const std::unordered_map *swapchain_map) - : some_update_(false), set_(set), p_layout_(layout), report_data_(debug_report_data), buffer_map_(buffer_map), - memory_map_(memory_map), buffer_view_map_(buffer_view_map), sampler_map_(sampler_map), image_view_map_(image_view_map), - image_map_(image_map), image_to_swapchain_map_(image_to_swapchain_map), swapchain_map_(swapchain_map) { + : some_update_(false), set_(set), p_layout_(layout), buffer_map_(buffer_map), memory_map_(memory_map), + buffer_view_map_(buffer_view_map), sampler_map_(sampler_map), image_view_map_(image_view_map), image_map_(image_map), + image_to_swapchain_map_(image_to_swapchain_map), swapchain_map_(swapchain_map) { // Foreach binding, create default descriptors of given type for (uint32_t i = 0; i < p_layout_->GetBindingCount(); ++i) { auto type = p_layout_->GetTypeFromIndex(i); @@ -321,6 +321,7 @@ cvdescriptorset::DescriptorSet::DescriptorSet(const VkDescriptorSet set, const D } } } + cvdescriptorset::DescriptorSet::~DescriptorSet() { InvalidateBoundCmdBuffers(); // Remove link to any cmd buffers @@ -466,16 +467,14 @@ void cvdescriptorset::DescriptorSet::InvalidateBoundCmdBuffers() { } // Perform write update in given update struct void cvdescriptorset::DescriptorSet::PerformWriteUpdate(const VkWriteDescriptorSet *update) { - auto num_updates = 0; auto start_idx = p_layout_->GetGlobalStartIndexFromBinding(update->dstBinding) + update->dstArrayElement; // perform update for (uint32_t di = 0; di < update->descriptorCount; ++di) { descriptors_[start_idx + di]->WriteUpdate(update, di); - ++num_updates; } - if (num_updates != 0) { + if (update->descriptorCount) some_update_ = true; - } + InvalidateBoundCmdBuffers(); } // Validate Copy update @@ -562,19 +561,18 @@ bool cvdescriptorset::DescriptorSet::ValidateCopyUpdate(const debug_report_data } // Perform Copy update void cvdescriptorset::DescriptorSet::PerformCopyUpdate(const VkCopyDescriptorSet *update, const DescriptorSet *src_set) { - auto num_updates = 0; auto src_start_idx = src_set->GetGlobalStartIndexFromBinding(update->srcBinding) + update->srcArrayElement; auto dst_start_idx = p_layout_->GetGlobalStartIndexFromBinding(update->dstBinding) + update->dstArrayElement; // Update parameters all look good so perform update for (uint32_t di = 0; di < update->descriptorCount; ++di) { descriptors_[dst_start_idx + di]->CopyUpdate(src_set->descriptors_[src_start_idx + di].get()); - ++num_updates; } - if (num_updates != 0) { + if (update->descriptorCount) some_update_ = true; - } + InvalidateBoundCmdBuffers(); } + cvdescriptorset::SamplerDescriptor::SamplerDescriptor() : sampler_(VK_NULL_HANDLE), immutable_(false) { updated = false; descriptor_class = PlainSampler; @@ -589,10 +587,12 @@ cvdescriptorset::SamplerDescriptor::SamplerDescriptor(const VkSampler *immut) : updated = true; } } + bool cvdescriptorset::ValidateSampler(const VkSampler sampler, const std::unordered_map> *sampler_map) { return (sampler_map->count(sampler) != 0); } + bool cvdescriptorset::ValidateImageUpdate(const VkImageView image_view, const VkImageLayout image_layout, const std::unordered_map *image_view_map, const std::unordered_map *image_map, @@ -687,6 +687,7 @@ bool cvdescriptorset::ValidateImageUpdate(const VkImageView image_view, const Vk } return true; } + void cvdescriptorset::SamplerDescriptor::WriteUpdate(const VkWriteDescriptorSet *update, const uint32_t index) { sampler_ = update->pImageInfo[index].sampler; updated = true; @@ -699,6 +700,7 @@ void cvdescriptorset::SamplerDescriptor::CopyUpdate(const Descriptor *src) { } updated = true; } + cvdescriptorset::ImageSamplerDescriptor::ImageSamplerDescriptor() : sampler_(VK_NULL_HANDLE), immutable_(false), image_view_(VK_NULL_HANDLE), image_layout_(VK_IMAGE_LAYOUT_UNDEFINED) { updated = false; @@ -715,9 +717,10 @@ cvdescriptorset::ImageSamplerDescriptor::ImageSamplerDescriptor(const VkSampler updated = true; } } + void cvdescriptorset::ImageSamplerDescriptor::WriteUpdate(const VkWriteDescriptorSet *update, const uint32_t index) { updated = true; - auto image_info = update->pImageInfo[index]; + const auto &image_info = update->pImageInfo[index]; sampler_ = image_info.sampler; image_view_ = image_info.imageView; image_layout_ = image_info.imageLayout; @@ -745,7 +748,7 @@ cvdescriptorset::ImageDescriptor::ImageDescriptor(const VkDescriptorType type) void cvdescriptorset::ImageDescriptor::WriteUpdate(const VkWriteDescriptorSet *update, const uint32_t index) { updated = true; - auto image_info = update->pImageInfo[index]; + const auto &image_info = update->pImageInfo[index]; image_view_ = image_info.imageView; image_layout_ = image_info.imageLayout; } @@ -773,7 +776,7 @@ cvdescriptorset::BufferDescriptor::BufferDescriptor(const VkDescriptorType type) } void cvdescriptorset::BufferDescriptor::WriteUpdate(const VkWriteDescriptorSet *update, const uint32_t index) { updated = true; - auto buffer_info = update->pBufferInfo[index]; + const auto &buffer_info = update->pBufferInfo[index]; buffer_ = buffer_info.buffer; offset_ = buffer_info.offset; range_ = buffer_info.range; @@ -793,6 +796,7 @@ cvdescriptorset::TexelDescriptor::TexelDescriptor(const VkDescriptorType type) : if (VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER == type) storage_ = true; }; + void cvdescriptorset::TexelDescriptor::WriteUpdate(const VkWriteDescriptorSet *update, const uint32_t index) { updated = true; buffer_view_ = update->pTexelBufferView[index]; @@ -809,17 +813,16 @@ void cvdescriptorset::TexelDescriptor::CopyUpdate(const Descriptor *src) { // If there is no issue with the update, then false is returned. bool cvdescriptorset::ValidateUpdateDescriptorSets( const debug_report_data *report_data, const std::unordered_map &set_map, - const uint32_t write_count, const VkWriteDescriptorSet *p_wds, const uint32_t copy_count, const VkCopyDescriptorSet *p_cds) { + uint32_t write_count, const VkWriteDescriptorSet *p_wds, uint32_t copy_count, const VkCopyDescriptorSet *p_cds) { bool skip_call = false; // Validate Write updates - uint32_t i = 0; - for (i = 0; i < write_count; i++) { + for (uint32_t i = 0; i < write_count; i++) { auto dest_set = p_wds[i].dstSet; auto set_pair = set_map.find(dest_set); if (set_pair == set_map.end()) { skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, - reinterpret_cast(dest_set), __LINE__, DRAWSTATE_DOUBLE_DESTROY, "DS", + reinterpret_cast(dest_set), __LINE__, DRAWSTATE_INVALID_DESCRIPTOR_SET, "DS", "Cannot call vkUpdateDescriptorSets() on descriptor set 0x%" PRIxLEAST64 " that has not been allocated.", reinterpret_cast(dest_set)); } else { @@ -834,20 +837,20 @@ bool cvdescriptorset::ValidateUpdateDescriptorSets( } } // Now validate copy updates - for (i = 0; i < copy_count; ++i) { + for (uint32_t i = 0; i < copy_count; ++i) { auto dst_set = p_cds[i].dstSet; auto src_set = p_cds[i].srcSet; auto src_pair = set_map.find(src_set); auto dst_pair = set_map.find(dst_set); if (src_pair == set_map.end()) { skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, - reinterpret_cast(src_set), __LINE__, DRAWSTATE_DOUBLE_DESTROY, "DS", + reinterpret_cast(src_set), __LINE__, DRAWSTATE_INVALID_DESCRIPTOR_SET, "DS", "Cannot call vkUpdateDescriptorSets() to copy from descriptor set 0x%" PRIxLEAST64 " that has not been allocated.", reinterpret_cast(src_set)); } else if (dst_pair == set_map.end()) { skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, - reinterpret_cast(dst_set), __LINE__, DRAWSTATE_DOUBLE_DESTROY, "DS", + reinterpret_cast(dst_set), __LINE__, DRAWSTATE_INVALID_DESCRIPTOR_SET, "DS", "Cannot call vkUpdateDescriptorSets() to copy to descriptor set 0x%" PRIxLEAST64 " that has not been allocated.", reinterpret_cast(dst_set)); @@ -872,8 +875,8 @@ bool cvdescriptorset::ValidateUpdateDescriptorSets( // This is split from the validate code to allow validation prior to calling down the chain, and then update after // calling down the chain. void cvdescriptorset::PerformUpdateDescriptorSets( - const std::unordered_map &set_map, const uint32_t write_count, - const VkWriteDescriptorSet *p_wds, const uint32_t copy_count, const VkCopyDescriptorSet *p_cds) { + const std::unordered_map &set_map, uint32_t write_count, + const VkWriteDescriptorSet *p_wds, uint32_t copy_count, const VkCopyDescriptorSet *p_cds) { // Write updates first uint32_t i = 0; for (i = 0; i < write_count; ++i) { diff --git a/layers/descriptor_sets.h b/layers/descriptor_sets.h index 655d5720..58e3b5cd 100644 --- a/layers/descriptor_sets.h +++ b/layers/descriptor_sets.h @@ -246,11 +246,11 @@ class BufferDescriptor : public Descriptor { // Helper functions for Updating descriptor sets since it crosses multiple sets // Validate will make sure an update is ok without actually performing it bool ValidateUpdateDescriptorSets(const debug_report_data *, - const std::unordered_map &, const uint32_t, - const VkWriteDescriptorSet *, const uint32_t, const VkCopyDescriptorSet *); + const std::unordered_map &, uint32_t, + const VkWriteDescriptorSet *, uint32_t, const VkCopyDescriptorSet *); // Perform does the update with the assumption that ValidateUpdateDescriptorSets() has passed for the given update -void PerformUpdateDescriptorSets(const std::unordered_map &, const uint32_t, - const VkWriteDescriptorSet *, const uint32_t, const VkCopyDescriptorSet *); +void PerformUpdateDescriptorSets(const std::unordered_map &, uint32_t, + const VkWriteDescriptorSet *, uint32_t, const VkCopyDescriptorSet *); /* * DescriptorSet class * @@ -272,8 +272,8 @@ void PerformUpdateDescriptorSets(const std::unordered_map *, const std::unordered_map *, + DescriptorSet(const VkDescriptorSet, const DescriptorSetLayout *, const std::unordered_map *, + const std::unordered_map *, const std::unordered_map *, const std::unordered_map> *, const std::unordered_map *, const std::unordered_map *, @@ -351,11 +351,9 @@ class DescriptorSet : public BASE_NODE { void InvalidateBoundCmdBuffers(); bool some_update_; // has any part of the set ever been updated? VkDescriptorSet set_; - uint32_t descriptor_count_; // Count of all descriptors in this set const DescriptorSetLayout *p_layout_; std::unordered_set bound_cmd_buffers_; std::vector> descriptors_; - const debug_report_data *report_data_; // Ptrs to object containers to verify bound data const std::unordered_map *buffer_map_; const std::unordered_map *memory_map_; -- cgit v1.2.3 From d32b08faa450694f96640e64c920bb23680de5b2 Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Thu, 19 May 2016 11:50:32 -0600 Subject: layers: Updated validation layer details doc Some rewording, pulled out pending work sections and pointed readers to Github for open/pending issues or feature requests. Change-Id: I1ad55777a064e7f26a3f5cce48fb63d9e12d4b32 --- layers/vk_validation_layer_details.md | 67 +++++++---------------------------- 1 file changed, 13 insertions(+), 54 deletions(-) diff --git a/layers/vk_validation_layer_details.md b/layers/vk_validation_layer_details.md index d6bc7cc4..2c78c39b 100644 --- a/layers/vk_validation_layer_details.md +++ b/layers/vk_validation_layer_details.md @@ -109,14 +109,8 @@ The Draw State portion of the core validation layer tracks state leading into Dr | NA | Enum used when VK_LAYER_LUNARG_core_validation attempts to allocate memory for its own internal use and is unable to. | OUT_OF_MEMORY | | TODO | None | ### VK_LAYER_LUNARG_core_validation Draw State Pending Work -Additional Draw State-related checks to be added: - 1. Lifetime validation (See [bug 13383](https://cvs.khronos.org/bugzilla/show_bug.cgi?id=13383)) - 2. GetRenderAreaGranularity - The pname:renderPass parameter must be the same as the one given in the sname:VkRenderPassBeginInfo structure for which the render area is relevant. - 3. Update Gfx Pipe Create Info shadowing to remove new/delete and instead use unique_ptrs for auto clean-up - 4. Add validation for Pipeline Derivatives (see Pipeline Derivatives) section of the spec - - See the Khronos github repository for Vulkan-LoaderAndValidationLayers for additional pending issues, or to submit new validation requests +See the Khronos github repository for Vulkan-LoaderAndValidationLayers for additional pending issues, or to submit new validation requests ### VK_LAYER_LUNARG_core_validation Shader Checker Details Table @@ -143,11 +137,9 @@ It flags errors when inconsistencies are found across interfaces between shader | Bad capability | Flags error if a capability declared by the shader is not supported by Vulkan shaders | BAD_CAPABILITY | vkCreateGraphicsPipelines | TODO | NA | | NA | Enum used for informational messages | NONE | | TODO | None | -### VK_LAYER_LUNARG_core_validation Shader Checker Pending Work -- Additional test cases for variously broken SPIRV images -- Validation of a single SPIRV image in isolation (the spec describes many constraints) +### VK_LAYER_LUNARG_core_validation Shader Checker Work - See the Khronos github repository for Vulkan-LoaderAndValidationLayers for additional pending issues, or to submit new validation requests +See the Khronos github repository for Vulkan-LoaderAndValidationLayers for additional pending issues, or to submit new validation requests ### VK_LAYER_LUNARG_core_validation Memory Tracker Details Table The Mem Tracker portion of the VK_LAYER_LUNARG_core_validation layer tracks memory objects and references and validates that they are managed correctly by the application. This includes tracking object bindings, memory hazards, and memory object lifetimes. Several other hazard-related issues related to command buffers, fences, and memory mapping are also validated in this layer segment. @@ -170,12 +162,8 @@ The Mem Tracker portion of the VK_LAYER_LUNARG_core_validation layer tracks memo | NA | Enum used for errors in the layer itself. This does not indicate an app issue, but instead a bug in the layer. | INTERNAL_ERROR | | TODO | None | ### VK_LAYER_LUNARG_core_validation Memory Tracker Pending Work and Enhancements - See the Khronos github repository for Vulkan-LoaderAndValidationLayers for additional pending issues, or to submit new validation requests -1. Consolidate error messages and make them consistent -2. Add validation for maximum memory references, maximum object counts, and object leaks -3. Warn on image/buffer deletion if USAGE bits were set that were not needed -4. Modify INVALID_FENCE_STATE to be WARNINGs instead of ERROR +See the Khronos github repository for Vulkan-LoaderAndValidationLayers for additional pending issues, or to submit new validation requests ## VK_LAYER_LUNARG_parameter_validation @@ -197,19 +185,8 @@ The VK_LAYER_LUNARG_parameter_validation layer validates parameter values and fl | NA | Enum used for informational messages | NONE | | TODO | None | ### VK_LAYER_LUNARG_parameter_validation Pending Work -Additional work to be done - - 1. Source2 was creating a VK_FORMAT_R8_SRGB texture (and image view) which was not supported by the underlying implementation (rendersystemtest imageformat test). Checking that formats are supported by the implementation is something the validation layer could do using the VK_FORMAT_INFO_TYPE_PROPERTIES query. There are probably a bunch of checks here you could be doing around vkCreateImage formats along with whether image/color/depth attachment views are valid. I’m not sure how much of this is already there. - 2. From AMD: we were using an image view with a swizzle of VK_COLOR_COMPONENT_FORMAT_A with a BC1_RGB texture, which is not valid because the texture does not have an alpha channel. In general, should validate that the swizzles do not reference components not in the texture format. - 3. When querying VK_PHYSICAL_DEVICE_INFO_TYPE_QUEUE_PROPERTIES must provide enough memory for all the queues on the device (not just 1 when device has multiple queues). - 4. INT & FLOAT bordercolors. Border color int/float selection must match associated texture format. - 5. Flag error on VkBufferCreateInfo if buffer size is 0 - 6. VkImageViewCreateInfo.format must be set - 7. For vkCreateGraphicsPipelines, correctly handle array of pCreateInfos and array of pStages within each element of pCreatInfos - 8. Check for valid VkIndexType in vkCmdBindIndexBuffer() should be in PreCmdBindIndexBuffer() call - 9. Check for valid VkPipelineBindPoint in vkCmdBindPipeline() & vkCmdBindDescriptorSets() should be in PreCmdBindPipeline() & PreCmdBindDescriptorSets() calls respectively. - See the Khronos github repository for Vulkan-LoaderAndValidationLayers for additional pending issues, or to submit new validation requests +See the Khronos github repository for Vulkan-LoaderAndValidationLayers for additional pending issues, or to submit new validation requests ## VK_LAYER_LUNARG_image @@ -241,7 +218,8 @@ DETAILS TABLE PENDING | NA | Enum used for informational messages | NONE | | TODO | None | ### VK_LAYER_LUNARG_image Pending Work - See the Khronos github repository for Vulkan-LoaderAndValidationLayers for additional pending issues, or to submit new validation requests + +See the Khronos github repository for Vulkan-LoaderAndValidationLayers for additional pending issues, or to submit new validation requests ## VK_LAYER_LUNARG_object_tracker @@ -263,12 +241,7 @@ The VK_LAYER_LUNARG_object_tracker layer maintains a record of all Vulkan object ### VK_LAYER_LUNARG_object_tracker Pending Work - 1. Verify images have CmdPipelineBarrier layouts matching new layout parameters to Cmd*Image* functions - 2. For specific object instances that are allowed to be NULL, update object validation to verify that such objects are either NULL or valid - 3. Verify cube array VkImageView objects use subresourceRange.arraySize (or effective arraySize when VK_REMAINING_ARRAY_SLICES is specified) that is a multiple of 6. - 4. Make object maps specific to instance and device. Objects may only be used with matching instance or device. - - See the Khronos github repository for Vulkan-LoaderAndValidationLayers for additional pending issues, or to submit new validation requests +See the Khronos github repository for Vulkan-LoaderAndValidationLayers for additional pending issues, or to submit new validation requests ## VK_LAYER_GOOGLE_threading @@ -304,7 +277,8 @@ It cannot insure that there is no latent race condition. | NA | Enum used for informational messages | NONE | | TODO | None | ### VK_LAYER_GOOGLE_threading Pending Work - See the Khronos github repository for Vulkan-LoaderAndValidationLayers for additional pending issues, or to submit new validation requests + +See the Khronos github repository for Vulkan-LoaderAndValidationLayers for additional pending issues, or to submit new validation requests ## VK_LAYER_LUNARG_device_limits @@ -338,9 +312,7 @@ For the second category of errors, VK_LAYER_LUNARG_device_limits stores its own ### VK_LAYER_LUNARG_device_limits Pending Work - 1. For all Formats, call vkGetPhysicalDeviceFormatProperties to pull their properties for the underlying device. After that point, if the app attempts to use any formats in violation of those properties, flag errors (this is done for Images). - - See the Khronos github repository for Vulkan-LoaderAndValidationLayers for additional pending issues, or to submit new validation requests +See the Khronos github repository for Vulkan-LoaderAndValidationLayers for additional pending issues, or to submit new validation requests ## VK_LAYER_LUNARG_swapchain @@ -403,24 +375,11 @@ Note: The following platform-specific functions are not mentioned above, because - vkGetPhysicalDeviceXlibPresentationSupportKHR ### VK_LAYER_LUNARG_Swapchain Pending Work -Additional checks to be added to VK_LAYER_LUNARG_swapchain - - 1. Check that the queue used for presenting was checked/valid during vkGetPhysicalDeviceSurfaceSupportKHR. - 2. One issue that has already come up is correct UsageFlags for WSI SwapChains and SurfaceProperties. - 3. Tons of other stuff including semaphore and synchronization validation. - See the Khronos github repository for Vulkan-LoaderAndValidationLayers for additional pending issues, or to submit new validation requests +See the Khronos github repository for Vulkan-LoaderAndValidationLayers for additional pending issues, or to submit new validation requests ## VK_LAYER_GOOGLE_unique_objects ### VK_LAYER_GOOGLE_unique_objects Overview -The unique_objects is not a validation layer but a helper layer that assists with validation. The Vulkan specification allows objects that have non-unique handles. This makes tracking object lifetimes difficult in that it is unclear which object is being referenced upon deletion. The unique_objects layer addresses this by wrapping all objects with a unique object representation allowing proper object lifetime tracking. This layer does no validation on its own and may not be required for the proper operation of all layers or all platforms. One sign that it is needed is the appearance of many errors from the object_tracker layer indicating the use of previously destroyed objects. For optimal effectiveness this layer should be loaded last (to reside in the layer chain closest to the display driver and farthest from the application). - - -## General Pending Work -A place to capture general validation work to be done. This includes new checks that don't clearly fit into the above layers. - - 1. For Upcoming Dynamic State overhaul (if approved): If dynamic state value that is consumed is never set prior to consumption, flag an error - 2. For Upcoming Dynamic State overhaul (if approved): If dynamic state that was bound as "static" in current PSO is attempted to be set with vkCmdSet* flag an error - 3. Need to check VkShaderCreateInfo.stage is being set properly (Issue reported by Dan G) +The unique_objects utility layer that assists with validation. The Vulkan specification allows objects to have non-unique handles. This makes tracking object lifetimes difficult in that it is unclear which object is being referenced upon deletion. The unique_objects layer addresses this by aliasing all objects with a unique identifier allowing proper object lifetime tracking. This layer does no validation on its own and may not be required for the proper operation of all layers or all platforms. One sign that it is needed is the appearance of many errors from the object_tracker layer indicating the use of previously destroyed objects. For optimal effectiveness this layer should be loaded last (to reside in the layer chain closest to the display driver and farthest from the application). -- cgit v1.2.3 From cd0fc643d3ceb65af9021a4eb6aca54798bd5e72 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Thu, 19 May 2016 10:45:02 +0800 Subject: docs: update v0 languages for device layer deprecation Clarify that a layer's vkEnumerateInstanceLayerProperties vkEnumerateInstanceExtensionProperties - should enumerate the layer itself vkEnumerateDeviceLayerProperties - is deprecated vkEnumerateDeviceExtensionProperties - must handle all layers by chaining vkCreateInstance - `pNext` handling is covered by the spec vkCreateDevice - allow validation layers to validate layer and extension names Clarify that the layer library's vkEnumerateInstanceLayerProperties vkEnumerateInstanceExtensionProperties - are not used by the desktop loader - can be aliases to the layer's versions when the layer library contains only one layer vkEnumerateDeviceLayerProperties vkEnumerateDeviceExtensionProperties - are not used by the desktop loader vkGetInstanceProcAddr - mention that the special cases for vkCreateDevice and device commands are for compatibility --- loader/LoaderAndLayerInterface.md | 67 +++++++++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 23 deletions(-) diff --git a/loader/LoaderAndLayerInterface.md b/loader/LoaderAndLayerInterface.md index d43111b9..4a986cd5 100644 --- a/loader/LoaderAndLayerInterface.md +++ b/loader/LoaderAndLayerInterface.md @@ -1119,8 +1119,22 @@ should use memory allocators if the layer is intended to run in a production environment, such as an implicit layer that is always enabled. That will allow applications to include the layer's memory usage. +`vkEnumerateInstanceLayerProperties` must enumerate and only enumerate the +layer itself. + +`vkEnumerateInstanceExtensionProperties` must handle the case where +`pLayerName` is itself. It must return `VK_ERROR_LAYER_NOT_PRESENT` +otherwise, including when `pLayerName` is `NULL`. + +`vkEnumerateDeviceLayerProperties` is deprecated and may be omitted. The +behavior is undefined. + `vkEnumerateDeviceExtensionProperties` must handle the case where `pLayerName` -is `NULL`, usually by chaining to other layers. +is itself. In other cases, it should normally chain to other layers. + +`vkCreateInstance` must not generate an error for unrecognized layer names and +extension names. It may assume the layer names and extension names have been +validated. `vkGetInstanceProcAddr` can intercept a command by returning a function pointer different from what would be returned through chaining. @@ -1128,39 +1142,43 @@ pointer different from what would be returned through chaining. `vkGetDeviceProcAddr` can intercept a command by returning a function pointer different from what would be returned through chaining. -`vkCreateInstance` must not generate an error for unrecognized layer names, -extension names, and `pNext` structs. It may assume the layer names and -extension names have been validated. - -`vkCreateDevice` must not generate an error for unrecognized layer names, -extension names, and `pNext` structs. It may assume the layer names and -extension names have been validated. - [\*]: The intention is for layers to have a well-defined baseline behavior. Some of the conventions or rules, for example, may be considered abuses of the specification. ###### Layer Library Interface Version 0 (Android) -An Android layer library supporting interface version 0 must define and export these -functions, unrelated to any Vulkan command despite the names, signatures, and -other similarities: +A layer library supporting interface version 0 must define and export these +introspection functions, unrelated to any Vulkan command despite the names, +signatures, and other similarities: + + - `vkEnumerateInstanceLayerProperties` enumerates all layers in a layer + library. This function never fails. - - `vkEnumerateInstanceLayerProperties` enumerates all instance layers in a - layer library. This function never fails. + When a layer library contains only one layer, this function may be an alias + to the layer's `vkEnumerateInstanceLayerProperties`. - `vkEnumerateInstanceExtensionProperties` enumerates instance extensions of - instance layers in a layer library. `pLayerName` is always a valid - instance layer name. This function never fails. + layers in a layer library. `pLayerName` is always a valid layer name. + This function never fails. - - `vkEnumerateDeviceLayerProperties` enumerates all device layers in a layer - library. `physicalDevice` is always `VK_NULL_HANDLE`. This function never - fails. + When a layer library contains only one layer, this function may be an alias + to the layer's `vkEnumerateInstanceExtensionProperties`. + + - `vkEnumerateDeviceLayerProperties` enumerates a subset (can be full, + proper, or empty subset) of layers in a layer library. `physicalDevice` is + always `VK_NULL_HANDLE`. This function never fails. + + If a layer is not enumerated by this function, it will not participate in + device command interception. - `vkEnumerateDeviceExtensionProperties` enumerates device extensions of - device layers in a layer library. `physicalDevice` is always - `VK_NULL_HANDLE`. `pLayerName` is always a valid device layer name. This - function never fails. + layers in a layer library. `physicalDevice` is always `VK_NULL_HANDLE`. + `pLayerName` is always a valid layer name. This function never fails. + +The introspection functions are not used by the desktop loader. + +It must also define and export these functions: - `GetInstanceProcAddr` behaves as if ``'s `vkGetInstanceProcAddr` is called, except @@ -1169,9 +1187,12 @@ other similarities: `vkEnumerateInstanceExtensionProperties`, or `vkEnumerateDeviceLayerProperties` (but _not_ `vkEnumerateDeviceExtensionProperties`), it returns a function pointer to - the function of the same name defined by this interface. + the corresponding introspection function defined by this interface. - when `pName` is `vkGetInstanceProcAddr`, it returns a function pointer to itself. + + For compatibility with older layer libraries, + - when `pName` is `vkCreateDevice`, it ignores `instance`. - when `pName` is a device command defined by Vulkan 1.0 or `VK_KHR_swapchain` (but _not_ other device commands), it may chain to -- cgit v1.2.3 From 00ccb33277f7a0a8ac2fd30627c8b438d059ac56 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 19 May 2016 13:08:11 -0600 Subject: doc: Add "Pending" string back in for shader checker "Pending" is used as a trigger keyword for document validator to know when one section is ending and a new section is starting so adding it back in to get doc validation passing. --- layers/vk_validation_layer_details.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layers/vk_validation_layer_details.md b/layers/vk_validation_layer_details.md index 2c78c39b..d2353819 100644 --- a/layers/vk_validation_layer_details.md +++ b/layers/vk_validation_layer_details.md @@ -137,7 +137,7 @@ It flags errors when inconsistencies are found across interfaces between shader | Bad capability | Flags error if a capability declared by the shader is not supported by Vulkan shaders | BAD_CAPABILITY | vkCreateGraphicsPipelines | TODO | NA | | NA | Enum used for informational messages | NONE | | TODO | None | -### VK_LAYER_LUNARG_core_validation Shader Checker Work +### VK_LAYER_LUNARG_core_validation Shader Checker Pending Work See the Khronos github repository for Vulkan-LoaderAndValidationLayers for additional pending issues, or to submit new validation requests -- cgit v1.2.3 From f67c311f6232b1904f7ac9b6d289ab7563e902a7 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 19 May 2016 09:59:30 -0600 Subject: layers: GH535 Add checks for Clear image errors This adds two new checks to make sure that CmdClearColorImage is not called with depth/stencil format image and that CmdClearDepthStencilImage is not called with color format image. Also add getImageState() helper function to image layer to simplify/unify code for lookup of IMAGE_STATE from imageMap. --- layers/image.cpp | 112 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 69 insertions(+), 43 deletions(-) diff --git a/layers/image.cpp b/layers/image.cpp index 840c543e..43b6452a 100644 --- a/layers/image.cpp +++ b/layers/image.cpp @@ -76,6 +76,14 @@ static void init_image(layer_data *my_data, const VkAllocationCallbacks *pAlloca layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_image"); } +static IMAGE_STATE const *getImageState(layer_data const *dev_data, VkImage image) { + auto it = dev_data->imageMap.find(image); + if (it == dev_data->imageMap.end()) { + return nullptr; + } + return &it->second; +} + VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pMsgCallback) { @@ -477,19 +485,19 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageVie const VkAllocationCallbacks *pAllocator, VkImageView *pView) { bool skipCall = false; layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); - auto imageEntry = device_data->imageMap.find(pCreateInfo->image); - if (imageEntry != device_data->imageMap.end()) { - if (pCreateInfo->subresourceRange.baseMipLevel >= imageEntry->second.mipLevels) { + auto imageEntry = getImageState(device_data, pCreateInfo->image); + if (imageEntry) { + if (pCreateInfo->subresourceRange.baseMipLevel >= imageEntry->mipLevels) { std::stringstream ss; ss << "vkCreateImageView called with baseMipLevel " << pCreateInfo->subresourceRange.baseMipLevel << " for image " - << pCreateInfo->image << " that only has " << imageEntry->second.mipLevels << " mip levels."; + << pCreateInfo->image << " that only has " << imageEntry->mipLevels << " mip levels."; skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, IMAGE_VIEW_CREATE_ERROR, "IMAGE", "%s", ss.str().c_str()); } - if (pCreateInfo->subresourceRange.baseArrayLayer >= imageEntry->second.arraySize) { + if (pCreateInfo->subresourceRange.baseArrayLayer >= imageEntry->arraySize) { std::stringstream ss; ss << "vkCreateImageView called with baseArrayLayer " << pCreateInfo->subresourceRange.baseArrayLayer << " for image " - << pCreateInfo->image << " that only has " << imageEntry->second.arraySize << " array layers."; + << pCreateInfo->image << " that only has " << imageEntry->arraySize << " array layers."; skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, IMAGE_VIEW_CREATE_ERROR, "IMAGE", "%s", ss.str().c_str()); } @@ -506,8 +514,8 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageVie IMAGE_VIEW_CREATE_ERROR, "IMAGE", "%s", ss.str().c_str()); } - VkImageCreateFlags imageFlags = imageEntry->second.flags; - VkFormat imageFormat = imageEntry->second.format; + VkImageCreateFlags imageFlags = imageEntry->flags; + VkFormat imageFormat = imageEntry->format; VkFormat ivciFormat = pCreateInfo->format; VkImageAspectFlags aspectMask = pCreateInfo->subresourceRange.aspectMask; @@ -644,6 +652,19 @@ VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkI } } + auto image_state = getImageState(device_data, image); + if (image_state) { + if (vk_format_is_depth_or_stencil(image_state->format)) { + char const str[] = "vkCmdClearColorImage called with depth/stencil image."; + skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + reinterpret_cast(image), __LINE__, IMAGE_INVALID_FORMAT, "IMAGE", str); + } else if (vk_format_is_compressed(image_state->format)) { + char const str[] = "vkCmdClearColorImage called with compressed image."; + skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + reinterpret_cast(image), __LINE__, IMAGE_INVALID_FORMAT, "IMAGE", str); + } + } + if (!skipCall) { device_data->device_dispatch_table->CmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges); } @@ -667,6 +688,13 @@ CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageL } } + auto image_state = getImageState(device_data, image); + if (image_state && !vk_format_is_depth_or_stencil(image_state->format)) { + char const str[] = "vkCmdClearDepthStencilImage called without a depth/stencil image."; + skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + reinterpret_cast(image), __LINE__, IMAGE_INVALID_FORMAT, "IMAGE", str); + } + if (!skipCall) { device_data->device_dispatch_table->CmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges); @@ -711,7 +739,7 @@ static bool region_intersects(const VkImageCopy *src, const VkImageCopy *dst, Vk } // Returns true if offset and extent exceed image extents -static bool exceeds_bounds(const VkOffset3D *offset, const VkExtent3D *extent, IMAGE_STATE *image) { +static bool exceeds_bounds(const VkOffset3D *offset, const VkExtent3D *extent, const IMAGE_STATE *image) { bool result = false; // Extents/depths cannot be negative but checks left in for clarity @@ -723,12 +751,12 @@ bool cmd_copy_image_valid_usage(VkCommandBuffer commandBuffer, VkImage srcImage, bool skipCall = false; layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); - auto srcImageEntry = device_data->imageMap.find(srcImage); - auto dstImageEntry = device_data->imageMap.find(dstImage); + auto srcImageEntry = getImageState(device_data, srcImage); + auto dstImageEntry = getImageState(device_data, dstImage); // TODO: This does not cover swapchain-created images. This should fall out when this layer is moved // into the core_validation layer - if ((srcImageEntry != device_data->imageMap.end()) && (dstImageEntry != device_data->imageMap.end())) { + if (srcImageEntry && dstImageEntry) { for (uint32_t i = 0; i < regionCount; i++) { @@ -788,7 +816,7 @@ bool cmd_copy_image_valid_usage(VkCommandBuffer commandBuffer, VkImage srcImage, // If either of the calling command's srcImage or dstImage parameters are of VkImageType VK_IMAGE_TYPE_3D, // the baseArrayLayer and layerCount members of both srcSubresource and dstSubresource must be 0 and 1, respectively - if (((srcImageEntry->second.imageType == VK_IMAGE_TYPE_3D) || (dstImageEntry->second.imageType == VK_IMAGE_TYPE_3D)) && + if (((srcImageEntry->imageType == VK_IMAGE_TYPE_3D) || (dstImageEntry->imageType == VK_IMAGE_TYPE_3D)) && ((pRegions[i].srcSubresource.baseArrayLayer != 0) || (pRegions[i].srcSubresource.layerCount != 1) || (pRegions[i].dstSubresource.baseArrayLayer != 0) || (pRegions[i].dstSubresource.layerCount != 1))) { std::stringstream ss; @@ -800,7 +828,7 @@ bool cmd_copy_image_valid_usage(VkCommandBuffer commandBuffer, VkImage srcImage, } // MipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created - if (pRegions[i].srcSubresource.mipLevel >= srcImageEntry->second.mipLevels) { + if (pRegions[i].srcSubresource.mipLevel >= srcImageEntry->mipLevels) { std::stringstream ss; ss << "vkCmdCopyImage: pRegions[" << i << "] specifies a src mipLevel greater than the number specified when the srcImage was created."; @@ -808,7 +836,7 @@ bool cmd_copy_image_valid_usage(VkCommandBuffer commandBuffer, VkImage srcImage, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, reinterpret_cast(commandBuffer), __LINE__, IMAGE_INVALID_EXTENTS, "IMAGE", "%s", ss.str().c_str()); } - if (pRegions[i].dstSubresource.mipLevel >= dstImageEntry->second.mipLevels) { + if (pRegions[i].dstSubresource.mipLevel >= dstImageEntry->mipLevels) { std::stringstream ss; ss << "vkCmdCopyImage: pRegions[" << i << "] specifies a dst mipLevel greater than the number specified when the dstImage was created."; @@ -819,20 +847,18 @@ bool cmd_copy_image_valid_usage(VkCommandBuffer commandBuffer, VkImage srcImage, // (baseArrayLayer + layerCount) must be less than or equal to the arrayLayers specified in VkImageCreateInfo when the // image was created - if ((pRegions[i].srcSubresource.baseArrayLayer + pRegions[i].srcSubresource.layerCount) > - srcImageEntry->second.arraySize) { + if ((pRegions[i].srcSubresource.baseArrayLayer + pRegions[i].srcSubresource.layerCount) > srcImageEntry->arraySize) { std::stringstream ss; - ss << "vkCmdCopyImage: srcImage arrayLayers was " << srcImageEntry->second.arraySize << " but subRegion[" << i + ss << "vkCmdCopyImage: srcImage arrayLayers was " << srcImageEntry->arraySize << " but subRegion[" << i << "] baseArrayLayer + layerCount is " << (pRegions[i].srcSubresource.baseArrayLayer + pRegions[i].srcSubresource.layerCount); skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, reinterpret_cast(commandBuffer), __LINE__, IMAGE_INVALID_EXTENTS, "IMAGE", "%s", ss.str().c_str()); } - if ((pRegions[i].dstSubresource.baseArrayLayer + pRegions[i].dstSubresource.layerCount) > - dstImageEntry->second.arraySize) { + if ((pRegions[i].dstSubresource.baseArrayLayer + pRegions[i].dstSubresource.layerCount) > dstImageEntry->arraySize) { std::stringstream ss; - ss << "vkCmdCopyImage: dstImage arrayLayers was " << dstImageEntry->second.arraySize << " but subRegion[" << i + ss << "vkCmdCopyImage: dstImage arrayLayers was " << dstImageEntry->arraySize << " but subRegion[" << i << "] baseArrayLayer + layerCount is " << (pRegions[i].dstSubresource.baseArrayLayer + pRegions[i].dstSubresource.layerCount); skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, @@ -841,7 +867,7 @@ bool cmd_copy_image_valid_usage(VkCommandBuffer commandBuffer, VkImage srcImage, } // The source region specified by a given element of pRegions must be a region that is contained within srcImage - if (exceeds_bounds(&pRegions[i].srcOffset, &pRegions[i].extent, &srcImageEntry->second)) { + if (exceeds_bounds(&pRegions[i].srcOffset, &pRegions[i].extent, srcImageEntry)) { std::stringstream ss; ss << "vkCmdCopyImage: srcSubResource in pRegions[" << i << "] exceeds extents srcImage was created with"; skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, @@ -850,7 +876,7 @@ bool cmd_copy_image_valid_usage(VkCommandBuffer commandBuffer, VkImage srcImage, } // The destination region specified by a given element of pRegions must be a region that is contained within dstImage - if (exceeds_bounds(&pRegions[i].dstOffset, &pRegions[i].extent, &dstImageEntry->second)) { + if (exceeds_bounds(&pRegions[i].dstOffset, &pRegions[i].extent, dstImageEntry)) { std::stringstream ss; ss << "vkCmdCopyImage: dstSubResource in pRegions[" << i << "] exceeds extents dstImage was created with"; skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, @@ -862,7 +888,7 @@ bool cmd_copy_image_valid_usage(VkCommandBuffer commandBuffer, VkImage srcImage, // must not overlap in memory if (srcImage == dstImage) { for (uint32_t j = 0; j < regionCount; j++) { - if (region_intersects(&pRegions[i], &pRegions[j], srcImageEntry->second.imageType)) { + if (region_intersects(&pRegions[i], &pRegions[j], srcImageEntry->imageType)) { std::stringstream ss; ss << "vkCmdCopyImage: pRegions[" << i << "] src overlaps with pRegions[" << j << "]."; skipCall |= @@ -877,16 +903,16 @@ bool cmd_copy_image_valid_usage(VkCommandBuffer commandBuffer, VkImage srcImage, // The formats of srcImage and dstImage must be compatible. Formats are considered compatible if their texel size in bytes // is the same between both formats. For example, VK_FORMAT_R8G8B8A8_UNORM is compatible with VK_FORMAT_R32_UINT because // because both texels are 4 bytes in size. Depth/stencil formats must match exactly. - if (is_depth_format(srcImageEntry->second.format) || is_depth_format(dstImageEntry->second.format)) { - if (srcImageEntry->second.format != dstImageEntry->second.format) { + if (is_depth_format(srcImageEntry->format) || is_depth_format(dstImageEntry->format)) { + if (srcImageEntry->format != dstImageEntry->format) { char const str[] = "vkCmdCopyImage called with unmatched source and dest image depth/stencil formats."; skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, reinterpret_cast(commandBuffer), __LINE__, IMAGE_MISMATCHED_IMAGE_FORMAT, "IMAGE", str); } } else { - size_t srcSize = vk_format_get_size(srcImageEntry->second.format); - size_t destSize = vk_format_get_size(dstImageEntry->second.format); + size_t srcSize = vk_format_get_size(srcImageEntry->format); + size_t destSize = vk_format_get_size(dstImageEntry->format); if (srcSize != destSize) { char const str[] = "vkCmdCopyImage called with unmatched source and dest image format sizes."; skipCall |= @@ -1019,13 +1045,13 @@ CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcI bool skipCall = false; layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); - auto srcImageEntry = device_data->imageMap.find(srcImage); - auto dstImageEntry = device_data->imageMap.find(dstImage); + auto srcImageEntry = getImageState(device_data, srcImage); + auto dstImageEntry = getImageState(device_data, dstImage); - if ((srcImageEntry != device_data->imageMap.end()) && (dstImageEntry != device_data->imageMap.end())) { + if (srcImageEntry && dstImageEntry) { - VkFormat srcFormat = srcImageEntry->second.format; - VkFormat dstFormat = dstImageEntry->second.format; + VkFormat srcFormat = srcImageEntry->format; + VkFormat dstFormat = dstImageEntry->format; // Validate consistency for signed and unsigned formats if ((vk_format_is_sint(srcFormat) && !vk_format_is_sint(dstFormat)) || @@ -1171,8 +1197,8 @@ CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout s VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve *pRegions) { bool skipCall = false; layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); - auto srcImageEntry = device_data->imageMap.find(srcImage); - auto dstImageEntry = device_data->imageMap.find(dstImage); + auto srcImageEntry = getImageState(device_data, srcImage); + auto dstImageEntry = getImageState(device_data, dstImage); // For each region, the number of layers in the image subresource should not be zero // For each region, src and dest image aspect must be color only @@ -1204,26 +1230,26 @@ CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout s } } - if ((srcImageEntry != device_data->imageMap.end()) && (dstImageEntry != device_data->imageMap.end())) { - if (srcImageEntry->second.format != dstImageEntry->second.format) { + if (srcImageEntry && dstImageEntry) { + if (srcImageEntry->format != dstImageEntry->format) { char const str[] = "vkCmdResolveImage called with unmatched source and dest formats."; skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_FORMAT, "IMAGE", str); } - if (srcImageEntry->second.imageType != dstImageEntry->second.imageType) { + if (srcImageEntry->imageType != dstImageEntry->imageType) { char const str[] = "vkCmdResolveImage called with unmatched source and dest image types."; skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, (uint64_t)commandBuffer, __LINE__, IMAGE_MISMATCHED_IMAGE_TYPE, "IMAGE", str); } - if (srcImageEntry->second.samples == VK_SAMPLE_COUNT_1_BIT) { + if (srcImageEntry->samples == VK_SAMPLE_COUNT_1_BIT) { char const str[] = "vkCmdResolveImage called with source sample count less than 2."; skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, (uint64_t)commandBuffer, __LINE__, IMAGE_INVALID_RESOLVE_SAMPLES, "IMAGE", str); } - if (dstImageEntry->second.samples != VK_SAMPLE_COUNT_1_BIT) { + if (dstImageEntry->samples != VK_SAMPLE_COUNT_1_BIT) { char const str[] = "vkCmdResolveImage called with dest sample count greater than 1."; skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, @@ -1243,11 +1269,11 @@ GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresour layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); VkFormat format; - auto imageEntry = device_data->imageMap.find(image); + auto imageEntry = getImageState(device_data, image); // Validate that image aspects match formats - if (imageEntry != device_data->imageMap.end()) { - format = imageEntry->second.format; + if (imageEntry) { + format = imageEntry->format; if (vk_format_is_color(format)) { if (pSubresource->aspectMask != VK_IMAGE_ASPECT_COLOR_BIT) { std::stringstream ss; -- cgit v1.2.3 From 3abddc22e46db5f09e6f4f90e1addb8e9d651765 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 19 May 2016 10:10:09 -0600 Subject: layers: Replace is_depth() in image layer with util function vk_layer_utils has function vk_format_is_depth_or_stencil() that is exactly the same as local is_depth() function so kill local function and use utility function. --- layers/image.cpp | 23 ++--------------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/layers/image.cpp b/layers/image.cpp index 43b6452a..88ae5ba1 100644 --- a/layers/image.cpp +++ b/layers/image.cpp @@ -214,25 +214,6 @@ static const VkLayerProperties global_layer = { // Start of the Image layer proper -// Returns TRUE if a format is a depth-compatible format -bool is_depth_format(VkFormat format) { - bool result = false; - switch (format) { - case VK_FORMAT_D16_UNORM: - case VK_FORMAT_X8_D24_UNORM_PACK32: - case VK_FORMAT_D32_SFLOAT: - case VK_FORMAT_S8_UINT: - case VK_FORMAT_D16_UNORM_S8_UINT: - case VK_FORMAT_D24_UNORM_S8_UINT: - case VK_FORMAT_D32_SFLOAT_S8_UINT: - result = true; - break; - default: - break; - } - return result; -} - static inline uint32_t validate_VkImageLayoutKHR(VkImageLayout input_value) { return ((validate_VkImageLayout(input_value) == 1) || (input_value == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR)); } @@ -457,7 +438,7 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderP // Any depth buffers specified as attachments? bool depthFormatPresent = false; for (uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i) { - depthFormatPresent |= is_depth_format(pCreateInfo->pAttachments[i].format); + depthFormatPresent |= vk_format_is_depth_or_stencil(pCreateInfo->pAttachments[i].format); } if (!depthFormatPresent) { @@ -903,7 +884,7 @@ bool cmd_copy_image_valid_usage(VkCommandBuffer commandBuffer, VkImage srcImage, // The formats of srcImage and dstImage must be compatible. Formats are considered compatible if their texel size in bytes // is the same between both formats. For example, VK_FORMAT_R8G8B8A8_UNORM is compatible with VK_FORMAT_R32_UINT because // because both texels are 4 bytes in size. Depth/stencil formats must match exactly. - if (is_depth_format(srcImageEntry->format) || is_depth_format(dstImageEntry->format)) { + if (vk_format_is_depth_or_stencil(srcImageEntry->format) || vk_format_is_depth_or_stencil(dstImageEntry->format)) { if (srcImageEntry->format != dstImageEntry->format) { char const str[] = "vkCmdCopyImage called with unmatched source and dest image depth/stencil formats."; skipCall |= -- cgit v1.2.3 From 079c48359914ce77f8a6a7abe8faaaee269e9490 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 19 May 2016 11:08:34 -0600 Subject: tests: GH535 Add tests for clear image errors Add test that clears a depth/stencil image with CmdClearColorImage() and one that clears color image with CmdClearDepthStencilImage() --- layers/vk_validation_layer_details.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layers/vk_validation_layer_details.md b/layers/vk_validation_layer_details.md index d2353819..dd6139e6 100644 --- a/layers/vk_validation_layer_details.md +++ b/layers/vk_validation_layer_details.md @@ -209,7 +209,7 @@ DETAILS TABLE PENDING | Image Type Mismatch | Verify that Image commands with source and dest images use matching types | MISMATCHED_IMAGE_TYPE | vkCmdCopyImage vkCmdResolveImage | ResolveImageTypeMismatch | NA | | Image Format Mismatch | Verify that Image commands with source and dest images use matching formats | MISMATCHED_IMAGE_FORMAT | vkCmdCopyImage vkCmdResolveImage | CopyImageDepthStencilFormatMismatch ResolveImageFormatMismatch | NA | | Resolve Sample Count | Verifies that source and dest images sample counts are valid | INVALID_RESOLVE_SAMPLES | vkCmdResolveImage | ResolveImageHighSampleCount ResolveImageLowSampleCount | NA | -| Verify Format | Verifies the formats are valid for this image operation | INVALID_FORMAT | vkCreateImageView vkCmdBlitImage | ImageLayerViewTests | NA | +| Verify Format | Verifies the formats are valid for this image operation | INVALID_FORMAT | vkCreateImageView vkCmdBlitImage | ImageLayerViewTests ClearImageErrors | NA | | Verify Correct Image Filter| Verifies that specified filter is valid | INVALID_FILTER | vkCmdBlitImage | MiscImageLayerTests | NA | | Verify Correct Image Settings | Verifies that values are valid for a given resource or subresource | INVALID_IMAGE_RESOURCE | vkCmdPipelineBarrier | MiscImageLayerTests | NA | | Verify Image Format Limits | Verifies that image creation parameters are with the device format limits | INVALID_FORMAT_LIMITS_VIOLATION | vkCreateImage | ImageFormatLimits | NA | -- cgit v1.2.3 From a3f3e12ac30954ec0f440bc6350f00035a6aef7f Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Thu, 19 May 2016 17:01:48 -0600 Subject: layers: GH7, Fix bad var names in swapchain layer Change-Id: I46331c530654334abacbfb3ffd3656809f6b7d5d --- layers/swapchain.h | 41 ++++++++++++++++------------------------- 1 file changed, 16 insertions(+), 25 deletions(-) diff --git a/layers/swapchain.h b/layers/swapchain.h index 3348d623..a8b2d8bf 100644 --- a/layers/swapchain.h +++ b/layers/swapchain.h @@ -31,7 +31,7 @@ using namespace std; // Swapchain ERROR codes -typedef enum _SWAPCHAIN_ERROR { +enum SWAPCHAIN_ERROR { SWAPCHAIN_INVALID_HANDLE, // Handle used that isn't currently valid SWAPCHAIN_NULL_POINTER, // Pointer set to NULL, instead of being a valid pointer SWAPCHAIN_EXT_NOT_ENABLED_BUT_USED, // Did not enable WSI extension, but called WSI function @@ -74,7 +74,7 @@ typedef enum _SWAPCHAIN_ERROR { SWAPCHAIN_SURFACE_NOT_SUPPORTED_WITH_QUEUE, // A surface is not supported by a given queueFamilyIndex, as seen by // vkGetPhysicalDeviceSurfaceSupportKHR() SWAPCHAIN_NO_SYNC_FOR_ACQUIRE, // vkAcquireNextImageKHR should be called with a valid semaphore and/or fence -} SWAPCHAIN_ERROR; +}; // The following is for logging error messages: #define LAYER_NAME (char *) "Swapchain" @@ -138,25 +138,16 @@ typedef enum _SWAPCHAIN_ERROR { // info that is used for validating the WSI extensions. // Forward declarations: -struct _SwpInstance; -struct _SwpSurface; -struct _SwpPhysicalDevice; -struct _SwpDevice; -struct _SwpSwapchain; -struct _SwpImage; -struct _SwpQueue; - -typedef _SwpInstance SwpInstance; -typedef _SwpSurface SwpSurface; -; -typedef _SwpPhysicalDevice SwpPhysicalDevice; -typedef _SwpDevice SwpDevice; -typedef _SwpSwapchain SwpSwapchain; -typedef _SwpImage SwpImage; -typedef _SwpQueue SwpQueue; +struct SwpInstance; +struct SwpSurface; +struct SwpPhysicalDevice; +struct SwpDevice; +struct SwpSwapchain; +struct SwpImage; +struct SwpQueue; // Create one of these for each VkInstance: -struct _SwpInstance { +struct SwpInstance { // The actual handle for this VkInstance: VkInstance instance; @@ -198,7 +189,7 @@ struct _SwpInstance { }; // Create one of these for each VkSurfaceKHR: -struct _SwpSurface { +struct SwpSurface { // The actual handle for this VkSurfaceKHR: VkSurfaceKHR surface; @@ -224,7 +215,7 @@ struct _SwpSurface { }; // Create one of these for each VkPhysicalDevice within a VkInstance: -struct _SwpPhysicalDevice { +struct SwpPhysicalDevice { // The actual handle for this VkPhysicalDevice: VkPhysicalDevice physicalDevice; @@ -263,7 +254,7 @@ struct _SwpPhysicalDevice { }; // Create one of these for each VkDevice within a VkInstance: -struct _SwpDevice { +struct SwpDevice { // The actual handle for this VkDevice: VkDevice device; @@ -282,7 +273,7 @@ struct _SwpDevice { }; // Create one of these for each VkImage within a VkSwapchainKHR: -struct _SwpImage { +struct SwpImage { // The actual handle for this VkImage: VkImage image; @@ -295,7 +286,7 @@ struct _SwpImage { }; // Create one of these for each VkSwapchainKHR within a VkDevice: -struct _SwpSwapchain { +struct SwpSwapchain { // The actual handle for this VkSwapchainKHR: VkSwapchainKHR swapchain; @@ -315,7 +306,7 @@ struct _SwpSwapchain { }; // Create one of these for each VkQueue within a VkDevice: -struct _SwpQueue { +struct SwpQueue { // The actual handle for this VkQueue: VkQueue queue; -- cgit v1.2.3 From 678d82866e30739eadf49067f034e09277a6e9f4 Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Thu, 19 May 2016 17:08:10 -0600 Subject: layers: GH7, Fix bad var names in threading layer Change-Id: Iabfd7900a934162a425008593ecc0f0b4d56476e --- layers/threading.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/layers/threading.h b/layers/threading.h index 96175394..8e90f0a5 100644 --- a/layers/threading.h +++ b/layers/threading.h @@ -34,11 +34,11 @@ #endif // Draw State ERROR codes -typedef enum _THREADING_CHECKER_ERROR { +enum THREADING_CHECKER_ERROR { THREADING_CHECKER_NONE, // Used for INFO & other non-error messages THREADING_CHECKER_MULTIPLE_THREADS, // Object used simultaneously by multiple threads THREADING_CHECKER_SINGLE_THREAD_REUSE, // Object used simultaneously by recursion in single thread -} THREADING_CHECKER_ERROR; +}; struct object_use_data { loader_platform_thread_id thread; -- cgit v1.2.3 From 7cb5eba2c4de2e6be60e078190916a4410cf8bcd Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Thu, 19 May 2016 17:10:01 -0600 Subject: layers: GH7, Replace bad variables in image layer Change-Id: I6c90dafe83bf4e9674b4e32ed867d77b5820006d --- layers/image.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/layers/image.h b/layers/image.h index 66a967ca..93b6c7ed 100644 --- a/layers/image.h +++ b/layers/image.h @@ -26,7 +26,7 @@ #include "vk_layer_logging.h" // Image ERROR codes -typedef enum _IMAGE_ERROR { +enum IMAGE_ERROR { IMAGE_NONE, // Used for INFO & other non-error messages IMAGE_FORMAT_UNSUPPORTED, // Request to create Image or RenderPass with a format that is not supported IMAGE_RENDERPASS_INVALID_ATTACHMENT, // Invalid image layouts and/or load/storeOps for an attachment when creating RenderPass @@ -44,9 +44,9 @@ typedef enum _IMAGE_ERROR { IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, // Device limits for this format have been exceeded IMAGE_INVALID_LAYOUT, // Operation specifies an invalid layout IMAGE_INVALID_EXTENTS, // Operation specifies invalid image extents -} IMAGE_ERROR; +}; -typedef struct _IMAGE_STATE { +struct IMAGE_STATE { uint32_t mipLevels; uint32_t arraySize; VkFormat format; @@ -54,13 +54,13 @@ typedef struct _IMAGE_STATE { VkImageType imageType; VkExtent3D extent; VkImageCreateFlags flags; - _IMAGE_STATE() + IMAGE_STATE() : mipLevels(0), arraySize(0), format(VK_FORMAT_UNDEFINED), samples(VK_SAMPLE_COUNT_1_BIT), imageType(VK_IMAGE_TYPE_RANGE_SIZE), extent{}, flags(0){}; - _IMAGE_STATE(const VkImageCreateInfo *pCreateInfo) + IMAGE_STATE(const VkImageCreateInfo *pCreateInfo) : mipLevels(pCreateInfo->mipLevels), arraySize(pCreateInfo->arrayLayers), format(pCreateInfo->format), samples(pCreateInfo->samples), imageType(pCreateInfo->imageType), extent(pCreateInfo->extent), flags(pCreateInfo->flags){}; -} IMAGE_STATE; +}; #endif // IMAGE_H -- cgit v1.2.3 From b2ea603775cf8038ff2bb9ab86cb30aa903f4b87 Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Thu, 19 May 2016 17:10:58 -0600 Subject: layers: GH7, Fix bad var names in device_limits Change-Id: I6dec3fd87f62ac171886562206f3fc528f24bc29 --- layers/device_limits.h | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/layers/device_limits.h b/layers/device_limits.h index 1eec8ced..bec9dce1 100644 --- a/layers/device_limits.h +++ b/layers/device_limits.h @@ -24,7 +24,7 @@ using namespace std; // Device Limits ERROR codes -typedef enum _DEV_LIMITS_ERROR { +enum DEV_LIMITS_ERROR { DEVLIMITS_NONE, // Used for INFO & other non-error messages DEVLIMITS_INVALID_INSTANCE, // Invalid instance used DEVLIMITS_INVALID_PHYSICAL_DEVICE, // Invalid physical device used @@ -38,22 +38,22 @@ typedef enum _DEV_LIMITS_ERROR { DEVLIMITS_INVALID_UNIFORM_BUFFER_OFFSET, // Uniform buffer offset violates device limit granularity DEVLIMITS_INVALID_STORAGE_BUFFER_OFFSET, // Storage buffer offset violates device limit granularity DEVLIMITS_INVALID_BUFFER_UPDATE_ALIGNMENT, // Alignment requirement for buffer update is violated -} DEV_LIMITS_ERROR; +}; -typedef enum _CALL_STATE { +enum CALL_STATE{ UNCALLED, // Function has not been called QUERY_COUNT, // Function called once to query a count QUERY_DETAILS, // Function called w/ a count to query details -} CALL_STATE; +}; -typedef struct _INSTANCE_STATE { +struct INSTANCE_STATE { // Track the call state and array size for physical devices CALL_STATE vkEnumeratePhysicalDevicesState; uint32_t physicalDevicesCount; - _INSTANCE_STATE() : vkEnumeratePhysicalDevicesState(UNCALLED), physicalDevicesCount(0){}; -} INSTANCE_STATE; + INSTANCE_STATE() : vkEnumeratePhysicalDevicesState(UNCALLED), physicalDevicesCount(0){}; +}; -typedef struct _PHYSICAL_DEVICE_STATE { +struct PHYSICAL_DEVICE_STATE { // Track the call state and array sizes for various query functions CALL_STATE vkGetPhysicalDeviceQueueFamilyPropertiesState; uint32_t queueFamilyPropertiesCount; @@ -62,9 +62,9 @@ typedef struct _PHYSICAL_DEVICE_STATE { CALL_STATE vkGetPhysicalDeviceExtensionPropertiesState; uint32_t deviceExtensionCount; CALL_STATE vkGetPhysicalDeviceFeaturesState; - _PHYSICAL_DEVICE_STATE() + PHYSICAL_DEVICE_STATE() : vkGetPhysicalDeviceQueueFamilyPropertiesState(UNCALLED), queueFamilyPropertiesCount(0), vkGetPhysicalDeviceLayerPropertiesState(UNCALLED), deviceLayerCount(0), vkGetPhysicalDeviceExtensionPropertiesState(UNCALLED), deviceExtensionCount(0), vkGetPhysicalDeviceFeaturesState(UNCALLED){}; -} PHYSICAL_DEVICE_STATE; +}; -- cgit v1.2.3 From bcee0e16df42f51e9cf4dae0f9458cb22d216bb0 Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Thu, 19 May 2016 17:23:38 -0600 Subject: layers: GH7, Fix bad var names in core_validation Change-Id: I4fd1b8bb1cb83af633e04fc561771b6d76732588 --- layers/core_validation.h | 20 ++++++++++---------- layers/core_validation_error_enums.h | 14 +++++++------- layers/core_validation_types.h | 33 ++++++++++++++++++--------------- layers/descriptor_sets.h | 2 +- 4 files changed, 36 insertions(+), 33 deletions(-) diff --git a/layers/core_validation.h b/layers/core_validation.h index f0878f33..1d312e12 100644 --- a/layers/core_validation.h +++ b/layers/core_validation.h @@ -110,20 +110,20 @@ struct MT_SWAP_CHAIN_INFO { }; #endif -typedef struct _SHADER_DS_MAPPING { +struct SHADER_DS_MAPPING { uint32_t slotCount; VkDescriptorSetLayoutCreateInfo *pShaderMappingSlot; -} SHADER_DS_MAPPING; +}; -typedef struct _GENERIC_HEADER { +struct GENERIC_HEADER { VkStructureType sType; const void *pNext; -} GENERIC_HEADER; +}; -typedef struct _IMAGE_LAYOUT_NODE { +struct IMAGE_LAYOUT_NODE { VkImageLayout layout; VkFormat format; -} IMAGE_LAYOUT_NODE; +}; // Store layouts and pushconstants for PipelineLayout struct PIPELINE_LAYOUT_NODE { @@ -263,7 +263,7 @@ class FRAMEBUFFER_NODE { std::vector attachments; }; -typedef struct _DESCRIPTOR_POOL_NODE { +struct DESCRIPTOR_POOL_NODE { VkDescriptorPool pool; uint32_t maxSets; // Max descriptor sets allowed in this pool uint32_t availableSets; // Available descriptor sets in this pool @@ -273,7 +273,7 @@ typedef struct _DESCRIPTOR_POOL_NODE { std::vector maxDescriptorTypeCount; // Max # of descriptors of each type in this pool std::vector availableDescriptorTypeCount; // Available # of descriptors of each type in this pool - _DESCRIPTOR_POOL_NODE(const VkDescriptorPool pool, const VkDescriptorPoolCreateInfo *pCreateInfo) + DESCRIPTOR_POOL_NODE(const VkDescriptorPool pool, const VkDescriptorPoolCreateInfo *pCreateInfo) : pool(pool), maxSets(pCreateInfo->maxSets), availableSets(pCreateInfo->maxSets), createInfo(*pCreateInfo), maxDescriptorTypeCount(VK_DESCRIPTOR_TYPE_RANGE_SIZE, 0), availableDescriptorTypeCount(VK_DESCRIPTOR_TYPE_RANGE_SIZE, 0) { if (createInfo.poolSizeCount) { // Shadow type struct from ptr into local struct @@ -292,12 +292,12 @@ typedef struct _DESCRIPTOR_POOL_NODE { createInfo.pPoolSizes = NULL; // Make sure this is NULL so we don't try to clean it up } } - ~_DESCRIPTOR_POOL_NODE() { + ~DESCRIPTOR_POOL_NODE() { delete[] createInfo.pPoolSizes; // TODO : pSets are currently freed in deletePools function which uses freeShadowUpdateTree function // need to migrate that struct to smart ptrs for auto-cleanup } -} DESCRIPTOR_POOL_NODE; +}; typedef struct stencil_data { uint32_t compareMask; diff --git a/layers/core_validation_error_enums.h b/layers/core_validation_error_enums.h index 03827c2a..e6d0ed37 100644 --- a/layers/core_validation_error_enums.h +++ b/layers/core_validation_error_enums.h @@ -24,7 +24,7 @@ #define CORE_VALIDATION_ERROR_ENUMS_H_ // Mem Tracker ERROR codes -typedef enum _MEM_TRACK_ERROR { +enum MEM_TRACK_ERROR { MEMTRACK_NONE, // Used for INFO & other non-error messages MEMTRACK_INVALID_CB, // Cmd Buffer invalid MEMTRACK_INVALID_MEM_OBJ, // Invalid Memory Object @@ -39,10 +39,10 @@ typedef enum _MEM_TRACK_ERROR { MEMTRACK_REBIND_OBJECT, // Non-sparse object bindings are immutable MEMTRACK_INVALID_USAGE_FLAG, // Usage flags specified at image/buffer create conflict w/ use of object MEMTRACK_INVALID_MAP, // Size flag specified at alloc is too small for mapping range -} MEM_TRACK_ERROR; +}; // Draw State ERROR codes -typedef enum _DRAW_STATE_ERROR { +enum DRAW_STATE_ERROR { // TODO: Remove the comments here or expand them. There isn't any additional information in the // comments than in the name in almost all cases. DRAWSTATE_NONE, // Used for INFO & other non-error messages @@ -214,9 +214,9 @@ typedef enum _DRAW_STATE_ERROR { DRAWSTATE_INVALID_QUEUE_INDEX, // Specified queue index exceeds number // of queried queue families DRAWSTATE_PUSH_CONSTANTS_ERROR, // Push constants exceed maxPushConstantSize -} DRAW_STATE_ERROR; +}; -typedef enum _SHADER_CHECKER_ERROR { +enum SHADER_CHECKER_ERROR { SHADER_CHECKER_NONE, SHADER_CHECKER_INTERFACE_TYPE_MISMATCH, // Type mismatch between shader stages or shader and pipeline SHADER_CHECKER_OUTPUT_NOT_CONSUMED, // Entry appears in output interface, but missing in input @@ -234,6 +234,6 @@ typedef enum _SHADER_CHECKER_ERROR { SHADER_CHECKER_DESCRIPTOR_NOT_ACCESSIBLE_FROM_STAGE, // Descriptor used by shader, but not accessible from stage SHADER_CHECKER_FEATURE_NOT_ENABLED, // Shader uses capability requiring a feature not enabled on device SHADER_CHECKER_BAD_CAPABILITY, // Shader uses capability not supported by Vulkan (OpenCL features) -} SHADER_CHECKER_ERROR; +}; -#endif // CORE_VALIDATION_ERROR_ENUMS_H_ \ No newline at end of file +#endif // CORE_VALIDATION_ERROR_ENUMS_H_ diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index 98fa5a8f..5d9f0715 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -72,12 +72,12 @@ class BUFFER_NODE : public BASE_NODE { BUFFER_NODE(const BUFFER_NODE &rh_obj) : mem(rh_obj.mem), createInfo(rh_obj.createInfo) { in_use.store(rh_obj.in_use.load()); }; }; -typedef struct _SAMPLER_NODE { +struct SAMPLER_NODE { VkSampler sampler; VkSamplerCreateInfo createInfo; - _SAMPLER_NODE(const VkSampler *ps, const VkSamplerCreateInfo *pci) : sampler(*ps), createInfo(*pci){}; -} SAMPLER_NODE; + SAMPLER_NODE(const VkSampler *ps, const VkSamplerCreateInfo *pci) : sampler(*ps), createInfo(*pci){}; +}; class IMAGE_NODE : public BASE_NODE { public: @@ -154,7 +154,8 @@ class SWAPCHAIN_NODE { } ~SWAPCHAIN_NODE() { delete[] pQueueFamilyIndices; } }; -typedef enum _DRAW_TYPE { + +enum DRAW_TYPE { DRAW = 0, DRAW_INDEXED = 1, DRAW_INDIRECT = 2, @@ -162,7 +163,7 @@ typedef enum _DRAW_TYPE { DRAW_BEGIN_RANGE = DRAW, DRAW_END_RANGE = DRAW_INDEXED_INDIRECT, NUM_DRAW_TYPES = (DRAW_END_RANGE - DRAW_BEGIN_RANGE + 1), -} DRAW_TYPE; +}; class IMAGE_CMD_BUF_LAYOUT_NODE { public: @@ -222,8 +223,9 @@ struct RENDER_PASS_NODE { } } }; + // Cmd Buffer Tracking -typedef enum _CMD_TYPE { +enum CMD_TYPE { CMD_BINDPIPELINE, CMD_BINDPIPELINEDELTA, CMD_SETVIEWPORTSTATE, @@ -274,23 +276,24 @@ typedef enum _CMD_TYPE { CMD_ENDRENDERPASS, CMD_EXECUTECOMMANDS, CMD_END, // Should be last command in any RECORDED cmd buffer -} CMD_TYPE; +}; + // Data structure for holding sequence of cmds in cmd buffer -typedef struct _CMD_NODE { +struct CMD_NODE { CMD_TYPE type; uint64_t cmdNumber; -} CMD_NODE; +}; -typedef enum _CB_STATE { +enum CB_STATE { CB_NEW, // Newly created CB w/o any cmds CB_RECORDING, // BeginCB has been called on this CB CB_RECORDED, // EndCB has been called on this CB CB_INVALID // CB had a bound descriptor set destroyed or updated -} CB_STATE; +}; // CB Status -- used to track status of various bindings on cmd buffer objects typedef VkFlags CBStatusFlags; -typedef enum _CBStatusFlagBits { +enum CBStatusFlagBits { // clang-format off CBSTATUS_NONE = 0x00000000, // No status is set CBSTATUS_VIEWPORT_SET = 0x00000001, // Viewport has been set @@ -305,7 +308,7 @@ typedef enum _CBStatusFlagBits { CBSTATUS_SCISSOR_SET = 0x00000200, // Scissor has been set CBSTATUS_ALL = 0x000003FF, // All dynamic state set // clang-format on -} CBStatusFlagBits; +}; struct QueryObject { VkQueryPool pool; @@ -323,7 +326,7 @@ template <> struct hash { } }; } -typedef struct _DRAW_DATA { std::vector buffers; } DRAW_DATA; +struct DRAW_DATA { std::vector buffers; }; struct ImageSubresourcePair { VkImage image; @@ -439,4 +442,4 @@ struct GLOBAL_CB_NODE : public BASE_NODE { ~GLOBAL_CB_NODE(); }; -#endif // CORE_VALIDATION_TYPES_H_ \ No newline at end of file +#endif // CORE_VALIDATION_TYPES_H_ diff --git a/layers/descriptor_sets.h b/layers/descriptor_sets.h index 58e3b5cd..bf8e29d2 100644 --- a/layers/descriptor_sets.h +++ b/layers/descriptor_sets.h @@ -141,7 +141,7 @@ class DescriptorSetLayout { */ // Slightly broader than type, each c++ "class" will has a corresponding "DescriptorClass" -typedef enum _DescriptorClass { PlainSampler, ImageSampler, Image, TexelBuffer, GeneralBuffer } DescriptorClass; +enum DescriptorClass { PlainSampler, ImageSampler, Image, TexelBuffer, GeneralBuffer }; class Descriptor { public: -- cgit v1.2.3 From 85032527c79b4158f2d33aefcf9eb4a8df358e60 Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Thu, 19 May 2016 17:17:58 -0600 Subject: headers: GH7, Fix bad variable names in vk_icd.h Change-Id: Ic78792a71ebedbdb5bae68c47856db1c89a714af --- include/vulkan/vk_icd.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/include/vulkan/vk_icd.h b/include/vulkan/vk_icd.h index fa110f4f..a6493641 100644 --- a/include/vulkan/vk_icd.h +++ b/include/vulkan/vk_icd.h @@ -39,7 +39,7 @@ typedef VkResult (VKAPI_PTR *PFN_vkNegotiateLoaderICDInterfaceVersion)(uint32_t #define ICD_LOADER_MAGIC 0x01CDC0DE -typedef union _VK_LOADER_DATA { +typedef union { uintptr_t loaderMagic; void *loaderData; } VK_LOADER_DATA; @@ -58,7 +58,7 @@ static inline bool valid_loader_magic_value(void *pNewObject) { * Windows and Linux ICDs will treat VkSurfaceKHR as a pointer to a struct that * contains the platform-specific connection and surface information. */ -typedef enum _VkIcdWsiPlatform { +typedef enum { VK_ICD_WSI_PLATFORM_MIR, VK_ICD_WSI_PLATFORM_WAYLAND, VK_ICD_WSI_PLATFORM_WIN32, @@ -67,12 +67,12 @@ typedef enum _VkIcdWsiPlatform { VK_ICD_WSI_PLATFORM_DISPLAY } VkIcdWsiPlatform; -typedef struct _VkIcdSurfaceBase { +typedef struct { VkIcdWsiPlatform platform; } VkIcdSurfaceBase; #ifdef VK_USE_PLATFORM_MIR_KHR -typedef struct _VkIcdSurfaceMir { +typedef struct { VkIcdSurfaceBase base; MirConnection *connection; MirSurface *mirSurface; @@ -80,7 +80,7 @@ typedef struct _VkIcdSurfaceMir { #endif // VK_USE_PLATFORM_MIR_KHR #ifdef VK_USE_PLATFORM_WAYLAND_KHR -typedef struct _VkIcdSurfaceWayland { +typedef struct { VkIcdSurfaceBase base; struct wl_display *display; struct wl_surface *surface; @@ -88,7 +88,7 @@ typedef struct _VkIcdSurfaceWayland { #endif // VK_USE_PLATFORM_WAYLAND_KHR #ifdef VK_USE_PLATFORM_WIN32_KHR -typedef struct _VkIcdSurfaceWin32 { +typedef struct { VkIcdSurfaceBase base; HINSTANCE hinstance; HWND hwnd; @@ -96,7 +96,7 @@ typedef struct _VkIcdSurfaceWin32 { #endif // VK_USE_PLATFORM_WIN32_KHR #ifdef VK_USE_PLATFORM_XCB_KHR -typedef struct _VkIcdSurfaceXcb { +typedef struct { VkIcdSurfaceBase base; xcb_connection_t *connection; xcb_window_t window; @@ -104,14 +104,14 @@ typedef struct _VkIcdSurfaceXcb { #endif // VK_USE_PLATFORM_XCB_KHR #ifdef VK_USE_PLATFORM_XLIB_KHR -typedef struct _VkIcdSurfaceXlib { +typedef struct { VkIcdSurfaceBase base; Display *dpy; Window window; } VkIcdSurfaceXlib; #endif // VK_USE_PLATFORM_XLIB_KHR -typedef struct _VkIcdSurfaceDisplay { +typedef struct { VkIcdSurfaceBase base; VkDisplayModeKHR displayMode; uint32_t planeIndex; -- cgit v1.2.3 From 4c62d0003eab6814c44a5092eb6e7a021344fd27 Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Thu, 19 May 2016 17:22:25 -0600 Subject: demos: GH7, Fix invalid variable names Change-Id: Iabb217f70d0068284c682d9da6b4c2834902256e --- demos/cube.c | 8 ++++---- demos/tri.c | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/demos/cube.c b/demos/cube.c index 9b256ce7..082ed613 100644 --- a/demos/cube.c +++ b/demos/cube.c @@ -324,7 +324,7 @@ BreakCallback(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, return false; } -typedef struct _SwapchainBuffers { +typedef struct { VkImage image; VkCommandBuffer cmd; VkImageView view; @@ -1023,8 +1023,8 @@ bool loadTexture(const char *filename, uint8_t *rgba_data, #ifdef __ANDROID__ #include char *cPtr; - cPtr = (char*)___lunarg_ppm; - if ((unsigned char*)cPtr >= (___lunarg_ppm + ___lunarg_ppm_len) || strncmp(cPtr, "P6\n", 3)) { + cPtr = (char*)lunarg_ppm; + if ((unsigned char*)cPtr >= (lunarg_ppm + lunarg_ppm_len) || strncmp(cPtr, "P6\n", 3)) { return false; } while(strncmp(cPtr++, "\n", 1)); @@ -1033,7 +1033,7 @@ bool loadTexture(const char *filename, uint8_t *rgba_data, return true; } while(strncmp(cPtr++, "\n", 1)); - if ((unsigned char*)cPtr >= (___lunarg_ppm + ___lunarg_ppm_len) || strncmp(cPtr, "255\n", 4)) { + if ((unsigned char*)cPtr >= (lunarg_ppm + lunarg_ppm_len) || strncmp(cPtr, "255\n", 4)) { return false; } while(strncmp(cPtr++, "\n", 1)); diff --git a/demos/tri.c b/demos/tri.c index 789ec2bd..441eddcb 100644 --- a/demos/tri.c +++ b/demos/tri.c @@ -170,7 +170,7 @@ BreakCallback(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, return false; } -typedef struct _SwapchainBuffers { +typedef struct { VkImage image; VkCommandBuffer cmd; VkImageView view; -- cgit v1.2.3 From 3518cfa720496c69fc555ee833736f23e669e6bc Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Thu, 19 May 2016 17:25:59 -0600 Subject: layers: GH7, Fix bad var names in layer utils Change-Id: Iec47953ba0611de5c62f4fa876eb02fefca32427 --- layers/vk_layer_utils.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/layers/vk_layer_utils.cpp b/layers/vk_layer_utils.cpp index eafe236c..1c362706 100644 --- a/layers/vk_layer_utils.cpp +++ b/layers/vk_layer_utils.cpp @@ -25,11 +25,11 @@ #include "vk_layer_config.h" #include "vk_layer_utils.h" -typedef struct _VULKAN_FORMAT_INFO { +struct VULKAN_FORMAT_INFO { size_t size; uint32_t channel_count; VkFormatCompatibilityClass format_class; -} VULKAN_FORMAT_INFO; +}; // Set up data structure with number of bytes and number of channels // for each Vulkan format. -- cgit v1.2.3 From 1553f6107528573692760b436a4ce21e2d290d8c Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Thu, 19 May 2016 17:06:56 -0600 Subject: layers: GH7, Replace bad var names in obj_tracker C++ reserves variable names that start with an underscore followed by a capital letter. This patch series replaces or removes these invalid variable names from the LVL codespace. Change-Id: I71368cf30e267841cedcc3861afa3444689d71da --- layers/object_tracker.h | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/layers/object_tracker.h b/layers/object_tracker.h index c90b0991..30a1f29f 100644 --- a/layers/object_tracker.h +++ b/layers/object_tracker.h @@ -29,7 +29,7 @@ #include "vk_layer_utils.h" // Object Tracker ERROR codes -typedef enum _OBJECT_TRACK_ERROR { +enum OBJECT_TRACK_ERROR { OBJTRACK_NONE, // Used for INFO & other non-error messages OBJTRACK_UNKNOWN_OBJECT, // Updating uses of object that's not in global object list OBJTRACK_INTERNAL_ERROR, // Bug with data tracking within the layer @@ -37,11 +37,11 @@ typedef enum _OBJECT_TRACK_ERROR { OBJTRACK_INVALID_OBJECT, // Object used that has never been created OBJTRACK_DESCRIPTOR_POOL_MISMATCH, // Descriptor Pools specified incorrectly OBJTRACK_COMMAND_POOL_MISMATCH, // Command Pools specified incorrectly -} OBJECT_TRACK_ERROR; +}; // Object Status -- used to track state of individual objects typedef VkFlags ObjectStatusFlags; -typedef enum _ObjectStatusFlagBits { +enum ObjectStatusFlagBits { OBJSTATUS_NONE = 0x00000000, // No status is set OBJSTATUS_FENCE_IS_SUBMITTED = 0x00000001, // Fence has been submitted OBJSTATUS_VIEWPORT_BOUND = 0x00000002, // Viewport state object has been bound @@ -50,15 +50,15 @@ typedef enum _ObjectStatusFlagBits { OBJSTATUS_DEPTH_STENCIL_BOUND = 0x00000010, // Viewport state object has been bound OBJSTATUS_GPU_MEM_MAPPED = 0x00000020, // Memory object is currently mapped OBJSTATUS_COMMAND_BUFFER_SECONDARY = 0x00000040, // Command Buffer is of type SECONDARY -} ObjectStatusFlagBits; +}; -typedef struct _OBJTRACK_NODE { +struct OBJTRACK_NODE { uint64_t vkObj; // Object handle VkDebugReportObjectTypeEXT objType; // Object type identifier ObjectStatusFlags status; // Object state uint64_t parentObj; // Parent object uint64_t belongsTo; // Object Scope -- owning device/instance -} OBJTRACK_NODE; +}; // prototype for extension functions uint64_t objTrackGetObjectCount(VkDevice device); @@ -184,10 +184,10 @@ static void createInstanceRegisterExtensions(const VkInstanceCreateInfo *pCreate } // Indicate device or instance dispatch table type -typedef enum _DispTableType { +enum DispTableType { DISP_TBL_TYPE_INSTANCE, DISP_TBL_TYPE_DEVICE, -} DispTableType; +}; debug_report_data *mdd(const void *object) { dispatch_key key = get_dispatch_key(object); @@ -202,20 +202,19 @@ debug_report_data *mid(VkInstance object) { } // For each Queue's doubly linked-list of mem refs -typedef struct _OT_MEM_INFO { +struct OT_MEM_INFO { VkDeviceMemory mem; - struct _OT_MEM_INFO *pNextMI; - struct _OT_MEM_INFO *pPrevMI; - -} OT_MEM_INFO; + OT_MEM_INFO *pNextMI; + OT_MEM_INFO *pPrevMI; +}; // Track Queue information -typedef struct _OT_QUEUE_INFO { +struct OT_QUEUE_INFO { OT_MEM_INFO *pMemRefList; uint32_t queueNodeIndex; VkQueue queue; uint32_t refCount; -} OT_QUEUE_INFO; +}; // Global map of structures, one per queue std::unordered_map queue_info_map; -- cgit v1.2.3 From 8f69c97c0a427c2f313652a4afea48182ae3df66 Mon Sep 17 00:00:00 2001 From: David Pinedo Date: Fri, 20 May 2016 15:05:44 -0600 Subject: winrtinstaller: remove dependency on msvcrt redistributables Loader and demos now use static version of msvcrt. Runtime Installer no longer installs msvcrt. --- demos/CMakeLists.txt | 3 +++ loader/CMakeLists.txt | 2 ++ windowsRuntimeInstaller/InstallerRT.nsi | 32 ------------------------------- windowsRuntimeInstaller/vcredist_x64.exe | Bin 7194312 -> 0 bytes windowsRuntimeInstaller/vcredist_x86.exe | Bin 6503984 -> 0 bytes 5 files changed, 5 insertions(+), 32 deletions(-) delete mode 100644 windowsRuntimeInstaller/vcredist_x64.exe delete mode 100644 windowsRuntimeInstaller/vcredist_x86.exe diff --git a/demos/CMakeLists.txt b/demos/CMakeLists.txt index c9aea49f..7d8681a0 100644 --- a/demos/CMakeLists.txt +++ b/demos/CMakeLists.txt @@ -28,6 +28,9 @@ if(WIN32) set (BUILDTGT_DIR build32) endif() + set(CMAKE_C_FLAGS_DEBUG "-MTd") + set(CMAKE_C_FLAGS_RELEASE "-MT") + add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/demos/tri-vert.spv COMMAND ${GLSLANG_VALIDATOR} -s -V ${PROJECT_SOURCE_DIR}/demos/tri.vert COMMAND move vert.spv ${CMAKE_BINARY_DIR}/demos/tri-vert.spv diff --git a/loader/CMakeLists.txt b/loader/CMakeLists.txt index d6be9c11..2c3b2455 100644 --- a/loader/CMakeLists.txt +++ b/loader/CMakeLists.txt @@ -37,6 +37,8 @@ set (OPT_LOADER_SRCS set (LOADER_SRCS ${NORMAL_LOADER_SRCS} ${OPT_LOADER_SRCS}) if (WIN32) + set(CMAKE_C_FLAGS_DEBUG "-MTd") + set(CMAKE_C_FLAGS_RELEASE "-MT") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CRT_SECURE_NO_WARNINGS") # Build dev_ext_trampoline.c with -O2 to allow tail-call optimization. # Build other C files with normal options diff --git a/windowsRuntimeInstaller/InstallerRT.nsi b/windowsRuntimeInstaller/InstallerRT.nsi index 6b1771f4..680a14a3 100644 --- a/windowsRuntimeInstaller/InstallerRT.nsi +++ b/windowsRuntimeInstaller/InstallerRT.nsi @@ -460,38 +460,6 @@ Section # by the uninstaller when it needs to be run again during uninstall. Delete ConfigLayersAndVulkanDLL.ps1 - # Possibly install MSVC 2013 redistributables - ClearErrors - ${If} ${RunningX64} - ReadRegDword $1 HKLM "SOFTWARE\WOW6432Node\Microsoft\DevDiv\vc\Servicing\12.0\RuntimeMinimum" "Install" - ${If} ${Errors} - StrCpy $1 0 - ClearErrors - ${Endif} - ${Else} - StrCpy $1 1 - ${Endif} - ReadRegDword $2 HKLM "SOFTWARE\Microsoft\DevDiv\vc\Servicing\12.0\RuntimeMinimum" "Install" - ${If} ${Errors} - StrCpy $2 0 - ClearErrors - ${Endif} - IntOp $3 $1 + $2 - ${If} $3 <= 1 - # If either x86 or x64 redistributables are not present, install redistributables. - # We install both resdistributables because we have found that the x86 redist - # will uninstall the x64 redist if the x64 redistrib is an old version. Amazing, isn't it? - SetOutPath "$TEMP\VulkanRT" - ${If} ${RunningX64} - File vcredist_x64.exe - ExecWait '"$TEMP\VulkanRT\vcredist_x64.exe" /quiet /norestart' - ${Endif} - File vcredist_x86.exe - ExecWait '"$TEMP\VulkanRT\vcredist_x86.exe" /quiet /norestart' - ${Endif} - StrCpy $1 65 - Call CheckForError - # Finish logging and move log file to TEMP dir LogSet off Rename "$INSTDIR\install.log" "$TEMP\VulkanRT\Install.log" diff --git a/windowsRuntimeInstaller/vcredist_x64.exe b/windowsRuntimeInstaller/vcredist_x64.exe deleted file mode 100644 index 54736409..00000000 Binary files a/windowsRuntimeInstaller/vcredist_x64.exe and /dev/null differ diff --git a/windowsRuntimeInstaller/vcredist_x86.exe b/windowsRuntimeInstaller/vcredist_x86.exe deleted file mode 100644 index b7955781..00000000 Binary files a/windowsRuntimeInstaller/vcredist_x86.exe and /dev/null differ -- cgit v1.2.3 From b75ff8a63ae808aa9cf7533fadfaccdb231ede4c Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Fri, 13 May 2016 14:06:08 +0800 Subject: parameter_validation: move vkEnumerate*Properties around Move them toward the end of the file. --- layers/parameter_validation.cpp | 58 ++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/layers/parameter_validation.cpp b/layers/parameter_validation.cpp index 50443272..9e711f31 100644 --- a/layers/parameter_validation.cpp +++ b/layers/parameter_validation.cpp @@ -134,39 +134,10 @@ vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebu static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}}; -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { - return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties); -} - static const VkLayerProperties pc_global_layers[] = {{ "VK_LAYER_LUNARG_parameter_validation", VK_LAYER_API_VERSION, 1, "LunarG Validation Layer", }}; -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) { - return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers), pc_global_layers, pCount, pProperties); -} - -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, - const char *pLayerName, uint32_t *pCount, - VkExtensionProperties *pProperties) { - /* parameter_validation does not have any physical device extensions */ - if (pLayerName == NULL) { - return get_dispatch_table(pc_instance_table_map, physicalDevice) - ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties); - } else { - return util_GetExtensionProperties(0, NULL, pCount, pProperties); - } -} - -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) { - - /* parameter_validation's physical device layers are the same as global */ - return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers), pc_global_layers, pCount, pProperties); -} - static bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) { VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)( VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT | VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT | @@ -4294,6 +4265,18 @@ vkCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, } } +VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, + const char *pLayerName, uint32_t *pCount, + VkExtensionProperties *pProperties) { + /* parameter_validation does not have any physical device extensions */ + if (pLayerName == NULL) { + return get_dispatch_table(pc_instance_table_map, physicalDevice) + ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties); + } else { + return util_GetExtensionProperties(0, NULL, pCount, pProperties); + } +} + VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char *funcName) { layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -4583,3 +4566,20 @@ VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(V return NULL; return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName); } + +VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL +vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { + return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties); +} + +VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL +vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) { + return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers), pc_global_layers, pCount, pProperties); +} + +VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL +vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) { + + /* parameter_validation's physical device layers are the same as global */ + return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers), pc_global_layers, pCount, pProperties); +} -- cgit v1.2.3 From 4bcd58f7c56dbab638adb08dc8a0626bfea304ca Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Fri, 13 May 2016 14:07:36 +0800 Subject: parameter_validation: put layer functions into a namespace Put all layer fucntions/data into parameter_validation namespace. I had to add some wrappers to make everything work. --- layers/parameter_validation.cpp | 46 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/layers/parameter_validation.cpp b/layers/parameter_validation.cpp index 9e711f31..d8108ad4 100644 --- a/layers/parameter_validation.cpp +++ b/layers/parameter_validation.cpp @@ -49,7 +49,7 @@ #include "parameter_validation.h" -using namespace parameter_validation; +namespace parameter_validation { struct layer_data { debug_report_data *report_data; @@ -4567,19 +4567,57 @@ VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(V return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName); } +} // namespace parameter_validation + +// vk_layer_logging.h expects these to be defined + +VKAPI_ATTR VkResult VKAPI_CALL +vkCreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo, + const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pMsgCallback) { + return parameter_validation::vkCreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback); +} + +VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, + VkDebugReportCallbackEXT msgCallback, + const VkAllocationCallbacks *pAllocator) { + parameter_validation::vkDestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator); +} + +VKAPI_ATTR void VKAPI_CALL +vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t object, + size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg) { + parameter_validation::vkDebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg); +} + +// loader-layer interface v0 + VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { - return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties); + return util_GetExtensionProperties(1, parameter_validation::instance_extensions, pCount, pProperties); } VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) { - return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers), pc_global_layers, pCount, pProperties); + return util_GetLayerProperties(ARRAY_SIZE(parameter_validation::pc_global_layers), parameter_validation::pc_global_layers, pCount, pProperties); } VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) { /* parameter_validation's physical device layers are the same as global */ - return util_GetLayerProperties(ARRAY_SIZE(pc_global_layers), pc_global_layers, pCount, pProperties); + return util_GetLayerProperties(ARRAY_SIZE(parameter_validation::pc_global_layers), parameter_validation::pc_global_layers, pCount, pProperties); +} + +VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, + const char *pLayerName, uint32_t *pCount, + VkExtensionProperties *pProperties) { + return parameter_validation::vkEnumerateDeviceExtensionProperties(physicalDevice, pLayerName, pCount, pProperties); +} + +VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) { + return parameter_validation::vkGetDeviceProcAddr(dev, funcName); +} + +VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) { + return parameter_validation::vkGetInstanceProcAddr(instance, funcName); } -- cgit v1.2.3 From 42ec9f43eebc7d3fdde33c8f503459b8a8e470dd Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Fri, 13 May 2016 14:37:49 +0800 Subject: parameter_validation: drop vk prefix for layer functions Drop VK_LAYER_EXPORT as well. --- layers/parameter_validation.cpp | 856 ++++++++++++++++++++-------------------- 1 file changed, 428 insertions(+), 428 deletions(-) diff --git a/layers/parameter_validation.cpp b/layers/parameter_validation.cpp index d8108ad4..1edd4f93 100644 --- a/layers/parameter_validation.cpp +++ b/layers/parameter_validation.cpp @@ -101,9 +101,9 @@ static void init_parameter_validation(layer_data *my_data, const VkAllocationCal layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "lunarg_parameter_validation"); } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkCreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo, - const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pMsgCallback) { +VKAPI_ATTR VkResult VKAPI_CALL +CreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo, + const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pMsgCallback) { VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance); VkResult result = pTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback); @@ -115,9 +115,9 @@ vkCreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackC return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, - VkDebugReportCallbackEXT msgCallback, - const VkAllocationCallbacks *pAllocator) { +VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance, + VkDebugReportCallbackEXT msgCallback, + const VkAllocationCallbacks *pAllocator) { VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance); pTable->DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator); @@ -125,9 +125,9 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkIns layer_destroy_msg_callback(data->report_data, msgCallback, pAllocator); } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t object, - size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg) { +VKAPI_ATTR void VKAPI_CALL +DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t object, + size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg) { VkLayerInstanceDispatchTable *pTable = get_dispatch_table(pc_instance_table_map, instance); pTable->DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg); } @@ -1289,8 +1289,8 @@ static bool validate_queue_family_indices(layer_data *device_data, const char *f return skip_call; } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkInstance *pInstance) { +VKAPI_ATTR VkResult VKAPI_CALL +CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkInstance *pInstance) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO); @@ -1362,7 +1362,7 @@ vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCall return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) { +VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) { // Grab the key before the instance is destroyed. dispatch_key key = get_dispatch_key(instance); bool skipCall = false; @@ -1408,8 +1408,8 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyInstance(VkInstance instance } } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkEnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount, VkPhysicalDevice *pPhysicalDevices) { +VKAPI_ATTR VkResult VKAPI_CALL +EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount, VkPhysicalDevice *pPhysicalDevices) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map); @@ -1427,8 +1427,8 @@ vkEnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount, return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkGetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) { +VKAPI_ATTR void VKAPI_CALL +GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map); assert(my_data != NULL); @@ -1440,8 +1440,8 @@ vkGetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFea } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkGetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties *pFormatProperties) { +VKAPI_ATTR void VKAPI_CALL +GetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties *pFormatProperties) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map); assert(my_data != NULL); @@ -1454,10 +1454,10 @@ vkGetPhysicalDeviceFormatProperties(VkPhysicalDevice physicalDevice, VkFormat fo } } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkGetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, - VkImageUsageFlags usage, VkImageCreateFlags flags, - VkImageFormatProperties *pImageFormatProperties) { +VKAPI_ATTR VkResult VKAPI_CALL +GetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, + VkImageUsageFlags usage, VkImageCreateFlags flags, + VkImageFormatProperties *pImageFormatProperties) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map); @@ -1477,8 +1477,8 @@ vkGetPhysicalDeviceImageFormatProperties(VkPhysicalDevice physicalDevice, VkForm return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) { +VKAPI_ATTR void VKAPI_CALL +GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties *pProperties) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map); assert(my_data != NULL); @@ -1490,9 +1490,9 @@ vkGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceP } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, - VkQueueFamilyProperties *pQueueFamilyProperties) { +VKAPI_ATTR void VKAPI_CALL +GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice, uint32_t *pQueueFamilyPropertyCount, + VkQueueFamilyProperties *pQueueFamilyProperties) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map); assert(my_data != NULL); @@ -1506,8 +1506,8 @@ vkGetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice, uint32 } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkGetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties *pMemoryProperties) { +VKAPI_ATTR void VKAPI_CALL +GetPhysicalDeviceMemoryProperties(VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties *pMemoryProperties) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map); assert(my_data != NULL); @@ -1580,9 +1580,9 @@ void storeCreateDeviceData(VkDevice device, const VkDeviceCreateInfo *pCreateInf } } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDevice(VkPhysicalDevice physicalDevice, - const VkDeviceCreateInfo *pCreateInfo, - const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) { +VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, + const VkDeviceCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) { /* * NOTE: We do not validate physicalDevice or any dispatchable * object as the first parameter. We couldn't get here if it was wrong! @@ -1652,7 +1652,7 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDevice(VkPhysicalDevice p return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) { +VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) { dispatch_key key = get_dispatch_key(device); bool skipCall = false; layer_data *my_data = get_my_data_ptr(key, layer_data_map); @@ -1692,8 +1692,8 @@ bool PreGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queu return true; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) { +VKAPI_ATTR void VKAPI_CALL +GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(my_data != NULL); @@ -1707,8 +1707,8 @@ vkGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex } } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) { +VKAPI_ATTR VkResult VKAPI_CALL +QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map); @@ -1725,7 +1725,7 @@ vkQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, return result; } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueueWaitIdle(VkQueue queue) { +VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) { layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map); assert(my_data != NULL); @@ -1736,7 +1736,7 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkQueueWaitIdle(VkQueue queue) { return result; } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkDeviceWaitIdle(VkDevice device) { +VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) { layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(my_data != NULL); @@ -1747,7 +1747,7 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkDeviceWaitIdle(VkDevice device) return result; } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo, +VKAPI_ATTR VkResult VKAPI_CALL AllocateMemory(VkDevice device, const VkMemoryAllocateInfo *pAllocateInfo, const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; @@ -1765,8 +1765,8 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkAllocateMemory(VkDevice device, return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkFreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) { +VKAPI_ATTR void VKAPI_CALL +FreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks *pAllocator) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(my_data != NULL); @@ -1778,8 +1778,8 @@ vkFreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks } } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkMapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void **ppData) { +VKAPI_ATTR VkResult VKAPI_CALL +MapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, VkMemoryMapFlags flags, void **ppData) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -1796,7 +1796,7 @@ vkMapMemory(VkDevice device, VkDeviceMemory memory, VkDeviceSize offset, VkDevic return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkUnmapMemory(VkDevice device, VkDeviceMemory memory) { +VKAPI_ATTR void VKAPI_CALL UnmapMemory(VkDevice device, VkDeviceMemory memory) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(my_data != NULL); @@ -1808,8 +1808,8 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkUnmapMemory(VkDevice device, VkDevi } } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkFlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) { +VKAPI_ATTR VkResult VKAPI_CALL +FlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -1826,8 +1826,8 @@ vkFlushMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMa return result; } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkInvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) { +VKAPI_ATTR VkResult VKAPI_CALL +InvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const VkMappedMemoryRange *pMemoryRanges) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -1845,8 +1845,8 @@ vkInvalidateMappedMemoryRanges(VkDevice device, uint32_t memoryRangeCount, const return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkGetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory, VkDeviceSize *pCommittedMemoryInBytes) { +VKAPI_ATTR void VKAPI_CALL +GetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory, VkDeviceSize *pCommittedMemoryInBytes) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(my_data != NULL); @@ -1858,8 +1858,8 @@ vkGetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory memory, VkDeviceSize } } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory, - VkDeviceSize memoryOffset) { +VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory, + VkDeviceSize memoryOffset) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -1876,8 +1876,8 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBindBufferMemory(VkDevice devic return result; } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, - VkDeviceSize memoryOffset) { +VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, VkDeviceMemory memory, + VkDeviceSize memoryOffset) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -1894,8 +1894,8 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkBindImageMemory(VkDevice device return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer, VkMemoryRequirements *pMemoryRequirements) { +VKAPI_ATTR void VKAPI_CALL +GetBufferMemoryRequirements(VkDevice device, VkBuffer buffer, VkMemoryRequirements *pMemoryRequirements) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(my_data != NULL); @@ -1907,8 +1907,8 @@ vkGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer, VkMemoryRequirem } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkGetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) { +VKAPI_ATTR void VKAPI_CALL +GetImageMemoryRequirements(VkDevice device, VkImage image, VkMemoryRequirements *pMemoryRequirements) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(my_data != NULL); @@ -1937,9 +1937,9 @@ bool PostGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32 return true; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkGetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount, - VkSparseImageMemoryRequirements *pSparseMemoryRequirements) { +VKAPI_ATTR void VKAPI_CALL +GetImageSparseMemoryRequirements(VkDevice device, VkImage image, uint32_t *pSparseMemoryRequirementCount, + VkSparseImageMemoryRequirements *pSparseMemoryRequirements) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(my_data != NULL); @@ -1972,10 +1972,10 @@ bool PostGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalD return true; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, - VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling, - uint32_t *pPropertyCount, VkSparseImageFormatProperties *pProperties) { +VKAPI_ATTR void VKAPI_CALL +GetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, + VkSampleCountFlagBits samples, VkImageUsageFlags usage, VkImageTiling tiling, + uint32_t *pPropertyCount, VkSparseImageFormatProperties *pProperties) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(physicalDevice), layer_data_map); assert(my_data != NULL); @@ -1993,8 +1993,8 @@ vkGetPhysicalDeviceSparseImageFormatProperties(VkPhysicalDevice physicalDevice, } } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo, VkFence fence) { +VKAPI_ATTR VkResult VKAPI_CALL +QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *pBindInfo, VkFence fence) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map); @@ -2011,8 +2011,8 @@ vkQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo return result; } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkCreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkFence *pFence) { +VKAPI_ATTR VkResult VKAPI_CALL +CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkFence *pFence) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -2029,7 +2029,7 @@ vkCreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo, const VkAll return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) { +VKAPI_ATTR void VKAPI_CALL DestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks *pAllocator) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(my_data != NULL); @@ -2041,7 +2041,7 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyFence(VkDevice device, VkFen } } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) { +VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -2058,7 +2058,7 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetFences(VkDevice device, ui return result; } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetFenceStatus(VkDevice device, VkFence fence) { +VKAPI_ATTR VkResult VKAPI_CALL GetFenceStatus(VkDevice device, VkFence fence) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -2075,8 +2075,8 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetFenceStatus(VkDevice device, return result; } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll, uint64_t timeout) { +VKAPI_ATTR VkResult VKAPI_CALL +WaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, VkBool32 waitAll, uint64_t timeout) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -2093,7 +2093,7 @@ vkWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence *pFences, Vk return result; } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo, +VKAPI_ATTR VkResult VKAPI_CALL CreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSemaphore *pSemaphore) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; @@ -2111,8 +2111,8 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSemaphore(VkDevice device return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkDestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) { +VKAPI_ATTR void VKAPI_CALL +DestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks *pAllocator) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(my_data != NULL); @@ -2124,8 +2124,8 @@ vkDestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCal } } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkCreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) { +VKAPI_ATTR VkResult VKAPI_CALL +CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkEvent *pEvent) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -2142,7 +2142,7 @@ vkCreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo, const VkAll return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) { +VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const VkAllocationCallbacks *pAllocator) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(my_data != NULL); @@ -2154,7 +2154,7 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyEvent(VkDevice device, VkEve } } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetEventStatus(VkDevice device, VkEvent event) { +VKAPI_ATTR VkResult VKAPI_CALL GetEventStatus(VkDevice device, VkEvent event) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -2171,7 +2171,7 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetEventStatus(VkDevice device, return result; } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkSetEvent(VkDevice device, VkEvent event) { +VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -2188,7 +2188,7 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkSetEvent(VkDevice device, VkEve return result; } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetEvent(VkDevice device, VkEvent event) { +VKAPI_ATTR VkResult VKAPI_CALL ResetEvent(VkDevice device, VkEvent event) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -2205,8 +2205,8 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetEvent(VkDevice device, VkE return result; } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo, - const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) { +VKAPI_ATTR VkResult VKAPI_CALL CreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skip_call = false; layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -2238,8 +2238,8 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateQueryPool(VkDevice device return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkDestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) { +VKAPI_ATTR void VKAPI_CALL +DestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks *pAllocator) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(my_data != NULL); @@ -2251,9 +2251,9 @@ vkDestroyQueryPool(VkDevice device, VkQueryPool queryPool, const VkAllocationCal } } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, - uint32_t queryCount, size_t dataSize, void *pData, - VkDeviceSize stride, VkQueryResultFlags flags) { +VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, + uint32_t queryCount, size_t dataSize, void *pData, + VkDeviceSize stride, VkQueryResultFlags flags) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -2272,8 +2272,8 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkGetQueryPoolResults(VkDevice de return result; } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) { +VKAPI_ATTR VkResult VKAPI_CALL +CreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skip_call = false; layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -2318,8 +2318,8 @@ vkCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo, const VkA return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkDestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) { +VKAPI_ATTR void VKAPI_CALL +DestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(my_data != NULL); @@ -2331,8 +2331,8 @@ vkDestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *p } } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo, - const VkAllocationCallbacks *pAllocator, VkBufferView *pView) { +VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, VkBufferView *pView) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -2349,8 +2349,8 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateBufferView(VkDevice devic return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkDestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) { +VKAPI_ATTR void VKAPI_CALL +DestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks *pAllocator) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(my_data != NULL); @@ -2362,8 +2362,8 @@ vkDestroyBufferView(VkDevice device, VkBufferView bufferView, const VkAllocation } } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo, - const VkAllocationCallbacks *pAllocator, VkImage *pImage) { +VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, VkImage *pImage) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skip_call = false; layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -2469,7 +2469,7 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImage(VkDevice device, co return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) { +VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks *pAllocator) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(my_data != NULL); @@ -2495,8 +2495,8 @@ bool PreGetImageSubresourceLayout(VkDevice device, const VkImageSubresource *pSu return true; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkGetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource, VkSubresourceLayout *pLayout) { +VKAPI_ATTR void VKAPI_CALL +GetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubresource *pSubresource, VkSubresourceLayout *pLayout) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(my_data != NULL); @@ -2510,8 +2510,8 @@ vkGetImageSubresourceLayout(VkDevice device, VkImage image, const VkImageSubreso } } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo, - const VkAllocationCallbacks *pAllocator, VkImageView *pView) { +VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, VkImageView *pView) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skip_call = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -2572,8 +2572,8 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateImageView(VkDevice device return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkDestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) { +VKAPI_ATTR void VKAPI_CALL +DestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCallbacks *pAllocator) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(my_data != NULL); @@ -2585,9 +2585,9 @@ vkDestroyImageView(VkDevice device, VkImageView imageView, const VkAllocationCal } } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo, - const VkAllocationCallbacks *pAllocator, - VkShaderModule *pShaderModule) { +VKAPI_ATTR VkResult VKAPI_CALL CreateShaderModule(VkDevice device, const VkShaderModuleCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkShaderModule *pShaderModule) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -2605,8 +2605,8 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateShaderModule(VkDevice dev return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkDestroyShaderModule(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks *pAllocator) { +VKAPI_ATTR void VKAPI_CALL +DestroyShaderModule(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks *pAllocator) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(my_data != NULL); @@ -2618,9 +2618,9 @@ vkDestroyShaderModule(VkDevice device, VkShaderModule shaderModule, const VkAllo } } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo, - const VkAllocationCallbacks *pAllocator, - VkPipelineCache *pPipelineCache) { +VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkPipelineCache *pPipelineCache) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -2638,8 +2638,8 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineCache(VkDevice de return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkDestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks *pAllocator) { +VKAPI_ATTR void VKAPI_CALL +DestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks *pAllocator) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(my_data != NULL); @@ -2651,8 +2651,8 @@ vkDestroyPipelineCache(VkDevice device, VkPipelineCache pipelineCache, const VkA } } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkGetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize, void *pData) { +VKAPI_ATTR VkResult VKAPI_CALL +GetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *pDataSize, void *pData) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -2669,8 +2669,8 @@ vkGetPipelineCacheData(VkDevice device, VkPipelineCache pipelineCache, size_t *p return result; } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkMergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount, const VkPipelineCache *pSrcCaches) { +VKAPI_ATTR VkResult VKAPI_CALL +MergePipelineCaches(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount, const VkPipelineCache *pSrcCaches) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -2737,10 +2737,10 @@ bool PreCreateGraphicsPipelines(VkDevice device, const VkGraphicsPipelineCreateI return true; } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, - const VkGraphicsPipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator, - VkPipeline *pPipelines) { +VKAPI_ATTR VkResult VKAPI_CALL +CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, + const VkGraphicsPipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator, + VkPipeline *pPipelines) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skip_call = false; layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -2938,10 +2938,10 @@ bool PreCreateComputePipelines(VkDevice device, const VkComputePipelineCreateInf return true; } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, - const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator, - VkPipeline *pPipelines) { +VKAPI_ATTR VkResult VKAPI_CALL +CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, + const VkComputePipelineCreateInfo *pCreateInfos, const VkAllocationCallbacks *pAllocator, + VkPipeline *pPipelines) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -2962,8 +2962,8 @@ vkCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_ return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkDestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) { +VKAPI_ATTR void VKAPI_CALL +DestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks *pAllocator) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(my_data != NULL); @@ -2975,9 +2975,9 @@ vkDestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallba } } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, - VkPipelineLayout *pPipelineLayout) { +VKAPI_ATTR VkResult VKAPI_CALL +CreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, + VkPipelineLayout *pPipelineLayout) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -2995,8 +2995,8 @@ vkCreatePipelineLayout(VkDevice device, const VkPipelineLayoutCreateInfo *pCreat return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks *pAllocator) { +VKAPI_ATTR void VKAPI_CALL +DestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout, const VkAllocationCallbacks *pAllocator) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(my_data != NULL); @@ -3008,8 +3008,8 @@ vkDestroyPipelineLayout(VkDevice device, VkPipelineLayout pipelineLayout, const } } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo, - const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) { +VKAPI_ATTR VkResult VKAPI_CALL CreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skip_call = false; layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -3045,8 +3045,8 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateSampler(VkDevice device, return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkDestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) { +VKAPI_ATTR void VKAPI_CALL +DestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks *pAllocator) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(my_data != NULL); @@ -3058,9 +3058,9 @@ vkDestroySampler(VkDevice device, VkSampler sampler, const VkAllocationCallbacks } } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkCreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo, - const VkAllocationCallbacks *pAllocator, VkDescriptorSetLayout *pSetLayout) { +VKAPI_ATTR VkResult VKAPI_CALL +CreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, VkDescriptorSetLayout *pSetLayout) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skip_call = false; layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -3116,8 +3116,8 @@ vkCreateDescriptorSetLayout(VkDevice device, const VkDescriptorSetLayoutCreateIn return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkDestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks *pAllocator) { +VKAPI_ATTR void VKAPI_CALL +DestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const VkAllocationCallbacks *pAllocator) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(my_data != NULL); @@ -3129,9 +3129,9 @@ vkDestroyDescriptorSetLayout(VkDevice device, VkDescriptorSetLayout descriptorSe } } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkCreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, - VkDescriptorPool *pDescriptorPool) { +VKAPI_ATTR VkResult VKAPI_CALL +CreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, + VkDescriptorPool *pDescriptorPool) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -3151,8 +3151,8 @@ vkCreateDescriptorPool(VkDevice device, const VkDescriptorPoolCreateInfo *pCreat return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks *pAllocator) { +VKAPI_ATTR void VKAPI_CALL +DestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, const VkAllocationCallbacks *pAllocator) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(my_data != NULL); @@ -3164,8 +3164,8 @@ vkDestroyDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, const } } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags) { +VKAPI_ATTR VkResult VKAPI_CALL +ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -3182,8 +3182,8 @@ vkResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescri return result; } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo, VkDescriptorSet *pDescriptorSets) { +VKAPI_ATTR VkResult VKAPI_CALL +AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo, VkDescriptorSet *pDescriptorSets) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -3200,9 +3200,9 @@ vkAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAl return result; } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, - uint32_t descriptorSetCount, - const VkDescriptorSet *pDescriptorSets) { +VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, + uint32_t descriptorSetCount, + const VkDescriptorSet *pDescriptorSets) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skip_call = false; layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -3227,9 +3227,9 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkFreeDescriptorSets(VkDevice dev return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkUpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites, - uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pDescriptorCopies) { +VKAPI_ATTR void VKAPI_CALL +UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites, + uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pDescriptorCopies) { bool skip_call = false; layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(device_data != NULL); @@ -3325,8 +3325,8 @@ vkUpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, const VkW } } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo, - const VkAllocationCallbacks *pAllocator, +VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; @@ -3344,8 +3344,8 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateFramebuffer(VkDevice devi return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) { +VKAPI_ATTR void VKAPI_CALL +DestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks *pAllocator) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(my_data != NULL); @@ -3357,9 +3357,9 @@ vkDestroyFramebuffer(VkDevice device, VkFramebuffer framebuffer, const VkAllocat } } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo, - const VkAllocationCallbacks *pAllocator, - VkRenderPass *pRenderPass) { +VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderPassCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkRenderPass *pRenderPass) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -3376,8 +3376,8 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass(VkDevice devic return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkDestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) { +VKAPI_ATTR void VKAPI_CALL +DestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks *pAllocator) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(my_data != NULL); @@ -3389,8 +3389,8 @@ vkDestroyRenderPass(VkDevice device, VkRenderPass renderPass, const VkAllocation } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkGetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) { +VKAPI_ATTR void VKAPI_CALL +GetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D *pGranularity) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(my_data != NULL); @@ -3402,9 +3402,9 @@ vkGetRenderAreaGranularity(VkDevice device, VkRenderPass renderPass, VkExtent2D } } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo, - const VkAllocationCallbacks *pAllocator, - VkCommandPool *pCommandPool) { +VKAPI_ATTR VkResult VKAPI_CALL CreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, + VkCommandPool *pCommandPool) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -3424,8 +3424,8 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateCommandPool(VkDevice devi return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkDestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) { +VKAPI_ATTR void VKAPI_CALL +DestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks *pAllocator) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(my_data != NULL); @@ -3437,8 +3437,8 @@ vkDestroyCommandPool(VkDevice device, VkCommandPool commandPool, const VkAllocat } } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) { +VKAPI_ATTR VkResult VKAPI_CALL +ResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -3455,8 +3455,8 @@ vkResetCommandPool(VkDevice device, VkCommandPool commandPool, VkCommandPoolRese return result; } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo, VkCommandBuffer *pCommandBuffers) { +VKAPI_ATTR VkResult VKAPI_CALL +AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo, VkCommandBuffer *pCommandBuffers) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -3473,9 +3473,9 @@ vkAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAl return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkFreeCommandBuffers(VkDevice device, VkCommandPool commandPool, - uint32_t commandBufferCount, - const VkCommandBuffer *pCommandBuffers) { +VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, + uint32_t commandBufferCount, + const VkCommandBuffer *pCommandBuffers) { bool skip_call = false; layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); assert(device_data != nullptr); @@ -3495,8 +3495,8 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkFreeCommandBuffers(VkDevice device, } } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) { +VKAPI_ATTR VkResult VKAPI_CALL +BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skip_call = false; layer_data *device_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); @@ -3531,7 +3531,7 @@ vkBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginIn return result; } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEndCommandBuffer(VkCommandBuffer commandBuffer) { +VKAPI_ATTR VkResult VKAPI_CALL EndCommandBuffer(VkCommandBuffer commandBuffer) { layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -3542,8 +3542,8 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEndCommandBuffer(VkCommandBuffe return result; } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) { +VKAPI_ATTR VkResult VKAPI_CALL +ResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags) { VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -3559,8 +3559,8 @@ vkResetCommandBuffer(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags fl return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) { +VKAPI_ATTR void VKAPI_CALL +CmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -3572,8 +3572,8 @@ vkCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBin } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport *pViewports) { +VKAPI_ATTR void VKAPI_CALL +CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport *pViewports) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -3586,8 +3586,8 @@ vkCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D *pScissors) { +VKAPI_ATTR void VKAPI_CALL +CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D *pScissors) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -3599,17 +3599,17 @@ vkCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t s } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) { +VKAPI_ATTR void VKAPI_CALL CmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) { get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetLineWidth(commandBuffer, lineWidth); } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor) { +VKAPI_ATTR void VKAPI_CALL +CmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor, float depthBiasClamp, float depthBiasSlopeFactor) { get_dispatch_table(pc_device_table_map, commandBuffer) ->CmdSetDepthBias(commandBuffer, depthBiasConstantFactor, depthBiasClamp, depthBiasSlopeFactor); } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) { +VKAPI_ATTR void VKAPI_CALL CmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -3621,13 +3621,13 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdSetBlendConstants(VkCommandBuffe } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) { +VKAPI_ATTR void VKAPI_CALL +CmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds, float maxDepthBounds) { get_dispatch_table(pc_device_table_map, commandBuffer)->CmdSetDepthBounds(commandBuffer, minDepthBounds, maxDepthBounds); } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask) { +VKAPI_ATTR void VKAPI_CALL +CmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -3639,8 +3639,8 @@ vkCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags fac } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) { +VKAPI_ATTR void VKAPI_CALL +CmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -3652,8 +3652,8 @@ vkCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceM } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) { +VKAPI_ATTR void VKAPI_CALL +CmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -3665,10 +3665,10 @@ vkCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceM } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkCmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, - uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet *pDescriptorSets, - uint32_t dynamicOffsetCount, const uint32_t *pDynamicOffsets) { +VKAPI_ATTR void VKAPI_CALL +CmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, + uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet *pDescriptorSets, + uint32_t dynamicOffsetCount, const uint32_t *pDynamicOffsets) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -3683,8 +3683,8 @@ vkCmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipel } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) { +VKAPI_ATTR void VKAPI_CALL +CmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -3696,9 +3696,9 @@ vkCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSiz } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, - uint32_t bindingCount, const VkBuffer *pBuffers, - const VkDeviceSize *pOffsets) { +VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding, + uint32_t bindingCount, const VkBuffer *pBuffers, + const VkDeviceSize *pOffsets) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -3732,23 +3732,23 @@ bool PreCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t in return true; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, - uint32_t firstVertex, uint32_t firstInstance) { +VKAPI_ATTR void VKAPI_CALL CmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, + uint32_t firstVertex, uint32_t firstInstance) { PreCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance); get_dispatch_table(pc_device_table_map, commandBuffer) ->CmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance); } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, - uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, - uint32_t firstInstance) { +VKAPI_ATTR void VKAPI_CALL CmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, + uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, + uint32_t firstInstance) { get_dispatch_table(pc_device_table_map, commandBuffer) ->CmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance); } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) { +VKAPI_ATTR void VKAPI_CALL +CmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -3760,8 +3760,8 @@ vkCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize o } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) { +VKAPI_ATTR void VKAPI_CALL +CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count, uint32_t stride) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -3774,12 +3774,12 @@ vkCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDevic } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) { +VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) { get_dispatch_table(pc_device_table_map, commandBuffer)->CmdDispatch(commandBuffer, x, y, z); } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) { +VKAPI_ATTR void VKAPI_CALL +CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -3791,8 +3791,8 @@ vkCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSi } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, - uint32_t regionCount, const VkBufferCopy *pRegions) { +VKAPI_ATTR void VKAPI_CALL CmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, + uint32_t regionCount, const VkBufferCopy *pRegions) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -3826,9 +3826,9 @@ bool PreCmdCopyImage(VkCommandBuffer commandBuffer, const VkImageCopy *pRegions) return true; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, - VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) { +VKAPI_ATTR void VKAPI_CALL +CmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, + VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -3865,9 +3865,9 @@ bool PreCmdBlitImage(VkCommandBuffer commandBuffer, const VkImageBlit *pRegions) return true; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, - VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) { +VKAPI_ATTR void VKAPI_CALL +CmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, + VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions, VkFilter filter) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -3898,9 +3898,9 @@ bool PreCmdCopyBufferToImage(VkCommandBuffer commandBuffer, const VkBufferImageC return true; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, - VkImage dstImage, VkImageLayout dstImageLayout, - uint32_t regionCount, const VkBufferImageCopy *pRegions) { +VKAPI_ATTR void VKAPI_CALL CmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, + VkImage dstImage, VkImageLayout dstImageLayout, + uint32_t regionCount, const VkBufferImageCopy *pRegions) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -3931,9 +3931,9 @@ bool PreCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, const VkBufferImageC return true; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, - VkImageLayout srcImageLayout, VkBuffer dstBuffer, - uint32_t regionCount, const VkBufferImageCopy *pRegions) { +VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, + VkImageLayout srcImageLayout, VkBuffer dstBuffer, + uint32_t regionCount, const VkBufferImageCopy *pRegions) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -3949,8 +3949,8 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer(VkCommandBuffe } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, - VkDeviceSize dstOffset, VkDeviceSize dataSize, const uint32_t *pData) { +VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, + VkDeviceSize dstOffset, VkDeviceSize dataSize, const uint32_t *pData) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -3963,8 +3963,8 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdUpdateBuffer(VkCommandBuffer com } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data) { +VKAPI_ATTR void VKAPI_CALL +CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -3976,9 +3976,9 @@ vkCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, - VkImageLayout imageLayout, const VkClearColorValue *pColor, - uint32_t rangeCount, const VkImageSubresourceRange *pRanges) { +VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, + VkImageLayout imageLayout, const VkClearColorValue *pColor, + uint32_t rangeCount, const VkImageSubresourceRange *pRanges) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -3991,10 +3991,10 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage(VkCommandBuffer } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, - const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount, - const VkImageSubresourceRange *pRanges) { +VKAPI_ATTR void VKAPI_CALL +CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, + const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount, + const VkImageSubresourceRange *pRanges) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -4008,9 +4008,9 @@ vkCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImag } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount, - const VkClearAttachment *pAttachments, uint32_t rectCount, - const VkClearRect *pRects) { +VKAPI_ATTR void VKAPI_CALL CmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount, + const VkClearAttachment *pAttachments, uint32_t rectCount, + const VkClearRect *pRects) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -4046,9 +4046,9 @@ bool PreCmdResolveImage(VkCommandBuffer commandBuffer, const VkImageResolve *pRe return true; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, - VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve *pRegions) { +VKAPI_ATTR void VKAPI_CALL +CmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, + VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve *pRegions) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -4064,8 +4064,8 @@ vkCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) { +VKAPI_ATTR void VKAPI_CALL +CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -4077,8 +4077,8 @@ vkCmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) { +VKAPI_ATTR void VKAPI_CALL +CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -4090,11 +4090,11 @@ vkCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFla } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents, VkPipelineStageFlags srcStageMask, - VkPipelineStageFlags dstStageMask, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, - uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers, - uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) { +VKAPI_ATTR void VKAPI_CALL +CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents, VkPipelineStageFlags srcStageMask, + VkPipelineStageFlags dstStageMask, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, + uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers, + uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -4110,11 +4110,11 @@ vkCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEven } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, - VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, - uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers, - uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) { +VKAPI_ATTR void VKAPI_CALL +CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, + VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, + uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers, + uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -4130,8 +4130,8 @@ vkCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStag } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot, VkQueryControlFlags flags) { +VKAPI_ATTR void VKAPI_CALL +CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot, VkQueryControlFlags flags) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -4143,7 +4143,7 @@ vkCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t s } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) { +VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -4155,8 +4155,8 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndQuery(VkCommandBuffer command } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount) { +VKAPI_ATTR void VKAPI_CALL +CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -4176,8 +4176,8 @@ bool PostCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBit return true; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, - VkQueryPool queryPool, uint32_t query) { +VKAPI_ATTR void VKAPI_CALL CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, + VkQueryPool queryPool, uint32_t query) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -4191,9 +4191,9 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdWriteTimestamp(VkCommandBuffer c } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, - VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags) { +VKAPI_ATTR void VKAPI_CALL +CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, + VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -4207,9 +4207,9 @@ vkCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, - VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size, - const void *pValues) { +VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout, + VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size, + const void *pValues) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -4222,8 +4222,8 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdPushConstants(VkCommandBuffer co } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin, VkSubpassContents contents) { +VKAPI_ATTR void VKAPI_CALL +CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin, VkSubpassContents contents) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -4235,7 +4235,7 @@ vkCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) { +VKAPI_ATTR void VKAPI_CALL CmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -4247,12 +4247,12 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass(VkCommandBuffer comm } } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass(VkCommandBuffer commandBuffer) { +VKAPI_ATTR void VKAPI_CALL CmdEndRenderPass(VkCommandBuffer commandBuffer) { get_dispatch_table(pc_device_table_map, commandBuffer)->CmdEndRenderPass(commandBuffer); } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) { +VKAPI_ATTR void VKAPI_CALL +CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer *pCommandBuffers) { bool skipCall = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); @@ -4265,9 +4265,9 @@ vkCmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, } } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, - const char *pLayerName, uint32_t *pCount, - VkExtensionProperties *pProperties) { +VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, + const char *pLayerName, uint32_t *pCount, + VkExtensionProperties *pProperties) { /* parameter_validation does not have any physical device extensions */ if (pLayerName == NULL) { return get_dispatch_table(pc_instance_table_map, physicalDevice) @@ -4277,7 +4277,7 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionPropert } } -VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char *funcName) { +VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) { layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) { @@ -4285,229 +4285,229 @@ VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkD } if (!strcmp(funcName, "vkGetDeviceProcAddr")) - return (PFN_vkVoidFunction)vkGetDeviceProcAddr; + return (PFN_vkVoidFunction)GetDeviceProcAddr; if (!strcmp(funcName, "vkDestroyDevice")) - return (PFN_vkVoidFunction)vkDestroyDevice; + return (PFN_vkVoidFunction)DestroyDevice; if (!strcmp(funcName, "vkGetDeviceQueue")) - return (PFN_vkVoidFunction)vkGetDeviceQueue; + return (PFN_vkVoidFunction)GetDeviceQueue; if (!strcmp(funcName, "vkQueueSubmit")) - return (PFN_vkVoidFunction)vkQueueSubmit; + return (PFN_vkVoidFunction)QueueSubmit; if (!strcmp(funcName, "vkQueueWaitIdle")) - return (PFN_vkVoidFunction)vkQueueWaitIdle; + return (PFN_vkVoidFunction)QueueWaitIdle; if (!strcmp(funcName, "vkDeviceWaitIdle")) - return (PFN_vkVoidFunction)vkDeviceWaitIdle; + return (PFN_vkVoidFunction)DeviceWaitIdle; if (!strcmp(funcName, "vkAllocateMemory")) - return (PFN_vkVoidFunction)vkAllocateMemory; + return (PFN_vkVoidFunction)AllocateMemory; if (!strcmp(funcName, "vkFreeMemory")) - return (PFN_vkVoidFunction)vkFreeMemory; + return (PFN_vkVoidFunction)FreeMemory; if (!strcmp(funcName, "vkMapMemory")) - return (PFN_vkVoidFunction)vkMapMemory; + return (PFN_vkVoidFunction)MapMemory; if (!strcmp(funcName, "vkUnmapMemory")) - return (PFN_vkVoidFunction)vkUnmapMemory; + return (PFN_vkVoidFunction)UnmapMemory; if (!strcmp(funcName, "vkFlushMappedMemoryRanges")) - return (PFN_vkVoidFunction)vkFlushMappedMemoryRanges; + return (PFN_vkVoidFunction)FlushMappedMemoryRanges; if (!strcmp(funcName, "vkInvalidateMappedMemoryRanges")) - return (PFN_vkVoidFunction)vkInvalidateMappedMemoryRanges; + return (PFN_vkVoidFunction)InvalidateMappedMemoryRanges; if (!strcmp(funcName, "vkGetDeviceMemoryCommitment")) - return (PFN_vkVoidFunction)vkGetDeviceMemoryCommitment; + return (PFN_vkVoidFunction)GetDeviceMemoryCommitment; if (!strcmp(funcName, "vkBindBufferMemory")) - return (PFN_vkVoidFunction)vkBindBufferMemory; + return (PFN_vkVoidFunction)BindBufferMemory; if (!strcmp(funcName, "vkBindImageMemory")) - return (PFN_vkVoidFunction)vkBindImageMemory; + return (PFN_vkVoidFunction)BindImageMemory; if (!strcmp(funcName, "vkCreateFence")) - return (PFN_vkVoidFunction)vkCreateFence; + return (PFN_vkVoidFunction)CreateFence; if (!strcmp(funcName, "vkDestroyFence")) - return (PFN_vkVoidFunction)vkDestroyFence; + return (PFN_vkVoidFunction)DestroyFence; if (!strcmp(funcName, "vkResetFences")) - return (PFN_vkVoidFunction)vkResetFences; + return (PFN_vkVoidFunction)ResetFences; if (!strcmp(funcName, "vkGetFenceStatus")) - return (PFN_vkVoidFunction)vkGetFenceStatus; + return (PFN_vkVoidFunction)GetFenceStatus; if (!strcmp(funcName, "vkWaitForFences")) - return (PFN_vkVoidFunction)vkWaitForFences; + return (PFN_vkVoidFunction)WaitForFences; if (!strcmp(funcName, "vkCreateSemaphore")) - return (PFN_vkVoidFunction)vkCreateSemaphore; + return (PFN_vkVoidFunction)CreateSemaphore; if (!strcmp(funcName, "vkDestroySemaphore")) - return (PFN_vkVoidFunction)vkDestroySemaphore; + return (PFN_vkVoidFunction)DestroySemaphore; if (!strcmp(funcName, "vkCreateEvent")) - return (PFN_vkVoidFunction)vkCreateEvent; + return (PFN_vkVoidFunction)CreateEvent; if (!strcmp(funcName, "vkDestroyEvent")) - return (PFN_vkVoidFunction)vkDestroyEvent; + return (PFN_vkVoidFunction)DestroyEvent; if (!strcmp(funcName, "vkGetEventStatus")) - return (PFN_vkVoidFunction)vkGetEventStatus; + return (PFN_vkVoidFunction)GetEventStatus; if (!strcmp(funcName, "vkSetEvent")) - return (PFN_vkVoidFunction)vkSetEvent; + return (PFN_vkVoidFunction)SetEvent; if (!strcmp(funcName, "vkResetEvent")) - return (PFN_vkVoidFunction)vkResetEvent; + return (PFN_vkVoidFunction)ResetEvent; if (!strcmp(funcName, "vkCreateQueryPool")) - return (PFN_vkVoidFunction)vkCreateQueryPool; + return (PFN_vkVoidFunction)CreateQueryPool; if (!strcmp(funcName, "vkDestroyQueryPool")) - return (PFN_vkVoidFunction)vkDestroyQueryPool; + return (PFN_vkVoidFunction)DestroyQueryPool; if (!strcmp(funcName, "vkGetQueryPoolResults")) - return (PFN_vkVoidFunction)vkGetQueryPoolResults; + return (PFN_vkVoidFunction)GetQueryPoolResults; if (!strcmp(funcName, "vkCreateBuffer")) - return (PFN_vkVoidFunction)vkCreateBuffer; + return (PFN_vkVoidFunction)CreateBuffer; if (!strcmp(funcName, "vkDestroyBuffer")) - return (PFN_vkVoidFunction)vkDestroyBuffer; + return (PFN_vkVoidFunction)DestroyBuffer; if (!strcmp(funcName, "vkCreateBufferView")) - return (PFN_vkVoidFunction)vkCreateBufferView; + return (PFN_vkVoidFunction)CreateBufferView; if (!strcmp(funcName, "vkDestroyBufferView")) - return (PFN_vkVoidFunction)vkDestroyBufferView; + return (PFN_vkVoidFunction)DestroyBufferView; if (!strcmp(funcName, "vkCreateImage")) - return (PFN_vkVoidFunction)vkCreateImage; + return (PFN_vkVoidFunction)CreateImage; if (!strcmp(funcName, "vkDestroyImage")) - return (PFN_vkVoidFunction)vkDestroyImage; + return (PFN_vkVoidFunction)DestroyImage; if (!strcmp(funcName, "vkGetImageSubresourceLayout")) - return (PFN_vkVoidFunction)vkGetImageSubresourceLayout; + return (PFN_vkVoidFunction)GetImageSubresourceLayout; if (!strcmp(funcName, "vkCreateImageView")) - return (PFN_vkVoidFunction)vkCreateImageView; + return (PFN_vkVoidFunction)CreateImageView; if (!strcmp(funcName, "vkDestroyImageView")) - return (PFN_vkVoidFunction)vkDestroyImageView; + return (PFN_vkVoidFunction)DestroyImageView; if (!strcmp(funcName, "vkCreateShaderModule")) - return (PFN_vkVoidFunction)vkCreateShaderModule; + return (PFN_vkVoidFunction)CreateShaderModule; if (!strcmp(funcName, "vkDestroyShaderModule")) - return (PFN_vkVoidFunction)vkDestroyShaderModule; + return (PFN_vkVoidFunction)DestroyShaderModule; if (!strcmp(funcName, "vkCreatePipelineCache")) - return (PFN_vkVoidFunction)vkCreatePipelineCache; + return (PFN_vkVoidFunction)CreatePipelineCache; if (!strcmp(funcName, "vkDestroyPipelineCache")) - return (PFN_vkVoidFunction)vkDestroyPipelineCache; + return (PFN_vkVoidFunction)DestroyPipelineCache; if (!strcmp(funcName, "vkGetPipelineCacheData")) - return (PFN_vkVoidFunction)vkGetPipelineCacheData; + return (PFN_vkVoidFunction)GetPipelineCacheData; if (!strcmp(funcName, "vkMergePipelineCaches")) - return (PFN_vkVoidFunction)vkMergePipelineCaches; + return (PFN_vkVoidFunction)MergePipelineCaches; if (!strcmp(funcName, "vkCreateGraphicsPipelines")) - return (PFN_vkVoidFunction)vkCreateGraphicsPipelines; + return (PFN_vkVoidFunction)CreateGraphicsPipelines; if (!strcmp(funcName, "vkCreateComputePipelines")) - return (PFN_vkVoidFunction)vkCreateComputePipelines; + return (PFN_vkVoidFunction)CreateComputePipelines; if (!strcmp(funcName, "vkDestroyPipeline")) - return (PFN_vkVoidFunction)vkDestroyPipeline; + return (PFN_vkVoidFunction)DestroyPipeline; if (!strcmp(funcName, "vkCreatePipelineLayout")) - return (PFN_vkVoidFunction)vkCreatePipelineLayout; + return (PFN_vkVoidFunction)CreatePipelineLayout; if (!strcmp(funcName, "vkDestroyPipelineLayout")) - return (PFN_vkVoidFunction)vkDestroyPipelineLayout; + return (PFN_vkVoidFunction)DestroyPipelineLayout; if (!strcmp(funcName, "vkCreateSampler")) - return (PFN_vkVoidFunction)vkCreateSampler; + return (PFN_vkVoidFunction)CreateSampler; if (!strcmp(funcName, "vkDestroySampler")) - return (PFN_vkVoidFunction)vkDestroySampler; + return (PFN_vkVoidFunction)DestroySampler; if (!strcmp(funcName, "vkCreateDescriptorSetLayout")) - return (PFN_vkVoidFunction)vkCreateDescriptorSetLayout; + return (PFN_vkVoidFunction)CreateDescriptorSetLayout; if (!strcmp(funcName, "vkDestroyDescriptorSetLayout")) - return (PFN_vkVoidFunction)vkDestroyDescriptorSetLayout; + return (PFN_vkVoidFunction)DestroyDescriptorSetLayout; if (!strcmp(funcName, "vkCreateDescriptorPool")) - return (PFN_vkVoidFunction)vkCreateDescriptorPool; + return (PFN_vkVoidFunction)CreateDescriptorPool; if (!strcmp(funcName, "vkDestroyDescriptorPool")) - return (PFN_vkVoidFunction)vkDestroyDescriptorPool; + return (PFN_vkVoidFunction)DestroyDescriptorPool; if (!strcmp(funcName, "vkResetDescriptorPool")) - return (PFN_vkVoidFunction)vkResetDescriptorPool; + return (PFN_vkVoidFunction)ResetDescriptorPool; if (!strcmp(funcName, "vkAllocateDescriptorSets")) - return (PFN_vkVoidFunction)vkAllocateDescriptorSets; + return (PFN_vkVoidFunction)AllocateDescriptorSets; if (!strcmp(funcName, "vkFreeDescriptorSets")) - return (PFN_vkVoidFunction)vkFreeDescriptorSets; + return (PFN_vkVoidFunction)FreeDescriptorSets; if (!strcmp(funcName, "vkUpdateDescriptorSets")) - return (PFN_vkVoidFunction)vkUpdateDescriptorSets; + return (PFN_vkVoidFunction)UpdateDescriptorSets; if (!strcmp(funcName, "vkCmdSetViewport")) - return (PFN_vkVoidFunction)vkCmdSetViewport; + return (PFN_vkVoidFunction)CmdSetViewport; if (!strcmp(funcName, "vkCmdSetScissor")) - return (PFN_vkVoidFunction)vkCmdSetScissor; + return (PFN_vkVoidFunction)CmdSetScissor; if (!strcmp(funcName, "vkCmdSetLineWidth")) - return (PFN_vkVoidFunction)vkCmdSetLineWidth; + return (PFN_vkVoidFunction)CmdSetLineWidth; if (!strcmp(funcName, "vkCmdSetDepthBias")) - return (PFN_vkVoidFunction)vkCmdSetDepthBias; + return (PFN_vkVoidFunction)CmdSetDepthBias; if (!strcmp(funcName, "vkCmdSetBlendConstants")) - return (PFN_vkVoidFunction)vkCmdSetBlendConstants; + return (PFN_vkVoidFunction)CmdSetBlendConstants; if (!strcmp(funcName, "vkCmdSetDepthBounds")) - return (PFN_vkVoidFunction)vkCmdSetDepthBounds; + return (PFN_vkVoidFunction)CmdSetDepthBounds; if (!strcmp(funcName, "vkCmdSetStencilCompareMask")) - return (PFN_vkVoidFunction)vkCmdSetStencilCompareMask; + return (PFN_vkVoidFunction)CmdSetStencilCompareMask; if (!strcmp(funcName, "vkCmdSetStencilWriteMask")) - return (PFN_vkVoidFunction)vkCmdSetStencilWriteMask; + return (PFN_vkVoidFunction)CmdSetStencilWriteMask; if (!strcmp(funcName, "vkCmdSetStencilReference")) - return (PFN_vkVoidFunction)vkCmdSetStencilReference; + return (PFN_vkVoidFunction)CmdSetStencilReference; if (!strcmp(funcName, "vkAllocateCommandBuffers")) - return (PFN_vkVoidFunction)vkAllocateCommandBuffers; + return (PFN_vkVoidFunction)AllocateCommandBuffers; if (!strcmp(funcName, "vkFreeCommandBuffers")) - return (PFN_vkVoidFunction)vkFreeCommandBuffers; + return (PFN_vkVoidFunction)FreeCommandBuffers; if (!strcmp(funcName, "vkBeginCommandBuffer")) - return (PFN_vkVoidFunction)vkBeginCommandBuffer; + return (PFN_vkVoidFunction)BeginCommandBuffer; if (!strcmp(funcName, "vkEndCommandBuffer")) - return (PFN_vkVoidFunction)vkEndCommandBuffer; + return (PFN_vkVoidFunction)EndCommandBuffer; if (!strcmp(funcName, "vkResetCommandBuffer")) - return (PFN_vkVoidFunction)vkResetCommandBuffer; + return (PFN_vkVoidFunction)ResetCommandBuffer; if (!strcmp(funcName, "vkCmdBindPipeline")) - return (PFN_vkVoidFunction)vkCmdBindPipeline; + return (PFN_vkVoidFunction)CmdBindPipeline; if (!strcmp(funcName, "vkCmdBindDescriptorSets")) - return (PFN_vkVoidFunction)vkCmdBindDescriptorSets; + return (PFN_vkVoidFunction)CmdBindDescriptorSets; if (!strcmp(funcName, "vkCmdBindVertexBuffers")) - return (PFN_vkVoidFunction)vkCmdBindVertexBuffers; + return (PFN_vkVoidFunction)CmdBindVertexBuffers; if (!strcmp(funcName, "vkCmdBindIndexBuffer")) - return (PFN_vkVoidFunction)vkCmdBindIndexBuffer; + return (PFN_vkVoidFunction)CmdBindIndexBuffer; if (!strcmp(funcName, "vkCmdDraw")) - return (PFN_vkVoidFunction)vkCmdDraw; + return (PFN_vkVoidFunction)CmdDraw; if (!strcmp(funcName, "vkCmdDrawIndexed")) - return (PFN_vkVoidFunction)vkCmdDrawIndexed; + return (PFN_vkVoidFunction)CmdDrawIndexed; if (!strcmp(funcName, "vkCmdDrawIndirect")) - return (PFN_vkVoidFunction)vkCmdDrawIndirect; + return (PFN_vkVoidFunction)CmdDrawIndirect; if (!strcmp(funcName, "vkCmdDrawIndexedIndirect")) - return (PFN_vkVoidFunction)vkCmdDrawIndexedIndirect; + return (PFN_vkVoidFunction)CmdDrawIndexedIndirect; if (!strcmp(funcName, "vkCmdDispatch")) - return (PFN_vkVoidFunction)vkCmdDispatch; + return (PFN_vkVoidFunction)CmdDispatch; if (!strcmp(funcName, "vkCmdDispatchIndirect")) - return (PFN_vkVoidFunction)vkCmdDispatchIndirect; + return (PFN_vkVoidFunction)CmdDispatchIndirect; if (!strcmp(funcName, "vkCmdCopyBuffer")) - return (PFN_vkVoidFunction)vkCmdCopyBuffer; + return (PFN_vkVoidFunction)CmdCopyBuffer; if (!strcmp(funcName, "vkCmdCopyImage")) - return (PFN_vkVoidFunction)vkCmdCopyImage; + return (PFN_vkVoidFunction)CmdCopyImage; if (!strcmp(funcName, "vkCmdBlitImage")) - return (PFN_vkVoidFunction)vkCmdBlitImage; + return (PFN_vkVoidFunction)CmdBlitImage; if (!strcmp(funcName, "vkCmdCopyBufferToImage")) - return (PFN_vkVoidFunction)vkCmdCopyBufferToImage; + return (PFN_vkVoidFunction)CmdCopyBufferToImage; if (!strcmp(funcName, "vkCmdCopyImageToBuffer")) - return (PFN_vkVoidFunction)vkCmdCopyImageToBuffer; + return (PFN_vkVoidFunction)CmdCopyImageToBuffer; if (!strcmp(funcName, "vkCmdUpdateBuffer")) - return (PFN_vkVoidFunction)vkCmdUpdateBuffer; + return (PFN_vkVoidFunction)CmdUpdateBuffer; if (!strcmp(funcName, "vkCmdFillBuffer")) - return (PFN_vkVoidFunction)vkCmdFillBuffer; + return (PFN_vkVoidFunction)CmdFillBuffer; if (!strcmp(funcName, "vkCmdClearColorImage")) - return (PFN_vkVoidFunction)vkCmdClearColorImage; + return (PFN_vkVoidFunction)CmdClearColorImage; if (!strcmp(funcName, "vkCmdResolveImage")) - return (PFN_vkVoidFunction)vkCmdResolveImage; + return (PFN_vkVoidFunction)CmdResolveImage; if (!strcmp(funcName, "vkCmdSetEvent")) - return (PFN_vkVoidFunction)vkCmdSetEvent; + return (PFN_vkVoidFunction)CmdSetEvent; if (!strcmp(funcName, "vkCmdResetEvent")) - return (PFN_vkVoidFunction)vkCmdResetEvent; + return (PFN_vkVoidFunction)CmdResetEvent; if (!strcmp(funcName, "vkCmdWaitEvents")) - return (PFN_vkVoidFunction)vkCmdWaitEvents; + return (PFN_vkVoidFunction)CmdWaitEvents; if (!strcmp(funcName, "vkCmdPipelineBarrier")) - return (PFN_vkVoidFunction)vkCmdPipelineBarrier; + return (PFN_vkVoidFunction)CmdPipelineBarrier; if (!strcmp(funcName, "vkCmdBeginQuery")) - return (PFN_vkVoidFunction)vkCmdBeginQuery; + return (PFN_vkVoidFunction)CmdBeginQuery; if (!strcmp(funcName, "vkCmdEndQuery")) - return (PFN_vkVoidFunction)vkCmdEndQuery; + return (PFN_vkVoidFunction)CmdEndQuery; if (!strcmp(funcName, "vkCmdResetQueryPool")) - return (PFN_vkVoidFunction)vkCmdResetQueryPool; + return (PFN_vkVoidFunction)CmdResetQueryPool; if (!strcmp(funcName, "vkCmdWriteTimestamp")) - return (PFN_vkVoidFunction)vkCmdWriteTimestamp; + return (PFN_vkVoidFunction)CmdWriteTimestamp; if (!strcmp(funcName, "vkCmdCopyQueryPoolResults")) - return (PFN_vkVoidFunction)vkCmdCopyQueryPoolResults; + return (PFN_vkVoidFunction)CmdCopyQueryPoolResults; if (!strcmp(funcName, "vkCreateFramebuffer")) - return (PFN_vkVoidFunction)vkCreateFramebuffer; + return (PFN_vkVoidFunction)CreateFramebuffer; if (!strcmp(funcName, "vkDestroyFramebuffer")) - return (PFN_vkVoidFunction)vkDestroyFramebuffer; + return (PFN_vkVoidFunction)DestroyFramebuffer; if (!strcmp(funcName, "vkCreateRenderPass")) - return (PFN_vkVoidFunction)vkCreateRenderPass; + return (PFN_vkVoidFunction)CreateRenderPass; if (!strcmp(funcName, "vkDestroyRenderPass")) - return (PFN_vkVoidFunction)vkDestroyRenderPass; + return (PFN_vkVoidFunction)DestroyRenderPass; if (!strcmp(funcName, "vkGetRenderAreaGranularity")) - return (PFN_vkVoidFunction)vkGetRenderAreaGranularity; + return (PFN_vkVoidFunction)GetRenderAreaGranularity; if (!strcmp(funcName, "vkCreateCommandPool")) - return (PFN_vkVoidFunction)vkCreateCommandPool; + return (PFN_vkVoidFunction)CreateCommandPool; if (!strcmp(funcName, "vkDestroyCommandPool")) - return (PFN_vkVoidFunction)vkDestroyCommandPool; + return (PFN_vkVoidFunction)DestroyCommandPool; if (!strcmp(funcName, "vkResetCommandPool")) - return (PFN_vkVoidFunction)vkResetCommandPool; + return (PFN_vkVoidFunction)ResetCommandPool; if (!strcmp(funcName, "vkCmdBeginRenderPass")) - return (PFN_vkVoidFunction)vkCmdBeginRenderPass; + return (PFN_vkVoidFunction)CmdBeginRenderPass; if (!strcmp(funcName, "vkCmdNextSubpass")) - return (PFN_vkVoidFunction)vkCmdNextSubpass; + return (PFN_vkVoidFunction)CmdNextSubpass; if (device == NULL) { return NULL; @@ -4518,31 +4518,31 @@ VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkD return get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr(device, funcName); } -VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) { +VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) { if (!strcmp(funcName, "vkGetInstanceProcAddr")) - return (PFN_vkVoidFunction)vkGetInstanceProcAddr; + return (PFN_vkVoidFunction)GetInstanceProcAddr; if (!strcmp(funcName, "vkCreateInstance")) - return (PFN_vkVoidFunction)vkCreateInstance; + return (PFN_vkVoidFunction)CreateInstance; if (!strcmp(funcName, "vkDestroyInstance")) - return (PFN_vkVoidFunction)vkDestroyInstance; + return (PFN_vkVoidFunction)DestroyInstance; if (!strcmp(funcName, "vkCreateDevice")) - return (PFN_vkVoidFunction)vkCreateDevice; + return (PFN_vkVoidFunction)CreateDevice; if (!strcmp(funcName, "vkEnumeratePhysicalDevices")) - return (PFN_vkVoidFunction)vkEnumeratePhysicalDevices; + return (PFN_vkVoidFunction)EnumeratePhysicalDevices; if (!strcmp(funcName, "vkGetPhysicalDeviceProperties")) - return (PFN_vkVoidFunction)vkGetPhysicalDeviceProperties; + return (PFN_vkVoidFunction)GetPhysicalDeviceProperties; if (!strcmp(funcName, "vkGetPhysicalDeviceFeatures")) - return (PFN_vkVoidFunction)vkGetPhysicalDeviceFeatures; + return (PFN_vkVoidFunction)GetPhysicalDeviceFeatures; if (!strcmp(funcName, "vkGetPhysicalDeviceFormatProperties")) - return (PFN_vkVoidFunction)vkGetPhysicalDeviceFormatProperties; + return (PFN_vkVoidFunction)GetPhysicalDeviceFormatProperties; if (!strcmp(funcName, "vkGetPhysicalDeviceImageFormatProperties")) - return (PFN_vkVoidFunction)vkGetPhysicalDeviceImageFormatProperties; + return (PFN_vkVoidFunction)GetPhysicalDeviceImageFormatProperties; if (!strcmp(funcName, "vkGetPhysicalDeviceSparseImageFormatProperties")) - return (PFN_vkVoidFunction)vkGetPhysicalDeviceSparseImageFormatProperties; + return (PFN_vkVoidFunction)GetPhysicalDeviceSparseImageFormatProperties; if (!strcmp(funcName, "vkGetPhysicalDeviceQueueFamilyProperties")) - return (PFN_vkVoidFunction)vkGetPhysicalDeviceQueueFamilyProperties; + return (PFN_vkVoidFunction)GetPhysicalDeviceQueueFamilyProperties; if (!strcmp(funcName, "vkGetPhysicalDeviceMemoryProperties")) - return (PFN_vkVoidFunction)vkGetPhysicalDeviceMemoryProperties; + return (PFN_vkVoidFunction)GetPhysicalDeviceMemoryProperties; if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties")) return (PFN_vkVoidFunction)vkEnumerateInstanceLayerProperties; if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties")) @@ -4550,7 +4550,7 @@ VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(V if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties")) return (PFN_vkVoidFunction)vkEnumerateDeviceLayerProperties; if (!strcmp(funcName, "vkEnumerateDeviceExtensionProperties")) - return (PFN_vkVoidFunction)vkEnumerateDeviceExtensionProperties; + return (PFN_vkVoidFunction)EnumerateDeviceExtensionProperties; if (instance == NULL) { return NULL; @@ -4574,19 +4574,19 @@ VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(V VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pMsgCallback) { - return parameter_validation::vkCreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback); + return parameter_validation::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback); } VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback, const VkAllocationCallbacks *pAllocator) { - parameter_validation::vkDestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator); + parameter_validation::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator); } VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg) { - parameter_validation::vkDebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg); + parameter_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg); } // loader-layer interface v0 @@ -4611,13 +4611,13 @@ vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCou VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { - return parameter_validation::vkEnumerateDeviceExtensionProperties(physicalDevice, pLayerName, pCount, pProperties); + return parameter_validation::EnumerateDeviceExtensionProperties(physicalDevice, pLayerName, pCount, pProperties); } VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) { - return parameter_validation::vkGetDeviceProcAddr(dev, funcName); + return parameter_validation::GetDeviceProcAddr(dev, funcName); } VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) { - return parameter_validation::vkGetInstanceProcAddr(instance, funcName); + return parameter_validation::GetInstanceProcAddr(instance, funcName); } -- cgit v1.2.3 From 69669fa8606cc243ea47dead6f70fb1bf5fcde6d Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Mon, 16 May 2016 07:30:58 +0800 Subject: parameter_validation: add parameter_validation::global_layer Replace pc_global_layers with global_layer. There is no plan to define more than one layer in the same namespace. --- layers/parameter_validation.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/layers/parameter_validation.cpp b/layers/parameter_validation.cpp index 1edd4f93..3ec84b6f 100644 --- a/layers/parameter_validation.cpp +++ b/layers/parameter_validation.cpp @@ -134,9 +134,9 @@ DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugR static const VkExtensionProperties instance_extensions[] = {{VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}}; -static const VkLayerProperties pc_global_layers[] = {{ +static const VkLayerProperties global_layer = { "VK_LAYER_LUNARG_parameter_validation", VK_LAYER_API_VERSION, 1, "LunarG Validation Layer", -}}; +}; static bool ValidateEnumerator(VkFormatFeatureFlagBits const &enumerator) { VkFormatFeatureFlagBits allFlags = (VkFormatFeatureFlagBits)( @@ -4598,14 +4598,14 @@ vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) { - return util_GetLayerProperties(ARRAY_SIZE(parameter_validation::pc_global_layers), parameter_validation::pc_global_layers, pCount, pProperties); + return util_GetLayerProperties(1, ¶meter_validation::global_layer, pCount, pProperties); } VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) { /* parameter_validation's physical device layers are the same as global */ - return util_GetLayerProperties(ARRAY_SIZE(parameter_validation::pc_global_layers), parameter_validation::pc_global_layers, pCount, pProperties); + return util_GetLayerProperties(1, ¶meter_validation::global_layer, pCount, pProperties); } VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, -- cgit v1.2.3 From 33065f0aeeb1cddc8a85ff8b9b68ea64291ce158 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Mon, 16 May 2016 07:34:09 +0800 Subject: parameter_validation: improve EnumerateDeviceExtensionProperties Call down the next layer unless pLayerName is parameter_validation. --- layers/parameter_validation.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/layers/parameter_validation.cpp b/layers/parameter_validation.cpp index 3ec84b6f..697ed7d7 100644 --- a/layers/parameter_validation.cpp +++ b/layers/parameter_validation.cpp @@ -4269,12 +4269,13 @@ VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevi const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { /* parameter_validation does not have any physical device extensions */ - if (pLayerName == NULL) { - return get_dispatch_table(pc_instance_table_map, physicalDevice) - ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties); - } else { + if (pLayerName && !strcmp(pLayerName, global_layer.layerName)) return util_GetExtensionProperties(0, NULL, pCount, pProperties); - } + + assert(physicalDevice); + + return get_dispatch_table(pc_instance_table_map, physicalDevice) + ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties); } VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) { @@ -4611,7 +4612,8 @@ vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCou VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { - return parameter_validation::EnumerateDeviceExtensionProperties(physicalDevice, pLayerName, pCount, pProperties); + // the layer command handles VK_NULL_HANDLE just fine + return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties); } VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) { -- cgit v1.2.3 From 327c54adbb69ac8f65277f50d054e77c2b3a080b Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Mon, 16 May 2016 07:37:41 +0800 Subject: parameter_validation: add intercept_core_device_command It returns the function pointers for all intercepted core device commands. Call intercept_core_device_command from GetDeviceProcAddr. Assert that device is valid in GetDeviceProcAddr. --- layers/parameter_validation.cpp | 364 +++++++++++++++------------------------- 1 file changed, 136 insertions(+), 228 deletions(-) diff --git a/layers/parameter_validation.cpp b/layers/parameter_validation.cpp index 697ed7d7..c3079509 100644 --- a/layers/parameter_validation.cpp +++ b/layers/parameter_validation.cpp @@ -4278,241 +4278,21 @@ VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevi ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties); } +static PFN_vkVoidFunction +intercept_core_device_command(const char *name); + VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) { + assert(device); + layer_data *data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); if (validate_string(data->report_data, "vkGetDeviceProcAddr", "funcName", funcName)) { return NULL; } - if (!strcmp(funcName, "vkGetDeviceProcAddr")) - return (PFN_vkVoidFunction)GetDeviceProcAddr; - if (!strcmp(funcName, "vkDestroyDevice")) - return (PFN_vkVoidFunction)DestroyDevice; - if (!strcmp(funcName, "vkGetDeviceQueue")) - return (PFN_vkVoidFunction)GetDeviceQueue; - if (!strcmp(funcName, "vkQueueSubmit")) - return (PFN_vkVoidFunction)QueueSubmit; - if (!strcmp(funcName, "vkQueueWaitIdle")) - return (PFN_vkVoidFunction)QueueWaitIdle; - if (!strcmp(funcName, "vkDeviceWaitIdle")) - return (PFN_vkVoidFunction)DeviceWaitIdle; - if (!strcmp(funcName, "vkAllocateMemory")) - return (PFN_vkVoidFunction)AllocateMemory; - if (!strcmp(funcName, "vkFreeMemory")) - return (PFN_vkVoidFunction)FreeMemory; - if (!strcmp(funcName, "vkMapMemory")) - return (PFN_vkVoidFunction)MapMemory; - if (!strcmp(funcName, "vkUnmapMemory")) - return (PFN_vkVoidFunction)UnmapMemory; - if (!strcmp(funcName, "vkFlushMappedMemoryRanges")) - return (PFN_vkVoidFunction)FlushMappedMemoryRanges; - if (!strcmp(funcName, "vkInvalidateMappedMemoryRanges")) - return (PFN_vkVoidFunction)InvalidateMappedMemoryRanges; - if (!strcmp(funcName, "vkGetDeviceMemoryCommitment")) - return (PFN_vkVoidFunction)GetDeviceMemoryCommitment; - if (!strcmp(funcName, "vkBindBufferMemory")) - return (PFN_vkVoidFunction)BindBufferMemory; - if (!strcmp(funcName, "vkBindImageMemory")) - return (PFN_vkVoidFunction)BindImageMemory; - if (!strcmp(funcName, "vkCreateFence")) - return (PFN_vkVoidFunction)CreateFence; - if (!strcmp(funcName, "vkDestroyFence")) - return (PFN_vkVoidFunction)DestroyFence; - if (!strcmp(funcName, "vkResetFences")) - return (PFN_vkVoidFunction)ResetFences; - if (!strcmp(funcName, "vkGetFenceStatus")) - return (PFN_vkVoidFunction)GetFenceStatus; - if (!strcmp(funcName, "vkWaitForFences")) - return (PFN_vkVoidFunction)WaitForFences; - if (!strcmp(funcName, "vkCreateSemaphore")) - return (PFN_vkVoidFunction)CreateSemaphore; - if (!strcmp(funcName, "vkDestroySemaphore")) - return (PFN_vkVoidFunction)DestroySemaphore; - if (!strcmp(funcName, "vkCreateEvent")) - return (PFN_vkVoidFunction)CreateEvent; - if (!strcmp(funcName, "vkDestroyEvent")) - return (PFN_vkVoidFunction)DestroyEvent; - if (!strcmp(funcName, "vkGetEventStatus")) - return (PFN_vkVoidFunction)GetEventStatus; - if (!strcmp(funcName, "vkSetEvent")) - return (PFN_vkVoidFunction)SetEvent; - if (!strcmp(funcName, "vkResetEvent")) - return (PFN_vkVoidFunction)ResetEvent; - if (!strcmp(funcName, "vkCreateQueryPool")) - return (PFN_vkVoidFunction)CreateQueryPool; - if (!strcmp(funcName, "vkDestroyQueryPool")) - return (PFN_vkVoidFunction)DestroyQueryPool; - if (!strcmp(funcName, "vkGetQueryPoolResults")) - return (PFN_vkVoidFunction)GetQueryPoolResults; - if (!strcmp(funcName, "vkCreateBuffer")) - return (PFN_vkVoidFunction)CreateBuffer; - if (!strcmp(funcName, "vkDestroyBuffer")) - return (PFN_vkVoidFunction)DestroyBuffer; - if (!strcmp(funcName, "vkCreateBufferView")) - return (PFN_vkVoidFunction)CreateBufferView; - if (!strcmp(funcName, "vkDestroyBufferView")) - return (PFN_vkVoidFunction)DestroyBufferView; - if (!strcmp(funcName, "vkCreateImage")) - return (PFN_vkVoidFunction)CreateImage; - if (!strcmp(funcName, "vkDestroyImage")) - return (PFN_vkVoidFunction)DestroyImage; - if (!strcmp(funcName, "vkGetImageSubresourceLayout")) - return (PFN_vkVoidFunction)GetImageSubresourceLayout; - if (!strcmp(funcName, "vkCreateImageView")) - return (PFN_vkVoidFunction)CreateImageView; - if (!strcmp(funcName, "vkDestroyImageView")) - return (PFN_vkVoidFunction)DestroyImageView; - if (!strcmp(funcName, "vkCreateShaderModule")) - return (PFN_vkVoidFunction)CreateShaderModule; - if (!strcmp(funcName, "vkDestroyShaderModule")) - return (PFN_vkVoidFunction)DestroyShaderModule; - if (!strcmp(funcName, "vkCreatePipelineCache")) - return (PFN_vkVoidFunction)CreatePipelineCache; - if (!strcmp(funcName, "vkDestroyPipelineCache")) - return (PFN_vkVoidFunction)DestroyPipelineCache; - if (!strcmp(funcName, "vkGetPipelineCacheData")) - return (PFN_vkVoidFunction)GetPipelineCacheData; - if (!strcmp(funcName, "vkMergePipelineCaches")) - return (PFN_vkVoidFunction)MergePipelineCaches; - if (!strcmp(funcName, "vkCreateGraphicsPipelines")) - return (PFN_vkVoidFunction)CreateGraphicsPipelines; - if (!strcmp(funcName, "vkCreateComputePipelines")) - return (PFN_vkVoidFunction)CreateComputePipelines; - if (!strcmp(funcName, "vkDestroyPipeline")) - return (PFN_vkVoidFunction)DestroyPipeline; - if (!strcmp(funcName, "vkCreatePipelineLayout")) - return (PFN_vkVoidFunction)CreatePipelineLayout; - if (!strcmp(funcName, "vkDestroyPipelineLayout")) - return (PFN_vkVoidFunction)DestroyPipelineLayout; - if (!strcmp(funcName, "vkCreateSampler")) - return (PFN_vkVoidFunction)CreateSampler; - if (!strcmp(funcName, "vkDestroySampler")) - return (PFN_vkVoidFunction)DestroySampler; - if (!strcmp(funcName, "vkCreateDescriptorSetLayout")) - return (PFN_vkVoidFunction)CreateDescriptorSetLayout; - if (!strcmp(funcName, "vkDestroyDescriptorSetLayout")) - return (PFN_vkVoidFunction)DestroyDescriptorSetLayout; - if (!strcmp(funcName, "vkCreateDescriptorPool")) - return (PFN_vkVoidFunction)CreateDescriptorPool; - if (!strcmp(funcName, "vkDestroyDescriptorPool")) - return (PFN_vkVoidFunction)DestroyDescriptorPool; - if (!strcmp(funcName, "vkResetDescriptorPool")) - return (PFN_vkVoidFunction)ResetDescriptorPool; - if (!strcmp(funcName, "vkAllocateDescriptorSets")) - return (PFN_vkVoidFunction)AllocateDescriptorSets; - if (!strcmp(funcName, "vkFreeDescriptorSets")) - return (PFN_vkVoidFunction)FreeDescriptorSets; - if (!strcmp(funcName, "vkUpdateDescriptorSets")) - return (PFN_vkVoidFunction)UpdateDescriptorSets; - if (!strcmp(funcName, "vkCmdSetViewport")) - return (PFN_vkVoidFunction)CmdSetViewport; - if (!strcmp(funcName, "vkCmdSetScissor")) - return (PFN_vkVoidFunction)CmdSetScissor; - if (!strcmp(funcName, "vkCmdSetLineWidth")) - return (PFN_vkVoidFunction)CmdSetLineWidth; - if (!strcmp(funcName, "vkCmdSetDepthBias")) - return (PFN_vkVoidFunction)CmdSetDepthBias; - if (!strcmp(funcName, "vkCmdSetBlendConstants")) - return (PFN_vkVoidFunction)CmdSetBlendConstants; - if (!strcmp(funcName, "vkCmdSetDepthBounds")) - return (PFN_vkVoidFunction)CmdSetDepthBounds; - if (!strcmp(funcName, "vkCmdSetStencilCompareMask")) - return (PFN_vkVoidFunction)CmdSetStencilCompareMask; - if (!strcmp(funcName, "vkCmdSetStencilWriteMask")) - return (PFN_vkVoidFunction)CmdSetStencilWriteMask; - if (!strcmp(funcName, "vkCmdSetStencilReference")) - return (PFN_vkVoidFunction)CmdSetStencilReference; - if (!strcmp(funcName, "vkAllocateCommandBuffers")) - return (PFN_vkVoidFunction)AllocateCommandBuffers; - if (!strcmp(funcName, "vkFreeCommandBuffers")) - return (PFN_vkVoidFunction)FreeCommandBuffers; - if (!strcmp(funcName, "vkBeginCommandBuffer")) - return (PFN_vkVoidFunction)BeginCommandBuffer; - if (!strcmp(funcName, "vkEndCommandBuffer")) - return (PFN_vkVoidFunction)EndCommandBuffer; - if (!strcmp(funcName, "vkResetCommandBuffer")) - return (PFN_vkVoidFunction)ResetCommandBuffer; - if (!strcmp(funcName, "vkCmdBindPipeline")) - return (PFN_vkVoidFunction)CmdBindPipeline; - if (!strcmp(funcName, "vkCmdBindDescriptorSets")) - return (PFN_vkVoidFunction)CmdBindDescriptorSets; - if (!strcmp(funcName, "vkCmdBindVertexBuffers")) - return (PFN_vkVoidFunction)CmdBindVertexBuffers; - if (!strcmp(funcName, "vkCmdBindIndexBuffer")) - return (PFN_vkVoidFunction)CmdBindIndexBuffer; - if (!strcmp(funcName, "vkCmdDraw")) - return (PFN_vkVoidFunction)CmdDraw; - if (!strcmp(funcName, "vkCmdDrawIndexed")) - return (PFN_vkVoidFunction)CmdDrawIndexed; - if (!strcmp(funcName, "vkCmdDrawIndirect")) - return (PFN_vkVoidFunction)CmdDrawIndirect; - if (!strcmp(funcName, "vkCmdDrawIndexedIndirect")) - return (PFN_vkVoidFunction)CmdDrawIndexedIndirect; - if (!strcmp(funcName, "vkCmdDispatch")) - return (PFN_vkVoidFunction)CmdDispatch; - if (!strcmp(funcName, "vkCmdDispatchIndirect")) - return (PFN_vkVoidFunction)CmdDispatchIndirect; - if (!strcmp(funcName, "vkCmdCopyBuffer")) - return (PFN_vkVoidFunction)CmdCopyBuffer; - if (!strcmp(funcName, "vkCmdCopyImage")) - return (PFN_vkVoidFunction)CmdCopyImage; - if (!strcmp(funcName, "vkCmdBlitImage")) - return (PFN_vkVoidFunction)CmdBlitImage; - if (!strcmp(funcName, "vkCmdCopyBufferToImage")) - return (PFN_vkVoidFunction)CmdCopyBufferToImage; - if (!strcmp(funcName, "vkCmdCopyImageToBuffer")) - return (PFN_vkVoidFunction)CmdCopyImageToBuffer; - if (!strcmp(funcName, "vkCmdUpdateBuffer")) - return (PFN_vkVoidFunction)CmdUpdateBuffer; - if (!strcmp(funcName, "vkCmdFillBuffer")) - return (PFN_vkVoidFunction)CmdFillBuffer; - if (!strcmp(funcName, "vkCmdClearColorImage")) - return (PFN_vkVoidFunction)CmdClearColorImage; - if (!strcmp(funcName, "vkCmdResolveImage")) - return (PFN_vkVoidFunction)CmdResolveImage; - if (!strcmp(funcName, "vkCmdSetEvent")) - return (PFN_vkVoidFunction)CmdSetEvent; - if (!strcmp(funcName, "vkCmdResetEvent")) - return (PFN_vkVoidFunction)CmdResetEvent; - if (!strcmp(funcName, "vkCmdWaitEvents")) - return (PFN_vkVoidFunction)CmdWaitEvents; - if (!strcmp(funcName, "vkCmdPipelineBarrier")) - return (PFN_vkVoidFunction)CmdPipelineBarrier; - if (!strcmp(funcName, "vkCmdBeginQuery")) - return (PFN_vkVoidFunction)CmdBeginQuery; - if (!strcmp(funcName, "vkCmdEndQuery")) - return (PFN_vkVoidFunction)CmdEndQuery; - if (!strcmp(funcName, "vkCmdResetQueryPool")) - return (PFN_vkVoidFunction)CmdResetQueryPool; - if (!strcmp(funcName, "vkCmdWriteTimestamp")) - return (PFN_vkVoidFunction)CmdWriteTimestamp; - if (!strcmp(funcName, "vkCmdCopyQueryPoolResults")) - return (PFN_vkVoidFunction)CmdCopyQueryPoolResults; - if (!strcmp(funcName, "vkCreateFramebuffer")) - return (PFN_vkVoidFunction)CreateFramebuffer; - if (!strcmp(funcName, "vkDestroyFramebuffer")) - return (PFN_vkVoidFunction)DestroyFramebuffer; - if (!strcmp(funcName, "vkCreateRenderPass")) - return (PFN_vkVoidFunction)CreateRenderPass; - if (!strcmp(funcName, "vkDestroyRenderPass")) - return (PFN_vkVoidFunction)DestroyRenderPass; - if (!strcmp(funcName, "vkGetRenderAreaGranularity")) - return (PFN_vkVoidFunction)GetRenderAreaGranularity; - if (!strcmp(funcName, "vkCreateCommandPool")) - return (PFN_vkVoidFunction)CreateCommandPool; - if (!strcmp(funcName, "vkDestroyCommandPool")) - return (PFN_vkVoidFunction)DestroyCommandPool; - if (!strcmp(funcName, "vkResetCommandPool")) - return (PFN_vkVoidFunction)ResetCommandPool; - if (!strcmp(funcName, "vkCmdBeginRenderPass")) - return (PFN_vkVoidFunction)CmdBeginRenderPass; - if (!strcmp(funcName, "vkCmdNextSubpass")) - return (PFN_vkVoidFunction)CmdNextSubpass; - - if (device == NULL) { - return NULL; - } + PFN_vkVoidFunction proc = intercept_core_device_command(funcName); + if (proc) + return proc; if (get_dispatch_table(pc_device_table_map, device)->GetDeviceProcAddr == NULL) return NULL; @@ -4568,6 +4348,134 @@ VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName); } +static PFN_vkVoidFunction +intercept_core_device_command(const char *name) { + static const struct { + const char *name; + PFN_vkVoidFunction proc; + } core_device_commands[] = { + { "vkGetDeviceProcAddr", reinterpret_cast(GetDeviceProcAddr) }, + { "vkDestroyDevice", reinterpret_cast(DestroyDevice) }, + { "vkGetDeviceQueue", reinterpret_cast(GetDeviceQueue) }, + { "vkQueueSubmit", reinterpret_cast(QueueSubmit) }, + { "vkQueueWaitIdle", reinterpret_cast(QueueWaitIdle) }, + { "vkDeviceWaitIdle", reinterpret_cast(DeviceWaitIdle) }, + { "vkAllocateMemory", reinterpret_cast(AllocateMemory) }, + { "vkFreeMemory", reinterpret_cast(FreeMemory) }, + { "vkMapMemory", reinterpret_cast(MapMemory) }, + { "vkUnmapMemory", reinterpret_cast(UnmapMemory) }, + { "vkFlushMappedMemoryRanges", reinterpret_cast(FlushMappedMemoryRanges) }, + { "vkInvalidateMappedMemoryRanges", reinterpret_cast(InvalidateMappedMemoryRanges) }, + { "vkGetDeviceMemoryCommitment", reinterpret_cast(GetDeviceMemoryCommitment) }, + { "vkBindBufferMemory", reinterpret_cast(BindBufferMemory) }, + { "vkBindImageMemory", reinterpret_cast(BindImageMemory) }, + { "vkCreateFence", reinterpret_cast(CreateFence) }, + { "vkDestroyFence", reinterpret_cast(DestroyFence) }, + { "vkResetFences", reinterpret_cast(ResetFences) }, + { "vkGetFenceStatus", reinterpret_cast(GetFenceStatus) }, + { "vkWaitForFences", reinterpret_cast(WaitForFences) }, + { "vkCreateSemaphore", reinterpret_cast(CreateSemaphore) }, + { "vkDestroySemaphore", reinterpret_cast(DestroySemaphore) }, + { "vkCreateEvent", reinterpret_cast(CreateEvent) }, + { "vkDestroyEvent", reinterpret_cast(DestroyEvent) }, + { "vkGetEventStatus", reinterpret_cast(GetEventStatus) }, + { "vkSetEvent", reinterpret_cast(SetEvent) }, + { "vkResetEvent", reinterpret_cast(ResetEvent) }, + { "vkCreateQueryPool", reinterpret_cast(CreateQueryPool) }, + { "vkDestroyQueryPool", reinterpret_cast(DestroyQueryPool) }, + { "vkGetQueryPoolResults", reinterpret_cast(GetQueryPoolResults) }, + { "vkCreateBuffer", reinterpret_cast(CreateBuffer) }, + { "vkDestroyBuffer", reinterpret_cast(DestroyBuffer) }, + { "vkCreateBufferView", reinterpret_cast(CreateBufferView) }, + { "vkDestroyBufferView", reinterpret_cast(DestroyBufferView) }, + { "vkCreateImage", reinterpret_cast(CreateImage) }, + { "vkDestroyImage", reinterpret_cast(DestroyImage) }, + { "vkGetImageSubresourceLayout", reinterpret_cast(GetImageSubresourceLayout) }, + { "vkCreateImageView", reinterpret_cast(CreateImageView) }, + { "vkDestroyImageView", reinterpret_cast(DestroyImageView) }, + { "vkCreateShaderModule", reinterpret_cast(CreateShaderModule) }, + { "vkDestroyShaderModule", reinterpret_cast(DestroyShaderModule) }, + { "vkCreatePipelineCache", reinterpret_cast(CreatePipelineCache) }, + { "vkDestroyPipelineCache", reinterpret_cast(DestroyPipelineCache) }, + { "vkGetPipelineCacheData", reinterpret_cast(GetPipelineCacheData) }, + { "vkMergePipelineCaches", reinterpret_cast(MergePipelineCaches) }, + { "vkCreateGraphicsPipelines", reinterpret_cast(CreateGraphicsPipelines) }, + { "vkCreateComputePipelines", reinterpret_cast(CreateComputePipelines) }, + { "vkDestroyPipeline", reinterpret_cast(DestroyPipeline) }, + { "vkCreatePipelineLayout", reinterpret_cast(CreatePipelineLayout) }, + { "vkDestroyPipelineLayout", reinterpret_cast(DestroyPipelineLayout) }, + { "vkCreateSampler", reinterpret_cast(CreateSampler) }, + { "vkDestroySampler", reinterpret_cast(DestroySampler) }, + { "vkCreateDescriptorSetLayout", reinterpret_cast(CreateDescriptorSetLayout) }, + { "vkDestroyDescriptorSetLayout", reinterpret_cast(DestroyDescriptorSetLayout) }, + { "vkCreateDescriptorPool", reinterpret_cast(CreateDescriptorPool) }, + { "vkDestroyDescriptorPool", reinterpret_cast(DestroyDescriptorPool) }, + { "vkResetDescriptorPool", reinterpret_cast(ResetDescriptorPool) }, + { "vkAllocateDescriptorSets", reinterpret_cast(AllocateDescriptorSets) }, + { "vkFreeDescriptorSets", reinterpret_cast(FreeDescriptorSets) }, + { "vkUpdateDescriptorSets", reinterpret_cast(UpdateDescriptorSets) }, + { "vkCmdSetViewport", reinterpret_cast(CmdSetViewport) }, + { "vkCmdSetScissor", reinterpret_cast(CmdSetScissor) }, + { "vkCmdSetLineWidth", reinterpret_cast(CmdSetLineWidth) }, + { "vkCmdSetDepthBias", reinterpret_cast(CmdSetDepthBias) }, + { "vkCmdSetBlendConstants", reinterpret_cast(CmdSetBlendConstants) }, + { "vkCmdSetDepthBounds", reinterpret_cast(CmdSetDepthBounds) }, + { "vkCmdSetStencilCompareMask", reinterpret_cast(CmdSetStencilCompareMask) }, + { "vkCmdSetStencilWriteMask", reinterpret_cast(CmdSetStencilWriteMask) }, + { "vkCmdSetStencilReference", reinterpret_cast(CmdSetStencilReference) }, + { "vkAllocateCommandBuffers", reinterpret_cast(AllocateCommandBuffers) }, + { "vkFreeCommandBuffers", reinterpret_cast(FreeCommandBuffers) }, + { "vkBeginCommandBuffer", reinterpret_cast(BeginCommandBuffer) }, + { "vkEndCommandBuffer", reinterpret_cast(EndCommandBuffer) }, + { "vkResetCommandBuffer", reinterpret_cast(ResetCommandBuffer) }, + { "vkCmdBindPipeline", reinterpret_cast(CmdBindPipeline) }, + { "vkCmdBindDescriptorSets", reinterpret_cast(CmdBindDescriptorSets) }, + { "vkCmdBindVertexBuffers", reinterpret_cast(CmdBindVertexBuffers) }, + { "vkCmdBindIndexBuffer", reinterpret_cast(CmdBindIndexBuffer) }, + { "vkCmdDraw", reinterpret_cast(CmdDraw) }, + { "vkCmdDrawIndexed", reinterpret_cast(CmdDrawIndexed) }, + { "vkCmdDrawIndirect", reinterpret_cast(CmdDrawIndirect) }, + { "vkCmdDrawIndexedIndirect", reinterpret_cast(CmdDrawIndexedIndirect) }, + { "vkCmdDispatch", reinterpret_cast(CmdDispatch) }, + { "vkCmdDispatchIndirect", reinterpret_cast(CmdDispatchIndirect) }, + { "vkCmdCopyBuffer", reinterpret_cast(CmdCopyBuffer) }, + { "vkCmdCopyImage", reinterpret_cast(CmdCopyImage) }, + { "vkCmdBlitImage", reinterpret_cast(CmdBlitImage) }, + { "vkCmdCopyBufferToImage", reinterpret_cast(CmdCopyBufferToImage) }, + { "vkCmdCopyImageToBuffer", reinterpret_cast(CmdCopyImageToBuffer) }, + { "vkCmdUpdateBuffer", reinterpret_cast(CmdUpdateBuffer) }, + { "vkCmdFillBuffer", reinterpret_cast(CmdFillBuffer) }, + { "vkCmdClearColorImage", reinterpret_cast(CmdClearColorImage) }, + { "vkCmdResolveImage", reinterpret_cast(CmdResolveImage) }, + { "vkCmdSetEvent", reinterpret_cast(CmdSetEvent) }, + { "vkCmdResetEvent", reinterpret_cast(CmdResetEvent) }, + { "vkCmdWaitEvents", reinterpret_cast(CmdWaitEvents) }, + { "vkCmdPipelineBarrier", reinterpret_cast(CmdPipelineBarrier) }, + { "vkCmdBeginQuery", reinterpret_cast(CmdBeginQuery) }, + { "vkCmdEndQuery", reinterpret_cast(CmdEndQuery) }, + { "vkCmdResetQueryPool", reinterpret_cast(CmdResetQueryPool) }, + { "vkCmdWriteTimestamp", reinterpret_cast(CmdWriteTimestamp) }, + { "vkCmdCopyQueryPoolResults", reinterpret_cast(CmdCopyQueryPoolResults) }, + { "vkCreateFramebuffer", reinterpret_cast(CreateFramebuffer) }, + { "vkDestroyFramebuffer", reinterpret_cast(DestroyFramebuffer) }, + { "vkCreateRenderPass", reinterpret_cast(CreateRenderPass) }, + { "vkDestroyRenderPass", reinterpret_cast(DestroyRenderPass) }, + { "vkGetRenderAreaGranularity", reinterpret_cast(GetRenderAreaGranularity) }, + { "vkCreateCommandPool", reinterpret_cast(CreateCommandPool) }, + { "vkDestroyCommandPool", reinterpret_cast(DestroyCommandPool) }, + { "vkResetCommandPool", reinterpret_cast(ResetCommandPool) }, + { "vkCmdBeginRenderPass", reinterpret_cast(CmdBeginRenderPass) }, + { "vkCmdNextSubpass", reinterpret_cast(CmdNextSubpass) }, + }; + + for (size_t i = 0; i < ARRAY_SIZE(core_device_commands); i++) { + if (!strcmp(core_device_commands[i].name, name)) + return core_device_commands[i].proc; + } + + return nullptr; +} + } // namespace parameter_validation // vk_layer_logging.h expects these to be defined -- cgit v1.2.3 From 9c846dbbb790defec9483e3959ccf2202c934970 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Mon, 16 May 2016 07:41:17 +0800 Subject: parameter_validation: refactor GetInstanceProcAddr Split command intercepting out to intercept_core_instance_command. Assert that instance is valid if intercept_core_instance_command returns nullptr. --- layers/parameter_validation.cpp | 82 +++++++++++++++++++++-------------------- 1 file changed, 43 insertions(+), 39 deletions(-) diff --git a/layers/parameter_validation.cpp b/layers/parameter_validation.cpp index c3079509..a3faa2e8 100644 --- a/layers/parameter_validation.cpp +++ b/layers/parameter_validation.cpp @@ -4278,6 +4278,9 @@ VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevi ->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties); } +static PFN_vkVoidFunction +intercept_core_instance_command(const char *name); + static PFN_vkVoidFunction intercept_core_device_command(const char *name); @@ -4300,54 +4303,55 @@ VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, cons } VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) { - if (!strcmp(funcName, "vkGetInstanceProcAddr")) - return (PFN_vkVoidFunction)GetInstanceProcAddr; - if (!strcmp(funcName, "vkCreateInstance")) - return (PFN_vkVoidFunction)CreateInstance; - if (!strcmp(funcName, "vkDestroyInstance")) - return (PFN_vkVoidFunction)DestroyInstance; - if (!strcmp(funcName, "vkCreateDevice")) - return (PFN_vkVoidFunction)CreateDevice; - if (!strcmp(funcName, "vkEnumeratePhysicalDevices")) - return (PFN_vkVoidFunction)EnumeratePhysicalDevices; - if (!strcmp(funcName, "vkGetPhysicalDeviceProperties")) - return (PFN_vkVoidFunction)GetPhysicalDeviceProperties; - if (!strcmp(funcName, "vkGetPhysicalDeviceFeatures")) - return (PFN_vkVoidFunction)GetPhysicalDeviceFeatures; - if (!strcmp(funcName, "vkGetPhysicalDeviceFormatProperties")) - return (PFN_vkVoidFunction)GetPhysicalDeviceFormatProperties; - if (!strcmp(funcName, "vkGetPhysicalDeviceImageFormatProperties")) - return (PFN_vkVoidFunction)GetPhysicalDeviceImageFormatProperties; - if (!strcmp(funcName, "vkGetPhysicalDeviceSparseImageFormatProperties")) - return (PFN_vkVoidFunction)GetPhysicalDeviceSparseImageFormatProperties; - if (!strcmp(funcName, "vkGetPhysicalDeviceQueueFamilyProperties")) - return (PFN_vkVoidFunction)GetPhysicalDeviceQueueFamilyProperties; - if (!strcmp(funcName, "vkGetPhysicalDeviceMemoryProperties")) - return (PFN_vkVoidFunction)GetPhysicalDeviceMemoryProperties; - if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties")) - return (PFN_vkVoidFunction)vkEnumerateInstanceLayerProperties; - if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties")) - return (PFN_vkVoidFunction)vkEnumerateInstanceExtensionProperties; - if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties")) - return (PFN_vkVoidFunction)vkEnumerateDeviceLayerProperties; - if (!strcmp(funcName, "vkEnumerateDeviceExtensionProperties")) - return (PFN_vkVoidFunction)EnumerateDeviceExtensionProperties; - - if (instance == NULL) { - return NULL; - } + PFN_vkVoidFunction proc = intercept_core_instance_command(funcName); + if (proc) + return proc; + + assert(instance); layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map); - PFN_vkVoidFunction fptr = debug_report_get_instance_proc_addr(data->report_data, funcName); - if (fptr) - return fptr; + proc = debug_report_get_instance_proc_addr(data->report_data, funcName); + if (proc) + return proc; if (get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr == NULL) return NULL; return get_dispatch_table(pc_instance_table_map, instance)->GetInstanceProcAddr(instance, funcName); } +static PFN_vkVoidFunction +intercept_core_instance_command(const char *name) { + static const struct { + const char *name; + PFN_vkVoidFunction proc; + } core_instance_commands[] = { + { "vkGetInstanceProcAddr", reinterpret_cast(GetInstanceProcAddr) }, + { "vkCreateInstance", reinterpret_cast(CreateInstance) }, + { "vkDestroyInstance", reinterpret_cast(DestroyInstance) }, + { "vkCreateDevice", reinterpret_cast(CreateDevice) }, + { "vkEnumeratePhysicalDevices", reinterpret_cast(EnumeratePhysicalDevices) }, + { "vkGetPhysicalDeviceProperties", reinterpret_cast(GetPhysicalDeviceProperties) }, + { "vkGetPhysicalDeviceFeatures", reinterpret_cast(GetPhysicalDeviceFeatures) }, + { "vkGetPhysicalDeviceFormatProperties", reinterpret_cast(GetPhysicalDeviceFormatProperties) }, + { "vkGetPhysicalDeviceImageFormatProperties", reinterpret_cast(GetPhysicalDeviceImageFormatProperties) }, + { "vkGetPhysicalDeviceSparseImageFormatProperties", reinterpret_cast(GetPhysicalDeviceSparseImageFormatProperties) }, + { "vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast(GetPhysicalDeviceQueueFamilyProperties) }, + { "vkGetPhysicalDeviceMemoryProperties", reinterpret_cast(GetPhysicalDeviceMemoryProperties) }, + { "vkEnumerateInstanceLayerProperties", reinterpret_cast(vkEnumerateInstanceLayerProperties) }, + { "vkEnumerateInstanceExtensionProperties", reinterpret_cast(vkEnumerateInstanceExtensionProperties) }, + { "vkEnumerateDeviceLayerProperties", reinterpret_cast(vkEnumerateDeviceLayerProperties) }, + { "vkEnumerateDeviceExtensionProperties", reinterpret_cast(EnumerateDeviceExtensionProperties) }, + }; + + for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) { + if (!strcmp(core_instance_commands[i].name, name)) + return core_instance_commands[i].proc; + } + + return nullptr; +} + static PFN_vkVoidFunction intercept_core_device_command(const char *name) { static const struct { -- cgit v1.2.3 From 60261ba1b23e12b59f2523f611309ad25e1fc562 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Mon, 16 May 2016 07:43:38 +0800 Subject: parameter_validation: no interface functions in layer functions Move handling of interface functions in parameter_validation::GetInstanceProcAddr to v0's vkGetInstanceProcAddr. --- layers/parameter_validation.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/layers/parameter_validation.cpp b/layers/parameter_validation.cpp index a3faa2e8..9c6c2b00 100644 --- a/layers/parameter_validation.cpp +++ b/layers/parameter_validation.cpp @@ -4338,12 +4338,14 @@ intercept_core_instance_command(const char *name) { { "vkGetPhysicalDeviceSparseImageFormatProperties", reinterpret_cast(GetPhysicalDeviceSparseImageFormatProperties) }, { "vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast(GetPhysicalDeviceQueueFamilyProperties) }, { "vkGetPhysicalDeviceMemoryProperties", reinterpret_cast(GetPhysicalDeviceMemoryProperties) }, - { "vkEnumerateInstanceLayerProperties", reinterpret_cast(vkEnumerateInstanceLayerProperties) }, - { "vkEnumerateInstanceExtensionProperties", reinterpret_cast(vkEnumerateInstanceExtensionProperties) }, - { "vkEnumerateDeviceLayerProperties", reinterpret_cast(vkEnumerateDeviceLayerProperties) }, { "vkEnumerateDeviceExtensionProperties", reinterpret_cast(EnumerateDeviceExtensionProperties) }, }; + // we should never be queried for these commands + assert(strcmp(name, "vkEnumerateInstanceLayerProperties") && + strcmp(name, "vkEnumerateInstanceExtensionProperties") && + strcmp(name, "vkEnumerateDeviceLayerProperties")); + for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) { if (!strcmp(core_instance_commands[i].name, name)) return core_instance_commands[i].proc; @@ -4533,5 +4535,14 @@ VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkD } VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) { + if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties")) + return reinterpret_cast(vkEnumerateInstanceLayerProperties); + if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties")) + return reinterpret_cast(vkEnumerateDeviceLayerProperties); + if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties")) + return reinterpret_cast(vkEnumerateInstanceExtensionProperties); + if (!strcmp(funcName, "vkGetInstanceProcAddr")) + return reinterpret_cast(vkGetInstanceProcAddr); + return parameter_validation::GetInstanceProcAddr(instance, funcName); } -- cgit v1.2.3 From 5737c33da68b4f3ce0e0b968bcde210e0a520c5b Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Mon, 16 May 2016 07:45:43 +0800 Subject: parameter_validation: handle device commands in GetInstanceProcAddr Call intercept_core_device_command in GetInstanceProcAddr. --- layers/parameter_validation.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/layers/parameter_validation.cpp b/layers/parameter_validation.cpp index 9c6c2b00..87d1cbc3 100644 --- a/layers/parameter_validation.cpp +++ b/layers/parameter_validation.cpp @@ -4304,6 +4304,8 @@ VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, cons VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) { PFN_vkVoidFunction proc = intercept_core_instance_command(funcName); + if (!proc) + proc = intercept_core_device_command(funcName); if (proc) return proc; -- cgit v1.2.3 From 8220573dae223c788681fb2fc5169cc366a5dffa Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Mon, 16 May 2016 07:48:14 +0800 Subject: parameter_validation: avoid invalid GIPA call in vkCreateDevice Save VkInstance in layer_data so that we query vkCreateDevice with a valid instance. --- layers/parameter_validation.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/layers/parameter_validation.cpp b/layers/parameter_validation.cpp index 87d1cbc3..e0e29c6d 100644 --- a/layers/parameter_validation.cpp +++ b/layers/parameter_validation.cpp @@ -52,6 +52,8 @@ namespace parameter_validation { struct layer_data { + VkInstance instance; + debug_report_data *report_data; std::vector logging_callback; @@ -1314,6 +1316,7 @@ CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallba VkLayerInstanceDispatchTable *pTable = initInstanceTable(*pInstance, fpGetInstanceProcAddr, pc_instance_table_map); + my_instance_data->instance = *pInstance; my_instance_data->report_data = debug_report_create_instance(pTable, *pInstance, pCreateInfo->enabledExtensionCount, pCreateInfo->ppEnabledExtensionNames); @@ -1618,7 +1621,7 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice physicalDevice, PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr; PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr; - PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(NULL, "vkCreateDevice"); + PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice"); if (fpCreateDevice == NULL) { return VK_ERROR_INITIALIZATION_FAILED; } -- cgit v1.2.3 From bae2437ca75278f04ea48f416442b7aaf7d02649 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Fri, 20 May 2016 16:34:01 +1200 Subject: layers: Get rid of pre-call updates in AllocateDescriptorSets Moving all the updates later requires that we totalize the required descriptors by type first, rather than testing each binding's requirement as we go. Signed-off-by: Chris Forbes --- layers/core_validation.cpp | 47 +++++++++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 62874f35..2fa18c61 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -3410,7 +3410,8 @@ static bool validateIdleDescriptorSet(const layer_data *my_data, VkDescriptorSet // Verify that given pool has descriptors that are being requested for allocation. // NOTE : Calls to this function should be wrapped in mutex static bool validate_descriptor_availability_in_pool(layer_data *dev_data, DESCRIPTOR_POOL_NODE *pPoolNode, uint32_t count, - const VkDescriptorSetLayout *pSetLayouts) { + const VkDescriptorSetLayout *pSetLayouts, + uint32_t requiredDescriptorsByType[]) { bool skipCall = false; // Track number of descriptorSets allowable in this pool @@ -3420,10 +3421,9 @@ static bool validate_descriptor_availability_in_pool(layer_data *dev_data, DESCR "Unable to allocate %u descriptorSets from pool 0x%" PRIxLEAST64 ". This pool only has %d descriptorSets remaining.", count, reinterpret_cast(pPoolNode->pool), pPoolNode->availableSets); - } else { - pPoolNode->availableSets -= count; } + // Count total descriptors required per type for (uint32_t i = 0; i < count; ++i) { auto layout_pair = dev_data->descriptorSetLayoutMap.find(pSetLayouts[i]); if (layout_pair == dev_data->descriptorSetLayoutMap.end()) { @@ -3437,21 +3437,24 @@ static bool validate_descriptor_availability_in_pool(layer_data *dev_data, DESCR for (uint32_t j = 0; j < layout_node->GetBindingCount(); ++j) { const auto &binding_layout = layout_node->GetDescriptorSetLayoutBindingPtrFromIndex(j); uint32_t typeIndex = static_cast(binding_layout->descriptorType); - uint32_t poolSizeCount = binding_layout->descriptorCount; - if (poolSizeCount > pPoolNode->availableDescriptorTypeCount[typeIndex]) { - skipCall |= log_msg( - dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, - reinterpret_cast(pSetLayouts[i]), __LINE__, DRAWSTATE_DESCRIPTOR_POOL_EMPTY, "DS", - "Unable to allocate %u descriptors of type %s from pool 0x%" PRIxLEAST64 - ". This pool only has %d descriptors of this type remaining.", - poolSizeCount, string_VkDescriptorType(binding_layout->descriptorType), (uint64_t)pPoolNode->pool, - pPoolNode->availableDescriptorTypeCount[typeIndex]); - } else { // Decrement available descriptors of this type - pPoolNode->availableDescriptorTypeCount[typeIndex] -= poolSizeCount; - } + requiredDescriptorsByType[typeIndex] += binding_layout->descriptorCount; } } } + + // Determine whether descriptor counts are satisfiable + for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; i++) { + if (requiredDescriptorsByType[i] > pPoolNode->availableDescriptorTypeCount[i]) { + skipCall |= log_msg( + dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, + reinterpret_cast(pSetLayouts[i]), __LINE__, DRAWSTATE_DESCRIPTOR_POOL_EMPTY, "DS", + "Unable to allocate %u descriptors of type %s from pool 0x%" PRIxLEAST64 + ". This pool only has %d descriptors of this type remaining.", + requiredDescriptorsByType[i], string_VkDescriptorType(VkDescriptorType(i)), (uint64_t)pPoolNode->pool, + pPoolNode->availableDescriptorTypeCount[i]); + } + } + return skipCall; } @@ -5901,10 +5904,12 @@ VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo, VkDescriptorSet *pDescriptorSets) { bool skipCall = false; layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); + uint32_t requiredDescriptorsByType[VK_DESCRIPTOR_TYPE_RANGE_SIZE] {}; std::unique_lock lock(global_lock); // Verify that requested descriptorSets are available in pool DESCRIPTOR_POOL_NODE *pPoolNode = getPoolNode(dev_data, pAllocateInfo->descriptorPool); + if (!pPoolNode) { skipCall |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, (uint64_t)pAllocateInfo->descriptorPool, __LINE__, DRAWSTATE_INVALID_POOL, "DS", @@ -5912,16 +5917,24 @@ AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllo (uint64_t)pAllocateInfo->descriptorPool); } else { // Make sure pool has all the available descriptors before calling down chain skipCall |= validate_descriptor_availability_in_pool(dev_data, pPoolNode, pAllocateInfo->descriptorSetCount, - pAllocateInfo->pSetLayouts); + pAllocateInfo->pSetLayouts, + requiredDescriptorsByType); } lock.unlock(); if (skipCall) return VK_ERROR_VALIDATION_FAILED_EXT; VkResult result = dev_data->device_dispatch_table->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets); + if (VK_SUCCESS == result) { lock.lock(); - DESCRIPTOR_POOL_NODE *pPoolNode = getPoolNode(dev_data, pAllocateInfo->descriptorPool); if (pPoolNode) { + + /* Account for sets and descriptors allocated */ + pPoolNode->availableSets -= pAllocateInfo->descriptorSetCount; + for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; i++) { + pPoolNode->availableDescriptorTypeCount[i] -= requiredDescriptorsByType[i]; + } + if (pAllocateInfo->descriptorSetCount == 0) { log_msg(dev_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, pAllocateInfo->descriptorSetCount, __LINE__, DRAWSTATE_NONE, "DS", -- cgit v1.2.3 From f51d50b4f42cb059b997c0ce19a8fbd7f7f891ae Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Fri, 20 May 2016 17:04:07 +1200 Subject: layers: Further rework to AllocateDescriptorSets - operator new does not return null, it throws. - do lookups once, at the start Signed-off-by: Chris Forbes --- layers/core_validation.cpp | 74 +++++++++++++++++++++------------------------- 1 file changed, 34 insertions(+), 40 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 2fa18c61..c1cb672e 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -1989,6 +1989,14 @@ static FRAMEBUFFER_NODE *getFramebuffer(layer_data *my_data, VkFramebuffer frame return &it->second; } +static cvdescriptorset::DescriptorSetLayout const *getDescriptorSetLayout(layer_data const *my_data, VkDescriptorSetLayout dsLayout) { + auto it = my_data->descriptorSetLayoutMap.find(dsLayout); + if (it == my_data->descriptorSetLayoutMap.end()) { + return nullptr; + } + return it->second; +} + // Return true if for a given PSO, the given state enum is dynamic, else return false static bool isDynamic(const PIPELINE_NODE *pPipeline, const VkDynamicState state) { if (pPipeline && pPipeline->graphicsPipelineCI.pDynamicState) { @@ -3410,7 +3418,7 @@ static bool validateIdleDescriptorSet(const layer_data *my_data, VkDescriptorSet // Verify that given pool has descriptors that are being requested for allocation. // NOTE : Calls to this function should be wrapped in mutex static bool validate_descriptor_availability_in_pool(layer_data *dev_data, DESCRIPTOR_POOL_NODE *pPoolNode, uint32_t count, - const VkDescriptorSetLayout *pSetLayouts, + std::vector const & layout_nodes, uint32_t requiredDescriptorsByType[]) { bool skipCall = false; @@ -3424,16 +3432,8 @@ static bool validate_descriptor_availability_in_pool(layer_data *dev_data, DESCR } // Count total descriptors required per type - for (uint32_t i = 0; i < count; ++i) { - auto layout_pair = dev_data->descriptorSetLayoutMap.find(pSetLayouts[i]); - if (layout_pair == dev_data->descriptorSetLayoutMap.end()) { - skipCall |= - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, - (uint64_t)pSetLayouts[i], __LINE__, DRAWSTATE_INVALID_LAYOUT, "DS", - "Unable to find set layout node for layout 0x%" PRIxLEAST64 " specified in vkAllocateDescriptorSets() call", - (uint64_t)pSetLayouts[i]); - } else { - auto &layout_node = layout_pair->second; + for (auto layout_node : layout_nodes) { + if (layout_node) { for (uint32_t j = 0; j < layout_node->GetBindingCount(); ++j) { const auto &binding_layout = layout_node->GetDescriptorSetLayoutBindingPtrFromIndex(j); uint32_t typeIndex = static_cast(binding_layout->descriptorType); @@ -3446,8 +3446,8 @@ static bool validate_descriptor_availability_in_pool(layer_data *dev_data, DESCR for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; i++) { if (requiredDescriptorsByType[i] > pPoolNode->availableDescriptorTypeCount[i]) { skipCall |= log_msg( - dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, - reinterpret_cast(pSetLayouts[i]), __LINE__, DRAWSTATE_DESCRIPTOR_POOL_EMPTY, "DS", + dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, + reinterpret_cast(pPoolNode->pool), __LINE__, DRAWSTATE_DESCRIPTOR_POOL_EMPTY, "DS", "Unable to allocate %u descriptors of type %s from pool 0x%" PRIxLEAST64 ". This pool only has %d descriptors of this type remaining.", requiredDescriptorsByType[i], string_VkDescriptorType(VkDescriptorType(i)), (uint64_t)pPoolNode->pool, @@ -5904,9 +5904,22 @@ VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo, VkDescriptorSet *pDescriptorSets) { bool skipCall = false; layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); + uint32_t requiredDescriptorsByType[VK_DESCRIPTOR_TYPE_RANGE_SIZE] {}; + std::vector layout_nodes(pAllocateInfo->descriptorSetCount, nullptr); std::unique_lock lock(global_lock); + + for (uint32_t i = 0; i < pAllocateInfo->descriptorSetCount; i++) { + layout_nodes[i] = getDescriptorSetLayout(dev_data, pAllocateInfo->pSetLayouts[i]); + if (!layout_nodes[i]) { + skipCall |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, + (uint64_t)pAllocateInfo->pSetLayouts[i], __LINE__, DRAWSTATE_INVALID_LAYOUT, "DS", + "Unable to find set layout node for layout 0x%" PRIxLEAST64 " specified in vkAllocateDescriptorSets() call", + (uint64_t)pAllocateInfo->pSetLayouts[i]); + } + } + // Verify that requested descriptorSets are available in pool DESCRIPTOR_POOL_NODE *pPoolNode = getPoolNode(dev_data, pAllocateInfo->descriptorPool); @@ -5917,8 +5930,7 @@ AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllo (uint64_t)pAllocateInfo->descriptorPool); } else { // Make sure pool has all the available descriptors before calling down chain skipCall |= validate_descriptor_availability_in_pool(dev_data, pPoolNode, pAllocateInfo->descriptorSetCount, - pAllocateInfo->pSetLayouts, - requiredDescriptorsByType); + layout_nodes, requiredDescriptorsByType); } lock.unlock(); if (skipCall) @@ -5928,7 +5940,6 @@ AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllo if (VK_SUCCESS == result) { lock.lock(); if (pPoolNode) { - /* Account for sets and descriptors allocated */ pPoolNode->availableSets -= pAllocateInfo->descriptorSetCount; for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; i++) { @@ -5940,35 +5951,18 @@ AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllo pAllocateInfo->descriptorSetCount, __LINE__, DRAWSTATE_NONE, "DS", "AllocateDescriptorSets called with 0 count"); } + for (uint32_t i = 0; i < pAllocateInfo->descriptorSetCount; i++) { log_msg(dev_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, (uint64_t)pDescriptorSets[i], __LINE__, DRAWSTATE_NONE, "DS", "Created Descriptor Set 0x%" PRIxLEAST64, (uint64_t)pDescriptorSets[i]); - auto layout_pair = dev_data->descriptorSetLayoutMap.find(pAllocateInfo->pSetLayouts[i]); - if (layout_pair == dev_data->descriptorSetLayoutMap.end()) { - if (log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, (uint64_t)pAllocateInfo->pSetLayouts[i], - __LINE__, DRAWSTATE_INVALID_LAYOUT, "DS", "Unable to find set layout node for layout 0x%" PRIxLEAST64 - " specified in vkAllocateDescriptorSets() call", - (uint64_t)pAllocateInfo->pSetLayouts[i])) { - lock.unlock(); - return VK_ERROR_VALIDATION_FAILED_EXT; - } - } // Create new DescriptorSet instance and add to the pool's unordered_set of DescriptorSets - cvdescriptorset::DescriptorSet *pNewNode = new cvdescriptorset::DescriptorSet( - pDescriptorSets[i], layout_pair->second, &dev_data->bufferMap, &dev_data->memObjMap, &dev_data->bufferViewMap, - &dev_data->samplerMap, &dev_data->imageViewMap, &dev_data->imageMap, - &dev_data->device_extensions.imageToSwapchainMap, &dev_data->device_extensions.swapchainMap); - if (NULL == pNewNode) { - if (log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, (uint64_t)pDescriptorSets[i], __LINE__, - DRAWSTATE_OUT_OF_MEMORY, "DS", "Out of memory while attempting to allocate " - "cvdescriptorset::DescriptorSet in vkAllocateDescriptorSets()")) { - lock.unlock(); - return VK_ERROR_VALIDATION_FAILED_EXT; - } - } else { + if (layout_nodes[i]) { + auto pNewNode = new cvdescriptorset::DescriptorSet( + pDescriptorSets[i], layout_nodes[i], &dev_data->bufferMap, &dev_data->memObjMap, &dev_data->bufferViewMap, + &dev_data->samplerMap, &dev_data->imageViewMap, &dev_data->imageMap, + &dev_data->device_extensions.imageToSwapchainMap, &dev_data->device_extensions.swapchainMap); + // Insert set into this pool pPoolNode->sets.insert(pNewNode); pNewNode->in_use.store(0); -- cgit v1.2.3 From 73d109fd9c22c19901a9838c33d8e7fdbe736d50 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Fri, 20 May 2016 17:12:39 +1200 Subject: layers: Remove more AllocateDescriptorSets noise Can argue about whether this stuff at INFO level is worthwhile... Replace the comments with a clearer set of comments. Signed-off-by: Chris Forbes --- layers/core_validation.cpp | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index c1cb672e..1bf27e2d 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -5920,7 +5920,6 @@ AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllo } } - // Verify that requested descriptorSets are available in pool DESCRIPTOR_POOL_NODE *pPoolNode = getPoolNode(dev_data, pAllocateInfo->descriptorPool); if (!pPoolNode) { @@ -5933,8 +5932,10 @@ AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllo layout_nodes, requiredDescriptorsByType); } lock.unlock(); + if (skipCall) return VK_ERROR_VALIDATION_FAILED_EXT; + VkResult result = dev_data->device_dispatch_table->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets); if (VK_SUCCESS == result) { @@ -5946,24 +5947,16 @@ AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllo pPoolNode->availableDescriptorTypeCount[i] -= requiredDescriptorsByType[i]; } - if (pAllocateInfo->descriptorSetCount == 0) { - log_msg(dev_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, - pAllocateInfo->descriptorSetCount, __LINE__, DRAWSTATE_NONE, "DS", - "AllocateDescriptorSets called with 0 count"); - } - + /* Create tracking object for each descriptor set; insert into + * global map and the pool's set. + */ for (uint32_t i = 0; i < pAllocateInfo->descriptorSetCount; i++) { - log_msg(dev_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, - (uint64_t)pDescriptorSets[i], __LINE__, DRAWSTATE_NONE, "DS", "Created Descriptor Set 0x%" PRIxLEAST64, - (uint64_t)pDescriptorSets[i]); - // Create new DescriptorSet instance and add to the pool's unordered_set of DescriptorSets if (layout_nodes[i]) { auto pNewNode = new cvdescriptorset::DescriptorSet( pDescriptorSets[i], layout_nodes[i], &dev_data->bufferMap, &dev_data->memObjMap, &dev_data->bufferViewMap, &dev_data->samplerMap, &dev_data->imageViewMap, &dev_data->imageMap, &dev_data->device_extensions.imageToSwapchainMap, &dev_data->device_extensions.swapchainMap); - // Insert set into this pool pPoolNode->sets.insert(pNewNode); pNewNode->in_use.store(0); dev_data->setMap[pDescriptorSets[i]] = pNewNode; -- cgit v1.2.3 From 34c2c1b598abfb812cc2ca56f99bbaf93c5e6757 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Fri, 20 May 2016 17:14:32 +1200 Subject: layers: Use getDescriptorSetLayout helper in more places Signed-off-by: Chris Forbes --- layers/core_validation.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 1bf27e2d..b182ea02 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -5846,13 +5846,7 @@ VKAPI_ATTR VkResult VKAPI_CALL CreatePipelineLayout(VkDevice device, const VkPip plNode.setLayouts.resize(pCreateInfo->setLayoutCount); for (i = 0; i < pCreateInfo->setLayoutCount; ++i) { plNode.descriptorSetLayouts[i] = pCreateInfo->pSetLayouts[i]; - auto set_layout_it = dev_data->descriptorSetLayoutMap.find(pCreateInfo->pSetLayouts[i]); - if (set_layout_it != dev_data->descriptorSetLayoutMap.end()) { - plNode.setLayouts[i] = set_layout_it->second; - } - else { - plNode.setLayouts[i] = nullptr; - } + plNode.setLayouts[i] = getDescriptorSetLayout(dev_data, pCreateInfo->pSetLayouts[i]); } plNode.pushConstantRanges.resize(pCreateInfo->pushConstantRangeCount); for (i = 0; i < pCreateInfo->pushConstantRangeCount; ++i) { -- cgit v1.2.3 From 2edec5a133b3b0e75110c4ce357a33e5806c88ea Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Fri, 20 May 2016 17:38:44 +1200 Subject: layers: Use pipeline layout -> ds layout direct map Signed-off-by: Chris Forbes --- layers/core_validation.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index b182ea02..bc6d9f71 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -2181,7 +2181,7 @@ static bool verify_set_layout_compatibility(layer_data *my_data, const cvdescrip errorMsg = errorStr.str(); return false; } - auto layout_node = my_data->descriptorSetLayoutMap[pipeline_layout_it->second.descriptorSetLayouts[layoutIndex]]; + auto layout_node = pipeline_layout_it->second.setLayouts[layoutIndex]; return pSet->IsCompatible(layout_node, &errorMsg); } -- cgit v1.2.3 From 1679dfd7d4f2329474a375f2bb1e5f5e5ec6f9c9 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Fri, 20 May 2016 18:27:28 +1200 Subject: layers: Add getPipelineLayout helper, use it Signed-off-by: Chris Forbes --- layers/core_validation.cpp | 40 ++++++++++++++++++++-------------------- layers/core_validation.h | 2 +- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index bc6d9f71..eaed5b64 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -1925,7 +1925,7 @@ static bool validate_push_constant_usage(debug_report_data *report_data, // For given pipelineLayout verify that the set_layout_node at slot.first // has the requested binding at slot.second and return ptr to that binding -static VkDescriptorSetLayoutBinding const * get_descriptor_binding(PIPELINE_LAYOUT_NODE *pipelineLayout, descriptor_slot_t slot) { +static VkDescriptorSetLayoutBinding const * get_descriptor_binding(PIPELINE_LAYOUT_NODE const *pipelineLayout, descriptor_slot_t slot) { if (!pipelineLayout) return nullptr; @@ -1997,6 +1997,14 @@ static cvdescriptorset::DescriptorSetLayout const *getDescriptorSetLayout(layer_ return it->second; } +static PIPELINE_LAYOUT_NODE const *getPipelineLayout(layer_data const *my_data, VkPipelineLayout pipeLayout) { + auto it = my_data->pipelineLayoutMap.find(pipeLayout); + if (it == my_data->pipelineLayoutMap.end()) { + return nullptr; + } + return &it->second; +} + // Return true if for a given PSO, the given state enum is dynamic, else return false static bool isDynamic(const PIPELINE_NODE *pPipeline, const VkDynamicState state) { if (pPipeline && pPipeline->graphicsPipelineCI.pDynamicState) { @@ -2166,22 +2174,22 @@ static bool verify_renderpass_compatibility(layer_data *my_data, const VkRenderP // pipelineLayout[layoutIndex] static bool verify_set_layout_compatibility(layer_data *my_data, const cvdescriptorset::DescriptorSet *pSet, const VkPipelineLayout layout, const uint32_t layoutIndex, string &errorMsg) { - auto pipeline_layout_it = my_data->pipelineLayoutMap.find(layout); - if (pipeline_layout_it == my_data->pipelineLayoutMap.end()) { + auto pipeline_layout = getPipelineLayout(my_data, layout); + if (!pipeline_layout) { stringstream errorStr; errorStr << "invalid VkPipelineLayout (" << layout << ")"; errorMsg = errorStr.str(); return false; } - if (layoutIndex >= pipeline_layout_it->second.descriptorSetLayouts.size()) { + if (layoutIndex >= pipeline_layout->descriptorSetLayouts.size()) { stringstream errorStr; - errorStr << "VkPipelineLayout (" << layout << ") only contains " << pipeline_layout_it->second.descriptorSetLayouts.size() - << " setLayouts corresponding to sets 0-" << pipeline_layout_it->second.descriptorSetLayouts.size() - 1 + errorStr << "VkPipelineLayout (" << layout << ") only contains " << pipeline_layout->descriptorSetLayouts.size() + << " setLayouts corresponding to sets 0-" << pipeline_layout->descriptorSetLayouts.size() - 1 << ", but you're attempting to bind set to index " << layoutIndex; errorMsg = errorStr.str(); return false; } - auto layout_node = pipeline_layout_it->second.setLayouts[layoutIndex]; + auto layout_node = pipeline_layout->setLayouts[layoutIndex]; return pSet->IsCompatible(layout_node, &errorMsg); } @@ -5631,11 +5639,7 @@ CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t pPipeNode[i] = new PIPELINE_NODE; pPipeNode[i]->initGraphicsPipeline(&pCreateInfos[i]); pPipeNode[i]->renderPass = getRenderPass(dev_data, pCreateInfos[i].renderPass); - - auto pipeline_layout_it = dev_data->pipelineLayoutMap.find(pCreateInfos[i].layout); - if (pipeline_layout_it != dev_data->pipelineLayoutMap.end()) { - pPipeNode[i]->pipelineLayout = &pipeline_layout_it->second; - } + pPipeNode[i]->pipelineLayout = getPipelineLayout(dev_data, pCreateInfos[i].layout); skipCall |= verifyPipelineCreateState(dev_data, device, pPipeNode, i); } @@ -5679,11 +5683,7 @@ CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t // Create and initialize internal tracking data structure pPipeNode[i] = new PIPELINE_NODE; pPipeNode[i]->initComputePipeline(&pCreateInfos[i]); - - auto pipeline_layout_it = dev_data->pipelineLayoutMap.find(pCreateInfos[i].layout); - if (pipeline_layout_it != dev_data->pipelineLayoutMap.end()) { - pPipeNode[i]->pipelineLayout = &pipeline_layout_it->second; - } + pPipeNode[i]->pipelineLayout = getPipelineLayout(dev_data, pCreateInfos[i].layout); // memcpy(&pPipeNode[i]->computePipelineCI, (const void *)&pCreateInfos[i], sizeof(VkComputePipelineCreateInfo)); // TODO: Add Compute Pipeline Verification @@ -7994,8 +7994,8 @@ VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPip } // Check if push constant update is within any of the ranges with the same stage flags specified in pipeline layout. - auto pipeline_layout_it = dev_data->pipelineLayoutMap.find(layout); - if (pipeline_layout_it == dev_data->pipelineLayoutMap.end()) { + auto pipeline_layout = getPipelineLayout(dev_data, layout); + if (!pipeline_layout) { skipCall |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, DRAWSTATE_PUSH_CONSTANTS_ERROR, "DS", "vkCmdPushConstants() Pipeline Layout 0x%" PRIx64 " not found.", (uint64_t)layout); @@ -8003,7 +8003,7 @@ VKAPI_ATTR void VKAPI_CALL CmdPushConstants(VkCommandBuffer commandBuffer, VkPip // Coalesce adjacent/overlapping pipeline ranges before checking to see if incoming range is // contained in the pipeline ranges. // Build a {start, end} span list for ranges with matching stage flags. - const auto &ranges = pipeline_layout_it->second.pushConstantRanges; + const auto &ranges = pipeline_layout->pushConstantRanges; struct span { uint32_t start; uint32_t end; diff --git a/layers/core_validation.h b/layers/core_validation.h index 1d312e12..b4927b7b 100644 --- a/layers/core_validation.h +++ b/layers/core_validation.h @@ -148,7 +148,7 @@ class PIPELINE_NODE { std::vector attachments; bool blendConstantsEnabled; // Blend constants enabled for any attachments RENDER_PASS_NODE *renderPass; - PIPELINE_LAYOUT_NODE *pipelineLayout; + PIPELINE_LAYOUT_NODE const *pipelineLayout; // Default constructor PIPELINE_NODE() -- cgit v1.2.3 From d2970375fcce017d2284c00e4e88151e73196800 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Mon, 23 May 2016 11:29:51 +1200 Subject: layers: Move and rename validate_descriptor_availability_in_pool Signed-off-by: Chris Forbes --- layers/core_validation.cpp | 90 +++++++++++++++++++++++----------------------- 1 file changed, 46 insertions(+), 44 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index eaed5b64..b7368f56 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -3423,48 +3423,6 @@ static bool validateIdleDescriptorSet(const layer_data *my_data, VkDescriptorSet } return skip_call; } -// Verify that given pool has descriptors that are being requested for allocation. -// NOTE : Calls to this function should be wrapped in mutex -static bool validate_descriptor_availability_in_pool(layer_data *dev_data, DESCRIPTOR_POOL_NODE *pPoolNode, uint32_t count, - std::vector const & layout_nodes, - uint32_t requiredDescriptorsByType[]) { - bool skipCall = false; - - // Track number of descriptorSets allowable in this pool - if (pPoolNode->availableSets < count) { - skipCall |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, - reinterpret_cast(pPoolNode->pool), __LINE__, DRAWSTATE_DESCRIPTOR_POOL_EMPTY, "DS", - "Unable to allocate %u descriptorSets from pool 0x%" PRIxLEAST64 - ". This pool only has %d descriptorSets remaining.", - count, reinterpret_cast(pPoolNode->pool), pPoolNode->availableSets); - } - - // Count total descriptors required per type - for (auto layout_node : layout_nodes) { - if (layout_node) { - for (uint32_t j = 0; j < layout_node->GetBindingCount(); ++j) { - const auto &binding_layout = layout_node->GetDescriptorSetLayoutBindingPtrFromIndex(j); - uint32_t typeIndex = static_cast(binding_layout->descriptorType); - requiredDescriptorsByType[typeIndex] += binding_layout->descriptorCount; - } - } - } - - // Determine whether descriptor counts are satisfiable - for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; i++) { - if (requiredDescriptorsByType[i] > pPoolNode->availableDescriptorTypeCount[i]) { - skipCall |= log_msg( - dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, - reinterpret_cast(pPoolNode->pool), __LINE__, DRAWSTATE_DESCRIPTOR_POOL_EMPTY, "DS", - "Unable to allocate %u descriptors of type %s from pool 0x%" PRIxLEAST64 - ". This pool only has %d descriptors of this type remaining.", - requiredDescriptorsByType[i], string_VkDescriptorType(VkDescriptorType(i)), (uint64_t)pPoolNode->pool, - pPoolNode->availableDescriptorTypeCount[i]); - } - } - - return skipCall; -} // Free the descriptor set, remove it from setMap and invalidate any cmd buffers that it was bound to static void freeDescriptorSet(layer_data *dev_data, cvdescriptorset::DescriptorSet *descriptor_set) { @@ -5894,6 +5852,50 @@ ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescript return result; } +// Ensure the pool contains enough descriptors and descriptor sets to satisfy +// an allocation request. Fills requiredDescriptorsByType with the total number +// of descriptors of each type required, for later update. +static bool PreCallValidateAllocateDescriptorSets(layer_data *dev_data, DESCRIPTOR_POOL_NODE *pPoolNode, uint32_t count, + std::vector const & layout_nodes, + uint32_t requiredDescriptorsByType[]) { + bool skipCall = false; + + // Track number of descriptorSets allowable in this pool + if (pPoolNode->availableSets < count) { + skipCall |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, + reinterpret_cast(pPoolNode->pool), __LINE__, DRAWSTATE_DESCRIPTOR_POOL_EMPTY, "DS", + "Unable to allocate %u descriptorSets from pool 0x%" PRIxLEAST64 + ". This pool only has %d descriptorSets remaining.", + count, reinterpret_cast(pPoolNode->pool), pPoolNode->availableSets); + } + + // Count total descriptors required per type + for (auto layout_node : layout_nodes) { + if (layout_node) { + for (uint32_t j = 0; j < layout_node->GetBindingCount(); ++j) { + const auto &binding_layout = layout_node->GetDescriptorSetLayoutBindingPtrFromIndex(j); + uint32_t typeIndex = static_cast(binding_layout->descriptorType); + requiredDescriptorsByType[typeIndex] += binding_layout->descriptorCount; + } + } + } + + // Determine whether descriptor counts are satisfiable + for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; i++) { + if (requiredDescriptorsByType[i] > pPoolNode->availableDescriptorTypeCount[i]) { + skipCall |= log_msg( + dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, + reinterpret_cast(pPoolNode->pool), __LINE__, DRAWSTATE_DESCRIPTOR_POOL_EMPTY, "DS", + "Unable to allocate %u descriptors of type %s from pool 0x%" PRIxLEAST64 + ". This pool only has %d descriptors of this type remaining.", + requiredDescriptorsByType[i], string_VkDescriptorType(VkDescriptorType(i)), (uint64_t)pPoolNode->pool, + pPoolNode->availableDescriptorTypeCount[i]); + } + } + + return skipCall; +} + VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo, VkDescriptorSet *pDescriptorSets) { bool skipCall = false; @@ -5922,8 +5924,8 @@ AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllo "Unable to find pool node for pool 0x%" PRIxLEAST64 " specified in vkAllocateDescriptorSets() call", (uint64_t)pAllocateInfo->descriptorPool); } else { // Make sure pool has all the available descriptors before calling down chain - skipCall |= validate_descriptor_availability_in_pool(dev_data, pPoolNode, pAllocateInfo->descriptorSetCount, - layout_nodes, requiredDescriptorsByType); + skipCall |= PreCallValidateAllocateDescriptorSets(dev_data, pPoolNode, pAllocateInfo->descriptorSetCount, + layout_nodes, requiredDescriptorsByType); } lock.unlock(); -- cgit v1.2.3 From 77bfc0df13075008e4a6657a8e61a7727778ee4a Mon Sep 17 00:00:00 2001 From: Michael Lentine Date: Fri, 20 May 2016 10:14:00 -0500 Subject: layers: Fix event tracking to differentiate reading and writing --- layers/core_validation.cpp | 43 ++++++++++++++++++++++++++++++++---------- layers/core_validation.h | 1 + layers/core_validation_types.h | 5 +++-- 3 files changed, 37 insertions(+), 12 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index b7368f56..c7d9bc4d 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -65,7 +65,11 @@ #include #define LOGCONSOLE(...) ((void)__android_log_print(ANDROID_LOG_INFO, "DS", __VA_ARGS__)) #else -#define LOGCONSOLE(...) printf(__VA_ARGS__) +#define LOGCONSOLE(...) \ + { \ + printf(__VA_ARGS__); \ + printf("\n"); \ + } #endif using namespace std; @@ -4102,6 +4106,10 @@ static bool validateAndIncrementResources(layer_data *my_data, GLOBAL_CB_NODE *p eventNode->second.in_use.fetch_add(1); } } + for (auto event : pCB->writeEventsBeforeWait) { + auto eventNode = my_data->eventMap.find(event); + eventNode->second.write_in_use++; + } return skip_call; } @@ -4162,6 +4170,12 @@ static void decrementResources(layer_data *my_data, VkCommandBuffer cmdBuffer) { eventNode->second.in_use.fetch_sub(1); } } + for (auto event : pCB->writeEventsBeforeWait) { + auto eventNode = my_data->eventMap.find(event); + if (eventNode != my_data->eventMap.end()) { + eventNode->second.write_in_use--; + } + } for (auto queryStatePair : pCB->queryToStateMap) { my_data->queryToStateMap[queryStatePair.first] = queryStatePair.second; } @@ -7405,6 +7419,9 @@ CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags s skipCall |= addCmd(dev_data, pCB, CMD_SETEVENT, "vkCmdSetEvent()"); skipCall |= insideRenderPass(dev_data, pCB, "vkCmdSetEvent"); pCB->events.push_back(event); + if (!pCB->waitedEvents.count(event)) { + pCB->writeEventsBeforeWait.push_back(event); + } std::function eventUpdate = std::bind(setEventStageMask, std::placeholders::_1, commandBuffer, event, stageMask); pCB->eventUpdates.push_back(eventUpdate); @@ -7424,6 +7441,9 @@ CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags skipCall |= addCmd(dev_data, pCB, CMD_RESETEVENT, "vkCmdResetEvent()"); skipCall |= insideRenderPass(dev_data, pCB, "vkCmdResetEvent"); pCB->events.push_back(event); + if (!pCB->waitedEvents.count(event)) { + pCB->writeEventsBeforeWait.push_back(event); + } std::function eventUpdate = std::bind(setEventStageMask, std::placeholders::_1, commandBuffer, event, VkPipelineStageFlags(0)); pCB->eventUpdates.push_back(eventUpdate); @@ -7789,13 +7809,16 @@ bool validateEventStageMask(VkQueue queue, GLOBAL_CB_NODE *pCB, uint32_t eventCo } } } - if (sourceStageMask != stageMask) { - skip_call |= - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, - DRAWSTATE_INVALID_EVENT, "DS", - "Submitting cmdbuffer with call to VkCmdWaitEvents using srcStageMask 0x%x which must be the bitwise OR of the " - "stageMask parameters used in calls to vkCmdSetEvent and VK_PIPELINE_STAGE_HOST_BIT if used with vkSetEvent.", - sourceStageMask); + // TODO: Need to validate that host_bit is only set if set event is called + // but set event can be called at any time. + if (sourceStageMask != stageMask && sourceStageMask != (stageMask | VK_PIPELINE_STAGE_HOST_BIT)) { + skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, + DRAWSTATE_INVALID_EVENT, "DS", "Submitting cmdbuffer with call to VkCmdWaitEvents " + "using srcStageMask 0x%x which must be the bitwise " + "OR of the stageMask parameters used in calls to " + "vkCmdSetEvent and VK_PIPELINE_STAGE_HOST_BIT if " + "used with vkSetEvent but instead is 0x%x.", + sourceStageMask, stageMask); } return skip_call; } @@ -7812,7 +7835,7 @@ CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent if (pCB) { auto firstEventIndex = pCB->events.size(); for (uint32_t i = 0; i < eventCount; ++i) { - pCB->waitedEvents.push_back(pEvents[i]); + pCB->waitedEvents.insert(pEvents[i]); pCB->events.push_back(pEvents[i]); } std::function eventUpdate = @@ -9479,7 +9502,7 @@ VKAPI_ATTR VkResult VKAPI_CALL SetEvent(VkDevice device, VkEvent event) { if (event_node != dev_data->eventMap.end()) { event_node->second.needsSignaled = false; event_node->second.stageMask = VK_PIPELINE_STAGE_HOST_BIT; - if (event_node->second.in_use.load()) { + if (event_node->second.write_in_use) { skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, reinterpret_cast(event), __LINE__, DRAWSTATE_QUEUE_FORWARD_PROGRESS, "DS", "Cannot call vkSetEvent() on event 0x%" PRIxLEAST64 " that is already in use by a command buffer.", diff --git a/layers/core_validation.h b/layers/core_validation.h index b4927b7b..e44bbf89 100644 --- a/layers/core_validation.h +++ b/layers/core_validation.h @@ -234,6 +234,7 @@ class SEMAPHORE_NODE : public BASE_NODE { class EVENT_NODE : public BASE_NODE { public: using BASE_NODE::in_use; + int write_in_use; bool needsSignaled; VkPipelineStageFlags stageMask; }; diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index 5d9f0715..683eefc5 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -415,10 +415,11 @@ struct GLOBAL_CB_NODE : public BASE_NODE { std::unordered_set destroyedSets; std::unordered_set updatedSets; std::unordered_set destroyedFramebuffers; - std::vector waitedEvents; + std::unordered_set waitedEvents; + std::vector writeEventsBeforeWait; std::vector semaphores; std::vector events; - std::unordered_map> waitedEventsBeforeQueryReset; + std::unordered_map> waitedEventsBeforeQueryReset; std::unordered_map queryToStateMap; // 0 is unavailable, 1 is available std::unordered_set activeQueries; std::unordered_set startedQueries; -- cgit v1.2.3 From d76bc8d4251b296a865d83d894e06afe4f3ef44f Mon Sep 17 00:00:00 2001 From: Michael Lentine Date: Fri, 20 May 2016 17:45:02 -0500 Subject: layers: Fix query tracking across multiple command buffers on the same queue --- layers/core_validation.cpp | 75 +++++++++++++++++++++++++++++++++++------- layers/core_validation.h | 1 + layers/core_validation_types.h | 1 + 3 files changed, 65 insertions(+), 12 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index c7d9bc4d..e8c4cc38 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -3675,6 +3675,7 @@ static void resetCB(layer_data *dev_data, const VkCommandBuffer cb) { pCB->updateBuffers.clear(); clear_cmd_buf_and_mem_references(dev_data, pCB); pCB->eventUpdates.clear(); + pCB->queryUpdates.clear(); // Remove this cmdBuffer's reference from each FrameBuffer's CB ref list for (auto framebuffer : pCB->framebuffers) { @@ -4275,6 +4276,9 @@ static void updateTrackedCommandBuffers(layer_data *dev_data, VkQueue queue, VkQ for (auto eventStagePair : other_queue_data->second.eventToStageMap) { queue_data->second.eventToStageMap[eventStagePair.first] = eventStagePair.second; } + for (auto queryStatePair : other_queue_data->second.queryToStateMap) { + queue_data->second.queryToStateMap[queryStatePair.first] = queryStatePair.second; + } } // This is the core function for tracking command buffers. There are two primary ways command @@ -4555,6 +4559,9 @@ QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, V for (auto &function : pCBNode->eventUpdates) { skipCall |= function(queue); } + for (auto &function : pCBNode->queryUpdates) { + skipCall |= function(queue); + } } } } @@ -7881,6 +7888,19 @@ CmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageM pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers); } +bool setQueryState(VkQueue queue, VkCommandBuffer commandBuffer, QueryObject object, bool value) { + layer_data *dev_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); + GLOBAL_CB_NODE *pCB = getCBNode(dev_data, commandBuffer); + if (pCB) { + pCB->queryToStateMap[object] = value; + } + auto queue_data = dev_data->queueMap.find(queue); + if (queue_data != dev_data->queueMap.end()) { + queue_data->second.queryToStateMap[object] = value; + } + return false; +} + VKAPI_ATTR void VKAPI_CALL CmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot, VkFlags flags) { bool skipCall = false; @@ -7915,7 +7935,8 @@ VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPoo } else { pCB->activeQueries.erase(query); } - pCB->queryToStateMap[query] = 1; + std::function queryUpdate = std::bind(setQueryState, std::placeholders::_1, commandBuffer, query, 1); + pCB->queryUpdates.push_back(queryUpdate); if (pCB->state == CB_RECORDING) { skipCall |= addCmd(dev_data, pCB, CMD_ENDQUERY, "VkCmdEndQuery()"); } else { @@ -7937,7 +7958,8 @@ CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t for (uint32_t i = 0; i < queryCount; i++) { QueryObject query = {queryPool, firstQuery + i}; pCB->waitedEventsBeforeQueryReset[query] = pCB->waitedEvents; - pCB->queryToStateMap[query] = 0; + std::function queryUpdate = std::bind(setQueryState, std::placeholders::_1, commandBuffer, query, 0); + pCB->queryUpdates.push_back(queryUpdate); } if (pCB->state == CB_RECORDING) { skipCall |= addCmd(dev_data, pCB, CMD_RESETQUERYPOOL, "VkCmdResetQueryPool()"); @@ -7951,6 +7973,40 @@ CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t dev_data->device_dispatch_table->CmdResetQueryPool(commandBuffer, queryPool, firstQuery, queryCount); } +bool validateQuery(VkQueue queue, GLOBAL_CB_NODE *pCB, VkQueryPool queryPool, uint32_t queryCount, uint32_t firstQuery) { + bool skip_call = false; + layer_data *dev_data = get_my_data_ptr(get_dispatch_key(pCB->commandBuffer), layer_data_map); + auto queue_data = dev_data->queueMap.find(queue); + if (queue_data == dev_data->queueMap.end()) + return false; + for (uint32_t i = 0; i < queryCount; i++) { + QueryObject query = {queryPool, firstQuery + i}; + auto query_data = queue_data->second.queryToStateMap.find(query); + bool fail = false; + if (query_data != queue_data->second.queryToStateMap.end()) { + if (!query_data->second) { + fail = true; + } + } else { + auto global_query_data = dev_data->queryToStateMap.find(query); + if (global_query_data != dev_data->queryToStateMap.end()) { + if (!global_query_data->second) { + fail = true; + } + } else { + fail = true; + } + } + if (fail) { + skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, + DRAWSTATE_INVALID_QUERY, "DS", + "Requesting a copy from query to buffer with invalid query: queryPool 0x%" PRIx64 ", index %d", + reinterpret_cast(queryPool), firstQuery + i); + } + } + return skip_call; +} + VKAPI_ATTR void VKAPI_CALL CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags) { @@ -7976,15 +8032,9 @@ CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, ui "vkCmdCopyQueryPoolResults()", "VK_BUFFER_USAGE_TRANSFER_DST_BIT"); #endif if (pCB) { - for (uint32_t i = 0; i < queryCount; i++) { - QueryObject query = {queryPool, firstQuery + i}; - if (!pCB->queryToStateMap[query]) { - skipCall |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, - __LINE__, DRAWSTATE_INVALID_QUERY, "DS", - "Requesting a copy from query to buffer with invalid query: queryPool 0x%" PRIx64 ", index %d", - (uint64_t)(queryPool), firstQuery + i); - } - } + std::function queryUpdate = + std::bind(validateQuery, std::placeholders::_1, pCB, queryPool, queryCount, firstQuery); + pCB->queryUpdates.push_back(queryUpdate); if (pCB->state == CB_RECORDING) { skipCall |= addCmd(dev_data, pCB, CMD_COPYQUERYPOOLRESULTS, "vkCmdCopyQueryPoolResults()"); } else { @@ -8103,7 +8153,8 @@ CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelin GLOBAL_CB_NODE *pCB = getCBNode(dev_data, commandBuffer); if (pCB) { QueryObject query = {queryPool, slot}; - pCB->queryToStateMap[query] = 1; + std::function queryUpdate = std::bind(setQueryState, std::placeholders::_1, commandBuffer, query, 1); + pCB->queryUpdates.push_back(queryUpdate); if (pCB->state == CB_RECORDING) { skipCall |= addCmd(dev_data, pCB, CMD_WRITETIMESTAMP, "vkCmdWriteTimestamp()"); } else { diff --git a/layers/core_validation.h b/layers/core_validation.h index e44bbf89..d6857344 100644 --- a/layers/core_validation.h +++ b/layers/core_validation.h @@ -250,6 +250,7 @@ class QUEUE_NODE { #endif std::vector untrackedCmdBuffers; std::unordered_map eventToStageMap; + std::unordered_map queryToStateMap; // 0 is unavailable, 1 is available }; class QUERY_POOL_NODE : public BASE_NODE { diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index 683eefc5..c0394180 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -439,6 +439,7 @@ struct GLOBAL_CB_NODE : public BASE_NODE { std::vector> validate_functions; std::unordered_set memObjs; std::vector> eventUpdates; + std::vector> queryUpdates; ~GLOBAL_CB_NODE(); }; -- cgit v1.2.3 From f30d8d353589ae798fa578a81b8498d63545f975 Mon Sep 17 00:00:00 2001 From: Rene Lindsay Date: Mon, 23 May 2016 13:00:53 -0700 Subject: vulkaninfo: Display apiVersion and driverVersion in a more readable format. Display appropriate VkPhysicalDeviceLimits items in decimal or hex. Display Memory Property flags by their enum names, instead of integers. Add some missing properties and enums. --- demos/vulkaninfo.c | 236 +++++++++++++++++++++++++++++------------------------ 1 file changed, 130 insertions(+), 106 deletions(-) diff --git a/demos/vulkaninfo.c b/demos/vulkaninfo.c index 86e860c3..7754625b 100644 --- a/demos/vulkaninfo.c +++ b/demos/vulkaninfo.c @@ -713,20 +713,21 @@ static void app_dev_dump_format_props(const struct app_dev *dev, VkFormat fmt) if (features[i].flags == 0) { printf("\n\t\tNone"); } else { - printf("%s%s%s%s%s%s%s%s%s%s%s%s%s", - ((features[i].flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) ? "\n\t\tVK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT" : ""), - ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_IMAGE_BIT" : ""), - ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT" : ""), - ((features[i].flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) ? "\n\t\tVK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT" : ""), - ((features[i].flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) ? "\n\t\tVK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT" : ""), - ((features[i].flags & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) ? "\n\t\tVK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT" : ""), - ((features[i].flags & VK_FORMAT_FEATURE_BLIT_SRC_BIT) ? "\n\t\tVK_FORMAT_FEATURE_BLIT_SRC_BIT" : ""), - ((features[i].flags & VK_FORMAT_FEATURE_BLIT_DST_BIT) ? "\n\t\tVK_FORMAT_FEATURE_BLIT_DST_BIT" : ""), - ((features[i].flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) ? "\n\t\tVK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT" : ""), - ((features[i].flags & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) ? "\n\t\tVK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT" : ""), - ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT" : ""), - ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT" : ""), - ((features[i].flags & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) ? "\n\t\tVK_FORMAT_FEATURE_VERTEX_BUFFER_BIT" : "")); + printf("%s%s%s%s%s%s%s%s%s%s%s%s%s%s", + ((features[i].flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) ? "\n\t\tVK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT" : ""), //0x0001 + ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_IMAGE_BIT" : ""), //0x0002 + ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT" : ""), //0x0004 + ((features[i].flags & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) ? "\n\t\tVK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT" : ""), //0x0008 + ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT" : ""), //0x0010 + ((features[i].flags & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT) ? "\n\t\tVK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT" : ""), //0x0020 + ((features[i].flags & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) ? "\n\t\tVK_FORMAT_FEATURE_VERTEX_BUFFER_BIT" : ""), //0x0040 + ((features[i].flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) ? "\n\t\tVK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT" : ""), //0x0080 + ((features[i].flags & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT) ? "\n\t\tVK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT" : ""), //0x0100 + ((features[i].flags & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) ? "\n\t\tVK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT" : ""), //0x0200 + ((features[i].flags & VK_FORMAT_FEATURE_BLIT_SRC_BIT) ? "\n\t\tVK_FORMAT_FEATURE_BLIT_SRC_BIT" : ""), //0x0400 + ((features[i].flags & VK_FORMAT_FEATURE_BLIT_DST_BIT) ? "\n\t\tVK_FORMAT_FEATURE_BLIT_DST_BIT" : ""), //0x0800 + ((features[i].flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT) ? "\n\t\tVK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT" : ""), //0x1000 + ((features[i].flags & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG) ? "\n\t\tVK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG" : "")); //0x2000 } } printf("\n"); @@ -828,79 +829,78 @@ static void app_dump_limits(const VkPhysicalDeviceLimits *limits) { printf("\tVkPhysicalDeviceLimits:\n"); printf("\t-----------------------\n"); - - printf("\t\tmaxImageDimension1D = 0x%" PRIxLEAST32 "\n", limits->maxImageDimension1D ); - printf("\t\tmaxImageDimension2D = 0x%" PRIxLEAST32 "\n", limits->maxImageDimension2D ); - printf("\t\tmaxImageDimension3D = 0x%" PRIxLEAST32 "\n", limits->maxImageDimension3D ); - printf("\t\tmaxImageDimensionCube = 0x%" PRIxLEAST32 "\n", limits->maxImageDimensionCube ); - printf("\t\tmaxImageArrayLayers = 0x%" PRIxLEAST32 "\n", limits->maxImageArrayLayers ); + printf("\t\tmaxImageDimension1D = %u\n", limits->maxImageDimension1D ); + printf("\t\tmaxImageDimension2D = %u\n", limits->maxImageDimension2D ); + printf("\t\tmaxImageDimension3D = %u\n", limits->maxImageDimension3D ); + printf("\t\tmaxImageDimensionCube = %u\n", limits->maxImageDimensionCube ); + printf("\t\tmaxImageArrayLayers = %u\n", limits->maxImageArrayLayers ); printf("\t\tmaxTexelBufferElements = 0x%" PRIxLEAST32 "\n", limits->maxTexelBufferElements ); printf("\t\tmaxUniformBufferRange = 0x%" PRIxLEAST32 "\n", limits->maxUniformBufferRange ); printf("\t\tmaxStorageBufferRange = 0x%" PRIxLEAST32 "\n", limits->maxStorageBufferRange ); - printf("\t\tmaxPushConstantsSize = 0x%" PRIxLEAST32 "\n", limits->maxPushConstantsSize ); - printf("\t\tmaxMemoryAllocationCount = 0x%" PRIxLEAST32 "\n", limits->maxMemoryAllocationCount ); - printf("\t\tmaxSamplerAllocationCount = 0x%" PRIxLEAST32 "\n", limits->maxSamplerAllocationCount ); + printf("\t\tmaxPushConstantsSize = %u\n", limits->maxPushConstantsSize ); + printf("\t\tmaxMemoryAllocationCount = %u\n", limits->maxMemoryAllocationCount ); + printf("\t\tmaxSamplerAllocationCount = %u\n", limits->maxSamplerAllocationCount ); printf("\t\tbufferImageGranularity = 0x%" PRIxLEAST64 "\n", limits->bufferImageGranularity ); printf("\t\tsparseAddressSpaceSize = 0x%" PRIxLEAST64 "\n", limits->sparseAddressSpaceSize ); - printf("\t\tmaxBoundDescriptorSets = 0x%" PRIxLEAST32 "\n", limits->maxBoundDescriptorSets ); - printf("\t\tmaxPerStageDescriptorSamplers = 0x%" PRIxLEAST32 "\n", limits->maxPerStageDescriptorSamplers ); - printf("\t\tmaxPerStageDescriptorUniformBuffers = 0x%" PRIxLEAST32 "\n", limits->maxPerStageDescriptorUniformBuffers ); - printf("\t\tmaxPerStageDescriptorStorageBuffers = 0x%" PRIxLEAST32 "\n", limits->maxPerStageDescriptorStorageBuffers ); - printf("\t\tmaxPerStageDescriptorSampledImages = 0x%" PRIxLEAST32 "\n", limits->maxPerStageDescriptorSampledImages ); - printf("\t\tmaxPerStageDescriptorStorageImages = 0x%" PRIxLEAST32 "\n", limits->maxPerStageDescriptorStorageImages ); - printf("\t\tmaxPerStageDescriptorInputAttachments = 0x%" PRIxLEAST32 "\n", limits->maxPerStageDescriptorInputAttachments ); - printf("\t\tmaxPerStageResources = 0x%" PRIxLEAST32 "\n", limits->maxPerStageResources ); - printf("\t\tmaxDescriptorSetSamplers = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetSamplers ); - printf("\t\tmaxDescriptorSetUniformBuffers = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetUniformBuffers ); - printf("\t\tmaxDescriptorSetUniformBuffersDynamic = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetUniformBuffersDynamic ); - printf("\t\tmaxDescriptorSetStorageBuffers = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetStorageBuffers ); - printf("\t\tmaxDescriptorSetStorageBuffersDynamic = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetStorageBuffersDynamic ); - printf("\t\tmaxDescriptorSetSampledImages = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetSampledImages ); - printf("\t\tmaxDescriptorSetStorageImages = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetStorageImages ); - printf("\t\tmaxDescriptorSetInputAttachments = 0x%" PRIxLEAST32 "\n", limits->maxDescriptorSetInputAttachments ); - printf("\t\tmaxVertexInputAttributes = 0x%" PRIxLEAST32 "\n", limits->maxVertexInputAttributes ); - printf("\t\tmaxVertexInputBindings = 0x%" PRIxLEAST32 "\n", limits->maxVertexInputBindings ); + printf("\t\tmaxBoundDescriptorSets = %u\n", limits->maxBoundDescriptorSets ); + printf("\t\tmaxPerStageDescriptorSamplers = %u\n", limits->maxPerStageDescriptorSamplers ); + printf("\t\tmaxPerStageDescriptorUniformBuffers = %u\n", limits->maxPerStageDescriptorUniformBuffers ); + printf("\t\tmaxPerStageDescriptorStorageBuffers = %u\n", limits->maxPerStageDescriptorStorageBuffers ); + printf("\t\tmaxPerStageDescriptorSampledImages = %u\n", limits->maxPerStageDescriptorSampledImages ); + printf("\t\tmaxPerStageDescriptorStorageImages = %u\n", limits->maxPerStageDescriptorStorageImages ); + printf("\t\tmaxPerStageDescriptorInputAttachments = %u\n", limits->maxPerStageDescriptorInputAttachments ); + printf("\t\tmaxPerStageResources = %u\n", limits->maxPerStageResources ); + printf("\t\tmaxDescriptorSetSamplers = %u\n", limits->maxDescriptorSetSamplers ); + printf("\t\tmaxDescriptorSetUniformBuffers = %u\n", limits->maxDescriptorSetUniformBuffers ); + printf("\t\tmaxDescriptorSetUniformBuffersDynamic = %u\n", limits->maxDescriptorSetUniformBuffersDynamic ); + printf("\t\tmaxDescriptorSetStorageBuffers = %u\n", limits->maxDescriptorSetStorageBuffers ); + printf("\t\tmaxDescriptorSetStorageBuffersDynamic = %u\n", limits->maxDescriptorSetStorageBuffersDynamic ); + printf("\t\tmaxDescriptorSetSampledImages = %u\n", limits->maxDescriptorSetSampledImages ); + printf("\t\tmaxDescriptorSetStorageImages = %u\n", limits->maxDescriptorSetStorageImages ); + printf("\t\tmaxDescriptorSetInputAttachments = %u\n", limits->maxDescriptorSetInputAttachments ); + printf("\t\tmaxVertexInputAttributes = %u\n", limits->maxVertexInputAttributes ); + printf("\t\tmaxVertexInputBindings = %u\n", limits->maxVertexInputBindings ); printf("\t\tmaxVertexInputAttributeOffset = 0x%" PRIxLEAST32 "\n", limits->maxVertexInputAttributeOffset ); printf("\t\tmaxVertexInputBindingStride = 0x%" PRIxLEAST32 "\n", limits->maxVertexInputBindingStride ); - printf("\t\tmaxVertexOutputComponents = 0x%" PRIxLEAST32 "\n", limits->maxVertexOutputComponents ); - printf("\t\tmaxTessellationGenerationLevel = 0x%" PRIxLEAST32 "\n", limits->maxTessellationGenerationLevel ); - printf("\t\tmaxTessellationPatchSize = 0x%" PRIxLEAST32 "\n", limits->maxTessellationPatchSize ); - printf("\t\tmaxTessellationControlPerVertexInputComponents = 0x%" PRIxLEAST32 "\n", limits->maxTessellationControlPerVertexInputComponents ); - printf("\t\tmaxTessellationControlPerVertexOutputComponents = 0x%" PRIxLEAST32 "\n", limits->maxTessellationControlPerVertexOutputComponents); - printf("\t\tmaxTessellationControlPerPatchOutputComponents = 0x%" PRIxLEAST32 "\n", limits->maxTessellationControlPerPatchOutputComponents ); - printf("\t\tmaxTessellationControlTotalOutputComponents = 0x%" PRIxLEAST32 "\n", limits->maxTessellationControlTotalOutputComponents ); - printf("\t\tmaxTessellationEvaluationInputComponents = 0x%" PRIxLEAST32 "\n", limits->maxTessellationEvaluationInputComponents ); - printf("\t\tmaxTessellationEvaluationOutputComponents = 0x%" PRIxLEAST32 "\n", limits->maxTessellationEvaluationOutputComponents ); - printf("\t\tmaxGeometryShaderInvocations = 0x%" PRIxLEAST32 "\n", limits->maxGeometryShaderInvocations ); - printf("\t\tmaxGeometryInputComponents = 0x%" PRIxLEAST32 "\n", limits->maxGeometryInputComponents ); - printf("\t\tmaxGeometryOutputComponents = 0x%" PRIxLEAST32 "\n", limits->maxGeometryOutputComponents ); - printf("\t\tmaxGeometryOutputVertices = 0x%" PRIxLEAST32 "\n", limits->maxGeometryOutputVertices ); - printf("\t\tmaxGeometryTotalOutputComponents = 0x%" PRIxLEAST32 "\n", limits->maxGeometryTotalOutputComponents ); - printf("\t\tmaxFragmentInputComponents = 0x%" PRIxLEAST32 "\n", limits->maxFragmentInputComponents ); - printf("\t\tmaxFragmentOutputAttachments = 0x%" PRIxLEAST32 "\n", limits->maxFragmentOutputAttachments ); - printf("\t\tmaxFragmentDualSrcAttachments = 0x%" PRIxLEAST32 "\n", limits->maxFragmentDualSrcAttachments ); - printf("\t\tmaxFragmentCombinedOutputResources = 0x%" PRIxLEAST32 "\n", limits->maxFragmentCombinedOutputResources ); + printf("\t\tmaxVertexOutputComponents = %u\n", limits->maxVertexOutputComponents ); + printf("\t\tmaxTessellationGenerationLevel = %u\n", limits->maxTessellationGenerationLevel ); + printf("\t\tmaxTessellationPatchSize = %u\n", limits->maxTessellationPatchSize ); + printf("\t\tmaxTessellationControlPerVertexInputComponents = %u\n", limits->maxTessellationControlPerVertexInputComponents ); + printf("\t\tmaxTessellationControlPerVertexOutputComponents = %u\n", limits->maxTessellationControlPerVertexOutputComponents); + printf("\t\tmaxTessellationControlPerPatchOutputComponents = %u\n", limits->maxTessellationControlPerPatchOutputComponents ); + printf("\t\tmaxTessellationControlTotalOutputComponents = %u\n", limits->maxTessellationControlTotalOutputComponents ); + printf("\t\tmaxTessellationEvaluationInputComponents = %u\n", limits->maxTessellationEvaluationInputComponents ); + printf("\t\tmaxTessellationEvaluationOutputComponents = %u\n", limits->maxTessellationEvaluationOutputComponents ); + printf("\t\tmaxGeometryShaderInvocations = %u\n", limits->maxGeometryShaderInvocations ); + printf("\t\tmaxGeometryInputComponents = %u\n", limits->maxGeometryInputComponents ); + printf("\t\tmaxGeometryOutputComponents = %u\n", limits->maxGeometryOutputComponents ); + printf("\t\tmaxGeometryOutputVertices = %u\n", limits->maxGeometryOutputVertices ); + printf("\t\tmaxGeometryTotalOutputComponents = %u\n", limits->maxGeometryTotalOutputComponents ); + printf("\t\tmaxFragmentInputComponents = %u\n", limits->maxFragmentInputComponents ); + printf("\t\tmaxFragmentOutputAttachments = %u\n", limits->maxFragmentOutputAttachments ); + printf("\t\tmaxFragmentDualSrcAttachments = %u\n", limits->maxFragmentDualSrcAttachments ); + printf("\t\tmaxFragmentCombinedOutputResources = %u\n", limits->maxFragmentCombinedOutputResources ); printf("\t\tmaxComputeSharedMemorySize = 0x%" PRIxLEAST32 "\n", limits->maxComputeSharedMemorySize ); - printf("\t\tmaxComputeWorkGroupCount[0] = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupCount[0] ); - printf("\t\tmaxComputeWorkGroupCount[1] = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupCount[1] ); - printf("\t\tmaxComputeWorkGroupCount[2] = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupCount[2] ); - printf("\t\tmaxComputeWorkGroupInvocations = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupInvocations ); - printf("\t\tmaxComputeWorkGroupSize[0] = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupSize[0] ); - printf("\t\tmaxComputeWorkGroupSize[1] = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupSize[1] ); - printf("\t\tmaxComputeWorkGroupSize[2] = 0x%" PRIxLEAST32 "\n", limits->maxComputeWorkGroupSize[2] ); - printf("\t\tsubPixelPrecisionBits = 0x%" PRIxLEAST32 "\n", limits->subPixelPrecisionBits ); - printf("\t\tsubTexelPrecisionBits = 0x%" PRIxLEAST32 "\n", limits->subTexelPrecisionBits ); - printf("\t\tmipmapPrecisionBits = 0x%" PRIxLEAST32 "\n", limits->mipmapPrecisionBits ); - printf("\t\tmaxDrawIndexedIndexValue = 0x%" PRIxLEAST32 "\n", limits->maxDrawIndexedIndexValue ); - printf("\t\tmaxDrawIndirectCount = 0x%" PRIxLEAST32 "\n", limits->maxDrawIndirectCount ); + printf("\t\tmaxComputeWorkGroupCount[0] = %u\n", limits->maxComputeWorkGroupCount[0] ); + printf("\t\tmaxComputeWorkGroupCount[1] = %u\n", limits->maxComputeWorkGroupCount[1] ); + printf("\t\tmaxComputeWorkGroupCount[2] = %u\n", limits->maxComputeWorkGroupCount[2] ); + printf("\t\tmaxComputeWorkGroupInvocations = %u\n", limits->maxComputeWorkGroupInvocations ); + printf("\t\tmaxComputeWorkGroupSize[0] = %u\n", limits->maxComputeWorkGroupSize[0] ); + printf("\t\tmaxComputeWorkGroupSize[1] = %u\n", limits->maxComputeWorkGroupSize[1] ); + printf("\t\tmaxComputeWorkGroupSize[2] = %u\n", limits->maxComputeWorkGroupSize[2] ); + printf("\t\tsubPixelPrecisionBits = %u\n", limits->subPixelPrecisionBits ); + printf("\t\tsubTexelPrecisionBits = %u\n", limits->subTexelPrecisionBits ); + printf("\t\tmipmapPrecisionBits = %u\n", limits->mipmapPrecisionBits ); + printf("\t\tmaxDrawIndexedIndexValue = %u\n", limits->maxDrawIndexedIndexValue ); + printf("\t\tmaxDrawIndirectCount = %u\n", limits->maxDrawIndirectCount ); printf("\t\tmaxSamplerLodBias = %f\n", limits->maxSamplerLodBias ); printf("\t\tmaxSamplerAnisotropy = %f\n", limits->maxSamplerAnisotropy ); - printf("\t\tmaxViewports = 0x%" PRIxLEAST32 "\n", limits->maxViewports ); - printf("\t\tmaxViewportDimensions[0] = 0x%" PRIxLEAST32 "\n", limits->maxViewportDimensions[0] ); - printf("\t\tmaxViewportDimensions[1] = 0x%" PRIxLEAST32 "\n", limits->maxViewportDimensions[1] ); + printf("\t\tmaxViewports = %u\n", limits->maxViewports ); + printf("\t\tmaxViewportDimensions[0] = %u\n", limits->maxViewportDimensions[0] ); + printf("\t\tmaxViewportDimensions[1] = %u\n", limits->maxViewportDimensions[1] ); printf("\t\tviewportBoundsRange[0] = %f\n", limits->viewportBoundsRange[0] ); printf("\t\tviewportBoundsRange[1] = %f\n", limits->viewportBoundsRange[1] ); - printf("\t\tviewportSubPixelBits = 0x%" PRIxLEAST32 "\n", limits->viewportSubPixelBits ); + printf("\t\tviewportSubPixelBits = %u\n", limits->viewportSubPixelBits ); printf("\t\tminMemoryMapAlignment = " PRINTF_SIZE_T_SPECIFIER "\n", limits->minMemoryMapAlignment ); printf("\t\tminTexelBufferOffsetAlignment = 0x%" PRIxLEAST64 "\n", limits->minTexelBufferOffsetAlignment ); printf("\t\tminUniformBufferOffsetAlignment = 0x%" PRIxLEAST64 "\n", limits->minUniformBufferOffsetAlignment ); @@ -911,25 +911,27 @@ static void app_dump_limits(const VkPhysicalDeviceLimits *limits) printf("\t\tmaxTexelGatherOffset = 0x%" PRIxLEAST32 "\n", limits->maxTexelGatherOffset ); printf("\t\tminInterpolationOffset = %f\n", limits->minInterpolationOffset ); printf("\t\tmaxInterpolationOffset = %f\n", limits->maxInterpolationOffset ); - printf("\t\tsubPixelInterpolationOffsetBits = 0x%" PRIxLEAST32 "\n", limits->subPixelInterpolationOffsetBits ); - printf("\t\tmaxFramebufferWidth = 0x%" PRIxLEAST32 "\n", limits->maxFramebufferWidth ); - printf("\t\tmaxFramebufferHeight = 0x%" PRIxLEAST32 "\n", limits->maxFramebufferHeight ); - printf("\t\tmaxFramebufferLayers = 0x%" PRIxLEAST32 "\n", limits->maxFramebufferLayers ); - printf("\t\tframebufferColorSampleCounts = 0x%" PRIxLEAST32 "\n", limits->framebufferColorSampleCounts ); - printf("\t\tframebufferDepthSampleCounts = 0x%" PRIxLEAST32 "\n", limits->framebufferDepthSampleCounts ); - printf("\t\tframebufferStencilSampleCounts = 0x%" PRIxLEAST32 "\n", limits->framebufferStencilSampleCounts ); - printf("\t\tmaxColorAttachments = 0x%" PRIxLEAST32 "\n", limits->maxColorAttachments ); - printf("\t\tsampledImageColorSampleCounts = 0x%" PRIxLEAST32 "\n", limits->sampledImageColorSampleCounts ); - printf("\t\tsampledImageDepthSampleCounts = 0x%" PRIxLEAST32 "\n", limits->sampledImageDepthSampleCounts ); - printf("\t\tsampledImageStencilSampleCounts = 0x%" PRIxLEAST32 "\n", limits->sampledImageStencilSampleCounts ); - printf("\t\tsampledImageIntegerSampleCounts = 0x%" PRIxLEAST32 "\n", limits->sampledImageIntegerSampleCounts ); - printf("\t\tstorageImageSampleCounts = 0x%" PRIxLEAST32 "\n", limits->storageImageSampleCounts ); - printf("\t\tmaxSampleMaskWords = 0x%" PRIxLEAST32 "\n", limits->maxSampleMaskWords ); + printf("\t\tsubPixelInterpolationOffsetBits = %u\n", limits->subPixelInterpolationOffsetBits ); + printf("\t\tmaxFramebufferWidth = %u\n", limits->maxFramebufferWidth ); + printf("\t\tmaxFramebufferHeight = %u\n", limits->maxFramebufferHeight ); + printf("\t\tmaxFramebufferLayers = %u\n", limits->maxFramebufferLayers ); + printf("\t\tframebufferColorSampleCounts = %u\n", limits->framebufferColorSampleCounts ); + printf("\t\tframebufferDepthSampleCounts = %u\n", limits->framebufferDepthSampleCounts ); + printf("\t\tframebufferStencilSampleCounts = %u\n", limits->framebufferStencilSampleCounts ); + printf("\t\tframebufferNoAttachmentsSampleCounts = %u\n", limits->framebufferNoAttachmentsSampleCounts ); + printf("\t\tmaxColorAttachments = %u\n", limits->maxColorAttachments ); + printf("\t\tsampledImageColorSampleCounts = %u\n", limits->sampledImageColorSampleCounts ); + printf("\t\tsampledImageDepthSampleCounts = %u\n", limits->sampledImageDepthSampleCounts ); + printf("\t\tsampledImageStencilSampleCounts = %u\n", limits->sampledImageStencilSampleCounts ); + printf("\t\tsampledImageIntegerSampleCounts = %u\n", limits->sampledImageIntegerSampleCounts ); + printf("\t\tstorageImageSampleCounts = %u\n", limits->storageImageSampleCounts ); + printf("\t\tmaxSampleMaskWords = %u\n", limits->maxSampleMaskWords ); printf("\t\ttimestampComputeAndGraphics = %u\n", limits->timestampComputeAndGraphics ); - printf("\t\ttimestampPeriod = 0x%f\n", limits->timestampPeriod ); - printf("\t\tmaxClipDistances = 0x%" PRIxLEAST32 "\n", limits->maxClipDistances ); - printf("\t\tmaxCullDistances = 0x%" PRIxLEAST32 "\n", limits->maxCullDistances ); - printf("\t\tmaxCombinedClipAndCullDistances = 0x%" PRIxLEAST32 "\n", limits->maxCombinedClipAndCullDistances ); + printf("\t\ttimestampPeriod = %f\n", limits->timestampPeriod ); + printf("\t\tmaxClipDistances = %u\n", limits->maxClipDistances ); + printf("\t\tmaxCullDistances = %u\n", limits->maxCullDistances ); + printf("\t\tmaxCombinedClipAndCullDistances = %u\n", limits->maxCombinedClipAndCullDistances ); + printf("\t\tdiscreteQueuePriorities = %u\n", limits->discreteQueuePriorities ); printf("\t\tpointSizeRange[0] = %f\n", limits->pointSizeRange[0] ); printf("\t\tpointSizeRange[1] = %f\n", limits->pointSizeRange[1] ); printf("\t\tlineWidthRange[0] = %f\n", limits->lineWidthRange[0] ); @@ -946,15 +948,19 @@ static void app_dump_limits(const VkPhysicalDeviceLimits *limits) static void app_gpu_dump_props(const struct app_gpu *gpu) { const VkPhysicalDeviceProperties *props = &gpu->props; + const uint32_t apiVersion=props->apiVersion; + const uint32_t major = VK_VERSION_MAJOR(apiVersion); + const uint32_t minor = VK_VERSION_MINOR(apiVersion); + const uint32_t patch = VK_VERSION_PATCH(apiVersion); printf("VkPhysicalDeviceProperties:\n"); printf("===========================\n"); - printf("\tapiVersion = %u\n", props->apiVersion); - printf("\tdriverVersion = %u\n", props->driverVersion); - printf("\tvendorID = 0x%04x\n", props->vendorID); - printf("\tdeviceID = 0x%04x\n", props->deviceID); - printf("\tdeviceType = %s\n", vk_physical_device_type_string(props->deviceType)); - printf("\tdeviceName = %s\n", props->deviceName); + printf("\tapiVersion = 0x%" PRIxLEAST32 " (%d.%d.%d)\n", apiVersion, major, minor, patch); + printf("\tdriverVersion = %u (0x%" PRIxLEAST32 ")\n",props->driverVersion, props->driverVersion); + printf("\tvendorID = 0x%04x\n", props->vendorID); + printf("\tdeviceID = 0x%04x\n", props->deviceID); + printf("\tdeviceType = %s\n", vk_physical_device_type_string(props->deviceType)); + printf("\tdeviceName = %s\n", props->deviceName); app_dump_limits(&gpu->props.limits); app_dump_sparse_props(&gpu->props.sparseProperties); @@ -992,7 +998,7 @@ static void app_gpu_dump_queue_props(const struct app_gpu *gpu, uint32_t id) { printf("============================\n"); printf("\tqueueFlags = %c%c%c\n", (props->queueFlags & VK_QUEUE_GRAPHICS_BIT) ? 'G' : '.', - (props->queueFlags & VK_QUEUE_COMPUTE_BIT) ? 'C' : '.', + (props->queueFlags & VK_QUEUE_COMPUTE_BIT ) ? 'C' : '.', (props->queueFlags & VK_QUEUE_TRANSFER_BIT) ? 'D' : '.'); printf("\tqueueCount = %u\n", props->queueCount); printf("\ttimestampValidBits = %u\n", props->timestampValidBits); @@ -1011,14 +1017,31 @@ static void app_gpu_dump_memory_props(const struct app_gpu *gpu) { printf("\tmemoryTypeCount = %u\n", props->memoryTypeCount); for (uint32_t i = 0; i < props->memoryTypeCount; i++) { printf("\tmemoryTypes[%u] : \n", i); - printf("\t\tpropertyFlags = %u\n", props->memoryTypes[i].propertyFlags); printf("\t\theapIndex = %u\n", props->memoryTypes[i].heapIndex); + printf("\t\tpropertyFlags = 0x%" PRIxLEAST32 ":\n", props->memoryTypes[i].propertyFlags); + + //Print each named flag, if it is set. + VkFlags flags=props->memoryTypes[i].propertyFlags; +#define PRINT_FLAG(FLAG) printf((flags & FLAG) ? "\t\t\t"#FLAG"\n" : ""); + PRINT_FLAG(VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) + PRINT_FLAG(VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) + PRINT_FLAG(VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) + PRINT_FLAG(VK_MEMORY_PROPERTY_HOST_CACHED_BIT) + PRINT_FLAG(VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) +#undef PRINT_FLAG + } + printf("\n"); printf("\tmemoryHeapCount = %u\n", props->memoryHeapCount); for (uint32_t i = 0; i < props->memoryHeapCount; i++) { printf("\tmemoryHeaps[%u] : \n", i); - printf("\t\tsize = " PRINTF_SIZE_T_SPECIFIER "\n", - (size_t)props->memoryHeaps[i].size); + const VkDeviceSize memSize = props->memoryHeaps[i].size; + printf("\t\tsize = " PRINTF_SIZE_T_SPECIFIER " (0x%" PRIxLEAST64 ")\n", + (size_t)memSize, memSize); + + VkMemoryHeapFlags heapFlags=props->memoryHeaps[i].flags; + printf("\t\tflags: \n\t\t\t"); + printf((heapFlags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) ? "VK_MEMORY_HEAP_DEVICE_LOCAL_BIT\n" : "None\n"); } fflush(stdout); } @@ -1107,9 +1130,10 @@ int main(int argc, char **argv) { ConsoleEnlarge(); #endif - major = VK_API_VERSION_1_0 >> 22; - minor = (VK_API_VERSION_1_0 >> 12) & 0x3ff; - patch = VK_HEADER_VERSION & 0xfff; + major = VK_VERSION_MAJOR(VK_API_VERSION_1_0); + minor = VK_VERSION_MINOR(VK_API_VERSION_1_0); + patch = VK_VERSION_PATCH(VK_HEADER_VERSION); + printf("===========\n"); printf("VULKAN INFO\n"); printf("===========\n\n"); -- cgit v1.2.3 From 2160a5be0d79709a39000edaade13b8849340539 Mon Sep 17 00:00:00 2001 From: Michael Lentine Date: Mon, 23 May 2016 13:18:13 -0500 Subject: Mark fence in use after the check. --- layers/core_validation.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index e8c4cc38..c623d70e 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -9583,7 +9583,6 @@ QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *p std::unique_lock lock(global_lock); // First verify that fence is not in use if (fence != VK_NULL_HANDLE) { - trackCommandBuffers(dev_data, queue, 0, nullptr, fence); auto fence_data = dev_data->fenceMap.find(fence); if ((bindInfoCount != 0) && fence_data->second.in_use.load()) { skip_call |= @@ -9598,6 +9597,7 @@ QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *p "Fence 0x%" PRIxLEAST64 " submitted in SIGNALED state. Fences must be reset before being submitted", reinterpret_cast(fence)); } + trackCommandBuffers(dev_data, queue, 0, nullptr, fence); } for (uint32_t bindIdx = 0; bindIdx < bindInfoCount; ++bindIdx) { const VkBindSparseInfo &bindInfo = pBindInfo[bindIdx]; -- cgit v1.2.3 From e3a00781d1d512dbc36c71086a8e61eed386c587 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Mon, 23 May 2016 13:45:36 -0600 Subject: layers: Display accessMask in HEX --- layers/core_validation.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index c623d70e..4659a248 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -7535,7 +7535,7 @@ static bool ValidateMaskBits(const layer_data *my_data, VkCommandBuffer cmdBuffe // TODO: Verify against Valid Use skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, - DRAWSTATE_INVALID_BARRIER, "DS", "Additional bits in %s accessMask %d %s are specified when layout is %s.", + DRAWSTATE_INVALID_BARRIER, "DS", "Additional bits in %s accessMask 0x%X %s are specified when layout is %s.", type, accessMask, string_VkAccessFlags(accessMask).c_str(), string_VkImageLayout(layout)); } } else { @@ -7605,7 +7605,7 @@ static bool ValidateMaskBitsFromLayouts(const layer_data *my_data, VkCommandBuff // TODO: Verify against Valid Use section spec skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, - DRAWSTATE_INVALID_BARRIER, "DS", "Additional bits in %s accessMask %d %s are specified when layout is %s.", + DRAWSTATE_INVALID_BARRIER, "DS", "Additional bits in %s accessMask 0x%X %s are specified when layout is %s.", type, accessMask, string_VkAccessFlags(accessMask).c_str(), string_VkImageLayout(layout)); } break; -- cgit v1.2.3 From fe38080414008c680ea05d1affd34b34d426670f Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Mon, 16 May 2016 12:27:03 +0800 Subject: vk-layer-generate.py: add intercept_core_*_command Replace layer_intercept_instance_proc with intercept_core_instance_command, which returns all intercepted core instance commands. Replace layer_intercept_device_proc with intercept_core_device_command, which returns all intercepted core device commands. The only user visible difference should be that vkGetDeviceProcAddr now returns NULL for instance commands. --- vk-layer-generate.py | 69 ++++++++++++++++------------------------------------ 1 file changed, 21 insertions(+), 48 deletions(-) diff --git a/vk-layer-generate.py b/vk-layer-generate.py index 4e39c561..19eb535f 100755 --- a/vk-layer-generate.py +++ b/vk-layer-generate.py @@ -428,8 +428,9 @@ class Subcommand(object): funcs = [] intercepted = [] for proto in self.protos: - if proto.name == "GetDeviceProcAddr" or proto.name == "GetInstanceProcAddr": - continue + if proto.name in ["GetDeviceProcAddr", + "GetInstanceProcAddr"]: + intercepted.append(proto) else: intercept = self.generate_intercept(proto, qual) if intercept is None: @@ -455,45 +456,35 @@ class Subcommand(object): intercepted.append(proto) prefix="vk" - lookups = [] + instance_lookups = [] + device_lookups = [] for proto in intercepted: - lookups.append("if (!strcmp(name, \"%s\"))" % proto.name) - lookups.append(" return (PFN_vkVoidFunction) %s%s;" % - (prefix, proto.name)) + if proto_is_global(proto): + instance_lookups.append("if (!strcmp(name, \"%s\"))" % proto.name) + instance_lookups.append(" return (PFN_vkVoidFunction) %s%s;" % (prefix, proto.name)) + else: + device_lookups.append("if (!strcmp(name, \"%s\"))" % proto.name) + device_lookups.append(" return (PFN_vkVoidFunction) %s%s;" % (prefix, proto.name)) - # add customized layer_intercept_proc + # add customized intercept_core_device_command body = [] body.append('%s' % self.lineinfo.get()) - body.append("static inline PFN_vkVoidFunction layer_intercept_proc(const char *name)") + body.append("static inline PFN_vkVoidFunction intercept_core_device_command(const char *name)") body.append("{") body.append(generate_get_proc_addr_check("name")) body.append("") body.append(" name += 2;") - body.append(" %s" % "\n ".join(lookups)) + body.append(" %s" % "\n ".join(device_lookups)) body.append("") body.append(" return NULL;") body.append("}") - # add layer_intercept_instance_proc - lookups = [] - for proto in self.protos: - if not proto_is_global(proto): - continue - - if not proto in intercepted: - continue - if proto.name == "CreateInstance": - continue - if proto.name == "CreateDevice": - continue - lookups.append("if (!strcmp(name, \"%s\"))" % proto.name) - lookups.append(" return (PFN_vkVoidFunction) %s%s;" % (prefix, proto.name)) - - body.append("static inline PFN_vkVoidFunction layer_intercept_instance_proc(const char *name)") + # add intercept_core_instance_command + body.append("static inline PFN_vkVoidFunction intercept_core_instance_command(const char *name)") body.append("{") body.append(generate_get_proc_addr_check("name")) body.append("") body.append(" name += 2;") - body.append(" %s" % "\n ".join(lookups)) + body.append(" %s" % "\n ".join(instance_lookups)) body.append("") body.append(" return NULL;") body.append("}") @@ -518,10 +509,7 @@ class Subcommand(object): func_body.append("VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char* funcName)\n" "{\n" " PFN_vkVoidFunction addr;\n" - " if (!strcmp(\"vkGetDeviceProcAddr\", funcName)) {\n" - " return (PFN_vkVoidFunction) vkGetDeviceProcAddr;\n" - " }\n\n" - " addr = layer_intercept_proc(funcName);\n" + " addr = intercept_core_device_command(funcName);\n" " if (addr)\n" " return addr;\n" " if (device == VK_NULL_HANDLE) {\n" @@ -547,13 +535,7 @@ class Subcommand(object): func_body.append("VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char* funcName)\n" "{\n" " PFN_vkVoidFunction addr;\n" - " if (!strcmp(funcName, \"vkGetInstanceProcAddr\"))\n" - " return (PFN_vkVoidFunction) vkGetInstanceProcAddr;\n" - " if (!strcmp(funcName, \"vkCreateInstance\"))\n" - " return (PFN_vkVoidFunction) vkCreateInstance;\n" - " if (!strcmp(funcName, \"vkCreateDevice\"))\n" - " return (PFN_vkVoidFunction) vkCreateDevice;\n" - " addr = layer_intercept_instance_proc(funcName);\n" + " addr = intercept_core_instance_command(funcName);\n" " if (addr) {\n" " return addr;" " }\n" @@ -603,10 +585,7 @@ class Subcommand(object): " PFN_vkVoidFunction addr;\n") func_body.append("\n" " loader_platform_thread_once(&initOnce, init%s);\n\n" - " if (!strcmp(\"vkGetDeviceProcAddr\", funcName)) {\n" - " return (PFN_vkVoidFunction) vkGetDeviceProcAddr;\n" - " }\n\n" - " addr = layer_intercept_proc(funcName);\n" + " addr = intercept_core_device_command(funcName);\n" " if (addr)\n" " return addr;" % self.layer_name) func_body.append(" if (device == VK_NULL_HANDLE) {\n" @@ -637,16 +616,10 @@ class Subcommand(object): func_body.append("VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char* funcName)\n" "{\n" " PFN_vkVoidFunction addr;\n" - " if (!strcmp(funcName, \"vkGetInstanceProcAddr\"))\n" - " return (PFN_vkVoidFunction) vkGetInstanceProcAddr;\n" - " if (!strcmp(funcName, \"vkCreateInstance\"))\n" - " return (PFN_vkVoidFunction) vkCreateInstance;\n" - " if (!strcmp(funcName, \"vkCreateDevice\"))\n" - " return (PFN_vkVoidFunction) vkCreateDevice;\n" ) func_body.append( " loader_platform_thread_once(&initOnce, init%s);\n\n" - " addr = layer_intercept_instance_proc(funcName);\n" + " addr = intercept_core_instance_command(funcName);\n" " if (addr)\n" " return addr;" % self.layer_name) func_body.append(" if (instance == VK_NULL_HANDLE) {\n" -- cgit v1.2.3 From dc3c050632391aca091985a14f488542d65e4673 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Mon, 16 May 2016 13:01:39 +0800 Subject: vk-layer-generate.py: add intercept__command Add intercept__command to return intercepted extension commands. Invoke them from vkGet*ProcAddr. --- vk-layer-generate.py | 88 ++++++++++++++++++++++++++++------------------------ 1 file changed, 47 insertions(+), 41 deletions(-) diff --git a/vk-layer-generate.py b/vk-layer-generate.py index 19eb535f..6d0e70fa 100755 --- a/vk-layer-generate.py +++ b/vk-layer-generate.py @@ -506,6 +506,20 @@ class Subcommand(object): # New style of GPA Functions for the new layer_data/layer_logging changes # if self.layer_name in ['object_tracker', 'unique_objects']: + for ext_enable, ext_list in extensions: + func_body.append('%s' % self.lineinfo.get()) + func_body.append('static inline PFN_vkVoidFunction intercept_%s_command(const char *name, VkDevice dev)' % ext_enable) + func_body.append('{') + func_body.append(' layer_data *my_data = get_my_data_ptr(get_dispatch_key(dev), layer_data_map);') + func_body.append(' if (!my_data->%s)' % ext_enable) + func_body.append(' return nullptr;\n') + + for ext_name in ext_list: + func_body.append(' if (!strcmp("%s", name))\n' + ' return reinterpret_cast(%s);' % (ext_name, ext_name)) + func_body.append('\n return nullptr;') + func_body.append('}\n') + func_body.append("VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char* funcName)\n" "{\n" " PFN_vkVoidFunction addr;\n" @@ -515,62 +529,54 @@ class Subcommand(object): " if (device == VK_NULL_HANDLE) {\n" " return NULL;\n" " }\n") - if 0 != len(extensions): - func_body.append('%s' % self.lineinfo.get()) - func_body.append(' layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);') - for (ext_enable, ext_list) in extensions: - extra_space = "" - if 0 != len(ext_enable): - func_body.append(' if (my_device_data->%s) {' % ext_enable) - extra_space = " " - for ext_name in ext_list: - func_body.append(' %sif (!strcmp("%s", funcName))\n' - ' %sreturn reinterpret_cast(%s);' % (extra_space, ext_name, extra_space, ext_name)) - if 0 != len(ext_enable): - func_body.append(' }\n') + for ext_enable, _ in extensions: + func_body.append(' addr = intercept_%s_command(funcName, device);' % ext_enable) + func_body.append(' if (addr)\n' + ' return addr;') func_body.append("\n if (get_dispatch_table(%s_device_table_map, device)->GetDeviceProcAddr == NULL)\n" " return NULL;\n" " return get_dispatch_table(%s_device_table_map, device)->GetDeviceProcAddr(device, funcName);\n" "}\n" % (self.layer_name, self.layer_name)) + + for ext_enable, ext_list in instance_extensions: + func_body.append('%s' % self.lineinfo.get()) + func_body.append('static inline PFN_vkVoidFunction intercept_%s_command(const char *name, VkInstance instance)' % ext_enable) + func_body.append('{') + if ext_enable == 'msg_callback_get_proc_addr': + func_body.append(" layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);\n" + " return debug_report_get_instance_proc_addr(my_data->report_data, name);") + else: + func_body.append(" VkLayerInstanceDispatchTable* pTable = get_dispatch_table(%s_instance_table_map, instance);" % self.layer_name) + func_body.append(' if (instanceExtMap.size() == 0 || !instanceExtMap[pTable].%s)' % ext_enable) + func_body.append(' return nullptr;\n') + + for ext_name in ext_list: + if wsi_name(ext_name): + func_body.append('%s' % wsi_ifdef(ext_name)) + func_body.append(' if (!strcmp("%s", name))\n' + ' return reinterpret_cast(%s);' % (ext_name, ext_name)) + if wsi_name(ext_name): + func_body.append('%s' % wsi_endif(ext_name)) + + func_body.append('\n return nullptr;') + func_body.append('}\n') + func_body.append("VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char* funcName)\n" "{\n" " PFN_vkVoidFunction addr;\n" " addr = intercept_core_instance_command(funcName);\n" " if (addr) {\n" - " return addr;" + " return addr;\n" " }\n" " if (instance == VK_NULL_HANDLE) {\n" " return NULL;\n" " }\n" ) - table_declared = False - if 0 != len(instance_extensions): - for (ext_enable, ext_list) in instance_extensions: - extra_space = "" - if 0 != len(ext_enable): - if ext_enable == 'msg_callback_get_proc_addr': - func_body.append(" layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);\n" - " addr = debug_report_get_instance_proc_addr(my_data->report_data, funcName);\n" - " if (addr) {\n" - " return addr;\n" - " }\n") - else: - if table_declared == False: - func_body.append(" VkLayerInstanceDispatchTable* pTable = get_dispatch_table(%s_instance_table_map, instance);" % self.layer_name) - table_declared = True - func_body.append(' if (instanceExtMap.size() != 0 && instanceExtMap[pTable].%s)' % ext_enable) - func_body.append(' {') - extra_space = " " - for ext_name in ext_list: - if wsi_name(ext_name): - func_body.append('%s' % wsi_ifdef(ext_name)) - func_body.append(' %sif (!strcmp("%s", funcName))\n' - ' return reinterpret_cast(%s);' % (extra_space, ext_name, ext_name)) - if wsi_name(ext_name): - func_body.append('%s' % wsi_endif(ext_name)) - if 0 != len(ext_enable): - func_body.append(' }\n') + for ext_enable, _ in instance_extensions: + func_body.append(' addr = intercept_%s_command(funcName, instance);' % ext_enable) + func_body.append(' if (addr)\n' + ' return addr;\n') func_body.append(" if (get_dispatch_table(%s_instance_table_map, instance)->GetInstanceProcAddr == NULL) {\n" " return NULL;\n" -- cgit v1.2.3 From 337507296b83b50985e18256b680ae34f6401863 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Fri, 13 May 2016 14:06:08 +0800 Subject: vk-layer-generate.py: simplify vkEnumerate*Properties generation Add _gen_layer_interface_v0_functions to generate all of them in one place. Get rid of deviceLayerProps as it is always the same as globalLayerProps. --- vk-layer-generate.py | 132 +++++++++++++++++++++------------------------------ 1 file changed, 54 insertions(+), 78 deletions(-) diff --git a/vk-layer-generate.py b/vk-layer-generate.py index 6d0e70fa..f48a1d3d 100755 --- a/vk-layer-generate.py +++ b/vk-layer-generate.py @@ -347,79 +347,56 @@ class Subcommand(object): r_body.append('}') return "\n".join(r_body) - def _gen_layer_get_global_extension_props(self, layer="object_tracker"): - ggep_body = [] - # generated layers do not provide any global extensions - ggep_body.append('%s' % self.lineinfo.get()) + def _gen_layer_interface_v0_functions(self): + body = [] + body.append('%s' % self.lineinfo.get()) + body.append('// loader-layer interface v0') + body.append('') - ggep_body.append('') - if self.layer_name == 'object_tracker': - ggep_body.append('static const VkExtensionProperties instance_extensions[] = {') - ggep_body.append(' {') - ggep_body.append(' VK_EXT_DEBUG_REPORT_EXTENSION_NAME,') - ggep_body.append(' VK_EXT_DEBUG_REPORT_SPEC_VERSION') - ggep_body.append(' }') - ggep_body.append('};') - ggep_body.append('VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties* pProperties)') - ggep_body.append('{') if self.layer_name == 'object_tracker': - ggep_body.append(' return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);') + body.append('static const VkExtensionProperties instance_extensions[] = {') + body.append(' {') + body.append(' VK_EXT_DEBUG_REPORT_EXTENSION_NAME,') + body.append(' VK_EXT_DEBUG_REPORT_SPEC_VERSION') + body.append(' }') + body.append('};') + body.append('') + + body.append('static const VkLayerProperties globalLayerProps = {') + body.append(' "VK_LAYER_LUNARG_%s",' % self.layer_name) + body.append(' VK_LAYER_API_VERSION, // specVersion') + body.append(' 1, // implementationVersion') + body.append(' "LunarG Validation Layer"') + body.append('};') + body.append('') else: - ggep_body.append(' return util_GetExtensionProperties(0, NULL, pCount, pProperties);') - ggep_body.append('}') - return "\n".join(ggep_body) - - def _gen_layer_get_global_layer_props(self, layer="object_tracker"): - ggep_body = [] - layer_name = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', layer) - layer_name = re.sub('([a-z0-9])([A-Z])', r'\1_\2', layer_name).lower() - ggep_body.append('%s' % self.lineinfo.get()) - ggep_body.append('static const VkLayerProperties globalLayerProps[] = {') - ggep_body.append(' {') - if self.layer_name in ['unique_objects']: - ggep_body.append(' "VK_LAYER_GOOGLE_%s",' % layer) - ggep_body.append(' VK_LAYER_API_VERSION, // specVersion') - ggep_body.append(' 1, // implementationVersion') - ggep_body.append(' "Google Validation Layer"') - else: - ggep_body.append(' "VK_LAYER_LUNARG_%s",' % layer) - ggep_body.append(' VK_LAYER_API_VERSION, // specVersion') - ggep_body.append(' 1, // implementationVersion') - ggep_body.append(' "LunarG Validation Layer"') - ggep_body.append(' }') - ggep_body.append('};') - ggep_body.append('') - ggep_body.append('%s' % self.lineinfo.get()) - ggep_body.append('') - ggep_body.append('VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties* pProperties)') - ggep_body.append('{') - ggep_body.append(' return util_GetLayerProperties(ARRAY_SIZE(globalLayerProps), globalLayerProps, pCount, pProperties);') - ggep_body.append('}') - return "\n".join(ggep_body) - - def _gen_layer_get_physical_device_layer_props(self, layer="object_tracker"): - gpdlp_body = [] - gpdlp_body.append('%s' % self.lineinfo.get()) - gpdlp_body.append('static const VkLayerProperties deviceLayerProps[] = {') - gpdlp_body.append(' {') - if self.layer_name in ['unique_objects']: - gpdlp_body.append(' "VK_LAYER_GOOGLE_%s",' % layer) - gpdlp_body.append(' VK_LAYER_API_VERSION, // specVersion') - gpdlp_body.append(' 1, // implementationVersion') - gpdlp_body.append(' "Google Validation Layer"') + body.append('static const VkLayerProperties globalLayerProps = {') + body.append(' "VK_LAYER_GOOGLE_%s",' % self.layer_name) + body.append(' VK_LAYER_API_VERSION, // specVersion') + body.append(' 1, // implementationVersion') + body.append(' "Google Validation Layer"') + body.append('};') + body.append('') + + body.append('VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties* pProperties)') + body.append('{') + if self.layer_name == 'object_tracker': + body.append(' return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);') else: - gpdlp_body.append(' "VK_LAYER_LUNARG_%s",' % layer) - gpdlp_body.append(' VK_LAYER_API_VERSION, // specVersion') - gpdlp_body.append(' 1, // implementationVersion') - gpdlp_body.append(' "LunarG Validation Layer"') - gpdlp_body.append(' }') - gpdlp_body.append('};') - gpdlp_body.append('VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties* pProperties)') - gpdlp_body.append('{') - gpdlp_body.append(' return util_GetLayerProperties(ARRAY_SIZE(deviceLayerProps), deviceLayerProps, pCount, pProperties);') - gpdlp_body.append('}') - gpdlp_body.append('') - return "\n".join(gpdlp_body) + body.append(' return util_GetExtensionProperties(0, NULL, pCount, pProperties);') + body.append('}') + body.append('') + body.append('VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties* pProperties)') + body.append('{') + body.append(' return util_GetLayerProperties(1, &globalLayerProps, pCount, pProperties);') + body.append('}') + body.append('') + body.append('VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties* pProperties)') + body.append('{') + body.append(' return util_GetLayerProperties(1, &globalLayerProps, pCount, pProperties);') + body.append('}') + + return "\n".join(body) def _generate_dispatch_entrypoints(self, qual=""): if qual: @@ -429,7 +406,10 @@ class Subcommand(object): intercepted = [] for proto in self.protos: if proto.name in ["GetDeviceProcAddr", - "GetInstanceProcAddr"]: + "GetInstanceProcAddr", + "EnumerateInstanceExtensionProperties", + "EnumerateInstanceLayerProperties", + "EnumerateDeviceLayerProperties"]: intercepted.append(proto) else: intercept = self.generate_intercept(proto, qual) @@ -443,12 +423,6 @@ class Subcommand(object): intercept = self._gen_debug_report_msg() elif 'CreateDevice' == proto.name: funcs.append('/* CreateDevice HERE */') - elif 'EnumerateInstanceExtensionProperties' == proto.name: - intercept = self._gen_layer_get_global_extension_props(self.layer_name) - elif 'EnumerateInstanceLayerProperties' == proto.name: - intercept = self._gen_layer_get_global_layer_props(self.layer_name) - elif 'EnumerateDeviceLayerProperties' == proto.name: - intercept = self._gen_layer_get_physical_device_layer_props(self.layer_name) if intercept is not None: funcs.append(intercept) @@ -1330,7 +1304,8 @@ class ObjectTrackerSubcommand(Subcommand): self._generate_dispatch_entrypoints("VK_LAYER_EXPORT"), self._generate_extensions(), self._generate_layer_gpa_function(extensions, - instance_extensions)] + instance_extensions), + self._gen_layer_interface_v0_functions()] return "\n\n".join(body) class UniqueObjectsSubcommand(Subcommand): @@ -1630,7 +1605,8 @@ class UniqueObjectsSubcommand(Subcommand): body = [self._generate_dispatch_entrypoints("VK_LAYER_EXPORT"), self._generate_layer_gpa_function(extensions, - instance_extensions)] + instance_extensions), + self._gen_layer_interface_v0_functions()] return "\n\n".join(body) def main(): -- cgit v1.2.3 From 829634f559bfed6fc194010ff190eb6c13304ceb Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Fri, 13 May 2016 14:07:36 +0800 Subject: vk-layer-generate.py: put layer functions into a namespace Move everything into namespace object_tracker and unique_objects respectively. I had to add some wrappers to make everything work. --- layers/object_tracker.h | 6 ++++-- layers/unique_objects.h | 4 ++++ vk-layer-generate.py | 44 ++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/layers/object_tracker.h b/layers/object_tracker.h index 30a1f29f..623600ae 100644 --- a/layers/object_tracker.h +++ b/layers/object_tracker.h @@ -28,6 +28,8 @@ #include "vk_layer_table.h" #include "vk_layer_utils.h" +namespace object_tracker { + // Object Tracker ERROR codes enum OBJECT_TRACK_ERROR { OBJTRACK_NONE, // Used for INFO & other non-error messages @@ -107,8 +109,6 @@ static uint64_t numObjs[NUM_OBJECT_TYPES] = {0}; static uint64_t numTotalObjs = 0; std::vector queue_family_properties; -template layer_data *get_my_data_ptr(void *data_key, std::unordered_map &data_map); - // // Internal Object Tracker Functions // @@ -1059,3 +1059,5 @@ VkResult explicit_CreateComputePipelines(VkDevice device, VkPipelineCache pipeli lock.unlock(); return result; } + +} // namespace object_tracker diff --git a/layers/unique_objects.h b/layers/unique_objects.h index 6c2c2e3c..0da90a19 100644 --- a/layers/unique_objects.h +++ b/layers/unique_objects.h @@ -39,6 +39,8 @@ #include "vk_safe_struct.h" #include "vk_layer_utils.h" +namespace unique_objects { + // All increments must be guarded by global_lock static uint64_t global_unique_id = 1; @@ -393,3 +395,5 @@ VkResult explicit_GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchai } return result; } + +} // namespace unique_objects diff --git a/vk-layer-generate.py b/vk-layer-generate.py index f48a1d3d..3d45a694 100755 --- a/vk-layer-generate.py +++ b/vk-layer-generate.py @@ -347,6 +347,31 @@ class Subcommand(object): r_body.append('}') return "\n".join(r_body) + def _gen_layer_logging_workaround(self): + body = [] + body.append('%s' % self.lineinfo.get()) + body.append('// vk_layer_logging.h expects these to be defined') + body.append('') + body.append('VKAPI_ATTR VkResult VKAPI_CALL') + body.append('vkCreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,') + body.append(' const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pMsgCallback) {') + body.append(' return %s::vkCreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);' % self.layer_name) + body.append('}') + body.append('') + body.append('VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance,') + body.append(' VkDebugReportCallbackEXT msgCallback,') + body.append(' const VkAllocationCallbacks *pAllocator) {') + body.append(' %s::vkDestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);' % self.layer_name) + body.append('}') + body.append('') + body.append('VKAPI_ATTR void VKAPI_CALL') + body.append('vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t object,') + body.append(' size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {') + body.append(' %s::vkDebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);' % self.layer_name) + body.append('}') + + return "\n".join(body) + def _gen_layer_interface_v0_functions(self): body = [] body.append('%s' % self.lineinfo.get()) @@ -395,6 +420,16 @@ class Subcommand(object): body.append('{') body.append(' return util_GetLayerProperties(1, &globalLayerProps, pCount, pProperties);') body.append('}') + body.append('') + body.append('VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName)') + body.append('{') + body.append(' return %s::vkGetDeviceProcAddr(dev, funcName);' % self.layer_name) + body.append('}') + body.append('') + body.append('VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName)') + body.append('{') + body.append(' return %s::vkGetInstanceProcAddr(instance, funcName);' % self.layer_name) + body.append('}') return "\n".join(body) @@ -1297,7 +1332,8 @@ class ObjectTrackerSubcommand(Subcommand): print('Error: Undefined DisplayServer') instance_extensions=[] - body = [self.generate_maps(), + body = ["namespace %s {" % self.layer_name, + self.generate_maps(), self.generate_procs(), self.generate_destroy_instance(), self.generate_destroy_device(), @@ -1305,6 +1341,8 @@ class ObjectTrackerSubcommand(Subcommand): self._generate_extensions(), self._generate_layer_gpa_function(extensions, instance_extensions), + "} // namespace %s" % self.layer_name, + self._gen_layer_logging_workaround(), self._gen_layer_interface_v0_functions()] return "\n\n".join(body) @@ -1603,9 +1641,11 @@ class UniqueObjectsSubcommand(Subcommand): print('Error: Undefined DisplayServer') instance_extensions=[] - body = [self._generate_dispatch_entrypoints("VK_LAYER_EXPORT"), + body = ["namespace %s {" % self.layer_name, + self._generate_dispatch_entrypoints("VK_LAYER_EXPORT"), self._generate_layer_gpa_function(extensions, instance_extensions), + "} // namespace %s" % self.layer_name, self._gen_layer_interface_v0_functions()] return "\n\n".join(body) -- cgit v1.2.3 From 75a563e815c2606f61db88b9e1ed3c51ca7dbe1d Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Mon, 16 May 2016 07:43:38 +0800 Subject: vk-layer-generate.py: no interface functions in layer functions Move handling of interface functions out of layers' GetInstanceProcAddr to v0's vkGetInstanceProcAddr. --- vk-layer-generate.py | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/vk-layer-generate.py b/vk-layer-generate.py index 3d45a694..7d7257be 100755 --- a/vk-layer-generate.py +++ b/vk-layer-generate.py @@ -428,6 +428,15 @@ class Subcommand(object): body.append('') body.append('VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName)') body.append('{') + body.append(' if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties"))') + body.append(' return reinterpret_cast(vkEnumerateInstanceLayerProperties);') + body.append(' if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties"))') + body.append(' return reinterpret_cast(vkEnumerateDeviceLayerProperties);') + body.append(' if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties"))') + body.append(' return reinterpret_cast(vkEnumerateInstanceExtensionProperties);') + body.append(' if (!strcmp(funcName, "vkGetInstanceProcAddr"))') + body.append(' return reinterpret_cast(vkGetInstanceProcAddr);') + body.append('') body.append(' return %s::vkGetInstanceProcAddr(instance, funcName);' % self.layer_name) body.append('}') @@ -440,11 +449,13 @@ class Subcommand(object): funcs = [] intercepted = [] for proto in self.protos: - if proto.name in ["GetDeviceProcAddr", - "GetInstanceProcAddr", - "EnumerateInstanceExtensionProperties", + if proto.name in ["EnumerateInstanceExtensionProperties", "EnumerateInstanceLayerProperties", "EnumerateDeviceLayerProperties"]: + # the layer do not need to define these + continue + elif proto.name in ["GetDeviceProcAddr", + "GetInstanceProcAddr"]: intercepted.append(proto) else: intercept = self.generate_intercept(proto, qual) @@ -492,6 +503,11 @@ class Subcommand(object): body.append("{") body.append(generate_get_proc_addr_check("name")) body.append("") + body.append(" // we should never be queried for these commands") + body.append(" assert(strcmp(name, \"vkEnumerateInstanceLayerProperties\") &&") + body.append(" strcmp(name, \"vkEnumerateInstanceExtensionProperties\") &&") + body.append(" strcmp(name, \"vkEnumerateDeviceLayerProperties\"));") + body.append("") body.append(" name += 2;") body.append(" %s" % "\n ".join(instance_lookups)) body.append("") -- cgit v1.2.3 From 535e3f7ab627aabc76077151818ac0af94d62769 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Fri, 13 May 2016 14:37:49 +0800 Subject: vk-layer-generate.py: drop vk prefix for layer functions Drop VK_LAYER_EXPORT as well. --- vk-layer-generate.py | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/vk-layer-generate.py b/vk-layer-generate.py index 7d7257be..ceb3d2b4 100755 --- a/vk-layer-generate.py +++ b/vk-layer-generate.py @@ -289,7 +289,7 @@ class Subcommand(object): def _gen_create_msg_callback(self): r_body = [] r_body.append('%s' % self.lineinfo.get()) - r_body.append('VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(') + r_body.append('VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(') r_body.append(' VkInstance instance,') r_body.append(' const VkDebugReportCallbackCreateInfoEXT* pCreateInfo,') r_body.append(' const VkAllocationCallbacks* pAllocator,') @@ -320,7 +320,7 @@ class Subcommand(object): def _gen_destroy_msg_callback(self): r_body = [] r_body.append('%s' % self.lineinfo.get()) - r_body.append('VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback, const VkAllocationCallbacks *pAllocator)') + r_body.append('VKAPI_ATTR void VKAPI_CALL DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback, const VkAllocationCallbacks *pAllocator)') r_body.append('{') # Switch to this code section for the new per-instance storage and debug callbacks if self.layer_name in ['object_tracker', 'unique_objects']: @@ -336,7 +336,7 @@ class Subcommand(object): def _gen_debug_report_msg(self): r_body = [] r_body.append('%s' % self.lineinfo.get()) - r_body.append('VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg)') + r_body.append('VKAPI_ATTR void VKAPI_CALL DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg)') r_body.append('{') # Switch to this code section for the new per-instance storage and debug callbacks if self.layer_name == 'object_tracker': @@ -355,19 +355,19 @@ class Subcommand(object): body.append('VKAPI_ATTR VkResult VKAPI_CALL') body.append('vkCreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,') body.append(' const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pMsgCallback) {') - body.append(' return %s::vkCreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);' % self.layer_name) + body.append(' return %s::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback);' % self.layer_name) body.append('}') body.append('') body.append('VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance,') body.append(' VkDebugReportCallbackEXT msgCallback,') body.append(' const VkAllocationCallbacks *pAllocator) {') - body.append(' %s::vkDestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);' % self.layer_name) + body.append(' %s::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator);' % self.layer_name) body.append('}') body.append('') body.append('VKAPI_ATTR void VKAPI_CALL') body.append('vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t object,') body.append(' size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg) {') - body.append(' %s::vkDebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);' % self.layer_name) + body.append(' %s::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg);' % self.layer_name) body.append('}') return "\n".join(body) @@ -423,7 +423,7 @@ class Subcommand(object): body.append('') body.append('VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName)') body.append('{') - body.append(' return %s::vkGetDeviceProcAddr(dev, funcName);' % self.layer_name) + body.append(' return %s::GetDeviceProcAddr(dev, funcName);' % self.layer_name) body.append('}') body.append('') body.append('VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName)') @@ -437,7 +437,7 @@ class Subcommand(object): body.append(' if (!strcmp(funcName, "vkGetInstanceProcAddr"))') body.append(' return reinterpret_cast(vkGetInstanceProcAddr);') body.append('') - body.append(' return %s::vkGetInstanceProcAddr(instance, funcName);' % self.layer_name) + body.append(' return %s::GetInstanceProcAddr(instance, funcName);' % self.layer_name) body.append('}') return "\n".join(body) @@ -456,6 +456,7 @@ class Subcommand(object): continue elif proto.name in ["GetDeviceProcAddr", "GetInstanceProcAddr"]: + funcs.append(proto.c_func(attr="VKAPI") + ';') intercepted.append(proto) else: intercept = self.generate_intercept(proto, qual) @@ -475,16 +476,15 @@ class Subcommand(object): if not "KHR" in proto.name: intercepted.append(proto) - prefix="vk" instance_lookups = [] device_lookups = [] for proto in intercepted: if proto_is_global(proto): instance_lookups.append("if (!strcmp(name, \"%s\"))" % proto.name) - instance_lookups.append(" return (PFN_vkVoidFunction) %s%s;" % (prefix, proto.name)) + instance_lookups.append(" return (PFN_vkVoidFunction) %s;" % (proto.name)) else: device_lookups.append("if (!strcmp(name, \"%s\"))" % proto.name) - device_lookups.append(" return (PFN_vkVoidFunction) %s%s;" % (prefix, proto.name)) + device_lookups.append(" return (PFN_vkVoidFunction) %s;" % (proto.name)) # add customized intercept_core_device_command body = [] @@ -541,11 +541,11 @@ class Subcommand(object): for ext_name in ext_list: func_body.append(' if (!strcmp("%s", name))\n' - ' return reinterpret_cast(%s);' % (ext_name, ext_name)) + ' return reinterpret_cast(%s);' % (ext_name, ext_name[2:])) func_body.append('\n return nullptr;') func_body.append('}\n') - func_body.append("VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char* funcName)\n" + func_body.append("VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char* funcName)\n" "{\n" " PFN_vkVoidFunction addr;\n" " addr = intercept_core_device_command(funcName);\n" @@ -579,14 +579,14 @@ class Subcommand(object): if wsi_name(ext_name): func_body.append('%s' % wsi_ifdef(ext_name)) func_body.append(' if (!strcmp("%s", name))\n' - ' return reinterpret_cast(%s);' % (ext_name, ext_name)) + ' return reinterpret_cast(%s);' % (ext_name, ext_name[2:])) if wsi_name(ext_name): func_body.append('%s' % wsi_endif(ext_name)) func_body.append('\n return nullptr;') func_body.append('}\n') - func_body.append("VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char* funcName)\n" + func_body.append("VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char* funcName)\n" "{\n" " PFN_vkVoidFunction addr;\n" " addr = intercept_core_instance_command(funcName);\n" @@ -611,7 +611,7 @@ class Subcommand(object): return "\n".join(func_body) else: func_body.append('%s' % self.lineinfo.get()) - func_body.append("VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char* funcName)\n" + func_body.append("VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char* funcName)\n" "{\n" " PFN_vkVoidFunction addr;\n") func_body.append("\n" @@ -644,7 +644,7 @@ class Subcommand(object): " }\n" "}\n") func_body.append('%s' % self.lineinfo.get()) - func_body.append("VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char* funcName)\n" + func_body.append("VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char* funcName)\n" "{\n" " PFN_vkVoidFunction addr;\n" ) @@ -876,7 +876,7 @@ class ObjectTrackerSubcommand(Subcommand): def generate_destroy_instance(self): gedi_txt = [] gedi_txt.append('%s' % self.lineinfo.get()) - gedi_txt.append('VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyInstance(') + gedi_txt.append('VKAPI_ATTR void VKAPI_CALL DestroyInstance(') gedi_txt.append('VkInstance instance,') gedi_txt.append('const VkAllocationCallbacks* pAllocator)') gedi_txt.append('{') @@ -963,7 +963,7 @@ class ObjectTrackerSubcommand(Subcommand): def generate_destroy_device(self): gedd_txt = [] gedd_txt.append('%s' % self.lineinfo.get()) - gedd_txt.append('VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDevice(') + gedd_txt.append('VKAPI_ATTR void VKAPI_CALL DestroyDevice(') gedd_txt.append('VkDevice device,') gedd_txt.append('const VkAllocationCallbacks* pAllocator)') gedd_txt.append('{') @@ -1132,7 +1132,7 @@ class ObjectTrackerSubcommand(Subcommand): "DestroySwapchainKHR", "GetSwapchainImagesKHR" ] - decl = proto.c_func(prefix="vk", attr="VKAPI") + decl = proto.c_func(attr="VKAPI") param0_name = proto.params[0].name using_line = '' create_line = '' @@ -1353,7 +1353,7 @@ class ObjectTrackerSubcommand(Subcommand): self.generate_procs(), self.generate_destroy_instance(), self.generate_destroy_device(), - self._generate_dispatch_entrypoints("VK_LAYER_EXPORT"), + self._generate_dispatch_entrypoints(), self._generate_extensions(), self._generate_layer_gpa_function(extensions, instance_extensions), @@ -1473,7 +1473,7 @@ class UniqueObjectsSubcommand(Subcommand): post_call_txt = '' # code following call down chain such to wrap newly created ndos, or destroy local wrap struct funcs = [] indent = ' ' # indent level for generated code - decl = proto.c_func(prefix="vk", attr="VKAPI") + decl = proto.c_func(attr="VKAPI") # A few API cases that are manual code # TODO : Special case Create*Pipelines funcs to handle creating multiple unique objects explicit_object_tracker_functions = ['GetSwapchainImagesKHR', @@ -1658,7 +1658,7 @@ class UniqueObjectsSubcommand(Subcommand): instance_extensions=[] body = ["namespace %s {" % self.layer_name, - self._generate_dispatch_entrypoints("VK_LAYER_EXPORT"), + self._generate_dispatch_entrypoints(), self._generate_layer_gpa_function(extensions, instance_extensions), "} // namespace %s" % self.layer_name, -- cgit v1.2.3 From bf301faff7f013958051788f2f161003b1c22b59 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Tue, 17 May 2016 07:39:31 +0800 Subject: vk-layer-generate.py: assert valid instance/device in vkGet*ProcAddr "device" should be always valid in vkGetDeviceProcAddr. "instance" should be valid in vkGetInstanceProcAddr when the command is not intercepted by intercept_core_instance_command. --- vk-layer-generate.py | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/vk-layer-generate.py b/vk-layer-generate.py index ceb3d2b4..5f074477 100755 --- a/vk-layer-generate.py +++ b/vk-layer-generate.py @@ -551,9 +551,7 @@ class Subcommand(object): " addr = intercept_core_device_command(funcName);\n" " if (addr)\n" " return addr;\n" - " if (device == VK_NULL_HANDLE) {\n" - " return NULL;\n" - " }\n") + " assert(device);\n") for ext_enable, _ in extensions: func_body.append(' addr = intercept_%s_command(funcName, device);' % ext_enable) func_body.append(' if (addr)\n' @@ -593,9 +591,7 @@ class Subcommand(object): " if (addr) {\n" " return addr;\n" " }\n" - " if (instance == VK_NULL_HANDLE) {\n" - " return NULL;\n" - " }\n" + " assert(instance);\n" ) for ext_enable, _ in instance_extensions: @@ -619,9 +615,7 @@ class Subcommand(object): " addr = intercept_core_device_command(funcName);\n" " if (addr)\n" " return addr;" % self.layer_name) - func_body.append(" if (device == VK_NULL_HANDLE) {\n" - " return NULL;\n" - " }\n") + func_body.append(" assert(device);\n") func_body.append('') func_body.append(' VkLayerDispatchTable *pDisp = device_dispatch_table(device);') if 0 != len(extensions): @@ -653,9 +647,7 @@ class Subcommand(object): " addr = intercept_core_instance_command(funcName);\n" " if (addr)\n" " return addr;" % self.layer_name) - func_body.append(" if (instance == VK_NULL_HANDLE) {\n" - " return NULL;\n" - " }\n") + func_body.append(" assert(instance);\n") func_body.append("") func_body.append(" VkLayerInstanceDispatchTable* pTable = instance_dispatch_table(instance);\n") if 0 != len(instance_extensions): -- cgit v1.2.3 From 3a95297e852daec72bd7bad002eeab34eead22c2 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Tue, 17 May 2016 07:43:59 +0800 Subject: vk-layer-generate.py: handle device commands in GetInstanceProcAddr Per commit 5bf16c33b9c1f38fc467d94716f276620a265327, extension check is bypassed in GetInstanceProcAddr for VK_KHR_swapchain functions. --- vk-layer-generate.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/vk-layer-generate.py b/vk-layer-generate.py index 5f074477..24f3c93b 100755 --- a/vk-layer-generate.py +++ b/vk-layer-generate.py @@ -535,9 +535,11 @@ class Subcommand(object): func_body.append('%s' % self.lineinfo.get()) func_body.append('static inline PFN_vkVoidFunction intercept_%s_command(const char *name, VkDevice dev)' % ext_enable) func_body.append('{') - func_body.append(' layer_data *my_data = get_my_data_ptr(get_dispatch_key(dev), layer_data_map);') - func_body.append(' if (!my_data->%s)' % ext_enable) - func_body.append(' return nullptr;\n') + func_body.append(' if (dev) {') + func_body.append(' layer_data *my_data = get_my_data_ptr(get_dispatch_key(dev), layer_data_map);') + func_body.append(' if (!my_data->%s)' % ext_enable) + func_body.append(' return nullptr;') + func_body.append(' }\n') for ext_name in ext_list: func_body.append(' if (!strcmp("%s", name))\n' @@ -588,7 +590,16 @@ class Subcommand(object): "{\n" " PFN_vkVoidFunction addr;\n" " addr = intercept_core_instance_command(funcName);\n" - " if (addr) {\n" + " if (!addr) {\n" + " addr = intercept_core_device_command(funcName);\n" + " }") + + for ext_enable, _ in extensions: + func_body.append(" if (!addr) {\n" + " addr = intercept_%s_command(funcName, VkDevice(VK_NULL_HANDLE));\n" + " }" % ext_enable) + + func_body.append(" if (addr) {\n" " return addr;\n" " }\n" " assert(instance);\n" -- cgit v1.2.3 From a9b5ac2c9c02a4228da2f0bb1484e64d7e4aaf90 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Tue, 17 May 2016 07:57:15 +0800 Subject: object_tracker: avoid invalid GIPA call in vkCreateDevice Save VkInstance in layer_data so that we query vkCreateDevice with a valid instance. --- layers/object_tracker.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/layers/object_tracker.h b/layers/object_tracker.h index 623600ae..333775ae 100644 --- a/layers/object_tracker.h +++ b/layers/object_tracker.h @@ -71,6 +71,8 @@ typedef uint64_t (*OBJ_TRACK_GET_OBJECT_COUNT)(VkDevice); typedef uint64_t (*OBJ_TRACK_GET_OBJECTS_OF_TYPE_COUNT)(VkDevice, VkDebugReportObjectTypeEXT); struct layer_data { + VkInstance instance; + debug_report_data *report_data; // TODO: put instance data here std::vector logging_callback; @@ -617,6 +619,7 @@ VkResult explicit_CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const } layer_data *my_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map); + my_data->instance = *pInstance; initInstanceTable(*pInstance, fpGetInstanceProcAddr, object_tracker_instance_table_map); VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(object_tracker_instance_table_map, *pInstance); @@ -650,12 +653,13 @@ void explicit_GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice gpu, uint3 VkResult explicit_CreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) { std::lock_guard lock(global_lock); + layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(gpu), layer_data_map); VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO); assert(chain_info->u.pLayerInfo); PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr; PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr; - PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(NULL, "vkCreateDevice"); + PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice"); if (fpCreateDevice == NULL) { return VK_ERROR_INITIALIZATION_FAILED; } @@ -668,7 +672,6 @@ VkResult explicit_CreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo *p return result; } - layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(gpu), layer_data_map); layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map); my_device_data->report_data = layer_debug_report_create_device(my_instance_data->report_data, *pDevice); -- cgit v1.2.3 From 3a47bcd51ee269a8526edc70a53c28eee18be831 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Tue, 17 May 2016 07:57:15 +0800 Subject: unique_objects: avoid invalid GIPA call in vkCreateDevice Save VkInstance in layer_data so that we query vkCreateDevice with a valid instance. --- layers/unique_objects.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/layers/unique_objects.h b/layers/unique_objects.h index 0da90a19..9abf240c 100644 --- a/layers/unique_objects.h +++ b/layers/unique_objects.h @@ -45,6 +45,8 @@ namespace unique_objects { static uint64_t global_unique_id = 1; struct layer_data { + VkInstance instance; + bool wsi_enabled; std::unordered_map unique_id_mapping; // Map uniqueID to actual object handle VkPhysicalDevice gpu; @@ -162,6 +164,8 @@ VkResult explicit_CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const return result; } + layer_data *my_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map); + my_data->instance = *pInstance; initInstanceTable(*pInstance, fpGetInstanceProcAddr, unique_objects_instance_table_map); createInstanceRegisterExtensions(pCreateInfo, *pInstance); @@ -194,12 +198,13 @@ static void createDeviceRegisterExtensions(const VkDeviceCreateInfo *pCreateInfo VkResult explicit_CreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) { + layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(gpu), layer_data_map); VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO); assert(chain_info->u.pLayerInfo); PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr; PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr; - PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(NULL, "vkCreateDevice"); + PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice"); if (fpCreateDevice == NULL) { return VK_ERROR_INITIALIZATION_FAILED; } -- cgit v1.2.3 From 1cdb908074c4f2b28aff578f8b170a194a748c90 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Mon, 16 May 2016 08:58:07 +0800 Subject: threading: move vkEnumerate*Properties around Move them toward the end of the file. --- layers/threading.cpp | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/layers/threading.cpp b/layers/threading.cpp index 4d9fca0d..454b9c43 100644 --- a/layers/threading.cpp +++ b/layers/threading.cpp @@ -159,27 +159,26 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDevice(VkDevice device, cons static const VkExtensionProperties threading_extensions[] = { {VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}}; -VK_LAYER_EXPORT VkResult VKAPI_CALL -vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { - return util_GetExtensionProperties(ARRAY_SIZE(threading_extensions), threading_extensions, pCount, pProperties); -} - static const VkLayerProperties globalLayerProps[] = {{ "VK_LAYER_GOOGLE_threading", VK_LAYER_API_VERSION, // specVersion 1, "Google Validation Layer", }}; -VK_LAYER_EXPORT VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) { - return util_GetLayerProperties(ARRAY_SIZE(globalLayerProps), globalLayerProps, pCount, pProperties); -} - static const VkLayerProperties deviceLayerProps[] = {{ "VK_LAYER_GOOGLE_threading", VK_LAYER_API_VERSION, // specVersion 1, "Google Validation Layer", }}; +static inline PFN_vkVoidFunction layer_intercept_proc(const char *name) { + for (int i = 0; i < sizeof(procmap) / sizeof(procmap[0]); i++) { + if (!strcmp(name, procmap[i].name)) + return procmap[i].pFunc; + } + return NULL; +} + VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { @@ -193,19 +192,6 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionPropert } } -VK_LAYER_EXPORT VkResult VKAPI_CALL -vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) { - return util_GetLayerProperties(ARRAY_SIZE(deviceLayerProps), deviceLayerProps, pCount, pProperties); -} - -static inline PFN_vkVoidFunction layer_intercept_proc(const char *name) { - for (int i = 0; i < sizeof(procmap) / sizeof(procmap[0]); i++) { - if (!strcmp(name, procmap[i].name)) - return procmap[i].pFunc; - } - return NULL; -} - static inline PFN_vkVoidFunction layer_intercept_instance_proc(const char *name) { if (!name || name[0] != 'v' || name[1] != 'k') return NULL; @@ -346,3 +332,17 @@ void VKAPI_CALL vkFreeCommandBuffers(VkDevice device, VkCommandPool commandPool, command_pool_map.erase(pCommandBuffers[index]); } } + +VK_LAYER_EXPORT VkResult VKAPI_CALL +vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { + return util_GetExtensionProperties(ARRAY_SIZE(threading_extensions), threading_extensions, pCount, pProperties); +} + +VK_LAYER_EXPORT VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) { + return util_GetLayerProperties(ARRAY_SIZE(globalLayerProps), globalLayerProps, pCount, pProperties); +} + +VK_LAYER_EXPORT VkResult VKAPI_CALL +vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) { + return util_GetLayerProperties(ARRAY_SIZE(deviceLayerProps), deviceLayerProps, pCount, pProperties); +} -- cgit v1.2.3 From 178a141e98658884c012bc40d02f2311d33c7e9d Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Mon, 16 May 2016 11:48:11 +0800 Subject: threading: decorate Vulkan commands with VKAPI_ATTR --- genvk.py | 2 +- layers/threading.cpp | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/genvk.py b/genvk.py index 7ea70c28..993477cd 100755 --- a/genvk.py +++ b/genvk.py @@ -280,7 +280,7 @@ buildList = [ protectFeature = False, protectProto = True, protectProtoStr = 'VK_PROTOTYPES', - apicall = '', + apicall = 'VKAPI_ATTR ', apientry = 'VKAPI_CALL ', apientryp = 'VKAPI_PTR *', alignFuncParam = 48, diff --git a/layers/threading.cpp b/layers/threading.cpp index 454b9c43..d98018c9 100644 --- a/layers/threading.cpp +++ b/layers/threading.cpp @@ -217,7 +217,7 @@ static inline PFN_vkVoidFunction layer_intercept_instance_proc(const char *name) return NULL; } -VK_LAYER_EXPORT PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char *funcName) { +VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char *funcName) { PFN_vkVoidFunction addr; layer_data *dev_data; if (device == VK_NULL_HANDLE) { @@ -236,7 +236,7 @@ VK_LAYER_EXPORT PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice devic return pTable->GetDeviceProcAddr(device, funcName); } -VK_LAYER_EXPORT PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) { +VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) { PFN_vkVoidFunction addr; layer_data *my_data; @@ -287,7 +287,7 @@ vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT ca finishWriteObject(my_data, callback); } -VkResult VKAPI_CALL +VKAPI_ATTR VkResult VKAPI_CALL vkAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo, VkCommandBuffer *pCommandBuffers) { dispatch_key key = get_dispatch_key(device); layer_data *my_data = get_my_data_ptr(key, layer_data_map); @@ -311,8 +311,8 @@ vkAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAl return result; } -void VKAPI_CALL vkFreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount, - const VkCommandBuffer *pCommandBuffers) { +VKAPI_ATTR void VKAPI_CALL vkFreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount, + const VkCommandBuffer *pCommandBuffers) { dispatch_key key = get_dispatch_key(device); layer_data *my_data = get_my_data_ptr(key, layer_data_map); VkLayerDispatchTable *pTable = my_data->device_dispatch_table; @@ -333,16 +333,16 @@ void VKAPI_CALL vkFreeCommandBuffers(VkDevice device, VkCommandPool commandPool, } } -VK_LAYER_EXPORT VkResult VKAPI_CALL +VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { return util_GetExtensionProperties(ARRAY_SIZE(threading_extensions), threading_extensions, pCount, pProperties); } -VK_LAYER_EXPORT VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) { +VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) { return util_GetLayerProperties(ARRAY_SIZE(globalLayerProps), globalLayerProps, pCount, pProperties); } -VK_LAYER_EXPORT VkResult VKAPI_CALL +VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) { return util_GetLayerProperties(ARRAY_SIZE(deviceLayerProps), deviceLayerProps, pCount, pProperties); } -- cgit v1.2.3 From 89bb820f7aae5c9f806059591c70a3708c686abb Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Mon, 16 May 2016 09:58:50 +0800 Subject: threading: put layer functions into a namespace Put all layer fucntions/data into threading namespace. I had to add some wrappers to make everything work. This also removes vkEnumerateInstance*Properties from procmap. procmap is used in vkGetDeviceProcAddr and it should not contain vkEnumerateInstance*Properties in the first place. --- generator.py | 26 ++++++++++++++++---------- layers/threading.cpp | 46 +++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 59 insertions(+), 13 deletions(-) diff --git a/generator.py b/generator.py index eead2119..abb0dbf1 100644 --- a/generator.py +++ b/generator.py @@ -2629,15 +2629,13 @@ class ThreadOutputGenerator(OutputGenerator): OutputGenerator.beginFile(self, genOpts) # C-specific # - # Multiple inclusion protection & C++ wrappers. + # Multiple inclusion protection & C++ namespace. if (genOpts.protectFile and self.genOpts.filename): headerSym = '__' + re.sub('\.h', '_h_', os.path.basename(self.genOpts.filename)) write('#ifndef', headerSym, file=self.outFile) write('#define', headerSym, '1', file=self.outFile) self.newline() - write('#ifdef __cplusplus', file=self.outFile) - write('extern "C" {', file=self.outFile) - write('#endif', file=self.outFile) + write('namespace threading {', file=self.outFile) self.newline() # # User-supplied prefix text, if any (list of strings) @@ -2646,7 +2644,7 @@ class ThreadOutputGenerator(OutputGenerator): write(s, file=self.outFile) def endFile(self): # C-specific - # Finish C++ wrapper and multiple inclusion protection + # Finish C++ namespace and multiple inclusion protection self.newline() # record intercepted procedures write('// intercepts', file=self.outFile) @@ -2654,9 +2652,7 @@ class ThreadOutputGenerator(OutputGenerator): write('\n'.join(self.intercepts), file=self.outFile) write('};\n', file=self.outFile) self.newline() - write('#ifdef __cplusplus', file=self.outFile) - write('}', file=self.outFile) - write('#endif', file=self.outFile) + write('} // namespace threading', file=self.outFile) if (self.genOpts.protectFile and self.genOpts.filename): self.newline() write('#endif', file=self.outFile) @@ -2743,6 +2739,14 @@ class ThreadOutputGenerator(OutputGenerator): # # Command generation def genCmd(self, cmdinfo, name): + # Commands shadowed by interface functions and are not implemented + interface_functions = [ + 'vkEnumerateInstanceLayerProperties', + 'vkEnumerateInstanceExtensionProperties', + 'vkEnumerateDeviceLayerProperties', + ] + if name in interface_functions: + return special_functions = [ 'vkGetDeviceProcAddr', 'vkGetInstanceProcAddr', @@ -2750,14 +2754,16 @@ class ThreadOutputGenerator(OutputGenerator): 'vkDestroyDevice', 'vkCreateInstance', 'vkDestroyInstance', - 'vkEnumerateInstanceLayerProperties', - 'vkEnumerateInstanceExtensionProperties', 'vkAllocateCommandBuffers', 'vkFreeCommandBuffers', 'vkCreateDebugReportCallbackEXT', 'vkDestroyDebugReportCallbackEXT', ] if name in special_functions: + decls = self.makeCDecls(cmdinfo.elem) + self.appendSection('command', '') + self.appendSection('command', '// declare only') + self.appendSection('command', decls[0]) self.intercepts += [ ' {"%s", reinterpret_cast(%s)},' % (name,name) ] return if "KHR" in name: diff --git a/layers/threading.cpp b/layers/threading.cpp index d98018c9..85ca669a 100644 --- a/layers/threading.cpp +++ b/layers/threading.cpp @@ -39,6 +39,8 @@ #include "thread_check.h" +namespace threading { + static void initThreading(layer_data *my_data, const VkAllocationCallbacks *pAllocator) { layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "google_threading"); @@ -333,16 +335,54 @@ VKAPI_ATTR void VKAPI_CALL vkFreeCommandBuffers(VkDevice device, VkCommandPool c } } +} // namespace threading + +// vk_layer_logging.h expects these to be defined + +VKAPI_ATTR VkResult VKAPI_CALL +vkCreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo, + const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pMsgCallback) { + return threading::vkCreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback); +} + +VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, + VkDebugReportCallbackEXT msgCallback, + const VkAllocationCallbacks *pAllocator) { + threading::vkDestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator); +} + +VKAPI_ATTR void VKAPI_CALL +vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t object, + size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg) { + threading::vkDebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg); +} + +// loader-layer interface v0 + VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { - return util_GetExtensionProperties(ARRAY_SIZE(threading_extensions), threading_extensions, pCount, pProperties); + return util_GetExtensionProperties(ARRAY_SIZE(threading::threading_extensions), threading::threading_extensions, pCount, pProperties); } VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) { - return util_GetLayerProperties(ARRAY_SIZE(globalLayerProps), globalLayerProps, pCount, pProperties); + return util_GetLayerProperties(ARRAY_SIZE(threading::globalLayerProps), threading::globalLayerProps, pCount, pProperties); } VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) { - return util_GetLayerProperties(ARRAY_SIZE(deviceLayerProps), deviceLayerProps, pCount, pProperties); + return util_GetLayerProperties(ARRAY_SIZE(threading::deviceLayerProps), threading::deviceLayerProps, pCount, pProperties); +} + +VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, + const char *pLayerName, uint32_t *pCount, + VkExtensionProperties *pProperties) { + return threading::vkEnumerateDeviceExtensionProperties(physicalDevice, pLayerName, pCount, pProperties); +} + +VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) { + return threading::vkGetDeviceProcAddr(dev, funcName); +} + +VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) { + return threading::vkGetInstanceProcAddr(instance, funcName); } -- cgit v1.2.3 From b68fd2709daf6c5b9276bc825d4f41d4631513ad Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Mon, 16 May 2016 10:02:06 +0800 Subject: threading: drop vk prefix for layer functions Drop VK_LAYER_EXPORT as well. --- generator.py | 8 +++++-- layers/threading.cpp | 60 ++++++++++++++++++++++++++-------------------------- 2 files changed, 36 insertions(+), 32 deletions(-) diff --git a/generator.py b/generator.py index abb0dbf1..e9aa8d4e 100644 --- a/generator.py +++ b/generator.py @@ -2764,7 +2764,7 @@ class ThreadOutputGenerator(OutputGenerator): self.appendSection('command', '') self.appendSection('command', '// declare only') self.appendSection('command', decls[0]) - self.intercepts += [ ' {"%s", reinterpret_cast(%s)},' % (name,name) ] + self.intercepts += [ ' {"%s", reinterpret_cast(%s)},' % (name,name[2:]) ] return if "KHR" in name: self.appendSection('command', '// TODO - not wrapping KHR function ' + name) @@ -2780,7 +2780,7 @@ class ThreadOutputGenerator(OutputGenerator): # record that the function will be intercepted if (self.featureExtraProtect != None): self.intercepts += [ '#ifdef %s' % self.featureExtraProtect ] - self.intercepts += [ ' {"%s", reinterpret_cast(%s)},' % (name,name) ] + self.intercepts += [ ' {"%s", reinterpret_cast(%s)},' % (name,name[2:]) ] if (self.featureExtraProtect != None): self.intercepts += [ '#endif' ] @@ -2820,6 +2820,10 @@ class ThreadOutputGenerator(OutputGenerator): if (resulttype != None): self.appendSection('command', ' return result;') self.appendSection('command', '}') + # + # override makeProtoName to drop the "vk" prefix + def makeProtoName(self, name, tail): + return self.genOpts.apientry + name[2:] + tail # ParamCheckerOutputGenerator - subclass of OutputGenerator. # Generates param checker layer code. diff --git a/layers/threading.cpp b/layers/threading.cpp index 85ca669a..0f8113f1 100644 --- a/layers/threading.cpp +++ b/layers/threading.cpp @@ -46,8 +46,8 @@ static void initThreading(layer_data *my_data, const VkAllocationCallbacks *pAll layer_debug_actions(my_data->report_data, my_data->logging_callback, pAllocator, "google_threading"); } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkInstance *pInstance) { +VKAPI_ATTR VkResult VKAPI_CALL +CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkInstance *pInstance) { VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO); assert(chain_info->u.pLayerInfo); @@ -79,7 +79,7 @@ vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCall return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) { +VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) { dispatch_key key = get_dispatch_key(instance); layer_data *my_data = get_my_data_ptr(key, layer_data_map); VkLayerInstanceDispatchTable *pTable = my_data->instance_dispatch_table; @@ -118,8 +118,8 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyInstance(VkInstance instance layer_data_map.erase(key); } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo *pCreateInfo, - const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) { +VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo *pCreateInfo, + const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) { VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO); assert(chain_info->u.pLayerInfo); @@ -149,7 +149,7 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkCreateDevice(VkPhysicalDevice g return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) { +VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) { dispatch_key key = get_dispatch_key(device); layer_data *dev_data = get_my_data_ptr(key, layer_data_map); startWriteObject(dev_data, device); @@ -181,9 +181,9 @@ static inline PFN_vkVoidFunction layer_intercept_proc(const char *name) { return NULL; } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, - const char *pLayerName, uint32_t *pCount, - VkExtensionProperties *pProperties) { +VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, + const char *pLayerName, uint32_t *pCount, + VkExtensionProperties *pProperties) { if (pLayerName == NULL) { dispatch_key key = get_dispatch_key(physicalDevice); layer_data *my_data = get_my_data_ptr(key, layer_data_map); @@ -200,26 +200,26 @@ static inline PFN_vkVoidFunction layer_intercept_instance_proc(const char *name) name += 2; if (!strcmp(name, "CreateInstance")) - return (PFN_vkVoidFunction)vkCreateInstance; + return (PFN_vkVoidFunction)CreateInstance; if (!strcmp(name, "DestroyInstance")) - return (PFN_vkVoidFunction)vkDestroyInstance; + return (PFN_vkVoidFunction)DestroyInstance; if (!strcmp(name, "EnumerateInstanceExtensionProperties")) return (PFN_vkVoidFunction)vkEnumerateInstanceExtensionProperties; if (!strcmp(name, "EnumerateInstanceLayerProperties")) return (PFN_vkVoidFunction)vkEnumerateInstanceLayerProperties; if (!strcmp(name, "EnumerateDeviceExtensionProperties")) - return (PFN_vkVoidFunction)vkEnumerateDeviceExtensionProperties; + return (PFN_vkVoidFunction)EnumerateDeviceExtensionProperties; if (!strcmp(name, "EnumerateDeviceLayerProperties")) return (PFN_vkVoidFunction)vkEnumerateDeviceLayerProperties; if (!strcmp(name, "CreateDevice")) - return (PFN_vkVoidFunction)vkCreateDevice; + return (PFN_vkVoidFunction)CreateDevice; if (!strcmp(name, "GetInstanceProcAddr")) - return (PFN_vkVoidFunction)vkGetInstanceProcAddr; + return (PFN_vkVoidFunction)GetInstanceProcAddr; return NULL; } -VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice device, const char *funcName) { +VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) { PFN_vkVoidFunction addr; layer_data *dev_data; if (device == VK_NULL_HANDLE) { @@ -238,7 +238,7 @@ VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkD return pTable->GetDeviceProcAddr(device, funcName); } -VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) { +VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance, const char *funcName) { PFN_vkVoidFunction addr; layer_data *my_data; @@ -264,9 +264,9 @@ VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(V return pTable->GetInstanceProcAddr(instance, funcName); } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL -vkCreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo, - const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pMsgCallback) { +VKAPI_ATTR VkResult VKAPI_CALL +CreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo, + const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pMsgCallback) { layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map); startReadObject(my_data, instance); VkResult result = @@ -278,8 +278,8 @@ vkCreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackC return result; } -VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL -vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT callback, const VkAllocationCallbacks *pAllocator) { +VKAPI_ATTR void VKAPI_CALL +DestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT callback, const VkAllocationCallbacks *pAllocator) { layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map); startReadObject(my_data, instance); startWriteObject(my_data, callback); @@ -290,7 +290,7 @@ vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT ca } VKAPI_ATTR VkResult VKAPI_CALL -vkAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo, VkCommandBuffer *pCommandBuffers) { +AllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo, VkCommandBuffer *pCommandBuffers) { dispatch_key key = get_dispatch_key(device); layer_data *my_data = get_my_data_ptr(key, layer_data_map); VkLayerDispatchTable *pTable = my_data->device_dispatch_table; @@ -313,8 +313,8 @@ vkAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAl return result; } -VKAPI_ATTR void VKAPI_CALL vkFreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount, - const VkCommandBuffer *pCommandBuffers) { +VKAPI_ATTR void VKAPI_CALL FreeCommandBuffers(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount, + const VkCommandBuffer *pCommandBuffers) { dispatch_key key = get_dispatch_key(device); layer_data *my_data = get_my_data_ptr(key, layer_data_map); VkLayerDispatchTable *pTable = my_data->device_dispatch_table; @@ -342,19 +342,19 @@ VKAPI_ATTR void VKAPI_CALL vkFreeCommandBuffers(VkDevice device, VkCommandPool c VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pMsgCallback) { - return threading::vkCreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback); + return threading::CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback); } VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT(VkInstance instance, VkDebugReportCallbackEXT msgCallback, const VkAllocationCallbacks *pAllocator) { - threading::vkDestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator); + threading::DestroyDebugReportCallbackEXT(instance, msgCallback, pAllocator); } VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objType, uint64_t object, size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg) { - threading::vkDebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg); + threading::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg); } // loader-layer interface v0 @@ -376,13 +376,13 @@ vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCou VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { - return threading::vkEnumerateDeviceExtensionProperties(physicalDevice, pLayerName, pCount, pProperties); + return threading::EnumerateDeviceExtensionProperties(physicalDevice, pLayerName, pCount, pProperties); } VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) { - return threading::vkGetDeviceProcAddr(dev, funcName); + return threading::GetDeviceProcAddr(dev, funcName); } VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) { - return threading::vkGetInstanceProcAddr(instance, funcName); + return threading::GetInstanceProcAddr(instance, funcName); } -- cgit v1.2.3 From 139ff88b3235317624a6ca2a1f5243ef798703c7 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Mon, 16 May 2016 10:13:45 +0800 Subject: threading: add threading::layerProps Replace globalLayerProps and deviceLayerProps with layerProps. There is no plan to define more than one layer in the same namespace. --- layers/threading.cpp | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/layers/threading.cpp b/layers/threading.cpp index 0f8113f1..c5242c73 100644 --- a/layers/threading.cpp +++ b/layers/threading.cpp @@ -161,17 +161,11 @@ VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCall static const VkExtensionProperties threading_extensions[] = { {VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_EXT_DEBUG_REPORT_SPEC_VERSION}}; -static const VkLayerProperties globalLayerProps[] = {{ +static const VkLayerProperties layerProps = { "VK_LAYER_GOOGLE_threading", VK_LAYER_API_VERSION, // specVersion 1, "Google Validation Layer", -}}; - -static const VkLayerProperties deviceLayerProps[] = {{ - "VK_LAYER_GOOGLE_threading", - VK_LAYER_API_VERSION, // specVersion - 1, "Google Validation Layer", -}}; +}; static inline PFN_vkVoidFunction layer_intercept_proc(const char *name) { for (int i = 0; i < sizeof(procmap) / sizeof(procmap[0]); i++) { @@ -365,12 +359,12 @@ vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, } VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) { - return util_GetLayerProperties(ARRAY_SIZE(threading::globalLayerProps), threading::globalLayerProps, pCount, pProperties); + return util_GetLayerProperties(1, &threading::layerProps, pCount, pProperties); } VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) { - return util_GetLayerProperties(ARRAY_SIZE(threading::deviceLayerProps), threading::deviceLayerProps, pCount, pProperties); + return util_GetLayerProperties(1, &threading::layerProps, pCount, pProperties); } VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, -- cgit v1.2.3 From d8e985d3053398368a7d44d632274b2db7ea6cc8 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Mon, 16 May 2016 10:16:30 +0800 Subject: threading: improve EnumerateDeviceExtensionProperties Call down the next layer unless pLayerName is threading. --- layers/threading.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/layers/threading.cpp b/layers/threading.cpp index c5242c73..4bdc9644 100644 --- a/layers/threading.cpp +++ b/layers/threading.cpp @@ -178,14 +178,15 @@ static inline PFN_vkVoidFunction layer_intercept_proc(const char *name) { VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { - if (pLayerName == NULL) { - dispatch_key key = get_dispatch_key(physicalDevice); - layer_data *my_data = get_my_data_ptr(key, layer_data_map); - return my_data->instance_dispatch_table->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties); - } else { - // Threading layer does not have any device extensions + // Threading layer does not have any device extensions + if (pLayerName && !strcmp(pLayerName, layerProps.layerName)) return util_GetExtensionProperties(0, nullptr, pCount, pProperties); - } + + assert(physicalDevice); + + dispatch_key key = get_dispatch_key(physicalDevice); + layer_data *my_data = get_my_data_ptr(key, layer_data_map); + return my_data->instance_dispatch_table->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties); } static inline PFN_vkVoidFunction layer_intercept_instance_proc(const char *name) { @@ -370,7 +371,8 @@ vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCou VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { - return threading::EnumerateDeviceExtensionProperties(physicalDevice, pLayerName, pCount, pProperties); + // the layer command handles VK_NULL_HANDLE just fine + return threading::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties); } VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName) { -- cgit v1.2.3 From e2313609692ff38ef1af1236fa5c01793248f7a3 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Mon, 16 May 2016 11:14:51 +0800 Subject: threading: assert valid instance/device in vkGet*ProcAddr device is always valid in vkGetDeviceProcAddr. instance is valid if pName is not intercepted in layer_intercept_instance_proc. --- layers/threading.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/layers/threading.cpp b/layers/threading.cpp index 4bdc9644..47d49060 100644 --- a/layers/threading.cpp +++ b/layers/threading.cpp @@ -217,9 +217,8 @@ static inline PFN_vkVoidFunction layer_intercept_instance_proc(const char *name) VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) { PFN_vkVoidFunction addr; layer_data *dev_data; - if (device == VK_NULL_HANDLE) { - return NULL; - } + + assert(device); addr = layer_intercept_proc(funcName); if (addr) @@ -242,9 +241,7 @@ VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance return addr; } - if (instance == VK_NULL_HANDLE) { - return NULL; - } + assert(instance); my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map); addr = debug_report_get_instance_proc_addr(my_data->report_data, funcName); -- cgit v1.2.3 From f1c370e39a716e6e0ed8739760b5b42849ef185b Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Mon, 16 May 2016 11:17:26 +0800 Subject: threading: no interface functions in layer functions Move handling of interface functions in threading::GetInstanceProcAddr to v0's vkGetInstanceProcAddr. --- layers/threading.cpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/layers/threading.cpp b/layers/threading.cpp index 47d49060..db5f6ae0 100644 --- a/layers/threading.cpp +++ b/layers/threading.cpp @@ -193,19 +193,18 @@ static inline PFN_vkVoidFunction layer_intercept_instance_proc(const char *name) if (!name || name[0] != 'v' || name[1] != 'k') return NULL; + // we should never be queried for these commands + assert(strcmp(name, "vkEnumerateInstanceLayerProperties") && + strcmp(name, "vkEnumerateInstanceExtensionProperties") && + strcmp(name, "vkEnumerateDeviceLayerProperties")); + name += 2; if (!strcmp(name, "CreateInstance")) return (PFN_vkVoidFunction)CreateInstance; if (!strcmp(name, "DestroyInstance")) return (PFN_vkVoidFunction)DestroyInstance; - if (!strcmp(name, "EnumerateInstanceExtensionProperties")) - return (PFN_vkVoidFunction)vkEnumerateInstanceExtensionProperties; - if (!strcmp(name, "EnumerateInstanceLayerProperties")) - return (PFN_vkVoidFunction)vkEnumerateInstanceLayerProperties; if (!strcmp(name, "EnumerateDeviceExtensionProperties")) return (PFN_vkVoidFunction)EnumerateDeviceExtensionProperties; - if (!strcmp(name, "EnumerateDeviceLayerProperties")) - return (PFN_vkVoidFunction)vkEnumerateDeviceLayerProperties; if (!strcmp(name, "CreateDevice")) return (PFN_vkVoidFunction)CreateDevice; if (!strcmp(name, "GetInstanceProcAddr")) @@ -377,5 +376,14 @@ VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkD } VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) { + if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties")) + return reinterpret_cast(vkEnumerateInstanceLayerProperties); + if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties")) + return reinterpret_cast(vkEnumerateDeviceLayerProperties); + if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties")) + return reinterpret_cast(vkEnumerateInstanceExtensionProperties); + if (!strcmp(funcName, "vkGetInstanceProcAddr")) + return reinterpret_cast(vkGetInstanceProcAddr); + return threading::GetInstanceProcAddr(instance, funcName); } -- cgit v1.2.3 From ef2202c358d9ea062003fb73c9d4f9cbe5bb2c22 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Mon, 16 May 2016 11:18:31 +0800 Subject: threading: handle device commands in GetInstanceProcAddr Call layer_intercept_proc in GetInstanceProcAddr. --- layers/threading.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/layers/threading.cpp b/layers/threading.cpp index db5f6ae0..c97722e8 100644 --- a/layers/threading.cpp +++ b/layers/threading.cpp @@ -236,6 +236,8 @@ VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetInstanceProcAddr(VkInstance instance layer_data *my_data; addr = layer_intercept_instance_proc(funcName); + if (!addr) + addr = layer_intercept_proc(funcName); if (addr) { return addr; } -- cgit v1.2.3 From 2b7352c6df0f03ce3b426390cc4c20ecec29ac92 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Mon, 16 May 2016 11:21:03 +0800 Subject: threading: avoid invalid GIPA call in vkCreateDevice Save VkInstance in layer_data so that we query vkCreateDevice with a valid instance. --- layers/threading.cpp | 5 +++-- layers/threading.h | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/layers/threading.cpp b/layers/threading.cpp index c97722e8..2de00522 100644 --- a/layers/threading.cpp +++ b/layers/threading.cpp @@ -65,6 +65,7 @@ CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallba return result; layer_data *my_data = get_my_data_ptr(get_dispatch_key(*pInstance), layer_data_map); + my_data->instance = *pInstance; my_data->instance_dispatch_table = new VkLayerInstanceDispatchTable; layer_init_instance_dispatch_table(*pInstance, my_data->instance_dispatch_table, fpGetInstanceProcAddr); @@ -120,12 +121,13 @@ VKAPI_ATTR void VKAPI_CALL DestroyInstance(VkInstance instance, const VkAllocati VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) { + layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(gpu), layer_data_map); VkLayerDeviceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO); assert(chain_info->u.pLayerInfo); PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr; PFN_vkGetDeviceProcAddr fpGetDeviceProcAddr = chain_info->u.pLayerInfo->pfnNextGetDeviceProcAddr; - PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(NULL, "vkCreateDevice"); + PFN_vkCreateDevice fpCreateDevice = (PFN_vkCreateDevice)fpGetInstanceProcAddr(my_instance_data->instance, "vkCreateDevice"); if (fpCreateDevice == NULL) { return VK_ERROR_INITIALIZATION_FAILED; } @@ -138,7 +140,6 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateDevice(VkPhysicalDevice gpu, const VkDevice return result; } - layer_data *my_instance_data = get_my_data_ptr(get_dispatch_key(gpu), layer_data_map); layer_data *my_device_data = get_my_data_ptr(get_dispatch_key(*pDevice), layer_data_map); // Setup device dispatch table diff --git a/layers/threading.h b/layers/threading.h index 8e90f0a5..c3db3468 100644 --- a/layers/threading.h +++ b/layers/threading.h @@ -189,6 +189,8 @@ template class counter { }; struct layer_data { + VkInstance instance; + debug_report_data *report_data; std::vector logging_callback; VkLayerDispatchTable *device_dispatch_table; -- cgit v1.2.3 From 67af5a545ff2e1f01686c540c0d9fd0829074c9d Mon Sep 17 00:00:00 2001 From: Michael Lentine Date: Tue, 24 May 2016 09:49:25 -0500 Subject: Clear priorFences on reset. --- layers/core_validation.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index e8c4cc38..baa8e233 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -4218,6 +4218,12 @@ static bool decrementResources(layer_data *my_data, uint32_t fenceCount, const V queue_pair->second.lastFences.erase(last_fence_data); } } + for (auto& fence_data : my_data->fenceMap) { + auto prior_fence_data = + std::find(fence_data.second.priorFences.begin(), fence_data.second.priorFences.end(), fence_pair.first); + if (prior_fence_data != fence_data.second.priorFences.end()) + fence_data.second.priorFences.erase(prior_fence_data); + } } return skip_call; } @@ -5371,6 +5377,7 @@ VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, if (fence_item != dev_data->fenceMap.end()) { fence_item->second.needsSignaled = true; fence_item->second.queues.clear(); + fence_item->second.priorFences.clear(); if (fence_item->second.in_use.load()) { skipCall |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, -- cgit v1.2.3 From c9549bae6bf9cb644e30980bef7fbd8c33962e55 Mon Sep 17 00:00:00 2001 From: Jon Ashburn Date: Fri, 20 May 2016 16:43:12 -0600 Subject: layers: lvlgh 548, remove obsolete RPATH Change-Id: Iaba3990d2f417375cfa84a295d7184cedb491da6 --- layers/CMakeLists.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/layers/CMakeLists.txt b/layers/CMakeLists.txt index 9847cfbd..acf67b8a 100644 --- a/layers/CMakeLists.txt +++ b/layers/CMakeLists.txt @@ -31,9 +31,6 @@ set(LAYER_JSON_FILES VkLayer_device_limits ) -set(VK_LAYER_RPATH /usr/lib/x86_64-linux-gnu/vulkan/layer:/usr/lib/i386-linux-gnu/vulkan/layer) -set(CMAKE_INSTALL_RPATH ${VK_LAYER_RPATH}) - if (WIN32) if (NOT (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)) if (CMAKE_GENERATOR MATCHES "^Visual Studio.*") -- cgit v1.2.3 From 45b973ef19d6fac273da7a17586441baae1f7ff7 Mon Sep 17 00:00:00 2001 From: Karl Schultz Date: Tue, 24 May 2016 13:49:59 -0600 Subject: build: Fix Windows compilation warnings Use false/true instead of 0/1 in recently-added std::bind calls. --- layers/core_validation.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 6f2ea1ad..e0d04c29 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -7942,7 +7942,7 @@ VKAPI_ATTR void VKAPI_CALL CmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPoo } else { pCB->activeQueries.erase(query); } - std::function queryUpdate = std::bind(setQueryState, std::placeholders::_1, commandBuffer, query, 1); + std::function queryUpdate = std::bind(setQueryState, std::placeholders::_1, commandBuffer, query, true); pCB->queryUpdates.push_back(queryUpdate); if (pCB->state == CB_RECORDING) { skipCall |= addCmd(dev_data, pCB, CMD_ENDQUERY, "VkCmdEndQuery()"); @@ -7965,7 +7965,7 @@ CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t for (uint32_t i = 0; i < queryCount; i++) { QueryObject query = {queryPool, firstQuery + i}; pCB->waitedEventsBeforeQueryReset[query] = pCB->waitedEvents; - std::function queryUpdate = std::bind(setQueryState, std::placeholders::_1, commandBuffer, query, 0); + std::function queryUpdate = std::bind(setQueryState, std::placeholders::_1, commandBuffer, query, false); pCB->queryUpdates.push_back(queryUpdate); } if (pCB->state == CB_RECORDING) { @@ -8160,7 +8160,7 @@ CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelin GLOBAL_CB_NODE *pCB = getCBNode(dev_data, commandBuffer); if (pCB) { QueryObject query = {queryPool, slot}; - std::function queryUpdate = std::bind(setQueryState, std::placeholders::_1, commandBuffer, query, 1); + std::function queryUpdate = std::bind(setQueryState, std::placeholders::_1, commandBuffer, query, true); pCB->queryUpdates.push_back(queryUpdate); if (pCB->state == CB_RECORDING) { skipCall |= addCmd(dev_data, pCB, CMD_WRITETIMESTAMP, "vkCmdWriteTimestamp()"); -- cgit v1.2.3 From 21c87f829d66ddd0b0cb5033510718fa78ca4b6a Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Tue, 24 May 2016 15:44:50 -0600 Subject: layers: Use correct log_msg calls in swapchain Swapchain layer was making a couple of calls directly to debug_report_log_msg instead of going through log_msg. Change-Id: I206210bb0d109778c90283144075a77fc459210b --- layers/swapchain.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/layers/swapchain.cpp b/layers/swapchain.cpp index f49c8bca..b603ec77 100644 --- a/layers/swapchain.cpp +++ b/layers/swapchain.cpp @@ -1486,9 +1486,9 @@ static bool validateCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateI } } // Log the message that we've built up: - skipCall |= debug_report_log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, (uint64_t)device, __LINE__, - SWAPCHAIN_CREATE_SWAP_BAD_PRE_TRANSFORM, LAYER_NAME, errorString.c_str()); + skipCall |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, + reinterpret_cast(device), __LINE__, SWAPCHAIN_CREATE_SWAP_BAD_PRE_TRANSFORM, LAYER_NAME, + "%s", errorString.c_str()); } // Validate pCreateInfo->compositeAlpha has one bit set (1st two // lines of if-statement), which bit is also set in @@ -1515,9 +1515,9 @@ static bool validateCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateI } } // Log the message that we've built up: - skipCall |= debug_report_log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, (uint64_t)device, 0, - SWAPCHAIN_CREATE_SWAP_BAD_COMPOSITE_ALPHA, LAYER_NAME, errorString.c_str()); + skipCall |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, + reinterpret_cast(device), __LINE__, SWAPCHAIN_CREATE_SWAP_BAD_COMPOSITE_ALPHA, + LAYER_NAME, "%s", errorString.c_str()); } // Validate pCreateInfo->imageArraySize against // VkSurfaceCapabilitiesKHR::maxImageArraySize: -- cgit v1.2.3 From 14977c3af7d0ba12db17832196b3edc8663c5ba5 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Tue, 24 May 2016 16:47:36 -0600 Subject: layers: Fix ImageSampler immut sampler check Was missing IsImmutableSampler() override function for the ImageSamplerDescriptor class. --- layers/descriptor_sets.h | 1 + 1 file changed, 1 insertion(+) diff --git a/layers/descriptor_sets.h b/layers/descriptor_sets.h index bf8e29d2..6f2073b7 100644 --- a/layers/descriptor_sets.h +++ b/layers/descriptor_sets.h @@ -186,6 +186,7 @@ class ImageSamplerDescriptor : public Descriptor { ImageSamplerDescriptor(const VkSampler *); void WriteUpdate(const VkWriteDescriptorSet *, const uint32_t) override; void CopyUpdate(const Descriptor *) override; + virtual bool IsImmutableSampler() const override { return immutable_; }; VkSampler GetSampler() const { return sampler_; } VkImageView GetImageView() const { return image_view_; } VkImageLayout GetImageLayout() const { return image_layout_; } -- cgit v1.2.3 From 72db2cf8ed223058623943abb345225cd80f3e89 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Mon, 23 May 2016 16:02:29 -0600 Subject: layers: Handle static arrays in codegen Update safe_struct codegen to handle the case of a static array in a struct. This removes exceptions for VkDebugMarkerMarkerInfoEXT and VkPipelineColorBlendStateCreateInfo so they can be treated as all other structs. --- layers/core_validation.cpp | 2 +- vk_helper.py | 45 ++++++++++++++++++++++++++++----------------- 2 files changed, 29 insertions(+), 18 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index e0d04c29..73a318e1 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -2696,7 +2696,7 @@ static bool validatePipelineDrawtimeState(layer_data const *my_data, const GLOBA VkSampleCountFlagBits subpass_num_samples = VkSampleCountFlagBits(0); uint32_t i; - const VkPipelineColorBlendStateCreateInfo *color_blend_state = pPipeline->graphicsPipelineCI.pColorBlendState; + const safe_VkPipelineColorBlendStateCreateInfo *color_blend_state = pPipeline->graphicsPipelineCI.pColorBlendState; if ((color_blend_state != NULL) && (pCB->activeSubpass == pPipeline->graphicsPipelineCI.subpass) && (color_blend_state->attachmentCount != subpass_desc->colorAttachmentCount)) { skip_call |= diff --git a/vk_helper.py b/vk_helper.py index ab99f638..a405d571 100755 --- a/vk_helper.py +++ b/vk_helper.py @@ -1563,7 +1563,7 @@ class StructWrapperGen: # If struct has sType or ptr members, generate safe type def _hasSafeStruct(self, s): - exceptions = ['VkPhysicalDeviceFeatures', 'VkPipelineColorBlendStateCreateInfo', 'VkDebugMarkerMarkerInfoEXT'] + exceptions = ['VkPhysicalDeviceFeatures'] if s in exceptions: return False if 'sType' == self.struct_dict[s][0]['name']: @@ -1713,23 +1713,34 @@ class StructWrapperGen: destruct_txt += ' if (%s)\n' % (m_name) destruct_txt += ' delete[] %s;\n' % (m_name) elif self.struct_dict[s][m]['array']: - # Init array ptr to NULL - init_list += '\n\t%s(NULL),' % (m_name) - init_func_txt += ' %s = NULL;\n' % (m_name) - array_element = 'pInStruct->%s[i]' % (m_name) - if is_type(self.struct_dict[s][m]['type'], 'struct') and self._hasSafeStruct(self.struct_dict[s][m]['type']): - array_element = '%s(&pInStruct->%s[i])' % (self._getSafeStructName(self.struct_dict[s][m]['type']), m_name) - construct_txt += ' if (%s && pInStruct->%s) {\n' % (self.struct_dict[s][m]['array_size'], m_name) - construct_txt += ' %s = new %s[%s];\n' % (m_name, m_type, self.struct_dict[s][m]['array_size']) - destruct_txt += ' if (%s)\n' % (m_name) - destruct_txt += ' delete[] %s;\n' % (m_name) - construct_txt += ' for (uint32_t i=0; i<%s; ++i) {\n' % (self.struct_dict[s][m]['array_size']) - if 'safe_' in m_type: - construct_txt += ' %s[i].initialize(&pInStruct->%s[i]);\n' % (m_name, m_name) + if not self.struct_dict[s][m]['dyn_array']: + # Handle static array case + array_init_str = '' + for i in range(int(self.struct_dict[s][m]['array_size'])): + array_init_str += 'pInStruct->%s[%d], ' % (m_name, i) + array_init_str = array_init_str.strip().rstrip(',') + init_list += '\n\t%s{%s},' % (m_name, array_init_str) + init_func_txt += ' for (uint32_t i=0; i<%s; ++i) {\n' % (self.struct_dict[s][m]['array_size']) + init_func_txt += ' %s[i] = pInStruct->%s[i];\n' % (m_name, m_name) + init_func_txt += ' }\n' else: - construct_txt += ' %s[i] = %s;\n' % (m_name, array_element) - construct_txt += ' }\n' - construct_txt += ' }\n' + # Init array ptr to NULL + init_list += '\n\t%s(NULL),' % (m_name) + init_func_txt += ' %s = NULL;\n' % (m_name) + array_element = 'pInStruct->%s[i]' % (m_name) + if is_type(self.struct_dict[s][m]['type'], 'struct') and self._hasSafeStruct(self.struct_dict[s][m]['type']): + array_element = '%s(&pInStruct->%s[i])' % (self._getSafeStructName(self.struct_dict[s][m]['type']), m_name) + construct_txt += ' if (%s && pInStruct->%s) {\n' % (self.struct_dict[s][m]['array_size'], m_name) + construct_txt += ' %s = new %s[%s];\n' % (m_name, m_type, self.struct_dict[s][m]['array_size']) + destruct_txt += ' if (%s)\n' % (m_name) + destruct_txt += ' delete[] %s;\n' % (m_name) + construct_txt += ' for (uint32_t i=0; i<%s; ++i) {\n' % (self.struct_dict[s][m]['array_size']) + if 'safe_' in m_type: + construct_txt += ' %s[i].initialize(&pInStruct->%s[i]);\n' % (m_name, m_name) + else: + construct_txt += ' %s[i] = %s;\n' % (m_name, array_element) + construct_txt += ' }\n' + construct_txt += ' }\n' elif self.struct_dict[s][m]['ptr']: construct_txt += ' if (pInStruct->%s)\n' % (m_name) construct_txt += ' %s = new %s(pInStruct->%s);\n' % (m_name, m_type, m_name) -- cgit v1.2.3 From a3e0c454a44926e72c71cc2d7425474a9abe9b7e Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Fri, 27 May 2016 11:58:23 +1200 Subject: layers: Fix safe struct codegen of static arrays VC++ doesn't support this particular corner of C++11. Signed-off-by: Chris Forbes --- vk_helper.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/vk_helper.py b/vk_helper.py index a405d571..dc49b0fb 100755 --- a/vk_helper.py +++ b/vk_helper.py @@ -1715,14 +1715,9 @@ class StructWrapperGen: elif self.struct_dict[s][m]['array']: if not self.struct_dict[s][m]['dyn_array']: # Handle static array case - array_init_str = '' - for i in range(int(self.struct_dict[s][m]['array_size'])): - array_init_str += 'pInStruct->%s[%d], ' % (m_name, i) - array_init_str = array_init_str.strip().rstrip(',') - init_list += '\n\t%s{%s},' % (m_name, array_init_str) - init_func_txt += ' for (uint32_t i=0; i<%s; ++i) {\n' % (self.struct_dict[s][m]['array_size']) - init_func_txt += ' %s[i] = pInStruct->%s[i];\n' % (m_name, m_name) - init_func_txt += ' }\n' + construct_txt += ' for (uint32_t i=0; i<%s; ++i) {\n' % (self.struct_dict[s][m]['array_size']) + construct_txt += ' %s[i] = pInStruct->%s[i];\n' % (m_name, m_name) + construct_txt += ' }\n' else: # Init array ptr to NULL init_list += '\n\t%s(NULL),' % (m_name) -- cgit v1.2.3 From fb6b38a70543013aec1bd19d0c58042e8f379c43 Mon Sep 17 00:00:00 2001 From: Mark Young Date: Mon, 30 May 2016 10:07:04 -0600 Subject: winrt: Add more error logic to Powershell script Add more error detection logic to the install config Powershell script to help track down recent failures. --- .../ConfigLayersAndVulkanDLL.ps1 | 100 ++++++++++++++++++--- 1 file changed, 89 insertions(+), 11 deletions(-) diff --git a/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 b/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 index 6291bea6..28819323 100644 --- a/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 +++ b/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 @@ -118,17 +118,23 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) # If a file name contains "=", "@", or " ", or it contains less then 5 dashes or more than # 7 dashes, it wasn't installed by the Vulkan Run Time. # Note that we need to use return inside of ForEach-Object is to continue with iteration. - echo "Rejected $_ - bad format" >>$log + echo "ERROR: Rejected $_ - bad format" >>$log return } + if (!$?) { + echo "ERROR: UpdateVulkanSysFolder object $_ is bad format" >>$log; + } # If the corresponding vulkaninfo is not present, it wasn't installed by the Vulkan Run Time $vulkaninfo=$_ -replace ".dll",".exe" $vulkaninfo=$vulkaninfo -replace "vulkan","vulkaninfo" if (-not (Test-Path $vulkaninfo)) { - echo "Rejected $_ - vulkaninfo not present" >>$log + echo "ERROR: Rejected $_ - vulkaninfo not present" >>$log return } + if (!$?) { + echo "ERROR: UpdateVulkanSysFolder failed generating vulkaninfo exe name" >>$log; + } $major=$_.Split('-')[2] $majorOrig=$major @@ -172,27 +178,30 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) } } echo "Version $majorOrig $minorOrig $patchOrig $buildnoOrig $prereleaseOrig $prebuildnoOrig" >>$log + if (!$?) { + echo "ERROR: UpdateVulkanSysFolder during version parsing" >>$log; + } # Make sure fields that are supposed to be numbers are numbers if (notNumeric($major)) { - echo "Rejected $_ - bad major" >>$log + echo "ERROR: Rejected $_ - bad major" >>$log return } if (notNumeric($minor)) { - echo "Rejected $_ - bad minor" >>$log + echo "ERROR: Rejected $_ - bad minor" >>$log return } if (notNumeric($patch)) { - echo "Rejected $_ - bad patch" >>$log + echo "ERROR: Rejected $_ - bad patch" >>$log return } if (notNumeric($buildno)) { - echo "Rejected $_ - bad buildno" >>$log + echo "ERROR: Rejected $_ - bad buildno" >>$log return } if (notNumeric($prebuildno)) { if ($prebuildno -ne "z"*10) { - echo "Rejected $_ - bad prebuildno" >>$log + echo "ERROR: Rejected $_ - bad prebuildno" >>$log return } } @@ -207,6 +216,10 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) # Add a new element to the $VulkanDllList array echo "Adding $_ to Vulkan dll list " >>$log $script:VulkanDllList+="$major=$minor=$patch=$buildno=$prebuildno=$prerelease= $_ @$majorOrig@$minorOrig@$patchOrig@$buildnoOrig@$prereleaseOrig@$prebuildnoOrig@" + + if (!$?) { + echo "ERROR: UpdateVulkanSysFolder adding DLL $_ to list" >>$log; + } } # If $VulkanDllList contains at least one element, there's at least one vulkan*.dll file. @@ -217,19 +230,31 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) # Sort the list. The most recent vulkan-*.dll will be in the last element of the list. [array]::sort($script:VulkanDllList) + if (!$?) { + echo "ERROR: UpdateVulkanSysFolder sorting DLL list" >>$log; + } + # Put the name of the most recent vulkan-*.dll in $mrVulkanDLL. # The most recent vulkanDLL is the second word in the last element of the # sorted $VulkanDllList. Copy it to $vulkandll. $mrVulkanDll=$script:VulkanDllList[-1].Split(' ')[1] echo "copy $mrVulkanDll $vulkandll" >>$log - copy $mrVulkanDll $vulkandll + Copy-Item $mrVulkanDll $vulkandll -force + + if (!$?) { + echo "ERROR: UpdateVulkanSysFolder encountered error during copy $mrVulkanDll $vulkandll" >>$log; + } # Copy the most recent version of vulkaninfo--*.exe to vulkaninfo.exe. # We create the source file name for the copy from $mrVulkanDll. $mrVulkaninfo=$mrVulkanDll -replace ".dll",".exe" $mrVulkaninfo=$mrVulkaninfo -replace "vulkan","vulkaninfo" echo "copy $mrVulkaninfo vulkaninfo.exe" >>$log - copy $mrVulkaninfo vulkaninfo.exe + Copy-Item $mrVulkaninfo vulkaninfo.exe -force + + if (!$?) { + echo "ERROR: UpdateVulkanSysFolder encountered error during copy $mrVulkaninfo vulkaninfo.exe" >>$log; + } # Create the name used in the registry for the SDK associated with $mrVulkanDll. $major=$script:VulkanDllList[-1].Split('@')[1] @@ -247,11 +272,19 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) $sdktempname=$sdktempname + "." + $prebuildno } echo "sdkname = $sdktempname" >>$log + + if (!$?) { + echo "ERROR: UpdateVulkanSysFolder encountered error generating temp SDK name" >>$log; + } } # Return to our previous folder Pop-Location + if (!$?) { + echo "ERROR: UpdateVulkanSysFolder popping location" >>$log; + } + # Only update the overall script-scope SDK name if we're told to if ($writeSdkName -ne 0) { $script:sdkname = $sdktempname @@ -265,12 +298,20 @@ if ($ossize -eq 64) { # Update the SYSWOW64 Vulkan DLLS/EXEs echo "Calling UpdateVulkanSysFolder $winfolder\SYSWOW64 0" >>$log UpdateVulkanSysFolder $winfolder\SYSWOW64 0 + + if (!$?) { + echo "ERROR: Calling UpdateVulkanSysFolder for 64-bit OS" >>$log + } } # Update the SYSTEM32 Vulkan DLLS/EXEs echo "Calling UpdateVulkanSysFolder $winfolder\SYSTEM32 1" >>$log UpdateVulkanSysFolder $winfolder\SYSTEM32 1 +if (!$?) { + echo "ERROR: Calling UpdateVulkanSysFolder for all OS" >>$log +} + # Create an array of vulkan sdk install dirs echo "Creating array of of Vulkan SDK Install dirs" >>$log @@ -294,6 +335,10 @@ Get-ChildItem -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curr } } +if (!$?) { + echo "ERROR: Failed creating array of of Vulkan SDK Install dirs" >>$log +} + # Search list of sdk install dirs for an sdk compatible with $script:sdkname. # We go backwards through VulkanDllList to generate SDK names, because we want the most recent SDK. @@ -332,6 +377,10 @@ if ($mrVulkanDllInstallDir -eq "") { } } } + + if (!$?) { + echo "ERROR: Failed searching VulkanDLLList" >>$log + } } # Add C:\Vulkan\SDK\0.9.3 to list of SDK install dirs. @@ -360,6 +409,11 @@ Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\Vulkan\ExplicitLaye } } } + +if (!$?) { + echo "ERROR: Failed Removing old layer registry values from HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" >>$log +} + # Remove 32-bit layer registry value if we're targeting a 64-bit OS if ($ossize -eq 64) { Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers | Select-Object -ExpandProperty Property | @@ -372,6 +426,10 @@ if ($ossize -eq 64) { } } } + + if (!$?) { + echo "ERROR: Failed Removing old layer registry values from HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers" >>$log + } } @@ -384,12 +442,20 @@ if ($mrVulkanDllInstallDir -ne "") { if (-not (Test-Path -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers)) { echo "Creating new registry key HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" >>$log New-Item -Force -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers | out-null + + if (!$?) { + echo "ERROR: Failed creating HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" >>$log + } } if ($ossize -eq 64) { if (-not (Test-Path -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers)) { echo "Creating new registry key HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers" >>$log New-Item -Force -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers | out-null - } + + if (!$?) { + echo "ERROR: Failed creating HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers" >>$log + } + } } @@ -400,6 +466,10 @@ if ($mrVulkanDllInstallDir -ne "") { ForEach-Object { echo "Creating registry value $mrVulkanDllInstallDir\Bin\$_" >>$log New-ItemProperty -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin\$_ -PropertyType DWord -Value 0 | out-null + + if (!$?) { + echo "ERROR: Failed creating $mrVulkanDllInstallDir\Bin\$_" >>$log + } } # Create registry values for the WOW6432Node registry location for 32-bit items on a 64-bit OS @@ -407,6 +477,10 @@ if ($mrVulkanDllInstallDir -ne "") { ForEach-Object { echo "Creating WOW6432Node registry value $mrVulkanDllInstallDir\Bin32\$_" >>$log New-ItemProperty -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin32\$_ -PropertyType DWord -Value 0 | out-null + + if (!$?) { + echo "ERROR: Failed creating $mrVulkanDllInstallDir\Bin32\$_" >>$log + } } } else { @@ -416,7 +490,11 @@ if ($mrVulkanDllInstallDir -ne "") { ForEach-Object { echo "Creating registry value $mrVulkanDllInstallDir\Bin\$_" >>$log New-ItemProperty -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin32\$_ -PropertyType DWord -Value 0 | out-null - } + + if (!$?) { + echo "ERROR: Failed creating $mrVulkanDllInstallDir\Bin\$_" >>$log + } + } } } -- cgit v1.2.3 From 263362df3a449e02f4ae9f187ec0844afe795f62 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 26 May 2016 06:14:30 -0600 Subject: tests: Update doc for dynamic state tests --- layers/vk_validation_layer_details.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/layers/vk_validation_layer_details.md b/layers/vk_validation_layer_details.md index dd6139e6..9636c2d2 100644 --- a/layers/vk_validation_layer_details.md +++ b/layers/vk_validation_layer_details.md @@ -58,13 +58,13 @@ The Draw State portion of the core validation layer tracks state leading into Dr | DS Update Index | DS update binding too large for layout binding count. | INVALID_UPDATE_INDEX | vkUpdateDescriptorSets | InvalidDSUpdateIndex CopyDescriptorUpdateErrors | NA | | DS Update Type | Verifies that structs in DS Update tree are properly created, currently valid, and of the right type | INVALID_UPDATE_STRUCT | vkUpdateDescriptorSets | InvalidDSUpdateStruct | NA | | MSAA Sample Count | Verifies that Pipeline, RenderPass, and Subpass sample counts are consistent | NUM_SAMPLES_MISMATCH | vkCmdBindPipeline vkCmdBeginRenderPass vkCmdNextSubpass | NumSamplesMismatch | NA | -| Dynamic Viewport State Binding | Verify that viewport dynamic state bound to Cmd Buffer at Draw time | VIEWPORT_NOT_BOUND |vkCmdDraw vkCmdDrawIndexed vkCmdDrawIndirect vkCmdDrawIndexedIndirect | DynamicStatesNotBound | NA | -| Dynamic Scissor State Binding | Verify that scissor dynamic state bound to Cmd Buffer at Draw time | SCISSOR_NOT_BOUND |vkCmdDraw vkCmdDrawIndexed vkCmdDrawIndirect vkCmdDrawIndexedIndirect | DynamicStatesNotBound | NA | -| Dynamic Line Width State Binding | Verify that line width dynamic state bound to Cmd Buffer at draw time when required | LINE_WIDTH_NOT_BOUND |vkCmdDraw vkCmdDrawIndexed vkCmdDrawIndirect vkCmdDrawIndexedIndirect | DynamicStatesNotBound | NA | -| Dynamic Depth Bias State Binding | Verify that depth bias dynamic state bound when depth enabled | DEPTH_BIAS_NOT_BOUND |vkCmdDraw vkCmdDrawIndexed vkCmdDrawIndirect vkCmdDrawIndexedIndirect | DynamicStatesNotBound | NA | -| Dynamic Blend State Binding | Verify that blend dynamic state bound when color blend enabled | BLEND_NOT_BOUND |vkCmdDraw vkCmdDrawIndexed vkCmdDrawIndirect vkCmdDrawIndexedIndirect | DynamicStatesNotBound | NA | -| Dynamic Depth Bounds State Binding | Verify that depth bounds dynamic state bound when depth enabled | DEPTH_BOUNDS_NOT_BOUND |vkCmdDraw vkCmdDrawIndexed vkCmdDrawIndirect vkCmdDrawIndexedIndirect | DynamicStatesNotBound | NA | -| Dynamic Stencil State Binding | Verify that stencil dynamic state bound when depth enabled | STENCIL_NOT_BOUND | vkCmdDraw vkCmdDrawIndexed vkCmdDrawIndirect vkCmdDrawIndexedIndirect | DynamicStatesNotBound | NA | +| Dynamic Viewport State Binding | Verify that viewport dynamic state bound to Cmd Buffer at Draw time | VIEWPORT_NOT_BOUND |vkCmdDraw vkCmdDrawIndexed vkCmdDrawIndirect vkCmdDrawIndexedIndirect | DynamicViewportNotBound | NA | +| Dynamic Scissor State Binding | Verify that scissor dynamic state bound to Cmd Buffer at Draw time | SCISSOR_NOT_BOUND |vkCmdDraw vkCmdDrawIndexed vkCmdDrawIndirect vkCmdDrawIndexedIndirect | DynamicScissorNotBound | NA | +| Dynamic Line Width State Binding | Verify that line width dynamic state bound to Cmd Buffer at draw time when required | LINE_WIDTH_NOT_BOUND |vkCmdDraw vkCmdDrawIndexed vkCmdDrawIndirect vkCmdDrawIndexedIndirect | DynamicLineWidthNotBound | NA | +| Dynamic Depth Bias State Binding | Verify that depth bias dynamic state bound when depth enabled | DEPTH_BIAS_NOT_BOUND |vkCmdDraw vkCmdDrawIndexed vkCmdDrawIndirect vkCmdDrawIndexedIndirect | DynamicDepthBiasNotBound | NA | +| Dynamic Blend State Binding | Verify that blend dynamic state bound when color blend enabled | BLEND_NOT_BOUND |vkCmdDraw vkCmdDrawIndexed vkCmdDrawIndirect vkCmdDrawIndexedIndirect | DynamiBlendConstantsNotBound | NA | +| Dynamic Depth Bounds State Binding | Verify that depth bounds dynamic state bound when depth enabled | DEPTH_BOUNDS_NOT_BOUND |vkCmdDraw vkCmdDrawIndexed vkCmdDrawIndirect vkCmdDrawIndexedIndirect | DynamicDepthBoundsNotBound | NA | +| Dynamic Stencil State Binding | Verify that stencil dynamic state bound when depth enabled | STENCIL_NOT_BOUND | vkCmdDraw vkCmdDrawIndexed vkCmdDrawIndirect vkCmdDrawIndexedIndirect | DynamicStencilReadNotBound DynamicStencilWriteNotBound DynamicStencilRefNotBound | NA | | RenderPass misuse | Tests for the following: that vkCmdDispatch, vkCmdDispatchIndirect, vkCmdCopyBuffer, vkCmdCopyImage, vkCmdBlitImage, vkCmdCopyBufferToImage, vkCmdCopyImageToBuffer, vkCmdUpdateBuffer, vkCmdFillBuffer, vkCmdClearColorImage, vkCmdClearDepthStencilImage, vkCmdResolveImage, vkCmdSetEvent, vkCmdResetEvent, vkCmdResetQueryPool, vkCmdCopyQueryPoolResults, vkCmdBeginRenderPass, vkEndCommandBuffer are not called during an active Renderpass, and that binding compute descriptor sets or pipelines does not take place during an active Renderpass | INVALID_RENDERPASS_CMD | vkCmdBindPipeline vkCmdBindDescriptorSets vkCmdDispatch vkCmdDispatchIndirect vkCmdCopyBuffer vkCmdCopyImage vkCmdBlitImage vkCmdCopyBufferToImage vkCmdCopyImageToBuffer vkCmdUpdateBuffer vkCmdFillBuffer vkCmdClearColorImage vkCmdClearDepthStencilImage vkCmdResolveImage vkCmdSetEvent vkCmdResetEvent vkCmdResetQueryPool vkCmdCopyQueryPoolResults vkCmdBeginRenderPass vkEndCommandBuffer | RenderPassWithinRenderPass UpdateBufferWithinRenderPass ClearColorImageWithinRenderPass ClearDepthStencilImageWithinRenderPass FillBufferWithinRenderPass EndCommandBufferWithinRenderPass | NA | | Correct use of RenderPass | Validates that the following rendering commands are issued inside an active RenderPass: vkCmdDraw, vkCmdDrawIndexed, vkCmdDrawIndirect, vkCmdDrawIndexedIndirect, vkCmdClearAttachments, vkCmdNextSubpass, vkCmdEndRenderPass | NO_ACTIVE_RENDERPASS | vkCmdBindPipeline vkCmdBindDescriptorSets vkCmdDraw vkCmdDrawIndexed vkCmdDrawIndirect vkCmdDrawIndexedIndirect vkCmdClearAttachments vkCmdNextSubpass vkCmdEndRenderPass | ClearColorAttachmentsOutsideRenderPass | NA | | Valid RenderPass | Flag error if attempt made to Begin/End/Continue a NULL or otherwise invalid RenderPass object | INVALID_RENDERPASS | vkCmdBeginRenderPass vkCmdEndRenderPass vkBeginCommandBuffer | NullRenderPass | NA | -- cgit v1.2.3 From f866a08cf788a3519a65f44fd1d05f9849971d09 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Tue, 31 May 2016 16:09:42 +1200 Subject: layers: Wire up validation of compute pipelines Signed-off-by: Chris Forbes --- layers/core_validation.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 73a318e1..806d594a 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -5673,6 +5673,9 @@ CreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t // memcpy(&pPipeNode[i]->computePipelineCI, (const void *)&pCreateInfos[i], sizeof(VkComputePipelineCreateInfo)); // TODO: Add Compute Pipeline Verification + skipCall |= !validate_compute_pipeline(dev_data->report_data, pPipeNode[i], + &dev_data->phys_dev_properties.features, + dev_data->shaderModuleMap); // skipCall |= verifyPipelineCreateState(dev_data, device, pPipeNode[i]); } -- cgit v1.2.3 From a9ec01cf6e4c109fb7e8b20ba4ac8c3de64693fe Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Tue, 31 May 2016 16:45:13 +1200 Subject: layers: Make precise DS validation work for both bind points Signed-off-by: Chris Forbes --- layers/core_validation.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 806d594a..46bfaddf 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -2784,9 +2784,10 @@ static bool validate_and_update_draw_state(layer_data *my_data, GLOBAL_CB_NODE * } // Now complete other state checks - // TODO : When Compute shaders are properly parsed, fix this section to validate them as well if (state.pipelineLayout) { string errorString; + auto pipelineLayout = (bindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS) ? pPipe->graphicsPipelineCI.layout : pPipe->computePipelineCI.layout; + // Need a vector (vs. std::set) of active Sets for dynamicOffset validation in case same set bound w/ different offsets vector, std::vector const *>> activeSetBindingsPairs; for (auto & setBindingPair : pPipe->active_slots) { @@ -2798,7 +2799,7 @@ static bool validate_and_update_draw_state(layer_data *my_data, GLOBAL_CB_NODE * "VkPipeline 0x%" PRIxLEAST64 " uses set #%u but that set is not bound.", (uint64_t)pPipe->pipeline, setIndex); } else if (!verify_set_layout_compatibility(my_data, state.boundDescriptorSets[setIndex], - pPipe->graphicsPipelineCI.layout, setIndex, errorString)) { + pipelineLayout, setIndex, errorString)) { // Set is bound but not compatible w/ overlapping pipelineLayout from PSO VkDescriptorSet setHandle = state.boundDescriptorSets[setIndex]->GetSet(); result |= @@ -2806,7 +2807,7 @@ static bool validate_and_update_draw_state(layer_data *my_data, GLOBAL_CB_NODE * (uint64_t)setHandle, __LINE__, DRAWSTATE_PIPELINE_LAYOUTS_INCOMPATIBLE, "DS", "VkDescriptorSet (0x%" PRIxLEAST64 ") bound as set #%u is not compatible with overlapping VkPipelineLayout 0x%" PRIxLEAST64 " due to: %s", - (uint64_t)setHandle, setIndex, (uint64_t)pPipe->graphicsPipelineCI.layout, errorString.c_str()); + (uint64_t)setHandle, setIndex, (uint64_t)pipelineLayout, errorString.c_str()); } else { // Valid set is bound and layout compatible, validate that it's updated // Pull the set node cvdescriptorset::DescriptorSet *pSet = state.boundDescriptorSets[setIndex]; -- cgit v1.2.3 From 3abf44e4873001e85d24c14c0d0ba4aa98714016 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Tue, 31 May 2016 16:33:48 +1200 Subject: layers: Do accurate draw-time validation of descriptors used by compute Signed-off-by: Chris Forbes --- layers/core_validation.cpp | 208 ++++++++++++++++++++++----------------------- 1 file changed, 100 insertions(+), 108 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 46bfaddf..2c932512 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -2681,25 +2681,75 @@ static VkSampleCountFlagBits getNumSamples(PIPELINE_NODE const *pipe) { } // Validate draw-time state related to the PSO -static bool validatePipelineDrawtimeState(layer_data const *my_data, const GLOBAL_CB_NODE *pCB, - const VkPipelineBindPoint pipelineBindPoint, PIPELINE_NODE const *pPipeline) { +static bool validatePipelineDrawtimeState(layer_data const *my_data, + LAST_BOUND_STATE const &state, + const GLOBAL_CB_NODE *pCB, + PIPELINE_NODE const *pPipeline) { bool skip_call = false; - if (VK_PIPELINE_BIND_POINT_GRAPHICS == pipelineBindPoint) { - // Verify that any MSAA request in PSO matches sample# in bound FB - // Skip the check if rasterization is disabled. - if (!pPipeline->graphicsPipelineCI.pRasterizationState || - (pPipeline->graphicsPipelineCI.pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) { - VkSampleCountFlagBits pso_num_samples = getNumSamples(pPipeline); - if (pCB->activeRenderPass) { - const VkRenderPassCreateInfo *render_pass_info = pCB->activeRenderPass->pCreateInfo; - const VkSubpassDescription *subpass_desc = &render_pass_info->pSubpasses[pCB->activeSubpass]; - VkSampleCountFlagBits subpass_num_samples = VkSampleCountFlagBits(0); - uint32_t i; - - const safe_VkPipelineColorBlendStateCreateInfo *color_blend_state = pPipeline->graphicsPipelineCI.pColorBlendState; - if ((color_blend_state != NULL) && (pCB->activeSubpass == pPipeline->graphicsPipelineCI.subpass) && - (color_blend_state->attachmentCount != subpass_desc->colorAttachmentCount)) { - skip_call |= + + // Verify Vtx binding + if (pPipeline->vertexBindingDescriptions.size() > 0) { + for (size_t i = 0; i < pPipeline->vertexBindingDescriptions.size(); i++) { + if ((pCB->currentDrawData.buffers.size() < (i + 1)) || (pCB->currentDrawData.buffers[i] == VK_NULL_HANDLE)) { + skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, + __LINE__, DRAWSTATE_VTX_INDEX_OUT_OF_BOUNDS, "DS", + "The Pipeline State Object (0x%" PRIxLEAST64 + ") expects that this Command Buffer's vertex binding Index " PRINTF_SIZE_T_SPECIFIER + " should be set via vkCmdBindVertexBuffers.", + (uint64_t)state.pipeline, i); + } + } + } else { + if (!pCB->currentDrawData.buffers.empty()) { + skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, + 0, __LINE__, DRAWSTATE_VTX_INDEX_OUT_OF_BOUNDS, "DS", + "Vertex buffers are bound to command buffer (0x%" PRIxLEAST64 + ") but no vertex buffers are attached to this Pipeline State Object (0x%" PRIxLEAST64 ").", + (uint64_t)pCB->commandBuffer, (uint64_t)state.pipeline); + } + } + // If Viewport or scissors are dynamic, verify that dynamic count matches PSO count. + // Skip check if rasterization is disabled or there is no viewport. + if ((!pPipeline->graphicsPipelineCI.pRasterizationState || + (pPipeline->graphicsPipelineCI.pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) && + pPipeline->graphicsPipelineCI.pViewportState) { + bool dynViewport = isDynamic(pPipeline, VK_DYNAMIC_STATE_VIEWPORT); + bool dynScissor = isDynamic(pPipeline, VK_DYNAMIC_STATE_SCISSOR); + if (dynViewport) { + if (pCB->viewports.size() != pPipeline->graphicsPipelineCI.pViewportState->viewportCount) { + skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, + __LINE__, DRAWSTATE_VIEWPORT_SCISSOR_MISMATCH, "DS", + "Dynamic viewportCount from vkCmdSetViewport() is " PRINTF_SIZE_T_SPECIFIER + ", but PSO viewportCount is %u. These counts must match.", + pCB->viewports.size(), pPipeline->graphicsPipelineCI.pViewportState->viewportCount); + } + } + if (dynScissor) { + if (pCB->scissors.size() != pPipeline->graphicsPipelineCI.pViewportState->scissorCount) { + skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, + __LINE__, DRAWSTATE_VIEWPORT_SCISSOR_MISMATCH, "DS", + "Dynamic scissorCount from vkCmdSetScissor() is " PRINTF_SIZE_T_SPECIFIER + ", but PSO scissorCount is %u. These counts must match.", + pCB->scissors.size(), pPipeline->graphicsPipelineCI.pViewportState->scissorCount); + } + } + } + + // Verify that any MSAA request in PSO matches sample# in bound FB + // Skip the check if rasterization is disabled. + if (!pPipeline->graphicsPipelineCI.pRasterizationState || + (pPipeline->graphicsPipelineCI.pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) { + VkSampleCountFlagBits pso_num_samples = getNumSamples(pPipeline); + if (pCB->activeRenderPass) { + const VkRenderPassCreateInfo *render_pass_info = pCB->activeRenderPass->pCreateInfo; + const VkSubpassDescription *subpass_desc = &render_pass_info->pSubpasses[pCB->activeSubpass]; + VkSampleCountFlagBits subpass_num_samples = VkSampleCountFlagBits(0); + uint32_t i; + + const safe_VkPipelineColorBlendStateCreateInfo *color_blend_state = pPipeline->graphicsPipelineCI.pColorBlendState; + if ((color_blend_state != NULL) && (pCB->activeSubpass == pPipeline->graphicsPipelineCI.subpass) && + (color_blend_state->attachmentCount != subpass_desc->colorAttachmentCount)) { + skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, reinterpret_cast(pPipeline->pipeline), __LINE__, DRAWSTATE_INVALID_RENDERPASS, "DS", "Render pass subpass %u mismatch with blending state defined and blend state attachment " @@ -2707,53 +2757,51 @@ static bool validatePipelineDrawtimeState(layer_data const *my_data, const GLOBA "must be the same at draw-time.", pCB->activeSubpass, color_blend_state->attachmentCount, subpass_desc->colorAttachmentCount, reinterpret_cast(pPipeline->pipeline)); - } + } - for (i = 0; i < subpass_desc->colorAttachmentCount; i++) { - VkSampleCountFlagBits samples; + for (i = 0; i < subpass_desc->colorAttachmentCount; i++) { + VkSampleCountFlagBits samples; - if (subpass_desc->pColorAttachments[i].attachment == VK_ATTACHMENT_UNUSED) - continue; + if (subpass_desc->pColorAttachments[i].attachment == VK_ATTACHMENT_UNUSED) + continue; - samples = render_pass_info->pAttachments[subpass_desc->pColorAttachments[i].attachment].samples; - if (subpass_num_samples == static_cast(0)) { - subpass_num_samples = samples; - } else if (subpass_num_samples != samples) { - subpass_num_samples = static_cast(-1); - break; - } + samples = render_pass_info->pAttachments[subpass_desc->pColorAttachments[i].attachment].samples; + if (subpass_num_samples == static_cast(0)) { + subpass_num_samples = samples; + } else if (subpass_num_samples != samples) { + subpass_num_samples = static_cast(-1); + break; } - if ((subpass_desc->pDepthStencilAttachment != NULL) && - (subpass_desc->pDepthStencilAttachment->attachment != VK_ATTACHMENT_UNUSED)) { - const VkSampleCountFlagBits samples = + } + if ((subpass_desc->pDepthStencilAttachment != NULL) && + (subpass_desc->pDepthStencilAttachment->attachment != VK_ATTACHMENT_UNUSED)) { + const VkSampleCountFlagBits samples = render_pass_info->pAttachments[subpass_desc->pDepthStencilAttachment->attachment].samples; - if (subpass_num_samples == static_cast(0)) - subpass_num_samples = samples; - else if (subpass_num_samples != samples) - subpass_num_samples = static_cast(-1); - } + if (subpass_num_samples == static_cast(0)) + subpass_num_samples = samples; + else if (subpass_num_samples != samples) + subpass_num_samples = static_cast(-1); + } - if (((subpass_desc->colorAttachmentCount > 0) || (subpass_desc->pDepthStencilAttachment != NULL)) && - (pso_num_samples != subpass_num_samples)) { - skip_call |= + if (((subpass_desc->colorAttachmentCount > 0) || (subpass_desc->pDepthStencilAttachment != NULL)) && + (pso_num_samples != subpass_num_samples)) { + skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, reinterpret_cast(pPipeline->pipeline), __LINE__, DRAWSTATE_NUM_SAMPLES_MISMATCH, "DS", "Num samples mismatch! At draw-time in Pipeline (0x%" PRIxLEAST64 ") with %u samples while current RenderPass (0x%" PRIxLEAST64 ") w/ %u samples!", reinterpret_cast(pPipeline->pipeline), pso_num_samples, reinterpret_cast(pCB->activeRenderPass->renderPass), subpass_num_samples); - } - } else { - skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, - reinterpret_cast(pPipeline->pipeline), __LINE__, DRAWSTATE_NUM_SAMPLES_MISMATCH, "DS", - "No active render pass found at draw-time in Pipeline (0x%" PRIxLEAST64 ")!", - reinterpret_cast(pPipeline->pipeline)); } + } else { + skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, + reinterpret_cast(pPipeline->pipeline), __LINE__, DRAWSTATE_NUM_SAMPLES_MISMATCH, "DS", + "No active render pass found at draw-time in Pipeline (0x%" PRIxLEAST64 ")!", + reinterpret_cast(pPipeline->pipeline)); } - // TODO : Add more checks here - } else { - // TODO : Validate non-gfx pipeline updates } + // TODO : Add more checks here + return skip_call; } @@ -2775,13 +2823,6 @@ static bool validate_and_update_draw_state(layer_data *my_data, GLOBAL_CB_NODE * // First check flag states if (VK_PIPELINE_BIND_POINT_GRAPHICS == bindPoint) result = validate_draw_state_flags(my_data, pCB, pPipe, indexedDraw); - else { - // First block of code below to validate active sets should eventually - // work for the compute case but currently doesn't so return early for now - // TODO : When active sets in compute shaders are correctly parsed, - // stop returning early here and handle them in top block below - return result; - } // Now complete other state checks if (state.pipelineLayout) { @@ -2833,59 +2874,10 @@ static bool validate_and_update_draw_state(layer_data *my_data, GLOBAL_CB_NODE * // For given active slots, verify any dynamic descriptors and record updated images & buffers result |= validate_and_update_drawtime_descriptor_state(my_data, pCB, activeSetBindingsPairs); } - // TODO : If/when compute pipelines/shaders are handled above, code below is only for gfx bind poing - //if (VK_PIPELINE_BIND_POINT_GRAPHICS == bindPoint) { - // Verify Vtx binding - if (pPipe->vertexBindingDescriptions.size() > 0) { - for (size_t i = 0; i < pPipe->vertexBindingDescriptions.size(); i++) { - if ((pCB->currentDrawData.buffers.size() < (i + 1)) || (pCB->currentDrawData.buffers[i] == VK_NULL_HANDLE)) { - result |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, - __LINE__, DRAWSTATE_VTX_INDEX_OUT_OF_BOUNDS, "DS", - "The Pipeline State Object (0x%" PRIxLEAST64 - ") expects that this Command Buffer's vertex binding Index " PRINTF_SIZE_T_SPECIFIER - " should be set via vkCmdBindVertexBuffers.", - (uint64_t)state.pipeline, i); - } - } - } else { - if (!pCB->currentDrawData.buffers.empty()) { - result |= log_msg(my_data->report_data, VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, - 0, __LINE__, DRAWSTATE_VTX_INDEX_OUT_OF_BOUNDS, "DS", - "Vertex buffers are bound to command buffer (0x%" PRIxLEAST64 - ") but no vertex buffers are attached to this Pipeline State Object (0x%" PRIxLEAST64 ").", - (uint64_t)pCB->commandBuffer, (uint64_t)state.pipeline); - } - } - // If Viewport or scissors are dynamic, verify that dynamic count matches PSO count. - // Skip check if rasterization is disabled or there is no viewport. - if ((!pPipe->graphicsPipelineCI.pRasterizationState || - (pPipe->graphicsPipelineCI.pRasterizationState->rasterizerDiscardEnable == VK_FALSE)) && - pPipe->graphicsPipelineCI.pViewportState) { - bool dynViewport = isDynamic(pPipe, VK_DYNAMIC_STATE_VIEWPORT); - bool dynScissor = isDynamic(pPipe, VK_DYNAMIC_STATE_SCISSOR); - if (dynViewport) { - if (pCB->viewports.size() != pPipe->graphicsPipelineCI.pViewportState->viewportCount) { - result |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, - __LINE__, DRAWSTATE_VIEWPORT_SCISSOR_MISMATCH, "DS", - "Dynamic viewportCount from vkCmdSetViewport() is " PRINTF_SIZE_T_SPECIFIER - ", but PSO viewportCount is %u. These counts must match.", - pCB->viewports.size(), pPipe->graphicsPipelineCI.pViewportState->viewportCount); - } - } - if (dynScissor) { - if (pCB->scissors.size() != pPipe->graphicsPipelineCI.pViewportState->scissorCount) { - result |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, - __LINE__, DRAWSTATE_VIEWPORT_SCISSOR_MISMATCH, "DS", - "Dynamic scissorCount from vkCmdSetScissor() is " PRINTF_SIZE_T_SPECIFIER - ", but PSO scissorCount is %u. These counts must match.", - pCB->scissors.size(), pPipe->graphicsPipelineCI.pViewportState->scissorCount); - } - } - } - //} // end of "if (VK_PIPELINE_BIND_POINT_GRAPHICS == bindPoint) {" block // Check general pipeline state that needs to be validated at drawtime - result |= validatePipelineDrawtimeState(my_data, pCB, bindPoint, pPipe); + if (VK_PIPELINE_BIND_POINT_GRAPHICS == bindPoint) + result |= validatePipelineDrawtimeState(my_data, state, pCB, pPipe); return result; } -- cgit v1.2.3 From 413eae5c4dc394f99f4b89e91346ce77fe74bc11 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Tue, 31 May 2016 16:34:40 +1200 Subject: layers: Remove old hacks for imprecise descriptor tracking for compute We do it properly now. Signed-off-by: Chris Forbes --- layers/core_validation.cpp | 15 --------------- layers/descriptor_sets.cpp | 10 +--------- layers/descriptor_sets.h | 3 --- 3 files changed, 1 insertion(+), 27 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 2c932512..933c2f2d 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -2659,17 +2659,6 @@ static bool validate_and_update_drawtime_descriptor_state( } return result; } -// TODO : This is a temp function that naively updates bound storage images and buffers based on which descriptor sets are bound. -// When validate_and_update_draw_state() handles compute shaders so that active_slots is correct for compute pipelines, this -// function can be killed and validate_and_update_draw_state() used instead -static void update_shader_storage_images_and_buffers(layer_data *dev_data, GLOBAL_CB_NODE *pCB) { - // For the bound descriptor sets, pull off any storage images and buffers - // This may be more than are actually updated depending on which are active, but for now this is a stop-gap for compute - // pipelines - for (auto set : pCB->lastBound[VK_PIPELINE_BIND_POINT_COMPUTE].uniqueBoundSets) { - set->GetAllStorageUpdates(&pCB->updateBuffers, &pCB->updateImages); - } -} // For given pipeline, return number of MSAA samples, or one if MSAA disabled static VkSampleCountFlagBits getNumSamples(PIPELINE_NODE const *pipe) { @@ -6884,8 +6873,6 @@ VKAPI_ATTR void VKAPI_CALL CmdDispatch(VkCommandBuffer commandBuffer, uint32_t x GLOBAL_CB_NODE *pCB = getCBNode(dev_data, commandBuffer); if (pCB) { skipCall |= validate_and_update_draw_state(dev_data, pCB, false, VK_PIPELINE_BIND_POINT_COMPUTE); - // TODO : Call below is temporary until call above can be re-enabled - update_shader_storage_images_and_buffers(dev_data, pCB); skipCall |= markStoreImagesAndBuffersAsWritten(dev_data, pCB); skipCall |= addCmd(dev_data, pCB, CMD_DISPATCH, "vkCmdDispatch()"); skipCall |= insideRenderPass(dev_data, pCB, "vkCmdDispatch"); @@ -6907,8 +6894,6 @@ CmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize GLOBAL_CB_NODE *pCB = getCBNode(dev_data, commandBuffer); if (pCB) { skipCall |= validate_and_update_draw_state(dev_data, pCB, false, VK_PIPELINE_BIND_POINT_COMPUTE); - // TODO : Call below is temporary until call above can be re-enabled - update_shader_storage_images_and_buffers(dev_data, pCB); skipCall |= markStoreImagesAndBuffersAsWritten(dev_data, pCB); skipCall |= addCmd(dev_data, pCB, CMD_DISPATCHINDIRECT, "vkCmdDispatchIndirect()"); skipCall |= insideRenderPass(dev_data, pCB, "vkCmdDispatchIndirect"); diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index 5fc1de3f..b0e16e82 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -451,14 +451,6 @@ uint32_t cvdescriptorset::DescriptorSet::GetStorageUpdates(const std::unordered_ } return num_updates; } -// This is a special case for compute shaders that should eventually be removed once we have proper valid binding info for compute -// case -uint32_t cvdescriptorset::DescriptorSet::GetAllStorageUpdates(std::unordered_set *buffer_set, - std::unordered_set *image_set) const { - std::unordered_set binding_set; - p_layout_->FillBindingSet(&binding_set); - return GetStorageUpdates(binding_set, buffer_set, image_set); -} // Set is being deleted or updates so invalidate all bound cmd buffers void cvdescriptorset::DescriptorSet::InvalidateBoundCmdBuffers() { for (auto cb_node : bound_cmd_buffers_) { @@ -1131,4 +1123,4 @@ bool cvdescriptorset::DescriptorSet::VerifyCopyUpdateContents(const VkCopyDescri } // All checks passed so update contents are good return true; -} \ No newline at end of file +} diff --git a/layers/descriptor_sets.h b/layers/descriptor_sets.h index 6f2073b7..6a0d7e78 100644 --- a/layers/descriptor_sets.h +++ b/layers/descriptor_sets.h @@ -310,9 +310,6 @@ class DescriptorSet : public BASE_NODE { // of objects inserted uint32_t GetStorageUpdates(const std::unordered_set &, std::unordered_set *, std::unordered_set *) const; - // For all descriptors in a set, add any buffers and images that may be updated to their respective unordered_sets & return - // number of objects inserted - uint32_t GetAllStorageUpdates(std::unordered_set *, std::unordered_set *) const; // Descriptor Update functions. These functions validate state and perform update separately // Validate contents of a WriteUpdate -- cgit v1.2.3 From 6f5dd3a71005a54cfc2c672cfd579f8996650420 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Mon, 30 May 2016 07:36:59 +0800 Subject: add vk-layer-introspect It can be used to validate the introspection functions or generate the manifest file for a layer library. $ ./vk-layer-introspect build/layers/libVkLayer_core_validation.so { "file_format_version": "1.0.0", "layer": { "api_version": "1.0.13", "description": "LunarG Validation Layer", "implementation_version": "1", "instance_extensions": [ { "name": "VK_EXT_debug_report", "spec_version": "2" } ], "library_path": "./libVkLayer_core_validation.so", "name": "VK_LAYER_LUNARG_core_validation", "type": "GLOBAL" } } --- vk-layer-introspect | 399 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 399 insertions(+) create mode 100755 vk-layer-introspect diff --git a/vk-layer-introspect b/vk-layer-introspect new file mode 100755 index 00000000..e64373e1 --- /dev/null +++ b/vk-layer-introspect @@ -0,0 +1,399 @@ +#!/usr/bin/env python3 +# +# Copyright (c) 2016 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. + +import argparse +import ctypes +import json +import os +import platform +import sys +import xml.etree.ElementTree + +if platform.system() == "Windows": + VKAPI_DLL = ctypes.windll + VKAPI_FUNCTYPE = ctypes.WINFUNCTYPE +else: + VKAPI_DLL = ctypes.cdll + VKAPI_FUNCTYPE = ctypes.CFUNCTYPE + +# Vulkan types + +VkInstance = ctypes.c_void_p +VkPhysicalDevice = ctypes.c_void_p +VkDevice = ctypes.c_void_p +VkResult = ctypes.c_int + + +class VkLayerProperties(ctypes.Structure): + _fields_ = [("c_layerName", ctypes.c_char * 256), + ("c_specVersion", ctypes.c_uint32), + ("c_implementationVersion", ctypes.c_uint32), + ("c_description", ctypes.c_char * 256)] + + def layer_name(self): + return self.c_layerName.decode() + + def spec_version(self): + return "%d.%d.%d" % ( + self.c_specVersion >> 22, + (self.c_specVersion >> 12) & 0x3ff, + self.c_specVersion & 0xfff) + + def implementation_version(self): + return str(self.c_implementationVersion) + + def description(self): + return self.c_description.decode() + + def __eq__(self, other): + return (self.c_layerName == other.c_layerName and + self.c_specVersion == other.c_specVersion and + self.c_implementationVersion == other.c_implementationVersion and + self.c_description == other.c_description) + + +class VkExtensionProperties(ctypes.Structure): + _fields_ = [("c_extensionName", ctypes.c_char * 256), + ("c_specVersion", ctypes.c_uint32)] + + def extension_name(self): + return self.c_extensionName.decode() + + def spec_version(self): + return str(self.c_specVersion) + +# Vulkan commands + +PFN_vkVoidFunction = VKAPI_FUNCTYPE(None) +PFN_vkEnumerateInstanceExtensionProperties = VKAPI_FUNCTYPE( + VkResult, ctypes.c_char_p, ctypes.POINTER(ctypes.c_uint32), ctypes.POINTER(VkExtensionProperties)) +PFN_vkEnumerateDeviceExtensionProperties = VKAPI_FUNCTYPE( + VkResult, VkPhysicalDevice, ctypes.c_char_p, ctypes.POINTER(ctypes.c_uint32), ctypes.POINTER(VkExtensionProperties)) +PFN_vkEnumerateInstanceLayerProperties = VKAPI_FUNCTYPE( + VkResult, ctypes.POINTER(ctypes.c_uint32), ctypes.POINTER(VkLayerProperties)) +PFN_vkEnumerateDeviceLayerProperties = VKAPI_FUNCTYPE( + VkResult, VkPhysicalDevice, ctypes.POINTER(ctypes.c_uint32), ctypes.POINTER(VkLayerProperties)) +PFN_vkGetInstanceProcAddr = VKAPI_FUNCTYPE( + PFN_vkVoidFunction, VkInstance, ctypes.c_char_p) +PFN_vkGetDeviceProcAddr = VKAPI_FUNCTYPE( + PFN_vkVoidFunction, VkDevice, ctypes.c_char_p) + + +class Layer(object): + + def __init__(self, *args): + self.props = args[0] + self.is_global = args[1] + self.instance_extensions = args[2] + self.device_extensions = args[3] + self.gipa_name = args[4] + self.gdpa_name = args[5] + + +class LayerLibrary(object): + + def __init__(self, path): + self.library = None + self.version = 0 + + self._load(path) + self._negotiate_version() + + def introspect(self): + if self.version == 0: + layers = self._enumerate_layers_v0() + else: + raise RuntimeError("unsupported v%d library" % self.version) + + return layers + + def _load(self, path): + try: + abspath = os.path.abspath(path) + self.library = VKAPI_DLL.LoadLibrary(abspath) + except OSError: + raise RuntimeError("failed to load library") + + def _unload(self): + # no clean way to unload + pass + + def _negotiate_version(self): + # only v0 + self.version = 0 + + def _enumerate_properties_errcheck_v0(self, result, func, args): + if isinstance(func, PFN_vkEnumerateInstanceLayerProperties): + func_name = "vkEnumerateInstanceLayerProperties" + elif isinstance(func, PFN_vkEnumerateDeviceLayerProperties): + func_name = "vkEnumerateDeviceLayerProperties" + elif isinstance(func, PFN_vkEnumerateInstanceExtensionProperties): + func_name = "vkEnumerateInstanceExtensionProperties" + elif isinstance(func, PFN_vkEnumerateDeviceExtensionProperties): + func_name = "vkEnumerateDeviceExtensionProperties" + else: + raise AssertionError("unexpected vkEnumerate*Properties call") + + if result != 0: + raise RuntimeError(func_name + " failed with " + str(result)) + + # pProperties and pCount mismatch + if args[-1] and len(args[-1]) != args[-2].value: + raise RuntimeError("invalid pCount returned in " + func_name) + + return args[-1] + + def _enumerate_properties_prototype_v0(self, func_name): + prototypes = { + "vkEnumerateInstanceLayerProperties": + PFN_vkEnumerateInstanceLayerProperties, + "vkEnumerateDeviceLayerProperties": + PFN_vkEnumerateDeviceLayerProperties, + "vkEnumerateInstanceExtensionProperties": + PFN_vkEnumerateInstanceExtensionProperties, + "vkEnumerateDeviceExtensionProperties": + PFN_vkEnumerateDeviceExtensionProperties, + } + prototype = prototypes[func_name] + + try: + proc = prototype((func_name, self.library)) + except AttributeError: + raise RuntimeError(func_name + " is missing") + + proc.errcheck = self._enumerate_properties_errcheck_v0 + + return proc + + def _get_gipa_name_v0(self, layer_name, can_fallback): + names = [layer_name + "GetInstanceProcAddr"] + if can_fallback: + names.append("vkGetInstanceProcAddr") + + for name in names: + try: + PFN_vkGetInstanceProcAddr((name, self.library)) + return name + except AttributeError: + pass + + raise RuntimeError(" or ".join(names) + " is missing") + + def _get_gdpa_name_v0(self, layer_name, can_fallback): + names = [layer_name + "GetDeviceProcAddr"] + if can_fallback: + names.append("vkGetDeviceProcAddr") + + for name in names: + try: + PFN_vkGetDeviceProcAddr((name, self.library)) + return name + except AttributeError: + pass + + raise RuntimeError(" or ".join(names) + " is missing") + + def _enumerate_layers_v0(self): + tmp_count = ctypes.c_uint32() + + # enumerate instance layers + enumerate_instance_layer_properties = self._enumerate_properties_prototype_v0( + "vkEnumerateInstanceLayerProperties") + enumerate_instance_layer_properties(tmp_count, None) + p_props = enumerate_instance_layer_properties( + tmp_count, (VkLayerProperties * tmp_count.value)()) + + # enumerate device layers + enumerate_device_layer_properties = self._enumerate_properties_prototype_v0( + "vkEnumerateDeviceLayerProperties") + enumerate_device_layer_properties(None, tmp_count, None) + dev_p_props = enumerate_device_layer_properties( + None, tmp_count, (VkLayerProperties * tmp_count.value)()) + + # there must not be device-only layers + for props in dev_p_props: + if props not in p_props: + raise RuntimeError( + "unexpected device-only layer " + props.layer_name()) + + layers = [] + for props in p_props: + is_global = (props in dev_p_props) + + # enumerate instance extensions + enumerate_instance_extension_properties = self._enumerate_properties_prototype_v0( + "vkEnumerateInstanceExtensionProperties") + enumerate_instance_extension_properties( + props.c_layerName, tmp_count, None) + instance_extensions = enumerate_instance_extension_properties( + props.c_layerName, + tmp_count, + (VkExtensionProperties * tmp_count.value)()) + + gipa_name = self._get_gipa_name_v0( + props.layer_name(), + len(p_props) == 1) + + if is_global: + # enumerate device extensions + enumerate_device_extension_properties = self._enumerate_properties_prototype_v0( + "vkEnumerateDeviceExtensionProperties") + enumerate_device_extension_properties( + None, props.c_layerName, tmp_count, None) + device_extensions = enumerate_device_extension_properties( + None, + props.c_layerName, + tmp_count, + (VkExtensionProperties * tmp_count.value)()) + + gdpa_name = self._get_gdpa_name_v0( + props.layer_name(), + len(p_props) == 1) + else: + device_extensions = None + gdpa_name = None + + layers.append( + Layer(props, is_global, instance_extensions, device_extensions, gipa_name, gdpa_name)) + + return layers + + +def serialize_layers(layers, path, ext_cmds): + data = {} + data["file_format_version"] = '1.0.0' + + for idx, layer in enumerate(layers): + layer_data = {} + + layer_data["name"] = layer.props.layer_name() + layer_data["api_version"] = layer.props.spec_version() + layer_data[ + "implementation_version"] = layer.props.implementation_version() + layer_data["description"] = layer.props.description() + + layer_data["type"] = "GLOBAL" if layer.is_global else "INSTANCE" + + # TODO more flexible + layer_data["library_path"] = os.path.join(".", os.path.basename(path)) + + funcs = {} + if layer.gipa_name != "vkGetInstanceProcAddr": + funcs["vkGetInstanceProcAddr"] = layer.gipa_name + if layer.is_global and layer.gdpa_name != "vkGetDeviceProcAddr": + funcs["vkGetDeviceProcAddr"] = layer.gdpa_name + if funcs: + layer_data["functions"] = funcs + + if layer.instance_extensions: + exts = [{ + "name": ext.extension_name(), + "spec_version": ext.spec_version(), + } for ext in layer.instance_extensions] + layer_data["instance_extensions"] = exts + + if layer.device_extensions: + exts = [] + for ext in layer.device_extensions: + try: + cmds = ext_cmds[ext.extension_name()] + except KeyError: + raise RuntimeError( + "unknown device extension " + ext.extension_name()) + else: + ext_data = {} + ext_data["name"] = ext.extension_name() + ext_data["spec_version"] = ext.spec_version() + if cmds: + ext_data["entrypoints"] = cmds + + exts.append(ext_data) + + layer_data["device_extensions"] = exts + + if idx > 0: + data["layer.%d" % idx] = layer_data + else: + data["layer"] = layer_data + + return data + + +def dump_json(data): + dump = json.dumps(data, indent=4, sort_keys=True) + + # replace "layer." by "layer" + lines = dump.split("\n") + for line in lines: + if line.startswith(" \"layer.") and line.endswith("\": {"): + line = " \"layer\": {" + print(line) + + +def parse_vk_xml(path): + """Parse vk.xml to get commands added by extensions.""" + tree = xml.etree.ElementTree.parse(path) + extensions = tree.find("extensions") + + ext_cmds = {} + for ext in extensions.iter("extension"): + if ext.attrib["supported"] != "vulkan": + continue + + cmds = [] + for cmd in ext.iter("command"): + cmds.append(cmd.attrib["name"]) + + ext_cmds[ext.attrib["name"]] = cmds + + return ext_cmds + + +def add_custom_ext_cmds(ext_cmds): + """Add commands added by in-development extensions.""" + # VK_LAYER_LUNARG_basic + ext_cmds["vkLayerBasicEXT"] = ["vkLayerBasicEXT"] + + +def main(): + default_vk_xml = sys.path[0] + "/vk.xml" if sys.path[0] else "vk.xml" + + parser = argparse.ArgumentParser(description="Introspect a layer library.") + parser.add_argument( + "-x", dest="vk_xml", default=default_vk_xml, help="Path to vk.xml") + parser.add_argument( + "layer_libs", metavar="layer-lib", nargs="+", help="Path to a layer library") + args = parser.parse_args() + + try: + ext_cmds = parse_vk_xml(args.vk_xml) + except Exception as e: + print("failed to parse %s: %s" % (args.vk_xml, e)) + sys.exit(-1) + + add_custom_ext_cmds(ext_cmds) + + for path in args.layer_libs: + try: + ll = LayerLibrary(path) + layers = ll.introspect() + data = serialize_layers(layers, path, ext_cmds) + dump_json(data) + except RuntimeError as err: + print("skipping %s: %s" % (path, err)) + +if __name__ == "__main__": + main() -- cgit v1.2.3 From 57b4be486a1a214450ac3edb40d1b6968c1591a8 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Mon, 30 May 2016 11:47:31 +1200 Subject: layers: take better advantage of emplace_back in descriptor sets Doesn't win us anything to use emplace_back to invoke a copy constructor. Construct the unique_ptr from raw ptr in-place instead. Signed-off-by: Chris Forbes --- layers/descriptor_sets.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index b0e16e82..2867a134 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -280,9 +280,9 @@ cvdescriptorset::DescriptorSet::DescriptorSet(const VkDescriptorSet set, const D auto immut_sampler = p_layout_->GetImmutableSamplerPtrFromIndex(i); for (uint32_t di = 0; di < p_layout_->GetDescriptorCountFromIndex(i); ++di) { if (immut_sampler) - descriptors_.emplace_back(std::unique_ptr(new SamplerDescriptor(immut_sampler + di))); + descriptors_.emplace_back(new SamplerDescriptor(immut_sampler + di)); else - descriptors_.emplace_back(std::unique_ptr(new SamplerDescriptor())); + descriptors_.emplace_back(new SamplerDescriptor()); } break; } @@ -290,9 +290,9 @@ cvdescriptorset::DescriptorSet::DescriptorSet(const VkDescriptorSet set, const D auto immut = p_layout_->GetImmutableSamplerPtrFromIndex(i); for (uint32_t di = 0; di < p_layout_->GetDescriptorCountFromIndex(i); ++di) { if (immut) - descriptors_.emplace_back(std::unique_ptr(new ImageSamplerDescriptor(immut + di))); + descriptors_.emplace_back(new ImageSamplerDescriptor(immut + di)); else - descriptors_.emplace_back(std::unique_ptr(new ImageSamplerDescriptor())); + descriptors_.emplace_back(new ImageSamplerDescriptor()); } break; } @@ -301,19 +301,19 @@ cvdescriptorset::DescriptorSet::DescriptorSet(const VkDescriptorSet set, const D case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: for (uint32_t di = 0; di < p_layout_->GetDescriptorCountFromIndex(i); ++di) - descriptors_.emplace_back(std::unique_ptr(new ImageDescriptor(type))); + descriptors_.emplace_back(new ImageDescriptor(type)); break; case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: for (uint32_t di = 0; di < p_layout_->GetDescriptorCountFromIndex(i); ++di) - descriptors_.emplace_back(std::unique_ptr(new TexelDescriptor(type))); + descriptors_.emplace_back(new TexelDescriptor(type)); break; case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: for (uint32_t di = 0; di < p_layout_->GetDescriptorCountFromIndex(i); ++di) - descriptors_.emplace_back(std::unique_ptr(new BufferDescriptor(type))); + descriptors_.emplace_back(new BufferDescriptor(type)); break; default: assert(0); // Bad descriptor type specified -- cgit v1.2.3 From 9557cc3e3feb80245e75b1b7966574e52d8dd115 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 26 May 2016 13:12:38 -0600 Subject: layers: Make layer_data const in getPoolNode() Remove "[]" map operator and use iterator from find instead to return pool ptr so that layer_data param can be const. This will allow this function to be used from "PreValidate" calls where no state is changed. --- layers/core_validation.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 933c2f2d..ff93d9a6 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -3122,11 +3122,12 @@ static void deletePipelines(layer_data *my_data) { // Block of code at start here specifically for managing/tracking DSs // Return Pool node ptr for specified pool or else NULL -static DESCRIPTOR_POOL_NODE *getPoolNode(layer_data *my_data, const VkDescriptorPool pool) { - if (my_data->descriptorPoolMap.find(pool) == my_data->descriptorPoolMap.end()) { +static DESCRIPTOR_POOL_NODE *getPoolNode(const layer_data *dev_data, const VkDescriptorPool pool) { + auto pool_it = dev_data->descriptorPoolMap.find(pool); + if (pool_it == dev_data->descriptorPoolMap.end()) { return NULL; } - return my_data->descriptorPoolMap[pool]; + return pool_it->second; } // Return false if update struct is of valid type, otherwise flag error and return code from callback -- cgit v1.2.3 From e4ca22360d4a70d21c171d9f69dd502298211724 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 26 May 2016 13:30:45 -0600 Subject: layers: Refactor FreeDescriptorSets() Create PreValidate/PostRecord functions for FreeDescriptorSets(). Currently the validation and state updates are handled in-line in these functions, but this change makes it easy to migrate the code to descriptor pool class without affecting top-level intercept function. --- layers/core_validation.cpp | 76 +++++++++++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 32 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index ff93d9a6..fcc25f39 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -5869,18 +5869,18 @@ ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescript // Ensure the pool contains enough descriptors and descriptor sets to satisfy // an allocation request. Fills requiredDescriptorsByType with the total number // of descriptors of each type required, for later update. -static bool PreCallValidateAllocateDescriptorSets(layer_data *dev_data, DESCRIPTOR_POOL_NODE *pPoolNode, uint32_t count, - std::vector const & layout_nodes, +static bool PreCallValidateAllocateDescriptorSets(const layer_data *dev_data, const DESCRIPTOR_POOL_NODE *pPoolNode, uint32_t count, + std::vector const &layout_nodes, uint32_t requiredDescriptorsByType[]) { bool skipCall = false; // Track number of descriptorSets allowable in this pool if (pPoolNode->availableSets < count) { skipCall |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, - reinterpret_cast(pPoolNode->pool), __LINE__, DRAWSTATE_DESCRIPTOR_POOL_EMPTY, "DS", + reinterpret_cast(pPoolNode->pool), __LINE__, DRAWSTATE_DESCRIPTOR_POOL_EMPTY, "DS", "Unable to allocate %u descriptorSets from pool 0x%" PRIxLEAST64 ". This pool only has %d descriptorSets remaining.", - count, reinterpret_cast(pPoolNode->pool), pPoolNode->availableSets); + count, reinterpret_cast(pPoolNode->pool), pPoolNode->availableSets); } // Count total descriptors required per type @@ -5977,48 +5977,60 @@ AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllo } return result; } +// Verify state before freeing DescriptorSets +static bool PreCallValidateFreeDescriptorSets(const layer_data *dev_data, VkDescriptorPool pool, uint32_t count, + const VkDescriptorSet *descriptor_sets) { + bool skip_call = false; + // First make sure sets being destroyed are not currently in-use + for (uint32_t i = 0; i < count; ++i) + skip_call |= validateIdleDescriptorSet(dev_data, descriptor_sets[i], "vkFreeDescriptorSets"); + + DESCRIPTOR_POOL_NODE *pool_node = getPoolNode(dev_data, pool); + if (pool_node && !(VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT & pool_node->createInfo.flags)) { + // Can't Free from a NON_FREE pool + skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, + reinterpret_cast(pool), __LINE__, DRAWSTATE_CANT_FREE_FROM_NON_FREE_POOL, "DS", + "It is invalid to call vkFreeDescriptorSets() with a pool created without setting " + "VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT."); + } + return skip_call; +} +// Sets have been removed from the pool so update underlying state +static void PostCallRecordFreeDescriptorSets(layer_data *dev_data, VkDescriptorPool pool, uint32_t count, + const VkDescriptorSet *descriptor_sets) { + DESCRIPTOR_POOL_NODE *pool_state = getPoolNode(dev_data, pool); + // Update available descriptor sets in pool + pool_state->availableSets += count; + + // For each freed descriptor add its resources back into the pool as available and remove from pool and setMap + for (uint32_t i = 0; i < count; ++i) { + auto set_state = dev_data->setMap[descriptor_sets[i]]; + uint32_t type_index = 0, descriptor_count = 0; + for (uint32_t j = 0; j < set_state->GetBindingCount(); ++j) { + type_index = static_cast(set_state->GetTypeFromIndex(j)); + descriptor_count = set_state->GetDescriptorCountFromIndex(j); + pool_state->availableDescriptorTypeCount[type_index] += descriptor_count; + } + freeDescriptorSet(dev_data, set_state); + pool_state->sets.erase(set_state); + } +} VKAPI_ATTR VkResult VKAPI_CALL FreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t count, const VkDescriptorSet *pDescriptorSets) { - bool skipCall = false; layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); // Make sure that no sets being destroyed are in-flight std::unique_lock lock(global_lock); - for (uint32_t i = 0; i < count; ++i) - skipCall |= validateIdleDescriptorSet(dev_data, pDescriptorSets[i], "vkFreeDescriptorSets"); - DESCRIPTOR_POOL_NODE *pPoolNode = getPoolNode(dev_data, descriptorPool); - if (pPoolNode && !(VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT & pPoolNode->createInfo.flags)) { - // Can't Free from a NON_FREE pool - skipCall |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, - (uint64_t)device, __LINE__, DRAWSTATE_CANT_FREE_FROM_NON_FREE_POOL, "DS", - "It is invalid to call vkFreeDescriptorSets() with a pool created without setting " - "VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT."); - } + bool skipCall = PreCallValidateFreeDescriptorSets(dev_data, descriptorPool, count, pDescriptorSets); lock.unlock(); if (skipCall) return VK_ERROR_VALIDATION_FAILED_EXT; VkResult result = dev_data->device_dispatch_table->FreeDescriptorSets(device, descriptorPool, count, pDescriptorSets); if (VK_SUCCESS == result) { lock.lock(); - - // Update available descriptor sets in pool - pPoolNode->availableSets += count; - - // For each freed descriptor add its resources back into the pool as available and remove from pool and setMap - for (uint32_t i = 0; i < count; ++i) { - cvdescriptorset::DescriptorSet *pSet = dev_data->setMap[pDescriptorSets[i]]; // getSetNode() without locking - uint32_t typeIndex = 0, poolSizeCount = 0; - for (uint32_t j = 0; j < pSet->GetBindingCount(); ++j) { - typeIndex = static_cast(pSet->GetTypeFromIndex(j)); - poolSizeCount = pSet->GetDescriptorCountFromIndex(j); - pPoolNode->availableDescriptorTypeCount[typeIndex] += poolSizeCount; - } - freeDescriptorSet(dev_data, pSet); - pPoolNode->sets.erase(pSet); - } + PostCallRecordFreeDescriptorSets(dev_data, descriptorPool, count, pDescriptorSets); lock.unlock(); } - // TODO : Any other clean-up or book-keeping to do here? return result; } // TODO : This is a Proof-of-concept for core validation architecture -- cgit v1.2.3 From e5d662877d01e94f8518d5a837cbd145591200ca Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 26 May 2016 13:39:11 -0600 Subject: layers: Update freeDescriptorSet() comment --- layers/core_validation.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index fcc25f39..381ca02e 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -3411,7 +3411,7 @@ static bool validateIdleDescriptorSet(const layer_data *my_data, VkDescriptorSet return skip_call; } -// Free the descriptor set, remove it from setMap and invalidate any cmd buffers that it was bound to +// Remove set from setMap and delete the set static void freeDescriptorSet(layer_data *dev_data, cvdescriptorset::DescriptorSet *descriptor_set) { dev_data->setMap.erase(descriptor_set->GetSet()); delete descriptor_set; -- cgit v1.2.3 From 580f8733d50dc60a82ae252fcc758771f511a5e5 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Tue, 24 May 2016 11:14:43 -0600 Subject: layers: Add usage bit validation for image descriptors Verify that images used in imageView that's passed to various image descriptor types have the correct usage bits set. --- layers/descriptor_sets.cpp | 55 ++++++++++++++++++++++++++++++++++++++-------- layers/descriptor_sets.h | 3 ++- 2 files changed, 48 insertions(+), 10 deletions(-) diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index 2867a134..72299ccf 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -585,7 +585,7 @@ bool cvdescriptorset::ValidateSampler(const VkSampler sampler, return (sampler_map->count(sampler) != 0); } -bool cvdescriptorset::ValidateImageUpdate(const VkImageView image_view, const VkImageLayout image_layout, +bool cvdescriptorset::ValidateImageUpdate(VkImageView image_view, VkImageLayout image_layout, VkDescriptorType type, const std::unordered_map *image_view_map, const std::unordered_map *image_map, const std::unordered_map *image_to_swapchain_map, @@ -599,12 +599,15 @@ bool cvdescriptorset::ValidateImageUpdate(const VkImageView image_view, const Vk return false; } else { // Validate that imageLayout is compatible with aspect_mask and image format + // and validate that image usage bits are correct for given usage VkImageAspectFlags aspect_mask = image_pair->second.subresourceRange.aspectMask; VkImage image = image_pair->second.image; VkFormat format = VK_FORMAT_MAX_ENUM; + VkImageUsageFlags usage = 0; auto img_pair = image_map->find(image); if (img_pair != image_map->end()) { format = img_pair->second.createInfo.format; + usage = img_pair->second.createInfo.usage; } else { // Also need to check the swapchains. auto swapchain_pair = image_to_swapchain_map->find(image); @@ -616,6 +619,7 @@ bool cvdescriptorset::ValidateImageUpdate(const VkImageView image_view, const Vk } } } + // First validate that format and layout are compatible if (format == VK_FORMAT_MAX_ENUM) { std::stringstream error_str; error_str << "Invalid image (" << image << ") in imageView (" << image_view << ")."; @@ -676,6 +680,39 @@ bool cvdescriptorset::ValidateImageUpdate(const VkImageView image_view, const Vk break; } } + // Now validate that usage flags are correctly set for given type of update + std::string error_usage_bit; + switch (type) { + case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: + case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: { + if (!(usage & VK_IMAGE_USAGE_SAMPLED_BIT)) { + error_usage_bit = "VK_IMAGE_USAGE_SAMPLED_BIT"; + } + break; + } + case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: { + if (!(usage & VK_IMAGE_USAGE_STORAGE_BIT)) { + error_usage_bit = "VK_IMAGE_USAGE_STORAGE_BIT"; + } + break; + } + case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: { + if (!(usage & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT)) { + error_usage_bit = "VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT"; + } + break; + } + default: + break; + } + if (!error_usage_bit.empty()) { + std::stringstream error_str; + error_str << "ImageView (" << image_view << ") with usage mask 0x" << usage + << " being used for a descriptor update of type " << string_VkDescriptorType(type) << " does not have " + << error_usage_bit << " set."; + *error = error_str.str(); + return false; + } } return true; } @@ -954,8 +991,8 @@ bool cvdescriptorset::DescriptorSet::VerifyWriteUpdateContents(const VkWriteDesc // Validate image auto image_view = update->pImageInfo[di].imageView; auto image_layout = update->pImageInfo[di].imageLayout; - if (!ValidateImageUpdate(image_view, image_layout, image_view_map_, image_map_, image_to_swapchain_map_, swapchain_map_, - error)) { + if (!ValidateImageUpdate(image_view, image_layout, update->descriptorType, image_view_map_, image_map_, + image_to_swapchain_map_, swapchain_map_, error)) { std::stringstream error_str; error_str << "Attempted write update to combined image sampler descriptor failed due to: " << error->c_str(); *error = error_str.str(); @@ -986,8 +1023,8 @@ bool cvdescriptorset::DescriptorSet::VerifyWriteUpdateContents(const VkWriteDesc for (uint32_t di = 0; di < update->descriptorCount; ++di) { auto image_view = update->pImageInfo[di].imageView; auto image_layout = update->pImageInfo[di].imageLayout; - if (!ValidateImageUpdate(image_view, image_layout, image_view_map_, image_map_, image_to_swapchain_map_, swapchain_map_, - error)) { + if (!ValidateImageUpdate(image_view, image_layout, update->descriptorType, image_view_map_, image_map_, + image_to_swapchain_map_, swapchain_map_, error)) { std::stringstream error_str; error_str << "Attempted write update to image descriptor failed due to: " << error->c_str(); *error = error_str.str(); @@ -1069,8 +1106,8 @@ bool cvdescriptorset::DescriptorSet::VerifyCopyUpdateContents(const VkCopyDescri // Validate image auto image_view = img_samp_desc->GetImageView(); auto image_layout = img_samp_desc->GetImageLayout(); - if (!ValidateImageUpdate(image_view, image_layout, image_view_map_, image_map_, image_to_swapchain_map_, swapchain_map_, - error)) { + if (!ValidateImageUpdate(image_view, image_layout, src_set->GetTypeFromGlobalIndex(index), image_view_map_, image_map_, + image_to_swapchain_map_, swapchain_map_, error)) { std::stringstream error_str; error_str << "Attempted write update to combined image sampler descriptor failed due to: " << error->c_str(); *error = error_str.str(); @@ -1083,8 +1120,8 @@ bool cvdescriptorset::DescriptorSet::VerifyCopyUpdateContents(const VkCopyDescri auto img_desc = static_cast(src_set->descriptors_[index + di].get()); auto image_view = img_desc->GetImageView(); auto image_layout = img_desc->GetImageLayout(); - if (!ValidateImageUpdate(image_view, image_layout, image_view_map_, image_map_, image_to_swapchain_map_, swapchain_map_, - error)) { + if (!ValidateImageUpdate(image_view, image_layout, src_set->GetTypeFromGlobalIndex(index), image_view_map_, image_map_, + image_to_swapchain_map_, swapchain_map_, error)) { std::stringstream error_str; error_str << "Attempted write update to image descriptor failed due to: " << error->c_str(); *error = error_str.str(); diff --git a/layers/descriptor_sets.h b/layers/descriptor_sets.h index 6a0d7e78..a3cf28df 100644 --- a/layers/descriptor_sets.h +++ b/layers/descriptor_sets.h @@ -161,7 +161,8 @@ class Descriptor { // Shared helper functions - These are useful because the shared sampler image descriptor type // performs common functions with both sampler and image descriptors so they can share their common functions bool ValidateSampler(const VkSampler, const std::unordered_map> *); -bool ValidateImageUpdate(const VkImageView, const VkImageLayout, const std::unordered_map *, +bool ValidateImageUpdate(VkImageView, VkImageLayout, VkDescriptorType, + const std::unordered_map *, const std::unordered_map *, const std::unordered_map *, const std::unordered_map *, std::string *); -- cgit v1.2.3 From 6eaa12d7fc3aa90e433d7f694238a72306453925 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Tue, 24 May 2016 12:33:42 -0600 Subject: layers: Add usage bit validation for buffer descriptors Verify that buffer used to update all buffer descriptor types (texel or general) has the correct usage bits set. descriptor --- layers/descriptor_sets.cpp | 63 +++++++++++++++++++++++++++++++++++++++++++--- layers/descriptor_sets.h | 1 + 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index 72299ccf..c3f9e3b1 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -982,6 +982,55 @@ bool cvdescriptorset::DescriptorSet::ValidateWriteUpdate(const debug_report_data // All checks passed, update is clean return true; } +// For the given buffer, verify that its creation parameters are appropriate for the given type +// If there's an error, update the error string with details and return false, else return true +bool cvdescriptorset::DescriptorSet::ValidateBufferUpdate(VkBuffer buffer, VkDescriptorType type, std::string *error) const { + // First make sure that buffer is valid + auto buff_it = buffer_map_->find(buffer); + if (buff_it == buffer_map_->end()) { + std::stringstream error_str; + error_str << "Invalid VkBuffer: " << buffer; + *error = error_str.str(); + return false; + } + // Verify that usage bits set correctly for given type + auto usage = buff_it->second.createInfo.usage; + std::string error_usage_bit; + switch (type) { + case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: + if (!(usage & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) { + error_usage_bit = "VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT"; + } + break; + case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: + if (!(usage & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT)) { + error_usage_bit = "VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT"; + } + break; + case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: + case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: + if (!(usage & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) { + error_usage_bit = "VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT"; + } + break; + case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: + case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: + if (!(usage & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) { + error_usage_bit = "VK_BUFFER_USAGE_STORAGE_BUFFER_BIT"; + } + break; + default: + break; + } + if (!error_usage_bit.empty()) { + std::stringstream error_str; + error_str << "Buffer (" << buffer << ") with usage mask 0x" << usage << " being used for a descriptor update of type " + << string_VkDescriptorType(type) << " does not have " << error_usage_bit << " set."; + *error = error_str.str(); + return false; + } + return true; +} // Verify that the contents of the update are ok, but don't perform actual update bool cvdescriptorset::DescriptorSet::VerifyWriteUpdateContents(const VkWriteDescriptorSet *update, const uint32_t index, std::string *error) const { @@ -1037,12 +1086,20 @@ bool cvdescriptorset::DescriptorSet::VerifyWriteUpdateContents(const VkWriteDesc case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: { for (uint32_t di = 0; di < update->descriptorCount; ++di) { auto buffer_view = update->pTexelBufferView[di]; - if (!buffer_view_map_->count(buffer_view)) { + auto buffer_view_it = buffer_view_map_->find(buffer_view); + if (buffer_view_it == buffer_view_map_->end()) { std::stringstream error_str; error_str << "Attempted write update to texel buffer descriptor with invalid buffer view: " << buffer_view; *error = error_str.str(); return false; } + auto buffer = buffer_view_it->second.buffer; + if (!ValidateBufferUpdate(buffer, update->descriptorType, error)) { + std::stringstream error_str; + error_str << "Attempted write update to texel buffer descriptor failed due to: " << error->c_str(); + *error = error_str.str(); + return false; + } } break; } @@ -1052,9 +1109,9 @@ bool cvdescriptorset::DescriptorSet::VerifyWriteUpdateContents(const VkWriteDesc case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: { for (uint32_t di = 0; di < update->descriptorCount; ++di) { auto buffer = update->pBufferInfo[di].buffer; - if (!buffer_map_->count(buffer)) { + if (!ValidateBufferUpdate(buffer, update->descriptorType, error)) { std::stringstream error_str; - error_str << "Attempted write update to buffer descriptor with invalid buffer: " << buffer; + error_str << "Attempted write update to buffer descriptor failed due to: " << error->c_str(); *error = error_str.str(); return false; } diff --git a/layers/descriptor_sets.h b/layers/descriptor_sets.h index a3cf28df..a211d2f6 100644 --- a/layers/descriptor_sets.h +++ b/layers/descriptor_sets.h @@ -346,6 +346,7 @@ class DescriptorSet : public BASE_NODE { private: bool VerifyWriteUpdateContents(const VkWriteDescriptorSet *, const uint32_t, std::string *) const; bool VerifyCopyUpdateContents(const VkCopyDescriptorSet *, const DescriptorSet *, const uint32_t, std::string *) const; + bool ValidateBufferUpdate(VkBuffer, VkDescriptorType, std::string *) const; // Private helper to set all bound cmd buffers to INVALID state void InvalidateBoundCmdBuffers(); bool some_update_; // has any part of the set ever been updated? -- cgit v1.2.3 From ae2eb29829c370138f08131b2246f67a0cc0ddd1 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Tue, 24 May 2016 12:35:57 -0600 Subject: layers: Remove unneeded else block The "if" case returns so no need for this else block or the indentation that it includes. --- layers/descriptor_sets.cpp | 66 ++++++++++++++++++++++------------------------ 1 file changed, 32 insertions(+), 34 deletions(-) diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index c3f9e3b1..e6c8ab65 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -944,40 +944,38 @@ bool cvdescriptorset::DescriptorSet::ValidateWriteUpdate(const debug_report_data error_str << "DescriptorSet " << set_ << " does not have binding " << update->dstBinding << "."; *error_msg = error_str.str(); return false; - } else { - // We know that binding is valid, verify update and do update on each descriptor - auto start_idx = p_layout_->GetGlobalStartIndexFromBinding(update->dstBinding) + update->dstArrayElement; - auto type = p_layout_->GetTypeFromBinding(update->dstBinding); - if (type != update->descriptorType) { - std::stringstream error_str; - error_str << "Attempting write update to descriptor set " << set_ << " binding #" << update->dstBinding << " with type " - << string_VkDescriptorType(type) << " but update type is " << string_VkDescriptorType(update->descriptorType); - *error_msg = error_str.str(); - return false; - } - if ((start_idx + update->descriptorCount) > p_layout_->GetTotalDescriptorCount()) { - std::stringstream error_str; - error_str << "Attempting write update to descriptor set " << set_ << " binding #" << update->dstBinding << " with " - << p_layout_->GetTotalDescriptorCount() << " total descriptors but update of " << update->descriptorCount - << " descriptors starting at binding offset of " - << p_layout_->GetGlobalStartIndexFromBinding(update->dstBinding) - << " combined with update array element offset of " << update->dstArrayElement - << " oversteps the size of this descriptor set."; - *error_msg = error_str.str(); - return false; - } - // Verify consecutive bindings match (if needed) - if (!p_layout_->VerifyUpdateConsistency(update->dstBinding, update->dstArrayElement, update->descriptorCount, - "write update to", set_, error_msg)) - return false; - // Update is within bounds and consistent so last step is to validate update contents - if (!VerifyWriteUpdateContents(update, start_idx, error_msg)) { - std::stringstream error_str; - error_str << "Write update to descriptor in set " << set_ << " binding #" << update->dstBinding - << " failed with error message: " << error_msg->c_str(); - *error_msg = error_str.str(); - return false; - } + } + // We know that binding is valid, verify update and do update on each descriptor + auto start_idx = p_layout_->GetGlobalStartIndexFromBinding(update->dstBinding) + update->dstArrayElement; + auto type = p_layout_->GetTypeFromBinding(update->dstBinding); + if (type != update->descriptorType) { + std::stringstream error_str; + error_str << "Attempting write update to descriptor set " << set_ << " binding #" << update->dstBinding << " with type " + << string_VkDescriptorType(type) << " but update type is " << string_VkDescriptorType(update->descriptorType); + *error_msg = error_str.str(); + return false; + } + if ((start_idx + update->descriptorCount) > p_layout_->GetTotalDescriptorCount()) { + std::stringstream error_str; + error_str << "Attempting write update to descriptor set " << set_ << " binding #" << update->dstBinding << " with " + << p_layout_->GetTotalDescriptorCount() << " total descriptors but update of " << update->descriptorCount + << " descriptors starting at binding offset of " << p_layout_->GetGlobalStartIndexFromBinding(update->dstBinding) + << " combined with update array element offset of " << update->dstArrayElement + << " oversteps the size of this descriptor set."; + *error_msg = error_str.str(); + return false; + } + // Verify consecutive bindings match (if needed) + if (!p_layout_->VerifyUpdateConsistency(update->dstBinding, update->dstArrayElement, update->descriptorCount, "write update to", + set_, error_msg)) + return false; + // Update is within bounds and consistent so last step is to validate update contents + if (!VerifyWriteUpdateContents(update, start_idx, error_msg)) { + std::stringstream error_str; + error_str << "Write update to descriptor in set " << set_ << " binding #" << update->dstBinding + << " failed with error message: " << error_msg->c_str(); + *error_msg = error_str.str(); + return false; } // All checks passed, update is clean return true; -- cgit v1.2.3 From b4e1c579bd811fa59ffbd5e6bad6cd4c25722d91 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Tue, 24 May 2016 13:07:12 -0600 Subject: layers: Improve descriptor copy update validation Add buffer usage bit validation for descriptor copy updates. Pass down known descriptor type to copy validate function to avoid having to look it up again. Fix various incorrect "write" references in the copy update error messages. --- layers/descriptor_sets.cpp | 32 ++++++++++++++++++++------------ layers/descriptor_sets.h | 3 ++- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index e6c8ab65..db712175 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -545,7 +545,7 @@ bool cvdescriptorset::DescriptorSet::ValidateCopyUpdate(const debug_report_data } } // Update parameters all look good and descriptor updated so verify update contents - if (!VerifyCopyUpdateContents(update, src_set, src_start_idx, error)) + if (!VerifyCopyUpdateContents(update, src_set, src_type, src_start_idx, error)) return false; // All checks passed so update is good @@ -1125,7 +1125,7 @@ bool cvdescriptorset::DescriptorSet::VerifyWriteUpdateContents(const VkWriteDesc } // Verify that the contents of the update are ok, but don't perform actual update bool cvdescriptorset::DescriptorSet::VerifyCopyUpdateContents(const VkCopyDescriptorSet *update, const DescriptorSet *src_set, - const uint32_t index, std::string *error) const { + VkDescriptorType type, uint32_t index, std::string *error) const { switch (src_set->descriptors_[index]->descriptor_class) { case PlainSampler: { for (uint32_t di = 0; di < update->descriptorCount; ++di) { @@ -1161,10 +1161,10 @@ bool cvdescriptorset::DescriptorSet::VerifyCopyUpdateContents(const VkCopyDescri // Validate image auto image_view = img_samp_desc->GetImageView(); auto image_layout = img_samp_desc->GetImageLayout(); - if (!ValidateImageUpdate(image_view, image_layout, src_set->GetTypeFromGlobalIndex(index), image_view_map_, image_map_, - image_to_swapchain_map_, swapchain_map_, error)) { + if (!ValidateImageUpdate(image_view, image_layout, type, image_view_map_, image_map_, image_to_swapchain_map_, + swapchain_map_, error)) { std::stringstream error_str; - error_str << "Attempted write update to combined image sampler descriptor failed due to: " << error->c_str(); + error_str << "Attempted copy update to combined image sampler descriptor failed due to: " << error->c_str(); *error = error_str.str(); return false; } @@ -1175,10 +1175,10 @@ bool cvdescriptorset::DescriptorSet::VerifyCopyUpdateContents(const VkCopyDescri auto img_desc = static_cast(src_set->descriptors_[index + di].get()); auto image_view = img_desc->GetImageView(); auto image_layout = img_desc->GetImageLayout(); - if (!ValidateImageUpdate(image_view, image_layout, src_set->GetTypeFromGlobalIndex(index), image_view_map_, image_map_, - image_to_swapchain_map_, swapchain_map_, error)) { + if (!ValidateImageUpdate(image_view, image_layout, type, image_view_map_, image_map_, image_to_swapchain_map_, + swapchain_map_, error)) { std::stringstream error_str; - error_str << "Attempted write update to image descriptor failed due to: " << error->c_str(); + error_str << "Attempted copy update to image descriptor failed due to: " << error->c_str(); *error = error_str.str(); return false; } @@ -1188,9 +1188,17 @@ bool cvdescriptorset::DescriptorSet::VerifyCopyUpdateContents(const VkCopyDescri case TexelBuffer: { for (uint32_t di = 0; di < update->descriptorCount; ++di) { auto buffer_view = static_cast(src_set->descriptors_[index + di].get())->GetBufferView(); - if (!buffer_view_map_->count(buffer_view)) { + auto bv_it = buffer_view_map_->find(buffer_view); + if (bv_it == buffer_view_map_->end()) { std::stringstream error_str; - error_str << "Attempted write update to texel buffer descriptor with invalid buffer view: " << buffer_view; + error_str << "Attempted copy update to texel buffer descriptor with invalid buffer view: " << buffer_view; + *error = error_str.str(); + return false; + } + auto buffer = bv_it->second.buffer; + if (!ValidateBufferUpdate(buffer, type, error)) { + std::stringstream error_str; + error_str << "Attempted copy update to texel buffer descriptor failed due to: " << error->c_str(); *error = error_str.str(); return false; } @@ -1200,9 +1208,9 @@ bool cvdescriptorset::DescriptorSet::VerifyCopyUpdateContents(const VkCopyDescri case GeneralBuffer: { for (uint32_t di = 0; di < update->descriptorCount; ++di) { auto buffer = static_cast(src_set->descriptors_[index + di].get())->GetBuffer(); - if (!buffer_map_->count(buffer)) { + if (!ValidateBufferUpdate(buffer, type, error)) { std::stringstream error_str; - error_str << "Attempted write update to buffer descriptor with invalid buffer: " << buffer; + error_str << "Attempted copy update to buffer descriptor failed due to: " << error->c_str(); *error = error_str.str(); return false; } diff --git a/layers/descriptor_sets.h b/layers/descriptor_sets.h index a211d2f6..b0496b1e 100644 --- a/layers/descriptor_sets.h +++ b/layers/descriptor_sets.h @@ -345,7 +345,8 @@ class DescriptorSet : public BASE_NODE { private: bool VerifyWriteUpdateContents(const VkWriteDescriptorSet *, const uint32_t, std::string *) const; - bool VerifyCopyUpdateContents(const VkCopyDescriptorSet *, const DescriptorSet *, const uint32_t, std::string *) const; + bool VerifyCopyUpdateContents(const VkCopyDescriptorSet *, const DescriptorSet *, VkDescriptorType, uint32_t, + std::string *) const; bool ValidateBufferUpdate(VkBuffer, VkDescriptorType, std::string *) const; // Private helper to set all bound cmd buffers to INVALID state void InvalidateBoundCmdBuffers(); -- cgit v1.2.3 From 89723f04c08dc243479759cf1c300e5b978ec090 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Wed, 25 May 2016 09:24:36 -0600 Subject: layers: DescriptorSet class indentation fixes More cases where "else" blocks weren't needed because the "if" block returns. --- layers/descriptor_sets.cpp | 202 ++++++++++++++++++++++----------------------- 1 file changed, 100 insertions(+), 102 deletions(-) diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index db712175..e1602251 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -597,122 +597,120 @@ bool cvdescriptorset::ValidateImageUpdate(VkImageView image_view, VkImageLayout error_str << "Invalid VkImageView: " << image_view; *error = error_str.str(); return false; + } + // Validate that imageLayout is compatible with aspect_mask and image format + // and validate that image usage bits are correct for given usage + VkImageAspectFlags aspect_mask = image_pair->second.subresourceRange.aspectMask; + VkImage image = image_pair->second.image; + VkFormat format = VK_FORMAT_MAX_ENUM; + VkImageUsageFlags usage = 0; + auto img_pair = image_map->find(image); + if (img_pair != image_map->end()) { + format = img_pair->second.createInfo.format; + usage = img_pair->second.createInfo.usage; } else { - // Validate that imageLayout is compatible with aspect_mask and image format - // and validate that image usage bits are correct for given usage - VkImageAspectFlags aspect_mask = image_pair->second.subresourceRange.aspectMask; - VkImage image = image_pair->second.image; - VkFormat format = VK_FORMAT_MAX_ENUM; - VkImageUsageFlags usage = 0; - auto img_pair = image_map->find(image); - if (img_pair != image_map->end()) { - format = img_pair->second.createInfo.format; - usage = img_pair->second.createInfo.usage; - } else { - // Also need to check the swapchains. - auto swapchain_pair = image_to_swapchain_map->find(image); - if (swapchain_pair != image_to_swapchain_map->end()) { - VkSwapchainKHR swapchain = swapchain_pair->second; - auto swapchain_pair = swapchain_map->find(swapchain); - if (swapchain_pair != swapchain_map->end()) { - format = swapchain_pair->second->createInfo.imageFormat; - } + // Also need to check the swapchains. + auto swapchain_pair = image_to_swapchain_map->find(image); + if (swapchain_pair != image_to_swapchain_map->end()) { + VkSwapchainKHR swapchain = swapchain_pair->second; + auto swapchain_pair = swapchain_map->find(swapchain); + if (swapchain_pair != swapchain_map->end()) { + format = swapchain_pair->second->createInfo.imageFormat; } } - // First validate that format and layout are compatible - if (format == VK_FORMAT_MAX_ENUM) { + } + // First validate that format and layout are compatible + if (format == VK_FORMAT_MAX_ENUM) { + std::stringstream error_str; + error_str << "Invalid image (" << image << ") in imageView (" << image_view << ")."; + *error = error_str.str(); + return false; + } + bool ds = vk_format_is_depth_or_stencil(format); + switch (image_layout) { + case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: + // Only Color bit must be set + if ((aspect_mask & VK_IMAGE_ASPECT_COLOR_BIT) != VK_IMAGE_ASPECT_COLOR_BIT) { std::stringstream error_str; - error_str << "Invalid image (" << image << ") in imageView (" << image_view << ")."; + error_str << "ImageView (" << image_view << ") uses layout VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL but does " + "not have VK_IMAGE_ASPECT_COLOR_BIT set."; *error = error_str.str(); return false; - } else { - bool ds = vk_format_is_depth_or_stencil(format); - switch (image_layout) { - case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: - // Only Color bit must be set - if ((aspect_mask & VK_IMAGE_ASPECT_COLOR_BIT) != VK_IMAGE_ASPECT_COLOR_BIT) { - std::stringstream error_str; - error_str << "ImageView (" << image_view << ") uses layout VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL but does " - "not have VK_IMAGE_ASPECT_COLOR_BIT set."; - *error = error_str.str(); - return false; - } - // format must NOT be DS - if (ds) { - std::stringstream error_str; - error_str << "ImageView (" << image_view - << ") uses layout VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL but the image format is " - << string_VkFormat(format) << " which is not a color format."; - *error = error_str.str(); - return false; - } - break; - case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL: - case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL: - // Depth or stencil bit must be set, but both must NOT be set - if (aspect_mask & VK_IMAGE_ASPECT_DEPTH_BIT) { - if (aspect_mask & VK_IMAGE_ASPECT_STENCIL_BIT) { - // both must NOT be set - std::stringstream error_str; - error_str << "ImageView (" << image_view << ") has both STENCIL and DEPTH aspects set"; - *error = error_str.str(); - return false; - } - } else if (!(aspect_mask & VK_IMAGE_ASPECT_STENCIL_BIT)) { - // Neither were set - std::stringstream error_str; - error_str << "ImageView (" << image_view << ") has layout " << string_VkImageLayout(image_layout) - << " but does not have STENCIL or DEPTH aspects set"; - *error = error_str.str(); - return false; - } - // format must be DS - if (!ds) { - std::stringstream error_str; - error_str << "ImageView (" << image_view << ") has layout " << string_VkImageLayout(image_layout) - << " but the image format is " << string_VkFormat(format) << " which is not a depth/stencil format."; - *error = error_str.str(); - return false; - } - break; - default: - // anything to check for other layouts? - break; - } - } - // Now validate that usage flags are correctly set for given type of update - std::string error_usage_bit; - switch (type) { - case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: - case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: { - if (!(usage & VK_IMAGE_USAGE_SAMPLED_BIT)) { - error_usage_bit = "VK_IMAGE_USAGE_SAMPLED_BIT"; - } - break; } - case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: { - if (!(usage & VK_IMAGE_USAGE_STORAGE_BIT)) { - error_usage_bit = "VK_IMAGE_USAGE_STORAGE_BIT"; - } - break; + // format must NOT be DS + if (ds) { + std::stringstream error_str; + error_str << "ImageView (" << image_view + << ") uses layout VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL but the image format is " + << string_VkFormat(format) << " which is not a color format."; + *error = error_str.str(); + return false; } - case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: { - if (!(usage & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT)) { - error_usage_bit = "VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT"; + break; + case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL: + case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL: + // Depth or stencil bit must be set, but both must NOT be set + if (aspect_mask & VK_IMAGE_ASPECT_DEPTH_BIT) { + if (aspect_mask & VK_IMAGE_ASPECT_STENCIL_BIT) { + // both must NOT be set + std::stringstream error_str; + error_str << "ImageView (" << image_view << ") has both STENCIL and DEPTH aspects set"; + *error = error_str.str(); + return false; } - break; - } - default: - break; + } else if (!(aspect_mask & VK_IMAGE_ASPECT_STENCIL_BIT)) { + // Neither were set + std::stringstream error_str; + error_str << "ImageView (" << image_view << ") has layout " << string_VkImageLayout(image_layout) + << " but does not have STENCIL or DEPTH aspects set"; + *error = error_str.str(); + return false; } - if (!error_usage_bit.empty()) { + // format must be DS + if (!ds) { std::stringstream error_str; - error_str << "ImageView (" << image_view << ") with usage mask 0x" << usage - << " being used for a descriptor update of type " << string_VkDescriptorType(type) << " does not have " - << error_usage_bit << " set."; + error_str << "ImageView (" << image_view << ") has layout " << string_VkImageLayout(image_layout) + << " but the image format is " << string_VkFormat(format) << " which is not a depth/stencil format."; *error = error_str.str(); return false; } + break; + default: + // anything to check for other layouts? + break; + } + // Now validate that usage flags are correctly set for given type of update + std::string error_usage_bit; + switch (type) { + case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: + case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: { + if (!(usage & VK_IMAGE_USAGE_SAMPLED_BIT)) { + error_usage_bit = "VK_IMAGE_USAGE_SAMPLED_BIT"; + } + break; + } + case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: { + if (!(usage & VK_IMAGE_USAGE_STORAGE_BIT)) { + error_usage_bit = "VK_IMAGE_USAGE_STORAGE_BIT"; + } + break; + } + case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: { + if (!(usage & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT)) { + error_usage_bit = "VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT"; + } + break; + } + default: + break; + } + if (!error_usage_bit.empty()) { + std::stringstream error_str; + error_str << "ImageView (" << image_view << ") with usage mask 0x" << usage + << " being used for a descriptor update of type " << string_VkDescriptorType(type) << " does not have " + << error_usage_bit << " set."; + *error = error_str.str(); + return false; } return true; } -- cgit v1.2.3 From 5e2ec68b6ef8d3f818ec63722fe0235348544377 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Wed, 25 May 2016 11:12:50 -0600 Subject: tests: Add descriptor usage bit tests When updating descriptor sets, correct usage bit must be set depending on the type of update. New test, DSUsageBitsErrors cycles through all of the different update types that can hit usage bit errors and intentionally hits all of the errors. --- layers/vk_validation_layer_details.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layers/vk_validation_layer_details.md b/layers/vk_validation_layer_details.md index 9636c2d2..89bc6eb9 100644 --- a/layers/vk_validation_layer_details.md +++ b/layers/vk_validation_layer_details.md @@ -55,7 +55,7 @@ The Draw State portion of the core validation layer tracks state leading into Dr | DS Update Size | DS update out of bounds for given layout section. | DESCRIPTOR_UPDATE_OUT_OF_BOUNDS | vkUpdateDescriptorSets | DSUpdateOutOfBounds CopyDescriptorUpdateErrors | NA | | Descriptor Pool empty | Attempt to allocate descriptor type from descriptor pool when no more of that type are available to be allocated. | DESCRIPTOR_POOL_EMPTY | vkAllocateDescriptorSets | AllocDescriptorFromEmptyPool | NA | | Free from NON_FREE Pool | It's invalid to call vkFreeDescriptorSets() on Sets that were allocated from a Pool created with NON_FREE usage. | CANT_FREE_FROM_NON_FREE_POOL | vkFreeDescriptorSets | TODO | NA | -| DS Update Index | DS update binding too large for layout binding count. | INVALID_UPDATE_INDEX | vkUpdateDescriptorSets | InvalidDSUpdateIndex CopyDescriptorUpdateErrors | NA | +| DS Update Index | DS update binding too large for layout binding count. | INVALID_UPDATE_INDEX | vkUpdateDescriptorSets | InvalidDSUpdateIndex CopyDescriptorUpdateErrors DSUsageBitsErrors | NA | | DS Update Type | Verifies that structs in DS Update tree are properly created, currently valid, and of the right type | INVALID_UPDATE_STRUCT | vkUpdateDescriptorSets | InvalidDSUpdateStruct | NA | | MSAA Sample Count | Verifies that Pipeline, RenderPass, and Subpass sample counts are consistent | NUM_SAMPLES_MISMATCH | vkCmdBindPipeline vkCmdBeginRenderPass vkCmdNextSubpass | NumSamplesMismatch | NA | | Dynamic Viewport State Binding | Verify that viewport dynamic state bound to Cmd Buffer at Draw time | VIEWPORT_NOT_BOUND |vkCmdDraw vkCmdDrawIndexed vkCmdDrawIndirect vkCmdDrawIndexedIndirect | DynamicViewportNotBound | NA | -- cgit v1.2.3 From a2db2e813fb357dc9cd49cfd8d3027b88e5c793b Mon Sep 17 00:00:00 2001 From: Cody Northrop Date: Wed, 25 May 2016 08:23:45 -0600 Subject: toolchain: Simplify setup for shaderc, use https instead of git@ --- build-android/update_external_sources_android.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build-android/update_external_sources_android.sh b/build-android/update_external_sources_android.sh index e728d893..4ceaeeb9 100755 --- a/build-android/update_external_sources_android.sh +++ b/build-android/update_external_sources_android.sh @@ -66,7 +66,7 @@ function create_shaderc () { rm -rf $BASEDIR/shaderc echo "Creating local shaderc repository ($BASEDIR/shaderc)." cd $BASEDIR - git clone git@github.com:google/shaderc.git + git clone https://github.com/google/shaderc.git cd shaderc git checkout $SHADERC_REVISION } -- cgit v1.2.3 From 6a4abdf7cd3702b64a0a54f99e2fbc2d07974e82 Mon Sep 17 00:00:00 2001 From: Cody Northrop Date: Tue, 31 May 2016 09:36:37 -0600 Subject: docs: Improve OSX steps for Android --- BUILD.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/BUILD.md b/BUILD.md index ad05e863..d85f5117 100644 --- a/BUILD.md +++ b/BUILD.md @@ -155,13 +155,11 @@ Tested on OSX version 10.11.4 ``` - Ensure Homebrew is at the beginning of your PATH: ``` -export PATH=$HOME/homebrew/bin:$PATH +export PATH=/usr/local/bin:$PATH ``` - Add packages with the following (may need refinement) ``` -brew install cmake -brew install python -brew install python3 +brew install cmake python python3 git ``` ### Build steps for Android Use the following to ensure the Android build works. @@ -171,7 +169,7 @@ Follow the setup steps for Linux or OSX above, then from your terminal: cd build-android ./update_external_sources_android.sh ./android-generate.sh -ndk-build +ndk-build -j $(sysctl -n hw.ncpu) ``` #### Windows Follow the setup steps for Windows above, then from Developer Command Prompt for VS2013: -- cgit v1.2.3 From 8491e5be6c0ecb358754945729a90280a7b58ba5 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Tue, 31 May 2016 13:06:24 -0600 Subject: layers: GH601 Add check for clearValueCount We were missing check "clearValueCount must be greater than or equal to the number of attachments in renderPass that specify a loadOp of VK_ATTACHMENT_LOAD_OP_CLEAR" (Vulkan spec 1.0.15 section 7.4) This change adds that check. --- layers/core_validation.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 381ca02e..f2eff32c 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -8897,11 +8897,12 @@ CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *p auto framebuffer = pRenderPassBegin ? getFramebuffer(dev_data, pRenderPassBegin->framebuffer) : nullptr; if (pCB) { if (renderPass) { -#if MTMERGE + uint32_t clear_op_count = 0; pCB->activeFramebuffer = pRenderPassBegin->framebuffer; for (size_t i = 0; i < renderPass->attachments.size(); ++i) { MT_FB_ATTACHMENT_INFO &fb_info = framebuffer->attachments[i]; if (renderPass->attachments[i].load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) { + ++clear_op_count; std::function function = [=]() { set_memory_valid(dev_data, fb_info.mem, true, fb_info.image); return false; @@ -8926,7 +8927,15 @@ CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *p pCB->validate_functions.push_back(function); } } -#endif + if (clear_op_count > pRenderPassBegin->clearValueCount) { + skipCall |= log_msg( + dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, + reinterpret_cast(renderPass), __LINE__, DRAWSTATE_RENDERPASS_INCOMPATIBLE, "DS", + "In vkCmdBeginRenderPass() the VkRenderPassBeginInfo struct has a clearValueCount of %u but the actual number " + "of attachments in renderPass 0x%" PRIx64 " that use VK_ATTACHMENT_LOAD_OP_CLEAR is %u. The clearValueCount " + "must therefore be greater than or equal to %u.", + pRenderPassBegin->clearValueCount, reinterpret_cast(renderPass), clear_op_count, clear_op_count); + } skipCall |= VerifyRenderAreaBounds(dev_data, pRenderPassBegin); skipCall |= VerifyFramebufferAndRenderPassLayouts(dev_data, pCB, pRenderPassBegin); skipCall |= insideRenderPass(dev_data, pCB, "vkCmdBeginRenderPass"); -- cgit v1.2.3 From 66f66bb3b0a7df1441f3bc07b35e3db4dbb46af8 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Tue, 31 May 2016 13:20:20 -0600 Subject: layers: Kill redundant check At this point in the code we already know that renderPass is valid so no need to re-check it. --- layers/core_validation.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index f2eff32c..aa342c49 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -8939,9 +8939,7 @@ CmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *p skipCall |= VerifyRenderAreaBounds(dev_data, pRenderPassBegin); skipCall |= VerifyFramebufferAndRenderPassLayouts(dev_data, pCB, pRenderPassBegin); skipCall |= insideRenderPass(dev_data, pCB, "vkCmdBeginRenderPass"); - if (renderPass) { - skipCall |= ValidateDependencies(dev_data, framebuffer, renderPass); - } + skipCall |= ValidateDependencies(dev_data, framebuffer, renderPass); pCB->activeRenderPass = renderPass; skipCall |= validatePrimaryCommandBuffer(dev_data, pCB, "vkCmdBeginRenderPass"); skipCall |= addCmd(dev_data, pCB, CMD_BEGINRENDERPASS, "vkCmdBeginRenderPass()"); -- cgit v1.2.3 From 51dd1113bc44145ed8496e6810b380fb66f5aeff Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Tue, 31 May 2016 13:59:26 -0600 Subject: tests: Add test for new renderpass clearValue check Add test to hit the case where number of CLEAR loadOps in used by renderPass attachments is greater than clearValueCount given at renderPass begin time. Also update documentation. --- layers/vk_validation_layer_details.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layers/vk_validation_layer_details.md b/layers/vk_validation_layer_details.md index 89bc6eb9..e7c6c592 100644 --- a/layers/vk_validation_layer_details.md +++ b/layers/vk_validation_layer_details.md @@ -68,7 +68,7 @@ The Draw State portion of the core validation layer tracks state leading into Dr | RenderPass misuse | Tests for the following: that vkCmdDispatch, vkCmdDispatchIndirect, vkCmdCopyBuffer, vkCmdCopyImage, vkCmdBlitImage, vkCmdCopyBufferToImage, vkCmdCopyImageToBuffer, vkCmdUpdateBuffer, vkCmdFillBuffer, vkCmdClearColorImage, vkCmdClearDepthStencilImage, vkCmdResolveImage, vkCmdSetEvent, vkCmdResetEvent, vkCmdResetQueryPool, vkCmdCopyQueryPoolResults, vkCmdBeginRenderPass, vkEndCommandBuffer are not called during an active Renderpass, and that binding compute descriptor sets or pipelines does not take place during an active Renderpass | INVALID_RENDERPASS_CMD | vkCmdBindPipeline vkCmdBindDescriptorSets vkCmdDispatch vkCmdDispatchIndirect vkCmdCopyBuffer vkCmdCopyImage vkCmdBlitImage vkCmdCopyBufferToImage vkCmdCopyImageToBuffer vkCmdUpdateBuffer vkCmdFillBuffer vkCmdClearColorImage vkCmdClearDepthStencilImage vkCmdResolveImage vkCmdSetEvent vkCmdResetEvent vkCmdResetQueryPool vkCmdCopyQueryPoolResults vkCmdBeginRenderPass vkEndCommandBuffer | RenderPassWithinRenderPass UpdateBufferWithinRenderPass ClearColorImageWithinRenderPass ClearDepthStencilImageWithinRenderPass FillBufferWithinRenderPass EndCommandBufferWithinRenderPass | NA | | Correct use of RenderPass | Validates that the following rendering commands are issued inside an active RenderPass: vkCmdDraw, vkCmdDrawIndexed, vkCmdDrawIndirect, vkCmdDrawIndexedIndirect, vkCmdClearAttachments, vkCmdNextSubpass, vkCmdEndRenderPass | NO_ACTIVE_RENDERPASS | vkCmdBindPipeline vkCmdBindDescriptorSets vkCmdDraw vkCmdDrawIndexed vkCmdDrawIndirect vkCmdDrawIndexedIndirect vkCmdClearAttachments vkCmdNextSubpass vkCmdEndRenderPass | ClearColorAttachmentsOutsideRenderPass | NA | | Valid RenderPass | Flag error if attempt made to Begin/End/Continue a NULL or otherwise invalid RenderPass object | INVALID_RENDERPASS | vkCmdBeginRenderPass vkCmdEndRenderPass vkBeginCommandBuffer | NullRenderPass | NA | -| RenderPass Compatibility | Verify that active renderpass is compatible with renderpass specified in secondary command buffer, and that renderpass specified for a framebuffer is compatible with renderpass specified in secondary command buffer | RENDERPASS_INCOMPATIBLE | vkCmdExecuteCommands vkBeginCommandBuffer | TODO | None | +| RenderPass Compatibility | Verify that active renderpass is compatible with renderpass specified in secondary command buffer, and that renderpass specified for a framebuffer is compatible with renderpass specified in secondary command buffer. Also that parameters for BeginRenderpass are compatible with actual renderpass. | RENDERPASS_INCOMPATIBLE | vkCmdExecuteCommands vkBeginCommandBuffer vkCmdBeginRenderPass | RenderPassClearOpMismatch | Need to write some more tests to cover all of these cases. | | Framebuffer Compatibility | If a framebuffer is passed to secondary command buffer in vkBeginCommandBuffer, then it must match active renderpass (if any) at time of vkCmdExecuteCommands | FRAMEBUFFER_INCOMPATIBLE | vkCmdExecuteCommands | TODO | None | | DescriptorSet Updated | Warn user if DescriptorSet bound that was never updated and is not empty. Trigger error at draw time if a set being used was never updated. | DESCRIPTOR_SET_NOT_UPDATED | vkCmdBindDescriptorSets vkCmdDraw vkCmdDrawIndexed vkCmdDrawIndirect vkCmdDrawIndexedIndirect | DescriptorSetCompatibility | NA | | DescriptorSet Bound | Error if DescriptorSet not bound that is used by currently bound VkPipeline at draw time | DESCRIPTOR_SET_NOT_BOUND | vkCmdBindDescriptorSets | DescriptorSetNotUpdated | NA | -- cgit v1.2.3 From 27dc4567b4da739a7b45514ecffd8ed149a942ee Mon Sep 17 00:00:00 2001 From: Mark Young Date: Tue, 31 May 2016 14:34:08 -0600 Subject: winrt: Add more Powershell logging to RT install RT install Powershell script was using echo. Now use transcript recording (which will also include OS, Powershell version, and other info). Also, use Write-Host, Write-Warning, and Write-Error to make errors and warnings more obvious. NOTE: This includes intentional debug code enablement so I can retrieve an RT install that does not remove a copy of the Powershell log file. This will be fixed quickly after the RT install is generated on CruiseControl. --- .../ConfigLayersAndVulkanDLL.ps1 | 227 +++++++++++++-------- 1 file changed, 145 insertions(+), 82 deletions(-) diff --git a/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 b/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 index 28819323..0fd7aa40 100644 --- a/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 +++ b/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 @@ -39,13 +39,24 @@ Param( [int]$ossize ) +# Clear any pre-existing errors +$Error.Clear(); + # Start logging $log=$Env:Temp+"\VulkanRT" New-Item -ItemType Directory -Force -Path $log | Out-Null $logascii=$log+"\ConfigLayersAndVulkanDLL.log" + +# Temp to be used for debugging failure to install issue +$logascii2=$Env:Temp+"\ConfigLayersAndVulkanDLL_debug.log" + $log=$log+"\ConfigLayersAndVulkanDLL16.log" -echo "ConfigLayersAndVulkanDLL.ps1 $majorabi $ossize" >$log -(Get-Date).ToString() >>$log + +start-transcript -path $log + +Write-Host "ConfigLayersAndVulkanDLL.ps1 called with inputs of : $majorabi $ossize" +$startTime=Get-Date +Write-Host "Start time : $startTime" $vulkandll = "vulkan-"+$majorabi+".dll" $windrive = $env:SYSTEMDRIVE @@ -96,7 +107,7 @@ function notNumeric ($x) { function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) { - echo "UpdateVulkanSysFolder $dir $writeSdkName" >>$log + Write-Host "UpdateVulkanSysFolder $dir $writeSdkName" # Push the current path on the stack and go to $dir Push-Location -Path $dir @@ -108,33 +119,39 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) # Find all vulkan dll files in this directory dir -name vulkan-$majorabi-*.dll | ForEach-Object { - echo "File $_" >>$log + Write-Host "File $_" if ($_ -match "=" -or $_ -match "@" -or $_ -match " " -or - ($_.Split('-').count -lt 6) -or - ($_.Split('-').count -gt 8)) + ($_.Split('-').count -lt 6) -or + ($_.Split('-').count -gt 8) -or + !$?) { # If a file name contains "=", "@", or " ", or it contains less then 5 dashes or more than # 7 dashes, it wasn't installed by the Vulkan Run Time. # Note that we need to use return inside of ForEach-Object is to continue with iteration. - echo "ERROR: Rejected $_ - bad format" >>$log + Write-Warning "Ignoring $_ - bad format" + + # Not a real error, so just clear it for now. + $Error.Clear(); + + # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop return } - if (!$?) { - echo "ERROR: UpdateVulkanSysFolder object $_ is bad format" >>$log; - } # If the corresponding vulkaninfo is not present, it wasn't installed by the Vulkan Run Time $vulkaninfo=$_ -replace ".dll",".exe" $vulkaninfo=$vulkaninfo -replace "vulkan","vulkaninfo" - if (-not (Test-Path $vulkaninfo)) { - echo "ERROR: Rejected $_ - vulkaninfo not present" >>$log + if (-not (Test-Path $vulkaninfo) -or + !$?) { + Write-Warning "Rejected $_ - $vulkaninfo not present" + + # Not a real error, so just clear it for now. + $Error.Clear(); + + # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop return } - if (!$?) { - echo "ERROR: UpdateVulkanSysFolder failed generating vulkaninfo exe name" >>$log; - } $major=$_.Split('-')[2] $majorOrig=$major @@ -177,31 +194,62 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) $prebuildno="z"*10 } } - echo "Version $majorOrig $minorOrig $patchOrig $buildnoOrig $prereleaseOrig $prebuildnoOrig" >>$log + Write-Host "Version $majorOrig $minorOrig $patchOrig $buildnoOrig $prereleaseOrig $prebuildnoOrig" if (!$?) { - echo "ERROR: UpdateVulkanSysFolder during version parsing" >>$log; + Write-Warning "Ignoring version $majorOrig $minorOrig $patchOrig $buildnoOrig $prereleaseOrig $prebuildnoOrig" + + # Not a real error, so just clear it for now. + $Error.Clear(); + + # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop + return } # Make sure fields that are supposed to be numbers are numbers if (notNumeric($major)) { - echo "ERROR: Rejected $_ - bad major" >>$log + Write-Warning "Ignoring $_ - bad major" + + # Not a real d, so just clear it for now. + $Error.Clear(); + + # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop return } if (notNumeric($minor)) { - echo "ERROR: Rejected $_ - bad minor" >>$log + Write-Warning "Ignoring $_ - bad minor" + + # Not a real error, so just clear it for now. + $Error.Clear(); + + # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop return } if (notNumeric($patch)) { - echo "ERROR: Rejected $_ - bad patch" >>$log + Write-Warning "Ignoring $_ - bad patch" + + # Not a real error, so just clear it for now. + $Error.Clear(); + + # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop return } if (notNumeric($buildno)) { - echo "ERROR: Rejected $_ - bad buildno" >>$log + Write-Warning "Ignoring $_ - bad buildno" + + # Not a real error, so just clear it for now. + $Error.Clear(); + + # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop return } if (notNumeric($prebuildno)) { if ($prebuildno -ne "z"*10) { - echo "ERROR: Rejected $_ - bad prebuildno" >>$log + Write-Warning "Ignoring $_ - bad prebuildno" + + # Not a real error, so just clear it for now. + $Error.Clear(); + + # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop return } } @@ -214,11 +262,10 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) $prebuildno = $prebuildno.padleft(10,'0') # Add a new element to the $VulkanDllList array - echo "Adding $_ to Vulkan dll list " >>$log + Write-Host "Adding $_ to Vulkan dll list " $script:VulkanDllList+="$major=$minor=$patch=$buildno=$prebuildno=$prerelease= $_ @$majorOrig@$minorOrig@$patchOrig@$buildnoOrig@$prereleaseOrig@$prebuildnoOrig@" - if (!$?) { - echo "ERROR: UpdateVulkanSysFolder adding DLL $_ to list" >>$log; + Write-Error "Error: UpdateVulkanSysFolder adding DLL $_ to list" } } @@ -229,31 +276,28 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) # Sort the list. The most recent vulkan-*.dll will be in the last element of the list. [array]::sort($script:VulkanDllList) - if (!$?) { - echo "ERROR: UpdateVulkanSysFolder sorting DLL list" >>$log; + Write-Error "Error: UpdateVulkanSysFolder sorting DLL list" } # Put the name of the most recent vulkan-*.dll in $mrVulkanDLL. # The most recent vulkanDLL is the second word in the last element of the # sorted $VulkanDllList. Copy it to $vulkandll. $mrVulkanDll=$script:VulkanDllList[-1].Split(' ')[1] - echo "copy $mrVulkanDll $vulkandll" >>$log + Write-Host "Copying $mrVulkanDll $vulkandll" Copy-Item $mrVulkanDll $vulkandll -force - if (!$?) { - echo "ERROR: UpdateVulkanSysFolder encountered error during copy $mrVulkanDll $vulkandll" >>$log; + Write-Error "Error: UpdateVulkanSysFolder encountered error during copy $mrVulkanDll $vulkandll" } # Copy the most recent version of vulkaninfo--*.exe to vulkaninfo.exe. # We create the source file name for the copy from $mrVulkanDll. $mrVulkaninfo=$mrVulkanDll -replace ".dll",".exe" $mrVulkaninfo=$mrVulkaninfo -replace "vulkan","vulkaninfo" - echo "copy $mrVulkaninfo vulkaninfo.exe" >>$log + Write-Host "Copying $mrVulkaninfo vulkaninfo.exe" Copy-Item $mrVulkaninfo vulkaninfo.exe -force - if (!$?) { - echo "ERROR: UpdateVulkanSysFolder encountered error during copy $mrVulkaninfo vulkaninfo.exe" >>$log; + Write-Error "Error: UpdateVulkanSysFolder encountered error during copy $mrVulkaninfo vulkaninfo.exe" } # Create the name used in the registry for the SDK associated with $mrVulkanDll. @@ -271,18 +315,17 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) if ($prebuildno -ne "") { $sdktempname=$sdktempname + "." + $prebuildno } - echo "sdkname = $sdktempname" >>$log + Write-Host "sdkname = $sdktempname" if (!$?) { - echo "ERROR: UpdateVulkanSysFolder encountered error generating temp SDK name" >>$log; + Write-Error "Error: UpdateVulkanSysFolder encountered error generating SDK name" } } # Return to our previous folder Pop-Location - if (!$?) { - echo "ERROR: UpdateVulkanSysFolder popping location" >>$log; + Write-Error "Error: UpdateVulkanSysFolder popping location" } # Only update the overall script-scope SDK name if we're told to @@ -296,25 +339,23 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) # We only care about SYSWOW64 if we're targeting a 64-bit OS if ($ossize -eq 64) { # Update the SYSWOW64 Vulkan DLLS/EXEs - echo "Calling UpdateVulkanSysFolder $winfolder\SYSWOW64 0" >>$log + Write-Host "Calling UpdateVulkanSysFolder $winfolder\SYSWOW64 0" UpdateVulkanSysFolder $winfolder\SYSWOW64 0 - if (!$?) { - echo "ERROR: Calling UpdateVulkanSysFolder for 64-bit OS" >>$log + Write-Error "Error: Calling UpdateVulkanSysFolder for 64-bit OS" } } # Update the SYSTEM32 Vulkan DLLS/EXEs -echo "Calling UpdateVulkanSysFolder $winfolder\SYSTEM32 1" >>$log +Write-Host "Calling UpdateVulkanSysFolder $winfolder\SYSTEM32 1" UpdateVulkanSysFolder $winfolder\SYSTEM32 1 - if (!$?) { - echo "ERROR: Calling UpdateVulkanSysFolder for all OS" >>$log + Write-Error "Error: Calling UpdateVulkanSysFolder for all OS" } # Create an array of vulkan sdk install dirs -echo "Creating array of of Vulkan SDK Install dirs" >>$log +Write-Host "Creating array of of Vulkan SDK Install dirs" $mrVulkanDllInstallDir="" $VulkanSdkDirs=@() Get-ChildItem -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall | @@ -323,27 +364,29 @@ Get-ChildItem -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curr if ($_ -match "\\VulkanSDK") { # Get the install path from UninstallString $tmp=Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regkey -Name UninstallString + if (!$?) { + Write-Error "Error: Get-ItemProperty failed for Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regkey" + } $tmp=$tmp -replace "\\Uninstall.exe.*","" $tmp=$tmp -replace ".*=.","" - echo "Adding $tmp to VulkanSDKDirs" >>$log + Write-Host "Adding $tmp to VulkanSDKDirs" $VulkanSdkDirs+=$tmp if ($regkey -eq $script:sdkname) { # Save away the sdk install dir for the the most recent vulkandll - echo "Setting mrVulkanDllInstallDir to $tmp" >>$log + Write-Host "Setting mrVulkanDllInstallDir to $tmp" $mrVulkanDllInstallDir=$tmp } } } - if (!$?) { - echo "ERROR: Failed creating array of of Vulkan SDK Install dirs" >>$log + Write-Error "Error: Failed creating array of of Vulkan SDK Install dirs" } # Search list of sdk install dirs for an sdk compatible with $script:sdkname. # We go backwards through VulkanDllList to generate SDK names, because we want the most recent SDK. if ($mrVulkanDllInstallDir -eq "") { - echo "Searching VulkanDllList" >>$log + Write-Host "Searching VulkanDllList" ForEach ($idx in ($script:VulkanDllList.Length-1)..0) { $tmp=$script:VulkanDllList[$idx] $vulkanDllMajor=$script:VulkanDllList[$idx].Split('@')[1] @@ -359,8 +402,13 @@ if ($mrVulkanDllInstallDir -eq "") { if ($vulkanDllPrebuildno) { $regEntry=$regEntry+"."+$vulkanDllPrebuildno } - echo "Comparing $regEntry" >>$log + Write-Host "Comparing $regEntry" $rval=Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regEntry -ErrorAction SilentlyContinue + if (!$?) { + Write-Warning "Ignoring $regEntry because Get-ItemProperty failed to find corresponding SDK registry entry" + $Error.Clear(); + continue + } $instDir=$rval $instDir=$instDir -replace "\\Uninstall.exe.*","" $instDir=$instDir -replace ".*=.","" @@ -371,15 +419,14 @@ if ($mrVulkanDllInstallDir -eq "") { $reMinor=$rval.Split('.')[1] $rePatch=$rval.Split('.')[2] if ($reMajor+$reMinor+$rePatch -eq $vulkanDllMajor+$vulkanDllMinor+$vulkanDllPatch) { - echo "Setting mrVulkanDllInstallDir to $instDir" >>$log + Write-Host "Setting mrVulkanDllInstallDir to $instDir" $mrVulkanDllInstallDir=$instDir break } } } - if (!$?) { - echo "ERROR: Failed searching VulkanDLLList" >>$log + Write-Error "Error: Failed searching VulkanDLLList" } } @@ -398,20 +445,24 @@ $VulkanSdkDirs+="$windrive\VulkanSDK\0.9.3" # Note that we remove only those entries created by Vulkan SDKs. If other # layers were installed that are not from an SDK, we don't mess with them. -echo "Removing old layer registry values from HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" >>$log +Write-Host "Removing old layer registry values from HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\Vulkan\ExplicitLayers | Select-Object -ExpandProperty Property | ForEach-Object { $regval=$_ ForEach ($sdkdir in $VulkanSdkDirs) { if ($regval -like "$sdkdir\*.json") { Remove-ItemProperty -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -name $regval - echo "Removed registry value $regval" >>$log + if (!$?) { + Write-Error "Error: Remove-ItemProperty failed for -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -name $regval" + } else { + Write-Host "Removed registry value $regval" + } } } } if (!$?) { - echo "ERROR: Failed Removing old layer registry values from HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" >>$log + Write-Error "Error: Failed Removing old layer registry values from HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" } # Remove 32-bit layer registry value if we're targeting a 64-bit OS @@ -422,91 +473,103 @@ if ($ossize -eq 64) { ForEach ($sdkdir in $VulkanSdkDirs) { if ($regval -like "$sdkdir\*.json") { Remove-ItemProperty -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -name $regval - echo "Removed WOW6432Node registry value $regval" >>$log + if (!$?) { + Write-Error "Error: Remove-ItemProperty failed for -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -name $regval" + } else { + Write-Host "Removed WOW6432Node registry value $regval" + } } } } if (!$?) { - echo "ERROR: Failed Removing old layer registry values from HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers" >>$log + Write-Error "Error: Failed Removing old layer registry values from HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers" } } # Create layer registry values associated with Vulkan SDK from which $mrVulkanDll is from -echo "Creating new layer registry values" >>$log +Write-Host "Creating new layer registry values" if ($mrVulkanDllInstallDir -ne "") { # Create registry keys if they don't exist if (-not (Test-Path -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers)) { - echo "Creating new registry key HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" >>$log + Write-Host "Creating new registry key HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" New-Item -Force -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers | out-null - if (!$?) { - echo "ERROR: Failed creating HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" >>$log + Write-Error "Error: Failed creating HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" } } if ($ossize -eq 64) { if (-not (Test-Path -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers)) { - echo "Creating new registry key HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers" >>$log + Write-Host "Creating new registry key HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers" New-Item -Force -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers | out-null - if (!$?) { - echo "ERROR: Failed creating HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers" >>$log + Write-Error "Error: Failed creating HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers" } } } if ($ossize -eq 64) { - # Create registry values in normal registry location for 64-bit items on a 64-bit OS Get-ChildItem $mrVulkanDllInstallDir\Bin -Filter VkLayer*json | ForEach-Object { - echo "Creating registry value $mrVulkanDllInstallDir\Bin\$_" >>$log + Write-Host "Creating registry value $mrVulkanDllInstallDir\Bin\$_" New-ItemProperty -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin\$_ -PropertyType DWord -Value 0 | out-null - if (!$?) { - echo "ERROR: Failed creating $mrVulkanDllInstallDir\Bin\$_" >>$log + Write-Error "Error: Failed creating $mrVulkanDllInstallDir\Bin\$_" } } + if (!$?) { + Write-Error "Error: Failed Get-ChildItem $mrVulkanDllInstallDir\Bin | ForEach-Object " + } # Create registry values for the WOW6432Node registry location for 32-bit items on a 64-bit OS Get-ChildItem $mrVulkanDllInstallDir\Bin32 -Filter VkLayer*json | ForEach-Object { - echo "Creating WOW6432Node registry value $mrVulkanDllInstallDir\Bin32\$_" >>$log + Write-Host "Creating WOW6432Node registry value $mrVulkanDllInstallDir\Bin32\$_" New-ItemProperty -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin32\$_ -PropertyType DWord -Value 0 | out-null - if (!$?) { - echo "ERROR: Failed creating $mrVulkanDllInstallDir\Bin32\$_" >>$log + Write-Error "Error: Failed creating $mrVulkanDllInstallDir\Bin32\$_" } } - + if (!$?) { + Write-Error "Error: Failed Get-ChildItem $mrVulkanDllInstallDir\Bin32 | ForEach-Object " + } } else { - # Create registry values in normal registry location for 32-bit items on a 32-bit OS Get-ChildItem $mrVulkanDllInstallDir\Bin32 -Filter VkLayer*json | ForEach-Object { - echo "Creating registry value $mrVulkanDllInstallDir\Bin\$_" >>$log + Write-Host "Creating registry value $mrVulkanDllInstallDir\Bin\$_" New-ItemProperty -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin32\$_ -PropertyType DWord -Value 0 | out-null - if (!$?) { - echo "ERROR: Failed creating $mrVulkanDllInstallDir\Bin\$_" >>$log + Write-Error "Error: Failed creating $mrVulkanDllInstallDir\Bin\$_" } } - + if (!$?) { + Write-Error "Error: Failed Get-ChildItem $mrVulkanDllInstallDir\Bin32 | ForEach-Object " + } } } # Final log output -echo "ConfigLayersAndVulkanDLL.ps1 completed" >>$log -(Get-Date).ToString() >>$log +Write-Host "ConfigLayersAndVulkanDLL.ps1 completed" +$endTime=Get-Date +Write-Host "End time: $endTime" + +Stop-Transcript # Convert logfile to ascii -cat $log | out-File -encoding ascii -filepath $logascii -remove-item $log +Get-Content $log | Out-File -encoding ascii -filepath $logascii + +# Temp to be used for debugging failure to install issue (as VulkanRT folder might get removed) +Get-Content $log | Out-File -encoding ascii -filepath $logascii2 + +# Remove the unicode log as we no longer need it. +Remove-Item $log # SIG # Begin signature block -- cgit v1.2.3 From 24890b3718beb6bad5942c1cbb73fc70810ffb39 Mon Sep 17 00:00:00 2001 From: Mark Young Date: Tue, 31 May 2016 15:25:46 -0600 Subject: winrt: Disable temp log in RT install. --- windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 b/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 index 0fd7aa40..8a1a1277 100644 --- a/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 +++ b/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 @@ -48,7 +48,7 @@ New-Item -ItemType Directory -Force -Path $log | Out-Null $logascii=$log+"\ConfigLayersAndVulkanDLL.log" # Temp to be used for debugging failure to install issue -$logascii2=$Env:Temp+"\ConfigLayersAndVulkanDLL_debug.log" +#$logascii2=$Env:Temp+"\ConfigLayersAndVulkanDLL_debug.log" $log=$log+"\ConfigLayersAndVulkanDLL16.log" @@ -565,7 +565,7 @@ Stop-Transcript Get-Content $log | Out-File -encoding ascii -filepath $logascii # Temp to be used for debugging failure to install issue (as VulkanRT folder might get removed) -Get-Content $log | Out-File -encoding ascii -filepath $logascii2 +#Get-Content $log | Out-File -encoding ascii -filepath $logascii2 # Remove the unicode log as we no longer need it. -- cgit v1.2.3 From d9f861f721532e7ae44a0a05bdad94ecf860a112 Mon Sep 17 00:00:00 2001 From: David Pinedo Date: Wed, 1 Jun 2016 10:31:51 -0600 Subject: winrtinstaller: update signature on powershell config script --- .../ConfigLayersAndVulkanDLL.ps1 | 274 ++++++++++----------- 1 file changed, 137 insertions(+), 137 deletions(-) diff --git a/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 b/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 index 8a1a1277..3b782409 100644 --- a/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 +++ b/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 @@ -573,79 +573,115 @@ Remove-Item $log # SIG # Begin signature block -# MIIcZgYJKoZIhvcNAQcCoIIcVzCCHFMCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB +# MIIccAYJKoZIhvcNAQcCoIIcYTCCHF0CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR -# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUQ4I+TKoMwtXHArekRd5/bX04 -# sreggheVMIIFHjCCBAagAwIBAgIQDmYEpPtQ2iBY4vC2AGq6uzANBgkqhkiG9w0B +# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUFNNSYRu98top6sj+5PNNXfdh +# aN+gghefMIIFKDCCBBCgAwIBAgIQA7RxzU1//sKaOyCyyw9fVDANBgkqhkiG9w0B # AQsFADByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD # VQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFz -# c3VyZWQgSUQgQ29kZSBTaWduaW5nIENBMB4XDTE1MDQzMDAwMDAwMFoXDTE2MDcw -# NjEyMDAwMFowZTELMAkGA1UEBhMCVVMxETAPBgNVBAgTCENvbG9yYWRvMRUwEwYD +# c3VyZWQgSUQgQ29kZSBTaWduaW5nIENBMB4XDTE2MDQwODAwMDAwMFoXDTE3MDgx +# MDEyMDAwMFowZTELMAkGA1UEBhMCVVMxETAPBgNVBAgTCENvbG9yYWRvMRUwEwYD # VQQHEwxGb3J0IENvbGxpbnMxFTATBgNVBAoTDEx1bmFyRywgSW5jLjEVMBMGA1UE # AxMMTHVuYXJHLCBJbmMuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -# jaLJm/Joxsn/IeopiGY3XPeSZeIhjSjSlQUkDyIyDGcBG7CvfiSsXIw3EgdGkjQg -# yBcW5YsPz9bPGPUjo5go7CwZaRkhW7/LmSkAlx0UAv8EMLuJrAZ3jBNZvpPPqfWd -# zgi/Rkm2gWQ6eSKouy7IjcLk+EwkeBbB+UBnYfMp0BfCPzR3mPgGAJH6efAmEaqQ -# FBCrX97joYgDqp3v8u42jALLl/Ict/GNMHLxP+QWagIHIICCRgS6s02OsildLF6R -# nqJOOG/43f2qUD4Cab65kzlI+0+uQyOl1UlxNxp0XareghGTqECsYA03j64Esxyo -# 2xrNbV2LJm9crTX6QthxywIDAQABo4IBuzCCAbcwHwYDVR0jBBgwFoAUWsS5eyoK -# o6XqcQPAYPkt9mV1DlgwHQYDVR0OBBYEFOSdVsqodGWApfCjHtAcn8sAzLBGMA4G +# 9g6eKks1n/j5xBMG0viQaVqoxYjNIt2sLiDhBa1JMfPVvQsclZwsJl2FHhnQEg1/ +# YLeNUqSukbgTNXTGjkvNoh/PbjjBzlxZbPwRKO8tbHMRKZJjcVkOWLLReUGHkxJ3 +# i4hD6zH0K9DKMubb0ohmaA28ALsl8d4igz78uGyqa3jNXbiyNLJhd467u2nCySdV +# PFdXCMklePhW9VLm8VXSRDlBcx6tsaTpJr8lRZsq13xO7lwifQw1w2QRQzlnezUY +# PVnXIz+54Nu0U6JKPaTlxgbk9SlcP4f77UJuieGQGCWh3uCcASYQgUMjisetLyFU +# WZuPYpSbNWVksMaiIlSIuwIDAQABo4IBxTCCAcEwHwYDVR0jBBgwFoAUWsS5eyoK +# o6XqcQPAYPkt9mV1DlgwHQYDVR0OBBYEFBP4/a3JE2uXZpm3r1yknye/WxPWMA4G # A1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzB3BgNVHR8EcDBuMDWg # M6Axhi9odHRwOi8vY3JsMy5kaWdpY2VydC5jb20vc2hhMi1hc3N1cmVkLWNzLWcx # LmNybDA1oDOgMYYvaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJl -# ZC1jcy1nMS5jcmwwQgYDVR0gBDswOTA3BglghkgBhv1sAwEwKjAoBggrBgEFBQcC -# ARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzCBhAYIKwYBBQUHAQEEeDB2 -# MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wTgYIKwYBBQUH -# MAKGQmh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFNIQTJBc3N1 -# cmVkSURDb2RlU2lnbmluZ0NBLmNydDAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEB -# CwUAA4IBAQCIt1S8zfvzMQEVmdAssjrwqBaq78xhtGPLjkNF06EvtWoV6VMLI/A6 -# 45KoULsaXeYuszLxNI+OT/b4HfD0e2LxImaTDZRmCLeIs+2pMLSlWDSV4okm8Vk2 -# rObLBlgiI1x0PiMa1le9D832COWM4EJcH7pxM+9JfiHYMLlZbcfNEVgv6Dhhl4MG -# mOTMTl7vQNNQaJ1coNVf9m5Bez1DV9Iu2Cgd8BHp1oLVCQCHjVv0Ifj48RIPi4SQ -# khzalrnrf+L/BWRDhpLnxYasazdV5WfrMHurPuBvYUiLQNkU9SqKgRk9XrzDAfMe -# gPbGybMr0kqtbE/A/cDcTVnvRuTZnhXSMIIFMDCCBBigAwIBAgIQBAkYG1/Vu2Z1 -# U0O1b5VQCDANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMM -# RGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQD -# ExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMTMxMDIyMTIwMDAwWhcN -# MjgxMDIyMTIwMDAwWjByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQg -# SW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2Vy -# dCBTSEEyIEFzc3VyZWQgSUQgQ29kZSBTaWduaW5nIENBMIIBIjANBgkqhkiG9w0B -# AQEFAAOCAQ8AMIIBCgKCAQEA+NOzHH8OEa9ndwfTCzFJGc/Q+0WZsTrbRPV/5aid -# 2zLXcep2nQUut4/6kkPApfmJ1DcZ17aq8JyGpdglrA55KDp+6dFn08b7KSfH03sj -# lOSRI5aQd4L5oYQjZhJUM1B0sSgmuyRpwsJS8hRniolF1C2ho+mILCCVrhxKhwjf -# DPXiTWAYvqrEsq5wMWYzcT6scKKrzn/pfMuSoeU7MRzP6vIK5Fe7SrXpdOYr/mzL -# fnQ5Ng2Q7+S1TqSp6moKq4TzrGdOtcT3jNEgJSPrCGQ+UpbB8g8S9MWOD8Gi6CxR -# 93O8vYWxYoNzQYIH5DiLanMg0A9kczyen6Yzqf0Z3yWT0QIDAQABo4IBzTCCAckw -# EgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwEwYDVR0lBAwwCgYI -# KwYBBQUHAwMweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2Nz -# cC5kaWdpY2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2lj -# ZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwgYEGA1UdHwR6MHgw -# OqA4oDaGNGh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJ -# RFJvb3RDQS5jcmwwOqA4oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdp -# Q2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwTwYDVR0gBEgwRjA4BgpghkgBhv1sAAIE -# MCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCgYI -# YIZIAYb9bAMwHQYDVR0OBBYEFFrEuXsqCqOl6nEDwGD5LfZldQ5YMB8GA1UdIwQY -# MBaAFEXroq/0ksuCMS1Ri6enIZ3zbcgPMA0GCSqGSIb3DQEBCwUAA4IBAQA+7A1a -# JLPzItEVyCx8JSl2qB1dHC06GsTvMGHXfgtg/cM9D8Svi/3vKt8gVTew4fbRknUP -# UbRupY5a4l4kgU4QpO4/cY5jDhNLrddfRHnzNhQGivecRk5c/5CxGwcOkRX7uq+1 -# UcKNJK4kxscnKqEpKBo6cSgCPC6Ro8AlEeKcFEehemhor5unXCBc2XGxDI+7qPjF -# Emifz0DLQESlE/DmZAwlCEIysjaKJAL+L3J+HNdJRZboWR3p+nRka7LrZkPas7CM -# 1ekN3fYBIM6ZMWM9CBoYs4GbT8aTEAb8B4H6i9r5gkn3Ym6hU/oSlBiFLpKR6mhs -# RDKyZqHnGKSaZFHvMIIGajCCBVKgAwIBAgIQAwGaAjr/WLFr1tXq5hfwZjANBgkq -# hkiG9w0BAQUFADBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5j -# MRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBB -# c3N1cmVkIElEIENBLTEwHhcNMTQxMDIyMDAwMDAwWhcNMjQxMDIyMDAwMDAwWjBH -# MQswCQYDVQQGEwJVUzERMA8GA1UEChMIRGlnaUNlcnQxJTAjBgNVBAMTHERpZ2lD -# ZXJ0IFRpbWVzdGFtcCBSZXNwb25kZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -# ggEKAoIBAQCjZF38fLPggjXg4PbGKuZJdTvMbuBTqZ8fZFnmfGt/a4ydVfiS457V -# WmNbAklQ2YPOb2bu3cuF6V+l+dSHdIhEOxnJ5fWRn8YUOawk6qhLLJGJzF4o9GS2 -# ULf1ErNzlgpno75hn67z/RJ4dQ6mWxT9RSOOhkRVfRiGBYxVh3lIRvfKDo2n3k5f -# 4qi2LVkCYYhhchhoubh87ubnNC8xd4EwH7s2AY3vJ+P3mvBMMWSN4+v6GYeofs/s -# jAw2W3rBerh4x8kGLkYQyI3oBGDbvHN0+k7Y/qpA8bLOcEaD6dpAoVk62RUJV5lW -# MJPzyWHM0AjMa+xiQpGsAsDvpPCJEY93AgMBAAGjggM1MIIDMTAOBgNVHQ8BAf8E -# BAMCB4AwDAYDVR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDCCAb8G -# A1UdIASCAbYwggGyMIIBoQYJYIZIAYb9bAcBMIIBkjAoBggrBgEFBQcCARYcaHR0 -# cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzCCAWQGCCsGAQUFBwICMIIBVh6CAVIA +# ZC1jcy1nMS5jcmwwTAYDVR0gBEUwQzA3BglghkgBhv1sAwEwKjAoBggrBgEFBQcC +# ARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAIBgZngQwBBAEwgYQGCCsG +# AQUFBwEBBHgwdjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29t +# ME4GCCsGAQUFBzAChkJodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNl +# cnRTSEEyQXNzdXJlZElEQ29kZVNpZ25pbmdDQS5jcnQwDAYDVR0TAQH/BAIwADAN +# BgkqhkiG9w0BAQsFAAOCAQEAscucuwAp0HisTjMWJii1ZX5H7+GAc048OJctdrTS +# VlUc7kJgEirXQb1TQbSevvt1wE6s3xJWUapWnYvvgEPOq036WFA+NRVoWU5eIUkG +# MsYGXH5ASHVBH+5/13wFLC1nXTxxrQ6B19uFFr5ZpsaP93EdD5pLqRxKrqLc9Stc +# /faupcVkclisgXOEDsCzvgGhhaFCc/RSeXOOAZg2EsJNbaydg/xyvZqPDG17NboL +# rgrzN5r6FoCk535HuGvcpjbr60nlwwzuxwqzXuMhGUTOs5O5cPpJQt6+iXBrlBgh +# 4jPNL+ZvFfJLDq3CUdnSh3S13GJruyTWzF2AxTeRAnw2fzCCBTAwggQYoAMCAQIC +# EAQJGBtf1btmdVNDtW+VUAgwDQYJKoZIhvcNAQELBQAwZTELMAkGA1UEBhMCVVMx +# FTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNv +# bTEkMCIGA1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBMB4XDTEzMTAy +# MjEyMDAwMFoXDTI4MTAyMjEyMDAwMFowcjELMAkGA1UEBhMCVVMxFTATBgNVBAoT +# DERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTExMC8GA1UE +# AxMoRGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIENvZGUgU2lnbmluZyBDQTCCASIw +# DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPjTsxx/DhGvZ3cH0wsxSRnP0PtF +# mbE620T1f+Wondsy13Hqdp0FLreP+pJDwKX5idQ3Gde2qvCchqXYJawOeSg6funR +# Z9PG+yknx9N7I5TkkSOWkHeC+aGEI2YSVDNQdLEoJrskacLCUvIUZ4qJRdQtoaPp +# iCwgla4cSocI3wz14k1gGL6qxLKucDFmM3E+rHCiq85/6XzLkqHlOzEcz+ryCuRX +# u0q16XTmK/5sy350OTYNkO/ktU6kqepqCquE86xnTrXE94zRICUj6whkPlKWwfIP +# EvTFjg/BougsUfdzvL2FsWKDc0GCB+Q4i2pzINAPZHM8np+mM6n9Gd8lk9ECAwEA +# AaOCAc0wggHJMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGGMBMG +# A1UdJQQMMAoGCCsGAQUFBwMDMHkGCCsGAQUFBwEBBG0wazAkBggrBgEFBQcwAYYY +# aHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRwOi8vY2Fj +# ZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3J0MIGB +# BgNVHR8EejB4MDqgOKA2hjRodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGlnaUNl +# cnRBc3N1cmVkSURSb290Q0EuY3JsMDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2Vy +# dC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsME8GA1UdIARIMEYwOAYK +# YIZIAYb9bAACBDAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5j +# b20vQ1BTMAoGCGCGSAGG/WwDMB0GA1UdDgQWBBRaxLl7KgqjpepxA8Bg+S32ZXUO +# WDAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkqhkiG9w0BAQsF +# AAOCAQEAPuwNWiSz8yLRFcgsfCUpdqgdXRwtOhrE7zBh134LYP3DPQ/Er4v97yrf +# IFU3sOH20ZJ1D1G0bqWOWuJeJIFOEKTuP3GOYw4TS63XX0R58zYUBor3nEZOXP+Q +# sRsHDpEV+7qvtVHCjSSuJMbHJyqhKSgaOnEoAjwukaPAJRHinBRHoXpoaK+bp1wg +# XNlxsQyPu6j4xRJon89Ay0BEpRPw5mQMJQhCMrI2iiQC/i9yfhzXSUWW6Fkd6fp0 +# ZGuy62ZD2rOwjNXpDd32ASDOmTFjPQgaGLOBm0/GkxAG/AeB+ova+YJJ92JuoVP6 +# EpQYhS6SkepobEQysmah5xikmmRR7zCCBmowggVSoAMCAQICEAMBmgI6/1ixa9bV +# 6uYX8GYwDQYJKoZIhvcNAQEFBQAwYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERp +# Z2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMY +# RGlnaUNlcnQgQXNzdXJlZCBJRCBDQS0xMB4XDTE0MTAyMjAwMDAwMFoXDTI0MTAy +# MjAwMDAwMFowRzELMAkGA1UEBhMCVVMxETAPBgNVBAoTCERpZ2lDZXJ0MSUwIwYD +# VQQDExxEaWdpQ2VydCBUaW1lc3RhbXAgUmVzcG9uZGVyMIIBIjANBgkqhkiG9w0B +# AQEFAAOCAQ8AMIIBCgKCAQEAo2Rd/Hyz4II14OD2xirmSXU7zG7gU6mfH2RZ5nxr +# f2uMnVX4kuOe1VpjWwJJUNmDzm9m7t3LhelfpfnUh3SIRDsZyeX1kZ/GFDmsJOqo +# SyyRicxeKPRktlC39RKzc5YKZ6O+YZ+u8/0SeHUOplsU/UUjjoZEVX0YhgWMVYd5 +# SEb3yg6Np95OX+Koti1ZAmGIYXIYaLm4fO7m5zQvMXeBMB+7NgGN7yfj95rwTDFk +# jePr+hmHqH7P7IwMNlt6wXq4eMfJBi5GEMiN6ARg27xzdPpO2P6qQPGyznBGg+na +# QKFZOtkVCVeZVjCT88lhzNAIzGvsYkKRrALA76TwiRGPdwIDAQABo4IDNTCCAzEw +# DgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYB +# BQUHAwgwggG/BgNVHSAEggG2MIIBsjCCAaEGCWCGSAGG/WwHATCCAZIwKAYIKwYB +# BQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwggFkBggrBgEFBQcC +# AjCCAVYeggFSAEEAbgB5ACAAdQBzAGUAIABvAGYAIAB0AGgAaQBzACAAQwBlAHIA +# dABpAGYAaQBjAGEAdABlACAAYwBvAG4AcwB0AGkAdAB1AHQAZQBzACAAYQBjAGMA +# ZQBwAHQAYQBuAGMAZQAgAG8AZgAgAHQAaABlACAARABpAGcAaQBDAGUAcgB0ACAA +# QwBQAC8AQwBQAFMAIABhAG4AZAAgAHQAaABlACAAUgBlAGwAeQBpAG4AZwAgAFAA +# YQByAHQAeQAgAEEAZwByAGUAZQBtAGUAbgB0ACAAdwBoAGkAYwBoACAAbABpAG0A +# aQB0ACAAbABpAGEAYgBpAGwAaQB0AHkAIABhAG4AZAAgAGEAcgBlACAAaQBuAGMA +# bwByAHAAbwByAGEAdABlAGQAIABoAGUAcgBlAGkAbgAgAGIAeQAgAHIAZQBmAGUA +# cgBlAG4AYwBlAC4wCwYJYIZIAYb9bAMVMB8GA1UdIwQYMBaAFBUAEisTmLKZB+0e +# 36K+Vw0rZwLNMB0GA1UdDgQWBBRhWk0ktkkynUoqeRqDS/QeicHKfTB9BgNVHR8E +# djB0MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1 +# cmVkSURDQS0xLmNybDA4oDagNIYyaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0Rp +# Z2lDZXJ0QXNzdXJlZElEQ0EtMS5jcmwwdwYIKwYBBQUHAQEEazBpMCQGCCsGAQUF +# BzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQQYIKwYBBQUHMAKGNWh0dHA6 +# Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRENBLTEuY3J0 +# MA0GCSqGSIb3DQEBBQUAA4IBAQCdJX4bM02yJoFcm4bOIyAPgIfliP//sdRqLDHt +# OhcZcRfNqRu8WhY5AJ3jbITkWkD73gYBjDf6m7GdJH7+IKRXrVu3mrBgJuppVyFd +# NC8fcbCDlBkFazWQEKB7l8f2P+fiEUGmvWLZ8Cc9OB0obzpSCfDscGLTYkuw4HOm +# ksDTjjHYL+NtFxMG7uQDthSr849Dp3GdId0UyhVdkkHa+Q+B0Zl0DSbEDn8btfWg +# 8cZ3BigV6diT5VUW8LsKqxzbXEgnZsijiwoc5ZXarsQuWaBh3drzbaJh6YoLbewS +# GL33VVRAA5Ira8JRwgpIr7DUbuD0FAo6G+OPPcqvao173NhEMIIGzTCCBbWgAwIB +# AgIQBv35A5YDreoACus/J7u6GzANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJV +# UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +# Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYx +# MTEwMDAwMDAwWhcNMjExMTEwMDAwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UE +# ChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYD +# VQQDExhEaWdpQ2VydCBBc3N1cmVkIElEIENBLTEwggEiMA0GCSqGSIb3DQEBAQUA +# A4IBDwAwggEKAoIBAQDogi2Z+crCQpWlgHNAcNKeVlRcqcTSQQaPyTP8TUWRXIGf +# 7Syc+BZZ3561JBXCmLm0d0ncicQK2q/LXmvtrbBxMevPOkAMRk2T7It6NggDqww0 +# /hhJgv7HxzFIgHweog+SDlDJxofrNj/YMMP/pvf7os1vcyP+rFYFkPAyIRaJxnCI +# +QWXfaPHQ90C6Ds97bFBo+0/vtuVSMTuHrPyvAwrmdDGXRJCgeGDboJzPyZLFJCu +# WWYKxI2+0s4Grq2Eb0iEm09AufFM8q+Y+/bOQF1c9qjxL6/siSLyaxhlscFzrdfx +# 2M8eCnRcQrhofrfVdwonVnwPYqQ/MhRglf0HBKIJAgMBAAGjggN6MIIDdjAOBgNV +# HQ8BAf8EBAMCAYYwOwYDVR0lBDQwMgYIKwYBBQUHAwEGCCsGAQUFBwMCBggrBgEF +# BQcDAwYIKwYBBQUHAwQGCCsGAQUFBwMIMIIB0gYDVR0gBIIByTCCAcUwggG0Bgpg +# hkgBhv1sAAEEMIIBpDA6BggrBgEFBQcCARYuaHR0cDovL3d3dy5kaWdpY2VydC5j +# b20vc3NsLWNwcy1yZXBvc2l0b3J5Lmh0bTCCAWQGCCsGAQUFBwICMIIBVh6CAVIA # QQBuAHkAIAB1AHMAZQAgAG8AZgAgAHQAaABpAHMAIABDAGUAcgB0AGkAZgBpAGMA # YQB0AGUAIABjAG8AbgBzAHQAaQB0AHUAdABlAHMAIABhAGMAYwBlAHAAdABhAG4A # YwBlACAAbwBmACAAdABoAGUAIABEAGkAZwBpAEMAZQByAHQAIABDAFAALwBDAFAA @@ -653,76 +689,40 @@ Remove-Item $log # QQBnAHIAZQBlAG0AZQBuAHQAIAB3AGgAaQBjAGgAIABsAGkAbQBpAHQAIABsAGkA # YQBiAGkAbABpAHQAeQAgAGEAbgBkACAAYQByAGUAIABpAG4AYwBvAHIAcABvAHIA # YQB0AGUAZAAgAGgAZQByAGUAaQBuACAAYgB5ACAAcgBlAGYAZQByAGUAbgBjAGUA -# LjALBglghkgBhv1sAxUwHwYDVR0jBBgwFoAUFQASKxOYspkH7R7for5XDStnAs0w -# HQYDVR0OBBYEFGFaTSS2STKdSip5GoNL9B6Jwcp9MH0GA1UdHwR2MHQwOKA2oDSG -# Mmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRENBLTEu -# Y3JsMDigNqA0hjJodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1 -# cmVkSURDQS0xLmNybDB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGGGGh0dHA6 -# Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2NhY2VydHMu -# ZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEQ0EtMS5jcnQwDQYJKoZIhvcN -# AQEFBQADggEBAJ0lfhszTbImgVybhs4jIA+Ah+WI//+x1GosMe06FxlxF82pG7xa -# FjkAneNshORaQPveBgGMN/qbsZ0kfv4gpFetW7easGAm6mlXIV00Lx9xsIOUGQVr -# NZAQoHuXx/Y/5+IRQaa9YtnwJz04HShvOlIJ8OxwYtNiS7Dgc6aSwNOOMdgv420X -# Ewbu5AO2FKvzj0OncZ0h3RTKFV2SQdr5D4HRmXQNJsQOfxu19aDxxncGKBXp2JPl -# VRbwuwqrHNtcSCdmyKOLChzlldquxC5ZoGHd2vNtomHpigtt7BIYvfdVVEADkitr -# wlHCCkivsNRu4PQUCjob4489yq9qjXvc2EQwggbNMIIFtaADAgECAhAG/fkDlgOt -# 6gAK6z8nu7obMA0GCSqGSIb3DQEBBQUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQK -# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNV -# BAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBa -# Fw0yMTExMTAwMDAwMDBaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy -# dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lD -# ZXJ0IEFzc3VyZWQgSUQgQ0EtMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -# ggEBAOiCLZn5ysJClaWAc0Bw0p5WVFypxNJBBo/JM/xNRZFcgZ/tLJz4FlnfnrUk -# FcKYubR3SdyJxArar8tea+2tsHEx6886QAxGTZPsi3o2CAOrDDT+GEmC/sfHMUiA -# fB6iD5IOUMnGh+s2P9gww/+m9/uizW9zI/6sVgWQ8DIhFonGcIj5BZd9o8dD3QLo -# Oz3tsUGj7T++25VIxO4es/K8DCuZ0MZdEkKB4YNugnM/JksUkK5ZZgrEjb7Szgau -# rYRvSISbT0C58Uzyr5j79s5AXVz2qPEvr+yJIvJrGGWxwXOt1/HYzx4KdFxCuGh+ -# t9V3CidWfA9ipD8yFGCV/QcEogkCAwEAAaOCA3owggN2MA4GA1UdDwEB/wQEAwIB -# hjA7BgNVHSUENDAyBggrBgEFBQcDAQYIKwYBBQUHAwIGCCsGAQUFBwMDBggrBgEF -# BQcDBAYIKwYBBQUHAwgwggHSBgNVHSAEggHJMIIBxTCCAbQGCmCGSAGG/WwAAQQw -# ggGkMDoGCCsGAQUFBwIBFi5odHRwOi8vd3d3LmRpZ2ljZXJ0LmNvbS9zc2wtY3Bz -# LXJlcG9zaXRvcnkuaHRtMIIBZAYIKwYBBQUHAgIwggFWHoIBUgBBAG4AeQAgAHUA -# cwBlACAAbwBmACAAdABoAGkAcwAgAEMAZQByAHQAaQBmAGkAYwBhAHQAZQAgAGMA -# bwBuAHMAdABpAHQAdQB0AGUAcwAgAGEAYwBjAGUAcAB0AGEAbgBjAGUAIABvAGYA -# IAB0AGgAZQAgAEQAaQBnAGkAQwBlAHIAdAAgAEMAUAAvAEMAUABTACAAYQBuAGQA -# IAB0AGgAZQAgAFIAZQBsAHkAaQBuAGcAIABQAGEAcgB0AHkAIABBAGcAcgBlAGUA -# bQBlAG4AdAAgAHcAaABpAGMAaAAgAGwAaQBtAGkAdAAgAGwAaQBhAGIAaQBsAGkA -# dAB5ACAAYQBuAGQAIABhAHIAZQAgAGkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAA -# aABlAHIAZQBpAG4AIABiAHkAIAByAGUAZgBlAHIAZQBuAGMAZQAuMAsGCWCGSAGG -# /WwDFTASBgNVHRMBAf8ECDAGAQH/AgEAMHkGCCsGAQUFBwEBBG0wazAkBggrBgEF -# BQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRw -# Oi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0Eu -# Y3J0MIGBBgNVHR8EejB4MDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20v -# RGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMDqgOKA2hjRodHRwOi8vY3JsNC5k -# aWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMB0GA1UdDgQW -# BBQVABIrE5iymQftHt+ivlcNK2cCzTAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun -# pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEARlA+ybcoJKc4HbZbKa9Sz1LpMUer -# Vlx71Q0LQbPv7HUfdDjyslxhopyVw1Dkgrkj0bo6hnKtOHisdV0XFzRyR4WUVtHr -# uzaEd8wkpfMEGVWp5+Pnq2LN+4stkMLA0rWUvV5PsQXSDj0aqRRbpoYxYqioM+Sb -# OafE9c4deHaUJXPkKqvPnHZL7V/CSxbkS3BMAIke/MV5vEwSV/5f4R68Al2o/vsH -# OE8Nxl2RuQ9nRc3Wg+3nkg2NsWmMT/tZ4CMP0qquAHzunEIOz5HXJ7cW7g/DvXwK -# oO4sCFWFIrjrGBpN/CohrUkxg0eVd3HcsRtLSxwQnHcUwZ1PL1qVCCkQJjGCBDsw -# ggQ3AgEBMIGGMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMx -# GTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNVBAMTKERpZ2lDZXJ0IFNI -# QTIgQXNzdXJlZCBJRCBDb2RlIFNpZ25pbmcgQ0ECEA5mBKT7UNogWOLwtgBqursw -# CQYFKw4DAhoFAKB4MBgGCisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcN -# AQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUw -# IwYJKoZIhvcNAQkEMRYEFAoOC46C6ArmxtlmLsUTidSbkN3rMA0GCSqGSIb3DQEB -# AQUABIIBADXG8YUKEPQHyMUpBvGWwb5VeZ8oWPyiSSE649GXu5tHDn+N2lhDPngR -# Cksh4FpF56hP4RgTzH/Nmxf2D4kZUzPCrs2Il1S+U0ZoFpoAwrN8dbnvw2Wvf7ns -# LZHXKG9eIaMYx6r/nn+VV8qvL/25fZ8oNyIFCYy4FYRLmla5g1+Vmtg6anHj89c+ -# EMSIwR8BR5UlAagfhfKJQHYMz4xkdqMrR6ZDsMHvYjbOg3MILrrdgomH2R5JKAHK -# IaD3EqM+Tgu8LH1MMt/hIf4RS/lgqT12qM88J64dyhquaM1BUzw5dnwb+h3aAF2O -# ZJ4IhONECJbJf8wVT8rTUA+6uUm/Y6ihggIPMIICCwYJKoZIhvcNAQkGMYIB/DCC -# AfgCAQEwdjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkw -# FwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBBc3N1 -# cmVkIElEIENBLTECEAMBmgI6/1ixa9bV6uYX8GYwCQYFKw4DAhoFAKBdMBgGCSqG -# SIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTE2MDQwNzIxNTM0 -# OFowIwYJKoZIhvcNAQkEMRYEFERKj5qmhGjIIeKV/myZFhJ/EUO7MA0GCSqGSIb3 -# DQEBAQUABIIBAJYQytkxzpn/UVwVJ0tsompGzVKSEgjuqAiI2jA0LiQwWM9iBHpG -# 8ijDH6Dh+Fqa1JSsynyFixF26SuHeDoY/LX14HhRPDEkBa70qt9h9gc/73f9AzUy -# eSbxwRhlF/UAyk0E3fbK1of431HxfvcdhnvCIDW8orfiG5v7gS0Mub4C70TlMXTp -# b6XT1orYqnih9j4EVCYWZwv+EsOADRHW7o1RvIC2gI2dzmAkMSEjehk3we6u8KXI -# xkggPOXy5O8TFgFdjvKU6XaoTTCklKWFIQIRG9r5m//Qj3jwzwN/03gLPphi6zze -# 8fAJmClDyH+kHivSSfFnFUB7elvajTvasQE= +# LjALBglghkgBhv1sAxUwEgYDVR0TAQH/BAgwBgEB/wIBADB5BggrBgEFBQcBAQRt +# MGswJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEF +# BQcwAoY3aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJl +# ZElEUm9vdENBLmNydDCBgQYDVR0fBHoweDA6oDigNoY0aHR0cDovL2NybDMuZGln +# aWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNybDA6oDigNoY0aHR0 +# cDovL2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNy +# bDAdBgNVHQ4EFgQUFQASKxOYspkH7R7for5XDStnAs0wHwYDVR0jBBgwFoAUReui +# r/SSy4IxLVGLp6chnfNtyA8wDQYJKoZIhvcNAQEFBQADggEBAEZQPsm3KCSnOB22 +# WymvUs9S6TFHq1Zce9UNC0Gz7+x1H3Q48rJcYaKclcNQ5IK5I9G6OoZyrTh4rHVd +# Fxc0ckeFlFbR67s2hHfMJKXzBBlVqefj56tizfuLLZDCwNK1lL1eT7EF0g49GqkU +# W6aGMWKoqDPkmzmnxPXOHXh2lCVz5Cqrz5x2S+1fwksW5EtwTACJHvzFebxMElf+ +# X+EevAJdqP77BzhPDcZdkbkPZ0XN1oPt55INjbFpjE/7WeAjD9KqrgB87pxCDs+R +# 1ye3Fu4Pw718CqDuLAhVhSK46xgaTfwqIa1JMYNHlXdx3LEbS0scEJx3FMGdTy9a +# lQgpECYxggQ7MIIENwIBATCBhjByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGln +# aUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhE +# aWdpQ2VydCBTSEEyIEFzc3VyZWQgSUQgQ29kZSBTaWduaW5nIENBAhADtHHNTX/+ +# wpo7ILLLD19UMAkGBSsOAwIaBQCgeDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAA +# MBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgor +# BgEEAYI3AgEVMCMGCSqGSIb3DQEJBDEWBBS1dRcwLYpAdOGb79bA8lUPXs2weTAN +# BgkqhkiG9w0BAQEFAASCAQDaFv54IUAa3PRmDo4gr25cTzNNVRBVQn29+lBWRhL6 +# Z4xafc4dV2NuhsySyM/7CviTF/T32E9GfMUPjsje1L02FuP+xydJ/KHFba2Qe5Tm +# rqQIQTDsdYBx4imOecLbzF8mcfMjbBTLz3YTWDShTIhTR+WqVMbzvASfJ/jUj6bP +# wxiuHho0Gus669fK9xNrUr0Yo9Jaw82KLCsJFE/NgEV3eoNWi3ufZF4Owq+HWqLj +# ZfzKTOb+A7oLHEfr2bX3lrwm5O/dcb4gb6dUP2m1zY6B9hPPO5lwtCVFdOShU+a4 +# Xq+MQ6RvjjXx/wRyBgF9e24k56EXce5hS9KSM/r4HJcFoYICDzCCAgsGCSqGSIb3 +# DQEJBjGCAfwwggH4AgEBMHYwYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lD +# ZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGln +# aUNlcnQgQXNzdXJlZCBJRCBDQS0xAhADAZoCOv9YsWvW1ermF/BmMAkGBSsOAwIa +# BQCgXTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0x +# NjA2MDExNjMwNTFaMCMGCSqGSIb3DQEJBDEWBBQTfVtazojkMGVHBXKiXef3VObs +# mTANBgkqhkiG9w0BAQEFAASCAQCXNZHaksqQrHFmc96ks9qPT2mR35sHOOIOVCZn +# kFPyFEjzoZmMQAhcQqHdEvgEoIr5DZ6yuLTvtu8bEN3gS2iSXD542PatUBy/DsCc +# uFn4QFVewop/g6hPgy3VMwFWhd1t3YJ1HZtppE9N68Eth8bFODeMmc6Ogrv7oCts +# YwjBdccKXgrdAN/2cBIZCa8+FEj+sdO0ZKToVlRivETPnI8Y/XFrrgF3+cOkDg4e +# ZU11g/Ww9RYLdZiqIRe06pChRmHNrY5AZA9W4UgKyCQESWd8e0lLR/6uGCZulWL6 +# U3LKVUyUUP/eAHLO9iGsm3pA9L27gcnyl41UPVIqQ7VhSvrO # SIG # End signature block -- cgit v1.2.3 From 87324738d20915ffa03c27928dd7b4fa3d31ab87 Mon Sep 17 00:00:00 2001 From: Mark Mueller Date: Mon, 30 May 2016 16:46:38 -0600 Subject: layers: LX506 fix vkFlushMappedMemoryRanges validation error Fix LX506: vkFlushMappedMemoryRanges validation error with VkMappedMemoryRange::size = VK_WHOLE_SIZE. Resolution: Change test of size variable to correctly test the size passed by application against the relevant mapped memory Change-Id: I6d855482985512b5096696f5c37346dde8a391ac --- layers/core_validation.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index aa342c49..f5e05092 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -9428,16 +9428,18 @@ static bool validateMemoryIsMapped(layer_data *my_data, const char *funcName, ui "(" PRINTF_SIZE_T_SPECIFIER ").", funcName, static_cast(pMemRanges[i].offset), static_cast(mem_element->second.memRange.offset)); } - if ((mem_element->second.memRange.size != VK_WHOLE_SIZE) && - ((mem_element->second.memRange.offset + mem_element->second.memRange.size) < - (pMemRanges[i].offset + pMemRanges[i].size))) { + + const uint64_t my_dataTerminus = + (mem_element->second.memRange.size == VK_WHOLE_SIZE) ? mem_element->second.allocInfo.allocationSize : + (mem_element->second.memRange.offset + mem_element->second.memRange.size); + if (pMemRanges[i].size != VK_WHOLE_SIZE && (my_dataTerminus < (pMemRanges[i].offset + pMemRanges[i].size))) { skipCall |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, (uint64_t)pMemRanges[i].memory, __LINE__, MEMTRACK_INVALID_MAP, "MEM", "%s: Flush/Invalidate upper-bound (" PRINTF_SIZE_T_SPECIFIER ") exceeds the Memory Object's upper-bound " "(" PRINTF_SIZE_T_SPECIFIER ").", funcName, static_cast(pMemRanges[i].offset + pMemRanges[i].size), - static_cast(mem_element->second.memRange.offset + mem_element->second.memRange.size)); + static_cast(my_dataTerminus)); } } } -- cgit v1.2.3 From 4f3e4b7581b79c44a109df973a8c28dcb75dfae3 Mon Sep 17 00:00:00 2001 From: Dustin Graves Date: Mon, 30 May 2016 16:14:27 -0600 Subject: layers: More noautovalidity processing for structs Apply 'noautovalidity' code generation logic to struct members. Previously, struct pointers tagged as noautovalidity were ignored by the code generator, but the members of non-NULL struct pointers were still processed. Now both the struct pointer and the struct members are ignored when the struct pointer has the 'noautovalidity' attribute. Change-Id: I14bc231210f2440fb8bb3df8c73ef165100f0daa --- generator.py | 20 ++-- layers/parameter_validation.cpp | 223 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 214 insertions(+), 29 deletions(-) diff --git a/generator.py b/generator.py index e9aa8d4e..0b97305e 100644 --- a/generator.py +++ b/generator.py @@ -3566,10 +3566,10 @@ class ParamCheckerOutputGenerator(OutputGenerator): usedLines += self.makeStructNextCheck(valuePrefix, value, funcName, valueDisplayName) else: usedLines += self.makePointerCheck(valuePrefix, value, lenParam, req, cvReq, cpReq, funcName, lenDisplayName, valueDisplayName) - # - # If this is a pointer to a struct (input), see if it contains members that need to be checked - if value.type in self.validatedStructs and value.isconst: - usedLines.append(self.expandStructPointerCode(valuePrefix, value, lenParam, funcName, valueDisplayName)) + # + # If this is a pointer to a struct (input), see if it contains members that need to be checked + if value.type in self.validatedStructs and value.isconst: + usedLines.append(self.expandStructPointerCode(valuePrefix, value, lenParam, funcName, valueDisplayName)) # Non-pointer types else: # @@ -3600,12 +3600,12 @@ class ParamCheckerOutputGenerator(OutputGenerator): elif value.israngedenum: enumRange = self.enumRanges[value.type] usedLines.append('skipCall |= validate_ranged_enum(report_data, "{}", "{}", "{}", {}, {}, {}{});\n'.format(funcName, valueDisplayName, value.type, enumRange[0], enumRange[1], valuePrefix, value.name)) - # - # If this is a pointer to a struct (input), see if it contains members that need to be checked - if value.type in self.validatedStructs: - memberNamePrefix = '{}{}.'.format(valuePrefix, value.name) - memberDisplayNamePrefix = '{}.'.format(valueDisplayName) - usedLines.append(self.expandStructCode(self.validatedStructs[value.type], funcName, memberNamePrefix, memberDisplayNamePrefix, '', [])) + # + # If this is a struct, see if it contains members that need to be checked + if value.type in self.validatedStructs: + memberNamePrefix = '{}{}.'.format(valuePrefix, value.name) + memberDisplayNamePrefix = '{}.'.format(valueDisplayName) + usedLines.append(self.expandStructCode(self.validatedStructs[value.type], funcName, memberNamePrefix, memberDisplayNamePrefix, '', [])) # # Append the parameter check to the function body for the current command if usedLines: diff --git a/layers/parameter_validation.cpp b/layers/parameter_validation.cpp index e0e29c6d..e584d46c 100644 --- a/layers/parameter_validation.cpp +++ b/layers/parameter_validation.cpp @@ -2780,12 +2780,22 @@ CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t i, i); } } - } else if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) { - skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, INVALID_STRUCT_STYPE, LayerName, - "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be " - "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO", - i); + } else { + skip_call |= + validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pTessellationState->pNext", + NULL, pCreateInfos[i].pTessellationState->pNext, 0, NULL); + + skip_call |= + validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pTessellationState->flags", + pCreateInfos[i].pTessellationState->flags); + + if (pCreateInfos[i].pTessellationState->sType != VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO) { + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + __LINE__, INVALID_STRUCT_STYPE, LayerName, + "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pTessellationState->sType must be " + "VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO", + i); + } } if (pCreateInfos[i].pViewportState == nullptr) { @@ -2801,6 +2811,14 @@ CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t i, i); } } else { + skip_call |= + validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pViewportState->pNext", NULL, + pCreateInfos[i].pViewportState->pNext, 0, NULL); + + skip_call |= + validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pViewportState->flags", + pCreateInfos[i].pViewportState->flags); + if (pCreateInfos[i].pViewportState->sType != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO) { skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_STRUCT_STYPE, LayerName, @@ -2879,26 +2897,181 @@ CreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t "VK_FALSE, pCreateInfos[%d].pMultisampleState must not be NULL", i, i); } - } else if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) { - skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, INVALID_STRUCT_STYPE, LayerName, - "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be " - "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO", - i); + } else { + skip_call |= + validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->pNext", + NULL, pCreateInfos[i].pMultisampleState->pNext, 0, NULL); + + skip_call |= + validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->flags", + pCreateInfos[i].pMultisampleState->flags); + + skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines", + "pCreateInfos[i].pMultisampleState->sampleShadingEnable", + pCreateInfos[i].pMultisampleState->sampleShadingEnable); + + skip_call |= validate_array( + report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->rasterizationSamples", + "pCreateInfos[i].pMultisampleState->pSampleMask", pCreateInfos[i].pMultisampleState->rasterizationSamples, + pCreateInfos[i].pMultisampleState->pSampleMask, true, false); + + skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines", + "pCreateInfos[i].pMultisampleState->alphaToCoverageEnable", + pCreateInfos[i].pMultisampleState->alphaToCoverageEnable); + + skip_call |= + validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pMultisampleState->alphaToOneEnable", + pCreateInfos[i].pMultisampleState->alphaToOneEnable); + + if (pCreateInfos[i].pMultisampleState->sType != VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO) { + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + __LINE__, INVALID_STRUCT_STYPE, LayerName, + "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pMultisampleState->sType must be " + "VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO", + i); + } } // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass - if ((pCreateInfos[i].pDepthStencilState != nullptr) && - (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO)) { - skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, - __LINE__, INVALID_STRUCT_STYPE, LayerName, - "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be " - "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO", - i); + if (pCreateInfos[i].pDepthStencilState != nullptr) { + skip_call |= + validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->pNext", + NULL, pCreateInfos[i].pDepthStencilState->pNext, 0, NULL); + + skip_call |= + validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->flags", + pCreateInfos[i].pDepthStencilState->flags); + + skip_call |= + validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->depthTestEnable", + pCreateInfos[i].pDepthStencilState->depthTestEnable); + + skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines", + "pCreateInfos[i].pDepthStencilState->depthWriteEnable", + pCreateInfos[i].pDepthStencilState->depthWriteEnable); + + skip_call |= validate_ranged_enum( + report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->depthCompareOp", "VkCompareOp", + VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->depthCompareOp); + + skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines", + "pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable", + pCreateInfos[i].pDepthStencilState->depthBoundsTestEnable); + + skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines", + "pCreateInfos[i].pDepthStencilState->stencilTestEnable", + pCreateInfos[i].pDepthStencilState->stencilTestEnable); + + skip_call |= validate_ranged_enum( + report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.failOp", "VkStencilOp", + VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.failOp); + + skip_call |= validate_ranged_enum( + report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.passOp", "VkStencilOp", + VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.passOp); + + skip_call |= validate_ranged_enum(report_data, "vkCreateGraphicsPipelines", + "pCreateInfos[i].pDepthStencilState->front.depthFailOp", "VkStencilOp", + VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, + pCreateInfos[i].pDepthStencilState->front.depthFailOp); + + skip_call |= validate_ranged_enum( + report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->front.compareOp", "VkCompareOp", + VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->front.compareOp); + + skip_call |= validate_ranged_enum( + report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.failOp", "VkStencilOp", + VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.failOp); + + skip_call |= validate_ranged_enum( + report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.passOp", "VkStencilOp", + VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.passOp); + + skip_call |= validate_ranged_enum( + report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.depthFailOp", "VkStencilOp", + VK_STENCIL_OP_BEGIN_RANGE, VK_STENCIL_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.depthFailOp); + + skip_call |= validate_ranged_enum( + report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pDepthStencilState->back.compareOp", "VkCompareOp", + VK_COMPARE_OP_BEGIN_RANGE, VK_COMPARE_OP_END_RANGE, pCreateInfos[i].pDepthStencilState->back.compareOp); + + if (pCreateInfos[i].pDepthStencilState->sType != VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO) { + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, + __LINE__, INVALID_STRUCT_STYPE, LayerName, + "vkCreateGraphicsPipelines: parameter pCreateInfos[%d].pDepthStencilState->sType must be " + "VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO", + i); + } } // TODO: Conditional NULL check based on rasterizerDiscardEnable and subpass if (pCreateInfos[i].pColorBlendState != nullptr) { + skip_call |= + validate_struct_pnext(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->pNext", NULL, + pCreateInfos[i].pColorBlendState->pNext, 0, NULL); + + skip_call |= + validate_reserved_flags(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->flags", + pCreateInfos[i].pColorBlendState->flags); + + skip_call |= + validate_bool32(report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->logicOpEnable", + pCreateInfos[i].pColorBlendState->logicOpEnable); + + skip_call |= validate_array( + report_data, "vkCreateGraphicsPipelines", "pCreateInfos[i].pColorBlendState->attachmentCount", + "pCreateInfos[i].pColorBlendState->pAttachments", pCreateInfos[i].pColorBlendState->attachmentCount, + pCreateInfos[i].pColorBlendState->pAttachments, false, true); + + if (pCreateInfos[i].pColorBlendState->pAttachments != NULL) { + for (uint32_t attachmentIndex = 0; attachmentIndex < pCreateInfos[i].pColorBlendState->attachmentCount; + ++attachmentIndex) { + skip_call |= validate_bool32(report_data, "vkCreateGraphicsPipelines", + "pCreateInfos[i].pColorBlendState->pAttachments[i].blendEnable", + pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].blendEnable); + + skip_call |= validate_ranged_enum( + report_data, "vkCreateGraphicsPipelines", + "pCreateInfos[i].pColorBlendState->pAttachments[i].srcColorBlendFactor", "VkBlendFactor", + VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE, + pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcColorBlendFactor); + + skip_call |= validate_ranged_enum( + report_data, "vkCreateGraphicsPipelines", + "pCreateInfos[i].pColorBlendState->pAttachments[i].dstColorBlendFactor", "VkBlendFactor", + VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE, + pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstColorBlendFactor); + + skip_call |= validate_ranged_enum( + report_data, "vkCreateGraphicsPipelines", + "pCreateInfos[i].pColorBlendState->pAttachments[i].colorBlendOp", "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, + VK_BLEND_OP_END_RANGE, pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorBlendOp); + + skip_call |= validate_ranged_enum( + report_data, "vkCreateGraphicsPipelines", + "pCreateInfos[i].pColorBlendState->pAttachments[i].srcAlphaBlendFactor", "VkBlendFactor", + VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE, + pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].srcAlphaBlendFactor); + + skip_call |= validate_ranged_enum( + report_data, "vkCreateGraphicsPipelines", + "pCreateInfos[i].pColorBlendState->pAttachments[i].dstAlphaBlendFactor", "VkBlendFactor", + VK_BLEND_FACTOR_BEGIN_RANGE, VK_BLEND_FACTOR_END_RANGE, + pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].dstAlphaBlendFactor); + + skip_call |= validate_ranged_enum( + report_data, "vkCreateGraphicsPipelines", + "pCreateInfos[i].pColorBlendState->pAttachments[i].alphaBlendOp", "VkBlendOp", VK_BLEND_OP_BEGIN_RANGE, + VK_BLEND_OP_END_RANGE, pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].alphaBlendOp); + + skip_call |= + validate_flags(report_data, "vkCreateGraphicsPipelines", + "pCreateInfos[i].pColorBlendState->pAttachments[i].colorWriteMask", + "VkColorComponentFlagBits", AllVkColorComponentFlagBits, + pCreateInfos[i].pColorBlendState->pAttachments[attachmentIndex].colorWriteMask, false); + } + } + if (pCreateInfos[i].pColorBlendState->sType != VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO) { skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, INVALID_STRUCT_STYPE, LayerName, @@ -3298,6 +3471,12 @@ UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, const VkWri "VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, " "pDescriptorWrites[%d].pBufferInfo must not be NULL", i, i); + } else { + for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) { + skip_call |= validate_required_handle(report_data, "vkUpdateDescriptorSets", + "pDescriptorWrites[i].pBufferInfo[i].buffer", + pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer); + } } } else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) || (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) { @@ -3515,6 +3694,12 @@ BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO, false); if (pBeginInfo->pInheritanceInfo != NULL) { + skip_call |= validate_struct_pnext(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->pNext", NULL, + pBeginInfo->pInheritanceInfo->pNext, 0, NULL); + + skip_call |= validate_bool32(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->occlusionQueryEnable", + pBeginInfo->pInheritanceInfo->occlusionQueryEnable); + // TODO: This only needs to be validated when the inherited queries feature is enabled // skip_call |= validate_flags(report_data, "vkBeginCommandBuffer", "pBeginInfo->pInheritanceInfo->queryFlags", // "VkQueryControlFlagBits", AllVkQueryControlFlagBits, pBeginInfo->pInheritanceInfo->queryFlags, false); -- cgit v1.2.3 From c90ca65de9cd73f7a1ddaff9c05b21cfe47cca6e Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Fri, 20 May 2016 07:11:22 +0800 Subject: layers: simplify v0 function implementations Since each of the layer library contains only a layer, we can simplify v0 functions by making them wrappers to the contained layer's corresponding commands. While we have to make changes to each layer individually, all the changes should be the same in spirit. The exception is vk-layer-generate.py where the missing vkEnumerateDeviceExtensionProperties is also added. --- layers/core_validation.cpp | 48 ++++++++------ layers/device_limits.cpp | 48 ++++++++------ layers/image.cpp | 48 ++++++++------ layers/parameter_validation.cpp | 48 ++++++++------ layers/swapchain.cpp | 48 ++++++++------ layers/threading.cpp | 54 ++++++++++------ vk-layer-generate.py | 134 +++++++++++++++++++++++++--------------- 7 files changed, 261 insertions(+), 167 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index f5e05092..cf44ce68 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -9915,6 +9915,24 @@ DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugR pMsg); } +VKAPI_ATTR VkResult VKAPI_CALL +EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) { + return util_GetLayerProperties(1, &global_layer, pCount, pProperties); +} + +VKAPI_ATTR VkResult VKAPI_CALL +EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) { + return util_GetLayerProperties(1, &global_layer, pCount, pProperties); +} + +VKAPI_ATTR VkResult VKAPI_CALL +EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { + if (pLayerName && !strcmp(pLayerName, global_layer.layerName)) + return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties); + + return VK_ERROR_LAYER_NOT_PRESENT; +} + VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { @@ -9993,14 +10011,12 @@ intercept_core_instance_command(const char *name) { { "vkCreateInstance", reinterpret_cast(CreateInstance) }, { "vkCreateDevice", reinterpret_cast(CreateDevice) }, { "vkDestroyInstance", reinterpret_cast(DestroyInstance) }, + { "vkEnumerateInstanceLayerProperties", reinterpret_cast(EnumerateInstanceLayerProperties) }, + { "vkEnumerateDeviceLayerProperties", reinterpret_cast(EnumerateDeviceLayerProperties) }, + { "vkEnumerateInstanceExtensionProperties", reinterpret_cast(EnumerateInstanceExtensionProperties) }, { "vkEnumerateDeviceExtensionProperties", reinterpret_cast(EnumerateDeviceExtensionProperties) }, }; - // we should never be queried for these commands - assert(strcmp(name, "vkEnumerateInstanceLayerProperties") && - strcmp(name, "vkEnumerateInstanceExtensionProperties") && - strcmp(name, "vkEnumerateDeviceLayerProperties")); - for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) { if (!strcmp(core_instance_commands[i].name, name)) return core_instance_commands[i].proc; @@ -10191,27 +10207,30 @@ vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebu core_validation::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg); } -// loader-layer interface v0 +// loader-layer interface v0, just wrappers since there is only a layer VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { - return util_GetExtensionProperties(1, core_validation::instance_extensions, pCount, pProperties); + return core_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties); } VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) { - return util_GetLayerProperties(1, &core_validation::global_layer, pCount, pProperties); + return core_validation::EnumerateInstanceLayerProperties(pCount, pProperties); } VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) { - return util_GetLayerProperties(1, &core_validation::global_layer, pCount, pProperties); + // the layer command handles VK_NULL_HANDLE just fine internally + assert(physicalDevice == VK_NULL_HANDLE); + return core_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties); } VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { - // the layer command handles VK_NULL_HANDLE just fine + // the layer command handles VK_NULL_HANDLE just fine internally + assert(physicalDevice == VK_NULL_HANDLE); return core_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties); } @@ -10220,14 +10239,5 @@ VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkD } VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) { - if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties")) - return reinterpret_cast(vkEnumerateInstanceLayerProperties); - if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties")) - return reinterpret_cast(vkEnumerateDeviceLayerProperties); - if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties")) - return reinterpret_cast(vkEnumerateInstanceExtensionProperties); - if (!strcmp(funcName, "vkGetInstanceProcAddr")) - return reinterpret_cast(vkGetInstanceProcAddr); - return core_validation::GetInstanceProcAddr(instance, funcName); } diff --git a/layers/device_limits.cpp b/layers/device_limits.cpp index a5b1ca79..df52cf31 100644 --- a/layers/device_limits.cpp +++ b/layers/device_limits.cpp @@ -669,6 +669,24 @@ DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugR pMsg); } +VKAPI_ATTR VkResult VKAPI_CALL +EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) { + return util_GetLayerProperties(1, &global_layer, pCount, pProperties); +} + +VKAPI_ATTR VkResult VKAPI_CALL +EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) { + return util_GetLayerProperties(1, &global_layer, pCount, pProperties); +} + +VKAPI_ATTR VkResult VKAPI_CALL +EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { + if (pLayerName && !strcmp(pLayerName, global_layer.layerName)) + return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties); + + return VK_ERROR_LAYER_NOT_PRESENT; +} + VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName, uint32_t *pCount, @@ -750,14 +768,12 @@ intercept_core_instance_command(const char *name) { { "vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast(GetPhysicalDeviceQueueFamilyProperties) }, { "vkGetPhysicalDeviceMemoryProperties", reinterpret_cast(GetPhysicalDeviceMemoryProperties) }, { "vkGetPhysicalDeviceSparseImageFormatProperties", reinterpret_cast(GetPhysicalDeviceSparseImageFormatProperties) }, + { "vkEnumerateInstanceLayerProperties", reinterpret_cast(EnumerateInstanceLayerProperties) }, + { "vkEnumerateDeviceLayerProperties", reinterpret_cast(EnumerateDeviceLayerProperties) }, + { "vkEnumerateInstanceExtensionProperties", reinterpret_cast(EnumerateInstanceExtensionProperties) }, { "vkEnumerateDeviceExtensionProperties", reinterpret_cast(EnumerateDeviceExtensionProperties) }, }; - // we should never be queried for these commands - assert(strcmp(name, "vkEnumerateInstanceLayerProperties") && - strcmp(name, "vkEnumerateInstanceExtensionProperties") && - strcmp(name, "vkEnumerateDeviceLayerProperties")); - for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) { if (!strcmp(core_instance_commands[i].name, name)) return core_instance_commands[i].proc; @@ -820,27 +836,30 @@ vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebu device_limits::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg); } -// loader-layer interface v0 +// loader-layer interface v0, just wrappers since there is only a layer VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) { - return util_GetLayerProperties(1, &device_limits::global_layer, pCount, pProperties); + return device_limits::EnumerateInstanceLayerProperties(pCount, pProperties); } VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) { - return util_GetLayerProperties(1, &device_limits::global_layer, pCount, pProperties); + // the layer command handles VK_NULL_HANDLE just fine internally + assert(physicalDevice == VK_NULL_HANDLE); + return device_limits::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties); } VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { - return util_GetExtensionProperties(1, device_limits::instance_extensions, pCount, pProperties); + return device_limits::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties); } VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { - // the layer command handles VK_NULL_HANDLE just fine + // the layer command handles VK_NULL_HANDLE just fine internally + assert(physicalDevice == VK_NULL_HANDLE); return device_limits::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties); } @@ -849,14 +868,5 @@ VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkD } VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) { - if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties")) - return reinterpret_cast(vkEnumerateInstanceLayerProperties); - if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties")) - return reinterpret_cast(vkEnumerateDeviceLayerProperties); - if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties")) - return reinterpret_cast(vkEnumerateInstanceExtensionProperties); - if (!strcmp(funcName, "vkGetInstanceProcAddr")) - return reinterpret_cast(vkGetInstanceProcAddr); - return device_limits::GetInstanceProcAddr(instance, funcName); } diff --git a/layers/image.cpp b/layers/image.cpp index 88ae5ba1..81140e9d 100644 --- a/layers/image.cpp +++ b/layers/image.cpp @@ -1286,6 +1286,24 @@ GetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice, VkPhysicalDevicePro phy_dev_data->instance_dispatch_table->GetPhysicalDeviceProperties(physicalDevice, pProperties); } +VKAPI_ATTR VkResult VKAPI_CALL +EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) { + return util_GetLayerProperties(1, &global_layer, pCount, pProperties); +} + +VKAPI_ATTR VkResult VKAPI_CALL +EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) { + return util_GetLayerProperties(1, &global_layer, pCount, pProperties); +} + +VKAPI_ATTR VkResult VKAPI_CALL +EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { + if (pLayerName && !strcmp(pLayerName, global_layer.layerName)) + return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties); + + return VK_ERROR_LAYER_NOT_PRESENT; +} + VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { @@ -1353,15 +1371,13 @@ intercept_core_instance_command(const char *name) { { "vkCreateInstance", reinterpret_cast(CreateInstance) }, { "vkDestroyInstance", reinterpret_cast(DestroyInstance) }, { "vkCreateDevice", reinterpret_cast(CreateDevice) }, + { "vkEnumerateInstanceLayerProperties", reinterpret_cast(EnumerateInstanceLayerProperties) }, + { "vkEnumerateDeviceLayerProperties", reinterpret_cast(EnumerateDeviceLayerProperties) }, + { "vkEnumerateInstanceExtensionProperties", reinterpret_cast(EnumerateInstanceExtensionProperties) }, { "vkEnumerateDeviceExtensionProperties", reinterpret_cast(EnumerateDeviceExtensionProperties) }, { "vkGetPhysicalDeviceProperties", reinterpret_cast(GetPhysicalDeviceProperties) }, }; - // we should never be queried for these commands - assert(strcmp(name, "vkEnumerateInstanceLayerProperties") && - strcmp(name, "vkEnumerateInstanceExtensionProperties") && - strcmp(name, "vkEnumerateDeviceLayerProperties")); - for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) { if (!strcmp(core_instance_commands[i].name, name)) return core_instance_commands[i].proc; @@ -1425,27 +1441,30 @@ vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebu image::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg); } -// loader-layer interface v0 +// loader-layer interface v0, just wrappers since there is only a layer VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { - return util_GetExtensionProperties(1, image::instance_extensions, pCount, pProperties); + return image::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties); } VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) { - return util_GetLayerProperties(1, &image::global_layer, pCount, pProperties); + return image::EnumerateInstanceLayerProperties(pCount, pProperties); } VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) { - return util_GetLayerProperties(1, &image::global_layer, pCount, pProperties); + // the layer command handles VK_NULL_HANDLE just fine internally + assert(physicalDevice == VK_NULL_HANDLE); + return image::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties); } VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { - // the layer command handles VK_NULL_HANDLE just fine + // the layer command handles VK_NULL_HANDLE just fine internally + assert(physicalDevice == VK_NULL_HANDLE); return image::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties); } @@ -1454,14 +1473,5 @@ VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkD } VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) { - if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties")) - return reinterpret_cast(vkEnumerateInstanceLayerProperties); - if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties")) - return reinterpret_cast(vkEnumerateInstanceExtensionProperties); - if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties")) - return reinterpret_cast(vkEnumerateDeviceLayerProperties); - if (!strcmp(funcName, "vkGetInstanceProcAddr")) - return reinterpret_cast(vkGetInstanceProcAddr); - return image::GetInstanceProcAddr(instance, funcName); } diff --git a/layers/parameter_validation.cpp b/layers/parameter_validation.cpp index e584d46c..c70142bb 100644 --- a/layers/parameter_validation.cpp +++ b/layers/parameter_validation.cpp @@ -4453,6 +4453,24 @@ CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, c } } +VKAPI_ATTR VkResult VKAPI_CALL +EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) { + return util_GetLayerProperties(1, &global_layer, pCount, pProperties); +} + +VKAPI_ATTR VkResult VKAPI_CALL +EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) { + return util_GetLayerProperties(1, &global_layer, pCount, pProperties); +} + +VKAPI_ATTR VkResult VKAPI_CALL +EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { + if (pLayerName && !strcmp(pLayerName, global_layer.layerName)) + return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties); + + return VK_ERROR_LAYER_NOT_PRESENT; +} + VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { @@ -4528,14 +4546,12 @@ intercept_core_instance_command(const char *name) { { "vkGetPhysicalDeviceSparseImageFormatProperties", reinterpret_cast(GetPhysicalDeviceSparseImageFormatProperties) }, { "vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast(GetPhysicalDeviceQueueFamilyProperties) }, { "vkGetPhysicalDeviceMemoryProperties", reinterpret_cast(GetPhysicalDeviceMemoryProperties) }, + { "vkEnumerateInstanceLayerProperties", reinterpret_cast(EnumerateInstanceLayerProperties) }, + { "vkEnumerateDeviceLayerProperties", reinterpret_cast(EnumerateDeviceLayerProperties) }, + { "vkEnumerateInstanceExtensionProperties", reinterpret_cast(EnumerateInstanceExtensionProperties) }, { "vkEnumerateDeviceExtensionProperties", reinterpret_cast(EnumerateDeviceExtensionProperties) }, }; - // we should never be queried for these commands - assert(strcmp(name, "vkEnumerateInstanceLayerProperties") && - strcmp(name, "vkEnumerateInstanceExtensionProperties") && - strcmp(name, "vkEnumerateDeviceLayerProperties")); - for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) { if (!strcmp(core_instance_commands[i].name, name)) return core_instance_commands[i].proc; @@ -4698,25 +4714,26 @@ vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebu VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { - return util_GetExtensionProperties(1, parameter_validation::instance_extensions, pCount, pProperties); + return parameter_validation::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties); } VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) { - return util_GetLayerProperties(1, ¶meter_validation::global_layer, pCount, pProperties); + return parameter_validation::EnumerateInstanceLayerProperties(pCount, pProperties); } VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) { - - /* parameter_validation's physical device layers are the same as global */ - return util_GetLayerProperties(1, ¶meter_validation::global_layer, pCount, pProperties); + // the layer command handles VK_NULL_HANDLE just fine internally + assert(physicalDevice == VK_NULL_HANDLE); + return parameter_validation::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties); } VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { - // the layer command handles VK_NULL_HANDLE just fine + // the layer command handles VK_NULL_HANDLE just fine internally + assert(physicalDevice == VK_NULL_HANDLE); return parameter_validation::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties); } @@ -4725,14 +4742,5 @@ VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkD } VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) { - if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties")) - return reinterpret_cast(vkEnumerateInstanceLayerProperties); - if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties")) - return reinterpret_cast(vkEnumerateDeviceLayerProperties); - if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties")) - return reinterpret_cast(vkEnumerateInstanceExtensionProperties); - if (!strcmp(funcName, "vkGetInstanceProcAddr")) - return reinterpret_cast(vkGetInstanceProcAddr); - return parameter_validation::GetInstanceProcAddr(instance, funcName); } diff --git a/layers/swapchain.cpp b/layers/swapchain.cpp index b603ec77..1642468d 100644 --- a/layers/swapchain.cpp +++ b/layers/swapchain.cpp @@ -2121,6 +2121,24 @@ DebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugR pMsg); } +VKAPI_ATTR VkResult VKAPI_CALL +EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) { + return util_GetLayerProperties(1, &swapchain_layer, pCount, pProperties); +} + +VKAPI_ATTR VkResult VKAPI_CALL +EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) { + return util_GetLayerProperties(1, &swapchain_layer, pCount, pProperties); +} + +VKAPI_ATTR VkResult VKAPI_CALL +EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { + if (pLayerName && !strcmp(pLayerName, swapchain_layer.layerName)) + return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties); + + return VK_ERROR_LAYER_NOT_PRESENT; +} + VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { @@ -2204,15 +2222,13 @@ intercept_core_instance_command(const char *name) { { "vkDestroyInstance", reinterpret_cast(DestroyInstance) }, { "vkCreateDevice", reinterpret_cast(CreateDevice) }, { "vkEnumeratePhysicalDevices", reinterpret_cast(EnumeratePhysicalDevices) }, + { "vkEnumerateInstanceLayerProperties", reinterpret_cast(EnumerateInstanceLayerProperties) }, + { "vkEnumerateDeviceLayerProperties", reinterpret_cast(EnumerateDeviceLayerProperties) }, + { "vkEnumerateInstanceExtensionProperties", reinterpret_cast(EnumerateInstanceExtensionProperties) }, { "vkEnumerateDeviceExtensionProperties", reinterpret_cast(EnumerateDeviceExtensionProperties) }, { "vkGetPhysicalDeviceQueueFamilyProperties", reinterpret_cast(GetPhysicalDeviceQueueFamilyProperties) }, }; - // we should never be queried for these commands - assert(strcmp(name, "vkEnumerateInstanceLayerProperties") && - strcmp(name, "vkEnumerateInstanceExtensionProperties") && - strcmp(name, "vkEnumerateDeviceLayerProperties")); - for (size_t i = 0; i < ARRAY_SIZE(core_instance_commands); i++) { if (!strcmp(core_instance_commands[i].name, name)) return core_instance_commands[i].proc; @@ -2331,27 +2347,30 @@ vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebu swapchain::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg); } -// loader-layer interface v0 +// loader-layer interface v0, just wrappers since there is only a layer VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { - return util_GetExtensionProperties(ARRAY_SIZE(swapchain::instance_extensions), swapchain::instance_extensions, pCount, pProperties); + return swapchain::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties); } VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) { - return util_GetLayerProperties(1, &swapchain::swapchain_layer, pCount, pProperties); + return swapchain::EnumerateInstanceLayerProperties(pCount, pProperties); } VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) { - return util_GetLayerProperties(1, &swapchain::swapchain_layer, pCount, pProperties); + // the layer command handles VK_NULL_HANDLE just fine internally + assert(physicalDevice == VK_NULL_HANDLE); + return swapchain::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties); } VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { - // the layer command handles VK_NULL_HANDLE just fine + // the layer command handles VK_NULL_HANDLE just fine internally + assert(physicalDevice == VK_NULL_HANDLE); return swapchain::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties); } @@ -2360,14 +2379,5 @@ VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkD } VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) { - if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties")) - return reinterpret_cast(vkEnumerateInstanceLayerProperties); - if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties")) - return reinterpret_cast(vkEnumerateDeviceLayerProperties); - if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties")) - return reinterpret_cast(vkEnumerateInstanceExtensionProperties); - if (!strcmp(funcName, "vkGetInstanceProcAddr")) - return reinterpret_cast(vkGetInstanceProcAddr); - return swapchain::GetInstanceProcAddr(instance, funcName); } diff --git a/layers/threading.cpp b/layers/threading.cpp index 2de00522..f5d37eba 100644 --- a/layers/threading.cpp +++ b/layers/threading.cpp @@ -176,6 +176,24 @@ static inline PFN_vkVoidFunction layer_intercept_proc(const char *name) { return NULL; } +VKAPI_ATTR VkResult VKAPI_CALL +EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) { + return util_GetLayerProperties(1, &layerProps, pCount, pProperties); +} + +VKAPI_ATTR VkResult VKAPI_CALL +EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) { + return util_GetLayerProperties(1, &layerProps, pCount, pProperties); +} + +VKAPI_ATTR VkResult VKAPI_CALL +EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { + if (pLayerName && !strcmp(pLayerName, layerProps.layerName)) + return util_GetExtensionProperties(1, threading_extensions, pCount, pProperties); + + return VK_ERROR_LAYER_NOT_PRESENT; +} + VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { @@ -194,16 +212,17 @@ static inline PFN_vkVoidFunction layer_intercept_instance_proc(const char *name) if (!name || name[0] != 'v' || name[1] != 'k') return NULL; - // we should never be queried for these commands - assert(strcmp(name, "vkEnumerateInstanceLayerProperties") && - strcmp(name, "vkEnumerateInstanceExtensionProperties") && - strcmp(name, "vkEnumerateDeviceLayerProperties")); - name += 2; if (!strcmp(name, "CreateInstance")) return (PFN_vkVoidFunction)CreateInstance; if (!strcmp(name, "DestroyInstance")) return (PFN_vkVoidFunction)DestroyInstance; + if (!strcmp(name, "EnumerateInstanceLayerProperties")) + return (PFN_vkVoidFunction)EnumerateInstanceLayerProperties; + if (!strcmp(name, "EnumerateInstanceExtensionProperties")) + return (PFN_vkVoidFunction)EnumerateInstanceExtensionProperties; + if (!strcmp(name, "EnumerateDeviceLayerProperties")) + return (PFN_vkVoidFunction)EnumerateDeviceLayerProperties; if (!strcmp(name, "EnumerateDeviceExtensionProperties")) return (PFN_vkVoidFunction)EnumerateDeviceExtensionProperties; if (!strcmp(name, "CreateDevice")) @@ -351,26 +370,30 @@ vkDebugReportMessageEXT(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebu threading::DebugReportMessageEXT(instance, flags, objType, object, location, msgCode, pLayerPrefix, pMsg); } -// loader-layer interface v0 +// loader-layer interface v0, just wrappers since there is only a layer VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { - return util_GetExtensionProperties(ARRAY_SIZE(threading::threading_extensions), threading::threading_extensions, pCount, pProperties); + return threading::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties); } -VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) { - return util_GetLayerProperties(1, &threading::layerProps, pCount, pProperties); +VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL +vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties *pProperties) { + return threading::EnumerateInstanceLayerProperties(pCount, pProperties); } VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties *pProperties) { - return util_GetLayerProperties(1, &threading::layerProps, pCount, pProperties); + // the layer command handles VK_NULL_HANDLE just fine internally + assert(physicalDevice == VK_NULL_HANDLE); + return threading::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties); } VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char *pLayerName, uint32_t *pCount, VkExtensionProperties *pProperties) { - // the layer command handles VK_NULL_HANDLE just fine + // the layer command handles VK_NULL_HANDLE just fine internally + assert(physicalDevice == VK_NULL_HANDLE); return threading::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties); } @@ -379,14 +402,5 @@ VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkD } VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName) { - if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties")) - return reinterpret_cast(vkEnumerateInstanceLayerProperties); - if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties")) - return reinterpret_cast(vkEnumerateDeviceLayerProperties); - if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties")) - return reinterpret_cast(vkEnumerateInstanceExtensionProperties); - if (!strcmp(funcName, "vkGetInstanceProcAddr")) - return reinterpret_cast(vkGetInstanceProcAddr); - return threading::GetInstanceProcAddr(instance, funcName); } diff --git a/vk-layer-generate.py b/vk-layer-generate.py index 24f3c93b..0ec0bc07 100755 --- a/vk-layer-generate.py +++ b/vk-layer-generate.py @@ -375,50 +375,24 @@ class Subcommand(object): def _gen_layer_interface_v0_functions(self): body = [] body.append('%s' % self.lineinfo.get()) - body.append('// loader-layer interface v0') + body.append('// loader-layer interface v0, just wrappers since there is only a layer') body.append('') - if self.layer_name == 'object_tracker': - body.append('static const VkExtensionProperties instance_extensions[] = {') - body.append(' {') - body.append(' VK_EXT_DEBUG_REPORT_EXTENSION_NAME,') - body.append(' VK_EXT_DEBUG_REPORT_SPEC_VERSION') - body.append(' }') - body.append('};') - body.append('') - - body.append('static const VkLayerProperties globalLayerProps = {') - body.append(' "VK_LAYER_LUNARG_%s",' % self.layer_name) - body.append(' VK_LAYER_API_VERSION, // specVersion') - body.append(' 1, // implementationVersion') - body.append(' "LunarG Validation Layer"') - body.append('};') - body.append('') - else: - body.append('static const VkLayerProperties globalLayerProps = {') - body.append(' "VK_LAYER_GOOGLE_%s",' % self.layer_name) - body.append(' VK_LAYER_API_VERSION, // specVersion') - body.append(' 1, // implementationVersion') - body.append(' "Google Validation Layer"') - body.append('};') - body.append('') - body.append('VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties* pProperties)') body.append('{') - if self.layer_name == 'object_tracker': - body.append(' return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);') - else: - body.append(' return util_GetExtensionProperties(0, NULL, pCount, pProperties);') + body.append(' return %s::EnumerateInstanceExtensionProperties(pLayerName, pCount, pProperties);' % self.layer_name) body.append('}') body.append('') body.append('VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties* pProperties)') body.append('{') - body.append(' return util_GetLayerProperties(1, &globalLayerProps, pCount, pProperties);') + body.append(' return %s::EnumerateInstanceLayerProperties(pCount, pProperties);' % self.layer_name) body.append('}') body.append('') body.append('VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties* pProperties)') body.append('{') - body.append(' return util_GetLayerProperties(1, &globalLayerProps, pCount, pProperties);') + body.append(' // the layer command handles VK_NULL_HANDLE just fine internally') + body.append(' assert(physicalDevice == VK_NULL_HANDLE);') + body.append(' return %s::EnumerateDeviceLayerProperties(VK_NULL_HANDLE, pCount, pProperties);' % self.layer_name) body.append('}') body.append('') body.append('VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetDeviceProcAddr(VkDevice dev, const char *funcName)') @@ -428,17 +402,17 @@ class Subcommand(object): body.append('') body.append('VK_LAYER_EXPORT VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char *funcName)') body.append('{') - body.append(' if (!strcmp(funcName, "vkEnumerateInstanceLayerProperties"))') - body.append(' return reinterpret_cast(vkEnumerateInstanceLayerProperties);') - body.append(' if (!strcmp(funcName, "vkEnumerateDeviceLayerProperties"))') - body.append(' return reinterpret_cast(vkEnumerateDeviceLayerProperties);') - body.append(' if (!strcmp(funcName, "vkEnumerateInstanceExtensionProperties"))') - body.append(' return reinterpret_cast(vkEnumerateInstanceExtensionProperties);') - body.append(' if (!strcmp(funcName, "vkGetInstanceProcAddr"))') - body.append(' return reinterpret_cast(vkGetInstanceProcAddr);') - body.append('') body.append(' return %s::GetInstanceProcAddr(instance, funcName);' % self.layer_name) body.append('}') + body.append('') + body.append('VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,') + body.append(' const char *pLayerName, uint32_t *pCount,') + body.append(' VkExtensionProperties *pProperties)') + body.append('{') + body.append(' // the layer command handles VK_NULL_HANDLE just fine internally') + body.append(' assert(physicalDevice == VK_NULL_HANDLE);') + body.append(' return %s::EnumerateDeviceExtensionProperties(VK_NULL_HANDLE, pLayerName, pCount, pProperties);' % self.layer_name) + body.append('}') return "\n".join(body) @@ -451,11 +425,9 @@ class Subcommand(object): for proto in self.protos: if proto.name in ["EnumerateInstanceExtensionProperties", "EnumerateInstanceLayerProperties", - "EnumerateDeviceLayerProperties"]: - # the layer do not need to define these - continue - elif proto.name in ["GetDeviceProcAddr", - "GetInstanceProcAddr"]: + "EnumerateDeviceLayerProperties", + "GetDeviceProcAddr", + "GetInstanceProcAddr"]: funcs.append(proto.c_func(attr="VKAPI") + ';') intercepted.append(proto) else: @@ -503,11 +475,6 @@ class Subcommand(object): body.append("{") body.append(generate_get_proc_addr_check("name")) body.append("") - body.append(" // we should never be queried for these commands") - body.append(" assert(strcmp(name, \"vkEnumerateInstanceLayerProperties\") &&") - body.append(" strcmp(name, \"vkEnumerateInstanceExtensionProperties\") &&") - body.append(" strcmp(name, \"vkEnumerateDeviceLayerProperties\"));") - body.append("") body.append(" name += 2;") body.append(" %s" % "\n ".join(instance_lookups)) body.append("") @@ -525,6 +492,69 @@ class Subcommand(object): exts.append(self._gen_debug_report_msg()) return "\n".join(exts) + def _generate_layer_introspection_function(self): + body = [] + body.append('%s' % self.lineinfo.get()) + if self.layer_name == 'object_tracker': + body.append('static const VkExtensionProperties instance_extensions[] = {') + body.append(' {') + body.append(' VK_EXT_DEBUG_REPORT_EXTENSION_NAME,') + body.append(' VK_EXT_DEBUG_REPORT_SPEC_VERSION') + body.append(' }') + body.append('};') + body.append('') + + body.append('static const VkLayerProperties globalLayerProps = {') + body.append(' "VK_LAYER_LUNARG_%s",' % self.layer_name) + body.append(' VK_LAYER_API_VERSION, // specVersion') + body.append(' 1, // implementationVersion') + body.append(' "LunarG Validation Layer"') + body.append('};') + body.append('') + else: + body.append('static const VkLayerProperties globalLayerProps = {') + body.append(' "VK_LAYER_GOOGLE_%s",' % self.layer_name) + body.append(' VK_LAYER_API_VERSION, // specVersion') + body.append(' 1, // implementationVersion') + body.append(' "Google Validation Layer"') + body.append('};') + body.append('') + + body.append('VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceLayerProperties(uint32_t *pCount, VkLayerProperties* pProperties)') + body.append('{') + body.append(' return util_GetLayerProperties(1, &globalLayerProps, pCount, pProperties);') + body.append('}') + body.append('') + body.append('VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice, uint32_t *pCount, VkLayerProperties* pProperties)') + body.append('{') + body.append(' return util_GetLayerProperties(1, &globalLayerProps, pCount, pProperties);') + body.append('}') + body.append('') + body.append('VKAPI_ATTR VkResult VKAPI_CALL EnumerateInstanceExtensionProperties(const char *pLayerName, uint32_t *pCount, VkExtensionProperties* pProperties)') + body.append('{') + body.append(' if (pLayerName && !strcmp(pLayerName, globalLayerProps.layerName))') + if self.layer_name == 'object_tracker': + body.append(' return util_GetExtensionProperties(1, instance_extensions, pCount, pProperties);') + else: + body.append(' return util_GetExtensionProperties(0, NULL, pCount, pProperties);') + body.append('') + body.append(' return VK_ERROR_LAYER_NOT_PRESENT;') + body.append('}') + body.append('') + body.append('VKAPI_ATTR VkResult VKAPI_CALL EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice,') + body.append(' const char *pLayerName, uint32_t *pCount,') + body.append(' VkExtensionProperties *pProperties)') + body.append('{') + body.append(' if (pLayerName && !strcmp(pLayerName, globalLayerProps.layerName))') + body.append(' return util_GetExtensionProperties(0, nullptr, pCount, pProperties);') + body.append('') + body.append(' assert(physicalDevice);') + body.append(' VkLayerInstanceDispatchTable* pTable = get_dispatch_table(%s_instance_table_map, physicalDevice);' % self.layer_name) + body.append(' return pTable->EnumerateDeviceExtensionProperties(physicalDevice, NULL, pCount, pProperties);') + body.append('}') + + return "\n".join(body) + def _generate_layer_gpa_function(self, extensions=[], instance_extensions=[]): func_body = [] # @@ -1358,6 +1388,7 @@ class ObjectTrackerSubcommand(Subcommand): self.generate_destroy_device(), self._generate_dispatch_entrypoints(), self._generate_extensions(), + self._generate_layer_introspection_function(), self._generate_layer_gpa_function(extensions, instance_extensions), "} // namespace %s" % self.layer_name, @@ -1662,6 +1693,7 @@ class UniqueObjectsSubcommand(Subcommand): body = ["namespace %s {" % self.layer_name, self._generate_dispatch_entrypoints(), + self._generate_layer_introspection_function(), self._generate_layer_gpa_function(extensions, instance_extensions), "} // namespace %s" % self.layer_name, -- cgit v1.2.3 From 03918739683bd7c81c2572da6036fcae75d1387c Mon Sep 17 00:00:00 2001 From: iostrows Date: Thu, 2 Jun 2016 15:56:26 +0200 Subject: layers: GH611 Fix dynamic offset indexing --- layers/descriptor_sets.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index e1602251..0530f40c 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -341,13 +341,13 @@ bool cvdescriptorset::DescriptorSet::IsCompatible(const DescriptorSetLayout *lay // Return true if state is acceptable, or false and write an error message into error string bool cvdescriptorset::DescriptorSet::ValidateDrawState(const std::unordered_set &bindings, const std::vector &dynamic_offsets, std::string *error) const { + auto dyn_offset_index = 0; for (auto binding : bindings) { auto start_idx = p_layout_->GetGlobalStartIndexFromBinding(binding); if (descriptors_[start_idx]->IsImmutableSampler()) { // Nothing to do for strictly immutable sampler } else { auto end_idx = p_layout_->GetGlobalEndIndexFromBinding(binding); - auto dyn_offset_index = 0; for (uint32_t i = start_idx; i <= end_idx; ++i) { if (!descriptors_[i]->updated) { std::stringstream error_str; -- cgit v1.2.3 From 3fe78667aeae10ab4fe5cb881d0f67a80200753b Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 26 May 2016 11:20:13 -0600 Subject: layers: Migrate DESCRIPTOR_POOL_NODE to type header --- layers/core_validation.h | 36 ------------------------------------ layers/core_validation_types.h | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/layers/core_validation.h b/layers/core_validation.h index d6857344..00420e48 100644 --- a/layers/core_validation.h +++ b/layers/core_validation.h @@ -265,42 +265,6 @@ class FRAMEBUFFER_NODE { std::vector attachments; }; -struct DESCRIPTOR_POOL_NODE { - VkDescriptorPool pool; - uint32_t maxSets; // Max descriptor sets allowed in this pool - uint32_t availableSets; // Available descriptor sets in this pool - - VkDescriptorPoolCreateInfo createInfo; - std::unordered_set sets; // Collection of all sets in this pool - std::vector maxDescriptorTypeCount; // Max # of descriptors of each type in this pool - std::vector availableDescriptorTypeCount; // Available # of descriptors of each type in this pool - - DESCRIPTOR_POOL_NODE(const VkDescriptorPool pool, const VkDescriptorPoolCreateInfo *pCreateInfo) - : pool(pool), maxSets(pCreateInfo->maxSets), availableSets(pCreateInfo->maxSets), createInfo(*pCreateInfo), - maxDescriptorTypeCount(VK_DESCRIPTOR_TYPE_RANGE_SIZE, 0), availableDescriptorTypeCount(VK_DESCRIPTOR_TYPE_RANGE_SIZE, 0) { - if (createInfo.poolSizeCount) { // Shadow type struct from ptr into local struct - size_t poolSizeCountSize = createInfo.poolSizeCount * sizeof(VkDescriptorPoolSize); - createInfo.pPoolSizes = new VkDescriptorPoolSize[poolSizeCountSize]; - memcpy((void *)createInfo.pPoolSizes, pCreateInfo->pPoolSizes, poolSizeCountSize); - // Now set max counts for each descriptor type based on count of that type times maxSets - uint32_t i = 0; - for (i = 0; i < createInfo.poolSizeCount; ++i) { - uint32_t typeIndex = static_cast(createInfo.pPoolSizes[i].type); - // Same descriptor types can appear several times - maxDescriptorTypeCount[typeIndex] += createInfo.pPoolSizes[i].descriptorCount; - availableDescriptorTypeCount[typeIndex] = maxDescriptorTypeCount[typeIndex]; - } - } else { - createInfo.pPoolSizes = NULL; // Make sure this is NULL so we don't try to clean it up - } - } - ~DESCRIPTOR_POOL_NODE() { - delete[] createInfo.pPoolSizes; - // TODO : pSets are currently freed in deletePools function which uses freeShadowUpdateTree function - // need to migrate that struct to smart ptrs for auto-cleanup - } -}; - typedef struct stencil_data { uint32_t compareMask; uint32_t writeMask; diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index c0394180..0b35fa16 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -62,6 +62,42 @@ class BASE_NODE { std::atomic_int in_use; }; +struct DESCRIPTOR_POOL_NODE { + VkDescriptorPool pool; + uint32_t maxSets; // Max descriptor sets allowed in this pool + uint32_t availableSets; // Available descriptor sets in this pool + + VkDescriptorPoolCreateInfo createInfo; + std::unordered_set sets; // Collection of all sets in this pool + std::vector maxDescriptorTypeCount; // Max # of descriptors of each type in this pool + std::vector availableDescriptorTypeCount; // Available # of descriptors of each type in this pool + + DESCRIPTOR_POOL_NODE(const VkDescriptorPool pool, const VkDescriptorPoolCreateInfo *pCreateInfo) + : pool(pool), maxSets(pCreateInfo->maxSets), availableSets(pCreateInfo->maxSets), createInfo(*pCreateInfo), + maxDescriptorTypeCount(VK_DESCRIPTOR_TYPE_RANGE_SIZE, 0), availableDescriptorTypeCount(VK_DESCRIPTOR_TYPE_RANGE_SIZE, 0) { + if (createInfo.poolSizeCount) { // Shadow type struct from ptr into local struct + size_t poolSizeCountSize = createInfo.poolSizeCount * sizeof(VkDescriptorPoolSize); + createInfo.pPoolSizes = new VkDescriptorPoolSize[poolSizeCountSize]; + memcpy((void *)createInfo.pPoolSizes, pCreateInfo->pPoolSizes, poolSizeCountSize); + // Now set max counts for each descriptor type based on count of that type times maxSets + uint32_t i = 0; + for (i = 0; i < createInfo.poolSizeCount; ++i) { + uint32_t typeIndex = static_cast(createInfo.pPoolSizes[i].type); + // Same descriptor types can appear several times + maxDescriptorTypeCount[typeIndex] += createInfo.pPoolSizes[i].descriptorCount; + availableDescriptorTypeCount[typeIndex] = maxDescriptorTypeCount[typeIndex]; + } + } else { + createInfo.pPoolSizes = NULL; // Make sure this is NULL so we don't try to clean it up + } + } + ~DESCRIPTOR_POOL_NODE() { + delete[] createInfo.pPoolSizes; + // TODO : pSets are currently freed in deletePools function which uses freeShadowUpdateTree function + // need to migrate that struct to smart ptrs for auto-cleanup + } +}; + class BUFFER_NODE : public BASE_NODE { public: using BASE_NODE::in_use; -- cgit v1.2.3 From 2fc91e01eeb0cec1b03332570c5eebe0d380a305 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 26 May 2016 11:21:59 -0600 Subject: layers: Add DescriptorSet interface for allocation Create a top-level "Validate" and "Perform" interface for the vkAllocateDescriptorSets() function in DescriptorSet class. Refactor AllocateDescriptorSets() in core_validation to use the new interface. All checks are now performed in a "Pre" function and all state updates are recorded in a "Post" function. --- layers/core_validation.cpp | 106 +++++++-------------------------------------- layers/descriptor_sets.cpp | 93 +++++++++++++++++++++++++++++++++++++++ layers/descriptor_sets.h | 21 +++++++-- 3 files changed, 127 insertions(+), 93 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index cf44ce68..e7201a7d 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -5869,110 +5869,36 @@ ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescript // Ensure the pool contains enough descriptors and descriptor sets to satisfy // an allocation request. Fills requiredDescriptorsByType with the total number // of descriptors of each type required, for later update. -static bool PreCallValidateAllocateDescriptorSets(const layer_data *dev_data, const DESCRIPTOR_POOL_NODE *pPoolNode, uint32_t count, - std::vector const &layout_nodes, - uint32_t requiredDescriptorsByType[]) { - bool skipCall = false; - - // Track number of descriptorSets allowable in this pool - if (pPoolNode->availableSets < count) { - skipCall |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, - reinterpret_cast(pPoolNode->pool), __LINE__, DRAWSTATE_DESCRIPTOR_POOL_EMPTY, "DS", - "Unable to allocate %u descriptorSets from pool 0x%" PRIxLEAST64 - ". This pool only has %d descriptorSets remaining.", - count, reinterpret_cast(pPoolNode->pool), pPoolNode->availableSets); - } - - // Count total descriptors required per type - for (auto layout_node : layout_nodes) { - if (layout_node) { - for (uint32_t j = 0; j < layout_node->GetBindingCount(); ++j) { - const auto &binding_layout = layout_node->GetDescriptorSetLayoutBindingPtrFromIndex(j); - uint32_t typeIndex = static_cast(binding_layout->descriptorType); - requiredDescriptorsByType[typeIndex] += binding_layout->descriptorCount; - } - } - } - - // Determine whether descriptor counts are satisfiable - for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; i++) { - if (requiredDescriptorsByType[i] > pPoolNode->availableDescriptorTypeCount[i]) { - skipCall |= log_msg( - dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, - reinterpret_cast(pPoolNode->pool), __LINE__, DRAWSTATE_DESCRIPTOR_POOL_EMPTY, "DS", - "Unable to allocate %u descriptors of type %s from pool 0x%" PRIxLEAST64 - ". This pool only has %d descriptors of this type remaining.", - requiredDescriptorsByType[i], string_VkDescriptorType(VkDescriptorType(i)), (uint64_t)pPoolNode->pool, - pPoolNode->availableDescriptorTypeCount[i]); - } - } - - return skipCall; +static bool PreCallValidateAllocateDescriptorSets(layer_data *dev_data, const VkDescriptorSetAllocateInfo *pAllocateInfo) { + // All state checks for AllocateDescriptorSets is done in single function + return cvdescriptorset::ValidateAllocateDescriptorSets(dev_data->report_data, pAllocateInfo, dev_data->descriptorSetLayoutMap, + dev_data->descriptorPoolMap); +} +// Allocation state was good and call down chain was made so update state based on allocating descriptor sets +static void PostCallRecordAllocateDescriptorSets(layer_data *dev_data, const VkDescriptorSetAllocateInfo *pAllocateInfo, + VkDescriptorSet *pDescriptorSets) { + // All the updates are contained in a single cvdescriptorset function + cvdescriptorset::PerformAllocateDescriptorSets( + pAllocateInfo, pDescriptorSets, &dev_data->descriptorPoolMap, &dev_data->setMap, dev_data->descriptorSetLayoutMap, + dev_data->bufferMap, dev_data->memObjMap, dev_data->bufferViewMap, dev_data->samplerMap, dev_data->imageViewMap, + dev_data->imageMap, dev_data->device_extensions.imageToSwapchainMap, dev_data->device_extensions.swapchainMap); } VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo, VkDescriptorSet *pDescriptorSets) { - bool skipCall = false; layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); - - uint32_t requiredDescriptorsByType[VK_DESCRIPTOR_TYPE_RANGE_SIZE] {}; - std::vector layout_nodes(pAllocateInfo->descriptorSetCount, nullptr); - std::unique_lock lock(global_lock); - - for (uint32_t i = 0; i < pAllocateInfo->descriptorSetCount; i++) { - layout_nodes[i] = getDescriptorSetLayout(dev_data, pAllocateInfo->pSetLayouts[i]); - if (!layout_nodes[i]) { - skipCall |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, - (uint64_t)pAllocateInfo->pSetLayouts[i], __LINE__, DRAWSTATE_INVALID_LAYOUT, "DS", - "Unable to find set layout node for layout 0x%" PRIxLEAST64 " specified in vkAllocateDescriptorSets() call", - (uint64_t)pAllocateInfo->pSetLayouts[i]); - } - } - - DESCRIPTOR_POOL_NODE *pPoolNode = getPoolNode(dev_data, pAllocateInfo->descriptorPool); - - if (!pPoolNode) { - skipCall |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, - (uint64_t)pAllocateInfo->descriptorPool, __LINE__, DRAWSTATE_INVALID_POOL, "DS", - "Unable to find pool node for pool 0x%" PRIxLEAST64 " specified in vkAllocateDescriptorSets() call", - (uint64_t)pAllocateInfo->descriptorPool); - } else { // Make sure pool has all the available descriptors before calling down chain - skipCall |= PreCallValidateAllocateDescriptorSets(dev_data, pPoolNode, pAllocateInfo->descriptorSetCount, - layout_nodes, requiredDescriptorsByType); - } + bool skip_call = PreCallValidateAllocateDescriptorSets(dev_data, pAllocateInfo); lock.unlock(); - if (skipCall) + if (skip_call) return VK_ERROR_VALIDATION_FAILED_EXT; VkResult result = dev_data->device_dispatch_table->AllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets); if (VK_SUCCESS == result) { lock.lock(); - if (pPoolNode) { - /* Account for sets and descriptors allocated */ - pPoolNode->availableSets -= pAllocateInfo->descriptorSetCount; - for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; i++) { - pPoolNode->availableDescriptorTypeCount[i] -= requiredDescriptorsByType[i]; - } - - /* Create tracking object for each descriptor set; insert into - * global map and the pool's set. - */ - for (uint32_t i = 0; i < pAllocateInfo->descriptorSetCount; i++) { - if (layout_nodes[i]) { - auto pNewNode = new cvdescriptorset::DescriptorSet( - pDescriptorSets[i], layout_nodes[i], &dev_data->bufferMap, &dev_data->memObjMap, &dev_data->bufferViewMap, - &dev_data->samplerMap, &dev_data->imageViewMap, &dev_data->imageMap, - &dev_data->device_extensions.imageToSwapchainMap, &dev_data->device_extensions.swapchainMap); - - pPoolNode->sets.insert(pNewNode); - pNewNode->in_use.store(0); - dev_data->setMap[pDescriptorSets[i]] = pNewNode; - } - } - } + PostCallRecordAllocateDescriptorSets(dev_data, pAllocateInfo, pDescriptorSets); lock.unlock(); } return result; diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index 0530f40c..ede1b5a3 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -1222,3 +1222,96 @@ bool cvdescriptorset::DescriptorSet::VerifyCopyUpdateContents(const VkCopyDescri // All checks passed so update contents are good return true; } +// Verify that the state at allocate time is correct, but don't actually allocate the sets yet +bool cvdescriptorset::ValidateAllocateDescriptorSets( + const debug_report_data *report_data, const VkDescriptorSetAllocateInfo *p_alloc_info, + const std::unordered_map &set_layout_map, + const std::unordered_map &pool_map) { + bool skip_call = false; + uint32_t requiredDescriptorsByType[VK_DESCRIPTOR_TYPE_RANGE_SIZE]{}; + + for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) { + auto layout_it = set_layout_map.find(p_alloc_info->pSetLayouts[i]); + if (layout_it == set_layout_map.end()) { + skip_call |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, + reinterpret_cast(p_alloc_info->pSetLayouts[i]), __LINE__, DRAWSTATE_INVALID_LAYOUT, "DS", + "Unable to find set layout node for layout 0x%" PRIxLEAST64 " specified in vkAllocateDescriptorSets() call", + reinterpret_cast(p_alloc_info->pSetLayouts[i])); + } + // Count total descriptors required per type + for (uint32_t j = 0; j < layout_it->second->GetBindingCount(); ++j) { + const auto &binding_layout = layout_it->second->GetDescriptorSetLayoutBindingPtrFromIndex(j); + uint32_t typeIndex = static_cast(binding_layout->descriptorType); + requiredDescriptorsByType[typeIndex] += binding_layout->descriptorCount; + } + } + auto pool_it = pool_map.find(p_alloc_info->descriptorPool); + if (pool_it == pool_map.end()) { + skip_call |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, + reinterpret_cast(p_alloc_info->descriptorPool), __LINE__, DRAWSTATE_INVALID_POOL, "DS", + "Unable to find pool node for pool 0x%" PRIxLEAST64 " specified in vkAllocateDescriptorSets() call", + reinterpret_cast(p_alloc_info->descriptorPool)); + } else { // Make sure pool has all the available descriptors before calling down chain + // Track number of descriptorSets allowable in this pool + if (pool_it->second->availableSets < p_alloc_info->descriptorSetCount) { + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, + reinterpret_cast(pool_it->second->pool), __LINE__, DRAWSTATE_DESCRIPTOR_POOL_EMPTY, + "DS", "Unable to allocate %u descriptorSets from pool 0x%" PRIxLEAST64 + ". This pool only has %d descriptorSets remaining.", + p_alloc_info->descriptorSetCount, reinterpret_cast(pool_it->second->pool), + pool_it->second->availableSets); + } + // Determine whether descriptor counts are satisfiable + for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; i++) { + if (requiredDescriptorsByType[i] > pool_it->second->availableDescriptorTypeCount[i]) { + skip_call |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, + reinterpret_cast(pool_it->second->pool), __LINE__, DRAWSTATE_DESCRIPTOR_POOL_EMPTY, + "DS", "Unable to allocate %u descriptors of type %s from pool 0x%" PRIxLEAST64 + ". This pool only has %d descriptors of this type remaining.", + requiredDescriptorsByType[i], string_VkDescriptorType(VkDescriptorType(i)), + reinterpret_cast(pool_it->second->pool), pool_it->second->availableDescriptorTypeCount[i]); + } + } + } + return skip_call; +} +// Decrement allocated sets from the pool and insert new sets into set_map +void cvdescriptorset::PerformAllocateDescriptorSets( + const VkDescriptorSetAllocateInfo *p_alloc_info, const VkDescriptorSet *descriptor_sets, + std::unordered_map *pool_map, + std::unordered_map *set_map, + const std::unordered_map &layout_map, + const std::unordered_map &buffer_map, + const std::unordered_map &mem_obj_map, + const std::unordered_map &buffer_view_map, + const std::unordered_map> &sampler_map, + const std::unordered_map &image_view_map, + const std::unordered_map &image_map, + const std::unordered_map &image_to_swapchain_map, + const std::unordered_map &swapchain_map) { + auto pool_state = (*pool_map)[p_alloc_info->descriptorPool]; + /* Account for sets allocated from pool */ + pool_state->availableSets -= p_alloc_info->descriptorSetCount; + /* Create tracking object for each descriptor set; insert into + * global map and the pool's set. + */ + for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) { + auto layout_state = layout_map.find(p_alloc_info->pSetLayouts[i])->second; + // Account for individual descriptors allocated from pool + for (uint32_t j = 0; j < layout_state->GetBindingCount(); ++j) { + const auto &binding_layout = layout_state->GetDescriptorSetLayoutBindingPtrFromIndex(j); + uint32_t type_index = static_cast(binding_layout->descriptorType); + pool_state->availableDescriptorTypeCount[type_index] -= binding_layout->descriptorCount; + } + auto new_ds = + new cvdescriptorset::DescriptorSet(descriptor_sets[i], layout_state, &buffer_map, &mem_obj_map, &buffer_view_map, + &sampler_map, &image_view_map, &image_map, &image_to_swapchain_map, &swapchain_map); + + pool_state->sets.insert(new_ds); + new_ds->in_use.store(0); + (*set_map)[descriptor_sets[i]] = new_ds; + } +} diff --git a/layers/descriptor_sets.h b/layers/descriptor_sets.h index b0496b1e..af062dd7 100644 --- a/layers/descriptor_sets.h +++ b/layers/descriptor_sets.h @@ -245,14 +245,29 @@ class BufferDescriptor : public Descriptor { VkDeviceSize offset_; VkDeviceSize range_; }; -// Helper functions for Updating descriptor sets since it crosses multiple sets -// Validate will make sure an update is ok without actually performing it +// Helper functions for descriptor set functions that cross multiple sets +// "Validate" will make sure an update is ok without actually performing it bool ValidateUpdateDescriptorSets(const debug_report_data *, const std::unordered_map &, uint32_t, const VkWriteDescriptorSet *, uint32_t, const VkCopyDescriptorSet *); -// Perform does the update with the assumption that ValidateUpdateDescriptorSets() has passed for the given update +// "Perform" does the update with the assumption that ValidateUpdateDescriptorSets() has passed for the given update void PerformUpdateDescriptorSets(const std::unordered_map &, uint32_t, const VkWriteDescriptorSet *, uint32_t, const VkCopyDescriptorSet *); +// Validate that Allocation state is ok +bool ValidateAllocateDescriptorSets(const debug_report_data *, const VkDescriptorSetAllocateInfo *, + const std::unordered_map &, + const std::unordered_map &); +// Update state based on allocating new descriptorsets +void PerformAllocateDescriptorSets( + const VkDescriptorSetAllocateInfo *, const VkDescriptorSet *, std::unordered_map *, + std::unordered_map *, + const std::unordered_map &, + const std::unordered_map &, const std::unordered_map &, + const std::unordered_map &, + const std::unordered_map> &, + const std::unordered_map &, const std::unordered_map &, + const std::unordered_map &, const std::unordered_map &); + /* * DescriptorSet class * -- cgit v1.2.3 From 2f68b290d22d933fda156e0101bb2ebf2f493c04 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Wed, 1 Jun 2016 11:33:50 -0600 Subject: layers: Pass common data between pre/post AllocDescriptorSets With the break between PreValidate* and PostRecord* calls in the layers we can suffer having to do some repeat work in the Post step. In order to prevent this, this CL slightly modifies the interface to pass common data between the pre/post calls in a custom AllocateDescriptorSetsData struct. I initially attempted to fill this data in a separate function that would preceed the PreValidate* call, but such a function would need to include some validation as it includes map checks which may fail. The simplest solution, then, seems to be passing a ptr to the common data to the PreValidate* function who then fills the data. If the validation and call down the chain succeed, the PostRecord* function then takes a ptr to the common data to prevent having to redo the work that was done at validation time. --- layers/core_validation.cpp | 20 ++++++++++++-------- layers/descriptor_sets.cpp | 44 ++++++++++++++++++++++---------------------- layers/descriptor_sets.h | 30 ++++++++++++++++++++---------- 3 files changed, 54 insertions(+), 40 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index e7201a7d..21d3b077 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -5869,26 +5869,30 @@ ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescript // Ensure the pool contains enough descriptors and descriptor sets to satisfy // an allocation request. Fills requiredDescriptorsByType with the total number // of descriptors of each type required, for later update. -static bool PreCallValidateAllocateDescriptorSets(layer_data *dev_data, const VkDescriptorSetAllocateInfo *pAllocateInfo) { +static bool PreCallValidateAllocateDescriptorSets(layer_data *dev_data, const VkDescriptorSetAllocateInfo *pAllocateInfo, + cvdescriptorset::AllocateDescriptorSetsData *common_data) { // All state checks for AllocateDescriptorSets is done in single function return cvdescriptorset::ValidateAllocateDescriptorSets(dev_data->report_data, pAllocateInfo, dev_data->descriptorSetLayoutMap, - dev_data->descriptorPoolMap); + dev_data->descriptorPoolMap, common_data); } // Allocation state was good and call down chain was made so update state based on allocating descriptor sets static void PostCallRecordAllocateDescriptorSets(layer_data *dev_data, const VkDescriptorSetAllocateInfo *pAllocateInfo, - VkDescriptorSet *pDescriptorSets) { + VkDescriptorSet *pDescriptorSets, + const cvdescriptorset::AllocateDescriptorSetsData *common_data) { // All the updates are contained in a single cvdescriptorset function cvdescriptorset::PerformAllocateDescriptorSets( - pAllocateInfo, pDescriptorSets, &dev_data->descriptorPoolMap, &dev_data->setMap, dev_data->descriptorSetLayoutMap, - dev_data->bufferMap, dev_data->memObjMap, dev_data->bufferViewMap, dev_data->samplerMap, dev_data->imageViewMap, - dev_data->imageMap, dev_data->device_extensions.imageToSwapchainMap, dev_data->device_extensions.swapchainMap); + pAllocateInfo, pDescriptorSets, common_data, &dev_data->descriptorPoolMap, &dev_data->setMap, + dev_data->descriptorSetLayoutMap, dev_data->bufferMap, dev_data->memObjMap, dev_data->bufferViewMap, dev_data->samplerMap, + dev_data->imageViewMap, dev_data->imageMap, dev_data->device_extensions.imageToSwapchainMap, + dev_data->device_extensions.swapchainMap); } VKAPI_ATTR VkResult VKAPI_CALL AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllocateInfo, VkDescriptorSet *pDescriptorSets) { layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); std::unique_lock lock(global_lock); - bool skip_call = PreCallValidateAllocateDescriptorSets(dev_data, pAllocateInfo); + cvdescriptorset::AllocateDescriptorSetsData common_data(pAllocateInfo->descriptorSetCount); + bool skip_call = PreCallValidateAllocateDescriptorSets(dev_data, pAllocateInfo, &common_data); lock.unlock(); if (skip_call) @@ -5898,7 +5902,7 @@ AllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo *pAllo if (VK_SUCCESS == result) { lock.lock(); - PostCallRecordAllocateDescriptorSets(dev_data, pAllocateInfo, pDescriptorSets); + PostCallRecordAllocateDescriptorSets(dev_data, pAllocateInfo, pDescriptorSets, &common_data); lock.unlock(); } return result; diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index ede1b5a3..5cb38e56 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -260,6 +260,9 @@ bool cvdescriptorset::DescriptorSetLayout::VerifyUpdateConsistency(uint32_t curr return true; } +cvdescriptorset::AllocateDescriptorSetsData::AllocateDescriptorSetsData(uint32_t count) + : required_descriptors_by_type{}, layout_nodes(count, nullptr) {} + cvdescriptorset::DescriptorSet::DescriptorSet(const VkDescriptorSet set, const DescriptorSetLayout *layout, const std::unordered_map *buffer_map, const std::unordered_map *memory_map, @@ -1226,9 +1229,8 @@ bool cvdescriptorset::DescriptorSet::VerifyCopyUpdateContents(const VkCopyDescri bool cvdescriptorset::ValidateAllocateDescriptorSets( const debug_report_data *report_data, const VkDescriptorSetAllocateInfo *p_alloc_info, const std::unordered_map &set_layout_map, - const std::unordered_map &pool_map) { + const std::unordered_map &pool_map, AllocateDescriptorSetsData *ds_data) { bool skip_call = false; - uint32_t requiredDescriptorsByType[VK_DESCRIPTOR_TYPE_RANGE_SIZE]{}; for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) { auto layout_it = set_layout_map.find(p_alloc_info->pSetLayouts[i]); @@ -1238,12 +1240,14 @@ bool cvdescriptorset::ValidateAllocateDescriptorSets( reinterpret_cast(p_alloc_info->pSetLayouts[i]), __LINE__, DRAWSTATE_INVALID_LAYOUT, "DS", "Unable to find set layout node for layout 0x%" PRIxLEAST64 " specified in vkAllocateDescriptorSets() call", reinterpret_cast(p_alloc_info->pSetLayouts[i])); - } - // Count total descriptors required per type - for (uint32_t j = 0; j < layout_it->second->GetBindingCount(); ++j) { - const auto &binding_layout = layout_it->second->GetDescriptorSetLayoutBindingPtrFromIndex(j); - uint32_t typeIndex = static_cast(binding_layout->descriptorType); - requiredDescriptorsByType[typeIndex] += binding_layout->descriptorCount; + } else { + ds_data->layout_nodes[i] = layout_it->second; + // Count total descriptors required per type + for (uint32_t j = 0; j < layout_it->second->GetBindingCount(); ++j) { + const auto &binding_layout = layout_it->second->GetDescriptorSetLayoutBindingPtrFromIndex(j); + uint32_t typeIndex = static_cast(binding_layout->descriptorType); + ds_data->required_descriptors_by_type[typeIndex] += binding_layout->descriptorCount; + } } } auto pool_it = pool_map.find(p_alloc_info->descriptorPool); @@ -1265,13 +1269,13 @@ bool cvdescriptorset::ValidateAllocateDescriptorSets( } // Determine whether descriptor counts are satisfiable for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; i++) { - if (requiredDescriptorsByType[i] > pool_it->second->availableDescriptorTypeCount[i]) { + if (ds_data->required_descriptors_by_type[i] > pool_it->second->availableDescriptorTypeCount[i]) { skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, reinterpret_cast(pool_it->second->pool), __LINE__, DRAWSTATE_DESCRIPTOR_POOL_EMPTY, "DS", "Unable to allocate %u descriptors of type %s from pool 0x%" PRIxLEAST64 ". This pool only has %d descriptors of this type remaining.", - requiredDescriptorsByType[i], string_VkDescriptorType(VkDescriptorType(i)), + ds_data->required_descriptors_by_type[i], string_VkDescriptorType(VkDescriptorType(i)), reinterpret_cast(pool_it->second->pool), pool_it->second->availableDescriptorTypeCount[i]); } } @@ -1281,7 +1285,7 @@ bool cvdescriptorset::ValidateAllocateDescriptorSets( // Decrement allocated sets from the pool and insert new sets into set_map void cvdescriptorset::PerformAllocateDescriptorSets( const VkDescriptorSetAllocateInfo *p_alloc_info, const VkDescriptorSet *descriptor_sets, - std::unordered_map *pool_map, + const AllocateDescriptorSetsData *ds_data, std::unordered_map *pool_map, std::unordered_map *set_map, const std::unordered_map &layout_map, const std::unordered_map &buffer_map, @@ -1293,22 +1297,18 @@ void cvdescriptorset::PerformAllocateDescriptorSets( const std::unordered_map &image_to_swapchain_map, const std::unordered_map &swapchain_map) { auto pool_state = (*pool_map)[p_alloc_info->descriptorPool]; - /* Account for sets allocated from pool */ + /* Account for sets and individual descriptors allocated from pool */ pool_state->availableSets -= p_alloc_info->descriptorSetCount; + for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; i++) { + pool_state->availableDescriptorTypeCount[i] -= ds_data->required_descriptors_by_type[i]; + } /* Create tracking object for each descriptor set; insert into * global map and the pool's set. */ for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) { - auto layout_state = layout_map.find(p_alloc_info->pSetLayouts[i])->second; - // Account for individual descriptors allocated from pool - for (uint32_t j = 0; j < layout_state->GetBindingCount(); ++j) { - const auto &binding_layout = layout_state->GetDescriptorSetLayoutBindingPtrFromIndex(j); - uint32_t type_index = static_cast(binding_layout->descriptorType); - pool_state->availableDescriptorTypeCount[type_index] -= binding_layout->descriptorCount; - } - auto new_ds = - new cvdescriptorset::DescriptorSet(descriptor_sets[i], layout_state, &buffer_map, &mem_obj_map, &buffer_view_map, - &sampler_map, &image_view_map, &image_map, &image_to_swapchain_map, &swapchain_map); + auto new_ds = new cvdescriptorset::DescriptorSet(descriptor_sets[i], ds_data->layout_nodes[i], &buffer_map, &mem_obj_map, + &buffer_view_map, &sampler_map, &image_view_map, &image_map, + &image_to_swapchain_map, &swapchain_map); pool_state->sets.insert(new_ds); new_ds->in_use.store(0); diff --git a/layers/descriptor_sets.h b/layers/descriptor_sets.h index af062dd7..bb5907ca 100644 --- a/layers/descriptor_sets.h +++ b/layers/descriptor_sets.h @@ -245,6 +245,12 @@ class BufferDescriptor : public Descriptor { VkDeviceSize offset_; VkDeviceSize range_; }; +// Structs to contain common elements that need to be shared between Validate* and Perform* calls below +struct AllocateDescriptorSetsData { + uint32_t required_descriptors_by_type[VK_DESCRIPTOR_TYPE_RANGE_SIZE]; + std::vector layout_nodes; + AllocateDescriptorSetsData(uint32_t); +}; // Helper functions for descriptor set functions that cross multiple sets // "Validate" will make sure an update is ok without actually performing it bool ValidateUpdateDescriptorSets(const debug_report_data *, @@ -256,17 +262,21 @@ void PerformUpdateDescriptorSets(const std::unordered_map &, - const std::unordered_map &); + const std::unordered_map &, + AllocateDescriptorSetsData *); // Update state based on allocating new descriptorsets -void PerformAllocateDescriptorSets( - const VkDescriptorSetAllocateInfo *, const VkDescriptorSet *, std::unordered_map *, - std::unordered_map *, - const std::unordered_map &, - const std::unordered_map &, const std::unordered_map &, - const std::unordered_map &, - const std::unordered_map> &, - const std::unordered_map &, const std::unordered_map &, - const std::unordered_map &, const std::unordered_map &); +void PerformAllocateDescriptorSets(const VkDescriptorSetAllocateInfo *, const VkDescriptorSet *, const AllocateDescriptorSetsData *, + std::unordered_map *, + std::unordered_map *, + const std::unordered_map &, + const std::unordered_map &, + const std::unordered_map &, + const std::unordered_map &, + const std::unordered_map> &, + const std::unordered_map &, + const std::unordered_map &, + const std::unordered_map &, + const std::unordered_map &); /* * DescriptorSet class -- cgit v1.2.3 From caefb8d8551f5a32cb850c939a4c4505cd83a1c4 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Wed, 1 Jun 2016 11:56:42 -0600 Subject: layers: Comment update The behavior of the PreCallValidateAllocateDescriptorSets slightly changed so updating comment accordingly. --- layers/core_validation.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 21d3b077..635f6c4b 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -5865,10 +5865,9 @@ ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescript } return result; } - // Ensure the pool contains enough descriptors and descriptor sets to satisfy -// an allocation request. Fills requiredDescriptorsByType with the total number -// of descriptors of each type required, for later update. +// an allocation request. Fills common_data with the total number of descriptors of each type required, +// as well as DescriptorSetLayout ptrs used for later update. static bool PreCallValidateAllocateDescriptorSets(layer_data *dev_data, const VkDescriptorSetAllocateInfo *pAllocateInfo, cvdescriptorset::AllocateDescriptorSetsData *common_data) { // All state checks for AllocateDescriptorSets is done in single function -- cgit v1.2.3 From 9507300766059bc17bff83b388aca6bd286a3c46 Mon Sep 17 00:00:00 2001 From: Dustin Graves Date: Tue, 31 May 2016 16:32:29 -0600 Subject: cmake: Fix MSVCRT override Fix the CMake code that overrides the /MD flag with the /MT flag for the Windows demo and loader projects. The CMake debug and release variables were set to /MTd and /MT, overriding all existing debug and release settings. Now replacing /MD with /MT in the debug and release variables, without losing other debug/release settings. Also performing the MD/MT substitution for all release and debug configurations. Change-Id: Id4a57c38bde0d909a95e7a49d9867029829e2c61 --- demos/CMakeLists.txt | 9 +++++++-- loader/CMakeLists.txt | 10 ++++++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/demos/CMakeLists.txt b/demos/CMakeLists.txt index 7d8681a0..652efb75 100644 --- a/demos/CMakeLists.txt +++ b/demos/CMakeLists.txt @@ -28,8 +28,13 @@ if(WIN32) set (BUILDTGT_DIR build32) endif() - set(CMAKE_C_FLAGS_DEBUG "-MTd") - set(CMAKE_C_FLAGS_RELEASE "-MT") + # Use static MSVCRT libraries + foreach(configuration in CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_RELWITHDEBINFO + CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_RELWITHDEBINFO) + if(${configuration} MATCHES "/MD") + string(REGEX REPLACE "/MD" "/MT" ${configuration} "${${configuration}}") + endif() + endforeach() add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/demos/tri-vert.spv COMMAND ${GLSLANG_VALIDATOR} -s -V ${PROJECT_SOURCE_DIR}/demos/tri.vert diff --git a/loader/CMakeLists.txt b/loader/CMakeLists.txt index 2c3b2455..f47ee589 100644 --- a/loader/CMakeLists.txt +++ b/loader/CMakeLists.txt @@ -37,8 +37,14 @@ set (OPT_LOADER_SRCS set (LOADER_SRCS ${NORMAL_LOADER_SRCS} ${OPT_LOADER_SRCS}) if (WIN32) - set(CMAKE_C_FLAGS_DEBUG "-MTd") - set(CMAKE_C_FLAGS_RELEASE "-MT") + # Use static MSVCRT libraries + foreach(configuration in CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_RELWITHDEBINFO + CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_RELWITHDEBINFO) + if(${configuration} MATCHES "/MD") + string(REGEX REPLACE "/MD" "/MT" ${configuration} "${${configuration}}") + endif() + endforeach() + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CRT_SECURE_NO_WARNINGS") # Build dev_ext_trampoline.c with -O2 to allow tail-call optimization. # Build other C files with normal options -- cgit v1.2.3 From 974f7b081f055a05714ebc5a24d6465cba03f161 Mon Sep 17 00:00:00 2001 From: Karl Schultz Date: Thu, 2 Jun 2016 16:48:30 -0600 Subject: Update BUILD.md Remove statement indicating that the Linux SDK installs the loader and layers to system libraries; it no longer does this. --- BUILD.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/BUILD.md b/BUILD.md index d85f5117..b21aa82b 100644 --- a/BUILD.md +++ b/BUILD.md @@ -52,9 +52,6 @@ If you want to use the loader and layers that you have just built: export LD_LIBRARY_PATH=/dbuild/loader export VK_LAYER_PATH=/dbuild/layers ``` -Note that if you have installed the [LunarG Vulkan SDK](https://vulkan.lunarg.com), -you will also have the SDK version of the loader and layers installed in your default system libraries. - You can run the `vulkaninfo` application to see which driver, loader and layers are being used. The `LoaderAndLayerInterface` document in the `loader` folder in this repository is a specification that -- cgit v1.2.3 From ffaf95b453b9bd058f26bf0276f4010caaeabcf1 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Wed, 1 Jun 2016 16:41:17 -0600 Subject: layers: Make layer_data visible to DescriptorSet This is the start of migrating core_validation::layer_data to be visible in DescriptorSet class. DescriptorSet class can't see the contents of layer_data, so it also needs the get() helper functions to look up items from the maps. This first change only brings along getSetNode() utility function so only set_map references can be removed. Will add follow-on CLs to remove more maps from DescriptorSet class and bring in more utility functions. --- layers/core_validation.cpp | 15 +++++++------- layers/core_validation_types.h | 5 +++++ layers/descriptor_sets.cpp | 45 +++++++++++++++++++++--------------------- layers/descriptor_sets.h | 29 ++++++++++++--------------- 4 files changed, 49 insertions(+), 45 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 635f6c4b..66d3abd2 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -2625,11 +2625,12 @@ static bool validate_compute_pipeline(debug_report_data *report_data, PIPELINE_N } // Return Set node ptr for specified set or else NULL -static cvdescriptorset::DescriptorSet *getSetNode(layer_data *my_data, const VkDescriptorSet set) { - if (my_data->setMap.find(set) == my_data->setMap.end()) { +cvdescriptorset::DescriptorSet *getSetNode(const layer_data *my_data, const VkDescriptorSet set) { + auto set_it = my_data->setMap.find(set); + if (set_it == my_data->setMap.end()) { return NULL; } - return my_data->setMap[set]; + return set_it->second; } // For the given command buffer, verify and update the state for activeSetBindingsPairs // This includes: @@ -5880,7 +5881,7 @@ static void PostCallRecordAllocateDescriptorSets(layer_data *dev_data, const VkD const cvdescriptorset::AllocateDescriptorSetsData *common_data) { // All the updates are contained in a single cvdescriptorset function cvdescriptorset::PerformAllocateDescriptorSets( - pAllocateInfo, pDescriptorSets, common_data, &dev_data->descriptorPoolMap, &dev_data->setMap, + pAllocateInfo, pDescriptorSets, common_data, &dev_data->descriptorPoolMap, &dev_data->setMap, dev_data, dev_data->descriptorSetLayoutMap, dev_data->bufferMap, dev_data->memObjMap, dev_data->bufferViewMap, dev_data->samplerMap, dev_data->imageViewMap, dev_data->imageMap, dev_data->device_extensions.imageToSwapchainMap, dev_data->device_extensions.swapchainMap); @@ -5976,14 +5977,14 @@ static bool PreCallValidateUpdateDescriptorSets(layer_data *dev_data, uint32_t d // Now make call(s) that validate state, but don't perform state updates in this function // Note, here DescriptorSets is unique in that we don't yet have an instance. Using a helper function in the // namespace which will parse params and make calls into specific class instances - return cvdescriptorset::ValidateUpdateDescriptorSets(dev_data->report_data, dev_data->setMap, descriptorWriteCount, - pDescriptorWrites, descriptorCopyCount, pDescriptorCopies); + return cvdescriptorset::ValidateUpdateDescriptorSets(dev_data->report_data, dev_data, descriptorWriteCount, pDescriptorWrites, + descriptorCopyCount, pDescriptorCopies); } // PostCallRecord* handles recording state updates following call down chain to UpdateDescriptorSets() static void PostCallRecordUpdateDescriptorSets(layer_data *dev_data, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pDescriptorCopies) { - cvdescriptorset::PerformUpdateDescriptorSets(dev_data->setMap, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, + cvdescriptorset::PerformUpdateDescriptorSets(dev_data, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies); } diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index 0b35fa16..901c1870 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -62,6 +62,11 @@ class BASE_NODE { std::atomic_int in_use; }; +namespace core_validation { +struct layer_data; +cvdescriptorset::DescriptorSet *getSetNode(const layer_data *, const VkDescriptorSet); +} + struct DESCRIPTOR_POOL_NODE { VkDescriptorPool pool; uint32_t maxSets; // Max descriptor sets allowed in this pool diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index 5cb38e56..97e21b5a 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -841,15 +841,16 @@ void cvdescriptorset::TexelDescriptor::CopyUpdate(const Descriptor *src) { // If the update hits an issue for which the callback returns "true", meaning that the call down the chain should // be skipped, then true is returned. // If there is no issue with the update, then false is returned. -bool cvdescriptorset::ValidateUpdateDescriptorSets( - const debug_report_data *report_data, const std::unordered_map &set_map, - uint32_t write_count, const VkWriteDescriptorSet *p_wds, uint32_t copy_count, const VkCopyDescriptorSet *p_cds) { +bool cvdescriptorset::ValidateUpdateDescriptorSets(const debug_report_data *report_data, + const core_validation::layer_data *dev_data, uint32_t write_count, + const VkWriteDescriptorSet *p_wds, uint32_t copy_count, + const VkCopyDescriptorSet *p_cds) { bool skip_call = false; // Validate Write updates for (uint32_t i = 0; i < write_count; i++) { auto dest_set = p_wds[i].dstSet; - auto set_pair = set_map.find(dest_set); - if (set_pair == set_map.end()) { + auto set_node = core_validation::getSetNode(dev_data, dest_set); + if (!set_node) { skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, reinterpret_cast(dest_set), __LINE__, DRAWSTATE_INVALID_DESCRIPTOR_SET, "DS", @@ -857,7 +858,7 @@ bool cvdescriptorset::ValidateUpdateDescriptorSets( reinterpret_cast(dest_set)); } else { std::string error_str; - if (!set_pair->second->ValidateWriteUpdate(report_data, &p_wds[i], &error_str)) { + if (!set_node->ValidateWriteUpdate(report_data, &p_wds[i], &error_str)) { skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, reinterpret_cast(dest_set), __LINE__, DRAWSTATE_INVALID_UPDATE_INDEX, "DS", "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x%" PRIx64 @@ -870,15 +871,15 @@ bool cvdescriptorset::ValidateUpdateDescriptorSets( for (uint32_t i = 0; i < copy_count; ++i) { auto dst_set = p_cds[i].dstSet; auto src_set = p_cds[i].srcSet; - auto src_pair = set_map.find(src_set); - auto dst_pair = set_map.find(dst_set); - if (src_pair == set_map.end()) { + auto src_node = core_validation::getSetNode(dev_data, src_set); + auto dst_node = core_validation::getSetNode(dev_data, dst_set); + if (!src_node) { skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, reinterpret_cast(src_set), __LINE__, DRAWSTATE_INVALID_DESCRIPTOR_SET, "DS", "Cannot call vkUpdateDescriptorSets() to copy from descriptor set 0x%" PRIxLEAST64 " that has not been allocated.", reinterpret_cast(src_set)); - } else if (dst_pair == set_map.end()) { + } else if (!dst_node) { skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, reinterpret_cast(dst_set), __LINE__, DRAWSTATE_INVALID_DESCRIPTOR_SET, "DS", "Cannot call vkUpdateDescriptorSets() to copy to descriptor set 0x%" PRIxLEAST64 @@ -886,7 +887,7 @@ bool cvdescriptorset::ValidateUpdateDescriptorSets( reinterpret_cast(dst_set)); } else { std::string error_str; - if (!dst_pair->second->ValidateCopyUpdate(report_data, &p_cds[i], src_pair->second, &error_str)) { + if (!dst_node->ValidateCopyUpdate(report_data, &p_cds[i], src_node, &error_str)) { skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, reinterpret_cast(dst_set), __LINE__, DRAWSTATE_INVALID_UPDATE_INDEX, "DS", @@ -904,26 +905,26 @@ bool cvdescriptorset::ValidateUpdateDescriptorSets( // with the same set of updates. // This is split from the validate code to allow validation prior to calling down the chain, and then update after // calling down the chain. -void cvdescriptorset::PerformUpdateDescriptorSets( - const std::unordered_map &set_map, uint32_t write_count, - const VkWriteDescriptorSet *p_wds, uint32_t copy_count, const VkCopyDescriptorSet *p_cds) { +void cvdescriptorset::PerformUpdateDescriptorSets(const core_validation::layer_data *dev_data, uint32_t write_count, + const VkWriteDescriptorSet *p_wds, uint32_t copy_count, + const VkCopyDescriptorSet *p_cds) { // Write updates first uint32_t i = 0; for (i = 0; i < write_count; ++i) { auto dest_set = p_wds[i].dstSet; - auto set_pair = set_map.find(dest_set); - if (set_pair != set_map.end()) { - set_pair->second->PerformWriteUpdate(&p_wds[i]); + auto set_node = core_validation::getSetNode(dev_data, dest_set); + if (set_node) { + set_node->PerformWriteUpdate(&p_wds[i]); } } // Now copy updates for (i = 0; i < copy_count; ++i) { auto dst_set = p_cds[i].dstSet; auto src_set = p_cds[i].srcSet; - auto src_pair = set_map.find(src_set); - auto dst_pair = set_map.find(dst_set); - if (src_pair != set_map.end() && dst_pair != set_map.end()) { - dst_pair->second->PerformCopyUpdate(&p_cds[i], src_pair->second); + auto src_node = core_validation::getSetNode(dev_data, src_set); + auto dst_node = core_validation::getSetNode(dev_data, dst_set); + if (src_node && dst_node) { + dst_node->PerformCopyUpdate(&p_cds[i], src_node); } } } @@ -1286,7 +1287,7 @@ bool cvdescriptorset::ValidateAllocateDescriptorSets( void cvdescriptorset::PerformAllocateDescriptorSets( const VkDescriptorSetAllocateInfo *p_alloc_info, const VkDescriptorSet *descriptor_sets, const AllocateDescriptorSetsData *ds_data, std::unordered_map *pool_map, - std::unordered_map *set_map, + std::unordered_map *set_map, const core_validation::layer_data *dev_data, const std::unordered_map &layout_map, const std::unordered_map &buffer_map, const std::unordered_map &mem_obj_map, diff --git a/layers/descriptor_sets.h b/layers/descriptor_sets.h index bb5907ca..b11b5f87 100644 --- a/layers/descriptor_sets.h +++ b/layers/descriptor_sets.h @@ -253,30 +253,27 @@ struct AllocateDescriptorSetsData { }; // Helper functions for descriptor set functions that cross multiple sets // "Validate" will make sure an update is ok without actually performing it -bool ValidateUpdateDescriptorSets(const debug_report_data *, - const std::unordered_map &, uint32_t, +bool ValidateUpdateDescriptorSets(const debug_report_data *, const core_validation::layer_data *, uint32_t, const VkWriteDescriptorSet *, uint32_t, const VkCopyDescriptorSet *); // "Perform" does the update with the assumption that ValidateUpdateDescriptorSets() has passed for the given update -void PerformUpdateDescriptorSets(const std::unordered_map &, uint32_t, - const VkWriteDescriptorSet *, uint32_t, const VkCopyDescriptorSet *); +void PerformUpdateDescriptorSets(const core_validation::layer_data *, uint32_t, const VkWriteDescriptorSet *, uint32_t, + const VkCopyDescriptorSet *); // Validate that Allocation state is ok bool ValidateAllocateDescriptorSets(const debug_report_data *, const VkDescriptorSetAllocateInfo *, const std::unordered_map &, const std::unordered_map &, AllocateDescriptorSetsData *); // Update state based on allocating new descriptorsets -void PerformAllocateDescriptorSets(const VkDescriptorSetAllocateInfo *, const VkDescriptorSet *, const AllocateDescriptorSetsData *, - std::unordered_map *, - std::unordered_map *, - const std::unordered_map &, - const std::unordered_map &, - const std::unordered_map &, - const std::unordered_map &, - const std::unordered_map> &, - const std::unordered_map &, - const std::unordered_map &, - const std::unordered_map &, - const std::unordered_map &); +void PerformAllocateDescriptorSets( + const VkDescriptorSetAllocateInfo *, const VkDescriptorSet *, const AllocateDescriptorSetsData *, + std::unordered_map *, + std::unordered_map *, const core_validation::layer_data *, + const std::unordered_map &, + const std::unordered_map &, const std::unordered_map &, + const std::unordered_map &, + const std::unordered_map> &, + const std::unordered_map &, const std::unordered_map &, + const std::unordered_map &, const std::unordered_map &); /* * DescriptorSet class -- cgit v1.2.3 From e320fe3120d3cceff5ce8559176affaa1ec84922 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 2 Jun 2016 07:46:52 -0600 Subject: layers: Add getBufferNode() helper Move core_validation bufferMap to use unique_ptr to BUFFER_NODE. Perform bufferMap look-ups using getBufferNode() helper function. Update DescriptorSet class to use getBufferNode() helper and store layer_data instead of bufferMap. --- layers/core_validation.cpp | 73 +++++++++++++++++++++++------------------- layers/core_validation_types.h | 11 ++++--- layers/descriptor_sets.cpp | 25 +++++++-------- layers/descriptor_sets.h | 7 ++-- 4 files changed, 61 insertions(+), 55 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 66d3abd2..5f60da49 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -127,7 +127,7 @@ struct layer_data { unordered_map imageViewMap; unordered_map imageMap; unordered_map bufferViewMap; - unordered_map bufferMap; + unordered_map> bufferMap; unordered_map pipelineMap; unordered_map commandPoolMap; unordered_map descriptorPoolMap; @@ -261,6 +261,15 @@ struct shader_module { // TODO : This can be much smarter, using separate locks for separate global data static std::mutex global_lock; +// Return buffer node ptr for specified buffer or else NULL +BUFFER_NODE *getBufferNode(const layer_data *my_data, const VkBuffer buffer) { + auto buff_it = my_data->bufferMap.find(buffer); + if (buff_it == my_data->bufferMap.end()) { + return nullptr; + } + return buff_it->second.get(); +} + static VkDeviceMemory *get_object_mem_binding(layer_data *my_data, uint64_t handle, VkDebugReportObjectTypeEXT type) { switch (type) { case VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT: { @@ -270,9 +279,9 @@ static VkDeviceMemory *get_object_mem_binding(layer_data *my_data, uint64_t hand break; } case VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT: { - auto it = my_data->bufferMap.find(VkBuffer(handle)); - if (it != my_data->bufferMap.end()) - return &(*it).second.mem; + auto buff_node = getBufferNode(my_data, VkBuffer(handle)); + if (buff_node) + return &buff_node->mem; break; } default: @@ -326,9 +335,9 @@ static bool validate_image_usage_flags(layer_data *dev_data, VkImage image, VkFl static bool validate_buffer_usage_flags(layer_data *dev_data, VkBuffer buffer, VkFlags desired, VkBool32 strict, char const *func_name, char const *usage_string) { bool skipCall = false; - auto const buffer_node = dev_data->bufferMap.find(buffer); - if (buffer_node != dev_data->bufferMap.end()) { - skipCall = validate_usage_flags(dev_data, buffer_node->second.createInfo.usage, desired, strict, (uint64_t)buffer, + auto buffer_node = getBufferNode(dev_data, buffer); + if (buffer_node) { + skipCall = validate_usage_flags(dev_data, buffer_node->createInfo.usage, desired, strict, (uint64_t)buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "buffer", func_name, usage_string); } return skipCall; @@ -2623,7 +2632,6 @@ static bool validate_compute_pipeline(debug_report_data *report_data, PIPELINE_N return validate_pipeline_shader_stage(report_data, &pCreateInfo->stage, pPipeline, &module, &entrypoint, enabledFeatures, shaderModuleMap); } - // Return Set node ptr for specified set or else NULL cvdescriptorset::DescriptorSet *getSetNode(const layer_data *my_data, const VkDescriptorSet set) { auto set_it = my_data->setMap.find(set); @@ -4047,13 +4055,13 @@ static bool validateAndIncrementResources(layer_data *my_data, GLOBAL_CB_NODE *p bool skip_call = false; for (auto drawDataElement : pCB->drawData) { for (auto buffer : drawDataElement.buffers) { - auto buffer_data = my_data->bufferMap.find(buffer); - if (buffer_data == my_data->bufferMap.end()) { + auto buffer_node = getBufferNode(my_data, buffer); + if (!buffer_node) { skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, (uint64_t)(buffer), __LINE__, DRAWSTATE_INVALID_BUFFER, "DS", "Cannot submit cmd buffer using deleted buffer 0x%" PRIx64 ".", (uint64_t)(buffer)); } else { - buffer_data->second.in_use.fetch_add(1); + buffer_node->in_use.fetch_add(1); } } } @@ -4132,9 +4140,9 @@ static void decrementResources(layer_data *my_data, VkCommandBuffer cmdBuffer) { GLOBAL_CB_NODE *pCB = getCBNode(my_data, cmdBuffer); for (auto drawDataElement : pCB->drawData) { for (auto buffer : drawDataElement.buffers) { - auto buffer_data = my_data->bufferMap.find(buffer); - if (buffer_data != my_data->bufferMap.end()) { - buffer_data->second.in_use.fetch_sub(1); + auto buffer_node = getBufferNode(my_data, buffer); + if (buffer_node) { + buffer_node->in_use.fetch_sub(1); } } } @@ -4940,13 +4948,13 @@ VKAPI_ATTR VkResult VKAPI_CALL GetQueryPoolResults(VkDevice device, VkQueryPool static bool validateIdleBuffer(const layer_data *my_data, VkBuffer buffer) { bool skip_call = false; - auto buffer_data = my_data->bufferMap.find(buffer); - if (buffer_data == my_data->bufferMap.end()) { + auto buffer_node = getBufferNode(my_data, buffer); + if (!buffer_node) { skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, (uint64_t)(buffer), __LINE__, DRAWSTATE_DOUBLE_DESTROY, "DS", "Cannot free buffer 0x%" PRIxLEAST64 " that has not been allocated.", (uint64_t)(buffer)); } else { - if (buffer_data->second.in_use.load()) { + if (buffer_node->in_use.load()) { skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, (uint64_t)(buffer), __LINE__, DRAWSTATE_OBJECT_INUSE, "DS", "Cannot free buffer 0x%" PRIxLEAST64 " that is in use by a command buffer.", (uint64_t)(buffer)); @@ -5015,14 +5023,14 @@ VKAPI_ATTR void VKAPI_CALL DestroyBuffer(VkDevice device, VkBuffer buffer, lock.lock(); } // Clean up memory binding and range information for buffer - const auto &bufferEntry = dev_data->bufferMap.find(buffer); - if (bufferEntry != dev_data->bufferMap.end()) { - const auto &memEntry = dev_data->memObjMap.find(bufferEntry->second.mem); + auto buff_it = dev_data->bufferMap.find(buffer); + if (buff_it != dev_data->bufferMap.end()) { + const auto &memEntry = dev_data->memObjMap.find(buff_it->second.get()->mem); if (memEntry != dev_data->memObjMap.end()) { - remove_memory_ranges(reinterpret_cast(buffer), bufferEntry->second.mem, memEntry->second.bufferRanges); + remove_memory_ranges(reinterpret_cast(buffer), buff_it->second.get()->mem, memEntry->second.bufferRanges); } clear_object_binding(dev_data, reinterpret_cast(buffer), VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT); - dev_data->bufferMap.erase(bufferEntry); + dev_data->bufferMap.erase(buff_it); } } @@ -5075,9 +5083,9 @@ BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem, VkDeviceS uint64_t buffer_handle = (uint64_t)(buffer); bool skipCall = set_mem_binding(dev_data, mem, buffer_handle, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "vkBindBufferMemory"); - auto buffer_node = dev_data->bufferMap.find(buffer); - if (buffer_node != dev_data->bufferMap.end()) { - buffer_node->second.mem = mem; + auto buffer_node = getBufferNode(dev_data, buffer); + if (buffer_node) { + buffer_node->mem = mem; VkMemoryRequirements memRequirements; dev_data->device_dispatch_table->GetBufferMemoryRequirements(device, buffer, &memRequirements); @@ -5101,7 +5109,7 @@ BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem, VkDeviceS memoryOffset, memRequirements.alignment); } // Validate device limits alignments - VkBufferUsageFlags usage = dev_data->bufferMap[buffer].createInfo.usage; + VkBufferUsageFlags usage = dev_data->bufferMap[buffer].get()->createInfo.usage; if (usage & (VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT)) { if (vk_safe_modulo(memoryOffset, dev_data->phys_dev_properties.properties.limits.minTexelBufferOffsetAlignment) != 0) { skipCall |= @@ -5414,7 +5422,7 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateBuffer(VkDevice device, const VkBufferCreat if (VK_SUCCESS == result) { std::lock_guard lock(global_lock); // TODO : This doesn't create deep copy of pQueueFamilyIndices so need to fix that if/when we want that data to be valid - dev_data->bufferMap.insert(std::make_pair(*pBuffer, BUFFER_NODE(pCreateInfo))); + dev_data->bufferMap.insert(std::make_pair(*pBuffer, unique_ptr(new BUFFER_NODE(pCreateInfo)))); } return result; } @@ -5882,7 +5890,7 @@ static void PostCallRecordAllocateDescriptorSets(layer_data *dev_data, const VkD // All the updates are contained in a single cvdescriptorset function cvdescriptorset::PerformAllocateDescriptorSets( pAllocateInfo, pDescriptorSets, common_data, &dev_data->descriptorPoolMap, &dev_data->setMap, dev_data, - dev_data->descriptorSetLayoutMap, dev_data->bufferMap, dev_data->memObjMap, dev_data->bufferViewMap, dev_data->samplerMap, + dev_data->descriptorSetLayoutMap, dev_data->memObjMap, dev_data->bufferViewMap, dev_data->samplerMap, dev_data->imageViewMap, dev_data->imageMap, dev_data->device_extensions.imageToSwapchainMap, dev_data->device_extensions.swapchainMap); } @@ -7697,11 +7705,10 @@ static bool ValidateBarriers(const char *funcName, VkCommandBuffer cmdBuffer, ui dev_data->phys_dev_properties.queue_family_properties.size()); } - auto buffer_data = dev_data->bufferMap.find(mem_barrier->buffer); - if (buffer_data != dev_data->bufferMap.end()) { - VkDeviceSize buffer_size = (buffer_data->second.createInfo.sType == VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO) - ? buffer_data->second.createInfo.size - : 0; + auto buffer_node = getBufferNode(dev_data, mem_barrier->buffer); + if (buffer_node) { + VkDeviceSize buffer_size = + (buffer_node->createInfo.sType == VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO) ? buffer_node->createInfo.size : 0; if (mem_barrier->offset >= buffer_size) { skip_call |= log_msg( dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index 901c1870..a7b8d921 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -62,11 +62,6 @@ class BASE_NODE { std::atomic_int in_use; }; -namespace core_validation { -struct layer_data; -cvdescriptorset::DescriptorSet *getSetNode(const layer_data *, const VkDescriptorSet); -} - struct DESCRIPTOR_POOL_NODE { VkDescriptorPool pool; uint32_t maxSets; // Max descriptor sets allowed in this pool @@ -484,5 +479,11 @@ struct GLOBAL_CB_NODE : public BASE_NODE { ~GLOBAL_CB_NODE(); }; +// Fwd declarations of layer_data and helpers to look-up state from layer_data maps +namespace core_validation { +struct layer_data; +cvdescriptorset::DescriptorSet *getSetNode(const layer_data *, const VkDescriptorSet); +BUFFER_NODE *getBufferNode(const layer_data *, const VkBuffer); +} #endif // CORE_VALIDATION_TYPES_H_ diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index 97e21b5a..060506db 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -264,7 +264,7 @@ cvdescriptorset::AllocateDescriptorSetsData::AllocateDescriptorSetsData(uint32_t : required_descriptors_by_type{}, layout_nodes(count, nullptr) {} cvdescriptorset::DescriptorSet::DescriptorSet(const VkDescriptorSet set, const DescriptorSetLayout *layout, - const std::unordered_map *buffer_map, + const core_validation::layer_data *dev_data, const std::unordered_map *memory_map, const std::unordered_map *buffer_view_map, const std::unordered_map> *sampler_map, @@ -272,7 +272,7 @@ cvdescriptorset::DescriptorSet::DescriptorSet(const VkDescriptorSet set, const D const std::unordered_map *image_map, const std::unordered_map *image_to_swapchain_map, const std::unordered_map *swapchain_map) - : some_update_(false), set_(set), p_layout_(layout), buffer_map_(buffer_map), memory_map_(memory_map), + : some_update_(false), set_(set), p_layout_(layout), device_data_(dev_data), memory_map_(memory_map), buffer_view_map_(buffer_view_map), sampler_map_(sampler_map), image_view_map_(image_view_map), image_map_(image_map), image_to_swapchain_map_(image_to_swapchain_map), swapchain_map_(swapchain_map) { // Foreach binding, create default descriptors of given type @@ -362,27 +362,27 @@ bool cvdescriptorset::DescriptorSet::ValidateDrawState(const std::unordered_set< if (GeneralBuffer == descriptors_[i]->GetClass()) { // Verify that buffers are valid auto buffer = static_cast(descriptors_[i].get())->GetBuffer(); - auto buffer_node = buffer_map_->find(buffer); - if (buffer_node == buffer_map_->end()) { + auto buffer_node = getBufferNode(device_data_, buffer); + if (!buffer_node) { std::stringstream error_str; error_str << "Descriptor in binding #" << binding << " at global descriptor index " << i << " references invalid buffer " << buffer << "."; *error = error_str.str(); return false; } else { - auto mem_entry = memory_map_->find(buffer_node->second.mem); + auto mem_entry = memory_map_->find(buffer_node->mem); if (mem_entry == memory_map_->end()) { std::stringstream error_str; error_str << "Descriptor in binding #" << binding << " at global descriptor index " << i - << " uses buffer " << buffer << " that references invalid memory " - << buffer_node->second.mem << "."; + << " uses buffer " << buffer << " that references invalid memory " << buffer_node->mem + << "."; *error = error_str.str(); return false; } } if (descriptors_[i]->IsDynamic()) { // Validate that dynamic offsets are within the buffer - auto buffer_size = buffer_node->second.createInfo.size; + auto buffer_size = buffer_node->createInfo.size; auto range = static_cast(descriptors_[i].get())->GetRange(); auto desc_offset = static_cast(descriptors_[i].get())->GetOffset(); auto dyn_offset = dynamic_offsets[dyn_offset_index++]; @@ -986,15 +986,15 @@ bool cvdescriptorset::DescriptorSet::ValidateWriteUpdate(const debug_report_data // If there's an error, update the error string with details and return false, else return true bool cvdescriptorset::DescriptorSet::ValidateBufferUpdate(VkBuffer buffer, VkDescriptorType type, std::string *error) const { // First make sure that buffer is valid - auto buff_it = buffer_map_->find(buffer); - if (buff_it == buffer_map_->end()) { + auto buffer_node = getBufferNode(device_data_, buffer); + if (!buffer_node) { std::stringstream error_str; error_str << "Invalid VkBuffer: " << buffer; *error = error_str.str(); return false; } // Verify that usage bits set correctly for given type - auto usage = buff_it->second.createInfo.usage; + auto usage = buffer_node->createInfo.usage; std::string error_usage_bit; switch (type) { case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: @@ -1289,7 +1289,6 @@ void cvdescriptorset::PerformAllocateDescriptorSets( const AllocateDescriptorSetsData *ds_data, std::unordered_map *pool_map, std::unordered_map *set_map, const core_validation::layer_data *dev_data, const std::unordered_map &layout_map, - const std::unordered_map &buffer_map, const std::unordered_map &mem_obj_map, const std::unordered_map &buffer_view_map, const std::unordered_map> &sampler_map, @@ -1307,7 +1306,7 @@ void cvdescriptorset::PerformAllocateDescriptorSets( * global map and the pool's set. */ for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) { - auto new_ds = new cvdescriptorset::DescriptorSet(descriptor_sets[i], ds_data->layout_nodes[i], &buffer_map, &mem_obj_map, + auto new_ds = new cvdescriptorset::DescriptorSet(descriptor_sets[i], ds_data->layout_nodes[i], dev_data, &mem_obj_map, &buffer_view_map, &sampler_map, &image_view_map, &image_map, &image_to_swapchain_map, &swapchain_map); diff --git a/layers/descriptor_sets.h b/layers/descriptor_sets.h index b11b5f87..479e3471 100644 --- a/layers/descriptor_sets.h +++ b/layers/descriptor_sets.h @@ -269,8 +269,7 @@ void PerformAllocateDescriptorSets( std::unordered_map *, std::unordered_map *, const core_validation::layer_data *, const std::unordered_map &, - const std::unordered_map &, const std::unordered_map &, - const std::unordered_map &, + const std::unordered_map &, const std::unordered_map &, const std::unordered_map> &, const std::unordered_map &, const std::unordered_map &, const std::unordered_map &, const std::unordered_map &); @@ -296,7 +295,7 @@ void PerformAllocateDescriptorSets( class DescriptorSet : public BASE_NODE { public: using BASE_NODE::in_use; - DescriptorSet(const VkDescriptorSet, const DescriptorSetLayout *, const std::unordered_map *, + DescriptorSet(const VkDescriptorSet, const DescriptorSetLayout *, const core_validation::layer_data *, const std::unordered_map *, const std::unordered_map *, const std::unordered_map> *, @@ -378,7 +377,7 @@ class DescriptorSet : public BASE_NODE { std::unordered_set bound_cmd_buffers_; std::vector> descriptors_; // Ptrs to object containers to verify bound data - const std::unordered_map *buffer_map_; + const core_validation::layer_data *device_data_; const std::unordered_map *memory_map_; const std::unordered_map *buffer_view_map_; const std::unordered_map> *sampler_map_; -- cgit v1.2.3 From dfd84b02f282a762e3ec24e86e75c35813799744 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 2 Jun 2016 08:43:37 -0600 Subject: layers: Update getMemObjInfo helper Standardize core_validation use of getMemObjInfo() and update DescriptorSet class to use it as well. --- layers/core_validation.cpp | 213 +++++++++++++++++++---------------------- layers/core_validation_types.h | 4 + layers/descriptor_sets.cpp | 16 ++-- layers/descriptor_sets.h | 22 ++--- 4 files changed, 121 insertions(+), 134 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 5f60da49..571cb009 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -134,7 +134,7 @@ struct layer_data { unordered_map setMap; unordered_map descriptorSetLayoutMap; unordered_map pipelineLayoutMap; - unordered_map memObjMap; + unordered_map> memObjMap; unordered_map fenceMap; unordered_map queueMap; unordered_map eventMap; @@ -345,30 +345,19 @@ static bool validate_buffer_usage_flags(layer_data *dev_data, VkBuffer buffer, V // Return ptr to info in map container containing mem, or NULL if not found // Calls to this function should be wrapped in mutex -static DEVICE_MEM_INFO *get_mem_obj_info(layer_data *dev_data, const VkDeviceMemory mem) { - auto item = dev_data->memObjMap.find(mem); - if (item != dev_data->memObjMap.end()) { - return &(*item).second; - } else { +DEVICE_MEM_INFO *getMemObjInfo(const layer_data *dev_data, const VkDeviceMemory mem) { + auto mem_it = dev_data->memObjMap.find(mem); + if (mem_it == dev_data->memObjMap.end()) { return NULL; } + return mem_it->second.get(); } static void add_mem_obj_info(layer_data *my_data, void *object, const VkDeviceMemory mem, const VkMemoryAllocateInfo *pAllocateInfo) { assert(object != NULL); - memcpy(&my_data->memObjMap[mem].allocInfo, pAllocateInfo, sizeof(VkMemoryAllocateInfo)); - // TODO: Update for real hardware, actually process allocation info structures - my_data->memObjMap[mem].allocInfo.pNext = NULL; - my_data->memObjMap[mem].object = object; - my_data->memObjMap[mem].mem = mem; - my_data->memObjMap[mem].image = VK_NULL_HANDLE; - my_data->memObjMap[mem].memRange.offset = 0; - my_data->memObjMap[mem].memRange.size = 0; - my_data->memObjMap[mem].pData = 0; - my_data->memObjMap[mem].pDriverData = 0; - my_data->memObjMap[mem].valid = false; + my_data->memObjMap[mem] = unique_ptr(new DEVICE_MEM_INFO(object, mem, pAllocateInfo)); } static bool validate_memory_is_valid(layer_data *dev_data, VkDeviceMemory mem, const char *functionName, @@ -382,7 +371,7 @@ static bool validate_memory_is_valid(layer_data *dev_data, VkDeviceMemory mem, c functionName, (uint64_t)(image)); } } else { - DEVICE_MEM_INFO *pMemObj = get_mem_obj_info(dev_data, mem); + DEVICE_MEM_INFO *pMemObj = getMemObjInfo(dev_data, mem); if (pMemObj && !pMemObj->valid) { return log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, (uint64_t)(mem), __LINE__, MEMTRACK_INVALID_USAGE_FLAG, "MEM", @@ -400,7 +389,7 @@ static void set_memory_valid(layer_data *dev_data, VkDeviceMemory mem, bool vali image_node->second.valid = valid; } } else { - DEVICE_MEM_INFO *pMemObj = get_mem_obj_info(dev_data, mem); + DEVICE_MEM_INFO *pMemObj = getMemObjInfo(dev_data, mem); if (pMemObj) { pMemObj->valid = valid; } @@ -417,7 +406,7 @@ static bool update_cmd_buf_and_mem_references(layer_data *dev_data, const VkComm if (mem != MEMTRACKER_SWAP_CHAIN_IMAGE_KEY) { // First update CB binding in MemObj mini CB list - DEVICE_MEM_INFO *pMemInfo = get_mem_obj_info(dev_data, mem); + DEVICE_MEM_INFO *pMemInfo = getMemObjInfo(dev_data, mem); if (pMemInfo) { pMemInfo->commandBufferBindings.insert(cb); // Now update CBInfo's Mem reference list @@ -435,7 +424,7 @@ static void clear_cmd_buf_and_mem_references(layer_data *dev_data, GLOBAL_CB_NOD if (pCBNode) { if (pCBNode->memObjs.size() > 0) { for (auto mem : pCBNode->memObjs) { - DEVICE_MEM_INFO *pInfo = get_mem_obj_info(dev_data, mem); + DEVICE_MEM_INFO *pInfo = getMemObjInfo(dev_data, mem); if (pInfo) { pInfo->commandBufferBindings.erase(pCBNode->commandBuffer); } @@ -502,7 +491,7 @@ static bool deleteMemObjInfo(layer_data *my_data, void *object, VkDeviceMemory m static bool freeMemObjInfo(layer_data *dev_data, void *object, VkDeviceMemory mem, bool internal) { bool skipCall = false; // Parse global list to find info w/ mem - DEVICE_MEM_INFO *pInfo = get_mem_obj_info(dev_data, mem); + DEVICE_MEM_INFO *pInfo = getMemObjInfo(dev_data, mem); if (pInfo) { if (pInfo->allocInfo.allocationSize == 0 && !internal) { // TODO: Verify against Valid Use section @@ -559,7 +548,7 @@ static bool clear_object_binding(layer_data *dev_data, uint64_t handle, VkDebugR bool skipCall = false; VkDeviceMemory *pMemBinding = get_object_mem_binding(dev_data, handle, type); if (pMemBinding) { - DEVICE_MEM_INFO *pMemObjInfo = get_mem_obj_info(dev_data, *pMemBinding); + DEVICE_MEM_INFO *pMemObjInfo = getMemObjInfo(dev_data, *pMemBinding); // TODO : Make sure this is a reasonable way to reset mem binding *pMemBinding = VK_NULL_HANDLE; if (pMemObjInfo) { @@ -593,9 +582,9 @@ static bool set_mem_binding(layer_data *dev_data, VkDeviceMemory mem, uint64_t h } else { VkDeviceMemory *pMemBinding = get_object_mem_binding(dev_data, handle, type); assert(pMemBinding); - DEVICE_MEM_INFO *pMemInfo = get_mem_obj_info(dev_data, mem); + DEVICE_MEM_INFO *pMemInfo = getMemObjInfo(dev_data, mem); if (pMemInfo) { - DEVICE_MEM_INFO *pPrevBinding = get_mem_obj_info(dev_data, *pMemBinding); + DEVICE_MEM_INFO *pPrevBinding = getMemObjInfo(dev_data, *pMemBinding); if (pPrevBinding != NULL) { skipCall |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, (uint64_t)mem, __LINE__, MEMTRACK_REBIND_OBJECT, @@ -637,7 +626,7 @@ static bool set_sparse_mem_binding(layer_data *dev_data, VkDeviceMemory mem, uin } else { VkDeviceMemory *pMemBinding = get_object_mem_binding(dev_data, handle, type); assert(pMemBinding); - DEVICE_MEM_INFO *pInfo = get_mem_obj_info(dev_data, mem); + DEVICE_MEM_INFO *pInfo = getMemObjInfo(dev_data, mem); if (pInfo) { pInfo->objBindings.insert({handle, type}); // Need to set mem binding for this object @@ -665,8 +654,6 @@ static bool get_mem_binding_from_object(layer_data *dev_data, const uint64_t han // Print details of MemObjInfo list static void print_mem_list(layer_data *dev_data) { - DEVICE_MEM_INFO *pInfo = NULL; - // Early out if info is not requested if (!(dev_data->report_data->active_flags & VK_DEBUG_REPORT_INFORMATION_BIT_EXT)) { return; @@ -683,17 +670,17 @@ static void print_mem_list(layer_data *dev_data) { return; for (auto ii = dev_data->memObjMap.begin(); ii != dev_data->memObjMap.end(); ++ii) { - pInfo = &(*ii).second; + auto mem_info = (*ii).second.get(); log_msg(dev_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, 0, - __LINE__, MEMTRACK_NONE, "MEM", " ===MemObjInfo at 0x%p===", (void *)pInfo); + __LINE__, MEMTRACK_NONE, "MEM", " ===MemObjInfo at 0x%p===", (void *)mem_info); log_msg(dev_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, 0, - __LINE__, MEMTRACK_NONE, "MEM", " Mem object: 0x%" PRIxLEAST64, (uint64_t)(pInfo->mem)); + __LINE__, MEMTRACK_NONE, "MEM", " Mem object: 0x%" PRIxLEAST64, (uint64_t)(mem_info->mem)); log_msg(dev_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, 0, __LINE__, MEMTRACK_NONE, "MEM", " Ref Count: " PRINTF_SIZE_T_SPECIFIER, - pInfo->commandBufferBindings.size() + pInfo->objBindings.size()); - if (0 != pInfo->allocInfo.allocationSize) { - string pAllocInfoMsg = vk_print_vkmemoryallocateinfo(&pInfo->allocInfo, "MEM(INFO): "); + mem_info->commandBufferBindings.size() + mem_info->objBindings.size()); + if (0 != mem_info->allocInfo.allocationSize) { + string pAllocInfoMsg = vk_print_vkmemoryallocateinfo(&mem_info->allocInfo, "MEM(INFO): "); log_msg(dev_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, 0, __LINE__, MEMTRACK_NONE, "MEM", " Mem Alloc info:\n%s", pAllocInfoMsg.c_str()); } else { @@ -703,9 +690,9 @@ static void print_mem_list(layer_data *dev_data) { log_msg(dev_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, 0, __LINE__, MEMTRACK_NONE, "MEM", " VK OBJECT Binding list of size " PRINTF_SIZE_T_SPECIFIER " elements:", - pInfo->objBindings.size()); - if (pInfo->objBindings.size() > 0) { - for (auto obj : pInfo->objBindings) { + mem_info->objBindings.size()); + if (mem_info->objBindings.size() > 0) { + for (auto obj : mem_info->objBindings) { log_msg(dev_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, 0, __LINE__, MEMTRACK_NONE, "MEM", " VK OBJECT 0x%" PRIx64, obj.handle); } @@ -714,9 +701,9 @@ static void print_mem_list(layer_data *dev_data) { log_msg(dev_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, 0, __LINE__, MEMTRACK_NONE, "MEM", " VK Command Buffer (CB) binding list of size " PRINTF_SIZE_T_SPECIFIER " elements", - pInfo->commandBufferBindings.size()); - if (pInfo->commandBufferBindings.size() > 0) { - for (auto cb : pInfo->commandBufferBindings) { + mem_info->commandBufferBindings.size()); + if (mem_info->commandBufferBindings.size() > 0) { + for (auto cb : mem_info->commandBufferBindings) { log_msg(dev_data->report_data, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, 0, __LINE__, MEMTRACK_NONE, "MEM", " VK CB 0x%p", cb); } @@ -3977,7 +3964,7 @@ VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCall DEVICE_MEM_INFO *pInfo = NULL; if (!dev_data->memObjMap.empty()) { for (auto ii = dev_data->memObjMap.begin(); ii != dev_data->memObjMap.end(); ++ii) { - pInfo = &(*ii).second; + pInfo = (*ii).second.get(); if (pInfo->allocInfo.allocationSize != 0) { // Valid Usage: All child objects created on device must have been destroyed prior to destroying device skipCall |= @@ -4612,8 +4599,9 @@ static bool validateMemRange(layer_data *my_data, VkDeviceMemory mem, VkDeviceSi auto mem_element = my_data->memObjMap.find(mem); if (mem_element != my_data->memObjMap.end()) { + auto mem_info = mem_element->second.get(); // It is an application error to call VkMapMemory on an object that is already mapped - if (mem_element->second.memRange.size != 0) { + if (mem_info->memRange.size != 0) { skipCall = log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, (uint64_t)mem, __LINE__, MEMTRACK_INVALID_MAP, "MEM", "VkMapMemory: Attempting to map memory on an already-mapped object 0x%" PRIxLEAST64, (uint64_t)mem); @@ -4621,18 +4609,20 @@ static bool validateMemRange(layer_data *my_data, VkDeviceMemory mem, VkDeviceSi // Validate that offset + size is within object's allocationSize if (size == VK_WHOLE_SIZE) { - if (offset >= mem_element->second.allocInfo.allocationSize) { + if (offset >= mem_info->allocInfo.allocationSize) { skipCall = log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, (uint64_t)mem, __LINE__, MEMTRACK_INVALID_MAP, - "MEM", "Mapping Memory from 0x%" PRIx64 " to 0x%" PRIx64 " with size of VK_WHOLE_SIZE oversteps total array size 0x%" PRIx64, offset, - mem_element->second.allocInfo.allocationSize, mem_element->second.allocInfo.allocationSize); + "MEM", "Mapping Memory from 0x%" PRIx64 " to 0x%" PRIx64 + " with size of VK_WHOLE_SIZE oversteps total array size 0x%" PRIx64, + offset, mem_info->allocInfo.allocationSize, mem_info->allocInfo.allocationSize); } } else { - if ((offset + size) > mem_element->second.allocInfo.allocationSize) { - skipCall = log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, (uint64_t)mem, __LINE__, MEMTRACK_INVALID_MAP, - "MEM", "Mapping Memory from 0x%" PRIx64 " to 0x%" PRIx64 " oversteps total array size 0x%" PRIx64, offset, - size + offset, mem_element->second.allocInfo.allocationSize); + if ((offset + size) > mem_info->allocInfo.allocationSize) { + skipCall = + log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, + (uint64_t)mem, __LINE__, MEMTRACK_INVALID_MAP, "MEM", + "Mapping Memory from 0x%" PRIx64 " to 0x%" PRIx64 " oversteps total array size 0x%" PRIx64, offset, + size + offset, mem_info->allocInfo.allocationSize); } } } @@ -4640,29 +4630,27 @@ static bool validateMemRange(layer_data *my_data, VkDeviceMemory mem, VkDeviceSi } static void storeMemRanges(layer_data *my_data, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize size) { - auto mem_element = my_data->memObjMap.find(mem); - if (mem_element != my_data->memObjMap.end()) { - MemRange new_range; - new_range.offset = offset; - new_range.size = size; - mem_element->second.memRange = new_range; + auto mem_info = getMemObjInfo(my_data, mem); + if (mem_info) { + mem_info->memRange.offset = offset; + mem_info->memRange.size = size; } } static bool deleteMemRanges(layer_data *my_data, VkDeviceMemory mem) { bool skipCall = false; - auto mem_element = my_data->memObjMap.find(mem); - if (mem_element != my_data->memObjMap.end()) { - if (!mem_element->second.memRange.size) { + auto mem_info = getMemObjInfo(my_data, mem); + if (mem_info) { + if (!mem_info->memRange.size) { // Valid Usage: memory must currently be mapped skipCall = log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, (uint64_t)mem, __LINE__, MEMTRACK_INVALID_MAP, "MEM", "Unmapping Memory without memory being mapped: mem obj 0x%" PRIxLEAST64, (uint64_t)mem); } - mem_element->second.memRange.size = 0; - if (mem_element->second.pData) { - free(mem_element->second.pData); - mem_element->second.pData = 0; + mem_info->memRange.size = 0; + if (mem_info->pData) { + free(mem_info->pData); + mem_info->pData = 0; } } return skipCall; @@ -4671,20 +4659,20 @@ static bool deleteMemRanges(layer_data *my_data, VkDeviceMemory mem) { static char NoncoherentMemoryFillValue = 0xb; static void initializeAndTrackMemory(layer_data *dev_data, VkDeviceMemory mem, VkDeviceSize size, void **ppData) { - auto mem_element = dev_data->memObjMap.find(mem); - if (mem_element != dev_data->memObjMap.end()) { - mem_element->second.pDriverData = *ppData; - uint32_t index = mem_element->second.allocInfo.memoryTypeIndex; + auto mem_info = getMemObjInfo(dev_data, mem); + if (mem_info) { + mem_info->pDriverData = *ppData; + uint32_t index = mem_info->allocInfo.memoryTypeIndex; if (dev_data->phys_dev_mem_props.memoryTypes[index].propertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) { - mem_element->second.pData = 0; + mem_info->pData = 0; } else { if (size == VK_WHOLE_SIZE) { - size = mem_element->second.allocInfo.allocationSize; + size = mem_info->allocInfo.allocationSize; } size_t convSize = (size_t)(size); - mem_element->second.pData = malloc(2 * convSize); - memset(mem_element->second.pData, NoncoherentMemoryFillValue, 2 * convSize); - *ppData = static_cast(mem_element->second.pData) + (convSize / 2); + mem_info->pData = malloc(2 * convSize); + memset(mem_info->pData, NoncoherentMemoryFillValue, 2 * convSize); + *ppData = static_cast(mem_info->pData) + (convSize / 2); } } } @@ -5025,9 +5013,9 @@ VKAPI_ATTR void VKAPI_CALL DestroyBuffer(VkDevice device, VkBuffer buffer, // Clean up memory binding and range information for buffer auto buff_it = dev_data->bufferMap.find(buffer); if (buff_it != dev_data->bufferMap.end()) { - const auto &memEntry = dev_data->memObjMap.find(buff_it->second.get()->mem); - if (memEntry != dev_data->memObjMap.end()) { - remove_memory_ranges(reinterpret_cast(buffer), buff_it->second.get()->mem, memEntry->second.bufferRanges); + auto mem_info = getMemObjInfo(dev_data, buff_it->second.get()->mem); + if (mem_info) { + remove_memory_ranges(reinterpret_cast(buffer), buff_it->second.get()->mem, mem_info->bufferRanges); } clear_object_binding(dev_data, reinterpret_cast(buffer), VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT); dev_data->bufferMap.erase(buff_it); @@ -5056,11 +5044,11 @@ VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const Vk const auto &imageEntry = dev_data->imageMap.find(image); if (imageEntry != dev_data->imageMap.end()) { // Clean up memory mapping, bindings and range references for image - auto memEntry = dev_data->memObjMap.find(imageEntry->second.mem); - if (memEntry != dev_data->memObjMap.end()) { - remove_memory_ranges(reinterpret_cast(image), imageEntry->second.mem, memEntry->second.imageRanges); + auto mem_info = getMemObjInfo(dev_data, imageEntry->second.mem); + if (mem_info) { + remove_memory_ranges(reinterpret_cast(image), imageEntry->second.mem, mem_info->imageRanges); clear_object_binding(dev_data, reinterpret_cast(image), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT); - memEntry->second.image = VK_NULL_HANDLE; + mem_info->image = VK_NULL_HANDLE; } // Remove image from imageMap dev_data->imageMap.erase(imageEntry); @@ -5090,12 +5078,11 @@ BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem, VkDeviceS dev_data->device_dispatch_table->GetBufferMemoryRequirements(device, buffer, &memRequirements); // Track and validate bound memory range information - const auto &memEntry = dev_data->memObjMap.find(mem); - if (memEntry != dev_data->memObjMap.end()) { + auto mem_info = getMemObjInfo(dev_data, mem); + if (mem_info) { const MEMORY_RANGE range = - insert_memory_ranges(buffer_handle, mem, memoryOffset, memRequirements, memEntry->second.bufferRanges); - skipCall |= - validate_memory_range(dev_data, memEntry->second.imageRanges, range, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT); + insert_memory_ranges(buffer_handle, mem, memoryOffset, memRequirements, mem_info->bufferRanges); + skipCall |= validate_memory_range(dev_data, mem_info->imageRanges, range, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT); } // Validate memory requirements alignment @@ -5890,9 +5877,8 @@ static void PostCallRecordAllocateDescriptorSets(layer_data *dev_data, const VkD // All the updates are contained in a single cvdescriptorset function cvdescriptorset::PerformAllocateDescriptorSets( pAllocateInfo, pDescriptorSets, common_data, &dev_data->descriptorPoolMap, &dev_data->setMap, dev_data, - dev_data->descriptorSetLayoutMap, dev_data->memObjMap, dev_data->bufferViewMap, dev_data->samplerMap, - dev_data->imageViewMap, dev_data->imageMap, dev_data->device_extensions.imageToSwapchainMap, - dev_data->device_extensions.swapchainMap); + dev_data->descriptorSetLayoutMap, dev_data->bufferViewMap, dev_data->samplerMap, dev_data->imageViewMap, dev_data->imageMap, + dev_data->device_extensions.imageToSwapchainMap, dev_data->device_extensions.swapchainMap); } VKAPI_ATTR VkResult VKAPI_CALL @@ -9284,10 +9270,10 @@ CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBuffersCount, static bool ValidateMapImageLayouts(VkDevice device, VkDeviceMemory mem) { bool skip_call = false; layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); - auto mem_data = dev_data->memObjMap.find(mem); - if ((mem_data != dev_data->memObjMap.end()) && (mem_data->second.image != VK_NULL_HANDLE)) { + auto mem_info = getMemObjInfo(dev_data, mem); + if ((mem_info) && (mem_info->image != VK_NULL_HANDLE)) { std::vector layouts; - if (FindLayouts(dev_data, mem_data->second.image, layouts)) { + if (FindLayouts(dev_data, mem_info->image, layouts)) { for (auto layout : layouts) { if (layout != VK_IMAGE_LAYOUT_PREINITIALIZED && layout != VK_IMAGE_LAYOUT_GENERAL) { skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, @@ -9309,7 +9295,7 @@ MapMemory(VkDevice device, VkDeviceMemory mem, VkDeviceSize offset, VkDeviceSize VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; std::unique_lock lock(global_lock); #if MTMERGESOURCE - DEVICE_MEM_INFO *pMemObj = get_mem_obj_info(dev_data, mem); + DEVICE_MEM_INFO *pMemObj = getMemObjInfo(dev_data, mem); if (pMemObj) { pMemObj->valid = true; if ((dev_data->phys_dev_mem_props.memoryTypes[pMemObj->allocInfo.memoryTypeIndex].propertyFlags & @@ -9355,20 +9341,20 @@ static bool validateMemoryIsMapped(layer_data *my_data, const char *funcName, ui const VkMappedMemoryRange *pMemRanges) { bool skipCall = false; for (uint32_t i = 0; i < memRangeCount; ++i) { - auto mem_element = my_data->memObjMap.find(pMemRanges[i].memory); - if (mem_element != my_data->memObjMap.end()) { - if (mem_element->second.memRange.offset > pMemRanges[i].offset) { - skipCall |= log_msg( - my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, - (uint64_t)pMemRanges[i].memory, __LINE__, MEMTRACK_INVALID_MAP, "MEM", - "%s: Flush/Invalidate offset (" PRINTF_SIZE_T_SPECIFIER ") is less than Memory Object's offset " - "(" PRINTF_SIZE_T_SPECIFIER ").", - funcName, static_cast(pMemRanges[i].offset), static_cast(mem_element->second.memRange.offset)); + auto mem_info = getMemObjInfo(my_data, pMemRanges[i].memory); + if (mem_info) { + if (mem_info->memRange.offset > pMemRanges[i].offset) { + skipCall |= + log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, + (uint64_t)pMemRanges[i].memory, __LINE__, MEMTRACK_INVALID_MAP, "MEM", + "%s: Flush/Invalidate offset (" PRINTF_SIZE_T_SPECIFIER ") is less than Memory Object's offset " + "(" PRINTF_SIZE_T_SPECIFIER ").", + funcName, static_cast(pMemRanges[i].offset), static_cast(mem_info->memRange.offset)); } const uint64_t my_dataTerminus = - (mem_element->second.memRange.size == VK_WHOLE_SIZE) ? mem_element->second.allocInfo.allocationSize : - (mem_element->second.memRange.offset + mem_element->second.memRange.size); + (mem_info->memRange.size == VK_WHOLE_SIZE) ? mem_info->allocInfo.allocationSize : + (mem_info->memRange.offset + mem_info->memRange.size); if (pMemRanges[i].size != VK_WHOLE_SIZE && (my_dataTerminus < (pMemRanges[i].offset + pMemRanges[i].size))) { skipCall |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, (uint64_t)pMemRanges[i].memory, __LINE__, @@ -9387,12 +9373,12 @@ static bool validateAndCopyNoncoherentMemoryToDriver(layer_data *my_data, uint32 const VkMappedMemoryRange *pMemRanges) { bool skipCall = false; for (uint32_t i = 0; i < memRangeCount; ++i) { - auto mem_element = my_data->memObjMap.find(pMemRanges[i].memory); - if (mem_element != my_data->memObjMap.end()) { - if (mem_element->second.pData) { - VkDeviceSize size = mem_element->second.memRange.size; + auto mem_info = getMemObjInfo(my_data, pMemRanges[i].memory); + if (mem_info) { + if (mem_info->pData) { + VkDeviceSize size = mem_info->memRange.size; VkDeviceSize half_size = (size / 2); - char *data = static_cast(mem_element->second.pData); + char *data = static_cast(mem_info->pData); for (auto j = 0; j < half_size; ++j) { if (data[j] != NoncoherentMemoryFillValue) { skipCall |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, @@ -9409,7 +9395,7 @@ static bool validateAndCopyNoncoherentMemoryToDriver(layer_data *my_data, uint32 (uint64_t)pMemRanges[i].memory); } } - memcpy(mem_element->second.pDriverData, static_cast(data + (size_t)(half_size)), (size_t)(size)); + memcpy(mem_info->pDriverData, static_cast(data + (size_t)(half_size)), (size_t)(size)); } } } @@ -9463,12 +9449,11 @@ VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, V lock.lock(); // Track and validate bound memory range information - const auto &memEntry = dev_data->memObjMap.find(mem); - if (memEntry != dev_data->memObjMap.end()) { + auto mem_info = getMemObjInfo(dev_data, mem); + if (mem_info) { const MEMORY_RANGE range = - insert_memory_ranges(image_handle, mem, memoryOffset, memRequirements, memEntry->second.imageRanges); - skipCall |= - validate_memory_range(dev_data, memEntry->second.bufferRanges, range, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT); + insert_memory_ranges(image_handle, mem, memoryOffset, memRequirements, mem_info->imageRanges); + skipCall |= validate_memory_range(dev_data, mem_info->bufferRanges, range, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT); } print_mem_list(dev_data); @@ -9476,7 +9461,7 @@ VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, V if (!skipCall) { result = dev_data->device_dispatch_table->BindImageMemory(device, image, mem, memoryOffset); lock.lock(); - dev_data->memObjMap[mem].image = image; + dev_data->memObjMap[mem].get()->image = image; image_node->second.mem = mem; image_node->second.memOffset = memoryOffset; image_node->second.memSize = memRequirements.size; diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index a7b8d921..1516f41b 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -174,6 +174,9 @@ struct DEVICE_MEM_INFO { VkImage image; // If memory is bound to image, this will have VkImage handle, else VK_NULL_HANDLE MemRange memRange; void *pData, *pDriverData; + DEVICE_MEM_INFO(void *disp_object, const VkDeviceMemory in_mem, const VkMemoryAllocateInfo *p_alloc_info) + : object(disp_object), valid(false), mem(in_mem), allocInfo(*p_alloc_info), image(VK_NULL_HANDLE), memRange{}, pData(0), + pDriverData(0){}; }; class SWAPCHAIN_NODE { @@ -484,6 +487,7 @@ namespace core_validation { struct layer_data; cvdescriptorset::DescriptorSet *getSetNode(const layer_data *, const VkDescriptorSet); BUFFER_NODE *getBufferNode(const layer_data *, const VkBuffer); +DEVICE_MEM_INFO *getMemObjInfo(const layer_data *, const VkDeviceMemory); } #endif // CORE_VALIDATION_TYPES_H_ diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index 060506db..96133c5e 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -265,15 +265,14 @@ cvdescriptorset::AllocateDescriptorSetsData::AllocateDescriptorSetsData(uint32_t cvdescriptorset::DescriptorSet::DescriptorSet(const VkDescriptorSet set, const DescriptorSetLayout *layout, const core_validation::layer_data *dev_data, - const std::unordered_map *memory_map, const std::unordered_map *buffer_view_map, const std::unordered_map> *sampler_map, const std::unordered_map *image_view_map, const std::unordered_map *image_map, const std::unordered_map *image_to_swapchain_map, const std::unordered_map *swapchain_map) - : some_update_(false), set_(set), p_layout_(layout), device_data_(dev_data), memory_map_(memory_map), - buffer_view_map_(buffer_view_map), sampler_map_(sampler_map), image_view_map_(image_view_map), image_map_(image_map), + : some_update_(false), set_(set), p_layout_(layout), device_data_(dev_data), buffer_view_map_(buffer_view_map), + sampler_map_(sampler_map), image_view_map_(image_view_map), image_map_(image_map), image_to_swapchain_map_(image_to_swapchain_map), swapchain_map_(swapchain_map) { // Foreach binding, create default descriptors of given type for (uint32_t i = 0; i < p_layout_->GetBindingCount(); ++i) { @@ -370,8 +369,8 @@ bool cvdescriptorset::DescriptorSet::ValidateDrawState(const std::unordered_set< *error = error_str.str(); return false; } else { - auto mem_entry = memory_map_->find(buffer_node->mem); - if (mem_entry == memory_map_->end()) { + auto mem_entry = getMemObjInfo(device_data_, buffer_node->mem); + if (!mem_entry) { std::stringstream error_str; error_str << "Descriptor in binding #" << binding << " at global descriptor index " << i << " uses buffer " << buffer << " that references invalid memory " << buffer_node->mem @@ -1289,7 +1288,6 @@ void cvdescriptorset::PerformAllocateDescriptorSets( const AllocateDescriptorSetsData *ds_data, std::unordered_map *pool_map, std::unordered_map *set_map, const core_validation::layer_data *dev_data, const std::unordered_map &layout_map, - const std::unordered_map &mem_obj_map, const std::unordered_map &buffer_view_map, const std::unordered_map> &sampler_map, const std::unordered_map &image_view_map, @@ -1306,9 +1304,9 @@ void cvdescriptorset::PerformAllocateDescriptorSets( * global map and the pool's set. */ for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) { - auto new_ds = new cvdescriptorset::DescriptorSet(descriptor_sets[i], ds_data->layout_nodes[i], dev_data, &mem_obj_map, - &buffer_view_map, &sampler_map, &image_view_map, &image_map, - &image_to_swapchain_map, &swapchain_map); + auto new_ds = + new cvdescriptorset::DescriptorSet(descriptor_sets[i], ds_data->layout_nodes[i], dev_data, &buffer_view_map, + &sampler_map, &image_view_map, &image_map, &image_to_swapchain_map, &swapchain_map); pool_state->sets.insert(new_ds); new_ds->in_use.store(0); diff --git a/layers/descriptor_sets.h b/layers/descriptor_sets.h index 479e3471..193ef75e 100644 --- a/layers/descriptor_sets.h +++ b/layers/descriptor_sets.h @@ -264,15 +264,17 @@ bool ValidateAllocateDescriptorSets(const debug_report_data *, const VkDescripto const std::unordered_map &, AllocateDescriptorSetsData *); // Update state based on allocating new descriptorsets -void PerformAllocateDescriptorSets( - const VkDescriptorSetAllocateInfo *, const VkDescriptorSet *, const AllocateDescriptorSetsData *, - std::unordered_map *, - std::unordered_map *, const core_validation::layer_data *, - const std::unordered_map &, - const std::unordered_map &, const std::unordered_map &, - const std::unordered_map> &, - const std::unordered_map &, const std::unordered_map &, - const std::unordered_map &, const std::unordered_map &); +void PerformAllocateDescriptorSets(const VkDescriptorSetAllocateInfo *, const VkDescriptorSet *, const AllocateDescriptorSetsData *, + std::unordered_map *, + std::unordered_map *, + const core_validation::layer_data *, + const std::unordered_map &, + const std::unordered_map &, + const std::unordered_map> &, + const std::unordered_map &, + const std::unordered_map &, + const std::unordered_map &, + const std::unordered_map &); /* * DescriptorSet class @@ -296,7 +298,6 @@ class DescriptorSet : public BASE_NODE { public: using BASE_NODE::in_use; DescriptorSet(const VkDescriptorSet, const DescriptorSetLayout *, const core_validation::layer_data *, - const std::unordered_map *, const std::unordered_map *, const std::unordered_map> *, const std::unordered_map *, const std::unordered_map *, @@ -378,7 +379,6 @@ class DescriptorSet : public BASE_NODE { std::vector> descriptors_; // Ptrs to object containers to verify bound data const core_validation::layer_data *device_data_; - const std::unordered_map *memory_map_; const std::unordered_map *buffer_view_map_; const std::unordered_map> *sampler_map_; const std::unordered_map *image_view_map_; -- cgit v1.2.3 From f6a1232fbcbfe7af4974f70b0014c8b72a362633 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 2 Jun 2016 09:43:11 -0600 Subject: layers: Add getBufferViewInfo() helper Add helper function to core_validation for bufferViewMap look-ups and use the helper in DescriptorSet class. --- layers/core_validation.cpp | 14 +++++++++++--- layers/core_validation_types.h | 1 + layers/descriptor_sets.cpp | 31 ++++++++++++++----------------- layers/descriptor_sets.h | 2 -- 4 files changed, 26 insertions(+), 22 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 571cb009..844503dc 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -126,7 +126,7 @@ struct layer_data { unordered_map> samplerMap; unordered_map imageViewMap; unordered_map imageMap; - unordered_map bufferViewMap; + unordered_map> bufferViewMap; unordered_map> bufferMap; unordered_map pipelineMap; unordered_map commandPoolMap; @@ -269,6 +269,14 @@ BUFFER_NODE *getBufferNode(const layer_data *my_data, const VkBuffer buffer) { } return buff_it->second.get(); } +// Return buffer node ptr for specified buffer or else NULL +VkBufferViewCreateInfo *getBufferViewInfo(const layer_data *my_data, const VkBufferView buffer_view) { + auto bv_it = my_data->bufferViewMap.find(buffer_view); + if (bv_it == my_data->bufferViewMap.end()) { + return nullptr; + } + return bv_it->second.get(); +} static VkDeviceMemory *get_object_mem_binding(layer_data *my_data, uint64_t handle, VkDebugReportObjectTypeEXT type) { switch (type) { @@ -5420,7 +5428,7 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateBufferView(VkDevice device, const VkBufferV VkResult result = dev_data->device_dispatch_table->CreateBufferView(device, pCreateInfo, pAllocator, pView); if (VK_SUCCESS == result) { std::lock_guard lock(global_lock); - dev_data->bufferViewMap[*pView] = VkBufferViewCreateInfo(*pCreateInfo); + dev_data->bufferViewMap[*pView] = unique_ptr(new VkBufferViewCreateInfo(*pCreateInfo)); // In order to create a valid buffer view, the buffer must have been created with at least one of the // following flags: UNIFORM_TEXEL_BUFFER_BIT or STORAGE_TEXEL_BUFFER_BIT validate_buffer_usage_flags(dev_data, pCreateInfo->buffer, @@ -5877,7 +5885,7 @@ static void PostCallRecordAllocateDescriptorSets(layer_data *dev_data, const VkD // All the updates are contained in a single cvdescriptorset function cvdescriptorset::PerformAllocateDescriptorSets( pAllocateInfo, pDescriptorSets, common_data, &dev_data->descriptorPoolMap, &dev_data->setMap, dev_data, - dev_data->descriptorSetLayoutMap, dev_data->bufferViewMap, dev_data->samplerMap, dev_data->imageViewMap, dev_data->imageMap, + dev_data->descriptorSetLayoutMap, dev_data->samplerMap, dev_data->imageViewMap, dev_data->imageMap, dev_data->device_extensions.imageToSwapchainMap, dev_data->device_extensions.swapchainMap); } diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index 1516f41b..fd71b61f 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -488,6 +488,7 @@ struct layer_data; cvdescriptorset::DescriptorSet *getSetNode(const layer_data *, const VkDescriptorSet); BUFFER_NODE *getBufferNode(const layer_data *, const VkBuffer); DEVICE_MEM_INFO *getMemObjInfo(const layer_data *, const VkDeviceMemory); +VkBufferViewCreateInfo *getBufferViewInfo(const layer_data *, const VkBufferView); } #endif // CORE_VALIDATION_TYPES_H_ diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index 96133c5e..193a8b74 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -265,15 +265,14 @@ cvdescriptorset::AllocateDescriptorSetsData::AllocateDescriptorSetsData(uint32_t cvdescriptorset::DescriptorSet::DescriptorSet(const VkDescriptorSet set, const DescriptorSetLayout *layout, const core_validation::layer_data *dev_data, - const std::unordered_map *buffer_view_map, const std::unordered_map> *sampler_map, const std::unordered_map *image_view_map, const std::unordered_map *image_map, const std::unordered_map *image_to_swapchain_map, const std::unordered_map *swapchain_map) - : some_update_(false), set_(set), p_layout_(layout), device_data_(dev_data), buffer_view_map_(buffer_view_map), - sampler_map_(sampler_map), image_view_map_(image_view_map), image_map_(image_map), - image_to_swapchain_map_(image_to_swapchain_map), swapchain_map_(swapchain_map) { + : some_update_(false), set_(set), p_layout_(layout), device_data_(dev_data), sampler_map_(sampler_map), + image_view_map_(image_view_map), image_map_(image_map), image_to_swapchain_map_(image_to_swapchain_map), + swapchain_map_(swapchain_map) { // Foreach binding, create default descriptors of given type for (uint32_t i = 0; i < p_layout_->GetBindingCount(); ++i) { auto type = p_layout_->GetTypeFromIndex(i); @@ -434,9 +433,9 @@ uint32_t cvdescriptorset::DescriptorSet::GetStorageUpdates(const std::unordered_ for (uint32_t i = 0; i < p_layout_->GetDescriptorCountFromBinding(binding); ++i) { if (descriptors_[start_idx + i]->updated) { auto bufferview = static_cast(descriptors_[start_idx + i].get())->GetBufferView(); - const auto &buff_pair = buffer_view_map_->find(bufferview); - if (buff_pair != buffer_view_map_->end()) { - buffer_set->insert(buff_pair->second.buffer); + auto bv_info = getBufferViewInfo(device_data_, bufferview); + if (bv_info) { + buffer_set->insert(bv_info->buffer); num_updates++; } } @@ -1085,14 +1084,14 @@ bool cvdescriptorset::DescriptorSet::VerifyWriteUpdateContents(const VkWriteDesc case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: { for (uint32_t di = 0; di < update->descriptorCount; ++di) { auto buffer_view = update->pTexelBufferView[di]; - auto buffer_view_it = buffer_view_map_->find(buffer_view); - if (buffer_view_it == buffer_view_map_->end()) { + auto bv_info = getBufferViewInfo(device_data_, buffer_view); + if (!bv_info) { std::stringstream error_str; error_str << "Attempted write update to texel buffer descriptor with invalid buffer view: " << buffer_view; *error = error_str.str(); return false; } - auto buffer = buffer_view_it->second.buffer; + auto buffer = bv_info->buffer; if (!ValidateBufferUpdate(buffer, update->descriptorType, error)) { std::stringstream error_str; error_str << "Attempted write update to texel buffer descriptor failed due to: " << error->c_str(); @@ -1189,14 +1188,14 @@ bool cvdescriptorset::DescriptorSet::VerifyCopyUpdateContents(const VkCopyDescri case TexelBuffer: { for (uint32_t di = 0; di < update->descriptorCount; ++di) { auto buffer_view = static_cast(src_set->descriptors_[index + di].get())->GetBufferView(); - auto bv_it = buffer_view_map_->find(buffer_view); - if (bv_it == buffer_view_map_->end()) { + auto bv_info = getBufferViewInfo(device_data_, buffer_view); + if (!bv_info) { std::stringstream error_str; error_str << "Attempted copy update to texel buffer descriptor with invalid buffer view: " << buffer_view; *error = error_str.str(); return false; } - auto buffer = bv_it->second.buffer; + auto buffer = bv_info->buffer; if (!ValidateBufferUpdate(buffer, type, error)) { std::stringstream error_str; error_str << "Attempted copy update to texel buffer descriptor failed due to: " << error->c_str(); @@ -1288,7 +1287,6 @@ void cvdescriptorset::PerformAllocateDescriptorSets( const AllocateDescriptorSetsData *ds_data, std::unordered_map *pool_map, std::unordered_map *set_map, const core_validation::layer_data *dev_data, const std::unordered_map &layout_map, - const std::unordered_map &buffer_view_map, const std::unordered_map> &sampler_map, const std::unordered_map &image_view_map, const std::unordered_map &image_map, @@ -1304,9 +1302,8 @@ void cvdescriptorset::PerformAllocateDescriptorSets( * global map and the pool's set. */ for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) { - auto new_ds = - new cvdescriptorset::DescriptorSet(descriptor_sets[i], ds_data->layout_nodes[i], dev_data, &buffer_view_map, - &sampler_map, &image_view_map, &image_map, &image_to_swapchain_map, &swapchain_map); + auto new_ds = new cvdescriptorset::DescriptorSet(descriptor_sets[i], ds_data->layout_nodes[i], dev_data, &sampler_map, + &image_view_map, &image_map, &image_to_swapchain_map, &swapchain_map); pool_state->sets.insert(new_ds); new_ds->in_use.store(0); diff --git a/layers/descriptor_sets.h b/layers/descriptor_sets.h index 193ef75e..fcb409cc 100644 --- a/layers/descriptor_sets.h +++ b/layers/descriptor_sets.h @@ -269,7 +269,6 @@ void PerformAllocateDescriptorSets(const VkDescriptorSetAllocateInfo *, const Vk std::unordered_map *, const core_validation::layer_data *, const std::unordered_map &, - const std::unordered_map &, const std::unordered_map> &, const std::unordered_map &, const std::unordered_map &, @@ -298,7 +297,6 @@ class DescriptorSet : public BASE_NODE { public: using BASE_NODE::in_use; DescriptorSet(const VkDescriptorSet, const DescriptorSetLayout *, const core_validation::layer_data *, - const std::unordered_map *, const std::unordered_map> *, const std::unordered_map *, const std::unordered_map *, const std::unordered_map *, -- cgit v1.2.3 From 50414339385babe11cfdf08b2b4d3bdd3ee73277 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 2 Jun 2016 10:08:53 -0600 Subject: layers: Add getSamplerNode() helper Kill sampler_map_ in DescriptorSet and add getSamplerNode() helper and use it instead. --- layers/core_validation.cpp | 10 +++++++++- layers/core_validation_types.h | 1 + layers/descriptor_sets.cpp | 24 ++++++++++-------------- layers/descriptor_sets.h | 6 +----- 4 files changed, 21 insertions(+), 20 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 844503dc..2f4a5e82 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -261,6 +261,14 @@ struct shader_module { // TODO : This can be much smarter, using separate locks for separate global data static std::mutex global_lock; +// Return sampler node ptr for specified sampler or else NULL +SAMPLER_NODE *getSamplerNode(const layer_data *my_data, const VkSampler sampler) { + auto sampler_it = my_data->samplerMap.find(sampler); + if (sampler_it == my_data->samplerMap.end()) { + return nullptr; + } + return sampler_it->second.get(); +} // Return buffer node ptr for specified buffer or else NULL BUFFER_NODE *getBufferNode(const layer_data *my_data, const VkBuffer buffer) { auto buff_it = my_data->bufferMap.find(buffer); @@ -5885,7 +5893,7 @@ static void PostCallRecordAllocateDescriptorSets(layer_data *dev_data, const VkD // All the updates are contained in a single cvdescriptorset function cvdescriptorset::PerformAllocateDescriptorSets( pAllocateInfo, pDescriptorSets, common_data, &dev_data->descriptorPoolMap, &dev_data->setMap, dev_data, - dev_data->descriptorSetLayoutMap, dev_data->samplerMap, dev_data->imageViewMap, dev_data->imageMap, + dev_data->descriptorSetLayoutMap, dev_data->imageViewMap, dev_data->imageMap, dev_data->device_extensions.imageToSwapchainMap, dev_data->device_extensions.swapchainMap); } diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index fd71b61f..e915ade7 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -489,6 +489,7 @@ cvdescriptorset::DescriptorSet *getSetNode(const layer_data *, const VkDescripto BUFFER_NODE *getBufferNode(const layer_data *, const VkBuffer); DEVICE_MEM_INFO *getMemObjInfo(const layer_data *, const VkDeviceMemory); VkBufferViewCreateInfo *getBufferViewInfo(const layer_data *, const VkBufferView); +SAMPLER_NODE *getSamplerNode(const layer_data *, const VkSampler); } #endif // CORE_VALIDATION_TYPES_H_ diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index 193a8b74..ed25030f 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -265,14 +265,12 @@ cvdescriptorset::AllocateDescriptorSetsData::AllocateDescriptorSetsData(uint32_t cvdescriptorset::DescriptorSet::DescriptorSet(const VkDescriptorSet set, const DescriptorSetLayout *layout, const core_validation::layer_data *dev_data, - const std::unordered_map> *sampler_map, const std::unordered_map *image_view_map, const std::unordered_map *image_map, const std::unordered_map *image_to_swapchain_map, const std::unordered_map *swapchain_map) - : some_update_(false), set_(set), p_layout_(layout), device_data_(dev_data), sampler_map_(sampler_map), - image_view_map_(image_view_map), image_map_(image_map), image_to_swapchain_map_(image_to_swapchain_map), - swapchain_map_(swapchain_map) { + : some_update_(false), set_(set), p_layout_(layout), device_data_(dev_data), image_view_map_(image_view_map), + image_map_(image_map), image_to_swapchain_map_(image_to_swapchain_map), swapchain_map_(swapchain_map) { // Foreach binding, create default descriptors of given type for (uint32_t i = 0; i < p_layout_->GetBindingCount(); ++i) { auto type = p_layout_->GetTypeFromIndex(i); @@ -580,10 +578,9 @@ cvdescriptorset::SamplerDescriptor::SamplerDescriptor(const VkSampler *immut) : updated = true; } } - -bool cvdescriptorset::ValidateSampler(const VkSampler sampler, - const std::unordered_map> *sampler_map) { - return (sampler_map->count(sampler) != 0); +// Validate given sampler. Currently this only checks to make sure it exists in the samplerMap +bool cvdescriptorset::ValidateSampler(const VkSampler sampler, const core_validation::layer_data *dev_data) { + return (getSamplerNode(dev_data, sampler) != nullptr); } bool cvdescriptorset::ValidateImageUpdate(VkImageView image_view, VkImageLayout image_layout, VkDescriptorType type, @@ -1051,7 +1048,7 @@ bool cvdescriptorset::DescriptorSet::VerifyWriteUpdateContents(const VkWriteDesc case VK_DESCRIPTOR_TYPE_SAMPLER: { for (uint32_t di = 0; di < update->descriptorCount; ++di) { if (!descriptors_[index + di].get()->IsImmutableSampler()) { - if (!ValidateSampler(update->pImageInfo[di].sampler, sampler_map_)) { + if (!ValidateSampler(update->pImageInfo[di].sampler, device_data_)) { std::stringstream error_str; error_str << "Attempted write update to sampler descriptor with invalid sampler: " << update->pImageInfo[di].sampler << "."; @@ -1131,7 +1128,7 @@ bool cvdescriptorset::DescriptorSet::VerifyCopyUpdateContents(const VkCopyDescri for (uint32_t di = 0; di < update->descriptorCount; ++di) { if (!src_set->descriptors_[index + di]->IsImmutableSampler()) { auto update_sampler = static_cast(src_set->descriptors_[index + di].get())->GetSampler(); - if (!ValidateSampler(update_sampler, sampler_map_)) { + if (!ValidateSampler(update_sampler, device_data_)) { std::stringstream error_str; error_str << "Attempted copy update to sampler descriptor with invalid sampler: " << update_sampler << "."; *error = error_str.str(); @@ -1149,7 +1146,7 @@ bool cvdescriptorset::DescriptorSet::VerifyCopyUpdateContents(const VkCopyDescri // First validate sampler if (!img_samp_desc->IsImmutableSampler()) { auto update_sampler = img_samp_desc->GetSampler(); - if (!ValidateSampler(update_sampler, sampler_map_)) { + if (!ValidateSampler(update_sampler, device_data_)) { std::stringstream error_str; error_str << "Attempted copy update to sampler descriptor with invalid sampler: " << update_sampler << "."; *error = error_str.str(); @@ -1287,7 +1284,6 @@ void cvdescriptorset::PerformAllocateDescriptorSets( const AllocateDescriptorSetsData *ds_data, std::unordered_map *pool_map, std::unordered_map *set_map, const core_validation::layer_data *dev_data, const std::unordered_map &layout_map, - const std::unordered_map> &sampler_map, const std::unordered_map &image_view_map, const std::unordered_map &image_map, const std::unordered_map &image_to_swapchain_map, @@ -1302,8 +1298,8 @@ void cvdescriptorset::PerformAllocateDescriptorSets( * global map and the pool's set. */ for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) { - auto new_ds = new cvdescriptorset::DescriptorSet(descriptor_sets[i], ds_data->layout_nodes[i], dev_data, &sampler_map, - &image_view_map, &image_map, &image_to_swapchain_map, &swapchain_map); + auto new_ds = new cvdescriptorset::DescriptorSet(descriptor_sets[i], ds_data->layout_nodes[i], dev_data, &image_view_map, + &image_map, &image_to_swapchain_map, &swapchain_map); pool_state->sets.insert(new_ds); new_ds->in_use.store(0); diff --git a/layers/descriptor_sets.h b/layers/descriptor_sets.h index fcb409cc..eddbff32 100644 --- a/layers/descriptor_sets.h +++ b/layers/descriptor_sets.h @@ -160,7 +160,7 @@ class Descriptor { }; // Shared helper functions - These are useful because the shared sampler image descriptor type // performs common functions with both sampler and image descriptors so they can share their common functions -bool ValidateSampler(const VkSampler, const std::unordered_map> *); +bool ValidateSampler(const VkSampler, const core_validation::layer_data *); bool ValidateImageUpdate(VkImageView, VkImageLayout, VkDescriptorType, const std::unordered_map *, const std::unordered_map *, const std::unordered_map *, @@ -269,7 +269,6 @@ void PerformAllocateDescriptorSets(const VkDescriptorSetAllocateInfo *, const Vk std::unordered_map *, const core_validation::layer_data *, const std::unordered_map &, - const std::unordered_map> &, const std::unordered_map &, const std::unordered_map &, const std::unordered_map &, @@ -297,7 +296,6 @@ class DescriptorSet : public BASE_NODE { public: using BASE_NODE::in_use; DescriptorSet(const VkDescriptorSet, const DescriptorSetLayout *, const core_validation::layer_data *, - const std::unordered_map> *, const std::unordered_map *, const std::unordered_map *, const std::unordered_map *, const std::unordered_map *); @@ -377,8 +375,6 @@ class DescriptorSet : public BASE_NODE { std::vector> descriptors_; // Ptrs to object containers to verify bound data const core_validation::layer_data *device_data_; - const std::unordered_map *buffer_view_map_; - const std::unordered_map> *sampler_map_; const std::unordered_map *image_view_map_; // TODO : For next 3 maps all we really need (currently) is an image to format mapping const std::unordered_map *image_map_; -- cgit v1.2.3 From 402540ef8a1ea7df6a48130409714cddcb803d07 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 2 Jun 2016 10:54:09 -0600 Subject: layers: Add getImageViewData() helper Switch imageViewMap to store unique_ptrs. Add getImageViewDate() helper to core_validation and update DescriptorSet to use it. --- layers/core_validation.cpp | 79 +++++++++++++++++++++++------------------- layers/core_validation_types.h | 1 + layers/descriptor_sets.cpp | 28 +++++++-------- layers/descriptor_sets.h | 8 ++--- 4 files changed, 59 insertions(+), 57 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 2f4a5e82..e7aa6dbf 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -124,7 +124,7 @@ struct layer_data { unordered_set globalInFlightCmdBuffers; // Layer specific data unordered_map> samplerMap; - unordered_map imageViewMap; + unordered_map> imageViewMap; unordered_map imageMap; unordered_map> bufferViewMap; unordered_map> bufferMap; @@ -261,18 +261,26 @@ struct shader_module { // TODO : This can be much smarter, using separate locks for separate global data static std::mutex global_lock; +// Return ImageViewCreateInfo ptr for specified imageView or else NULL +VkImageViewCreateInfo *getImageViewData(const layer_data *dev_data, const VkImageView image_view) { + auto iv_it = dev_data->imageViewMap.find(image_view); + if (iv_it == dev_data->imageViewMap.end()) { + return nullptr; + } + return iv_it->second.get(); +} // Return sampler node ptr for specified sampler or else NULL -SAMPLER_NODE *getSamplerNode(const layer_data *my_data, const VkSampler sampler) { - auto sampler_it = my_data->samplerMap.find(sampler); - if (sampler_it == my_data->samplerMap.end()) { +SAMPLER_NODE *getSamplerNode(const layer_data *dev_data, const VkSampler sampler) { + auto sampler_it = dev_data->samplerMap.find(sampler); + if (sampler_it == dev_data->samplerMap.end()) { return nullptr; } return sampler_it->second.get(); } // Return buffer node ptr for specified buffer or else NULL -BUFFER_NODE *getBufferNode(const layer_data *my_data, const VkBuffer buffer) { - auto buff_it = my_data->bufferMap.find(buffer); - if (buff_it == my_data->bufferMap.end()) { +BUFFER_NODE *getBufferNode(const layer_data *dev_data, const VkBuffer buffer) { + auto buff_it = dev_data->bufferMap.find(buffer); + if (buff_it == dev_data->bufferMap.end()) { return nullptr; } return buff_it->second.get(); @@ -3385,10 +3393,10 @@ template void SetLayout(OBJECT *pObject, VkImage im } void SetLayout(const layer_data *dev_data, GLOBAL_CB_NODE *pCB, VkImageView imageView, const VkImageLayout &layout) { - auto image_view_data = dev_data->imageViewMap.find(imageView); - assert(image_view_data != dev_data->imageViewMap.end()); - const VkImage &image = image_view_data->second.image; - const VkImageSubresourceRange &subRange = image_view_data->second.subresourceRange; + auto iv_data = getImageViewData(dev_data, imageView); + assert(iv_data); + const VkImage &image = iv_data->image; + const VkImageSubresourceRange &subRange = iv_data->subresourceRange; // TODO: Do not iterate over every possibility - consolidate where possible for (uint32_t j = 0; j < subRange.levelCount; j++) { uint32_t level = subRange.baseMipLevel + j; @@ -5523,9 +5531,8 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateImageView(VkDevice device, const VkImageVie if (VK_SUCCESS == result) { std::lock_guard lock(global_lock); - VkImageViewCreateInfo localCI = VkImageViewCreateInfo(*pCreateInfo); - ResolveRemainingLevelsLayers(dev_data, &localCI.subresourceRange, pCreateInfo->image); - dev_data->imageViewMap[*pView] = localCI; + dev_data->imageViewMap[*pView] = unique_ptr(new VkImageViewCreateInfo(*pCreateInfo)); + ResolveRemainingLevelsLayers(dev_data, &dev_data->imageViewMap[*pView].get()->subresourceRange, pCreateInfo->image); } return result; @@ -5891,10 +5898,10 @@ static void PostCallRecordAllocateDescriptorSets(layer_data *dev_data, const VkD VkDescriptorSet *pDescriptorSets, const cvdescriptorset::AllocateDescriptorSetsData *common_data) { // All the updates are contained in a single cvdescriptorset function - cvdescriptorset::PerformAllocateDescriptorSets( - pAllocateInfo, pDescriptorSets, common_data, &dev_data->descriptorPoolMap, &dev_data->setMap, dev_data, - dev_data->descriptorSetLayoutMap, dev_data->imageViewMap, dev_data->imageMap, - dev_data->device_extensions.imageToSwapchainMap, dev_data->device_extensions.swapchainMap); + cvdescriptorset::PerformAllocateDescriptorSets(pAllocateInfo, pDescriptorSets, common_data, &dev_data->descriptorPoolMap, + &dev_data->setMap, dev_data, dev_data->descriptorSetLayoutMap, + dev_data->imageMap, dev_data->device_extensions.imageToSwapchainMap, + dev_data->device_extensions.swapchainMap); } VKAPI_ATTR VkResult VKAPI_CALL @@ -6676,10 +6683,10 @@ static bool markStoreImagesAndBuffersAsWritten(layer_data *dev_data, GLOBAL_CB_N bool skip_call = false; for (auto imageView : pCB->updateImages) { - auto iv_data = dev_data->imageViewMap.find(imageView); - if (iv_data == dev_data->imageViewMap.end()) + auto iv_data = getImageViewData(dev_data, imageView); + if (!iv_data) continue; - VkImage image = iv_data->second.image; + VkImage image = iv_data->image; VkDeviceMemory mem; skip_call |= get_mem_binding_from_object(dev_data, (uint64_t)image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, &mem); @@ -8126,14 +8133,14 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFrameb } for (uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i) { VkImageView view = pCreateInfo->pAttachments[i]; - auto view_data = dev_data->imageViewMap.find(view); - if (view_data == dev_data->imageViewMap.end()) { + auto view_data = getImageViewData(dev_data, view); + if (!view_data) { continue; } MT_FB_ATTACHMENT_INFO fb_info; - get_mem_binding_from_object(dev_data, (uint64_t)(view_data->second.image), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + get_mem_binding_from_object(dev_data, (uint64_t)(view_data->image), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, &fb_info.mem); - fb_info.image = view_data->second.image; + fb_info.image = view_data->image; fbNode.attachments.push_back(fb_info); } } @@ -8258,19 +8265,19 @@ static bool ValidateDependencies(const layer_data *my_data, FRAMEBUFFER_NODE con overlapping_attachments[j].push_back(i); continue; } - auto view_data_i = my_data->imageViewMap.find(viewi); - auto view_data_j = my_data->imageViewMap.find(viewj); - if (view_data_i == my_data->imageViewMap.end() || view_data_j == my_data->imageViewMap.end()) { + auto view_data_i = getImageViewData(my_data, viewi); + auto view_data_j = getImageViewData(my_data, viewj); + if (!view_data_i || !view_data_j) { continue; } - if (view_data_i->second.image == view_data_j->second.image && - isRegionOverlapping(view_data_i->second.subresourceRange, view_data_j->second.subresourceRange)) { + if (view_data_i->image == view_data_j->image && + isRegionOverlapping(view_data_i->subresourceRange, view_data_j->subresourceRange)) { overlapping_attachments[i].push_back(j); overlapping_attachments[j].push_back(i); continue; } - auto image_data_i = my_data->imageMap.find(view_data_i->second.image); - auto image_data_j = my_data->imageMap.find(view_data_j->second.image); + auto image_data_i = my_data->imageMap.find(view_data_i->image); + auto image_data_j = my_data->imageMap.find(view_data_j->image); if (image_data_i == my_data->imageMap.end() || image_data_j == my_data->imageMap.end()) { continue; } @@ -8723,10 +8730,10 @@ static bool VerifyFramebufferAndRenderPassLayouts(layer_data *dev_data, GLOBAL_C } for (uint32_t i = 0; i < pRenderPassInfo->attachmentCount; ++i) { const VkImageView &image_view = framebufferInfo.pAttachments[i]; - auto image_data = dev_data->imageViewMap.find(image_view); - assert(image_data != dev_data->imageViewMap.end()); - const VkImage &image = image_data->second.image; - const VkImageSubresourceRange &subRange = image_data->second.subresourceRange; + auto image_data = getImageViewData(dev_data, image_view); + assert(image_data); + const VkImage &image = image_data->image; + const VkImageSubresourceRange &subRange = image_data->subresourceRange; IMAGE_CMD_BUF_LAYOUT_NODE newNode = {pRenderPassInfo->pAttachments[i].initialLayout, pRenderPassInfo->pAttachments[i].initialLayout}; // TODO: Do not iterate over every possibility - consolidate where possible diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index e915ade7..e6dcdc85 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -490,6 +490,7 @@ BUFFER_NODE *getBufferNode(const layer_data *, const VkBuffer); DEVICE_MEM_INFO *getMemObjInfo(const layer_data *, const VkDeviceMemory); VkBufferViewCreateInfo *getBufferViewInfo(const layer_data *, const VkBufferView); SAMPLER_NODE *getSamplerNode(const layer_data *, const VkSampler); +VkImageViewCreateInfo *getImageViewData(const layer_data *, const VkImageView); } #endif // CORE_VALIDATION_TYPES_H_ diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index ed25030f..e3f6e9d4 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -265,12 +265,11 @@ cvdescriptorset::AllocateDescriptorSetsData::AllocateDescriptorSetsData(uint32_t cvdescriptorset::DescriptorSet::DescriptorSet(const VkDescriptorSet set, const DescriptorSetLayout *layout, const core_validation::layer_data *dev_data, - const std::unordered_map *image_view_map, const std::unordered_map *image_map, const std::unordered_map *image_to_swapchain_map, const std::unordered_map *swapchain_map) - : some_update_(false), set_(set), p_layout_(layout), device_data_(dev_data), image_view_map_(image_view_map), - image_map_(image_map), image_to_swapchain_map_(image_to_swapchain_map), swapchain_map_(swapchain_map) { + : some_update_(false), set_(set), p_layout_(layout), device_data_(dev_data), image_map_(image_map), + image_to_swapchain_map_(image_to_swapchain_map), swapchain_map_(swapchain_map) { // Foreach binding, create default descriptors of given type for (uint32_t i = 0; i < p_layout_->GetBindingCount(); ++i) { auto type = p_layout_->GetTypeFromIndex(i); @@ -584,13 +583,13 @@ bool cvdescriptorset::ValidateSampler(const VkSampler sampler, const core_valida } bool cvdescriptorset::ValidateImageUpdate(VkImageView image_view, VkImageLayout image_layout, VkDescriptorType type, - const std::unordered_map *image_view_map, + const core_validation::layer_data *dev_data, const std::unordered_map *image_map, const std::unordered_map *image_to_swapchain_map, const std::unordered_map *swapchain_map, std::string *error) { - auto image_pair = image_view_map->find(image_view); - if (image_pair == image_view_map->end()) { + auto iv_data = getImageViewData(dev_data, image_view); + if (!iv_data) { std::stringstream error_str; error_str << "Invalid VkImageView: " << image_view; *error = error_str.str(); @@ -598,8 +597,8 @@ bool cvdescriptorset::ValidateImageUpdate(VkImageView image_view, VkImageLayout } // Validate that imageLayout is compatible with aspect_mask and image format // and validate that image usage bits are correct for given usage - VkImageAspectFlags aspect_mask = image_pair->second.subresourceRange.aspectMask; - VkImage image = image_pair->second.image; + VkImageAspectFlags aspect_mask = iv_data->subresourceRange.aspectMask; + VkImage image = iv_data->image; VkFormat format = VK_FORMAT_MAX_ENUM; VkImageUsageFlags usage = 0; auto img_pair = image_map->find(image); @@ -1035,7 +1034,7 @@ bool cvdescriptorset::DescriptorSet::VerifyWriteUpdateContents(const VkWriteDesc // Validate image auto image_view = update->pImageInfo[di].imageView; auto image_layout = update->pImageInfo[di].imageLayout; - if (!ValidateImageUpdate(image_view, image_layout, update->descriptorType, image_view_map_, image_map_, + if (!ValidateImageUpdate(image_view, image_layout, update->descriptorType, device_data_, image_map_, image_to_swapchain_map_, swapchain_map_, error)) { std::stringstream error_str; error_str << "Attempted write update to combined image sampler descriptor failed due to: " << error->c_str(); @@ -1067,7 +1066,7 @@ bool cvdescriptorset::DescriptorSet::VerifyWriteUpdateContents(const VkWriteDesc for (uint32_t di = 0; di < update->descriptorCount; ++di) { auto image_view = update->pImageInfo[di].imageView; auto image_layout = update->pImageInfo[di].imageLayout; - if (!ValidateImageUpdate(image_view, image_layout, update->descriptorType, image_view_map_, image_map_, + if (!ValidateImageUpdate(image_view, image_layout, update->descriptorType, device_data_, image_map_, image_to_swapchain_map_, swapchain_map_, error)) { std::stringstream error_str; error_str << "Attempted write update to image descriptor failed due to: " << error->c_str(); @@ -1158,7 +1157,7 @@ bool cvdescriptorset::DescriptorSet::VerifyCopyUpdateContents(const VkCopyDescri // Validate image auto image_view = img_samp_desc->GetImageView(); auto image_layout = img_samp_desc->GetImageLayout(); - if (!ValidateImageUpdate(image_view, image_layout, type, image_view_map_, image_map_, image_to_swapchain_map_, + if (!ValidateImageUpdate(image_view, image_layout, type, device_data_, image_map_, image_to_swapchain_map_, swapchain_map_, error)) { std::stringstream error_str; error_str << "Attempted copy update to combined image sampler descriptor failed due to: " << error->c_str(); @@ -1172,7 +1171,7 @@ bool cvdescriptorset::DescriptorSet::VerifyCopyUpdateContents(const VkCopyDescri auto img_desc = static_cast(src_set->descriptors_[index + di].get()); auto image_view = img_desc->GetImageView(); auto image_layout = img_desc->GetImageLayout(); - if (!ValidateImageUpdate(image_view, image_layout, type, image_view_map_, image_map_, image_to_swapchain_map_, + if (!ValidateImageUpdate(image_view, image_layout, type, device_data_, image_map_, image_to_swapchain_map_, swapchain_map_, error)) { std::stringstream error_str; error_str << "Attempted copy update to image descriptor failed due to: " << error->c_str(); @@ -1284,7 +1283,6 @@ void cvdescriptorset::PerformAllocateDescriptorSets( const AllocateDescriptorSetsData *ds_data, std::unordered_map *pool_map, std::unordered_map *set_map, const core_validation::layer_data *dev_data, const std::unordered_map &layout_map, - const std::unordered_map &image_view_map, const std::unordered_map &image_map, const std::unordered_map &image_to_swapchain_map, const std::unordered_map &swapchain_map) { @@ -1298,8 +1296,8 @@ void cvdescriptorset::PerformAllocateDescriptorSets( * global map and the pool's set. */ for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) { - auto new_ds = new cvdescriptorset::DescriptorSet(descriptor_sets[i], ds_data->layout_nodes[i], dev_data, &image_view_map, - &image_map, &image_to_swapchain_map, &swapchain_map); + auto new_ds = new cvdescriptorset::DescriptorSet(descriptor_sets[i], ds_data->layout_nodes[i], dev_data, &image_map, + &image_to_swapchain_map, &swapchain_map); pool_state->sets.insert(new_ds); new_ds->in_use.store(0); diff --git a/layers/descriptor_sets.h b/layers/descriptor_sets.h index eddbff32..16763f84 100644 --- a/layers/descriptor_sets.h +++ b/layers/descriptor_sets.h @@ -161,8 +161,7 @@ class Descriptor { // Shared helper functions - These are useful because the shared sampler image descriptor type // performs common functions with both sampler and image descriptors so they can share their common functions bool ValidateSampler(const VkSampler, const core_validation::layer_data *); -bool ValidateImageUpdate(VkImageView, VkImageLayout, VkDescriptorType, - const std::unordered_map *, +bool ValidateImageUpdate(VkImageView, VkImageLayout, VkDescriptorType, const core_validation::layer_data *, const std::unordered_map *, const std::unordered_map *, const std::unordered_map *, std::string *); @@ -269,7 +268,6 @@ void PerformAllocateDescriptorSets(const VkDescriptorSetAllocateInfo *, const Vk std::unordered_map *, const core_validation::layer_data *, const std::unordered_map &, - const std::unordered_map &, const std::unordered_map &, const std::unordered_map &, const std::unordered_map &); @@ -296,8 +294,7 @@ class DescriptorSet : public BASE_NODE { public: using BASE_NODE::in_use; DescriptorSet(const VkDescriptorSet, const DescriptorSetLayout *, const core_validation::layer_data *, - const std::unordered_map *, const std::unordered_map *, - const std::unordered_map *, + const std::unordered_map *, const std::unordered_map *, const std::unordered_map *); ~DescriptorSet(); // A number of common Get* functions that return data based on layout from which this set was created @@ -375,7 +372,6 @@ class DescriptorSet : public BASE_NODE { std::vector> descriptors_; // Ptrs to object containers to verify bound data const core_validation::layer_data *device_data_; - const std::unordered_map *image_view_map_; // TODO : For next 3 maps all we really need (currently) is an image to format mapping const std::unordered_map *image_map_; const std::unordered_map *image_to_swapchain_map_; -- cgit v1.2.3 From 920ff191e83225ae7d8cecc6ed8f6c7f38487450 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 2 Jun 2016 11:49:22 -0600 Subject: layers: Add getImageNode() helper Add getImageNode() helper to core_validation and use it. Also update DescriptorSet class to use the helper and kill its image_map member. --- layers/core_validation.cpp | 126 ++++++++++++++++++++++------------------- layers/core_validation_types.h | 1 + layers/descriptor_sets.cpp | 33 +++++------ layers/descriptor_sets.h | 6 +- 4 files changed, 86 insertions(+), 80 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index e7aa6dbf..a117ed72 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -125,7 +125,7 @@ struct layer_data { // Layer specific data unordered_map> samplerMap; unordered_map> imageViewMap; - unordered_map imageMap; + unordered_map> imageMap; unordered_map> bufferViewMap; unordered_map> bufferMap; unordered_map pipelineMap; @@ -277,6 +277,14 @@ SAMPLER_NODE *getSamplerNode(const layer_data *dev_data, const VkSampler sampler } return sampler_it->second.get(); } +// Return image node ptr for specified image or else NULL +IMAGE_NODE *getImageNode(const layer_data *dev_data, const VkImage image) { + auto img_it = dev_data->imageMap.find(image); + if (img_it == dev_data->imageMap.end()) { + return nullptr; + } + return img_it->second.get(); +} // Return buffer node ptr for specified buffer or else NULL BUFFER_NODE *getBufferNode(const layer_data *dev_data, const VkBuffer buffer) { auto buff_it = dev_data->bufferMap.find(buffer); @@ -297,9 +305,9 @@ VkBufferViewCreateInfo *getBufferViewInfo(const layer_data *my_data, const VkBuf static VkDeviceMemory *get_object_mem_binding(layer_data *my_data, uint64_t handle, VkDebugReportObjectTypeEXT type) { switch (type) { case VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT: { - auto it = my_data->imageMap.find(VkImage(handle)); - if (it != my_data->imageMap.end()) - return &(*it).second.mem; + auto img_node = getImageNode(my_data, VkImage(handle)); + if (img_node) + return &img_node->mem; break; } case VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT: { @@ -345,9 +353,9 @@ static bool validate_usage_flags(layer_data *my_data, VkFlags actual, VkFlags de static bool validate_image_usage_flags(layer_data *dev_data, VkImage image, VkFlags desired, VkBool32 strict, char const *func_name, char const *usage_string) { bool skipCall = false; - auto const image_node = dev_data->imageMap.find(image); - if (image_node != dev_data->imageMap.end()) { - skipCall = validate_usage_flags(dev_data, image_node->second.createInfo.usage, desired, strict, (uint64_t)image, + auto const image_node = getImageNode(dev_data, image); + if (image_node) { + skipCall = validate_usage_flags(dev_data, image_node->createInfo.usage, desired, strict, (uint64_t)image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, "image", func_name, usage_string); } return skipCall; @@ -387,8 +395,8 @@ static void add_mem_obj_info(layer_data *my_data, void *object, const VkDeviceMe static bool validate_memory_is_valid(layer_data *dev_data, VkDeviceMemory mem, const char *functionName, VkImage image = VK_NULL_HANDLE) { if (mem == MEMTRACKER_SWAP_CHAIN_IMAGE_KEY) { - auto const image_node = dev_data->imageMap.find(image); - if (image_node != dev_data->imageMap.end() && !image_node->second.valid) { + auto const image_node = getImageNode(dev_data, image); + if (image_node && !image_node->valid) { return log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, (uint64_t)(mem), __LINE__, MEMTRACK_INVALID_USAGE_FLAG, "MEM", "%s: Cannot read invalid swapchain image 0x%" PRIx64 ", please fill the memory before using.", @@ -408,9 +416,9 @@ static bool validate_memory_is_valid(layer_data *dev_data, VkDeviceMemory mem, c static void set_memory_valid(layer_data *dev_data, VkDeviceMemory mem, bool valid, VkImage image = VK_NULL_HANDLE) { if (mem == MEMTRACKER_SWAP_CHAIN_IMAGE_KEY) { - auto image_node = dev_data->imageMap.find(image); - if (image_node != dev_data->imageMap.end()) { - image_node->second.valid = valid; + auto image_node = getImageNode(dev_data, image); + if (image_node) { + image_node->valid = valid; } } else { DEVICE_MEM_INFO *pMemObj = getMemObjInfo(dev_data, mem); @@ -620,9 +628,9 @@ static bool set_mem_binding(layer_data *dev_data, VkDeviceMemory mem, uint64_t h // For image objects, make sure default memory state is correctly set // TODO : What's the best/correct way to handle this? if (VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT == type) { - auto const image_node = dev_data->imageMap.find(VkImage(handle)); - if (image_node != dev_data->imageMap.end()) { - VkImageCreateInfo ici = image_node->second.createInfo; + auto const image_node = getImageNode(dev_data, VkImage(handle)); + if (image_node) { + VkImageCreateInfo ici = image_node->createInfo; if (ici.usage & (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)) { // TODO:: More memory state transition stuff. } @@ -3311,13 +3319,13 @@ bool FindLayouts(const layer_data *my_data, VkImage image, std::vectorimageSubresourceMap.find(image); if (sub_data == my_data->imageSubresourceMap.end()) return false; - auto imgIt = my_data->imageMap.find(image); - if (imgIt == my_data->imageMap.end()) + auto img_node = getImageNode(my_data, image); + if (!img_node) return false; bool ignoreGlobal = false; // TODO: Make this robust for >1 aspect mask. Now it will just say ignore // potential errors in this case. - if (sub_data->second.size() >= (imgIt->second.createInfo.arrayLayers * imgIt->second.createInfo.mipLevels + 1)) { + if (sub_data->second.size() >= (img_node->createInfo.arrayLayers * img_node->createInfo.mipLevels + 1)) { ignoreGlobal = true; } for (auto imgsubpair : sub_data->second) { @@ -5068,9 +5076,9 @@ VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const Vk const auto &imageEntry = dev_data->imageMap.find(image); if (imageEntry != dev_data->imageMap.end()) { // Clean up memory mapping, bindings and range references for image - auto mem_info = getMemObjInfo(dev_data, imageEntry->second.mem); + auto mem_info = getMemObjInfo(dev_data, imageEntry->second.get()->mem); if (mem_info) { - remove_memory_ranges(reinterpret_cast(image), imageEntry->second.mem, mem_info->imageRanges); + remove_memory_ranges(reinterpret_cast(image), imageEntry->second.get()->mem, mem_info->imageRanges); clear_object_binding(dev_data, reinterpret_cast(image), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT); mem_info->image = VK_NULL_HANDLE; } @@ -5465,7 +5473,7 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateI IMAGE_LAYOUT_NODE image_node; image_node.layout = pCreateInfo->initialLayout; image_node.format = pCreateInfo->format; - dev_data->imageMap.insert(std::make_pair(*pImage, IMAGE_NODE(pCreateInfo))); + dev_data->imageMap.insert(std::make_pair(*pImage, unique_ptr(new IMAGE_NODE(pCreateInfo)))); ImageSubresourcePair subpair = {*pImage, false, VkImageSubresource()}; dev_data->imageSubresourceMap[*pImage].push_back(subpair); dev_data->imageLayoutMap[subpair] = image_node; @@ -5476,18 +5484,18 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateImage(VkDevice device, const VkImageCreateI static void ResolveRemainingLevelsLayers(layer_data *dev_data, VkImageSubresourceRange *range, VkImage image) { /* expects global_lock to be held by caller */ - auto image_node_it = dev_data->imageMap.find(image); - if (image_node_it != dev_data->imageMap.end()) { + auto image_node = getImageNode(dev_data, image); + if (image_node) { /* If the caller used the special values VK_REMAINING_MIP_LEVELS and * VK_REMAINING_ARRAY_LAYERS, resolve them now in our internal state to * the actual values. */ if (range->levelCount == VK_REMAINING_MIP_LEVELS) { - range->levelCount = image_node_it->second.createInfo.mipLevels - range->baseMipLevel; + range->levelCount = image_node->createInfo.mipLevels - range->baseMipLevel; } if (range->layerCount == VK_REMAINING_ARRAY_LAYERS) { - range->layerCount = image_node_it->second.createInfo.arrayLayers - range->baseArrayLayer; + range->layerCount = image_node->createInfo.arrayLayers - range->baseArrayLayer; } } } @@ -5500,13 +5508,13 @@ static void ResolveRemainingLevelsLayers(layer_data *dev_data, uint32_t *levels, *levels = range.levelCount; *layers = range.layerCount; - auto image_node_it = dev_data->imageMap.find(image); - if (image_node_it != dev_data->imageMap.end()) { + auto image_node = getImageNode(dev_data, image); + if (image_node) { if (range.levelCount == VK_REMAINING_MIP_LEVELS) { - *levels = image_node_it->second.createInfo.mipLevels - range.baseMipLevel; + *levels = image_node->createInfo.mipLevels - range.baseMipLevel; } if (range.layerCount == VK_REMAINING_ARRAY_LAYERS) { - *layers = image_node_it->second.createInfo.arrayLayers - range.baseArrayLayer; + *layers = image_node->createInfo.arrayLayers - range.baseArrayLayer; } } } @@ -5900,7 +5908,7 @@ static void PostCallRecordAllocateDescriptorSets(layer_data *dev_data, const VkD // All the updates are contained in a single cvdescriptorset function cvdescriptorset::PerformAllocateDescriptorSets(pAllocateInfo, pDescriptorSets, common_data, &dev_data->descriptorPoolMap, &dev_data->setMap, dev_data, dev_data->descriptorSetLayoutMap, - dev_data->imageMap, dev_data->device_extensions.imageToSwapchainMap, + dev_data->device_extensions.imageToSwapchainMap, dev_data->device_extensions.swapchainMap); } @@ -7581,11 +7589,11 @@ static bool ValidateBarriers(const char *funcName, VkCommandBuffer cmdBuffer, ui } for (uint32_t i = 0; i < imageMemBarrierCount; ++i) { auto mem_barrier = &pImageMemBarriers[i]; - auto image_data = dev_data->imageMap.find(mem_barrier->image); - if (image_data != dev_data->imageMap.end()) { + auto image_data = getImageNode(dev_data, mem_barrier->image); + if (image_data) { uint32_t src_q_f_index = mem_barrier->srcQueueFamilyIndex; uint32_t dst_q_f_index = mem_barrier->dstQueueFamilyIndex; - if (image_data->second.createInfo.sharingMode == VK_SHARING_MODE_CONCURRENT) { + if (image_data->createInfo.sharingMode == VK_SHARING_MODE_CONCURRENT) { // srcQueueFamilyIndex and dstQueueFamilyIndex must both // be VK_QUEUE_FAMILY_IGNORED if ((src_q_f_index != VK_QUEUE_FAMILY_IGNORED) || (dst_q_f_index != VK_QUEUE_FAMILY_IGNORED)) { @@ -7635,14 +7643,14 @@ static bool ValidateBarriers(const char *funcName, VkCommandBuffer cmdBuffer, ui "PREINITIALIZED.", funcName); } - auto image_data = dev_data->imageMap.find(mem_barrier->image); + auto image_data = getImageNode(dev_data, mem_barrier->image); VkFormat format = VK_FORMAT_UNDEFINED; uint32_t arrayLayers = 0, mipLevels = 0; bool imageFound = false; - if (image_data != dev_data->imageMap.end()) { - format = image_data->second.createInfo.format; - arrayLayers = image_data->second.createInfo.arrayLayers; - mipLevels = image_data->second.createInfo.mipLevels; + if (image_data) { + format = image_data->createInfo.format; + arrayLayers = image_data->createInfo.arrayLayers; + mipLevels = image_data->createInfo.mipLevels; imageFound = true; } else if (dev_data->device_extensions.wsi_enabled) { auto imageswap_data = dev_data->device_extensions.imageToSwapchainMap.find(mem_barrier->image); @@ -8276,14 +8284,13 @@ static bool ValidateDependencies(const layer_data *my_data, FRAMEBUFFER_NODE con overlapping_attachments[j].push_back(i); continue; } - auto image_data_i = my_data->imageMap.find(view_data_i->image); - auto image_data_j = my_data->imageMap.find(view_data_j->image); - if (image_data_i == my_data->imageMap.end() || image_data_j == my_data->imageMap.end()) { + auto image_data_i = getImageNode(my_data, view_data_i->image); + auto image_data_j = getImageNode(my_data, view_data_j->image); + if (!image_data_i || !image_data_j) { continue; } - if (image_data_i->second.mem == image_data_j->second.mem && - isRangeOverlapping(image_data_i->second.memOffset, image_data_i->second.memSize, image_data_j->second.memOffset, - image_data_j->second.memSize)) { + if (image_data_i->mem == image_data_j->mem && isRangeOverlapping(image_data_i->memOffset, image_data_i->memSize, + image_data_j->memOffset, image_data_j->memSize)) { overlapping_attachments[i].push_back(j); overlapping_attachments[j].push_back(i); } @@ -9461,8 +9468,8 @@ VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, V VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skipCall = false; std::unique_lock lock(global_lock); - auto image_node = dev_data->imageMap.find(image); - if (image_node != dev_data->imageMap.end()) { + auto image_node = getImageNode(dev_data, image); + if (image_node) { // Track objects tied to memory uint64_t image_handle = reinterpret_cast(image); skipCall = set_mem_binding(dev_data, mem, image_handle, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, "vkBindImageMemory"); @@ -9485,9 +9492,9 @@ VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, V result = dev_data->device_dispatch_table->BindImageMemory(device, image, mem, memoryOffset); lock.lock(); dev_data->memObjMap[mem].get()->image = image; - image_node->second.mem = mem; - image_node->second.memOffset = memoryOffset; - image_node->second.memSize = memRequirements.size; + image_node->mem = mem; + image_node->memOffset = memoryOffset; + image_node->memSize = memRequirements.size; lock.unlock(); } } else { @@ -9724,16 +9731,19 @@ GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pCoun IMAGE_LAYOUT_NODE image_layout_node; image_layout_node.layout = VK_IMAGE_LAYOUT_UNDEFINED; image_layout_node.format = swapchain_node->createInfo.imageFormat; + // Add imageMap entries for each swapchain image + VkImageCreateInfo image_ci = {}; + image_ci.mipLevels = 1; + image_ci.arrayLayers = swapchain_node->createInfo.imageArrayLayers; + image_ci.usage = swapchain_node->createInfo.imageUsage; + image_ci.format = swapchain_node->createInfo.imageFormat; + image_ci.extent.width = swapchain_node->createInfo.imageExtent.width; + image_ci.extent.height = swapchain_node->createInfo.imageExtent.height; + image_ci.sharingMode = swapchain_node->createInfo.imageSharingMode; + dev_data->imageMap[pSwapchainImages[i]] = unique_ptr(new IMAGE_NODE(&image_ci)); auto &image_node = dev_data->imageMap[pSwapchainImages[i]]; - image_node.createInfo.mipLevels = 1; - image_node.createInfo.arrayLayers = swapchain_node->createInfo.imageArrayLayers; - image_node.createInfo.usage = swapchain_node->createInfo.imageUsage; - image_node.createInfo.format = swapchain_node->createInfo.imageFormat; - image_node.createInfo.extent.width = swapchain_node->createInfo.imageExtent.width; - image_node.createInfo.extent.height = swapchain_node->createInfo.imageExtent.height; - image_node.createInfo.sharingMode = swapchain_node->createInfo.imageSharingMode; - image_node.valid = false; - image_node.mem = MEMTRACKER_SWAP_CHAIN_IMAGE_KEY; + image_node->valid = false; + image_node->mem = MEMTRACKER_SWAP_CHAIN_IMAGE_KEY; swapchain_node->images.push_back(pSwapchainImages[i]); ImageSubresourcePair subpair = {pSwapchainImages[i], false, VkImageSubresource()}; dev_data->imageSubresourceMap[pSwapchainImages[i]].push_back(subpair); diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index e6dcdc85..4b979881 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -487,6 +487,7 @@ namespace core_validation { struct layer_data; cvdescriptorset::DescriptorSet *getSetNode(const layer_data *, const VkDescriptorSet); BUFFER_NODE *getBufferNode(const layer_data *, const VkBuffer); +IMAGE_NODE *getImageNode(const layer_data *, const VkImage); DEVICE_MEM_INFO *getMemObjInfo(const layer_data *, const VkDeviceMemory); VkBufferViewCreateInfo *getBufferViewInfo(const layer_data *, const VkBufferView); SAMPLER_NODE *getSamplerNode(const layer_data *, const VkSampler); diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index e3f6e9d4..9039a122 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -265,11 +265,10 @@ cvdescriptorset::AllocateDescriptorSetsData::AllocateDescriptorSetsData(uint32_t cvdescriptorset::DescriptorSet::DescriptorSet(const VkDescriptorSet set, const DescriptorSetLayout *layout, const core_validation::layer_data *dev_data, - const std::unordered_map *image_map, const std::unordered_map *image_to_swapchain_map, const std::unordered_map *swapchain_map) - : some_update_(false), set_(set), p_layout_(layout), device_data_(dev_data), image_map_(image_map), - image_to_swapchain_map_(image_to_swapchain_map), swapchain_map_(swapchain_map) { + : some_update_(false), set_(set), p_layout_(layout), device_data_(dev_data), image_to_swapchain_map_(image_to_swapchain_map), + swapchain_map_(swapchain_map) { // Foreach binding, create default descriptors of given type for (uint32_t i = 0; i < p_layout_->GetBindingCount(); ++i) { auto type = p_layout_->GetTypeFromIndex(i); @@ -584,7 +583,6 @@ bool cvdescriptorset::ValidateSampler(const VkSampler sampler, const core_valida bool cvdescriptorset::ValidateImageUpdate(VkImageView image_view, VkImageLayout image_layout, VkDescriptorType type, const core_validation::layer_data *dev_data, - const std::unordered_map *image_map, const std::unordered_map *image_to_swapchain_map, const std::unordered_map *swapchain_map, std::string *error) { @@ -601,10 +599,10 @@ bool cvdescriptorset::ValidateImageUpdate(VkImageView image_view, VkImageLayout VkImage image = iv_data->image; VkFormat format = VK_FORMAT_MAX_ENUM; VkImageUsageFlags usage = 0; - auto img_pair = image_map->find(image); - if (img_pair != image_map->end()) { - format = img_pair->second.createInfo.format; - usage = img_pair->second.createInfo.usage; + auto image_node = getImageNode(dev_data, image); + if (image_node) { + format = image_node->createInfo.format; + usage = image_node->createInfo.usage; } else { // Also need to check the swapchains. auto swapchain_pair = image_to_swapchain_map->find(image); @@ -1034,8 +1032,8 @@ bool cvdescriptorset::DescriptorSet::VerifyWriteUpdateContents(const VkWriteDesc // Validate image auto image_view = update->pImageInfo[di].imageView; auto image_layout = update->pImageInfo[di].imageLayout; - if (!ValidateImageUpdate(image_view, image_layout, update->descriptorType, device_data_, image_map_, - image_to_swapchain_map_, swapchain_map_, error)) { + if (!ValidateImageUpdate(image_view, image_layout, update->descriptorType, device_data_, image_to_swapchain_map_, + swapchain_map_, error)) { std::stringstream error_str; error_str << "Attempted write update to combined image sampler descriptor failed due to: " << error->c_str(); *error = error_str.str(); @@ -1066,8 +1064,8 @@ bool cvdescriptorset::DescriptorSet::VerifyWriteUpdateContents(const VkWriteDesc for (uint32_t di = 0; di < update->descriptorCount; ++di) { auto image_view = update->pImageInfo[di].imageView; auto image_layout = update->pImageInfo[di].imageLayout; - if (!ValidateImageUpdate(image_view, image_layout, update->descriptorType, device_data_, image_map_, - image_to_swapchain_map_, swapchain_map_, error)) { + if (!ValidateImageUpdate(image_view, image_layout, update->descriptorType, device_data_, image_to_swapchain_map_, + swapchain_map_, error)) { std::stringstream error_str; error_str << "Attempted write update to image descriptor failed due to: " << error->c_str(); *error = error_str.str(); @@ -1157,8 +1155,8 @@ bool cvdescriptorset::DescriptorSet::VerifyCopyUpdateContents(const VkCopyDescri // Validate image auto image_view = img_samp_desc->GetImageView(); auto image_layout = img_samp_desc->GetImageLayout(); - if (!ValidateImageUpdate(image_view, image_layout, type, device_data_, image_map_, image_to_swapchain_map_, - swapchain_map_, error)) { + if (!ValidateImageUpdate(image_view, image_layout, type, device_data_, image_to_swapchain_map_, swapchain_map_, + error)) { std::stringstream error_str; error_str << "Attempted copy update to combined image sampler descriptor failed due to: " << error->c_str(); *error = error_str.str(); @@ -1171,8 +1169,8 @@ bool cvdescriptorset::DescriptorSet::VerifyCopyUpdateContents(const VkCopyDescri auto img_desc = static_cast(src_set->descriptors_[index + di].get()); auto image_view = img_desc->GetImageView(); auto image_layout = img_desc->GetImageLayout(); - if (!ValidateImageUpdate(image_view, image_layout, type, device_data_, image_map_, image_to_swapchain_map_, - swapchain_map_, error)) { + if (!ValidateImageUpdate(image_view, image_layout, type, device_data_, image_to_swapchain_map_, swapchain_map_, + error)) { std::stringstream error_str; error_str << "Attempted copy update to image descriptor failed due to: " << error->c_str(); *error = error_str.str(); @@ -1283,7 +1281,6 @@ void cvdescriptorset::PerformAllocateDescriptorSets( const AllocateDescriptorSetsData *ds_data, std::unordered_map *pool_map, std::unordered_map *set_map, const core_validation::layer_data *dev_data, const std::unordered_map &layout_map, - const std::unordered_map &image_map, const std::unordered_map &image_to_swapchain_map, const std::unordered_map &swapchain_map) { auto pool_state = (*pool_map)[p_alloc_info->descriptorPool]; @@ -1296,7 +1293,7 @@ void cvdescriptorset::PerformAllocateDescriptorSets( * global map and the pool's set. */ for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) { - auto new_ds = new cvdescriptorset::DescriptorSet(descriptor_sets[i], ds_data->layout_nodes[i], dev_data, &image_map, + auto new_ds = new cvdescriptorset::DescriptorSet(descriptor_sets[i], ds_data->layout_nodes[i], dev_data, &image_to_swapchain_map, &swapchain_map); pool_state->sets.insert(new_ds); diff --git a/layers/descriptor_sets.h b/layers/descriptor_sets.h index 16763f84..c775c736 100644 --- a/layers/descriptor_sets.h +++ b/layers/descriptor_sets.h @@ -162,7 +162,7 @@ class Descriptor { // performs common functions with both sampler and image descriptors so they can share their common functions bool ValidateSampler(const VkSampler, const core_validation::layer_data *); bool ValidateImageUpdate(VkImageView, VkImageLayout, VkDescriptorType, const core_validation::layer_data *, - const std::unordered_map *, const std::unordered_map *, + const std::unordered_map *, const std::unordered_map *, std::string *); class SamplerDescriptor : public Descriptor { @@ -268,7 +268,6 @@ void PerformAllocateDescriptorSets(const VkDescriptorSetAllocateInfo *, const Vk std::unordered_map *, const core_validation::layer_data *, const std::unordered_map &, - const std::unordered_map &, const std::unordered_map &, const std::unordered_map &); @@ -294,7 +293,7 @@ class DescriptorSet : public BASE_NODE { public: using BASE_NODE::in_use; DescriptorSet(const VkDescriptorSet, const DescriptorSetLayout *, const core_validation::layer_data *, - const std::unordered_map *, const std::unordered_map *, + const std::unordered_map *, const std::unordered_map *); ~DescriptorSet(); // A number of common Get* functions that return data based on layout from which this set was created @@ -373,7 +372,6 @@ class DescriptorSet : public BASE_NODE { // Ptrs to object containers to verify bound data const core_validation::layer_data *device_data_; // TODO : For next 3 maps all we really need (currently) is an image to format mapping - const std::unordered_map *image_map_; const std::unordered_map *image_to_swapchain_map_; const std::unordered_map *swapchain_map_; }; -- cgit v1.2.3 From e926298faf8f17577c470e115cd74ac73ba7da9e Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 2 Jun 2016 11:56:40 -0600 Subject: layers: Remove unneeded layout_map --- layers/core_validation.cpp | 3 +-- layers/descriptor_sets.cpp | 1 - layers/descriptor_sets.h | 1 - 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index a117ed72..f0dede6c 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -5907,8 +5907,7 @@ static void PostCallRecordAllocateDescriptorSets(layer_data *dev_data, const VkD const cvdescriptorset::AllocateDescriptorSetsData *common_data) { // All the updates are contained in a single cvdescriptorset function cvdescriptorset::PerformAllocateDescriptorSets(pAllocateInfo, pDescriptorSets, common_data, &dev_data->descriptorPoolMap, - &dev_data->setMap, dev_data, dev_data->descriptorSetLayoutMap, - dev_data->device_extensions.imageToSwapchainMap, + &dev_data->setMap, dev_data, dev_data->device_extensions.imageToSwapchainMap, dev_data->device_extensions.swapchainMap); } diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index 9039a122..795f5d71 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -1280,7 +1280,6 @@ void cvdescriptorset::PerformAllocateDescriptorSets( const VkDescriptorSetAllocateInfo *p_alloc_info, const VkDescriptorSet *descriptor_sets, const AllocateDescriptorSetsData *ds_data, std::unordered_map *pool_map, std::unordered_map *set_map, const core_validation::layer_data *dev_data, - const std::unordered_map &layout_map, const std::unordered_map &image_to_swapchain_map, const std::unordered_map &swapchain_map) { auto pool_state = (*pool_map)[p_alloc_info->descriptorPool]; diff --git a/layers/descriptor_sets.h b/layers/descriptor_sets.h index c775c736..365dedf8 100644 --- a/layers/descriptor_sets.h +++ b/layers/descriptor_sets.h @@ -267,7 +267,6 @@ void PerformAllocateDescriptorSets(const VkDescriptorSetAllocateInfo *, const Vk std::unordered_map *, std::unordered_map *, const core_validation::layer_data *, - const std::unordered_map &, const std::unordered_map &, const std::unordered_map &); -- cgit v1.2.3 From b6cb17cbade092a74b25c40b9042fb4cd804b167 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 2 Jun 2016 12:13:32 -0600 Subject: layers: Add getSwapchainFromImage() helper Add getSwapchainFromImage() to core_validation and use it from DescriptorSet class. --- layers/core_validation.cpp | 17 ++++++++++++----- layers/core_validation_types.h | 1 + layers/descriptor_sets.cpp | 26 ++++++++------------------ layers/descriptor_sets.h | 4 ---- 4 files changed, 21 insertions(+), 27 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index f0dede6c..4c63a803 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -293,6 +293,14 @@ BUFFER_NODE *getBufferNode(const layer_data *dev_data, const VkBuffer buffer) { } return buff_it->second.get(); } +// Return swapchain for specified image or else NULL +VkSwapchainKHR getSwapchainFromImage(const layer_data *dev_data, const VkImage image) { + auto img_it = dev_data->device_extensions.imageToSwapchainMap.find(image); + if (img_it == dev_data->device_extensions.imageToSwapchainMap.end()) { + return VK_NULL_HANDLE; + } + return img_it->second; +} // Return buffer node ptr for specified buffer or else NULL VkBufferViewCreateInfo *getBufferViewInfo(const layer_data *my_data, const VkBufferView buffer_view) { auto bv_it = my_data->bufferViewMap.find(buffer_view); @@ -5907,8 +5915,7 @@ static void PostCallRecordAllocateDescriptorSets(layer_data *dev_data, const VkD const cvdescriptorset::AllocateDescriptorSetsData *common_data) { // All the updates are contained in a single cvdescriptorset function cvdescriptorset::PerformAllocateDescriptorSets(pAllocateInfo, pDescriptorSets, common_data, &dev_data->descriptorPoolMap, - &dev_data->setMap, dev_data, dev_data->device_extensions.imageToSwapchainMap, - dev_data->device_extensions.swapchainMap); + &dev_data->setMap, dev_data, dev_data->device_extensions.swapchainMap); } VKAPI_ATTR VkResult VKAPI_CALL @@ -7652,9 +7659,9 @@ static bool ValidateBarriers(const char *funcName, VkCommandBuffer cmdBuffer, ui mipLevels = image_data->createInfo.mipLevels; imageFound = true; } else if (dev_data->device_extensions.wsi_enabled) { - auto imageswap_data = dev_data->device_extensions.imageToSwapchainMap.find(mem_barrier->image); - if (imageswap_data != dev_data->device_extensions.imageToSwapchainMap.end()) { - auto swapchain_data = dev_data->device_extensions.swapchainMap.find(imageswap_data->second); + auto imageswap_data = getSwapchainFromImage(dev_data, mem_barrier->image); + if (imageswap_data) { + auto swapchain_data = dev_data->device_extensions.swapchainMap.find(imageswap_data); if (swapchain_data != dev_data->device_extensions.swapchainMap.end()) { format = swapchain_data->second->createInfo.imageFormat; arrayLayers = swapchain_data->second->createInfo.imageArrayLayers; diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index 4b979881..1d601f43 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -492,6 +492,7 @@ DEVICE_MEM_INFO *getMemObjInfo(const layer_data *, const VkDeviceMemory); VkBufferViewCreateInfo *getBufferViewInfo(const layer_data *, const VkBufferView); SAMPLER_NODE *getSamplerNode(const layer_data *, const VkSampler); VkImageViewCreateInfo *getImageViewData(const layer_data *, const VkImageView); +VkSwapchainKHR getSwapchainFromImage(const layer_data *, const VkImage); } #endif // CORE_VALIDATION_TYPES_H_ diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index 795f5d71..2393d308 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -265,10 +265,8 @@ cvdescriptorset::AllocateDescriptorSetsData::AllocateDescriptorSetsData(uint32_t cvdescriptorset::DescriptorSet::DescriptorSet(const VkDescriptorSet set, const DescriptorSetLayout *layout, const core_validation::layer_data *dev_data, - const std::unordered_map *image_to_swapchain_map, const std::unordered_map *swapchain_map) - : some_update_(false), set_(set), p_layout_(layout), device_data_(dev_data), image_to_swapchain_map_(image_to_swapchain_map), - swapchain_map_(swapchain_map) { + : some_update_(false), set_(set), p_layout_(layout), device_data_(dev_data), swapchain_map_(swapchain_map) { // Foreach binding, create default descriptors of given type for (uint32_t i = 0; i < p_layout_->GetBindingCount(); ++i) { auto type = p_layout_->GetTypeFromIndex(i); @@ -583,7 +581,6 @@ bool cvdescriptorset::ValidateSampler(const VkSampler sampler, const core_valida bool cvdescriptorset::ValidateImageUpdate(VkImageView image_view, VkImageLayout image_layout, VkDescriptorType type, const core_validation::layer_data *dev_data, - const std::unordered_map *image_to_swapchain_map, const std::unordered_map *swapchain_map, std::string *error) { auto iv_data = getImageViewData(dev_data, image_view); @@ -605,9 +602,8 @@ bool cvdescriptorset::ValidateImageUpdate(VkImageView image_view, VkImageLayout usage = image_node->createInfo.usage; } else { // Also need to check the swapchains. - auto swapchain_pair = image_to_swapchain_map->find(image); - if (swapchain_pair != image_to_swapchain_map->end()) { - VkSwapchainKHR swapchain = swapchain_pair->second; + auto swapchain = getSwapchainFromImage(dev_data, image); + if (swapchain) { auto swapchain_pair = swapchain_map->find(swapchain); if (swapchain_pair != swapchain_map->end()) { format = swapchain_pair->second->createInfo.imageFormat; @@ -1032,8 +1028,7 @@ bool cvdescriptorset::DescriptorSet::VerifyWriteUpdateContents(const VkWriteDesc // Validate image auto image_view = update->pImageInfo[di].imageView; auto image_layout = update->pImageInfo[di].imageLayout; - if (!ValidateImageUpdate(image_view, image_layout, update->descriptorType, device_data_, image_to_swapchain_map_, - swapchain_map_, error)) { + if (!ValidateImageUpdate(image_view, image_layout, update->descriptorType, device_data_, swapchain_map_, error)) { std::stringstream error_str; error_str << "Attempted write update to combined image sampler descriptor failed due to: " << error->c_str(); *error = error_str.str(); @@ -1064,8 +1059,7 @@ bool cvdescriptorset::DescriptorSet::VerifyWriteUpdateContents(const VkWriteDesc for (uint32_t di = 0; di < update->descriptorCount; ++di) { auto image_view = update->pImageInfo[di].imageView; auto image_layout = update->pImageInfo[di].imageLayout; - if (!ValidateImageUpdate(image_view, image_layout, update->descriptorType, device_data_, image_to_swapchain_map_, - swapchain_map_, error)) { + if (!ValidateImageUpdate(image_view, image_layout, update->descriptorType, device_data_, swapchain_map_, error)) { std::stringstream error_str; error_str << "Attempted write update to image descriptor failed due to: " << error->c_str(); *error = error_str.str(); @@ -1155,8 +1149,7 @@ bool cvdescriptorset::DescriptorSet::VerifyCopyUpdateContents(const VkCopyDescri // Validate image auto image_view = img_samp_desc->GetImageView(); auto image_layout = img_samp_desc->GetImageLayout(); - if (!ValidateImageUpdate(image_view, image_layout, type, device_data_, image_to_swapchain_map_, swapchain_map_, - error)) { + if (!ValidateImageUpdate(image_view, image_layout, type, device_data_, swapchain_map_, error)) { std::stringstream error_str; error_str << "Attempted copy update to combined image sampler descriptor failed due to: " << error->c_str(); *error = error_str.str(); @@ -1169,8 +1162,7 @@ bool cvdescriptorset::DescriptorSet::VerifyCopyUpdateContents(const VkCopyDescri auto img_desc = static_cast(src_set->descriptors_[index + di].get()); auto image_view = img_desc->GetImageView(); auto image_layout = img_desc->GetImageLayout(); - if (!ValidateImageUpdate(image_view, image_layout, type, device_data_, image_to_swapchain_map_, swapchain_map_, - error)) { + if (!ValidateImageUpdate(image_view, image_layout, type, device_data_, swapchain_map_, error)) { std::stringstream error_str; error_str << "Attempted copy update to image descriptor failed due to: " << error->c_str(); *error = error_str.str(); @@ -1280,7 +1272,6 @@ void cvdescriptorset::PerformAllocateDescriptorSets( const VkDescriptorSetAllocateInfo *p_alloc_info, const VkDescriptorSet *descriptor_sets, const AllocateDescriptorSetsData *ds_data, std::unordered_map *pool_map, std::unordered_map *set_map, const core_validation::layer_data *dev_data, - const std::unordered_map &image_to_swapchain_map, const std::unordered_map &swapchain_map) { auto pool_state = (*pool_map)[p_alloc_info->descriptorPool]; /* Account for sets and individual descriptors allocated from pool */ @@ -1292,8 +1283,7 @@ void cvdescriptorset::PerformAllocateDescriptorSets( * global map and the pool's set. */ for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) { - auto new_ds = new cvdescriptorset::DescriptorSet(descriptor_sets[i], ds_data->layout_nodes[i], dev_data, - &image_to_swapchain_map, &swapchain_map); + auto new_ds = new cvdescriptorset::DescriptorSet(descriptor_sets[i], ds_data->layout_nodes[i], dev_data, &swapchain_map); pool_state->sets.insert(new_ds); new_ds->in_use.store(0); diff --git a/layers/descriptor_sets.h b/layers/descriptor_sets.h index 365dedf8..88bcef23 100644 --- a/layers/descriptor_sets.h +++ b/layers/descriptor_sets.h @@ -162,7 +162,6 @@ class Descriptor { // performs common functions with both sampler and image descriptors so they can share their common functions bool ValidateSampler(const VkSampler, const core_validation::layer_data *); bool ValidateImageUpdate(VkImageView, VkImageLayout, VkDescriptorType, const core_validation::layer_data *, - const std::unordered_map *, const std::unordered_map *, std::string *); class SamplerDescriptor : public Descriptor { @@ -267,7 +266,6 @@ void PerformAllocateDescriptorSets(const VkDescriptorSetAllocateInfo *, const Vk std::unordered_map *, std::unordered_map *, const core_validation::layer_data *, - const std::unordered_map &, const std::unordered_map &); /* @@ -292,7 +290,6 @@ class DescriptorSet : public BASE_NODE { public: using BASE_NODE::in_use; DescriptorSet(const VkDescriptorSet, const DescriptorSetLayout *, const core_validation::layer_data *, - const std::unordered_map *, const std::unordered_map *); ~DescriptorSet(); // A number of common Get* functions that return data based on layout from which this set was created @@ -371,7 +368,6 @@ class DescriptorSet : public BASE_NODE { // Ptrs to object containers to verify bound data const core_validation::layer_data *device_data_; // TODO : For next 3 maps all we really need (currently) is an image to format mapping - const std::unordered_map *image_to_swapchain_map_; const std::unordered_map *swapchain_map_; }; } -- cgit v1.2.3 From 07286c1f26b9bc37f84cccbcfcff77e0b9ef7a38 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 2 Jun 2016 12:41:47 -0600 Subject: layers: Added getSwapchainNode() helper Added getSwapchainNode() helper to core_validation and update DescriptorSet class to use it. --- layers/core_validation.cpp | 39 +++++++++++++++++++++++---------------- layers/core_validation_types.h | 1 + layers/descriptor_sets.cpp | 33 ++++++++++++++++----------------- layers/descriptor_sets.h | 11 +++-------- 4 files changed, 43 insertions(+), 41 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 4c63a803..53b416f4 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -293,6 +293,14 @@ BUFFER_NODE *getBufferNode(const layer_data *dev_data, const VkBuffer buffer) { } return buff_it->second.get(); } +// Return swapchain node for specified swapchain or else NULL +SWAPCHAIN_NODE *getSwapchainNode(const layer_data *dev_data, const VkSwapchainKHR swapchain) { + auto swp_it = dev_data->device_extensions.swapchainMap.find(swapchain); + if (swp_it == dev_data->device_extensions.swapchainMap.end()) { + return nullptr; + } + return swp_it->second; +} // Return swapchain for specified image or else NULL VkSwapchainKHR getSwapchainFromImage(const layer_data *dev_data, const VkImage image) { auto img_it = dev_data->device_extensions.imageToSwapchainMap.find(image); @@ -5915,7 +5923,7 @@ static void PostCallRecordAllocateDescriptorSets(layer_data *dev_data, const VkD const cvdescriptorset::AllocateDescriptorSetsData *common_data) { // All the updates are contained in a single cvdescriptorset function cvdescriptorset::PerformAllocateDescriptorSets(pAllocateInfo, pDescriptorSets, common_data, &dev_data->descriptorPoolMap, - &dev_data->setMap, dev_data, dev_data->device_extensions.swapchainMap); + &dev_data->setMap, dev_data); } VKAPI_ATTR VkResult VKAPI_CALL @@ -7661,10 +7669,10 @@ static bool ValidateBarriers(const char *funcName, VkCommandBuffer cmdBuffer, ui } else if (dev_data->device_extensions.wsi_enabled) { auto imageswap_data = getSwapchainFromImage(dev_data, mem_barrier->image); if (imageswap_data) { - auto swapchain_data = dev_data->device_extensions.swapchainMap.find(imageswap_data); - if (swapchain_data != dev_data->device_extensions.swapchainMap.end()) { - format = swapchain_data->second->createInfo.imageFormat; - arrayLayers = swapchain_data->second->createInfo.imageArrayLayers; + auto swapchain_data = getSwapchainNode(dev_data, imageswap_data); + if (swapchain_data) { + format = swapchain_data->createInfo.imageFormat; + arrayLayers = swapchain_data->createInfo.imageArrayLayers; mipLevels = 1; imageFound = true; } @@ -9681,10 +9689,10 @@ DestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocatio bool skipCall = false; std::unique_lock lock(global_lock); - auto swapchain_data = dev_data->device_extensions.swapchainMap.find(swapchain); - if (swapchain_data != dev_data->device_extensions.swapchainMap.end()) { - if (swapchain_data->second->images.size() > 0) { - for (auto swapchain_image : swapchain_data->second->images) { + auto swapchain_data = getSwapchainNode(dev_data, swapchain); + if (swapchain_data) { + if (swapchain_data->images.size() > 0) { + for (auto swapchain_image : swapchain_data->images) { auto image_sub = dev_data->imageSubresourceMap.find(swapchain_image); if (image_sub != dev_data->imageSubresourceMap.end()) { for (auto imgsubpair : image_sub->second) { @@ -9700,7 +9708,7 @@ DestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocatio dev_data->imageMap.erase(swapchain_image); } } - delete swapchain_data->second; + delete swapchain_data; dev_data->device_extensions.swapchainMap.erase(swapchain); } lock.unlock(); @@ -9719,8 +9727,8 @@ GetSwapchainImagesKHR(VkDevice device, VkSwapchainKHR swapchain, uint32_t *pCoun return result; std::lock_guard lock(global_lock); const size_t count = *pCount; - auto swapchain_node = dev_data->device_extensions.swapchainMap[swapchain]; - if (!swapchain_node->images.empty()) { + auto swapchain_node = getSwapchainNode(dev_data, swapchain); + if (swapchain_node && !swapchain_node->images.empty()) { // TODO : Not sure I like the memcmp here, but it works const bool mismatch = (swapchain_node->images.size() != count || memcmp(&swapchain_node->images[0], pSwapchainImages, sizeof(swapchain_node->images[0]) * count)); @@ -9783,10 +9791,9 @@ VKAPI_ATTR VkResult VKAPI_CALL QueuePresentKHR(VkQueue queue, const VkPresentInf } VkDeviceMemory mem; for (uint32_t i = 0; i < pPresentInfo->swapchainCount; ++i) { - auto swapchain_data = dev_data->device_extensions.swapchainMap.find(pPresentInfo->pSwapchains[i]); - if (swapchain_data != dev_data->device_extensions.swapchainMap.end() && - pPresentInfo->pImageIndices[i] < swapchain_data->second->images.size()) { - VkImage image = swapchain_data->second->images[pPresentInfo->pImageIndices[i]]; + auto swapchain_data = getSwapchainNode(dev_data, pPresentInfo->pSwapchains[i]); + if (swapchain_data && pPresentInfo->pImageIndices[i] < swapchain_data->images.size()) { + VkImage image = swapchain_data->images[pPresentInfo->pImageIndices[i]]; #if MTMERGESOURCE skip_call |= get_mem_binding_from_object(dev_data, (uint64_t)(image), VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, &mem); diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index 1d601f43..9ec81357 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -493,6 +493,7 @@ VkBufferViewCreateInfo *getBufferViewInfo(const layer_data *, const VkBufferView SAMPLER_NODE *getSamplerNode(const layer_data *, const VkSampler); VkImageViewCreateInfo *getImageViewData(const layer_data *, const VkImageView); VkSwapchainKHR getSwapchainFromImage(const layer_data *, const VkImage); +SWAPCHAIN_NODE *getSwapchainNode(const layer_data *, const VkSwapchainKHR); } #endif // CORE_VALIDATION_TYPES_H_ diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index 2393d308..8ccd334e 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -264,9 +264,8 @@ cvdescriptorset::AllocateDescriptorSetsData::AllocateDescriptorSetsData(uint32_t : required_descriptors_by_type{}, layout_nodes(count, nullptr) {} cvdescriptorset::DescriptorSet::DescriptorSet(const VkDescriptorSet set, const DescriptorSetLayout *layout, - const core_validation::layer_data *dev_data, - const std::unordered_map *swapchain_map) - : some_update_(false), set_(set), p_layout_(layout), device_data_(dev_data), swapchain_map_(swapchain_map) { + const core_validation::layer_data *dev_data) + : some_update_(false), set_(set), p_layout_(layout), device_data_(dev_data) { // Foreach binding, create default descriptors of given type for (uint32_t i = 0; i < p_layout_->GetBindingCount(); ++i) { auto type = p_layout_->GetTypeFromIndex(i); @@ -581,7 +580,6 @@ bool cvdescriptorset::ValidateSampler(const VkSampler sampler, const core_valida bool cvdescriptorset::ValidateImageUpdate(VkImageView image_view, VkImageLayout image_layout, VkDescriptorType type, const core_validation::layer_data *dev_data, - const std::unordered_map *swapchain_map, std::string *error) { auto iv_data = getImageViewData(dev_data, image_view); if (!iv_data) { @@ -604,9 +602,9 @@ bool cvdescriptorset::ValidateImageUpdate(VkImageView image_view, VkImageLayout // Also need to check the swapchains. auto swapchain = getSwapchainFromImage(dev_data, image); if (swapchain) { - auto swapchain_pair = swapchain_map->find(swapchain); - if (swapchain_pair != swapchain_map->end()) { - format = swapchain_pair->second->createInfo.imageFormat; + auto swapchain_node = getSwapchainNode(dev_data, swapchain); + if (swapchain_node) { + format = swapchain_node->createInfo.imageFormat; } } } @@ -1028,7 +1026,7 @@ bool cvdescriptorset::DescriptorSet::VerifyWriteUpdateContents(const VkWriteDesc // Validate image auto image_view = update->pImageInfo[di].imageView; auto image_layout = update->pImageInfo[di].imageLayout; - if (!ValidateImageUpdate(image_view, image_layout, update->descriptorType, device_data_, swapchain_map_, error)) { + if (!ValidateImageUpdate(image_view, image_layout, update->descriptorType, device_data_, error)) { std::stringstream error_str; error_str << "Attempted write update to combined image sampler descriptor failed due to: " << error->c_str(); *error = error_str.str(); @@ -1059,7 +1057,7 @@ bool cvdescriptorset::DescriptorSet::VerifyWriteUpdateContents(const VkWriteDesc for (uint32_t di = 0; di < update->descriptorCount; ++di) { auto image_view = update->pImageInfo[di].imageView; auto image_layout = update->pImageInfo[di].imageLayout; - if (!ValidateImageUpdate(image_view, image_layout, update->descriptorType, device_data_, swapchain_map_, error)) { + if (!ValidateImageUpdate(image_view, image_layout, update->descriptorType, device_data_, error)) { std::stringstream error_str; error_str << "Attempted write update to image descriptor failed due to: " << error->c_str(); *error = error_str.str(); @@ -1149,7 +1147,7 @@ bool cvdescriptorset::DescriptorSet::VerifyCopyUpdateContents(const VkCopyDescri // Validate image auto image_view = img_samp_desc->GetImageView(); auto image_layout = img_samp_desc->GetImageLayout(); - if (!ValidateImageUpdate(image_view, image_layout, type, device_data_, swapchain_map_, error)) { + if (!ValidateImageUpdate(image_view, image_layout, type, device_data_, error)) { std::stringstream error_str; error_str << "Attempted copy update to combined image sampler descriptor failed due to: " << error->c_str(); *error = error_str.str(); @@ -1162,7 +1160,7 @@ bool cvdescriptorset::DescriptorSet::VerifyCopyUpdateContents(const VkCopyDescri auto img_desc = static_cast(src_set->descriptors_[index + di].get()); auto image_view = img_desc->GetImageView(); auto image_layout = img_desc->GetImageLayout(); - if (!ValidateImageUpdate(image_view, image_layout, type, device_data_, swapchain_map_, error)) { + if (!ValidateImageUpdate(image_view, image_layout, type, device_data_, error)) { std::stringstream error_str; error_str << "Attempted copy update to image descriptor failed due to: " << error->c_str(); *error = error_str.str(); @@ -1268,11 +1266,12 @@ bool cvdescriptorset::ValidateAllocateDescriptorSets( return skip_call; } // Decrement allocated sets from the pool and insert new sets into set_map -void cvdescriptorset::PerformAllocateDescriptorSets( - const VkDescriptorSetAllocateInfo *p_alloc_info, const VkDescriptorSet *descriptor_sets, - const AllocateDescriptorSetsData *ds_data, std::unordered_map *pool_map, - std::unordered_map *set_map, const core_validation::layer_data *dev_data, - const std::unordered_map &swapchain_map) { +void cvdescriptorset::PerformAllocateDescriptorSets(const VkDescriptorSetAllocateInfo *p_alloc_info, + const VkDescriptorSet *descriptor_sets, + const AllocateDescriptorSetsData *ds_data, + std::unordered_map *pool_map, + std::unordered_map *set_map, + const core_validation::layer_data *dev_data) { auto pool_state = (*pool_map)[p_alloc_info->descriptorPool]; /* Account for sets and individual descriptors allocated from pool */ pool_state->availableSets -= p_alloc_info->descriptorSetCount; @@ -1283,7 +1282,7 @@ void cvdescriptorset::PerformAllocateDescriptorSets( * global map and the pool's set. */ for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) { - auto new_ds = new cvdescriptorset::DescriptorSet(descriptor_sets[i], ds_data->layout_nodes[i], dev_data, &swapchain_map); + auto new_ds = new cvdescriptorset::DescriptorSet(descriptor_sets[i], ds_data->layout_nodes[i], dev_data); pool_state->sets.insert(new_ds); new_ds->in_use.store(0); diff --git a/layers/descriptor_sets.h b/layers/descriptor_sets.h index 88bcef23..1b7ebb4a 100644 --- a/layers/descriptor_sets.h +++ b/layers/descriptor_sets.h @@ -161,8 +161,7 @@ class Descriptor { // Shared helper functions - These are useful because the shared sampler image descriptor type // performs common functions with both sampler and image descriptors so they can share their common functions bool ValidateSampler(const VkSampler, const core_validation::layer_data *); -bool ValidateImageUpdate(VkImageView, VkImageLayout, VkDescriptorType, const core_validation::layer_data *, - const std::unordered_map *, std::string *); +bool ValidateImageUpdate(VkImageView, VkImageLayout, VkDescriptorType, const core_validation::layer_data *, std::string *); class SamplerDescriptor : public Descriptor { public: @@ -265,8 +264,7 @@ bool ValidateAllocateDescriptorSets(const debug_report_data *, const VkDescripto void PerformAllocateDescriptorSets(const VkDescriptorSetAllocateInfo *, const VkDescriptorSet *, const AllocateDescriptorSetsData *, std::unordered_map *, std::unordered_map *, - const core_validation::layer_data *, - const std::unordered_map &); + const core_validation::layer_data *); /* * DescriptorSet class @@ -289,8 +287,7 @@ void PerformAllocateDescriptorSets(const VkDescriptorSetAllocateInfo *, const Vk class DescriptorSet : public BASE_NODE { public: using BASE_NODE::in_use; - DescriptorSet(const VkDescriptorSet, const DescriptorSetLayout *, const core_validation::layer_data *, - const std::unordered_map *); + DescriptorSet(const VkDescriptorSet, const DescriptorSetLayout *, const core_validation::layer_data *); ~DescriptorSet(); // A number of common Get* functions that return data based on layout from which this set was created uint32_t GetTotalDescriptorCount() const { return p_layout_ ? p_layout_->GetTotalDescriptorCount() : 0; }; @@ -367,8 +364,6 @@ class DescriptorSet : public BASE_NODE { std::vector> descriptors_; // Ptrs to object containers to verify bound data const core_validation::layer_data *device_data_; - // TODO : For next 3 maps all we really need (currently) is an image to format mapping - const std::unordered_map *swapchain_map_; }; } #endif // CORE_VALIDATION_DESCRIPTOR_SETS_H_ -- cgit v1.2.3 From 50619b9017896f33b5f428f4dad7be303f53a4b6 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 2 Jun 2016 12:45:31 -0600 Subject: layers: Update swapchainMap to use unique_ptr --- layers/core_validation.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 53b416f4..a281d804 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -102,7 +102,7 @@ struct CMD_POOL_INFO { struct devExts { bool wsi_enabled; - unordered_map swapchainMap; + unordered_map> swapchainMap; unordered_map imageToSwapchainMap; }; @@ -299,7 +299,7 @@ SWAPCHAIN_NODE *getSwapchainNode(const layer_data *dev_data, const VkSwapchainKH if (swp_it == dev_data->device_extensions.swapchainMap.end()) { return nullptr; } - return swp_it->second; + return swp_it->second.get(); } // Return swapchain for specified image or else NULL VkSwapchainKHR getSwapchainFromImage(const layer_data *dev_data, const VkImage image) { @@ -9675,9 +9675,8 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateSwapchainKHR(VkDevice device, const VkSwapc VkResult result = dev_data->device_dispatch_table->CreateSwapchainKHR(device, pCreateInfo, pAllocator, pSwapchain); if (VK_SUCCESS == result) { - SWAPCHAIN_NODE *psc_node = new SWAPCHAIN_NODE(pCreateInfo); std::lock_guard lock(global_lock); - dev_data->device_extensions.swapchainMap[*pSwapchain] = psc_node; + dev_data->device_extensions.swapchainMap[*pSwapchain] = unique_ptr(new SWAPCHAIN_NODE(pCreateInfo)); } return result; @@ -9708,7 +9707,6 @@ DestroySwapchainKHR(VkDevice device, VkSwapchainKHR swapchain, const VkAllocatio dev_data->imageMap.erase(swapchain_image); } } - delete swapchain_data; dev_data->device_extensions.swapchainMap.erase(swapchain); } lock.unlock(); -- cgit v1.2.3 From 67c0cc3e076ebb99072c4613ef89e288956c6878 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 2 Jun 2016 12:48:25 -0600 Subject: layers: Remove unneccessary consts --- layers/core_validation.cpp | 16 ++++++++-------- layers/core_validation_types.h | 18 +++++++++--------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index a281d804..1f0d8989 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -262,7 +262,7 @@ struct shader_module { static std::mutex global_lock; // Return ImageViewCreateInfo ptr for specified imageView or else NULL -VkImageViewCreateInfo *getImageViewData(const layer_data *dev_data, const VkImageView image_view) { +VkImageViewCreateInfo *getImageViewData(const layer_data *dev_data, VkImageView image_view) { auto iv_it = dev_data->imageViewMap.find(image_view); if (iv_it == dev_data->imageViewMap.end()) { return nullptr; @@ -270,7 +270,7 @@ VkImageViewCreateInfo *getImageViewData(const layer_data *dev_data, const VkImag return iv_it->second.get(); } // Return sampler node ptr for specified sampler or else NULL -SAMPLER_NODE *getSamplerNode(const layer_data *dev_data, const VkSampler sampler) { +SAMPLER_NODE *getSamplerNode(const layer_data *dev_data, VkSampler sampler) { auto sampler_it = dev_data->samplerMap.find(sampler); if (sampler_it == dev_data->samplerMap.end()) { return nullptr; @@ -278,7 +278,7 @@ SAMPLER_NODE *getSamplerNode(const layer_data *dev_data, const VkSampler sampler return sampler_it->second.get(); } // Return image node ptr for specified image or else NULL -IMAGE_NODE *getImageNode(const layer_data *dev_data, const VkImage image) { +IMAGE_NODE *getImageNode(const layer_data *dev_data, VkImage image) { auto img_it = dev_data->imageMap.find(image); if (img_it == dev_data->imageMap.end()) { return nullptr; @@ -286,7 +286,7 @@ IMAGE_NODE *getImageNode(const layer_data *dev_data, const VkImage image) { return img_it->second.get(); } // Return buffer node ptr for specified buffer or else NULL -BUFFER_NODE *getBufferNode(const layer_data *dev_data, const VkBuffer buffer) { +BUFFER_NODE *getBufferNode(const layer_data *dev_data, VkBuffer buffer) { auto buff_it = dev_data->bufferMap.find(buffer); if (buff_it == dev_data->bufferMap.end()) { return nullptr; @@ -294,7 +294,7 @@ BUFFER_NODE *getBufferNode(const layer_data *dev_data, const VkBuffer buffer) { return buff_it->second.get(); } // Return swapchain node for specified swapchain or else NULL -SWAPCHAIN_NODE *getSwapchainNode(const layer_data *dev_data, const VkSwapchainKHR swapchain) { +SWAPCHAIN_NODE *getSwapchainNode(const layer_data *dev_data, VkSwapchainKHR swapchain) { auto swp_it = dev_data->device_extensions.swapchainMap.find(swapchain); if (swp_it == dev_data->device_extensions.swapchainMap.end()) { return nullptr; @@ -302,7 +302,7 @@ SWAPCHAIN_NODE *getSwapchainNode(const layer_data *dev_data, const VkSwapchainKH return swp_it->second.get(); } // Return swapchain for specified image or else NULL -VkSwapchainKHR getSwapchainFromImage(const layer_data *dev_data, const VkImage image) { +VkSwapchainKHR getSwapchainFromImage(const layer_data *dev_data, VkImage image) { auto img_it = dev_data->device_extensions.imageToSwapchainMap.find(image); if (img_it == dev_data->device_extensions.imageToSwapchainMap.end()) { return VK_NULL_HANDLE; @@ -310,7 +310,7 @@ VkSwapchainKHR getSwapchainFromImage(const layer_data *dev_data, const VkImage i return img_it->second; } // Return buffer node ptr for specified buffer or else NULL -VkBufferViewCreateInfo *getBufferViewInfo(const layer_data *my_data, const VkBufferView buffer_view) { +VkBufferViewCreateInfo *getBufferViewInfo(const layer_data *my_data, VkBufferView buffer_view) { auto bv_it = my_data->bufferViewMap.find(buffer_view); if (bv_it == my_data->bufferViewMap.end()) { return nullptr; @@ -2668,7 +2668,7 @@ static bool validate_compute_pipeline(debug_report_data *report_data, PIPELINE_N &module, &entrypoint, enabledFeatures, shaderModuleMap); } // Return Set node ptr for specified set or else NULL -cvdescriptorset::DescriptorSet *getSetNode(const layer_data *my_data, const VkDescriptorSet set) { +cvdescriptorset::DescriptorSet *getSetNode(const layer_data *my_data, VkDescriptorSet set) { auto set_it = my_data->setMap.find(set); if (set_it == my_data->setMap.end()) { return NULL; diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index 9ec81357..13aa21f2 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -485,15 +485,15 @@ struct GLOBAL_CB_NODE : public BASE_NODE { // Fwd declarations of layer_data and helpers to look-up state from layer_data maps namespace core_validation { struct layer_data; -cvdescriptorset::DescriptorSet *getSetNode(const layer_data *, const VkDescriptorSet); -BUFFER_NODE *getBufferNode(const layer_data *, const VkBuffer); -IMAGE_NODE *getImageNode(const layer_data *, const VkImage); -DEVICE_MEM_INFO *getMemObjInfo(const layer_data *, const VkDeviceMemory); -VkBufferViewCreateInfo *getBufferViewInfo(const layer_data *, const VkBufferView); -SAMPLER_NODE *getSamplerNode(const layer_data *, const VkSampler); -VkImageViewCreateInfo *getImageViewData(const layer_data *, const VkImageView); -VkSwapchainKHR getSwapchainFromImage(const layer_data *, const VkImage); -SWAPCHAIN_NODE *getSwapchainNode(const layer_data *, const VkSwapchainKHR); +cvdescriptorset::DescriptorSet *getSetNode(const layer_data *, VkDescriptorSet); +BUFFER_NODE *getBufferNode(const layer_data *, VkBuffer); +IMAGE_NODE *getImageNode(const layer_data *, VkImage); +DEVICE_MEM_INFO *getMemObjInfo(const layer_data *, VkDeviceMemory); +VkBufferViewCreateInfo *getBufferViewInfo(const layer_data *, VkBufferView); +SAMPLER_NODE *getSamplerNode(const layer_data *, VkSampler); +VkImageViewCreateInfo *getImageViewData(const layer_data *, VkImageView); +VkSwapchainKHR getSwapchainFromImage(const layer_data *, VkImage); +SWAPCHAIN_NODE *getSwapchainNode(const layer_data *, VkSwapchainKHR); } #endif // CORE_VALIDATION_TYPES_H_ -- cgit v1.2.3 From 5a0755a401c4e38dfc605bc3679435f1d1258d51 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 2 Jun 2016 13:02:17 -0600 Subject: layers: Clean up poolMap access Remove some unneeded passing of poolMap around and use getPoolNode() function in DescriptorSet class. --- layers/core_validation.cpp | 7 +++--- layers/core_validation_types.h | 3 +++ layers/descriptor_sets.cpp | 51 +++++++++++++++++++++--------------------- layers/descriptor_sets.h | 4 +--- 4 files changed, 32 insertions(+), 33 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 1f0d8989..49324b82 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -2037,7 +2037,7 @@ static FRAMEBUFFER_NODE *getFramebuffer(layer_data *my_data, VkFramebuffer frame return &it->second; } -static cvdescriptorset::DescriptorSetLayout const *getDescriptorSetLayout(layer_data const *my_data, VkDescriptorSetLayout dsLayout) { +cvdescriptorset::DescriptorSetLayout const *getDescriptorSetLayout(layer_data const *my_data, VkDescriptorSetLayout dsLayout) { auto it = my_data->descriptorSetLayoutMap.find(dsLayout); if (it == my_data->descriptorSetLayoutMap.end()) { return nullptr; @@ -3166,7 +3166,7 @@ static void deletePipelines(layer_data *my_data) { // Block of code at start here specifically for managing/tracking DSs // Return Pool node ptr for specified pool or else NULL -static DESCRIPTOR_POOL_NODE *getPoolNode(const layer_data *dev_data, const VkDescriptorPool pool) { +DESCRIPTOR_POOL_NODE *getPoolNode(const layer_data *dev_data, const VkDescriptorPool pool) { auto pool_it = dev_data->descriptorPoolMap.find(pool); if (pool_it == dev_data->descriptorPoolMap.end()) { return NULL; @@ -5914,8 +5914,7 @@ ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescript static bool PreCallValidateAllocateDescriptorSets(layer_data *dev_data, const VkDescriptorSetAllocateInfo *pAllocateInfo, cvdescriptorset::AllocateDescriptorSetsData *common_data) { // All state checks for AllocateDescriptorSets is done in single function - return cvdescriptorset::ValidateAllocateDescriptorSets(dev_data->report_data, pAllocateInfo, dev_data->descriptorSetLayoutMap, - dev_data->descriptorPoolMap, common_data); + return cvdescriptorset::ValidateAllocateDescriptorSets(dev_data->report_data, pAllocateInfo, dev_data, common_data); } // Allocation state was good and call down chain was made so update state based on allocating descriptor sets static void PostCallRecordAllocateDescriptorSets(layer_data *dev_data, const VkDescriptorSetAllocateInfo *pAllocateInfo, diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index 13aa21f2..ce51dba4 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -54,6 +54,7 @@ // Fwd declarations namespace cvdescriptorset { +class DescriptorSetLayout; class DescriptorSet; }; @@ -486,6 +487,8 @@ struct GLOBAL_CB_NODE : public BASE_NODE { namespace core_validation { struct layer_data; cvdescriptorset::DescriptorSet *getSetNode(const layer_data *, VkDescriptorSet); +cvdescriptorset::DescriptorSetLayout const *getDescriptorSetLayout(layer_data const *, VkDescriptorSetLayout); +DESCRIPTOR_POOL_NODE *getPoolNode(const layer_data *, const VkDescriptorPool); BUFFER_NODE *getBufferNode(const layer_data *, VkBuffer); IMAGE_NODE *getImageNode(const layer_data *, VkImage); DEVICE_MEM_INFO *getMemObjInfo(const layer_data *, VkDeviceMemory); diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index 8ccd334e..a8e88cf8 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -1209,32 +1209,32 @@ bool cvdescriptorset::DescriptorSet::VerifyCopyUpdateContents(const VkCopyDescri return true; } // Verify that the state at allocate time is correct, but don't actually allocate the sets yet -bool cvdescriptorset::ValidateAllocateDescriptorSets( - const debug_report_data *report_data, const VkDescriptorSetAllocateInfo *p_alloc_info, - const std::unordered_map &set_layout_map, - const std::unordered_map &pool_map, AllocateDescriptorSetsData *ds_data) { +bool cvdescriptorset::ValidateAllocateDescriptorSets(const debug_report_data *report_data, + const VkDescriptorSetAllocateInfo *p_alloc_info, + const core_validation::layer_data *dev_data, + AllocateDescriptorSetsData *ds_data) { bool skip_call = false; for (uint32_t i = 0; i < p_alloc_info->descriptorSetCount; i++) { - auto layout_it = set_layout_map.find(p_alloc_info->pSetLayouts[i]); - if (layout_it == set_layout_map.end()) { + auto layout = getDescriptorSetLayout(dev_data, p_alloc_info->pSetLayouts[i]); + if (!layout) { skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, reinterpret_cast(p_alloc_info->pSetLayouts[i]), __LINE__, DRAWSTATE_INVALID_LAYOUT, "DS", "Unable to find set layout node for layout 0x%" PRIxLEAST64 " specified in vkAllocateDescriptorSets() call", reinterpret_cast(p_alloc_info->pSetLayouts[i])); } else { - ds_data->layout_nodes[i] = layout_it->second; + ds_data->layout_nodes[i] = layout; // Count total descriptors required per type - for (uint32_t j = 0; j < layout_it->second->GetBindingCount(); ++j) { - const auto &binding_layout = layout_it->second->GetDescriptorSetLayoutBindingPtrFromIndex(j); + for (uint32_t j = 0; j < layout->GetBindingCount(); ++j) { + const auto &binding_layout = layout->GetDescriptorSetLayoutBindingPtrFromIndex(j); uint32_t typeIndex = static_cast(binding_layout->descriptorType); ds_data->required_descriptors_by_type[typeIndex] += binding_layout->descriptorCount; } } } - auto pool_it = pool_map.find(p_alloc_info->descriptorPool); - if (pool_it == pool_map.end()) { + auto pool_node = getPoolNode(dev_data, p_alloc_info->descriptorPool); + if (!pool_node) { skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, reinterpret_cast(p_alloc_info->descriptorPool), __LINE__, DRAWSTATE_INVALID_POOL, "DS", @@ -1242,24 +1242,23 @@ bool cvdescriptorset::ValidateAllocateDescriptorSets( reinterpret_cast(p_alloc_info->descriptorPool)); } else { // Make sure pool has all the available descriptors before calling down chain // Track number of descriptorSets allowable in this pool - if (pool_it->second->availableSets < p_alloc_info->descriptorSetCount) { - skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, - reinterpret_cast(pool_it->second->pool), __LINE__, DRAWSTATE_DESCRIPTOR_POOL_EMPTY, - "DS", "Unable to allocate %u descriptorSets from pool 0x%" PRIxLEAST64 - ". This pool only has %d descriptorSets remaining.", - p_alloc_info->descriptorSetCount, reinterpret_cast(pool_it->second->pool), - pool_it->second->availableSets); + if (pool_node->availableSets < p_alloc_info->descriptorSetCount) { + skip_call |= + log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, + reinterpret_cast(pool_node->pool), __LINE__, DRAWSTATE_DESCRIPTOR_POOL_EMPTY, "DS", + "Unable to allocate %u descriptorSets from pool 0x%" PRIxLEAST64 + ". This pool only has %d descriptorSets remaining.", + p_alloc_info->descriptorSetCount, reinterpret_cast(pool_node->pool), pool_node->availableSets); } // Determine whether descriptor counts are satisfiable for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; i++) { - if (ds_data->required_descriptors_by_type[i] > pool_it->second->availableDescriptorTypeCount[i]) { - skip_call |= - log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, - reinterpret_cast(pool_it->second->pool), __LINE__, DRAWSTATE_DESCRIPTOR_POOL_EMPTY, - "DS", "Unable to allocate %u descriptors of type %s from pool 0x%" PRIxLEAST64 - ". This pool only has %d descriptors of this type remaining.", - ds_data->required_descriptors_by_type[i], string_VkDescriptorType(VkDescriptorType(i)), - reinterpret_cast(pool_it->second->pool), pool_it->second->availableDescriptorTypeCount[i]); + if (ds_data->required_descriptors_by_type[i] > pool_node->availableDescriptorTypeCount[i]) { + skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, + reinterpret_cast(pool_node->pool), __LINE__, DRAWSTATE_DESCRIPTOR_POOL_EMPTY, + "DS", "Unable to allocate %u descriptors of type %s from pool 0x%" PRIxLEAST64 + ". This pool only has %d descriptors of this type remaining.", + ds_data->required_descriptors_by_type[i], string_VkDescriptorType(VkDescriptorType(i)), + reinterpret_cast(pool_node->pool), pool_node->availableDescriptorTypeCount[i]); } } } diff --git a/layers/descriptor_sets.h b/layers/descriptor_sets.h index 1b7ebb4a..d53d97f5 100644 --- a/layers/descriptor_sets.h +++ b/layers/descriptor_sets.h @@ -257,9 +257,7 @@ void PerformUpdateDescriptorSets(const core_validation::layer_data *, uint32_t, const VkCopyDescriptorSet *); // Validate that Allocation state is ok bool ValidateAllocateDescriptorSets(const debug_report_data *, const VkDescriptorSetAllocateInfo *, - const std::unordered_map &, - const std::unordered_map &, - AllocateDescriptorSetsData *); + const core_validation::layer_data *, AllocateDescriptorSetsData *); // Update state based on allocating new descriptorsets void PerformAllocateDescriptorSets(const VkDescriptorSetAllocateInfo *, const VkDescriptorSet *, const AllocateDescriptorSetsData *, std::unordered_map *, -- cgit v1.2.3 From ab78fa872290a295b42a092ab931ad7a41b0fdfa Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 2 Jun 2016 13:04:47 -0600 Subject: layers: Comment update --- layers/descriptor_sets.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layers/descriptor_sets.h b/layers/descriptor_sets.h index d53d97f5..98ab1447 100644 --- a/layers/descriptor_sets.h +++ b/layers/descriptor_sets.h @@ -360,7 +360,7 @@ class DescriptorSet : public BASE_NODE { const DescriptorSetLayout *p_layout_; std::unordered_set bound_cmd_buffers_; std::vector> descriptors_; - // Ptrs to object containers to verify bound data + // Ptr to device data used for various data look-ups const core_validation::layer_data *device_data_; }; } -- cgit v1.2.3 From 0a714b8073c14dbf01dc6fd4a3929c40a4ae63a0 Mon Sep 17 00:00:00 2001 From: David Pinedo Date: Fri, 3 Jun 2016 12:08:12 -0600 Subject: winrtinstaller: fixes and diagnostics for powershell config script failure --- .../ConfigLayersAndVulkanDLL.ps1 | 202 ++++++++++++--------- windowsRuntimeInstaller/Diagnostic1.ps1 | 183 +++++++++++++++++++ windowsRuntimeInstaller/InstallerRT.nsi | 89 ++++----- 3 files changed, 350 insertions(+), 124 deletions(-) create mode 100644 windowsRuntimeInstaller/Diagnostic1.ps1 diff --git a/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 b/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 index 3b782409..891984b3 100644 --- a/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 +++ b/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 @@ -39,21 +39,18 @@ Param( [int]$ossize ) -# Clear any pre-existing errors +# Clear any pre-existing errors and set default return value $Error.Clear(); +$script:scriptReturnValue=0 # Start logging -$log=$Env:Temp+"\VulkanRT" -New-Item -ItemType Directory -Force -Path $log | Out-Null -$logascii=$log+"\ConfigLayersAndVulkanDLL.log" - -# Temp to be used for debugging failure to install issue -#$logascii2=$Env:Temp+"\ConfigLayersAndVulkanDLL_debug.log" - -$log=$log+"\ConfigLayersAndVulkanDLL16.log" - +$logascii=$Env:Temp+"\ConfigLayersAndVulkanDLL.log" +$log=$Env:Temp+"\ConfigLayersAndVulkanDLL16.log" start-transcript -path $log +# Ignore errors related to log file +$Error.Clear(); + Write-Host "ConfigLayersAndVulkanDLL.ps1 called with inputs of : $majorabi $ossize" $startTime=Get-Date Write-Host "Start time : $startTime" @@ -72,6 +69,16 @@ function notNumeric ($x) { } } +function Get-CurrentLineNumber { + $MyInvocation.ScriptLineNumber +} + +function setScriptReturnValue($rvalue) { + if ($script:scriptReturnValue -eq 0) { + $script:scriptReturnValue = $rvalue + } +} + # The name of the versioned vulkan dll file is one of the following: # # vulkan------- @@ -209,7 +216,7 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) if (notNumeric($major)) { Write-Warning "Ignoring $_ - bad major" - # Not a real d, so just clear it for now. + # Not a real error, so just clear it for now. $Error.Clear(); # NOTE: Inside a ForEach-Object block, the 'return' call behaves like a 'continue' for a For loop @@ -266,6 +273,7 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) $script:VulkanDllList+="$major=$minor=$patch=$buildno=$prebuildno=$prerelease= $_ @$majorOrig@$minorOrig@$patchOrig@$buildnoOrig@$prereleaseOrig@$prebuildnoOrig@" if (!$?) { Write-Error "Error: UpdateVulkanSysFolder adding DLL $_ to list" + setScriptReturnValue(Get-CurrentLineNumber) } } @@ -278,6 +286,7 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) [array]::sort($script:VulkanDllList) if (!$?) { Write-Error "Error: UpdateVulkanSysFolder sorting DLL list" + setScriptReturnValue(Get-CurrentLineNumber) } # Put the name of the most recent vulkan-*.dll in $mrVulkanDLL. @@ -288,6 +297,7 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) Copy-Item $mrVulkanDll $vulkandll -force if (!$?) { Write-Error "Error: UpdateVulkanSysFolder encountered error during copy $mrVulkanDll $vulkandll" + setScriptReturnValue(Get-CurrentLineNumber) } # Copy the most recent version of vulkaninfo--*.exe to vulkaninfo.exe. @@ -298,6 +308,7 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) Copy-Item $mrVulkaninfo vulkaninfo.exe -force if (!$?) { Write-Error "Error: UpdateVulkanSysFolder encountered error during copy $mrVulkaninfo vulkaninfo.exe" + setScriptReturnValue(Get-CurrentLineNumber) } # Create the name used in the registry for the SDK associated with $mrVulkanDll. @@ -319,6 +330,7 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) Write-Host "sdkname = $sdktempname" if (!$?) { Write-Error "Error: UpdateVulkanSysFolder encountered error generating SDK name" + setScriptReturnValue(Get-CurrentLineNumber) } } @@ -326,6 +338,7 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) Pop-Location if (!$?) { Write-Error "Error: UpdateVulkanSysFolder popping location" + setScriptReturnValue(Get-CurrentLineNumber) } # Only update the overall script-scope SDK name if we're told to @@ -343,6 +356,7 @@ if ($ossize -eq 64) { UpdateVulkanSysFolder $winfolder\SYSWOW64 0 if (!$?) { Write-Error "Error: Calling UpdateVulkanSysFolder for 64-bit OS" + setScriptReturnValue(Get-CurrentLineNumber) } } @@ -351,6 +365,7 @@ Write-Host "Calling UpdateVulkanSysFolder $winfolder\SYSTEM32 1" UpdateVulkanSysFolder $winfolder\SYSTEM32 1 if (!$?) { Write-Error "Error: Calling UpdateVulkanSysFolder for all OS" + setScriptReturnValue(Get-CurrentLineNumber) } # Create an array of vulkan sdk install dirs @@ -358,34 +373,42 @@ if (!$?) { Write-Host "Creating array of of Vulkan SDK Install dirs" $mrVulkanDllInstallDir="" $VulkanSdkDirs=@() -Get-ChildItem -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall | - ForEach-Object { - $regkey=$_ -replace ".*\\","" - if ($_ -match "\\VulkanSDK") { - # Get the install path from UninstallString - $tmp=Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regkey -Name UninstallString - if (!$?) { - Write-Error "Error: Get-ItemProperty failed for Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regkey" - } - $tmp=$tmp -replace "\\Uninstall.exe.*","" - $tmp=$tmp -replace ".*=.","" - Write-Host "Adding $tmp to VulkanSDKDirs" - $VulkanSdkDirs+=$tmp - if ($regkey -eq $script:sdkname) { - # Save away the sdk install dir for the the most recent vulkandll - Write-Host "Setting mrVulkanDllInstallDir to $tmp" - $mrVulkanDllInstallDir=$tmp - } - } +$installSDKRegs = @(Get-ChildItem -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall) +if ($installSDKRegs -ne $null) { + ForEach ($curSDKReg in $installSDKRegs) { + if ($curSDKReg -ne $null) { + $regkey=$curSDKReg -replace ".*\\","" + if ($regkey -match "VulkanSDK") { + # Get the install path from UninstallString + $tmp=Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regkey -Name UninstallString + if (!$? -or $tmp -eq $null) { + Write-Warning "Error: Get-ItemProperty failed for Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regkey" + $Error.Clear(); + continue; + } + $tmp=$tmp -replace "\\Uninstall.exe.*","" + $tmp=$tmp -replace ".*=.","" + Write-Host "Adding $tmp to VulkanSDKDirs" + $VulkanSdkDirs+=$tmp + if ($regkey -eq $script:sdkname) { + # Save away the sdk install dir for the the most recent vulkandll + Write-Host "Setting mrVulkanDllInstallDir to $tmp" + $mrVulkanDllInstallDir=$tmp + } + } + } } +} if (!$?) { Write-Error "Error: Failed creating array of of Vulkan SDK Install dirs" + setScriptReturnValue(Get-CurrentLineNumber) } # Search list of sdk install dirs for an sdk compatible with $script:sdkname. # We go backwards through VulkanDllList to generate SDK names, because we want the most recent SDK. -if ($mrVulkanDllInstallDir -eq "") { + +if ($mrVulkanDllInstallDir -eq "" -and $script:VulkanDllList.Length -gt 0) { Write-Host "Searching VulkanDllList" ForEach ($idx in ($script:VulkanDllList.Length-1)..0) { $tmp=$script:VulkanDllList[$idx] @@ -404,8 +427,8 @@ if ($mrVulkanDllInstallDir -eq "") { } Write-Host "Comparing $regEntry" $rval=Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regEntry -ErrorAction SilentlyContinue - if (!$?) { - Write-Warning "Ignoring $regEntry because Get-ItemProperty failed to find corresponding SDK registry entry" + if (!$? -or $rval -eq $null) { + Write-Warning "Ignoring $regEntry - corresponding SDK registry entry does not exist" $Error.Clear(); continue } @@ -426,7 +449,8 @@ if ($mrVulkanDllInstallDir -eq "") { } } if (!$?) { - Write-Error "Error: Failed searching VulkanDLLList" + Write-Warning "Failed searching VulkanDLLList" + $Error.Clear(); } } @@ -446,45 +470,53 @@ $VulkanSdkDirs+="$windrive\VulkanSDK\0.9.3" # layers were installed that are not from an SDK, we don't mess with them. Write-Host "Removing old layer registry values from HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" -Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\Vulkan\ExplicitLayers | Select-Object -ExpandProperty Property | - ForEach-Object { - $regval=$_ - ForEach ($sdkdir in $VulkanSdkDirs) { - if ($regval -like "$sdkdir\*.json") { - Remove-ItemProperty -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -name $regval - if (!$?) { - Write-Error "Error: Remove-ItemProperty failed for -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -name $regval" - } else { - Write-Host "Removed registry value $regval" +$regkeys = @(Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\Vulkan\ExplicitLayers | Select-Object -ExpandProperty Property) +if ($regkeys -ne $null) { + ForEach ($regval in $regkeys) { + if ($regval -ne $null) { + ForEach ($sdkdir in $VulkanSdkDirs) { + if ($regval -like "$sdkdir\*.json") { + Remove-ItemProperty -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -name $regval + if (!$?) { + Write-Error "Error: Remove-ItemProperty failed for -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -name $regval" + } else { + Write-Host "Removed registry value $regval" + } } - } - } - } + } + } + } +} if (!$?) { Write-Error "Error: Failed Removing old layer registry values from HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" + setScriptReturnValue(Get-CurrentLineNumber) } # Remove 32-bit layer registry value if we're targeting a 64-bit OS if ($ossize -eq 64) { - Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers | Select-Object -ExpandProperty Property | - ForEach-Object { - $regval=$_ - ForEach ($sdkdir in $VulkanSdkDirs) { - if ($regval -like "$sdkdir\*.json") { - Remove-ItemProperty -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -name $regval - if (!$?) { - Write-Error "Error: Remove-ItemProperty failed for -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -name $regval" - } else { - Write-Host "Removed WOW6432Node registry value $regval" + $regkeys = @(Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers | Select-Object -ExpandProperty Property) + if ($regkeys -ne $null) { + ForEach ($regval in $regkeys) { + if ($regval -ne $null) { + ForEach ($sdkdir in $VulkanSdkDirs) { + if ($regval -like "$sdkdir\*.json") { + Remove-ItemProperty -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -name $regval + if (!$?) { + Write-Error "Error: Remove-ItemProperty failed for -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -name $regval" + } else { + Write-Host "Removed WOW6432Node registry value $regval" + } } } - } + } } + } - if (!$?) { - Write-Error "Error: Failed Removing old layer registry values from HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers" - } + if (!$?) { + Write-Error "Error: Failed Removing old layer registry values from HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers" + setScriptReturnValue(Get-CurrentLineNumber) + } } @@ -499,6 +531,7 @@ if ($mrVulkanDllInstallDir -ne "") { New-Item -Force -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers | out-null if (!$?) { Write-Error "Error: Failed creating HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" + setScriptReturnValue(Get-CurrentLineNumber) } } if ($ossize -eq 64) { @@ -507,6 +540,7 @@ if ($mrVulkanDllInstallDir -ne "") { New-Item -Force -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers | out-null if (!$?) { Write-Error "Error: Failed creating HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers" + setScriptReturnValue(Get-CurrentLineNumber) } } } @@ -520,10 +554,12 @@ if ($mrVulkanDllInstallDir -ne "") { New-ItemProperty -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin\$_ -PropertyType DWord -Value 0 | out-null if (!$?) { Write-Error "Error: Failed creating $mrVulkanDllInstallDir\Bin\$_" + setScriptReturnValue(Get-CurrentLineNumber) } } if (!$?) { Write-Error "Error: Failed Get-ChildItem $mrVulkanDllInstallDir\Bin | ForEach-Object " + setScriptReturnValue(Get-CurrentLineNumber) } # Create registry values for the WOW6432Node registry location for 32-bit items on a 64-bit OS @@ -533,10 +569,12 @@ if ($mrVulkanDllInstallDir -ne "") { New-ItemProperty -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin32\$_ -PropertyType DWord -Value 0 | out-null if (!$?) { Write-Error "Error: Failed creating $mrVulkanDllInstallDir\Bin32\$_" + setScriptReturnValue(Get-CurrentLineNumber) } } if (!$?) { Write-Error "Error: Failed Get-ChildItem $mrVulkanDllInstallDir\Bin32 | ForEach-Object " + setScriptReturnValue(Get-CurrentLineNumber) } } else { # Create registry values in normal registry location for 32-bit items on a 32-bit OS @@ -546,14 +584,19 @@ if ($mrVulkanDllInstallDir -ne "") { New-ItemProperty -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin32\$_ -PropertyType DWord -Value 0 | out-null if (!$?) { Write-Error "Error: Failed creating $mrVulkanDllInstallDir\Bin\$_" + setScriptReturnValue(Get-CurrentLineNumber) } } if (!$?) { Write-Error "Error: Failed Get-ChildItem $mrVulkanDllInstallDir\Bin32 | ForEach-Object " + setScriptReturnValue(Get-CurrentLineNumber) } } } +# Debug - for testing handling of script failure in installer +#setScriptReturnValue(Get-CurrentLineNumber) + # Final log output Write-Host "ConfigLayersAndVulkanDLL.ps1 completed" $endTime=Get-Date @@ -564,19 +607,16 @@ Stop-Transcript # Convert logfile to ascii Get-Content $log | Out-File -encoding ascii -filepath $logascii -# Temp to be used for debugging failure to install issue (as VulkanRT folder might get removed) -#Get-Content $log | Out-File -encoding ascii -filepath $logascii2 - - # Remove the unicode log as we no longer need it. Remove-Item $log +exit $script:scriptReturnValue # SIG # Begin signature block # MIIccAYJKoZIhvcNAQcCoIIcYTCCHF0CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR -# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUFNNSYRu98top6sj+5PNNXfdh -# aN+gghefMIIFKDCCBBCgAwIBAgIQA7RxzU1//sKaOyCyyw9fVDANBgkqhkiG9w0B +# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUWzO9uMOZloqpSF0mSPfjnVcK +# X2ygghefMIIFKDCCBBCgAwIBAgIQA7RxzU1//sKaOyCyyw9fVDANBgkqhkiG9w0B # AQsFADByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD # VQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFz # c3VyZWQgSUQgQ29kZSBTaWduaW5nIENBMB4XDTE2MDQwODAwMDAwMFoXDTE3MDgx @@ -707,22 +747,22 @@ Remove-Item $log # aWdpQ2VydCBTSEEyIEFzc3VyZWQgSUQgQ29kZSBTaWduaW5nIENBAhADtHHNTX/+ # wpo7ILLLD19UMAkGBSsOAwIaBQCgeDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAA # MBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgor -# BgEEAYI3AgEVMCMGCSqGSIb3DQEJBDEWBBS1dRcwLYpAdOGb79bA8lUPXs2weTAN -# BgkqhkiG9w0BAQEFAASCAQDaFv54IUAa3PRmDo4gr25cTzNNVRBVQn29+lBWRhL6 -# Z4xafc4dV2NuhsySyM/7CviTF/T32E9GfMUPjsje1L02FuP+xydJ/KHFba2Qe5Tm -# rqQIQTDsdYBx4imOecLbzF8mcfMjbBTLz3YTWDShTIhTR+WqVMbzvASfJ/jUj6bP -# wxiuHho0Gus669fK9xNrUr0Yo9Jaw82KLCsJFE/NgEV3eoNWi3ufZF4Owq+HWqLj -# ZfzKTOb+A7oLHEfr2bX3lrwm5O/dcb4gb6dUP2m1zY6B9hPPO5lwtCVFdOShU+a4 -# Xq+MQ6RvjjXx/wRyBgF9e24k56EXce5hS9KSM/r4HJcFoYICDzCCAgsGCSqGSIb3 +# BgEEAYI3AgEVMCMGCSqGSIb3DQEJBDEWBBTl9vUhNixlC4qK2N6ftsmXNxTB5DAN +# BgkqhkiG9w0BAQEFAASCAQBmoK4vUOuN1W2tbF6prfT9lK/x424kuyT2GmMuBg1K +# 2QLmoPVPFokJllqckm2snV2PrVZ2jQf1HqZfoQ9k9tJQ9Iysobsdi+Xk35m9Jhnb +# qoDBI7HI8NVzgczSgcOGMtV1SkSHMxnobVPnqNVyD1nK6OCSIFe8lKVggiNHokxv +# bpPOWW1oPO9eayYSoysEqwygODgV5Jr0wSVLDuoAKlnbYH4Hjvtf0JWJncm/l6ZM +# yWIXaBUWNV6Dl2ZTeCXIlBrNxC3nfLn6uBkbox0xvcYk6tvksy7fQsSFFWYiqR26 +# 9sW4wJmqvlKO1PKNwdiGnY2fvJzffot8NPEKxbb7l2ySoYICDzCCAgsGCSqGSIb3 # DQEJBjGCAfwwggH4AgEBMHYwYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lD # ZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGln # aUNlcnQgQXNzdXJlZCBJRCBDQS0xAhADAZoCOv9YsWvW1ermF/BmMAkGBSsOAwIa # BQCgXTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0x -# NjA2MDExNjMwNTFaMCMGCSqGSIb3DQEJBDEWBBQTfVtazojkMGVHBXKiXef3VObs -# mTANBgkqhkiG9w0BAQEFAASCAQCXNZHaksqQrHFmc96ks9qPT2mR35sHOOIOVCZn -# kFPyFEjzoZmMQAhcQqHdEvgEoIr5DZ6yuLTvtu8bEN3gS2iSXD542PatUBy/DsCc -# uFn4QFVewop/g6hPgy3VMwFWhd1t3YJ1HZtppE9N68Eth8bFODeMmc6Ogrv7oCts -# YwjBdccKXgrdAN/2cBIZCa8+FEj+sdO0ZKToVlRivETPnI8Y/XFrrgF3+cOkDg4e -# ZU11g/Ww9RYLdZiqIRe06pChRmHNrY5AZA9W4UgKyCQESWd8e0lLR/6uGCZulWL6 -# U3LKVUyUUP/eAHLO9iGsm3pA9L27gcnyl41UPVIqQ7VhSvrO +# NjA2MDMxODA1NTFaMCMGCSqGSIb3DQEJBDEWBBQ8siiyF+3YjaCU9cWVOMiV0i6H +# WjANBgkqhkiG9w0BAQEFAASCAQCcC1//Fo3cFfFAFDvhOtpcuzFn6vsIm6eGjcAD +# l/sUEeAS69BbPrapFDxwGjMbeFWSQK0KhzbxEs5DN/5eRrj1xX9SnhunszqPCzJ7 +# 66XJvuncyzKxQvOGGMLPbGkVHsximVT0IX+pPEZS25gTLBk8e30R6w9ChgykAxbz +# Gyi4gg8HNvk20aTydXelUA8hRYdb2dn/RLTamZjxAdmhRUyPuClgh4ZvOohILwAn +# Egh5cdu417ircbhFIJhujK/yr2C4uJEmb+JDST96luQBKQtlg7e3OnTBYddc3YoZ +# S5dTEsAn3PlDvkcuxg79fgK+Wf/EMOGaEv3bJaeReFcRp1l8 # SIG # End signature block diff --git a/windowsRuntimeInstaller/Diagnostic1.ps1 b/windowsRuntimeInstaller/Diagnostic1.ps1 new file mode 100644 index 00000000..90cf4db7 --- /dev/null +++ b/windowsRuntimeInstaller/Diagnostic1.ps1 @@ -0,0 +1,183 @@ +# Copyright (c) 2015-2016 The Khronos Group Inc. +# Copyright (c) 2015-2016 Valve Corporation +# Copyright (c) 2015-2016 LunarG, 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. +# +# Author: David Pinedo +# + + +# This Powershell script is run by the Vulkan Runtime Installer when it +# encounters a problem when running the ConfigLayersAndVulkanDLL.ps1 script. +# It is run to help diagnose whether the installer is capabable of running +# Powershell scripts on the target system. + + +$outfile=$Env:Temp+"\VulkanRTinstall\Diagnostic1.log" +Write-Output "Diagnostic1" | Out-File -encoding ascii -filepath $outfile + +# SIG # Begin signature block +# MIIccAYJKoZIhvcNAQcCoIIcYTCCHF0CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB +# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR +# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUXZIII3ISc6TV7crVquI9urb2 +# FNqgghefMIIFKDCCBBCgAwIBAgIQA7RxzU1//sKaOyCyyw9fVDANBgkqhkiG9w0B +# AQsFADByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD +# VQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFz +# c3VyZWQgSUQgQ29kZSBTaWduaW5nIENBMB4XDTE2MDQwODAwMDAwMFoXDTE3MDgx +# MDEyMDAwMFowZTELMAkGA1UEBhMCVVMxETAPBgNVBAgTCENvbG9yYWRvMRUwEwYD +# VQQHEwxGb3J0IENvbGxpbnMxFTATBgNVBAoTDEx1bmFyRywgSW5jLjEVMBMGA1UE +# AxMMTHVuYXJHLCBJbmMuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +# 9g6eKks1n/j5xBMG0viQaVqoxYjNIt2sLiDhBa1JMfPVvQsclZwsJl2FHhnQEg1/ +# YLeNUqSukbgTNXTGjkvNoh/PbjjBzlxZbPwRKO8tbHMRKZJjcVkOWLLReUGHkxJ3 +# i4hD6zH0K9DKMubb0ohmaA28ALsl8d4igz78uGyqa3jNXbiyNLJhd467u2nCySdV +# PFdXCMklePhW9VLm8VXSRDlBcx6tsaTpJr8lRZsq13xO7lwifQw1w2QRQzlnezUY +# PVnXIz+54Nu0U6JKPaTlxgbk9SlcP4f77UJuieGQGCWh3uCcASYQgUMjisetLyFU +# WZuPYpSbNWVksMaiIlSIuwIDAQABo4IBxTCCAcEwHwYDVR0jBBgwFoAUWsS5eyoK +# o6XqcQPAYPkt9mV1DlgwHQYDVR0OBBYEFBP4/a3JE2uXZpm3r1yknye/WxPWMA4G +# A1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzB3BgNVHR8EcDBuMDWg +# M6Axhi9odHRwOi8vY3JsMy5kaWdpY2VydC5jb20vc2hhMi1hc3N1cmVkLWNzLWcx +# LmNybDA1oDOgMYYvaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJl +# ZC1jcy1nMS5jcmwwTAYDVR0gBEUwQzA3BglghkgBhv1sAwEwKjAoBggrBgEFBQcC +# ARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAIBgZngQwBBAEwgYQGCCsG +# AQUFBwEBBHgwdjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29t +# ME4GCCsGAQUFBzAChkJodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNl +# cnRTSEEyQXNzdXJlZElEQ29kZVNpZ25pbmdDQS5jcnQwDAYDVR0TAQH/BAIwADAN +# BgkqhkiG9w0BAQsFAAOCAQEAscucuwAp0HisTjMWJii1ZX5H7+GAc048OJctdrTS +# VlUc7kJgEirXQb1TQbSevvt1wE6s3xJWUapWnYvvgEPOq036WFA+NRVoWU5eIUkG +# MsYGXH5ASHVBH+5/13wFLC1nXTxxrQ6B19uFFr5ZpsaP93EdD5pLqRxKrqLc9Stc +# /faupcVkclisgXOEDsCzvgGhhaFCc/RSeXOOAZg2EsJNbaydg/xyvZqPDG17NboL +# rgrzN5r6FoCk535HuGvcpjbr60nlwwzuxwqzXuMhGUTOs5O5cPpJQt6+iXBrlBgh +# 4jPNL+ZvFfJLDq3CUdnSh3S13GJruyTWzF2AxTeRAnw2fzCCBTAwggQYoAMCAQIC +# EAQJGBtf1btmdVNDtW+VUAgwDQYJKoZIhvcNAQELBQAwZTELMAkGA1UEBhMCVVMx +# FTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNv +# bTEkMCIGA1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBMB4XDTEzMTAy +# MjEyMDAwMFoXDTI4MTAyMjEyMDAwMFowcjELMAkGA1UEBhMCVVMxFTATBgNVBAoT +# DERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTExMC8GA1UE +# AxMoRGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIENvZGUgU2lnbmluZyBDQTCCASIw +# DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPjTsxx/DhGvZ3cH0wsxSRnP0PtF +# mbE620T1f+Wondsy13Hqdp0FLreP+pJDwKX5idQ3Gde2qvCchqXYJawOeSg6funR +# Z9PG+yknx9N7I5TkkSOWkHeC+aGEI2YSVDNQdLEoJrskacLCUvIUZ4qJRdQtoaPp +# iCwgla4cSocI3wz14k1gGL6qxLKucDFmM3E+rHCiq85/6XzLkqHlOzEcz+ryCuRX +# u0q16XTmK/5sy350OTYNkO/ktU6kqepqCquE86xnTrXE94zRICUj6whkPlKWwfIP +# EvTFjg/BougsUfdzvL2FsWKDc0GCB+Q4i2pzINAPZHM8np+mM6n9Gd8lk9ECAwEA +# AaOCAc0wggHJMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGGMBMG +# A1UdJQQMMAoGCCsGAQUFBwMDMHkGCCsGAQUFBwEBBG0wazAkBggrBgEFBQcwAYYY +# aHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRwOi8vY2Fj +# ZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3J0MIGB +# BgNVHR8EejB4MDqgOKA2hjRodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGlnaUNl +# cnRBc3N1cmVkSURSb290Q0EuY3JsMDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2Vy +# dC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsME8GA1UdIARIMEYwOAYK +# YIZIAYb9bAACBDAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5j +# b20vQ1BTMAoGCGCGSAGG/WwDMB0GA1UdDgQWBBRaxLl7KgqjpepxA8Bg+S32ZXUO +# WDAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkqhkiG9w0BAQsF +# AAOCAQEAPuwNWiSz8yLRFcgsfCUpdqgdXRwtOhrE7zBh134LYP3DPQ/Er4v97yrf +# IFU3sOH20ZJ1D1G0bqWOWuJeJIFOEKTuP3GOYw4TS63XX0R58zYUBor3nEZOXP+Q +# sRsHDpEV+7qvtVHCjSSuJMbHJyqhKSgaOnEoAjwukaPAJRHinBRHoXpoaK+bp1wg +# XNlxsQyPu6j4xRJon89Ay0BEpRPw5mQMJQhCMrI2iiQC/i9yfhzXSUWW6Fkd6fp0 +# ZGuy62ZD2rOwjNXpDd32ASDOmTFjPQgaGLOBm0/GkxAG/AeB+ova+YJJ92JuoVP6 +# EpQYhS6SkepobEQysmah5xikmmRR7zCCBmowggVSoAMCAQICEAMBmgI6/1ixa9bV +# 6uYX8GYwDQYJKoZIhvcNAQEFBQAwYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERp +# Z2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMY +# RGlnaUNlcnQgQXNzdXJlZCBJRCBDQS0xMB4XDTE0MTAyMjAwMDAwMFoXDTI0MTAy +# MjAwMDAwMFowRzELMAkGA1UEBhMCVVMxETAPBgNVBAoTCERpZ2lDZXJ0MSUwIwYD +# VQQDExxEaWdpQ2VydCBUaW1lc3RhbXAgUmVzcG9uZGVyMIIBIjANBgkqhkiG9w0B +# AQEFAAOCAQ8AMIIBCgKCAQEAo2Rd/Hyz4II14OD2xirmSXU7zG7gU6mfH2RZ5nxr +# f2uMnVX4kuOe1VpjWwJJUNmDzm9m7t3LhelfpfnUh3SIRDsZyeX1kZ/GFDmsJOqo +# SyyRicxeKPRktlC39RKzc5YKZ6O+YZ+u8/0SeHUOplsU/UUjjoZEVX0YhgWMVYd5 +# SEb3yg6Np95OX+Koti1ZAmGIYXIYaLm4fO7m5zQvMXeBMB+7NgGN7yfj95rwTDFk +# jePr+hmHqH7P7IwMNlt6wXq4eMfJBi5GEMiN6ARg27xzdPpO2P6qQPGyznBGg+na +# QKFZOtkVCVeZVjCT88lhzNAIzGvsYkKRrALA76TwiRGPdwIDAQABo4IDNTCCAzEw +# DgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYB +# BQUHAwgwggG/BgNVHSAEggG2MIIBsjCCAaEGCWCGSAGG/WwHATCCAZIwKAYIKwYB +# BQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwggFkBggrBgEFBQcC +# AjCCAVYeggFSAEEAbgB5ACAAdQBzAGUAIABvAGYAIAB0AGgAaQBzACAAQwBlAHIA +# dABpAGYAaQBjAGEAdABlACAAYwBvAG4AcwB0AGkAdAB1AHQAZQBzACAAYQBjAGMA +# ZQBwAHQAYQBuAGMAZQAgAG8AZgAgAHQAaABlACAARABpAGcAaQBDAGUAcgB0ACAA +# QwBQAC8AQwBQAFMAIABhAG4AZAAgAHQAaABlACAAUgBlAGwAeQBpAG4AZwAgAFAA +# YQByAHQAeQAgAEEAZwByAGUAZQBtAGUAbgB0ACAAdwBoAGkAYwBoACAAbABpAG0A +# aQB0ACAAbABpAGEAYgBpAGwAaQB0AHkAIABhAG4AZAAgAGEAcgBlACAAaQBuAGMA +# bwByAHAAbwByAGEAdABlAGQAIABoAGUAcgBlAGkAbgAgAGIAeQAgAHIAZQBmAGUA +# cgBlAG4AYwBlAC4wCwYJYIZIAYb9bAMVMB8GA1UdIwQYMBaAFBUAEisTmLKZB+0e +# 36K+Vw0rZwLNMB0GA1UdDgQWBBRhWk0ktkkynUoqeRqDS/QeicHKfTB9BgNVHR8E +# djB0MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1 +# cmVkSURDQS0xLmNybDA4oDagNIYyaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0Rp +# Z2lDZXJ0QXNzdXJlZElEQ0EtMS5jcmwwdwYIKwYBBQUHAQEEazBpMCQGCCsGAQUF +# BzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQQYIKwYBBQUHMAKGNWh0dHA6 +# Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRENBLTEuY3J0 +# MA0GCSqGSIb3DQEBBQUAA4IBAQCdJX4bM02yJoFcm4bOIyAPgIfliP//sdRqLDHt +# OhcZcRfNqRu8WhY5AJ3jbITkWkD73gYBjDf6m7GdJH7+IKRXrVu3mrBgJuppVyFd +# NC8fcbCDlBkFazWQEKB7l8f2P+fiEUGmvWLZ8Cc9OB0obzpSCfDscGLTYkuw4HOm +# ksDTjjHYL+NtFxMG7uQDthSr849Dp3GdId0UyhVdkkHa+Q+B0Zl0DSbEDn8btfWg +# 8cZ3BigV6diT5VUW8LsKqxzbXEgnZsijiwoc5ZXarsQuWaBh3drzbaJh6YoLbewS +# GL33VVRAA5Ira8JRwgpIr7DUbuD0FAo6G+OPPcqvao173NhEMIIGzTCCBbWgAwIB +# AgIQBv35A5YDreoACus/J7u6GzANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJV +# UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +# Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYx +# MTEwMDAwMDAwWhcNMjExMTEwMDAwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UE +# ChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYD +# VQQDExhEaWdpQ2VydCBBc3N1cmVkIElEIENBLTEwggEiMA0GCSqGSIb3DQEBAQUA +# A4IBDwAwggEKAoIBAQDogi2Z+crCQpWlgHNAcNKeVlRcqcTSQQaPyTP8TUWRXIGf +# 7Syc+BZZ3561JBXCmLm0d0ncicQK2q/LXmvtrbBxMevPOkAMRk2T7It6NggDqww0 +# /hhJgv7HxzFIgHweog+SDlDJxofrNj/YMMP/pvf7os1vcyP+rFYFkPAyIRaJxnCI +# +QWXfaPHQ90C6Ds97bFBo+0/vtuVSMTuHrPyvAwrmdDGXRJCgeGDboJzPyZLFJCu +# WWYKxI2+0s4Grq2Eb0iEm09AufFM8q+Y+/bOQF1c9qjxL6/siSLyaxhlscFzrdfx +# 2M8eCnRcQrhofrfVdwonVnwPYqQ/MhRglf0HBKIJAgMBAAGjggN6MIIDdjAOBgNV +# HQ8BAf8EBAMCAYYwOwYDVR0lBDQwMgYIKwYBBQUHAwEGCCsGAQUFBwMCBggrBgEF +# BQcDAwYIKwYBBQUHAwQGCCsGAQUFBwMIMIIB0gYDVR0gBIIByTCCAcUwggG0Bgpg +# hkgBhv1sAAEEMIIBpDA6BggrBgEFBQcCARYuaHR0cDovL3d3dy5kaWdpY2VydC5j +# b20vc3NsLWNwcy1yZXBvc2l0b3J5Lmh0bTCCAWQGCCsGAQUFBwICMIIBVh6CAVIA +# QQBuAHkAIAB1AHMAZQAgAG8AZgAgAHQAaABpAHMAIABDAGUAcgB0AGkAZgBpAGMA +# YQB0AGUAIABjAG8AbgBzAHQAaQB0AHUAdABlAHMAIABhAGMAYwBlAHAAdABhAG4A +# YwBlACAAbwBmACAAdABoAGUAIABEAGkAZwBpAEMAZQByAHQAIABDAFAALwBDAFAA +# UwAgAGEAbgBkACAAdABoAGUAIABSAGUAbAB5AGkAbgBnACAAUABhAHIAdAB5ACAA +# QQBnAHIAZQBlAG0AZQBuAHQAIAB3AGgAaQBjAGgAIABsAGkAbQBpAHQAIABsAGkA +# YQBiAGkAbABpAHQAeQAgAGEAbgBkACAAYQByAGUAIABpAG4AYwBvAHIAcABvAHIA +# YQB0AGUAZAAgAGgAZQByAGUAaQBuACAAYgB5ACAAcgBlAGYAZQByAGUAbgBjAGUA +# LjALBglghkgBhv1sAxUwEgYDVR0TAQH/BAgwBgEB/wIBADB5BggrBgEFBQcBAQRt +# MGswJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEF +# BQcwAoY3aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJl +# ZElEUm9vdENBLmNydDCBgQYDVR0fBHoweDA6oDigNoY0aHR0cDovL2NybDMuZGln +# aWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNybDA6oDigNoY0aHR0 +# cDovL2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNy +# bDAdBgNVHQ4EFgQUFQASKxOYspkH7R7for5XDStnAs0wHwYDVR0jBBgwFoAUReui +# r/SSy4IxLVGLp6chnfNtyA8wDQYJKoZIhvcNAQEFBQADggEBAEZQPsm3KCSnOB22 +# WymvUs9S6TFHq1Zce9UNC0Gz7+x1H3Q48rJcYaKclcNQ5IK5I9G6OoZyrTh4rHVd +# Fxc0ckeFlFbR67s2hHfMJKXzBBlVqefj56tizfuLLZDCwNK1lL1eT7EF0g49GqkU +# W6aGMWKoqDPkmzmnxPXOHXh2lCVz5Cqrz5x2S+1fwksW5EtwTACJHvzFebxMElf+ +# X+EevAJdqP77BzhPDcZdkbkPZ0XN1oPt55INjbFpjE/7WeAjD9KqrgB87pxCDs+R +# 1ye3Fu4Pw718CqDuLAhVhSK46xgaTfwqIa1JMYNHlXdx3LEbS0scEJx3FMGdTy9a +# lQgpECYxggQ7MIIENwIBATCBhjByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGln +# aUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhE +# aWdpQ2VydCBTSEEyIEFzc3VyZWQgSUQgQ29kZSBTaWduaW5nIENBAhADtHHNTX/+ +# wpo7ILLLD19UMAkGBSsOAwIaBQCgeDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAA +# MBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgor +# BgEEAYI3AgEVMCMGCSqGSIb3DQEJBDEWBBQYqTK+5RS95764dNPZ2T3z0jT+UDAN +# BgkqhkiG9w0BAQEFAASCAQBxPm4AI4omYJmPEnd/OaN+l/cm2ub2D432zRg8Nr0m +# 90TANmuNHLv9du3G4eKSqmKlAu9cVbhfqnioaiwC05bSO02gaH8q1bFBVANkD/e5 +# igGzGvYxP+Vqfa8xv8kiN0aNOOsznMrpCA8pcncPtNhiblyG0ipecLtCzTZoiDcA +# +dHLd54E9NcYqm/SZuHHD5Fk2jqwIDAAFHokU2eNZWGxB9Gx+ey3G4DekQEqkUDR +# LmEdq0OZeZULqeQQnGQ8grx0PmwxRTDBI7RkA/UGQTW4ibFfJfgdYjdQVWqguEtL +# 5dPmqZyOdF8AapUwGnDpzqPmZy+WPYetrOHHwf2y1v1hoYICDzCCAgsGCSqGSIb3 +# DQEJBjGCAfwwggH4AgEBMHYwYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lD +# ZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGln +# aUNlcnQgQXNzdXJlZCBJRCBDQS0xAhADAZoCOv9YsWvW1ermF/BmMAkGBSsOAwIa +# BQCgXTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0x +# NjA2MDMxODA2MzlaMCMGCSqGSIb3DQEJBDEWBBRxXYss0beJT3njEEWEltXbgfi9 +# 4zANBgkqhkiG9w0BAQEFAASCAQB1oq4vjrzr+8WHyhrhGzfMoTyYW6vGVBu6hVfB +# hsC0Wm1n6oebLNzGNmpaatmYtsV4syIDSdlQfIb9SkHJ173uTIUCWPS1jY1lqUF8 +# sXEYqgh74X5aDfTArA7geKdSBplnKg3oo+/8fF8NFE3wY8nQ5JXAWs8AgeQYeT5H +# KsOsWxCGlzN/3WvW3UfABUPzPMTUNdPpUh6WO/9L7HcN2uBg0CVemtpc3Da2IXyx +# +rKQkzeoCHAaUlEhvhUSQTvY4Sq0Wn2NKEWfHJrP7pFQvQ3xissPLnJu+HWPepKM +# 2W2kPrQBRL0MvZhtgrEx7Gmydf2GoU2UlMjll69spQ3yA2GG +# SIG # End signature block diff --git a/windowsRuntimeInstaller/InstallerRT.nsi b/windowsRuntimeInstaller/InstallerRT.nsi index 680a14a3..077beaea 100644 --- a/windowsRuntimeInstaller/InstallerRT.nsi +++ b/windowsRuntimeInstaller/InstallerRT.nsi @@ -86,10 +86,6 @@ Var IDir # Install count Var IC -# Error code from powershell script -Var PsErr - - ############################################# # StrRep - string replace @@ -238,10 +234,6 @@ Section # Turn on logging LogSet on - # Remove contents of temp dir - SetOutPath "$TEMP\VulkanRT" - RmDir /R "$TEMP\VulkanRT" - # If running on a 64-bit OS machine, disable registry re-direct since we're running as a 32-bit executable. ${If} ${RunningX64} @@ -251,15 +243,16 @@ Section ${Endif} # Create our temp directory, with minimal permissions - SetOutPath "$TEMP\VulkanRT" - AccessControl::DisableFileInheritance $TEMP\VulkanRT - AccessControl::SetFileOwner $TEMP\VulkanRT "Administrators" - AccessControl::ClearOnFile $TEMP\VulkanRT "Administrators" "FullAccess" - AccessControl::SetOnFile $TEMP\VulkanRT "SYSTEM" "FullAccess" - AccessControl::GrantOnFile $TEMP\VulkanRT "Everyone" "ListDirectory" - AccessControl::GrantOnFile $TEMP\VulkanRT "Everyone" "GenericExecute" - AccessControl::GrantOnFile $TEMP\VulkanRT "Everyone" "GenericRead" - AccessControl::GrantOnFile $TEMP\VulkanRT "Everyone" "ReadAttributes" + RmDir /R "$TEMP\VulkanRTinstall" + SetOutPath "$TEMP\VulkanRTinstall" + AccessControl::DisableFileInheritance $TEMP\VulkanRTinstall + AccessControl::SetFileOwner $TEMP\VulkanRTinstall "Administrators" + AccessControl::ClearOnFile $TEMP\VulkanRTinstall "Administrators" "FullAccess" + AccessControl::SetOnFile $TEMP\VulkanRTinstall "SYSTEM" "FullAccess" + AccessControl::GrantOnFile $TEMP\VulkanRTinstall "Everyone" "ListDirectory" + AccessControl::GrantOnFile $TEMP\VulkanRTinstall "Everyone" "GenericExecute" + AccessControl::GrantOnFile $TEMP\VulkanRTinstall "Everyone" "GenericRead" + AccessControl::GrantOnFile $TEMP\VulkanRTinstall "Everyone" "ReadAttributes" StrCpy $1 10 Call CheckForError @@ -418,12 +411,18 @@ Section # Run the ConfigLayersAndVulkanDLL.ps1 script to copy the most recent version of # vulkan--*.dll to vulkan-.dll, and to set up layer registry # entries to use layers from the corresponding SDK - nsExec::ExecToStack 'powershell -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -ExecutionPolicy RemoteSigned -File ConfigLayersAndVulkanDLL.ps1 ${VERSION_ABI_MAJOR} 64' - pop $PsErr - ${If} $PsErr != 0 + nsExec::ExecToStack 'powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -ExecutionPolicy RemoteSigned -Command .\ConfigLayersAndVulkanDLL.ps1 ${VERSION_ABI_MAJOR} 64 ; exit $$LASTEXITCODE' + pop $0 + Rename "$TEMP\ConfigLayersAndVulkanDLL.log" "$TEMP\VulkanRTinstall\ConfigLayersAndVulkanDLL.log" + ${If} $0 != 0 + # PS Script failed, see if we can run a simple ps command and a simple ps script + nsExec::ExecToStack 'powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -Command Write-Output Diagnostic0 | Out-File -encoding ascii -filePath "$TEMP\VulkanRTinstall\Diagnostic0.log"' + File Diagnostic1.ps1 + nsExec::ExecToStack 'powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -ExecutionPolicy RemoteSigned -Command .\Diagnostic1.ps1' + Delete Diagnostic1.ps1 SetErrors ${EndIf} - StrCpy $1 45 + IntOp $1 10000 + $0 Call CheckForError # Else, running on a 32-bit OS machine @@ -446,12 +445,18 @@ Section # Run the ConfigLayersAndVulkanDLL.ps1 script to copy the most recent version of # vulkan--*.dll to vulkan-.dll, and to set up layer registry # entries to use layers from the corresponding SDK - nsExec::ExecToStack 'powershell -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -ExecutionPolicy RemoteSigned -File ConfigLayersAndVulkanDLL.ps1 ${VERSION_ABI_MAJOR} 32' - pop $PsErr - ${If} $PsErr != 0 + nsExec::ExecToStack 'powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -ExecutionPolicy RemoteSigned -Command .\ConfigLayersAndVulkanDLL.ps1 ${VERSION_ABI_MAJOR} 32 ; exit $$LASTEXITCODE' + pop $0 + Rename "$TEMP\ConfigLayersAndVulkanDLL.log" "$TEMP\VulkanRTinstall\ConfigLayersAndVulkanDLL.log" + ${If} $0 != 0 + # PS Script failed, see if we can run a simple ps command and a simple ps script + nsExec::ExecToStack 'powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -Command Write-Output Diagnostic0 | Out-File -encoding ascii -filePath "$TEMP\VulkanRTinstall\Diagnostic0.log"' + File Diagnostic1.ps1 + nsExec::ExecToStack 'powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -ExecutionPolicy RemoteSigned -Command .\Diagnostic1.ps1' + Delete Diagnostic1.ps1 SetErrors ${EndIf} - StrCpy $1 60 + IntOp $1 20000 + $0 Call CheckForError ${Endif} @@ -462,7 +467,7 @@ Section # Finish logging and move log file to TEMP dir LogSet off - Rename "$INSTDIR\install.log" "$TEMP\VulkanRT\Install.log" + Rename "$INSTDIR\install.log" "$TEMP\VulkanRTinstall\Install.log" SectionEnd @@ -470,12 +475,10 @@ SectionEnd !ifdef UNINSTALLER Section "uninstall" - # Remove contents of temp dir - SetOutPath "$TEMP\VulkanRT" - RmDir /R "$TEMP\VulkanRT" - # Turn on logging - StrCpy $INSTDIR $TEMP\VulkanRT + RmDir /R "$TEMP\VulkanRTuninstall" + SetOutPath "$TEMP\VulkanRTuninstall" + StrCpy $INSTDIR $TEMP\VulkanRTuninstall LogSet on # If running on a 64-bit OS machine, disable registry re-direct since we're running as a 32-bit executable. @@ -553,7 +556,8 @@ Section "uninstall" # Copy the most recent version of vulkan--*.dll to vulkan-.dll # Copy the most recent version of vulkaninfo--*.exe to vulkaninfo.exe # Set up layer registry entries to use layers from the corresponding SDK - nsExec::ExecToStack 'powershell -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -ExecutionPolicy RemoteSigned -File "$IDir\ConfigLayersAndVulkanDLL.ps1" ${VERSION_ABI_MAJOR} 64' + nsExec::ExecToStack 'powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -ExecutionPolicy RemoteSigned -File "$IDir\ConfigLayersAndVulkanDLL.ps1" ${VERSION_ABI_MAJOR} 64' + Rename "$TEMP\ConfigLayersAndVulkanDLL.log" "$TEMP\VulkanRTuninstall\ConfigLayersAndVulkanDLL.log" # Else, running on a 32-bit OS machine ${Else} @@ -570,7 +574,8 @@ Section "uninstall" # Copy the most recent version of vulkan--*.dll to vulkan-.dll # Copy the most recent version of vulkaninfo--*.exe to vulkaninfo.exe # Set up layer registry entries to use layers from the corresponding SDK - nsExec::ExecToStack 'powershell -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -ExecutionPolicy RemoteSigned -File "$IDir\ConfigLayersAndVulkanDLL.ps1" ${VERSION_ABI_MAJOR} 32' + nsExec::ExecToStack 'powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -ExecutionPolicy RemoteSigned -File "$IDir\ConfigLayersAndVulkanDLL.ps1" ${VERSION_ABI_MAJOR} 32' + Rename "$TEMP\ConfigLayersAndVulkanDLL.log" "$TEMP\VulkanRTuninstall\ConfigLayersAndVulkanDLL.log" ${EndIf} @@ -621,7 +626,7 @@ Section "uninstall" StrCpy $1 80 Call un.CheckForError - # Finish logging and move log file to TEMP dir + # Finish logging LogSet off Rename "$INSTDIR\install.log" "$INSTDIR\Uninstall.log" @@ -667,19 +672,18 @@ Function CheckForError # Finish logging and move log file to TEMP dir LogSet off - Rename "$INSTDIR\install.log" "$TEMP\VulkanRT\install.log" + Rename "$INSTDIR\install.log" "$TEMP\VulkanRTinstall\install.log" # Copy the uninstaller to a temp folder of our own creation so we can completely # delete the old contents. - SetOutPath "$TEMP\VulkanRT" - CopyFiles "$INSTDIR\Uninstall${PRODUCTNAME}.exe" "$TEMP\VulkanRT" + SetOutPath "$TEMP\VulkanRTinstall" + CopyFiles "$INSTDIR\Uninstall${PRODUCTNAME}.exe" "$TEMP\VulkanRTinstall" - # No uninstall using the version in the temporary folder. - ExecWait '"$TEMP\VulkanRT\Uninstall${PRODUCTNAME}.exe" /S _?=$INSTDIR' + # Do uninstall using the version in the temporary folder. + ExecWait '"$TEMP\VulkanRTinstall\Uninstall${PRODUCTNAME}.exe" /S _?=$INSTDIR' # Delete the copy of the uninstaller we ran - Delete /REBOOTOK "$TEMP\VulkanRT\Uninstall${PRODUCTNAME}.exe" - RmDir /R /REBOOTOK "$TEMP\VulkanRT" + Delete /REBOOTOK "$TEMP\VulkanRTinstall\Uninstall${PRODUCTNAME}.exe" # Set an error message to output SetErrorLevel $1 @@ -700,8 +704,7 @@ Function un.CheckForError # Finish logging and move log file to TEMP dir LogSet off - Delete "$TEMP\VulkanRT\Uninstall.log" - Rename "$INSTDIR\install.log" "$TEMP\VulkanRT\Uninstall.log" + Delete "$TEMP\VulkanRTuninstall\Uninstall.log" Quit ${EndIf} -- cgit v1.2.3 From c451d6dd60d5cf02ff718ee440ccf9a85ee671a8 Mon Sep 17 00:00:00 2001 From: David Pinedo Date: Fri, 3 Jun 2016 18:32:58 -0600 Subject: winrtinstaller: add more logging debug code to powershell script invocation --- windowsRuntimeInstaller/InstallerRT.nsi | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/windowsRuntimeInstaller/InstallerRT.nsi b/windowsRuntimeInstaller/InstallerRT.nsi index 077beaea..6421c00a 100644 --- a/windowsRuntimeInstaller/InstallerRT.nsi +++ b/windowsRuntimeInstaller/InstallerRT.nsi @@ -415,6 +415,7 @@ Section pop $0 Rename "$TEMP\ConfigLayersAndVulkanDLL.log" "$TEMP\VulkanRTinstall\ConfigLayersAndVulkanDLL.log" ${If} $0 != 0 + LogText "ConfigLayersAndVulkanDLL.ps1 return value is $0" # PS Script failed, see if we can run a simple ps command and a simple ps script nsExec::ExecToStack 'powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -Command Write-Output Diagnostic0 | Out-File -encoding ascii -filePath "$TEMP\VulkanRTinstall\Diagnostic0.log"' File Diagnostic1.ps1 @@ -449,6 +450,7 @@ Section pop $0 Rename "$TEMP\ConfigLayersAndVulkanDLL.log" "$TEMP\VulkanRTinstall\ConfigLayersAndVulkanDLL.log" ${If} $0 != 0 + LogText "ConfigLayersAndVulkanDLL.ps1 return value is $0" # PS Script failed, see if we can run a simple ps command and a simple ps script nsExec::ExecToStack 'powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -Command Write-Output Diagnostic0 | Out-File -encoding ascii -filePath "$TEMP\VulkanRTinstall\Diagnostic0.log"' File Diagnostic1.ps1 @@ -628,7 +630,7 @@ Section "uninstall" # Finish logging LogSet off - Rename "$INSTDIR\install.log" "$INSTDIR\Uninstall.log" + Rename "$INSTDIR\install.log" "$TEMP\VulkanRTuninstall\Uninstall.log" SectionEnd !endif @@ -704,7 +706,7 @@ Function un.CheckForError # Finish logging and move log file to TEMP dir LogSet off - Delete "$TEMP\VulkanRTuninstall\Uninstall.log" + Rename "$INSTDIR\install.log" "$TEMP\VulkanRTuninstall\Uninstall.log" Quit ${EndIf} -- cgit v1.2.3 From 2ffbfd804be77580c5bab991d2715eecf1346128 Mon Sep 17 00:00:00 2001 From: David Pinedo Date: Mon, 6 Jun 2016 09:09:13 -0600 Subject: winsdkinstaller: add cmd copy as additional diagnosic for ps failure --- windowsRuntimeInstaller/InstallerRT.nsi | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/windowsRuntimeInstaller/InstallerRT.nsi b/windowsRuntimeInstaller/InstallerRT.nsi index 6421c00a..270447d6 100644 --- a/windowsRuntimeInstaller/InstallerRT.nsi +++ b/windowsRuntimeInstaller/InstallerRT.nsi @@ -415,12 +415,27 @@ Section pop $0 Rename "$TEMP\ConfigLayersAndVulkanDLL.log" "$TEMP\VulkanRTinstall\ConfigLayersAndVulkanDLL.log" ${If} $0 != 0 - LogText "ConfigLayersAndVulkanDLL.ps1 return value is $0" - # PS Script failed, see if we can run a simple ps command and a simple ps script + # PS Script failed, see if we can run a ps command, a ps script, and/or a cmd copy + LogText "ConfigLayersAndVulkanDLL.ps1 rval1 is $0" + pop $1 + LogText "ConfigLayersAndVulkanDLL.ps1 rval2 is $1" nsExec::ExecToStack 'powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -Command Write-Output Diagnostic0 | Out-File -encoding ascii -filePath "$TEMP\VulkanRTinstall\Diagnostic0.log"' + pop $1 + LogText "ps cmd rval1 is $1" + pop $1 + LogText "ps cmd rval2 is $1" File Diagnostic1.ps1 nsExec::ExecToStack 'powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -ExecutionPolicy RemoteSigned -Command .\Diagnostic1.ps1' + pop $1 + LogText "ps script rval1 is $1" + pop $1 + LogText "ps script rval2 is $1" Delete Diagnostic1.ps1 + nsExec::ExecToStack 'cmd /k copy /y nul "$TEMP\VulkanRTinstall\Diagnostic2.log"' + pop $1 + LogText "cmd rval1 is $1" + pop $1 + LogText "cmd rval2 is $1" SetErrors ${EndIf} IntOp $1 10000 + $0 @@ -630,7 +645,7 @@ Section "uninstall" # Finish logging LogSet off - Rename "$INSTDIR\install.log" "$TEMP\VulkanRTuninstall\Uninstall.log" + Rename "$INSTDIR\install.log" "$TEMP\VulkanRTuninstall\uninstall.log" SectionEnd !endif @@ -706,7 +721,7 @@ Function un.CheckForError # Finish logging and move log file to TEMP dir LogSet off - Rename "$INSTDIR\install.log" "$TEMP\VulkanRTuninstall\Uninstall.log" + Rename "$INSTDIR\install.log" "$TEMP\VulkanRTuninstall\uninstall.log" Quit ${EndIf} -- cgit v1.2.3 From 849ffee6d36b3f7c6e6723c4b62f56822c3741e5 Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Thu, 19 May 2016 15:27:18 -0600 Subject: layers: Add default layer error message config Allows layers to output error messages even if no vk_layer_settings.txt config file is present. Sets defaults to LOG_MSG, error, stdout. A layer settings file will override any default values. If no settings file is present and an app creates a debug callback, the default callbacks will be removed and unregistered. Change-Id: I49f37189665816df58c258b9e9629f2bf76751c8 --- include/vulkan/vk_layer.h | 20 +++-- layers/core_validation.cpp | 2 +- layers/device_limits.cpp | 2 +- layers/image.cpp | 2 +- layers/parameter_validation.cpp | 2 +- layers/swapchain.cpp | 2 +- layers/threading.cpp | 2 +- layers/vk_layer_config.cpp | 168 ++++++++++++++++-------------------- layers/vk_layer_config.h | 26 +++++- layers/vk_layer_logging.h | 183 +++++++++++++++++++++++----------------- layers/vk_layer_utils.cpp | 29 +++++-- vk-layer-generate.py | 3 +- 12 files changed, 245 insertions(+), 196 deletions(-) diff --git a/include/vulkan/vk_layer.h b/include/vulkan/vk_layer.h index cf16b2b7..6f49e07f 100644 --- a/include/vulkan/vk_layer.h +++ b/include/vulkan/vk_layer.h @@ -234,22 +234,28 @@ typedef struct VkLayerInstanceDispatchTable_ { CreateDisplayPlaneSurfaceKHR; } VkLayerInstanceDispatchTable; + // LL node for tree of dbg callback functions typedef struct VkLayerDbgFunctionNode_ { VkDebugReportCallbackEXT msgCallback; PFN_vkDebugReportCallbackEXT pfnMsgCallback; VkFlags msgFlags; void *pUserData; + bool default_callback; struct VkLayerDbgFunctionNode_ *pNext; } VkLayerDbgFunctionNode; -typedef enum VkLayerDbgAction_ { - VK_DBG_LAYER_ACTION_IGNORE = 0x0, - VK_DBG_LAYER_ACTION_CALLBACK = 0x1, - VK_DBG_LAYER_ACTION_LOG_MSG = 0x2, - VK_DBG_LAYER_ACTION_BREAK = 0x4, - VK_DBG_LAYER_ACTION_DEBUG_OUTPUT = 0x8, -} VkLayerDbgAction; +// TODO: Move debug action definitions out of this header file +// Definitions for Debug Actions +typedef enum VkLayerDbgActionBits { + VK_DBG_LAYER_ACTION_IGNORE = 0x00000000, + VK_DBG_LAYER_ACTION_CALLBACK = 0x00000001, + VK_DBG_LAYER_ACTION_LOG_MSG = 0x00000002, + VK_DBG_LAYER_ACTION_BREAK = 0x00000004, + VK_DBG_LAYER_ACTION_DEBUG_OUTPUT = 0x00000008, + VK_DBG_LAYER_ACTION_DEFAULT = 0x40000000, +} VkLayerDbgActionBits; +typedef VkFlags VkLayerDbgActionFlags; // ------------------------------------------------------------------------------------------------ // CreateInstance and CreateDevice support structures diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 49324b82..b602b7cd 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -9857,7 +9857,7 @@ CreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCre VkResult res = pTable->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback); if (VK_SUCCESS == res) { std::lock_guard lock(global_lock); - res = layer_create_msg_callback(my_data->report_data, pCreateInfo, pAllocator, pMsgCallback); + res = layer_create_msg_callback(my_data->report_data, false, pCreateInfo, pAllocator, pMsgCallback); } return res; } diff --git a/layers/device_limits.cpp b/layers/device_limits.cpp index df52cf31..374911b4 100644 --- a/layers/device_limits.cpp +++ b/layers/device_limits.cpp @@ -647,7 +647,7 @@ CreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCre layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map); VkResult res = my_data->instance_dispatch_table->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback); if (VK_SUCCESS == res) { - res = layer_create_msg_callback(my_data->report_data, pCreateInfo, pAllocator, pMsgCallback); + res = layer_create_msg_callback(my_data->report_data, false, pCreateInfo, pAllocator, pMsgCallback); } return res; } diff --git a/layers/image.cpp b/layers/image.cpp index 81140e9d..1fb7d5a0 100644 --- a/layers/image.cpp +++ b/layers/image.cpp @@ -90,7 +90,7 @@ CreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCre layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map); VkResult res = my_data->instance_dispatch_table->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback); if (res == VK_SUCCESS) { - res = layer_create_msg_callback(my_data->report_data, pCreateInfo, pAllocator, pMsgCallback); + res = layer_create_msg_callback(my_data->report_data, false, pCreateInfo, pAllocator, pMsgCallback); } return res; } diff --git a/layers/parameter_validation.cpp b/layers/parameter_validation.cpp index c70142bb..fe9e391c 100644 --- a/layers/parameter_validation.cpp +++ b/layers/parameter_validation.cpp @@ -111,7 +111,7 @@ CreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCre if (result == VK_SUCCESS) { layer_data *data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map); - result = layer_create_msg_callback(data->report_data, pCreateInfo, pAllocator, pMsgCallback); + result = layer_create_msg_callback(data->report_data, false, pCreateInfo, pAllocator, pMsgCallback); } return result; diff --git a/layers/swapchain.cpp b/layers/swapchain.cpp index 1642468d..96691f14 100644 --- a/layers/swapchain.cpp +++ b/layers/swapchain.cpp @@ -2099,7 +2099,7 @@ CreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCre my_data->instance_dispatch_table->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback); if (VK_SUCCESS == result) { std::lock_guard lock(global_lock); - result = layer_create_msg_callback(my_data->report_data, pCreateInfo, pAllocator, pMsgCallback); + result = layer_create_msg_callback(my_data->report_data, false, pCreateInfo, pAllocator, pMsgCallback); } return result; } diff --git a/layers/threading.cpp b/layers/threading.cpp index f5d37eba..c69a8b62 100644 --- a/layers/threading.cpp +++ b/layers/threading.cpp @@ -285,7 +285,7 @@ CreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCre VkResult result = my_data->instance_dispatch_table->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pMsgCallback); if (VK_SUCCESS == result) { - result = layer_create_msg_callback(my_data->report_data, pCreateInfo, pAllocator, pMsgCallback); + result = layer_create_msg_callback(my_data->report_data, false, pCreateInfo, pAllocator, pMsgCallback); } finishReadObject(my_data, instance); return result; diff --git a/layers/vk_layer_config.cpp b/layers/vk_layer_config.cpp index d67f4053..049ffdcc 100644 --- a/layers/vk_layer_config.cpp +++ b/layers/vk_layer_config.cpp @@ -19,6 +19,7 @@ * Author: Jon Ashburn * Author: Courtney Goeltzenleuchter * Author: Tobin Ehlis + * Author: Mark Lobodzinski **************************************************************************/ #include #include @@ -48,50 +49,10 @@ class ConfigFile { static ConfigFile g_configFileObj; -static VkLayerDbgAction stringToDbgAction(const char *_enum) { - // only handles single enum values - if (!strcmp(_enum, "VK_DBG_LAYER_ACTION_IGNORE")) - return VK_DBG_LAYER_ACTION_IGNORE; - else if (!strcmp(_enum, "VK_DBG_LAYER_ACTION_LOG_MSG")) - return VK_DBG_LAYER_ACTION_LOG_MSG; -#ifdef WIN32 - else if (!strcmp(_enum, "VK_DBG_LAYER_ACTION_DEBUG_OUTPUT")) - return VK_DBG_LAYER_ACTION_DEBUG_OUTPUT; -#endif - else if (!strcmp(_enum, "VK_DBG_LAYER_ACTION_BREAK")) - return VK_DBG_LAYER_ACTION_BREAK; - return (VkLayerDbgAction)0; -} - -static VkFlags stringToDbgReportFlags(const char *_enum) { - // only handles single enum values - if (!strcmp(_enum, "VK_DEBUG_REPORT_INFO")) - return VK_DEBUG_REPORT_INFORMATION_BIT_EXT; - else if (!strcmp(_enum, "VK_DEBUG_REPORT_WARN")) - return VK_DEBUG_REPORT_WARNING_BIT_EXT; - else if (!strcmp(_enum, "VK_DEBUG_REPORT_PERF_WARN")) - return VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT; - else if (!strcmp(_enum, "VK_DEBUG_REPORT_ERROR")) - return VK_DEBUG_REPORT_ERROR_BIT_EXT; - else if (!strcmp(_enum, "VK_DEBUG_REPORT_DEBUG")) - return VK_DEBUG_REPORT_DEBUG_BIT_EXT; - return (VkFlags)0; -} - -static unsigned int convertStringEnumVal(const char *_enum) { - unsigned int ret; - - ret = stringToDbgAction(_enum); - if (ret) - return ret; - - return stringToDbgReportFlags(_enum); -} - const char *getLayerOption(const char *_option) { return g_configFileObj.getOption(_option); } // If option is NULL or stdout, return stdout, otherwise try to open option -// as a filename. If successful, return file handle, otherwise stdout +// as a filename. If successful, return file handle, otherwise stdout FILE *getLayerLogOutput(const char *_option, const char *layerName) { FILE *log_output = NULL; if (!_option || !strcmp("stdout", _option)) @@ -110,64 +71,84 @@ FILE *getLayerLogOutput(const char *_option, const char *layerName) { return log_output; } -VkDebugReportFlagsEXT getLayerOptionFlags(const char *_option, uint32_t optionDefault) { - VkDebugReportFlagsEXT flags = optionDefault; - const char *option = (g_configFileObj.getOption(_option)); - - /* parse comma-separated options */ - while (option) { - const char *p = strchr(option, ','); - size_t len; - - if (p) - len = p - option; - else - len = strlen(option); - - if (len > 0) { - if (strncmp(option, "warn", len) == 0) { - flags |= VK_DEBUG_REPORT_WARNING_BIT_EXT; - } else if (strncmp(option, "info", len) == 0) { - flags |= VK_DEBUG_REPORT_INFORMATION_BIT_EXT; - } else if (strncmp(option, "perf", len) == 0) { - flags |= VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT; - } else if (strncmp(option, "error", len) == 0) { - flags |= VK_DEBUG_REPORT_ERROR_BIT_EXT; - } else if (strncmp(option, "debug", len) == 0) { - flags |= VK_DEBUG_REPORT_DEBUG_BIT_EXT; - } +// Map option strings to flag enum values +VkFlags GetLayerOptionFlags(std::string _option, std::unordered_map const &enum_data, + uint32_t option_default) { + VkDebugReportFlagsEXT flags = option_default; + std::string option_list = g_configFileObj.getOption(_option.c_str()); + + while (option_list.length() != 0) { + + // Find length of option string + std::size_t option_length = option_list.find(","); + if (option_length == option_list.npos) { + option_length = option_list.size(); } - if (!p) - break; + // Get first option in list + const std::string option = option_list.substr(0, option_length); - option = p + 1; - } - return flags; -} + auto enum_value = enum_data.find(option); + if (enum_value != enum_data.end()) { + flags |= enum_value->second; + } -bool getLayerOptionEnum(const char *_option, uint32_t *optionDefault) { - bool res; - const char *option = (g_configFileObj.getOption(_option)); - if (option != NULL) { - *optionDefault = convertStringEnumVal(option); - res = false; - } else { - res = true; + // Remove first option from option_list + option_list.erase(0, option_length); + // Remove possible comma separator + std::size_t char_position = option_list.find(","); + if (char_position == 0) { + option_list.erase(char_position, 1); + } + // Remove possible space + char_position = option_list.find(" "); + if (char_position == 0) { + option_list.erase(char_position, 1); + } } - return res; -} - -void setLayerOptionEnum(const char *_option, const char *_valEnum) { - unsigned int val = convertStringEnumVal(_valEnum); - char strVal[24]; - snprintf(strVal, 24, "%u", val); - g_configFileObj.setOption(_option, strVal); + return flags; } void setLayerOption(const char *_option, const char *_val) { g_configFileObj.setOption(_option, _val); } -ConfigFile::ConfigFile() : m_fileIsParsed(false) {} +// Constructor for ConfigFile. Initialize layers to log error messages to stdout by default. If a vk_layer_settings file is present, +// its settings will override the defaults. +ConfigFile::ConfigFile() : m_fileIsParsed(false) { + m_valueMap["lunarg_device_limits.report_flags"] = "error"; + m_valueMap["lunarg_core_validation.report_flags"] = "error"; + m_valueMap["lunarg_image.report_flags"] = "error"; + m_valueMap["lunarg_object_tracker.report_flags"] = "error"; + m_valueMap["lunarg_parameter_validation.report_flags"] = "error"; + m_valueMap["lunarg_swapchain.report_flags"] = "error"; + m_valueMap["google_threading.report_flags"] = "error"; + +#ifdef WIN32 + // For Windows, enable message logging AND OutputDebugString + m_valueMap["lunarg_device_limits.debug_action"] = "VK_DBG_LAYER_ACTION_DEFAULT,VK_DBG_LAYER_ACTION_LOG_MSG,VK_DBG_LAYER_ACTION_DEBUG_OUTPUT"; + m_valueMap["lunarg_core_validation.debug_action"] = "VK_DBG_LAYER_ACTION_DEFAULT,VK_DBG_LAYER_ACTION_LOG_MSG,VK_DBG_LAYER_ACTION_DEBUG_OUTPUT"; + m_valueMap["lunarg_image.debug_action"] = "VK_DBG_LAYER_ACTION_DEFAULT,VK_DBG_LAYER_ACTION_LOG_MSG,VK_DBG_LAYER_ACTION_DEBUG_OUTPUT"; + m_valueMap["lunarg_object_tracker.debug_action"] = "VK_DBG_LAYER_ACTION_DEFAULT,VK_DBG_LAYER_ACTION_LOG_MSG,VK_DBG_LAYER_ACTION_DEBUG_OUTPUT"; + m_valueMap["lunarg_parameter_validation.debug_action"] = "VK_DBG_LAYER_ACTION_DEFAULT,VK_DBG_LAYER_ACTION_LOG_MSG,VK_DBG_LAYER_ACTION_DEBUG_OUTPUT"; + m_valueMap["lunarg_swapchain.debug_action"] = "VK_DBG_LAYER_ACTION_DEFAULT,VK_DBG_LAYER_ACTION_LOG_MSG,VK_DBG_LAYER_ACTION_DEBUG_OUTPUT"; + m_valueMap["google_threading.debug_action"] = "VK_DBG_LAYER_ACTION_DEFAULT,VK_DBG_LAYER_ACTION_LOG_MSG,VK_DBG_LAYER_ACTION_DEBUG_OUTPUT"; +#else // WIN32 + m_valueMap["lunarg_device_limits.debug_action"] = "VK_DBG_LAYER_ACTION_DEFAULT,VK_DBG_LAYER_ACTION_LOG_MSG"; + m_valueMap["lunarg_core_validation.debug_action"] = "VK_DBG_LAYER_ACTION_DEFAULT,VK_DBG_LAYER_ACTION_LOG_MSG"; + m_valueMap["lunarg_image.debug_action"] = "VK_DBG_LAYER_ACTION_DEFAULT,VK_DBG_LAYER_ACTION_LOG_MSG"; + m_valueMap["lunarg_object_tracker.debug_action"] = "VK_DBG_LAYER_ACTION_DEFAULT,VK_DBG_LAYER_ACTION_LOG_MSG"; + m_valueMap["lunarg_parameter_validation.debug_action"] = "VK_DBG_LAYER_ACTION_DEFAULT,VK_DBG_LAYER_ACTION_LOG_MSG"; + m_valueMap["lunarg_swapchain.debug_action"] = "VK_DBG_LAYER_ACTION_DEFAULT,VK_DBG_LAYER_ACTION_LOG_MSG"; + m_valueMap["google_threading.debug_action"] = "VK_DBG_LAYER_ACTION_DEFAULT,VK_DBG_LAYER_ACTION_LOG_MSG"; +#endif // WIN32 + + m_valueMap["lunarg_device_limits.log_filename"] = "stdout"; + m_valueMap["lunarg_core_validation.log_filename"] = "stdout"; + m_valueMap["lunarg_image.log_filename"] = "stdout"; + m_valueMap["lunarg_object_tracker.log_filename"] = "stdout"; + m_valueMap["lunarg_parameter_validation.log_filename"] = "stdout"; + m_valueMap["lunarg_swapchain.log_filename"] = "stdout"; + m_valueMap["google_threading.log_filename"] = "stdout"; +} ConfigFile::~ConfigFile() {} @@ -178,7 +159,7 @@ const char *ConfigFile::getOption(const std::string &_option) { } if ((it = m_valueMap.find(_option)) == m_valueMap.end()) - return NULL; + return ""; else return it->second.c_str(); } @@ -196,11 +177,12 @@ void ConfigFile::parseFile(const char *filename) { char buf[MAX_CHARS_PER_LINE]; m_fileIsParsed = true; - m_valueMap.clear(); file.open(filename); - if (!file.good()) + if (!file.good()) { return; + } + // read tokens from the file and form option, value pairs file.getline(buf, MAX_CHARS_PER_LINE); diff --git a/layers/vk_layer_config.h b/layers/vk_layer_config.h index 92865f69..8530a977 100644 --- a/layers/vk_layer_config.h +++ b/layers/vk_layer_config.h @@ -15,9 +15,12 @@ * limitations under the License. * * Author: Jon Ashburn + * Author: Mark Lobodzinski **************************************************************************/ #pragma once #include "vulkan/vulkan.h" +#include "vulkan/vk_layer.h" +#include #include #include @@ -25,14 +28,31 @@ extern "C" { #endif +const std::unordered_map debug_actions_option_definitions = { + {std::string("VK_DBG_LAYER_ACTION_IGNORE"), VK_DBG_LAYER_ACTION_IGNORE}, + {std::string("VK_DBG_LAYER_ACTION_CALLBACK"), VK_DBG_LAYER_ACTION_CALLBACK}, + {std::string("VK_DBG_LAYER_ACTION_LOG_MSG"), VK_DBG_LAYER_ACTION_LOG_MSG}, + {std::string("VK_DBG_LAYER_ACTION_BREAK"), VK_DBG_LAYER_ACTION_BREAK}, +#if WIN32 + {std::string("VK_DBG_LAYER_ACTION_DEBUG_OUTPUT"), VK_DBG_LAYER_ACTION_DEBUG_OUTPUT}, +#endif + {std::string("VK_DBG_LAYER_ACTION_DEFAULT"), VK_DBG_LAYER_ACTION_DEFAULT}}; + +const std::unordered_map report_flags_option_definitions = { + {std::string("warn"), VK_DEBUG_REPORT_WARNING_BIT_EXT}, + {std::string("info"), VK_DEBUG_REPORT_INFORMATION_BIT_EXT}, + {std::string("perf"), VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT}, + {std::string("error"), VK_DEBUG_REPORT_ERROR_BIT_EXT}, + {std::string("debug"), VK_DEBUG_REPORT_DEBUG_BIT_EXT}}; + const char *getLayerOption(const char *_option); FILE *getLayerLogOutput(const char *_option, const char *layerName); -VkDebugReportFlagsEXT getLayerOptionFlags(const char *_option, uint32_t optionDefault); -bool getLayerOptionEnum(const char *_option, uint32_t *optionDefault); +VkFlags GetLayerOptionFlags(std::string _option, std::unordered_map const &enum_data, + uint32_t option_default); void setLayerOption(const char *_option, const char *_val); -void setLayerOptionEnum(const char *_option, const char *_valEnum); void print_msg_flags(VkFlags msgFlags, char *msg_flags); + #ifdef __cplusplus } #endif diff --git a/layers/vk_layer_logging.h b/layers/vk_layer_logging.h index 49470b18..cb4c44c7 100644 --- a/layers/vk_layer_logging.h +++ b/layers/vk_layer_logging.h @@ -32,9 +32,11 @@ #include #include #include +#include typedef struct _debug_report_data { - VkLayerDbgFunctionNode *g_pDbgFunctionHead; + VkLayerDbgFunctionNode *debug_callback_list; + VkLayerDbgFunctionNode *default_debug_callback_list; VkFlags active_flags; bool g_DEBUG_REPORT; } debug_report_data; @@ -42,12 +44,78 @@ typedef struct _debug_report_data { template debug_report_data *get_my_data_ptr(void *data_key, std::unordered_map &data_map); +// Forward Declarations +static inline bool debug_report_log_msg(const debug_report_data *debug_data, VkFlags msgFlags, + VkDebugReportObjectTypeEXT objectType, uint64_t srcObject, size_t location, int32_t msgCode, + const char *pLayerPrefix, const char *pMsg); + +// Add a debug message callback node structure to the specified callback linked list +static inline void AddDebugMessageCallback(debug_report_data *debug_data, VkLayerDbgFunctionNode **list_head, + VkLayerDbgFunctionNode *new_node) { + + new_node->pNext = *list_head; + *list_head = new_node; +} + +// Remove specified debug message callback node structure from the specified callback linked list +static inline void RemoveDebugMessageCallback(debug_report_data *debug_data, VkLayerDbgFunctionNode **list_head, + VkDebugReportCallbackEXT callback) { + VkLayerDbgFunctionNode *cur_callback = *list_head; + VkLayerDbgFunctionNode *prev_callback = cur_callback; + bool matched = false; + + debug_data->active_flags = 0; + while (cur_callback) { + if (cur_callback->msgCallback == callback) { + matched = true; + prev_callback->pNext = cur_callback->pNext; + if (*list_head == cur_callback) { + *list_head = cur_callback->pNext; + } + debug_report_log_msg(debug_data, VK_DEBUG_REPORT_DEBUG_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT, + reinterpret_cast(cur_callback->msgCallback), 0, VK_DEBUG_REPORT_ERROR_CALLBACK_REF_EXT, + "DebugReport", "Destroyed callback"); + } else { + matched = false; + debug_data->active_flags |= cur_callback->msgFlags; + } + prev_callback = cur_callback; + cur_callback = cur_callback->pNext; + if (matched) { + free(prev_callback); + } + } +} + +// Removes all debug callback function nodes from the specified callback linked lists and frees their resources +static inline void RemoveAllMessageCallbacks(debug_report_data *debug_data, VkLayerDbgFunctionNode **list_head) { + VkLayerDbgFunctionNode *current_callback = *list_head; + VkLayerDbgFunctionNode *prev_callback = current_callback; + + while (current_callback) { + prev_callback = current_callback->pNext; + debug_report_log_msg(debug_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT, + (uint64_t)current_callback->msgCallback, 0, VK_DEBUG_REPORT_ERROR_CALLBACK_REF_EXT, "DebugReport", + "Debug Report callbacks not removed before DestroyInstance"); + free(current_callback); + current_callback = prev_callback; + } + *list_head = NULL; +} + // Utility function to handle reporting -static inline bool debug_report_log_msg(const debug_report_data *debug_data, VkFlags msgFlags, VkDebugReportObjectTypeEXT objectType, - uint64_t srcObject, size_t location, int32_t msgCode, const char *pLayerPrefix, - const char *pMsg) { +static inline bool debug_report_log_msg(const debug_report_data *debug_data, VkFlags msgFlags, + VkDebugReportObjectTypeEXT objectType, uint64_t srcObject, size_t location, int32_t msgCode, + const char *pLayerPrefix, const char *pMsg) { bool bail = false; - VkLayerDbgFunctionNode *pTrav = debug_data->g_pDbgFunctionHead; + VkLayerDbgFunctionNode *pTrav = NULL; + + if (debug_data->debug_callback_list != NULL) { + pTrav = debug_data->debug_callback_list; + } else { + pTrav = debug_data->default_debug_callback_list; + } + while (pTrav) { if (pTrav->msgFlags & msgFlags) { if (pTrav->pfnMsgCallback(msgFlags, objectType, srcObject, location, msgCode, pLayerPrefix, pMsg, pTrav->pUserData)) { @@ -77,7 +145,7 @@ debug_report_create_instance(VkLayerInstanceDispatchTable *table, VkInstance ins memset(debug_data, 0, sizeof(debug_report_data)); for (uint32_t i = 0; i < extension_count; i++) { - /* TODO: Check other property fields */ + // TODO: Check other property fields if (strcmp(ppEnabledExtensions[i], VK_EXT_DEBUG_REPORT_EXTENSION_NAME) == 0) { debug_data->g_DEBUG_REPORT = true; } @@ -86,42 +154,32 @@ debug_report_create_instance(VkLayerInstanceDispatchTable *table, VkInstance ins } static inline void layer_debug_report_destroy_instance(debug_report_data *debug_data) { - VkLayerDbgFunctionNode *pTrav; - VkLayerDbgFunctionNode *pTravNext; - - if (!debug_data) { - return; - } - - pTrav = debug_data->g_pDbgFunctionHead; - /* Clear out any leftover callbacks */ - while (pTrav) { - pTravNext = pTrav->pNext; - - debug_report_log_msg(debug_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT, - (uint64_t)pTrav->msgCallback, 0, VK_DEBUG_REPORT_ERROR_CALLBACK_REF_EXT, "DebugReport", - "Debug Report callbacks not removed before DestroyInstance"); - - free(pTrav); - pTrav = pTravNext; + if (debug_data) { + RemoveAllMessageCallbacks(debug_data, &debug_data->default_debug_callback_list); + RemoveAllMessageCallbacks(debug_data, &debug_data->debug_callback_list); + free(debug_data); } - debug_data->g_pDbgFunctionHead = NULL; - - free(debug_data); } static inline debug_report_data *layer_debug_report_create_device(debug_report_data *instance_debug_data, VkDevice device) { - /* DEBUG_REPORT shares data between Instance and Device, - * so just return instance's data pointer */ + // DEBUG_REPORT shares data between Instance and Device, + // so just return instance's data pointer return instance_debug_data; } -static inline void layer_debug_report_destroy_device(VkDevice device) { /* Nothing to do since we're using instance data record */ } +static inline void layer_debug_report_destroy_device(VkDevice device) { + // Nothing to do since we're using instance data record +} -static inline VkResult layer_create_msg_callback(debug_report_data *debug_data, +static inline void layer_destroy_msg_callback(debug_report_data *debug_data, VkDebugReportCallbackEXT callback, + const VkAllocationCallbacks *pAllocator) { + RemoveDebugMessageCallback(debug_data, &debug_data->debug_callback_list, callback); + RemoveDebugMessageCallback(debug_data, &debug_data->default_debug_callback_list, callback); +} + +static inline VkResult layer_create_msg_callback(debug_report_data *debug_data, bool default_callback, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pCallback) { - /* TODO: Use app allocator */ VkLayerDbgFunctionNode *pNewDbgFuncNode = (VkLayerDbgFunctionNode *)malloc(sizeof(VkLayerDbgFunctionNode)); if (!pNewDbgFuncNode) return VK_ERROR_OUT_OF_HOST_MEMORY; @@ -133,9 +191,12 @@ static inline VkResult layer_create_msg_callback(debug_report_data *debug_data, pNewDbgFuncNode->pfnMsgCallback = pCreateInfo->pfnCallback; pNewDbgFuncNode->msgFlags = pCreateInfo->flags; pNewDbgFuncNode->pUserData = pCreateInfo->pUserData; - pNewDbgFuncNode->pNext = debug_data->g_pDbgFunctionHead; - debug_data->g_pDbgFunctionHead = pNewDbgFuncNode; + if (default_callback) { + AddDebugMessageCallback(debug_data, &debug_data->default_debug_callback_list, pNewDbgFuncNode); + } else { + AddDebugMessageCallback(debug_data, &debug_data->debug_callback_list, pNewDbgFuncNode); + } debug_data->active_flags |= pCreateInfo->flags; debug_report_log_msg(debug_data, VK_DEBUG_REPORT_DEBUG_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT, @@ -143,36 +204,6 @@ static inline VkResult layer_create_msg_callback(debug_report_data *debug_data, return VK_SUCCESS; } -static inline void layer_destroy_msg_callback(debug_report_data *debug_data, VkDebugReportCallbackEXT callback, - const VkAllocationCallbacks *pAllocator) { - VkLayerDbgFunctionNode *pTrav = debug_data->g_pDbgFunctionHead; - VkLayerDbgFunctionNode *pPrev = pTrav; - bool matched; - - debug_data->active_flags = 0; - while (pTrav) { - if (pTrav->msgCallback == callback) { - matched = true; - pPrev->pNext = pTrav->pNext; - if (debug_data->g_pDbgFunctionHead == pTrav) { - debug_data->g_pDbgFunctionHead = pTrav->pNext; - } - debug_report_log_msg(debug_data, VK_DEBUG_REPORT_DEBUG_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT, - (uint64_t)pTrav->msgCallback, 0, VK_DEBUG_REPORT_ERROR_CALLBACK_REF_EXT, "DebugReport", - "Destroyed callback"); - } else { - matched = false; - debug_data->active_flags |= pTrav->msgFlags; - } - pPrev = pTrav; - pTrav = pTrav->pNext; - if (matched) { - /* TODO: Use pAllocator */ - free(pPrev); - } - } -} - static inline PFN_vkVoidFunction debug_report_get_instance_proc_addr(debug_report_data *debug_data, const char *funcName) { if (!debug_data || !debug_data->g_DEBUG_REPORT) { return NULL; @@ -253,7 +284,7 @@ static VkResult layer_enable_tmp_callbacks(debug_report_data *debug_data, uint32 VkDebugReportCallbackCreateInfoEXT *infos, VkDebugReportCallbackEXT *callbacks) { VkResult rtn = VK_SUCCESS; for (uint32_t i = 0; i < num_callbacks; i++) { - rtn = layer_create_msg_callback(debug_data, &infos[i], NULL, &callbacks[i]); + rtn = layer_create_msg_callback(debug_data, false, &infos[i], NULL, &callbacks[i]); if (rtn != VK_SUCCESS) { for (uint32_t j = 0; j < i; j++) { layer_destroy_msg_callback(debug_data, callbacks[j], NULL); @@ -273,14 +304,12 @@ static void layer_disable_tmp_callbacks(debug_report_data *debug_data, uint32_t } } -/* - * Checks if the message will get logged. - * Allows layer to defer collecting & formating data if the - * message will be discarded. - */ +// Checks if the message will get logged. +// Allows layer to defer collecting & formating data if the +// message will be discarded. static inline bool will_log_msg(debug_report_data *debug_data, VkFlags msgFlags) { if (!debug_data || !(debug_data->active_flags & msgFlags)) { - /* message is not wanted */ + // Message is not wanted return false; } @@ -302,11 +331,9 @@ static inline int vasprintf(char **strp, char const *fmt, va_list ap) { } #endif -/* - * Output log message via DEBUG_REPORT - * Takes format and variable arg list so that output string - * is only computed if a message needs to be logged - */ +// Output log message via DEBUG_REPORT +// Takes format and variable arg list so that output string +// is only computed if a message needs to be logged #ifndef WIN32 static inline bool log_msg(const debug_report_data *debug_data, VkFlags msgFlags, VkDebugReportObjectTypeEXT objectType, uint64_t srcObject, size_t location, int32_t msgCode, const char *pLayerPrefix, const char *format, ...) @@ -316,7 +343,7 @@ static inline bool log_msg(const debug_report_data *debug_data, VkFlags msgFlags uint64_t srcObject, size_t location, int32_t msgCode, const char *pLayerPrefix, const char *format, ...) { if (!debug_data || !(debug_data->active_flags & msgFlags)) { - /* message is not wanted */ + // Message is not wanted return false; } @@ -324,7 +351,7 @@ static inline bool log_msg(const debug_report_data *debug_data, VkFlags msgFlags va_start(argptr, format); char *str; if (-1 == vasprintf(&str, format, argptr)) { - /* on failure, glibc vasprintf leaves str undefined */ + // On failure, glibc vasprintf leaves str undefined str = nullptr; } va_end(argptr); diff --git a/layers/vk_layer_utils.cpp b/layers/vk_layer_utils.cpp index 1c362706..d028ca65 100644 --- a/layers/vk_layer_utils.cpp +++ b/layers/vk_layer_utils.cpp @@ -604,11 +604,20 @@ VkStringErrorFlags vk_string_validate(const int max_length, const char *utf8) { return result; } +// Debug callbacks get created in three ways: +// o Application-defined debug callbacks +// o Through settings in a vk_layer_settings.txt file +// o By default, if neither an app-defined debug callback nor a vk_layer_settings.txt file is present +// +// At layer initialization time, default logging callbacks are created to output layer error messages. +// If a vk_layer_settings.txt file is present its settings will override any default settings. +// +// If a vk_layer_settings.txt file is present and an application defines a debug callback, both callbacks +// will be active. If no vk_layer_settings.txt file is present, creating an application-defined debug +// callback will cause the default callbacks to be unregisterd and removed. void layer_debug_actions(debug_report_data *report_data, std::vector &logging_callback, - const VkAllocationCallbacks *pAllocator, const char *layer_identifier) { + const VkAllocationCallbacks *pAllocator, const char *layer_identifier) { - uint32_t report_flags = 0; - uint32_t debug_action = 0; VkDebugReportCallbackEXT callback = VK_NULL_HANDLE; std::string report_flags_key = layer_identifier; @@ -618,9 +627,11 @@ void layer_debug_actions(debug_report_data *report_data, std::vectorreport_data,') + r_body.append(' false,') r_body.append(' pCreateInfo,') r_body.append(' pAllocator,') r_body.append(' pCallback);') @@ -311,7 +312,7 @@ class Subcommand(object): r_body.append(' VkResult result = instance_dispatch_table(instance)->CreateDebugReportCallbackEXT(instance, pCreateInfo, pAllocator, pCallback);') r_body.append(' if (VK_SUCCESS == result) {') r_body.append(' layer_data *my_data = get_my_data_ptr(get_dispatch_key(instance), layer_data_map);') - r_body.append(' result = layer_create_msg_callback(my_data->report_data, pCreateInfo, pAllocator, pCallback);') + r_body.append(' result = layer_create_msg_callback(my_data->report_data, false, pCreateInfo, pAllocator, pCallback);') r_body.append(' }') r_body.append(' return result;') r_body.append('}') -- cgit v1.2.3 From 7e03b1a0efe5f2bf6ec16980c9d2a6027b227bb7 Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Tue, 24 May 2016 16:04:56 -0600 Subject: layers: Move debug action enums from vk_layer.h Moved debug-report related items from vk_layer.h. Enums are now in vk_layer_logging.h and DbgFunctionNode has been moved into a new loader header file vk_loader_layer.h. Change-Id: I6031146ba474ff01ca039da44ad5d42d054383a3 --- include/vulkan/vk_layer.h | 23 ----------------------- layers/vk_layer_config.h | 11 +++++++++++ layers/vk_layer_logging.h | 1 + loader/CMakeLists.txt | 1 + loader/loader.h | 3 ++- loader/vk_loader_layer.h | 32 ++++++++++++++++++++++++++++++++ 6 files changed, 47 insertions(+), 24 deletions(-) create mode 100644 loader/vk_loader_layer.h diff --git a/include/vulkan/vk_layer.h b/include/vulkan/vk_layer.h index 6f49e07f..8b7d82fb 100644 --- a/include/vulkan/vk_layer.h +++ b/include/vulkan/vk_layer.h @@ -234,29 +234,6 @@ typedef struct VkLayerInstanceDispatchTable_ { CreateDisplayPlaneSurfaceKHR; } VkLayerInstanceDispatchTable; - -// LL node for tree of dbg callback functions -typedef struct VkLayerDbgFunctionNode_ { - VkDebugReportCallbackEXT msgCallback; - PFN_vkDebugReportCallbackEXT pfnMsgCallback; - VkFlags msgFlags; - void *pUserData; - bool default_callback; - struct VkLayerDbgFunctionNode_ *pNext; -} VkLayerDbgFunctionNode; - -// TODO: Move debug action definitions out of this header file -// Definitions for Debug Actions -typedef enum VkLayerDbgActionBits { - VK_DBG_LAYER_ACTION_IGNORE = 0x00000000, - VK_DBG_LAYER_ACTION_CALLBACK = 0x00000001, - VK_DBG_LAYER_ACTION_LOG_MSG = 0x00000002, - VK_DBG_LAYER_ACTION_BREAK = 0x00000004, - VK_DBG_LAYER_ACTION_DEBUG_OUTPUT = 0x00000008, - VK_DBG_LAYER_ACTION_DEFAULT = 0x40000000, -} VkLayerDbgActionBits; -typedef VkFlags VkLayerDbgActionFlags; - // ------------------------------------------------------------------------------------------------ // CreateInstance and CreateDevice support structures diff --git a/layers/vk_layer_config.h b/layers/vk_layer_config.h index 8530a977..c4526dbc 100644 --- a/layers/vk_layer_config.h +++ b/layers/vk_layer_config.h @@ -28,6 +28,17 @@ extern "C" { #endif +// Definitions for Debug Actions +typedef enum VkLayerDbgActionBits { + VK_DBG_LAYER_ACTION_IGNORE = 0x00000000, + VK_DBG_LAYER_ACTION_CALLBACK = 0x00000001, + VK_DBG_LAYER_ACTION_LOG_MSG = 0x00000002, + VK_DBG_LAYER_ACTION_BREAK = 0x00000004, + VK_DBG_LAYER_ACTION_DEBUG_OUTPUT = 0x00000008, + VK_DBG_LAYER_ACTION_DEFAULT = 0x40000000, +} VkLayerDbgActionBits; +typedef VkFlags VkLayerDbgActionFlags; + const std::unordered_map debug_actions_option_definitions = { {std::string("VK_DBG_LAYER_ACTION_IGNORE"), VK_DBG_LAYER_ACTION_IGNORE}, {std::string("VK_DBG_LAYER_ACTION_CALLBACK"), VK_DBG_LAYER_ACTION_CALLBACK}, diff --git a/layers/vk_layer_logging.h b/layers/vk_layer_logging.h index cb4c44c7..0328031f 100644 --- a/layers/vk_layer_logging.h +++ b/layers/vk_layer_logging.h @@ -22,6 +22,7 @@ #ifndef LAYER_LOGGING_H #define LAYER_LOGGING_H +#include "vk_loader_layer.h" #include "vk_layer_config.h" #include "vk_layer_data.h" #include "vk_layer_table.h" diff --git a/loader/CMakeLists.txt b/loader/CMakeLists.txt index f47ee589..15577b8a 100644 --- a/loader/CMakeLists.txt +++ b/loader/CMakeLists.txt @@ -17,6 +17,7 @@ set(NORMAL_LOADER_SRCS loader.c loader.h vk_loader_platform.h + vk_loader_layer.h trampoline.c wsi.c wsi.h diff --git a/loader/loader.h b/loader/loader.h index 95803c01..ecc945ed 100644 --- a/loader/loader.h +++ b/loader/loader.h @@ -30,8 +30,9 @@ #include #include "vk_loader_platform.h" - +#include "vk_loader_layer.h" #include + #include #include diff --git a/loader/vk_loader_layer.h b/loader/vk_loader_layer.h new file mode 100644 index 00000000..2207c029 --- /dev/null +++ b/loader/vk_loader_layer.h @@ -0,0 +1,32 @@ +/* +* +* Copyright (c) 2016 The Khronos Group Inc. +* Copyright (c) 2016 Valve Corporation +* Copyright (c) 2016 LunarG, 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. +* +* Author: Mark Lobodzinski +* +*/ +#pragma once + +// Linked list node for tree of debug callback functions +typedef struct VkLayerDbgFunctionNode_ { + VkDebugReportCallbackEXT msgCallback; + PFN_vkDebugReportCallbackEXT pfnMsgCallback; + VkFlags msgFlags; + void *pUserData; + struct VkLayerDbgFunctionNode_ *pNext; +} VkLayerDbgFunctionNode; + -- cgit v1.2.3 From 6d9503a4eb8cfc8ea013bbdf6015d8d3e96ecc17 Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Wed, 1 Jun 2016 16:12:49 -0600 Subject: layers: Update docs for default dbg msg callbacks Change-Id: Ic1f192ea7c95762d7e53f091cc9f0ea55be96c04 --- README.md | 99 ++++++++++++++++++++++---------------------- layers/README.md | 14 ++++--- layers/vk_layer_settings.txt | 9 +++- 3 files changed, 65 insertions(+), 57 deletions(-) diff --git a/README.md b/README.md index 4b7fde49..c23e7160 100755 --- a/README.md +++ b/README.md @@ -1,49 +1,50 @@ -# Vulkan Ecosystem Components - -This project provides Khronos official ICD loader and validation layers for Vulkan developers on Windows and Linux. - -## Introduction - -Vulkan is an Explicit API, enabling direct control over how GPUs actually work. No (or very little) validation -or error checking is done inside a Vulkan driver. Applications have full control and responsibility. Any errors in -how Vulkan is used often result in a crash. This project provides standard validation layers that can be enabled to ease development by -helping developers verify their applications correctly use the Vulkan API. - -Vulkan supports multiple GPUs and multiple global contexts (VkInstance). The ICD loader is necessary to support multiple GPUs and the VkInstance level Vulkan commands. Additionally, the loader manages inserting Vulkan layer libraries, -including validation layers between the application and the ICD. - -The following components are available in this repository: -- Vulkan header files -- [*ICD Loader*](loader/) -- [*Validation Layers*](layers/) -- Demos and tests for the loader and validation layers - -## Contributing - -If you intend to contribute, the preferred work flow is for you to develop your contribution -in a fork of this repo in your GitHub account and then submit a pull request. -Please see the [CONTRIBUTING](CONTRIBUTING.md) file in this respository for more details - -## How to Build and Run - -[BUILD.md](BUILD.md) -includes directions for building all the components, running the validation tests and running the demo applications. - -Information on how to enable the various Validation layers is in -[layers/README.md](layers/README.md). - -Architecture and interface information for the loader is in -[loader/LoaderAndLayerInterface.md](loader/LoaderAndLayerInterface.md). - -## License -This work is released as open source under a Apache-style license from Khronos including a Khronos copyright. - -See COPYRIGHT.txt for a full list of licenses used in this repository. - -## Acknowledgements -While this project has been developed primarily by LunarG, Inc; there are many other -companies and individuals making this possible: Valve Corporation, funding -project development; Google providing significant contributions to the validation layers; -Khronos providing oversight and hosting of the project. - - +# Vulkan Ecosystem Components + +This project provides Khronos official ICD loader and validation layers for Vulkan developers on Windows and Linux. + +## Introduction + +Vulkan is an Explicit API, enabling direct control over how GPUs actually work. No (or very little) validation +or error checking is done inside a Vulkan driver. Applications have full control and responsibility. Any errors in +how Vulkan is used often result in a crash. This project provides standard validation layers that can be enabled +to ease development by helping developers verify their applications correctly use the Vulkan API. + +Vulkan supports multiple GPUs and multiple global contexts (VkInstance). The ICD loader is necessary to +support multiple GPUs and the VkInstance level Vulkan commands. Additionally, the loader manages inserting +Vulkan layer libraries, including validation layers between the application and the ICD. + +The following components are available in this repository: +- Vulkan header files +- [*ICD Loader*](loader/) +- [*Validation Layers*](layers/) +- Demos and tests for the loader and validation layers + +## Contributing + +If you intend to contribute, the preferred work flow is for you to develop your contribution +in a fork of this repo in your GitHub account and then submit a pull request. +Please see the [CONTRIBUTING](CONTRIBUTING.md) file in this respository for more details + +## How to Build and Run + +[BUILD.md](BUILD.md) +includes directions for building all the components, running the validation tests and running the demo applications. + +Information on how to enable the various Validation layers is in +[layers/README.md](layers/README.md). + +Architecture and interface information for the loader is in +[loader/LoaderAndLayerInterface.md](loader/LoaderAndLayerInterface.md). + +## License +This work is released as open source under a Apache-style license from Khronos including a Khronos copyright. + +See COPYRIGHT.txt for a full list of licenses used in this repository. + +## Acknowledgements +While this project has been developed primarily by LunarG, Inc; there are many other +companies and individuals making this possible: Valve Corporation, funding +project development; Google providing significant contributions to the validation layers; +Khronos providing oversight and hosting of the project. + + diff --git a/layers/README.md b/layers/README.md index e2cea90d..d3eecbf1 100644 --- a/layers/README.md +++ b/layers/README.md @@ -20,12 +20,14 @@ VkDevice, VkCommandBuffer, and VkQueue. vkXXXXGetProcAddr is used internally by the Layers and Loader to initialize dispatch tables. Layers can also be activated via the VK_INSTANCE_LAYERS environment variable. -All validation layers work with the DEBUG_REPORT extension to provide the application or user with -validation feedback. When a validation layer is enabled, it will look at the vk_layer_settings.txt -file to determine its behavior. Such as outputing to a file, stdout or debug output (Windows). An -application can also register callback functions via the DEBUG_REPORT extension to receive callbacks -when the requested validation events happen. Application callbacks happen regardless of the -settings in the vk_layer_settings.txt file. +All validation layers work with the DEBUG_REPORT extension to provide validation feedback. +When a validation layer is enabled, it will look for a vk_layer_settings.txt file to define +its loggin behavior, which can include sending output to a file, stdout, or debug output (Windows). +Applications can also register debug callback functions via the DEBUG_REPORT extension to receive +callbacks when validation events occur. Application callbacks are independent of settings in a +vk_layer_settings.txt file which will be carried out separately. If no vk_layer_settings.txt +file is present and no application callbacks are registered, error messages will be output +through default logging callbacks. ### Layer library example code diff --git a/layers/vk_layer_settings.txt b/layers/vk_layer_settings.txt index d83b8326..aef2f311 100644 --- a/layers/vk_layer_settings.txt +++ b/layers/vk_layer_settings.txt @@ -1,4 +1,5 @@ # This is an example vk_layer_settings.txt file. +# # This file allows for per-layer settings which can dynamically affect layer # behavior. Comments in this file are denoted with the "#" char. # Settings lines are of the form ". = " @@ -26,6 +27,9 @@ # VK_DBG_LAYER_ACTION_CALLBACK - Call user defined callback function(s) that # have been registered via the VK_EXT_LUNARG_debug_report extension. Since # app must register callback, this is a NOOP for the settings file. +# VK_DBG_LAYER_DEBUG_OUTPUT [Windows only] - Log a txt message using the Windows +# OutputDebugString function -- messages will show up in Visual Studio output +# window, for instance. # VK_DBG_LAYER_ACTION_BREAK - Trigger a breakpoint. # # REPORT_FLAGS: @@ -33,8 +37,9 @@ # .report_flags : This is a comma-delineated list of options telling # the layer what types of messages it should report back. Options are: # info - Report informational messages -# warn - Report warnings of using the API in an unrecommended manner which may -# also lead to undefined behavior +# warn - Report warnings from using the API in a manner which may lead to undefined +# behavior or to warn the user of common trouble spots. A warning does NOT +# necessarily signify illegal application behavior. # perf - Report using the API in a way that may cause suboptimal performance # error - Report errors in API usage # debug - For layer development. Report messages for debugging layer behavior -- cgit v1.2.3 From b07287d835f207646a852192ecda79a356e33872 Mon Sep 17 00:00:00 2001 From: Karl Schultz Date: Mon, 6 Jun 2016 12:15:00 -0600 Subject: doc: Expand LVL acronym in BUILD.md --- BUILD.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/BUILD.md b/BUILD.md index b21aa82b..70636dbd 100644 --- a/BUILD.md +++ b/BUILD.md @@ -35,7 +35,7 @@ These packages are needed to build this repository: sudo apt-get install git cmake build-essential bison libx11-dev libxcb1-dev ``` -Example debug build (Note that the update\_external\_sources script used below builds external tools into predefined locations. See **LVL's Dependencies** for more information and other options): +Example debug build (Note that the update\_external\_sources script used below builds external tools into predefined locations. See **Loader and Validation Layer Dependencies** for more information and other options): ``` cd Vulkan-LoaderAndValidationLayers # cd to the root of the cloned git repository ./update_external_sources.sh @@ -95,7 +95,7 @@ Windows 7+ with additional required software packages: - glslang is required for demos and tests. - [You can download and configure it (in a peer directory) here](https://github.com/KhronosGroup/glslang/blob/master/README.md) - A windows batch file has been included that will pull and build the correct version. Run it from Developer Command Prompt for VS2013 like so: - - update\_external\_sources.bat --build-glslang (Note: see **LVL's Dependencies** below for other options) + - update\_external\_sources.bat --build-glslang (Note: see **Loader and Validation Layer Dependencies** below for other options) ## Windows Build - MSVC @@ -103,7 +103,7 @@ Before building on Windows, you may want to modify the customize section in load set the version numbers and build description for your build. Doing so will set the information displayed for the Properites->Details tab of the loader vulkan-1.dll file that is built. -Build all Windows targets after installing required software and cloning the LVL repo as described above by completing the following steps in a "Developer Command Prompt for VS2013" window (Note that the update\_external\_sources script used below builds external tools into predefined locations. See **LVL's Dependencies** for more information and other options): +Build all Windows targets after installing required software and cloning the Loader and Validation Layer repo as described above by completing the following steps in a "Developer Command Prompt for VS2013" window (Note that the update\_external\_sources script used below builds external tools into predefined locations. See **Loader and Validation Layer Dependencies** for more information and other options): ``` cd Vulkan-LoaderAndValidationLayers # cd to the root of the cloned git repository update_external_sources.bat --all @@ -180,13 +180,13 @@ ndk-build ## Ninja Builds - All Platforms The [Qt Creator IDE](https://qt.io/download-open-source/#section-2) can open a root CMakeList.txt as a project directly, and it provides tools within Creator to configure and generate Vulkan SDK build files for one to many targets concurrently, resolving configuration issues as needed. Alternatively, when invoking CMake use the -G Codeblocks Ninja option to generate Ninja build files to be used as project files for QtCreator -- Follow the steps defined elsewhere for the OS using the update\_external\_sources script or as shown in **LVL's Dependencies** below +- Follow the steps defined elsewhere for the OS using the update\_external\_sources script or as shown in **Loader and Validation Layer Dependencies** below - Open, configure, and build the gslang and spirv-tools CMakeList.txt files - Then do the same with the Vulkan-LoaderAndValidationLayers CMakeList.txt file. - In order to debug with QtCreator, a [Microsoft WDK: eg WDK 10](http://go.microsoft.com/fwlink/p/?LinkId=526733) is required. Note that installing the WDK breaks the MSVC vcvarsall.bat build scripts provided by MSVC, requiring that the LIB, INCLUDE, and PATH env variables be set to the WDK paths by some other means -## LVL's Dependencies -gslang and SPIRV-Tools repos are required to build and run LVL components. They are not git sub-modules of Vulkan-LoaderAndValidationLayers but Vulkan-LoaderAndValidationLayers is linked to specific revisions of gslang and spirv-tools. These can be automatically cloned and built to predefined locations with the update\_external\_sources scripts. If a custom configuration is required, do the following steps: +## Loader and Validation Layer Dependencies +gslang and SPIRV-Tools repos are required to build and run Loader and Validation Layer components. They are not git sub-modules of Vulkan-LoaderAndValidationLayers but Vulkan-LoaderAndValidationLayers is linked to specific revisions of gslang and spirv-tools. These can be automatically cloned and built to predefined locations with the update\_external\_sources scripts. If a custom configuration is required, do the following steps: 1) clone the repos: -- cgit v1.2.3 From fbe2239345caa6f3d8882b961ac875c6af310fbe Mon Sep 17 00:00:00 2001 From: lenny-lunarg Date: Mon, 6 Jun 2016 11:07:53 -0600 Subject: demos: Added --suppress_popups flag Added a command line option to cube and tri to suppress windows message boxes to facilitate Windows testing. Change-Id: I069f9b199c9740e1e21c42100ceec42d5fb8f0e2 --- demos/cube.c | 106 ++++++++++++++++++++++++++++++++--------------------------- demos/tri.c | 90 +++++++++++++++++++++++++++----------------------- 2 files changed, 106 insertions(+), 90 deletions(-) diff --git a/demos/cube.c b/demos/cube.c index 082ed613..dc160131 100644 --- a/demos/cube.c +++ b/demos/cube.c @@ -61,7 +61,8 @@ #ifdef _WIN32 #define ERR_EXIT(err_msg, err_class) \ do { \ - MessageBox(NULL, err_msg, err_class, MB_OK); \ + if (!demo->suppress_popups) \ + MessageBox(NULL, err_msg, err_class, MB_OK); \ exit(1); \ } while (0) @@ -265,51 +266,6 @@ void dumpVec4(const char *note, vec4 vector) { fflush(stdout); } -VKAPI_ATTR VkBool32 VKAPI_CALL -dbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, - uint64_t srcObject, size_t location, int32_t msgCode, - const char *pLayerPrefix, const char *pMsg, void *pUserData) { - char *message = (char *)malloc(strlen(pMsg) + 100); - - assert(message); - - if (msgFlags & VK_DEBUG_REPORT_ERROR_BIT_EXT) { - sprintf(message, "ERROR: [%s] Code %d : %s", pLayerPrefix, msgCode, - pMsg); - validation_error = 1; - } else if (msgFlags & VK_DEBUG_REPORT_WARNING_BIT_EXT) { - // We know that we're submitting queues without fences, ignore this - // warning - if (strstr(pMsg, - "vkQueueSubmit parameter, VkFence fence, is null pointer")) { - return false; - } - sprintf(message, "WARNING: [%s] Code %d : %s", pLayerPrefix, msgCode, - pMsg); - validation_error = 1; - } else { - validation_error = 1; - return false; - } - -#ifdef _WIN32 - MessageBox(NULL, message, "Alert", MB_OK); -#else - printf("%s\n", message); - fflush(stdout); -#endif - free(message); - - /* - * false indicates that layer should not bail-out of an - * API call that had validation failures. This may mean that the - * app dies inside the driver due to invalid parameter(s). - * That's what would happen without validation layers, so we'll - * keep that behavior here. - */ - return false; -} - VKAPI_ATTR VkBool32 VKAPI_CALL BreakCallback(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject, size_t location, int32_t msgCode, @@ -436,6 +392,7 @@ struct demo { int32_t frameCount; bool validate; bool use_break; + bool suppress_popups; PFN_vkCreateDebugReportCallbackEXT CreateDebugReportCallback; PFN_vkDestroyDebugReportCallbackEXT DestroyDebugReportCallback; VkDebugReportCallbackEXT msg_callback; @@ -445,6 +402,53 @@ struct demo { uint32_t queue_count; }; +VKAPI_ATTR VkBool32 VKAPI_CALL +dbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, + uint64_t srcObject, size_t location, int32_t msgCode, + const char *pLayerPrefix, const char *pMsg, void *pUserData) { + char *message = (char *)malloc(strlen(pMsg) + 100); + + assert(message); + + if (msgFlags & VK_DEBUG_REPORT_ERROR_BIT_EXT) { + sprintf(message, "ERROR: [%s] Code %d : %s", pLayerPrefix, msgCode, + pMsg); + validation_error = 1; + } else if (msgFlags & VK_DEBUG_REPORT_WARNING_BIT_EXT) { + // We know that we're submitting queues without fences, ignore this + // warning + if (strstr(pMsg, + "vkQueueSubmit parameter, VkFence fence, is null pointer")) { + return false; + } + sprintf(message, "WARNING: [%s] Code %d : %s", pLayerPrefix, msgCode, + pMsg); + validation_error = 1; + } else { + validation_error = 1; + return false; + } + +#ifdef _WIN32 + struct demo *demo = (struct demo*) pUserData; + if (!demo->suppress_popups) + MessageBox(NULL, message, "Alert", MB_OK); +#else + printf("%s\n", message); + fflush(stdout); +#endif + free(message); + + /* + * false indicates that layer should not bail-out of an + * API call that had validation failures. This may mean that the + * app dies inside the driver due to invalid parameter(s). + * That's what would happen without validation layers, so we'll + * keep that behavior here. + */ + return false; +} + // Forward declaration: static void demo_resize(struct demo *demo); @@ -2540,7 +2544,7 @@ static void demo_init_vk(struct demo *demo) { dbgCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT; dbgCreateInfo.pNext = NULL; dbgCreateInfo.pfnCallback = demo->use_break ? BreakCallback : dbgFunc; - dbgCreateInfo.pUserData = NULL; + dbgCreateInfo.pUserData = demo; dbgCreateInfo.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT; inst_info.pNext = &dbgCreateInfo; @@ -2689,7 +2693,7 @@ static void demo_init_vk(struct demo *demo) { dbgCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT; dbgCreateInfo.pNext = NULL; dbgCreateInfo.pfnCallback = callback; - dbgCreateInfo.pUserData = NULL; + dbgCreateInfo.pUserData = demo; dbgCreateInfo.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT; err = demo->CreateDebugReportCallback(demo->inst, &dbgCreateInfo, NULL, @@ -2969,9 +2973,13 @@ static void demo_init(struct demo *demo, int argc, char **argv) { i++; continue; } + if (strcmp(argv[i], "--suppress_popups") == 0) { + demo->suppress_popups = true; + continue; + } fprintf(stderr, "Usage:\n %s [--use_staging] [--validate] [--break] " - "[--c ]\n", + "[--c ] [--suppress_popups]\n", APP_SHORT_NAME); fflush(stderr); exit(1); diff --git a/demos/tri.c b/demos/tri.c index 441eddcb..318291bc 100644 --- a/demos/tri.c +++ b/demos/tri.c @@ -66,7 +66,8 @@ #ifdef _WIN32 #define ERR_EXIT(err_msg, err_class) \ do { \ - MessageBox(NULL, err_msg, err_class, MB_OK); \ + if (!demo->suppress_popups) \ + MessageBox(NULL, err_msg, err_class, MB_OK); \ exit(1); \ } while (0) #elif defined __ANDROID__ @@ -118,44 +119,6 @@ struct texture_object { static int validation_error = 0; -VKAPI_ATTR VkBool32 VKAPI_CALL -dbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, - uint64_t srcObject, size_t location, int32_t msgCode, - const char *pLayerPrefix, const char *pMsg, void *pUserData) { - char *message = (char *)malloc(strlen(pMsg) + 100); - - assert(message); - - validation_error = 1; - - if (msgFlags & VK_DEBUG_REPORT_ERROR_BIT_EXT) { - sprintf(message, "ERROR: [%s] Code %d : %s", pLayerPrefix, msgCode, - pMsg); - } else if (msgFlags & VK_DEBUG_REPORT_WARNING_BIT_EXT) { - sprintf(message, "WARNING: [%s] Code %d : %s", pLayerPrefix, msgCode, - pMsg); - } else { - return false; - } - -#ifdef _WIN32 - MessageBox(NULL, message, "Alert", MB_OK); -#else - printf("%s\n", message); - fflush(stdout); -#endif - free(message); - - /* - * false indicates that layer should not bail-out of an - * API call that had validation failures. This may mean that the - * app dies inside the driver due to invalid parameter(s). - * That's what would happen without validation layers, so we'll - * keep that behavior here. - */ - return false; -} - VKAPI_ATTR VkBool32 VKAPI_CALL BreakCallback(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject, size_t location, int32_t msgCode, @@ -193,6 +156,7 @@ struct demo { VkSurfaceKHR surface; bool prepared; bool use_staging_buffer; + bool suppress_popups; VkInstance inst; VkPhysicalDevice gpu; @@ -285,6 +249,46 @@ struct demo { uint32_t queue_count; }; +VKAPI_ATTR VkBool32 VKAPI_CALL +dbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, + uint64_t srcObject, size_t location, int32_t msgCode, + const char *pLayerPrefix, const char *pMsg, void *pUserData) { + char *message = (char *)malloc(strlen(pMsg) + 100); + + assert(message); + + validation_error = 1; + + if (msgFlags & VK_DEBUG_REPORT_ERROR_BIT_EXT) { + sprintf(message, "ERROR: [%s] Code %d : %s", pLayerPrefix, msgCode, + pMsg); + } else if (msgFlags & VK_DEBUG_REPORT_WARNING_BIT_EXT) { + sprintf(message, "WARNING: [%s] Code %d : %s", pLayerPrefix, msgCode, + pMsg); + } else { + return false; + } + +#ifdef _WIN32 + struct demo *demo = (struct demo*) pUserData; + if (!demo->suppress_popups) + MessageBox(NULL, message, "Alert", MB_OK); +#else + printf("%s\n", message); + fflush(stdout); +#endif + free(message); + + /* + * false indicates that layer should not bail-out of an + * API call that had validation failures. This may mean that the + * app dies inside the driver due to invalid parameter(s). + * That's what would happen without validation layers, so we'll + * keep that behavior here. + */ + return false; +} + // Forward declaration: static void demo_resize(struct demo *demo); @@ -2120,7 +2124,7 @@ static void demo_init_vk(struct demo *demo) { dbgCreateInfo.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT; dbgCreateInfo.pfnCallback = demo->use_break ? BreakCallback : dbgFunc; - dbgCreateInfo.pUserData = NULL; + dbgCreateInfo.pUserData = demo; dbgCreateInfo.pNext = NULL; err = demo->CreateDebugReportCallback(demo->inst, &dbgCreateInfo, NULL, &demo->msg_callback); @@ -2376,9 +2380,13 @@ static void demo_init(struct demo *demo, const int argc, const char *argv[]) i++; continue; } + if (strcmp(argv[i], "--suppress_popups") == 0) { + demo->suppress_popups = true; + continue; + } fprintf(stderr, "Usage:\n %s [--use_staging] [--validate] [--break] " - "[--c ]\n", + "[--c ] [--suppress_popups]\n", APP_SHORT_NAME); fflush(stderr); exit(1); -- cgit v1.2.3 From 0f1cf71df325fb263e3ba192589c2d021e135d30 Mon Sep 17 00:00:00 2001 From: Jon Ashburn Date: Mon, 23 May 2016 13:05:21 -0600 Subject: loader: doc update for merge android and desktop layer interface Change-Id: Ibbffc0bf05bcbd1aa3b9272caa0b2c1c3a54037d --- loader/LoaderAndLayerInterface.md | 335 +++++++++++++------------------------- 1 file changed, 112 insertions(+), 223 deletions(-) diff --git a/loader/LoaderAndLayerInterface.md b/loader/LoaderAndLayerInterface.md index 4a986cd5..69ad7819 100644 --- a/loader/LoaderAndLayerInterface.md +++ b/loader/LoaderAndLayerInterface.md @@ -693,6 +693,7 @@ Vulkan layer interface with the loader #### Windows + ##### Properly-Installed Layers In order to find properly-installed layers, the Vulkan loader will use a @@ -732,71 +733,8 @@ full pathname to the manifest file. The Vulkan loader will open each info file to obtain information about the layer, including the name or pathname of a shared library (".dll") file. -This manifest file is in the JSON format and contains the following -information: - -- (required) "file\_format\_version" - same as for ICDs, except that the format -version can vary independently for ICDs and layers. - -- (required) "name" - layer name - -- (required and deprecated) "type" - which layer chains should the layer be activated on. -Distinct instance and device layers are deprecated; there are now just layers. -Allowable values for type (both before and after deprecation) are "INSTANCE", "GLOBAL" and, "DEVICE." -"DEVICE" layers are skipped over by the loader as if they were not found. -Thus, layers must have a type of "GLOBAL" or "INSTANCE" for the loader to include the layer in it's discovery. - -- (required) "library\_path" - filename / full path / relative path to the -library file - -- (required) "api\_version" - same as for ICDs. - -- (required) "implementation\_version" - layer version, a single number -increasing with backward compatible changes. - -- (required) "description" - informative description of the layer. - -- (optional) "device\_extensions" or "instance\_extensions" - array of -extension information as follows - - - (required) extension "name" - Vulkan registered name - - - (required) extension "spec\_version" - extension specification version, a -single number, increasing with backward compatible changes. - - - (required for device\_extensions with entry points) extension -"entrypoints" - array of device extension entry points; not used for instance -extensions - -- (sometimes required) "functions" - mapping list of function entry points. If -multiple layers exist within the same shared library (or if a layer is in the -same shared library as an ICD), this must be specified to allow each layer to -have its own vkGet\*ProcAddr entry points that can be found by the loader. At -this time, only the following two functions are required: - - - "vkGetInstanceProcAddr" name - - - "vkGetDeviceProcAddr" name - -- (optional for implicit layers) "enable\_environment" requirement(s) - -environment variable and value required to enable an implicit layer. This -environment variable (which should vary with each "version" of the layer, as in -"ENABLE\_LAYER\_FOO\_1") must be set to the given value or else the implicit -layer is not loaded. This is for application environments (e.g. Steam) which -want to enable a layer(s) only for applications that they launch, and allows -for applications run outside of an application environment to not get that -implicit layer(s). - -- (required for implicit layers) "disable\_environment" requirement(s) - -environment variable and value required to disable an implicit layer. Note: in -rare cases of an application not working with an implicit layer, the -application can set this environment variable (before calling Vulkan commands) -in order to "blacklist" the layer. This environment variable (which should vary -with each "version" of the layer, as in "DISABLE\_LAYER\_FOO\_1") must be set -(not particularly to any value). If both the "enable\_environment" and -"disable\_environment" variables are set, the implicit layer is disabled. - -For example: +This manifest file is in the JSON format as shown in the following example. +See the section [Layer Library Manifest File](#LayerLibraryManifestFile) for more information about each of the nodes in the JSON file. ``` { @@ -814,21 +752,24 @@ For example: }, "instance_extensions": [ { - "name": "VK_debug_report_EXT", + "name": "VK_EXT_debug_report", "spec_version": "1" }, { - "name": "VK_VENDOR_DEBUG_X", + "name": "VK_VENDOR_ext_x", "spec_version": "3" } ], "device_extensions": [ { - "name": "VK_DEBUG_MARKER_EXT", + "name": "VK_EXT_debug_marker", "spec_version": "1", "entrypoints": ["vkCmdDbgMarkerBegin", "vkCmdDbgMarkerEnd"] } ], + "enable_environment": { + "ENABLE_LAYER_OVERLAY_1": "1" + } "disable_environment": { "DISABLE_LAYER_OVERLAY_1": "" } @@ -903,76 +844,16 @@ installed from Linux-distribution-provided packages. The "/etc/vulkan/\*\_layer.d" directories are for layers that are installed from non-Linux-distribution-provided packages. -The information file is in the JSON format and contains the following -information: - -- (required) "file\_format\_version" – same as for ICDs, except that the format -version can vary independently for ICDs and layers. - -- (required) "name" - layer name - -- (required and deprecated) "type" - which layer chains should the layer be activated on. -Distinct instance and device layers are deprecated; there are now just layers. -Allowable values for type (both before and after deprecation) are "INSTANCE", "GLOBAL" and, "DEVICE." -"DEVICE" layers are skipped over by the loader as if they were not found. -Thus, layers must have a type of "GLOBAL" or "INSTANCE" for the loader to include the layer in it's discovery. - -- (required) "library\_path" - filename / full path / relative path to the text -file - -- (required) "api\_version" – same as for ICDs. - -- (required) "implementation\_version" – layer version, a single number -increasing with backward compatible changes. - -- (required) "description" – informative description of the layer. - -- (optional) "device\_extensions" or "instance\_extensions" - array of -extension information as follows - - - (required) extension "name" - Vulkan registered name +This manifest file is in the JSON format as shown in the following example. +See the section [Layer Library Manifest File](#LayerLibraryManifestFile) for more information about each of the nodes in the JSON file. - - (required) extension "spec\_version" - extension specification version, a -single number, increasing with backward compatible changes. - - - (required for device extensions with entry points) extension -"entrypoints" - array of device extension entry points; not used for instance -extensions - -- (sometimes required) "functions" - mapping list of function entry points. If -multiple layers exist within the same shared library (or if a layer is in the -same shared library as an ICD), this must be specified to allow each layer to -have its own vkGet\*ProcAddr entry points that can be found by the loader. At -this time, only the following two functions are required: - - "vkGetInstanceProcAddr" name - - "vkGetDeviceProcAddr" name - -- (optional for implicit layers) "enable\_environment" requirement(s) - -environment variable and value required to enable an implicit layer. This -environment variable (which should vary with each "version" of the layer, as in -"ENABLE\_LAYER\_FOO\_1") must be set to the given value or else the implicit -layer is not loaded. This is for application environments (e.g. Steam) which -want to enable a layer(s) only for applications that they launch, and allows -for applications run outside of an application environment to not get that -implicit layer(s). - -- (required for implicit layers) "disable\_environment" requirement(s) - -environment variable and value required to disable an implicit layer. Note: in -rare cases of an application not working with an implicit layer, the -application can set this environment variable (before calling Vulkan commands) -in order to "blacklist" the layer. This environment variable (which should vary -with each "version" of the layer, as in "DISABLE\_LAYER\_FOO\_1") must be set -(not particularly to any value). If both the "enable\_environment" and -"disable\_environment" variables are set, the implicit layer is disabled. - -For example: ``` { "file_format_version" : "1.0.0", "layer": { "name": "VK_LAYER_LUNARG_overlay", "type": "INSTANCE", - "library_path": "vkOverlayLayer.dll" + "library_path": "libvkOverlayLayer.so" "api_version" : "1.0.5", "implementation_version" : "2", "description" : "LunarG HUD layer", @@ -982,21 +863,24 @@ For example: }, "instance_extensions": [ { - "name": "VK_debug_report_EXT", + "name": "VK_EXT_debug_report", "spec_version": "1" }, { - "name": "VK_VENDOR_DEBUG_X", + "name": "VK_VENDOR_ext_x", "spec_version": "3" } ], "device_extensions": [ { - "name": "VK_DEBUG_MARKER_EXT", + "name": "VK_EXT_debug_marker", "spec_version": "1", "entrypoints": ["vkCmdDbgMarkerBegin", "vkCmdDbgMarkerEnd"] } ], + "enable_environment": { + "ENABLE_LAYER_OVERLAY_1": "1" + }, "disable_environment": { "DISABLE_LAYER_OVERLAY_1": "" } @@ -1092,7 +976,7 @@ the above lists may be extended in the future. #### Layer Library Interface A layer library is a container of layers. This section defines an extensible -manifest file interface or programming interface to discover layers contained in layer libraries. +interface to discover layers contained in layer libraries. The extensible programming interface is used on Android only. For Windows and Linux, the layer manifest JSON files are used. @@ -1136,17 +1020,28 @@ is itself. In other cases, it should normally chain to other layers. extension names. It may assume the layer names and extension names have been validated. -`vkGetInstanceProcAddr` can intercept a command by returning a function -pointer different from what would be returned through chaining. +`vkGetInstanceProcAddr` intercepts a Vulkan command by returning a local entry point, +otherwise it returns the value obtained by calling down the instance chain. + These commands must be intercepted + - vkGetInstanceProcAddr + - vkCreateInstance + - vkCreateDevice (only required for any device-level chaining) + + For compatibility with older layer libraries, + - when `pName` is `vkCreateDevice`, it ignores `instance`. + +`vkGetDeviceProcAddr` intercepts a Vulkan command by returning a local entry point, +otherwise it returns the value obtained by calling down the device chain. -`vkGetDeviceProcAddr` can intercept a command by returning a function pointer -different from what would be returned through chaining. +The specification requires `NULL` to be returned from `vkGetInstanceProcAddr` and +`vkGetDeviceProcAddr` for disabled commands. A layer may return `NULL` itself or +rely on the following layers to do so. [\*]: The intention is for layers to have a well-defined baseline behavior. Some of the conventions or rules, for example, may be considered abuses of the specification. -###### Layer Library Interface Version 0 (Android) +##### Layer Library API Version 0 A layer library supporting interface version 0 must define and export these introspection functions, unrelated to any Vulkan command despite the names, @@ -1178,74 +1073,81 @@ signatures, and other similarities: The introspection functions are not used by the desktop loader. -It must also define and export these functions: - - - `GetInstanceProcAddr` behaves as if ``'s - `vkGetInstanceProcAddr` is called, except +It must also define and export these functions one for each layer in the library: - - when `pName` is `vkEnumerateInstanceLayerProperties`, - `vkEnumerateInstanceExtensionProperties`, or - `vkEnumerateDeviceLayerProperties` (but _not_ - `vkEnumerateDeviceExtensionProperties`), it returns a function pointer to - the corresponding introspection function defined by this interface. - - when `pName` is `vkGetInstanceProcAddr`, it returns a function pointer - to itself. - - For compatibility with older layer libraries, - - - when `pName` is `vkCreateDevice`, it ignores `instance`. - - when `pName` is a device command defined by Vulkan 1.0 or - `VK_KHR_swapchain` (but _not_ other device commands), it may chain to - other layers without intercepting. A loader should avoid querying such - device commands. + - `GetInstanceProcAddr(instance, pName)` behaves identically to a layer's vkGetInstanceProcAddr except it is exported. When a layer library contains only one layer, this function may alternatively be named `vkGetInstanceProcAddr`. - - `GetDeviceProcAddr` behaves as if ``'s - `vkGetDeviceProcAddr` is called. + - `GetDeviceProcAddr` behaves identically to a layer's vkGetDeviceProcAddr except it is exported. When a layer library contains only one layer, this function may alternatively be named `vkGetDeviceProcAddr`. -All contained layers must support [`vk_layer.h`][]. They do not need to -implement commands that are not queryable. They are recommended not to export -any command. +All layers contained within a library must support [`vk_layer.h`][]. They do not need to +implement commands that they do not intercept. They are recommended not to export +any commands. -###### Layer Library Interface Version 0 (Windows and Linux) + +##### Layer Library Manifest File Version 0 On Windows and Linux (desktop), the loader uses manifest files to discover layer libraries and layers. The desktop loader doesn't directly query the -layer library except during chaining. On Android, the loader queries the layer libraries directly as outlined above. +layer library except during chaining. +On Android, the loader queries the layer libraries via the introspection functions as outlined above. The layer libraries and the manifest files must be kept in sync. -The following table associates the desktop JSON nodes with the Android layer library queries. It also indicates requirements. +The following table associates the desktop JSON nodes with the layer library introspection queries. It also indicates requirements. -| Property | JSON node | Android library query | Notes | +| Property | JSON node | Introspection query | Notes | |----------|-----------|-----------------------|-------| -| layers in library | layer | vkEnumerateInstanceLayerProperties | one node required for each layer in the library | -|layer name | name | vkEnumerateInstanceLayerProperties | one node is required | -| layer type | type | vkEnumerateInstanceLayerProperties | one node is required (deprecated) | +| file version | file_format_version | N/A | one node required per JSON file | +| layers in library | layer | vkEnumerateInstanceLayerProperties | one node required per layer | +| layer name | name | vkEnumerateInstanceLayerProperties | one node is required | +| layer type | type | vkEnumerate*LayerProperties | see Note 1 | | library location | library_path | N/A | one node is required | | vulkan spec version | api_version | vkEnumerateInstanceLayerProperties | one node is required | -| layer implementation version | api_version | vkEnumerateInstanceLayerProperties | one node is required | +| layer implementation version | api_version | vkEnumerateInstanceLayerProperties | see Note 2 | | layer description | description | vkEnumerateInstanceLayerProperties | one node is required | -| chaining functions | functions | vkGet*ProcAddr | see Note 1 | -| instance extensions | instance_extensions | vkEnumerateInstanceExtensionProperties | see Note 2 | -| device extensions | device_extensions | vkEnumerateDeviceExtensionProperties | see Note 3 | +| chaining functions | functions | vkGet*ProcAddr | see Note 3 | +| instance extensions | instance_extensions | vkEnumerateInstanceExtensionProperties | see Note 4 | +| device extensions | device_extensions | vkEnumerateDeviceExtensionProperties | see Note 5 | +| enable implicit | enable_environment | N/A | See Note 6 | +| disable implicit | enable_environment | N/A | See Note 7 | + +"file\_format\_version" is used to indicate the valid JSON syntax of the file. +As nodes are added or deleted which would change the parsing of this file, +the file_format_version should change. This version +is NOT the same as the layer library interface version. The interface version is a superset +of the "file_format_version" and includes the semantics of the nodes in the JSON file. +For interface version 0 the file format version must be "1.0.0" + +Note 1: Prior to deprecation, the "type" node was used to indicate which layer chain(s) +to activate the layer upon: instance, device, or both. +Distinct instance and device layers are deprecated; there are now just layers. +Allowable values for type (both before and after deprecation) are "INSTANCE", "GLOBAL" and, "DEVICE." +"DEVICE" layers are skipped over by the loader as if they were not found. +Thus, layers must have a type of "GLOBAL" or "INSTANCE" for the loader to include the layer in the enumerated instance layer list. -Note 1: The "functions" node is required if the layer is using alternative +"library\_path" is the filename, full path, or relative path to the library file. +See [Manifest File Example](# ManifestFileExample) section for more details. + +Note 2: One "implementation\_version" node is required per layer. This node gives the layer version, a single number +increasing with backward uncompatible changes. + +Note 3: The "functions" node is required if the layer is using alternative names for vkGetInstanceProcAddr or vkGetDeviceProcAddr. vkGetInstanceProcAddr and vkGetDeviceProcAddr -are required for all layers. See further requirements below. +are required for all layers. See further requirements in the Layer Library API section above. -Note 2: One "instance_extensions" node with an array of 1 or more elements +Note 4: One "instance_extensions" node with an array of one or more elements required if any instance extensions are supported by a layer, otherwise the node is optional. Each element of the array must have the nodes "name" and "spec_version" which correspond to VkExtensionProperties "extensionName" and "specVersion" respectively. -Note 3: One "device_extensions" node with an array of 1 or more elements +Note 5: One "device_extensions" node with an array of one or more elements required if any device extensions are supported by a layer, otherwise the node is optional. Each element of the array must have the nodes "name" and "spec_version" which @@ -1255,52 +1157,39 @@ must have the node "entrypoints" if the device extension adds Vulkan API command otherwise this node is not required. The "entrypoint" node is an array of the names of all entrypoints added by the supported extension. +``` + "device_extensions": [ + { + "name": "VK_EXT_debug_marker", + "spec_version": "1", + "entrypoints": ["vkCmdDbgMarkerBegin", "vkCmdDbgMarkerEnd"] + } + ``` -The manifest file nodes "file_format_version", "disable_environment", and -"enable_environment" have no corresponding equivalent in the Vulkan API nor -in the Android layer library interface. +Note 6: The "enable\_environment" node is only for implicit layers only. It is optional for implicit layers. +This node gives an environment variable and value required to enable an implicit layer. This +environment variable (which should vary with each "version" of the layer) must be set to the +given value or else the implicit layer is not loaded. This is for application environments (e.g. Steam) which +want to enable a layer(s) only for applications that they launch, and allows +for applications run outside of an application environment to not get that +implicit layer(s). -"file_format_version" is used to indicate the valid JSON syntax of the file. -As nodes are added or deleted which would change the parsing of this file, -the file_format_version should change. This version -is NOT the same as the interface version. The interface version is a superset -of the "file_format_version" and includes the semantics of the nodes in the JSON file. For interface version 0 the file format version must be "1.0.0" - -"disable_environment" (required) and "enable_evironment" (optional) are for implicit layers as previously described. - -vkGetInstanceProcAddr requirements: --Irregardless of the name, this function must be implemented and exported in the library for all layers. --This function must return the local entry points for all instance level Vulkan commands it intercepts. -At a minimum, this includes vkGetInstanceProcAddr and vkCreateInstance. -Optionally, this function may return intercepted device level -Vulkan commands. --Vulkan commands that a layer doesn't intercept must be passed to the next -entity in the chain. That is, the next layer/ICD's GetInstanceProcAddr must be called. --Currently this function must be able to handle a VkInstance parameter equal -to NULL for instance level commands it intercepts including vkCreateDevice. - -VkGetDeviceProcAddr requirements: --Irregardless of the name, this function must be implemented and exported in the library for all layers. --This function must return the local entry points for all device level Vulkan -commands it intercepts. At a minimum, this includes vkGetDeviceProcAddr and vkCreateDevice. --Vulkan commands that a layer doesn't intercept must be passed to the next -entity in the chain. That is, the next layer/ICD's GetDeviceProcAddr must be called. - -There are no requirements on the names of the intercepting functions a layer -implements except those listed above for vkGetInstanceProcAddr and -vkGetDeviceProcAddr. Layers do not need to implement commands that are not going to be intercepted. - -All layers within a library must support [`vk_layer.h`][]. -[`vk_layer.h`]: ../include/vulkan/vk_layer.h - -#### Layer intercept requirements +Note 7: The "disable\_environment" node is only for implicit layers only. It is required for implicit layers. +This node gives an environment variable and value required to disable an implicit layer. In +rare cases of an application not working with an implicit layer, the +application can set this environment variable (before calling Vulkan commands) +in order to "blacklist" the layer. This environment variable (which should vary +with each "version" of the layer) must be set (not particularly to any value). +If both the "enable\_environment" and +"disable\_environment" variables are set, the implicit layer is disabled. + +#### Layer Dispatch Interface Version 0 +##### Layer intercept requirements - Layers intercept a Vulkan command by defining a C/C++ function with signature identical to the Vulkan API for that command. - A layer must intercept at least vkGetInstanceProcAddr and vkCreateInstance. Additionally, a layer would also intercept vkGetDeviceProcAddr and vkCreateDevice to participate in the device chain. -- Other than the two vkGet*ProcAddr, all other functions intercepted by a layer -need NOT be exported by the layer. - For any Vulkan command a layer intercepts which has a non-void return value, an appropriate value must be returned by the layer intercept function. - The layer intercept function must call down the chain to the corresponding @@ -1314,7 +1203,7 @@ want to add a call to vkQueueWaitIdle after calling down the chain for vkQueueSubmit. Any additional calls inserted by a layer must be on the same chain. They should call down the chain. -#### Distributed dispatching requirements +##### Distributed dispatching requirements - For each entry point a layer intercepts, it must keep track of the entry point residing in the next entity in the chain it will call down into. In other @@ -1332,7 +1221,7 @@ functions. vkGetDeviceProcAddr to call down the chain for unknown (i.e. non-intercepted) functions. -#### Layer dispatch initialization +##### Layer dispatch initialization - A layer initializes its instance dispatch table within its vkCreateInstance function. @@ -1374,7 +1263,7 @@ the VkInstanceCreateInfo/VkDeviceCreateInfo structure. Get*ProcAddr function once for each Vulkan command needed in your dispatch table -#### Example code for CreateInstance +##### Example code for CreateInstance ```cpp VkResult vkCreateInstance( @@ -1389,7 +1278,7 @@ VkResult vkCreateInstance( PFN_vkGetInstanceProcAddr fpGetInstanceProcAddr = chain_info->u.pLayerInfo->pfnNextGetInstanceProcAddr; PFN_vkCreateInstance fpCreateInstance = - (PFN_vkCreateInstance)fpGetInstanceProcAddr(*pInstance, "vkCreateInstance"); + (PFN_vkCreateInstance)fpGetInstanceProcAddr(NULL, "vkCreateInstance"); if (fpCreateInstance == NULL) { return VK_ERROR_INITIALIZATION_FAILED; } @@ -1415,7 +1304,7 @@ VkResult vkCreateInstance( } ``` -#### Example code for CreateDevice +##### Example code for CreateDevice ```cpp VkResult -- cgit v1.2.3 From b6b1a1f490a1a64877a52ec42600da5c8a340b7d Mon Sep 17 00:00:00 2001 From: David Pinedo Date: Tue, 7 Jun 2016 09:35:56 -0600 Subject: winrtinstaller: retry ps script failure with full path to powershell.exe Also changed diagnostics to log the contents of dir containing powershell.exe, and log the current value of $PATH. --- windowsRuntimeInstaller/Diagnostic1.ps1 | 183 -------------------------------- windowsRuntimeInstaller/InstallerRT.nsi | 176 +++++++++++++++--------------- 2 files changed, 86 insertions(+), 273 deletions(-) delete mode 100644 windowsRuntimeInstaller/Diagnostic1.ps1 diff --git a/windowsRuntimeInstaller/Diagnostic1.ps1 b/windowsRuntimeInstaller/Diagnostic1.ps1 deleted file mode 100644 index 90cf4db7..00000000 --- a/windowsRuntimeInstaller/Diagnostic1.ps1 +++ /dev/null @@ -1,183 +0,0 @@ -# Copyright (c) 2015-2016 The Khronos Group Inc. -# Copyright (c) 2015-2016 Valve Corporation -# Copyright (c) 2015-2016 LunarG, 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. -# -# Author: David Pinedo -# - - -# This Powershell script is run by the Vulkan Runtime Installer when it -# encounters a problem when running the ConfigLayersAndVulkanDLL.ps1 script. -# It is run to help diagnose whether the installer is capabable of running -# Powershell scripts on the target system. - - -$outfile=$Env:Temp+"\VulkanRTinstall\Diagnostic1.log" -Write-Output "Diagnostic1" | Out-File -encoding ascii -filepath $outfile - -# SIG # Begin signature block -# MIIccAYJKoZIhvcNAQcCoIIcYTCCHF0CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB -# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR -# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUXZIII3ISc6TV7crVquI9urb2 -# FNqgghefMIIFKDCCBBCgAwIBAgIQA7RxzU1//sKaOyCyyw9fVDANBgkqhkiG9w0B -# AQsFADByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD -# VQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFz -# c3VyZWQgSUQgQ29kZSBTaWduaW5nIENBMB4XDTE2MDQwODAwMDAwMFoXDTE3MDgx -# MDEyMDAwMFowZTELMAkGA1UEBhMCVVMxETAPBgNVBAgTCENvbG9yYWRvMRUwEwYD -# VQQHEwxGb3J0IENvbGxpbnMxFTATBgNVBAoTDEx1bmFyRywgSW5jLjEVMBMGA1UE -# AxMMTHVuYXJHLCBJbmMuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -# 9g6eKks1n/j5xBMG0viQaVqoxYjNIt2sLiDhBa1JMfPVvQsclZwsJl2FHhnQEg1/ -# YLeNUqSukbgTNXTGjkvNoh/PbjjBzlxZbPwRKO8tbHMRKZJjcVkOWLLReUGHkxJ3 -# i4hD6zH0K9DKMubb0ohmaA28ALsl8d4igz78uGyqa3jNXbiyNLJhd467u2nCySdV -# PFdXCMklePhW9VLm8VXSRDlBcx6tsaTpJr8lRZsq13xO7lwifQw1w2QRQzlnezUY -# PVnXIz+54Nu0U6JKPaTlxgbk9SlcP4f77UJuieGQGCWh3uCcASYQgUMjisetLyFU -# WZuPYpSbNWVksMaiIlSIuwIDAQABo4IBxTCCAcEwHwYDVR0jBBgwFoAUWsS5eyoK -# o6XqcQPAYPkt9mV1DlgwHQYDVR0OBBYEFBP4/a3JE2uXZpm3r1yknye/WxPWMA4G -# A1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzB3BgNVHR8EcDBuMDWg -# M6Axhi9odHRwOi8vY3JsMy5kaWdpY2VydC5jb20vc2hhMi1hc3N1cmVkLWNzLWcx -# LmNybDA1oDOgMYYvaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJl -# ZC1jcy1nMS5jcmwwTAYDVR0gBEUwQzA3BglghkgBhv1sAwEwKjAoBggrBgEFBQcC -# ARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAIBgZngQwBBAEwgYQGCCsG -# AQUFBwEBBHgwdjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29t -# ME4GCCsGAQUFBzAChkJodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNl -# cnRTSEEyQXNzdXJlZElEQ29kZVNpZ25pbmdDQS5jcnQwDAYDVR0TAQH/BAIwADAN -# BgkqhkiG9w0BAQsFAAOCAQEAscucuwAp0HisTjMWJii1ZX5H7+GAc048OJctdrTS -# VlUc7kJgEirXQb1TQbSevvt1wE6s3xJWUapWnYvvgEPOq036WFA+NRVoWU5eIUkG -# MsYGXH5ASHVBH+5/13wFLC1nXTxxrQ6B19uFFr5ZpsaP93EdD5pLqRxKrqLc9Stc -# /faupcVkclisgXOEDsCzvgGhhaFCc/RSeXOOAZg2EsJNbaydg/xyvZqPDG17NboL -# rgrzN5r6FoCk535HuGvcpjbr60nlwwzuxwqzXuMhGUTOs5O5cPpJQt6+iXBrlBgh -# 4jPNL+ZvFfJLDq3CUdnSh3S13GJruyTWzF2AxTeRAnw2fzCCBTAwggQYoAMCAQIC -# EAQJGBtf1btmdVNDtW+VUAgwDQYJKoZIhvcNAQELBQAwZTELMAkGA1UEBhMCVVMx -# FTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNv -# bTEkMCIGA1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBMB4XDTEzMTAy -# MjEyMDAwMFoXDTI4MTAyMjEyMDAwMFowcjELMAkGA1UEBhMCVVMxFTATBgNVBAoT -# DERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTExMC8GA1UE -# AxMoRGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIENvZGUgU2lnbmluZyBDQTCCASIw -# DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPjTsxx/DhGvZ3cH0wsxSRnP0PtF -# mbE620T1f+Wondsy13Hqdp0FLreP+pJDwKX5idQ3Gde2qvCchqXYJawOeSg6funR -# Z9PG+yknx9N7I5TkkSOWkHeC+aGEI2YSVDNQdLEoJrskacLCUvIUZ4qJRdQtoaPp -# iCwgla4cSocI3wz14k1gGL6qxLKucDFmM3E+rHCiq85/6XzLkqHlOzEcz+ryCuRX -# u0q16XTmK/5sy350OTYNkO/ktU6kqepqCquE86xnTrXE94zRICUj6whkPlKWwfIP -# EvTFjg/BougsUfdzvL2FsWKDc0GCB+Q4i2pzINAPZHM8np+mM6n9Gd8lk9ECAwEA -# AaOCAc0wggHJMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGGMBMG -# A1UdJQQMMAoGCCsGAQUFBwMDMHkGCCsGAQUFBwEBBG0wazAkBggrBgEFBQcwAYYY -# aHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRwOi8vY2Fj -# ZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3J0MIGB -# BgNVHR8EejB4MDqgOKA2hjRodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGlnaUNl -# cnRBc3N1cmVkSURSb290Q0EuY3JsMDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2Vy -# dC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsME8GA1UdIARIMEYwOAYK -# YIZIAYb9bAACBDAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5j -# b20vQ1BTMAoGCGCGSAGG/WwDMB0GA1UdDgQWBBRaxLl7KgqjpepxA8Bg+S32ZXUO -# WDAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkqhkiG9w0BAQsF -# AAOCAQEAPuwNWiSz8yLRFcgsfCUpdqgdXRwtOhrE7zBh134LYP3DPQ/Er4v97yrf -# IFU3sOH20ZJ1D1G0bqWOWuJeJIFOEKTuP3GOYw4TS63XX0R58zYUBor3nEZOXP+Q -# sRsHDpEV+7qvtVHCjSSuJMbHJyqhKSgaOnEoAjwukaPAJRHinBRHoXpoaK+bp1wg -# XNlxsQyPu6j4xRJon89Ay0BEpRPw5mQMJQhCMrI2iiQC/i9yfhzXSUWW6Fkd6fp0 -# ZGuy62ZD2rOwjNXpDd32ASDOmTFjPQgaGLOBm0/GkxAG/AeB+ova+YJJ92JuoVP6 -# EpQYhS6SkepobEQysmah5xikmmRR7zCCBmowggVSoAMCAQICEAMBmgI6/1ixa9bV -# 6uYX8GYwDQYJKoZIhvcNAQEFBQAwYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERp -# Z2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMY -# RGlnaUNlcnQgQXNzdXJlZCBJRCBDQS0xMB4XDTE0MTAyMjAwMDAwMFoXDTI0MTAy -# MjAwMDAwMFowRzELMAkGA1UEBhMCVVMxETAPBgNVBAoTCERpZ2lDZXJ0MSUwIwYD -# VQQDExxEaWdpQ2VydCBUaW1lc3RhbXAgUmVzcG9uZGVyMIIBIjANBgkqhkiG9w0B -# AQEFAAOCAQ8AMIIBCgKCAQEAo2Rd/Hyz4II14OD2xirmSXU7zG7gU6mfH2RZ5nxr -# f2uMnVX4kuOe1VpjWwJJUNmDzm9m7t3LhelfpfnUh3SIRDsZyeX1kZ/GFDmsJOqo -# SyyRicxeKPRktlC39RKzc5YKZ6O+YZ+u8/0SeHUOplsU/UUjjoZEVX0YhgWMVYd5 -# SEb3yg6Np95OX+Koti1ZAmGIYXIYaLm4fO7m5zQvMXeBMB+7NgGN7yfj95rwTDFk -# jePr+hmHqH7P7IwMNlt6wXq4eMfJBi5GEMiN6ARg27xzdPpO2P6qQPGyznBGg+na -# QKFZOtkVCVeZVjCT88lhzNAIzGvsYkKRrALA76TwiRGPdwIDAQABo4IDNTCCAzEw -# DgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYB -# BQUHAwgwggG/BgNVHSAEggG2MIIBsjCCAaEGCWCGSAGG/WwHATCCAZIwKAYIKwYB -# BQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwggFkBggrBgEFBQcC -# AjCCAVYeggFSAEEAbgB5ACAAdQBzAGUAIABvAGYAIAB0AGgAaQBzACAAQwBlAHIA -# dABpAGYAaQBjAGEAdABlACAAYwBvAG4AcwB0AGkAdAB1AHQAZQBzACAAYQBjAGMA -# ZQBwAHQAYQBuAGMAZQAgAG8AZgAgAHQAaABlACAARABpAGcAaQBDAGUAcgB0ACAA -# QwBQAC8AQwBQAFMAIABhAG4AZAAgAHQAaABlACAAUgBlAGwAeQBpAG4AZwAgAFAA -# YQByAHQAeQAgAEEAZwByAGUAZQBtAGUAbgB0ACAAdwBoAGkAYwBoACAAbABpAG0A -# aQB0ACAAbABpAGEAYgBpAGwAaQB0AHkAIABhAG4AZAAgAGEAcgBlACAAaQBuAGMA -# bwByAHAAbwByAGEAdABlAGQAIABoAGUAcgBlAGkAbgAgAGIAeQAgAHIAZQBmAGUA -# cgBlAG4AYwBlAC4wCwYJYIZIAYb9bAMVMB8GA1UdIwQYMBaAFBUAEisTmLKZB+0e -# 36K+Vw0rZwLNMB0GA1UdDgQWBBRhWk0ktkkynUoqeRqDS/QeicHKfTB9BgNVHR8E -# djB0MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1 -# cmVkSURDQS0xLmNybDA4oDagNIYyaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0Rp -# Z2lDZXJ0QXNzdXJlZElEQ0EtMS5jcmwwdwYIKwYBBQUHAQEEazBpMCQGCCsGAQUF -# BzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQQYIKwYBBQUHMAKGNWh0dHA6 -# Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRENBLTEuY3J0 -# MA0GCSqGSIb3DQEBBQUAA4IBAQCdJX4bM02yJoFcm4bOIyAPgIfliP//sdRqLDHt -# OhcZcRfNqRu8WhY5AJ3jbITkWkD73gYBjDf6m7GdJH7+IKRXrVu3mrBgJuppVyFd -# NC8fcbCDlBkFazWQEKB7l8f2P+fiEUGmvWLZ8Cc9OB0obzpSCfDscGLTYkuw4HOm -# ksDTjjHYL+NtFxMG7uQDthSr849Dp3GdId0UyhVdkkHa+Q+B0Zl0DSbEDn8btfWg -# 8cZ3BigV6diT5VUW8LsKqxzbXEgnZsijiwoc5ZXarsQuWaBh3drzbaJh6YoLbewS -# GL33VVRAA5Ira8JRwgpIr7DUbuD0FAo6G+OPPcqvao173NhEMIIGzTCCBbWgAwIB -# AgIQBv35A5YDreoACus/J7u6GzANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJV -# UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -# Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYx -# MTEwMDAwMDAwWhcNMjExMTEwMDAwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UE -# ChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYD -# VQQDExhEaWdpQ2VydCBBc3N1cmVkIElEIENBLTEwggEiMA0GCSqGSIb3DQEBAQUA -# A4IBDwAwggEKAoIBAQDogi2Z+crCQpWlgHNAcNKeVlRcqcTSQQaPyTP8TUWRXIGf -# 7Syc+BZZ3561JBXCmLm0d0ncicQK2q/LXmvtrbBxMevPOkAMRk2T7It6NggDqww0 -# /hhJgv7HxzFIgHweog+SDlDJxofrNj/YMMP/pvf7os1vcyP+rFYFkPAyIRaJxnCI -# +QWXfaPHQ90C6Ds97bFBo+0/vtuVSMTuHrPyvAwrmdDGXRJCgeGDboJzPyZLFJCu -# WWYKxI2+0s4Grq2Eb0iEm09AufFM8q+Y+/bOQF1c9qjxL6/siSLyaxhlscFzrdfx -# 2M8eCnRcQrhofrfVdwonVnwPYqQ/MhRglf0HBKIJAgMBAAGjggN6MIIDdjAOBgNV -# HQ8BAf8EBAMCAYYwOwYDVR0lBDQwMgYIKwYBBQUHAwEGCCsGAQUFBwMCBggrBgEF -# BQcDAwYIKwYBBQUHAwQGCCsGAQUFBwMIMIIB0gYDVR0gBIIByTCCAcUwggG0Bgpg -# hkgBhv1sAAEEMIIBpDA6BggrBgEFBQcCARYuaHR0cDovL3d3dy5kaWdpY2VydC5j -# b20vc3NsLWNwcy1yZXBvc2l0b3J5Lmh0bTCCAWQGCCsGAQUFBwICMIIBVh6CAVIA -# QQBuAHkAIAB1AHMAZQAgAG8AZgAgAHQAaABpAHMAIABDAGUAcgB0AGkAZgBpAGMA -# YQB0AGUAIABjAG8AbgBzAHQAaQB0AHUAdABlAHMAIABhAGMAYwBlAHAAdABhAG4A -# YwBlACAAbwBmACAAdABoAGUAIABEAGkAZwBpAEMAZQByAHQAIABDAFAALwBDAFAA -# UwAgAGEAbgBkACAAdABoAGUAIABSAGUAbAB5AGkAbgBnACAAUABhAHIAdAB5ACAA -# QQBnAHIAZQBlAG0AZQBuAHQAIAB3AGgAaQBjAGgAIABsAGkAbQBpAHQAIABsAGkA -# YQBiAGkAbABpAHQAeQAgAGEAbgBkACAAYQByAGUAIABpAG4AYwBvAHIAcABvAHIA -# YQB0AGUAZAAgAGgAZQByAGUAaQBuACAAYgB5ACAAcgBlAGYAZQByAGUAbgBjAGUA -# LjALBglghkgBhv1sAxUwEgYDVR0TAQH/BAgwBgEB/wIBADB5BggrBgEFBQcBAQRt -# MGswJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEF -# BQcwAoY3aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJl -# ZElEUm9vdENBLmNydDCBgQYDVR0fBHoweDA6oDigNoY0aHR0cDovL2NybDMuZGln -# aWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNybDA6oDigNoY0aHR0 -# cDovL2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNy -# bDAdBgNVHQ4EFgQUFQASKxOYspkH7R7for5XDStnAs0wHwYDVR0jBBgwFoAUReui -# r/SSy4IxLVGLp6chnfNtyA8wDQYJKoZIhvcNAQEFBQADggEBAEZQPsm3KCSnOB22 -# WymvUs9S6TFHq1Zce9UNC0Gz7+x1H3Q48rJcYaKclcNQ5IK5I9G6OoZyrTh4rHVd -# Fxc0ckeFlFbR67s2hHfMJKXzBBlVqefj56tizfuLLZDCwNK1lL1eT7EF0g49GqkU -# W6aGMWKoqDPkmzmnxPXOHXh2lCVz5Cqrz5x2S+1fwksW5EtwTACJHvzFebxMElf+ -# X+EevAJdqP77BzhPDcZdkbkPZ0XN1oPt55INjbFpjE/7WeAjD9KqrgB87pxCDs+R -# 1ye3Fu4Pw718CqDuLAhVhSK46xgaTfwqIa1JMYNHlXdx3LEbS0scEJx3FMGdTy9a -# lQgpECYxggQ7MIIENwIBATCBhjByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGln -# aUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhE -# aWdpQ2VydCBTSEEyIEFzc3VyZWQgSUQgQ29kZSBTaWduaW5nIENBAhADtHHNTX/+ -# wpo7ILLLD19UMAkGBSsOAwIaBQCgeDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAA -# MBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgor -# BgEEAYI3AgEVMCMGCSqGSIb3DQEJBDEWBBQYqTK+5RS95764dNPZ2T3z0jT+UDAN -# BgkqhkiG9w0BAQEFAASCAQBxPm4AI4omYJmPEnd/OaN+l/cm2ub2D432zRg8Nr0m -# 90TANmuNHLv9du3G4eKSqmKlAu9cVbhfqnioaiwC05bSO02gaH8q1bFBVANkD/e5 -# igGzGvYxP+Vqfa8xv8kiN0aNOOsznMrpCA8pcncPtNhiblyG0ipecLtCzTZoiDcA -# +dHLd54E9NcYqm/SZuHHD5Fk2jqwIDAAFHokU2eNZWGxB9Gx+ey3G4DekQEqkUDR -# LmEdq0OZeZULqeQQnGQ8grx0PmwxRTDBI7RkA/UGQTW4ibFfJfgdYjdQVWqguEtL -# 5dPmqZyOdF8AapUwGnDpzqPmZy+WPYetrOHHwf2y1v1hoYICDzCCAgsGCSqGSIb3 -# DQEJBjGCAfwwggH4AgEBMHYwYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lD -# ZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGln -# aUNlcnQgQXNzdXJlZCBJRCBDQS0xAhADAZoCOv9YsWvW1ermF/BmMAkGBSsOAwIa -# BQCgXTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0x -# NjA2MDMxODA2MzlaMCMGCSqGSIb3DQEJBDEWBBRxXYss0beJT3njEEWEltXbgfi9 -# 4zANBgkqhkiG9w0BAQEFAASCAQB1oq4vjrzr+8WHyhrhGzfMoTyYW6vGVBu6hVfB -# hsC0Wm1n6oebLNzGNmpaatmYtsV4syIDSdlQfIb9SkHJ173uTIUCWPS1jY1lqUF8 -# sXEYqgh74X5aDfTArA7geKdSBplnKg3oo+/8fF8NFE3wY8nQ5JXAWs8AgeQYeT5H -# KsOsWxCGlzN/3WvW3UfABUPzPMTUNdPpUh6WO/9L7HcN2uBg0CVemtpc3Da2IXyx -# +rKQkzeoCHAaUlEhvhUSQTvY4Sq0Wn2NKEWfHJrP7pFQvQ3xissPLnJu+HWPepKM -# 2W2kPrQBRL0MvZhtgrEx7Gmydf2GoU2UlMjll69spQ3yA2GG -# SIG # End signature block diff --git a/windowsRuntimeInstaller/InstallerRT.nsi b/windowsRuntimeInstaller/InstallerRT.nsi index 270447d6..00feb31d 100644 --- a/windowsRuntimeInstaller/InstallerRT.nsi +++ b/windowsRuntimeInstaller/InstallerRT.nsi @@ -228,6 +228,51 @@ VIAddVersionKey "LegalCopyright" "" VIAddVersionKey "FileDescription" "Vulkan Runtime Installer" !endif + +# Function to run ConfigLayersAndVulkanDll ps script. +# We define it as a macro so we can create an install and uninstall version. +# Return value is in $0 - 0 is success, all else is failure. +!macro ConfigLayersAndVulkanDLL un +Function ${un}ConfigLayersAndVulkanDLL + ${If} ${RunningX64} + Strcpy $1 64 + ${Else} + Strcpy $1 32 + ${Endif} + nsExec::ExecToStack '$WINDIR\System32\WindowsPowerShell\v1.0\powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -ExecutionPolicy RemoteSigned -Command .\ConfigLayersAndVulkanDLL.ps1 ${VERSION_ABI_MAJOR} $1 ; exit $$LASTEXITCODE' + Rename "$TEMP\ConfigLayersAndVulkanDLL.log" "$TEMP\VulkanRT\ConfigLayersAndVulkanDLL1.${un}log" + pop $0 + ${If} $0 != 0 + nsExec::ExecToStack 'powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -ExecutionPolicy RemoteSigned -Command .\ConfigLayersAndVulkanDLL.ps1 ${VERSION_ABI_MAJOR} $1 ; exit $$LASTEXITCODE' + pop $0 + Rename "$TEMP\ConfigLayersAndVulkanDLL.log" "$TEMP\VulkanRT\ConfigLayersAndVulkanDLL2.${un}log" + ${Endif} +FunctionEnd +!macroend +!insertmacro ConfigLayersAndVulkanDLL "" +!insertmacro ConfigLayersAndVulkanDLL "un." + + +# Function to run diagnostics if ConfigLayersAndVulkanDll ps script failed. +# We define it as a macro so we can create an install and uninstall version. +# On entry $0, contains the return value from ConfigLayersAndVulkanDll.ps1. It shouldn't be changed. +!macro DiagConfigLayersAndVulkanDLL un +Function ${un}DiagConfigLayersAndVulkanDLL + LogText "ConfigLayersAndVulkanDLL.ps1 rval is $0" + nsExec::ExecToStack 'powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -Command Write-Output Diagnostic0 | Out-File -encoding ascii -filePath "$TEMP\VulkanRT\Diagnostic0.${un}log"' + pop $1 + LogText "ps cmd rval is $1" + nsExec::ExecToStack 'cmd /k echo %PATH% >"$TEMP\VulkanRT\Diagnostic1.${un}log"' + pop $1 + LogText "cmd1 rval is $1" + nsExec::ExecToStack 'cmd /k dir "$WINDIR\System32\WindowsPowerShell\v1.0" >"$TEMP\VulkanRT\Diagnostic2.${un}log"' + pop $1 + LogText "cmd2 rval is $1" +FunctionEnd +!macroend +!insertmacro DiagConfigLayersAndVulkanDLL "" +!insertmacro DiagConfigLayersAndVulkanDLL "un." + # Start default section Section @@ -243,16 +288,16 @@ Section ${Endif} # Create our temp directory, with minimal permissions - RmDir /R "$TEMP\VulkanRTinstall" - SetOutPath "$TEMP\VulkanRTinstall" - AccessControl::DisableFileInheritance $TEMP\VulkanRTinstall - AccessControl::SetFileOwner $TEMP\VulkanRTinstall "Administrators" - AccessControl::ClearOnFile $TEMP\VulkanRTinstall "Administrators" "FullAccess" - AccessControl::SetOnFile $TEMP\VulkanRTinstall "SYSTEM" "FullAccess" - AccessControl::GrantOnFile $TEMP\VulkanRTinstall "Everyone" "ListDirectory" - AccessControl::GrantOnFile $TEMP\VulkanRTinstall "Everyone" "GenericExecute" - AccessControl::GrantOnFile $TEMP\VulkanRTinstall "Everyone" "GenericRead" - AccessControl::GrantOnFile $TEMP\VulkanRTinstall "Everyone" "ReadAttributes" + RmDir /R "$TEMP\VulkanRT" + SetOutPath "$TEMP\VulkanRT" + AccessControl::DisableFileInheritance $TEMP\VulkanRT + AccessControl::SetFileOwner $TEMP\VulkanRT "Administrators" + AccessControl::ClearOnFile $TEMP\VulkanRT "Administrators" "FullAccess" + AccessControl::SetOnFile $TEMP\VulkanRT "SYSTEM" "FullAccess" + AccessControl::GrantOnFile $TEMP\VulkanRT "Everyone" "ListDirectory" + AccessControl::GrantOnFile $TEMP\VulkanRT "Everyone" "GenericExecute" + AccessControl::GrantOnFile $TEMP\VulkanRT "Everyone" "GenericRead" + AccessControl::GrantOnFile $TEMP\VulkanRT "Everyone" "ReadAttributes" StrCpy $1 10 Call CheckForError @@ -408,39 +453,6 @@ Section StrCpy $1 40 Call CheckForError - # Run the ConfigLayersAndVulkanDLL.ps1 script to copy the most recent version of - # vulkan--*.dll to vulkan-.dll, and to set up layer registry - # entries to use layers from the corresponding SDK - nsExec::ExecToStack 'powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -ExecutionPolicy RemoteSigned -Command .\ConfigLayersAndVulkanDLL.ps1 ${VERSION_ABI_MAJOR} 64 ; exit $$LASTEXITCODE' - pop $0 - Rename "$TEMP\ConfigLayersAndVulkanDLL.log" "$TEMP\VulkanRTinstall\ConfigLayersAndVulkanDLL.log" - ${If} $0 != 0 - # PS Script failed, see if we can run a ps command, a ps script, and/or a cmd copy - LogText "ConfigLayersAndVulkanDLL.ps1 rval1 is $0" - pop $1 - LogText "ConfigLayersAndVulkanDLL.ps1 rval2 is $1" - nsExec::ExecToStack 'powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -Command Write-Output Diagnostic0 | Out-File -encoding ascii -filePath "$TEMP\VulkanRTinstall\Diagnostic0.log"' - pop $1 - LogText "ps cmd rval1 is $1" - pop $1 - LogText "ps cmd rval2 is $1" - File Diagnostic1.ps1 - nsExec::ExecToStack 'powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -ExecutionPolicy RemoteSigned -Command .\Diagnostic1.ps1' - pop $1 - LogText "ps script rval1 is $1" - pop $1 - LogText "ps script rval2 is $1" - Delete Diagnostic1.ps1 - nsExec::ExecToStack 'cmd /k copy /y nul "$TEMP\VulkanRTinstall\Diagnostic2.log"' - pop $1 - LogText "cmd rval1 is $1" - pop $1 - LogText "cmd rval2 is $1" - SetErrors - ${EndIf} - IntOp $1 10000 + $0 - Call CheckForError - # Else, running on a 32-bit OS machine ${Else} @@ -458,25 +470,18 @@ Section StrCpy $1 55 Call CheckForError - # Run the ConfigLayersAndVulkanDLL.ps1 script to copy the most recent version of - # vulkan--*.dll to vulkan-.dll, and to set up layer registry - # entries to use layers from the corresponding SDK - nsExec::ExecToStack 'powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -ExecutionPolicy RemoteSigned -Command .\ConfigLayersAndVulkanDLL.ps1 ${VERSION_ABI_MAJOR} 32 ; exit $$LASTEXITCODE' - pop $0 - Rename "$TEMP\ConfigLayersAndVulkanDLL.log" "$TEMP\VulkanRTinstall\ConfigLayersAndVulkanDLL.log" - ${If} $0 != 0 - LogText "ConfigLayersAndVulkanDLL.ps1 return value is $0" - # PS Script failed, see if we can run a simple ps command and a simple ps script - nsExec::ExecToStack 'powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -Command Write-Output Diagnostic0 | Out-File -encoding ascii -filePath "$TEMP\VulkanRTinstall\Diagnostic0.log"' - File Diagnostic1.ps1 - nsExec::ExecToStack 'powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -ExecutionPolicy RemoteSigned -Command .\Diagnostic1.ps1' - Delete Diagnostic1.ps1 - SetErrors - ${EndIf} - IntOp $1 20000 + $0 - Call CheckForError + ${Endif} + # Run the ConfigLayersAndVulkanDLL.ps1 script to copy the most recent version of + # vulkan--*.dll to vulkan-.dll, and to set up layer registry + # entries to use layers from the corresponding SDK + Call ConfigLayersAndVulkanDLL + ${If} $0 != 0 + Call DiagConfigLayersAndVulkanDLL + SetErrors ${Endif} + IntOp $1 10000 + $0 + Call CheckForError # We are done using ConfigLayersAndVulkanDLL.ps1, delete it. It will be re-installed # by the uninstaller when it needs to be run again during uninstall. @@ -484,7 +489,7 @@ Section # Finish logging and move log file to TEMP dir LogSet off - Rename "$INSTDIR\install.log" "$TEMP\VulkanRTinstall\Install.log" + Rename "$INSTDIR\install.log" "$TEMP\VulkanRT\installer.log" SectionEnd @@ -493,9 +498,8 @@ SectionEnd Section "uninstall" # Turn on logging - RmDir /R "$TEMP\VulkanRTuninstall" - SetOutPath "$TEMP\VulkanRTuninstall" - StrCpy $INSTDIR $TEMP\VulkanRTuninstall + SetOutPath "$TEMP\VulkanRT" + StrCpy $INSTDIR "$TEMP\VulkanRT" LogSet on # If running on a 64-bit OS machine, disable registry re-direct since we're running as a 32-bit executable. @@ -569,13 +573,6 @@ Section "uninstall" Delete /REBOOTOK $WINDIR\System32\vulkan-${VERSION_ABI_MAJOR}.dll Delete /REBOOTOK $WINDIR\System32\vulkan-$FileVersion.dll - # Run the ConfigLayersAndVulkanDLL.ps1 script to: - # Copy the most recent version of vulkan--*.dll to vulkan-.dll - # Copy the most recent version of vulkaninfo--*.exe to vulkaninfo.exe - # Set up layer registry entries to use layers from the corresponding SDK - nsExec::ExecToStack 'powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -ExecutionPolicy RemoteSigned -File "$IDir\ConfigLayersAndVulkanDLL.ps1" ${VERSION_ABI_MAJOR} 64' - Rename "$TEMP\ConfigLayersAndVulkanDLL.log" "$TEMP\VulkanRTuninstall\ConfigLayersAndVulkanDLL.log" - # Else, running on a 32-bit OS machine ${Else} @@ -587,15 +584,19 @@ Section "uninstall" Delete /REBOOTOK $WINDIR\System32\vulkan-${VERSION_ABI_MAJOR}.dll Delete /REBOOTOK $WINDIR\System32\vulkan-$FileVersion.dll - # Run the ConfigLayersAndVulkanDLL.ps1 script to: - # Copy the most recent version of vulkan--*.dll to vulkan-.dll - # Copy the most recent version of vulkaninfo--*.exe to vulkaninfo.exe - # Set up layer registry entries to use layers from the corresponding SDK - nsExec::ExecToStack 'powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -ExecutionPolicy RemoteSigned -File "$IDir\ConfigLayersAndVulkanDLL.ps1" ${VERSION_ABI_MAJOR} 32' - Rename "$TEMP\ConfigLayersAndVulkanDLL.log" "$TEMP\VulkanRTuninstall\ConfigLayersAndVulkanDLL.log" - ${EndIf} + # Run the ConfigLayersAndVulkanDLL.ps1 script to copy the most recent version of + # vulkan--*.dll to vulkan-.dll, and to set up layer registry + # entries to use layers from the corresponding SDK + Call un.ConfigLayersAndVulkanDLL + ${If} $0 != 0 + Call un.DiagConfigLayersAndVulkanDLL + SetErrors + ${Endif} + IntOp $1 20000 + $0 + Call un.CheckForError + # If Ref Count is zero, uninstall everything ${If} $IC <= 0 @@ -645,7 +646,7 @@ Section "uninstall" # Finish logging LogSet off - Rename "$INSTDIR\install.log" "$TEMP\VulkanRTuninstall\uninstall.log" + Rename "$INSTDIR\install.log" "$TEMP\VulkanRT\uninstaller.log" SectionEnd !endif @@ -689,18 +690,18 @@ Function CheckForError # Finish logging and move log file to TEMP dir LogSet off - Rename "$INSTDIR\install.log" "$TEMP\VulkanRTinstall\install.log" + Rename "$INSTDIR\install.log" "$TEMP\VulkanRT\installer.log" # Copy the uninstaller to a temp folder of our own creation so we can completely # delete the old contents. - SetOutPath "$TEMP\VulkanRTinstall" - CopyFiles "$INSTDIR\Uninstall${PRODUCTNAME}.exe" "$TEMP\VulkanRTinstall" + SetOutPath "$TEMP\VulkanRT" + CopyFiles "$INSTDIR\Uninstall${PRODUCTNAME}.exe" "$TEMP\VulkanRT" # Do uninstall using the version in the temporary folder. - ExecWait '"$TEMP\VulkanRTinstall\Uninstall${PRODUCTNAME}.exe" /S _?=$INSTDIR' + ExecWait '"$TEMP\VulkanRT\Uninstall${PRODUCTNAME}.exe" /S _?=$INSTDIR' # Delete the copy of the uninstaller we ran - Delete /REBOOTOK "$TEMP\VulkanRTinstall\Uninstall${PRODUCTNAME}.exe" + Delete /REBOOTOK "$TEMP\VulkanRT\Uninstall${PRODUCTNAME}.exe" # Set an error message to output SetErrorLevel $1 @@ -710,7 +711,7 @@ Function CheckForError FunctionEnd # Check for errors during uninstall. If we hit an error, don't attempt -# to do anything. Just set a non-zero return code and quit. +# to do anything. Just set a non-zero return code and continue. Function un.CheckForError ${If} ${Errors} # IHV's using this install may want no message box. @@ -719,10 +720,5 @@ Function un.CheckForError # Set an error message to output SetErrorLevel $1 - # Finish logging and move log file to TEMP dir - LogSet off - Rename "$INSTDIR\install.log" "$TEMP\VulkanRTuninstall\uninstall.log" - - Quit ${EndIf} FunctionEnd -- cgit v1.2.3 From 0d0a82a77b82e9560dce5c5a7f6b213cac490237 Mon Sep 17 00:00:00 2001 From: Tony Barbour Date: Thu, 2 Jun 2016 09:43:50 -0600 Subject: layers: Add check for image usage in vkCmdClearColorImage Change-Id: I7ba803a11de29e65ae65fbf0a0168561a2e6739f --- layers/image.cpp | 6 ++++++ layers/image.h | 8 +++++--- layers/vk_validation_layer_details.md | 1 + 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/layers/image.cpp b/layers/image.cpp index 1fb7d5a0..116f49f7 100644 --- a/layers/image.cpp +++ b/layers/image.cpp @@ -644,6 +644,12 @@ VKAPI_ATTR void VKAPI_CALL CmdClearColorImage(VkCommandBuffer commandBuffer, VkI skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, reinterpret_cast(image), __LINE__, IMAGE_INVALID_FORMAT, "IMAGE", str); } + + if (!(image_state->usage & VK_IMAGE_USAGE_TRANSFER_DST_BIT)) { + char const str[] = "vkCmdClearColorImage called with image created without VK_IMAGE_USAGE_TRANSFER_DST_BIT."; + skipCall |= log_msg(device_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, + reinterpret_cast(image), __LINE__, IMAGE_INVALID_USAGE, "IMAGE", str); + } } if (!skipCall) { diff --git a/layers/image.h b/layers/image.h index 93b6c7ed..6a6c76b3 100644 --- a/layers/image.h +++ b/layers/image.h @@ -44,6 +44,7 @@ enum IMAGE_ERROR { IMAGE_INVALID_FORMAT_LIMITS_VIOLATION, // Device limits for this format have been exceeded IMAGE_INVALID_LAYOUT, // Operation specifies an invalid layout IMAGE_INVALID_EXTENTS, // Operation specifies invalid image extents + IMAGE_INVALID_USAGE, // Image was created without necessary usage for operation }; struct IMAGE_STATE { @@ -54,13 +55,14 @@ struct IMAGE_STATE { VkImageType imageType; VkExtent3D extent; VkImageCreateFlags flags; + VkImageUsageFlags usage; IMAGE_STATE() : mipLevels(0), arraySize(0), format(VK_FORMAT_UNDEFINED), samples(VK_SAMPLE_COUNT_1_BIT), - imageType(VK_IMAGE_TYPE_RANGE_SIZE), extent{}, flags(0){}; + imageType(VK_IMAGE_TYPE_RANGE_SIZE), extent{}, flags(0), usage(0){}; IMAGE_STATE(const VkImageCreateInfo *pCreateInfo) : mipLevels(pCreateInfo->mipLevels), arraySize(pCreateInfo->arrayLayers), format(pCreateInfo->format), - samples(pCreateInfo->samples), imageType(pCreateInfo->imageType), extent(pCreateInfo->extent), - flags(pCreateInfo->flags){}; + samples(pCreateInfo->samples), imageType(pCreateInfo->imageType), extent(pCreateInfo->extent), flags(pCreateInfo->flags), + usage(pCreateInfo->usage){}; }; #endif // IMAGE_H diff --git a/layers/vk_validation_layer_details.md b/layers/vk_validation_layer_details.md index e7c6c592..e71a41db 100644 --- a/layers/vk_validation_layer_details.md +++ b/layers/vk_validation_layer_details.md @@ -215,6 +215,7 @@ DETAILS TABLE PENDING | Verify Image Format Limits | Verifies that image creation parameters are with the device format limits | INVALID_FORMAT_LIMITS_VIOLATION | vkCreateImage | ImageFormatLimits | NA | | Verify Layout | Verifies the layouts are valid for this image operation | INVALID_LAYOUT | vkCreateImage vkCmdClearColorImage | TODO | ImageFormatLimits | | Verify Image Extents | Validates that image extent limits are not invalid | INVALID_EXTENTS | vkCmdCopyImage | CopyImageLayerCountMismatch | NA | +| Verify Usage | Verifies the image was created with usage valid for this image operation | INVALID_USAGE | vkCmdClearColorImage | TODO | ClearImageErrors | | NA | Enum used for informational messages | NONE | | TODO | None | ### VK_LAYER_LUNARG_image Pending Work -- cgit v1.2.3 From 2f7bb387313a382123fedce86b295cc5f65344c1 Mon Sep 17 00:00:00 2001 From: Mark Mueller Date: Tue, 7 Jun 2016 14:32:29 -0600 Subject: tests: GH421 reflect vkCmdBindDescriptorSets test Test was added with 772fcd1 --- layers/vk_validation_layer_details.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layers/vk_validation_layer_details.md b/layers/vk_validation_layer_details.md index e71a41db..20446af5 100644 --- a/layers/vk_validation_layer_details.md +++ b/layers/vk_validation_layer_details.md @@ -36,7 +36,7 @@ The Draw State portion of the core validation layer tracks state leading into Dr | Valid Command Buffer Reset | Can only reset individual command buffer that was allocated from a pool with VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set | INVALID_COMMAND_BUFFER_RESET | vkBeginCommandBuffer vkResetCommandBuffer | CommandBufferResetErrors | None | | PSO Bound | Verify that a properly created and valid pipeline object is bound to the CommandBuffer specified in these calls | NO_PIPELINE_BOUND | vkCmdBindDescriptorSets vkCmdBindVertexBuffers | PipelineNotBound | This check is currently more related to VK_LAYER_LUNARG_core_validation internal data structures and less about verifying that PSO is bound at all appropriate points in API. For API purposes, need to make sure this is checked at Draw time and any other relevant calls. | | Valid DescriptorPool | Verifies that the descriptor set pool object was properly created and is valid | INVALID_POOL | vkResetDescriptorPool vkAllocateDescriptorSets | TODO | This is just an internal layer data structure check. VK_LAYER_LUNARG_parameter_validation or VK_LAYER_LUNARG_object_tracker should really catch bad DSPool | -| Valid DescriptorSet | Validate that descriptor set was properly created and is currently valid | INVALID_SET | vkCmdBindDescriptorSets | TODO | Is this needed other places (like Update/Clear descriptors) | +| Valid DescriptorSet | Validate that descriptor set was properly created and is currently valid | INVALID_SET | vkCmdBindDescriptorSets | InvalidDescriptorSet | Is this needed other places (like Update/Clear descriptors) | | Valid DescriptorSetLayout | Flag DescriptorSetLayout object that was not properly created | INVALID_LAYOUT | vkAllocateDescriptorSets | TODO | Anywhere else to check this? | | Valid RenderArea | Flag renderArea field that is outside of the framebuffer | INVALID_RENDER_AREA | vkCmdBeginRenderPass | TODO | Anywhere else to check this? | | Valid Pipeline | Flag VkPipeline object that was not properly created, or case when Draw/Dispatch is bound to cmd buffer without a pipeline being bound | INVALID_PIPELINE | vkCmdBindPipeline | InvalidPipeline | NA | -- cgit v1.2.3 From 27b463561c5930d48e3f5bae6b19551d85e3c4ca Mon Sep 17 00:00:00 2001 From: Mark Mueller Date: Tue, 7 Jun 2016 14:43:26 -0600 Subject: tests: GH421 reflect vkAllocateDescriptorSets test InvalidDescriptorSetLayout test was added with 772fcd1c --- layers/vk_validation_layer_details.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layers/vk_validation_layer_details.md b/layers/vk_validation_layer_details.md index 20446af5..f5309ecd 100644 --- a/layers/vk_validation_layer_details.md +++ b/layers/vk_validation_layer_details.md @@ -37,7 +37,7 @@ The Draw State portion of the core validation layer tracks state leading into Dr | PSO Bound | Verify that a properly created and valid pipeline object is bound to the CommandBuffer specified in these calls | NO_PIPELINE_BOUND | vkCmdBindDescriptorSets vkCmdBindVertexBuffers | PipelineNotBound | This check is currently more related to VK_LAYER_LUNARG_core_validation internal data structures and less about verifying that PSO is bound at all appropriate points in API. For API purposes, need to make sure this is checked at Draw time and any other relevant calls. | | Valid DescriptorPool | Verifies that the descriptor set pool object was properly created and is valid | INVALID_POOL | vkResetDescriptorPool vkAllocateDescriptorSets | TODO | This is just an internal layer data structure check. VK_LAYER_LUNARG_parameter_validation or VK_LAYER_LUNARG_object_tracker should really catch bad DSPool | | Valid DescriptorSet | Validate that descriptor set was properly created and is currently valid | INVALID_SET | vkCmdBindDescriptorSets | InvalidDescriptorSet | Is this needed other places (like Update/Clear descriptors) | -| Valid DescriptorSetLayout | Flag DescriptorSetLayout object that was not properly created | INVALID_LAYOUT | vkAllocateDescriptorSets | TODO | Anywhere else to check this? | +| Valid DescriptorSetLayout | Flag DescriptorSetLayout object that was not properly created | INVALID_LAYOUT | vkAllocateDescriptorSets | InvalidDescriptorSetLayout | Anywhere else to check this? | | Valid RenderArea | Flag renderArea field that is outside of the framebuffer | INVALID_RENDER_AREA | vkCmdBeginRenderPass | TODO | Anywhere else to check this? | | Valid Pipeline | Flag VkPipeline object that was not properly created, or case when Draw/Dispatch is bound to cmd buffer without a pipeline being bound | INVALID_PIPELINE | vkCmdBindPipeline | InvalidPipeline | NA | | Valid PipelineLayout | Flag VkPipelineLayout object that was not properly created | INVALID_PIPELINE_LAYOUT | vkCmdBindPipeline | TODO | Write test for this case | -- cgit v1.2.3 From 7b4958a36b23dca8785e64da706912e3d1b54b58 Mon Sep 17 00:00:00 2001 From: Tony Barbour Date: Tue, 7 Jun 2016 10:44:06 -0600 Subject: demos: Add -lrt to link options for smoke LVL #500 Change-Id: I0480e60e3c6c2f06f24022332640756bcdc3f1a0 --- demos/smoke/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demos/smoke/CMakeLists.txt b/demos/smoke/CMakeLists.txt index a1789e92..04aae19b 100644 --- a/demos/smoke/CMakeLists.txt +++ b/demos/smoke/CMakeLists.txt @@ -60,7 +60,7 @@ if(WIN32) list(APPEND sources ShellWin32.cpp ShellWin32.h) else() - list(APPEND libraries PRIVATE -ldl) + list(APPEND libraries PRIVATE -ldl -lrt) find_package(XCB REQUIRED) -- cgit v1.2.3 From ba48a7989cb77b19b06822b94cad0e602defbd92 Mon Sep 17 00:00:00 2001 From: David Pinedo Date: Wed, 8 Jun 2016 16:30:06 -0600 Subject: winrtinstaller: avoid executing ps scripts, instead just pipe cmds to ps --- .../ConfigLayersAndVulkanDLL.ps1 | 163 +-------------------- windowsRuntimeInstaller/InstallerRT.nsi | 33 ++++- 2 files changed, 30 insertions(+), 166 deletions(-) diff --git a/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 b/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 index 891984b3..e6cae4d5 100644 --- a/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 +++ b/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 @@ -34,10 +34,10 @@ # $ossize : an integer indicating if the target is a 64 (64) or 32 (32) bit OS. # -Param( - [string]$majorabi, - [int]$ossize -) +#Note that these two vars need to be prepended to this script. +#InstallerRT.nsi does this before calling this script. +#$majorabi= +#$ossize= # Clear any pre-existing errors and set default return value $Error.Clear(); @@ -611,158 +611,3 @@ Get-Content $log | Out-File -encoding ascii -filepath $logascii Remove-Item $log exit $script:scriptReturnValue - -# SIG # Begin signature block -# MIIccAYJKoZIhvcNAQcCoIIcYTCCHF0CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB -# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR -# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUWzO9uMOZloqpSF0mSPfjnVcK -# X2ygghefMIIFKDCCBBCgAwIBAgIQA7RxzU1//sKaOyCyyw9fVDANBgkqhkiG9w0B -# AQsFADByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD -# VQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFz -# c3VyZWQgSUQgQ29kZSBTaWduaW5nIENBMB4XDTE2MDQwODAwMDAwMFoXDTE3MDgx -# MDEyMDAwMFowZTELMAkGA1UEBhMCVVMxETAPBgNVBAgTCENvbG9yYWRvMRUwEwYD -# VQQHEwxGb3J0IENvbGxpbnMxFTATBgNVBAoTDEx1bmFyRywgSW5jLjEVMBMGA1UE -# AxMMTHVuYXJHLCBJbmMuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -# 9g6eKks1n/j5xBMG0viQaVqoxYjNIt2sLiDhBa1JMfPVvQsclZwsJl2FHhnQEg1/ -# YLeNUqSukbgTNXTGjkvNoh/PbjjBzlxZbPwRKO8tbHMRKZJjcVkOWLLReUGHkxJ3 -# i4hD6zH0K9DKMubb0ohmaA28ALsl8d4igz78uGyqa3jNXbiyNLJhd467u2nCySdV -# PFdXCMklePhW9VLm8VXSRDlBcx6tsaTpJr8lRZsq13xO7lwifQw1w2QRQzlnezUY -# PVnXIz+54Nu0U6JKPaTlxgbk9SlcP4f77UJuieGQGCWh3uCcASYQgUMjisetLyFU -# WZuPYpSbNWVksMaiIlSIuwIDAQABo4IBxTCCAcEwHwYDVR0jBBgwFoAUWsS5eyoK -# o6XqcQPAYPkt9mV1DlgwHQYDVR0OBBYEFBP4/a3JE2uXZpm3r1yknye/WxPWMA4G -# A1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzB3BgNVHR8EcDBuMDWg -# M6Axhi9odHRwOi8vY3JsMy5kaWdpY2VydC5jb20vc2hhMi1hc3N1cmVkLWNzLWcx -# LmNybDA1oDOgMYYvaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJl -# ZC1jcy1nMS5jcmwwTAYDVR0gBEUwQzA3BglghkgBhv1sAwEwKjAoBggrBgEFBQcC -# ARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAIBgZngQwBBAEwgYQGCCsG -# AQUFBwEBBHgwdjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29t -# ME4GCCsGAQUFBzAChkJodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNl -# cnRTSEEyQXNzdXJlZElEQ29kZVNpZ25pbmdDQS5jcnQwDAYDVR0TAQH/BAIwADAN -# BgkqhkiG9w0BAQsFAAOCAQEAscucuwAp0HisTjMWJii1ZX5H7+GAc048OJctdrTS -# VlUc7kJgEirXQb1TQbSevvt1wE6s3xJWUapWnYvvgEPOq036WFA+NRVoWU5eIUkG -# MsYGXH5ASHVBH+5/13wFLC1nXTxxrQ6B19uFFr5ZpsaP93EdD5pLqRxKrqLc9Stc -# /faupcVkclisgXOEDsCzvgGhhaFCc/RSeXOOAZg2EsJNbaydg/xyvZqPDG17NboL -# rgrzN5r6FoCk535HuGvcpjbr60nlwwzuxwqzXuMhGUTOs5O5cPpJQt6+iXBrlBgh -# 4jPNL+ZvFfJLDq3CUdnSh3S13GJruyTWzF2AxTeRAnw2fzCCBTAwggQYoAMCAQIC -# EAQJGBtf1btmdVNDtW+VUAgwDQYJKoZIhvcNAQELBQAwZTELMAkGA1UEBhMCVVMx -# FTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNv -# bTEkMCIGA1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBMB4XDTEzMTAy -# MjEyMDAwMFoXDTI4MTAyMjEyMDAwMFowcjELMAkGA1UEBhMCVVMxFTATBgNVBAoT -# DERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTExMC8GA1UE -# AxMoRGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIENvZGUgU2lnbmluZyBDQTCCASIw -# DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPjTsxx/DhGvZ3cH0wsxSRnP0PtF -# mbE620T1f+Wondsy13Hqdp0FLreP+pJDwKX5idQ3Gde2qvCchqXYJawOeSg6funR -# Z9PG+yknx9N7I5TkkSOWkHeC+aGEI2YSVDNQdLEoJrskacLCUvIUZ4qJRdQtoaPp -# iCwgla4cSocI3wz14k1gGL6qxLKucDFmM3E+rHCiq85/6XzLkqHlOzEcz+ryCuRX -# u0q16XTmK/5sy350OTYNkO/ktU6kqepqCquE86xnTrXE94zRICUj6whkPlKWwfIP -# EvTFjg/BougsUfdzvL2FsWKDc0GCB+Q4i2pzINAPZHM8np+mM6n9Gd8lk9ECAwEA -# AaOCAc0wggHJMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGGMBMG -# A1UdJQQMMAoGCCsGAQUFBwMDMHkGCCsGAQUFBwEBBG0wazAkBggrBgEFBQcwAYYY -# aHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRwOi8vY2Fj -# ZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3J0MIGB -# BgNVHR8EejB4MDqgOKA2hjRodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGlnaUNl -# cnRBc3N1cmVkSURSb290Q0EuY3JsMDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2Vy -# dC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsME8GA1UdIARIMEYwOAYK -# YIZIAYb9bAACBDAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5j -# b20vQ1BTMAoGCGCGSAGG/WwDMB0GA1UdDgQWBBRaxLl7KgqjpepxA8Bg+S32ZXUO -# WDAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkqhkiG9w0BAQsF -# AAOCAQEAPuwNWiSz8yLRFcgsfCUpdqgdXRwtOhrE7zBh134LYP3DPQ/Er4v97yrf -# IFU3sOH20ZJ1D1G0bqWOWuJeJIFOEKTuP3GOYw4TS63XX0R58zYUBor3nEZOXP+Q -# sRsHDpEV+7qvtVHCjSSuJMbHJyqhKSgaOnEoAjwukaPAJRHinBRHoXpoaK+bp1wg -# XNlxsQyPu6j4xRJon89Ay0BEpRPw5mQMJQhCMrI2iiQC/i9yfhzXSUWW6Fkd6fp0 -# ZGuy62ZD2rOwjNXpDd32ASDOmTFjPQgaGLOBm0/GkxAG/AeB+ova+YJJ92JuoVP6 -# EpQYhS6SkepobEQysmah5xikmmRR7zCCBmowggVSoAMCAQICEAMBmgI6/1ixa9bV -# 6uYX8GYwDQYJKoZIhvcNAQEFBQAwYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERp -# Z2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMY -# RGlnaUNlcnQgQXNzdXJlZCBJRCBDQS0xMB4XDTE0MTAyMjAwMDAwMFoXDTI0MTAy -# MjAwMDAwMFowRzELMAkGA1UEBhMCVVMxETAPBgNVBAoTCERpZ2lDZXJ0MSUwIwYD -# VQQDExxEaWdpQ2VydCBUaW1lc3RhbXAgUmVzcG9uZGVyMIIBIjANBgkqhkiG9w0B -# AQEFAAOCAQ8AMIIBCgKCAQEAo2Rd/Hyz4II14OD2xirmSXU7zG7gU6mfH2RZ5nxr -# f2uMnVX4kuOe1VpjWwJJUNmDzm9m7t3LhelfpfnUh3SIRDsZyeX1kZ/GFDmsJOqo -# SyyRicxeKPRktlC39RKzc5YKZ6O+YZ+u8/0SeHUOplsU/UUjjoZEVX0YhgWMVYd5 -# SEb3yg6Np95OX+Koti1ZAmGIYXIYaLm4fO7m5zQvMXeBMB+7NgGN7yfj95rwTDFk -# jePr+hmHqH7P7IwMNlt6wXq4eMfJBi5GEMiN6ARg27xzdPpO2P6qQPGyznBGg+na -# QKFZOtkVCVeZVjCT88lhzNAIzGvsYkKRrALA76TwiRGPdwIDAQABo4IDNTCCAzEw -# DgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYB -# BQUHAwgwggG/BgNVHSAEggG2MIIBsjCCAaEGCWCGSAGG/WwHATCCAZIwKAYIKwYB -# BQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwggFkBggrBgEFBQcC -# AjCCAVYeggFSAEEAbgB5ACAAdQBzAGUAIABvAGYAIAB0AGgAaQBzACAAQwBlAHIA -# dABpAGYAaQBjAGEAdABlACAAYwBvAG4AcwB0AGkAdAB1AHQAZQBzACAAYQBjAGMA -# ZQBwAHQAYQBuAGMAZQAgAG8AZgAgAHQAaABlACAARABpAGcAaQBDAGUAcgB0ACAA -# QwBQAC8AQwBQAFMAIABhAG4AZAAgAHQAaABlACAAUgBlAGwAeQBpAG4AZwAgAFAA -# YQByAHQAeQAgAEEAZwByAGUAZQBtAGUAbgB0ACAAdwBoAGkAYwBoACAAbABpAG0A -# aQB0ACAAbABpAGEAYgBpAGwAaQB0AHkAIABhAG4AZAAgAGEAcgBlACAAaQBuAGMA -# bwByAHAAbwByAGEAdABlAGQAIABoAGUAcgBlAGkAbgAgAGIAeQAgAHIAZQBmAGUA -# cgBlAG4AYwBlAC4wCwYJYIZIAYb9bAMVMB8GA1UdIwQYMBaAFBUAEisTmLKZB+0e -# 36K+Vw0rZwLNMB0GA1UdDgQWBBRhWk0ktkkynUoqeRqDS/QeicHKfTB9BgNVHR8E -# djB0MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1 -# cmVkSURDQS0xLmNybDA4oDagNIYyaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0Rp -# Z2lDZXJ0QXNzdXJlZElEQ0EtMS5jcmwwdwYIKwYBBQUHAQEEazBpMCQGCCsGAQUF -# BzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQQYIKwYBBQUHMAKGNWh0dHA6 -# Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRENBLTEuY3J0 -# MA0GCSqGSIb3DQEBBQUAA4IBAQCdJX4bM02yJoFcm4bOIyAPgIfliP//sdRqLDHt -# OhcZcRfNqRu8WhY5AJ3jbITkWkD73gYBjDf6m7GdJH7+IKRXrVu3mrBgJuppVyFd -# NC8fcbCDlBkFazWQEKB7l8f2P+fiEUGmvWLZ8Cc9OB0obzpSCfDscGLTYkuw4HOm -# ksDTjjHYL+NtFxMG7uQDthSr849Dp3GdId0UyhVdkkHa+Q+B0Zl0DSbEDn8btfWg -# 8cZ3BigV6diT5VUW8LsKqxzbXEgnZsijiwoc5ZXarsQuWaBh3drzbaJh6YoLbewS -# GL33VVRAA5Ira8JRwgpIr7DUbuD0FAo6G+OPPcqvao173NhEMIIGzTCCBbWgAwIB -# AgIQBv35A5YDreoACus/J7u6GzANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJV -# UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -# Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYx -# MTEwMDAwMDAwWhcNMjExMTEwMDAwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UE -# ChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYD -# VQQDExhEaWdpQ2VydCBBc3N1cmVkIElEIENBLTEwggEiMA0GCSqGSIb3DQEBAQUA -# A4IBDwAwggEKAoIBAQDogi2Z+crCQpWlgHNAcNKeVlRcqcTSQQaPyTP8TUWRXIGf -# 7Syc+BZZ3561JBXCmLm0d0ncicQK2q/LXmvtrbBxMevPOkAMRk2T7It6NggDqww0 -# /hhJgv7HxzFIgHweog+SDlDJxofrNj/YMMP/pvf7os1vcyP+rFYFkPAyIRaJxnCI -# +QWXfaPHQ90C6Ds97bFBo+0/vtuVSMTuHrPyvAwrmdDGXRJCgeGDboJzPyZLFJCu -# WWYKxI2+0s4Grq2Eb0iEm09AufFM8q+Y+/bOQF1c9qjxL6/siSLyaxhlscFzrdfx -# 2M8eCnRcQrhofrfVdwonVnwPYqQ/MhRglf0HBKIJAgMBAAGjggN6MIIDdjAOBgNV -# HQ8BAf8EBAMCAYYwOwYDVR0lBDQwMgYIKwYBBQUHAwEGCCsGAQUFBwMCBggrBgEF -# BQcDAwYIKwYBBQUHAwQGCCsGAQUFBwMIMIIB0gYDVR0gBIIByTCCAcUwggG0Bgpg -# hkgBhv1sAAEEMIIBpDA6BggrBgEFBQcCARYuaHR0cDovL3d3dy5kaWdpY2VydC5j -# b20vc3NsLWNwcy1yZXBvc2l0b3J5Lmh0bTCCAWQGCCsGAQUFBwICMIIBVh6CAVIA -# QQBuAHkAIAB1AHMAZQAgAG8AZgAgAHQAaABpAHMAIABDAGUAcgB0AGkAZgBpAGMA -# YQB0AGUAIABjAG8AbgBzAHQAaQB0AHUAdABlAHMAIABhAGMAYwBlAHAAdABhAG4A -# YwBlACAAbwBmACAAdABoAGUAIABEAGkAZwBpAEMAZQByAHQAIABDAFAALwBDAFAA -# UwAgAGEAbgBkACAAdABoAGUAIABSAGUAbAB5AGkAbgBnACAAUABhAHIAdAB5ACAA -# QQBnAHIAZQBlAG0AZQBuAHQAIAB3AGgAaQBjAGgAIABsAGkAbQBpAHQAIABsAGkA -# YQBiAGkAbABpAHQAeQAgAGEAbgBkACAAYQByAGUAIABpAG4AYwBvAHIAcABvAHIA -# YQB0AGUAZAAgAGgAZQByAGUAaQBuACAAYgB5ACAAcgBlAGYAZQByAGUAbgBjAGUA -# LjALBglghkgBhv1sAxUwEgYDVR0TAQH/BAgwBgEB/wIBADB5BggrBgEFBQcBAQRt -# MGswJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEF -# BQcwAoY3aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJl -# ZElEUm9vdENBLmNydDCBgQYDVR0fBHoweDA6oDigNoY0aHR0cDovL2NybDMuZGln -# aWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNybDA6oDigNoY0aHR0 -# cDovL2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNy -# bDAdBgNVHQ4EFgQUFQASKxOYspkH7R7for5XDStnAs0wHwYDVR0jBBgwFoAUReui -# r/SSy4IxLVGLp6chnfNtyA8wDQYJKoZIhvcNAQEFBQADggEBAEZQPsm3KCSnOB22 -# WymvUs9S6TFHq1Zce9UNC0Gz7+x1H3Q48rJcYaKclcNQ5IK5I9G6OoZyrTh4rHVd -# Fxc0ckeFlFbR67s2hHfMJKXzBBlVqefj56tizfuLLZDCwNK1lL1eT7EF0g49GqkU -# W6aGMWKoqDPkmzmnxPXOHXh2lCVz5Cqrz5x2S+1fwksW5EtwTACJHvzFebxMElf+ -# X+EevAJdqP77BzhPDcZdkbkPZ0XN1oPt55INjbFpjE/7WeAjD9KqrgB87pxCDs+R -# 1ye3Fu4Pw718CqDuLAhVhSK46xgaTfwqIa1JMYNHlXdx3LEbS0scEJx3FMGdTy9a -# lQgpECYxggQ7MIIENwIBATCBhjByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGln -# aUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhE -# aWdpQ2VydCBTSEEyIEFzc3VyZWQgSUQgQ29kZSBTaWduaW5nIENBAhADtHHNTX/+ -# wpo7ILLLD19UMAkGBSsOAwIaBQCgeDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAA -# MBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgor -# BgEEAYI3AgEVMCMGCSqGSIb3DQEJBDEWBBTl9vUhNixlC4qK2N6ftsmXNxTB5DAN -# BgkqhkiG9w0BAQEFAASCAQBmoK4vUOuN1W2tbF6prfT9lK/x424kuyT2GmMuBg1K -# 2QLmoPVPFokJllqckm2snV2PrVZ2jQf1HqZfoQ9k9tJQ9Iysobsdi+Xk35m9Jhnb -# qoDBI7HI8NVzgczSgcOGMtV1SkSHMxnobVPnqNVyD1nK6OCSIFe8lKVggiNHokxv -# bpPOWW1oPO9eayYSoysEqwygODgV5Jr0wSVLDuoAKlnbYH4Hjvtf0JWJncm/l6ZM -# yWIXaBUWNV6Dl2ZTeCXIlBrNxC3nfLn6uBkbox0xvcYk6tvksy7fQsSFFWYiqR26 -# 9sW4wJmqvlKO1PKNwdiGnY2fvJzffot8NPEKxbb7l2ySoYICDzCCAgsGCSqGSIb3 -# DQEJBjGCAfwwggH4AgEBMHYwYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lD -# ZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGln -# aUNlcnQgQXNzdXJlZCBJRCBDQS0xAhADAZoCOv9YsWvW1ermF/BmMAkGBSsOAwIa -# BQCgXTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0x -# NjA2MDMxODA1NTFaMCMGCSqGSIb3DQEJBDEWBBQ8siiyF+3YjaCU9cWVOMiV0i6H -# WjANBgkqhkiG9w0BAQEFAASCAQCcC1//Fo3cFfFAFDvhOtpcuzFn6vsIm6eGjcAD -# l/sUEeAS69BbPrapFDxwGjMbeFWSQK0KhzbxEs5DN/5eRrj1xX9SnhunszqPCzJ7 -# 66XJvuncyzKxQvOGGMLPbGkVHsximVT0IX+pPEZS25gTLBk8e30R6w9ChgykAxbz -# Gyi4gg8HNvk20aTydXelUA8hRYdb2dn/RLTamZjxAdmhRUyPuClgh4ZvOohILwAn -# Egh5cdu417ircbhFIJhujK/yr2C4uJEmb+JDST96luQBKQtlg7e3OnTBYddc3YoZ -# S5dTEsAn3PlDvkcuxg79fgK+Wf/EMOGaEv3bJaeReFcRp1l8 -# SIG # End signature block diff --git a/windowsRuntimeInstaller/InstallerRT.nsi b/windowsRuntimeInstaller/InstallerRT.nsi index 00feb31d..00a74a8d 100644 --- a/windowsRuntimeInstaller/InstallerRT.nsi +++ b/windowsRuntimeInstaller/InstallerRT.nsi @@ -239,9 +239,13 @@ Function ${un}ConfigLayersAndVulkanDLL ${Else} Strcpy $1 32 ${Endif} - nsExec::ExecToStack '$WINDIR\System32\WindowsPowerShell\v1.0\powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -ExecutionPolicy RemoteSigned -Command .\ConfigLayersAndVulkanDLL.ps1 ${VERSION_ABI_MAJOR} $1 ; exit $$LASTEXITCODE' - Rename "$TEMP\ConfigLayersAndVulkanDLL.log" "$TEMP\VulkanRT\ConfigLayersAndVulkanDLL1.${un}log" + nsExec::ExecToStack 'cmd /k echo $$majorabi=${VERSION_ABI_MAJOR} >"$TEMP\VulkanRT.tmp"' + nsExec::ExecToStack 'cmd /k echo $$ossize=$1 >>"$TEMP\VulkanRT.tmp"' + nsExec::ExecToStack 'cmd /k type ConfigLayersAndVulkanDLL.ps1 >>"$TEMP\VulkanRT.tmp"' + nsExec::ExecToStack 'cmd /k type "$TEMP\VulkanRT.tmp" | powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -Command -' pop $0 + Rename "$TEMP\ConfigLayersAndVulkanDLL.log" "$TEMP\VulkanRT\ConfigLayersAndVulkanDLL1.${un}log" + Delete "$TEMP\VulkanRT.tmp" ${If} $0 != 0 nsExec::ExecToStack 'powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -ExecutionPolicy RemoteSigned -Command .\ConfigLayersAndVulkanDLL.ps1 ${VERSION_ABI_MAJOR} $1 ; exit $$LASTEXITCODE' pop $0 @@ -475,12 +479,16 @@ Section # Run the ConfigLayersAndVulkanDLL.ps1 script to copy the most recent version of # vulkan--*.dll to vulkan-.dll, and to set up layer registry # entries to use layers from the corresponding SDK + SetOutPath "$INSTDIR" Call ConfigLayersAndVulkanDLL ${If} $0 != 0 + SetOutPath "$INSTDIR" Call DiagConfigLayersAndVulkanDLL SetErrors + IntOp $1 10000 + $0 + ${Else} + StrCpy $1 60 ${Endif} - IntOp $1 10000 + $0 Call CheckForError # We are done using ConfigLayersAndVulkanDLL.ps1, delete it. It will be re-installed @@ -514,7 +522,7 @@ Section "uninstall" ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" "InstallDir" StrCpy $IDir $0 - StrCpy $1 70 + StrCpy $1 65 Call un.CheckForError SetOutPath "$IDir" @@ -536,6 +544,8 @@ Section "uninstall" Delete /REBOOTOK "$IDir\Instance_$IC\Uninstall${PRODUCTNAME}.exe" Rmdir /REBOOTOK "$IDir\Instance_$IC" ${Endif} + StrCpy $1 70 + Call un.CheckForError # Modify registry for Programs and Features @@ -552,6 +562,8 @@ Section "uninstall" IntOp $IC $IC - 1 DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCTNAME}${PRODUCTVERSION}" ${EndIf} + StrCpy $1 75 + Call un.CheckForError # Install the ConfigLayersAndVulkanDLL.ps1 so we can run it. @@ -585,16 +597,23 @@ Section "uninstall" Delete /REBOOTOK $WINDIR\System32\vulkan-$FileVersion.dll ${EndIf} + StrCpy $1 80 + Call un.CheckForError # Run the ConfigLayersAndVulkanDLL.ps1 script to copy the most recent version of # vulkan--*.dll to vulkan-.dll, and to set up layer registry # entries to use layers from the corresponding SDK + SetOutPath "$IDir" + #ClearErrors Call un.ConfigLayersAndVulkanDLL ${If} $0 != 0 + SetOutPath "$IDir" Call un.DiagConfigLayersAndVulkanDLL SetErrors + IntOp $1 20000 + $0 + ${Else} + StrCpy $1 85 ${Endif} - IntOp $1 20000 + $0 Call un.CheckForError # If Ref Count is zero, uninstall everything @@ -613,7 +632,7 @@ Section "uninstall" Delete /REBOOTOK "$IDir\vulkaninfo32.exe" ${EndIf} - StrCpy $1 75 + StrCpy $1 90 Call un.CheckForError # Need to do a SetOutPath to something outside of install dir, @@ -641,7 +660,7 @@ Section "uninstall" ${Endif} - StrCpy $1 80 + StrCpy $1 95 Call un.CheckForError # Finish logging -- cgit v1.2.3 From a2f7158ec4016adbca53bed110654edfb3a4c945 Mon Sep 17 00:00:00 2001 From: Tony Barbour Date: Mon, 6 Jun 2016 10:55:04 -0600 Subject: layers: Initialize write_in_use in eventMap entries Change-Id: Ic296788beb078f19a35b93b99df5dbf677c95122 --- layers/core_validation.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index b602b7cd..809023af 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -9662,6 +9662,7 @@ CreateEvent(VkDevice device, const VkEventCreateInfo *pCreateInfo, const VkAlloc std::lock_guard lock(global_lock); dev_data->eventMap[*pEvent].needsSignaled = false; dev_data->eventMap[*pEvent].in_use.store(0); + dev_data->eventMap[*pEvent].write_in_use = 0; dev_data->eventMap[*pEvent].stageMask = VkPipelineStageFlags(0); } return result; -- cgit v1.2.3 From f99171e3401949aa86e0c0cca31fca3c9b229b5d Mon Sep 17 00:00:00 2001 From: Jan-Harald Fredriksen Date: Wed, 8 Jun 2016 14:20:50 +0200 Subject: layers: PR629, Remove subpass warnings The validation layer checks for dependency between subpasses using the same attachments, but it also issues warnings if there are "only" implicit dependencies between two subpasses. This is explicitly allowed by the spec and should not cause validation warnings. Change-Id: I1039955d6d445e1ee234116c6da2e4dbaf9c7dd9 --- layers/core_validation.cpp | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 809023af..949276b6 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -8199,15 +8199,10 @@ static bool CheckDependencyExists(const layer_data *my_data, const int subpass, auto prev_elem = std::find(node.prev.begin(), node.prev.end(), dependent_subpasses[k]); auto next_elem = std::find(node.next.begin(), node.next.end(), dependent_subpasses[k]); if (prev_elem == node.prev.end() && next_elem == node.next.end()) { - // If no dependency exits an implicit dependency still might. If so, warn and if not throw an error. + // If no dependency exits an implicit dependency still might. If not, throw an error. std::unordered_set processed_nodes; - if (FindDependency(subpass, dependent_subpasses[k], subpass_to_node, processed_nodes) || - FindDependency(dependent_subpasses[k], subpass, subpass_to_node, processed_nodes)) { - skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, - __LINE__, DRAWSTATE_INVALID_RENDERPASS, "DS", - "A dependency between subpasses %d and %d must exist but only an implicit one is specified.", - subpass, dependent_subpasses[k]); - } else { + if (!(FindDependency(subpass, dependent_subpasses[k], subpass_to_node, processed_nodes) || + FindDependency(dependent_subpasses[k], subpass, subpass_to_node, processed_nodes))) { skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, DRAWSTATE_INVALID_RENDERPASS, "DS", "A dependency between subpasses %d and %d must exist but one is not specified.", subpass, -- cgit v1.2.3 From e73177d8c7f25ef291b9a5ece81de4e111a03af1 Mon Sep 17 00:00:00 2001 From: Jan-Harald Fredriksen Date: Wed, 8 Jun 2016 18:51:52 +0200 Subject: layers: PR632, Change devlimits errors to warnings Replace call sequence errors with warnings for vkEnumeratePhysicalDevices and GetPhysicalDeviceQueueFamilyProperties. Change-Id: I1505f4a2b339ac7ef435da8b3ec2f85612026a42 --- layers/device_limits.cpp | 17 +++++++++-------- layers/device_limits.h | 1 + 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/layers/device_limits.cpp b/layers/device_limits.cpp index 374911b4..36d3d569 100644 --- a/layers/device_limits.cpp +++ b/layers/device_limits.cpp @@ -166,15 +166,16 @@ EnumeratePhysicalDevices(VkInstance instance, uint32_t *pPhysicalDeviceCount, Vk my_data->instanceState->vkEnumeratePhysicalDevicesState = QUERY_COUNT; } else { if (UNCALLED == my_data->instanceState->vkEnumeratePhysicalDevicesState) { - // Flag error here, shouldn't be calling this without having queried count + // Flag warning here. You can call this without having queried the count, but it may not be + // robust on platforms with multiple physical devices. skipCall |= - log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, 0, - __LINE__, DEVLIMITS_MUST_QUERY_COUNT, "DL", - "Invalid call sequence to vkEnumeratePhysicalDevices() w/ non-NULL pPhysicalDevices. You should first " + log_msg(my_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, 0, + __LINE__, DEVLIMITS_MISSING_QUERY_COUNT, "DL", + "Call sequence has vkEnumeratePhysicalDevices() w/ non-NULL pPhysicalDevices. You should first " "call vkEnumeratePhysicalDevices() w/ NULL pPhysicalDevices to query pPhysicalDeviceCount."); } // TODO : Could also flag a warning if re-calling this function in QUERY_DETAILS state else if (my_data->instanceState->physicalDevicesCount != *pPhysicalDeviceCount) { - // TODO: Having actual count match count from app is not a requirement, so this can be a warning + // Having actual count match count from app is not a requirement, so this can be a warning skipCall |= log_msg(my_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVLIMITS_COUNT_MISMATCH, "DL", "Call to vkEnumeratePhysicalDevices() w/ pPhysicalDeviceCount value %u, but actual count " @@ -247,9 +248,9 @@ GetPhysicalDeviceQueueFamilyProperties(VkPhysicalDevice physicalDevice, uint32_t // Verify that for each physical device, this function is called first with NULL pQueueFamilyProperties ptr in order to // get count if (UNCALLED == phy_dev_data->physicalDeviceState->vkGetPhysicalDeviceQueueFamilyPropertiesState) { - skipCall |= log_msg(phy_dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, - VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVLIMITS_MUST_QUERY_COUNT, "DL", - "Invalid call sequence to vkGetPhysicalDeviceQueueFamilyProperties() w/ non-NULL " + skipCall |= log_msg(phy_dev_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, 0, __LINE__, DEVLIMITS_MISSING_QUERY_COUNT, "DL", + "Call sequence has vkGetPhysicalDeviceQueueFamilyProperties() w/ non-NULL " "pQueueFamilyProperties. You should first call vkGetPhysicalDeviceQueueFamilyProperties() w/ " "NULL pQueueFamilyProperties to query pCount."); } diff --git a/layers/device_limits.h b/layers/device_limits.h index bec9dce1..5aa54483 100644 --- a/layers/device_limits.h +++ b/layers/device_limits.h @@ -30,6 +30,7 @@ enum DEV_LIMITS_ERROR { DEVLIMITS_INVALID_PHYSICAL_DEVICE, // Invalid physical device used DEVLIMITS_INVALID_INHERITED_QUERY, // Invalid use of inherited query DEVLIMITS_INVALID_ATTACHMENT_COUNT, // Invalid value for the number of attachments + DEVLIMITS_MISSING_QUERY_COUNT, // Did not make initial call to an API to query the count DEVLIMITS_MUST_QUERY_COUNT, // Failed to make initial call to an API to query the count DEVLIMITS_INVALID_CALL_SEQUENCE, // Flag generic case of an invalid call sequence by the app DEVLIMITS_INVALID_FEATURE_REQUESTED, // App requested a feature not supported by physical device -- cgit v1.2.3 From 0e0519f6728d311fef99e3f2e44b6030fd79430b Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Thu, 9 Jun 2016 10:59:03 -0600 Subject: layers: PR632, Updated layer details doc Added device_limits MISSING_QUERY_COUNT Change-Id: I5b129ec12930129f5d5fe46bbe2622977dc2d992 --- layers/vk_validation_layer_details.md | 1 + 1 file changed, 1 insertion(+) diff --git a/layers/vk_validation_layer_details.md b/layers/vk_validation_layer_details.md index f5309ecd..7d0ab393 100644 --- a/layers/vk_validation_layer_details.md +++ b/layers/vk_validation_layer_details.md @@ -300,6 +300,7 @@ For the second category of errors, VK_LAYER_LUNARG_device_limits stores its own | Valid physical device | Enum used for informational messages | INVALID_PHYSICAL_DEVICE | vkEnumeratePhysicalDevices | TODO | VK_LAYER_LUNARG_object_tracker should also catch this so if we made sure VK_LAYER_LUNARG_object_tracker was always on top, we could avoid this check | | Valid inherited query | If an invalid inherited query is used, this error will be flagged | INVALID_INHERITED_QUERY | vkBeginCommandBuffer | TODO | None | | Valid attachment count | If the number of attachments exceeds the device max, this error will be flagged | INVALID_ATTACHMENT_COUNT | vkCreateRenderPass | TODO | None | +| Query count checked | Signifies that a query call such as vkEnumeratePhysicalDevices or vkGetPhysicalDeviceQueueFamilyProperties has been called without querying the count | MISSING_QUERY_COUNT | vkEnumeratePhysicalDevices vkGetPhysicalDeviceQueueFamilyProperties | TODO | None | | Querying array counts | For API calls where an array count should be queried with an initial call and a NULL array pointer, verify that such a call was made before making a call with non-null array pointer. | MUST_QUERY_COUNT | vkEnumeratePhysicalDevices vkGetPhysicalDeviceQueueFamilyProperties | TODO | Create focused test | | Array count value | For API calls where an array of details is queried, verify that the size of the requested array matches the size of the array supported by the device. | COUNT_MISMATCH | vkEnumeratePhysicalDevices vkGetPhysicalDeviceQueueFamilyProperties | TODO | Create focused test | | Queue Creation | When creating/requesting queues, make sure that QueueFamilyPropertiesIndex and index/count within that queue family are valid. | INVALID_QUEUE_CREATE_REQUEST | vkGetDeviceQueue vkCreateDevice | TODO | Create focused test | -- cgit v1.2.3 From 30b50c842453f877dc62b70c0d7ecd5a909db796 Mon Sep 17 00:00:00 2001 From: David McFarland Date: Fri, 20 May 2016 18:26:28 -0300 Subject: layers: PR573, Handle imageArraySize rename Swapchain layer had stale references -- rename things still using imageArraySize instead of imageArrayLayers. Change-Id: Iaa4500ab8cf55e50b96636a50136605dd3e6d83e --- layers/swapchain.cpp | 10 +++++----- layers/swapchain.h | 2 +- layers/vk_validation_layer_details.md | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/layers/swapchain.cpp b/layers/swapchain.cpp index 96691f14..440c6d03 100644 --- a/layers/swapchain.cpp +++ b/layers/swapchain.cpp @@ -1519,13 +1519,13 @@ static bool validateCreateSwapchainKHR(VkDevice device, const VkSwapchainCreateI reinterpret_cast(device), __LINE__, SWAPCHAIN_CREATE_SWAP_BAD_COMPOSITE_ALPHA, LAYER_NAME, "%s", errorString.c_str()); } - // Validate pCreateInfo->imageArraySize against - // VkSurfaceCapabilitiesKHR::maxImageArraySize: + // Validate pCreateInfo->imageArrayLayers against + // VkSurfaceCapabilitiesKHR::maxImageArrayLayers: if ((pCreateInfo->imageArrayLayers < 1) || (pCreateInfo->imageArrayLayers > pCapabilities->maxImageArrayLayers)) { skipCall |= LOG_ERROR(VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, device, "VkDevice", - SWAPCHAIN_CREATE_SWAP_BAD_IMG_ARRAY_SIZE, "%s() called with a non-supported " - "pCreateInfo->imageArraySize (i.e. %d). " - "Minimum value is 1, maximum value is %d.", + SWAPCHAIN_CREATE_SWAP_BAD_IMG_ARRAY_LAYERS, "%s() called with a non-supported " + "pCreateInfo->imageArrayLayers (i.e. %d). " + "Minimum value is 1, maximum value is %d.", fn, pCreateInfo->imageArrayLayers, pCapabilities->maxImageArrayLayers); } // Validate pCreateInfo->imageUsage against diff --git a/layers/swapchain.h b/layers/swapchain.h index a8b2d8bf..ec1e39b3 100644 --- a/layers/swapchain.h +++ b/layers/swapchain.h @@ -45,7 +45,7 @@ enum SWAPCHAIN_ERROR { SWAPCHAIN_CREATE_SWAP_EXTENTS_NO_MATCH_WIN, // Called vkCreateSwapchainKHR() with imageExtent that doesn't match window's extent SWAPCHAIN_CREATE_SWAP_BAD_PRE_TRANSFORM, // Called vkCreateSwapchainKHR() with a non-supported preTransform SWAPCHAIN_CREATE_SWAP_BAD_COMPOSITE_ALPHA, // Called vkCreateSwapchainKHR() with a non-supported compositeAlpha - SWAPCHAIN_CREATE_SWAP_BAD_IMG_ARRAY_SIZE, // Called vkCreateSwapchainKHR() with a non-supported imageArraySize + SWAPCHAIN_CREATE_SWAP_BAD_IMG_ARRAY_LAYERS, // Called vkCreateSwapchainKHR() with a non-supported imageArrayLayers SWAPCHAIN_CREATE_SWAP_BAD_IMG_USAGE_FLAGS, // Called vkCreateSwapchainKHR() with a non-supported imageUsageFlags SWAPCHAIN_CREATE_SWAP_BAD_IMG_COLOR_SPACE, // Called vkCreateSwapchainKHR() with a non-supported imageColorSpace SWAPCHAIN_CREATE_SWAP_BAD_IMG_FORMAT, // Called vkCreateSwapchainKHR() with a non-supported imageFormat diff --git a/layers/vk_validation_layer_details.md b/layers/vk_validation_layer_details.md index 7d0ab393..1d7b48ae 100644 --- a/layers/vk_validation_layer_details.md +++ b/layers/vk_validation_layer_details.md @@ -337,7 +337,7 @@ This layer is a work in progress. VK_LAYER_LUNARG_swapchain layer is intended to | vkCreateSwapchainKHR(pCreateInfo->imageExtent) | Validates vkCreateSwapchainKHR(pCreateInfo->imageExtent) when window has a fixed size | CREATE_SWAP_EXTENTS_NO_MATCH_WIN | vkCreateSwapchainKHR | TODO | None | | vkCreateSwapchainKHR(pCreateInfo->preTransform) | Validates vkCreateSwapchainKHR(pCreateInfo->preTransform) | CREATE_SWAP_BAD_PRE_TRANSFORM | vkCreateSwapchainKHR | TODO | None | | vkCreateSwapchainKHR(pCreateInfo->compositeAlpha) | Validates vkCreateSwapchainKHR(pCreateInfo->compositeAlpha) | CREATE_SWAP_BAD_COMPOSITE_ALPHA | vkCreateSwapchainKHR | TODO | None | -| vkCreateSwapchainKHR(pCreateInfo->imageArraySize) | Validates vkCreateSwapchainKHR(pCreateInfo->imageArraySize) | CREATE_SWAP_BAD_IMG_ARRAY_SIZE | vkCreateSwapchainKHR | TODO | None | +| vkCreateSwapchainKHR(pCreateInfo->imageArrayLayers) | Validates vkCreateSwapchainKHR(pCreateInfo->imageArrayLayers) | CREATE_SWAP_BAD_IMG_ARRAY_LAYERS | vkCreateSwapchainKHR | TODO | None | | vkCreateSwapchainKHR(pCreateInfo->imageUsageFlags) | Validates vkCreateSwapchainKHR(pCreateInfo->imageUsageFlags) | CREATE_SWAP_BAD_IMG_USAGE_FLAGS | vkCreateSwapchainKHR | TODO | None | | vkCreateSwapchainKHR(pCreateInfo->imageColorSpace) | Validates vkCreateSwapchainKHR(pCreateInfo->imageColorSpace) | CREATE_SWAP_BAD_IMG_COLOR_SPACE | vkCreateSwapchainKHR | TODO | None | | vkCreateSwapchainKHR(pCreateInfo->imageFormat) | Validates vkCreateSwapchainKHR(pCreateInfo->imageFormat) | CREATE_SWAP_BAD_IMG_FORMAT | vkCreateSwapchainKHR | TODO | None | -- cgit v1.2.3 From 07bf950a43957c4077983490f362bde494ff85e2 Mon Sep 17 00:00:00 2001 From: David Pinedo Date: Thu, 9 Jun 2016 13:40:21 -0600 Subject: winrtinstaller: fixed problems introduced by piping script to powershell.exe PS script return value is now correctly retrieved by NSIS script. Logging is less verbose, removed extranous errors. --- .../ConfigLayersAndVulkanDLL.ps1 | 231 +++++++++++---------- windowsRuntimeInstaller/InstallerRT.nsi | 23 +- 2 files changed, 134 insertions(+), 120 deletions(-) diff --git a/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 b/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 index e6cae4d5..0936853c 100644 --- a/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 +++ b/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 @@ -34,31 +34,21 @@ # $ossize : an integer indicating if the target is a 64 (64) or 32 (32) bit OS. # -#Note that these two vars need to be prepended to this script. -#InstallerRT.nsi does this before calling this script. -#$majorabi= -#$ossize= - -# Clear any pre-existing errors and set default return value -$Error.Clear(); -$script:scriptReturnValue=0 - -# Start logging -$logascii=$Env:Temp+"\ConfigLayersAndVulkanDLL.log" -$log=$Env:Temp+"\ConfigLayersAndVulkanDLL16.log" -start-transcript -path $log - -# Ignore errors related to log file -$Error.Clear(); - -Write-Host "ConfigLayersAndVulkanDLL.ps1 called with inputs of : $majorabi $ossize" -$startTime=Get-Date -Write-Host "Start time : $startTime" +# majorabi and ossize are either prepended to this script or specificied as args +Param( + [string]$majorabiarg, + [int]$ossizearg +) +if ($majorabi -eq $null) { + $majorabi=$majorabiarg +} +if ($ossize -eq $null) { + $ossize=$ossizearg +} -$vulkandll = "vulkan-"+$majorabi+".dll" -$windrive = $env:SYSTEMDRIVE -$winfolder = $env:SYSTEMROOT -$script:VulkanDllList=@() +function WriteToLog ($x) { + echo $x | Out-File -encoding ascii -append -filepath $script:log +} function notNumeric ($x) { try { @@ -69,16 +59,34 @@ function notNumeric ($x) { } } -function Get-CurrentLineNumber { - $MyInvocation.ScriptLineNumber -} - function setScriptReturnValue($rvalue) { if ($script:scriptReturnValue -eq 0) { $script:scriptReturnValue = $rvalue } } +# Clear any pre-existing errors and set default return value +$Error.Clear(); +$script:scriptReturnValue=0 + +# Start logging +$script:log=$Env:Temp+"\ConfigLayersAndVulkanDLL.log" +Remove-Item $script:log + +# Ignore errors related to log file +$Error.Clear(); + +WriteToLog "ConfigLayersAndVulkanDLL.ps1 called with inputs of : $majorabi $ossize" +$startTime=Get-Date +WriteToLog "Start time : $startTime" +WriteToLog "Poweshell Version information:" +WriteToLog $PsVersionTable + +$vulkandll = "vulkan-"+$majorabi+".dll" +$windrive = $env:SYSTEMDRIVE +$winfolder = $env:SYSTEMROOT +$script:VulkanDllList=@() + # The name of the versioned vulkan dll file is one of the following: # # vulkan------- @@ -114,7 +122,7 @@ function setScriptReturnValue($rvalue) { function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) { - Write-Host "UpdateVulkanSysFolder $dir $writeSdkName" + WriteToLog "UpdateVulkanSysFolder $dir $writeSdkName" # Push the current path on the stack and go to $dir Push-Location -Path $dir @@ -126,7 +134,7 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) # Find all vulkan dll files in this directory dir -name vulkan-$majorabi-*.dll | ForEach-Object { - Write-Host "File $_" + WriteToLog "File $_" if ($_ -match "=" -or $_ -match "@" -or $_ -match " " -or @@ -137,7 +145,7 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) # If a file name contains "=", "@", or " ", or it contains less then 5 dashes or more than # 7 dashes, it wasn't installed by the Vulkan Run Time. # Note that we need to use return inside of ForEach-Object is to continue with iteration. - Write-Warning "Ignoring $_ - bad format" + WriteToLog "Ignoring $_ - bad format" # Not a real error, so just clear it for now. $Error.Clear(); @@ -151,7 +159,7 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) $vulkaninfo=$vulkaninfo -replace "vulkan","vulkaninfo" if (-not (Test-Path $vulkaninfo) -or !$?) { - Write-Warning "Rejected $_ - $vulkaninfo not present" + WriteToLog "Rejected $_ - $vulkaninfo not present" # Not a real error, so just clear it for now. $Error.Clear(); @@ -201,9 +209,9 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) $prebuildno="z"*10 } } - Write-Host "Version $majorOrig $minorOrig $patchOrig $buildnoOrig $prereleaseOrig $prebuildnoOrig" + WriteToLog "Version $majorOrig $minorOrig $patchOrig $buildnoOrig $prereleaseOrig $prebuildnoOrig" if (!$?) { - Write-Warning "Ignoring version $majorOrig $minorOrig $patchOrig $buildnoOrig $prereleaseOrig $prebuildnoOrig" + WriteToLog "Ignoring version $majorOrig $minorOrig $patchOrig $buildnoOrig $prereleaseOrig $prebuildnoOrig" # Not a real error, so just clear it for now. $Error.Clear(); @@ -214,7 +222,7 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) # Make sure fields that are supposed to be numbers are numbers if (notNumeric($major)) { - Write-Warning "Ignoring $_ - bad major" + WriteToLog "Ignoring $_ - bad major" # Not a real error, so just clear it for now. $Error.Clear(); @@ -223,7 +231,7 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) return } if (notNumeric($minor)) { - Write-Warning "Ignoring $_ - bad minor" + WriteToLog "Ignoring $_ - bad minor" # Not a real error, so just clear it for now. $Error.Clear(); @@ -232,7 +240,7 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) return } if (notNumeric($patch)) { - Write-Warning "Ignoring $_ - bad patch" + WriteToLog "Ignoring $_ - bad patch" # Not a real error, so just clear it for now. $Error.Clear(); @@ -241,7 +249,7 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) return } if (notNumeric($buildno)) { - Write-Warning "Ignoring $_ - bad buildno" + WriteToLog "Ignoring $_ - bad buildno" # Not a real error, so just clear it for now. $Error.Clear(); @@ -251,7 +259,7 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) } if (notNumeric($prebuildno)) { if ($prebuildno -ne "z"*10) { - Write-Warning "Ignoring $_ - bad prebuildno" + WriteToLog "Ignoring $_ - bad prebuildno" # Not a real error, so just clear it for now. $Error.Clear(); @@ -269,11 +277,11 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) $prebuildno = $prebuildno.padleft(10,'0') # Add a new element to the $VulkanDllList array - Write-Host "Adding $_ to Vulkan dll list " + WriteToLog "Adding $_ to Vulkan dll list " $script:VulkanDllList+="$major=$minor=$patch=$buildno=$prebuildno=$prerelease= $_ @$majorOrig@$minorOrig@$patchOrig@$buildnoOrig@$prereleaseOrig@$prebuildnoOrig@" if (!$?) { - Write-Error "Error: UpdateVulkanSysFolder adding DLL $_ to list" - setScriptReturnValue(Get-CurrentLineNumber) + WriteToLog "Error: UpdateVulkanSysFolder adding DLL $_ to list" + setScriptReturnValue(10) } } @@ -285,30 +293,30 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) # Sort the list. The most recent vulkan-*.dll will be in the last element of the list. [array]::sort($script:VulkanDllList) if (!$?) { - Write-Error "Error: UpdateVulkanSysFolder sorting DLL list" - setScriptReturnValue(Get-CurrentLineNumber) + WriteToLog "Error: UpdateVulkanSysFolder sorting DLL list" + setScriptReturnValue(20) } # Put the name of the most recent vulkan-*.dll in $mrVulkanDLL. # The most recent vulkanDLL is the second word in the last element of the # sorted $VulkanDllList. Copy it to $vulkandll. $mrVulkanDll=$script:VulkanDllList[-1].Split(' ')[1] - Write-Host "Copying $mrVulkanDll $vulkandll" + WriteToLog "Copying $mrVulkanDll $vulkandll" Copy-Item $mrVulkanDll $vulkandll -force if (!$?) { - Write-Error "Error: UpdateVulkanSysFolder encountered error during copy $mrVulkanDll $vulkandll" - setScriptReturnValue(Get-CurrentLineNumber) + WriteToLog "Error: UpdateVulkanSysFolder encountered error during copy $mrVulkanDll $vulkandll" + setScriptReturnValue(30) } # Copy the most recent version of vulkaninfo--*.exe to vulkaninfo.exe. # We create the source file name for the copy from $mrVulkanDll. $mrVulkaninfo=$mrVulkanDll -replace ".dll",".exe" $mrVulkaninfo=$mrVulkaninfo -replace "vulkan","vulkaninfo" - Write-Host "Copying $mrVulkaninfo vulkaninfo.exe" + WriteToLog "Copying $mrVulkaninfo vulkaninfo.exe" Copy-Item $mrVulkaninfo vulkaninfo.exe -force if (!$?) { - Write-Error "Error: UpdateVulkanSysFolder encountered error during copy $mrVulkaninfo vulkaninfo.exe" - setScriptReturnValue(Get-CurrentLineNumber) + WriteToLog "Error: UpdateVulkanSysFolder encountered error during copy $mrVulkaninfo vulkaninfo.exe" + setScriptReturnValue(40) } # Create the name used in the registry for the SDK associated with $mrVulkanDll. @@ -327,18 +335,18 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) $sdktempname=$sdktempname + "." + $prebuildno } - Write-Host "sdkname = $sdktempname" + WriteToLog "sdkname = $sdktempname" if (!$?) { - Write-Error "Error: UpdateVulkanSysFolder encountered error generating SDK name" - setScriptReturnValue(Get-CurrentLineNumber) + WriteToLog "Error: UpdateVulkanSysFolder encountered error generating SDK name" + setScriptReturnValue(50) } } # Return to our previous folder Pop-Location if (!$?) { - Write-Error "Error: UpdateVulkanSysFolder popping location" - setScriptReturnValue(Get-CurrentLineNumber) + WriteToLog "Error: UpdateVulkanSysFolder popping location" + setScriptReturnValue(60) } # Only update the overall script-scope SDK name if we're told to @@ -352,25 +360,25 @@ function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName) # We only care about SYSWOW64 if we're targeting a 64-bit OS if ($ossize -eq 64) { # Update the SYSWOW64 Vulkan DLLS/EXEs - Write-Host "Calling UpdateVulkanSysFolder $winfolder\SYSWOW64 0" + WriteToLog "Calling UpdateVulkanSysFolder $winfolder\SYSWOW64 0" UpdateVulkanSysFolder $winfolder\SYSWOW64 0 if (!$?) { - Write-Error "Error: Calling UpdateVulkanSysFolder for 64-bit OS" - setScriptReturnValue(Get-CurrentLineNumber) + WriteToLog "Error: Calling UpdateVulkanSysFolder for 64-bit OS" + setScriptReturnValue(70) } } # Update the SYSTEM32 Vulkan DLLS/EXEs -Write-Host "Calling UpdateVulkanSysFolder $winfolder\SYSTEM32 1" +WriteToLog "Calling UpdateVulkanSysFolder $winfolder\SYSTEM32 1" UpdateVulkanSysFolder $winfolder\SYSTEM32 1 if (!$?) { - Write-Error "Error: Calling UpdateVulkanSysFolder for all OS" - setScriptReturnValue(Get-CurrentLineNumber) + WriteToLog "Error: Calling UpdateVulkanSysFolder for all OS" + setScriptReturnValue(80) } # Create an array of vulkan sdk install dirs -Write-Host "Creating array of of Vulkan SDK Install dirs" +WriteToLog "Creating array of of Vulkan SDK Install dirs" $mrVulkanDllInstallDir="" $VulkanSdkDirs=@() $installSDKRegs = @(Get-ChildItem -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall) @@ -382,17 +390,17 @@ if ($installSDKRegs -ne $null) { # Get the install path from UninstallString $tmp=Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regkey -Name UninstallString if (!$? -or $tmp -eq $null) { - Write-Warning "Error: Get-ItemProperty failed for Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regkey" + WriteToLog "Error: Get-ItemProperty failed for Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regkey" $Error.Clear(); continue; } $tmp=$tmp -replace "\\Uninstall.exe.*","" $tmp=$tmp -replace ".*=.","" - Write-Host "Adding $tmp to VulkanSDKDirs" + WriteToLog "Adding $tmp to VulkanSDKDirs" $VulkanSdkDirs+=$tmp if ($regkey -eq $script:sdkname) { # Save away the sdk install dir for the the most recent vulkandll - Write-Host "Setting mrVulkanDllInstallDir to $tmp" + WriteToLog "Setting mrVulkanDllInstallDir to $tmp" $mrVulkanDllInstallDir=$tmp } } @@ -400,8 +408,8 @@ if ($installSDKRegs -ne $null) { } } if (!$?) { - Write-Error "Error: Failed creating array of of Vulkan SDK Install dirs" - setScriptReturnValue(Get-CurrentLineNumber) + WriteToLog "Error: Failed creating array of of Vulkan SDK Install dirs" + setScriptReturnValue(90) } @@ -409,7 +417,7 @@ if (!$?) { # We go backwards through VulkanDllList to generate SDK names, because we want the most recent SDK. if ($mrVulkanDllInstallDir -eq "" -and $script:VulkanDllList.Length -gt 0) { - Write-Host "Searching VulkanDllList" + WriteToLog "Searching VulkanDllList" ForEach ($idx in ($script:VulkanDllList.Length-1)..0) { $tmp=$script:VulkanDllList[$idx] $vulkanDllMajor=$script:VulkanDllList[$idx].Split('@')[1] @@ -425,10 +433,10 @@ if ($mrVulkanDllInstallDir -eq "" -and $script:VulkanDllList.Length -gt 0) { if ($vulkanDllPrebuildno) { $regEntry=$regEntry+"."+$vulkanDllPrebuildno } - Write-Host "Comparing $regEntry" + WriteToLog "Comparing $regEntry" $rval=Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regEntry -ErrorAction SilentlyContinue if (!$? -or $rval -eq $null) { - Write-Warning "Ignoring $regEntry - corresponding SDK registry entry does not exist" + WriteToLog "Ignoring $regEntry - corresponding SDK registry entry does not exist" $Error.Clear(); continue } @@ -442,14 +450,14 @@ if ($mrVulkanDllInstallDir -eq "" -and $script:VulkanDllList.Length -gt 0) { $reMinor=$rval.Split('.')[1] $rePatch=$rval.Split('.')[2] if ($reMajor+$reMinor+$rePatch -eq $vulkanDllMajor+$vulkanDllMinor+$vulkanDllPatch) { - Write-Host "Setting mrVulkanDllInstallDir to $instDir" + WriteToLog "Setting mrVulkanDllInstallDir to $instDir" $mrVulkanDllInstallDir=$instDir break } } } if (!$?) { - Write-Warning "Failed searching VulkanDLLList" + WriteToLog "Failed searching VulkanDLLList" $Error.Clear(); } } @@ -469,7 +477,7 @@ $VulkanSdkDirs+="$windrive\VulkanSDK\0.9.3" # Note that we remove only those entries created by Vulkan SDKs. If other # layers were installed that are not from an SDK, we don't mess with them. -Write-Host "Removing old layer registry values from HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" +WriteToLog "Removing old layer registry values from HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" $regkeys = @(Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\Vulkan\ExplicitLayers | Select-Object -ExpandProperty Property) if ($regkeys -ne $null) { ForEach ($regval in $regkeys) { @@ -478,9 +486,9 @@ if ($regkeys -ne $null) { if ($regval -like "$sdkdir\*.json") { Remove-ItemProperty -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -name $regval if (!$?) { - Write-Error "Error: Remove-ItemProperty failed for -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -name $regval" + WriteToLog "Error: Remove-ItemProperty failed for -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -name $regval" } else { - Write-Host "Removed registry value $regval" + WriteToLog "Removed registry value $regval" } } } @@ -489,8 +497,8 @@ if ($regkeys -ne $null) { } if (!$?) { - Write-Error "Error: Failed Removing old layer registry values from HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" - setScriptReturnValue(Get-CurrentLineNumber) + WriteToLog "Error: Failed Removing old layer registry values from HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" + setScriptReturnValue(100) } # Remove 32-bit layer registry value if we're targeting a 64-bit OS @@ -503,9 +511,9 @@ if ($ossize -eq 64) { if ($regval -like "$sdkdir\*.json") { Remove-ItemProperty -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -name $regval if (!$?) { - Write-Error "Error: Remove-ItemProperty failed for -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -name $regval" + WriteToLog "Error: Remove-ItemProperty failed for -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -name $regval" } else { - Write-Host "Removed WOW6432Node registry value $regval" + WriteToLog "Removed WOW6432Node registry value $regval" } } } @@ -514,33 +522,33 @@ if ($ossize -eq 64) { } if (!$?) { - Write-Error "Error: Failed Removing old layer registry values from HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers" - setScriptReturnValue(Get-CurrentLineNumber) + WriteToLog "Error: Failed Removing old layer registry values from HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers" + setScriptReturnValue(110) } } # Create layer registry values associated with Vulkan SDK from which $mrVulkanDll is from -Write-Host "Creating new layer registry values" +WriteToLog "Creating new layer registry values" if ($mrVulkanDllInstallDir -ne "") { # Create registry keys if they don't exist if (-not (Test-Path -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers)) { - Write-Host "Creating new registry key HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" + WriteToLog "Creating new registry key HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" New-Item -Force -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers | out-null if (!$?) { - Write-Error "Error: Failed creating HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" - setScriptReturnValue(Get-CurrentLineNumber) + WriteToLog "Error: Failed creating HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" + setScriptReturnValue(120) } } if ($ossize -eq 64) { if (-not (Test-Path -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers)) { - Write-Host "Creating new registry key HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers" + WriteToLog "Creating new registry key HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers" New-Item -Force -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers | out-null if (!$?) { - Write-Error "Error: Failed creating HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers" - setScriptReturnValue(Get-CurrentLineNumber) + WriteToLog "Error: Failed creating HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers" + setScriptReturnValue(130) } } } @@ -550,64 +558,61 @@ if ($mrVulkanDllInstallDir -ne "") { # Create registry values in normal registry location for 64-bit items on a 64-bit OS Get-ChildItem $mrVulkanDllInstallDir\Bin -Filter VkLayer*json | ForEach-Object { - Write-Host "Creating registry value $mrVulkanDllInstallDir\Bin\$_" + WriteToLog "Creating registry value $mrVulkanDllInstallDir\Bin\$_" New-ItemProperty -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin\$_ -PropertyType DWord -Value 0 | out-null if (!$?) { - Write-Error "Error: Failed creating $mrVulkanDllInstallDir\Bin\$_" - setScriptReturnValue(Get-CurrentLineNumber) + WriteToLog "Error: Failed creating $mrVulkanDllInstallDir\Bin\$_" + setScriptReturnValue(140) } } if (!$?) { - Write-Error "Error: Failed Get-ChildItem $mrVulkanDllInstallDir\Bin | ForEach-Object " - setScriptReturnValue(Get-CurrentLineNumber) + WriteToLog "Error: Failed Get-ChildItem $mrVulkanDllInstallDir\Bin | ForEach-Object " + setScriptReturnValue(150) } # Create registry values for the WOW6432Node registry location for 32-bit items on a 64-bit OS Get-ChildItem $mrVulkanDllInstallDir\Bin32 -Filter VkLayer*json | ForEach-Object { - Write-Host "Creating WOW6432Node registry value $mrVulkanDllInstallDir\Bin32\$_" + WriteToLog "Creating WOW6432Node registry value $mrVulkanDllInstallDir\Bin32\$_" New-ItemProperty -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin32\$_ -PropertyType DWord -Value 0 | out-null if (!$?) { - Write-Error "Error: Failed creating $mrVulkanDllInstallDir\Bin32\$_" - setScriptReturnValue(Get-CurrentLineNumber) + WriteToLog "Error: Failed creating $mrVulkanDllInstallDir\Bin32\$_" + setScriptReturnValue(160) } } if (!$?) { - Write-Error "Error: Failed Get-ChildItem $mrVulkanDllInstallDir\Bin32 | ForEach-Object " - setScriptReturnValue(Get-CurrentLineNumber) + WriteToLog "Error: Failed Get-ChildItem $mrVulkanDllInstallDir\Bin32 | ForEach-Object " + setScriptReturnValue(170) } } else { # Create registry values in normal registry location for 32-bit items on a 32-bit OS Get-ChildItem $mrVulkanDllInstallDir\Bin32 -Filter VkLayer*json | ForEach-Object { - Write-Host "Creating registry value $mrVulkanDllInstallDir\Bin\$_" + WriteToLog "Creating registry value $mrVulkanDllInstallDir\Bin\$_" New-ItemProperty -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin32\$_ -PropertyType DWord -Value 0 | out-null if (!$?) { - Write-Error "Error: Failed creating $mrVulkanDllInstallDir\Bin\$_" - setScriptReturnValue(Get-CurrentLineNumber) + WriteToLog "Error: Failed creating $mrVulkanDllInstallDir\Bin\$_" + setScriptReturnValue(180) } } if (!$?) { - Write-Error "Error: Failed Get-ChildItem $mrVulkanDllInstallDir\Bin32 | ForEach-Object " - setScriptReturnValue(Get-CurrentLineNumber) + WriteToLog "Error: Failed Get-ChildItem $mrVulkanDllInstallDir\Bin32 | ForEach-Object " + setScriptReturnValue(190) } } } # Debug - for testing handling of script failure in installer -#setScriptReturnValue(Get-CurrentLineNumber) +#setScriptReturnValue(200) # Final log output -Write-Host "ConfigLayersAndVulkanDLL.ps1 completed" +WriteToLog "ConfigLayersAndVulkanDLL.ps1 completed, return status is $script:scriptReturnValue" $endTime=Get-Date -Write-Host "End time: $endTime" - -Stop-Transcript - -# Convert logfile to ascii -Get-Content $log | Out-File -encoding ascii -filepath $logascii +WriteToLog "End time: $endTime" -# Remove the unicode log as we no longer need it. -Remove-Item $log +# Since InstallerRT.nsi runs this script by piping it to powershell.exe, the exit status +# doesn't seem to be available. So we put in it a file where InstallRT.nsi can retrieve it. +$statusfile=$Env:Temp+"\ConfigLayersAndVulkanDLL.stat" +echo $script:scriptReturnValue | Out-File -encoding ascii -filepath $statusfile exit $script:scriptReturnValue diff --git a/windowsRuntimeInstaller/InstallerRT.nsi b/windowsRuntimeInstaller/InstallerRT.nsi index 00a74a8d..12865420 100644 --- a/windowsRuntimeInstaller/InstallerRT.nsi +++ b/windowsRuntimeInstaller/InstallerRT.nsi @@ -239,18 +239,27 @@ Function ${un}ConfigLayersAndVulkanDLL ${Else} Strcpy $1 32 ${Endif} - nsExec::ExecToStack 'cmd /k echo $$majorabi=${VERSION_ABI_MAJOR} >"$TEMP\VulkanRT.tmp"' - nsExec::ExecToStack 'cmd /k echo $$ossize=$1 >>"$TEMP\VulkanRT.tmp"' - nsExec::ExecToStack 'cmd /k type ConfigLayersAndVulkanDLL.ps1 >>"$TEMP\VulkanRT.tmp"' - nsExec::ExecToStack 'cmd /k type "$TEMP\VulkanRT.tmp" | powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -Command -' - pop $0 + nsExec::ExecToStack 'cmd /k echo $$majorabi=${VERSION_ABI_MAJOR} >"$TEMP\VulkanRT\VulkanRT.ps1"' + nsExec::ExecToStack 'cmd /k echo $$ossize=$1 >>"$TEMP\VulkanRT\VulkanRT.ps1"' + nsExec::ExecToStack 'cmd /k type ConfigLayersAndVulkanDLL.ps1 >>"$TEMP\VulkanRT\VulkanRT.ps1"' + nsExec::ExecToStack 'cmd /k type "$TEMP\VulkanRT\VulkanRT.ps1" | powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -Command -' Rename "$TEMP\ConfigLayersAndVulkanDLL.log" "$TEMP\VulkanRT\ConfigLayersAndVulkanDLL1.${un}log" - Delete "$TEMP\VulkanRT.tmp" + pop $0 ${If} $0 != 0 - nsExec::ExecToStack 'powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -ExecutionPolicy RemoteSigned -Command .\ConfigLayersAndVulkanDLL.ps1 ${VERSION_ABI_MAJOR} $1 ; exit $$LASTEXITCODE' + nsExec::ExecToStack 'cmd /k type "$TEMP\VulkanRT\VulkanRT.ps1" | "$WINDIR\System32\WindowsPowerShell\v1.0\powershell" -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -Command -' pop $0 Rename "$TEMP\ConfigLayersAndVulkanDLL.log" "$TEMP\VulkanRT\ConfigLayersAndVulkanDLL2.${un}log" ${Endif} + ${If} $0 = 0 + # Read the return value of the script and put it in $0, stripping trailing newline + FileOpen $1 "$TEMP\ConfigLayersAndVulkanDLL.stat" r + FileRead $1 $2 + FileClose $1 + ${StrRep} $3 $2 "$\n" "" + ${StrRep} $0 $3 "$\r" "" + ${Endif} + Delete "$TEMP\ConfigLayersAndVulkanDLL.stat" + Delete "$TEMP\VulkanRT\VulkanRT.ps1" FunctionEnd !macroend !insertmacro ConfigLayersAndVulkanDLL "" -- cgit v1.2.3 From 6e35ed30e90638c12b6172ded63911900bdf0272 Mon Sep 17 00:00:00 2001 From: David Pinedo Date: Thu, 9 Jun 2016 16:12:44 -0600 Subject: winrt: configure loader even if ps script fails --- .../ConfigLayersAndVulkanDLL.ps1 | 2 +- windowsRuntimeInstaller/InstallerRT.nsi | 60 ++++++++++++++++------ 2 files changed, 44 insertions(+), 18 deletions(-) diff --git a/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 b/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 index 0936853c..341df5f9 100644 --- a/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 +++ b/windowsRuntimeInstaller/ConfigLayersAndVulkanDLL.ps1 @@ -29,7 +29,7 @@ # - Set the layer registry entries to point to the layer json files # in the Vulkan SDK associated with the most recent vulkan*dll. # -# This script takes the following parameters: +# This script can be called with the following two parameters: # $majorabi : a single string number specifying the major abi version. # $ossize : an integer indicating if the target is a 64 (64) or 32 (32) bit OS. # diff --git a/windowsRuntimeInstaller/InstallerRT.nsi b/windowsRuntimeInstaller/InstallerRT.nsi index 12865420..5d8b3f10 100644 --- a/windowsRuntimeInstaller/InstallerRT.nsi +++ b/windowsRuntimeInstaller/InstallerRT.nsi @@ -230,36 +230,45 @@ VIAddVersionKey "LegalCopyright" "" # Function to run ConfigLayersAndVulkanDll ps script. -# We define it as a macro so we can create an install and uninstall version. # Return value is in $0 - 0 is success, all else is failure. !macro ConfigLayersAndVulkanDLL un Function ${un}ConfigLayersAndVulkanDLL + ${If} ${RunningX64} Strcpy $1 64 ${Else} Strcpy $1 32 ${Endif} + + # Create the script, the first two lines are the majorabi and ossize. nsExec::ExecToStack 'cmd /k echo $$majorabi=${VERSION_ABI_MAJOR} >"$TEMP\VulkanRT\VulkanRT.ps1"' nsExec::ExecToStack 'cmd /k echo $$ossize=$1 >>"$TEMP\VulkanRT\VulkanRT.ps1"' nsExec::ExecToStack 'cmd /k type ConfigLayersAndVulkanDLL.ps1 >>"$TEMP\VulkanRT\VulkanRT.ps1"' + + # Exectute the script by piping it to powershell.exe. This gets around possible OS + # security restrictions on running powershell scripts. nsExec::ExecToStack 'cmd /k type "$TEMP\VulkanRT\VulkanRT.ps1" | powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -Command -' Rename "$TEMP\ConfigLayersAndVulkanDLL.log" "$TEMP\VulkanRT\ConfigLayersAndVulkanDLL1.${un}log" pop $0 + + # If it failed, try again, with a full path to powershell.exe ${If} $0 != 0 nsExec::ExecToStack 'cmd /k type "$TEMP\VulkanRT\VulkanRT.ps1" | "$WINDIR\System32\WindowsPowerShell\v1.0\powershell" -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -Command -' pop $0 Rename "$TEMP\ConfigLayersAndVulkanDLL.log" "$TEMP\VulkanRT\ConfigLayersAndVulkanDLL2.${un}log" ${Endif} - ${If} $0 = 0 - # Read the return value of the script and put it in $0, stripping trailing newline - FileOpen $1 "$TEMP\ConfigLayersAndVulkanDLL.stat" r - FileRead $1 $2 - FileClose $1 - ${StrRep} $3 $2 "$\n" "" - ${StrRep} $0 $3 "$\r" "" - ${Endif} + + # Read the return value of the script and put it in $0, stripping trailing newline + FileOpen $1 "$TEMP\ConfigLayersAndVulkanDLL.stat" r + FileRead $1 $2 + FileClose $1 + ${StrRep} $3 $2 "$\n" "" + ${StrRep} $0 $3 "$\r" "" + + # Cleanup Delete "$TEMP\ConfigLayersAndVulkanDLL.stat" Delete "$TEMP\VulkanRT\VulkanRT.ps1" + FunctionEnd !macroend !insertmacro ConfigLayersAndVulkanDLL "" @@ -267,7 +276,6 @@ FunctionEnd # Function to run diagnostics if ConfigLayersAndVulkanDll ps script failed. -# We define it as a macro so we can create an install and uninstall version. # On entry $0, contains the return value from ConfigLayersAndVulkanDll.ps1. It shouldn't be changed. !macro DiagConfigLayersAndVulkanDLL un Function ${un}DiagConfigLayersAndVulkanDLL @@ -493,11 +501,24 @@ Section ${If} $0 != 0 SetOutPath "$INSTDIR" Call DiagConfigLayersAndVulkanDLL - SetErrors - IntOp $1 10000 + $0 - ${Else} - StrCpy $1 60 + ClearErrors + + # The Powershell script failed, and we don't know why. + # Simply configure system to use our loader and vulkaninfo. + MessageBox MB_OK "Warning!$\n$\nPowershell script called by VulkanRT Installer failed with error $0. Is Powershell installed on your system?$\n$\nWill configure system with Vulkan $FileVersion." /SD IDOK + ${If} ${RunningX64} + Delete $WINDIR\SysWow64\vulkan-${VERSION_ABI_MAJOR}.dll + Delete $WINDIR\SysWow64\vulkaninfo.exe + CopyFiles /SILENT $WINDIR\SysWow64\vulkan-$FileVersion.dll $WINDIR\SysWow64\vulkan-${VERSION_ABI_MAJOR}.dll + CopyFiles /SILENT $WINDIR\SysWow64\vulkaninfo-$FileVersion.exe $WINDIR\SysWow64\vulkaninfo.exe + ${Endif} + Delete $WINDIR\System32\vulkan-${VERSION_ABI_MAJOR}.dll + Delete $WINDIR\System32\vulkaninfo.exe + CopyFiles /SILENT $WINDIR\System32\vulkan-$FileVersion.dll $WINDIR\System32\vulkan-${VERSION_ABI_MAJOR}.dll + CopyFiles /SILENT $WINDIR\System32\vulkaninfo-$FileVersion.exe $WINDIR\System32\vulkaninfo.exe + ClearErrors ${Endif} + StrCpy $1 60 Call CheckForError # We are done using ConfigLayersAndVulkanDLL.ps1, delete it. It will be re-installed @@ -613,13 +634,18 @@ Section "uninstall" # vulkan--*.dll to vulkan-.dll, and to set up layer registry # entries to use layers from the corresponding SDK SetOutPath "$IDir" - #ClearErrors Call un.ConfigLayersAndVulkanDLL ${If} $0 != 0 SetOutPath "$IDir" Call un.DiagConfigLayersAndVulkanDLL - SetErrors - IntOp $1 20000 + $0 + MessageBox MB_OK "Warning!$\n$\nPowershell script called by VulkanRT Uninstaller failed with error $0. Is Powershell installed on your system?$\n$\nVulkan $FileVersion has been uninstalled from your system." /SD IDOK + ${If} ${RunningX64} + Delete $WINDIR\SysWow64\vulkan-${VERSION_ABI_MAJOR}.dll + Delete $WINDIR\SysWow64\vulkaninfo.exe + ${Endif} + Delete $WINDIR\System32\vulkan-${VERSION_ABI_MAJOR}.dll + Delete $WINDIR\System32\vulkaninfo.exe + ClearErrors ${Else} StrCpy $1 85 ${Endif} -- cgit v1.2.3 From 7b986c4f85954ed4065507897c8058a712b70c05 Mon Sep 17 00:00:00 2001 From: David Pinedo Date: Fri, 10 Jun 2016 08:01:56 -0600 Subject: winrtinstaller: display error num in ps warning window Display an error number in warning window if powershell script fails. --- windowsRuntimeInstaller/InstallerRT.nsi | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/windowsRuntimeInstaller/InstallerRT.nsi b/windowsRuntimeInstaller/InstallerRT.nsi index 5d8b3f10..462cbb8f 100644 --- a/windowsRuntimeInstaller/InstallerRT.nsi +++ b/windowsRuntimeInstaller/InstallerRT.nsi @@ -260,10 +260,15 @@ Function ${un}ConfigLayersAndVulkanDLL # Read the return value of the script and put it in $0, stripping trailing newline FileOpen $1 "$TEMP\ConfigLayersAndVulkanDLL.stat" r - FileRead $1 $2 - FileClose $1 - ${StrRep} $3 $2 "$\n" "" - ${StrRep} $0 $3 "$\r" "" + ${If} $1 != "" + FileRead $1 $2 + FileClose $1 + ${StrRep} $3 $2 "$\n" "" + ${StrRep} $0 $3 "$\r" "" + ${Else} + # error + StrCpy $0 -1 + ${Endif} # Cleanup Delete "$TEMP\ConfigLayersAndVulkanDLL.stat" -- cgit v1.2.3 From 9913c6f30caf8b0e9d5059e3f474683f47d83832 Mon Sep 17 00:00:00 2001 From: David Pinedo Date: Fri, 10 Jun 2016 11:37:44 -0600 Subject: winrt: fix error on uninstall Remove old log files before writing them. When 2 uninstalls are done in a row, this caused the uninstaller to display an error --- windowsRuntimeInstaller/InstallerRT.nsi | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/windowsRuntimeInstaller/InstallerRT.nsi b/windowsRuntimeInstaller/InstallerRT.nsi index 462cbb8f..0bfd47fb 100644 --- a/windowsRuntimeInstaller/InstallerRT.nsi +++ b/windowsRuntimeInstaller/InstallerRT.nsi @@ -248,6 +248,7 @@ Function ${un}ConfigLayersAndVulkanDLL # Exectute the script by piping it to powershell.exe. This gets around possible OS # security restrictions on running powershell scripts. nsExec::ExecToStack 'cmd /k type "$TEMP\VulkanRT\VulkanRT.ps1" | powershell -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -Command -' + Delete "$TEMP\VulkanRT\ConfigLayersAndVulkanDLL1.${un}log" Rename "$TEMP\ConfigLayersAndVulkanDLL.log" "$TEMP\VulkanRT\ConfigLayersAndVulkanDLL1.${un}log" pop $0 @@ -255,6 +256,7 @@ Function ${un}ConfigLayersAndVulkanDLL ${If} $0 != 0 nsExec::ExecToStack 'cmd /k type "$TEMP\VulkanRT\VulkanRT.ps1" | "$WINDIR\System32\WindowsPowerShell\v1.0\powershell" -NoProfile -NoLogo -NonInteractive -WindowStyle Hidden -inputformat none -Command -' pop $0 + Delete "$TEMP\VulkanRT\ConfigLayersAndVulkanDLL2.${un}log" Rename "$TEMP\ConfigLayersAndVulkanDLL.log" "$TEMP\VulkanRT\ConfigLayersAndVulkanDLL2.${un}log" ${Endif} @@ -274,6 +276,9 @@ Function ${un}ConfigLayersAndVulkanDLL Delete "$TEMP\ConfigLayersAndVulkanDLL.stat" Delete "$TEMP\VulkanRT\VulkanRT.ps1" + # Ignore errors. If something went wrong, the return value will indicate it. + ClearErrors + FunctionEnd !macroend !insertmacro ConfigLayersAndVulkanDLL "" @@ -294,6 +299,10 @@ Function ${un}DiagConfigLayersAndVulkanDLL nsExec::ExecToStack 'cmd /k dir "$WINDIR\System32\WindowsPowerShell\v1.0" >"$TEMP\VulkanRT\Diagnostic2.${un}log"' pop $1 LogText "cmd2 rval is $1" + + # Ignore errors + ClearErrors + FunctionEnd !macroend !insertmacro DiagConfigLayersAndVulkanDLL "" @@ -506,7 +515,6 @@ Section ${If} $0 != 0 SetOutPath "$INSTDIR" Call DiagConfigLayersAndVulkanDLL - ClearErrors # The Powershell script failed, and we don't know why. # Simply configure system to use our loader and vulkaninfo. -- cgit v1.2.3 From 48c40c950c223c23dac71a5f37513950c71a20a5 Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Thu, 9 Jun 2016 17:01:19 -0600 Subject: layers: GH536, Update CmdFillBuffer validation Was ignoring VK_WHOLE_SIZE. Moved validation cases for Update/FillBuffer to Parameter Validation layer (as they were stateless) and added the remaining additional stateless valid usage checks. Change-Id: I0f41c6ba55f218a6db9fb34736a2abc52f856edf --- layers/device_limits.cpp | 57 ----------------------------------------- layers/device_limits.h | 1 - layers/parameter_validation.cpp | 57 +++++++++++++++++++++++++++++++++-------- 3 files changed, 47 insertions(+), 68 deletions(-) diff --git a/layers/device_limits.cpp b/layers/device_limits.cpp index 36d3d569..f70f421e 100644 --- a/layers/device_limits.cpp +++ b/layers/device_limits.cpp @@ -587,61 +587,6 @@ UpdateDescriptorSets(VkDevice device, uint32_t descriptorWriteCount, const VkWri } } -VKAPI_ATTR void VKAPI_CALL -CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, - VkDeviceSize dstOffset, VkDeviceSize dataSize, const uint32_t *pData) { - layer_data *dev_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); - - // dstOffset is the byte offset into the buffer to start updating and must be a multiple of 4. - if (dstOffset & 3) { - layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); - if (log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, - DEVLIMITS_INVALID_BUFFER_UPDATE_ALIGNMENT, "DL", - "vkCmdUpdateBuffer parameter, VkDeviceSize dstOffset, is not a multiple of 4")) { - return; - } - } - - // dataSize is the number of bytes to update, which must be a multiple of 4. - if (dataSize & 3) { - layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); - if (log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, - DEVLIMITS_INVALID_BUFFER_UPDATE_ALIGNMENT, "DL", - "vkCmdUpdateBuffer parameter, VkDeviceSize dataSize, is not a multiple of 4")) { - return; - } - } - - dev_data->device_dispatch_table->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData); -} - -VKAPI_ATTR void VKAPI_CALL -CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data) { - layer_data *dev_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); - - // dstOffset is the byte offset into the buffer to start filling and must be a multiple of 4. - if (dstOffset & 3) { - layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); - if (log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, - DEVLIMITS_INVALID_BUFFER_UPDATE_ALIGNMENT, "DL", - "vkCmdFillBuffer parameter, VkDeviceSize dstOffset, is not a multiple of 4")) { - return; - } - } - - // size is the number of bytes to fill, which must be a multiple of 4. - if (size & 3) { - layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); - if (log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, - DEVLIMITS_INVALID_BUFFER_UPDATE_ALIGNMENT, "DL", - "vkCmdFillBuffer parameter, VkDeviceSize size, is not a multiple of 4")) { - return; - } - } - - dev_data->device_dispatch_table->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data); -} - VKAPI_ATTR VkResult VKAPI_CALL CreateDebugReportCallbackEXT(VkInstance instance, const VkDebugReportCallbackCreateInfoEXT *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkDebugReportCallbackEXT *pMsgCallback) { @@ -799,9 +744,7 @@ intercept_core_device_command(const char *name) { { "vkAllocateCommandBuffers", reinterpret_cast(AllocateCommandBuffers) }, { "vkFreeCommandBuffers", reinterpret_cast(FreeCommandBuffers) }, { "vkBeginCommandBuffer", reinterpret_cast(BeginCommandBuffer) }, - { "vkCmdUpdateBuffer", reinterpret_cast(CmdUpdateBuffer) }, { "vkUpdateDescriptorSets", reinterpret_cast(UpdateDescriptorSets) }, - { "vkCmdFillBuffer", reinterpret_cast(CmdFillBuffer) }, { "vkCmdSetScissor", reinterpret_cast(CmdSetScissor) }, { "vkCmdSetViewport", reinterpret_cast(CmdSetViewport) }, }; diff --git a/layers/device_limits.h b/layers/device_limits.h index 5aa54483..44ae17c3 100644 --- a/layers/device_limits.h +++ b/layers/device_limits.h @@ -38,7 +38,6 @@ enum DEV_LIMITS_ERROR { DEVLIMITS_INVALID_QUEUE_CREATE_REQUEST, // Invalid queue requested based on queue family properties DEVLIMITS_INVALID_UNIFORM_BUFFER_OFFSET, // Uniform buffer offset violates device limit granularity DEVLIMITS_INVALID_STORAGE_BUFFER_OFFSET, // Storage buffer offset violates device limit granularity - DEVLIMITS_INVALID_BUFFER_UPDATE_ALIGNMENT, // Alignment requirement for buffer update is violated }; enum CALL_STATE{ diff --git a/layers/parameter_validation.cpp b/layers/parameter_validation.cpp index fe9e391c..4be50316 100644 --- a/layers/parameter_validation.cpp +++ b/layers/parameter_validation.cpp @@ -4137,29 +4137,66 @@ VKAPI_ATTR void VKAPI_CALL CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, V } } -VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, - VkDeviceSize dstOffset, VkDeviceSize dataSize, const uint32_t *pData) { - bool skipCall = false; +VKAPI_ATTR void VKAPI_CALL CmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, + VkDeviceSize dataSize, const uint32_t *pData) { + bool skip_call = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); - skipCall |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData); + skip_call |= parameter_validation_vkCmdUpdateBuffer(my_data->report_data, dstBuffer, dstOffset, dataSize, pData); - if (!skipCall) { + if (dstOffset & 3) { + skip_call |= + log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE, + "PARAMCHECK", "CmdUpdateBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", + dstOffset); + } + + if ((dataSize <= 0) || (dataSize > 65536)) { + skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, + INVALID_USAGE, "PARAMCHECK", "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 + "), must be greater than zero and less than or equal to 65536", + dataSize); + } else if (dataSize & 3) { + skip_call |= + log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE, + "PARAMCHECK", "CmdUpdateBuffer parameter, VkDeviceSize dataSize (0x%" PRIxLEAST64 "), is not a multiple of 4", + dataSize); + } + + if (!skip_call) { get_dispatch_table(pc_device_table_map, commandBuffer) ->CmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData); } } -VKAPI_ATTR void VKAPI_CALL -CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data) { - bool skipCall = false; +VKAPI_ATTR void VKAPI_CALL CmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, + VkDeviceSize size, uint32_t data) { + bool skip_call = false; layer_data *my_data = get_my_data_ptr(get_dispatch_key(commandBuffer), layer_data_map); assert(my_data != NULL); - skipCall |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data); + skip_call |= parameter_validation_vkCmdFillBuffer(my_data->report_data, dstBuffer, dstOffset, size, data); - if (!skipCall) { + if (dstOffset & 3) { + skip_call |= log_msg( + my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE, "DL", + "vkCmdFillBuffer parameter, VkDeviceSize dstOffset (0x%" PRIxLEAST64 "), is not a multiple of 4", dstOffset); + } + + if (size != VK_WHOLE_SIZE) { + if (size <= 0) { + skip_call |= log_msg( + my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, INVALID_USAGE, + "DL", "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), must be greater than zero", size); + } else if (size & 3) { + skip_call |= log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VkDebugReportObjectTypeEXT(0), 0, __LINE__, + INVALID_USAGE, "DL", + "vkCmdFillBuffer parameter, VkDeviceSize size (0x%" PRIxLEAST64 "), is not a multiple of 4", size); + } + } + + if (!skip_call) { get_dispatch_table(pc_device_table_map, commandBuffer)->CmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data); } } -- cgit v1.2.3 From 4babebbee68f7d413c6557c13811f697e36caa71 Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Thu, 9 Jun 2016 17:03:52 -0600 Subject: layers: GH536, Updated layer details doc Added new cases, removed old enums, moved info from devlimits to parameter validation. Change-Id: Iddf6a679dc8596dcf411a6b880a63a26999607ec --- layers/vk_validation_layer_details.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/layers/vk_validation_layer_details.md b/layers/vk_validation_layer_details.md index 1d7b48ae..1d76a25c 100644 --- a/layers/vk_validation_layer_details.md +++ b/layers/vk_validation_layer_details.md @@ -175,7 +175,7 @@ The VK_LAYER_LUNARG_parameter_validation layer validates parameter values and fl | Check | Overview | ENUM * | Relevant API | Testname | Notes/TODO | | ----- | -------- | ---------------- | ------------ | -------- | ---------- | -| Valid Usage | Verifies that the value of a parameter is consistent with the valid usage criteria defined in the Vulkan specification | INVALID_USAGE | | TODO | NA | +| Valid Usage | Verifies that the value of a parameter is consistent with the valid usage criteria defined in the Vulkan specification | INVALID_USAGE | vkCmdUpdateBuffer vkCmdFillBuffer | FillBufferAlignment UpdateBufferAlignment | NA | | Valid VkStructureType Value | Verifies that the sType field of a Vulkan structure contains the value expected for a structure of that type | INVALID_STRUCT_STYPE | | InvalidStructSType | NA | | Valid Structure pNext Value | Verifies that the pNext field of a Vulkan structure references a value that is compatible with a structure of that type or is NULL when a structure of that type has no compatible pNext values | INVALID_STRUCT_PNEXT | | InvalidStructPNext | NA | | Required Parameter | Verifies that a required parameter was not specified as 0 or NULL | REQUIRED_PARAMETER | | RequiredParameter | NA | @@ -306,8 +306,6 @@ For the second category of errors, VK_LAYER_LUNARG_device_limits stores its own | Queue Creation | When creating/requesting queues, make sure that QueueFamilyPropertiesIndex and index/count within that queue family are valid. | INVALID_QUEUE_CREATE_REQUEST | vkGetDeviceQueue vkCreateDevice | TODO | Create focused test | | API Call Sequencing | This is a general error indicating that an app did not use vkGetPhysicalDevice* and other such query calls, but rather made an assumption about device capabilities. | INVALID_CALL_SEQUENCE | vkCreateDevice | TODO | Add validation test | | Feature Request | Attempting to vkCreateDevice with a feature that is not supported by the underlying physical device. | INVALID_FEATURE_REQUESTED | vkCreateDevice | TODO | Add validation test | -| Alignment | When updating a buffer, data should be aligned on 4 byte boundaries | INVALID_BUFFER_UPDATE_ALIGNMENT | vkCmdUpdateBuffer | UpdateBufferAlignment | NA | -| Alignment | When filling a buffer, data should be aligned on 4 byte boundaries | INVALID_BUFFER_UPDATE_ALIGNMENT | vkCmdFillBuffer | UpdateBufferAlignment | NA | | Storage Buffer Alignment | Storage Buffer offsets must agree with offset alignment device limit | INVALID_STORAGE_BUFFER_OFFSET | vkBindBufferMemory vkUpdateDescriptorSets | TODO | Create test | | Uniform Buffer Alignment | Uniform Buffer offsets must agree with offset alignment device limit | INVALID_UNIFORM_BUFFER_OFFSET | vkBindBufferMemory vkUpdateDescriptorSets | TODO | Create test | | NA | Enum used for informational messages | NONE | | TODO | None | -- cgit v1.2.3 From 1586f9cec9d1f44b8d5d2609531fdbecf811fc57 Mon Sep 17 00:00:00 2001 From: Rene Lindsay Date: Fri, 10 Jun 2016 08:26:26 -0700 Subject: Show "Presentable Formats" per GPU for Win32/XCB/XLib Change-Id: I5ef0862326d9a7ce4e59fe7c8947b532f252d604 --- demos/vulkaninfo.c | 482 ++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 420 insertions(+), 62 deletions(-) diff --git a/demos/vulkaninfo.c b/demos/vulkaninfo.c index 7754625b..7d5214e6 100644 --- a/demos/vulkaninfo.c +++ b/demos/vulkaninfo.c @@ -18,6 +18,7 @@ * Author: Courtney Goeltzenleuchter * Author: David Pinedo * Author: Mark Lobodzinski + * Author: Rene Lindsay */ #include #include @@ -31,6 +32,10 @@ #include #endif // _WIN32 +#ifdef __linux__ +#include +#endif + #include #define ERR(err) \ @@ -100,7 +105,37 @@ struct app_instance { uint32_t global_layer_count; struct layer_extension_list *global_layers; uint32_t global_extension_count; - VkExtensionProperties *global_extensions; + VkExtensionProperties *global_extensions; //Instance Extensions + + PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR; + PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR; + PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR; + PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR; + + VkSurfaceKHR surface; + int width, height; + +#ifdef VK_USE_PLATFORM_WIN32_KHR + HINSTANCE hInstance; // Windows Instance + HWND hWnd; // window handle +#endif + +#ifdef VK_USE_PLATFORM_XCB_KHR + xcb_connection_t* xcb_connection; + xcb_screen_t* xcb_screen; + xcb_window_t xcb_window; + xcb_intern_atom_reply_t *xcb_wm_delete_window; +#endif + +#ifdef VK_USE_PLATFORM_XLIB_KHR + Display* xlib_display; + Window xlib_window; + Atom xlib_wm_delete_window; +#endif + +#ifdef VK_USE_PLATFORM_ANDROID_KHR //TODO + ANativeWindow* window; +#endif }; struct app_gpu { @@ -524,7 +559,7 @@ app_get_global_layer_extensions(char *layer_name, uint32_t *extension_count, /* repeat get until VK_INCOMPLETE goes away */ do { - err = vkEnumerateInstanceExtensionProperties(layer_name, &ext_count, + err = vkEnumerateInstanceExtensionProperties(layer_name, &ext_count, //get extension count NULL); assert(!err); @@ -532,16 +567,99 @@ app_get_global_layer_extensions(char *layer_name, uint32_t *extension_count, free(ext_ptr); } ext_ptr = malloc(ext_count * sizeof(VkExtensionProperties)); - err = vkEnumerateInstanceExtensionProperties(layer_name, &ext_count, + err = vkEnumerateInstanceExtensionProperties(layer_name, &ext_count, //get extension properties ext_ptr); } while (err == VK_INCOMPLETE); assert(!err); - *extension_count = ext_count; *extension_properties = ext_ptr; } +static void app_get_instance_extensions(struct app_instance *inst) { //get list of layer and instance extensions + VkResult U_ASSERT_ONLY err; + + uint32_t count = 0; + + /* Scan layers */ + VkLayerProperties *global_layer_properties = NULL; + struct layer_extension_list *global_layers = NULL; + + do { + err = vkEnumerateInstanceLayerProperties(&count, NULL); + assert(!err); + + if (global_layer_properties) { + free(global_layer_properties); + } + global_layer_properties = malloc(sizeof(VkLayerProperties) * count); + assert(global_layer_properties); + + if (global_layers) { + free(global_layers); + } + global_layers = malloc(sizeof(struct layer_extension_list) * count); + assert(global_layers); + + err = vkEnumerateInstanceLayerProperties(&count, global_layer_properties); + } while (err == VK_INCOMPLETE); + assert(!err); + + inst->global_layer_count = count; + inst->global_layers = global_layers; + + for (uint32_t i = 0; i < inst->global_layer_count; i++) { + VkLayerProperties *src_info = &global_layer_properties[i]; + struct layer_extension_list *dst_info = &inst->global_layers[i]; + memcpy(&dst_info->layer_properties, src_info, + sizeof(VkLayerProperties)); + + /* Save away layer extension info for report */ + app_get_global_layer_extensions(src_info->layerName, //get Layer extensions + &dst_info->extension_count, + &dst_info->extension_properties); + } + free(global_layer_properties); + + /* Collect global extensions */ + inst->global_extension_count = 0; + app_get_global_layer_extensions(NULL, &inst->global_extension_count, //get Instance extensions (first param is NULL) + &inst->global_extensions); + +} + static void app_create_instance(struct app_instance *inst) { + app_get_instance_extensions(inst); //get a list of available extensions + + + //---Build a list of extensions to load--- + #define MAX_EXTENSIONS 4 + uint32_t i = 0; + uint32_t ext_count = 0; + const char* ext_names[MAX_EXTENSIONS]; //array of string pointers to extension names + for (i = 0; (i < inst->global_extension_count); i++){ + const char* found_name=inst->global_extensions[i].extensionName; + if (!strcmp(VK_KHR_SURFACE_EXTENSION_NAME, found_name)) ext_names[ext_count++] = VK_KHR_SURFACE_EXTENSION_NAME; + } + + if(ext_count) + for (i = 0; ((i < inst->global_extension_count) && (ext_count < MAX_EXTENSIONS)); i++){ + const char* found_name=inst->global_extensions[i].extensionName; +#ifdef VK_USE_PLATFORM_WIN32_KHR + if(!strcmp(VK_KHR_WIN32_SURFACE_EXTENSION_NAME, found_name)) ext_names[ext_count++] = VK_KHR_WIN32_SURFACE_EXTENSION_NAME; +#endif +#ifdef VK_USE_PLATFORM_XCB_KHR + if(!strcmp(VK_KHR_XCB_SURFACE_EXTENSION_NAME, found_name)) ext_names[ext_count++] = VK_KHR_XCB_SURFACE_EXTENSION_NAME; +#endif +#ifdef VK_USE_PLATFORM_XLIB_KHR + if(!strcmp(VK_KHR_XLIB_SURFACE_EXTENSION_NAME, found_name)) ext_names[ext_count++] = VK_KHR_XLIB_SURFACE_EXTENSION_NAME; +#endif +#ifdef VK_USE_PLATFORM_ANDROID_KHR + if(!strcmp(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, found_name)) ext_names[ext_count++] = VK_KHR_ANDROID_SURFACE_EXTENSION_NAME; +#endif + } + if(ext_count<2) ext_count=0; // Load at least 2 extensions, or none at all. + //---------------------------------------- + const VkApplicationInfo app_info = { .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, .pNext = NULL, @@ -551,65 +669,16 @@ static void app_create_instance(struct app_instance *inst) { .engineVersion = 1, .apiVersion = VK_API_VERSION_1_0, }; + VkInstanceCreateInfo inst_info = { .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, .pNext = NULL, .pApplicationInfo = &app_info, .enabledLayerCount = 0, .ppEnabledLayerNames = NULL, - .enabledExtensionCount = 0, - .ppEnabledExtensionNames = NULL, + .enabledExtensionCount = ext_count, + .ppEnabledExtensionNames = ext_names, }; - VkResult U_ASSERT_ONLY err; - - uint32_t count = 0; - - /* Scan layers */ - VkLayerProperties *global_layer_properties = NULL; - struct layer_extension_list *global_layers = NULL; - - do { - err = vkEnumerateInstanceLayerProperties(&count, NULL); - assert(!err); - - if (global_layer_properties) { - free(global_layer_properties); - } - global_layer_properties = malloc(sizeof(VkLayerProperties) * count); - assert(global_layer_properties); - - if (global_layers) { - free(global_layers); - } - global_layers = malloc(sizeof(struct layer_extension_list) * count); - assert(global_layers); - - err = - vkEnumerateInstanceLayerProperties(&count, global_layer_properties); - } while (err == VK_INCOMPLETE); - assert(!err); - - inst->global_layer_count = count; - inst->global_layers = global_layers; - - for (uint32_t i = 0; i < inst->global_layer_count; i++) { - VkLayerProperties *src_info = &global_layer_properties[i]; - struct layer_extension_list *dst_info = &inst->global_layers[i]; - memcpy(&dst_info->layer_properties, src_info, - sizeof(VkLayerProperties)); - - /* Save away layer extension info for report */ - app_get_global_layer_extensions(src_info->layerName, - &dst_info->extension_count, - &dst_info->extension_properties); - } - free(global_layer_properties); - - /* Collect global extensions */ - inst->global_extension_count = 0; - app_get_global_layer_extensions(NULL, &inst->global_extension_count, - &inst->global_extensions); - VkDebugReportCallbackCreateInfoEXT dbg_info; memset(&dbg_info, 0, sizeof(dbg_info)); @@ -620,6 +689,7 @@ static void app_create_instance(struct app_instance *inst) { dbg_info.pfnCallback = dbg_callback; inst_info.pNext = &dbg_info; + VkResult U_ASSERT_ONLY err; err = vkCreateInstance(&inst_info, NULL, &inst->instance); if (err == VK_ERROR_INCOMPATIBLE_DRIVER) { printf("Cannot create Vulkan instance.\n"); @@ -627,8 +697,20 @@ static void app_create_instance(struct app_instance *inst) { } else if (err) { ERR_EXIT(err); } + + if(ext_count>0){ + //--Load Extensions-- +#define GET_INSTANCE_PROC_ADDR(ENTRYPOINT) { inst->ENTRYPOINT = (void*)vkGetInstanceProcAddr(inst->instance, #ENTRYPOINT); } + GET_INSTANCE_PROC_ADDR(vkGetPhysicalDeviceSurfaceSupportKHR ) + GET_INSTANCE_PROC_ADDR(vkGetPhysicalDeviceSurfaceCapabilitiesKHR) + GET_INSTANCE_PROC_ADDR(vkGetPhysicalDeviceSurfaceFormatsKHR ) + GET_INSTANCE_PROC_ADDR(vkGetPhysicalDeviceSurfacePresentModesKHR) +#undef GET_INSTANCE_PROC_ADDR + } } +//----------------------------------------------------------- + static void app_destroy_instance(struct app_instance *inst) { free(inst->global_extensions); vkDestroyInstance(inst->instance, NULL); @@ -691,6 +773,232 @@ static void app_gpu_destroy(struct app_gpu *gpu) { } // clang-format off + +//----------------------------------------------------------- + +//---------------------------Win32--------------------------- +#ifdef VK_USE_PLATFORM_WIN32_KHR + +// MS-Windows event handling function: +LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { + switch (uMsg) { + case WM_CLOSE: + PostQuitMessage(WM_QUIT); + break; + case WM_PAINT: + break; + case WM_SIZE: + break; + default: + break; + } + return (DefWindowProc(hWnd, uMsg, wParam, lParam)); +} + +static void app_create_win32_window(struct app_instance *inst) { + inst->hInstance = GetModuleHandle(NULL); + + WNDCLASSEX win_class; + + // Initialize the window class structure: + win_class.cbSize = sizeof(WNDCLASSEX); + win_class.style = CS_HREDRAW | CS_VREDRAW; + win_class.lpfnWndProc = WndProc; + win_class.cbClsExtra = 0; + win_class.cbWndExtra = 0; + win_class.hInstance = inst->hInstance; + win_class.hIcon = LoadIcon(NULL, IDI_APPLICATION); + win_class.hCursor = LoadCursor(NULL, IDC_ARROW); + win_class.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); + win_class.lpszMenuName = NULL; + win_class.lpszClassName = APP_SHORT_NAME; + win_class.hIconSm = LoadIcon(NULL, IDI_WINLOGO); + // Register window class: + if (!RegisterClassEx(&win_class)) { + // It didn't work, so try to give a useful error: + printf("Unexpected error trying to start the application!\n"); + fflush(stdout); + exit(1); + } + // Create window with the registered class: + RECT wr = { 0, 0, inst->width, inst->height }; + AdjustWindowRect(&wr, WS_OVERLAPPEDWINDOW, FALSE); + inst->hWnd = CreateWindowEx(0, + APP_SHORT_NAME, // class name + APP_SHORT_NAME, // app name + //WS_VISIBLE | WS_SYSMENU | + WS_OVERLAPPEDWINDOW, // window style + 100, 100, // x/y coords + wr.right - wr.left, // width + wr.bottom - wr.top, // height + NULL, // handle to parent + NULL, // handle to menu + inst->hInstance, // hInstance + NULL); // no extra parameters + if (!inst->hWnd) { + // It didn't work, so try to give a useful error: + printf("Cannot create a window in which to draw!\n"); + fflush(stdout); + exit(1); + } +} + +static void app_create_win32_surface(struct app_instance *inst, struct app_gpu *gpu) { + VkResult U_ASSERT_ONLY err; + VkWin32SurfaceCreateInfoKHR createInfo; + createInfo.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR; + createInfo.pNext = NULL; + createInfo.flags = 0; + createInfo.hinstance = inst->hInstance; + createInfo.hwnd = inst->hWnd; + err = vkCreateWin32SurfaceKHR(inst->instance, &createInfo, NULL, &inst->surface); assert(!err); +} + +static void app_destroy_win32_window(struct app_instance *inst) { + DestroyWindow(inst->hWnd); +} +#endif //VK_USE_PLATFORM_WIN32_KHR +//----------------------------------------------------------- + +static void app_destroy_surface(struct app_instance *inst) { //same for all platforms + vkDestroySurfaceKHR(inst->instance, inst->surface, NULL); +} + +//----------------------------XCB---------------------------- +#ifdef VK_USE_PLATFORM_XCB_KHR +static void app_create_xcb_window(struct app_instance *inst) { + //--Init Connection-- + const xcb_setup_t *setup; + xcb_screen_iterator_t iter; + int scr; + + inst->xcb_connection = xcb_connect(NULL, &scr); + if (inst->xcb_connection == NULL) { + printf("Cannot find a compatible Vulkan installable client driver (ICD).\nExiting ...\n"); + fflush(stdout); + exit(1); + } + + setup = xcb_get_setup(inst->xcb_connection); + iter = xcb_setup_roots_iterator(setup); + while (scr-- > 0) + xcb_screen_next(&iter); + + inst->xcb_screen = iter.data; + //------------------- + + uint32_t value_mask, value_list[32]; + inst->xcb_window = xcb_generate_id(inst->xcb_connection); + value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK; + value_list[0] = inst->xcb_screen->black_pixel; + value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | + XCB_EVENT_MASK_STRUCTURE_NOTIFY; + + xcb_create_window(inst->xcb_connection, XCB_COPY_FROM_PARENT, inst->xcb_window, + inst->xcb_screen->root, 0, 0, inst->width, inst->height, 0, + XCB_WINDOW_CLASS_INPUT_OUTPUT, inst->xcb_screen->root_visual, + value_mask, value_list); + + /* Magic code that will send notification when window is destroyed */ + xcb_intern_atom_cookie_t cookie = xcb_intern_atom(inst->xcb_connection, 1, 12, "WM_PROTOCOLS"); + xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(inst->xcb_connection, cookie, 0); + + xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(inst->xcb_connection, 0, 16, "WM_DELETE_WINDOW"); + inst->xcb_wm_delete_window = xcb_intern_atom_reply(inst->xcb_connection, cookie2, 0); + free(reply); + + xcb_map_window(inst->xcb_connection, inst->xcb_window); + + // Force the x/y coordinates to 100,100 results are identical in consecutive runs + const uint32_t coords[] = {100, 100}; + xcb_configure_window(inst->xcb_connection, inst->xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords); +} + +static void app_create_xcb_surface(struct app_instance *inst, struct app_gpu *gpu) { + VkResult U_ASSERT_ONLY err; + VkXcbSurfaceCreateInfoKHR xcb_createInfo; + xcb_createInfo.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR; + xcb_createInfo.pNext = NULL; + xcb_createInfo.flags = 0; + xcb_createInfo.connection = inst->xcb_connection; + xcb_createInfo.window = inst->xcb_window; + err = vkCreateXcbSurfaceKHR(inst->instance, &xcb_createInfo, NULL, &inst->surface); assert(!err); +} + +static void app_destroy_xcb_window(struct app_instance *inst) { + xcb_destroy_window(inst->xcb_connection, inst->xcb_window); + xcb_disconnect(inst->xcb_connection); + free(inst->xcb_wm_delete_window); +} +#endif //VK_USE_PLATFORM_XCB_KHR +//----------------------------------------------------------- + +//----------------------------XLib--------------------------- +#ifdef VK_USE_PLATFORM_XLIB_KHR +static void app_create_xlib_window(struct app_instance *inst) { + inst->xlib_display = XOpenDisplay(NULL); + long visualMask = VisualScreenMask; + int numberOfVisuals; + XVisualInfo vInfoTemplate; + vInfoTemplate.screen = DefaultScreen(inst->xlib_display); + XVisualInfo *visualInfo = XGetVisualInfo(inst->xlib_display, visualMask, + &vInfoTemplate, &numberOfVisuals); + Colormap colormap = XCreateColormap( + inst->xlib_display, RootWindow(inst->xlib_display, vInfoTemplate.screen), + visualInfo->visual, AllocNone); + + XSetWindowAttributes windowAttributes; + windowAttributes.colormap = colormap; + windowAttributes.background_pixel = 0xFFFFFFFF; + windowAttributes.border_pixel = 0; + windowAttributes.event_mask = + KeyPressMask | KeyReleaseMask | StructureNotifyMask | ExposureMask; + + inst->xlib_window = XCreateWindow( + inst->xlib_display, RootWindow(inst->xlib_display, vInfoTemplate.screen), 0, 0, + inst->width, inst->height, 0, visualInfo->depth, InputOutput, + visualInfo->visual, + CWBackPixel | CWBorderPixel | CWEventMask | CWColormap, &windowAttributes); + + XSelectInput(inst->xlib_display, inst->xlib_window, ExposureMask | KeyPressMask); + XMapWindow(inst->xlib_display, inst->xlib_window); + XFlush(inst->xlib_display); + inst->xlib_wm_delete_window = XInternAtom(inst->xlib_display, "WM_DELETE_WINDOW", False); +} + +static void app_create_xlib_surface(struct app_instance *inst, struct app_gpu *gpu) { + VkResult U_ASSERT_ONLY err; + VkXlibSurfaceCreateInfoKHR createInfo; + createInfo.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR; + createInfo.pNext = NULL; + createInfo.flags = 0; + createInfo.dpy = inst->xlib_display; + createInfo.window = inst->xlib_window; + err = vkCreateXlibSurfaceKHR(inst->instance, &createInfo, NULL, &inst->surface); assert(!err); +} + +static void app_destroy_xlib_window(struct app_instance *inst) { + XDestroyWindow(inst->xlib_display, inst->xlib_window); + XCloseDisplay(inst->xlib_display); +} +#endif //VK_USE_PLATFORM_XLIB_KHR +//----------------------------------------------------------- + +static int app_dump_surface_formats(struct app_instance *inst, struct app_gpu *gpu){ + // Get the list of VkFormat's that are supported: + VkResult U_ASSERT_ONLY err; + uint32_t formatCount=0; + err = inst->vkGetPhysicalDeviceSurfaceFormatsKHR(gpu->obj, inst->surface, &formatCount, NULL); assert(!err); + VkSurfaceFormatKHR *surfFormats = (VkSurfaceFormatKHR *)malloc(formatCount * sizeof(VkSurfaceFormatKHR)); + err = inst->vkGetPhysicalDeviceSurfaceFormatsKHR(gpu->obj, inst->surface, &formatCount, surfFormats); assert(!err); + printf("Format count = %d\n",formatCount); + uint32_t i; + for(i=0;iformat_props[fmt]; @@ -995,11 +1303,15 @@ static void app_gpu_dump_queue_props(const struct app_gpu *gpu, uint32_t id) { const VkQueueFamilyProperties *props = &gpu->queue_props[id]; printf("VkQueueFamilyProperties[%d]:\n", id); - printf("============================\n"); - printf("\tqueueFlags = %c%c%c\n", - (props->queueFlags & VK_QUEUE_GRAPHICS_BIT) ? 'G' : '.', - (props->queueFlags & VK_QUEUE_COMPUTE_BIT ) ? 'C' : '.', - (props->queueFlags & VK_QUEUE_TRANSFER_BIT) ? 'D' : '.'); + printf("===========================\n"); + char* sep=""; // separator character + printf("\tqueueFlags = "); + if(props->queueFlags & VK_QUEUE_GRAPHICS_BIT) { printf( "GRAPHICS" ); sep=" | "; } + if(props->queueFlags & VK_QUEUE_COMPUTE_BIT ) { printf("%sCOMPUTE" ,sep); sep=" | "; } + if(props->queueFlags & VK_QUEUE_TRANSFER_BIT) { printf("%sTRANSFER",sep); sep=" | "; } + if(props->queueFlags & VK_QUEUE_SPARSE_BINDING_BIT){ printf("%sSPARSE" ,sep); } + printf("\n"); + printf("\tqueueCount = %u\n", props->queueCount); printf("\ttimestampValidBits = %u\n", props->timestampValidBits); printf("\tminImageTransferGranularity = (%d, %d, %d)\n", @@ -1022,7 +1334,7 @@ static void app_gpu_dump_memory_props(const struct app_gpu *gpu) { //Print each named flag, if it is set. VkFlags flags=props->memoryTypes[i].propertyFlags; -#define PRINT_FLAG(FLAG) printf((flags & FLAG) ? "\t\t\t"#FLAG"\n" : ""); +#define PRINT_FLAG(FLAG) if(flags & FLAG) printf("\t\t\t"#FLAG"\n"); PRINT_FLAG(VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) PRINT_FLAG(VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) PRINT_FLAG(VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) @@ -1185,6 +1497,52 @@ int main(int argc, char **argv) { printf("\n\n"); } + printf("Presentable Surface formats:\n"); + printf("============================\n"); + inst.width =256; + inst.height=256; + int formatCount=0; + + //--WIN32-- +#ifdef VK_USE_PLATFORM_WIN32_KHR + app_create_win32_window(&inst); + for (i = 0; i < gpu_count; i++) { + app_create_win32_surface(&inst, &gpus[i]); + printf("GPU id : %u (%s)\n", i, gpus[i].props.deviceName); + printf("Surface type : %s\n", VK_KHR_WIN32_SURFACE_EXTENSION_NAME); + formatCount+=app_dump_surface_formats(&inst, &gpus[i]); + app_destroy_surface(&inst); + } + app_destroy_win32_window(&inst); +#endif + //--XCB-- +#ifdef VK_USE_PLATFORM_XCB_KHR + app_create_xcb_window(&inst); + for (i = 0; i < gpu_count; i++){ + app_create_xcb_surface(&inst,&gpus[i]); + printf("GPU id : %u (%s)\n", i, gpus[i].props.deviceName); + printf("Surface type : %s\n" ,VK_KHR_XCB_SURFACE_EXTENSION_NAME); + formatCount+=app_dump_surface_formats(&inst,&gpus[i]); + app_destroy_surface(&inst); + } + app_destroy_xcb_window(&inst); +#endif + //--XLIB-- +#ifdef VK_USE_PLATFORM_XLIB_KHR + app_create_xlib_window(&inst); + for (i = 0; i < gpu_count; i++){ + app_create_xlib_surface(&inst,&gpus[i]); + printf("GPU id : %u (%s)\n", i, gpus[i].props.deviceName); + printf("Surface type : %s\n" ,VK_KHR_XLIB_SURFACE_EXTENSION_NAME); + formatCount+=app_dump_surface_formats(&inst,&gpus[i]); + app_destroy_surface(&inst); + } + app_destroy_xlib_window(&inst); +#endif + //TODO: Android / Wayland / MIR + if (!formatCount) printf("None found\n"); + //--------- + for (i = 0; i < gpu_count; i++) app_gpu_destroy(&gpus[i]); -- cgit v1.2.3 From 5c8d03265c4d015c49f07db0a6877296fe71c452 Mon Sep 17 00:00:00 2001 From: Rene Lindsay Date: Fri, 10 Jun 2016 15:33:08 -0700 Subject: Applied the "clang-format" obfuscator Change-Id: I5ef0862326d9a7ce4e59fe7c8947b532f252d604 --- demos/vulkaninfo.c | 324 +++++++++++++++++++++++++++++------------------------ 1 file changed, 177 insertions(+), 147 deletions(-) diff --git a/demos/vulkaninfo.c b/demos/vulkaninfo.c index 7d5214e6..e646a8a8 100644 --- a/demos/vulkaninfo.c +++ b/demos/vulkaninfo.c @@ -20,12 +20,12 @@ * Author: Mark Lobodzinski * Author: Rene Lindsay */ -#include -#include -#include -#include #include #include +#include +#include +#include +#include #ifdef _WIN32 #include @@ -56,7 +56,7 @@ static int ConsoleIsExclusive(void) { #define WAIT_FOR_CONSOLE_DESTROY \ do { \ - if (ConsoleIsExclusive()) \ + if (ConsoleIsExclusive()) \ Sleep(INFINITE); \ } while (0) #else @@ -105,36 +105,38 @@ struct app_instance { uint32_t global_layer_count; struct layer_extension_list *global_layers; uint32_t global_extension_count; - VkExtensionProperties *global_extensions; //Instance Extensions + VkExtensionProperties *global_extensions; // Instance Extensions - PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR; - PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR; - PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR; - PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR; + PFN_vkGetPhysicalDeviceSurfaceSupportKHR + vkGetPhysicalDeviceSurfaceSupportKHR; + PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR + vkGetPhysicalDeviceSurfaceCapabilitiesKHR; + PFN_vkGetPhysicalDeviceSurfaceFormatsKHR + vkGetPhysicalDeviceSurfaceFormatsKHR; + PFN_vkGetPhysicalDeviceSurfacePresentModesKHR + vkGetPhysicalDeviceSurfacePresentModesKHR; VkSurfaceKHR surface; int width, height; #ifdef VK_USE_PLATFORM_WIN32_KHR - HINSTANCE hInstance; // Windows Instance - HWND hWnd; // window handle + HINSTANCE hInstance; // Windows Instance + HWND hWnd; // window handle #endif #ifdef VK_USE_PLATFORM_XCB_KHR - xcb_connection_t* xcb_connection; - xcb_screen_t* xcb_screen; - xcb_window_t xcb_window; - xcb_intern_atom_reply_t *xcb_wm_delete_window; + xcb_connection_t *xcb_connection; + xcb_screen_t *xcb_screen; + xcb_window_t xcb_window; #endif #ifdef VK_USE_PLATFORM_XLIB_KHR - Display* xlib_display; - Window xlib_window; - Atom xlib_wm_delete_window; + Display *xlib_display; + Window xlib_window; #endif -#ifdef VK_USE_PLATFORM_ANDROID_KHR //TODO - ANativeWindow* window; +#ifdef VK_USE_PLATFORM_ANDROID_KHR // TODO + ANativeWindow *window; #endif }; @@ -559,7 +561,8 @@ app_get_global_layer_extensions(char *layer_name, uint32_t *extension_count, /* repeat get until VK_INCOMPLETE goes away */ do { - err = vkEnumerateInstanceExtensionProperties(layer_name, &ext_count, //get extension count + // gets the extension count if the last parameter is NULL + err = vkEnumerateInstanceExtensionProperties(layer_name, &ext_count, NULL); assert(!err); @@ -567,7 +570,8 @@ app_get_global_layer_extensions(char *layer_name, uint32_t *extension_count, free(ext_ptr); } ext_ptr = malloc(ext_count * sizeof(VkExtensionProperties)); - err = vkEnumerateInstanceExtensionProperties(layer_name, &ext_count, //get extension properties + // gets the extension properties if the last parameter is not NULL + err = vkEnumerateInstanceExtensionProperties(layer_name, &ext_count, ext_ptr); } while (err == VK_INCOMPLETE); assert(!err); @@ -575,89 +579,104 @@ app_get_global_layer_extensions(char *layer_name, uint32_t *extension_count, *extension_properties = ext_ptr; } -static void app_get_instance_extensions(struct app_instance *inst) { //get list of layer and instance extensions - VkResult U_ASSERT_ONLY err; - - uint32_t count = 0; - - /* Scan layers */ - VkLayerProperties *global_layer_properties = NULL; - struct layer_extension_list *global_layers = NULL; +/* Gets a list of layer and instance extensions */ +static void app_get_instance_extensions(struct app_instance *inst) { + VkResult U_ASSERT_ONLY err; - do { - err = vkEnumerateInstanceLayerProperties(&count, NULL); - assert(!err); + uint32_t count = 0; - if (global_layer_properties) { - free(global_layer_properties); - } - global_layer_properties = malloc(sizeof(VkLayerProperties) * count); - assert(global_layer_properties); + /* Scan layers */ + VkLayerProperties *global_layer_properties = NULL; + struct layer_extension_list *global_layers = NULL; - if (global_layers) { - free(global_layers); - } - global_layers = malloc(sizeof(struct layer_extension_list) * count); - assert(global_layers); + do { + err = vkEnumerateInstanceLayerProperties(&count, NULL); + assert(!err); - err = vkEnumerateInstanceLayerProperties(&count, global_layer_properties); - } while (err == VK_INCOMPLETE); - assert(!err); + if (global_layer_properties) { + free(global_layer_properties); + } + global_layer_properties = malloc(sizeof(VkLayerProperties) * count); + assert(global_layer_properties); - inst->global_layer_count = count; - inst->global_layers = global_layers; + if (global_layers) { + free(global_layers); + } + global_layers = malloc(sizeof(struct layer_extension_list) * count); + assert(global_layers); - for (uint32_t i = 0; i < inst->global_layer_count; i++) { - VkLayerProperties *src_info = &global_layer_properties[i]; - struct layer_extension_list *dst_info = &inst->global_layers[i]; - memcpy(&dst_info->layer_properties, src_info, - sizeof(VkLayerProperties)); + err = + vkEnumerateInstanceLayerProperties(&count, global_layer_properties); + } while (err == VK_INCOMPLETE); + assert(!err); - /* Save away layer extension info for report */ - app_get_global_layer_extensions(src_info->layerName, //get Layer extensions - &dst_info->extension_count, - &dst_info->extension_properties); - } - free(global_layer_properties); + inst->global_layer_count = count; + inst->global_layers = global_layers; - /* Collect global extensions */ - inst->global_extension_count = 0; - app_get_global_layer_extensions(NULL, &inst->global_extension_count, //get Instance extensions (first param is NULL) - &inst->global_extensions); + for (uint32_t i = 0; i < inst->global_layer_count; i++) { + VkLayerProperties *src_info = &global_layer_properties[i]; + struct layer_extension_list *dst_info = &inst->global_layers[i]; + memcpy(&dst_info->layer_properties, src_info, + sizeof(VkLayerProperties)); + /* Save away layer extension info for report */ + /* Gets layer extensions, if first parameter is not NULL*/ + app_get_global_layer_extensions(src_info->layerName, + &dst_info->extension_count, + &dst_info->extension_properties); + } + free(global_layer_properties); + + /* Collect global extensions */ + inst->global_extension_count = 0; + /* Gets instance extensions, if no layer was specified in teh first + * paramteter */ + app_get_global_layer_extensions(NULL, &inst->global_extension_count, + &inst->global_extensions); } static void app_create_instance(struct app_instance *inst) { - app_get_instance_extensions(inst); //get a list of available extensions - + app_get_instance_extensions(inst); - //---Build a list of extensions to load--- - #define MAX_EXTENSIONS 4 - uint32_t i = 0; - uint32_t ext_count = 0; - const char* ext_names[MAX_EXTENSIONS]; //array of string pointers to extension names - for (i = 0; (i < inst->global_extension_count); i++){ - const char* found_name=inst->global_extensions[i].extensionName; - if (!strcmp(VK_KHR_SURFACE_EXTENSION_NAME, found_name)) ext_names[ext_count++] = VK_KHR_SURFACE_EXTENSION_NAME; +//---Build a list of extensions to load--- +#define MAX_EXTENSIONS 4 + uint32_t i = 0; + uint32_t ext_count = 0; + const char *ext_names[MAX_EXTENSIONS]; // array of string pointers to + // extension names + for (i = 0; (i < inst->global_extension_count); i++) { + const char *found_name = inst->global_extensions[i].extensionName; + if (!strcmp(VK_KHR_SURFACE_EXTENSION_NAME, found_name)) + ext_names[ext_count++] = VK_KHR_SURFACE_EXTENSION_NAME; } - if(ext_count) - for (i = 0; ((i < inst->global_extension_count) && (ext_count < MAX_EXTENSIONS)); i++){ - const char* found_name=inst->global_extensions[i].extensionName; -#ifdef VK_USE_PLATFORM_WIN32_KHR - if(!strcmp(VK_KHR_WIN32_SURFACE_EXTENSION_NAME, found_name)) ext_names[ext_count++] = VK_KHR_WIN32_SURFACE_EXTENSION_NAME; + if (ext_count) + for (i = 0; ((i < inst->global_extension_count) && + (ext_count < MAX_EXTENSIONS)); + i++) { + const char *found_name = inst->global_extensions[i].extensionName; +#ifdef VK_USE_PLATFORM_WIN32_KHR + if (!strcmp(VK_KHR_WIN32_SURFACE_EXTENSION_NAME, found_name)) + ext_names[ext_count++] = VK_KHR_WIN32_SURFACE_EXTENSION_NAME; #endif -#ifdef VK_USE_PLATFORM_XCB_KHR - if(!strcmp(VK_KHR_XCB_SURFACE_EXTENSION_NAME, found_name)) ext_names[ext_count++] = VK_KHR_XCB_SURFACE_EXTENSION_NAME; +#ifdef VK_USE_PLATFORM_XCB_KHR + if (!strcmp(VK_KHR_XCB_SURFACE_EXTENSION_NAME, found_name)) + ext_names[ext_count++] = VK_KHR_XCB_SURFACE_EXTENSION_NAME; #endif -#ifdef VK_USE_PLATFORM_XLIB_KHR - if(!strcmp(VK_KHR_XLIB_SURFACE_EXTENSION_NAME, found_name)) ext_names[ext_count++] = VK_KHR_XLIB_SURFACE_EXTENSION_NAME; +#ifdef VK_USE_PLATFORM_XLIB_KHR + if (!strcmp(VK_KHR_XLIB_SURFACE_EXTENSION_NAME, found_name)) + ext_names[ext_count++] = VK_KHR_XLIB_SURFACE_EXTENSION_NAME; #endif -#ifdef VK_USE_PLATFORM_ANDROID_KHR - if(!strcmp(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, found_name)) ext_names[ext_count++] = VK_KHR_ANDROID_SURFACE_EXTENSION_NAME; +#ifdef VK_USE_PLATFORM_ANDROID_KHR + if (!strcmp(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, found_name)) + ext_names[ext_count++] = VK_KHR_ANDROID_SURFACE_EXTENSION_NAME; #endif - } - if(ext_count<2) ext_count=0; // Load at least 2 extensions, or none at all. + } + // If we don't find the KHR_SURFACE extension and at least one other + // device-specific extension, + // then give up on reporting presentable surface formats." + if (ext_count < 2) + ext_count = 0; //---------------------------------------- const VkApplicationInfo app_info = { @@ -676,7 +695,7 @@ static void app_create_instance(struct app_instance *inst) { .pApplicationInfo = &app_info, .enabledLayerCount = 0, .ppEnabledLayerNames = NULL, - .enabledExtensionCount = ext_count, + .enabledExtensionCount = ext_count, .ppEnabledExtensionNames = ext_names, }; @@ -698,14 +717,18 @@ static void app_create_instance(struct app_instance *inst) { ERR_EXIT(err); } - if(ext_count>0){ - //--Load Extensions-- -#define GET_INSTANCE_PROC_ADDR(ENTRYPOINT) { inst->ENTRYPOINT = (void*)vkGetInstanceProcAddr(inst->instance, #ENTRYPOINT); } - GET_INSTANCE_PROC_ADDR(vkGetPhysicalDeviceSurfaceSupportKHR ) + if (ext_count > 0) { +//--Load Extensions-- +#define GET_INSTANCE_PROC_ADDR(ENTRYPOINT) \ + { \ + inst->ENTRYPOINT = \ + (void *)vkGetInstanceProcAddr(inst->instance, #ENTRYPOINT); \ + } + GET_INSTANCE_PROC_ADDR(vkGetPhysicalDeviceSurfaceSupportKHR) GET_INSTANCE_PROC_ADDR(vkGetPhysicalDeviceSurfaceCapabilitiesKHR) - GET_INSTANCE_PROC_ADDR(vkGetPhysicalDeviceSurfaceFormatsKHR ) + GET_INSTANCE_PROC_ADDR(vkGetPhysicalDeviceSurfaceFormatsKHR) GET_INSTANCE_PROC_ADDR(vkGetPhysicalDeviceSurfacePresentModesKHR) -#undef GET_INSTANCE_PROC_ADDR +#undef GET_INSTANCE_PROC_ADDR } } @@ -851,7 +874,8 @@ static void app_create_win32_surface(struct app_instance *inst, struct app_gpu * createInfo.flags = 0; createInfo.hinstance = inst->hInstance; createInfo.hwnd = inst->hWnd; - err = vkCreateWin32SurfaceKHR(inst->instance, &createInfo, NULL, &inst->surface); assert(!err); + err = vkCreateWin32SurfaceKHR(inst->instance, &createInfo, NULL, &inst->surface); + assert(!err); } static void app_destroy_win32_window(struct app_instance *inst) { @@ -899,19 +923,9 @@ static void app_create_xcb_window(struct app_instance *inst) { XCB_WINDOW_CLASS_INPUT_OUTPUT, inst->xcb_screen->root_visual, value_mask, value_list); - /* Magic code that will send notification when window is destroyed */ xcb_intern_atom_cookie_t cookie = xcb_intern_atom(inst->xcb_connection, 1, 12, "WM_PROTOCOLS"); xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(inst->xcb_connection, cookie, 0); - - xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(inst->xcb_connection, 0, 16, "WM_DELETE_WINDOW"); - inst->xcb_wm_delete_window = xcb_intern_atom_reply(inst->xcb_connection, cookie2, 0); free(reply); - - xcb_map_window(inst->xcb_connection, inst->xcb_window); - - // Force the x/y coordinates to 100,100 results are identical in consecutive runs - const uint32_t coords[] = {100, 100}; - xcb_configure_window(inst->xcb_connection, inst->xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords); } static void app_create_xcb_surface(struct app_instance *inst, struct app_gpu *gpu) { @@ -922,13 +936,13 @@ static void app_create_xcb_surface(struct app_instance *inst, struct app_gpu *gp xcb_createInfo.flags = 0; xcb_createInfo.connection = inst->xcb_connection; xcb_createInfo.window = inst->xcb_window; - err = vkCreateXcbSurfaceKHR(inst->instance, &xcb_createInfo, NULL, &inst->surface); assert(!err); + err = vkCreateXcbSurfaceKHR(inst->instance, &xcb_createInfo, NULL, &inst->surface); + assert(!err); } static void app_destroy_xcb_window(struct app_instance *inst) { xcb_destroy_window(inst->xcb_connection, inst->xcb_window); xcb_disconnect(inst->xcb_connection); - free(inst->xcb_wm_delete_window); } #endif //VK_USE_PLATFORM_XCB_KHR //----------------------------------------------------------- @@ -960,10 +974,7 @@ static void app_create_xlib_window(struct app_instance *inst) { visualInfo->visual, CWBackPixel | CWBorderPixel | CWEventMask | CWColormap, &windowAttributes); - XSelectInput(inst->xlib_display, inst->xlib_window, ExposureMask | KeyPressMask); - XMapWindow(inst->xlib_display, inst->xlib_window); XFlush(inst->xlib_display); - inst->xlib_wm_delete_window = XInternAtom(inst->xlib_display, "WM_DELETE_WINDOW", False); } static void app_create_xlib_surface(struct app_instance *inst, struct app_gpu *gpu) { @@ -974,7 +985,8 @@ static void app_create_xlib_surface(struct app_instance *inst, struct app_gpu *g createInfo.flags = 0; createInfo.dpy = inst->xlib_display; createInfo.window = inst->xlib_window; - err = vkCreateXlibSurfaceKHR(inst->instance, &createInfo, NULL, &inst->surface); assert(!err); + err = vkCreateXlibSurfaceKHR(inst->instance, &createInfo, NULL, &inst->surface); + assert(!err); } static void app_destroy_xlib_window(struct app_instance *inst) { @@ -988,9 +1000,11 @@ static int app_dump_surface_formats(struct app_instance *inst, struct app_gpu *g // Get the list of VkFormat's that are supported: VkResult U_ASSERT_ONLY err; uint32_t formatCount=0; - err = inst->vkGetPhysicalDeviceSurfaceFormatsKHR(gpu->obj, inst->surface, &formatCount, NULL); assert(!err); + err = inst->vkGetPhysicalDeviceSurfaceFormatsKHR(gpu->obj, inst->surface, &formatCount, NULL); + assert(!err); VkSurfaceFormatKHR *surfFormats = (VkSurfaceFormatKHR *)malloc(formatCount * sizeof(VkSurfaceFormatKHR)); - err = inst->vkGetPhysicalDeviceSurfaceFormatsKHR(gpu->obj, inst->surface, &formatCount, surfFormats); assert(!err); + err = inst->vkGetPhysicalDeviceSurfaceFormatsKHR(gpu->obj, inst->surface, &formatCount, surfFormats); + assert(!err); printf("Format count = %d\n",formatCount); uint32_t i; for(i=0;iqueueFlags & VK_QUEUE_COMPUTE_BIT ) { printf("%sCOMPUTE" ,sep); sep=" | "; } - if(props->queueFlags & VK_QUEUE_TRANSFER_BIT) { printf("%sTRANSFER",sep); sep=" | "; } - if(props->queueFlags & VK_QUEUE_SPARSE_BINDING_BIT){ printf("%sSPARSE" ,sep); } + if (props->queueFlags & VK_QUEUE_GRAPHICS_BIT) { + printf("GRAPHICS"); + sep = " | "; + } + if (props->queueFlags & VK_QUEUE_COMPUTE_BIT) { + printf("%sCOMPUTE", sep); + sep = " | "; + } + if (props->queueFlags & VK_QUEUE_TRANSFER_BIT) { + printf("%sTRANSFER", sep); + sep = " | "; + } + if (props->queueFlags & VK_QUEUE_SPARSE_BINDING_BIT) { + printf("%sSPARSE", sep); + } printf("\n"); printf("\tqueueCount = %u\n", props->queueCount); @@ -1330,30 +1355,35 @@ static void app_gpu_dump_memory_props(const struct app_gpu *gpu) { for (uint32_t i = 0; i < props->memoryTypeCount; i++) { printf("\tmemoryTypes[%u] : \n", i); printf("\t\theapIndex = %u\n", props->memoryTypes[i].heapIndex); - printf("\t\tpropertyFlags = 0x%" PRIxLEAST32 ":\n", props->memoryTypes[i].propertyFlags); - - //Print each named flag, if it is set. - VkFlags flags=props->memoryTypes[i].propertyFlags; -#define PRINT_FLAG(FLAG) if(flags & FLAG) printf("\t\t\t"#FLAG"\n"); + printf("\t\tpropertyFlags = 0x%" PRIxLEAST32 ":\n", + props->memoryTypes[i].propertyFlags); + + // Print each named flag, if it is set. + VkFlags flags = props->memoryTypes[i].propertyFlags; +#define PRINT_FLAG(FLAG) \ + if (flags & FLAG) \ + printf("\t\t\t" #FLAG "\n"); PRINT_FLAG(VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) PRINT_FLAG(VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) PRINT_FLAG(VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) PRINT_FLAG(VK_MEMORY_PROPERTY_HOST_CACHED_BIT) PRINT_FLAG(VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) -#undef PRINT_FLAG - +#undef PRINT_FLAG } printf("\n"); printf("\tmemoryHeapCount = %u\n", props->memoryHeapCount); for (uint32_t i = 0; i < props->memoryHeapCount; i++) { printf("\tmemoryHeaps[%u] : \n", i); const VkDeviceSize memSize = props->memoryHeaps[i].size; - printf("\t\tsize = " PRINTF_SIZE_T_SPECIFIER " (0x%" PRIxLEAST64 ")\n", + printf("\t\tsize = " PRINTF_SIZE_T_SPECIFIER + " (0x%" PRIxLEAST64 ")\n", (size_t)memSize, memSize); - VkMemoryHeapFlags heapFlags=props->memoryHeaps[i].flags; + VkMemoryHeapFlags heapFlags = props->memoryHeaps[i].flags; printf("\t\tflags: \n\t\t\t"); - printf((heapFlags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) ? "VK_MEMORY_HEAP_DEVICE_LOCAL_BIT\n" : "None\n"); + printf((heapFlags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) + ? "VK_MEMORY_HEAP_DEVICE_LOCAL_BIT\n" + : "None\n"); } fflush(stdout); } @@ -1411,8 +1441,7 @@ static void ConsoleEnlarge() { // make the console window bigger CONSOLE_SCREEN_BUFFER_INFO csbi; COORD bufferSize; - if (GetConsoleScreenBufferInfo(consoleHandle, &csbi)) - { + if (GetConsoleScreenBufferInfo(consoleHandle, &csbi)) { bufferSize.X = csbi.dwSize.X + 30; bufferSize.Y = 20000; SetConsoleScreenBufferSize(consoleHandle, bufferSize); @@ -1499,48 +1528,49 @@ int main(int argc, char **argv) { printf("Presentable Surface formats:\n"); printf("============================\n"); - inst.width =256; - inst.height=256; - int formatCount=0; + inst.width = 256; + inst.height = 256; + int formatCount = 0; - //--WIN32-- +//--WIN32-- #ifdef VK_USE_PLATFORM_WIN32_KHR app_create_win32_window(&inst); for (i = 0; i < gpu_count; i++) { app_create_win32_surface(&inst, &gpus[i]); printf("GPU id : %u (%s)\n", i, gpus[i].props.deviceName); printf("Surface type : %s\n", VK_KHR_WIN32_SURFACE_EXTENSION_NAME); - formatCount+=app_dump_surface_formats(&inst, &gpus[i]); + formatCount += app_dump_surface_formats(&inst, &gpus[i]); app_destroy_surface(&inst); } app_destroy_win32_window(&inst); #endif - //--XCB-- +//--XCB-- #ifdef VK_USE_PLATFORM_XCB_KHR app_create_xcb_window(&inst); - for (i = 0; i < gpu_count; i++){ - app_create_xcb_surface(&inst,&gpus[i]); + for (i = 0; i < gpu_count; i++) { + app_create_xcb_surface(&inst, &gpus[i]); printf("GPU id : %u (%s)\n", i, gpus[i].props.deviceName); - printf("Surface type : %s\n" ,VK_KHR_XCB_SURFACE_EXTENSION_NAME); - formatCount+=app_dump_surface_formats(&inst,&gpus[i]); + printf("Surface type : %s\n", VK_KHR_XCB_SURFACE_EXTENSION_NAME); + formatCount += app_dump_surface_formats(&inst, &gpus[i]); app_destroy_surface(&inst); } app_destroy_xcb_window(&inst); #endif - //--XLIB-- +//--XLIB-- #ifdef VK_USE_PLATFORM_XLIB_KHR app_create_xlib_window(&inst); - for (i = 0; i < gpu_count; i++){ - app_create_xlib_surface(&inst,&gpus[i]); + for (i = 0; i < gpu_count; i++) { + app_create_xlib_surface(&inst, &gpus[i]); printf("GPU id : %u (%s)\n", i, gpus[i].props.deviceName); - printf("Surface type : %s\n" ,VK_KHR_XLIB_SURFACE_EXTENSION_NAME); - formatCount+=app_dump_surface_formats(&inst,&gpus[i]); + printf("Surface type : %s\n", VK_KHR_XLIB_SURFACE_EXTENSION_NAME); + formatCount += app_dump_surface_formats(&inst, &gpus[i]); app_destroy_surface(&inst); } app_destroy_xlib_window(&inst); #endif - //TODO: Android / Wayland / MIR - if (!formatCount) printf("None found\n"); + // TODO: Android / Wayland / MIR + if (!formatCount) + printf("None found\n"); //--------- for (i = 0; i < gpu_count; i++) -- cgit v1.2.3 From 79c6085f476743a1f59f3059b2e976e81a8f51c4 Mon Sep 17 00:00:00 2001 From: Rene Lindsay Date: Fri, 10 Jun 2016 16:56:01 -0600 Subject: Removed some window event handling code. Change-Id: I5ef0862326d9a7ce4e59fe7c8947b532f252d604 --- demos/vulkaninfo.c | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/demos/vulkaninfo.c b/demos/vulkaninfo.c index e646a8a8..58fd6a31 100644 --- a/demos/vulkaninfo.c +++ b/demos/vulkaninfo.c @@ -804,17 +804,6 @@ static void app_gpu_destroy(struct app_gpu *gpu) { // MS-Windows event handling function: LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { - switch (uMsg) { - case WM_CLOSE: - PostQuitMessage(WM_QUIT); - break; - case WM_PAINT: - break; - case WM_SIZE: - break; - default: - break; - } return (DefWindowProc(hWnd, uMsg, wParam, lParam)); } -- cgit v1.2.3 From 39544f0aa4f0892f8da6bfd158afadfb2f9febb9 Mon Sep 17 00:00:00 2001 From: Rene Lindsay Date: Fri, 10 Jun 2016 16:25:55 -0700 Subject: Added {} to if statements. Change-Id: I5ef0862326d9a7ce4e59fe7c8947b532f252d604 --- demos/vulkaninfo.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/demos/vulkaninfo.c b/demos/vulkaninfo.c index 58fd6a31..aaec8584 100644 --- a/demos/vulkaninfo.c +++ b/demos/vulkaninfo.c @@ -647,7 +647,7 @@ static void app_create_instance(struct app_instance *inst) { for (i = 0; (i < inst->global_extension_count); i++) { const char *found_name = inst->global_extensions[i].extensionName; if (!strcmp(VK_KHR_SURFACE_EXTENSION_NAME, found_name)) - ext_names[ext_count++] = VK_KHR_SURFACE_EXTENSION_NAME; + {ext_names[ext_count++] = VK_KHR_SURFACE_EXTENSION_NAME;} } if (ext_count) @@ -657,19 +657,19 @@ static void app_create_instance(struct app_instance *inst) { const char *found_name = inst->global_extensions[i].extensionName; #ifdef VK_USE_PLATFORM_WIN32_KHR if (!strcmp(VK_KHR_WIN32_SURFACE_EXTENSION_NAME, found_name)) - ext_names[ext_count++] = VK_KHR_WIN32_SURFACE_EXTENSION_NAME; + {ext_names[ext_count++] = VK_KHR_WIN32_SURFACE_EXTENSION_NAME;} #endif #ifdef VK_USE_PLATFORM_XCB_KHR if (!strcmp(VK_KHR_XCB_SURFACE_EXTENSION_NAME, found_name)) - ext_names[ext_count++] = VK_KHR_XCB_SURFACE_EXTENSION_NAME; + {ext_names[ext_count++] = VK_KHR_XCB_SURFACE_EXTENSION_NAME;} #endif #ifdef VK_USE_PLATFORM_XLIB_KHR if (!strcmp(VK_KHR_XLIB_SURFACE_EXTENSION_NAME, found_name)) - ext_names[ext_count++] = VK_KHR_XLIB_SURFACE_EXTENSION_NAME; + {ext_names[ext_count++] = VK_KHR_XLIB_SURFACE_EXTENSION_NAME;} #endif #ifdef VK_USE_PLATFORM_ANDROID_KHR if (!strcmp(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, found_name)) - ext_names[ext_count++] = VK_KHR_ANDROID_SURFACE_EXTENSION_NAME; + {ext_names[ext_count++] = VK_KHR_ANDROID_SURFACE_EXTENSION_NAME;} #endif } // If we don't find the KHR_SURFACE extension and at least one other -- cgit v1.2.3 From a83badf2a2827ebebe0d1ae31f29fe5444c0e513 Mon Sep 17 00:00:00 2001 From: Jon Ashburn Date: Mon, 13 Jun 2016 13:31:32 -0600 Subject: loader: Fix build warning on windows Don't use default library for libcmt. Change-Id: I68c0f629044713c0c875758af9a0a1dd345dad75 --- loader/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/loader/CMakeLists.txt b/loader/CMakeLists.txt index 15577b8a..da091810 100644 --- a/loader/CMakeLists.txt +++ b/loader/CMakeLists.txt @@ -59,7 +59,7 @@ if (WIN32) add_library(loader-opt OBJECT ${OPT_LOADER_SRCS}) target_compile_options(loader-opt PUBLIC "$<$:${LOCAL_C_FLAGS_REL}>") add_library(vulkan-${MAJOR} SHARED $ $ ${CMAKE_CURRENT_BINARY_DIR}/vulkan-${MAJOR}.def ${CMAKE_CURRENT_SOURCE_DIR}/loader.rc) - set_target_properties(vulkan-${MAJOR} PROPERTIES LINK_FLAGS "/DEF:${CMAKE_CURRENT_BINARY_DIR}/vulkan-${MAJOR}.def") + set_target_properties(vulkan-${MAJOR} PROPERTIES LINK_FLAGS "/DEF:${CMAKE_CURRENT_BINARY_DIR}/vulkan-${MAJOR}.def /nodefaultlib:libcmt") add_library(VKstatic.${MAJOR} STATIC $ $) set_target_properties(VKstatic.${MAJOR} PROPERTIES OUTPUT_NAME VKstatic.${MAJOR}) target_link_libraries(vulkan-${MAJOR} shlwapi) -- cgit v1.2.3 From 4031bab35321bf108a4eb2224633b29f292f55e1 Mon Sep 17 00:00:00 2001 From: Jon Ashburn Date: Mon, 13 Jun 2016 14:02:13 -0600 Subject: Revert "loader: Fix build warning on windows" This reverts commit 27a58419aab1bd62201e00ea5a6d822b65f99fa3. --- loader/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/loader/CMakeLists.txt b/loader/CMakeLists.txt index da091810..15577b8a 100644 --- a/loader/CMakeLists.txt +++ b/loader/CMakeLists.txt @@ -59,7 +59,7 @@ if (WIN32) add_library(loader-opt OBJECT ${OPT_LOADER_SRCS}) target_compile_options(loader-opt PUBLIC "$<$:${LOCAL_C_FLAGS_REL}>") add_library(vulkan-${MAJOR} SHARED $ $ ${CMAKE_CURRENT_BINARY_DIR}/vulkan-${MAJOR}.def ${CMAKE_CURRENT_SOURCE_DIR}/loader.rc) - set_target_properties(vulkan-${MAJOR} PROPERTIES LINK_FLAGS "/DEF:${CMAKE_CURRENT_BINARY_DIR}/vulkan-${MAJOR}.def /nodefaultlib:libcmt") + set_target_properties(vulkan-${MAJOR} PROPERTIES LINK_FLAGS "/DEF:${CMAKE_CURRENT_BINARY_DIR}/vulkan-${MAJOR}.def") add_library(VKstatic.${MAJOR} STATIC $ $) set_target_properties(VKstatic.${MAJOR} PROPERTIES OUTPUT_NAME VKstatic.${MAJOR}) target_link_libraries(vulkan-${MAJOR} shlwapi) -- cgit v1.2.3 From 942d559f93afff87ad04ad7515e9843284f72903 Mon Sep 17 00:00:00 2001 From: Jon Ashburn Date: Mon, 13 Jun 2016 14:10:18 -0600 Subject: misc: Update to Vulkan header version 16 Only change is the addition of AMD extensions. Change-Id: Ia4270600247b2e3f406cdac0cfff3492ec1ce109 --- include/vulkan/vulkan.h | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/include/vulkan/vulkan.h b/include/vulkan/vulkan.h index 2f180768..75afd4a7 100644 --- a/include/vulkan/vulkan.h +++ b/include/vulkan/vulkan.h @@ -43,7 +43,7 @@ extern "C" { #define VK_VERSION_MINOR(version) (((uint32_t)(version) >> 12) & 0x3ff) #define VK_VERSION_PATCH(version) ((uint32_t)(version) & 0xfff) // Version of this file -#define VK_HEADER_VERSION 13 +#define VK_HEADER_VERSION 16 #define VK_NULL_HANDLE 0 @@ -3855,6 +3855,16 @@ typedef struct VkPipelineRasterizationStateRasterizationOrderAMD { +#define VK_AMD_shader_trinary_minmax 1 +#define VK_AMD_SHADER_TRINARY_MINMAX_SPEC_VERSION 1 +#define VK_AMD_SHADER_TRINARY_MINMAX_EXTENSION_NAME "VK_AMD_shader_trinary_minmax" + + +#define VK_AMD_shader_explicit_vertex_parameter 1 +#define VK_AMD_SHADER_EXPLICIT_VERTEX_PARAMETER_SPEC_VERSION 1 +#define VK_AMD_SHADER_EXPLICIT_VERTEX_PARAMETER_EXTENSION_NAME "VK_AMD_shader_explicit_vertex_parameter" + + #define VK_EXT_debug_marker 1 #define VK_EXT_DEBUG_MARKER_SPEC_VERSION 3 #define VK_EXT_DEBUG_MARKER_EXTENSION_NAME "VK_EXT_debug_marker" @@ -3912,6 +3922,11 @@ VKAPI_ATTR void VKAPI_CALL vkCmdDebugMarkerInsertEXT( VkDebugMarkerMarkerInfoEXT* pMarkerInfo); #endif +#define VK_AMD_gcn_shader 1 +#define VK_AMD_GCN_SHADER_SPEC_VERSION 1 +#define VK_AMD_GCN_SHADER_EXTENSION_NAME "VK_AMD_gcn_shader" + + #ifdef __cplusplus } #endif -- cgit v1.2.3 From 1eb1d75abe0ac5bbbd601805643dde1c42e94e60 Mon Sep 17 00:00:00 2001 From: Jon Ashburn Date: Mon, 13 Jun 2016 14:13:39 -0600 Subject: layers: Update manifest files for vers 1.0.16 Change-Id: I7468c088d99f7bebabc05d1a84529f6e9e00d424 --- layers/linux/VkLayer_core_validation.json | 2 +- layers/linux/VkLayer_device_limits.json | 2 +- layers/linux/VkLayer_image.json | 2 +- layers/linux/VkLayer_object_tracker.json | 2 +- layers/linux/VkLayer_parameter_validation.json | 2 +- layers/linux/VkLayer_swapchain.json | 2 +- layers/linux/VkLayer_threading.json | 2 +- layers/linux/VkLayer_unique_objects.json | 2 +- layers/windows/VkLayer_core_validation.json | 2 +- layers/windows/VkLayer_device_limits.json | 2 +- layers/windows/VkLayer_image.json | 2 +- layers/windows/VkLayer_object_tracker.json | 2 +- layers/windows/VkLayer_parameter_validation.json | 2 +- layers/windows/VkLayer_swapchain.json | 2 +- layers/windows/VkLayer_threading.json | 2 +- layers/windows/VkLayer_unique_objects.json | 2 +- 16 files changed, 16 insertions(+), 16 deletions(-) diff --git a/layers/linux/VkLayer_core_validation.json b/layers/linux/VkLayer_core_validation.json index 1d8d305b..4a831d71 100644 --- a/layers/linux/VkLayer_core_validation.json +++ b/layers/linux/VkLayer_core_validation.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_core_validation", "type": "GLOBAL", "library_path": "./libVkLayer_core_validation.so", - "api_version": "1.0.13", + "api_version": "1.0.16", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff --git a/layers/linux/VkLayer_device_limits.json b/layers/linux/VkLayer_device_limits.json index 6aab8a24..f08813b9 100644 --- a/layers/linux/VkLayer_device_limits.json +++ b/layers/linux/VkLayer_device_limits.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_device_limits", "type": "GLOBAL", "library_path": "./libVkLayer_device_limits.so", - "api_version": "1.0.13", + "api_version": "1.0.16", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff --git a/layers/linux/VkLayer_image.json b/layers/linux/VkLayer_image.json index 125e3fc3..1ab9b4d7 100644 --- a/layers/linux/VkLayer_image.json +++ b/layers/linux/VkLayer_image.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_image", "type": "GLOBAL", "library_path": "./libVkLayer_image.so", - "api_version": "1.0.13", + "api_version": "1.0.16", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff --git a/layers/linux/VkLayer_object_tracker.json b/layers/linux/VkLayer_object_tracker.json index e778c640..78ba294e 100644 --- a/layers/linux/VkLayer_object_tracker.json +++ b/layers/linux/VkLayer_object_tracker.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_object_tracker", "type": "GLOBAL", "library_path": "./libVkLayer_object_tracker.so", - "api_version": "1.0.13", + "api_version": "1.0.16", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff --git a/layers/linux/VkLayer_parameter_validation.json b/layers/linux/VkLayer_parameter_validation.json index ba1f151b..8f91928c 100644 --- a/layers/linux/VkLayer_parameter_validation.json +++ b/layers/linux/VkLayer_parameter_validation.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_parameter_validation", "type": "GLOBAL", "library_path": "./libVkLayer_parameter_validation.so", - "api_version": "1.0.13", + "api_version": "1.0.16", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff --git a/layers/linux/VkLayer_swapchain.json b/layers/linux/VkLayer_swapchain.json index 059c028a..4064f7f3 100644 --- a/layers/linux/VkLayer_swapchain.json +++ b/layers/linux/VkLayer_swapchain.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_swapchain", "type": "GLOBAL", "library_path": "./libVkLayer_swapchain.so", - "api_version": "1.0.13", + "api_version": "1.0.16", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff --git a/layers/linux/VkLayer_threading.json b/layers/linux/VkLayer_threading.json index 6b7ba32f..18dad2b3 100644 --- a/layers/linux/VkLayer_threading.json +++ b/layers/linux/VkLayer_threading.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_GOOGLE_threading", "type": "GLOBAL", "library_path": "./libVkLayer_threading.so", - "api_version": "1.0.13", + "api_version": "1.0.16", "implementation_version": "1", "description": "Google Validation Layer", "instance_extensions": [ diff --git a/layers/linux/VkLayer_unique_objects.json b/layers/linux/VkLayer_unique_objects.json index 8901ebd1..0dae1337 100644 --- a/layers/linux/VkLayer_unique_objects.json +++ b/layers/linux/VkLayer_unique_objects.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_GOOGLE_unique_objects", "type": "GLOBAL", "library_path": "./libVkLayer_unique_objects.so", - "api_version": "1.0.13", + "api_version": "1.0.16", "implementation_version": "1", "description": "Google Validation Layer" } diff --git a/layers/windows/VkLayer_core_validation.json b/layers/windows/VkLayer_core_validation.json index e58dc0a8..bbb38aae 100644 --- a/layers/windows/VkLayer_core_validation.json +++ b/layers/windows/VkLayer_core_validation.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_core_validation", "type": "GLOBAL", "library_path": ".\\VkLayer_core_validation.dll", - "api_version": "1.0.13", + "api_version": "1.0.16", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff --git a/layers/windows/VkLayer_device_limits.json b/layers/windows/VkLayer_device_limits.json index 18e5212d..e5e437de 100644 --- a/layers/windows/VkLayer_device_limits.json +++ b/layers/windows/VkLayer_device_limits.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_device_limits", "type": "GLOBAL", "library_path": ".\\VkLayer_device_limits.dll", - "api_version": "1.0.13", + "api_version": "1.0.16", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff --git a/layers/windows/VkLayer_image.json b/layers/windows/VkLayer_image.json index a8983176..39b7d238 100644 --- a/layers/windows/VkLayer_image.json +++ b/layers/windows/VkLayer_image.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_image", "type": "GLOBAL", "library_path": ".\\VkLayer_image.dll", - "api_version": "1.0.13", + "api_version": "1.0.16", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff --git a/layers/windows/VkLayer_object_tracker.json b/layers/windows/VkLayer_object_tracker.json index afe36bb1..7cb22f90 100644 --- a/layers/windows/VkLayer_object_tracker.json +++ b/layers/windows/VkLayer_object_tracker.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_object_tracker", "type": "GLOBAL", "library_path": ".\\VkLayer_object_tracker.dll", - "api_version": "1.0.13", + "api_version": "1.0.16", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff --git a/layers/windows/VkLayer_parameter_validation.json b/layers/windows/VkLayer_parameter_validation.json index b946ba24..72c5cb6f 100644 --- a/layers/windows/VkLayer_parameter_validation.json +++ b/layers/windows/VkLayer_parameter_validation.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_parameter_validation", "type": "GLOBAL", "library_path": ".\\VkLayer_parameter_validation.dll", - "api_version": "1.0.13", + "api_version": "1.0.16", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff --git a/layers/windows/VkLayer_swapchain.json b/layers/windows/VkLayer_swapchain.json index 415146ad..a93b5da0 100644 --- a/layers/windows/VkLayer_swapchain.json +++ b/layers/windows/VkLayer_swapchain.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_LUNARG_swapchain", "type": "GLOBAL", "library_path": ".\\VkLayer_swapchain.dll", - "api_version": "1.0.13", + "api_version": "1.0.16", "implementation_version": "1", "description": "LunarG Validation Layer", "instance_extensions": [ diff --git a/layers/windows/VkLayer_threading.json b/layers/windows/VkLayer_threading.json index 206a2463..53e96e26 100644 --- a/layers/windows/VkLayer_threading.json +++ b/layers/windows/VkLayer_threading.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_GOOGLE_threading", "type": "GLOBAL", "library_path": ".\\VkLayer_threading.dll", - "api_version": "1.0.13", + "api_version": "1.0.16", "implementation_version": "1", "description": "Google Validation Layer", "instance_extensions": [ diff --git a/layers/windows/VkLayer_unique_objects.json b/layers/windows/VkLayer_unique_objects.json index 3e0c47af..bdcde04f 100644 --- a/layers/windows/VkLayer_unique_objects.json +++ b/layers/windows/VkLayer_unique_objects.json @@ -4,7 +4,7 @@ "name": "VK_LAYER_GOOGLE_unique_objects", "type": "GLOBAL", "library_path": ".\\VkLayer_unique_objects.dll", - "api_version": "1.0.13", + "api_version": "1.0.16", "implementation_version": "1", "description": "Google Validation Layer" } -- cgit v1.2.3 From 7fc7916db5da17cb54667dcd1630eca9d58e860e Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Wed, 8 Jun 2016 09:51:34 +1200 Subject: layers: remove tracking of last queue and fence for CB Unused. Signed-off-by: Chris Forbes --- layers/core_validation.cpp | 4 ---- layers/core_validation_types.h | 2 -- 2 files changed, 6 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 949276b6..07f151db 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -3675,8 +3675,6 @@ static void resetCB(layer_data *dev_data, const VkCommandBuffer cb) { pCB->activeRenderPass = nullptr; pCB->activeSubpassContents = VK_SUBPASS_CONTENTS_INLINE; pCB->activeSubpass = 0; - pCB->lastSubmittedFence = VK_NULL_HANDLE; - pCB->lastSubmittedQueue = VK_NULL_HANDLE; pCB->destroyedSets.clear(); pCB->updatedSets.clear(); pCB->destroyedFramebuffers.clear(); @@ -4582,8 +4580,6 @@ QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, V if (pCBNode) { pCBNode->semaphores = semaphoreList; pCBNode->submitCount++; // increment submit count - pCBNode->lastSubmittedFence = fence; - pCBNode->lastSubmittedQueue = queue; skipCall |= validatePrimaryCommandBufferState(dev_data, pCBNode); // Call submit-time functions to validate/update state for (auto &function : pCBNode->validate_functions) { diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index ce51dba4..7fef3e3c 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -441,8 +441,6 @@ struct GLOBAL_CB_NODE : public BASE_NODE { std::vector scissors; VkRenderPassBeginInfo activeRenderPassBeginInfo; uint64_t fenceId; - VkFence lastSubmittedFence; - VkQueue lastSubmittedQueue; RENDER_PASS_NODE *activeRenderPass; VkSubpassContents activeSubpassContents; uint32_t activeSubpass; -- cgit v1.2.3 From 0b9a307ebeeaa0e9ae1fec5416b25c55b58e7025 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Thu, 9 Jun 2016 09:40:55 +1200 Subject: layers: Remove dead fence members from GLOBAL_CB_NODE Signed-off-by: Chris Forbes --- layers/core_validation_types.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index 7fef3e3c..677c7b9b 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -423,7 +423,6 @@ struct GLOBAL_CB_NODE : public BASE_NODE { VkCommandBufferAllocateInfo createInfo; VkCommandBufferBeginInfo beginInfo; VkCommandBufferInheritanceInfo inheritanceInfo; - // VkFence fence; // fence tracking this cmd buffer VkDevice device; // device this CB belongs to uint64_t numCmds; // number of cmds in this CB uint64_t drawCount[NUM_DRAW_TYPES]; // Count of each type of draw in this CB @@ -440,7 +439,6 @@ struct GLOBAL_CB_NODE : public BASE_NODE { std::vector viewports; std::vector scissors; VkRenderPassBeginInfo activeRenderPassBeginInfo; - uint64_t fenceId; RENDER_PASS_NODE *activeRenderPass; VkSubpassContents activeSubpassContents; uint32_t activeSubpass; @@ -481,6 +479,7 @@ struct GLOBAL_CB_NODE : public BASE_NODE { ~GLOBAL_CB_NODE(); }; + // Fwd declarations of layer_data and helpers to look-up state from layer_data maps namespace core_validation { struct layer_data; -- cgit v1.2.3 From b1e628eccd9de88fa4ff46f7d104c41982f8cadc Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Fri, 10 Jun 2016 10:06:42 +1200 Subject: layers: Unify fence checks for queue functions Signed-off-by: Chris Forbes --- layers/core_validation.cpp | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 07f151db..01c125fd 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -4506,19 +4506,18 @@ static bool validatePrimaryCommandBufferState(layer_data *dev_data, GLOBAL_CB_NO return skipCall; } -VKAPI_ATTR VkResult VKAPI_CALL -QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) { +static bool +ValidateFenceForSubmit(layer_data *dev_data, VkFence fence) +{ bool skipCall = false; - layer_data *dev_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map); - VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; - std::unique_lock lock(global_lock); - // First verify that fence is not in use + if (fence != VK_NULL_HANDLE) { - if ((submitCount != 0) && dev_data->fenceMap[fence].in_use.load()) { + if (dev_data->fenceMap[fence].in_use.load()) { skipCall |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, (uint64_t)(fence), __LINE__, DRAWSTATE_INVALID_FENCE, "DS", "Fence 0x%" PRIx64 " is already in use by another submission.", (uint64_t)(fence)); } + if (!dev_data->fenceMap[fence].needsSignaled) { skipCall |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, reinterpret_cast(fence), __LINE__, MEMTRACK_INVALID_FENCE_STATE, "MEM", @@ -4526,6 +4525,19 @@ QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, V reinterpret_cast(fence)); } } + + return skipCall; +} + +VKAPI_ATTR VkResult VKAPI_CALL +QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) { + bool skipCall = false; + layer_data *dev_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map); + VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; + std::unique_lock lock(global_lock); + + skipCall |= ValidateFenceForSubmit(dev_data, fence); + // TODO : Review these old print functions and clean up as appropriate print_mem_list(dev_data); printCBList(dev_data); @@ -9548,21 +9560,8 @@ QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *p bool skip_call = false; std::unique_lock lock(global_lock); // First verify that fence is not in use + skip_call |= ValidateFenceForSubmit(dev_data, fence); if (fence != VK_NULL_HANDLE) { - auto fence_data = dev_data->fenceMap.find(fence); - if ((bindInfoCount != 0) && fence_data->second.in_use.load()) { - skip_call |= - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, - reinterpret_cast(fence), __LINE__, DRAWSTATE_INVALID_FENCE, "DS", - "Fence 0x%" PRIx64 " is already in use by another submission.", reinterpret_cast(fence)); - } - if (!fence_data->second.needsSignaled) { - skip_call |= - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, - reinterpret_cast(fence), __LINE__, MEMTRACK_INVALID_FENCE_STATE, "MEM", - "Fence 0x%" PRIxLEAST64 " submitted in SIGNALED state. Fences must be reset before being submitted", - reinterpret_cast(fence)); - } trackCommandBuffers(dev_data, queue, 0, nullptr, fence); } for (uint32_t bindIdx = 0; bindIdx < bindInfoCount; ++bindIdx) { -- cgit v1.2.3 From a9b79da4048679b03b077d7723df3bb48cf0ca44 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Fri, 10 Jun 2016 12:43:13 +1200 Subject: layers: Add CB_SUBMISSION struct Signed-off-by: Chris Forbes --- layers/core_validation_types.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index 677c7b9b..25d1e8cb 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -480,6 +480,14 @@ struct GLOBAL_CB_NODE : public BASE_NODE { ~GLOBAL_CB_NODE(); }; +struct CB_SUBMISSION { + CB_SUBMISSION(VkCommandBuffer cb, std::vector const & semaphores) + : cb(cb), semaphores(semaphores) {} + + VkCommandBuffer cb; + std::vector semaphores; +}; + // Fwd declarations of layer_data and helpers to look-up state from layer_data maps namespace core_validation { struct layer_data; -- cgit v1.2.3 From 20f5d77ec2df63f69c818afad21b21f94f537701 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Fri, 10 Jun 2016 15:21:43 +1200 Subject: layers: Add helpers for getting fence and queue nodes Signed-off-by: Chris Forbes --- layers/core_validation.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 01c125fd..1ebd4a51 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -318,6 +318,22 @@ VkBufferViewCreateInfo *getBufferViewInfo(const layer_data *my_data, VkBufferVie return bv_it->second.get(); } +FENCE_NODE *getFenceNode(layer_data *dev_data, VkFence fence) { + auto it = dev_data->fenceMap.find(fence); + if (it == dev_data->fenceMap.end()) { + return nullptr; + } + return &it->second; +} + +QUEUE_NODE *getQueueNode(layer_data *dev_data, VkQueue queue) { + auto it = dev_data->queueMap.find(queue); + if (it == dev_data->queueMap.end()) { + return nullptr; + } + return &it->second; +} + static VkDeviceMemory *get_object_mem_binding(layer_data *my_data, uint64_t handle, VkDebugReportObjectTypeEXT type) { switch (type) { case VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT: { -- cgit v1.2.3 From 9d7cfa74ea05b82310bf89b2dec24782e04f0fb9 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Fri, 10 Jun 2016 15:22:37 +1200 Subject: layers: Add members to FENCE_NODE and QUEUE_NODE to hold the handles We'd like to be able to get back to them from the tracking struct. Signed-off-by: Chris Forbes --- layers/core_validation.cpp | 2 ++ layers/core_validation.h | 2 ++ 2 files changed, 4 insertions(+) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 1ebd4a51..7dbbd343 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -4841,6 +4841,7 @@ VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyI auto result = dev_data->queues.emplace(*pQueue); if (result.second == true) { QUEUE_NODE *pQNode = &dev_data->queueMap[*pQueue]; + pQNode->queue = *pQueue; pQNode->device = device; } } @@ -5593,6 +5594,7 @@ CreateFence(VkDevice device, const VkFenceCreateInfo *pCreateInfo, const VkAlloc if (VK_SUCCESS == result) { std::lock_guard lock(global_lock); auto &fence_node = dev_data->fenceMap[*pFence]; + fence_node.fence = *pFence; fence_node.createInfo = *pCreateInfo; fence_node.needsSignaled = true; if (pCreateInfo->flags & VK_FENCE_CREATE_SIGNALED_BIT) { diff --git a/layers/core_validation.h b/layers/core_validation.h index 00420e48..26c3edc9 100644 --- a/layers/core_validation.h +++ b/layers/core_validation.h @@ -212,6 +212,7 @@ class FENCE_NODE : public BASE_NODE { public: using BASE_NODE::in_use; + VkFence fence; VkSwapchainKHR swapchain; // Swapchain that this fence is submitted against or NULL bool firstTimeFlag; // Fence was created in signaled state, avoid warnings for first use VkFenceCreateInfo createInfo; @@ -241,6 +242,7 @@ class EVENT_NODE : public BASE_NODE { class QUEUE_NODE { public: + VkQueue queue; VkDevice device; std::vector lastFences; #if MTMERGE -- cgit v1.2.3 From 33f842e263f11cbfd6211f0188a8c4b4dfd76da6 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Fri, 10 Jun 2016 15:25:12 +1200 Subject: layers: Note broken behavior around stealing tracking from other queues Signed-off-by: Chris Forbes --- layers/core_validation.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 7dbbd343..779addb7 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -4305,6 +4305,12 @@ static void updateTrackedCommandBuffers(layer_data *dev_data, VkQueue queue, VkQ fence_node->second.queues.insert(other_queue_data->first); } } + // TODO: Stealing the untracked CBs out of the signaling queue isn't really + // correct. A subsequent submission + wait, or a QWI on that queue, or + // another semaphore dependency to a third queue may /all/ provide + // suitable proof that the work we're stealing here has completed on the + // device, but we've lost that information by moving the tracking between + // queues. if (fence != VK_NULL_HANDLE) { auto fence_data = dev_data->fenceMap.find(fence); if (fence_data == dev_data->fenceMap.end()) { -- cgit v1.2.3 From f2ccbd9add820c5cba7c5a2e1e5aa8c85997053d Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Fri, 10 Jun 2016 15:25:45 +1200 Subject: layers: Fix mistracking of semaphores associated with submissions When a command buffer is simultaneously inflight multiple times, each can have different semaphores associated. Storing the set of semaphores on the GLOBAL_CB_NODE caused us to get confused and emit bogus errors. Signed-off-by: Chris Forbes --- layers/core_validation.cpp | 167 ++++++++++++++++++++--------------------- layers/core_validation.h | 4 +- layers/core_validation_types.h | 1 - 3 files changed, 84 insertions(+), 88 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 779addb7..bfb934d4 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -3695,7 +3695,6 @@ static void resetCB(layer_data *dev_data, const VkCommandBuffer cb) { pCB->updatedSets.clear(); pCB->destroyedFramebuffers.clear(); pCB->waitedEvents.clear(); - pCB->semaphores.clear(); pCB->events.clear(); pCB->waitedEventsBeforeQueryReset.clear(); pCB->queryToStateMap.clear(); @@ -4100,7 +4099,7 @@ static bool ValidateCmdBufImageLayouts(layer_data *dev_data, GLOBAL_CB_NODE *pCB } // Track which resources are in-flight by atomically incrementing their "in_use" count -static bool validateAndIncrementResources(layer_data *my_data, GLOBAL_CB_NODE *pCB) { +static bool validateAndIncrementResources(layer_data *my_data, GLOBAL_CB_NODE *pCB, std::vector const &semaphores) { bool skip_call = false; for (auto drawDataElement : pCB->drawData) { for (auto buffer : drawDataElement.buffers) { @@ -4126,7 +4125,7 @@ static bool validateAndIncrementResources(layer_data *my_data, GLOBAL_CB_NODE *p } } } - for (auto semaphore : pCB->semaphores) { + for (auto semaphore : semaphores) { auto semaphoreNode = my_data->semaphoreMap.find(semaphore); if (semaphoreNode == my_data->semaphoreMap.end()) { skip_call |= @@ -4185,8 +4184,8 @@ static inline void removeInFlightCmdBuffer(layer_data *dev_data, VkCommandBuffer } } -static void decrementResources(layer_data *my_data, VkCommandBuffer cmdBuffer) { - GLOBAL_CB_NODE *pCB = getCBNode(my_data, cmdBuffer); +static void decrementResources(layer_data *my_data, CB_SUBMISSION *submission) { + GLOBAL_CB_NODE *pCB = getCBNode(my_data, submission->cb); for (auto drawDataElement : pCB->drawData) { for (auto buffer : drawDataElement.buffers) { auto buffer_node = getBufferNode(my_data, buffer); @@ -4200,7 +4199,7 @@ static void decrementResources(layer_data *my_data, VkCommandBuffer cmdBuffer) { set->in_use.fetch_sub(1); } } - for (auto semaphore : pCB->semaphores) { + for (auto semaphore : submission->semaphores) { auto semaphoreNode = my_data->semaphoreMap.find(semaphore); if (semaphoreNode != my_data->semaphoreMap.end()) { semaphoreNode->second.in_use.fetch_sub(1); @@ -4241,12 +4240,12 @@ static bool decrementResources(layer_data *my_data, uint32_t fenceCount, const V } decrementResources(my_data, static_cast(fence_data->second.priorFences.size()), fence_data->second.priorFences.data()); - for (auto cmdBuffer : fence_data->second.cmdBuffers) { - decrementResources(my_data, cmdBuffer); - skip_call |= cleanInFlightCmdBuffer(my_data, cmdBuffer); - removeInFlightCmdBuffer(my_data, cmdBuffer); + for (auto & submission : fence_data->second.submissions) { + decrementResources(my_data, &submission); + skip_call |= cleanInFlightCmdBuffer(my_data, submission.cb); + removeInFlightCmdBuffer(my_data, submission.cb); } - fence_data->second.cmdBuffers.clear(); + fence_data->second.submissions.clear(); fence_data->second.priorFences.clear(); } for (auto fence_pair : fence_pairs) { @@ -4273,12 +4272,12 @@ static bool decrementResources(layer_data *my_data, VkQueue queue) { bool skip_call = false; auto queue_data = my_data->queueMap.find(queue); if (queue_data != my_data->queueMap.end()) { - for (auto cmdBuffer : queue_data->second.untrackedCmdBuffers) { - decrementResources(my_data, cmdBuffer); - skip_call |= cleanInFlightCmdBuffer(my_data, cmdBuffer); - removeInFlightCmdBuffer(my_data, cmdBuffer); + for (auto & submission : queue_data->second.untrackedSubmissions) { + decrementResources(my_data, &submission); + skip_call |= cleanInFlightCmdBuffer(my_data, submission.cb); + removeInFlightCmdBuffer(my_data, submission.cb); } - queue_data->second.untrackedCmdBuffers.clear(); + queue_data->second.untrackedSubmissions.clear(); skip_call |= decrementResources(my_data, static_cast(queue_data->second.lastFences.size()), queue_data->second.lastFences.data()); } @@ -4316,15 +4315,15 @@ static void updateTrackedCommandBuffers(layer_data *dev_data, VkQueue queue, VkQ if (fence_data == dev_data->fenceMap.end()) { return; } - for (auto cmdbuffer : other_queue_data->second.untrackedCmdBuffers) { - fence_data->second.cmdBuffers.push_back(cmdbuffer); + for (auto cmdbuffer : other_queue_data->second.untrackedSubmissions) { + fence_data->second.submissions.push_back(cmdbuffer); } - other_queue_data->second.untrackedCmdBuffers.clear(); + other_queue_data->second.untrackedSubmissions.clear(); } else { - for (auto cmdbuffer : other_queue_data->second.untrackedCmdBuffers) { - queue_data->second.untrackedCmdBuffers.push_back(cmdbuffer); + for (auto cmdbuffer : other_queue_data->second.untrackedSubmissions) { + queue_data->second.untrackedSubmissions.push_back(cmdbuffer); } - other_queue_data->second.untrackedCmdBuffers.clear(); + other_queue_data->second.untrackedSubmissions.clear(); } for (auto eventStagePair : other_queue_data->second.eventToStageMap) { queue_data->second.eventToStageMap[eventStagePair.first] = eventStagePair.second; @@ -4342,51 +4341,24 @@ static void updateTrackedCommandBuffers(layer_data *dev_data, VkQueue queue, VkQ // waited on, prior fences on that queue are also considered to have been waited on. When a fence is // waited on (either via a queue, device or fence), we free the cmd buffers for that fence and // recursively call with the prior fences. -static void trackCommandBuffers(layer_data *my_data, VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, - VkFence fence) { - auto queue_data = my_data->queueMap.find(queue); - if (fence != VK_NULL_HANDLE) { - vector prior_fences; - auto fence_data = my_data->fenceMap.find(fence); - if (fence_data == my_data->fenceMap.end()) { - return; - } - fence_data->second.cmdBuffers.clear(); - if (queue_data != my_data->queueMap.end()) { - prior_fences = queue_data->second.lastFences; - queue_data->second.lastFences.clear(); - queue_data->second.lastFences.push_back(fence); - for (auto cmdbuffer : queue_data->second.untrackedCmdBuffers) { - fence_data->second.cmdBuffers.push_back(cmdbuffer); - } - queue_data->second.untrackedCmdBuffers.clear(); - } - fence_data->second.priorFences = prior_fences; - fence_data->second.needsSignaled = true; - fence_data->second.queues.insert(queue); - fence_data->second.in_use.fetch_add(1); - for (uint32_t submit_idx = 0; submit_idx < submitCount; submit_idx++) { - const VkSubmitInfo *submit = &pSubmits[submit_idx]; - for (uint32_t i = 0; i < submit->commandBufferCount; ++i) { - for (auto secondaryCmdBuffer : my_data->commandBufferMap[submit->pCommandBuffers[i]]->secondaryCommandBuffers) { - fence_data->second.cmdBuffers.push_back(secondaryCmdBuffer); - } - fence_data->second.cmdBuffers.push_back(submit->pCommandBuffers[i]); - } - } - } else { - if (queue_data != my_data->queueMap.end()) { - for (uint32_t submit_idx = 0; submit_idx < submitCount; submit_idx++) { - const VkSubmitInfo *submit = &pSubmits[submit_idx]; - for (uint32_t i = 0; i < submit->commandBufferCount; ++i) { - for (auto secondaryCmdBuffer : my_data->commandBufferMap[submit->pCommandBuffers[i]]->secondaryCommandBuffers) { - queue_data->second.untrackedCmdBuffers.push_back(secondaryCmdBuffer); - } - queue_data->second.untrackedCmdBuffers.push_back(submit->pCommandBuffers[i]); - } - } - } - } + + +// Submit a fence to a queue, delimiting previous fences and previous untracked +// work by it. +static void +SubmitFence(QUEUE_NODE *pQueue, FENCE_NODE *pFence) +{ + assert(!pFence->priorFences.size()); + assert(!pFence->submissions.size()); + + std::swap(pFence->priorFences, pQueue->lastFences); + std::swap(pFence->submissions, pQueue->untrackedSubmissions); + + pFence->queues.insert(pQueue->queue); + pFence->needsSignaled = true; + pFence->in_use.fetch_add(1); + + pQueue->lastFences.push_back(pFence->fence); } static void markCommandBuffersInFlight(layer_data *my_data, VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, @@ -4501,12 +4473,12 @@ static bool validateCommandBufferState(layer_data *dev_data, GLOBAL_CB_NODE *pCB return skipCall; } -static bool validatePrimaryCommandBufferState(layer_data *dev_data, GLOBAL_CB_NODE *pCB) { +static bool validatePrimaryCommandBufferState(layer_data *dev_data, GLOBAL_CB_NODE *pCB, std::vector const &semaphores) { // Track in-use for resources off of primary and any secondary CBs - bool skipCall = validateAndIncrementResources(dev_data, pCB); + bool skipCall = validateAndIncrementResources(dev_data, pCB, semaphores); if (!pCB->secondaryCommandBuffers.empty()) { for (auto secondaryCmdBuffer : pCB->secondaryCommandBuffers) { - skipCall |= validateAndIncrementResources(dev_data, dev_data->commandBufferMap[secondaryCmdBuffer]); + skipCall |= validateAndIncrementResources(dev_data, dev_data->commandBufferMap[secondaryCmdBuffer], semaphores); GLOBAL_CB_NODE *pSubCB = getCBNode(dev_data, secondaryCmdBuffer); if ((pSubCB->primaryCommandBuffer != pCB->commandBuffer) && !(pSubCB->beginInfo.flags & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT)) { @@ -4529,28 +4501,29 @@ static bool validatePrimaryCommandBufferState(layer_data *dev_data, GLOBAL_CB_NO } static bool -ValidateFenceForSubmit(layer_data *dev_data, VkFence fence) +ValidateFenceForSubmit(layer_data *dev_data, FENCE_NODE *pFence) { bool skipCall = false; - if (fence != VK_NULL_HANDLE) { - if (dev_data->fenceMap[fence].in_use.load()) { + if (pFence) { + if (pFence->in_use.load()) { skipCall |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, - (uint64_t)(fence), __LINE__, DRAWSTATE_INVALID_FENCE, "DS", - "Fence 0x%" PRIx64 " is already in use by another submission.", (uint64_t)(fence)); + (uint64_t)(pFence->fence), __LINE__, DRAWSTATE_INVALID_FENCE, "DS", + "Fence 0x%" PRIx64 " is already in use by another submission.", (uint64_t)(pFence->fence)); } - if (!dev_data->fenceMap[fence].needsSignaled) { + if (!pFence->needsSignaled) { skipCall |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, - reinterpret_cast(fence), __LINE__, MEMTRACK_INVALID_FENCE_STATE, "MEM", + reinterpret_cast(pFence->fence), __LINE__, MEMTRACK_INVALID_FENCE_STATE, "MEM", "Fence 0x%" PRIxLEAST64 " submitted in SIGNALED state. Fences must be reset before being submitted", - reinterpret_cast(fence)); + reinterpret_cast(pFence->fence)); } } return skipCall; } + VKAPI_ATTR VkResult VKAPI_CALL QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, VkFence fence) { bool skipCall = false; @@ -4558,13 +4531,25 @@ QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, V VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; std::unique_lock lock(global_lock); - skipCall |= ValidateFenceForSubmit(dev_data, fence); + auto pQueue = getQueueNode(dev_data, queue); + auto pFence = getFenceNode(dev_data, fence); + skipCall |= ValidateFenceForSubmit(dev_data, pFence); // TODO : Review these old print functions and clean up as appropriate print_mem_list(dev_data); printCBList(dev_data); - // Update cmdBuffer-related data structs and mark fence in-use - trackCommandBuffers(dev_data, queue, submitCount, pSubmits, fence); + + // Mark the fence in-use. + if (pFence) { + SubmitFence(pQueue, pFence); + } + + // If a fence is supplied, all the command buffers for this call will be + // delimited by that fence. Otherwise, they go in the untracked portion of + // the queue, and may end up being delimited by a fence supplied in a + // subsequent submission. + auto & submitTarget = pFence ? pFence->submissions : pQueue->untrackedSubmissions; + // Now verify each individual submit std::unordered_set processed_other_queues; for (uint32_t submit_idx = 0; submit_idx < submitCount; submit_idx++) { @@ -4608,13 +4593,20 @@ QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, V } } } + + // TODO: just add one submission per VkSubmitInfo! for (uint32_t i = 0; i < submit->commandBufferCount; i++) { auto pCBNode = getCBNode(dev_data, submit->pCommandBuffers[i]); skipCall |= ValidateCmdBufImageLayouts(dev_data, pCBNode); if (pCBNode) { - pCBNode->semaphores = semaphoreList; + + submitTarget.emplace_back(pCBNode->commandBuffer, semaphoreList); + for (auto secondaryCmdBuffer : pCBNode->secondaryCommandBuffers) { + submitTarget.emplace_back(secondaryCmdBuffer, semaphoreList); + } + pCBNode->submitCount++; // increment submit count - skipCall |= validatePrimaryCommandBufferState(dev_data, pCBNode); + skipCall |= validatePrimaryCommandBufferState(dev_data, pCBNode, semaphoreList); // Call submit-time functions to validate/update state for (auto &function : pCBNode->validate_functions) { skipCall |= function(); @@ -9583,11 +9575,16 @@ QueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo *p VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; bool skip_call = false; std::unique_lock lock(global_lock); + auto pFence = getFenceNode(dev_data, fence); + auto pQueue = getQueueNode(dev_data, queue); + // First verify that fence is not in use - skip_call |= ValidateFenceForSubmit(dev_data, fence); + skip_call |= ValidateFenceForSubmit(dev_data, pFence); + if (fence != VK_NULL_HANDLE) { - trackCommandBuffers(dev_data, queue, 0, nullptr, fence); + SubmitFence(pQueue, pFence); } + for (uint32_t bindIdx = 0; bindIdx < bindInfoCount; ++bindIdx) { const VkBindSparseInfo &bindInfo = pBindInfo[bindIdx]; // Track objects tied to memory diff --git a/layers/core_validation.h b/layers/core_validation.h index 26c3edc9..d3e7cd4d 100644 --- a/layers/core_validation.h +++ b/layers/core_validation.h @@ -217,7 +217,7 @@ class FENCE_NODE : public BASE_NODE { bool firstTimeFlag; // Fence was created in signaled state, avoid warnings for first use VkFenceCreateInfo createInfo; std::unordered_set queues; - std::vector cmdBuffers; + std::vector submissions; bool needsSignaled; std::vector priorFences; @@ -250,7 +250,7 @@ class QUEUE_NODE { std::list pQueueCommandBuffers; std::list pMemRefList; #endif - std::vector untrackedCmdBuffers; + std::vector untrackedSubmissions; std::unordered_map eventToStageMap; std::unordered_map queryToStateMap; // 0 is unavailable, 1 is available }; diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index 25d1e8cb..616a2e2c 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -453,7 +453,6 @@ struct GLOBAL_CB_NODE : public BASE_NODE { std::unordered_set destroyedFramebuffers; std::unordered_set waitedEvents; std::vector writeEventsBeforeWait; - std::vector semaphores; std::vector events; std::unordered_map> waitedEventsBeforeQueryReset; std::unordered_map queryToStateMap; // 0 is unavailable, 1 is available -- cgit v1.2.3 From dda1e861321cfda600472dd22df3a84bc7e57c15 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Mon, 13 Jun 2016 09:59:34 +1200 Subject: layers: Fix test fallout in CommandBufferTwoSubmits This test was accidentally triggering the fence reuse case as well, and blindly continuing past that error. It doesn't need to use the fence at all, so don't supply one. Also tweak the layer to not run into the assert if the caller elected to skip -- QueueSubmit still has validation and updates tangled together, but this improves it slightly. Signed-off-by: Chris Forbes --- layers/core_validation.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index bfb934d4..8d97dc21 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -4535,6 +4535,10 @@ QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, V auto pFence = getFenceNode(dev_data, fence); skipCall |= ValidateFenceForSubmit(dev_data, pFence); + if (skipCall) { + return VK_ERROR_VALIDATION_FAILED_EXT; + } + // TODO : Review these old print functions and clean up as appropriate print_mem_list(dev_data); printCBList(dev_data); -- cgit v1.2.3 From b3dd9b1367e59333e39687c838cf966cbdd7c47d Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Mon, 13 Jun 2016 16:56:26 -0600 Subject: layers: Fix Windows Dota2 crash One of the event tracking lists was not getting cleared upon a reset, resulting in an invalid reference on reuse. Change-Id: I45d932822f27197266b363634d6cdccc785209d3 --- layers/core_validation.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 8d97dc21..2dbfd0ab 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -3696,6 +3696,7 @@ static void resetCB(layer_data *dev_data, const VkCommandBuffer cb) { pCB->destroyedFramebuffers.clear(); pCB->waitedEvents.clear(); pCB->events.clear(); + pCB->writeEventsBeforeWait.clear(); pCB->waitedEventsBeforeQueryReset.clear(); pCB->queryToStateMap.clear(); pCB->activeQueries.clear(); -- cgit v1.2.3 From 509c8314b1ad46c3fce73d0efa962c6f0b5ac4bd Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Wed, 8 Jun 2016 12:48:18 -0600 Subject: layers: Make vklayer_utils a shared library Was previously statically linked. Converting to a DLL will allow data sharing and use of utils in samples repo. Change-Id: I63ccc1f0f57dfad40f7068c60ac623bce5bd714d --- layers/CMakeLists.txt | 20 +++++++++++++++++--- layers/VkLayer_utils.def | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 layers/VkLayer_utils.def diff --git a/layers/CMakeLists.txt b/layers/CMakeLists.txt index acf67b8a..5982cdd4 100644 --- a/layers/CMakeLists.txt +++ b/layers/CMakeLists.txt @@ -142,11 +142,10 @@ run_vk_layer_xml_generate(Threading thread_check.h) run_vk_layer_generate(unique_objects unique_objects.cpp) run_vk_layer_xml_generate(ParamChecker parameter_validation.h) + # Layer Utils Library -# For Windows, we use a static lib because the Windows loader has a fairly restrictive loader search -# path that can't be easily modified to point it to the same directory that contains the layers. if (WIN32) - add_library(VkLayer_utils STATIC vk_layer_config.cpp vk_layer_extension_utils.cpp vk_layer_utils.cpp) + add_library(VkLayer_utils SHARED vk_layer_config.cpp vk_layer_extension_utils.cpp vk_layer_utils.cpp VkLayer_utils.def) else() add_library(VkLayer_utils SHARED vk_layer_config.cpp vk_layer_extension_utils.cpp vk_layer_utils.cpp) install(TARGETS VkLayer_utils DESTINATION ${PROJECT_BINARY_DIR}/install_staging) @@ -166,3 +165,18 @@ add_vk_layer(parameter_validation parameter_validation.cpp parameter_validation. target_include_directories(VkLayer_core_validation PRIVATE ${GLSLANG_SPIRV_INCLUDE_DIR}) target_include_directories(VkLayer_core_validation PRIVATE ${SPIRV_TOOLS_INCLUDE_DIR}) target_link_libraries(VkLayer_core_validation ${SPIRV_TOOLS_LIBRARIES}) + +if (WIN32) + file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/$/VkLayer_utils.dll COPY_SRC_PATH) + file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/../demos/$/ COPY_DST_PATH) + file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/../tests/$/ COPY_DST_TEST_PATH) + # Copy layer utils library to correct locations + add_custom_command(TARGET VkLayer_utils + POST_BUILD + COMMAND xcopy /Y /I ${COPY_SRC_PATH} ${COPY_DST_PATH} + COMMENT "Copying VkLayer_utils.dll to demos dir") + add_custom_command(TARGET VkLayer_utils + POST_BUILD + COMMAND xcopy /Y /I ${COPY_SRC_PATH} ${COPY_DST_TEST_PATH} + COMMENT "Copying VkLayer_utils.dll to demos dir") +endif() diff --git a/layers/VkLayer_utils.def b/layers/VkLayer_utils.def new file mode 100644 index 00000000..d2b52852 --- /dev/null +++ b/layers/VkLayer_utils.def @@ -0,0 +1,45 @@ +;;;; Begin Copyright Notice ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Vulkan +; +; Copyright (c) 2015-2016 The Khronos Group Inc. +; Copyright (c) 2015-2016 Valve Corporation +; Copyright (c) 2015-2016 LunarG, 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. +; +; Author: Mark Lobodzinski +;;;; End Copyright Notice ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +; The following is required on Windows for exporting symbols from the DLL + +LIBRARY VkLayer_utils +EXPORTS +vk_format_is_depth_or_stencil +vk_format_is_depth_and_stencil +vk_format_is_stencil_only +vk_format_is_depth_only +vk_format_is_norm +vk_format_is_int +vk_format_is_uint +vk_format_is_sint +vk_format_is_float +vk_format_is_srgb +vk_format_is_compressed +vk_format_get_compatibility_class +vk_format_get_size +vk_format_get_channel_count +vk_safe_modulo +vk_string_validate +layer_debug_actions +util_GetExtensionProperties +util_GetLayerProperties -- cgit v1.2.3 From b9b4074046195beb244c9e8ab48b172b3e6106d0 Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Wed, 8 Jun 2016 12:44:54 -0600 Subject: layers: Add debug report header Enable output of a short message header containing definitions of debug message types. Change-Id: Ia84fb0e79d599b8d022b7d78267b7b6a0307823e --- layers/VkLayer_utils.def | 2 ++ layers/vk_layer_config.cpp | 11 +++++++++++ layers/vk_layer_config.h | 2 ++ layers/vk_layer_logging.h | 49 +++++++++++++++++++++++++++++++++++++++++----- 4 files changed, 59 insertions(+), 5 deletions(-) diff --git a/layers/VkLayer_utils.def b/layers/VkLayer_utils.def index d2b52852..629c7d04 100644 --- a/layers/VkLayer_utils.def +++ b/layers/VkLayer_utils.def @@ -43,3 +43,5 @@ vk_string_validate layer_debug_actions util_GetExtensionProperties util_GetLayerProperties +LogMessageInitialized +SetLogMessageInitialized diff --git a/layers/vk_layer_config.cpp b/layers/vk_layer_config.cpp index 049ffdcc..d1f61e1e 100644 --- a/layers/vk_layer_config.cpp +++ b/layers/vk_layer_config.cpp @@ -32,6 +32,17 @@ #define MAX_CHARS_PER_LINE 4096 +// Flag for ONE-TIME debug output initialization +static bool log_message_initialized = false; + +// Accessor functions to ensure the correct instance of the shared flag gets used +bool LogMessageInitialized() { + return log_message_initialized; +} +void SetLogMessageInitialized() { + log_message_initialized = true; +} + class ConfigFile { public: ConfigFile(); diff --git a/layers/vk_layer_config.h b/layers/vk_layer_config.h index c4526dbc..097ba42c 100644 --- a/layers/vk_layer_config.h +++ b/layers/vk_layer_config.h @@ -63,6 +63,8 @@ VkFlags GetLayerOptionFlags(std::string _option, std::unordered_mapdebug_callback_list != NULL) ? debug_data->debug_callback_list : debug_data->default_debug_callback_list; + + while (pTrav) { + const char *message_header = "Legend:\n\n" + "*******************************************************************************************\n" + "* Vulkan Validation Layer Debug Output *\n" + "* *\n" + "* Debug Output Type Definitions: *\n" + "* ------------------------------ *\n" + "* ERROR: Errors are output when a validation layer detects that some application behavior *\n" + "* has violated the Vulkan Specification. When an error is encountered it is *\n" + "* recommended that the user callback function return 'true' for optimal *\n" + "* validation results. Any validation error may result in undefined behavior and *\n" + "* errors should be corrected as they are encountered for best results. *\n" + "* WARN: Warnings are output in cases where mistakes are commonly made and do NOT *\n" + "* necessarily indicate that an app has violated the Vulkan Specification. *\n" + "* Warnings basically translate to 'Did you really mean to do this?' *\n" + "* PERF: Performance Warnings are output in cases where a possible inefficiency has been *\n" + "* detected. These also do NOT imply that the specification was violated. *\n" + "* INFO: These log messages are for informational purposes only. For instance, the *\n" + "* core_validation layer can print out lists of memory objects and their bindings *\n" + "* which may help with debugging or improving application efficiency. *\n" + "*******************************************************************************************\n"; + + if (pTrav->msgFlags & msgFlags) { + pTrav->pfnMsgCallback(VK_DEBUG_REPORT_DEBUG_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT, 0, 0, + VK_DEBUG_REPORT_ERROR_CALLBACK_REF_EXT, "", message_header, pTrav->pUserData); + output |= true; + } + pTrav = pTrav->pNext; + } + return output; +} + // Utility function to handle reporting static inline bool debug_report_log_msg(const debug_report_data *debug_data, VkFlags msgFlags, VkDebugReportObjectTypeEXT objectType, uint64_t srcObject, size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg) { bool bail = false; - VkLayerDbgFunctionNode *pTrav = NULL; + VkLayerDbgFunctionNode *pTrav = + (debug_data->debug_callback_list != NULL) ? debug_data->debug_callback_list : debug_data->default_debug_callback_list; - if (debug_data->debug_callback_list != NULL) { - pTrav = debug_data->debug_callback_list; - } else { - pTrav = debug_data->default_debug_callback_list; + if ((LogMessageInitialized() == false) && (strcmp(pLayerPrefix, "DebugReport") != 0)) { + if (OutputLogMsgHeader(debug_data, msgFlags) == true) { + SetLogMessageInitialized(); + } } while (pTrav) { @@ -151,6 +189,7 @@ debug_report_create_instance(VkLayerInstanceDispatchTable *table, VkInstance ins debug_data->g_DEBUG_REPORT = true; } } + return debug_data; } -- cgit v1.2.3 From d110a7d088524981c528228bcbafd865e11cec95 Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Mon, 13 Jun 2016 14:48:12 -0600 Subject: layers: Update docs for shared utils DLL Change-Id: I129b4d074f0604bbdf6d81c052333229ece99ac3 --- BUILD.md | 16 ++++++++-------- README.md | 3 +++ layers/README.md | 8 ++++++-- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/BUILD.md b/BUILD.md index 70636dbd..c5b8f488 100644 --- a/BUILD.md +++ b/BUILD.md @@ -19,7 +19,7 @@ Please see the [CONTRIBUTING](CONTRIBUTING.md) file in this respository for more To create your local git repository: ``` -git clone https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers +git clone https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers ``` ## Linux Build @@ -30,7 +30,7 @@ The build generates the loader, layers, and tests. This repo has been built and tested on Ubuntu 14.04.3 LTS, 14.10, 15.04, 15.10, and 16.04 LTS. It should be straightforward to use it on other Linux distros. -These packages are needed to build this repository: +These packages are needed to build this repository: ``` sudo apt-get install git cmake build-essential bison libx11-dev libxcb1-dev ``` @@ -60,7 +60,7 @@ packaged, and how developers can point to ICDs and layers within their builds. ## Validation Test -The test executables can be found in the dbuild/tests directory. +The test executables can be found in the dbuild/tests directory. Some of the tests that are available: - vk\_layer\_validation\_tests: Test Vulkan layers. @@ -107,12 +107,12 @@ Build all Windows targets after installing required software and cloning the Loa ``` cd Vulkan-LoaderAndValidationLayers # cd to the root of the cloned git repository update_external_sources.bat --all -build_windows_targets.bat +build_windows_targets.bat ``` At this point, you can use Windows Explorer to launch Visual Studio by double-clicking on the "VULKAN.sln" file in the \build folder. Once Visual Studio comes up, you can select "Debug" or "Release" from a drop-down list. You can start a build with either the menu (Build->Build Solution), or a keyboard shortcut (Ctrl+Shift+B). As part of the build process, Python scripts will create additional Visual Studio files and projects, along with additional source files. All of these auto-generated files are under the "build" folder. -Vulkan programs must be able to find and use the vulkan-1.dll library. Make sure it is either installed in the C:\Windows\System32 folder, or the PATH environment variable includes the folder that it is located in. +Vulkan programs must be able to find and use the vulkan-1.dll library. Make sure it is either installed in the system library directory (typically C:\Windows\System32), or the PATH environment variable includes the folder that it is located in. Similarly, Vulkan layers require access to the VkLayer-utils.dll shared layer utility library. This file must be copied to the system library directory or into the directory containing the program executable. To run Vulkan programs you must tell the icd loader where to find the libraries. This is described in a `LoaderAndLayerInterface` document in the `loader` folder in this repository. @@ -185,7 +185,7 @@ The [Qt Creator IDE](https://qt.io/download-open-source/#section-2) can open a r - Then do the same with the Vulkan-LoaderAndValidationLayers CMakeList.txt file. - In order to debug with QtCreator, a [Microsoft WDK: eg WDK 10](http://go.microsoft.com/fwlink/p/?LinkId=526733) is required. Note that installing the WDK breaks the MSVC vcvarsall.bat build scripts provided by MSVC, requiring that the LIB, INCLUDE, and PATH env variables be set to the WDK paths by some other means -## Loader and Validation Layer Dependencies +## Loader and Validation Layer Dependencies gslang and SPIRV-Tools repos are required to build and run Loader and Validation Layer components. They are not git sub-modules of Vulkan-LoaderAndValidationLayers but Vulkan-LoaderAndValidationLayers is linked to specific revisions of gslang and spirv-tools. These can be automatically cloned and built to predefined locations with the update\_external\_sources scripts. If a custom configuration is required, do the following steps: 1) clone the repos: @@ -219,7 +219,7 @@ _on windows_ Especially valuable are the BASH shell and git packages. - If you don't want to use Cygwin, there are other shells and environments that can be used. You can also use a Git package that doesn't come from Cygwin. - -- [Ninja on all platforms](https://github.com/ninja-build/ninja/releases). [The Ninja-build project](ninja-build.org). [Ninja Users Manual](ninja-build.org/manual.html) + +- [Ninja on all platforms](https://github.com/ninja-build/ninja/releases). [The Ninja-build project](ninja-build.org). [Ninja Users Manual](ninja-build.org/manual.html) - [QtCreator as IDE for CMake builds on all platforms](https://qt.io/download-open-source/#section-2) diff --git a/README.md b/README.md index c23e7160..f79d941b 100755 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ +NOTE: Recent changes have been made regarding the loading of the shared layer utilities library on Windows. + Please see [BUILD.md](BUILD.md) for details. + # Vulkan Ecosystem Components This project provides Khronos official ICD loader and validation layers for Vulkan developers on Windows and Linux. diff --git a/layers/README.md b/layers/README.md index d3eecbf1..f2e93e36 100644 --- a/layers/README.md +++ b/layers/README.md @@ -68,13 +68,17 @@ layers/device_limits.cpp (name=`VK_LAYER_LUNARG_device_limits`) - This layer is ## Using Layers 1. Build VK loader using normal steps (cmake and make) -2. Place `libVkLayer_.so` in the same directory as your VK test or app: +2. Place `libVkLayer_.so` or `VkLayer_.dll` in the same directory as your VK test or app: - `cp build/layer/libVkLayer_threading.so build/tests` + `cp build/layers/libVkLayer_threading.so build/tests` -or- + `copy build\layers/VkLayer_threading.dll build\tests` This is required for the Loader to be able to scan and enumerate your library. Alternatively, use the `VK_LAYER_PATH` environment variable to specify where the layer libraries reside. + [Windows Only] The VkLayer_utils.dll will also need to be copied into your app directory or to your + system library directory (typically \Windows\System32). + 3. Create a vk_layer_settings.txt file in the same directory to specify how your layers should behave. Model it after the following example: [*vk_layer_settings.txt*](vk_layer_settings.txt) -- cgit v1.2.3 From 116127276bfde5cd7c132df9bf9e79dda2b57b7d Mon Sep 17 00:00:00 2001 From: Rene Lindsay Date: Mon, 13 Jun 2016 17:20:39 -0600 Subject: vulkaninfo: Clean up XCB window creation code. Change-Id: I5ef0862326d9a7ce4e59fe7c8947b532f252d604 --- demos/cube.c | 4 ++-- demos/vulkaninfo.c | 33 +++++++++------------------------ 2 files changed, 11 insertions(+), 26 deletions(-) diff --git a/demos/cube.c b/demos/cube.c index dc160131..9b12bfcb 100644 --- a/demos/cube.c +++ b/demos/cube.c @@ -2077,7 +2077,7 @@ static void demo_create_xlib_window(struct demo *demo) { demo->display = XOpenDisplay(NULL); long visualMask = VisualScreenMask; int numberOfVisuals; - XVisualInfo vInfoTemplate; + XVisualInfo vInfoTemplate={}; vInfoTemplate.screen = DefaultScreen(demo->display); XVisualInfo *visualInfo = XGetVisualInfo(demo->display, visualMask, &vInfoTemplate, &numberOfVisuals); @@ -2086,7 +2086,7 @@ static void demo_create_xlib_window(struct demo *demo) { demo->display, RootWindow(demo->display, vInfoTemplate.screen), visualInfo->visual, AllocNone); - XSetWindowAttributes windowAttributes; + XSetWindowAttributes windowAttributes={}; windowAttributes.colormap = colormap; windowAttributes.background_pixel = 0xFFFFFFFF; windowAttributes.border_pixel = 0; diff --git a/demos/vulkaninfo.c b/demos/vulkaninfo.c index aaec8584..66093edc 100644 --- a/demos/vulkaninfo.c +++ b/demos/vulkaninfo.c @@ -824,11 +824,12 @@ static void app_create_win32_window(struct app_instance *inst) { win_class.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); win_class.lpszMenuName = NULL; win_class.lpszClassName = APP_SHORT_NAME; + win_class.hInstance = inst->hInstance; win_class.hIconSm = LoadIcon(NULL, IDI_WINLOGO); // Register window class: if (!RegisterClassEx(&win_class)) { // It didn't work, so try to give a useful error: - printf("Unexpected error trying to start the application!\n"); + printf("Failed to register the window class!\n"); fflush(stdout); exit(1); } @@ -849,7 +850,7 @@ static void app_create_win32_window(struct app_instance *inst) { NULL); // no extra parameters if (!inst->hWnd) { // It didn't work, so try to give a useful error: - printf("Cannot create a window in which to draw!\n"); + printf("Failed to create a window!\n"); fflush(stdout); exit(1); } @@ -878,6 +879,7 @@ static void app_destroy_surface(struct app_instance *inst) { //same for all plat } //----------------------------XCB---------------------------- + #ifdef VK_USE_PLATFORM_XCB_KHR static void app_create_xcb_window(struct app_instance *inst) { //--Init Connection-- @@ -887,7 +889,7 @@ static void app_create_xcb_window(struct app_instance *inst) { inst->xcb_connection = xcb_connect(NULL, &scr); if (inst->xcb_connection == NULL) { - printf("Cannot find a compatible Vulkan installable client driver (ICD).\nExiting ...\n"); + printf("XCB failed to connect to the X server.\nExiting ...\n"); fflush(stdout); exit(1); } @@ -900,17 +902,11 @@ static void app_create_xcb_window(struct app_instance *inst) { inst->xcb_screen = iter.data; //------------------- - uint32_t value_mask, value_list[32]; inst->xcb_window = xcb_generate_id(inst->xcb_connection); - value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK; - value_list[0] = inst->xcb_screen->black_pixel; - value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | - XCB_EVENT_MASK_STRUCTURE_NOTIFY; - xcb_create_window(inst->xcb_connection, XCB_COPY_FROM_PARENT, inst->xcb_window, inst->xcb_screen->root, 0, 0, inst->width, inst->height, 0, XCB_WINDOW_CLASS_INPUT_OUTPUT, inst->xcb_screen->root_visual, - value_mask, value_list); + 0, NULL); xcb_intern_atom_cookie_t cookie = xcb_intern_atom(inst->xcb_connection, 1, 12, "WM_PROTOCOLS"); xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(inst->xcb_connection, cookie, 0); @@ -942,26 +938,15 @@ static void app_create_xlib_window(struct app_instance *inst) { inst->xlib_display = XOpenDisplay(NULL); long visualMask = VisualScreenMask; int numberOfVisuals; - XVisualInfo vInfoTemplate; + + XVisualInfo vInfoTemplate={}; vInfoTemplate.screen = DefaultScreen(inst->xlib_display); XVisualInfo *visualInfo = XGetVisualInfo(inst->xlib_display, visualMask, &vInfoTemplate, &numberOfVisuals); - Colormap colormap = XCreateColormap( - inst->xlib_display, RootWindow(inst->xlib_display, vInfoTemplate.screen), - visualInfo->visual, AllocNone); - - XSetWindowAttributes windowAttributes; - windowAttributes.colormap = colormap; - windowAttributes.background_pixel = 0xFFFFFFFF; - windowAttributes.border_pixel = 0; - windowAttributes.event_mask = - KeyPressMask | KeyReleaseMask | StructureNotifyMask | ExposureMask; - inst->xlib_window = XCreateWindow( inst->xlib_display, RootWindow(inst->xlib_display, vInfoTemplate.screen), 0, 0, inst->width, inst->height, 0, visualInfo->depth, InputOutput, - visualInfo->visual, - CWBackPixel | CWBorderPixel | CWEventMask | CWColormap, &windowAttributes); + visualInfo->visual, 0, NULL); XFlush(inst->xlib_display); } -- cgit v1.2.3 From 43491dd34f5d6cd14d70f13577514eccbe662504 Mon Sep 17 00:00:00 2001 From: Mark Mueller Date: Mon, 13 Jun 2016 18:26:30 -0600 Subject: layers: Fix CMakeLists.txt for non-MSVC Win builds Fix a recent change broke windows builds that don't use the VC IDE or decorate build trees like VC does Change-Id: I93c8a559c4255408a6fa890b2a3e4d81822d1cea --- layers/CMakeLists.txt | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/layers/CMakeLists.txt b/layers/CMakeLists.txt index 5982cdd4..099b711f 100644 --- a/layers/CMakeLists.txt +++ b/layers/CMakeLists.txt @@ -167,9 +167,15 @@ target_include_directories(VkLayer_core_validation PRIVATE ${SPIRV_TOOLS_INCLUDE target_link_libraries(VkLayer_core_validation ${SPIRV_TOOLS_LIBRARIES}) if (WIN32) - file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/$/VkLayer_utils.dll COPY_SRC_PATH) - file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/../demos/$/ COPY_DST_PATH) - file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/../tests/$/ COPY_DST_TEST_PATH) + if (CMAKE_GENERATOR MATCHES "^Visual Studio.*") + file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/$/VkLayer_utils.dll COPY_SRC_PATH) + file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/../demos/$/ COPY_DST_PATH) + file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/../tests/$/ COPY_DST_TEST_PATH) + else() + file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/VkLayer_utils.dll COPY_SRC_PATH) + file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/../demos/ COPY_DST_PATH) + file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/../tests/ COPY_DST_TEST_PATH) + endif() # Copy layer utils library to correct locations add_custom_command(TARGET VkLayer_utils POST_BUILD -- cgit v1.2.3 From 2307beb069a8da6fede656bb3d82bd40449f769d Mon Sep 17 00:00:00 2001 From: Jeremy Hayes Date: Tue, 14 Jun 2016 11:50:02 -0600 Subject: loader: return ext not present when applicable --- loader/wsi.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/loader/wsi.c b/loader/wsi.c index 3182a589..c5f527fb 100644 --- a/loader/wsi.c +++ b/loader/wsi.c @@ -536,7 +536,7 @@ terminator_CreateWin32SurfaceKHR(VkInstance instance, loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0, "VK_KHR_win32_surface extension not enabled. " "vkCreateWin32SurfaceKHR not executed!\n"); - return VK_SUCCESS; + return VK_ERROR_EXTENSION_NOT_PRESENT; } // Next, if so, proceed with the implementation of this function: @@ -644,7 +644,7 @@ terminator_CreateMirSurfaceKHR(VkInstance instance, loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0, "VK_KHR_mir_surface extension not enabled. " "vkCreateMirSurfaceKHR not executed!\n"); - return VK_SUCCESS; + return VK_ERROR_EXTENSION_NOT_PRESENT; } // Next, if so, proceed with the implementation of this function: @@ -743,7 +743,8 @@ vkCreateWaylandSurfaceKHR(VkInstance instance, * This is the instance chain terminator function * for CreateWaylandSurfaceKHR */ -VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateWaylandSurfaceKHR( +VKAPI_ATTR VkResult VKAPI_CALL +terminator_CreateWaylandSurfaceKHR( VkInstance instance, const VkWaylandSurfaceCreateInfoKHR *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface) { // First, check to ensure the appropriate extension was enabled: @@ -752,7 +753,7 @@ VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateWaylandSurfaceKHR( loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0, "VK_KHR_wayland_surface extension not enabled. " "vkCreateWaylandSurfaceKHR not executed!\n"); - return VK_SUCCESS; + return VK_ERROR_EXTENSION_NOT_PRESENT; } // Next, if so, proceed with the implementation of this function: @@ -862,7 +863,7 @@ terminator_CreateXcbSurfaceKHR(VkInstance instance, loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0, "VK_KHR_xcb_surface extension not enabled. " "vkCreateXcbSurfaceKHR not executed!\n"); - return VK_SUCCESS; + return VK_ERROR_EXTENSION_NOT_PRESENT; } // Next, if so, proceed with the implementation of this function: @@ -973,7 +974,7 @@ terminator_CreateXlibSurfaceKHR(VkInstance instance, loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0, "VK_KHR_xlib_surface extension not enabled. " "vkCreateXlibSurfaceKHR not executed!\n"); - return VK_SUCCESS; + return VK_ERROR_EXTENSION_NOT_PRESENT; } // Next, if so, proceed with the implementation of this function: @@ -1080,7 +1081,7 @@ terminator_CreateAndroidSurfaceKHR(VkInstance instance, Window window, loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0, "VK_KHR_display extension not enabled. " "vkCreateAndroidSurfaceKHR not executed!\n"); - return VK_SUCCESS; + return VK_ERROR_EXTENSION_NOT_PRESENT; } // Next, if so, proceed with the implementation of this function: @@ -1293,7 +1294,7 @@ terminator_CreateDisplayModeKHR(VkPhysicalDevice physicalDevice, loader_log(ptr_instance, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0, "VK_KHR_display extension not enabled. " "vkCreateDisplayModeKHR not executed!\n"); - return VK_SUCCESS; + return VK_ERROR_EXTENSION_NOT_PRESENT; } // Next, if so, proceed with the implementation of this function: @@ -1368,7 +1369,7 @@ VKAPI_ATTR VkResult VKAPI_CALL terminator_CreateDisplayPlaneSurfaceKHR( loader_log(inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0, "VK_KHR_surface extension not enabled. " "vkCreateDisplayPlaneSurfaceKHR not executed!\n"); - return VK_SUCCESS; + return VK_ERROR_EXTENSION_NOT_PRESENT; } pIcdSurface = loader_heap_alloc(inst, sizeof(VkIcdSurfaceDisplay), -- cgit v1.2.3 From a3e077801c33c943553e9de9e7370f93169a0dc8 Mon Sep 17 00:00:00 2001 From: Mark Young Date: Mon, 13 Jun 2016 14:49:53 -0600 Subject: loader: Fix GH607 by adding proper array support JSON spec does not allow objects of the same name at the same level. But, that's what we used to allow with "layer" definitions. Update new file version to 1.0.1, add "layers" array object, and add multiple "layer" definition warning. Change-Id: I040f07897c689800364d243daf3c247f1b3cace7 --- loader/LoaderAndLayerInterface.md | 172 ++++++----- loader/loader.c | 596 ++++++++++++++++++++++---------------- 2 files changed, 445 insertions(+), 323 deletions(-) diff --git a/loader/LoaderAndLayerInterface.md b/loader/LoaderAndLayerInterface.md index 69ad7819..e11923a8 100644 --- a/loader/LoaderAndLayerInterface.md +++ b/loader/LoaderAndLayerInterface.md @@ -738,42 +738,42 @@ See the section [Layer Library Manifest File](#LayerLibraryManifestFile) for mor ``` { -"file_format_version" : "1.0.0", -"layer": { - "name": "VK_LAYER_LUNARG_overlay", - "type": "INSTANCE", - "library_path": "vkOverlayLayer.dll" - "api_version" : "1.0.5", - "implementation_version" : "2", - "description" : "LunarG HUD layer", - "functions": { - "vkGetInstanceProcAddr": "OverlayLayer_GetInstanceProcAddr", - "vkGetDeviceProcAddr": "OverlayLayer_GetDeviceProcAddr" - }, - "instance_extensions": [ - { - "name": "VK_EXT_debug_report", - "spec_version": "1" - }, - { - "name": "VK_VENDOR_ext_x", - "spec_version": "3" - } - ], - "device_extensions": [ - { - "name": "VK_EXT_debug_marker", - "spec_version": "1", - "entrypoints": ["vkCmdDbgMarkerBegin", "vkCmdDbgMarkerEnd"] - } - ], - "enable_environment": { - "ENABLE_LAYER_OVERLAY_1": "1" - } - "disable_environment": { - "DISABLE_LAYER_OVERLAY_1": "" - } -} + "file_format_version" : "1.0.0", + "layer": { + "name": "VK_LAYER_LUNARG_overlay", + "type": "INSTANCE", + "library_path": "vkOverlayLayer.dll" + "api_version" : "1.0.5", + "implementation_version" : "2", + "description" : "LunarG HUD layer", + "functions": { + "vkGetInstanceProcAddr": "OverlayLayer_GetInstanceProcAddr", + "vkGetDeviceProcAddr": "OverlayLayer_GetDeviceProcAddr" + }, + "instance_extensions": [ + { + "name": "VK_EXT_debug_report", + "spec_version": "1" + }, + { + "name": "VK_VENDOR_ext_x", + "spec_version": "3" + } + ], + "device_extensions": [ + { + "name": "VK_EXT_debug_marker", + "spec_version": "1", + "entrypoints": ["vkCmdDbgMarkerBegin", "vkCmdDbgMarkerEnd"] + } + ], + "enable_environment": { + "ENABLE_LAYER_OVERLAY_1": "1" + } + "disable_environment": { + "DISABLE_LAYER_OVERLAY_1": "" + } + } } ``` @@ -786,6 +786,34 @@ application files). If the layer is specified via a filename, the shared library lives in the system's DLL search path (e.g. in the "C:\\Windows\\System32" folder). +If defining multiple layers in a single JSON file prior to "file\_format\_version" +1.0.1, you would simply define multiple "layer" objects. However, this is not +valid JSON syntax. Instead, you should now define "file\_format\_version" +1.0.1 (or newer) and use the new "layers" array object as seen in the +following example: + +``` +{ + "file_format_version" : "1.0.1", + "layers": [ + { + "name": "VK_LAYER_layer_name1", + "type": "INSTANCE", + ... + }, + { + "name": "VK_LAYER_layer_name2", + "type": "INSTANCE", + ... + } + ] +} +``` + +You could use the "layers" array object to define a single layer, as long as +your "file\_format\_version" is defined to at least 1.0.1. It is functionally the +same as using a single "layer" object. + There are no rules about the name of the text files (except the .json suffix). There are no rules about the name of the layer shared library files. @@ -849,42 +877,42 @@ See the section [Layer Library Manifest File](#LayerLibraryManifestFile) for mor ``` { -"file_format_version" : "1.0.0", -"layer": { - "name": "VK_LAYER_LUNARG_overlay", - "type": "INSTANCE", - "library_path": "libvkOverlayLayer.so" - "api_version" : "1.0.5", - "implementation_version" : "2", - "description" : "LunarG HUD layer", - "functions": { - "vkGetInstanceProcAddr": "OverlayLayer_GetInstanceProcAddr", - "vkGetDeviceProcAddr": "OverlayLayer_GetDeviceProcAddr" - }, - "instance_extensions": [ - { - "name": "VK_EXT_debug_report", - "spec_version": "1" - }, - { - "name": "VK_VENDOR_ext_x", - "spec_version": "3" - } - ], - "device_extensions": [ - { - "name": "VK_EXT_debug_marker", - "spec_version": "1", - "entrypoints": ["vkCmdDbgMarkerBegin", "vkCmdDbgMarkerEnd"] - } - ], - "enable_environment": { - "ENABLE_LAYER_OVERLAY_1": "1" - }, - "disable_environment": { - "DISABLE_LAYER_OVERLAY_1": "" - } -} + "file_format_version" : "1.0.0", + "layer": { + "name": "VK_LAYER_LUNARG_overlay", + "type": "INSTANCE", + "library_path": "libvkOverlayLayer.so" + "api_version" : "1.0.5", + "implementation_version" : "2", + "description" : "LunarG HUD layer", + "functions": { + "vkGetInstanceProcAddr": "OverlayLayer_GetInstanceProcAddr", + "vkGetDeviceProcAddr": "OverlayLayer_GetDeviceProcAddr" + }, + "instance_extensions": [ + { + "name": "VK_EXT_debug_report", + "spec_version": "1" + }, + { + "name": "VK_VENDOR_ext_x", + "spec_version": "3" + } + ], + "device_extensions": [ + { + "name": "VK_EXT_debug_marker", + "spec_version": "1", + "entrypoints": ["vkCmdDbgMarkerBegin", "vkCmdDbgMarkerEnd"] + } + ], + "enable_environment": { + "ENABLE_LAYER_OVERLAY_1": "1" + }, + "disable_environment": { + "DISABLE_LAYER_OVERLAY_1": "" + } + } } ``` The "library\_path" specifies either a filename, a relative pathname, or a full diff --git a/loader/loader.c b/loader/loader.c index 151c7d73..1e74a6d9 100644 --- a/loader/loader.c +++ b/loader/loader.c @@ -1798,24 +1798,18 @@ static void loader_add_layer_property_meta( } -/** - * Given a cJSON struct (json) of the top level JSON object from layer manifest - * file, add entry to the layer_list. - * Fill out the layer_properties in this list entry from the input cJSON object. - * - * \returns - * void - * layer_list has a new entry and initialized accordingly. - * If the json input object does not have all the required fields no entry - * is added to the list. - */ -static void -loader_add_layer_properties(const struct loader_instance *inst, - struct loader_layer_list *layer_instance_list, - cJSON *json, bool is_implicit, char *filename) { - /* Fields in layer manifest file that are required: - * (required) “file_format_version” - * following are required in the "layer" object: +static void loader_read_json_layer( + const struct loader_instance *inst, + struct loader_layer_list *layer_instance_list, cJSON *layer_node, + cJSON *item, cJSON *disable_environment, bool is_implicit, char *filename) { + char *temp; + char *name, *type, *library_path, *api_version; + char *implementation_version, *description; + cJSON *ext_item; + VkExtensionProperties ext_prop; + + /* + * The following are required in the "layer" object: * (required) "name" * (required) "type" * (required) “library_path” @@ -1823,40 +1817,8 @@ loader_add_layer_properties(const struct loader_instance *inst, * (required) “implementation_version” * (required) “description” * (required for implicit layers) “disable_environment” - * - * First get all required items and if any missing abort */ - cJSON *item, *layer_node, *ext_item; - char *temp; - char *name, *type, *library_path, *api_version; - char *implementation_version, *description; - cJSON *disable_environment = NULL; - int i, j; - VkExtensionProperties ext_prop; - item = cJSON_GetObjectItem(json, "file_format_version"); - if (item == NULL) { - return; - } - char *file_vers = cJSON_PrintUnformatted(item); - loader_log(inst, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, 0, - "Found manifest file %s, version %s", filename, file_vers); - if (strcmp(file_vers, "\"1.0.0\"") != 0) - loader_log(inst, VK_DEBUG_REPORT_WARNING_BIT_EXT, 0, - "Unexpected manifest file version (expected 1.0.0), may " - "cause errors"); - loader_tls_heap_free(file_vers); - - layer_node = cJSON_GetObjectItem(json, "layer"); - if (layer_node == NULL) { - loader_log(inst, VK_DEBUG_REPORT_WARNING_BIT_EXT, 0, - "Can't find \"layer\" object in manifest JSON file, " - "skipping this file"); - return; - } - - // loop through all "layer" objects in the file - do { #define GET_JSON_OBJECT(node, var) \ { \ var = cJSON_GetObjectItem(node, #var); \ @@ -1866,7 +1828,7 @@ loader_add_layer_properties(const struct loader_instance *inst, "Didn't find required layer object %s in manifest " \ "JSON file, skipping this layer", \ #var); \ - continue; \ + return; \ } \ } #define GET_JSON_ITEM(node, var) \ @@ -1878,7 +1840,7 @@ loader_add_layer_properties(const struct loader_instance *inst, "Didn't find required layer value %s in manifest JSON " \ "file, skipping this layer", \ #var); \ - continue; \ + return; \ } \ temp = cJSON_Print(item); \ temp[strlen(temp) - 1] = '\0'; \ @@ -1886,94 +1848,91 @@ loader_add_layer_properties(const struct loader_instance *inst, strcpy(var, &temp[1]); \ loader_tls_heap_free(temp); \ } - GET_JSON_ITEM(layer_node, name) - GET_JSON_ITEM(layer_node, type) - GET_JSON_ITEM(layer_node, library_path) - GET_JSON_ITEM(layer_node, api_version) - GET_JSON_ITEM(layer_node, implementation_version) - GET_JSON_ITEM(layer_node, description) - if (is_implicit) { - GET_JSON_OBJECT(layer_node, disable_environment) - } + GET_JSON_ITEM(layer_node, name) + GET_JSON_ITEM(layer_node, type) + GET_JSON_ITEM(layer_node, library_path) + GET_JSON_ITEM(layer_node, api_version) + GET_JSON_ITEM(layer_node, implementation_version) + GET_JSON_ITEM(layer_node, description) + if (is_implicit) { + GET_JSON_OBJECT(layer_node, disable_environment) + } #undef GET_JSON_ITEM #undef GET_JSON_OBJECT - // add list entry - struct loader_layer_properties *props = NULL; - if (!strcmp(type, "DEVICE")) { - loader_log(inst, VK_DEBUG_REPORT_WARNING_BIT_EXT, 0, - "Device layers are deprecated skipping this layer"); - layer_node = layer_node->next; - continue; - - } - // Allow either GLOBAL or INSTANCE type interchangeably to handle - // layers that must work with older loaders - if (!strcmp(type, "INSTANCE") || !strcmp(type, "GLOBAL")) { - if (layer_instance_list == NULL) { - layer_node = layer_node->next; - continue; - } - props = loader_get_next_layer_property(inst, layer_instance_list); - props->type = (is_implicit) ? VK_LAYER_TYPE_INSTANCE_IMPLICIT - : VK_LAYER_TYPE_INSTANCE_EXPLICIT; - } - - if (props == NULL) { + // add list entry + struct loader_layer_properties *props = NULL; + if (!strcmp(type, "DEVICE")) { + loader_log(inst, VK_DEBUG_REPORT_WARNING_BIT_EXT, 0, + "Device layers are deprecated skipping this layer"); + layer_node = layer_node->next; + return; + } + // Allow either GLOBAL or INSTANCE type interchangeably to handle + // layers that must work with older loaders + if (!strcmp(type, "INSTANCE") || !strcmp(type, "GLOBAL")) { + if (layer_instance_list == NULL) { layer_node = layer_node->next; - continue; + return; } + props = loader_get_next_layer_property(inst, layer_instance_list); + props->type = (is_implicit) ? VK_LAYER_TYPE_INSTANCE_IMPLICIT + : VK_LAYER_TYPE_INSTANCE_EXPLICIT; + } - strncpy(props->info.layerName, name, sizeof(props->info.layerName)); - props->info.layerName[sizeof(props->info.layerName) - 1] = '\0'; + if (props == NULL) { + layer_node = layer_node->next; + return; + } - char *fullpath = props->lib_name; - char *rel_base; - if (loader_platform_is_path(library_path)) { - // a relative or absolute path - char *name_copy = loader_stack_alloc(strlen(filename) + 1); - strcpy(name_copy, filename); - rel_base = loader_platform_dirname(name_copy); - loader_expand_path(library_path, rel_base, MAX_STRING_SIZE, - fullpath); - } else { - // a filename which is assumed in a system directory - loader_get_fullpath(library_path, DEFAULT_VK_LAYERS_PATH, - MAX_STRING_SIZE, fullpath); - } - props->info.specVersion = loader_make_version(api_version); - props->info.implementationVersion = atoi(implementation_version); - strncpy((char *)props->info.description, description, - sizeof(props->info.description)); - props->info.description[sizeof(props->info.description) - 1] = '\0'; - if (is_implicit) { - if (!disable_environment || !disable_environment->child) { - loader_log( - inst, VK_DEBUG_REPORT_WARNING_BIT_EXT, 0, - "Didn't find required layer child value disable_environment" - "in manifest JSON file, skipping this layer"); - layer_node = layer_node->next; - continue; - } - strncpy(props->disable_env_var.name, - disable_environment->child->string, - sizeof(props->disable_env_var.name)); - props->disable_env_var - .name[sizeof(props->disable_env_var.name) - 1] = '\0'; - strncpy(props->disable_env_var.value, - disable_environment->child->valuestring, - sizeof(props->disable_env_var.value)); - props->disable_env_var - .value[sizeof(props->disable_env_var.value) - 1] = '\0'; + strncpy(props->info.layerName, name, sizeof(props->info.layerName)); + props->info.layerName[sizeof(props->info.layerName) - 1] = '\0'; + + char *fullpath = props->lib_name; + char *rel_base; + if (loader_platform_is_path(library_path)) { + // a relative or absolute path + char *name_copy = loader_stack_alloc(strlen(filename) + 1); + strcpy(name_copy, filename); + rel_base = loader_platform_dirname(name_copy); + loader_expand_path(library_path, rel_base, MAX_STRING_SIZE, fullpath); + } else { + // a filename which is assumed in a system directory + loader_get_fullpath(library_path, DEFAULT_VK_LAYERS_PATH, + MAX_STRING_SIZE, fullpath); + } + props->info.specVersion = loader_make_version(api_version); + props->info.implementationVersion = atoi(implementation_version); + strncpy((char *)props->info.description, description, + sizeof(props->info.description)); + props->info.description[sizeof(props->info.description) - 1] = '\0'; + if (is_implicit) { + if (!disable_environment || !disable_environment->child) { + loader_log( + inst, VK_DEBUG_REPORT_WARNING_BIT_EXT, 0, + "Didn't find required layer child value disable_environment" + "in manifest JSON file, skipping this layer"); + layer_node = layer_node->next; + return; } + strncpy(props->disable_env_var.name, disable_environment->child->string, + sizeof(props->disable_env_var.name)); + props->disable_env_var.name[sizeof(props->disable_env_var.name) - 1] = + '\0'; + strncpy(props->disable_env_var.value, + disable_environment->child->valuestring, + sizeof(props->disable_env_var.value)); + props->disable_env_var.value[sizeof(props->disable_env_var.value) - 1] = + '\0'; + } /** - * Now get all optional items and objects and put in list: - * functions - * instance_extensions - * device_extensions - * enable_environment (implicit layers only) - */ +* Now get all optional items and objects and put in list: +* functions +* instance_extensions +* device_extensions +* enable_environment (implicit layers only) +*/ #define GET_JSON_OBJECT(node, var) \ { var = cJSON_GetObjectItem(node, #var); } #define GET_JSON_ITEM(node, var) \ @@ -1988,133 +1947,251 @@ loader_add_layer_properties(const struct loader_instance *inst, } \ } - cJSON *instance_extensions, *device_extensions, *functions, - *enable_environment; - cJSON *entrypoints; - char *vkGetInstanceProcAddr, *vkGetDeviceProcAddr, *spec_version; - char **entry_array; - vkGetInstanceProcAddr = NULL; - vkGetDeviceProcAddr = NULL; - spec_version = NULL; - entrypoints = NULL; - entry_array = NULL; - /** - * functions - * vkGetInstanceProcAddr - * vkGetDeviceProcAddr - */ - GET_JSON_OBJECT(layer_node, functions) - if (functions != NULL) { - GET_JSON_ITEM(functions, vkGetInstanceProcAddr) - GET_JSON_ITEM(functions, vkGetDeviceProcAddr) - if (vkGetInstanceProcAddr != NULL) - strncpy(props->functions.str_gipa, vkGetInstanceProcAddr, - sizeof(props->functions.str_gipa)); - props->functions.str_gipa[sizeof(props->functions.str_gipa) - 1] = - '\0'; - if (vkGetDeviceProcAddr != NULL) - strncpy(props->functions.str_gdpa, vkGetDeviceProcAddr, - sizeof(props->functions.str_gdpa)); - props->functions.str_gdpa[sizeof(props->functions.str_gdpa) - 1] = - '\0'; - } - /** - * instance_extensions - * array of - * name - * spec_version - */ - GET_JSON_OBJECT(layer_node, instance_extensions) - if (instance_extensions != NULL) { - int count = cJSON_GetArraySize(instance_extensions); - for (i = 0; i < count; i++) { - ext_item = cJSON_GetArrayItem(instance_extensions, i); - GET_JSON_ITEM(ext_item, name) - GET_JSON_ITEM(ext_item, spec_version) - if (name != NULL) { - strncpy(ext_prop.extensionName, name, - sizeof(ext_prop.extensionName)); - ext_prop.extensionName[sizeof(ext_prop.extensionName) - 1] = - '\0'; - } - ext_prop.specVersion = atoi(spec_version); - bool ext_unsupported = - wsi_unsupported_instance_extension(&ext_prop); - if (!ext_unsupported) { - loader_add_to_ext_list( - inst, &props->instance_extension_list, 1, &ext_prop); - } + cJSON *instance_extensions, *device_extensions, *functions, + *enable_environment; + cJSON *entrypoints; + char *vkGetInstanceProcAddr, *vkGetDeviceProcAddr, *spec_version; + char **entry_array; + vkGetInstanceProcAddr = NULL; + vkGetDeviceProcAddr = NULL; + spec_version = NULL; + entrypoints = NULL; + entry_array = NULL; + int i, j; + + /** + * functions + * vkGetInstanceProcAddr + * vkGetDeviceProcAddr + */ + GET_JSON_OBJECT(layer_node, functions) + if (functions != NULL) { + GET_JSON_ITEM(functions, vkGetInstanceProcAddr) + GET_JSON_ITEM(functions, vkGetDeviceProcAddr) + if (vkGetInstanceProcAddr != NULL) + strncpy(props->functions.str_gipa, vkGetInstanceProcAddr, + sizeof(props->functions.str_gipa)); + props->functions.str_gipa[sizeof(props->functions.str_gipa) - 1] = '\0'; + if (vkGetDeviceProcAddr != NULL) + strncpy(props->functions.str_gdpa, vkGetDeviceProcAddr, + sizeof(props->functions.str_gdpa)); + props->functions.str_gdpa[sizeof(props->functions.str_gdpa) - 1] = '\0'; + } + /** + * instance_extensions + * array of + * name + * spec_version + */ + GET_JSON_OBJECT(layer_node, instance_extensions) + if (instance_extensions != NULL) { + int count = cJSON_GetArraySize(instance_extensions); + for (i = 0; i < count; i++) { + ext_item = cJSON_GetArrayItem(instance_extensions, i); + GET_JSON_ITEM(ext_item, name) + GET_JSON_ITEM(ext_item, spec_version) + if (name != NULL) { + strncpy(ext_prop.extensionName, name, + sizeof(ext_prop.extensionName)); + ext_prop.extensionName[sizeof(ext_prop.extensionName) - 1] = + '\0'; + } + ext_prop.specVersion = atoi(spec_version); + bool ext_unsupported = + wsi_unsupported_instance_extension(&ext_prop); + if (!ext_unsupported) { + loader_add_to_ext_list(inst, &props->instance_extension_list, 1, + &ext_prop); } } - /** - * device_extensions - * array of - * name - * spec_version - * entrypoints - */ - GET_JSON_OBJECT(layer_node, device_extensions) - if (device_extensions != NULL) { - int count = cJSON_GetArraySize(device_extensions); - for (i = 0; i < count; i++) { - ext_item = cJSON_GetArrayItem(device_extensions, i); - GET_JSON_ITEM(ext_item, name) - GET_JSON_ITEM(ext_item, spec_version) - if (name != NULL) { - strncpy(ext_prop.extensionName, name, - sizeof(ext_prop.extensionName)); - ext_prop.extensionName[sizeof(ext_prop.extensionName) - 1] = - '\0'; - } - ext_prop.specVersion = atoi(spec_version); - // entrypoints = cJSON_GetObjectItem(ext_item, "entrypoints"); - GET_JSON_OBJECT(ext_item, entrypoints) - int entry_count; - if (entrypoints == NULL) { - loader_add_to_dev_ext_list(inst, - &props->device_extension_list, - &ext_prop, 0, NULL); - continue; - } - entry_count = cJSON_GetArraySize(entrypoints); - if (entry_count) - entry_array = (char **)loader_stack_alloc(sizeof(char *) * - entry_count); - for (j = 0; j < entry_count; j++) { - ext_item = cJSON_GetArrayItem(entrypoints, j); - if (ext_item != NULL) { - temp = cJSON_Print(ext_item); - temp[strlen(temp) - 1] = '\0'; - entry_array[j] = loader_stack_alloc(strlen(temp) + 1); - strcpy(entry_array[j], &temp[1]); - loader_tls_heap_free(temp); - } - } + } + /** + * device_extensions + * array of + * name + * spec_version + * entrypoints + */ + GET_JSON_OBJECT(layer_node, device_extensions) + if (device_extensions != NULL) { + int count = cJSON_GetArraySize(device_extensions); + for (i = 0; i < count; i++) { + ext_item = cJSON_GetArrayItem(device_extensions, i); + GET_JSON_ITEM(ext_item, name) + GET_JSON_ITEM(ext_item, spec_version) + if (name != NULL) { + strncpy(ext_prop.extensionName, name, + sizeof(ext_prop.extensionName)); + ext_prop.extensionName[sizeof(ext_prop.extensionName) - 1] = + '\0'; + } + ext_prop.specVersion = atoi(spec_version); + // entrypoints = cJSON_GetObjectItem(ext_item, "entrypoints"); + GET_JSON_OBJECT(ext_item, entrypoints) + int entry_count; + if (entrypoints == NULL) { loader_add_to_dev_ext_list(inst, &props->device_extension_list, - &ext_prop, entry_count, entry_array); + &ext_prop, 0, NULL); + continue; } - } - if (is_implicit) { - GET_JSON_OBJECT(layer_node, enable_environment) - - // enable_environment is optional - if (enable_environment) { - strncpy(props->enable_env_var.name, - enable_environment->child->string, - sizeof(props->enable_env_var.name)); - props->enable_env_var - .name[sizeof(props->enable_env_var.name) - 1] = '\0'; - strncpy(props->enable_env_var.value, - enable_environment->child->valuestring, - sizeof(props->enable_env_var.value)); - props->enable_env_var - .value[sizeof(props->enable_env_var.value) - 1] = '\0'; + entry_count = cJSON_GetArraySize(entrypoints); + if (entry_count) + entry_array = + (char **)loader_stack_alloc(sizeof(char *) * entry_count); + for (j = 0; j < entry_count; j++) { + ext_item = cJSON_GetArrayItem(entrypoints, j); + if (ext_item != NULL) { + temp = cJSON_Print(ext_item); + temp[strlen(temp) - 1] = '\0'; + entry_array[j] = loader_stack_alloc(strlen(temp) + 1); + strcpy(entry_array[j], &temp[1]); + loader_tls_heap_free(temp); + } } + loader_add_to_dev_ext_list(inst, &props->device_extension_list, + &ext_prop, entry_count, entry_array); + } + } + if (is_implicit) { + GET_JSON_OBJECT(layer_node, enable_environment) + + // enable_environment is optional + if (enable_environment) { + strncpy(props->enable_env_var.name, + enable_environment->child->string, + sizeof(props->enable_env_var.name)); + props->enable_env_var.name[sizeof(props->enable_env_var.name) - 1] = + '\0'; + strncpy(props->enable_env_var.value, + enable_environment->child->valuestring, + sizeof(props->enable_env_var.value)); + props->enable_env_var + .value[sizeof(props->enable_env_var.value) - 1] = '\0'; } + } #undef GET_JSON_ITEM #undef GET_JSON_OBJECT - layer_node = layer_node->next; - } while (layer_node != NULL); +} + +/** + * Given a cJSON struct (json) of the top level JSON object from layer manifest + * file, add entry to the layer_list. Fill out the layer_properties in this list + * entry from the input cJSON object. + * + * \returns + * void + * layer_list has a new entry and initialized accordingly. + * If the json input object does not have all the required fields no entry + * is added to the list. + */ +static void +loader_add_layer_properties(const struct loader_instance *inst, + struct loader_layer_list *layer_instance_list, + cJSON *json, bool is_implicit, char *filename) { + /* Fields in layer manifest file that are required: + * (required) “file_format_version” + * + * If more than one "layer" object are to be used, use the "layers" array instead. + * + * First get all required items and if any missing abort + */ + + cJSON *item, *layers_node, *layer_node; + uint16_t file_major_vers = 0; + uint16_t file_minor_vers = 0; + uint16_t file_patch_vers = 0; + char *vers_tok; + cJSON *disable_environment = NULL; + item = cJSON_GetObjectItem(json, "file_format_version"); + if (item == NULL) { + return; + } + char *file_vers = cJSON_PrintUnformatted(item); + loader_log(inst, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, 0, + "Found manifest file %s, version %s", filename, file_vers); + // Get the major/minor/and patch as integers for easier comparison + vers_tok = strtok(file_vers, ".\"\n\r"); + if (NULL != vers_tok) { + file_major_vers = atoi(vers_tok); + vers_tok = strtok(NULL, ".\"\n\r"); + if (NULL != vers_tok) { + file_minor_vers = atoi(vers_tok); + vers_tok = strtok(NULL, ".\"\n\r"); + if (NULL != vers_tok) { + file_patch_vers = atoi(vers_tok); + } + } + } + if (file_major_vers != 1 || file_minor_vers != 0 || file_patch_vers > 1) { + loader_log(inst, VK_DEBUG_REPORT_WARNING_BIT_EXT, 0, + "%s Unexpected manifest file version (expected 1.0.0 or " + "1.0.1), may cause errors", + filename); + } + loader_tls_heap_free(file_vers); + // If "layers" is present, read in the array of layer objects + layers_node = cJSON_GetObjectItem(json, "layers"); + if (layers_node != NULL) { + int numItems = cJSON_GetArraySize(layers_node); + if (file_major_vers == 1 && file_minor_vers == 0 && + file_patch_vers == 0) { + loader_log(inst, VK_DEBUG_REPORT_WARNING_BIT_EXT, 0, + "\"layers\" tag not officially added until file version " + "1.0.1, but %s is reporting version %s", + filename, file_vers); + } + for (int curLayer = 0; curLayer < numItems; curLayer++) { + layer_node = cJSON_GetArrayItem(layers_node, curLayer); + if (layer_node == NULL) { + loader_log(inst, VK_DEBUG_REPORT_WARNING_BIT_EXT, 0, + "Can't find \"layers\" array element %d object in " + "manifest JSON file %s, skipping this file", + curLayer, filename); + return; + } + loader_read_json_layer(inst, layer_instance_list, layer_node, item, + disable_environment, is_implicit, filename); + } + } else { + // Otherwise, try to read in individual layers + layer_node = cJSON_GetObjectItem(json, "layer"); + if (layer_node == NULL) { + loader_log(inst, VK_DEBUG_REPORT_WARNING_BIT_EXT, 0, + "Can't find \"layer\" object in manifest JSON file %s, " + "skipping this file", + filename); + return; + } + // Loop through all "layer" objects in the file to get a count of them + // first. + uint16_t layer_count = 0; + cJSON *tempNode = layer_node; + do { + tempNode = tempNode->next; + layer_count++; + } while (tempNode != NULL); + /* + * Throw a warning if we encounter multiple "layer" objects in file + * versions newer than 1.0.0. Having multiple objects with the same + * name at the same level is actually a JSON standard violation. + */ + if (layer_count > 1 && + (file_major_vers > 1 || + !(file_minor_vers == 0 && file_patch_vers == 0))) { + loader_log(inst, VK_DEBUG_REPORT_ERROR_BIT_EXT, 0, + "Multiple \"layer\" nodes are deprecated starting in " + "file version \"1.0.1\". Please use \"layers\" : [] " + "array instead in %s.", + filename); + } else { + do { + loader_read_json_layer(inst, layer_instance_list, layer_node, + item, disable_environment, is_implicit, + filename); + layer_node = layer_node->next; + } while (layer_node != NULL); + } + } return; } @@ -2373,6 +2450,10 @@ void loader_destroy_icd_lib_list() {} void loader_icd_scan(const struct loader_instance *inst, struct loader_icd_libs *icds) { char *file_str; + uint16_t file_major_vers = 0; + uint16_t file_minor_vers = 0; + uint16_t file_patch_vers = 0; + char *vers_tok; struct loader_manifest_files manifest_files; loader_scanned_icd_init(inst, icds); @@ -2399,11 +2480,24 @@ void loader_icd_scan(const struct loader_instance *inst, return; } char *file_vers = cJSON_Print(item); + // Get the major/minor/and patch as integers for easier comparison + vers_tok = strtok(file_vers, ".\"\n\r"); + if (NULL != vers_tok) { + file_major_vers = atoi(vers_tok); + vers_tok = strtok(NULL, ".\"\n\r"); + if (NULL != vers_tok) { + file_minor_vers = atoi(vers_tok); + vers_tok = strtok(NULL, ".\"\n\r"); + if (NULL != vers_tok) { + file_patch_vers = atoi(vers_tok); + } + } + } loader_log(inst, VK_DEBUG_REPORT_INFORMATION_BIT_EXT, 0, "Found manifest file %s, version %s", file_str, file_vers); - if (strcmp(file_vers, "\"1.0.0\"") != 0) + if (file_major_vers != 1 || file_minor_vers != 0 || file_patch_vers > 1) loader_log(inst, VK_DEBUG_REPORT_WARNING_BIT_EXT, 0, - "Unexpected manifest file version (expected 1.0.0), may " + "Unexpected manifest file version (expected 1.0.0 or 1.0.1), may " "cause errors"); loader_tls_heap_free(file_vers); itemICD = cJSON_GetObjectItem(json, "ICD"); -- cgit v1.2.3 From db8517fa8168419bc3a410b499b108a920b82e65 Mon Sep 17 00:00:00 2001 From: Mark Young Date: Tue, 14 Jun 2016 14:59:44 -0600 Subject: loader: GH362 - Fix json output of escape chars The strings from the JSON file already add escape characters. So, \ becomes \\ in the JSON file strings. However, the cJSON library was adding \\ for ever encountered \ when converting to a string. This became messy as C:\\vulkanSDK\\layerfile.json became C:\\\\vulkanSDK\\\\layerfile.json. Change-Id: I006252e33d6e91e2bef704dd5dee0777105388a7 --- loader/cJSON.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/loader/cJSON.c b/loader/cJSON.c index f28eadb7..fc3ba049 100644 --- a/loader/cJSON.c +++ b/loader/cJSON.c @@ -423,7 +423,6 @@ static char *print_string_ptr(const char *str, printbuffer *p) { if ((unsigned char)*ptr > 31 && *ptr != '\"' && *ptr != '\\') *ptr2++ = *ptr++; else { - *ptr2++ = '\\'; switch (token = *ptr++) { case '\\': *ptr2++ = '\\'; @@ -432,19 +431,19 @@ static char *print_string_ptr(const char *str, printbuffer *p) { *ptr2++ = '\"'; break; case '\b': - *ptr2++ = 'b'; + *ptr2++ = '\b'; break; case '\f': - *ptr2++ = 'f'; + *ptr2++ = '\f'; break; case '\n': - *ptr2++ = 'n'; + *ptr2++ = '\n'; break; case '\r': - *ptr2++ = 'r'; + *ptr2++ = '\r'; break; case '\t': - *ptr2++ = 't'; + *ptr2++ = '\t'; break; default: sprintf(ptr2, "u%04x", token); -- cgit v1.2.3 From d1fccb3236b9c7bff16108aac84dfc21b60a8025 Mon Sep 17 00:00:00 2001 From: Rene Lindsay Date: Wed, 15 Jun 2016 08:55:32 -0700 Subject: vulkaninfo: Show TexelOffset in decimal, instead of hex. --- demos/vulkaninfo.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/demos/vulkaninfo.c b/demos/vulkaninfo.c index 66093edc..866756a0 100644 --- a/demos/vulkaninfo.c +++ b/demos/vulkaninfo.c @@ -488,7 +488,7 @@ static void app_dev_init(struct app_dev *dev, struct app_gpu *gpu) { uint32_t count = 0; - /* Scan layers */ + // Scan layers VkLayerProperties *device_layer_properties = NULL; struct layer_extension_list *device_layers = NULL; @@ -522,7 +522,7 @@ static void app_dev_init(struct app_dev *dev, struct app_gpu *gpu) { memcpy(&dst_info->layer_properties, src_info, sizeof(VkLayerProperties)); - /* Save away layer extension info for report */ + // Save away layer extension info for report app_get_physical_device_layer_extensions( gpu, src_info->layerName, &dst_info->extension_count, &dst_info->extension_properties); @@ -1194,19 +1194,19 @@ static void app_dump_limits(const VkPhysicalDeviceLimits *limits) printf("\t\tmaxViewports = %u\n", limits->maxViewports ); printf("\t\tmaxViewportDimensions[0] = %u\n", limits->maxViewportDimensions[0] ); printf("\t\tmaxViewportDimensions[1] = %u\n", limits->maxViewportDimensions[1] ); - printf("\t\tviewportBoundsRange[0] = %f\n", limits->viewportBoundsRange[0] ); - printf("\t\tviewportBoundsRange[1] = %f\n", limits->viewportBoundsRange[1] ); + printf("\t\tviewportBoundsRange[0] =%13f\n", limits->viewportBoundsRange[0] ); + printf("\t\tviewportBoundsRange[1] =%13f\n", limits->viewportBoundsRange[1] ); printf("\t\tviewportSubPixelBits = %u\n", limits->viewportSubPixelBits ); printf("\t\tminMemoryMapAlignment = " PRINTF_SIZE_T_SPECIFIER "\n", limits->minMemoryMapAlignment ); printf("\t\tminTexelBufferOffsetAlignment = 0x%" PRIxLEAST64 "\n", limits->minTexelBufferOffsetAlignment ); printf("\t\tminUniformBufferOffsetAlignment = 0x%" PRIxLEAST64 "\n", limits->minUniformBufferOffsetAlignment ); printf("\t\tminStorageBufferOffsetAlignment = 0x%" PRIxLEAST64 "\n", limits->minStorageBufferOffsetAlignment ); - printf("\t\tminTexelOffset = 0x%" PRIxLEAST32 "\n", limits->minTexelOffset ); - printf("\t\tmaxTexelOffset = 0x%" PRIxLEAST32 "\n", limits->maxTexelOffset ); - printf("\t\tminTexelGatherOffset = 0x%" PRIxLEAST32 "\n", limits->minTexelGatherOffset ); - printf("\t\tmaxTexelGatherOffset = 0x%" PRIxLEAST32 "\n", limits->maxTexelGatherOffset ); - printf("\t\tminInterpolationOffset = %f\n", limits->minInterpolationOffset ); - printf("\t\tmaxInterpolationOffset = %f\n", limits->maxInterpolationOffset ); + printf("\t\tminTexelOffset =%3d\n", limits->minTexelOffset ); + printf("\t\tmaxTexelOffset =%3d\n", limits->maxTexelOffset ); + printf("\t\tminTexelGatherOffset =%3d\n", limits->minTexelGatherOffset ); + printf("\t\tmaxTexelGatherOffset =%3d\n", limits->maxTexelGatherOffset ); + printf("\t\tminInterpolationOffset =%9f\n", limits->minInterpolationOffset ); + printf("\t\tmaxInterpolationOffset =%9f\n", limits->maxInterpolationOffset ); printf("\t\tsubPixelInterpolationOffsetBits = %u\n", limits->subPixelInterpolationOffsetBits ); printf("\t\tmaxFramebufferWidth = %u\n", limits->maxFramebufferWidth ); printf("\t\tmaxFramebufferHeight = %u\n", limits->maxFramebufferHeight ); -- cgit v1.2.3 From 789776f7754ffcd03eecfb6326ee4eb1a489d841 Mon Sep 17 00:00:00 2001 From: Mark Mueller Date: Mon, 13 Jun 2016 17:52:06 -0600 Subject: tests: GH421 vkUpdateDescriptorSets tests A) Adding the WriteDescriptorSetIntegrityCheck test, which verifies some requirements of chapter 13.2.3 of the Vulkan Spec 1) A uniform buffer update must have a valid buffer index. 2) When using an array of descriptors in a single WriteDescriptor, the descriptor types and stageflags must all be the same. 3) Immutable Sampler state must match across descriptors The above tests also exercise cases where descriptors are updated with consecutive bindings both correctly and incorrectly B) adding a MissingClearAttachment test that points to a wrong colorAttachment index in a VkClearAttachment structure passed to vkCmdClearAttachments C) update vk_validation_layer_details.md to reflect above changes. Change-Id: I3f4f2233371b68caf23b5a4111d63a94765121c3 --- layers/vk_validation_layer_details.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/layers/vk_validation_layer_details.md b/layers/vk_validation_layer_details.md index 1d76a25c..41efec05 100644 --- a/layers/vk_validation_layer_details.md +++ b/layers/vk_validation_layer_details.md @@ -51,7 +51,7 @@ The Draw State portion of the core validation layer tracks state leading into Dr | Valid Secondary CommandBuffer | Validates that no primary command buffers are sent to vkCmdExecuteCommands() are | INVALID_SECONDARY_COMMAND_BUFFER | vkCmdExecuteCommands | ExecuteCommandsPrimaryCB | NA | | Invalid Descriptor Set | Invalid Descriptor Set used. Either never created or already destroyed. | INVALID_DESCRIPTOR_SET | vkQueueSubmit | TODO | Create Test | | Descriptor Type | Verify Descriptor type in bound descriptor set layout matches descriptor type specified in update. This also includes mismatches in the TYPES of copied descriptors. | DESCRIPTOR_TYPE_MISMATCH | vkUpdateDescriptorSets | DSTypeMismatch CopyDescriptorUpdateErrors | NA | -| Descriptor StageFlags | Verify all descriptors within a single write update have the same stageFlags | DESCRIPTOR_STAGEFLAGS_MISMATCH | vkUpdateDescriptorSets | TODO | Test this case | +| Descriptor StageFlags | Verify all descriptors within a single write update have the same stageFlags | DESCRIPTOR_STAGEFLAGS_MISMATCH | vkUpdateDescriptorSets | WriteDescriptorSetIntegrityCheck | | | DS Update Size | DS update out of bounds for given layout section. | DESCRIPTOR_UPDATE_OUT_OF_BOUNDS | vkUpdateDescriptorSets | DSUpdateOutOfBounds CopyDescriptorUpdateErrors | NA | | Descriptor Pool empty | Attempt to allocate descriptor type from descriptor pool when no more of that type are available to be allocated. | DESCRIPTOR_POOL_EMPTY | vkAllocateDescriptorSets | AllocDescriptorFromEmptyPool | NA | | Free from NON_FREE Pool | It's invalid to call vkFreeDescriptorSets() on Sets that were allocated from a Pool created with NON_FREE usage. | CANT_FREE_FROM_NON_FREE_POOL | vkFreeDescriptorSets | TODO | NA | @@ -79,11 +79,11 @@ The Draw State portion of the core validation layer tracks state leading into Dr | Viewport and Scissors match | In PSO viewportCount and scissorCount must match. Also for each count that is non-zero, there corresponding data array ptr should be non-NULL. | VIEWPORT_SCISSOR_MISMATCH | vkCreateGraphicsPipelines vkCmdSetViewport vkCmdSetScissor | TODO | Implement validation test | | Valid Image Aspects for descriptor Updates | When updating ImageView for Descriptor Sets with layout of DEPTH_STENCIL type, the Image Aspect must not have both the DEPTH and STENCIL aspects set, but must have one of the two set. For COLOR_ATTACHMENT, aspect must have COLOR_BIT set. | INVALID_IMAGE_ASPECT | vkUpdateDescriptorSets | DepthStencilImageViewWithColorAspectBitError | This test hits Image layer error, but tough to create case that that skips that error and gets to VK_LAYER_LUNARG_core_validaton draw state error. | | Valid sampler descriptor Updates | An invalid sampler is used when updating SAMPLER descriptor. | SAMPLER_DESCRIPTOR_ERROR | vkUpdateDescriptorSets | SampleDescriptorUpdateError | Currently only making sure sampler handle is known, can add further validation for sampler parameters | -| Immutable sampler update consistency | Within a single write update, all sampler updates must use either immutable samplers or non-immutable samplers, but not a combination of both. | INCONSISTENT_IMMUTABLE_SAMPLER_UPDATE | vkUpdateDescriptorSets | TODO | Write a test for this case | +| Immutable sampler update consistency | Within a single write update, all sampler updates must use either immutable samplers or non-immutable samplers, but not a combination of both. | INCONSISTENT_IMMUTABLE_SAMPLER_UPDATE | vkUpdateDescriptorSets | WriteDescriptorSetIntegrityCheck | | | Valid imageView descriptor Updates | An invalid imageView is used when updating *_IMAGE or *_ATTACHMENT descriptor. | IMAGEVIEW_DESCRIPTOR_ERROR | vkUpdateDescriptorSets | ImageViewDescriptorUpdateError | Currently only making sure imageView handle is known, can add further validation for imageView and underlying image parameters | | Valid bufferView descriptor Updates | An invalid bufferView is used when updating *_TEXEL_BUFFER descriptor. | BUFFERVIEW_DESCRIPTOR_ERROR | vkUpdateDescriptorSets | InvalidBufferViewObject | Currently only making sure bufferView handle is known, can add further validation for bufferView parameters | -| Valid bufferInfo descriptor Updates | An invalid bufferInfo is used when updating *_UNIFORM_BUFFER* or *_STORAGE_BUFFER* descriptor. | BUFFERINFO_DESCRIPTOR_ERROR | vkUpdateDescriptorSets | TODO | Implement validation test | -| Attachment References in Subpass | Attachment reference must be present in active subpass | MISSING_ATTACHMENT_REFERENCE | vkCmdClearAttachments | TODO | Currently only making sure bufferInfo has buffer whose handle is known, can add further validation for bufferInfo parameters | +| Valid bufferInfo descriptor Updates | An invalid bufferInfo is used when updating *_UNIFORM_BUFFER* or *_STORAGE_BUFFER* descriptor. | BUFFERINFO_DESCRIPTOR_ERROR | vkUpdateDescriptorSets | WriteDescriptorSetIntegrityCheck | | +| Attachment References in Subpass | Attachment reference must be present in active subpass | MISSING_ATTACHMENT_REFERENCE | vkCmdClearAttachments | MissingClearAttachment | Currently only making sure bufferInfo has buffer whose handle is known, can add further validation for bufferInfo parameters | | Verify Image Layouts | Validate correct image layouts for presents, image transitions, command buffers and renderpasses | INVALID_IMAGE_LAYOUT | vkCreateRenderPass vkMapMemory vkQueuePresentKHR vkQueueSubmit vkCmdCopyImage vkCmdCopyImageToBuffer vkCmdWaitEvents VkCmdPipelineBarrier | InvalidImageLayout MapMemWithoutHostVisibleBit | None | | Verify Memory Access Flags/Memory Barriers | Validate correct access flags for memory barriers | INVALID_BARRIER | vkCmdWaitEvents vkCmdPipelineBarrier | InvalidBarriers | None | | Verify Memory Buffer Not Deleted | Validate Command Buffer not submitted with deleted memory buffer | INVALID_BUFFER | vkQueueSubmit | TODO | None | -- cgit v1.2.3 From efab294f76f083a03528364f68400ab415cdf74f Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Tue, 14 Jun 2016 12:11:29 -0600 Subject: layers: LX539, Validate mem types Bind[Image|Buffer]Memory did not validate that the memoryPropertyType matched the memory_requirements memory type flags for the buffer or image. Change-Id: I7007588d78408689c34df66a17cc9201a37569b1 --- layers/core_validation.cpp | 20 ++++++++++++++++++-- layers/core_validation_error_enums.h | 1 + 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 2dbfd0ab..5f254f75 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -5138,6 +5138,20 @@ VKAPI_ATTR void VKAPI_CALL DestroyImage(VkDevice device, VkImage image, const Vk } } +static bool ValidateMemoryTypes(const layer_data *dev_data, const DEVICE_MEM_INFO *mem_info, const uint32_t memory_type_bits, + const char *funcName) { + bool skip_call = false; + if (((1 << mem_info->allocInfo.memoryTypeIndex) & memory_type_bits) == 0) { + skip_call = log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, + reinterpret_cast(mem_info->mem), __LINE__, MEMTRACK_INVALID_MEM_TYPE, "MT", + "%s(): MemoryRequirements->memoryTypeBits (0x%X) for this object type are not compatible with the memory " + "type (0x%X) of this memory object 0x%" PRIx64 ".", + funcName, memory_type_bits, mem_info->allocInfo.memoryTypeIndex, + reinterpret_cast(mem_info->mem)); + } + return skip_call; +} + VKAPI_ATTR VkResult VKAPI_CALL BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memoryOffset) { layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); @@ -5159,6 +5173,7 @@ BindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem, VkDeviceS const MEMORY_RANGE range = insert_memory_ranges(buffer_handle, mem, memoryOffset, memRequirements, mem_info->bufferRanges); skipCall |= validate_memory_range(dev_data, mem_info->imageRanges, range, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT); + skipCall |= ValidateMemoryTypes(dev_data, mem_info, memRequirements.memoryTypeBits, "BindBufferMemory"); } // Validate memory requirements alignment @@ -7818,10 +7833,10 @@ bool validateEventStageMask(VkQueue queue, GLOBAL_CB_NODE *pCB, uint32_t eventCo if (sourceStageMask != stageMask && sourceStageMask != (stageMask | VK_PIPELINE_STAGE_HOST_BIT)) { skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, DRAWSTATE_INVALID_EVENT, "DS", "Submitting cmdbuffer with call to VkCmdWaitEvents " - "using srcStageMask 0x%x which must be the bitwise " + "using srcStageMask 0x%X which must be the bitwise " "OR of the stageMask parameters used in calls to " "vkCmdSetEvent and VK_PIPELINE_STAGE_HOST_BIT if " - "used with vkSetEvent but instead is 0x%x.", + "used with vkSetEvent but instead is 0x%X.", sourceStageMask, stageMask); } return skip_call; @@ -9521,6 +9536,7 @@ VKAPI_ATTR VkResult VKAPI_CALL BindImageMemory(VkDevice device, VkImage image, V const MEMORY_RANGE range = insert_memory_ranges(image_handle, mem, memoryOffset, memRequirements, mem_info->imageRanges); skipCall |= validate_memory_range(dev_data, mem_info->bufferRanges, range, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT); + skipCall |= ValidateMemoryTypes(dev_data, mem_info, memRequirements.memoryTypeBits, "vkBindImageMemory"); } print_mem_list(dev_data); diff --git a/layers/core_validation_error_enums.h b/layers/core_validation_error_enums.h index e6d0ed37..3904bdf1 100644 --- a/layers/core_validation_error_enums.h +++ b/layers/core_validation_error_enums.h @@ -39,6 +39,7 @@ enum MEM_TRACK_ERROR { MEMTRACK_REBIND_OBJECT, // Non-sparse object bindings are immutable MEMTRACK_INVALID_USAGE_FLAG, // Usage flags specified at image/buffer create conflict w/ use of object MEMTRACK_INVALID_MAP, // Size flag specified at alloc is too small for mapping range + MEMTRACK_INVALID_MEM_TYPE, // Memory Type mismatch }; // Draw State ERROR codes -- cgit v1.2.3 From 80e1171bab3c2eb14c582118e33dce83e3407744 Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Wed, 15 Jun 2016 17:48:23 -0600 Subject: layers: LX539, update layer details doc Added new error enum for memory index type mismatches. Change-Id: I6f857facc4209f103da5cef9f6561a0e4ec3c334 --- layers/vk_validation_layer_details.md | 1 + 1 file changed, 1 insertion(+) diff --git a/layers/vk_validation_layer_details.md b/layers/vk_validation_layer_details.md index 41efec05..be38a9a9 100644 --- a/layers/vk_validation_layer_details.md +++ b/layers/vk_validation_layer_details.md @@ -158,6 +158,7 @@ The Mem Tracker portion of the VK_LAYER_LUNARG_core_validation layer tracks memo | Immutable Memory Binding | Validates that non-sparse memory bindings are immutable, so objects are not re-boundt | REBIND_OBJECT | vkBindBufferMemory, vkBindImageMemory | RebindMemory | NA | | Image/Buffer Usage bits | Verify correct USAGE bits set based on how Images and Buffers are used | INVALID_USAGE_FLAG | vkCreateImage, vkCreateBuffer, vkCreateBufferView, vkCmdCopyBuffer, vkCmdCopyQueryPoolResults, vkCmdCopyImage, vkCmdBlitImage, vkCmdCopyBufferToImage, vkCmdCopyImageToBuffer, vkCmdUpdateBuffer, vkCmdFillBuffer | InvalidUsageBits | NA | | Memory Map Range Checks | Validates that Memory Mapping Requests are valid for the Memory Object (in-range, not currently mapped on Map, currently mapped on UnMap, size is non-zero) | INVALID_MAP | vkMapMemory | InvalidMemoryMapping | NA | +| Memory Type Index Checks | Validates that specified memory type indices are valid | INVALID_MEM_TYPE | vkBindImageMemory vkBindBufferMemory | BindImageInvalidMemoryType | NA | | NA | Enum used for informational messages | NONE | | TODO | None | | NA | Enum used for errors in the layer itself. This does not indicate an app issue, but instead a bug in the layer. | INTERNAL_ERROR | | TODO | None | -- cgit v1.2.3 From 8e9f6f451e05193284381b2d68d02e3b3b5aa497 Mon Sep 17 00:00:00 2001 From: Mark Young Date: Thu, 16 Jun 2016 14:57:25 -0600 Subject: build: Fix typos in CMakeLists.txt (SPRIV->SPIRV) Change-Id: I6a2b685cea8cda1fde5ae40a0beaa04f1319c6a3 --- CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e7e25b33..e5f32383 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -112,7 +112,7 @@ option(CUSTOM_SPIRV_TOOLS_BIN_ROOT "Use the user defined SPIRV_TOOLS_BINARY_ROOT #Choose natural default paths for glslang and SPIRV-Tools binaries to support custom definition by the user on the CMake command line or in the GUI set(GLSLANG_BINARY_ROOT "${CMAKE_BINARY_DIR}/../glslang" CACHE STRING "User defined path to the glslang binaries for this project") -set(SPRIV_TOOLS_BINARY_ROOT "${CMAKE_BINARY_DIR}/../SPIRV-Tools" CACHE STRING "User defined path to the SPIRV-Tools binaries for this project") +set(SPIRV_TOOLS_BINARY_ROOT "${CMAKE_BINARY_DIR}/../SPIRV-Tools" CACHE STRING "User defined path to the SPIRV-Tools binaries for this project") # Define a variable for a default root location to the gslang, SPIRV-Tools and other external sources and cache it to allow the user to customize it as needed set(EXTERNAL_SOURCE_ROOT "${CMAKE_SOURCE_DIR}/external" CACHE STRING "Root path to external sources such as glslang and SPIRV-Tools") @@ -147,8 +147,8 @@ if (WIN32) "${GSLANG_FINAL_BINARY_PATH}/SPIRV/${DEBUG_DECORATION}") if(CUSTOM_SPIRV_TOOLS_BIN_ROOT) - set (SPIRV_TOOLS_SEARCH_PATH "${SPRIV_TOOLS_BINARY_ROOT}/${BUILDTGT_DIR}/source/${RELEASE_DECORATION}") - set (SPIRV_TOOLS_DEBUG_SEARCH_PATH "${SPRIV_TOOLS_BINARY_ROOT}/${BUILDTGT_DIR}/source/${DEBUG_DECORATION}") + set (SPIRV_TOOLS_SEARCH_PATH "${SPIRV_TOOLS_BINARY_ROOT}/${BUILDTGT_DIR}/source/${RELEASE_DECORATION}") + set (SPIRV_TOOLS_DEBUG_SEARCH_PATH "${SPIRV_TOOLS_BINARY_ROOT}/${BUILDTGT_DIR}/source/${DEBUG_DECORATION}") else() set (SPIRV_TOOLS_SEARCH_PATH "${EXTERNAL_SOURCE_ROOT}/spirv-tools/${BUILDTGT_DIR}/source/${RELEASE_DECORATION}") set (SPIRV_TOOLS_DEBUG_SEARCH_PATH "${EXTERNAL_SOURCE_ROOT}/spirv-tools/${BUILDTGT_DIR}/source/${DEBUG_DECORATION}") @@ -168,7 +168,7 @@ else() endif() if(CUSTOM_SPIRV_TOOLS_BIN_ROOT) - set (SPIRV_TOOLS_SEARCH_PATH "${SPRIV_TOOLS_BINARY_ROOT}/source" ) + set (SPIRV_TOOLS_SEARCH_PATH "${SPIRV_TOOLS_BINARY_ROOT}/source" ) else() set (SPIRV_TOOLS_SEARCH_PATH "${EXTERNAL_SOURCE_ROOT}/spirv-tools/${BUILDTGT_DIR}/source" "${CMAKE_SOURCE_DIR}/../x86_64/lib/spirv-tools" ) endif() -- cgit v1.2.3 From 03f0a3823838cf90d265ec9ef2d2e313eb698a0f Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Thu, 16 Jun 2016 13:23:02 -0600 Subject: layers: GH576, Validate attachment image usage Framebuffer attachment images are created with IMAGE_USAGE flags. These flags are now validated against their attachment location in subpass description structures. Also added a check for a preserve attachment being set to UNUSED and fixed a few typos in the attachment index checking stuff. Change-Id: Id62d3539c490ce8f381d7ae606402980f11946fa --- layers/core_validation.cpp | 112 +++++++++++++++++++++++++++-------- layers/core_validation_error_enums.h | 4 ++ 2 files changed, 92 insertions(+), 24 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 5f254f75..b3635a0b 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -8178,11 +8178,67 @@ CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelin dev_data->device_dispatch_table->CmdWriteTimestamp(commandBuffer, pipelineStage, queryPool, slot); } +static bool MatchUsage(layer_data *dev_data, uint32_t count, const VkAttachmentReference *attachments, + const VkFramebufferCreateInfo *fbci, VkImageUsageFlagBits usage_flag) { + bool skip_call = false; + + for (uint32_t attach = 0; attach < count; attach++) { + if (attachments[attach].attachment != VK_ATTACHMENT_UNUSED) { + // Attachment counts are verified elsewhere, but prevent an invalid access + if (attachments[attach].attachment < fbci->attachmentCount) { + const VkImageView *image_view = &fbci->pAttachments[attachments[attach].attachment]; + VkImageViewCreateInfo *ivci = getImageViewData(dev_data, *image_view); + if (ivci != nullptr) { + const VkImageCreateInfo *ici = &getImageNode(dev_data, ivci->image)->createInfo; + if (ici != nullptr) { + if ((ici->usage & usage_flag) == 0) { + skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, + (VkDebugReportObjectTypeEXT)0, 0, __LINE__, DRAWSTATE_INVALID_IMAGE_USAGE, "DS", + "vkCreateFramebuffer: Framebuffer Attachment (%d) conflicts with the image's " + "IMAGE_USAGE flags (%s).", + attachments[attach].attachment, string_VkImageUsageFlagBits(usage_flag)); + } + } + } + } + } + } + return skip_call; +} + +static bool ValidateAttachmentImageUsage(layer_data *dev_data, const VkFramebufferCreateInfo *pCreateInfo) { + bool skip_call = false; + + const VkRenderPassCreateInfo *rpci = getRenderPass(dev_data, pCreateInfo->renderPass)->pCreateInfo; + if (rpci != nullptr) { + for (uint32_t subpass = 0; subpass < rpci->subpassCount; subpass++) { + // Verify input attachments: + skip_call |= MatchUsage(dev_data, rpci->pSubpasses[subpass].inputAttachmentCount, + rpci->pSubpasses[subpass].pInputAttachments, pCreateInfo, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT); + // Verify color attachments: + skip_call |= MatchUsage(dev_data, rpci->pSubpasses[subpass].colorAttachmentCount, + rpci->pSubpasses[subpass].pColorAttachments, pCreateInfo, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT); + // Verify depth/stencil attachments: + if (rpci->pSubpasses[subpass].pDepthStencilAttachment != nullptr) { + skip_call |= MatchUsage(dev_data, 1, rpci->pSubpasses[subpass].pDepthStencilAttachment, pCreateInfo, + VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT); + } + } + } + return skip_call; +} + VKAPI_ATTR VkResult VKAPI_CALL CreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkFramebuffer *pFramebuffer) { + bool skip_call = false; + VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); - VkResult result = dev_data->device_dispatch_table->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer); + + skip_call |= ValidateAttachmentImageUsage(dev_data, pCreateInfo); + if (skip_call == false) { + result = dev_data->device_dispatch_table->CreateFramebuffer(device, pCreateInfo, pAllocator, pFramebuffer); + } if (VK_SUCCESS == result) { // Shadow create info and store in map std::lock_guard lock(global_lock); @@ -8668,22 +8724,28 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderP } // TODO: Maybe fill list and then copy instead of locking std::unordered_map &attachment_first_read = render_pass->attachment_first_read; - std::unordered_map &attachment_first_layout = - render_pass->attachment_first_layout; + std::unordered_map &attachment_first_layout = render_pass->attachment_first_layout; for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) { const VkSubpassDescription &subpass = pCreateInfo->pSubpasses[i]; if (subpass.pipelineBindPoint != VK_PIPELINE_BIND_POINT_GRAPHICS) { - skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, - __LINE__, DRAWSTATE_INVALID_RENDERPASS, "DS", - "Pipeline bind point for subpass %d must be VK_PIPELINE_BIND_POINT_GRAPHICS.", i); + skip_call |= + log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, + DRAWSTATE_INVALID_RENDERPASS, "DS", + "CreateRenderPass: Pipeline bind point for subpass %d must be VK_PIPELINE_BIND_POINT_GRAPHICS.", i); } for (uint32_t j = 0; j < subpass.preserveAttachmentCount; ++j) { uint32_t attachment = subpass.pPreserveAttachments[j]; - if (attachment >= pCreateInfo->attachmentCount) { - skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, - __LINE__, DRAWSTATE_INVALID_RENDERPASS, "DS", - "Preserve attachment %d cannot be greater than the total number of attachments %d.", - attachment, pCreateInfo->attachmentCount); + if (attachment == VK_ATTACHMENT_UNUSED) { + skip_call |= + log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, + DRAWSTATE_INVALID_ATTACHMENT_INDEX, "DS", + "CreateRenderPass: Preserve attachment (%d) must not be VK_ATTACHMENT_UNUSED.", j); + } else if (attachment >= pCreateInfo->attachmentCount) { + skip_call |= log_msg( + dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, + DRAWSTATE_INVALID_ATTACHMENT_INDEX, "DS", + "CreateRenderPass: Preserve attachment %d cannot be greater than the total number of attachments %d.", + attachment, pCreateInfo->attachmentCount); } } for (uint32_t j = 0; j < subpass.colorAttachmentCount; ++j) { @@ -8691,19 +8753,21 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderP if (subpass.pResolveAttachments) { attachment = subpass.pResolveAttachments[j].attachment; if (attachment >= pCreateInfo->attachmentCount && attachment != VK_ATTACHMENT_UNUSED) { - skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, - __LINE__, DRAWSTATE_INVALID_RENDERPASS, "DS", - "Color attachment %d cannot be greater than the total number of attachments %d.", - attachment, pCreateInfo->attachmentCount); + skip_call |= log_msg( + dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, + DRAWSTATE_INVALID_ATTACHMENT_INDEX, "DS", + "CreateRenderPass: Resolve attachment %d cannot be greater than the total number of attachments %d.", + attachment, pCreateInfo->attachmentCount); continue; } } attachment = subpass.pColorAttachments[j].attachment; - if (attachment >= pCreateInfo->attachmentCount) { - skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, - __LINE__, DRAWSTATE_INVALID_RENDERPASS, "DS", - "Color attachment %d cannot be greater than the total number of attachments %d.", - attachment, pCreateInfo->attachmentCount); + if (attachment >= pCreateInfo->attachmentCount && attachment != VK_ATTACHMENT_UNUSED) { + skip_call |= + log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, + DRAWSTATE_INVALID_ATTACHMENT_INDEX, "DS", + "CreateRenderPass: Color attachment %d cannot be greater than the total number of attachments %d.", + attachment, pCreateInfo->attachmentCount); continue; } if (attachment_first_read.count(attachment)) @@ -8715,8 +8779,8 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderP uint32_t attachment = subpass.pDepthStencilAttachment->attachment; if (attachment >= pCreateInfo->attachmentCount) { skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, - __LINE__, DRAWSTATE_INVALID_RENDERPASS, "DS", - "Depth stencil attachment %d cannot be greater than the total number of attachments %d.", + __LINE__, DRAWSTATE_INVALID_ATTACHMENT_INDEX, "DS", + "CreateRenderPass: Depth stencil attachment %d cannot be greater than the total number of attachments %d.", attachment, pCreateInfo->attachmentCount); continue; } @@ -8727,10 +8791,10 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateRenderPass(VkDevice device, const VkRenderP } for (uint32_t j = 0; j < subpass.inputAttachmentCount; ++j) { uint32_t attachment = subpass.pInputAttachments[j].attachment; - if (attachment >= pCreateInfo->attachmentCount) { + if (attachment >= pCreateInfo->attachmentCount && attachment != VK_ATTACHMENT_UNUSED) { skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, (VkDebugReportObjectTypeEXT)0, 0, __LINE__, DRAWSTATE_INVALID_RENDERPASS, "DS", - "Input attachment %d cannot be greater than the total number of attachments %d.", + "CreateRenderPass: Input attachment %d cannot be greater than the total number of attachments %d.", attachment, pCreateInfo->attachmentCount); continue; } diff --git a/layers/core_validation_error_enums.h b/layers/core_validation_error_enums.h index 3904bdf1..bcbdd33b 100644 --- a/layers/core_validation_error_enums.h +++ b/layers/core_validation_error_enums.h @@ -137,6 +137,10 @@ enum DRAW_STATE_ERROR { // RenderPass is active DRAWSTATE_NO_ACTIVE_RENDERPASS, // Rendering cmd submitted without an active // RenderPass + DRAWSTATE_INVALID_IMAGE_USAGE, // Image attachment location conflicts with + // image's USAGE flags + DRAWSTATE_INVALID_ATTACHMENT_INDEX, // Attachment reference contains an index + // that is out-of-bounds DRAWSTATE_DESCRIPTOR_SET_NOT_UPDATED, // DescriptorSet bound but it was // never updated. This is a warning // code. -- cgit v1.2.3 From 17b39bbbcd02a492901b5a79e5b906108e31f480 Mon Sep 17 00:00:00 2001 From: Mark Lobodzinski Date: Thu, 16 Jun 2016 15:27:32 -0600 Subject: layers: GH576, Update layer details doc Added entries for new attachment index tests and enums. Change-Id: Ida1de0bffc544718e63ccf3641a09dbe577f3c4d --- layers/vk_validation_layer_details.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/layers/vk_validation_layer_details.md b/layers/vk_validation_layer_details.md index be38a9a9..e026b138 100644 --- a/layers/vk_validation_layer_details.md +++ b/layers/vk_validation_layer_details.md @@ -103,6 +103,8 @@ The Draw State portion of the core validation layer tracks state leading into Dr | Valid Logic Operations | If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value | INVALID_LOGIC_OP | vkCreateGraphicsPipelines | TODO | Create test | | QueueFamilyIndex is Valid | Validates that QueueFamilyIndices are less an the number of QueueFamilies | INVALID_QUEUE_INDEX | vkCmdWaitEvents vkCmdPipelineBarrier vkCreateBuffer vkCreateImage | TODO | Create test | | Push Constants | Validate that the size of push constant ranges and updates does not exceed maxPushConstantSize | PUSH_CONSTANTS_ERROR | vkCreatePipelineLayout vkCmdPushConstants | TODO | Create test | +| Attachment Image Usage | Validate that Image attachment location does not conflict with the image's USAGE flags | INVALID_IMAGE_USAGE | vkCreateFramebuffer | AttachmentUsageMismatch | NA | +| Attachment Image Index | Validate that Image attachment references are appropriate and not out-of-bounds | INVALID_ATTACHMENT_INDEX | vkCreateRenderPass vkCreateFramebuffer | UnusedPreserveAttachment | NA | | NA | Enum used for informational messages | NONE | | TODO | None | | NA | Enum used for errors in the layer itself. This does not indicate an app issue, but instead a bug in the layer. | INTERNAL_ERROR | | TODO | None | | NA | Enum used when VK_LAYER_LUNARG_core_validation attempts to allocate memory for its own internal use and is unable to. | OUT_OF_MEMORY | | TODO | None | -- cgit v1.2.3 From 8239cdbd1ef76e82435dcec27a19202292d2dd9d Mon Sep 17 00:00:00 2001 From: Alexander F Rødseth Date: Fri, 17 Jun 2016 09:45:26 -0600 Subject: Only set scripts that starts with a hashbang as executable Remove executable bit from files like README.md Change-Id: I6a2a86e8312616c175845f0a3b777515a58c52b9 --- CMakeLists.txt | 0 README.md | 0 determine_vs_version.py | 0 generator.py | 0 update_external_sources.bat | 0 vulkan.py | 0 6 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 CMakeLists.txt mode change 100755 => 100644 README.md mode change 100644 => 100755 determine_vs_version.py mode change 100644 => 100755 generator.py mode change 100755 => 100644 update_external_sources.bat mode change 100755 => 100644 vulkan.py diff --git a/CMakeLists.txt b/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/README.md b/README.md old mode 100755 new mode 100644 diff --git a/determine_vs_version.py b/determine_vs_version.py old mode 100644 new mode 100755 diff --git a/generator.py b/generator.py old mode 100644 new mode 100755 diff --git a/update_external_sources.bat b/update_external_sources.bat old mode 100755 new mode 100644 diff --git a/vulkan.py b/vulkan.py old mode 100755 new mode 100644 -- cgit v1.2.3 From 9063e2ab9c0c32e25aab2c46af38302a4ac2c98e Mon Sep 17 00:00:00 2001 From: Alexandre BACQUART Date: Fri, 17 Jun 2016 11:30:32 -0600 Subject: demos: fix ppm loader swapped width & height Change-Id: I277fe91a928223a09f672d07c22a1547e710b847 --- demos/cube.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demos/cube.c b/demos/cube.c index 9b12bfcb..d5269bc8 100644 --- a/demos/cube.c +++ b/demos/cube.c @@ -1032,7 +1032,7 @@ bool loadTexture(const char *filename, uint8_t *rgba_data, return false; } while(strncmp(cPtr++, "\n", 1)); - sscanf(cPtr, "%u %u", height, width); + sscanf(cPtr, "%u %u", width, height); if (rgba_data == NULL) { return true; } @@ -1075,7 +1075,7 @@ bool loadTexture(const char *filename, uint8_t *rgba_data, } } while (!strncmp(header, "#", 1)); - sscanf(header, "%u %u", height, width); + sscanf(header, "%u %u", width, height); if (rgba_data == NULL) { fclose(fPtr); return true; -- cgit v1.2.3