void GrDrawPathOp::onExecute(GrOpFlushState* state, const SkRect& chainBounds) { GrAppliedClip appliedClip = state->detachAppliedClip(); GrPipeline::FixedDynamicState fixedDynamicState(appliedClip.scissorState().rect()); GrPipeline pipeline(this->pipelineInitArgs(*state), this->detachProcessors(), std::move(appliedClip)); sk_sp<GrPathProcessor> pathProc(GrPathProcessor::Create(this->color(), this->viewMatrix())); GrStencilSettings stencil; init_stencil_pass_settings(*state, this->fillType(), &stencil); state->gpu()->pathRendering()->drawPath(state->drawOpArgs().renderTarget(), state->drawOpArgs().origin(), *pathProc, pipeline, fixedDynamicState, stencil, fPath.get()); }
void GrFillRRectOp::onExecute(GrOpFlushState* flushState, const SkRect& chainBounds) { if (!fInstanceBuffer) { return; // Setup failed. } sk_sp<const GrBuffer> indexBuffer, vertexBuffer; int indexCount; if (GrAAType::kCoverage == fAAType) { GR_DEFINE_STATIC_UNIQUE_KEY(gCoverageIndexBufferKey); indexBuffer = flushState->resourceProvider()->findOrMakeStaticBuffer( GrGpuBufferType::kIndex, sizeof(kCoverageIndexData), kCoverageIndexData, gCoverageIndexBufferKey); GR_DEFINE_STATIC_UNIQUE_KEY(gCoverageVertexBufferKey); vertexBuffer = flushState->resourceProvider()->findOrMakeStaticBuffer( GrGpuBufferType::kVertex, sizeof(kCoverageVertexData), kCoverageVertexData, gCoverageVertexBufferKey); indexCount = SK_ARRAY_COUNT(kCoverageIndexData); } else { GR_DEFINE_STATIC_UNIQUE_KEY(gMSAAIndexBufferKey); indexBuffer = flushState->resourceProvider()->findOrMakeStaticBuffer( GrGpuBufferType::kIndex, sizeof(kMSAAIndexData), kMSAAIndexData, gMSAAIndexBufferKey); GR_DEFINE_STATIC_UNIQUE_KEY(gMSAAVertexBufferKey); vertexBuffer = flushState->resourceProvider()->findOrMakeStaticBuffer( GrGpuBufferType::kVertex, sizeof(kMSAAVertexData), kMSAAVertexData, gMSAAVertexBufferKey); indexCount = SK_ARRAY_COUNT(kMSAAIndexData); } if (!indexBuffer || !vertexBuffer) { return; } Processor proc(fAAType, fFlags); SkASSERT(proc.instanceStride() == (size_t)fInstanceStride); GrPipeline::InitArgs initArgs; if (GrAAType::kMSAA == fAAType) { initArgs.fInputFlags = GrPipeline::InputFlags::kHWAntialias; } initArgs.fCaps = &flushState->caps(); initArgs.fResourceProvider = flushState->resourceProvider(); initArgs.fDstProxy = flushState->drawOpArgs().fDstProxy; auto clip = flushState->detachAppliedClip(); GrPipeline::FixedDynamicState fixedDynamicState(clip.scissorState().rect()); GrPipeline pipeline(initArgs, std::move(fProcessors), std::move(clip)); GrMesh mesh(GrPrimitiveType::kTriangles); mesh.setIndexedInstanced( std::move(indexBuffer), indexCount, fInstanceBuffer, fInstanceCount, fBaseInstance, GrPrimitiveRestart::kNo); mesh.setVertexData(std::move(vertexBuffer)); flushState->rtCommandBuffer()->draw( proc, pipeline, &fixedDynamicState, nullptr, &mesh, 1, this->bounds()); }