Add clearDepth parameter to resolveBindTexture()

This commit is contained in:
Jack Andersen 2018-01-05 20:49:54 -10:00
parent ed618fa8cb
commit db82ba674b
6 changed files with 37 additions and 7 deletions

View File

@ -33,7 +33,7 @@ struct IGraphicsCommandQueue
virtual void drawInstancesIndexed(size_t start, size_t count, size_t instCount)=0; virtual void drawInstancesIndexed(size_t start, size_t count, size_t instCount)=0;
virtual void resolveBindTexture(const ObjToken<ITextureR>& texture, const SWindowRect& rect, virtual void resolveBindTexture(const ObjToken<ITextureR>& texture, const SWindowRect& rect,
bool tlOrigin, int bindIdx, bool color, bool depth)=0; bool tlOrigin, int bindIdx, bool color, bool depth, bool clearDepth=false)=0;
virtual void resolveDisplay(const ObjToken<ITextureR>& source)=0; virtual void resolveDisplay(const ObjToken<ITextureR>& source)=0;
virtual void execute()=0; virtual void execute()=0;

View File

@ -1112,7 +1112,7 @@ struct D3D11CommandQueue : IGraphicsCommandQueue
} }
void resolveBindTexture(const boo::ObjToken<ITextureR>& texture, const SWindowRect& rect, void resolveBindTexture(const boo::ObjToken<ITextureR>& texture, const SWindowRect& rect,
bool tlOrigin, int bindIdx, bool color, bool depth) bool tlOrigin, int bindIdx, bool color, bool depth, bool clearDepth)
{ {
const D3D11TextureR* tex = texture.cast<D3D11TextureR>(); const D3D11TextureR* tex = texture.cast<D3D11TextureR>();
if (color && tex->m_colorBindCount) if (color && tex->m_colorBindCount)
@ -1135,6 +1135,9 @@ struct D3D11CommandQueue : IGraphicsCommandQueue
{ {
m_deferredCtx->CopyResource(tex->m_depthBindTex[bindIdx].Get(), tex->m_depthTex.Get()); m_deferredCtx->CopyResource(tex->m_depthBindTex[bindIdx].Get(), tex->m_depthTex.Get());
} }
if (clearDepth)
m_deferredCtx->ClearDepthStencilView(tex->m_dsv.Get(), D3D11_CLEAR_DEPTH, 0.0f, 0);
} }
boo::ObjToken<ITextureR> m_doPresent; boo::ObjToken<ITextureR> m_doPresent;

View File

@ -1404,7 +1404,7 @@ struct D3D12CommandQueue : IGraphicsCommandQueue
void resolveBindTexture(const boo::ObjToken<ITextureR>& texture, void resolveBindTexture(const boo::ObjToken<ITextureR>& texture,
const SWindowRect& rect, bool tlOrigin, const SWindowRect& rect, bool tlOrigin,
int bindIdx, bool color, bool depth) int bindIdx, bool color, bool depth, bool clearDepth)
{ {
D3D12TextureR* tex = texture.cast<D3D12TextureR>(); D3D12TextureR* tex = texture.cast<D3D12TextureR>();
@ -1468,6 +1468,12 @@ struct D3D12CommandQueue : IGraphicsCommandQueue
}; };
m_cmdList->ResourceBarrier(2, copyTeardown); m_cmdList->ResourceBarrier(2, copyTeardown);
} }
if (clearDepth)
{
CD3DX12_CPU_DESCRIPTOR_HANDLE handle(tex->m_dsvHeap->GetCPUDescriptorHandleForHeapStart());
m_cmdList->ClearDepthStencilView(handle, D3D12_CLEAR_FLAG_DEPTH, 0.0f, 0, 0, nullptr);
}
} }
bool m_doPresent = false; bool m_doPresent = false;

View File

