Fix regression to properly resume render pass when flushing barriers mid-pass
141a8de0da
This commit is contained in:
@@ -446,7 +446,7 @@ void GPUContextVulkan::BeginRenderPass()
|
|||||||
if (_drawPass && _drawPass->RenderTargetsActions)
|
if (_drawPass && _drawPass->RenderTargetsActions)
|
||||||
{
|
{
|
||||||
GPUDrawPassAction action = _drawPass->RenderTargetsActions[i];
|
GPUDrawPassAction action = _drawPass->RenderTargetsActions[i];
|
||||||
if ((uint32)action & (uint32)GPUDrawPassAction::Clear)
|
if ((uint32)action & (uint32)GPUDrawPassAction::Clear && _drawPassCanClear)
|
||||||
layout.LoadClear |= mask;
|
layout.LoadClear |= mask;
|
||||||
else if (((uint32)action & (uint32)GPUDrawPassAction::LoadMask) == 0)
|
else if (((uint32)action & (uint32)GPUDrawPassAction::LoadMask) == 0)
|
||||||
layout.LoadDontCare |= mask;
|
layout.LoadDontCare |= mask;
|
||||||
@@ -480,7 +480,7 @@ void GPUContextVulkan::BeginRenderPass()
|
|||||||
if (_drawPass)
|
if (_drawPass)
|
||||||
{
|
{
|
||||||
GPUDrawPassAction action = _drawPass->DepthAction;
|
GPUDrawPassAction action = _drawPass->DepthAction;
|
||||||
if ((uint32)action & (uint32)GPUDrawPassAction::Clear)
|
if ((uint32)action & (uint32)GPUDrawPassAction::Clear && _drawPassCanClear)
|
||||||
layout.LoadClear |= mask;
|
layout.LoadClear |= mask;
|
||||||
else if (((uint32)action & (uint32)GPUDrawPassAction::LoadMask) == 0)
|
else if (((uint32)action & (uint32)GPUDrawPassAction::LoadMask) == 0)
|
||||||
layout.LoadDontCare |= mask;
|
layout.LoadDontCare |= mask;
|
||||||
@@ -516,6 +516,7 @@ void GPUContextVulkan::BeginRenderPass()
|
|||||||
framebufferKey.RenderPass = renderPass;
|
framebufferKey.RenderPass = renderPass;
|
||||||
auto framebuffer = _device->GetOrCreateFramebuffer(framebufferKey, layout.Extent, layout.Layers);
|
auto framebuffer = _device->GetOrCreateFramebuffer(framebufferKey, layout.Extent, layout.Layers);
|
||||||
_renderPass = renderPass;
|
_renderPass = renderPass;
|
||||||
|
_drawPassCanClear = false;
|
||||||
|
|
||||||
FlushBarriers();
|
FlushBarriers();
|
||||||
|
|
||||||
@@ -2009,6 +2010,7 @@ void GPUContextVulkan::BeginDrawPass(GPUDrawPass& pass)
|
|||||||
_drawPass = &pass;
|
_drawPass = &pass;
|
||||||
_rtDirtyFlag = true;
|
_rtDirtyFlag = true;
|
||||||
_psDirtyFlag = true;
|
_psDirtyFlag = true;
|
||||||
|
_drawPassCanClear = true;
|
||||||
_rtCount = pass.RenderTargetsCount;
|
_rtCount = pass.RenderTargetsCount;
|
||||||
_rtDepth = (GPUTextureViewVulkan*)pass.DepthBuffer;
|
_rtDepth = (GPUTextureViewVulkan*)pass.DepthBuffer;
|
||||||
Platform::MemoryCopy(_rtHandles, pass.RenderTargets, pass.RenderTargetsCount * sizeof(void*));
|
Platform::MemoryCopy(_rtHandles, pass.RenderTargets, pass.RenderTargetsCount * sizeof(void*));
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ private:
|
|||||||
int32 _psDirtyFlag : 1;
|
int32 _psDirtyFlag : 1;
|
||||||
int32 _rtDirtyFlag : 1;
|
int32 _rtDirtyFlag : 1;
|
||||||
int32 _cbDirtyFlag : 1;
|
int32 _cbDirtyFlag : 1;
|
||||||
|
int32 _drawPassCanClear : 1;
|
||||||
int32 _depthBoundsEnable : 1;
|
int32 _depthBoundsEnable : 1;
|
||||||
|
|
||||||
int32 _rtCount;
|
int32 _rtCount;
|
||||||
|
|||||||
Reference in New Issue
Block a user