1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2013 Google Inc. 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifndef GrGLSLPrimitiveProcessor_DEFINED 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define GrGLSLPrimitiveProcessor_DEFINED 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrFragmentProcessor.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrPrimitiveProcessor.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "glsl/GrGLSLProgramDataManager.h" 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "glsl/GrGLSLUniformHandler.h" 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrPrimitiveProcessor; 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrGLSLPPFragmentBuilder; 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrGLSLGeometryBuilder; 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrGLSLGPBuilder; 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrGLSLVaryingHandler; 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrGLSLVertexBuilder; 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrShaderCaps; 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass GrGLSLPrimitiveProcessor { 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot using FPCoordTransformIter = GrFragmentProcessor::CoordTransformIter; 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot virtual ~GrGLSLPrimitiveProcessor() {} 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot using UniformHandle = GrGLSLProgramDataManager::UniformHandle; 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot using SamplerHandle = GrGLSLUniformHandler::SamplerHandle; 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot using TexelBufferHandle = GrGLSLUniformHandler::TexelBufferHandle; 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * This class provides access to the GrCoordTransforms across all GrFragmentProcessors in a 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * GrPipeline. It is also used by the primitive processor to specify the fragment shader 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * variable that will hold the transformed coords for each GrCoordTransform. It is required that 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * the primitive processor iterate over each coord transform and insert a shader var result for 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * each. The GrGLSLFragmentProcessors will reference these variables in their fragment code. 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot class FPCoordTransformHandler : public SkNoncopyable { 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot public: 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot FPCoordTransformHandler(const GrPipeline& pipeline, 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTArray<GrShaderVar>* transformedCoordVars) 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot : fIter(pipeline) 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fTransformedCoordVars(transformedCoordVars) {} 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ~FPCoordTransformHandler() { SkASSERT(!this->nextCoordTransform());} 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const GrCoordTransform* nextCoordTransform(); 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // 'args' are constructor params to GrShaderVar. 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot template<typename... Args> 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void specifyCoordsForCurrCoordTransform(Args&&... args) { 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT(!fAddedCoord); 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fTransformedCoordVars->emplace_back(std::forward<Args>(args)...); 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkDEBUGCODE(fAddedCoord = true;) 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot private: 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrFragmentProcessor::CoordTransformIter fIter; 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkDEBUGCODE(bool fAddedCoord = false;) 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkDEBUGCODE(const GrCoordTransform* fCurr = nullptr;) 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkTArray<GrShaderVar>* fTransformedCoordVars; 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot struct EmitArgs { 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot EmitArgs(GrGLSLVertexBuilder* vertBuilder, 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrGLSLGeometryBuilder* geomBuilder, 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrGLSLPPFragmentBuilder* fragBuilder, 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrGLSLVaryingHandler* varyingHandler, 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrGLSLUniformHandler* uniformHandler, 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const GrShaderCaps* caps, 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const GrPrimitiveProcessor& gp, 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* outputColor, 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* outputCoverage, 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* rtAdjustName, 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SamplerHandle* texSamplers, 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const TexelBufferHandle* texelBuffers, 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot FPCoordTransformHandler* transformHandler) 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot : fVertBuilder(vertBuilder) 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fGeomBuilder(geomBuilder) 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fFragBuilder(fragBuilder) 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fVaryingHandler(varyingHandler) 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fUniformHandler(uniformHandler) 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fShaderCaps(caps) 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fGP(gp) 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fOutputColor(outputColor) 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fOutputCoverage(outputCoverage) 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fRTAdjustName(rtAdjustName) 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fTexSamplers(texSamplers) 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fTexelBuffers(texelBuffers) 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fFPCoordTransformHandler(transformHandler) {} 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrGLSLVertexBuilder* fVertBuilder; 95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrGLSLGeometryBuilder* fGeomBuilder; 96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrGLSLPPFragmentBuilder* fFragBuilder; 97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrGLSLVaryingHandler* fVaryingHandler; 98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrGLSLUniformHandler* fUniformHandler; 99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const GrShaderCaps* fShaderCaps; 100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const GrPrimitiveProcessor& fGP; 101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* fOutputColor; 102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* fOutputCoverage; 103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* fRTAdjustName; 104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SamplerHandle* fTexSamplers; 105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const TexelBufferHandle* fTexelBuffers; 106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot FPCoordTransformHandler* fFPCoordTransformHandler; 107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * This is similar to emitCode() in the base class, except it takes a full shader builder. 111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * This allows the effect subclass to emit vertex code. 112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot virtual void emitCode(EmitArgs&) = 0; 114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot /** 116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * A GrGLSLPrimitiveProcessor instance can be reused with any GrGLSLPrimitiveProcessor that 117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * produces the same stage key; this function reads data from a GrGLSLPrimitiveProcessor and 118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * uploads any uniform variables required by the shaders created in emitCode(). The 119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * GrPrimitiveProcessor parameter is guaranteed to be of the same type and to have an 120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * identical processor key as the GrPrimitiveProcessor that created this 121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * GrGLSLPrimitiveProcessor. 122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * The subclass may use the transform iterator to perform any setup required for the particular 123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * set of fp transform matrices, such as uploading via uniforms. The iterator will iterate over 124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * the transforms in the same order as the TransformHandler passed to emitCode. 125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot virtual void setData(const GrGLSLProgramDataManager&, const GrPrimitiveProcessor&, 127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot FPCoordTransformIter&&) = 0; 128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static SkMatrix GetTransformMatrix(const SkMatrix& localMatrix, const GrCoordTransform&); 130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void setupUniformColor(GrGLSLPPFragmentBuilder* fragBuilder, 133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrGLSLUniformHandler* uniformHandler, 134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const char* outputName, 135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot UniformHandle* colorUniform); 136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif 139