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

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

Issue 635533005: Revert of 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 unified diff | Download patch
« no previous file with comments | « src/gpu/gl/GrGLProgramEffects.h ('k') | src/gpu/gl/GrGpuGL.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 /*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8 #include "GrGLProgramEffects.h"
9 #include "gl/GrGLProcessor.h"
10 #include "gl/GrGLPathRendering.h"
11 #include "gl/builders/GrGLFullProgramBuilder.h"
12 #include "gl/builders/GrGLFragmentOnlyProgramBuilder.h"
13 #include "gl/GrGLGeometryProcessor.h"
14 #include "gl/GrGpuGL.h"
15
16 typedef GrGLProcessor::TransformedCoords TransformedCoords;
17 typedef GrGLProcessor::TransformedCoordsArray TransformedCoordsArray;
18 typedef GrGLProcessor::TextureSampler TextureSampler;
19 typedef GrGLProcessor::TextureSamplerArray TextureSamplerArray;
20
21 namespace {
22 /**
23 * Retrieves the final matrix that a transform needs to apply to its source coor ds.
24 */
25 SkMatrix get_transform_matrix(const GrProcessorStage& effectStage,
26 bool useExplicitLocalCoords,
27 int transformIdx) {
28 const GrCoordTransform& coordTransform = effectStage.getProcessor()->coordTr ansform(transformIdx);
29 SkMatrix combined;
30
31 if (kLocal_GrCoordSet == coordTransform.sourceCoords()) {
32 // If we have explicit local coords then we shouldn't need a coord chang e.
33 const SkMatrix& ccm =
34 useExplicitLocalCoords ? SkMatrix::I() : effectStage.getCoordCha ngeMatrix();
35 combined.setConcat(coordTransform.getMatrix(), ccm);
36 } else {
37 combined = coordTransform.getMatrix();
38 }
39 if (coordTransform.reverseY()) {
40 // combined.postScale(1,-1);
41 // combined.postTranslate(0,1);
42 combined.set(SkMatrix::kMSkewY,
43 combined[SkMatrix::kMPersp0] - combined[SkMatrix::kMSkewY]);
44 combined.set(SkMatrix::kMScaleY,
45 combined[SkMatrix::kMPersp1] - combined[SkMatrix::kMScaleY]);
46 combined.set(SkMatrix::kMTransY,
47 combined[SkMatrix::kMPersp2] - combined[SkMatrix::kMTransY]);
48 }
49 return combined;
50 }
51 }
52
53 ////////////////////////////////////////////////////////////////////////////////
54
55 GrGLProgramEffects::~GrGLProgramEffects() {
56 int numEffects = fGLProcessors.count();
57 for (int e = 0; e < numEffects; ++e) {
58 SkDELETE(fGLProcessors[e]);
59 }
60 }
61
62 void GrGLProgramEffects::initSamplers(const GrGLProgramDataManager& programResou rceManager, int* texUnitIdx) {
63 int numEffects = fGLProcessors.count();
64 SkASSERT(numEffects == fSamplers.count());
65 for (int e = 0; e < numEffects; ++e) {
66 SkTArray<Sampler, true>& samplers = fSamplers[e];
67 int numSamplers = samplers.count();
68 for (int s = 0; s < numSamplers; ++s) {
69 SkASSERT(samplers[s].fUniform.isValid());
70 programResourceManager.setSampler(samplers[s].fUniform, *texUnitIdx) ;
71 samplers[s].fTextureUnit = (*texUnitIdx)++;
72 }
73 }
74 }
75
76 void GrGLProgramEffects::bindTextures(GrGpuGL* gpu, const GrProcessor& effect, i nt effectIdx) {
77 const SkTArray<Sampler, true>& samplers = fSamplers[effectIdx];
78 int numSamplers = samplers.count();
79 SkASSERT(numSamplers == effect.numTextures());
80 for (int s = 0; s < numSamplers; ++s) {
81 SkASSERT(samplers[s].fTextureUnit >= 0);
82 const GrTextureAccess& textureAccess = effect.textureAccess(s);
83 gpu->bindTexture(samplers[s].fTextureUnit,
84 textureAccess.getParams(),
85 static_cast<GrGLTexture*>(textureAccess.getTexture()));
86 }
87 }
88
89 ////////////////////////////////////////////////////////////////////////////////
90
91 void GrGLVertexProgramEffects::setData(GrGpuGL* gpu,
92 GrGpu::DrawType drawType,
93 const GrGLProgramDataManager& programData Manager,
94 const GrGeometryStage* effectStages) {
95 SkASSERT(1 == fGLProcessors.count());
96 SkASSERT(1 == fTransforms.count());
97 SkASSERT(1 == fSamplers.count());
98 this->setDataInternal(gpu, drawType, programDataManager, *effectStages, 0);
99 }
100
101 void GrGLVertexProgramEffects::setData(GrGpuGL* gpu,
102 GrGpu::DrawType drawType,
103 const GrGLProgramDataManager& programData Manager,
104 const GrFragmentStage* effectStages[]) {
105 int numEffects = fGLProcessors.count();
106 SkASSERT(numEffects == fTransforms.count());
107 SkASSERT(numEffects == fSamplers.count());
108 for (int e = 0; e < numEffects; ++e) {
109 this->setDataInternal(gpu, drawType, programDataManager, *effectStages[e ], e);
110 }
111 }
112
113 void GrGLVertexProgramEffects::setDataInternal(GrGpuGL* gpu,
114 GrGpu::DrawType drawType,
115 const GrGLProgramDataManager& pro gramDataManager,
116 const GrProcessorStage& effectSta ge,
117 int index) {
118 const GrProcessor& effect = *effectStage.getProcessor();
119 fGLProcessors[index]->setData(programDataManager, effect);
120 if (GrGpu::IsPathRenderingDrawType(drawType)) {
121 this->setPathTransformData(gpu, programDataManager, effectStage, index);
122 } else {
123 this->setTransformData(gpu, programDataManager, effectStage, index);
124 }
125 this->bindTextures(gpu, effect, index);
126 }
127
128 void GrGLVertexProgramEffects::setTransformData(GrGpuGL* gpu,
129 const GrGLProgramDataManager& pd man,
130 const GrProcessorStage& effectSt age,
131 int effectIdx) {
132 SkTArray<Transform, true>& transforms = fTransforms[effectIdx];
133 int numTransforms = transforms.count();
134 SkASSERT(numTransforms == effectStage.getProcessor()->numTransforms());
135 for (int t = 0; t < numTransforms; ++t) {
136 SkASSERT(transforms[t].fHandle.isValid());
137 const SkMatrix& matrix = get_transform_matrix(effectStage, fHasExplicitL ocalCoords, t);
138 if (!transforms[t].fCurrentValue.cheapEqualTo(matrix)) {
139 pdman.setSkMatrix(transforms[t].fHandle, matrix);
140 transforms[t].fCurrentValue = matrix;
141 }
142 }
143 }
144
145 void GrGLVertexProgramEffects::setPathTransformData(GrGpuGL* gpu,
146 const GrGLProgramDataManager & pdman,
147 const GrProcessorStage& effe ctStage,
148 int effectIdx) {
149 SkTArray<PathTransform, true>& transforms = fPathTransforms[effectIdx];
150 int numTransforms = transforms.count();
151 SkASSERT(numTransforms == effectStage.getProcessor()->numTransforms());
152 for (int t = 0; t < numTransforms; ++t) {
153 SkASSERT(transforms[t].fHandle.isValid());
154 const SkMatrix& transform = get_transform_matrix(effectStage, fHasExplic itLocalCoords, t);
155 if (transforms[t].fCurrentValue.cheapEqualTo(transform)) {
156 continue;
157 }
158 transforms[t].fCurrentValue = transform;
159 switch (transforms[t].fType) {
160 case kVec2f_GrSLType:
161 pdman.setProgramPathFragmentInputTransform(transforms[t].fHandle , 2, transform);
162 break;
163 case kVec3f_GrSLType:
164 pdman.setProgramPathFragmentInputTransform(transforms[t].fHandle , 3, transform);
165 break;
166 default:
167 SkFAIL("Unexpected matrix type.");
168 }
169 }
170 }
171
172 ////////////////////////////////////////////////////////////////////////////////
173
174 void GrGLPathTexGenProgramEffects::setData(GrGpuGL* gpu,
175 GrGpu::DrawType,
176 const GrGLProgramDataManager& pdman,
177 const GrFragmentStage* effectStages[] ) {
178 int numEffects = fGLProcessors.count();
179 SkASSERT(numEffects == fTransforms.count());
180 SkASSERT(numEffects == fSamplers.count());
181 for (int e = 0; e < numEffects; ++e) {
182 const GrProcessorStage& effectStage = *effectStages[e];
183 const GrProcessor& effect = *effectStage.getProcessor();
184 fGLProcessors[e]->setData(pdman, effect);
185 this->setPathTexGenState(gpu, effectStage, e);
186 this->bindTextures(gpu, effect, e);
187 }
188 }
189
190 void GrGLPathTexGenProgramEffects::setPathTexGenState(GrGpuGL* gpu,
191 const GrProcessorStage& effectStag e,
192 int effectIdx) {
193 int texCoordIndex = fTransforms[effectIdx].fTexCoordIndex;
194 int numTransforms = effectStage.getProcessor()->numTransforms();
195 for (int t = 0; t < numTransforms; ++t) {
196 const SkMatrix& transform = get_transform_matrix(effectStage, false, t);
197 GrGLPathRendering::PathTexGenComponents components =
198 GrGLPathRendering::kST_PathTexGenComponents;
199 if (effectStage.isPerspectiveCoordTransform(t, false)) {
200 components = GrGLPathRendering::kSTR_PathTexGenComponents;
201 }
202 gpu->glPathRendering()->enablePathTexGen(texCoordIndex++, components, tr ansform);
203 }
204 }
OLDNEW
« no previous file with comments | « src/gpu/gl/GrGLProgramEffects.h ('k') | src/gpu/gl/GrGpuGL.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698