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

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

Issue 665893008: Bug fix for es 3.00 fb fetch (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: feedback inc Created 6 years, 2 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/GrGLFragmentShaderBuilder.h ('k') | no next file » | 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 "GrGLFragmentShaderBuilder.h" 8 #include "GrGLFragmentShaderBuilder.h"
9 #include "GrGLShaderStringBuilder.h" 9 #include "GrGLShaderStringBuilder.h"
10 #include "GrGLProgramBuilder.h" 10 #include "GrGLProgramBuilder.h"
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 } 68 }
69 } 69 }
70 70
71 GrGLFragmentShaderBuilder::GrGLFragmentShaderBuilder(GrGLProgramBuilder* program , 71 GrGLFragmentShaderBuilder::GrGLFragmentShaderBuilder(GrGLProgramBuilder* program ,
72 const GrGLProgramDesc& desc ) 72 const GrGLProgramDesc& desc )
73 : INHERITED(program) 73 : INHERITED(program)
74 , fHasCustomColorOutput(false) 74 , fHasCustomColorOutput(false)
75 , fHasSecondaryOutput(false) 75 , fHasSecondaryOutput(false)
76 , fSetupFragPosition(false) 76 , fSetupFragPosition(false)
77 , fTopLeftFragPosRead(kTopLeftFragPosRead_FragPosKey == desc.getHeader().fFr agPosKey) 77 , fTopLeftFragPosRead(kTopLeftFragPosRead_FragPosKey == desc.getHeader().fFr agPosKey)
78 , fCustomColorOutputIndex(-1)
78 , fHasReadDstColor(false) 79 , fHasReadDstColor(false)
79 , fHasReadFragmentPosition(false) { 80 , fHasReadFragmentPosition(false) {
80 } 81 }
81 82
82 bool GrGLFragmentShaderBuilder::enableFeature(GLSLFeature feature) { 83 bool GrGLFragmentShaderBuilder::enableFeature(GLSLFeature feature) {
83 switch (feature) { 84 switch (feature) {
84 case kStandardDerivatives_GLSLFeature: { 85 case kStandardDerivatives_GLSLFeature: {
85 GrGpuGL* gpu = fProgramBuilder->gpu(); 86 GrGpuGL* gpu = fProgramBuilder->gpu();
86 if (!gpu->glCaps().shaderDerivativeSupport()) { 87 if (!gpu->glCaps().shaderDerivativeSupport()) {
87 return false; 88 return false;
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 } 166 }
166 } 167 }
167 168
168 const char* GrGLFragmentShaderBuilder::dstColor() { 169 const char* GrGLFragmentShaderBuilder::dstColor() {
169 fHasReadDstColor = true; 170 fHasReadDstColor = true;
170 171
171 GrGpuGL* gpu = fProgramBuilder->gpu(); 172 GrGpuGL* gpu = fProgramBuilder->gpu();
172 if (gpu->glCaps().fbFetchSupport()) { 173 if (gpu->glCaps().fbFetchSupport()) {
173 this->addFeature(1 << (GrGLFragmentShaderBuilder::kLastGLSLPrivateFeatur e + 1), 174 this->addFeature(1 << (GrGLFragmentShaderBuilder::kLastGLSLPrivateFeatur e + 1),
174 gpu->glCaps().fbFetchExtensionString()); 175 gpu->glCaps().fbFetchExtensionString());
175 return gpu->glCaps().fbFetchColorName(); 176
177 // On ES 3.0 we have to declare this, and use the custom color output na me
178 const char* fbFetchColorName = gpu->glCaps().fbFetchColorName();
179 if (gpu->glslGeneration() >= k330_GrGLSLGeneration) {
180 this->enableCustomOutput();
181 fOutputs[fCustomColorOutputIndex].setTypeModifier(GrShaderVar::kInOu t_TypeModifier);
182 fbFetchColorName = declared_color_output_name();
183 }
184 return fbFetchColorName;
176 } else if (fProgramBuilder->fUniformHandles.fDstCopySamplerUni.isValid()) { 185 } else if (fProgramBuilder->fUniformHandles.fDstCopySamplerUni.isValid()) {
177 return kDstCopyColorName; 186 return kDstCopyColorName;
178 } else { 187 } else {
179 return ""; 188 return "";
180 } 189 }
181 } 190 }
182 191
183 void GrGLFragmentShaderBuilder::emitCodeToReadDstTexture() { 192 void GrGLFragmentShaderBuilder::emitCodeToReadDstTexture() {
184 bool topDown = SkToBool(kTopLeftOrigin_DstReadKeyBit & fProgramBuilder->head er().fDstReadKey); 193 bool topDown = SkToBool(kTopLeftOrigin_DstReadKeyBit & fProgramBuilder->head er().fDstReadKey);
185 const char* dstCopyTopLeftName; 194 const char* dstCopyTopLeftName;
(...skipping 30 matching lines...) Expand all
216 } 225 }
217 this->codeAppendf("vec4 %s = ", GrGLFragmentShaderBuilder::kDstCopyColorName ); 226 this->codeAppendf("vec4 %s = ", GrGLFragmentShaderBuilder::kDstCopyColorName );
218 this->appendTextureLookup(dstCopySamplerName, 227 this->appendTextureLookup(dstCopySamplerName,
219 "_dstTexCoord", 228 "_dstTexCoord",
220 configMask, 229 configMask,
221 "rgba"); 230 "rgba");
222 this->codeAppend(";"); 231 this->codeAppend(";");
223 } 232 }
224 233
225 void GrGLFragmentShaderBuilder::enableCustomOutput() { 234 void GrGLFragmentShaderBuilder::enableCustomOutput() {
226 SkASSERT(!fHasCustomColorOutput); 235 if (!fHasCustomColorOutput) {
227 fHasCustomColorOutput = true; 236 fHasCustomColorOutput = true;
228 fOutputs.push_back().set(kVec4f_GrSLType, 237 fCustomColorOutputIndex = fOutputs.count();
229 GrGLShaderVar::kOut_TypeModifier, 238 fOutputs.push_back().set(kVec4f_GrSLType,
230 declared_color_output_name()); 239 GrGLShaderVar::kOut_TypeModifier,
240 declared_color_output_name());
241 }
231 } 242 }
232 243
233 void GrGLFragmentShaderBuilder::enableSecondaryOutput() { 244 void GrGLFragmentShaderBuilder::enableSecondaryOutput() {
234 SkASSERT(!fHasSecondaryOutput); 245 SkASSERT(!fHasSecondaryOutput);
235 fHasSecondaryOutput = true; 246 fHasSecondaryOutput = true;
236 fOutputs.push_back().set(kVec4f_GrSLType, GrGLShaderVar::kOut_TypeModifier, 247 fOutputs.push_back().set(kVec4f_GrSLType, GrGLShaderVar::kOut_TypeModifier,
237 dual_source_output_name()); 248 dual_source_output_name());
238 } 249 }
239 250
240 const char* GrGLFragmentShaderBuilder::getPrimaryColorOutputName() const { 251 const char* GrGLFragmentShaderBuilder::getPrimaryColorOutputName() const {
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
337 348
338 void GrGLFragmentShaderBuilder::addVarying(GrSLType type, 349 void GrGLFragmentShaderBuilder::addVarying(GrSLType type,
339 const char* name, 350 const char* name,
340 const char** fsInName, 351 const char** fsInName,
341 GrGLShaderVar::Precision fsPrecision) { 352 GrGLShaderVar::Precision fsPrecision) {
342 fInputs.push_back().set(type, GrGLShaderVar::kVaryingIn_TypeModifier, name, fsPrecision); 353 fInputs.push_back().set(type, GrGLShaderVar::kVaryingIn_TypeModifier, name, fsPrecision);
343 if (fsInName) { 354 if (fsInName) {
344 *fsInName = name; 355 *fsInName = name;
345 } 356 }
346 } 357 }
OLDNEW
« no previous file with comments | « src/gpu/gl/builders/GrGLFragmentShaderBuilder.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698