aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/vk/GrVkPipelineState.cpp
diff options
context:
space:
mode:
authorGravatar Greg Daniel <egdaniel@google.com>2017-05-04 15:09:03 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-05-04 19:38:24 +0000
commit18f9602094ace030cf73fa389bab555bc1e21b1f (patch)
treebb561a72a4f6191994aa7c01a277e615a60bac8b /src/gpu/vk/GrVkPipelineState.cpp
parentb7a330ff0048875e178b2d9a68cd5605d83baf8d (diff)
Add support for Geom shaders in Vulkan backend.
Still requires SkSL support before it will work. The main changes here involve support for uniforms in the geometry shader. We use the same buffer for vertex and geometry shader stages. These uniforms are not expected to be updated as often as frag data so we keep them separate to avoid larger buffer uploads to the gpu. BUG=skia: Change-Id: I10b631c24071b6ffa258907a02a009ec6c8accd0 Reviewed-on: https://skia-review.googlesource.com/8413 Commit-Queue: Greg Daniel <egdaniel@google.com> Reviewed-by: Jim Van Verth <jvanverth@google.com>
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());