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

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: fixing mac compiler 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
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 13 matching lines...) Expand all
58 fUniformHandles.fCoverageUni = 59 fUniformHandles.fCoverageUni =
59 this->addUniform(GrGLProgramBuilder::kFragment_Visibility, 60 this->addUniform(GrGLProgramBuilder::kFragment_Visibility,
60 kVec4f_GrSLType, 61 kVec4f_GrSLType,
61 "Coverage", 62 "Coverage",
62 &name); 63 &name);
63 inputCoverage = GrGLSLExpr4(name); 64 inputCoverage = GrGLSLExpr4(name);
64 } else if (GrGLProgramDesc::kSolidWhite_ColorInput == header.fCoverageInput) { 65 } else if (GrGLProgramDesc::kSolidWhite_ColorInput == header.fCoverageInput) {
65 inputCoverage = GrGLSLExpr4(1); 66 inputCoverage = GrGLSLExpr4(1);
66 } 67 }
67 68
68 this->emitCodeBeforeEffects(&inputColor, &inputCoverage); 69 this->emitCodeBeforeEffects(geometryProcessor, &inputColor, &inputCoverage);
69 70
70 /////////////////////////////////////////////////////////////////////////// 71 ///////////////////////////////////////////////////////////////////////////
71 // emit the per-effect code for both color and coverage effects 72 // emit the per-effect code for both color and coverage effects
72 73
73 GrGLProgramDesc::EffectKeyProvider colorKeyProvider( 74 GrGLProgramDesc::EffectKeyProvider colorKeyProvider(
74 &this->desc(), GrGLProgramDesc::EffectKeyProvider::kColor_EffectType); 75 &this->desc(), GrGLProgramDesc::EffectKeyProvider::kColor_EffectType);
75 fColorEffects.reset(this->createAndEmitEffects(colorStages, 76 fColorEffects.reset(this->createAndEmitEffects(colorStages,
76 this->desc().numColorEffects( ), 77 this->desc().numColorEffects( ),
77 colorKeyProvider, 78 colorKeyProvider,
78 &inputColor)); 79 &inputColor));
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 326
326 //////////////////////////////////////////////////////////////////////////////// 327 ////////////////////////////////////////////////////////////////////////////////
327 328
328 GrGLFullProgramBuilder::GrGLFullProgramBuilder(GrGpuGL* gpu, 329 GrGLFullProgramBuilder::GrGLFullProgramBuilder(GrGpuGL* gpu,
329 const GrGLProgramDesc& desc) 330 const GrGLProgramDesc& desc)
330 : INHERITED(gpu, desc) 331 : INHERITED(gpu, desc)
331 , fGS(this) 332 , fGS(this)
332 , fVS(this) { 333 , fVS(this) {
333 } 334 }
334 335
335 void GrGLFullProgramBuilder::emitCodeBeforeEffects(GrGLSLExpr4* color, GrGLSLExp r4* coverage) { 336 void GrGLFullProgramBuilder::emitCodeBeforeEffects(const GrEffectStage* geometry Processor,
337 GrGLSLExpr4* color,
338 GrGLSLExpr4* coverage) {
339 const GrGLProgramDesc::KeyHeader& header = this->desc().getHeader();
340
336 fVS.emitCodeBeforeEffects(color, coverage); 341 fVS.emitCodeBeforeEffects(color, coverage);
342
robertphillips 2014/08/29 15:04:53 NULL != ?
joshua.litt 2014/09/02 16:06:21 Acknowledged.
343 if (geometryProcessor) {
344 GrGLProgramDesc::EffectKeyProvider geometryProcessorKeyProvider(
345 &this->desc(), GrGLProgramDesc::EffectKeyProvider::kGeometryProc essor_EffectType);
346 fGeometryProcessor.reset(this->createAndEmitEffect(
347 geometryProcessor,
348 geometryProcessorKeyProvider,
349 header.fSeparateCoverageFromColor ? coverage : color));
350 }
337 } 351 }
338 352
339 void GrGLFullProgramBuilder::emitCodeAfterEffects() { 353 void GrGLFullProgramBuilder::emitCodeAfterEffects() {
340 fVS.emitCodeAfterEffects(); 354 fVS.emitCodeAfterEffects();
341 } 355 }
342 356
343 void GrGLFullProgramBuilder::addVarying(GrSLType type, 357 void GrGLFullProgramBuilder::addVarying(GrSLType type,
344 const char* name, 358 const char* name,
345 const char** vsOutName, 359 const char** vsOutName,
346 const char** fsInName) { 360 const char** fsInName) {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
378 392
379 GrGLVertexProgramEffectsBuilder programEffectsBuilder(this, effectCnt); 393 GrGLVertexProgramEffectsBuilder programEffectsBuilder(this, effectCnt);
380 this->INHERITED::createAndEmitEffects(&programEffectsBuilder, 394 this->INHERITED::createAndEmitEffects(&programEffectsBuilder,
381 effectStages, 395 effectStages,
382 effectCnt, 396 effectCnt,
383 keyProvider, 397 keyProvider,
384 inOutFSColor); 398 inOutFSColor);
385 return programEffectsBuilder.finish(); 399 return programEffectsBuilder.finish();
386 } 400 }
387 401
402 void GrGLFullProgramBuilder::createAndEmitEffect(GrGLProgramEffectsBuilder* prog ramEffectsBuilder,
403 const GrEffectStage* effectStages,
404 const GrGLProgramDesc::EffectKeyPr ovider& keyProvider,
405 GrGLSLExpr4* fsInOutColor) {
406 GrGLSLExpr4 inColor = *fsInOutColor;
407 GrGLSLExpr4 outColor;
408
409 SkASSERT(NULL != effectStages && NULL != effectStages->getEffect());
410 const GrEffectStage& stage = *effectStages;
411
412 CodeStage::AutoStageRestore csar(&fCodeStage, &stage);
413
414 if (inColor.isZeros()) {
415 SkString inColorName;
416
417 // Effects have no way to communicate zeros, they treat an empty string as ones.
418 this->nameVariable(&inColorName, '\0', "input");
robertphillips 2014/08/29 15:04:53 I thought we were doing away with the manual '\t'
joshua.litt 2014/09/02 16:06:21 Acknowledged.
419 fFS.codeAppendf("\tvec4 %s = %s;\n", inColorName.c_str(), inColor.c_str( ));
420 inColor = inColorName;
421 }
422
423 // create var to hold stage result
424 SkString outColorName;
425 this->nameVariable(&outColorName, '\0', "output");
426 fFS.codeAppendf("\tvec4 %s;\n", outColorName.c_str());
427 outColor = outColorName;
428
429
430 programEffectsBuilder->emitEffect(stage,
431 keyProvider.get(0),
432 outColor.c_str(),
433 inColor.isOnes() ? NULL : inColor.c_str(),
434 fCodeStage.stageIndex());
435
436 *fsInOutColor = outColor;
437 }
438
439 GrGLProgramEffects* GrGLFullProgramBuilder::createAndEmitEffect(
440 const GrEffectStage* geometryProcessor,
441 const GrGLProgramDesc::EffectKeyProvider& keyProvider,
442 GrGLSLExpr4* inOutFSColor) {
443
444 GrGLVertexProgramEffectsBuilder programEffectsBuilder(this, 1);
445 this->createAndEmitEffect(&programEffectsBuilder, geometryProcessor, keyProv ider, inOutFSColor);
446 return programEffectsBuilder.finish();
447 }
448
388 bool GrGLFullProgramBuilder::compileAndAttachShaders(GrGLuint programId, 449 bool GrGLFullProgramBuilder::compileAndAttachShaders(GrGLuint programId,
389 SkTDArray<GrGLuint>* shader Ids) const { 450 SkTDArray<GrGLuint>* shader Ids) const {
390 return INHERITED::compileAndAttachShaders(programId, shaderIds) 451 return INHERITED::compileAndAttachShaders(programId, shaderIds)
391 && fVS.compileAndAttachShaders(programId, shaderIds) 452 && fVS.compileAndAttachShaders(programId, shaderIds)
392 #if GR_GL_EXPERIMENTAL_GS 453 #if GR_GL_EXPERIMENTAL_GS
393 && (!desc().getHeader().fExperimentalGS 454 && (!desc().getHeader().fExperimentalGS
394 || fGS.compileAndAttachShaders(programId, shaderIds)) 455 || fGS.compileAndAttachShaders(programId, shaderIds))
395 #endif 456 #endif
396 ; 457 ;
397 } 458 }
(...skipping 27 matching lines...) Expand all
425 486
426 GrGLPathTexGenProgramEffectsBuilder pathTexGenEffectsBuilder(this, 487 GrGLPathTexGenProgramEffectsBuilder pathTexGenEffectsBuilder(this,
427 effectCnt); 488 effectCnt);
428 this->INHERITED::createAndEmitEffects(&pathTexGenEffectsBuilder, 489 this->INHERITED::createAndEmitEffects(&pathTexGenEffectsBuilder,
429 effectStages, 490 effectStages,
430 effectCnt, 491 effectCnt,
431 keyProvider, 492 keyProvider,
432 inOutFSColor); 493 inOutFSColor);
433 return pathTexGenEffectsBuilder.finish(); 494 return pathTexGenEffectsBuilder.finish();
434 } 495 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698