Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(541)

Unified Diff: src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp

Issue 611653002: Cleanup of shader building system (Closed) Base URL: https://skia.googlesource.com/skia.git@solo_gp
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/gpu/gl/builders/GrGLVertexShaderBuilder.h ('k') | tests/GLProgramsTest.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp
diff --git a/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp b/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp
index 55ce7d14587b5d9045440fa51e54f7c0b5868aa1..76026b7a25005509701e91a874837d72555fe81f 100644
--- a/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp
+++ b/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp
@@ -6,46 +6,25 @@
*/
#include "GrGLVertexShaderBuilder.h"
-#include "GrGLFullProgramBuilder.h"
+#include "GrGLProgramBuilder.h"
#include "GrGLShaderStringBuilder.h"
#include "../GrGpuGL.h"
-#include "../../GrOptDrawState.h"
-#define GL_CALL(X) GR_GL_CALL(gpu->glInterface(), X)
-#define GL_CALL_RET(R, X) GR_GL_CALL_RET(gpu->glInterface(), R, X)
+#define GL_CALL(X) GR_GL_CALL(fProgramBuilder->gpu()->glInterface(), X)
+#define GL_CALL_RET(R, X) GR_GL_CALL_RET(fProgramBuilder->gpu()->glInterface(), R, X)
-namespace {
-inline const char* color_attribute_name() { return "inColor"; }
-inline const char* coverage_attribute_name() { return "inCoverage"; }
-}
+static const char* color_attribute_name() { return "inColor"; }
+static const char* coverage_attribute_name() { return "inCoverage"; }
-GrGLVertexShaderBuilder::GrGLVertexShaderBuilder(GrGLFullProgramBuilder* program)
+GrGLVertexBuilder::GrGLVertexBuilder(GrGLProgramBuilder* program)
: INHERITED(program)
, fPositionVar(NULL)
- , fLocalCoordsVar(NULL) {
-}
-bool GrGLVertexShaderBuilder::addAttribute(const GrShaderVar& var) {
- SkASSERT(GrShaderVar::kAttribute_TypeModifier == var.getTypeModifier());
- for (int i = 0; i < fInputs.count(); ++i) {
- const GrGLShaderVar& attr = fInputs[i];
- // if attribute already added, don't add it again
- if (attr.getName().equals(var.getName())) {
- return false;
- }
- }
- fInputs.push_back(var);
- return true;
+ , fLocalCoordsVar(NULL)
+ , fEffectAttribOffset(0) {
}
-void GrGLVertexShaderBuilder::emitAttributes(const GrGeometryProcessor& gp) {
- const GrGeometryProcessor::VertexAttribArray& vars = gp.getVertexAttribs();
- int numAttributes = vars.count();
- for (int a = 0; a < numAttributes; ++a) {
- this->addAttribute(vars[a]);
- }
-}
-
-void GrGLVertexShaderBuilder::addVarying(GrSLType type, const char* name, const char** vsOutName) {
+SkString* GrGLVertexBuilder::addVarying(GrSLType type, const char* name,
+ const char** vsOutName) {
fOutputs.push_back();
fOutputs.back().setType(type);
fOutputs.back().setTypeModifier(GrGLShaderVar::kVaryingOut_TypeModifier);
@@ -54,30 +33,88 @@ void GrGLVertexShaderBuilder::addVarying(GrSLType type, const char* name, const
if (vsOutName) {
*vsOutName = fOutputs.back().getName().c_str();
}
+ return fOutputs.back().accessName();
}
+void GrGLVertexBuilder::setupLocalCoords() {
+ fPositionVar = &fInputs.push_back();
+ fPositionVar->set(kVec2f_GrSLType, GrGLShaderVar::kAttribute_TypeModifier, "inPosition");
+ if (-1 != fProgramBuilder->header().fLocalCoordAttributeIndex) {
+ fLocalCoordsVar = &fInputs.push_back();
+ fLocalCoordsVar->set(kVec2f_GrSLType,
+ GrGLShaderVar::kAttribute_TypeModifier,
+ "inLocalCoords");
+ } else {
+ fLocalCoordsVar = fPositionVar;
+ }
+ fEffectAttribOffset = fInputs.count();
+}
-void GrGLVertexShaderBuilder::bindProgramLocations(GrGLuint programId) {
- const GrGLProgramDesc::KeyHeader& header = fProgramBuilder->desc().getHeader();
- GrGpuGL* gpu = fProgramBuilder->gpu();
+void GrGLVertexBuilder::transformGLToSkiaCoords() {
+ const char* viewMName;
+ fProgramBuilder->fUniformHandles.fViewMatrixUni =
+ fProgramBuilder->addUniform(GrGLProgramBuilder::kVertex_Visibility,
+ kMat33f_GrSLType,
+ "ViewM",
+ &viewMName);
+
+ // Transform the position into Skia's device coords.
+ this->codeAppendf("vec3 pos3 = %s * vec3(%s, 1);", viewMName, fPositionVar->c_str());
+}
+
+void GrGLVertexBuilder::setupBuiltinVertexAttribute(const char* inName, GrGLSLExpr4* out) {
+ SkString name(inName);
+ const char *vsName, *fsName;
+ fProgramBuilder->addVarying(kVec4f_GrSLType, name.c_str(), &vsName, &fsName);
+ name.prepend("in");
+ this->addAttribute(GrShaderVar(name.c_str(),
+ kVec4f_GrSLType,
+ GrShaderVar::kAttribute_TypeModifier));
+ this->codeAppendf("%s = %s;", vsName, name.c_str());
+ *out = fsName;
+ fEffectAttribOffset++;
+}
+
+void GrGLVertexBuilder::emitAttributes(const GrGeometryProcessor& gp) {
+ const GrGeometryProcessor::VertexAttribArray& vars = gp.getVertexAttribs();
+ int numAttributes = vars.count();
+ for (int a = 0; a < numAttributes; ++a) {
+ this->addAttribute(vars[a]);
+ }
+}
+
+void GrGLVertexBuilder::transformSkiaToGLCoords() {
+ const char* rtAdjustName;
+ fProgramBuilder->fUniformHandles.fRTAdjustmentUni =
+ fProgramBuilder->addUniform(GrGLProgramBuilder::kVertex_Visibility,
+ kVec4f_GrSLType,
+ "rtAdjustment",
+ &rtAdjustName);
+
+ // Transform from Skia's device coords to GL's normalized device coords.
+ this->codeAppendf("gl_Position = vec4(dot(pos3.xz, %s.xy), dot(pos3.yz, %s.zw), 0, pos3.z);",
+ rtAdjustName, rtAdjustName);
+}
+void GrGLVertexBuilder::bindVertexAttributes(GrGLuint programID) {
// Bind the attrib locations to same values for all shaders
+ const GrGLProgramDesc::KeyHeader& header = fProgramBuilder->header();
SkASSERT(-1 != header.fPositionAttributeIndex);
- GL_CALL(BindAttribLocation(programId,
+ GL_CALL(BindAttribLocation(programID,
header.fPositionAttributeIndex,
fPositionVar->c_str()));
if (-1 != header.fLocalCoordAttributeIndex) {
- GL_CALL(BindAttribLocation(programId,
+ GL_CALL(BindAttribLocation(programID,
header.fLocalCoordAttributeIndex,
fLocalCoordsVar->c_str()));
}
if (-1 != header.fColorAttributeIndex) {
- GL_CALL(BindAttribLocation(programId,
+ GL_CALL(BindAttribLocation(programID,
header.fColorAttributeIndex,
color_attribute_name()));
}
if (-1 != header.fCoverageAttributeIndex) {
- GL_CALL(BindAttribLocation(programId,
+ GL_CALL(BindAttribLocation(programID,
header.fCoverageAttributeIndex,
coverage_attribute_name()));
}
@@ -86,6 +123,7 @@ void GrGLVertexShaderBuilder::bindProgramLocations(GrGLuint programId) {
const GrVertexAttrib* vaPtr = optState.getVertexAttribs();
const int vaCount = optState.getVertexAttribCount();
+ // We start binding attributes after builtins
int i = fEffectAttribOffset;
for (int index = 0; index < vaCount; index++) {
if (kGeometryProcessor_GrVertexAttribBinding != vaPtr[index].fBinding) {
@@ -97,22 +135,22 @@ void GrGLVertexShaderBuilder::bindProgramLocations(GrGLuint programId) {
index != header.fCoverageAttributeIndex);
// We should never find another effect attribute if we have bound everything
SkASSERT(i < fInputs.count());
- GL_CALL(BindAttribLocation(programId, index, fInputs[i].c_str()));
+ GL_CALL(BindAttribLocation(programID, index, fInputs[i].c_str()));
i++;
}
// Make sure we bound everything
SkASSERT(fInputs.count() == i);
}
-bool GrGLVertexShaderBuilder::compileAndAttachShaders(GrGLuint programId,
+bool GrGLVertexBuilder::compileAndAttachShaders(GrGLuint programId,
SkTDArray<GrGLuint>* shaderIds) const {
GrGpuGL* gpu = fProgramBuilder->gpu();
const GrGLContext& glCtx = gpu->glContext();
const GrGLContextInfo& ctxInfo = gpu->ctxInfo();
SkString vertShaderSrc(GrGetGLSLVersionDecl(ctxInfo));
fProgramBuilder->appendUniformDecls(GrGLProgramBuilder::kVertex_Visibility, &vertShaderSrc);
- fProgramBuilder->appendDecls(fInputs, &vertShaderSrc);
- fProgramBuilder->appendDecls(fOutputs, &vertShaderSrc);
+ this->appendDecls(fInputs, &vertShaderSrc);
+ this->appendDecls(fOutputs, &vertShaderSrc);
vertShaderSrc.append("void main() {");
vertShaderSrc.append(fCode);
vertShaderSrc.append("}\n");
@@ -126,72 +164,15 @@ bool GrGLVertexShaderBuilder::compileAndAttachShaders(GrGLuint programId,
return true;
}
-void GrGLVertexShaderBuilder::emitCodeAfterEffects() {
- const char* rtAdjustName;
- fProgramBuilder->fUniformHandles.fRTAdjustmentUni =
- fProgramBuilder->addUniform(GrGLProgramBuilder::kVertex_Visibility,
- kVec4f_GrSLType,
- "rtAdjustment",
- &rtAdjustName);
-
- // Transform from Skia's device coords to GL's normalized device coords.
- this->codeAppendf(
- "gl_Position = vec4(dot(pos3.xz, %s.xy), dot(pos3.yz, %s.zw), 0, pos3.z);",
- rtAdjustName, rtAdjustName);
-}
-
-void GrGLVertexShaderBuilder::emitCodeBeforeEffects(GrGLSLExpr4* color, GrGLSLExpr4* coverage) {
- const GrGLProgramDesc::KeyHeader& header = fProgramBuilder->desc().getHeader();
-
- fPositionVar = &fInputs.push_back();
- fPositionVar->set(kVec2f_GrSLType, GrGLShaderVar::kAttribute_TypeModifier, "inPosition");
- if (-1 != header.fLocalCoordAttributeIndex) {
- fLocalCoordsVar = &fInputs.push_back();
- fLocalCoordsVar->set(kVec2f_GrSLType,
- GrGLShaderVar::kAttribute_TypeModifier,
- "inLocalCoords");
- } else {
- fLocalCoordsVar = fPositionVar;
- }
-
- const char* viewMName;
- fProgramBuilder->fUniformHandles.fViewMatrixUni =
- fProgramBuilder->addUniform(GrGLProgramBuilder::kVertex_Visibility,
- kMat33f_GrSLType,
- "ViewM",
- &viewMName);
-
- // Transform the position into Skia's device coords.
- this->codeAppendf("vec3 pos3 = %s * vec3(%s, 1);",
- viewMName, fPositionVar->c_str());
-
- // we output point size in the GS if present
- if (header.fEmitsPointSize
-#if GR_GL_EXPERIMENTAL_GS
- && !header.fExperimentalGS
-#endif
- ) {
- this->codeAppend("gl_PointSize = 1.0;");
- }
-
- if (GrGLProgramDesc::kAttribute_ColorInput == header.fColorInput) {
- this->addAttribute(GrShaderVar(color_attribute_name(),
- kVec4f_GrSLType,
- GrShaderVar::kAttribute_TypeModifier));
- const char *vsName, *fsName;
- fFullProgramBuilder->addVarying(kVec4f_GrSLType, "Color", &vsName, &fsName);
- this->codeAppendf("%s = %s;", vsName, color_attribute_name());
- *color = fsName;
- }
-
- if (GrGLProgramDesc::kAttribute_ColorInput == header.fCoverageInput) {
- this->addAttribute(GrShaderVar(coverage_attribute_name(),
- kVec4f_GrSLType,
- GrShaderVar::kAttribute_TypeModifier));
- const char *vsName, *fsName;
- fFullProgramBuilder->addVarying(kVec4f_GrSLType, "Coverage", &vsName, &fsName);
- this->codeAppendf("%s = %s;", vsName, coverage_attribute_name());
- *coverage = fsName;
+bool GrGLVertexBuilder::addAttribute(const GrShaderVar& var) {
+ SkASSERT(GrShaderVar::kAttribute_TypeModifier == var.getTypeModifier());
+ for (int i = 0; i < fInputs.count(); ++i) {
+ const GrGLShaderVar& attr = fInputs[i];
+ // if attribute already added, don't add it again
+ if (attr.getName().equals(var.getName())) {
+ return false;
+ }
}
- fEffectAttribOffset = fInputs.count();
+ fInputs.push_back(var);
+ return true;
}
« no previous file with comments | « src/gpu/gl/builders/GrGLVertexShaderBuilder.h ('k') | tests/GLProgramsTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698