| 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" |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 45 | 45 |
| 46 this->onFreeGPUData(gpu); | 46 this->onFreeGPUData(gpu); |
| 47 } | 47 } |
| 48 | 48 |
| 49 void GrVkCommandBuffer::abandonSubResources() const { | 49 void GrVkCommandBuffer::abandonSubResources() const { |
| 50 for (int i = 0; i < fTrackedResources.count(); ++i) { | 50 for (int i = 0; i < fTrackedResources.count(); ++i) { |
| 51 fTrackedResources[i]->unrefAndAbandon(); | 51 fTrackedResources[i]->unrefAndAbandon(); |
| 52 } | 52 } |
| 53 } | 53 } |
| 54 | 54 |
| 55 void GrVkCommandBuffer::reset(GrVkGpu* gpu) { |
| 56 SkASSERT(!fIsActive); |
| 57 for (int i = 0; i < fTrackedResources.count(); ++i) { |
| 58 fTrackedResources[i]->unref(gpu); |
| 59 } |
| 60 fTrackedResources.reset(); |
| 61 |
| 62 this->invalidateState(); |
| 63 |
| 64 // we will retain resources for later use |
| 65 VkCommandBufferResetFlags flags = 0; |
| 66 GR_VK_CALL(gpu->vkInterface(), ResetCommandBuffer(fCmdBuffer, flags)); |
| 67 |
| 68 this->onReset(gpu); |
| 69 } |
| 70 |
| 55 //////////////////////////////////////////////////////////////////////////////// | 71 //////////////////////////////////////////////////////////////////////////////// |
| 56 // CommandBuffer commands | 72 // CommandBuffer commands |
| 57 //////////////////////////////////////////////////////////////////////////////// | 73 //////////////////////////////////////////////////////////////////////////////// |
| 58 | 74 |
| 59 void GrVkCommandBuffer::pipelineBarrier(const GrVkGpu* gpu, | 75 void GrVkCommandBuffer::pipelineBarrier(const GrVkGpu* gpu, |
| 60 VkPipelineStageFlags srcStageMask, | 76 VkPipelineStageFlags srcStageMask, |
| 61 VkPipelineStageFlags dstStageMask, | 77 VkPipelineStageFlags dstStageMask, |
| 62 bool byRegion, | 78 bool byRegion, |
| 63 BarrierType barrierType, | 79 BarrierType barrierType, |
| 64 void* barrier) const { | 80 void* barrier) const { |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 313 } | 329 } |
| 314 | 330 |
| 315 void GrVkPrimaryCommandBuffer::endRenderPass(const GrVkGpu* gpu) { | 331 void GrVkPrimaryCommandBuffer::endRenderPass(const GrVkGpu* gpu) { |
| 316 SkASSERT(fIsActive); | 332 SkASSERT(fIsActive); |
| 317 SkASSERT(fActiveRenderPass); | 333 SkASSERT(fActiveRenderPass); |
| 318 GR_VK_CALL(gpu->vkInterface(), CmdEndRenderPass(fCmdBuffer)); | 334 GR_VK_CALL(gpu->vkInterface(), CmdEndRenderPass(fCmdBuffer)); |
| 319 fActiveRenderPass = nullptr; | 335 fActiveRenderPass = nullptr; |
| 320 } | 336 } |
| 321 | 337 |
| 322 void GrVkPrimaryCommandBuffer::executeCommands(const GrVkGpu* gpu, | 338 void GrVkPrimaryCommandBuffer::executeCommands(const GrVkGpu* gpu, |
| 323 const GrVkSecondaryCommandBuffer*
buffer) { | 339 GrVkSecondaryCommandBuffer* buffe
r) { |
| 324 SkASSERT(fIsActive); | 340 SkASSERT(fIsActive); |
| 325 SkASSERT(fActiveRenderPass); | 341 SkASSERT(fActiveRenderPass); |
| 326 SkASSERT(fActiveRenderPass->isCompatible(*buffer->fActiveRenderPass)); | 342 SkASSERT(fActiveRenderPass->isCompatible(*buffer->fActiveRenderPass)); |
| 327 | 343 |
| 328 GR_VK_CALL(gpu->vkInterface(), CmdExecuteCommands(fCmdBuffer, 1, &buffer->fC
mdBuffer)); | 344 GR_VK_CALL(gpu->vkInterface(), CmdExecuteCommands(fCmdBuffer, 1, &buffer->fC
mdBuffer)); |
| 329 this->addResource(buffer); | 345 buffer->ref(); |
| 346 fSecondaryCommandBuffers.push_back(buffer); |
| 330 // When executing a secondary command buffer all state (besides render pass
state) becomes | 347 // When executing a secondary command buffer all state (besides render pass
state) becomes |
| 331 // invalidated and must be reset. This includes bound buffers, pipelines, dy
namic state, etc. | 348 // invalidated and must be reset. This includes bound buffers, pipelines, dy
namic state, etc. |
| 332 this->invalidateState(); | 349 this->invalidateState(); |
| 333 } | 350 } |
| 334 | 351 |
| 335 void GrVkPrimaryCommandBuffer::submitToQueue(const GrVkGpu* gpu, | 352 void GrVkPrimaryCommandBuffer::submitToQueue(const GrVkGpu* gpu, |
| 336 VkQueue queue, | 353 VkQueue queue, |
| 337 GrVkGpu::SyncQueue sync) { | 354 GrVkGpu::SyncQueue sync) { |
| 338 SkASSERT(!fIsActive); | 355 SkASSERT(!fIsActive); |
| 339 | 356 |
| 340 VkResult err; | 357 VkResult err; |
| 341 VkFenceCreateInfo fenceInfo; | 358 if (VK_NULL_HANDLE == fSubmitFence) { |
| 342 memset(&fenceInfo, 0, sizeof(VkFenceCreateInfo)); | 359 VkFenceCreateInfo fenceInfo; |
| 343 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; | 360 memset(&fenceInfo, 0, sizeof(VkFenceCreateInfo)); |
| 344 err = GR_VK_CALL(gpu->vkInterface(), CreateFence(gpu->device(), &fenceInfo,
nullptr, | 361 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; |
| 345 &fSubmitFence)); | 362 err = GR_VK_CALL(gpu->vkInterface(), CreateFence(gpu->device(), &fenceIn
fo, nullptr, |
| 346 SkASSERT(!err); | 363 &fSubmitFence)); |
| 364 SkASSERT(!err); |
| 365 } else { |
| 366 GR_VK_CALL(gpu->vkInterface(), ResetFences(gpu->device(), 1, &fSubmitFen
ce)); |
| 367 } |
| 347 | 368 |
| 348 VkSubmitInfo submitInfo; | 369 VkSubmitInfo submitInfo; |
| 349 memset(&submitInfo, 0, sizeof(VkSubmitInfo)); | 370 memset(&submitInfo, 0, sizeof(VkSubmitInfo)); |
| 350 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; | 371 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; |
| 351 submitInfo.pNext = nullptr; | 372 submitInfo.pNext = nullptr; |
| 352 submitInfo.waitSemaphoreCount = 0; | 373 submitInfo.waitSemaphoreCount = 0; |
| 353 submitInfo.pWaitSemaphores = nullptr; | 374 submitInfo.pWaitSemaphores = nullptr; |
| 354 submitInfo.pWaitDstStageMask = 0; | 375 submitInfo.pWaitDstStageMask = 0; |
| 355 submitInfo.commandBufferCount = 1; | 376 submitInfo.commandBufferCount = 1; |
| 356 submitInfo.pCommandBuffers = &fCmdBuffer; | 377 submitInfo.pCommandBuffers = &fCmdBuffer; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 388 | 409 |
| 389 default: | 410 default: |
| 390 SkDebugf("Error getting fence status: %d\n", err); | 411 SkDebugf("Error getting fence status: %d\n", err); |
| 391 SkFAIL("failing"); | 412 SkFAIL("failing"); |
| 392 break; | 413 break; |
| 393 } | 414 } |
| 394 | 415 |
| 395 return false; | 416 return false; |
| 396 } | 417 } |
| 397 | 418 |
| 419 void GrVkPrimaryCommandBuffer::onReset(GrVkGpu* gpu) { |
| 420 for (int i = 0; i < fSecondaryCommandBuffers.count(); ++i) { |
| 421 gpu->resourceProvider().recycleSecondaryCommandBuffer(fSecondaryCommandB
uffers[i]); |
| 422 } |
| 423 fSecondaryCommandBuffers.reset(); |
| 424 } |
| 425 |
| 398 void GrVkPrimaryCommandBuffer::copyImage(const GrVkGpu* gpu, | 426 void GrVkPrimaryCommandBuffer::copyImage(const GrVkGpu* gpu, |
| 399 GrVkImage* srcImage, | 427 GrVkImage* srcImage, |
| 400 VkImageLayout srcLayout, | 428 VkImageLayout srcLayout, |
| 401 GrVkImage* dstImage, | 429 GrVkImage* dstImage, |
| 402 VkImageLayout dstLayout, | 430 VkImageLayout dstLayout, |
| 403 uint32_t copyRegionCount, | 431 uint32_t copyRegionCount, |
| 404 const VkImageCopy* copyRegions) { | 432 const VkImageCopy* copyRegions) { |
| 405 SkASSERT(fIsActive); | 433 SkASSERT(fIsActive); |
| 406 SkASSERT(!fActiveRenderPass); | 434 SkASSERT(!fActiveRenderPass); |
| 407 this->addResource(srcImage->resource()); | 435 this->addResource(srcImage->resource()); |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 531 // Destroy the fence, if any | 559 // Destroy the fence, if any |
| 532 if (VK_NULL_HANDLE != fSubmitFence) { | 560 if (VK_NULL_HANDLE != fSubmitFence) { |
| 533 GR_VK_CALL(gpu->vkInterface(), DestroyFence(gpu->device(), fSubmitFence,
nullptr)); | 561 GR_VK_CALL(gpu->vkInterface(), DestroyFence(gpu->device(), fSubmitFence,
nullptr)); |
| 534 } | 562 } |
| 535 } | 563 } |
| 536 | 564 |
| 537 /////////////////////////////////////////////////////////////////////////////// | 565 /////////////////////////////////////////////////////////////////////////////// |
| 538 // SecondaryCommandBuffer | 566 // SecondaryCommandBuffer |
| 539 //////////////////////////////////////////////////////////////////////////////// | 567 //////////////////////////////////////////////////////////////////////////////// |
| 540 | 568 |
| 541 GrVkSecondaryCommandBuffer* GrVkSecondaryCommandBuffer::Create( | 569 GrVkSecondaryCommandBuffer* GrVkSecondaryCommandBuffer::Create(const GrVkGpu* gp
u, |
| 542 const GrVkGpu* gpu, | 570 VkCommandPool cmd
Pool) { |
| 543 VkCommandPool cmdPool, | |
| 544 const GrVkRenderPass* com
patibleRenderPass) { | |
| 545 const VkCommandBufferAllocateInfo cmdInfo = { | 571 const VkCommandBufferAllocateInfo cmdInfo = { |
| 546 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType | 572 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType |
| 547 NULL, // pNext | 573 NULL, // pNext |
| 548 cmdPool, // commandPool | 574 cmdPool, // commandPool |
| 549 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // level | 575 VK_COMMAND_BUFFER_LEVEL_SECONDARY, // level |
| 550 1 // bufferCount | 576 1 // bufferCount |
| 551 }; | 577 }; |
| 552 | 578 |
| 553 VkCommandBuffer cmdBuffer; | 579 VkCommandBuffer cmdBuffer; |
| 554 VkResult err = GR_VK_CALL(gpu->vkInterface(), AllocateCommandBuffers(gpu->de
vice(), | 580 VkResult err = GR_VK_CALL(gpu->vkInterface(), AllocateCommandBuffers(gpu->de
vice(), |
| 555 &cmdInf
o, | 581 &cmdInf
o, |
| 556 &cmdBuf
fer)); | 582 &cmdBuf
fer)); |
| 557 if (err) { | 583 if (err) { |
| 558 return nullptr; | 584 return nullptr; |
| 559 } | 585 } |
| 560 return new GrVkSecondaryCommandBuffer(cmdBuffer, compatibleRenderPass); | 586 return new GrVkSecondaryCommandBuffer(cmdBuffer); |
| 561 } | 587 } |
| 562 | 588 |
| 563 | 589 |
| 564 void GrVkSecondaryCommandBuffer::begin(const GrVkGpu* gpu, const GrVkFramebuffer
* framebuffer) { | 590 void GrVkSecondaryCommandBuffer::begin(const GrVkGpu* gpu, const GrVkFramebuffer
* framebuffer, |
| 591 const GrVkRenderPass* compatibleRenderPas
s) { |
| 565 SkASSERT(!fIsActive); | 592 SkASSERT(!fIsActive); |
| 566 SkASSERT(fActiveRenderPass); | 593 SkASSERT(compatibleRenderPass); |
| 594 fActiveRenderPass = compatibleRenderPass; |
| 567 | 595 |
| 568 VkCommandBufferInheritanceInfo inheritanceInfo; | 596 VkCommandBufferInheritanceInfo inheritanceInfo; |
| 569 memset(&inheritanceInfo, 0, sizeof(VkCommandBufferInheritanceInfo)); | 597 memset(&inheritanceInfo, 0, sizeof(VkCommandBufferInheritanceInfo)); |
| 570 inheritanceInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO; | 598 inheritanceInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO; |
| 571 inheritanceInfo.pNext = nullptr; | 599 inheritanceInfo.pNext = nullptr; |
| 572 inheritanceInfo.renderPass = fActiveRenderPass->vkRenderPass(); | 600 inheritanceInfo.renderPass = fActiveRenderPass->vkRenderPass(); |
| 573 inheritanceInfo.subpass = 0; // Currently only using 1 subpass for each rend
er pass | 601 inheritanceInfo.subpass = 0; // Currently only using 1 subpass for each rend
er pass |
| 574 inheritanceInfo.framebuffer = framebuffer ? framebuffer->framebuffer() : VK_
NULL_HANDLE; | 602 inheritanceInfo.framebuffer = framebuffer ? framebuffer->framebuffer() : VK_
NULL_HANDLE; |
| 575 inheritanceInfo.occlusionQueryEnable = false; | 603 inheritanceInfo.occlusionQueryEnable = false; |
| 576 inheritanceInfo.queryFlags = 0; | 604 inheritanceInfo.queryFlags = 0; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 589 fIsActive = true; | 617 fIsActive = true; |
| 590 } | 618 } |
| 591 | 619 |
| 592 void GrVkSecondaryCommandBuffer::end(const GrVkGpu* gpu) { | 620 void GrVkSecondaryCommandBuffer::end(const GrVkGpu* gpu) { |
| 593 SkASSERT(fIsActive); | 621 SkASSERT(fIsActive); |
| 594 GR_VK_CALL_ERRCHECK(gpu->vkInterface(), EndCommandBuffer(fCmdBuffer)); | 622 GR_VK_CALL_ERRCHECK(gpu->vkInterface(), EndCommandBuffer(fCmdBuffer)); |
| 595 this->invalidateState(); | 623 this->invalidateState(); |
| 596 fIsActive = false; | 624 fIsActive = false; |
| 597 } | 625 } |
| 598 | 626 |
| OLD | NEW |