summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineVulkan
diff options
context:
space:
mode:
authorEgor Yusov <egor.yusov@gmail.com>2018-06-17 19:25:06 +0000
committerEgor Yusov <egor.yusov@gmail.com>2018-06-17 19:25:06 +0000
commitcf2f819ee174d276fb729e2ce87428c71ff9bfe6 (patch)
tree4d071c450fae5ef18652c5cf372b5803ad1245f3 /Graphics/GraphicsEngineVulkan
parentFixed issue with commtting dynamic resources (can't use resource cache as thi... (diff)
downloadDiligentCore-cf2f819ee174d276fb729e2ce87428c71ff9bfe6.tar.gz
DiligentCore-cf2f819ee174d276fb729e2ce87428c71ff9bfe6.zip
Enabled DispatchCompute() in Vulkan backend
Diffstat (limited to 'Graphics/GraphicsEngineVulkan')
-rw-r--r--Graphics/GraphicsEngineVulkan/src/BufferVkImpl.cpp25
-rw-r--r--Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp42
2 files changed, 49 insertions, 18 deletions
diff --git a/Graphics/GraphicsEngineVulkan/src/BufferVkImpl.cpp b/Graphics/GraphicsEngineVulkan/src/BufferVkImpl.cpp
index 8120e819..c06570b9 100644
--- a/Graphics/GraphicsEngineVulkan/src/BufferVkImpl.cpp
+++ b/Graphics/GraphicsEngineVulkan/src/BufferVkImpl.cpp
@@ -79,9 +79,30 @@ BufferVkImpl :: BufferVkImpl(IReferenceCounters* pRefCounters,
VK_BUFFER_USAGE_TRANSFER_SRC_BIT | // The buffer can be used as the source of a transfer command
VK_BUFFER_USAGE_TRANSFER_DST_BIT; // The buffer can be used as the destination of a transfer command
if (m_Desc.BindFlags & BIND_UNORDERED_ACCESS)
- VkBuffCI.usage |= m_Desc.Mode == BUFFER_MODE_FORMATTED ? VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT : VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
+ {
+ // VkBuffCI.usage |= m_Desc.Mode == BUFFER_MODE_FORMATTED ? VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT : VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
+ // HLSL formatted buffers are mapped to GLSL storage buffers:
+ //
+ // RWBuffer<uint4> RWBuff
+ //
+ // |
+ // V
+ //
+ // layout(std140, binding = 3) buffer RWBuff
+ // {
+ // uvec4 data[];
+ // }g_RWBuff;
+ //
+ // So we have to set both VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT and VK_BUFFER_USAGE_STORAGE_BUFFER_BIT bits
+ VkBuffCI.usage |= VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
+ }
if (m_Desc.BindFlags & BIND_SHADER_RESOURCE)
- VkBuffCI.usage |= m_Desc.Mode == BUFFER_MODE_FORMATTED ? VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER : VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
+ {
+ // VkBuffCI.usage |= m_Desc.Mode == BUFFER_MODE_FORMATTED ? VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER : VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
+ // HLSL buffer SRV are mapped to storge buffers in GLSL, so we need to set both
+ // VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER and VK_BUFFER_USAGE_STORAGE_BUFFER_BIT flags
+ VkBuffCI.usage |= VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
+ }
if (m_Desc.BindFlags & BIND_VERTEX_BUFFER)
VkBuffCI.usage |= VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
if (m_Desc.BindFlags & BIND_INDEX_BUFFER)
diff --git a/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp b/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp
index d1f88d0d..1a25e379 100644
--- a/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp
+++ b/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp
@@ -512,16 +512,17 @@ namespace Diligent
}
#endif
-#if 0
auto *pPipelineStateVk = m_pPipelineState.RawPtr<PipelineStateVkImpl>();
- auto &ComputeCtx = RequestCmdContext()->AsComputeContext();
- ComputeCtx.SetRootSignature( pPipelineStateVk->GetVkRootSignature() );
-
- if(m_pCommittedResourceCache != nullptr)
- {
- pPipelineStateVk->GetRootSignature().CommitRootViews(*m_pCommittedResourceCache, ComputeCtx, true, m_ContextId);
- }
+ EnsureVkCmdBuffer();
+
+ // Dispatch commands must be executed outside of render pass
+ if (m_CommandBuffer.GetState().RenderPass != VK_NULL_HANDLE)
+ m_CommandBuffer.EndRenderPass();
+
+ if (m_DesrSetBindInfo.DynamicOffsetCount != 0)
+ pPipelineStateVk->BindDescriptorSetsWithDynamicOffsets(this, m_DesrSetBindInfo);
+#if 0
#ifdef _DEBUG
else
{
@@ -529,6 +530,7 @@ namespace Diligent
LOG_ERROR_MESSAGE("Pipeline state \"", pPipelineStateVk->GetDesc().Name, "\" contains shader resources, but IDeviceContext::CommitShaderResources() was not called" );
}
#endif
+#endif
if( DispatchAttrs.pIndirectDispatchAttribs )
{
@@ -539,10 +541,11 @@ namespace Diligent
pBufferVk->DbgVerifyDynamicAllocation(m_ContextId);
#endif
- ComputeCtx.TransitionResource(pBufferVk, Vk_RESOURCE_STATE_INDIRECT_ARGUMENT);
- size_t BuffDataStartByteOffset;
- IVkResource *pVkArgsBuff = pBufferVk->GetVkBuffer(BuffDataStartByteOffset, m_ContextId);
- ComputeCtx.ExecuteIndirect(m_pDispatchIndirectSignature, pVkArgsBuff, DispatchAttrs.DispatchArgsByteOffset + BuffDataStartByteOffset);
+ // Buffer memory barries must be executed outside of render pass
+ if (!pBufferVk->CheckAccessFlags(VK_ACCESS_INDIRECT_COMMAND_READ_BIT))
+ BufferMemoryBarrier(*pBufferVk, VK_ACCESS_INDIRECT_COMMAND_READ_BIT);
+
+ m_CommandBuffer.DispatchIndirect(pBufferVk->GetVkBuffer(), pBufferVk->GetDynamicOffset(m_ContextId) + DispatchAttrs.DispatchArgsByteOffset);
}
else
{
@@ -550,8 +553,8 @@ namespace Diligent
}
}
else
- ComputeCtx.Dispatch(DispatchAttrs.ThreadGroupCountX, DispatchAttrs.ThreadGroupCountY, DispatchAttrs.ThreadGroupCountZ);
-#endif
+ m_CommandBuffer.Dispatch(DispatchAttrs.ThreadGroupCountX, DispatchAttrs.ThreadGroupCountY, DispatchAttrs.ThreadGroupCountZ);
+
++m_State.NumCommands;
}
@@ -870,11 +873,17 @@ namespace Diligent
for( Uint32 vp = 0; vp < m_NumViewports; ++vp )
{
VkViewports[vp].x = m_Viewports[vp].TopLeftX;
- VkViewports[vp].y = m_FramebufferHeight - m_Viewports[vp].TopLeftY;
+ VkViewports[vp].y = m_Viewports[vp].TopLeftY;
VkViewports[vp].width = m_Viewports[vp].Width;
- VkViewports[vp].height = -m_Viewports[vp].Height;
+ VkViewports[vp].height = m_Viewports[vp].Height;
VkViewports[vp].minDepth = m_Viewports[vp].MinDepth;
VkViewports[vp].maxDepth = m_Viewports[vp].MaxDepth;
+ if(m_IsDefaultFramebufferBound)
+ {
+ // Default framebuffer is upside-down in Vulkan
+ VkViewports[vp].y = m_FramebufferHeight - VkViewports[vp].y;
+ VkViewports[vp].height = -VkViewports[vp].height;
+ }
}
EnsureVkCmdBuffer();
// TODO: reinterpret_cast m_Viewports to VkViewports?
@@ -1107,6 +1116,7 @@ namespace Diligent
void DeviceContextVkImpl::GenerateMips(TextureViewVkImpl *pTexView)
{
+ UNSUPPORTED("Not yet implemented");
#if 0
auto *pCtx = RequestCmdContext();
m_MipsGenerator.GenerateMips(m_pDevice.RawPtr<RenderDeviceVkImpl>(), pTexView, *pCtx);