| 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 "GrVkRenderPass.h" | 13 #include "GrVkRenderPass.h" |
| 13 #include "GrVkRenderTarget.h" | 14 #include "GrVkRenderTarget.h" |
| 14 #include "GrVkProgram.h" | 15 #include "GrVkProgram.h" |
| 15 #include "GrVkTransferBuffer.h" | 16 #include "GrVkTransferBuffer.h" |
| 16 #include "GrVkUtil.h" | 17 #include "GrVkUtil.h" |
| 17 | 18 |
| 18 GrVkCommandBuffer* GrVkCommandBuffer::Create(const GrVkGpu* gpu, VkCommandPool c
mdPool) { | 19 GrVkCommandBuffer* GrVkCommandBuffer::Create(const GrVkGpu* gpu, VkCommandPool c
mdPool) { |
| 19 const VkCommandBufferAllocateInfo cmdInfo = { | 20 const VkCommandBufferAllocateInfo cmdInfo = { |
| 20 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType | 21 VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, // sType |
| 21 NULL, // pNext | 22 NULL, // pNext |
| (...skipping 11 matching lines...) Expand all Loading... |
| 33 } | 34 } |
| 34 return new GrVkCommandBuffer(cmdBuffer); | 35 return new GrVkCommandBuffer(cmdBuffer); |
| 35 } | 36 } |
| 36 | 37 |
| 37 GrVkCommandBuffer::~GrVkCommandBuffer() { | 38 GrVkCommandBuffer::~GrVkCommandBuffer() { |
| 38 // Should have ended any render pass we're in the middle of | 39 // Should have ended any render pass we're in the middle of |
| 39 SkASSERT(!fActiveRenderPass); | 40 SkASSERT(!fActiveRenderPass); |
| 40 } | 41 } |
| 41 | 42 |
| 42 void GrVkCommandBuffer::invalidateState() { | 43 void GrVkCommandBuffer::invalidateState() { |
| 43 fBoundVertexBuffer = 0; | 44 fBoundVertexBuffer = VK_NULL_HANDLE; |
| 44 fBoundVertexBufferIsValid = false; | 45 fBoundVertexBufferIsValid = false; |
| 45 fBoundIndexBuffer = 0; | 46 fBoundIndexBuffer = VK_NULL_HANDLE; |
| 46 fBoundIndexBufferIsValid = false; | 47 fBoundIndexBufferIsValid = false; |
| 48 |
| 49 memset(&fCachedViewport, 0, sizeof(VkViewport)); |
| 50 fCachedViewport.width = - 1.0f; // Viewport must have a width greater than 0 |
| 51 |
| 52 memset(&fCachedScissor, 0, sizeof(VkRect2D)); |
| 53 fCachedScissor.offset.x = -1; // Scissor offset must be greater that 0 to be
valid |
| 54 |
| 55 for (int i = 0; i < 4; ++i) { |
| 56 fCachedBlendConstant[i] = -1.0; |
| 57 } |
| 47 } | 58 } |
| 48 | 59 |
| 49 void GrVkCommandBuffer::freeGPUData(const GrVkGpu* gpu) const { | 60 void GrVkCommandBuffer::freeGPUData(const GrVkGpu* gpu) const { |
| 50 SkASSERT(!fIsActive); | 61 SkASSERT(!fIsActive); |
| 51 SkASSERT(!fActiveRenderPass); | 62 SkASSERT(!fActiveRenderPass); |
| 52 for (int i = 0; i < fTrackedResources.count(); ++i) { | 63 for (int i = 0; i < fTrackedResources.count(); ++i) { |
| 53 fTrackedResources[i]->unref(gpu); | 64 fTrackedResources[i]->unref(gpu); |
| 54 } | 65 } |
| 55 | 66 |
| 56 // Destroy the fence, if any | 67 // Destroy the fence, if any |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 348 VK_PIPELINE_BIND_POINT_
GRAPHICS, | 359 VK_PIPELINE_BIND_POINT_
GRAPHICS, |
| 349 layout, | 360 layout, |
| 350 firstSet, | 361 firstSet, |
| 351 setCount, | 362 setCount, |
| 352 descriptorSets, | 363 descriptorSets, |
| 353 dynamicOffsetCount, | 364 dynamicOffsetCount, |
| 354 dynamicOffsets)); | 365 dynamicOffsets)); |
| 355 program->addUniformResources(*this); | 366 program->addUniformResources(*this); |
| 356 } | 367 } |
| 357 | 368 |
| 369 void GrVkCommandBuffer::bindPipeline(const GrVkGpu* gpu, const GrVkPipeline* pip
eline) { |
| 370 SkASSERT(fIsActive); |
| 371 SkASSERT(fActiveRenderPass); |
| 372 GR_VK_CALL(gpu->vkInterface(), CmdBindPipeline(fCmdBuffer, |
| 373 VK_PIPELINE_BIND_POINT_GRAPHI
CS, |
| 374 pipeline->pipeline())); |
| 375 addResource(pipeline); |
| 376 } |
| 377 |
| 358 void GrVkCommandBuffer::drawIndexed(const GrVkGpu* gpu, | 378 void GrVkCommandBuffer::drawIndexed(const GrVkGpu* gpu, |
| 359 uint32_t indexCount, | 379 uint32_t indexCount, |
| 360 uint32_t instanceCount, | 380 uint32_t instanceCount, |
| 361 uint32_t firstIndex, | 381 uint32_t firstIndex, |
| 362 int32_t vertexOffset, | 382 int32_t vertexOffset, |
| 363 uint32_t firstInstance) const { | 383 uint32_t firstInstance) const { |
| 364 SkASSERT(fIsActive); | 384 SkASSERT(fIsActive); |
| 365 SkASSERT(fActiveRenderPass); | 385 SkASSERT(fActiveRenderPass); |
| 366 GR_VK_CALL(gpu->vkInterface(), CmdDrawIndexed(fCmdBuffer, | 386 GR_VK_CALL(gpu->vkInterface(), CmdDrawIndexed(fCmdBuffer, |
| 367 indexCount, | 387 indexCount, |
| 368 instanceCount, | 388 instanceCount, |
| 369 firstIndex, | 389 firstIndex, |
| 370 vertexOffset, | 390 vertexOffset, |
| 371 firstInstance)); | 391 firstInstance)); |
| 372 } | 392 } |
| 373 | 393 |
| 374 void GrVkCommandBuffer::draw(const GrVkGpu* gpu, | 394 void GrVkCommandBuffer::draw(const GrVkGpu* gpu, |
| 375 uint32_t vertexCount, | 395 uint32_t vertexCount, |
| 376 uint32_t instanceCount, | 396 uint32_t instanceCount, |
| 377 uint32_t firstVertex, | 397 uint32_t firstVertex, |
| 378 uint32_t firstInstance) const { | 398 uint32_t firstInstance) const { |
| 379 SkASSERT(fIsActive); | 399 SkASSERT(fIsActive); |
| 380 SkASSERT(fActiveRenderPass); | 400 SkASSERT(fActiveRenderPass); |
| 381 GR_VK_CALL(gpu->vkInterface(), CmdDraw(fCmdBuffer, | 401 GR_VK_CALL(gpu->vkInterface(), CmdDraw(fCmdBuffer, |
| 382 vertexCount, | 402 vertexCount, |
| 383 instanceCount, | 403 instanceCount, |
| 384 firstVertex, | 404 firstVertex, |
| 385 firstInstance)); | 405 firstInstance)); |
| 386 } | 406 } |
| 407 |
| 408 void GrVkCommandBuffer::setViewport(const GrVkGpu* gpu, |
| 409 uint32_t firstViewport, |
| 410 uint32_t viewportCount, |
| 411 const VkViewport* viewports) { |
| 412 SkASSERT(fIsActive); |
| 413 SkASSERT(1 == viewportCount); |
| 414 if (memcmp(viewports, &fCachedViewport, sizeof(VkViewport))) { |
| 415 GR_VK_CALL(gpu->vkInterface(), CmdSetViewport(fCmdBuffer, |
| 416 firstViewport, |
| 417 viewportCount, |
| 418 viewports)); |
| 419 fCachedViewport = viewports[0]; |
| 420 } |
| 421 } |
| 422 |
| 423 void GrVkCommandBuffer::setScissor(const GrVkGpu* gpu, |
| 424 uint32_t firstScissor, |
| 425 uint32_t scissorCount, |
| 426 const VkRect2D* scissors) { |
| 427 SkASSERT(fIsActive); |
| 428 SkASSERT(1 == scissorCount); |
| 429 if (memcmp(scissors, &fCachedScissor, sizeof(VkRect2D))) { |
| 430 GR_VK_CALL(gpu->vkInterface(), CmdSetScissor(fCmdBuffer, |
| 431 firstScissor, |
| 432 scissorCount, |
| 433 scissors)); |
| 434 fCachedScissor = scissors[0]; |
| 435 } |
| 436 } |
| 437 |
| 438 void GrVkCommandBuffer::setBlendConstants(const GrVkGpu* gpu, |
| 439 const float blendConstants[4]) { |
| 440 SkASSERT(fIsActive); |
| 441 if (memcmp(blendConstants, fCachedBlendConstant, 4 * sizeof(float))) { |
| 442 GR_VK_CALL(gpu->vkInterface(), CmdSetBlendConstants(fCmdBuffer, blendCon
stants)); |
| 443 memcpy(fCachedBlendConstant, blendConstants, 4 * sizeof(float)); |
| 444 } |
| 445 } |
| OLD | NEW |