Index: src/gpu/vk/GrVkRenderPass.cpp |
diff --git a/src/gpu/vk/GrVkRenderPass.cpp b/src/gpu/vk/GrVkRenderPass.cpp |
index c56bafa92daa367c547d95adbf4b36961255103e..6a0f953a1c90f4d024fcaf2a8231c69162aaf123 100644 |
--- a/src/gpu/vk/GrVkRenderPass.cpp |
+++ b/src/gpu/vk/GrVkRenderPass.cpp |
@@ -23,16 +23,16 @@ void setup_vk_attachment_description(VkAttachmentDescription* attachment, |
SkAssertResult(GrSampleCountToVkSampleCount(desc.fSamples, &attachment->samples)); |
switch (layout) { |
case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL: |
- attachment->loadOp = desc.fLoadOp; |
- attachment->storeOp = desc.fStoreOp; |
+ attachment->loadOp = desc.fLoadStoreOps.fLoadOp; |
+ attachment->storeOp = desc.fLoadStoreOps.fStoreOp; |
attachment->stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; |
attachment->stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; |
break; |
case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL: |
attachment->loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; |
attachment->storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; |
- attachment->stencilLoadOp = desc.fLoadOp; |
- attachment->stencilStoreOp = desc.fStoreOp; |
+ attachment->stencilLoadOp = desc.fLoadStoreOps.fLoadOp; |
+ attachment->stencilStoreOp = desc.fLoadStoreOps.fStoreOp; |
break; |
default: |
SkFAIL("Unexpected attachment layout"); |
@@ -43,15 +43,21 @@ void setup_vk_attachment_description(VkAttachmentDescription* attachment, |
} |
void GrVkRenderPass::initSimple(const GrVkGpu* gpu, const GrVkRenderTarget& target) { |
- // Get attachment information from render target. This includes which attachments the render |
- // target has (color, resolve, stencil) and the attachments format and sample count. |
- target.getAttachmentsDescriptor(&fAttachmentsDescriptor, &fAttachmentFlags); |
+ static const GrVkRenderPass::LoadStoreOps kBasicLoadStoreOps(VK_ATTACHMENT_LOAD_OP_LOAD, |
+ VK_ATTACHMENT_STORE_OP_STORE); |
+ this->init(gpu, target, kBasicLoadStoreOps, kBasicLoadStoreOps, kBasicLoadStoreOps); |
+} |
+ |
+void GrVkRenderPass::init(const GrVkGpu* gpu, |
+ const LoadStoreOps& colorOp, |
+ const LoadStoreOps& resolveOp, |
+ const LoadStoreOps& stencilOp) { |
uint32_t numAttachments = fAttachmentsDescriptor.fAttachmentCount; |
// Attachment descriptions to be set on the render pass |
SkTArray<VkAttachmentDescription> attachments(numAttachments); |
attachments.reset(numAttachments); |
- memset(attachments.begin(), 0, numAttachments*sizeof(VkAttachmentDescription)); |
+ memset(attachments.begin(), 0, numAttachments * sizeof(VkAttachmentDescription)); |
// Refs to attachments on the render pass (as described by teh VkAttachmentDescription above), |
// that are used by the subpass. |
@@ -70,6 +76,7 @@ void GrVkRenderPass::initSimple(const GrVkGpu* gpu, const GrVkRenderTarget& targ |
subpassDesc.pInputAttachments = nullptr; |
if (fAttachmentFlags & kColor_AttachmentFlag) { |
// set up color attachment |
+ fAttachmentsDescriptor.fColor.fLoadStoreOps = colorOp; |
setup_vk_attachment_description(&attachments[currentAttachment], |
fAttachmentsDescriptor.fColor, |
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); |
@@ -88,6 +95,7 @@ void GrVkRenderPass::initSimple(const GrVkGpu* gpu, const GrVkRenderTarget& targ |
if (fAttachmentFlags & kResolve_AttachmentFlag) { |
// set up resolve attachment |
+ fAttachmentsDescriptor.fResolve.fLoadStoreOps = resolveOp; |
setup_vk_attachment_description(&attachments[currentAttachment], |
fAttachmentsDescriptor.fResolve, |
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL); |
@@ -102,6 +110,7 @@ void GrVkRenderPass::initSimple(const GrVkGpu* gpu, const GrVkRenderTarget& targ |
if (fAttachmentFlags & kStencil_AttachmentFlag) { |
// set up stencil attachment |
+ fAttachmentsDescriptor.fStencil.fLoadStoreOps = stencilOp; |
setup_vk_attachment_description(&attachments[currentAttachment], |
fAttachmentsDescriptor.fStencil, |
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); |
@@ -138,6 +147,27 @@ void GrVkRenderPass::initSimple(const GrVkGpu* gpu, const GrVkRenderTarget& targ |
&fRenderPass)); |
} |
+void GrVkRenderPass::init(const GrVkGpu* gpu, |
+ const GrVkRenderPass& compatibleRenderPass, |
+ const LoadStoreOps& colorOp, |
+ const LoadStoreOps& resolveOp, |
+ const LoadStoreOps& stencilOp) { |
+ fAttachmentFlags = compatibleRenderPass.fAttachmentFlags; |
+ fAttachmentsDescriptor = compatibleRenderPass.fAttachmentsDescriptor; |
+ this->init(gpu, colorOp, resolveOp, stencilOp); |
+} |
+ |
+void GrVkRenderPass::init(const GrVkGpu* gpu, |
+ const GrVkRenderTarget& target, |
+ const LoadStoreOps& colorOp, |
+ const LoadStoreOps& resolveOp, |
+ const LoadStoreOps& stencilOp) { |
+ // Get attachment information from render target. This includes which attachments the render |
+ // target has (color, resolve, stencil) and the attachments format and sample count. |
+ target.getAttachmentsDescriptor(&fAttachmentsDescriptor, &fAttachmentFlags); |
+ this->init(gpu, colorOp, resolveOp, stencilOp); |
+} |
+ |
void GrVkRenderPass::freeGPUData(const GrVkGpu* gpu) const { |
GR_VK_CALL(gpu->vkInterface(), DestroyRenderPass(gpu->device(), fRenderPass, nullptr)); |
} |
@@ -231,6 +261,27 @@ bool GrVkRenderPass::isCompatible(const GrVkRenderTarget& target) const { |
return true; |
} |
+bool GrVkRenderPass::equalLoadStoreOps(const LoadStoreOps& colorOps, |
+ const LoadStoreOps& resolveOps, |
+ const LoadStoreOps& stencilOps) const { |
+ if (fAttachmentFlags & kColor_AttachmentFlag) { |
+ if (fAttachmentsDescriptor.fColor.fLoadStoreOps != colorOps) { |
+ return false; |
+ } |
+ } |
+ if (fAttachmentFlags & kResolve_AttachmentFlag) { |
+ if (fAttachmentsDescriptor.fResolve.fLoadStoreOps != resolveOps) { |
+ return false; |
+ } |
+ } |
+ if (fAttachmentFlags & kStencil_AttachmentFlag) { |
+ if (fAttachmentsDescriptor.fStencil.fLoadStoreOps != stencilOps) { |
+ return false; |
+ } |
+ } |
+ return true; |
+} |
+ |
void GrVkRenderPass::genKey(GrProcessorKeyBuilder* b) const { |
b->add32(fAttachmentFlags); |
if (fAttachmentFlags & kColor_AttachmentFlag) { |