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

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

Issue 788733003: Make addUniform take a precision (Closed) Base URL: https://skia.googlesource.com/skia.git@move_prec
Patch Set: rebase Created 6 years 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 "GrGLProgramBuilder.h" 8 #include "GrGLProgramBuilder.h"
9 #include "gl/GrGLProgram.h" 9 #include "gl/GrGLProgram.h"
10 #include "gl/GrGLSLPrettyPrint.h" 10 #include "gl/GrGLSLPrettyPrint.h"
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 } 133 }
134 if (!fOutOfStage) { 134 if (!fOutOfStage) {
135 if (out->endsWith('_')) { 135 if (out->endsWith('_')) {
136 // Names containing "__" are reserved. 136 // Names containing "__" are reserved.
137 out->append("x"); 137 out->append("x");
138 } 138 }
139 out->appendf("_Stage%d", fStageIndex); 139 out->appendf("_Stage%d", fStageIndex);
140 } 140 }
141 } 141 }
142 142
143 GrGLProgramDataManager::UniformHandle GrGLProgramBuilder::addUniformArray(uint32 _t visibility, 143 GrGLProgramDataManager::UniformHandle GrGLProgramBuilder::addUniformArray(
144 GrSLTy pe type, 144 uint32_t visibil ity,
145 const char* name, 145 GrSLType type,
146 int co unt, 146 GrSLPrecision pr ecision,
147 const char** outName) { 147 const char* name ,
148 int count,
149 const char** out Name) {
148 SkASSERT(name && strlen(name)); 150 SkASSERT(name && strlen(name));
149 SkDEBUGCODE(static const uint32_t kVisibilityMask = kVertex_Visibility | kFr agment_Visibility); 151 SkDEBUGCODE(static const uint32_t kVisibilityMask = kVertex_Visibility | kFr agment_Visibility);
150 SkASSERT(0 == (~kVisibilityMask & visibility)); 152 SkASSERT(0 == (~kVisibilityMask & visibility));
151 SkASSERT(0 != visibility); 153 SkASSERT(0 != visibility);
154 SkASSERT(kDefault_GrSLPrecision == precision || GrSLTypeIsFloatType(type));
152 155
153 UniformInfo& uni = fUniforms.push_back(); 156 UniformInfo& uni = fUniforms.push_back();
154 uni.fVariable.setType(type); 157 uni.fVariable.setType(type);
155 uni.fVariable.setTypeModifier(GrGLShaderVar::kUniform_TypeModifier); 158 uni.fVariable.setTypeModifier(GrGLShaderVar::kUniform_TypeModifier);
156 // TODO this is a bit hacky, lets think of a better way. Basically we need to be able to use 159 // TODO this is a bit hacky, lets think of a better way. Basically we need to be able to use
157 // the uniform view matrix name in the GP, and the GP is immutable so it has to tell the PB 160 // the uniform view matrix name in the GP, and the GP is immutable so it has to tell the PB
158 // exactly what name it wants to use for the uniform view matrix. If we pre fix anythings, then 161 // exactly what name it wants to use for the uniform view matrix. If we pre fix anythings, then
159 // the names will mismatch. I think the correct solution is to have all GPs which need the 162 // the names will mismatch. I think the correct solution is to have all GPs which need the
160 // uniform view matrix, they should upload the view matrix in their setData along with regular 163 // uniform view matrix, they should upload the view matrix in their setData along with regular
161 // uniforms. 164 // uniforms.
162 char prefix = 'u'; 165 char prefix = 'u';
163 if ('u' == name[0]) { 166 if ('u' == name[0]) {
164 prefix = '\0'; 167 prefix = '\0';
165 } 168 }
166 this->nameVariable(uni.fVariable.accessName(), prefix, name); 169 this->nameVariable(uni.fVariable.accessName(), prefix, name);
167 uni.fVariable.setArrayCount(count); 170 uni.fVariable.setArrayCount(count);
168 uni.fVisibility = visibility; 171 uni.fVisibility = visibility;
169 172 uni.fVariable.setPrecision(precision);
170 // If it is visible in both the VS and FS, the precision must match.
171 // We declare a default FS precision, but not a default VS. So set the var
172 // to use the default FS precision.
173 if ((kVertex_Visibility | kFragment_Visibility) == visibility) {
174 // the fragment and vertex precisions must match
175 uni.fVariable.setPrecision(kDefault_GrSLPrecision);
176 }
177 173
178 if (outName) { 174 if (outName) {
179 *outName = uni.fVariable.c_str(); 175 *outName = uni.fVariable.c_str();
180 } 176 }
181 return GrGLProgramDataManager::UniformHandle::CreateFromUniformIndex(fUnifor ms.count() - 1); 177 return GrGLProgramDataManager::UniformHandle::CreateFromUniformIndex(fUnifor ms.count() - 1);
182 } 178 }
183 179
184 void GrGLProgramBuilder::appendUniformDecls(ShaderVisibility visibility, 180 void GrGLProgramBuilder::appendUniformDecls(ShaderVisibility visibility,
185 SkString* out) const { 181 SkString* out) const {
186 for (int i = 0; i < fUniforms.count(); ++i) { 182 for (int i = 0; i < fUniforms.count(); ++i) {
187 if (fUniforms[i].fVisibility & visibility) { 183 if (fUniforms[i].fVisibility & visibility) {
188 fUniforms[i].fVariable.appendDecl(this->ctxInfo(), out); 184 fUniforms[i].fVariable.appendDecl(this->ctxInfo(), out);
189 out->append(";\n"); 185 out->append(";\n");
190 } 186 }
191 } 187 }
192 } 188 }
193 189
194 const GrGLContextInfo& GrGLProgramBuilder::ctxInfo() const { 190 const GrGLContextInfo& GrGLProgramBuilder::ctxInfo() const {
195 return fGpu->ctxInfo(); 191 return fGpu->ctxInfo();
196 } 192 }
197 193
198 void GrGLProgramBuilder::setupUniformColorAndCoverageIfNeeded(GrGLSLExpr4* input Color, 194 void GrGLProgramBuilder::setupUniformColorAndCoverageIfNeeded(GrGLSLExpr4* input Color,
199 GrGLSLExpr1* input Coverage) { 195 GrGLSLExpr1* input Coverage) {
200 const GrProgramDesc::KeyHeader& header = this->header(); 196 const GrProgramDesc::KeyHeader& header = this->header();
201 if (GrProgramDesc::kUniform_ColorInput == header.fColorInput) { 197 if (GrProgramDesc::kUniform_ColorInput == header.fColorInput) {
202 const char* name; 198 const char* name;
203 fUniformHandles.fColorUni = 199 fUniformHandles.fColorUni =
204 this->addUniform(GrGLProgramBuilder::kFragment_Visibility, 200 this->addUniform(GrGLProgramBuilder::kFragment_Visibility,
205 kVec4f_GrSLType, 201 kVec4f_GrSLType, kDefault_GrSLPrecision,
206 "Color", 202 "Color", &name);
207 &name);
208 *inputColor = GrGLSLExpr4(name); 203 *inputColor = GrGLSLExpr4(name);
209 } else if (GrProgramDesc::kAllOnes_ColorInput == header.fColorInput) { 204 } else if (GrProgramDesc::kAllOnes_ColorInput == header.fColorInput) {
210 *inputColor = GrGLSLExpr4(1); 205 *inputColor = GrGLSLExpr4(1);
211 } 206 }
212 if (GrProgramDesc::kUniform_ColorInput == header.fCoverageInput) { 207 if (GrProgramDesc::kUniform_ColorInput == header.fCoverageInput) {
213 const char* name; 208 const char* name;
214 fUniformHandles.fCoverageUni = 209 fUniformHandles.fCoverageUni =
215 this->addUniform(GrGLProgramBuilder::kFragment_Visibility, 210 this->addUniform(GrGLProgramBuilder::kFragment_Visibility,
216 kFloat_GrSLType, 211 kFloat_GrSLType, kDefault_GrSLPrecision,
217 "Coverage", 212 "Coverage",&name);
218 &name);
219 *inputCoverage = GrGLSLExpr1(name); 213 *inputCoverage = GrGLSLExpr1(name);
220 } else if (GrProgramDesc::kAllOnes_ColorInput == header.fCoverageInput) { 214 } else if (GrProgramDesc::kAllOnes_ColorInput == header.fCoverageInput) {
221 *inputCoverage = GrGLSLExpr1(1); 215 *inputCoverage = GrGLSLExpr1(1);
222 } 216 }
223 } 217 }
224 218
225 void GrGLProgramBuilder::emitAndInstallProcs(GrGLSLExpr4* inputColor, GrGLSLExpr 4* inputCoverage) { 219 void GrGLProgramBuilder::emitAndInstallProcs(GrGLSLExpr4* inputColor, GrGLSLExpr 4* inputCoverage) {
226 if (fOptState.hasGeometryProcessor()) { 220 if (fOptState.hasGeometryProcessor()) {
227 fVS.setupUniformViewMatrix(); 221 fVS.setupUniformViewMatrix();
228 222
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 const char* uniName = "StageMatrix"; 384 const char* uniName = "StageMatrix";
391 GrSLType varyingType = stage.isPerspectiveCoordTransform(t) ? kVec3f_GrS LType : 385 GrSLType varyingType = stage.isPerspectiveCoordTransform(t) ? kVec3f_GrS LType :
392 kVec2f_GrS LType; 386 kVec2f_GrS LType;
393 SkString suffixedUniName; 387 SkString suffixedUniName;
394 if (0 != t) { 388 if (0 != t) {
395 suffixedUniName.append(uniName); 389 suffixedUniName.append(uniName);
396 suffixedUniName.appendf("_%i", t); 390 suffixedUniName.appendf("_%i", t);
397 uniName = suffixedUniName.c_str(); 391 uniName = suffixedUniName.c_str();
398 } 392 }
399 ifp->fTransforms[t].fHandle = this->addUniform(GrGLProgramBuilder::kVert ex_Visibility, 393 ifp->fTransforms[t].fHandle = this->addUniform(GrGLProgramBuilder::kVert ex_Visibility,
400 kMat33f_GrSLType, 394 kMat33f_GrSLType, kDefaul t_GrSLPrecision,
401 uniName, 395 uniName,
402 &uniName).toShaderBuilder Index(); 396 &uniName).toShaderBuilder Index();
403 397
404 const char* varyingName = "MatrixCoord"; 398 const char* varyingName = "MatrixCoord";
405 SkString suffixedVaryingName; 399 SkString suffixedVaryingName;
406 if (0 != t) { 400 if (0 != t) {
407 suffixedVaryingName.append(varyingName); 401 suffixedVaryingName.append(varyingName);
408 suffixedVaryingName.appendf("_%i", t); 402 suffixedVaryingName.appendf("_%i", t);
409 varyingName = suffixedVaryingName.c_str(); 403 varyingName = suffixedVaryingName.c_str();
410 } 404 }
(...skipping 13 matching lines...) Expand all
424 418
425 void GrGLProgramBuilder::emitSamplers(const GrProcessor& processor, 419 void GrGLProgramBuilder::emitSamplers(const GrProcessor& processor,
426 GrGLProcessor::TextureSamplerArray* outSam plers, 420 GrGLProcessor::TextureSamplerArray* outSam plers,
427 GrGLInstalledProc* ip) { 421 GrGLInstalledProc* ip) {
428 int numTextures = processor.numTextures(); 422 int numTextures = processor.numTextures();
429 ip->fSamplers.push_back_n(numTextures); 423 ip->fSamplers.push_back_n(numTextures);
430 SkString name; 424 SkString name;
431 for (int t = 0; t < numTextures; ++t) { 425 for (int t = 0; t < numTextures; ++t) {
432 name.printf("Sampler%d", t); 426 name.printf("Sampler%d", t);
433 ip->fSamplers[t].fUniform = this->addUniform(GrGLProgramBuilder::kFragme nt_Visibility, 427 ip->fSamplers[t].fUniform = this->addUniform(GrGLProgramBuilder::kFragme nt_Visibility,
434 kSampler2D_GrSLType, 428 kSampler2D_GrSLType, kDefau lt_GrSLPrecision,
435 name.c_str()); 429 name.c_str());
436 SkNEW_APPEND_TO_TARRAY(outSamplers, GrGLProcessor::TextureSampler, 430 SkNEW_APPEND_TO_TARRAY(outSamplers, GrGLProcessor::TextureSampler,
437 (ip->fSamplers[t].fUniform, processor.textureAcce ss(t))); 431 (ip->fSamplers[t].fUniform, processor.textureAcce ss(t)));
438 } 432 }
439 } 433 }
440 434
441 GrGLProgram* GrGLProgramBuilder::finalize() { 435 GrGLProgram* GrGLProgramBuilder::finalize() {
442 // verify we can get a program id 436 // verify we can get a program id
443 GrGLuint programID; 437 GrGLuint programID;
444 GL_CALL_RET(programID, CreateProgram()); 438 GL_CALL_RET(programID, CreateProgram());
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
547 } 541 }
548 542
549 //////////////////////////////////////////////////////////////////////////////// /////////////////// 543 //////////////////////////////////////////////////////////////////////////////// ///////////////////
550 544
551 GrGLInstalledFragProcs::~GrGLInstalledFragProcs() { 545 GrGLInstalledFragProcs::~GrGLInstalledFragProcs() {
552 int numProcs = fProcs.count(); 546 int numProcs = fProcs.count();
553 for (int e = 0; e < numProcs; ++e) { 547 for (int e = 0; e < numProcs; ++e) {
554 SkDELETE(fProcs[e]); 548 SkDELETE(fProcs[e]);
555 } 549 }
556 } 550 }
OLDNEW
« no previous file with comments | « src/gpu/gl/builders/GrGLProgramBuilder.h ('k') | src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698