| 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 "GrVkCommandBuffer.h" | 8 #include "GrVkCommandBuffer.h" |
| 9 | 9 |
| 10 #include "GrVkFramebuffer.h" | 10 #include "GrVkFramebuffer.h" |
| 11 #include "GrVkImageView.h" | 11 #include "GrVkImageView.h" |
| 12 #include "GrVkPipeline.h" | 12 #include "GrVkPipeline.h" |
| 13 #include "GrVkRenderPass.h" | 13 #include "GrVkRenderPass.h" |
| 14 #include "GrVkRenderTarget.h" | 14 #include "GrVkRenderTarget.h" |
| 15 #include "GrVkPipelineState.h" | 15 #include "GrVkPipelineState.h" |
| 16 #include "GrVkTransferBuffer.h" | 16 #include "GrVkTransferBuffer.h" |
| 17 #include "GrVkUtil.h" | 17 #include "GrVkUtil.h" |
| 18 | 18 #include "SkRect.h" |
| 19 | |
| 20 GrVkCommandBuffer::~GrVkCommandBuffer() { | |
| 21 // Should have ended any render pass we're in the middle of | |
| 22 SkASSERT(!fActiveRenderPass); | |
| 23 } | |
| 24 | 19 |
| 25 void GrVkCommandBuffer::invalidateState() { | 20 void GrVkCommandBuffer::invalidateState() { |
| 26 fBoundVertexBuffer = VK_NULL_HANDLE; | 21 fBoundVertexBuffer = VK_NULL_HANDLE; |
| 27 fBoundVertexBufferIsValid = false; | 22 fBoundVertexBufferIsValid = false; |
| 28 fBoundIndexBuffer = VK_NULL_HANDLE; | 23 fBoundIndexBuffer = VK_NULL_HANDLE; |
| 29 fBoundIndexBufferIsValid = false; | 24 fBoundIndexBufferIsValid = false; |
| 30 | 25 |
| 31 memset(&fCachedViewport, 0, sizeof(VkViewport)); | 26 memset(&fCachedViewport, 0, sizeof(VkViewport)); |
| 32 fCachedViewport.width = - 1.0f; // Viewport must have a width greater than 0 | 27 fCachedViewport.width = - 1.0f; // Viewport must have a width greater than 0 |
| 33 | 28 |
| 34 memset(&fCachedScissor, 0, sizeof(VkRect2D)); | 29 memset(&fCachedScissor, 0, sizeof(VkRect2D)); |
| 35 fCachedScissor.offset.x = -1; // Scissor offset must be greater that 0 to be
valid | 30 fCachedScissor.offset.x = -1; // Scissor offset must be greater that 0 to be
valid |
| 36 | 31 |
| 37 for (int i = 0; i < 4; ++i) { | 32 for (int i = 0; i < 4; ++i) { |
| 38 fCachedBlendConstant[i] = -1.0; | 33 fCachedBlendConstant[i] = -1.0; |
| 39 } | 34 } |
| 40 } | 35 } |
| 41 | 36 |
| 42 void GrVkCommandBuffer::freeGPUData(const GrVkGpu* gpu) const { | 37 void GrVkCommandBuffer::freeGPUData(const GrVkGpu* gpu) const { |
| 43 SkASSERT(!fIsActive); | 38 SkASSERT(!fIsActive); |
| 44 SkASSERT(!fActiveRenderPass); | |
| 45 for (int i = 0; i < fTrackedResources.count(); ++i) { | 39 for (int i = 0; i < fTrackedResources.count(); ++i) { |
| 46 fTrackedResources[i]->unref(gpu); | 40 fTrackedResources[i]->unref(gpu); |
| 47 } | 41 } |
| 48 | 42 |
| 49 // Destroy the fence, if any | |
| 50 if (VK_NULL_HANDLE != fSubmitFence) { | |
| 51 GR_VK_CALL(gpu->vkInterface(), DestroyFence(gpu->device(), fSubmitFence,
nullptr)); | |
| 52 } | |
| 53 | |
| 54 GR_VK_CALL(gpu->vkInterface(), FreeCommandBuffers(gpu->device(), gpu->cmdPoo
l(), | 43 GR_VK_CALL(gpu->vkInterface(), FreeCommandBuffers(gpu->device(), gpu->cmdPoo
l(), |
| 55 1, &fCmdBuffer)); | 44 1, &fCmdBuffer)); |
| 45 |
| 46 this->onFreeGPUData(gpu); |
| 56 } | 47 } |
| 57 | 48 |
| 58 void GrVkCommandBuffer::abandonSubResources() const { | 49 void GrVkCommandBuffer::abandonSubResources() const { |
| 59 for (int i = 0; i < fTrackedResources.count(); ++i) { | 50 for (int i = 0; i < fTrackedResources.count(); ++i) { |
| 60 fTrackedResources[i]->unrefAndAbandon(); | 51 fTrackedResources[i]->unrefAndAbandon(); |
| 61 } | 52 } |
| 62 } | 53 } |
| 63 | 54 |
| 64 //////////////////////////////////////////////////////////////////////////////// | 55 //////////////////////////////////////////////////////////////////////////////// |
| 65 // CommandBuffer commands | 56 // CommandBuffer commands |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 SkASSERT(fIsActive); | 224 SkASSERT(fIsActive); |
| 234 if (memcmp(blendConstants, fCachedBlendConstant, 4 * sizeof(float))) { | 225 if (memcmp(blendConstants, fCachedBlendConstant, 4 * sizeof(float))) { |
| 235 GR_VK_CALL(gpu->vkInterface(), CmdSetBlendConstants(fCmdBuffer, blendCon
stants)); | 226 GR_VK_CALL(gpu->vkInterface(), CmdSetBlendConstants(fCmdBuffer, blendCon
stants)); |
| 236 memcpy(fCachedBlendConstant, blendConstants, 4 * sizeof(float)); | 227 memcpy(fCachedBlendConstant, blendConstants, 4 * sizeof(float)); |
| 237 } | 228 } |
| 238 } | 229 } |
| 239 | 230 |
| 240 /////////////////////////////////////////////////////////////////////////////// | 231 /////////////////////////////////////////////////////////////////////////////// |
| 241 // PrimaryCommandBuffer | 232 // PrimaryCommandBuffer |
| 242 //////////////////////////////////////////////////////////////////////////////// | 233 //////////////////////////////////////////////////////////////////////////////// |
| 234 GrVkPrimaryCommandBuffer::~GrVkPrimaryCommandBuffer() { |
| 235 // Should have ended any render pass we're in the middle of |
| 236 SkASSERT(!fActiveRenderPass); |
| 237 } |
| 238 |
| 243 GrVkPrimaryCommandBuffer* GrVkPrimaryCommandBuffer::Create(const GrVkGpu* gpu, | 239 GrVkPrimaryCommandBuffer* GrVkPrimaryCommandBuffer::Create(const GrVkGpu* gpu, |
| 244 VkCommandPool cmdPool
) { | 240 VkCommandPool cmdPool
) { |
| 245 const VkCommandBufferAllocateInfo cmdInfo = { | 241 const VkCommandBufferAllocateInfo cmdInfo = { |
| 246 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType | 242 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType |
| 247 NULL, // pNext | 243 NULL, // pNext |
| 248 cmdPool, // commandPool | 244 cmdPool, // commandPool |
| 249 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level | 245 VK_COMMAND_BUFFER_LEVEL_PRIMARY, // level |
| 250 1 // bufferCount | 246 1 // bufferCount |
| 251 }; | 247 }; |
| 252 | 248 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 276 | 272 |
| 277 void GrVkPrimaryCommandBuffer::end(const GrVkGpu* gpu) { | 273 void GrVkPrimaryCommandBuffer::end(const GrVkGpu* gpu) { |
| 278 SkASSERT(fIsActive); | 274 SkASSERT(fIsActive); |
| 279 SkASSERT(!fActiveRenderPass); | 275 SkASSERT(!fActiveRenderPass); |
| 280 GR_VK_CALL_ERRCHECK(gpu->vkInterface(), EndCommandBuffer(fCmdBuffer)); | 276 GR_VK_CALL_ERRCHECK(gpu->vkInterface(), EndCommandBuffer(fCmdBuffer)); |
| 281 this->invalidateState(); | 277 this->invalidateState(); |
| 282 fIsActive = false; | 278 fIsActive = false; |
| 283 } | 279 } |
| 284 | 280 |
| 285 void GrVkPrimaryCommandBuffer::beginRenderPass(const GrVkGpu* gpu, | 281 void GrVkPrimaryCommandBuffer::beginRenderPass(const GrVkGpu* gpu, |
| 286 const GrVkRenderPass* renderPass, | 282 const GrVkRenderPass* renderPass, |
| 287 const GrVkRenderTarget& target) { | 283 uint32_t clearCount, |
| 284 const VkClearValue* clearValues, |
| 285 const GrVkRenderTarget& target, |
| 286 const SkIRect& bounds, |
| 287 bool forSecondaryCB) { |
| 288 SkASSERT(fIsActive); | 288 SkASSERT(fIsActive); |
| 289 SkASSERT(!fActiveRenderPass); | 289 SkASSERT(!fActiveRenderPass); |
| 290 SkASSERT(renderPass->isCompatible(target)); |
| 291 |
| 290 VkRenderPassBeginInfo beginInfo; | 292 VkRenderPassBeginInfo beginInfo; |
| 291 VkSubpassContents contents; | 293 VkRect2D renderArea; |
| 292 renderPass->getBeginInfo(target, &beginInfo, &contents); | 294 renderArea.offset = { bounds.fLeft , bounds.fTop }; |
| 295 renderArea.extent = { (uint32_t)bounds.width(), (uint32_t)bounds.height() }; |
| 296 |
| 297 memset(&beginInfo, 0, sizeof(VkRenderPassBeginInfo)); |
| 298 beginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; |
| 299 beginInfo.pNext = nullptr; |
| 300 beginInfo.renderPass = renderPass->vkRenderPass(); |
| 301 beginInfo.framebuffer = target.framebuffer()->framebuffer(); |
| 302 beginInfo.renderArea = renderArea; |
| 303 beginInfo.clearValueCount = clearCount; |
| 304 beginInfo.pClearValues = clearValues; |
| 305 |
| 306 VkSubpassContents contents = forSecondaryCB ? VK_SUBPASS_CONTENTS_SECONDARY_
COMMAND_BUFFERS |
| 307 : VK_SUBPASS_CONTENTS_INLINE; |
| 308 |
| 293 GR_VK_CALL(gpu->vkInterface(), CmdBeginRenderPass(fCmdBuffer, &beginInfo, co
ntents)); | 309 GR_VK_CALL(gpu->vkInterface(), CmdBeginRenderPass(fCmdBuffer, &beginInfo, co
ntents)); |
| 294 fActiveRenderPass = renderPass; | 310 fActiveRenderPass = renderPass; |
| 295 this->addResource(renderPass); | 311 this->addResource(renderPass); |
| 296 target.addResources(*this); | 312 target.addResources(*this); |
| 297 } | 313 } |
| 298 | 314 |
| 299 void GrVkPrimaryCommandBuffer::endRenderPass(const GrVkGpu* gpu) { | 315 void GrVkPrimaryCommandBuffer::endRenderPass(const GrVkGpu* gpu) { |
| 300 SkASSERT(fIsActive); | 316 SkASSERT(fIsActive); |
| 301 SkASSERT(fActiveRenderPass); | 317 SkASSERT(fActiveRenderPass); |
| 302 GR_VK_CALL(gpu->vkInterface(), CmdEndRenderPass(fCmdBuffer)); | 318 GR_VK_CALL(gpu->vkInterface(), CmdEndRenderPass(fCmdBuffer)); |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 484 SkASSERT(!fActiveRenderPass); | 500 SkASSERT(!fActiveRenderPass); |
| 485 this->addResource(image->resource()); | 501 this->addResource(image->resource()); |
| 486 GR_VK_CALL(gpu->vkInterface(), CmdClearDepthStencilImage(fCmdBuffer, | 502 GR_VK_CALL(gpu->vkInterface(), CmdClearDepthStencilImage(fCmdBuffer, |
| 487 image->image(), | 503 image->image(), |
| 488 image->currentLayou
t(), | 504 image->currentLayou
t(), |
| 489 color, | 505 color, |
| 490 subRangeCount, | 506 subRangeCount, |
| 491 subRanges)); | 507 subRanges)); |
| 492 } | 508 } |
| 493 | 509 |
| 510 void GrVkPrimaryCommandBuffer::onFreeGPUData(const GrVkGpu* gpu) const { |
| 511 SkASSERT(!fActiveRenderPass); |
| 512 // Destroy the fence, if any |
| 513 if (VK_NULL_HANDLE != fSubmitFence) { |
| 514 GR_VK_CALL(gpu->vkInterface(), DestroyFence(gpu->device(), fSubmitFence,
nullptr)); |
| 515 } |
| 516 } |
| 517 |
| 494 /////////////////////////////////////////////////////////////////////////////// | 518 /////////////////////////////////////////////////////////////////////////////// |
| 495 // SecondaryCommandBuffer | 519 // SecondaryCommandBuffer |
| 496 //////////////////////////////////////////////////////////////////////////////// | 520 //////////////////////////////////////////////////////////////////////////////// |
| 497 | 521 |
| 498 GrVkSecondaryCommandBuffer* GrVkSecondaryCommandBuffer::Create( | 522 GrVkSecondaryCommandBuffer* GrVkSecondaryCommandBuffer::Create( |
| 499 const GrVkGpu* gpu, | 523 const GrVkGpu* gpu, |
| 500 VkCommandPool cmdPool, | 524 VkCommandPool cmdPool, |
| 501 const GrVkRenderPass* com
patibleRenderPass) { | 525 const GrVkRenderPass* com
patibleRenderPass) { |
| 502 const VkCommandBufferAllocateInfo cmdInfo = { | 526 const VkCommandBufferAllocateInfo cmdInfo = { |
| 503 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType | 527 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 546 fIsActive = true; | 570 fIsActive = true; |
| 547 } | 571 } |
| 548 | 572 |
| 549 void GrVkSecondaryCommandBuffer::end(const GrVkGpu* gpu) { | 573 void GrVkSecondaryCommandBuffer::end(const GrVkGpu* gpu) { |
| 550 SkASSERT(fIsActive); | 574 SkASSERT(fIsActive); |
| 551 GR_VK_CALL_ERRCHECK(gpu->vkInterface(), EndCommandBuffer(fCmdBuffer)); | 575 GR_VK_CALL_ERRCHECK(gpu->vkInterface(), EndCommandBuffer(fCmdBuffer)); |
| 552 this->invalidateState(); | 576 this->invalidateState(); |
| 553 fIsActive = false; | 577 fIsActive = false; |
| 554 } | 578 } |
| 555 | 579 |
| OLD | NEW |