@ -1076,6 +1076,7 @@ struct GLCommandQueue : IGraphicsCommandQueue
int bindIdx; int bindIdx;
bool resolveColor : 1; bool resolveColor : 1;
bool resolveDepth : 1; bool resolveDepth : 1;
bool clearDepth : 1;
Command(Op op) : m_op(op) {} Command(Op op) : m_op(op) {}
Command(const Command&) = delete; Command(const Command&) = delete;
Command& operator=(const Command&) = delete; Command& operator=(const Command&) = delete;
@ -1308,6 +1309,12 @@ struct GLCommandQueue : IGraphicsCommandQueue
cmd.viewport.rect.location[0], cmd.viewport.rect.location[1], cmd.viewport.rect.location[0], cmd.viewport.rect.location[1],
cmd.viewport.rect.size[0], cmd.viewport.rect.size[1]); cmd.viewport.rect.size[0], cmd.viewport.rect.size[1]);
} }
if (cmd.clearDepth)
{
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, tex->m_fbo);
glDepthMask(GL_TRUE);
glClear(GL_DEPTH_BUFFER_BIT);
}
break; break;
} }
case Command::Op::Present: case Command::Op::Present:
@ -1456,7 +1463,7 @@ struct GLCommandQueue : IGraphicsCommandQueue
} }
void resolveBindTexture(const ObjToken<ITextureR>& texture, const SWindowRect& rect, bool tlOrigin, void resolveBindTexture(const ObjToken<ITextureR>& texture, const SWindowRect& rect, bool tlOrigin,
int bindIdx, bool color, bool depth) int bindIdx, bool color, bool depth, bool clearDepth)
{ {
GLTextureR* tex = texture.cast<GLTextureR>(); GLTextureR* tex = texture.cast<GLTextureR>();
std::vector<Command>& cmds = m_cmdBufs[m_fillBuf]; std::vector<Command>& cmds = m_cmdBufs[m_fillBuf];
@ -1465,6 +1472,7 @@ struct GLCommandQueue : IGraphicsCommandQueue
cmds.back().bindIdx = bindIdx; cmds.back().bindIdx = bindIdx;
cmds.back().resolveColor = color; cmds.back().resolveColor = color;
cmds.back().resolveDepth = depth; cmds.back().resolveDepth = depth;
cmds.back().clearDepth = clearDepth;
SWindowRect intersectRect = rect.intersect(SWindowRect(0, 0, tex->m_width, tex->m_height)); SWindowRect intersectRect = rect.intersect(SWindowRect(0, 0, tex->m_width, tex->m_height));
SWindowRect& targetRect = cmds.back().viewport.rect; SWindowRect& targetRect = cmds.back().viewport.rect;
targetRect.location[0] = intersectRect.location[0]; targetRect.location[0] = intersectRect.location[0];

View File

@ -1169,7 +1169,7 @@ struct MetalCommandQueue : IGraphicsCommandQueue
} }
void resolveBindTexture(const ObjToken<ITextureR>& texture, const SWindowRect& rect, bool tlOrigin, void resolveBindTexture(const ObjToken<ITextureR>& texture, const SWindowRect& rect, bool tlOrigin,
int bindIdx, bool color, bool depth) int bindIdx, bool color, bool depth, bool clearDepth)
{ {
MetalTextureR* tex = texture.cast<MetalTextureR>(); MetalTextureR* tex = texture.cast<MetalTextureR>();
@autoreleasepool @autoreleasepool
@ -1208,7 +1208,7 @@ struct MetalCommandQueue : IGraphicsCommandQueue
} }
[blitEnc endEncoding]; [blitEnc endEncoding];
m_enc = [m_cmdBuf renderCommandEncoderWithDescriptor:tex->m_passDesc]; m_enc = [m_cmdBuf renderCommandEncoderWithDescriptor:clearDepth ? tex->m_clearDepthPassDesc : tex->m_passDesc];
[m_enc setFrontFacingWinding:MTLWindingCounterClockwise]; [m_enc setFrontFacingWinding:MTLWindingCounterClockwise];
if (m_boundVp.width || m_boundVp.height) if (m_boundVp.width || m_boundVp.height)

View File

@ -2791,7 +2791,7 @@ struct VulkanCommandQueue : IGraphicsCommandQueue
void resolveBindTexture(const boo::ObjToken<ITextureR>& texture, void resolveBindTexture(const boo::ObjToken<ITextureR>& texture,
const SWindowRect& rect, bool tlOrigin, const SWindowRect& rect, bool tlOrigin,
int bindIdx, bool color, bool depth) int bindIdx, bool color, bool depth, bool clearDepth)
{ {
VkCommandBuffer cmdBuf = m_cmdBufs[m_fillBuf]; VkCommandBuffer cmdBuf = m_cmdBufs[m_fillBuf];
VulkanTextureR* ctexture = texture.cast<VulkanTextureR>(); VulkanTextureR* ctexture = texture.cast<VulkanTextureR>();
@ -2867,6 +2867,19 @@ struct VulkanCommandQueue : IGraphicsCommandQueue
} }
vk::CmdBeginRenderPass(cmdBuf, &m_boundTarget.cast<VulkanTextureR>()->m_passBeginInfo, VK_SUBPASS_CONTENTS_INLINE); vk::CmdBeginRenderPass(cmdBuf, &m_boundTarget.cast<VulkanTextureR>()->m_passBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
if (clearDepth)
{
VkClearAttachment clr = {};
VkClearRect rect = {};
rect.layerCount = 1;
rect.rect.extent.width = ctexture->m_width;
rect.rect.extent.height = ctexture->m_height;
clr.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
clr.clearValue.depthStencil.depth = 1.f;
vk::CmdClearAttachments(cmdBuf, 1, &clr, 1, &rect);
}
} }
void execute(); void execute();