aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/vk/GrVkPipelineState.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpu/vk/GrVkPipelineState.cpp')
-rw-r--r--src/gpu/vk/GrVkPipelineState.cpp124
1 files changed, 61 insertions, 63 deletions
diff --git a/src/gpu/vk/GrVkPipelineState.cpp b/src/gpu/vk/GrVkPipelineState.cpp
index 0a9d68eb38..d3921afe2e 100644
--- a/src/gpu/vk/GrVkPipelineState.cpp
+++ b/src/gpu/vk/GrVkPipelineState.cpp
@@ -32,7 +32,7 @@ GrVkPipelineState::GrVkPipelineState(GrVkGpu* gpu,
const GrVkDescriptorSetManager::Handle& samplerDSHandle,
const BuiltinUniformHandles& builtinUniformHandles,
const UniformInfoArray& uniforms,
- uint32_t vertexUniformSize,
+ uint32_t geometryUniformSize,
uint32_t fragmentUniformSize,
uint32_t numSamplers,
GrGLSLPrimitiveProcessor* geometryProcessor,
@@ -50,7 +50,7 @@ GrVkPipelineState::GrVkPipelineState(GrVkGpu* gpu,
, fXferProcessor(xferProcessor)
, fFragmentProcessors(fragmentProcessors)
, fDesc(desc)
- , fDataManager(uniforms, vertexUniformSize, fragmentUniformSize) {
+ , fDataManager(uniforms, geometryUniformSize, fragmentUniformSize) {
fSamplers.setReserve(numSamplers);
fTextureViews.setReserve(numSamplers);
fTextures.setReserve(numSamplers);
@@ -59,7 +59,7 @@ GrVkPipelineState::GrVkPipelineState(GrVkGpu* gpu,
fDescriptorSets[1] = VK_NULL_HANDLE;
// Currently we are always binding a descriptor set for uniform buffers.
- if (vertexUniformSize || fragmentUniformSize) {
+ if (geometryUniformSize || fragmentUniformSize) {
fDSCount++;
fStartDS = GrVkUniformHandler::kUniformBufferDescSet;
}
@@ -68,7 +68,7 @@ GrVkPipelineState::GrVkPipelineState(GrVkGpu* gpu,
fStartDS = SkTMin(fStartDS, (int)GrVkUniformHandler::kSamplerDescSet);
}
- fVertexUniformBuffer.reset(GrVkUniformBuffer::Create(gpu, vertexUniformSize));
+ fGeometryUniformBuffer.reset(GrVkUniformBuffer::Create(gpu, geometryUniformSize));
fFragmentUniformBuffer.reset(GrVkUniformBuffer::Create(gpu, fragmentUniformSize));
fNumSamplers = numSamplers;
@@ -116,8 +116,8 @@ void GrVkPipelineState::freeGPUResources(const GrVkGpu* gpu) {
fPipelineLayout = VK_NULL_HANDLE;
}
- if (fVertexUniformBuffer) {
- fVertexUniformBuffer->release(gpu);
+ if (fGeometryUniformBuffer) {
+ fGeometryUniformBuffer->release(gpu);
}
if (fFragmentUniformBuffer) {
@@ -143,7 +143,7 @@ void GrVkPipelineState::abandonGPUResources() {
fPipelineLayout = VK_NULL_HANDLE;
- fVertexUniformBuffer->abandon();
+ fGeometryUniformBuffer->abandon();
fFragmentUniformBuffer->abandon();
for (int i = 0; i < fSamplers.count(); ++i) {
@@ -236,9 +236,9 @@ void GrVkPipelineState::setData(GrVkGpu* gpu,
this->writeSamplers(gpu, textureBindings, pipeline.getAllowSRGBInputs());
}
- if (fVertexUniformBuffer.get() || fFragmentUniformBuffer.get()) {
+ if (fGeometryUniformBuffer || fFragmentUniformBuffer) {
if (fDataManager.uploadUniformBuffers(gpu,
- fVertexUniformBuffer.get(),
+ fGeometryUniformBuffer.get(),
fFragmentUniformBuffer.get())
|| !fUniformDescriptorSet)
{
@@ -253,62 +253,60 @@ void GrVkPipelineState::setData(GrVkGpu* gpu,
}
}
+void set_uniform_descriptor_writes(VkWriteDescriptorSet* descriptorWrite,
+ VkDescriptorBufferInfo* bufferInfo,
+ const GrVkUniformBuffer* buffer,
+ VkDescriptorSet descriptorSet,
+ uint32_t binding) {
+
+ memset(bufferInfo, 0, sizeof(VkDescriptorBufferInfo));
+ bufferInfo->buffer = buffer->buffer();
+ bufferInfo->offset = buffer->offset();
+ bufferInfo->range = buffer->size();
+
+ memset(descriptorWrite, 0, sizeof(VkWriteDescriptorSet));
+ descriptorWrite->sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+ descriptorWrite->pNext = nullptr;
+ descriptorWrite->dstSet = descriptorSet,
+ descriptorWrite->dstBinding = binding;
+ descriptorWrite->dstArrayElement = 0;
+ descriptorWrite->descriptorCount = 1;
+ descriptorWrite->descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+ descriptorWrite->pImageInfo = nullptr;
+ descriptorWrite->pBufferInfo = bufferInfo;
+ descriptorWrite->pTexelBufferView = nullptr;
+}
+
void GrVkPipelineState::writeUniformBuffers(const GrVkGpu* gpu) {
- VkWriteDescriptorSet descriptorWrites[2];
- memset(descriptorWrites, 0, 2 * sizeof(VkWriteDescriptorSet));
-
- uint32_t firstUniformWrite = 0;
- uint32_t uniformBindingUpdateCount = 0;
-
- VkDescriptorBufferInfo vertBufferInfo;
- // Vertex Uniform Buffer
- if (fVertexUniformBuffer.get()) {
- ++uniformBindingUpdateCount;
- memset(&vertBufferInfo, 0, sizeof(VkDescriptorBufferInfo));
- vertBufferInfo.buffer = fVertexUniformBuffer->buffer();
- vertBufferInfo.offset = fVertexUniformBuffer->offset();
- vertBufferInfo.range = fVertexUniformBuffer->size();
-
- descriptorWrites[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
- descriptorWrites[0].pNext = nullptr;
- descriptorWrites[0].dstSet = fDescriptorSets[GrVkUniformHandler::kUniformBufferDescSet];
- descriptorWrites[0].dstBinding = GrVkUniformHandler::kVertexBinding;
- descriptorWrites[0].dstArrayElement = 0;
- descriptorWrites[0].descriptorCount = 1;
- descriptorWrites[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
- descriptorWrites[0].pImageInfo = nullptr;
- descriptorWrites[0].pBufferInfo = &vertBufferInfo;
- descriptorWrites[0].pTexelBufferView = nullptr;
- }
-
- VkDescriptorBufferInfo fragBufferInfo;
+ VkWriteDescriptorSet descriptorWrites[3];
+ VkDescriptorBufferInfo bufferInfos[3];
+
+ uint32_t writeCount = 0;
+
+ // Geometry Uniform Buffer
+ if (fGeometryUniformBuffer.get()) {
+ set_uniform_descriptor_writes(&descriptorWrites[writeCount],
+ &bufferInfos[writeCount],
+ fGeometryUniformBuffer.get(),
+ fDescriptorSets[GrVkUniformHandler::kUniformBufferDescSet],
+ GrVkUniformHandler::kGeometryBinding);
+ ++writeCount;
+ }
+
// Fragment Uniform Buffer
if (fFragmentUniformBuffer.get()) {
- if (0 == uniformBindingUpdateCount) {
- firstUniformWrite = 1;
- }
- ++uniformBindingUpdateCount;
- memset(&fragBufferInfo, 0, sizeof(VkDescriptorBufferInfo));
- fragBufferInfo.buffer = fFragmentUniformBuffer->buffer();
- fragBufferInfo.offset = fFragmentUniformBuffer->offset();
- fragBufferInfo.range = fFragmentUniformBuffer->size();
-
- descriptorWrites[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
- descriptorWrites[1].pNext = nullptr;
- descriptorWrites[1].dstSet = fDescriptorSets[GrVkUniformHandler::kUniformBufferDescSet];
- descriptorWrites[1].dstBinding = GrVkUniformHandler::kFragBinding;;
- descriptorWrites[1].dstArrayElement = 0;
- descriptorWrites[1].descriptorCount = 1;
- descriptorWrites[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
- descriptorWrites[1].pImageInfo = nullptr;
- descriptorWrites[1].pBufferInfo = &fragBufferInfo;
- descriptorWrites[1].pTexelBufferView = nullptr;
- }
-
- if (uniformBindingUpdateCount) {
+ set_uniform_descriptor_writes(&descriptorWrites[writeCount],
+ &bufferInfos[writeCount],
+ fFragmentUniformBuffer.get(),
+ fDescriptorSets[GrVkUniformHandler::kUniformBufferDescSet],
+ GrVkUniformHandler::kFragBinding);
+ ++writeCount;
+ }
+
+ if (writeCount) {
GR_VK_CALL(gpu->vkInterface(), UpdateDescriptorSets(gpu->device(),
- uniformBindingUpdateCount,
- &descriptorWrites[firstUniformWrite],
+ writeCount,
+ descriptorWrites,
0, nullptr));
}
}
@@ -401,8 +399,8 @@ void GrVkPipelineState::addUniformResources(GrVkCommandBuffer& commandBuffer) {
commandBuffer.addRecycledResource(fSamplerDescriptorSet);
}
- if (fVertexUniformBuffer.get()) {
- commandBuffer.addRecycledResource(fVertexUniformBuffer->resource());
+ if (fGeometryUniformBuffer.get()) {
+ commandBuffer.addRecycledResource(fGeometryUniformBuffer->resource());
}
if (fFragmentUniformBuffer.get()) {
commandBuffer.addRecycledResource(fFragmentUniformBuffer->resource());