Fix structured uav/srv buffer usage on Vulkan

This commit is contained in:
Wojtek Figat
2021-04-28 15:52:48 +02:00
parent cf799c2198
commit cbea62ceb9
3 changed files with 24 additions and 18 deletions

View File

@@ -17,14 +17,17 @@ void GPUBufferViewVulkan::Init(GPUDeviceVulkan* device, GPUBufferVulkan* owner,
Buffer = buffer;
Size = size;
VkBufferViewCreateInfo viewInfo;
RenderToolsVulkan::ZeroStruct(viewInfo, VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO);
viewInfo.buffer = Buffer;
viewInfo.format = RenderToolsVulkan::ToVulkanFormat(format);
viewInfo.offset = 0;
viewInfo.range = Size;
VALIDATE_VULKAN_RESULT(vkCreateBufferView(device->Device, &viewInfo, nullptr, &View));
if (owner->IsShaderResource() && !(owner->GetDescription().Flags & GPUBufferFlags::Structured))
{
VkBufferViewCreateInfo viewInfo;
RenderToolsVulkan::ZeroStruct(viewInfo, VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO);
viewInfo.buffer = Buffer;
viewInfo.format = RenderToolsVulkan::ToVulkanFormat(format);
viewInfo.offset = 0;
viewInfo.range = Size;
ASSERT_LOW_LAYER(viewInfo.format != VK_FORMAT_UNDEFINED);
VALIDATE_VULKAN_RESULT(vkCreateBufferView(device->Device, &viewInfo, nullptr, &View));
}
}
void GPUBufferViewVulkan::Release()
@@ -32,19 +35,18 @@ void GPUBufferViewVulkan::Release()
if (View != VK_NULL_HANDLE)
{
Device->DeferredDeletionQueue.EnqueueResource(DeferredDeletionQueueVulkan::BufferView, View);
View = VK_NULL_HANDLE;
#if BUILD_DEBUG
Device = nullptr;
Owner = nullptr;
Buffer = VK_NULL_HANDLE;
#endif
}
#if BUILD_DEBUG
Device = nullptr;
Owner = nullptr;
Buffer = VK_NULL_HANDLE;
#endif
}
void GPUBufferViewVulkan::DescriptorAsUniformTexelBuffer(GPUContextVulkan* context, const VkBufferView*& bufferView)
{
ASSERT_LOW_LAYER(View != VK_NULL_HANDLE);
bufferView = &View;
context->AddBufferBarrier(Owner, VK_ACCESS_SHADER_READ_BIT);
@@ -52,6 +54,7 @@ void GPUBufferViewVulkan::DescriptorAsUniformTexelBuffer(GPUContextVulkan* conte
void GPUBufferViewVulkan::DescriptorAsStorageBuffer(GPUContextVulkan* context, VkBuffer& buffer, VkDeviceSize& offset, VkDeviceSize& range)
{
ASSERT_LOW_LAYER(Buffer);
buffer = Buffer;
offset = 0;
range = Size;
@@ -88,7 +91,7 @@ bool GPUBufferVulkan::OnInit()
bufferInfo.size = _desc.Size;
bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
bufferInfo.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
if (useSRV)
if (useSRV && !(_desc.Flags & GPUBufferFlags::Structured))
bufferInfo.usage |= VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
if (useUAV || _desc.Flags & GPUBufferFlags::RawBuffer)
bufferInfo.usage |= VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
@@ -165,7 +168,7 @@ bool GPUBufferVulkan::OnInit()
}
}
// Check if need to bind buffer to the shaders
else if (useSRV)
else if (useSRV || useUAV)
{
// Create buffer view
_view.Init(_device, this, _buffer, _desc.Size, _desc.Format);

View File

@@ -144,8 +144,8 @@ static VKAPI_ATTR VkBool32 VKAPI_PTR DebugUtilsCallback(VkDebugUtilsMessageSever
case 2: // Fragment shader writes to output location 0 with no matching attachment
case 3: // Attachment 2 not written by fragment shader
case 5: // SPIR-V module not valid: MemoryBarrier: Vulkan specification requires Memory Semantics to have one of the following bits set: Acquire, Release, AcquireRelease or SequentiallyConsistent
#if PLATFORM_ANDROID
case -1666394502: // After query pool creation, each query must be reset before it is used. Queries must also be reset between uses.
#if PLATFORM_ANDROID
case 602160055: // Attachment 4 not written by fragment shader; undefined values will be written to attachment. TODO: investigate it for PS_GBuffer shader from Deferred material with USE_LIGHTMAP=1
#endif
return VK_FALSE;

View File

@@ -78,6 +78,9 @@ public:
case 0:
stageFlags = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
break;
case VK_ACCESS_INDIRECT_COMMAND_READ_BIT:
stageFlags = VK_PIPELINE_STAGE_TRANSFER_BIT;
break;
case VK_ACCESS_TRANSFER_WRITE_BIT:
stageFlags = VK_PIPELINE_STAGE_TRANSFER_BIT;
break;