diff options
Diffstat (limited to 'src/gpu/gl/builders/GrGLVertexShaderBuilder.h')
-rw-r--r-- | src/gpu/gl/builders/GrGLVertexShaderBuilder.h | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/src/gpu/gl/builders/GrGLVertexShaderBuilder.h b/src/gpu/gl/builders/GrGLVertexShaderBuilder.h new file mode 100644 index 0000000000..c576f57882 --- /dev/null +++ b/src/gpu/gl/builders/GrGLVertexShaderBuilder.h @@ -0,0 +1,81 @@ +/* + * Copyright 2014 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef GrGLVertexShader_DEFINED +#define GrGLVertexShader_DEFINED +#include "GrGLShaderBuilder.h" + +class GrGLProgramBuilder; + +class GrGLVertexShaderBuilder : public GrGLFullShaderBuilder { +public: + GrGLVertexShaderBuilder(GrGLFullProgramBuilder* program); + + /* + * Add attribute will push a new attribute onto the end. It will also assert if there is + * a duplicate attribute + */ + bool addAttribute(GrSLType type, const char* name); + + bool addEffectAttribute(int attributeIndex, GrSLType type, const SkString& name); + + /* + * this call is only for GrGLProgramEffects' internal use + */ + void emitAttributes(const GrEffectStage& stage); + + /** + * Are explicit local coordinates provided as input to the vertex shader. + */ + bool hasExplicitLocalCoords() const { return (fLocalCoordsVar != fPositionVar); } + + const SkString* getEffectAttributeName(int attributeIndex) const; + + /** Returns a vertex attribute that represents the local coords in the VS. This may be the same + as positionAttribute() or it may not be. It depends upon whether the rendering code + specified explicit local coords or not in the GrDrawState. */ + const GrGLShaderVar& localCoordsAttribute() const { return *fLocalCoordsVar; } + + /** Returns a vertex attribute that represents the vertex position in the VS. This is the + pre-matrix position and is commonly used by effects to compute texture coords via a matrix. + */ + const GrGLShaderVar& positionAttribute() const { return *fPositionVar; } + +private: + /* + * Internal call for GrGLFullProgramBuilder.addVarying + */ + void addVarying(GrSLType type, + const char* name, + const char** vsOutName); + + /* + * private helpers for compilation by GrGLProgramBuilder + */ + void bindProgramLocations(GrGLuint programId); + bool compileAndAttachShaders(GrGLuint programId, SkTDArray<GrGLuint>* shaderIds) const; + void emitCodeBeforeEffects(GrGLSLExpr4* color, GrGLSLExpr4* coverage); + void emitCodeAfterEffects(); + + struct AttributePair { + void set(int index, const SkString& name) { + fIndex = index; fName = name; + } + int fIndex; + SkString fName; + }; + + SkSTArray<10, AttributePair, true> fEffectAttributes; + GrGLShaderVar* fPositionVar; + GrGLShaderVar* fLocalCoordsVar; + + friend class GrGLFullProgramBuilder; + + typedef GrGLFullShaderBuilder INHERITED; +}; + +#endif |