| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "GrVkRenderPass.h" | 8 #include "GrVkRenderPass.h" |
| 9 | 9 |
| 10 #include "GrProcessor.h" | 10 #include "GrProcessor.h" |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 } | 39 } |
| 40 | 40 |
| 41 attachment->initialLayout = layout; | 41 attachment->initialLayout = layout; |
| 42 attachment->finalLayout = layout; | 42 attachment->finalLayout = layout; |
| 43 } | 43 } |
| 44 | 44 |
| 45 void GrVkRenderPass::initSimple(const GrVkGpu* gpu, const GrVkRenderTarget& targ
et) { | 45 void GrVkRenderPass::initSimple(const GrVkGpu* gpu, const GrVkRenderTarget& targ
et) { |
| 46 static const GrVkRenderPass::LoadStoreOps kBasicLoadStoreOps(VK_ATTACHMENT_L
OAD_OP_LOAD, | 46 static const GrVkRenderPass::LoadStoreOps kBasicLoadStoreOps(VK_ATTACHMENT_L
OAD_OP_LOAD, |
| 47 VK_ATTACHMENT_S
TORE_OP_STORE); | 47 VK_ATTACHMENT_S
TORE_OP_STORE); |
| 48 | 48 |
| 49 this->init(gpu, target, kBasicLoadStoreOps, kBasicLoadStoreOps, kBasicLoadSt
oreOps); | 49 this->init(gpu, target, kBasicLoadStoreOps, kBasicLoadStoreOps); |
| 50 } | 50 } |
| 51 | 51 |
| 52 void GrVkRenderPass::init(const GrVkGpu* gpu, | 52 void GrVkRenderPass::init(const GrVkGpu* gpu, |
| 53 const LoadStoreOps& colorOp, | 53 const LoadStoreOps& colorOp, |
| 54 const LoadStoreOps& resolveOp, | |
| 55 const LoadStoreOps& stencilOp) { | 54 const LoadStoreOps& stencilOp) { |
| 56 uint32_t numAttachments = fAttachmentsDescriptor.fAttachmentCount; | 55 uint32_t numAttachments = fAttachmentsDescriptor.fAttachmentCount; |
| 57 // Attachment descriptions to be set on the render pass | 56 // Attachment descriptions to be set on the render pass |
| 58 SkTArray<VkAttachmentDescription> attachments(numAttachments); | 57 SkTArray<VkAttachmentDescription> attachments(numAttachments); |
| 59 attachments.reset(numAttachments); | 58 attachments.reset(numAttachments); |
| 60 memset(attachments.begin(), 0, numAttachments * sizeof(VkAttachmentDescripti
on)); | 59 memset(attachments.begin(), 0, numAttachments * sizeof(VkAttachmentDescripti
on)); |
| 61 | 60 |
| 62 // Refs to attachments on the render pass (as described by teh VkAttachmentD
escription above), | 61 // Refs to attachments on the render pass (as described by teh VkAttachmentD
escription above), |
| 63 // that are used by the subpass. | 62 // that are used by the subpass. |
| 64 VkAttachmentReference colorRef; | 63 VkAttachmentReference colorRef; |
| 65 VkAttachmentReference resolveRef; | |
| 66 VkAttachmentReference stencilRef; | 64 VkAttachmentReference stencilRef; |
| 67 uint32_t currentAttachment = 0; | 65 uint32_t currentAttachment = 0; |
| 68 | 66 |
| 69 // Go through each of the attachment types (color, resolve, stencil) and set
the necessary | 67 // Go through each of the attachment types (color, stencil) and set the nece
ssary |
| 70 // on the various Vk structs. | 68 // on the various Vk structs. |
| 71 VkSubpassDescription subpassDesc; | 69 VkSubpassDescription subpassDesc; |
| 72 memset(&subpassDesc, 0, sizeof(VkSubpassDescription)); | 70 memset(&subpassDesc, 0, sizeof(VkSubpassDescription)); |
| 73 subpassDesc.flags = 0; | 71 subpassDesc.flags = 0; |
| 74 subpassDesc.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; | 72 subpassDesc.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; |
| 75 subpassDesc.inputAttachmentCount = 0; | 73 subpassDesc.inputAttachmentCount = 0; |
| 76 subpassDesc.pInputAttachments = nullptr; | 74 subpassDesc.pInputAttachments = nullptr; |
| 75 subpassDesc.pResolveAttachments = nullptr; |
| 76 |
| 77 if (fAttachmentFlags & kColor_AttachmentFlag) { | 77 if (fAttachmentFlags & kColor_AttachmentFlag) { |
| 78 // set up color attachment | 78 // set up color attachment |
| 79 fAttachmentsDescriptor.fColor.fLoadStoreOps = colorOp; | 79 fAttachmentsDescriptor.fColor.fLoadStoreOps = colorOp; |
| 80 setup_vk_attachment_description(&attachments[currentAttachment], | 80 setup_vk_attachment_description(&attachments[currentAttachment], |
| 81 fAttachmentsDescriptor.fColor, | 81 fAttachmentsDescriptor.fColor, |
| 82 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
); | 82 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
); |
| 83 // setup subpass use of attachment | 83 // setup subpass use of attachment |
| 84 colorRef.attachment = currentAttachment++; | 84 colorRef.attachment = currentAttachment++; |
| 85 colorRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; | 85 colorRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; |
| 86 subpassDesc.colorAttachmentCount = 1; | 86 subpassDesc.colorAttachmentCount = 1; |
| 87 } else { | 87 } else { |
| 88 // I don't think there should ever be a time where we don't have a color
attachment | 88 // I don't think there should ever be a time where we don't have a color
attachment |
| 89 SkASSERT(false); | 89 SkASSERT(false); |
| 90 colorRef.attachment = VK_ATTACHMENT_UNUSED; | 90 colorRef.attachment = VK_ATTACHMENT_UNUSED; |
| 91 colorRef.layout = VK_IMAGE_LAYOUT_UNDEFINED; | 91 colorRef.layout = VK_IMAGE_LAYOUT_UNDEFINED; |
| 92 subpassDesc.colorAttachmentCount = 0; | 92 subpassDesc.colorAttachmentCount = 0; |
| 93 } | 93 } |
| 94 subpassDesc.pColorAttachments = &colorRef; | 94 subpassDesc.pColorAttachments = &colorRef; |
| 95 | 95 |
| 96 if (fAttachmentFlags & kResolve_AttachmentFlag) { | |
| 97 // set up resolve attachment | |
| 98 fAttachmentsDescriptor.fResolve.fLoadStoreOps = resolveOp; | |
| 99 setup_vk_attachment_description(&attachments[currentAttachment], | |
| 100 fAttachmentsDescriptor.fResolve, | |
| 101 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
); | |
| 102 // setup subpass use of attachment | |
| 103 resolveRef.attachment = currentAttachment++; | |
| 104 // I'm really not sure what the layout should be for the resolve texture
s. | |
| 105 resolveRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; | |
| 106 subpassDesc.pResolveAttachments = &resolveRef; | |
| 107 } else { | |
| 108 subpassDesc.pResolveAttachments = nullptr; | |
| 109 } | |
| 110 | |
| 111 if (fAttachmentFlags & kStencil_AttachmentFlag) { | 96 if (fAttachmentFlags & kStencil_AttachmentFlag) { |
| 112 // set up stencil attachment | 97 // set up stencil attachment |
| 113 fAttachmentsDescriptor.fStencil.fLoadStoreOps = stencilOp; | 98 fAttachmentsDescriptor.fStencil.fLoadStoreOps = stencilOp; |
| 114 setup_vk_attachment_description(&attachments[currentAttachment], | 99 setup_vk_attachment_description(&attachments[currentAttachment], |
| 115 fAttachmentsDescriptor.fStencil, | 100 fAttachmentsDescriptor.fStencil, |
| 116 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT
_OPTIMAL); | 101 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT
_OPTIMAL); |
| 117 // setup subpass use of attachment | 102 // setup subpass use of attachment |
| 118 stencilRef.attachment = currentAttachment++; | 103 stencilRef.attachment = currentAttachment++; |
| 119 stencilRef.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; | 104 stencilRef.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; |
| 120 } else { | 105 } else { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 148 | 133 |
| 149 // Get granularity for this render pass | 134 // Get granularity for this render pass |
| 150 GR_VK_CALL(gpu->vkInterface(), GetRenderAreaGranularity(gpu->device(), | 135 GR_VK_CALL(gpu->vkInterface(), GetRenderAreaGranularity(gpu->device(), |
| 151 fRenderPass, | 136 fRenderPass, |
| 152 &fGranularity)); | 137 &fGranularity)); |
| 153 } | 138 } |
| 154 | 139 |
| 155 void GrVkRenderPass::init(const GrVkGpu* gpu, | 140 void GrVkRenderPass::init(const GrVkGpu* gpu, |
| 156 const GrVkRenderPass& compatibleRenderPass, | 141 const GrVkRenderPass& compatibleRenderPass, |
| 157 const LoadStoreOps& colorOp, | 142 const LoadStoreOps& colorOp, |
| 158 const LoadStoreOps& resolveOp, | |
| 159 const LoadStoreOps& stencilOp) { | 143 const LoadStoreOps& stencilOp) { |
| 160 fAttachmentFlags = compatibleRenderPass.fAttachmentFlags; | 144 fAttachmentFlags = compatibleRenderPass.fAttachmentFlags; |
| 161 fAttachmentsDescriptor = compatibleRenderPass.fAttachmentsDescriptor; | 145 fAttachmentsDescriptor = compatibleRenderPass.fAttachmentsDescriptor; |
| 162 this->init(gpu, colorOp, resolveOp, stencilOp); | 146 this->init(gpu, colorOp, stencilOp); |
| 163 } | 147 } |
| 164 | 148 |
| 165 void GrVkRenderPass::init(const GrVkGpu* gpu, | 149 void GrVkRenderPass::init(const GrVkGpu* gpu, |
| 166 const GrVkRenderTarget& target, | 150 const GrVkRenderTarget& target, |
| 167 const LoadStoreOps& colorOp, | 151 const LoadStoreOps& colorOp, |
| 168 const LoadStoreOps& resolveOp, | |
| 169 const LoadStoreOps& stencilOp) { | 152 const LoadStoreOps& stencilOp) { |
| 170 // Get attachment information from render target. This includes which attach
ments the render | 153 // Get attachment information from render target. This includes which attach
ments the render |
| 171 // target has (color, resolve, stencil) and the attachments format and sampl
e count. | 154 // target has (color, stencil) and the attachments format and sample count. |
| 172 target.getAttachmentsDescriptor(&fAttachmentsDescriptor, &fAttachmentFlags); | 155 target.getAttachmentsDescriptor(&fAttachmentsDescriptor, &fAttachmentFlags); |
| 173 this->init(gpu, colorOp, resolveOp, stencilOp); | 156 this->init(gpu, colorOp, stencilOp); |
| 174 } | 157 } |
| 175 | 158 |
| 176 void GrVkRenderPass::freeGPUData(const GrVkGpu* gpu) const { | 159 void GrVkRenderPass::freeGPUData(const GrVkGpu* gpu) const { |
| 177 GR_VK_CALL(gpu->vkInterface(), DestroyRenderPass(gpu->device(), fRenderPass,
nullptr)); | 160 GR_VK_CALL(gpu->vkInterface(), DestroyRenderPass(gpu->device(), fRenderPass,
nullptr)); |
| 178 } | 161 } |
| 179 | 162 |
| 180 // Works under the assumption that color attachment will always be the first att
achment in our | 163 // Works under the assumption that color attachment will always be the first att
achment in our |
| 181 // attachment array if it exists. | 164 // attachment array if it exists. |
| 182 bool GrVkRenderPass::colorAttachmentIndex(uint32_t* index) const { | 165 bool GrVkRenderPass::colorAttachmentIndex(uint32_t* index) const { |
| 183 *index = 0; | 166 *index = 0; |
| 184 if (fAttachmentFlags & kColor_AttachmentFlag) { | 167 if (fAttachmentFlags & kColor_AttachmentFlag) { |
| 185 return true; | 168 return true; |
| 186 } | 169 } |
| 187 return false; | 170 return false; |
| 188 } | 171 } |
| 189 | 172 |
| 190 // Works under the assumption that resolve attachment will always be after the c
olor attachment. | |
| 191 bool GrVkRenderPass::resolveAttachmentIndex(uint32_t* index) const { | |
| 192 *index = 0; | |
| 193 if (fAttachmentFlags & kColor_AttachmentFlag) { | |
| 194 ++(*index); | |
| 195 } | |
| 196 if (fAttachmentFlags & kResolve_AttachmentFlag) { | |
| 197 return true; | |
| 198 } | |
| 199 return false; | |
| 200 } | |
| 201 | |
| 202 // Works under the assumption that stencil attachment will always be after the c
olor and resolve | 173 // Works under the assumption that stencil attachment will always be after the c
olor and resolve |
| 203 // attachment. | 174 // attachment. |
| 204 bool GrVkRenderPass::stencilAttachmentIndex(uint32_t* index) const { | 175 bool GrVkRenderPass::stencilAttachmentIndex(uint32_t* index) const { |
| 205 *index = 0; | 176 *index = 0; |
| 206 if (fAttachmentFlags & kColor_AttachmentFlag) { | 177 if (fAttachmentFlags & kColor_AttachmentFlag) { |
| 207 ++(*index); | 178 ++(*index); |
| 208 } | 179 } |
| 209 if (fAttachmentFlags & kResolve_AttachmentFlag) { | |
| 210 ++(*index); | |
| 211 } | |
| 212 if (fAttachmentFlags & kStencil_AttachmentFlag) { | 180 if (fAttachmentFlags & kStencil_AttachmentFlag) { |
| 213 return true; | 181 return true; |
| 214 } | 182 } |
| 215 return false; | 183 return false; |
| 216 } | 184 } |
| 217 | 185 |
| 218 void GrVkRenderPass::getBeginInfo(const GrVkRenderTarget& target, | 186 void GrVkRenderPass::getBeginInfo(const GrVkRenderTarget& target, |
| 219 VkRenderPassBeginInfo* beginInfo, | 187 VkRenderPassBeginInfo* beginInfo, |
| 220 VkSubpassContents* contents) const { | 188 VkSubpassContents* contents) const { |
| 221 SkASSERT(this->isCompatible(target)); | 189 SkASSERT(this->isCompatible(target)); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 242 const AttachmentFlags& flags) const { | 210 const AttachmentFlags& flags) const { |
| 243 if (flags != fAttachmentFlags) { | 211 if (flags != fAttachmentFlags) { |
| 244 return false; | 212 return false; |
| 245 } | 213 } |
| 246 | 214 |
| 247 if (fAttachmentFlags & kColor_AttachmentFlag) { | 215 if (fAttachmentFlags & kColor_AttachmentFlag) { |
| 248 if (!fAttachmentsDescriptor.fColor.isCompatible(desc.fColor)) { | 216 if (!fAttachmentsDescriptor.fColor.isCompatible(desc.fColor)) { |
| 249 return false; | 217 return false; |
| 250 } | 218 } |
| 251 } | 219 } |
| 252 if (fAttachmentFlags & kResolve_AttachmentFlag) { | |
| 253 if (!fAttachmentsDescriptor.fResolve.isCompatible(desc.fResolve)) { | |
| 254 return false; | |
| 255 } | |
| 256 } | |
| 257 if (fAttachmentFlags & kStencil_AttachmentFlag) { | 220 if (fAttachmentFlags & kStencil_AttachmentFlag) { |
| 258 if (!fAttachmentsDescriptor.fStencil.isCompatible(desc.fStencil)) { | 221 if (!fAttachmentsDescriptor.fStencil.isCompatible(desc.fStencil)) { |
| 259 return false; | 222 return false; |
| 260 } | 223 } |
| 261 } | 224 } |
| 262 | 225 |
| 263 return true; | 226 return true; |
| 264 } | 227 } |
| 265 | 228 |
| 266 bool GrVkRenderPass::isCompatible(const GrVkRenderTarget& target) const { | 229 bool GrVkRenderPass::isCompatible(const GrVkRenderTarget& target) const { |
| 267 AttachmentsDescriptor desc; | 230 AttachmentsDescriptor desc; |
| 268 AttachmentFlags flags; | 231 AttachmentFlags flags; |
| 269 target.getAttachmentsDescriptor(&desc, &flags); | 232 target.getAttachmentsDescriptor(&desc, &flags); |
| 270 | 233 |
| 271 return this->isCompatible(desc, flags); | 234 return this->isCompatible(desc, flags); |
| 272 } | 235 } |
| 273 | 236 |
| 274 bool GrVkRenderPass::isCompatible(const GrVkRenderPass& renderPass) const { | 237 bool GrVkRenderPass::isCompatible(const GrVkRenderPass& renderPass) const { |
| 275 return this->isCompatible(renderPass.fAttachmentsDescriptor, renderPass.fAtt
achmentFlags); | 238 return this->isCompatible(renderPass.fAttachmentsDescriptor, renderPass.fAtt
achmentFlags); |
| 276 } | 239 } |
| 277 | 240 |
| 278 bool GrVkRenderPass::equalLoadStoreOps(const LoadStoreOps& colorOps, | 241 bool GrVkRenderPass::equalLoadStoreOps(const LoadStoreOps& colorOps, |
| 279 const LoadStoreOps& resolveOps, | |
| 280 const LoadStoreOps& stencilOps) const { | 242 const LoadStoreOps& stencilOps) const { |
| 281 if (fAttachmentFlags & kColor_AttachmentFlag) { | 243 if (fAttachmentFlags & kColor_AttachmentFlag) { |
| 282 if (fAttachmentsDescriptor.fColor.fLoadStoreOps != colorOps) { | 244 if (fAttachmentsDescriptor.fColor.fLoadStoreOps != colorOps) { |
| 283 return false; | 245 return false; |
| 284 } | 246 } |
| 285 } | 247 } |
| 286 if (fAttachmentFlags & kResolve_AttachmentFlag) { | |
| 287 if (fAttachmentsDescriptor.fResolve.fLoadStoreOps != resolveOps) { | |
| 288 return false; | |
| 289 } | |
| 290 } | |
| 291 if (fAttachmentFlags & kStencil_AttachmentFlag) { | 248 if (fAttachmentFlags & kStencil_AttachmentFlag) { |
| 292 if (fAttachmentsDescriptor.fStencil.fLoadStoreOps != stencilOps) { | 249 if (fAttachmentsDescriptor.fStencil.fLoadStoreOps != stencilOps) { |
| 293 return false; | 250 return false; |
| 294 } | 251 } |
| 295 } | 252 } |
| 296 return true; | 253 return true; |
| 297 } | 254 } |
| 298 | 255 |
| 299 void GrVkRenderPass::genKey(GrProcessorKeyBuilder* b) const { | 256 void GrVkRenderPass::genKey(GrProcessorKeyBuilder* b) const { |
| 300 b->add32(fAttachmentFlags); | 257 b->add32(fAttachmentFlags); |
| 301 if (fAttachmentFlags & kColor_AttachmentFlag) { | 258 if (fAttachmentFlags & kColor_AttachmentFlag) { |
| 302 b->add32(fAttachmentsDescriptor.fColor.fFormat); | 259 b->add32(fAttachmentsDescriptor.fColor.fFormat); |
| 303 b->add32(fAttachmentsDescriptor.fColor.fSamples); | 260 b->add32(fAttachmentsDescriptor.fColor.fSamples); |
| 304 } | 261 } |
| 305 if (fAttachmentFlags & kResolve_AttachmentFlag) { | |
| 306 b->add32(fAttachmentsDescriptor.fResolve.fFormat); | |
| 307 b->add32(fAttachmentsDescriptor.fResolve.fSamples); | |
| 308 } | |
| 309 if (fAttachmentFlags & kStencil_AttachmentFlag) { | 262 if (fAttachmentFlags & kStencil_AttachmentFlag) { |
| 310 b->add32(fAttachmentsDescriptor.fStencil.fFormat); | 263 b->add32(fAttachmentsDescriptor.fStencil.fFormat); |
| 311 b->add32(fAttachmentsDescriptor.fStencil.fSamples); | 264 b->add32(fAttachmentsDescriptor.fStencil.fSamples); |
| 312 } | 265 } |
| 313 } | 266 } |
| OLD | NEW |