From 46176f157b1e47421bbfddb9917b2c1eef6b18c8 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Sat, 31 Oct 2015 00:31:16 +0800 Subject: bug 14608: VkShaderModule object lifetime (WIP) Remove VkShader. We add a simple cache to intel_shader_module in place of intel_shader. https://cvs.khronos.org/bugzilla/show_bug.cgi?id=14608 --- demos/cube.c | 84 ++++++++++---------------- demos/tri.c | 86 ++++++++++----------------- icd/nulldrv/nulldrv.c | 36 ----------- include/vk_layer.h | 2 - include/vulkan.h | 109 ++++++++++++++-------------------- layers/draw_state.cpp | 35 +---------- layers/param_checker.cpp | 57 ------------------ layers/shader_checker.cpp | 45 ++------------ layers/vk_validation_layer_details.md | 8 +-- loader/gpa_helper.h | 4 -- loader/table_ops.h | 6 -- loader/trampoline.c | 18 ------ vulkan.py | 13 ---- 13 files changed, 117 insertions(+), 386 deletions(-) diff --git a/demos/cube.c b/demos/cube.c index d550522c..29c1c8ef 100644 --- a/demos/cube.c +++ b/demos/cube.c @@ -1388,37 +1388,23 @@ static void demo_prepare_render_pass(struct demo *demo) assert(!err); } -static VkShader demo_prepare_shader(struct demo* demo, - VkShaderStageFlagBits stage, - VkShaderModule* pShaderModule, - const void* code, - size_t size) +static VkShaderModule demo_prepare_shader_module(struct demo* demo, + VkShaderStageFlagBits stage, + const void* code, + size_t size) { + VkShaderModule module; VkShaderModuleCreateInfo moduleCreateInfo; - VkShaderCreateInfo shaderCreateInfo; - VkShader shader; VkResult err; - moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; moduleCreateInfo.pNext = NULL; - shaderCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO; - shaderCreateInfo.pNext = NULL; - shaderCreateInfo.pName = "main"; - if (!demo->use_glsl) { moduleCreateInfo.codeSize = size; moduleCreateInfo.pCode = code; moduleCreateInfo.flags = 0; - err = vkCreateShaderModule(demo->device, &moduleCreateInfo, NULL, pShaderModule); - assert(!err); - - shaderCreateInfo.flags = 0; - shaderCreateInfo.module = *pShaderModule; - shaderCreateInfo.pName = "main"; - shaderCreateInfo.stage = stage; - err = vkCreateShader(demo->device, &shaderCreateInfo, NULL, &shader); + err = vkCreateShaderModule(demo->device, &moduleCreateInfo, NULL, &module); assert(!err); } else { // Create fake SPV structure to feed GLSL @@ -1433,20 +1419,12 @@ static VkShader demo_prepare_shader(struct demo* demo, ((uint32_t *) moduleCreateInfo.pCode)[2] = stage; memcpy(((uint32_t *) moduleCreateInfo.pCode + 3), code, size + 1); - err = vkCreateShaderModule(demo->device, &moduleCreateInfo, NULL, pShaderModule); - if (err) { - free((void *) moduleCreateInfo.pCode); - } - - shaderCreateInfo.flags = 0; - shaderCreateInfo.module = *pShaderModule; - shaderCreateInfo.pName = "main"; - shaderCreateInfo.stage = stage; - err = vkCreateShader(demo->device, &shaderCreateInfo, NULL, &shader); + err = vkCreateShaderModule(demo->device, &moduleCreateInfo, NULL, &module); assert(!err); free((void *) moduleCreateInfo.pCode); } - return shader; + + return module; } char *demo_read_spv(const char *filename, size_t *psize) @@ -1473,19 +1451,16 @@ char *demo_read_spv(const char *filename, size_t *psize) return shader_code; } -static VkShader demo_prepare_vs(struct demo *demo) +static VkShaderModule demo_prepare_vs(struct demo *demo) { if (!demo->use_glsl) { - VkShader shader; void *vertShaderCode; size_t size; vertShaderCode = demo_read_spv("cube-vert.spv", &size); - - shader = demo_prepare_shader(demo, VK_SHADER_STAGE_VERTEX_BIT, &demo->vert_shader_module, - vertShaderCode, size); + demo->vert_shader_module = demo_prepare_shader_module(demo, + VK_SHADER_STAGE_VERTEX_BIT, vertShaderCode, size); free(vertShaderCode); - return shader; } else { static const char *vertShaderText = "#version 140\n" @@ -1510,25 +1485,25 @@ static VkShader demo_prepare_vs(struct demo *demo) " gl_Position.z = (gl_Position.z + gl_Position.w) / 2.0;\n" "}\n"; - return demo_prepare_shader(demo, VK_SHADER_STAGE_VERTEX_BIT, &demo->vert_shader_module, - (const void *) vertShaderText, - strlen(vertShaderText)); + demo->vert_shader_module = demo_prepare_shader_module(demo, + VK_SHADER_STAGE_VERTEX_BIT, + (const void *) vertShaderText, strlen(vertShaderText)); } + + return demo->vert_shader_module; } -static VkShader demo_prepare_fs(struct demo *demo) +static VkShaderModule demo_prepare_fs(struct demo *demo) { if (!demo->use_glsl) { - VkShader shader; void *fragShaderCode; size_t size; fragShaderCode = demo_read_spv("cube-frag.spv", &size); - shader = demo_prepare_shader(demo, VK_SHADER_STAGE_FRAGMENT_BIT, &demo->frag_shader_module, - fragShaderCode, size); + demo->frag_shader_module = demo_prepare_shader_module(demo, + VK_SHADER_STAGE_FRAGMENT_BIT, fragShaderCode, size); free(fragShaderCode); - return shader; } else { static const char *fragShaderText = "#version 140\n" @@ -1542,10 +1517,12 @@ static VkShader demo_prepare_fs(struct demo *demo) " uFragColor = texture(tex, texcoord.xy);\n" "}\n"; - return demo_prepare_shader(demo, VK_SHADER_STAGE_FRAGMENT_BIT, &demo->frag_shader_module, - (const void *) fragShaderText, - strlen(fragShaderText)); + demo->frag_shader_module = demo_prepare_shader_module(demo, + VK_SHADER_STAGE_FRAGMENT_BIT, + (const void *) fragShaderText, strlen(fragShaderText)); } + + return demo->frag_shader_module; } static void demo_prepare_pipeline(struct demo *demo) @@ -1627,10 +1604,14 @@ static void demo_prepare_pipeline(struct demo *demo) memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo)); shaderStages[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; - shaderStages[0].shader = demo_prepare_vs(demo); + shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT; + shaderStages[0].module = demo_prepare_vs(demo); + shaderStages[0].pName = "main"; shaderStages[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; - shaderStages[1].shader = demo_prepare_fs(demo); + shaderStages[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT; + shaderStages[1].module = demo_prepare_fs(demo); + shaderStages[1].pName = "main"; memset(&pipelineCache, 0, sizeof(pipelineCache)); pipelineCache.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO; @@ -1655,9 +1636,6 @@ static void demo_prepare_pipeline(struct demo *demo) 1, &pipeline, NULL, &demo->pipeline); assert(!err); - for (uint32_t i = 0; i < pipeline.stageCount; i++) { - vkDestroyShader(demo->device, shaderStages[i].shader, NULL); - } vkDestroyShaderModule(demo->device, demo->frag_shader_module, NULL); vkDestroyShaderModule(demo->device, demo->vert_shader_module, NULL); } diff --git a/demos/tri.c b/demos/tri.c index 41a5906e..a1e790e7 100644 --- a/demos/tri.c +++ b/demos/tri.c @@ -1147,36 +1147,23 @@ static void demo_prepare_render_pass(struct demo *demo) assert(!err); } -static VkShader demo_prepare_shader(struct demo *demo, - VkShaderStageFlagBits stage, - VkShaderModule* pShaderModule, - const void *code, - size_t size) +static VkShaderModule demo_prepare_shader_module(struct demo *demo, + VkShaderStageFlagBits stage, + const void *code, + size_t size) { VkShaderModuleCreateInfo moduleCreateInfo; - VkShaderCreateInfo shaderCreateInfo; - VkShader shader; + VkShaderModule module; VkResult U_ASSERT_ONLY err; - moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; moduleCreateInfo.pNext = NULL; - shaderCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_CREATE_INFO; - shaderCreateInfo.pNext = NULL; - if (!demo->use_glsl) { moduleCreateInfo.codeSize = size; moduleCreateInfo.pCode = code; moduleCreateInfo.flags = 0; - err = vkCreateShaderModule(demo->device, &moduleCreateInfo, NULL, pShaderModule); - assert(!err); - - shaderCreateInfo.flags = 0; - shaderCreateInfo.module = *pShaderModule; - shaderCreateInfo.pName = "main"; - shaderCreateInfo.stage = stage; - err = vkCreateShader(demo->device, &shaderCreateInfo, NULL, &shader); + err = vkCreateShaderModule(demo->device, &moduleCreateInfo, NULL, &module); assert(!err); } else { // Create fake SPV structure to feed GLSL @@ -1191,18 +1178,12 @@ static VkShader demo_prepare_shader(struct demo *demo, ((uint32_t *) moduleCreateInfo.pCode)[2] = stage; memcpy(((uint32_t *) moduleCreateInfo.pCode + 3), code, size + 1); - err = vkCreateShaderModule(demo->device, &moduleCreateInfo, NULL, pShaderModule); - assert(!err); - - shaderCreateInfo.flags = 0; - shaderCreateInfo.module = *pShaderModule; - shaderCreateInfo.pName = "main"; - shaderCreateInfo.stage = stage; - err = vkCreateShader(demo->device, &shaderCreateInfo, NULL, &shader); + err = vkCreateShaderModule(demo->device, &moduleCreateInfo, NULL, &module); assert(!err); free((void *) moduleCreateInfo.pCode); } - return shader; + + return module; } char *demo_read_spv(const char *filename, size_t *psize) @@ -1229,20 +1210,17 @@ char *demo_read_spv(const char *filename, size_t *psize) return shader_code; } -static VkShader demo_prepare_vs(struct demo *demo) +static VkShaderModule demo_prepare_vs(struct demo *demo) { if (!demo->use_glsl) { - VkShader shader; void *vertShaderCode; size_t size; vertShaderCode = demo_read_spv("tri-vert.spv", &size); - shader = demo_prepare_shader(demo, VK_SHADER_STAGE_VERTEX_BIT, - &demo->vert_shader_module, - vertShaderCode, size); + demo->vert_shader_module = demo_prepare_shader_module(demo, + VK_SHADER_STAGE_VERTEX_BIT, vertShaderCode, size); free(vertShaderCode); - return shader; } else { static const char *vertShaderText = "#version 140\n" @@ -1256,28 +1234,26 @@ static VkShader demo_prepare_vs(struct demo *demo) " gl_Position = pos;\n" "}\n"; - return demo_prepare_shader(demo, VK_SHADER_STAGE_VERTEX_BIT, - &demo->vert_shader_module, - (const void *) vertShaderText, - strlen(vertShaderText)); + demo->vert_shader_module = demo_prepare_shader_module(demo, + VK_SHADER_STAGE_VERTEX_BIT, + (const void *) vertShaderText, strlen(vertShaderText)); } + + return demo->vert_shader_module; } -static VkShader demo_prepare_fs(struct demo *demo) +static VkShaderModule demo_prepare_fs(struct demo *demo) { if (!demo->use_glsl) { - VkShader shader; void *fragShaderCode; size_t size; fragShaderCode = demo_read_spv("tri-frag.spv", &size); - shader = demo_prepare_shader(demo, VK_SHADER_STAGE_FRAGMENT_BIT, - &demo->frag_shader_module, - fragShaderCode, size); + demo->frag_shader_module = demo_prepare_shader_module(demo, + VK_SHADER_STAGE_FRAGMENT_BIT, fragShaderCode, size); free(fragShaderCode); - return shader; } else { static const char *fragShaderText = "#version 140\n" @@ -1290,11 +1266,12 @@ static VkShader demo_prepare_fs(struct demo *demo) " uFragColor = texture(tex, texcoord);\n" "}\n"; - return demo_prepare_shader(demo, VK_SHADER_STAGE_FRAGMENT_BIT, - &demo->frag_shader_module, - (const void *) fragShaderText, - strlen(fragShaderText)); + demo->frag_shader_module = demo_prepare_shader_module(demo, + VK_SHADER_STAGE_FRAGMENT_BIT, + (const void *) fragShaderText, strlen(fragShaderText)); } + + return demo->frag_shader_module; } static void demo_prepare_pipeline(struct demo *demo) @@ -1376,11 +1353,15 @@ static void demo_prepare_pipeline(struct demo *demo) VkPipelineShaderStageCreateInfo shaderStages[2]; memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo)); - shaderStages[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; - shaderStages[0].shader = demo_prepare_vs(demo); + shaderStages[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; + shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT; + shaderStages[0].module = demo_prepare_vs(demo); + shaderStages[0].pName = "main"; shaderStages[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; - shaderStages[1].shader = demo_prepare_fs(demo); + shaderStages[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT; + shaderStages[1].module = demo_prepare_fs(demo); + shaderStages[1].pName = "main"; pipeline.pVertexInputState = &vi; pipeline.pInputAssemblyState = &ia; @@ -1404,9 +1385,6 @@ static void demo_prepare_pipeline(struct demo *demo) vkDestroyPipelineCache(demo->device, demo->pipelineCache, NULL); - for (uint32_t i = 0; i < pipeline.stageCount; i++) { - vkDestroyShader(demo->device, shaderStages[i].shader, NULL); - } vkDestroyShaderModule(demo->device, demo->frag_shader_module, NULL); vkDestroyShaderModule(demo->device, demo->vert_shader_module, NULL); } diff --git a/icd/nulldrv/nulldrv.c b/icd/nulldrv/nulldrv.c index 1a3595fd..074ee592 100644 --- a/icd/nulldrv/nulldrv.c +++ b/icd/nulldrv/nulldrv.c @@ -447,22 +447,6 @@ static struct nulldrv_desc_layout *nulldrv_desc_layout(const VkDescriptorSetLayo return *(struct nulldrv_desc_layout **) &layout; } -static VkResult shader_create(struct nulldrv_dev *dev, - const VkShaderCreateInfo *info, - struct nulldrv_shader **sh_ret) -{ - struct nulldrv_shader *sh; - - sh = (struct nulldrv_shader *) nulldrv_base_create(dev, sizeof(*sh), - VK_OBJECT_TYPE_SHADER); - if (!sh) - return VK_ERROR_OUT_OF_HOST_MEMORY; - - *sh_ret = sh; - - return VK_SUCCESS; -} - static VkResult graphics_pipeline_create(struct nulldrv_dev *dev, const VkGraphicsPipelineCreateInfo *info_, struct nulldrv_pipeline **pipeline_ret) @@ -1893,26 +1877,6 @@ ICD_EXPORT void VKAPI vkDestroyShaderModule( NULLDRV_LOG_FUNC; } -ICD_EXPORT VkResult VKAPI vkCreateShader( - VkDevice device, - const VkShaderCreateInfo* pCreateInfo, - const VkAllocationCallbacks* pAllocator, - VkShader* pShader) -{ - NULLDRV_LOG_FUNC; - struct nulldrv_dev *dev = nulldrv_dev(device); - - return shader_create(dev, pCreateInfo, (struct nulldrv_shader **) pShader); -} - -ICD_EXPORT void VKAPI vkDestroyShader( - VkDevice device, - VkShader shader, - const VkAllocationCallbacks* pAllocator) -{ - NULLDRV_LOG_FUNC; -} - ICD_EXPORT VkResult VKAPI vkCreateBufferView( VkDevice device, const VkBufferViewCreateInfo* pCreateInfo, diff --git a/include/vk_layer.h b/include/vk_layer.h index 2035a8be..491750b3 100644 --- a/include/vk_layer.h +++ b/include/vk_layer.h @@ -74,8 +74,6 @@ typedef struct VkLayerDispatchTable_ PFN_vkDestroyImageView DestroyImageView; PFN_vkCreateShaderModule CreateShaderModule; PFN_vkDestroyShaderModule DestroyShaderModule; - PFN_vkCreateShader CreateShader; - PFN_vkDestroyShader DestroyShader; PFN_vkCreatePipelineCache CreatePipelineCache; PFN_vkDestroyPipelineCache DestroyPipelineCache; PFN_vkGetPipelineCacheData GetPipelineCacheData; diff --git a/include/vulkan.h b/include/vulkan.h index ede2022d..6ea11f89 100644 --- a/include/vulkan.h +++ b/include/vulkan.h @@ -79,7 +79,6 @@ VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkQueryPool) VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkBufferView) VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkImageView) VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkShaderModule) -VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkShader) VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPipelineCache) VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPipelineLayout) VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkRenderPass) @@ -148,38 +147,37 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO = 14, VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO = 15, VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO = 16, - VK_STRUCTURE_TYPE_SHADER_CREATE_INFO = 17, - VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO = 18, - VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO = 19, - VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO = 20, - VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO = 21, - VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO = 22, - VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO = 23, - VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO = 24, - VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO = 25, - VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO = 26, - VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO = 27, - VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO = 28, - VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO = 29, - VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO = 30, - VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO = 31, - VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO = 32, - VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO = 33, - VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO = 34, - VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOC_INFO = 35, - VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET = 36, - VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET = 37, - VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO = 38, - VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO = 39, - VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO = 40, - VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOC_INFO = 41, - VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO = 42, - VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO = 43, - VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER = 44, - VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER = 45, - VK_STRUCTURE_TYPE_MEMORY_BARRIER = 46, - VK_STRUCTURE_TYPE_LAYER_INSTANCE_CREATE_INFO = 47, - VK_STRUCTURE_TYPE_LAYER_DEVICE_CREATE_INFO = 48, + VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO = 17, + VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO = 18, + VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO = 19, + VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO = 20, + VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO = 21, + VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO = 22, + VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO = 23, + VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO = 24, + VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO = 25, + VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO = 26, + VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO = 27, + VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO = 28, + VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO = 29, + VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO = 30, + VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO = 31, + VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO = 32, + VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO = 33, + VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOC_INFO = 34, + VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET = 35, + VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET = 36, + VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO = 37, + VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO = 38, + VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO = 39, + VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOC_INFO = 40, + VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO = 41, + VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO = 42, + VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER = 43, + VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER = 44, + VK_STRUCTURE_TYPE_MEMORY_BARRIER = 45, + VK_STRUCTURE_TYPE_LAYER_INSTANCE_CREATE_INFO = 46, + VK_STRUCTURE_TYPE_LAYER_DEVICE_CREATE_INFO = 47, VK_STRUCTURE_TYPE_BEGIN_RANGE = VK_STRUCTURE_TYPE_APPLICATION_INFO, VK_STRUCTURE_TYPE_END_RANGE = VK_STRUCTURE_TYPE_LAYER_DEVICE_CREATE_INFO, VK_STRUCTURE_TYPE_RANGE_SIZE = (VK_STRUCTURE_TYPE_LAYER_DEVICE_CREATE_INFO - VK_STRUCTURE_TYPE_APPLICATION_INFO + 1), @@ -896,7 +894,15 @@ typedef VkFlags VkBufferUsageFlags; typedef VkFlags VkBufferViewCreateFlags; typedef VkFlags VkImageViewCreateFlags; typedef VkFlags VkShaderModuleCreateFlags; -typedef VkFlags VkShaderCreateFlags; +typedef VkFlags VkPipelineCacheCreateFlags; + +typedef enum VkPipelineCreateFlagBits { + VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT = 0x00000001, + VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT = 0x00000002, + VK_PIPELINE_CREATE_DERIVATIVE_BIT = 0x00000004, +} VkPipelineCreateFlagBits; +typedef VkFlags VkPipelineCreateFlags; +typedef VkFlags VkPipelineShaderStageCreateFlags; typedef enum VkShaderStageFlagBits { VK_SHADER_STAGE_VERTEX_BIT = 0x00000001, @@ -908,15 +914,6 @@ typedef enum VkShaderStageFlagBits { VK_SHADER_STAGE_ALL_GRAPHICS = 0x1F, VK_SHADER_STAGE_ALL = 0x7FFFFFFF, } VkShaderStageFlagBits; -typedef VkFlags VkPipelineCacheCreateFlags; - -typedef enum VkPipelineCreateFlagBits { - VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT = 0x00000001, - VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT = 0x00000002, - VK_PIPELINE_CREATE_DERIVATIVE_BIT = 0x00000004, -} VkPipelineCreateFlagBits; -typedef VkFlags VkPipelineCreateFlags; -typedef VkFlags VkPipelineShaderStageCreateFlags; typedef VkFlags VkPipelineVertexInputStateCreateFlags; typedef VkFlags VkPipelineInputAssemblyStateCreateFlags; typedef VkFlags VkPipelineTesselationStateCreateFlags; @@ -1575,15 +1572,6 @@ typedef struct VkShaderModuleCreateInfo { const uint32_t* pCode; } VkShaderModuleCreateInfo; -typedef struct VkShaderCreateInfo { - VkStructureType sType; - const void* pNext; - VkShaderCreateFlags flags; - VkShaderModule module; - const char* pName; - VkShaderStageFlagBits stage; -} VkShaderCreateInfo; - typedef struct VkPipelineCacheCreateInfo { VkStructureType sType; const void* pNext; @@ -1609,7 +1597,9 @@ typedef struct VkPipelineShaderStageCreateInfo { VkStructureType sType; const void* pNext; VkPipelineShaderStageCreateFlags flags; - VkShader shader; + VkShaderStageFlagBits stage; + VkShaderModule module; + const char* pName; const VkSpecializationInfo* pSpecializationInfo; } VkPipelineShaderStageCreateInfo; @@ -2198,8 +2188,6 @@ typedef VkResult (VKAPI *PFN_vkCreateImageView)(VkDevice device, const VkImageVi typedef void (VKAPI *PFN_vkDestroyImageView)(VkDevice device, VkImageView imageView, const VkAllocationCallbacks* pAllocator); typedef VkResult (VKAPI *PFN_vkCreateShaderModule)(VkDevice device, const VkShaderModuleCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkShaderModule* pShaderModule); typedef void (VKAPI *PFN_vkDestroyShaderModule)(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks* pAllocator); -typedef VkResult (VKAPI *PFN_vkCreateShader)(VkDevice device, const VkShaderCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkShader* pShader); -typedef void (VKAPI *PFN_vkDestroyShader)(VkDevice device, VkShader shader, const VkAllocationCallbacks* pAllocator); typedef VkResult (VKAPI *PFN_vkCreatePipelineCache)(VkDevice device, const VkPipelineCacheCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPipelineCache* pPipelineCache); typedef void (VKAPI *PFN_vkDestroyPipelineCache)(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks* pAllocator); typedef VkResult (VKAPI *PFN_vkGetPipelineCacheData)(VkDevice device, VkPipelineCache pipelineCache, size_t* pDataSize, void* pData); @@ -2604,17 +2592,6 @@ void VKAPI vkDestroyShaderModule( VkShaderModule shaderModule, const VkAllocationCallbacks* pAllocator); -VkResult VKAPI vkCreateShader( - VkDevice device, - const VkShaderCreateInfo* pCreateInfo, - const VkAllocationCallbacks* pAllocator, - VkShader* pShader); - -void VKAPI vkDestroyShader( - VkDevice device, - VkShader shader, - const VkAllocationCallbacks* pAllocator); - VkResult VKAPI vkCreatePipelineCache( VkDevice device, const VkPipelineCacheCreateInfo* pCreateInfo, diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp index 9befeeaa..26288101 100755 --- a/layers/draw_state.cpp +++ b/layers/draw_state.cpp @@ -73,7 +73,6 @@ struct layer_data { unordered_map setMap; unordered_map layoutMap; unordered_map pipelineLayoutMap; - unordered_map shaderStageMap; // Map for layout chains unordered_map commandBufferMap; unordered_map renderPassMap; @@ -448,10 +447,7 @@ static PIPELINE_NODE* initPipeline(layer_data* dev_data, const VkGraphicsPipelin for (uint32_t i = 0; i < pCreateInfo->stageCount; i++) { const VkPipelineShaderStageCreateInfo *pPSSCI = &pCreateInfo->pStages[i]; - if (dev_data->shaderStageMap.find(pPSSCI->shader) == dev_data->shaderStageMap.end()) - continue; - - switch (dev_data->shaderStageMap[pPSSCI->shader]) { + switch (pPSSCI->stage) { case VK_SHADER_STAGE_VERTEX_BIT: memcpy(&pPipeline->vsCI, pPSSCI, sizeof(VkPipelineShaderStageCreateInfo)); pPipeline->active_shaders |= VK_SHADER_STAGE_VERTEX_BIT; @@ -1824,13 +1820,6 @@ VK_LAYER_EXPORT void VKAPI vkDestroyShaderModule(VkDevice device, VkShaderModule // TODO : Clean up any internal data structures using this obj. } -VK_LAYER_EXPORT void VKAPI vkDestroyShader(VkDevice device, VkShader shader, const VkAllocationCallbacks* pAllocator) -{ - layer_data* dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); - dev_data->device_dispatch_table->DestroyShader(device, shader, pAllocator); - dev_data->shaderStageMap.erase(shader); -} - VK_LAYER_EXPORT void VKAPI vkDestroyPipeline(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks* pAllocator) { get_my_data_ptr(get_dispatch_key(device), layer_data_map)->device_dispatch_table->DestroyPipeline(device, pipeline, pAllocator); @@ -1928,24 +1917,6 @@ VK_LAYER_EXPORT VkResult VKAPI vkCreateImageView(VkDevice device, const VkImageV return result; } -VK_LAYER_EXPORT VkResult VKAPI vkCreateShader( - VkDevice device, - const VkShaderCreateInfo *pCreateInfo, - const VkAllocationCallbacks* pAllocator, - VkShader *pShader) -{ - layer_data* dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); - VkResult result = dev_data->device_dispatch_table->CreateShader(device, pCreateInfo, pAllocator, pShader); - - if (VK_SUCCESS == result) { - loader_platform_thread_lock_mutex(&globalLock); - dev_data->shaderStageMap[*pShader] = pCreateInfo->stage; - loader_platform_thread_unlock_mutex(&globalLock); - } - - return result; -} - //TODO handle pipeline caches VkResult VKAPI vkCreatePipelineCache( VkDevice device, @@ -3734,8 +3705,6 @@ VK_LAYER_EXPORT PFN_vkVoidFunction VKAPI vkGetDeviceProcAddr(VkDevice dev, const return (PFN_vkVoidFunction) vkDestroyImageView; if (!strcmp(funcName, "vkDestroyShaderModule")) return (PFN_vkVoidFunction) vkDestroyShaderModule; - if (!strcmp(funcName, "vkDestroyShader")) - return (PFN_vkVoidFunction) vkDestroyShader; if (!strcmp(funcName, "vkDestroyPipeline")) return (PFN_vkVoidFunction) vkDestroyPipeline; if (!strcmp(funcName, "vkDestroyPipelineLayout")) @@ -3760,8 +3729,6 @@ VK_LAYER_EXPORT PFN_vkVoidFunction VKAPI vkGetDeviceProcAddr(VkDevice dev, const return (PFN_vkVoidFunction) vkCreateImage; if (!strcmp(funcName, "vkCreateImageView")) return (PFN_vkVoidFunction) vkCreateImageView; - if (!strcmp(funcName, "vkCreateShader")) - return (PFN_vkVoidFunction) vkCreateShader; if (!strcmp(funcName, "CreatePipelineCache")) return (PFN_vkVoidFunction) vkCreatePipelineCache; if (!strcmp(funcName, "DestroyPipelineCache")) diff --git a/layers/param_checker.cpp b/layers/param_checker.cpp index 88ed52ed..30d345de 100644 --- a/layers/param_checker.cpp +++ b/layers/param_checker.cpp @@ -3497,61 +3497,6 @@ VK_LAYER_EXPORT VkResult VKAPI vkCreateShaderModule( return result; } -bool PreCreateShader( - VkDevice device, - const VkShaderCreateInfo* pCreateInfo) -{ - if(pCreateInfo != nullptr) - { - if(pCreateInfo->sType != VK_STRUCTURE_TYPE_SHADER_CREATE_INFO) - { - log_msg(mdd(device), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType)0, 0, 0, 1, "PARAMCHECK", - "vkCreateShader parameter, VkStructureType pCreateInfo->sType, is an invalid enumerator"); - return false; - } - if(pCreateInfo->pName != nullptr) - { - } - } - - return true; -} - -bool PostCreateShader( - VkDevice device, - VkShader* pShader, - VkResult result) -{ - - if(pShader != nullptr) - { - } - - if(result < VK_SUCCESS) - { - std::string reason = "vkCreateShader parameter, VkResult result, is " + EnumeratorString(result); - log_msg(mdd(device), VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType)0, 0, 0, 1, "PARAMCHECK", reason.c_str()); - return false; - } - - return true; -} - -VK_LAYER_EXPORT VkResult VKAPI vkCreateShader( - VkDevice device, - const VkShaderCreateInfo* pCreateInfo, - const VkAllocationCallbacks* pAllocator, - VkShader* pShader) -{ - PreCreateShader(device, pCreateInfo); - - VkResult result = get_dispatch_table(pc_device_table_map, device)->CreateShader(device, pCreateInfo, pAllocator, pShader); - - PostCreateShader(device, pShader, result); - - return result; -} - bool PreCreatePipelineCache( VkDevice device, const VkPipelineCacheCreateInfo* pCreateInfo) @@ -6457,8 +6402,6 @@ VK_LAYER_EXPORT PFN_vkVoidFunction VKAPI vkGetDeviceProcAddr(VkDevice device, co return (PFN_vkVoidFunction) vkGetImageSubresourceLayout; if (!strcmp(funcName, "vkCreateImageView")) return (PFN_vkVoidFunction) vkCreateImageView; - if (!strcmp(funcName, "vkCreateShader")) - return (PFN_vkVoidFunction) vkCreateShader; if (!strcmp(funcName, "vkCreateShaderModule")) return (PFN_vkVoidFunction) vkCreateShaderModule; if (!strcmp(funcName, "vkCreateGraphicsPipelines")) diff --git a/layers/shader_checker.cpp b/layers/shader_checker.cpp index 7e8bc376..63c17a06 100644 --- a/layers/shader_checker.cpp +++ b/layers/shader_checker.cpp @@ -44,7 +44,6 @@ // fwd decls struct shader_module; -struct shader_object; struct render_pass; struct layer_data { @@ -54,7 +53,6 @@ struct layer_data { VkLayerInstanceDispatchTable* instance_dispatch_table; std::unordered_map shader_module_map; - std::unordered_map shader_object_map; std::unordered_map*> descriptor_set_layout_map; std::unordered_map*>*> pipeline_layout_map; std::unordered_map render_pass_map; @@ -85,19 +83,6 @@ struct shader_module { } }; -struct shader_object { - std::string name; - struct shader_module *module; - VkShaderStageFlagBits stage; - - shader_object(layer_data *my_data, VkShaderCreateInfo const *pCreateInfo) - { - module = my_data->shader_module_map[pCreateInfo->module]; - stage = pCreateInfo->stage; - name = pCreateInfo->pName; - } -}; - struct render_pass { std::vector> subpass_color_formats; @@ -636,21 +621,6 @@ VK_LAYER_EXPORT VkResult VKAPI vkCreateShaderModule( return res; } -VK_LAYER_EXPORT VkResult VKAPI vkCreateShader( - VkDevice device, - const VkShaderCreateInfo *pCreateInfo, - const VkAllocationCallbacks* pAllocator, - VkShader *pShader) -{ - layer_data *my_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); - VkResult res = my_data->device_dispatch_table->CreateShader(device, pCreateInfo, pAllocator, pShader); - - loader_platform_thread_lock_mutex(&globalLock); - my_data->shader_object_map[*pShader] = new shader_object(my_data, pCreateInfo); - loader_platform_thread_unlock_mutex(&globalLock); - return res; -} - VK_LAYER_EXPORT VkResult VKAPI vkCreateRenderPass( VkDevice device, const VkRenderPassCreateInfo *pCreateInfo, @@ -1054,22 +1024,20 @@ validate_graphics_pipeline(layer_data *my_data, VkDevice dev, VkGraphicsPipeline VkPipelineShaderStageCreateInfo const *pStage = &pCreateInfo->pStages[i]; if (pStage->sType == VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO) { - // always true; pStage->stage may be revived in a later revision and - // this will make sense again - if ((VK_SHADER_STAGE_VERTEX_BIT & (VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_FRAGMENT_BIT + if ((pStage->stage & (VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_FRAGMENT_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT | VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT)) == 0) { if (log_msg(my_data->report_data, VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_DEVICE, /*dev*/0, 0, SHADER_CHECKER_UNKNOWN_STAGE, "SC", - "Unknown shader stage %d", VK_SHADER_STAGE_VERTEX_BIT)) { + "Unknown shader stage %d", pStage->stage)) { pass = false; } } else { - struct shader_object *shader = my_data->shader_object_map[pStage->shader]; - shaders[get_shader_stage_id(shader->stage)] = shader->module; + shader_module *module = my_data->shader_module_map[pStage->module]; + shaders[get_shader_stage_id(pStage->stage)] = module; /* validate descriptor set layout against what the spirv module actually uses */ std::map, interface_var> descriptor_uses; - collect_interface_by_descriptor_slot(my_data, dev, shader->module, spv::StorageClassUniform, + collect_interface_by_descriptor_slot(my_data, dev, module, spv::StorageClassUniform, descriptor_uses); auto layout = pCreateInfo->layout != VK_NULL_HANDLE ? @@ -1082,7 +1050,7 @@ validate_graphics_pipeline(layer_data *my_data, VkDevice dev, VkGraphicsPipeline if (binding == nullptr) { char type_name[1024]; - describe_type(type_name, shader->module, it->second.type_id); + describe_type(type_name, module, it->second.type_id); if (log_msg(my_data->report_data, VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_DEVICE, /*dev*/0, 0, SHADER_CHECKER_MISSING_DESCRIPTOR, "SC", "Shader uses descriptor slot %u.%u (used as type `%s`) but not declared in pipeline layout", @@ -1280,7 +1248,6 @@ VK_LAYER_EXPORT PFN_vkVoidFunction VKAPI vkGetDeviceProcAddr(VkDevice dev, const ADD_HOOK(vkCreateDevice); ADD_HOOK(vkCreateShaderModule); - ADD_HOOK(vkCreateShader); ADD_HOOK(vkCreateRenderPass); ADD_HOOK(vkDestroyDevice); ADD_HOOK(vkCreateGraphicsPipelines); diff --git a/layers/vk_validation_layer_details.md b/layers/vk_validation_layer_details.md index faadaa0c..11b5048a 100644 --- a/layers/vk_validation_layer_details.md +++ b/layers/vk_validation_layer_details.md @@ -99,8 +99,8 @@ The ParamChecker layer validates parameter values and flags errors for any value | Check | Overview | ENUM | Relevant API | Testname | Notes/TODO | | ----- | -------- | ---------------- | ------------ | -------- | ---------- | -| Input Parameters | Pointers in structures are recursively validated to be non-null. Enumerated types are validated against min and max enum values. Structure Types are verified to be correct. | NA | vkQueueSubmit vkAllocateMemory vkFlushMappedMemoryRanges vkInvalidateMappedMemoryRanges vkQueueBindSparse vkCreateFence vkResetFences vkWaitForFences vkCreateSemaphore vkCreateEvent vkCreateQueryPool vkCreateBuffer vkCreateBufferView vkCreateImage vkGetImageSubresourceLayout vkCreateImageView vkCreateShader vkCreatePipelineCache vkMergePipelineCaches vkCreateGraphicsPipelines vkCreateComputePipelines vkCreatePipelineLayout vkCreateSampler vkCreateDescriptorSetLayout( vkCreateDescriptorPool vkAllocateDescriptorSets vkFreeDescriptorSets vkUpdateDescriptorSets vkCreateFramebuffer vkCreateRenderPass vkCreateCommandPool vkAllocateCommandBuffers vkBeginCommandBuffer vkCmdBindDescriptorSets vkCmdBindVertexBuffers vkCmdCopyBuffer vkCmdCopyImage vkCmdBlitImage vkCmdCopyBufferToImage vkCmdCopyImageToBuffer vkCmdUpdateBuffer vkCmdClearColorImage vkCmdClearDepthStencilImage vkCmdClearAttachments vkCmdResolveImage vkCmdWaitEvents vkCmdPipelineBarrier vkCmdPushConstants vkCmdBeginRenderPass vkCmdExecuteCommands | TBD | NA | -| Call results, Output Parameters | Return values are checked for VK_SUCCESS, returned pointers are checked to be NON-NULL, enumerated types of return values are checked to be within the defined range. | NA | vkEnumeratePhysicalDevices vkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceImageFormatProperties vkGetPhysicalDeviceLimits vkGetPhysicalDeviceProperties vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceMemoryProperties vkGetDeviceQueue vkQueueSubmit vkQueueWaitIdle vkDeviceWaitIdle vkAllocateMemory vkFreeMemory vkMapMemory vkUnmapMemory vkFlushMappedMemoryRanges vkInvalidateMappedMemoryRanges vkGetDeviceMemoryCommitment vkBindBufferMemory vkBindImageMemory vkGetBufferMemoryRequirements vkGetImageMemoryRequirements vkGetImageSparseMemoryRequirements vkGetPhysicalDeviceSparseImageFormatProperties vkQueueBindSparse vkCreateFence vkDestroyFence vkResetFences vkGetFenceStatus vkWaitForFences vkCreateSemaphore vkDestroySemaphore vkCreateEvent vkDestroyEvent vkGetEventStatus vkSetEvent vkResetEvent vkCreateQueryPool vkDestroyQueryPool vkGetQueryPoolResults vkCreateBuffer vkDestroyBuffer vkCreateBufferView vkDestroyBufferView vkCreateImage vkDestroyImage vkGetImageSubresourceLayout vkCreateImageView vkDestroyImageView vkDestroyShaderModule vkCreateShader vkDestroyShader vkCreatePipelineCache vkDestroyPipelineCache vkGetPipelineCacheData vkMergePipelineCaches vkCreateGraphicsPipelines vkCreateComputePipelines vkDestroyPipeline vkCreatePipelineLayout vkDestroyPipelineLayout vkCreateSampler vkDestroySampler vkCreateDescriptorSetLayout vkDestroyDescriptorSetLayout vkCreateDescriptorPool vkDestroyDescriptorPool vkResetDescriptorPool vkAllocateDescriptorSets vkFreeDescriptorSets vkUpdateDescriptorSets vkCreateFramebuffer vkDestroyFramebuffer vkCreateRenderPass vkDestroyRenderPass vkGetRenderAreaGranularity vkCreateCommandPool vkDestroyCommandPool vkResetCommandPool vkAllocateCommandBuffers vkFreeCommandBuffers vkBeginCommandBuffer vkEndCommandBuffer vkResetCommandBuffer vkCmdBindPipeline vkCmdBindDescriptorSets vkCmdBindIndexBuffer vkCmdBindVertexBuffers vkCmdDraw vkCmdDrawIndexed vkCmdDrawIndirect vkCmdDrawIndexedIndirect vkCmdDispatch vkCmdDispatchIndirect vkCmdCopyBuffer vkCmdCopyImage vkCmdBlitImage vkCmdCopyBufferToImage vkCmdCopyImageToBuffer vkCmdUpdateBuffer vkCmdFillBuffer vkCmdClearColorImage vkCmdClearDepthStencilImage vkCmdClearAttachments vkCmdResolveImage vkCmdSetEvent vkCmdResetEvent vkCmdWaitEvents vkCmdPipelineBarrier vkCmdBeginQuery vkCmdEndQuery vkCmdResetQueryPool vkCmdWriteTimestamp vkCmdCopyQueryPoolResults vkCmdPushConstants vkCmdBeginRenderPass vkCmdNextSubpass vkCmdEndRenderPass vkCmdExecuteCommands | TBD | NA | +| Input Parameters | Pointers in structures are recursively validated to be non-null. Enumerated types are validated against min and max enum values. Structure Types are verified to be correct. | NA | vkQueueSubmit vkAllocateMemory vkFlushMappedMemoryRanges vkInvalidateMappedMemoryRanges vkQueueBindSparse vkCreateFence vkResetFences vkWaitForFences vkCreateSemaphore vkCreateEvent vkCreateQueryPool vkCreateBuffer vkCreateBufferView vkCreateImage vkGetImageSubresourceLayout vkCreateImageView vkCreatePipelineCache vkMergePipelineCaches vkCreateGraphicsPipelines vkCreateComputePipelines vkCreatePipelineLayout vkCreateSampler vkCreateDescriptorSetLayout( vkCreateDescriptorPool vkAllocateDescriptorSets vkFreeDescriptorSets vkUpdateDescriptorSets vkCreateFramebuffer vkCreateRenderPass vkCreateCommandPool vkAllocateCommandBuffers vkBeginCommandBuffer vkCmdBindDescriptorSets vkCmdBindVertexBuffers vkCmdCopyBuffer vkCmdCopyImage vkCmdBlitImage vkCmdCopyBufferToImage vkCmdCopyImageToBuffer vkCmdUpdateBuffer vkCmdClearColorImage vkCmdClearDepthStencilImage vkCmdClearAttachments vkCmdResolveImage vkCmdWaitEvents vkCmdPipelineBarrier vkCmdPushConstants vkCmdBeginRenderPass vkCmdExecuteCommands | TBD | NA | +| Call results, Output Parameters | Return values are checked for VK_SUCCESS, returned pointers are checked to be NON-NULL, enumerated types of return values are checked to be within the defined range. | NA | vkEnumeratePhysicalDevices vkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceImageFormatProperties vkGetPhysicalDeviceLimits vkGetPhysicalDeviceProperties vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceMemoryProperties vkGetDeviceQueue vkQueueSubmit vkQueueWaitIdle vkDeviceWaitIdle vkAllocateMemory vkFreeMemory vkMapMemory vkUnmapMemory vkFlushMappedMemoryRanges vkInvalidateMappedMemoryRanges vkGetDeviceMemoryCommitment vkBindBufferMemory vkBindImageMemory vkGetBufferMemoryRequirements vkGetImageMemoryRequirements vkGetImageSparseMemoryRequirements vkGetPhysicalDeviceSparseImageFormatProperties vkQueueBindSparse vkCreateFence vkDestroyFence vkResetFences vkGetFenceStatus vkWaitForFences vkCreateSemaphore vkDestroySemaphore vkCreateEvent vkDestroyEvent vkGetEventStatus vkSetEvent vkResetEvent vkCreateQueryPool vkDestroyQueryPool vkGetQueryPoolResults vkCreateBuffer vkDestroyBuffer vkCreateBufferView vkDestroyBufferView vkCreateImage vkDestroyImage vkGetImageSubresourceLayout vkCreateImageView vkDestroyImageView vkDestroyShaderModule vkCreatePipelineCache vkDestroyPipelineCache vkGetPipelineCacheData vkMergePipelineCaches vkCreateGraphicsPipelines vkCreateComputePipelines vkDestroyPipeline vkCreatePipelineLayout vkDestroyPipelineLayout vkCreateSampler vkDestroySampler vkCreateDescriptorSetLayout vkDestroyDescriptorSetLayout vkCreateDescriptorPool vkDestroyDescriptorPool vkResetDescriptorPool vkAllocateDescriptorSets vkFreeDescriptorSets vkUpdateDescriptorSets vkCreateFramebuffer vkDestroyFramebuffer vkCreateRenderPass vkDestroyRenderPass vkGetRenderAreaGranularity vkCreateCommandPool vkDestroyCommandPool vkResetCommandPool vkAllocateCommandBuffers vkFreeCommandBuffers vkBeginCommandBuffer vkEndCommandBuffer vkResetCommandBuffer vkCmdBindPipeline vkCmdBindDescriptorSets vkCmdBindIndexBuffer vkCmdBindVertexBuffers vkCmdDraw vkCmdDrawIndexed vkCmdDrawIndirect vkCmdDrawIndexedIndirect vkCmdDispatch vkCmdDispatchIndirect vkCmdCopyBuffer vkCmdCopyImage vkCmdBlitImage vkCmdCopyBufferToImage vkCmdCopyImageToBuffer vkCmdUpdateBuffer vkCmdFillBuffer vkCmdClearColorImage vkCmdClearDepthStencilImage vkCmdClearAttachments vkCmdResolveImage vkCmdSetEvent vkCmdResetEvent vkCmdWaitEvents vkCmdPipelineBarrier vkCmdBeginQuery vkCmdEndQuery vkCmdResetQueryPool vkCmdWriteTimestamp vkCmdCopyQueryPoolResults vkCmdPushConstants vkCmdBeginRenderPass vkCmdNextSubpass vkCmdEndRenderPass vkCmdExecuteCommands | TBD | NA | | NA | Enum used for informational messages | NONE | | NA | None | ### ParamChecker Pending Work @@ -226,11 +226,11 @@ The ObjectTracker layer maintains a record of all Vulkan objects. It flags error | Check | Overview | ENUM OBJTRACK_* | Relevant API | Testname | Notes/TODO | | ----- | -------- | ---------------- | ------------ | -------- | ---------- | -| Valid Object | Validates that referenced object was properly created and is currently valid. | INVALID_OBJECT | vkAcquireNextImageKHR vkAllocateDescriptorSets vkAllocateMemory vkBeginCommandBuffer vkBindBufferMemory vkBindImageMemory vkCmdBeginQuery vkCmdBeginRenderPass vkCmdBindDescriptorSets vkCmdBindIndexBuffer vkCmdBindPipeline vkCmdBindVertexBuffers vkCmdBlitImage vkCmdClearAttachments vkCmdClearColorImage vkCmdClearDepthStencilImage vkCmdCopyBuffer vkCmdCopyBufferToImage vkCmdCopyImage vkCmdCopyImageToBuffer vkCmdCopyQueryPoolResults vkCmdDispatch vkCmdDispatchIndirect vkCmdDraw vkCmdDrawIndexed vkCmdDrawIndexedIndirect vkCmdDrawIndirect vkCmdEndQuery vkCmdEndRenderPass vkCmdExecuteCommands vkCmdFillBuffer vkCmdNextSubpass vkCmdPipelineBarrier vkCmdPushConstants vkCmdResetEvent vkCmdResetQueryPool vkCmdResolveImage vkCmdSetEvent vkCmdUpdateBuffer vkCmdWaitEvents vkCmdWriteTimestamp vkCreateBuffer vkCreateBufferView vkAllocateCommandBuffers vkCreateCommandPool vkCreateComputePipelines vkCreateDescriptorPool vkCreateDescriptorSetLayout vkCreateEvent vkCreateFence vkCreateFramebuffer vkCreateGraphicsPipelines vkCreateImage vkCreateImageView vkCreatePipelineCache vkCreatePipelineLayout vkCreateQueryPool vkCreateRenderPass vkCreateSampler vkCreateSemaphore vkCreateShader vkCreateShaderModule vkCreateSwapchainKHR vkDestroyBuffer vkDestroyBufferView vkFreeCommandBuffers vkDestroyCommandPool vkDestroyDescriptorPool vkDestroyDescriptorSetLayout vkDestroyEvent vkDestroyFence vkDestroyFramebuffer vkDestroyImage vkDestroyImageView vkDestroyPipeline vkDestroyPipelineCache vkDestroyPipelineLayout vkDestroyQueryPool vkDestroyRenderPass vkDestroySampler vkDestroySemaphore vkDestroyShader vkDestroyShaderModule vkDestroySwapchainKHR vkDeviceWaitIdle vkEndCommandBuffer vkEnumeratePhysicalDevices vkFreeDescriptorSets vkFreeMemory vkFreeMemory vkGetBufferMemoryRequirements vkGetDeviceMemoryCommitment vkGetDeviceQueue vkGetEventStatus vkGetFenceStatus vkGetImageMemoryRequirements vkGetImageSparseMemoryRequirements vkGetImageSubresourceLayout vkGetPhysicalDeviceSurfaceSupportKHR vkGetPipelineCacheData vkGetQueryPoolResults vkGetRenderAreaGranularity vkInvalidateMappedMemoryRanges vkMapMemory vkMergePipelineCaches vkQueueBindSparse vkResetCommandBuffer vkResetCommandPool vkResetDescriptorPool vkResetEvent vkResetFences vkSetEvent vkUnmapMemory vkUpdateDescriptorSets vkWaitForFences | BindInvalidMemory BindMemoryToDestroyedObject | Every VkObject class of parameter will be run through this check. This check may ultimately supersede UNKNOWN_OBJECT | +| Valid Object | Validates that referenced object was properly created and is currently valid. | INVALID_OBJECT | vkAcquireNextImageKHR vkAllocateDescriptorSets vkAllocateMemory vkBeginCommandBuffer vkBindBufferMemory vkBindImageMemory vkCmdBeginQuery vkCmdBeginRenderPass vkCmdBindDescriptorSets vkCmdBindIndexBuffer vkCmdBindPipeline vkCmdBindVertexBuffers vkCmdBlitImage vkCmdClearAttachments vkCmdClearColorImage vkCmdClearDepthStencilImage vkCmdCopyBuffer vkCmdCopyBufferToImage vkCmdCopyImage vkCmdCopyImageToBuffer vkCmdCopyQueryPoolResults vkCmdDispatch vkCmdDispatchIndirect vkCmdDraw vkCmdDrawIndexed vkCmdDrawIndexedIndirect vkCmdDrawIndirect vkCmdEndQuery vkCmdEndRenderPass vkCmdExecuteCommands vkCmdFillBuffer vkCmdNextSubpass vkCmdPipelineBarrier vkCmdPushConstants vkCmdResetEvent vkCmdResetQueryPool vkCmdResolveImage vkCmdSetEvent vkCmdUpdateBuffer vkCmdWaitEvents vkCmdWriteTimestamp vkCreateBuffer vkCreateBufferView vkAllocateCommandBuffers vkCreateCommandPool vkCreateComputePipelines vkCreateDescriptorPool vkCreateDescriptorSetLayout vkCreateEvent vkCreateFence vkCreateFramebuffer vkCreateGraphicsPipelines vkCreateImage vkCreateImageView vkCreatePipelineCache vkCreatePipelineLayout vkCreateQueryPool vkCreateRenderPass vkCreateSampler vkCreateSemaphore vkCreateShaderModule vkCreateSwapchainKHR vkDestroyBuffer vkDestroyBufferView vkFreeCommandBuffers vkDestroyCommandPool vkDestroyDescriptorPool vkDestroyDescriptorSetLayout vkDestroyEvent vkDestroyFence vkDestroyFramebuffer vkDestroyImage vkDestroyImageView vkDestroyPipeline vkDestroyPipelineCache vkDestroyPipelineLayout vkDestroyQueryPool vkDestroyRenderPass vkDestroySampler vkDestroySemaphore vkDestroyShaderModule vkDestroySwapchainKHR vkDeviceWaitIdle vkEndCommandBuffer vkEnumeratePhysicalDevices vkFreeDescriptorSets vkFreeMemory vkFreeMemory vkGetBufferMemoryRequirements vkGetDeviceMemoryCommitment vkGetDeviceQueue vkGetEventStatus vkGetFenceStatus vkGetImageMemoryRequirements vkGetImageSparseMemoryRequirements vkGetImageSubresourceLayout vkGetPhysicalDeviceSurfaceSupportKHR vkGetPipelineCacheData vkGetQueryPoolResults vkGetRenderAreaGranularity vkInvalidateMappedMemoryRanges vkMapMemory vkMergePipelineCaches vkQueueBindSparse vkResetCommandBuffer vkResetCommandPool vkResetDescriptorPool vkResetEvent vkResetFences vkSetEvent vkUnmapMemory vkUpdateDescriptorSets vkWaitForFences | BindInvalidMemory BindMemoryToDestroyedObject | Every VkObject class of parameter will be run through this check. This check may ultimately supersede UNKNOWN_OBJECT | | Object Cleanup | Verify that object properly destroyed | DESTROY_OBJECT_FAILED | vkDestroyInstance, vkDestroyDevice, vkFreeMemory | ? | NA | | Objects Leak | When an Instance or Device object is destroyed, validates that all objects belonging to that device/instance have previously been destroyed | OBJECT_LEAK | vkDestroyDevice vkDestroyInstance | ? | NA | | Object Count | Flag error if number of objects requested from extenstion functions exceeds max number of actual objects | OBJCOUNT_MAX_EXCEEDED | objTrackGetObjects objTrackGetObjectsOfType | ? | NA | -| Valid Destroy Object | Validates that an object pass into a destroy function was properly created and is currently valid | NONE | vkDestroyInstance vkDestroyDevice vkDestroyFence vkDestroySemaphore vkDestroyEvent vkDestroyQueryPool vkDestroyBuffer vkDestroyBufferView vkDestroyImage vkDestroyImageView vkDestroyShaderModule vkDestroyShader vkDestroyPipelineCache vkDestroyPipeline vkDestroyPipelineLayout vkDestroySampler vkDestroyDescriptorSetLayout vkDestroyDescriptorPool vkDestroyCommandPool vkFreeCommandBuffers vkDestroyFramebuffer vkDestroyRenderPass vkDestroySwapchainKHR | TBD | These cases need to be moved to a more appropriate error enum | +| Valid Destroy Object | Validates that an object pass into a destroy function was properly created and is currently valid | NONE | vkDestroyInstance vkDestroyDevice vkDestroyFence vkDestroySemaphore vkDestroyEvent vkDestroyQueryPool vkDestroyBuffer vkDestroyBufferView vkDestroyImage vkDestroyImageView vkDestroyShaderModule vkDestroyPipelineCache vkDestroyPipeline vkDestroyPipelineLayout vkDestroySampler vkDestroyDescriptorSetLayout vkDestroyDescriptorPool vkDestroyCommandPool vkFreeCommandBuffers vkDestroyFramebuffer vkDestroyRenderPass vkDestroySwapchainKHR | TBD | These cases need to be moved to a more appropriate error enum | | Unknown object | Internal layer errors when it attempts to update use count for an object that's not in its internal tracking datastructures. | UNKNOWN_OBJECT | | NA | This may be irrelevant due to INVALID_OBJECT error, need to look closely and merge this with that error as appropriate. | | NA | Enum used for informational messages | NONE | | NA | 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 | | NA | None | diff --git a/loader/gpa_helper.h b/loader/gpa_helper.h index 995d4f5f..2d5d948b 100644 --- a/loader/gpa_helper.h +++ b/loader/gpa_helper.h @@ -153,10 +153,6 @@ static inline void* globalGetProcAddr(const char *name) return (void*) vkCreateShaderModule; if (!strcmp(name, "DestroyShaderModule")) return (void*) vkDestroyShaderModule; - if (!strcmp(name, "CreateShader")) - return (void*) vkCreateShader; - if (!strcmp(name, "DestroyShader")) - return (void*) vkDestroyShader; if (!strcmp(name, "CreatePipelineCache")) return (void*) vkCreatePipelineCache; if (!strcmp(name, "DestroyPipelineCache")) diff --git a/loader/table_ops.h b/loader/table_ops.h index 29bdc389..b0ef6299 100644 --- a/loader/table_ops.h +++ b/loader/table_ops.h @@ -82,8 +82,6 @@ static inline void loader_init_device_dispatch_table(VkLayerDispatchTable *table table->DestroyImageView = (PFN_vkDestroyImageView) gpa(dev, "vkDestroyImageView"); table->CreateShaderModule = (PFN_vkCreateShaderModule) gpa(dev, "vkCreateShaderModule"); table->DestroyShaderModule = (PFN_vkDestroyShaderModule) gpa(dev, "vkDestroyShaderModule"); - table->CreateShader = (PFN_vkCreateShader) gpa(dev, "vkCreateShader"); - table->DestroyShader = (PFN_vkDestroyShader) gpa(dev, "vkDestroyShader"); table->CreatePipelineCache = (PFN_vkCreatePipelineCache) gpa(dev, "vkCreatePipelineCache"); table->DestroyPipelineCache = (PFN_vkDestroyPipelineCache) gpa(dev, "vkDestroyPipelineCache"); table->GetPipelineCacheData = (PFN_vkGetPipelineCacheData) gpa(dev, "vkGetPipelineCacheData"); @@ -273,10 +271,6 @@ static inline void *loader_lookup_device_dispatch_table( return (void *) table->CreateShaderModule; if (!strcmp(name, "DestroyShaderModule")) return (void *) table->DestroyShaderModule; - if (!strcmp(name, "CreateShader")) - return (void *) table->CreateShader; - if (!strcmp(name, "DestroyShader")) - return (void *) table->DestroyShader; if (!strcmp(name, "CreatePipelineCache")) return (void*) vkCreatePipelineCache; if (!strcmp(name, "DestroyPipelineCache")) diff --git a/loader/trampoline.c b/loader/trampoline.c index 9f053c60..e86a949a 100644 --- a/loader/trampoline.c +++ b/loader/trampoline.c @@ -735,24 +735,6 @@ LOADER_EXPORT void VKAPI vkDestroyShaderModule(VkDevice device, VkShaderModule s disp->DestroyShaderModule(device, shaderModule, pAllocator); } -LOADER_EXPORT VkResult VKAPI vkCreateShader(VkDevice device, const VkShaderCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkShader* pShader) -{ - const VkLayerDispatchTable *disp; - - disp = loader_get_dispatch(device); - - return disp->CreateShader(device, pCreateInfo, pAllocator, pShader); -} - -LOADER_EXPORT void VKAPI vkDestroyShader(VkDevice device, VkShader shader, const VkAllocationCallbacks* pAllocator) -{ - const VkLayerDispatchTable *disp; - - disp = loader_get_dispatch(device); - - disp->DestroyShader(device, shader, pAllocator); -} - LOADER_EXPORT VkResult VKAPI vkCreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPipelineCache* pPipelineCache) { const VkLayerDispatchTable *disp; diff --git a/vulkan.py b/vulkan.py index a87e4351..7779f900 100755 --- a/vulkan.py +++ b/vulkan.py @@ -198,7 +198,6 @@ core = Extension( "VkBufferView", "VkImageView", "VkShaderModule", - "VkShader", "VkPipelineCache", "VkPipelineLayout", "VkRenderPass", @@ -537,17 +536,6 @@ core = Extension( Param("VkShaderModule", "shaderModule"), Param("const VkAllocationCallbacks*", "pAllocator")]), - Proto("VkResult", "CreateShader", - [Param("VkDevice", "device"), - Param("const VkShaderCreateInfo*", "pCreateInfo"), - Param("const VkAllocationCallbacks*", "pAllocator"), - Param("VkShader*", "pShader")]), - - Proto("void", "DestroyShader", - [Param("VkDevice", "device"), - Param("VkShader", "shader"), - Param("const VkAllocationCallbacks*", "pAllocator")]), - Proto("VkResult", "CreatePipelineCache", [Param("VkDevice", "device"), Param("const VkPipelineCacheCreateInfo*", "pCreateInfo"), @@ -1141,7 +1129,6 @@ object_non_dispatch_list = [ "VkBufferView", "VkImageView", "VkShaderModule", - "VkShader", "VkPipelineCache", "VkPipelineLayout", "VkPipeline", -- cgit v1.2.3