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 const GrVkRenderTarget& target, |
| 284 const SkIRect& bounds, |
| 285 bool forSecondaryCB) { |
288 SkASSERT(fIsActive); | 286 SkASSERT(fIsActive); |
289 SkASSERT(!fActiveRenderPass); | 287 SkASSERT(!fActiveRenderPass); |
| 288 SkASSERT(renderPass->isCompatible(target)); |
| 289 |
290 VkRenderPassBeginInfo beginInfo; | 290 VkRenderPassBeginInfo beginInfo; |
291 VkSubpassContents contents; | 291 VkRect2D renderArea; |
292 renderPass->getBeginInfo(target, &beginInfo, &contents); | 292 renderArea.offset = { bounds.fLeft , bounds.fTop }; |
| 293 renderArea.extent = { (uint32_t)bounds.width(), (uint32_t)bounds.height() }; |
| 294 |
| 295 memset(&beginInfo, 0, sizeof(VkRenderPassBeginInfo)); |
| 296 beginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; |
| 297 beginInfo.pNext = nullptr; |
| 298 beginInfo.renderPass = renderPass->vkRenderPass(); |
| 299 beginInfo.framebuffer = target.framebuffer()->framebuffer(); |
| 300 beginInfo.renderArea = renderArea; |
| 301 beginInfo.clearValueCount = 0; |
| 302 beginInfo.pClearValues = nullptr; |
| 303 |
| 304 VkSubpassContents contents = forSecondaryCB ? VK_SUBPASS_CONTENTS_SECONDARY_
COMMAND_BUFFERS |
| 305 : VK_SUBPASS_CONTENTS_INLINE; |
| 306 |
293 GR_VK_CALL(gpu->vkInterface(), CmdBeginRenderPass(fCmdBuffer, &beginInfo, co
ntents)); | 307 GR_VK_CALL(gpu->vkInterface(), CmdBeginRenderPass(fCmdBuffer, &beginInfo, co
ntents)); |
294 fActiveRenderPass = renderPass; | 308 fActiveRenderPass = renderPass; |
295 this->addResource(renderPass); | 309 this->addResource(renderPass); |
296 target.addResources(*this); | 310 target.addResources(*this); |
297 } | 311 } |
298 | 312 |
299 void GrVkPrimaryCommandBuffer::endRenderPass(const GrVkGpu* gpu) { | 313 void GrVkPrimaryCommandBuffer::endRenderPass(const GrVkGpu* gpu) { |
300 SkASSERT(fIsActive); | 314 SkASSERT(fIsActive); |
301 SkASSERT(fActiveRenderPass); | 315 SkASSERT(fActiveRenderPass); |
302 GR_VK_CALL(gpu->vkInterface(), CmdEndRenderPass(fCmdBuffer)); | 316 GR_VK_CALL(gpu->vkInterface(), CmdEndRenderPass(fCmdBuffer)); |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
484 SkASSERT(!fActiveRenderPass); | 498 SkASSERT(!fActiveRenderPass); |
485 this->addResource(image->resource()); | 499 this->addResource(image->resource()); |
486 GR_VK_CALL(gpu->vkInterface(), CmdClearDepthStencilImage(fCmdBuffer, | 500 GR_VK_CALL(gpu->vkInterface(), CmdClearDepthStencilImage(fCmdBuffer, |
487 image->image(), | 501 image->image(), |
488 image->currentLayou
t(), | 502 image->currentLayou
t(), |
489 color, | 503 color, |
490 subRangeCount, | 504 subRangeCount, |
491 subRanges)); | 505 subRanges)); |
492 } | 506 } |
493 | 507 |
| 508 void GrVkPrimaryCommandBuffer::onFreeGPUData(const GrVkGpu* gpu) const { |
| 509 SkASSERT(!fActiveRenderPass); |
| 510 // Destroy the fence, if any |
| 511 if (VK_NULL_HANDLE != fSubmitFence) { |
| 512 GR_VK_CALL(gpu->vkInterface(), DestroyFence(gpu->device(), fSubmitFence,
nullptr)); |
| 513 } |
| 514 } |
| 515 |
494 /////////////////////////////////////////////////////////////////////////////// | 516 /////////////////////////////////////////////////////////////////////////////// |
495 // SecondaryCommandBuffer | 517 // SecondaryCommandBuffer |
496 //////////////////////////////////////////////////////////////////////////////// | 518 //////////////////////////////////////////////////////////////////////////////// |
497 | 519 |
498 GrVkSecondaryCommandBuffer* GrVkSecondaryCommandBuffer::Create( | 520 GrVkSecondaryCommandBuffer* GrVkSecondaryCommandBuffer::Create( |
499 const GrVkGpu* gpu, | 521 const GrVkGpu* gpu, |
500 VkCommandPool cmdPool, | 522 VkCommandPool cmdPool, |
501 const GrVkRenderPass* com
patibleRenderPass) { | 523 const GrVkRenderPass* com
patibleRenderPass) { |
502 const VkCommandBufferAllocateInfo cmdInfo = { | 524 const VkCommandBufferAllocateInfo cmdInfo = { |
503 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType | 525 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
546 fIsActive = true; | 568 fIsActive = true; |
547 } | 569 } |
548 | 570 |
549 void GrVkSecondaryCommandBuffer::end(const GrVkGpu* gpu) { | 571 void GrVkSecondaryCommandBuffer::end(const GrVkGpu* gpu) { |
550 SkASSERT(fIsActive); | 572 SkASSERT(fIsActive); |
551 GR_VK_CALL_ERRCHECK(gpu->vkInterface(), EndCommandBuffer(fCmdBuffer)); | 573 GR_VK_CALL_ERRCHECK(gpu->vkInterface(), EndCommandBuffer(fCmdBuffer)); |
552 this->invalidateState(); | 574 this->invalidateState(); |
553 fIsActive = false; | 575 fIsActive = false; |
554 } | 576 } |
555 | 577 |
OLD | NEW |