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

Side by Side Diff: src/gpu/gl/builders/GrGLFullProgramBuilder.cpp

Issue 582963002: Solo gp (Closed) Base URL: https://skia.googlesource.com/skia.git@no_peb
Patch Set: fix Created 6 years, 3 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
OLDNEW
1 /* 1 /*
2 * Copyright 2014 Google Inc. 2 * Copyright 2014 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 "GrGLFullProgramBuilder.h" 8 #include "GrGLFullProgramBuilder.h"
9 #include "../GrGLGeometryProcessor.h" 9 #include "../GrGLGeometryProcessor.h"
10 #include "../GrGpuGL.h" 10 #include "../GrGpuGL.h"
11 11
12 GrGLFullProgramBuilder::GrGLFullProgramBuilder(GrGpuGL* gpu, 12 GrGLFullProgramBuilder::GrGLFullProgramBuilder(GrGpuGL* gpu,
13 const GrGLProgramDesc& desc) 13 const GrGLProgramDesc& desc)
14 : INHERITED(gpu, desc) 14 : INHERITED(gpu, desc)
15 , fGLGeometryProcessorEmitter(this)
15 , fGS(this) 16 , fGS(this)
16 , fVS(this) { 17 , fVS(this) {
17 } 18 }
18 19
19 void 20 void
20 GrGLFullProgramBuilder::createAndEmitEffects(const GrEffectStage* geometryProces sor, 21 GrGLFullProgramBuilder::createAndEmitEffects(const GrGeometryStage* geometryProc essor,
21 const GrEffectStage* colorStages[], 22 const GrFragmentStage* colorStages[ ],
22 const GrEffectStage* coverageStages [], 23 const GrFragmentStage* coverageStag es[],
23 GrGLSLExpr4* inputColor, 24 GrGLSLExpr4* inputColor,
24 GrGLSLExpr4* inputCoverage) { 25 GrGLSLExpr4* inputCoverage) {
25 fVS.emitCodeBeforeEffects(inputColor, inputCoverage); 26 fVS.emitCodeBeforeEffects(inputColor, inputCoverage);
26 27
27 /////////////////////////////////////////////////////////////////////////// 28 ///////////////////////////////////////////////////////////////////////////
28 // emit the per-effect code for both color and coverage effects 29 // emit the per-effect code for both color and coverage effects
29 30
30 bool useLocalCoords = this->getVertexShaderBuilder()->hasExplicitLocalCoords ();
31 EffectKeyProvider colorKeyProvider(&this->desc(), EffectKeyProvider::kColor_ EffectType); 31 EffectKeyProvider colorKeyProvider(&this->desc(), EffectKeyProvider::kColor_ EffectType);
32 fColorEffects.reset(this->onCreateAndEmitEffects(colorStages, 32 fColorEffects.reset(this->onCreateAndEmitEffects(colorStages,
33 this->desc().numColorEffect s(), 33 this->desc().numColorEffect s(),
34 colorKeyProvider, 34 colorKeyProvider,
35 inputColor)); 35 inputColor));
36 36
37 if (geometryProcessor) { 37 if (geometryProcessor) {
38 const GrGeometryProcessor& gp = *geometryProcessor->getGeometryProcessor ();
39 fGLGeometryProcessorEmitter.set(&gp);
40 fEffectEmitter = &fGLGeometryProcessorEmitter;
41 fVS.emitAttributes(gp);
38 GrGLSLExpr4 gpInputCoverage = *inputCoverage; 42 GrGLSLExpr4 gpInputCoverage = *inputCoverage;
39 GrGLSLExpr4 gpOutputCoverage; 43 GrGLSLExpr4 gpOutputCoverage;
40 EffectKeyProvider gpKeyProvider(&this->desc(), 44 EffectKeyProvider gpKeyProvider(&this->desc(),
41 EffectKeyProvider::kGeometryProcessor_EffectType); 45 EffectKeyProvider::kGeometryProcessor_EffectType);
46 bool useLocalCoords = this->getVertexShaderBuilder()->hasExplicitLocalCo ords();
42 fProgramEffects.reset(SkNEW_ARGS(GrGLVertexProgramEffects, (1, useLocalC oords))); 47 fProgramEffects.reset(SkNEW_ARGS(GrGLVertexProgramEffects, (1, useLocalC oords)));
43 this->INHERITED::emitEffect(*geometryProcessor, 0, gpKeyProvider, &gpInp utCoverage, 48 this->INHERITED::emitEffect(*geometryProcessor, 0, gpKeyProvider, &gpInp utCoverage,
44 &gpOutputCoverage); 49 &gpOutputCoverage);
45 fGeometryProcessor.reset(fProgramEffects.detach()); 50 fGeometryProcessor.reset(fProgramEffects.detach());
46 *inputCoverage = gpOutputCoverage; 51 *inputCoverage = gpOutputCoverage;
47 } 52 }
48 53
49 EffectKeyProvider coverageKeyProvider(&this->desc(), EffectKeyProvider::kCov erage_EffectType); 54 EffectKeyProvider coverageKeyProvider(&this->desc(), EffectKeyProvider::kCov erage_EffectType);
50 fCoverageEffects.reset(this->onCreateAndEmitEffects(coverageStages, 55 fCoverageEffects.reset(this->onCreateAndEmitEffects(coverageStages,
51 this->desc().numCoverage Effects(), 56 this->desc().numCoverage Effects(),
(...skipping 27 matching lines...) Expand all
79 const char* name, 84 const char* name,
80 const char** vsOutName, 85 const char** vsOutName,
81 const char** fsInName) { 86 const char** fsInName) {
82 addVarying(type, name, vsOutName, fsInName); 87 addVarying(type, name, vsOutName, fsInName);
83 SeparableVaryingInfo& varying = fSeparableVaryingInfos.push_back(); 88 SeparableVaryingInfo& varying = fSeparableVaryingInfos.push_back();
84 varying.fVariable = fFS.fInputs.back(); 89 varying.fVariable = fFS.fInputs.back();
85 return VaryingHandle::CreateFromSeparableVaryingIndex(fSeparableVaryingInfos .count() - 1); 90 return VaryingHandle::CreateFromSeparableVaryingIndex(fSeparableVaryingInfos .count() - 1);
86 } 91 }
87 92
88 GrGLProgramEffects* GrGLFullProgramBuilder::onCreateAndEmitEffects( 93 GrGLProgramEffects* GrGLFullProgramBuilder::onCreateAndEmitEffects(
89 const GrEffectStage* effectStages[], 94 const GrFragmentStage* effectStages[],
90 int effectCnt, 95 int effectCnt,
91 const GrGLProgramDesc::EffectKeyProvider& keyProvider, 96 const GrGLProgramDesc::EffectKeyProvider& keyProvider,
92 GrGLSLExpr4* inOutFSColor) { 97 GrGLSLExpr4* inOutFSColor) {
93 fProgramEffects.reset(SkNEW_ARGS(GrGLVertexProgramEffects, 98 fProgramEffects.reset(SkNEW_ARGS(GrGLVertexProgramEffects,
94 (effectCnt, 99 (effectCnt,
95 this->getVertexShaderBuilder()->hasExplicitLoc alCoords()))); 100 this->getVertexShaderBuilder()->hasExplicitLoc alCoords())));
96 this->INHERITED::createAndEmitEffects(effectStages, 101 this->INHERITED::createAndEmitEffects(effectStages,
97 effectCnt, 102 effectCnt,
98 keyProvider, 103 keyProvider,
99 inOutFSColor); 104 inOutFSColor);
100 return fProgramEffects.detach(); 105 return fProgramEffects.detach();
101 } 106 }
102 107
103 void GrGLFullProgramBuilder::emitEffect(const GrEffectStage& stage, 108 void GrGLFullProgramBuilder::emitEffect(const GrProcessorStage& stage,
104 const GrEffectKey& key, 109 const GrProcessorKey& key,
105 const char* outColor, 110 const char* outColor,
106 const char* inColor, 111 const char* inColor,
107 int stageIndex) { 112 int stageIndex) {
108 SkASSERT(fProgramEffects.get()); 113 SkASSERT(fProgramEffects.get());
109 const GrEffect& effect = *stage.getEffect(); 114 const GrProcessor& effect = *stage.getProcessor();
110 SkSTArray<2, GrGLEffect::TransformedCoords> coords(effect.numTransforms()); 115 SkSTArray<2, GrGLProcessor::TransformedCoords> coords(effect.numTransforms() );
111 SkSTArray<4, GrGLEffect::TextureSampler> samplers(effect.numTextures()); 116 SkSTArray<4, GrGLProcessor::TextureSampler> samplers(effect.numTextures());
112 117
113 fVS.emitAttributes(stage);
114 this->emitTransforms(stage, &coords); 118 this->emitTransforms(stage, &coords);
115 this->emitSamplers(effect, &samplers); 119 this->emitSamplers(effect, &samplers);
116 120
117 GrGLEffect* glEffect = effect.getFactory().createGLInstance(effect); 121 SkASSERT(fEffectEmitter);
122 GrGLProcessor* glEffect = fEffectEmitter->createGLInstance();
118 fProgramEffects->addEffect(glEffect); 123 fProgramEffects->addEffect(glEffect);
119 124
120 // Enclose custom code in a block to avoid namespace conflicts 125 // Enclose custom code in a block to avoid namespace conflicts
121 SkString openBrace; 126 SkString openBrace;
122 openBrace.printf("{ // Stage %d: %s\n", stageIndex, glEffect->name()); 127 openBrace.printf("{ // Stage %d: %s\n", stageIndex, glEffect->name());
123 fFS.codeAppend(openBrace.c_str()); 128 fFS.codeAppend(openBrace.c_str());
124 fVS.codeAppend(openBrace.c_str()); 129 fVS.codeAppend(openBrace.c_str());
125 130
126 if (glEffect->isVertexEffect()) { 131 fEffectEmitter->emit(key, outColor, inColor, coords, samplers);
127 GrGLGeometryProcessor* vertexEffect = static_cast<GrGLGeometryProcessor* >(glEffect);
128 vertexEffect->emitCode(this, effect, key, outColor, inColor, coords, sam plers);
129 } else {
130 glEffect->emitCode(this, effect, key, outColor, inColor, coords, sampler s);
131 }
132 132
133 fVS.codeAppend("\t}\n"); 133 fVS.codeAppend("\t}\n");
134 fFS.codeAppend("\t}\n"); 134 fFS.codeAppend("\t}\n");
135 } 135 }
136 136
137 void GrGLFullProgramBuilder::emitTransforms(const GrEffectStage& effectStage, 137 void GrGLFullProgramBuilder::emitTransforms(const GrProcessorStage& effectStage,
138 GrGLEffect::TransformedCoordsArray* outCoords) { 138 GrGLProcessor::TransformedCoordsArra y* outCoords) {
139 SkTArray<GrGLVertexProgramEffects::Transform, true>& transforms = 139 SkTArray<GrGLVertexProgramEffects::Transform, true>& transforms =
140 fProgramEffects->addTransforms(); 140 fProgramEffects->addTransforms();
141 const GrEffect* effect = effectStage.getEffect(); 141 const GrProcessor* effect = effectStage.getProcessor();
142 int numTransforms = effect->numTransforms(); 142 int numTransforms = effect->numTransforms();
143 transforms.push_back_n(numTransforms); 143 transforms.push_back_n(numTransforms);
144 144
145 SkTArray<GrGLVertexProgramEffects::PathTransform, true>* pathTransforms = NU LL; 145 SkTArray<GrGLVertexProgramEffects::PathTransform, true>* pathTransforms = NU LL;
146 const GrGLCaps* glCaps = this->ctxInfo().caps(); 146 const GrGLCaps* glCaps = this->ctxInfo().caps();
147 if (glCaps->pathRenderingSupport() && 147 if (glCaps->pathRenderingSupport() &&
148 this->gpu()->glPathRendering()->texturingMode() == 148 this->gpu()->glPathRendering()->texturingMode() ==
149 GrGLPathRendering::SeparableShaders_TexturingMode) { 149 GrGLPathRendering::SeparableShaders_TexturingMode) {
150 pathTransforms = &fProgramEffects->addPathTransforms(); 150 pathTransforms = &fProgramEffects->addPathTransforms();
151 pathTransforms->push_back_n(numTransforms); 151 pathTransforms->push_back_n(numTransforms);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 fVS.localCoordsAttribute(); 192 fVS.localCoordsAttribute();
193 // varying = matrix * coords (logically) 193 // varying = matrix * coords (logically)
194 SkASSERT(kVec2f_GrSLType == varyingType || kVec3f_GrSLType == varyingTyp e); 194 SkASSERT(kVec2f_GrSLType == varyingType || kVec3f_GrSLType == varyingTyp e);
195 if (kVec2f_GrSLType == varyingType) { 195 if (kVec2f_GrSLType == varyingType) {
196 fVS.codeAppendf("%s = (%s * vec3(%s, 1)).xy;", 196 fVS.codeAppendf("%s = (%s * vec3(%s, 1)).xy;",
197 vsVaryingName, uniName, coords.c_str()); 197 vsVaryingName, uniName, coords.c_str());
198 } else { 198 } else {
199 fVS.codeAppendf("%s = %s * vec3(%s, 1);", 199 fVS.codeAppendf("%s = %s * vec3(%s, 1);",
200 vsVaryingName, uniName, coords.c_str()); 200 vsVaryingName, uniName, coords.c_str());
201 } 201 }
202 SkNEW_APPEND_TO_TARRAY(outCoords, GrGLEffect::TransformedCoords, 202 SkNEW_APPEND_TO_TARRAY(outCoords, GrGLProcessor::TransformedCoords,
203 (SkString(fsVaryingName), varyingType)); 203 (SkString(fsVaryingName), varyingType));
204 } 204 }
205 } 205 }
206 206
207 bool GrGLFullProgramBuilder::compileAndAttachShaders(GrGLuint programId, 207 bool GrGLFullProgramBuilder::compileAndAttachShaders(GrGLuint programId,
208 SkTDArray<GrGLuint>* shader Ids) const { 208 SkTDArray<GrGLuint>* shader Ids) const {
209 return INHERITED::compileAndAttachShaders(programId, shaderIds) 209 return INHERITED::compileAndAttachShaders(programId, shaderIds)
210 && fVS.compileAndAttachShaders(programId, shaderIds) 210 && fVS.compileAndAttachShaders(programId, shaderIds)
211 #if GR_GL_EXPERIMENTAL_GS 211 #if GR_GL_EXPERIMENTAL_GS
212 && (!desc().getHeader().fExperimentalGS 212 && (!desc().getHeader().fExperimentalGS
213 || fGS.compileAndAttachShaders(programId, shaderIds)) 213 || fGS.compileAndAttachShaders(programId, shaderIds))
214 #endif 214 #endif
215 ; 215 ;
216 } 216 }
217 217
218 void GrGLFullProgramBuilder::bindProgramLocations(GrGLuint programId) { 218 void GrGLFullProgramBuilder::bindProgramLocations(GrGLuint programId) {
219 fVS.bindProgramLocations(programId); 219 fVS.bindProgramLocations(programId);
220 INHERITED::bindProgramLocations(programId); 220 INHERITED::bindProgramLocations(programId);
221 } 221 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698