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

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

Issue 1431433003: Move shader compiling to ProgramBuilder and various ShaderBuilder cleanups. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: nits Created 5 years, 1 month 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 "GrGLFragmentShaderBuilder.h" 8 #include "GrGLFragmentShaderBuilder.h"
9 #include "GrRenderTarget.h"
9 #include "GrGLProgramBuilder.h" 10 #include "GrGLProgramBuilder.h"
10 #include "gl/GrGLGpu.h" 11 #include "gl/GrGLGpu.h"
11 #include "glsl/GrGLSL.h" 12 #include "glsl/GrGLSL.h"
12 #include "glsl/GrGLSLCaps.h" 13 #include "glsl/GrGLSLCaps.h"
13 14
14 #define GL_CALL(X) GR_GL_CALL(fProgramBuilder->gpu()->glInterface(), X) 15 #define GL_CALL(X) GR_GL_CALL(fProgramBuilder->gpu()->glInterface(), X)
15 #define GL_CALL_RET(R, X) GR_GL_CALL_RET(fProgramBuilder->gpu()->glInterface(), R, X) 16 #define GL_CALL_RET(R, X) GR_GL_CALL_RET(fProgramBuilder->gpu()->glInterface(), R, X)
16 17
17 const char* GrGLFragmentShaderBuilder::kDstTextureColorName = "_dstColor"; 18 const char* GrGLFragmentShaderBuilder::kDstTextureColorName = "_dstColor";
18 static const char* declared_color_output_name() { return "fsColorOut"; } 19 static const char* declared_color_output_name() { return "fsColorOut"; }
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 GR_STATIC_ASSERT(9 == kExclusion_GrBlendEquation - kFirstAdvancedGrBlendEqua tion); 53 GR_STATIC_ASSERT(9 == kExclusion_GrBlendEquation - kFirstAdvancedGrBlendEqua tion);
53 GR_STATIC_ASSERT(10 == kMultiply_GrBlendEquation - kFirstAdvancedGrBlendEqua tion); 54 GR_STATIC_ASSERT(10 == kMultiply_GrBlendEquation - kFirstAdvancedGrBlendEqua tion);
54 GR_STATIC_ASSERT(11 == kHSLHue_GrBlendEquation - kFirstAdvancedGrBlendEquati on); 55 GR_STATIC_ASSERT(11 == kHSLHue_GrBlendEquation - kFirstAdvancedGrBlendEquati on);
55 GR_STATIC_ASSERT(12 == kHSLSaturation_GrBlendEquation - kFirstAdvancedGrBlen dEquation); 56 GR_STATIC_ASSERT(12 == kHSLSaturation_GrBlendEquation - kFirstAdvancedGrBlen dEquation);
56 GR_STATIC_ASSERT(13 == kHSLColor_GrBlendEquation - kFirstAdvancedGrBlendEqua tion); 57 GR_STATIC_ASSERT(13 == kHSLColor_GrBlendEquation - kFirstAdvancedGrBlendEqua tion);
57 GR_STATIC_ASSERT(14 == kHSLLuminosity_GrBlendEquation - kFirstAdvancedGrBlen dEquation); 58 GR_STATIC_ASSERT(14 == kHSLLuminosity_GrBlendEquation - kFirstAdvancedGrBlen dEquation);
58 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kLayoutQualifierNames) == 59 GR_STATIC_ASSERT(SK_ARRAY_COUNT(kLayoutQualifierNames) ==
59 kGrBlendEquationCnt - kFirstAdvancedGrBlendEquation); 60 kGrBlendEquationCnt - kFirstAdvancedGrBlendEquation);
60 } 61 }
61 62
62 GrGLFragmentShaderBuilder::DstReadKey
63 GrGLFragmentShaderBuilder::KeyForDstRead(const GrTexture* dstTexture, const GrGL Caps& caps) {
64 uint32_t key = kYesDstRead_DstReadKeyBit;
65 if (caps.glslCaps()->fbFetchSupport()) {
66 return key;
67 }
68 SkASSERT(dstTexture);
69 if (!caps.textureSwizzleSupport() && GrPixelConfigIsAlphaOnly(dstTexture->co nfig())) {
70 // The fact that the config is alpha-only must be considered when genera ting code.
71 key |= kUseAlphaConfig_DstReadKeyBit;
72 }
73 if (kTopLeft_GrSurfaceOrigin == dstTexture->origin()) {
74 key |= kTopLeftOrigin_DstReadKeyBit;
75 }
76 SkASSERT(static_cast<DstReadKey>(key) == key);
77 return static_cast<DstReadKey>(key);
78 }
79
80 GrGLFragmentShaderBuilder::FragPosKey 63 GrGLFragmentShaderBuilder::FragPosKey
81 GrGLFragmentShaderBuilder::KeyForFragmentPosition(const GrRenderTarget* dst, con st GrGLCaps&) { 64 GrGLFragmentShaderBuilder::KeyForFragmentPosition(const GrRenderTarget* dst) {
82 if (kTopLeft_GrSurfaceOrigin == dst->origin()) { 65 if (kTopLeft_GrSurfaceOrigin == dst->origin()) {
83 return kTopLeftFragPosRead_FragPosKey; 66 return kTopLeftFragPosRead_FragPosKey;
84 } else { 67 } else {
85 return kBottomLeftFragPosRead_FragPosKey; 68 return kBottomLeftFragPosRead_FragPosKey;
86 } 69 }
87 } 70 }
88 71
89 GrGLFragmentShaderBuilder::GrGLFragmentShaderBuilder(GrGLProgramBuilder* program , 72 GrGLFragmentShaderBuilder::GrGLFragmentShaderBuilder(GrGLProgramBuilder* program ,
90 uint8_t fragPosKey) 73 uint8_t fragPosKey)
91 : INHERITED(program) 74 : INHERITED(program)
92 , fHasCustomColorOutput(false) 75 , fHasCustomColorOutput(false)
93 , fHasSecondaryOutput(false) 76 , fHasSecondaryOutput(false)
94 , fSetupFragPosition(false) 77 , fSetupFragPosition(false)
95 , fTopLeftFragPosRead(kTopLeftFragPosRead_FragPosKey == fragPosKey) 78 , fTopLeftFragPosRead(kTopLeftFragPosRead_FragPosKey == fragPosKey)
96 , fCustomColorOutputIndex(-1) 79 , fCustomColorOutputIndex(-1)
97 , fHasReadDstColor(false) 80 , fHasReadDstColor(false)
98 , fHasReadFragmentPosition(false) { 81 , fHasReadFragmentPosition(false) {
99 } 82 }
100 83
101 bool GrGLFragmentShaderBuilder::enableFeature(GLSLFeature feature) { 84 bool GrGLFragmentShaderBuilder::enableFeature(GLSLFeature feature) {
102 switch (feature) { 85 switch (feature) {
103 case kStandardDerivatives_GLSLFeature: { 86 case kStandardDerivatives_GLSLFeature: {
104 GrGLGpu* gpu = fProgramBuilder->gpu(); 87 if (!fProgramBuilder->glslCaps()->shaderDerivativeSupport()) {
105 if (!gpu->glCaps().shaderCaps()->shaderDerivativeSupport()) {
106 return false; 88 return false;
107 } 89 }
108 if (kGLES_GrGLStandard == gpu->glStandard() && 90 const char* extension = fProgramBuilder->glslCaps()->shaderDerivativ eExtensionString();
109 k110_GrGLSLGeneration == gpu->glslGeneration()) { 91 if (extension) {
110 this->addFeature(1 << kStandardDerivatives_GLSLFeature, 92 this->addFeature(1 << kStandardDerivatives_GLSLFeature, extensio n);
111 "GL_OES_standard_derivatives");
112 } 93 }
113 return true; 94 return true;
114 } 95 }
115 default: 96 default:
116 SkFAIL("Unexpected GLSLFeature requested."); 97 SkFAIL("Unexpected GLSLFeature requested.");
117 return false; 98 return false;
118 } 99 }
119 } 100 }
120 101
121 SkString GrGLFragmentShaderBuilder::ensureFSCoords2D(const GrGLSLTransformedCoor dsArray& coords, 102 SkString GrGLFragmentShaderBuilder::ensureFSCoords2D(const GrGLSLTransformedCoor dsArray& coords,
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 SkASSERT(!fHasSecondaryOutput); 222 SkASSERT(!fHasSecondaryOutput);
242 fHasSecondaryOutput = true; 223 fHasSecondaryOutput = true;
243 if (kGLES_GrGLStandard == fProgramBuilder->gpu()->ctxInfo().standard()) { 224 if (kGLES_GrGLStandard == fProgramBuilder->gpu()->ctxInfo().standard()) {
244 this->addFeature(1 << kBlendFuncExtended_GLSLPrivateFeature, "GL_EXT_ble nd_func_extended"); 225 this->addFeature(1 << kBlendFuncExtended_GLSLPrivateFeature, "GL_EXT_ble nd_func_extended");
245 } 226 }
246 227
247 // If the primary output is declared, we must declare also the secondary out put 228 // If the primary output is declared, we must declare also the secondary out put
248 // and vice versa, since it is not allowed to use a built-in gl_FragColor an d a custom 229 // and vice versa, since it is not allowed to use a built-in gl_FragColor an d a custom
249 // output. The condition also co-incides with the condition in whici GLES SL 2.0 230 // output. The condition also co-incides with the condition in whici GLES SL 2.0
250 // requires the built-in gl_SecondaryFragColorEXT, where as 3.0 requires a c ustom output. 231 // requires the built-in gl_SecondaryFragColorEXT, where as 3.0 requires a c ustom output.
251 const GrGLSLCaps& caps = *fProgramBuilder->gpu()->glCaps().glslCaps(); 232 const GrGLSLCaps& caps = *fProgramBuilder->glslCaps();
252 if (caps.mustDeclareFragmentShaderOutput()) { 233 if (caps.mustDeclareFragmentShaderOutput()) {
253 fOutputs.push_back().set(kVec4f_GrSLType, GrGLSLShaderVar::kOut_TypeModi fier, 234 fOutputs.push_back().set(kVec4f_GrSLType, GrGLSLShaderVar::kOut_TypeModi fier,
254 declared_secondary_color_output_name()); 235 declared_secondary_color_output_name());
255 } 236 }
256 } 237 }
257 238
258 const char* GrGLFragmentShaderBuilder::getPrimaryColorOutputName() const { 239 const char* GrGLFragmentShaderBuilder::getPrimaryColorOutputName() const {
259 return fHasCustomColorOutput ? declared_color_output_name() : "gl_FragColor" ; 240 return fHasCustomColorOutput ? declared_color_output_name() : "gl_FragColor" ;
260 } 241 }
261 242
262 const char* GrGLFragmentShaderBuilder::getSecondaryColorOutputName() const { 243 const char* GrGLFragmentShaderBuilder::getSecondaryColorOutputName() const {
263 const GrGLSLCaps& caps = *fProgramBuilder->gpu()->glCaps().glslCaps(); 244 const GrGLSLCaps& caps = *fProgramBuilder->gpu()->glCaps().glslCaps();
264 return caps.mustDeclareFragmentShaderOutput() ? declared_secondary_color_out put_name() 245 return caps.mustDeclareFragmentShaderOutput() ? declared_secondary_color_out put_name()
265 : "gl_SecondaryFragColorEXT"; 246 : "gl_SecondaryFragColorEXT";
266 } 247 }
267 248
268 bool GrGLFragmentShaderBuilder::compileAndAttachShaders(GrGLuint programId, 249 void GrGLFragmentShaderBuilder::onFinalize() {
269 SkTDArray<GrGLuint>* sha derIds) {
270 this->versionDecl() = fProgramBuilder->glslCaps()->versionDeclString();
271 GrGLSLAppendDefaultFloatPrecisionDeclaration(kDefault_GrSLPrecision, 250 GrGLSLAppendDefaultFloatPrecisionDeclaration(kDefault_GrSLPrecision,
272 *fProgramBuilder->glslCaps(), 251 *fProgramBuilder->glslCaps(),
273 &this->precisionQualifier()); 252 &this->precisionQualifier());
274 this->compileAndAppendLayoutQualifiers();
275 fProgramBuilder->appendUniformDecls(GrGLProgramBuilder::kFragment_Visibility ,
276 &this->uniforms());
277 this->appendDecls(fInputs, &this->inputs());
278 // We shouldn't have declared outputs on 1.10
279 SkASSERT(k110_GrGLSLGeneration != fProgramBuilder->gpu()->glslGeneration() | | fOutputs.empty());
280 this->appendDecls(fOutputs, &this->outputs());
281 return this->finalize(programId, GR_GL_FRAGMENT_SHADER, shaderIds);
282 } 253 }
283 254
284 void GrGLFragmentShaderBuilder::bindFragmentShaderLocations(GrGLuint programID) { 255 void GrGLFragmentShaderBuilder::bindFragmentShaderLocations(GrGLuint programID) {
285 const GrGLCaps& caps = fProgramBuilder->gpu()->glCaps(); 256 const GrGLCaps& caps = fProgramBuilder->gpu()->glCaps();
286 if (fHasCustomColorOutput && caps.bindFragDataLocationSupport()) { 257 if (fHasCustomColorOutput && caps.bindFragDataLocationSupport()) {
287 GL_CALL(BindFragDataLocation(programID, 0, declared_color_output_name()) ); 258 GL_CALL(BindFragDataLocation(programID, 0, declared_color_output_name()) );
288 } 259 }
289 if (fHasSecondaryOutput && caps.glslCaps()->mustDeclareFragmentShaderOutput( )) { 260 if (fHasSecondaryOutput && caps.glslCaps()->mustDeclareFragmentShaderOutput( )) {
290 GL_CALL(BindFragDataLocationIndexed(programID, 0, 1, 261 GL_CALL(BindFragDataLocationIndexed(programID, 0, 1,
291 declared_secondary_color_output_name ())); 262 declared_secondary_color_output_name ()));
(...skipping 16 matching lines...) Expand all
308 fMangleString.appendf("_c%d", fSubstageIndices[fSubstageIndices.count() - 2] ); 279 fMangleString.appendf("_c%d", fSubstageIndices[fSubstageIndices.count() - 2] );
309 } 280 }
310 281
311 void GrGLFragmentBuilder::onAfterChildProcEmitCode() { 282 void GrGLFragmentBuilder::onAfterChildProcEmitCode() {
312 SkASSERT(fSubstageIndices.count() >= 2); 283 SkASSERT(fSubstageIndices.count() >= 2);
313 fSubstageIndices.pop_back(); 284 fSubstageIndices.pop_back();
314 fSubstageIndices.back()++; 285 fSubstageIndices.back()++;
315 int removeAt = fMangleString.findLastOf('_'); 286 int removeAt = fMangleString.findLastOf('_');
316 fMangleString.remove(removeAt, fMangleString.size() - removeAt); 287 fMangleString.remove(removeAt, fMangleString.size() - removeAt);
317 } 288 }
OLDNEW
« no previous file with comments | « src/gpu/gl/builders/GrGLFragmentShaderBuilder.h ('k') | src/gpu/gl/builders/GrGLGeometryShaderBuilder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698