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

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

Issue 509153002: Initial change to create GeometryProcessor (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: last warning 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
« no previous file with comments | « src/gpu/gl/builders/GrGLProgramBuilder.h ('k') | tests/GLProgramsTest.cpp » ('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 "gl/GrGLProgram.h" 8 #include "gl/GrGLProgram.h"
9 #include "gl/GrGLSLPrettyPrint.h" 9 #include "gl/GrGLSLPrettyPrint.h"
10 #include "gl/GrGLUniformHandle.h" 10 #include "gl/GrGLUniformHandle.h"
(...skipping 13 matching lines...) Expand all
24 24
25 // number of each input/output type in a single allocation block 25 // number of each input/output type in a single allocation block
26 static const int kVarsPerBlock = 8; 26 static const int kVarsPerBlock = 8;
27 27
28 // ES2 FS only guarantees mediump and lowp support 28 // ES2 FS only guarantees mediump and lowp support
29 static const GrGLShaderVar::Precision kDefaultFragmentPrecision = GrGLShaderVar: :kMedium_Precision; 29 static const GrGLShaderVar::Precision kDefaultFragmentPrecision = GrGLShaderVar: :kMedium_Precision;
30 } 30 }
31 31
32 //////////////////////////////////////////////////////////////////////////////// /////////////////// 32 //////////////////////////////////////////////////////////////////////////////// ///////////////////
33 33
34 bool GrGLProgramBuilder::genProgram(const GrEffectStage* colorStages[], 34 bool GrGLProgramBuilder::genProgram(const GrEffectStage* geometryProcessor,
35 const GrEffectStage* colorStages[],
35 const GrEffectStage* coverageStages[]) { 36 const GrEffectStage* coverageStages[]) {
36 const GrGLProgramDesc::KeyHeader& header = this->desc().getHeader(); 37 const GrGLProgramDesc::KeyHeader& header = this->desc().getHeader();
37 38
38 fFS.emitCodeBeforeEffects(); 39 fFS.emitCodeBeforeEffects();
39 40
40 /////////////////////////////////////////////////////////////////////////// 41 ///////////////////////////////////////////////////////////////////////////
41 // get the initial color and coverage to feed into the first effect in each effect chain 42 // get the initial color and coverage to feed into the first effect in each effect chain
42 43
43 GrGLSLExpr4 inputColor; 44 GrGLSLExpr4 inputColor;
44 GrGLSLExpr4 inputCoverage; 45 GrGLSLExpr4 inputCoverage;
(...skipping 27 matching lines...) Expand all
72 /////////////////////////////////////////////////////////////////////////// 73 ///////////////////////////////////////////////////////////////////////////
73 // emit the per-effect code for both color and coverage effects 74 // emit the per-effect code for both color and coverage effects
74 75
75 GrGLProgramDesc::EffectKeyProvider colorKeyProvider( 76 GrGLProgramDesc::EffectKeyProvider colorKeyProvider(
76 &this->desc(), GrGLProgramDesc::EffectKeyProvider::kColor_EffectType); 77 &this->desc(), GrGLProgramDesc::EffectKeyProvider::kColor_EffectType);
77 fColorEffects.reset(this->createAndEmitEffects(colorStages, 78 fColorEffects.reset(this->createAndEmitEffects(colorStages,
78 this->desc().numColorEffects( ), 79 this->desc().numColorEffects( ),
79 colorKeyProvider, 80 colorKeyProvider,
80 &inputColor)); 81 &inputColor));
81 82
83 this->emitGeometryProcessor(geometryProcessor, &inputCoverage);
84
82 GrGLProgramDesc::EffectKeyProvider coverageKeyProvider( 85 GrGLProgramDesc::EffectKeyProvider coverageKeyProvider(
83 &this->desc(), GrGLProgramDesc::EffectKeyProvider::kCoverage_EffectType) ; 86 &this->desc(), GrGLProgramDesc::EffectKeyProvider::kCoverage_EffectType) ;
84 fCoverageEffects.reset(this->createAndEmitEffects(coverageStages, 87 fCoverageEffects.reset(this->createAndEmitEffects(coverageStages,
85 this->desc().numCoverageEf fects(), 88 this->desc().numCoverageEf fects(),
86 coverageKeyProvider, 89 coverageKeyProvider,
87 &inputCoverage)); 90 &inputCoverage));
88 91
89 this->emitCodeAfterEffects(); 92 this->emitCodeAfterEffects();
90 93
91 fFS.emitCodeAfterEffects(inputColor, inputCoverage); 94 fFS.emitCodeAfterEffects(inputColor, inputCoverage);
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
327 330
328 //////////////////////////////////////////////////////////////////////////////// 331 ////////////////////////////////////////////////////////////////////////////////
329 332
330 GrGLFullProgramBuilder::GrGLFullProgramBuilder(GrGpuGL* gpu, 333 GrGLFullProgramBuilder::GrGLFullProgramBuilder(GrGpuGL* gpu,
331 const GrGLProgramDesc& desc) 334 const GrGLProgramDesc& desc)
332 : INHERITED(gpu, desc) 335 : INHERITED(gpu, desc)
333 , fGS(this) 336 , fGS(this)
334 , fVS(this) { 337 , fVS(this) {
335 } 338 }
336 339
337 void GrGLFullProgramBuilder::emitCodeBeforeEffects(GrGLSLExpr4* color, GrGLSLExp r4* coverage) { 340 void GrGLFullProgramBuilder::emitCodeBeforeEffects(GrGLSLExpr4* color,
341 GrGLSLExpr4* coverage) {
338 fVS.emitCodeBeforeEffects(color, coverage); 342 fVS.emitCodeBeforeEffects(color, coverage);
339 } 343 }
340 344
345 void GrGLFullProgramBuilder::emitGeometryProcessor(const GrEffectStage* geometry Processor,
346 GrGLSLExpr4* coverage) {
347 if (NULL != geometryProcessor) {
348 GrGLProgramDesc::EffectKeyProvider geometryProcessorKeyProvider(
349 &this->desc(), GrGLProgramDesc::EffectKeyProvider::kGeometryProc essor_EffectType);
350 fGeometryProcessor.reset(this->createAndEmitEffect(
351 geometryProcessor,
352 geometryProcessorKeyProvider,
353 coverage));
354 }
355 }
356
341 void GrGLFullProgramBuilder::emitCodeAfterEffects() { 357 void GrGLFullProgramBuilder::emitCodeAfterEffects() {
342 fVS.emitCodeAfterEffects(); 358 fVS.emitCodeAfterEffects();
343 } 359 }
344 360
345 void GrGLFullProgramBuilder::addVarying(GrSLType type, 361 void GrGLFullProgramBuilder::addVarying(GrSLType type,
346 const char* name, 362 const char* name,
347 const char** vsOutName, 363 const char** vsOutName,
348 const char** fsInName, 364 const char** fsInName,
349 GrGLShaderVar::Precision fsPrecision) { 365 GrGLShaderVar::Precision fsPrecision) {
350 fVS.addVarying(type, name, vsOutName); 366 fVS.addVarying(type, name, vsOutName);
(...skipping 30 matching lines...) Expand all
381 397
382 GrGLVertexProgramEffectsBuilder programEffectsBuilder(this, effectCnt); 398 GrGLVertexProgramEffectsBuilder programEffectsBuilder(this, effectCnt);
383 this->INHERITED::createAndEmitEffects(&programEffectsBuilder, 399 this->INHERITED::createAndEmitEffects(&programEffectsBuilder,
384 effectStages, 400 effectStages,
385 effectCnt, 401 effectCnt,
386 keyProvider, 402 keyProvider,
387 inOutFSColor); 403 inOutFSColor);
388 return programEffectsBuilder.finish(); 404 return programEffectsBuilder.finish();
389 } 405 }
390 406
407 void GrGLFullProgramBuilder::createAndEmitEffect(GrGLProgramEffectsBuilder* prog ramEffectsBuilder,
408 const GrEffectStage* effectStages,
409 const GrGLProgramDesc::EffectKeyPr ovider& keyProvider,
410 GrGLSLExpr4* fsInOutColor) {
411 GrGLSLExpr4 inColor = *fsInOutColor;
412 GrGLSLExpr4 outColor;
413
414 SkASSERT(NULL != effectStages && NULL != effectStages->getEffect());
415 const GrEffectStage& stage = *effectStages;
416
417 // Using scope to force ASR destructor to be triggered
418 {
419 CodeStage::AutoStageRestore csar(&fCodeStage, &stage);
420
421 if (inColor.isZeros()) {
422 SkString inColorName;
423
424 // Effects have no way to communicate zeros, they treat an empty str ing as ones.
425 this->nameVariable(&inColorName, '\0', "input");
426 fFS.codeAppendf("vec4 %s = %s;", inColorName.c_str(), inColor.c_str( ));
427 inColor = inColorName;
428 }
429
430 // create var to hold stage result
431 SkString outColorName;
432 this->nameVariable(&outColorName, '\0', "output");
433 fFS.codeAppendf("vec4 %s;", outColorName.c_str());
434 outColor = outColorName;
435
436
437 programEffectsBuilder->emitEffect(stage,
438 keyProvider.get(0),
439 outColor.c_str(),
440 inColor.isOnes() ? NULL : inColor.c_st r(),
441 fCodeStage.stageIndex());
442 }
443
444 *fsInOutColor = outColor;
445 }
446
447 GrGLProgramEffects* GrGLFullProgramBuilder::createAndEmitEffect(
448 const GrEffectStage* geometryProcessor,
449 const GrGLProgramDesc::EffectKeyProvider& keyProvider,
450 GrGLSLExpr4* inOutFSColor) {
451
452 GrGLVertexProgramEffectsBuilder programEffectsBuilder(this, 1);
453 this->createAndEmitEffect(&programEffectsBuilder, geometryProcessor, keyProv ider, inOutFSColor);
454 return programEffectsBuilder.finish();
455 }
456
391 bool GrGLFullProgramBuilder::compileAndAttachShaders(GrGLuint programId, 457 bool GrGLFullProgramBuilder::compileAndAttachShaders(GrGLuint programId,
392 SkTDArray<GrGLuint>* shader Ids) const { 458 SkTDArray<GrGLuint>* shader Ids) const {
393 return INHERITED::compileAndAttachShaders(programId, shaderIds) 459 return INHERITED::compileAndAttachShaders(programId, shaderIds)
394 && fVS.compileAndAttachShaders(programId, shaderIds) 460 && fVS.compileAndAttachShaders(programId, shaderIds)
395 #if GR_GL_EXPERIMENTAL_GS 461 #if GR_GL_EXPERIMENTAL_GS
396 && (!desc().getHeader().fExperimentalGS 462 && (!desc().getHeader().fExperimentalGS
397 || fGS.compileAndAttachShaders(programId, shaderIds)) 463 || fGS.compileAndAttachShaders(programId, shaderIds))
398 #endif 464 #endif
399 ; 465 ;
400 } 466 }
(...skipping 27 matching lines...) Expand all
428 494
429 GrGLPathTexGenProgramEffectsBuilder pathTexGenEffectsBuilder(this, 495 GrGLPathTexGenProgramEffectsBuilder pathTexGenEffectsBuilder(this,
430 effectCnt); 496 effectCnt);
431 this->INHERITED::createAndEmitEffects(&pathTexGenEffectsBuilder, 497 this->INHERITED::createAndEmitEffects(&pathTexGenEffectsBuilder,
432 effectStages, 498 effectStages,
433 effectCnt, 499 effectCnt,
434 keyProvider, 500 keyProvider,
435 inOutFSColor); 501 inOutFSColor);
436 return pathTexGenEffectsBuilder.finish(); 502 return pathTexGenEffectsBuilder.finish();
437 } 503 }
OLDNEW
« no previous file with comments | « src/gpu/gl/builders/GrGLProgramBuilder.h ('k') | tests/GLProgramsTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698