| Index: src/gpu/vk/GrVkCommandBuffer.cpp
|
| diff --git a/src/gpu/vk/GrVkCommandBuffer.cpp b/src/gpu/vk/GrVkCommandBuffer.cpp
|
| index d26d06d1c34a2d642b8b7d464e2b0df75eedae09..55777958e26f358e3b4b1d39c213cec593839e04 100644
|
| --- a/src/gpu/vk/GrVkCommandBuffer.cpp
|
| +++ b/src/gpu/vk/GrVkCommandBuffer.cpp
|
| @@ -9,6 +9,7 @@
|
|
|
| #include "GrVkFramebuffer.h"
|
| #include "GrVkImageView.h"
|
| +#include "GrVkPipeline.h"
|
| #include "GrVkRenderPass.h"
|
| #include "GrVkRenderTarget.h"
|
| #include "GrVkProgram.h"
|
| @@ -40,10 +41,20 @@ GrVkCommandBuffer::~GrVkCommandBuffer() {
|
| }
|
|
|
| void GrVkCommandBuffer::invalidateState() {
|
| - fBoundVertexBuffer = 0;
|
| + fBoundVertexBuffer = VK_NULL_HANDLE;
|
| fBoundVertexBufferIsValid = false;
|
| - fBoundIndexBuffer = 0;
|
| + fBoundIndexBuffer = VK_NULL_HANDLE;
|
| fBoundIndexBufferIsValid = false;
|
| +
|
| + memset(&fCachedViewport, 0, sizeof(VkViewport));
|
| + fCachedViewport.width = - 1.0f; // Viewport must have a width greater than 0
|
| +
|
| + memset(&fCachedScissor, 0, sizeof(VkRect2D));
|
| + fCachedScissor.offset.x = -1; // Scissor offset must be greater that 0 to be valid
|
| +
|
| + for (int i = 0; i < 4; ++i) {
|
| + fCachedBlendConstant[i] = -1.0;
|
| + }
|
| }
|
|
|
| void GrVkCommandBuffer::freeGPUData(const GrVkGpu* gpu) const {
|
| @@ -355,6 +366,15 @@ void GrVkCommandBuffer::bindDescriptorSets(const GrVkGpu* gpu,
|
| program->addUniformResources(*this);
|
| }
|
|
|
| +void GrVkCommandBuffer::bindPipeline(const GrVkGpu* gpu, const GrVkPipeline* pipeline) {
|
| + SkASSERT(fIsActive);
|
| + SkASSERT(fActiveRenderPass);
|
| + GR_VK_CALL(gpu->vkInterface(), CmdBindPipeline(fCmdBuffer,
|
| + VK_PIPELINE_BIND_POINT_GRAPHICS,
|
| + pipeline->pipeline()));
|
| + addResource(pipeline);
|
| +}
|
| +
|
| void GrVkCommandBuffer::drawIndexed(const GrVkGpu* gpu,
|
| uint32_t indexCount,
|
| uint32_t instanceCount,
|
| @@ -384,3 +404,42 @@ void GrVkCommandBuffer::draw(const GrVkGpu* gpu,
|
| firstVertex,
|
| firstInstance));
|
| }
|
| +
|
| +void GrVkCommandBuffer::setViewport(const GrVkGpu* gpu,
|
| + uint32_t firstViewport,
|
| + uint32_t viewportCount,
|
| + const VkViewport* viewports) {
|
| + SkASSERT(fIsActive);
|
| + SkASSERT(1 == viewportCount);
|
| + if (memcmp(viewports, &fCachedViewport, sizeof(VkViewport))) {
|
| + GR_VK_CALL(gpu->vkInterface(), CmdSetViewport(fCmdBuffer,
|
| + firstViewport,
|
| + viewportCount,
|
| + viewports));
|
| + fCachedViewport = viewports[0];
|
| + }
|
| +}
|
| +
|
| +void GrVkCommandBuffer::setScissor(const GrVkGpu* gpu,
|
| + uint32_t firstScissor,
|
| + uint32_t scissorCount,
|
| + const VkRect2D* scissors) {
|
| + SkASSERT(fIsActive);
|
| + SkASSERT(1 == scissorCount);
|
| + if (memcmp(scissors, &fCachedScissor, sizeof(VkRect2D))) {
|
| + GR_VK_CALL(gpu->vkInterface(), CmdSetScissor(fCmdBuffer,
|
| + firstScissor,
|
| + scissorCount,
|
| + scissors));
|
| + fCachedScissor = scissors[0];
|
| + }
|
| +}
|
| +
|
| +void GrVkCommandBuffer::setBlendConstants(const GrVkGpu* gpu,
|
| + const float blendConstants[4]) {
|
| + SkASSERT(fIsActive);
|
| + if (memcmp(blendConstants, fCachedBlendConstant, 4 * sizeof(float))) {
|
| + GR_VK_CALL(gpu->vkInterface(), CmdSetBlendConstants(fCmdBuffer, blendConstants));
|
| + memcpy(fCachedBlendConstant, blendConstants, 4 * sizeof(float));
|
| + }
|
| +}
|
|
|