diff options
| author | Egor Yusov <egor.yusov@gmail.com> | 2018-06-17 19:25:06 +0000 |
|---|---|---|
| committer | Egor Yusov <egor.yusov@gmail.com> | 2018-06-17 19:25:06 +0000 |
| commit | cf2f819ee174d276fb729e2ce87428c71ff9bfe6 (patch) | |
| tree | 4d071c450fae5ef18652c5cf372b5803ad1245f3 /Graphics/GraphicsEngineVulkan | |
| parent | Fixed issue with commtting dynamic resources (can't use resource cache as thi... (diff) | |
| download | DiligentCore-cf2f819ee174d276fb729e2ce87428c71ff9bfe6.tar.gz DiligentCore-cf2f819ee174d276fb729e2ce87428c71ff9bfe6.zip | |
Enabled DispatchCompute() in Vulkan backend
Diffstat (limited to 'Graphics/GraphicsEngineVulkan')
| -rw-r--r-- | Graphics/GraphicsEngineVulkan/src/BufferVkImpl.cpp | 25 | ||||
| -rw-r--r-- | Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp | 42 |
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); |
