inline void GrGLPathRendering::stencilThenCoverFillPathInstanced( GrGLsizei numPaths, GrGLenum pathNameType, const GrGLvoid *paths, GrGLuint pathBase, GrGLenum fillMode, GrGLuint mask, GrGLenum coverMode, GrGLenum transformType, const GrGLfloat *transformValues) { if (caps().stencilThenCoverSupport) { GL_CALL(StencilThenCoverFillPathInstanced(numPaths, pathNameType, paths, pathBase, fillMode, mask, coverMode, transformType, transformValues)); return; } GL_CALL(StencilFillPathInstanced(numPaths, pathNameType, paths, pathBase, fillMode, mask, transformType, transformValues)); GL_CALL(CoverFillPathInstanced(numPaths, pathNameType, paths, pathBase, coverMode, transformType, transformValues)); }
void GrGLPathRendering::onDrawPaths(const GrPipeline& pipeline, const GrPrimitiveProcessor& primProc, const GrStencilSettings& stencil, const GrPathRange* pathRange, const void* indices, PathIndexType indexType, const float transformValues[], PathTransformType transformType, int count) { SkDEBUGCODE(verify_floats(transformValues, gXformType2ComponentCount[transformType] * count)); if (!this->gpu()->flushGLState(pipeline, primProc)) { return; } this->flushPathStencilSettings(stencil); SkASSERT(!fHWPathStencilSettings.isTwoSided()); const GrGLPathRange* glPathRange = static_cast<const GrGLPathRange*>(pathRange); GrGLenum fillMode = gr_stencil_op_to_gl_path_rendering_fill_mode(fHWPathStencilSettings.front().fPassOp); GrGLint writeMask = fHWPathStencilSettings.front().fWriteMask; if (glPathRange->shouldStroke()) { if (glPathRange->shouldFill()) { GL_CALL(StencilFillPathInstanced( count, gIndexType2GLType[indexType], indices, glPathRange->basePathID(), fillMode, writeMask, gXformType2GLType[transformType], transformValues)); } GL_CALL(StencilThenCoverStrokePathInstanced( count, gIndexType2GLType[indexType], indices, glPathRange->basePathID(), 0xffff, writeMask, GR_GL_BOUNDING_BOX_OF_BOUNDING_BOXES, gXformType2GLType[transformType], transformValues)); } else { GL_CALL(StencilThenCoverFillPathInstanced( count, gIndexType2GLType[indexType], indices, glPathRange->basePathID(), fillMode, writeMask, GR_GL_BOUNDING_BOX_OF_BOUNDING_BOXES, gXformType2GLType[transformType], transformValues)); } }
void GrGLPathRendering::onDrawPaths(const DrawPathArgs& args, const GrPathRange* pathRange, const void* indices, PathIndexType indexType, const float transformValues[], PathTransformType transformType, int count) { if (!this->gpu()->flushGLState(args)) { return; } this->flushPathStencilSettings(*args.fStencil); SkASSERT(!fHWPathStencilSettings.isTwoSided()); const GrGLPathRange* glPathRange = static_cast<const GrGLPathRange*>(pathRange); GrGLenum fillMode = gr_stencil_op_to_gl_path_rendering_fill_mode( fHWPathStencilSettings.passOp(GrStencilSettings::kFront_Face)); GrGLint writeMask = fHWPathStencilSettings.writeMask(GrStencilSettings::kFront_Face); if (glPathRange->shouldStroke()) { if (glPathRange->shouldFill()) { GL_CALL(StencilFillPathInstanced( count, gIndexType2GLType[indexType], indices, glPathRange->basePathID(), fillMode, writeMask, gXformType2GLType[transformType], transformValues)); } GL_CALL(StencilThenCoverStrokePathInstanced( count, gIndexType2GLType[indexType], indices, glPathRange->basePathID(), 0xffff, writeMask, GR_GL_BOUNDING_BOX_OF_BOUNDING_BOXES, gXformType2GLType[transformType], transformValues)); } else { GL_CALL(StencilThenCoverFillPathInstanced( count, gIndexType2GLType[indexType], indices, glPathRange->basePathID(), fillMode, writeMask, GR_GL_BOUNDING_BOX_OF_BOUNDING_BOXES, gXformType2GLType[transformType], transformValues)); } }