diff options
author | Brian Salomon <bsalomon@google.com> | 2018-06-19 14:33:47 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-06-19 20:01:29 +0000 |
commit | 92be2f74db81f0ed480b55c58cbde39270f9b772 (patch) | |
tree | d2b7135f511a318f10c5c86f2537c07051c922bd /src/gpu/vk | |
parent | f5ac906476cd26f2967a48340940e6af580fa71f (diff) |
Revert "Revert "Change how vertex/instance attributes are handled in geometry processors.""
This reverts commit 5045e501d2aec23e5f1e4b46346033ac3202c6b0.
TBR=csmartdalton@google.com
Change-Id: Ifbf5f1d8f8ef340fdc69653e931b6d68d4bf0854
Reviewed-on: https://skia-review.googlesource.com/135862
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
Diffstat (limited to 'src/gpu/vk')
-rw-r--r-- | src/gpu/vk/GrVkPipeline.cpp | 80 |
1 files changed, 51 insertions, 29 deletions
diff --git a/src/gpu/vk/GrVkPipeline.cpp b/src/gpu/vk/GrVkPipeline.cpp index 500ab967cc..c5b4592950 100644 --- a/src/gpu/vk/GrVkPipeline.cpp +++ b/src/gpu/vk/GrVkPipeline.cpp @@ -59,37 +59,58 @@ static void setup_vertex_input_state(const GrPrimitiveProcessor& primProc, VkVertexInputAttributeDescription* attributeDesc) { uint32_t vertexBinding = 0, instanceBinding = 0; - if (primProc.hasVertexAttribs()) { - vertexBinding = bindingDescs->count(); - bindingDescs->push_back() = { - vertexBinding, - (uint32_t) primProc.getVertexStride(), - VK_VERTEX_INPUT_RATE_VERTEX - }; + int nextBinding = bindingDescs->count(); + if (primProc.hasVertexAttributes()) { + vertexBinding = nextBinding++; } - if (primProc.hasInstanceAttribs()) { - instanceBinding = bindingDescs->count(); - bindingDescs->push_back() = { - instanceBinding, - (uint32_t) primProc.getInstanceStride(), - VK_VERTEX_INPUT_RATE_INSTANCE - }; + if (primProc.hasInstanceAttributes()) { + instanceBinding = nextBinding; } // setup attribute descriptions - int vaCount = primProc.numAttribs(); - if (vaCount > 0) { - for (int attribIndex = 0; attribIndex < vaCount; attribIndex++) { - using InputRate = GrPrimitiveProcessor::Attribute::InputRate; - const GrGeometryProcessor::Attribute& attrib = primProc.getAttrib(attribIndex); - VkVertexInputAttributeDescription& vkAttrib = attributeDesc[attribIndex]; - vkAttrib.location = attribIndex; // for now assume location = attribIndex - vkAttrib.binding = - InputRate::kPerInstance == attrib.inputRate() ? instanceBinding : vertexBinding; - vkAttrib.format = attrib_type_to_vkformat(attrib.type()); - vkAttrib.offset = attrib.offsetInRecord(); - } + int vaCount = primProc.numVertexAttributes(); + int attribIndex = 0; + size_t vertexAttributeOffset = 0; + for (; attribIndex < vaCount; attribIndex++) { + const GrGeometryProcessor::Attribute& attrib = primProc.vertexAttribute(attribIndex); + VkVertexInputAttributeDescription& vkAttrib = attributeDesc[attribIndex]; + vkAttrib.location = attribIndex; // for now assume location = attribIndex + vkAttrib.binding = vertexBinding; + vkAttrib.format = attrib_type_to_vkformat(attrib.type()); + vkAttrib.offset = vertexAttributeOffset; + SkASSERT(vkAttrib.offset == primProc.debugOnly_vertexAttributeOffset(attribIndex)); + vertexAttributeOffset += attrib.sizeAlign4(); + } + SkASSERT(vertexAttributeOffset == primProc.debugOnly_vertexStride()); + + int iaCount = primProc.numInstanceAttributes(); + size_t instanceAttributeOffset = 0; + for (int iaIndex = 0; iaIndex < iaCount; ++iaIndex, ++attribIndex) { + const GrGeometryProcessor::Attribute& attrib = primProc.instanceAttribute(iaIndex); + VkVertexInputAttributeDescription& vkAttrib = attributeDesc[attribIndex]; + vkAttrib.location = attribIndex; // for now assume location = attribIndex + vkAttrib.binding = instanceBinding; + vkAttrib.format = attrib_type_to_vkformat(attrib.type()); + vkAttrib.offset = instanceAttributeOffset; + SkASSERT(vkAttrib.offset == primProc.debugOnly_instanceAttributeOffset(iaIndex)); + instanceAttributeOffset += attrib.sizeAlign4(); + } + SkASSERT(instanceAttributeOffset == primProc.debugOnly_instanceStride()); + + if (primProc.hasVertexAttributes()) { + bindingDescs->push_back() = { + vertexBinding, + (uint32_t) vertexAttributeOffset, + VK_VERTEX_INPUT_RATE_VERTEX + }; + } + if (primProc.hasInstanceAttributes()) { + bindingDescs->push_back() = { + instanceBinding, + (uint32_t) instanceAttributeOffset, + VK_VERTEX_INPUT_RATE_INSTANCE + }; } memset(vertexInputInfo, 0, sizeof(VkPipelineVertexInputStateCreateInfo)); @@ -98,7 +119,7 @@ static void setup_vertex_input_state(const GrPrimitiveProcessor& primProc, vertexInputInfo->flags = 0; vertexInputInfo->vertexBindingDescriptionCount = bindingDescs->count(); vertexInputInfo->pVertexBindingDescriptions = bindingDescs->begin(); - vertexInputInfo->vertexAttributeDescriptionCount = vaCount; + vertexInputInfo->vertexAttributeDescriptionCount = vaCount + iaCount; vertexInputInfo->pVertexAttributeDescriptions = attributeDesc; } @@ -432,8 +453,9 @@ GrVkPipeline* GrVkPipeline::Create(GrVkGpu* gpu, const GrPipeline& pipeline, VkPipelineVertexInputStateCreateInfo vertexInputInfo; SkSTArray<2, VkVertexInputBindingDescription, true> bindingDescs; SkSTArray<16, VkVertexInputAttributeDescription> attributeDesc; - SkASSERT(primProc.numAttribs() <= gpu->vkCaps().maxVertexAttributes()); - VkVertexInputAttributeDescription* pAttribs = attributeDesc.push_back_n(primProc.numAttribs()); + int totalAttributeCnt = primProc.numVertexAttributes() + primProc.numInstanceAttributes(); + SkASSERT(totalAttributeCnt <= gpu->vkCaps().maxVertexAttributes()); + VkVertexInputAttributeDescription* pAttribs = attributeDesc.push_back_n(totalAttributeCnt); setup_vertex_input_state(primProc, &vertexInputInfo, &bindingDescs, pAttribs); VkPipelineInputAssemblyStateCreateInfo inputAssemblyInfo; |