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

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

Issue 1490283004: Create GLSLUniformHandler class for gpu backend (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: clean up public api of uniformhandler Created 5 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
« no previous file with comments | « src/gpu/gl/builders/GrGLProgramBuilder.h ('k') | src/gpu/glsl/GrGLSLFragmentProcessor.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 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 9
10 #include "GrAutoLocaleSetter.h" 10 #include "GrAutoLocaleSetter.h"
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 return pb->finalize(); 48 return pb->finalize();
49 } 49 }
50 50
51 ///////////////////////////////////////////////////////////////////////////// 51 /////////////////////////////////////////////////////////////////////////////
52 52
53 GrGLProgramBuilder::GrGLProgramBuilder(GrGLGpu* gpu, const DrawArgs& args) 53 GrGLProgramBuilder::GrGLProgramBuilder(GrGLGpu* gpu, const DrawArgs& args)
54 : INHERITED(args) 54 : INHERITED(args)
55 , fGeometryProcessor(nullptr) 55 , fGeometryProcessor(nullptr)
56 , fXferProcessor(nullptr) 56 , fXferProcessor(nullptr)
57 , fGpu(gpu) 57 , fGpu(gpu)
58 , fUniforms(kVarsPerBlock)
59 , fSamplerUniforms(4) 58 , fSamplerUniforms(4)
60 , fVaryingHandler(this) { 59 , fVaryingHandler(this)
61 } 60 , fUniformHandler(this) {
62
63 GrGLSLProgramDataManager::UniformHandle GrGLProgramBuilder::internalAddUniformAr ray(
64 uint32_t visibil ity,
65 GrSLType type,
66 GrSLPrecision pr ecision,
67 const char* name ,
68 bool mangleName,
69 int count,
70 const char** out Name) {
71 SkASSERT(name && strlen(name));
72 SkDEBUGCODE(static const uint32_t kVisibilityMask = kVertex_Visibility | kFr agment_Visibility);
73 SkASSERT(0 == (~kVisibilityMask & visibility));
74 SkASSERT(0 != visibility);
75 SkASSERT(kDefault_GrSLPrecision == precision || GrSLTypeIsFloatType(type));
76
77 UniformInfo& uni = fUniforms.push_back();
78 uni.fVariable.setType(type);
79 uni.fVariable.setTypeModifier(GrGLSLShaderVar::kUniform_TypeModifier);
80 // TODO this is a bit hacky, lets think of a better way. Basically we need to be able to use
81 // the uniform view matrix name in the GP, and the GP is immutable so it has to tell the PB
82 // exactly what name it wants to use for the uniform view matrix. If we pre fix anythings, then
83 // the names will mismatch. I think the correct solution is to have all GPs which need the
84 // uniform view matrix, they should upload the view matrix in their setData along with regular
85 // uniforms.
86 char prefix = 'u';
87 if ('u' == name[0]) {
88 prefix = '\0';
89 }
90 this->nameVariable(uni.fVariable.accessName(), prefix, name, mangleName);
91 uni.fVariable.setArrayCount(count);
92 uni.fVisibility = visibility;
93 uni.fVariable.setPrecision(precision);
94
95 if (outName) {
96 *outName = uni.fVariable.c_str();
97 }
98 return GrGLSLProgramDataManager::UniformHandle(fUniforms.count() - 1);
99 }
100
101 void GrGLProgramBuilder::onAppendUniformDecls(ShaderVisibility visibility, SkStr ing* out) const {
102 for (int i = 0; i < fUniforms.count(); ++i) {
103 if (fUniforms[i].fVisibility & visibility) {
104 fUniforms[i].fVariable.appendDecl(this->glslCaps(), out);
105 out->append(";\n");
106 }
107 }
108 } 61 }
109 62
110 const GrGLSLCaps* GrGLProgramBuilder::glslCaps() const { 63 const GrGLSLCaps* GrGLProgramBuilder::glslCaps() const {
111 return this->fGpu->ctxInfo().caps()->glslCaps(); 64 return this->fGpu->ctxInfo().caps()->glslCaps();
112 } 65 }
113 66
114 bool GrGLProgramBuilder::emitAndInstallProcs(GrGLSLExpr4* inputColor, GrGLSLExpr 4* inputCoverage) { 67 bool GrGLProgramBuilder::emitAndInstallProcs(GrGLSLExpr4* inputColor, GrGLSLExpr 4* inputCoverage) {
115 // First we loop over all of the installed processors and collect coord tran sforms. These will 68 // First we loop over all of the installed processors and collect coord tran sforms. These will
116 // be sent to the GrGLSLPrimitiveProcessor in its emitCode function 69 // be sent to the GrGLSLPrimitiveProcessor in its emitCode function
117 const GrPrimitiveProcessor& primProc = this->primitiveProcessor(); 70 const GrPrimitiveProcessor& primProc = this->primitiveProcessor();
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
213 int index, 166 int index,
214 const char* outColor, 167 const char* outColor,
215 const char* inColor) { 168 const char* inColor) {
216 GrGLInstalledFragProc* ifp = new GrGLInstalledFragProc; 169 GrGLInstalledFragProc* ifp = new GrGLInstalledFragProc;
217 170
218 ifp->fGLProc.reset(fp.createGLSLInstance()); 171 ifp->fGLProc.reset(fp.createGLSLInstance());
219 172
220 SkSTArray<4, GrGLSLTextureSampler> samplers(fp.numTextures()); 173 SkSTArray<4, GrGLSLTextureSampler> samplers(fp.numTextures());
221 this->emitSamplers(fp, &samplers, ifp); 174 this->emitSamplers(fp, &samplers, ifp);
222 175
223 GrGLSLFragmentProcessor::EmitArgs args(this, 176 GrGLSLFragmentProcessor::EmitArgs args(&fFS,
224 &fFS, 177 &fUniformHandler,
225 this->glslCaps(), 178 this->glslCaps(),
226 fp, 179 fp,
227 outColor, 180 outColor,
228 inColor, 181 inColor,
229 fOutCoords[index], 182 fOutCoords[index],
230 samplers); 183 samplers);
231 ifp->fGLProc->emitCode(args); 184 ifp->fGLProc->emitCode(args);
232 185
233 // We have to check that effects and the code they emit are consistent, ie i f an effect 186 // We have to check that effects and the code they emit are consistent, ie i f an effect
234 // asks for dst color, then the emit code needs to follow suit 187 // asks for dst color, then the emit code needs to follow suit
235 verify(fp); 188 verify(fp);
236 fFragmentProcessors->fProcs.push_back(ifp); 189 fFragmentProcessors->fProcs.push_back(ifp);
237 } 190 }
238 191
239 void GrGLProgramBuilder::emitAndInstallProc(const GrPrimitiveProcessor& gp, 192 void GrGLProgramBuilder::emitAndInstallProc(const GrPrimitiveProcessor& gp,
240 const char* outColor, 193 const char* outColor,
241 const char* outCoverage) { 194 const char* outCoverage) {
242 SkASSERT(!fGeometryProcessor); 195 SkASSERT(!fGeometryProcessor);
243 fGeometryProcessor = new GrGLInstalledGeoProc; 196 fGeometryProcessor = new GrGLInstalledGeoProc;
244 197
245 fGeometryProcessor->fGLProc.reset(gp.createGLSLInstance(*fGpu->glCaps().glsl Caps())); 198 fGeometryProcessor->fGLProc.reset(gp.createGLSLInstance(*fGpu->glCaps().glsl Caps()));
246 199
247 SkSTArray<4, GrGLSLTextureSampler> samplers(gp.numTextures()); 200 SkSTArray<4, GrGLSLTextureSampler> samplers(gp.numTextures());
248 this->emitSamplers(gp, &samplers, fGeometryProcessor); 201 this->emitSamplers(gp, &samplers, fGeometryProcessor);
249 202
250 GrGLSLGeometryProcessor::EmitArgs args(this, 203 GrGLSLGeometryProcessor::EmitArgs args(&fVS,
251 &fVS,
252 &fFS, 204 &fFS,
253 &fVaryingHandler, 205 &fVaryingHandler,
206 &fUniformHandler,
254 this->glslCaps(), 207 this->glslCaps(),
255 gp, 208 gp,
256 outColor, 209 outColor,
257 outCoverage, 210 outCoverage,
258 samplers, 211 samplers,
259 fCoordTransforms, 212 fCoordTransforms,
260 &fOutCoords); 213 &fOutCoords);
261 fGeometryProcessor->fGLProc->emitCode(args); 214 fGeometryProcessor->fGLProc->emitCode(args);
262 215
263 // We have to check that effects and the code they emit are consistent, ie i f an effect 216 // We have to check that effects and the code they emit are consistent, ie i f an effect
(...skipping 22 matching lines...) Expand all
286 fFS.enableCustomOutput(); 239 fFS.enableCustomOutput();
287 } 240 }
288 241
289 SkString openBrace; 242 SkString openBrace;
290 openBrace.printf("{ // Xfer Processor: %s\n", xp.name()); 243 openBrace.printf("{ // Xfer Processor: %s\n", xp.name());
291 fFS.codeAppend(openBrace.c_str()); 244 fFS.codeAppend(openBrace.c_str());
292 245
293 SkSTArray<4, GrGLSLTextureSampler> samplers(xp.numTextures()); 246 SkSTArray<4, GrGLSLTextureSampler> samplers(xp.numTextures());
294 this->emitSamplers(xp, &samplers, fXferProcessor); 247 this->emitSamplers(xp, &samplers, fXferProcessor);
295 248
296 GrGLSLXferProcessor::EmitArgs args(this, 249 GrGLSLXferProcessor::EmitArgs args(&fFS,
297 &fFS, 250 &fUniformHandler,
298 this->glslCaps(), 251 this->glslCaps(),
299 xp, colorIn.c_str(), 252 xp, colorIn.c_str(),
300 ignoresCoverage ? nullptr : coverageIn.c_ str(), 253 ignoresCoverage ? nullptr : coverageIn.c_ str(),
301 fFS.getPrimaryColorOutputName(), 254 fFS.getPrimaryColorOutputName(),
302 fFS.getSecondaryColorOutputName(), 255 fFS.getSecondaryColorOutputName(),
303 samplers); 256 samplers);
304 fXferProcessor->fGLProc->emitCode(args); 257 fXferProcessor->fGLProc->emitCode(args);
305 258
306 // We have to check that effects and the code they emit are consistent, ie i f an effect 259 // We have to check that effects and the code they emit are consistent, ie i f an effect
307 // asks for dst color, then the emit code needs to follow suit 260 // asks for dst color, then the emit code needs to follow suit
(...skipping 27 matching lines...) Expand all
335 void GrGLProgramBuilder::emitSamplers(const GrProcessor& processor, 288 void GrGLProgramBuilder::emitSamplers(const GrProcessor& processor,
336 GrGLSLTextureSampler::TextureSamplerArray* outSamplers, 289 GrGLSLTextureSampler::TextureSamplerArray* outSamplers,
337 GrGLInstalledProc<Proc>* ip) { 290 GrGLInstalledProc<Proc>* ip) {
338 SkDEBUGCODE(ip->fSamplersIdx = fSamplerUniforms.count();) 291 SkDEBUGCODE(ip->fSamplersIdx = fSamplerUniforms.count();)
339 int numTextures = processor.numTextures(); 292 int numTextures = processor.numTextures();
340 UniformHandle* localSamplerUniforms = fSamplerUniforms.push_back_n(numTextur es); 293 UniformHandle* localSamplerUniforms = fSamplerUniforms.push_back_n(numTextur es);
341 SkString name; 294 SkString name;
342 for (int t = 0; t < numTextures; ++t) { 295 for (int t = 0; t < numTextures; ++t) {
343 name.printf("Sampler%d", t); 296 name.printf("Sampler%d", t);
344 GrSLType samplerType = get_sampler_type(processor.textureAccess(t)); 297 GrSLType samplerType = get_sampler_type(processor.textureAccess(t));
345 localSamplerUniforms[t] = this->addUniform(GrGLProgramBuilder::kFragment _Visibility, 298 localSamplerUniforms[t] =
346 samplerType, kDefault_GrSLPre cision, 299 fUniformHandler.addUniform(GrGLSLUniformHandler::kFragment_Visibilit y,
347 name.c_str()); 300 samplerType, kDefault_GrSLPrecision,
301 name.c_str());
348 SkNEW_APPEND_TO_TARRAY(outSamplers, GrGLSLTextureSampler, 302 SkNEW_APPEND_TO_TARRAY(outSamplers, GrGLSLTextureSampler,
349 (localSamplerUniforms[t], processor.textureAccess (t))); 303 (localSamplerUniforms[t], processor.textureAccess (t)));
350 if (kSamplerExternal_GrSLType == samplerType) { 304 if (kSamplerExternal_GrSLType == samplerType) {
351 const char* externalFeatureString = this->glslCaps()->externalTextur eExtensionString(); 305 const char* externalFeatureString = this->glslCaps()->externalTextur eExtensionString();
352 // We shouldn't ever create a GrGLTexture that requires external sam pler type 306 // We shouldn't ever create a GrGLTexture that requires external sam pler type
353 SkASSERT(externalFeatureString); 307 SkASSERT(externalFeatureString);
354 fFS.addFeature(1 << GrGLSLFragmentShaderBuilder::kExternalTexture_GL SLPrivateFeature, 308 fFS.addFeature(1 << GrGLSLFragmentShaderBuilder::kExternalTexture_GL SLPrivateFeature,
355 externalFeatureString); 309 externalFeatureString);
356 } 310 }
357 } 311 }
(...skipping 24 matching lines...) Expand all
382 GrGLProgram* GrGLProgramBuilder::finalize() { 336 GrGLProgram* GrGLProgramBuilder::finalize() {
383 // verify we can get a program id 337 // verify we can get a program id
384 GrGLuint programID; 338 GrGLuint programID;
385 GL_CALL_RET(programID, CreateProgram()); 339 GL_CALL_RET(programID, CreateProgram());
386 if (0 == programID) { 340 if (0 == programID) {
387 return nullptr; 341 return nullptr;
388 } 342 }
389 343
390 // compile shaders and bind attributes / uniforms 344 // compile shaders and bind attributes / uniforms
391 SkTDArray<GrGLuint> shadersToDelete; 345 SkTDArray<GrGLuint> shadersToDelete;
392 fVS.finalize(kVertex_Visibility); 346 fVS.finalize(GrGLSLUniformHandler::kVertex_Visibility);
393 if (!this->compileAndAttachShaders(fVS, programID, GR_GL_VERTEX_SHADER, &sha dersToDelete)) { 347 if (!this->compileAndAttachShaders(fVS, programID, GR_GL_VERTEX_SHADER, &sha dersToDelete)) {
394 this->cleanupProgram(programID, shadersToDelete); 348 this->cleanupProgram(programID, shadersToDelete);
395 return nullptr; 349 return nullptr;
396 } 350 }
397 351
398 // NVPR actually requires a vertex shader to compile 352 // NVPR actually requires a vertex shader to compile
399 bool useNvpr = primitiveProcessor().isPathRendering(); 353 bool useNvpr = primitiveProcessor().isPathRendering();
400 if (!useNvpr) { 354 if (!useNvpr) {
401 const GrPrimitiveProcessor& primProc = this->primitiveProcessor(); 355 const GrPrimitiveProcessor& primProc = this->primitiveProcessor();
402 356
403 int vaCount = primProc.numAttribs(); 357 int vaCount = primProc.numAttribs();
404 for (int i = 0; i < vaCount; i++) { 358 for (int i = 0; i < vaCount; i++) {
405 GL_CALL(BindAttribLocation(programID, i, primProc.getAttrib(i).fName )); 359 GL_CALL(BindAttribLocation(programID, i, primProc.getAttrib(i).fName ));
406 } 360 }
407 } 361 }
408 362
409 fFS.finalize(kFragment_Visibility); 363 fFS.finalize(GrGLSLUniformHandler::kFragment_Visibility);
410 if (!this->compileAndAttachShaders(fFS, programID, GR_GL_FRAGMENT_SHADER, &s hadersToDelete)) { 364 if (!this->compileAndAttachShaders(fFS, programID, GR_GL_FRAGMENT_SHADER, &s hadersToDelete)) {
411 this->cleanupProgram(programID, shadersToDelete); 365 this->cleanupProgram(programID, shadersToDelete);
412 return nullptr; 366 return nullptr;
413 } 367 }
414 368
415 this->bindProgramResourceLocations(programID); 369 this->bindProgramResourceLocations(programID);
416 370
417 GL_CALL(LinkProgram(programID)); 371 GL_CALL(LinkProgram(programID));
418 372
419 // Calling GetProgramiv is expensive in Chromium. Assume success in release builds. 373 // Calling GetProgramiv is expensive in Chromium. Assume success in release builds.
420 bool checkLinked = kChromium_GrGLDriver != fGpu->ctxInfo().driver(); 374 bool checkLinked = kChromium_GrGLDriver != fGpu->ctxInfo().driver();
421 #ifdef SK_DEBUG 375 #ifdef SK_DEBUG
422 checkLinked = true; 376 checkLinked = true;
423 #endif 377 #endif
424 if (checkLinked) { 378 if (checkLinked) {
425 checkLinkStatus(programID); 379 checkLinkStatus(programID);
426 } 380 }
427 this->resolveProgramResourceLocations(programID); 381 this->resolveProgramResourceLocations(programID);
428 382
429 this->cleanupShaders(shadersToDelete); 383 this->cleanupShaders(shadersToDelete);
430 384
431 return this->createProgram(programID); 385 return this->createProgram(programID);
432 } 386 }
433 387
434 void GrGLProgramBuilder::bindProgramResourceLocations(GrGLuint programID) { 388 void GrGLProgramBuilder::bindProgramResourceLocations(GrGLuint programID) {
435 if (fGpu->glCaps().bindUniformLocationSupport()) { 389 fUniformHandler.bindUniformLocations(programID, fGpu->glCaps());
436 int count = fUniforms.count();
437 for (int i = 0; i < count; ++i) {
438 GL_CALL(BindUniformLocation(programID, i, fUniforms[i].fVariable.c_s tr()));
439 fUniforms[i].fLocation = i;
440 }
441 }
442 390
443 const GrGLCaps& caps = this->gpu()->glCaps(); 391 const GrGLCaps& caps = this->gpu()->glCaps();
444 if (fFS.hasCustomColorOutput() && caps.bindFragDataLocationSupport()) { 392 if (fFS.hasCustomColorOutput() && caps.bindFragDataLocationSupport()) {
445 GL_CALL(BindFragDataLocation(programID, 0, 393 GL_CALL(BindFragDataLocation(programID, 0,
446 GrGLSLFragmentShaderBuilder::DeclaredColorO utputName())); 394 GrGLSLFragmentShaderBuilder::DeclaredColorO utputName()));
447 } 395 }
448 if (fFS.hasSecondaryOutput() && caps.glslCaps()->mustDeclareFragmentShaderOu tput()) { 396 if (fFS.hasSecondaryOutput() && caps.glslCaps()->mustDeclareFragmentShaderOu tput()) {
449 GL_CALL(BindFragDataLocationIndexed(programID, 0, 1, 397 GL_CALL(BindFragDataLocationIndexed(programID, 0, 1,
450 GrGLSLFragmentShaderBuilder::DeclaredSecondary ColorOutputName())); 398 GrGLSLFragmentShaderBuilder::DeclaredSecondary ColorOutputName()));
451 } 399 }
(...skipping 29 matching lines...) Expand all
481 SkDebugf("%s", (char*)log.get()); 429 SkDebugf("%s", (char*)log.get());
482 } 430 }
483 SkDEBUGFAIL("Error linking program"); 431 SkDEBUGFAIL("Error linking program");
484 GL_CALL(DeleteProgram(programID)); 432 GL_CALL(DeleteProgram(programID));
485 programID = 0; 433 programID = 0;
486 } 434 }
487 return SkToBool(linked); 435 return SkToBool(linked);
488 } 436 }
489 437
490 void GrGLProgramBuilder::resolveProgramResourceLocations(GrGLuint programID) { 438 void GrGLProgramBuilder::resolveProgramResourceLocations(GrGLuint programID) {
491 if (!fGpu->glCaps().bindUniformLocationSupport()) { 439 fUniformHandler.getUniformLocations(programID, fGpu->glCaps());
492 int count = fUniforms.count();
493 for (int i = 0; i < count; ++i) {
494 GrGLint location;
495 GL_CALL_RET(location, GetUniformLocation(programID, fUniforms[i].fVa riable.c_str()));
496 fUniforms[i].fLocation = location;
497 }
498 }
499 440
500 // handle NVPR separable varyings 441 // handle NVPR separable varyings
501 if (!fGpu->glCaps().shaderCaps()->pathRenderingSupport() || 442 if (!fGpu->glCaps().shaderCaps()->pathRenderingSupport() ||
502 !fGpu->glPathRendering()->shouldBindFragmentInputs()) { 443 !fGpu->glPathRendering()->shouldBindFragmentInputs()) {
503 return; 444 return;
504 } 445 }
505 int count = fVaryingHandler.fPathProcVaryingInfos.count(); 446 int count = fVaryingHandler.fPathProcVaryingInfos.count();
506 for (int i = 0; i < count; ++i) { 447 for (int i = 0; i < count; ++i) {
507 GrGLint location; 448 GrGLint location;
508 GL_CALL_RET(location, GetProgramResourceLocation( 449 GL_CALL_RET(location, GetProgramResourceLocation(
509 programID, 450 programID,
510 GR_GL_FRAGMENT_INPUT, 451 GR_GL_FRAGMENT_INPUT,
511 fVaryingHandler.fPathProcVaryingInfos[i]. fVariable.c_str())); 452 fVaryingHandler.fPathProcVaryingInfos[i]. fVariable.c_str()));
512 fVaryingHandler.fPathProcVaryingInfos[i].fLocation = location; 453 fVaryingHandler.fPathProcVaryingInfos[i].fLocation = location;
513 } 454 }
514 } 455 }
515 456
516 void GrGLProgramBuilder::cleanupProgram(GrGLuint programID, const SkTDArray<GrGL uint>& shaderIDs) { 457 void GrGLProgramBuilder::cleanupProgram(GrGLuint programID, const SkTDArray<GrGL uint>& shaderIDs) {
517 GL_CALL(DeleteProgram(programID)); 458 GL_CALL(DeleteProgram(programID));
518 cleanupShaders(shaderIDs); 459 cleanupShaders(shaderIDs);
519 } 460 }
520 void GrGLProgramBuilder::cleanupShaders(const SkTDArray<GrGLuint>& shaderIDs) { 461 void GrGLProgramBuilder::cleanupShaders(const SkTDArray<GrGLuint>& shaderIDs) {
521 for (int i = 0; i < shaderIDs.count(); ++i) { 462 for (int i = 0; i < shaderIDs.count(); ++i) {
522 GL_CALL(DeleteShader(shaderIDs[i])); 463 GL_CALL(DeleteShader(shaderIDs[i]));
523 } 464 }
524 } 465 }
525 466
526 GrGLProgram* GrGLProgramBuilder::createProgram(GrGLuint programID) { 467 GrGLProgram* GrGLProgramBuilder::createProgram(GrGLuint programID) {
527 return new GrGLProgram(fGpu, this->desc(), fUniformHandles, programID, fUnif orms, 468 return new GrGLProgram(fGpu,
469 this->desc(),
470 fUniformHandles,
471 programID,
472 fUniformHandler.fUniforms,
528 fVaryingHandler.fPathProcVaryingInfos, 473 fVaryingHandler.fPathProcVaryingInfos,
529 fGeometryProcessor, fXferProcessor, fFragmentProcesso rs.get(), 474 fGeometryProcessor,
475 fXferProcessor,
476 fFragmentProcessors.get(),
530 &fSamplerUniforms); 477 &fSamplerUniforms);
531 } 478 }
532 479
533 //////////////////////////////////////////////////////////////////////////////// /////////////////// 480 //////////////////////////////////////////////////////////////////////////////// ///////////////////
534 481
535 GrGLInstalledFragProcs::~GrGLInstalledFragProcs() { 482 GrGLInstalledFragProcs::~GrGLInstalledFragProcs() {
536 int numProcs = fProcs.count(); 483 int numProcs = fProcs.count();
537 for (int i = 0; i < numProcs; ++i) { 484 for (int i = 0; i < numProcs; ++i) {
538 delete fProcs[i]; 485 delete fProcs[i];
539 } 486 }
540 } 487 }
OLDNEW
« no previous file with comments | « src/gpu/gl/builders/GrGLProgramBuilder.h ('k') | src/gpu/glsl/GrGLSLFragmentProcessor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698