diff --git a/test_conformance/common/vulkan_wrapper/vulkan_wrapper.cpp b/test_conformance/common/vulkan_wrapper/vulkan_wrapper.cpp index e1c81086..08506d1c 100644 --- a/test_conformance/common/vulkan_wrapper/vulkan_wrapper.cpp +++ b/test_conformance/common/vulkan_wrapper/vulkan_wrapper.cpp @@ -1121,7 +1121,8 @@ VulkanComputePipeline::VulkanComputePipeline( VulkanComputePipeline::VulkanComputePipeline( const VulkanDevice &device, const VulkanPipelineLayout &pipelineLayout, - const VulkanShaderModule &shaderModule, const std::string &entryFuncName) + const VulkanShaderModule &shaderModule, const std::string &entryFuncName, + const VkSpecializationInfo *spec) : VulkanPipeline(device) { VkPipelineShaderStageCreateInfo vkPipelineShaderStageCreateInfo = {}; @@ -1134,6 +1135,8 @@ VulkanComputePipeline::VulkanComputePipeline( vkPipelineShaderStageCreateInfo.pName = entryFuncName.c_str(); vkPipelineShaderStageCreateInfo.pSpecializationInfo = NULL; + if (spec) vkPipelineShaderStageCreateInfo.pSpecializationInfo = spec; + VkComputePipelineCreateInfo vkComputePipelineCreateInfo = {}; vkComputePipelineCreateInfo.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO; diff --git a/test_conformance/common/vulkan_wrapper/vulkan_wrapper.hpp b/test_conformance/common/vulkan_wrapper/vulkan_wrapper.hpp index fb707963..25e1d409 100644 --- a/test_conformance/common/vulkan_wrapper/vulkan_wrapper.hpp +++ b/test_conformance/common/vulkan_wrapper/vulkan_wrapper.hpp @@ -297,7 +297,8 @@ public: VulkanComputePipeline(const VulkanDevice &device, const VulkanPipelineLayout &pipelineLayout, const VulkanShaderModule &shaderModule, - const std::string &entryFuncName = "main"); + const std::string &entryFuncName = "main", + const VkSpecializationInfo *spec = nullptr); virtual ~VulkanComputePipeline(); VulkanPipelineBindPoint getPipelineBindPoint() const; }; diff --git a/test_conformance/vulkan/shaders/buffer.comp b/test_conformance/vulkan/shaders/buffer.comp index 3e4eae55..3d059ce5 100644 --- a/test_conformance/vulkan/shaders/buffer.comp +++ b/test_conformance/vulkan/shaders/buffer.comp @@ -1,28 +1,28 @@ -#version 450 -#extension GL_ARB_separate_shader_objects : enable -#extension GL_EXT_shader_explicit_arithmetic_types_int8 : enable -#extension GL_EXT_shader_explicit_arithmetic_types_int32 : enable - -#define MAX_BUFFERS 5 - -layout(binding = 0) buffer Params -{ - uint32_t numBuffers; - uint32_t bufferSize; - uint32_t interBufferOffset; -}; -layout(binding = 1) buffer Buffer -{ - uint8_t ptr[]; -} bufferPtrList[MAX_BUFFERS]; -layout(local_size_x = 128) in; -void main() { - for (uint32_t bufIdx = 0; bufIdx < numBuffers; bufIdx++) { - uint32_t ptrIdx = gl_GlobalInvocationID.x; - uint32_t limit = bufferSize; - while (ptrIdx < limit) { - bufferPtrList[bufIdx].ptr[ptrIdx]++; - ptrIdx += (gl_NumWorkGroups.x * gl_WorkGroupSize.x); - } - } +#version 450 +#extension GL_ARB_separate_shader_objects : enable +#extension GL_EXT_shader_explicit_arithmetic_types_int8 : enable +#extension GL_EXT_shader_explicit_arithmetic_types_int32 : enable + +layout(constant_id = 0) const uint MAX_BUFFERS = 5; + +layout(binding = 0) buffer Params +{ + uint32_t numBuffers; + uint32_t bufferSize; + uint32_t interBufferOffset; +}; +layout(binding = 1) buffer Buffer +{ + uint8_t ptr[]; +} bufferPtrList[MAX_BUFFERS]; +layout(local_size_x = 128) in; +void main() { + for (uint32_t bufIdx = 0; bufIdx < numBuffers; bufIdx++) { + uint32_t ptrIdx = gl_GlobalInvocationID.x; + uint32_t limit = bufferSize; + while (ptrIdx < limit) { + bufferPtrList[bufIdx].ptr[ptrIdx]++; + ptrIdx += (gl_NumWorkGroups.x * gl_WorkGroupSize.x); + } + } } \ No newline at end of file diff --git a/test_conformance/vulkan/test_vulkan_interop_buffer.cpp b/test_conformance/vulkan/test_vulkan_interop_buffer.cpp index 23578e06..9e9a7fcb 100644 --- a/test_conformance/vulkan/test_vulkan_interop_buffer.cpp +++ b/test_conformance/vulkan/test_vulkan_interop_buffer.cpp @@ -128,12 +128,24 @@ int run_test_with_two_queue( vkDescriptorSetLayoutBindingList.addBinding( 0, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1); vkDescriptorSetLayoutBindingList.addBinding( - 1, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, MAX_BUFFERS); + 1, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, numBuffers); VulkanDescriptorSetLayout vkDescriptorSetLayout( vkDevice, vkDescriptorSetLayoutBindingList); VulkanPipelineLayout vkPipelineLayout(vkDevice, vkDescriptorSetLayout); - VulkanComputePipeline vkComputePipeline(vkDevice, vkPipelineLayout, - vkBufferShaderModule); + + VkSpecializationMapEntry entry; + entry.constantID = 0; + entry.offset = 0; + entry.size = sizeof(uint32_t); + + VkSpecializationInfo spec; + spec.mapEntryCount = 1; + spec.pMapEntries = &entry; + spec.dataSize = sizeof(uint32_t); + spec.pData = &numBuffers; + + VulkanComputePipeline vkComputePipeline( + vkDevice, vkPipelineLayout, vkBufferShaderModule, "main", &spec); VulkanDescriptorPool vkDescriptorPool(vkDevice, vkDescriptorSetLayoutBindingList); @@ -461,12 +473,24 @@ int run_test_with_one_queue( vkDescriptorSetLayoutBindingList.addBinding( 0, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1); vkDescriptorSetLayoutBindingList.addBinding( - 1, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, MAX_BUFFERS); + 1, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, numBuffers); VulkanDescriptorSetLayout vkDescriptorSetLayout( vkDevice, vkDescriptorSetLayoutBindingList); VulkanPipelineLayout vkPipelineLayout(vkDevice, vkDescriptorSetLayout); - VulkanComputePipeline vkComputePipeline(vkDevice, vkPipelineLayout, - vkBufferShaderModule); + + VkSpecializationMapEntry entry; + entry.constantID = 0; + entry.offset = 0; + entry.size = sizeof(uint32_t); + + VkSpecializationInfo spec; + spec.mapEntryCount = 1; + spec.pMapEntries = &entry; + spec.dataSize = sizeof(uint32_t); + spec.pData = &numBuffers; + + VulkanComputePipeline vkComputePipeline( + vkDevice, vkPipelineLayout, vkBufferShaderModule, "main", &spec); VulkanDescriptorPool vkDescriptorPool(vkDevice, vkDescriptorSetLayoutBindingList); @@ -764,12 +788,24 @@ int run_test_with_multi_import_same_ctx( vkDescriptorSetLayoutBindingList.addBinding( 0, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1); vkDescriptorSetLayoutBindingList.addBinding( - 1, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, MAX_BUFFERS); + 1, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, numBuffers); VulkanDescriptorSetLayout vkDescriptorSetLayout( vkDevice, vkDescriptorSetLayoutBindingList); VulkanPipelineLayout vkPipelineLayout(vkDevice, vkDescriptorSetLayout); - VulkanComputePipeline vkComputePipeline(vkDevice, vkPipelineLayout, - vkBufferShaderModule); + + VkSpecializationMapEntry entry; + entry.constantID = 0; + entry.offset = 0; + entry.size = sizeof(uint32_t); + + VkSpecializationInfo spec; + spec.mapEntryCount = 1; + spec.pMapEntries = &entry; + spec.dataSize = sizeof(uint32_t); + spec.pData = &numBuffers; + + VulkanComputePipeline vkComputePipeline( + vkDevice, vkPipelineLayout, vkBufferShaderModule, "main", &spec); VulkanDescriptorPool vkDescriptorPool(vkDevice, vkDescriptorSetLayoutBindingList); @@ -1103,12 +1139,24 @@ int run_test_with_multi_import_diff_ctx( vkDescriptorSetLayoutBindingList.addBinding( 0, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1); vkDescriptorSetLayoutBindingList.addBinding( - 1, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, MAX_BUFFERS); + 1, VULKAN_DESCRIPTOR_TYPE_STORAGE_BUFFER, numBuffers); VulkanDescriptorSetLayout vkDescriptorSetLayout( vkDevice, vkDescriptorSetLayoutBindingList); VulkanPipelineLayout vkPipelineLayout(vkDevice, vkDescriptorSetLayout); - VulkanComputePipeline vkComputePipeline(vkDevice, vkPipelineLayout, - vkBufferShaderModule); + + VkSpecializationMapEntry entry; + entry.constantID = 0; + entry.offset = 0; + entry.size = sizeof(uint32_t); + + VkSpecializationInfo spec; + spec.mapEntryCount = 1; + spec.pMapEntries = &entry; + spec.dataSize = sizeof(uint32_t); + spec.pData = &numBuffers; + + VulkanComputePipeline vkComputePipeline( + vkDevice, vkPipelineLayout, vkBufferShaderModule, "main", &spec); VulkanDescriptorPool vkDescriptorPool(vkDevice, vkDescriptorSetLayoutBindingList);