diff --git a/Source/Engine/GraphicsDevice/Vulkan/GPUContextVulkan.cpp b/Source/Engine/GraphicsDevice/Vulkan/GPUContextVulkan.cpp index e128da84e..d543cefb1 100644 --- a/Source/Engine/GraphicsDevice/Vulkan/GPUContextVulkan.cpp +++ b/Source/Engine/GraphicsDevice/Vulkan/GPUContextVulkan.cpp @@ -452,6 +452,7 @@ void GPUContextVulkan::UpdateDescriptorSets(const SpirvShaderDescriptorInfo& des case VK_DESCRIPTOR_TYPE_SAMPLER: { // Sampler + ASSERT_LOW_LAYER(slot < GPU_MAX_SAMPLER_BINDED); const VkSampler sampler = _samplerHandles[slot]; ASSERT(sampler); needsWrite |= dsWriter.WriteSampler(descriptorIndex, sampler, index); @@ -460,6 +461,7 @@ void GPUContextVulkan::UpdateDescriptorSets(const SpirvShaderDescriptorInfo& des case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: { // Shader Resource (Texture) + ASSERT_LOW_LAYER(slot < GPU_MAX_SR_BINDED); auto handle = (GPUTextureViewVulkan*)handles[slot]; if (!handle) { @@ -490,6 +492,7 @@ void GPUContextVulkan::UpdateDescriptorSets(const SpirvShaderDescriptorInfo& des case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: { // Shader Resource (Buffer) + ASSERT_LOW_LAYER(slot < GPU_MAX_SR_BINDED); auto sr = handles[slot]; if (!sr) { @@ -505,6 +508,7 @@ void GPUContextVulkan::UpdateDescriptorSets(const SpirvShaderDescriptorInfo& des case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: { // Unordered Access (Texture) + ASSERT_LOW_LAYER(slot < GPU_MAX_UA_BINDED); auto ua = handles[slot]; ASSERT(ua); VkImageView imageView; @@ -516,6 +520,7 @@ void GPUContextVulkan::UpdateDescriptorSets(const SpirvShaderDescriptorInfo& des case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: { // Unordered Access (Buffer) + ASSERT_LOW_LAYER(slot < GPU_MAX_UA_BINDED); auto ua = handles[slot]; if (!ua) { @@ -531,6 +536,7 @@ void GPUContextVulkan::UpdateDescriptorSets(const SpirvShaderDescriptorInfo& des case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: { // Unordered Access (Buffer) + ASSERT_LOW_LAYER(slot < GPU_MAX_UA_BINDED); auto ua = handles[slot]; if (!ua) { @@ -546,6 +552,7 @@ void GPUContextVulkan::UpdateDescriptorSets(const SpirvShaderDescriptorInfo& des case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: { // Constant Buffer + ASSERT_LOW_LAYER(slot < GPU_MAX_CB_BINDED); auto cb = handles[slot]; ASSERT(cb); VkBuffer buffer; diff --git a/Source/Engine/ShadersCompilation/Vulkan/ShaderCompilerVulkan.cpp b/Source/Engine/ShadersCompilation/Vulkan/ShaderCompilerVulkan.cpp index edf4a0887..fb66e78bd 100644 --- a/Source/Engine/ShadersCompilation/Vulkan/ShaderCompilerVulkan.cpp +++ b/Source/Engine/ShadersCompilation/Vulkan/ShaderCompilerVulkan.cpp @@ -7,6 +7,7 @@ #include "Engine/Platform/Platform.h" #include "Engine/Threading/Threading.h" #include "Engine/Serialization/MemoryWriteStream.h" +#include "Engine/Graphics/Config.h" #include "Engine/GraphicsDevice/Vulkan/Types.h" // Use glslang for HLSL to SPIR-V translation @@ -682,6 +683,10 @@ bool ShaderCompilerVulkan::CompileShader(ShaderFunctionMeta& meta, WritePermutat { auto& descriptor = descriptorsCollector.Descriptors[i]; + // Skip cases (eg. AppendStructuredBuffer counter buffer) + if (descriptor.Slot == MAX_uint16) + continue; + auto& d = header.DescriptorInfo.DescriptorTypes[header.DescriptorInfo.DescriptorTypesCount++]; d.Binding = descriptor.Binding; d.Set = stageSet; @@ -694,12 +699,15 @@ bool ShaderCompilerVulkan::CompileShader(ShaderFunctionMeta& meta, WritePermutat switch (descriptor.BindingType) { case SpirvShaderResourceBindingType::CB: + ASSERT_LOW_LAYER(descriptor.Slot >= 0 && descriptor.Slot < GPU_MAX_CB_BINDED); bindings.UsedCBsMask |= 1 << descriptor.Slot; break; case SpirvShaderResourceBindingType::SRV: + ASSERT_LOW_LAYER(descriptor.Slot >= 0 && descriptor.Slot < GPU_MAX_SR_BINDED); bindings.UsedSRsMask |= 1 << descriptor.Slot; break; case SpirvShaderResourceBindingType::UAV: + ASSERT_LOW_LAYER(descriptor.Slot >= 0 && descriptor.Slot < GPU_MAX_UA_BINDED); bindings.UsedUAsMask |= 1 << descriptor.Slot; break; }