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

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: small fixes 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 "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 15 matching lines...) Expand all
60 fUniformHandles.fCoverageUni = 61 fUniformHandles.fCoverageUni =
61 this->addUniform(GrGLProgramBuilder::kFragment_Visibility, 62 this->addUniform(GrGLProgramBuilder::kFragment_Visibility,
62 kVec4f_GrSLType, 63 kVec4f_GrSLType,
63 "Coverage", 64 "Coverage",
64 &name); 65 &name);
65 inputCoverage = GrGLSLExpr4(name); 66 inputCoverage = GrGLSLExpr4(name);
66 } else if (GrGLProgramDesc::kAllOnes_ColorInput == header.fCoverageInput) { 67 } else if (GrGLProgramDesc::kAllOnes_ColorInput == header.fCoverageInput) {
67 inputCoverage = GrGLSLExpr4(1); 68 inputCoverage = GrGLSLExpr4(1);
68 } 69 }
69 70
70 this->emitCodeBeforeEffects(&inputColor, &inputCoverage); 71 this->emitCodeBeforeEffects(geometryProcessor, &inputColor, &inputCoverage);
71 72
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));
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after
327 328
328 //////////////////////////////////////////////////////////////////////////////// 329 ////////////////////////////////////////////////////////////////////////////////
329 330
330 GrGLFullProgramBuilder::GrGLFullProgramBuilder(GrGpuGL* gpu, 331 GrGLFullProgramBuilder::GrGLFullProgramBuilder(GrGpuGL* gpu,
331 const GrGLProgramDesc& desc) 332 const GrGLProgramDesc& desc)
332 : INHERITED(gpu, desc) 333 : INHERITED(gpu, desc)
333 , fGS(this) 334 , fGS(this)
334 , fVS(this) { 335 , fVS(this) {
335 } 336 }
336 337
337 void GrGLFullProgramBuilder::emitCodeBeforeEffects(GrGLSLExpr4* color, GrGLSLExp r4* coverage) { 338 void GrGLFullProgramBuilder::emitCodeBeforeEffects(const GrEffectStage* geometry Processor,
339 GrGLSLExpr4* color,
340 GrGLSLExpr4* coverage) {
341 const GrGLProgramDesc::KeyHeader& header = this->desc().getHeader();
342
338 fVS.emitCodeBeforeEffects(color, coverage); 343 fVS.emitCodeBeforeEffects(color, coverage);
344
345 if (NULL != geometryProcessor) {
346 GrGLProgramDesc::EffectKeyProvider geometryProcessorKeyProvider(
347 &this->desc(), GrGLProgramDesc::EffectKeyProvider::kGeometryProc essor_EffectType);
348 fGeometryProcessor.reset(this->createAndEmitEffect(
349 geometryProcessor,
350 geometryProcessorKeyProvider,
351 header.fSeparateCoverageFromColor ? coverage : color));
352 }
339 } 353 }
340 354
341 void GrGLFullProgramBuilder::emitCodeAfterEffects() { 355 void GrGLFullProgramBuilder::emitCodeAfterEffects() {
342 fVS.emitCodeAfterEffects(); 356 fVS.emitCodeAfterEffects();
343 } 357 }
344 358
345 void GrGLFullProgramBuilder::addVarying(GrSLType type, 359 void GrGLFullProgramBuilder::addVarying(GrSLType type,
346 const char* name, 360 const char* name,
347 const char** vsOutName, 361 const char** vsOutName,
348 const char** fsInName, 362 const char** fsInName,
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 395
382 GrGLVertexProgramEffectsBuilder programEffectsBuilder(this, effectCnt); 396 GrGLVertexProgramEffectsBuilder programEffectsBuilder(this, effectCnt);
383 this->INHERITED::createAndEmitEffects(&programEffectsBuilder, 397 this->INHERITED::createAndEmitEffects(&programEffectsBuilder,
384 effectStages, 398 effectStages,
385 effectCnt, 399 effectCnt,
386 keyProvider, 400 keyProvider,
387 inOutFSColor); 401 inOutFSColor);
388 return programEffectsBuilder.finish(); 402 return programEffectsBuilder.finish();
389 } 403 }
390 404
405 void GrGLFullProgramBuilder::createAndEmitEffect(GrGLProgramEffectsBuilder* prog ramEffectsBuilder,
406 const GrEffectStage* effectStages,
407 const GrGLProgramDesc::EffectKeyPr ovider& keyProvider,
408 GrGLSLExpr4* fsInOutColor) {
409 GrGLSLExpr4 inColor = *fsInOutColor;
410 GrGLSLExpr4 outColor;
411
412 SkASSERT(NULL != effectStages && NULL != effectStages->getEffect());
413 const GrEffectStage& stage = *effectStages;
414
415 CodeStage::AutoStageRestore csar(&fCodeStage, &stage);
416
417 if (inColor.isZeros()) {
418 SkString inColorName;
419
420 // Effects have no way to communicate zeros, they treat an empty string as ones.
421 this->nameVariable(&inColorName, '\0', "input");
422 fFS.codeAppendf("vec4 %s = %s;", inColorName.c_str(), inColor.c_str());
423 inColor = inColorName;
424 }
425
426 // create var to hold stage result
427 SkString outColorName;
428 this->nameVariable(&outColorName, '\0', "output");
429 fFS.codeAppendf("vec4 %s;", outColorName.c_str());
430 outColor = outColorName;
431
432
433 programEffectsBuilder->emitEffect(stage,
434 keyProvider.get(0),
435 outColor.c_str(),
436 inColor.isOnes() ? NULL : inColor.c_str(),
437 fCodeStage.stageIndex());
438
439 *fsInOutColor = outColor;
440 }
441
442 GrGLProgramEffects* GrGLFullProgramBuilder::createAndEmitEffect(
443 const GrEffectStage* geometryProcessor,
444 const GrGLProgramDesc::EffectKeyProvider& keyProvider,
445 GrGLSLExpr4* inOutFSColor) {
446
447 GrGLVertexProgramEffectsBuilder programEffectsBuilder(this, 1);
448 this->createAndEmitEffect(&programEffectsBuilder, geometryProcessor, keyProv ider, inOutFSColor);
449 return programEffectsBuilder.finish();
450 }
451
391 bool GrGLFullProgramBuilder::compileAndAttachShaders(GrGLuint programId, 452 bool GrGLFullProgramBuilder::compileAndAttachShaders(GrGLuint programId,
392 SkTDArray<GrGLuint>* shader Ids) const { 453 SkTDArray<GrGLuint>* shader Ids) const {
393 return INHERITED::compileAndAttachShaders(programId, shaderIds) 454 return INHERITED::compileAndAttachShaders(programId, shaderIds)
394 && fVS.compileAndAttachShaders(programId, shaderIds) 455 && fVS.compileAndAttachShaders(programId, shaderIds)
395 #if GR_GL_EXPERIMENTAL_GS 456 #if GR_GL_EXPERIMENTAL_GS
396 && (!desc().getHeader().fExperimentalGS 457 && (!desc().getHeader().fExperimentalGS
397 || fGS.compileAndAttachShaders(programId, shaderIds)) 458 || fGS.compileAndAttachShaders(programId, shaderIds))
398 #endif 459 #endif
399 ; 460 ;
400 } 461 }
(...skipping 27 matching lines...) Expand all
428 489
429 GrGLPathTexGenProgramEffectsBuilder pathTexGenEffectsBuilder(this, 490 GrGLPathTexGenProgramEffectsBuilder pathTexGenEffectsBuilder(this,
430 effectCnt); 491 effectCnt);
431 this->INHERITED::createAndEmitEffects(&pathTexGenEffectsBuilder, 492 this->INHERITED::createAndEmitEffects(&pathTexGenEffectsBuilder,
432 effectStages, 493 effectStages,
433 effectCnt, 494 effectCnt,
434 keyProvider, 495 keyProvider,
435 inOutFSColor); 496 inOutFSColor);
436 return pathTexGenEffectsBuilder.finish(); 497 return pathTexGenEffectsBuilder.finish();
437 } 498 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698