diff options
author | Robert Phillips <robertphillips@google.com> | 2017-08-08 18:00:03 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-08-08 22:32:36 +0000 |
commit | 952144753dc31d9d935683123cae43fca483bade (patch) | |
tree | 96c33ad4c1face6aa9f3e55214f7f3518987c013 /src/gpu/vk/GrVkGpuCommandBuffer.cpp | |
parent | 8d8b016f5241dd04c48229200ebd44a9a36a2f45 (diff) |
Add explicit clear of stencil buffer before opLists that use them
Change-Id: I9e2468e1331c6593dbc6da3ad510f08d1c589e8d
Reviewed-on: https://skia-review.googlesource.com/32041
Commit-Queue: Stan Iliev <stani@google.com>
Reviewed-by: Greg Daniel <egdaniel@google.com>
Reviewed-by: Brian Salomon <bsalomon@google.com>
Diffstat (limited to 'src/gpu/vk/GrVkGpuCommandBuffer.cpp')
-rw-r--r-- | src/gpu/vk/GrVkGpuCommandBuffer.cpp | 35 |
1 files changed, 26 insertions, 9 deletions
diff --git a/src/gpu/vk/GrVkGpuCommandBuffer.cpp b/src/gpu/vk/GrVkGpuCommandBuffer.cpp index 6a01d3f18d..2528fce38f 100644 --- a/src/gpu/vk/GrVkGpuCommandBuffer.cpp +++ b/src/gpu/vk/GrVkGpuCommandBuffer.cpp @@ -22,9 +22,10 @@ #include "GrVkTexture.h" #include "SkRect.h" -void get_vk_load_store_ops(const GrGpuCommandBuffer::LoadAndStoreInfo& info, +void get_vk_load_store_ops(GrGpuCommandBuffer::LoadOp loadOpIn, + GrGpuCommandBuffer::StoreOp storeOpIn, VkAttachmentLoadOp* loadOp, VkAttachmentStoreOp* storeOp) { - switch (info.fLoadOp) { + switch (loadOpIn) { case GrGpuCommandBuffer::LoadOp::kLoad: *loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; break; @@ -39,7 +40,7 @@ void get_vk_load_store_ops(const GrGpuCommandBuffer::LoadAndStoreInfo& info, *loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; } - switch (info.fStoreOp) { + switch (storeOpIn) { case GrGpuCommandBuffer::StoreOp::kStore: *storeOp = VK_ATTACHMENT_STORE_OP_STORE; break; @@ -53,19 +54,22 @@ void get_vk_load_store_ops(const GrGpuCommandBuffer::LoadAndStoreInfo& info, } GrVkGpuCommandBuffer::GrVkGpuCommandBuffer(GrVkGpu* gpu, + GrRenderTarget* rt, GrSurfaceOrigin origin, const LoadAndStoreInfo& colorInfo, - const LoadAndStoreInfo& stencilInfo) + const StencilLoadAndStoreInfo& stencilInfo) : fGpu(gpu) , fRenderTarget(nullptr) , fOrigin(kTopLeft_GrSurfaceOrigin) , fClearColor(GrColor4f::FromGrColor(colorInfo.fClearColor)) , fLastPipelineState(nullptr) { + get_vk_load_store_ops(colorInfo.fLoadOp, colorInfo.fStoreOp, + &fVkColorLoadOp, &fVkColorStoreOp); - get_vk_load_store_ops(colorInfo, &fVkColorLoadOp, &fVkColorStoreOp); - - get_vk_load_store_ops(stencilInfo, &fVkStencilLoadOp, &fVkStencilStoreOp); - + get_vk_load_store_ops(stencilInfo.fLoadOp, stencilInfo.fStoreOp, + &fVkStencilLoadOp, &fVkStencilStoreOp); fCurrentCmdInfo = -1; + + this->init(static_cast<GrVkRenderTarget*>(rt), origin); } void GrVkGpuCommandBuffer::init(GrVkRenderTarget* target, GrSurfaceOrigin origin) { @@ -96,6 +100,9 @@ void GrVkGpuCommandBuffer::init(GrVkRenderTarget* target, GrSurfaceOrigin origin cbInfo.fColorClearValue.color.float32[2] = fClearColor.fRGBA[2]; cbInfo.fColorClearValue.color.float32[3] = fClearColor.fRGBA[3]; + cbInfo.fStencilClearValue.depthStencil.depth = 0; + cbInfo.fStencilClearValue.depthStencil.stencil = 0; + cbInfo.fBounds.setEmpty(); cbInfo.fIsEmpty = true; cbInfo.fStartsWithClear = false; @@ -118,6 +125,13 @@ GrVkGpuCommandBuffer::~GrVkGpuCommandBuffer() { GrGpu* GrVkGpuCommandBuffer::gpu() { return fGpu; } GrRenderTarget* GrVkGpuCommandBuffer::renderTarget() { return fRenderTarget; } +void GrVkGpuCommandBuffer::begin() { + // TODO: remove this - see skbug.com/6936 + if (VK_ATTACHMENT_LOAD_OP_CLEAR == fVkStencilLoadOp) { + fGpu->clearStencil(fRenderTarget, 0x0); + } +} + void GrVkGpuCommandBuffer::end() { if (fCurrentCmdInfo >= 0) { fCommandBufferInfos[fCurrentCmdInfo].currentCmdBuf()->end(fGpu); @@ -178,7 +192,9 @@ void GrVkGpuCommandBuffer::onSubmit() { cbInfo.fBounds.roundOut(&iBounds); fGpu->submitSecondaryCommandBuffer(cbInfo.fCommandBuffers, cbInfo.fRenderPass, - &cbInfo.fColorClearValue, fRenderTarget, iBounds); + &cbInfo.fColorClearValue, + &cbInfo.fStencilClearValue, + fRenderTarget, iBounds); } } } @@ -410,6 +426,7 @@ void GrVkGpuCommandBuffer::addAdditionalRenderPass() { // It shouldn't matter what we set the clear color to here since we will assume loading of the // attachment. memset(&cbInfo.fColorClearValue, 0, sizeof(VkClearValue)); + memset(&cbInfo.fStencilClearValue, 0, sizeof(VkClearValue)); cbInfo.fBounds.setEmpty(); cbInfo.fIsEmpty = true; cbInfo.fStartsWithClear = false; |