diff options
author | 2016-03-18 12:50:27 -0700 | |
---|---|---|
committer | 2016-03-18 12:50:27 -0700 | |
commit | 470d77a1d7dc286cdad98b145dac735cd7638e56 (patch) | |
tree | b858138d3904d73fe7191fd1e0c5dd4540ce969f /src/gpu/vk/GrVkCommandBuffer.cpp | |
parent | 58fc94e55fb52704f86aa6fde97719131a3c9ed4 (diff) |
Use dynamic state from vulkan pipelines
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1813913002
Review URL: https://codereview.chromium.org/1813913002
Diffstat (limited to 'src/gpu/vk/GrVkCommandBuffer.cpp')
-rw-r--r-- | src/gpu/vk/GrVkCommandBuffer.cpp | 63 |
1 files changed, 61 insertions, 2 deletions
diff --git a/src/gpu/vk/GrVkCommandBuffer.cpp b/src/gpu/vk/GrVkCommandBuffer.cpp index d26d06d1c3..c05e9555cb 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)); + } +} |