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

Side by Side Diff: src/gpu/gl/GrGLProgram.cpp

Issue 306663003: Move all code generation from GrGLProgram to GrGLShaderBuilder (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: line wraps Created 6 years, 6 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/gpu/gl/GrGLProgram.h ('k') | src/gpu/gl/GrGLShaderBuilder.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2011 Google Inc. 2 * Copyright 2011 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "GrGLProgram.h" 8 #include "GrGLProgram.h"
9 9
10 #include "GrAllocator.h" 10 #include "GrAllocator.h"
(...skipping 28 matching lines...) Expand all
39 : fGpu(gpu) 39 : fGpu(gpu)
40 , fUniformManager(gpu) 40 , fUniformManager(gpu)
41 , fHasVertexShader(false) 41 , fHasVertexShader(false)
42 , fNumTexCoordSets(0) { 42 , fNumTexCoordSets(0) {
43 fDesc = desc; 43 fDesc = desc;
44 fProgramID = 0; 44 fProgramID = 0;
45 45
46 fDstCopyTexUnit = -1; 46 fDstCopyTexUnit = -1;
47 47
48 fColor = GrColor_ILLEGAL; 48 fColor = GrColor_ILLEGAL;
49 49
robertphillips 2014/05/28 20:08:46 Does it make sense to have a GenProgramOutput in t
bsalomon 2014/05/28 20:09:50 Maybe... I'm working on the next cleanup CL now.
50 if (fDesc.getHeader().fHasVertexCode || 50 GrGLShaderBuilder::GenProgramOutput output;
51 !fGpu->shouldUseFixedFunctionTexturing()) { 51
52 GrGLFullShaderBuilder fullBuilder(fGpu, fUniformManager, fDesc); 52 if (GrGLShaderBuilder::GenProgram(gpu, fUniformManager, desc, colorStages, c overageStages,
53 if (this->genProgram(&fullBuilder, colorStages, coverageStages)) { 53 &output)) {
54 fUniformHandles.fViewMatrixUni = fullBuilder.getViewMatrixUniform(); 54 fProgramID = output.fProgramID;
55 fUniformHandles.fRTAdjustmentUni = fullBuilder.getRTAdjustmentVecUni form(); 55 fUniformHandles = output.fUniformHandles;
56 fHasVertexShader = true; 56 fColorEffects.reset(output.fColorEffects);
57 } 57 fCoverageEffects.reset(output.fCoverageEffects);
58 } else { 58 fHasVertexShader = output.fHasVS;
59 GrGLFragmentOnlyShaderBuilder fragmentOnlyBuilder(fGpu, fUniformManager, fDesc); 59 fNumTexCoordSets = output.fNumTexCoordSets;
60 if (this->genProgram(&fragmentOnlyBuilder, colorStages, coverageStages)) { 60 fGpu = gpu;
61 fNumTexCoordSets = fragmentOnlyBuilder.getNumTexCoordSets(); 61 this->initSamplerUniforms();
62 }
63 } 62 }
64 } 63 }
65 64
66 GrGLProgram::~GrGLProgram() { 65 GrGLProgram::~GrGLProgram() {
67 if (fProgramID) { 66 if (fProgramID) {
68 GL_CALL(DeleteProgram(fProgramID)); 67 GL_CALL(DeleteProgram(fProgramID));
69 } 68 }
70 } 69 }
71 70
72 void GrGLProgram::abandon() { 71 void GrGLProgram::abandon() {
(...skipping 15 matching lines...) Expand all
88 case GrGLProgramDesc::kCombineWithDst_CoverageOutput: 87 case GrGLProgramDesc::kCombineWithDst_CoverageOutput:
89 // We should only have set this if the blend was specified as (1, 0) 88 // We should only have set this if the blend was specified as (1, 0)
90 SkASSERT(kOne_GrBlendCoeff == *srcCoeff && kZero_GrBlendCoeff == *ds tCoeff); 89 SkASSERT(kOne_GrBlendCoeff == *srcCoeff && kZero_GrBlendCoeff == *ds tCoeff);
91 break; 90 break;
92 default: 91 default:
93 SkFAIL("Unexpected coverage output"); 92 SkFAIL("Unexpected coverage output");
94 break; 93 break;
95 } 94 }
96 } 95 }
97 96
98 bool GrGLProgram::genProgram(GrGLShaderBuilder* builder,
99 const GrEffectStage* colorStages[],
100 const GrEffectStage* coverageStages[]) {
101 SkASSERT(0 == fProgramID);
102
103 const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader();
104
105 // incoming color to current stage being processed.
106 GrGLSLExpr4 inColor = builder->getInputColor();
107
108 fColorEffects.reset(
109 builder->createAndEmitEffects(colorStages,
110 fDesc.effectKeys(),
111 fDesc.numColorEffects(),
112 &inColor));
113
114 ///////////////////////////////////////////////////////////////////////////
115 // compute the partial coverage
116 GrGLSLExpr4 inCoverage = builder->getInputCoverage();
117
118 fCoverageEffects.reset(
119 builder->createAndEmitEffects(coverageStages,
120 fDesc.getEffectKeys() + fDesc.numColorEffe cts(),
121 fDesc.numCoverageEffects(),
122 &inCoverage));
123
124 if (GrGLProgramDesc::CoverageOutputUsesSecondaryOutput(header.fCoverageOutpu t)) {
125 const char* secondaryOutputName = builder->enableSecondaryOutput();
126
127 // default coeff to ones for kCoverage_DualSrcOutput
128 GrGLSLExpr4 coeff(1);
129 if (GrGLProgramDesc::kSecondaryCoverageISA_CoverageOutput == header.fCov erageOutput) {
130 // Get (1-A) into coeff
131 coeff = GrGLSLExpr4::VectorCast(GrGLSLExpr1(1) - inColor.a());
132 } else if (GrGLProgramDesc::kSecondaryCoverageISC_CoverageOutput == head er.fCoverageOutput) {
133 // Get (1-RGBA) into coeff
134 coeff = GrGLSLExpr4(1) - inColor;
135 }
136 // Get coeff * coverage into modulate and then write that to the dual so urce output.
137 builder->fsCodeAppendf("\t%s = %s;\n", secondaryOutputName, (coeff * inC overage).c_str());
138 }
139
140 ///////////////////////////////////////////////////////////////////////////
141 // combine color and coverage as frag color
142
143 // Get "color * coverage" into fragColor
144 GrGLSLExpr4 fragColor = inColor * inCoverage;
145 // Now tack on "+(1-coverage)dst onto the frag color if we were asked to do so.
146 if (GrGLProgramDesc::kCombineWithDst_CoverageOutput == header.fCoverageOutpu t) {
147 GrGLSLExpr4 dstCoeff = GrGLSLExpr4(1) - inCoverage;
148
149 GrGLSLExpr4 dstContribution = dstCoeff * GrGLSLExpr4(builder->dstColor() );
150
151 fragColor = fragColor + dstContribution;
152 }
153 builder->fsCodeAppendf("\t%s = %s;\n", builder->getColorOutputName(), fragCo lor.c_str());
154
155 if (!builder->finish(&fProgramID)) {
156 return false;
157 }
158
159 fUniformHandles.fRTHeightUni = builder->getRTHeightUniform();
160 fUniformHandles.fDstCopyTopLeftUni = builder->getDstCopyTopLeftUniform();
161 fUniformHandles.fDstCopyScaleUni = builder->getDstCopyScaleUniform();
162 fUniformHandles.fColorUni = builder->getColorUniform();
163 fUniformHandles.fCoverageUni = builder->getCoverageUniform();
164 fUniformHandles.fDstCopySamplerUni = builder->getDstCopySamplerUniform();
165 // This must be called after we set fDstCopySamplerUni above.
166 this->initSamplerUniforms();
167
168 return true;
169 }
170
171 void GrGLProgram::initSamplerUniforms() { 97 void GrGLProgram::initSamplerUniforms() {
172 GL_CALL(UseProgram(fProgramID)); 98 GL_CALL(UseProgram(fProgramID));
173 GrGLint texUnitIdx = 0; 99 GrGLint texUnitIdx = 0;
174 if (fUniformHandles.fDstCopySamplerUni.isValid()) { 100 if (fUniformHandles.fDstCopySamplerUni.isValid()) {
175 fUniformManager.setSampler(fUniformHandles.fDstCopySamplerUni, texUnitId x); 101 fUniformManager.setSampler(fUniformHandles.fDstCopySamplerUni, texUnitId x);
176 fDstCopyTexUnit = texUnitIdx++; 102 fDstCopyTexUnit = texUnitIdx++;
177 } 103 }
178 fColorEffects->initSamplers(fUniformManager, &texUnitIdx); 104 fColorEffects->initSamplers(fUniformManager, &texUnitIdx);
179 fCoverageEffects->initSamplers(fUniformManager, &texUnitIdx); 105 fCoverageEffects->initSamplers(fUniformManager, &texUnitIdx);
180 } 106 }
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 269
344 GrGLfloat viewMatrix[3 * 3]; 270 GrGLfloat viewMatrix[3 * 3];
345 fMatrixState.getGLMatrix<3>(viewMatrix); 271 fMatrixState.getGLMatrix<3>(viewMatrix);
346 fUniformManager.setMatrix3f(fUniformHandles.fViewMatrixUni, viewMatrix); 272 fUniformManager.setMatrix3f(fUniformHandles.fViewMatrixUni, viewMatrix);
347 273
348 GrGLfloat rtAdjustmentVec[4]; 274 GrGLfloat rtAdjustmentVec[4];
349 fMatrixState.getRTAdjustmentVec(rtAdjustmentVec); 275 fMatrixState.getRTAdjustmentVec(rtAdjustmentVec);
350 fUniformManager.set4fv(fUniformHandles.fRTAdjustmentUni, 1, rtAdjustment Vec); 276 fUniformManager.set4fv(fUniformHandles.fRTAdjustmentUni, 1, rtAdjustment Vec);
351 } 277 }
352 } 278 }
OLDNEW
« no previous file with comments | « src/gpu/gl/GrGLProgram.h ('k') | src/gpu/gl/GrGLShaderBuilder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698