From b1b59576baf8abe457be159b13438b8668f8eeac Mon Sep 17 00:00:00 2001 From: egdaniel Date: Tue, 26 Apr 2016 08:15:09 -0700 Subject: [PATCH] Remove unnessary uniform barriers in Vulkan. Also added a fix to descriptor set allocation. BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1914053004 Review URL: https://codereview.chromium.org/1914053004 --- src/gpu/vk/GrVkGpu.cpp | 6 ------ src/gpu/vk/GrVkPipelineState.cpp | 22 ++++----------------- src/gpu/vk/GrVkPipelineStateDataManager.cpp | 12 ----------- 3 files changed, 4 insertions(+), 36 deletions(-) diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp index 76fe92abc1..02bd3f2c31 100644 --- a/src/gpu/vk/GrVkGpu.cpp +++ b/src/gpu/vk/GrVkGpu.cpp @@ -1602,7 +1602,6 @@ void GrVkGpu::onDraw(const GrPipeline& pipeline, const GrVkRenderPass* renderPass = vkRT->simpleRenderPass(); SkASSERT(renderPass); - GrPrimitiveType primitiveType = meshes[0].primitiveType(); sk_sp pipelineState = this->prepareDrawState(pipeline, primProc, @@ -1659,10 +1658,6 @@ void GrVkGpu::onDraw(const GrPipeline& pipeline, pipelineState->freeTempResources(this); SkDEBUGCODE(pipelineState = nullptr); primitiveType = nonIdxMesh->primitiveType(); - // It is illegal for us to have the necessary memory barriers for when we write and - // update the uniform buffers in prepareDrawState while in an active render pass. - // Thus we must end the current one and then start it up again. - fCurrentCmdBuffer->endRenderPass(this); pipelineState = this->prepareDrawState(pipeline, primProc, primitiveType, @@ -1670,7 +1665,6 @@ void GrVkGpu::onDraw(const GrPipeline& pipeline, if (!pipelineState) { return; } - fCurrentCmdBuffer->beginRenderPass(this, renderPass, *vkRT); } SkASSERT(pipelineState); this->bindGeometry(primProc, *nonIdxMesh); diff --git a/src/gpu/vk/GrVkPipelineState.cpp b/src/gpu/vk/GrVkPipelineState.cpp index 4fe292917a..2821483ca6 100644 --- a/src/gpu/vk/GrVkPipelineState.cpp +++ b/src/gpu/vk/GrVkPipelineState.cpp @@ -238,13 +238,6 @@ void GrVkPipelineState::writeUniformBuffers(const GrVkGpu* gpu) { descriptorWrites[0].pImageInfo = nullptr; descriptorWrites[0].pBufferInfo = &vertBufferInfo; descriptorWrites[0].pTexelBufferView = nullptr; - - fVertexUniformBuffer->addMemoryBarrier(gpu, - VK_ACCESS_HOST_WRITE_BIT, - VK_ACCESS_UNIFORM_READ_BIT, - VK_PIPELINE_STAGE_HOST_BIT, - VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, - false); } VkDescriptorBufferInfo fragBufferInfo; @@ -269,13 +262,6 @@ void GrVkPipelineState::writeUniformBuffers(const GrVkGpu* gpu) { descriptorWrites[1].pImageInfo = nullptr; descriptorWrites[1].pBufferInfo = &fragBufferInfo; descriptorWrites[1].pTexelBufferView = nullptr; - - fFragmentUniformBuffer->addMemoryBarrier(gpu, - VK_ACCESS_HOST_WRITE_BIT, - VK_ACCESS_UNIFORM_READ_BIT, - VK_PIPELINE_STAGE_HOST_BIT, - VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, - false); } if (uniformBindingUpdateCount) { @@ -436,11 +422,11 @@ void GrVkPipelineState::DescriptorPoolManager::getNewDescriptorSet(GrVkGpu* gpu, if (!fMaxDescriptors) { return; } - if (fCurrentDescriptorCount == fMaxDescriptors) { - this->getNewPool(gpu); - fCurrentDescriptorCount = 0; - } fCurrentDescriptorCount += fDescCountPerSet; + if (fCurrentDescriptorCount > fMaxDescriptors) { + this->getNewPool(gpu); + fCurrentDescriptorCount = fDescCountPerSet; + } VkDescriptorSetAllocateInfo dsAllocateInfo; memset(&dsAllocateInfo, 0, sizeof(VkDescriptorSetAllocateInfo)); diff --git a/src/gpu/vk/GrVkPipelineStateDataManager.cpp b/src/gpu/vk/GrVkPipelineStateDataManager.cpp index c72f209a21..638fdba365 100644 --- a/src/gpu/vk/GrVkPipelineStateDataManager.cpp +++ b/src/gpu/vk/GrVkPipelineStateDataManager.cpp @@ -248,24 +248,12 @@ bool GrVkPipelineStateDataManager::uploadUniformBuffers(const GrVkGpu* gpu, GrVkUniformBuffer* fragmentBuffer) const { bool updatedBuffer = false; if (vertexBuffer && fVertexUniformsDirty) { - vertexBuffer->addMemoryBarrier(gpu, - VK_ACCESS_UNIFORM_READ_BIT, - VK_ACCESS_HOST_WRITE_BIT, - VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, - VK_PIPELINE_STAGE_HOST_BIT, - false); SkAssertResult(vertexBuffer->updateData(gpu, fVertexUniformData.get(), fVertexUniformSize, &updatedBuffer)); fVertexUniformsDirty = false; } if (fragmentBuffer && fFragmentUniformsDirty) { - fragmentBuffer->addMemoryBarrier(gpu, - VK_ACCESS_UNIFORM_READ_BIT, - VK_ACCESS_HOST_WRITE_BIT, - VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, - VK_PIPELINE_STAGE_HOST_BIT, - false); SkAssertResult(fragmentBuffer->updateData(gpu, fFragmentUniformData.get(), fFragmentUniformSize, &updatedBuffer)); fFragmentUniformsDirty = false;