Fix crash on Vulkan when binding dummy buffer as missing uniform buffer

#3000
This commit is contained in:
Wojtek Figat
2025-03-08 14:28:47 +01:00
parent 679d56d7a3
commit fef967d4a0
3 changed files with 17 additions and 14 deletions

View File

@@ -557,14 +557,9 @@ void GPUContextVulkan::UpdateDescriptorSets(const SpirvShaderDescriptorInfo& des
VkBuffer buffer = VK_NULL_HANDLE;
VkDeviceSize offset = 0, range = 0;
uint32 dynamicOffset = 0;
if (handle)
handle->DescriptorAsDynamicUniformBuffer(this, buffer, offset, range, dynamicOffset);
else
{
const auto dummy = _device->HelperResources.GetDummyBuffer();
buffer = dummy->GetHandle();
range = dummy->GetSize();
}
if (!handle)
handle = (GPUConstantBufferVulkan*)_device->HelperResources.GetDummyConstantBuffer();
handle->DescriptorAsDynamicUniformBuffer(this, buffer, offset, range, dynamicOffset);
needsWrite |= dsWriter.WriteDynamicUniformBuffer(descriptorIndex, buffer, offset, range, dynamicOffset, index);
break;
}

View File

@@ -749,8 +749,6 @@ bool BufferedQueryPoolVulkan::HasRoom() const
HelperResourcesVulkan::HelperResourcesVulkan(GPUDeviceVulkan* device)
: _device(device)
, _dummyBuffer(nullptr)
, _dummyVB(nullptr)
{
Platform::MemoryClear(_dummyTextures, sizeof(_dummyTextures));
Platform::MemoryClear(_staticSamplers, sizeof(_staticSamplers));
@@ -883,7 +881,6 @@ GPUBufferVulkan* HelperResourcesVulkan::GetDummyBuffer()
_dummyBuffer = (GPUBufferVulkan*)_device->CreateBuffer(TEXT("DummyBuffer"));
_dummyBuffer->Init(GPUBufferDescription::Buffer(sizeof(int32) * 256, GPUBufferFlags::ShaderResource | GPUBufferFlags::UnorderedAccess, PixelFormat::R32_SInt));
}
return _dummyBuffer;
}
@@ -894,15 +891,24 @@ GPUBufferVulkan* HelperResourcesVulkan::GetDummyVertexBuffer()
_dummyVB = (GPUBufferVulkan*)_device->CreateBuffer(TEXT("DummyVertexBuffer"));
_dummyVB->Init(GPUBufferDescription::Vertex(sizeof(Color32), 1, &Color32::Transparent));
}
return _dummyVB;
}
GPUConstantBuffer* HelperResourcesVulkan::GetDummyConstantBuffer()
{
if (!_dummyCB)
{
_dummyCB = _device->CreateConstantBuffer(256, TEXT("DummyConstantBuffer"));
}
return _dummyCB;
}
void HelperResourcesVulkan::Dispose()
{
SAFE_DELETE_GPU_RESOURCES(_dummyTextures);
SAFE_DELETE_GPU_RESOURCE(_dummyBuffer);
SAFE_DELETE_GPU_RESOURCE(_dummyVB);
SAFE_DELETE_GPU_RESOURCE(_dummyCB);
for (int32 i = 0; i < ARRAY_COUNT(_staticSamplers); i++)
{

View File

@@ -308,8 +308,9 @@ class HelperResourcesVulkan
private:
GPUDeviceVulkan* _device;
GPUTextureVulkan* _dummyTextures[6];
GPUBufferVulkan* _dummyBuffer;
GPUBufferVulkan* _dummyVB;
GPUBufferVulkan* _dummyBuffer = nullptr;
GPUBufferVulkan* _dummyVB = nullptr;
GPUConstantBuffer* _dummyCB = nullptr;
VkSampler _staticSamplers[GPU_STATIC_SAMPLERS_COUNT];
public:
@@ -320,6 +321,7 @@ public:
GPUTextureVulkan* GetDummyTexture(SpirvShaderResourceType type);
GPUBufferVulkan* GetDummyBuffer();
GPUBufferVulkan* GetDummyVertexBuffer();
GPUConstantBuffer* GetDummyConstantBuffer();
void Dispose();
};