Fix crash on Vulkan when binding dummy buffer as missing uniform buffer
#3000
This commit is contained in:
@@ -557,14 +557,9 @@ void GPUContextVulkan::UpdateDescriptorSets(const SpirvShaderDescriptorInfo& des
|
|||||||
VkBuffer buffer = VK_NULL_HANDLE;
|
VkBuffer buffer = VK_NULL_HANDLE;
|
||||||
VkDeviceSize offset = 0, range = 0;
|
VkDeviceSize offset = 0, range = 0;
|
||||||
uint32 dynamicOffset = 0;
|
uint32 dynamicOffset = 0;
|
||||||
if (handle)
|
if (!handle)
|
||||||
handle->DescriptorAsDynamicUniformBuffer(this, buffer, offset, range, dynamicOffset);
|
handle = (GPUConstantBufferVulkan*)_device->HelperResources.GetDummyConstantBuffer();
|
||||||
else
|
handle->DescriptorAsDynamicUniformBuffer(this, buffer, offset, range, dynamicOffset);
|
||||||
{
|
|
||||||
const auto dummy = _device->HelperResources.GetDummyBuffer();
|
|
||||||
buffer = dummy->GetHandle();
|
|
||||||
range = dummy->GetSize();
|
|
||||||
}
|
|
||||||
needsWrite |= dsWriter.WriteDynamicUniformBuffer(descriptorIndex, buffer, offset, range, dynamicOffset, index);
|
needsWrite |= dsWriter.WriteDynamicUniformBuffer(descriptorIndex, buffer, offset, range, dynamicOffset, index);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -749,8 +749,6 @@ bool BufferedQueryPoolVulkan::HasRoom() const
|
|||||||
|
|
||||||
HelperResourcesVulkan::HelperResourcesVulkan(GPUDeviceVulkan* device)
|
HelperResourcesVulkan::HelperResourcesVulkan(GPUDeviceVulkan* device)
|
||||||
: _device(device)
|
: _device(device)
|
||||||
, _dummyBuffer(nullptr)
|
|
||||||
, _dummyVB(nullptr)
|
|
||||||
{
|
{
|
||||||
Platform::MemoryClear(_dummyTextures, sizeof(_dummyTextures));
|
Platform::MemoryClear(_dummyTextures, sizeof(_dummyTextures));
|
||||||
Platform::MemoryClear(_staticSamplers, sizeof(_staticSamplers));
|
Platform::MemoryClear(_staticSamplers, sizeof(_staticSamplers));
|
||||||
@@ -883,7 +881,6 @@ GPUBufferVulkan* HelperResourcesVulkan::GetDummyBuffer()
|
|||||||
_dummyBuffer = (GPUBufferVulkan*)_device->CreateBuffer(TEXT("DummyBuffer"));
|
_dummyBuffer = (GPUBufferVulkan*)_device->CreateBuffer(TEXT("DummyBuffer"));
|
||||||
_dummyBuffer->Init(GPUBufferDescription::Buffer(sizeof(int32) * 256, GPUBufferFlags::ShaderResource | GPUBufferFlags::UnorderedAccess, PixelFormat::R32_SInt));
|
_dummyBuffer->Init(GPUBufferDescription::Buffer(sizeof(int32) * 256, GPUBufferFlags::ShaderResource | GPUBufferFlags::UnorderedAccess, PixelFormat::R32_SInt));
|
||||||
}
|
}
|
||||||
|
|
||||||
return _dummyBuffer;
|
return _dummyBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -894,15 +891,24 @@ GPUBufferVulkan* HelperResourcesVulkan::GetDummyVertexBuffer()
|
|||||||
_dummyVB = (GPUBufferVulkan*)_device->CreateBuffer(TEXT("DummyVertexBuffer"));
|
_dummyVB = (GPUBufferVulkan*)_device->CreateBuffer(TEXT("DummyVertexBuffer"));
|
||||||
_dummyVB->Init(GPUBufferDescription::Vertex(sizeof(Color32), 1, &Color32::Transparent));
|
_dummyVB->Init(GPUBufferDescription::Vertex(sizeof(Color32), 1, &Color32::Transparent));
|
||||||
}
|
}
|
||||||
|
|
||||||
return _dummyVB;
|
return _dummyVB;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GPUConstantBuffer* HelperResourcesVulkan::GetDummyConstantBuffer()
|
||||||
|
{
|
||||||
|
if (!_dummyCB)
|
||||||
|
{
|
||||||
|
_dummyCB = _device->CreateConstantBuffer(256, TEXT("DummyConstantBuffer"));
|
||||||
|
}
|
||||||
|
return _dummyCB;
|
||||||
|
}
|
||||||
|
|
||||||
void HelperResourcesVulkan::Dispose()
|
void HelperResourcesVulkan::Dispose()
|
||||||
{
|
{
|
||||||
SAFE_DELETE_GPU_RESOURCES(_dummyTextures);
|
SAFE_DELETE_GPU_RESOURCES(_dummyTextures);
|
||||||
SAFE_DELETE_GPU_RESOURCE(_dummyBuffer);
|
SAFE_DELETE_GPU_RESOURCE(_dummyBuffer);
|
||||||
SAFE_DELETE_GPU_RESOURCE(_dummyVB);
|
SAFE_DELETE_GPU_RESOURCE(_dummyVB);
|
||||||
|
SAFE_DELETE_GPU_RESOURCE(_dummyCB);
|
||||||
|
|
||||||
for (int32 i = 0; i < ARRAY_COUNT(_staticSamplers); i++)
|
for (int32 i = 0; i < ARRAY_COUNT(_staticSamplers); i++)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -308,8 +308,9 @@ class HelperResourcesVulkan
|
|||||||
private:
|
private:
|
||||||
GPUDeviceVulkan* _device;
|
GPUDeviceVulkan* _device;
|
||||||
GPUTextureVulkan* _dummyTextures[6];
|
GPUTextureVulkan* _dummyTextures[6];
|
||||||
GPUBufferVulkan* _dummyBuffer;
|
GPUBufferVulkan* _dummyBuffer = nullptr;
|
||||||
GPUBufferVulkan* _dummyVB;
|
GPUBufferVulkan* _dummyVB = nullptr;
|
||||||
|
GPUConstantBuffer* _dummyCB = nullptr;
|
||||||
VkSampler _staticSamplers[GPU_STATIC_SAMPLERS_COUNT];
|
VkSampler _staticSamplers[GPU_STATIC_SAMPLERS_COUNT];
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -320,6 +321,7 @@ public:
|
|||||||
GPUTextureVulkan* GetDummyTexture(SpirvShaderResourceType type);
|
GPUTextureVulkan* GetDummyTexture(SpirvShaderResourceType type);
|
||||||
GPUBufferVulkan* GetDummyBuffer();
|
GPUBufferVulkan* GetDummyBuffer();
|
||||||
GPUBufferVulkan* GetDummyVertexBuffer();
|
GPUBufferVulkan* GetDummyVertexBuffer();
|
||||||
|
GPUConstantBuffer* GetDummyConstantBuffer();
|
||||||
void Dispose();
|
void Dispose();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user