Chromium Code Reviews| Index: src/gpu/vk/GrVkGpu.cpp |
| diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp |
| index fce7173effeabaa33a2f49f0ff9e687fa3ffa26f..40e8d8dc697ad9230260b89dd81f7f5c7a792105 100644 |
| --- a/src/gpu/vk/GrVkGpu.cpp |
| +++ b/src/gpu/vk/GrVkGpu.cpp |
| @@ -681,14 +681,6 @@ void GrVkGpu::bindGeometry(const GrPrimitiveProcessor& primProc, |
| } |
| } |
| -void GrVkGpu::buildProgramDesc(GrProgramDesc* desc, |
| - const GrPrimitiveProcessor& primProc, |
| - const GrPipeline& pipeline) const { |
| - if (!GrVkProgramDescBuilder::Build(desc, primProc, pipeline, *this->vkCaps().glslCaps())) { |
| - SkDEBUGFAIL("Failed to generate GL program descriptor"); |
| - } |
| -} |
| - |
| //////////////////////////////////////////////////////////////////////////////// |
| GrStencilAttachment* GrVkGpu::createStencilAttachmentForRenderTarget(const GrRenderTarget* rt, |
| @@ -1323,28 +1315,38 @@ bool GrVkGpu::onReadPixels(GrSurface* surface, |
| return true; |
| } |
| -void GrVkGpu::onDraw(const DrawArgs& args, const GrNonInstancedVertices& vertices) { |
| - GrRenderTarget* rt = args.fPipeline->getRenderTarget(); |
| +void GrVkGpu::onDraw(const GrPipeline& pipeline, |
| + const GrPrimitiveProcessor& primProc, |
| + GrPrimitiveType primitiveType, |
| + const GrVertices* vertArray, |
| + int drawCount) { |
| + GrRenderTarget* rt = pipeline.getRenderTarget(); |
| GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(rt); |
| const GrVkRenderPass* renderPass = vkRT->simpleRenderPass(); |
| SkASSERT(renderPass); |
| - GrVkProgram* program = GrVkProgramBuilder::CreateProgram(this, args, |
| - vertices.primitiveType(), |
| + |
| + // Get GrGLProgramDesc |
|
bsalomon
2016/03/16 20:07:22
?
egdaniel
2016/03/17 15:09:36
Done.
|
| + GrVkProgramDesc desc; |
| + if (!GrVkProgramDescBuilder::Build(&desc, primProc, pipeline, *this->vkCaps().glslCaps())) { |
| + GrCapsDebugf(this->caps(), "Failed to vk program descriptor!\n"); |
| + return; |
| + } |
| + GrVkProgram* program = GrVkProgramBuilder::CreateProgram(this, |
| + pipeline, |
| + primProc, |
| + primitiveType, |
| + desc, |
| *renderPass); |
| if (!program) { |
| return; |
| } |
| - program->setData(this, *args.fPrimitiveProcessor, *args.fPipeline); |
| - |
| - fCurrentCmdBuffer->beginRenderPass(this, renderPass, *vkRT); |
| + program->setData(this, primProc, pipeline); |
| program->bind(this, fCurrentCmdBuffer); |
| - this->bindGeometry(*args.fPrimitiveProcessor, vertices); |
| - |
| // Change layout of our render target so it can be used as the color attachment |
| VkImageLayout layout = vkRT->currentLayout(); |
| // Our color attachment is purely a destination and won't be read so don't need to flush or |
| @@ -1362,13 +1364,13 @@ void GrVkGpu::onDraw(const DrawArgs& args, const GrNonInstancedVertices& vertice |
| false); |
| // If we are using a stencil attachment we also need to update its layout |
| - if (!args.fPipeline->getStencil().isDisabled()) { |
| + if (!pipeline.getStencil().isDisabled()) { |
| GrStencilAttachment* stencil = vkRT->renderTargetPriv().getStencilAttachment(); |
| GrVkStencilAttachment* vkStencil = (GrVkStencilAttachment*)stencil; |
| VkImageLayout origDstLayout = vkStencil->currentLayout(); |
| VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(origDstLayout); |
| VkAccessFlags dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | |
| - VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT; |
| + VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT; |
| VkPipelineStageFlags srcStageMask = |
| GrVkMemory::LayoutToPipelineStageFlags(origDstLayout); |
| VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; |
| @@ -1381,15 +1383,33 @@ void GrVkGpu::onDraw(const DrawArgs& args, const GrNonInstancedVertices& vertice |
| false); |
| } |
| - if (vertices.isIndexed()) { |
| - fCurrentCmdBuffer->drawIndexed(this, |
| - vertices.indexCount(), |
| - 1, |
| - vertices.startIndex(), |
| - vertices.startVertex(), |
| - 0); |
| - } else { |
| - fCurrentCmdBuffer->draw(this, vertices.vertexCount(), 1, vertices.startVertex(), 0); |
| + fCurrentCmdBuffer->beginRenderPass(this, renderPass, *vkRT); |
| + |
| + for (int i = 0; i < drawCount; ++i) { |
| + if (GrXferBarrierType barrierType = pipeline.xferBarrierType(*this->caps())) { |
| + this->xferBarrier(pipeline.getRenderTarget(), barrierType); |
| + } |
| + |
| + const GrVertices& vertices = vertArray[i]; |
| + GrVertices::Iterator iter; |
| + const GrNonInstancedVertices* verts = iter.init(vertices); |
| + do { |
| + |
| + this->bindGeometry(primProc, *verts); |
| + |
| + if (vertices.isIndexed()) { |
| + fCurrentCmdBuffer->drawIndexed(this, |
| + verts->indexCount(), |
| + 1, |
| + verts->startIndex(), |
| + verts->startVertex(), |
| + 0); |
| + } else { |
| + fCurrentCmdBuffer->draw(this, verts->vertexCount(), 1, verts->startVertex(), 0); |
| + } |
| + |
| + fStats.incNumDraws(); |
| + } while ((verts = iter.next())); |
| } |
| fCurrentCmdBuffer->endRenderPass(this); |