Index: src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp |
diff --git a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp |
index d06c2f348872b7c8c2406c2d338156e9785d785c..c464ffd3b1f1fe9153d89d25d3c1ebfe81861884 100644 |
--- a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp |
+++ b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp |
@@ -7,17 +7,11 @@ |
#include "GrGLFragmentShaderBuilder.h" |
#include "GrRenderTarget.h" |
-#include "GrGLProgramBuilder.h" |
-#include "gl/GrGLGpu.h" |
#include "glsl/GrGLSL.h" |
#include "glsl/GrGLSLCaps.h" |
- |
-#define GL_CALL(X) GR_GL_CALL(fProgramBuilder->gpu()->glInterface(), X) |
-#define GL_CALL_RET(R, X) GR_GL_CALL_RET(fProgramBuilder->gpu()->glInterface(), R, X) |
+#include "glsl/GrGLSLProgramBuilder.h" |
const char* GrGLFragmentShaderBuilder::kDstTextureColorName = "_dstColor"; |
-static const char* declared_color_output_name() { return "fsColorOut"; } |
-static const char* declared_secondary_color_output_name() { return "fsSecondaryColorOut"; } |
static const char* specific_layout_qualifier_name(GrBlendEquation equation) { |
SkASSERT(GrBlendEquationIsAdvanced(equation)); |
@@ -69,11 +63,9 @@ GrGLFragmentShaderBuilder::KeyForFragmentPosition(const GrRenderTarget* dst) { |
} |
} |
-GrGLFragmentShaderBuilder::GrGLFragmentShaderBuilder(GrGLProgramBuilder* program, |
+GrGLFragmentShaderBuilder::GrGLFragmentShaderBuilder(GrGLSLProgramBuilder* program, |
uint8_t fragPosKey) |
: INHERITED(program) |
- , fHasCustomColorOutput(false) |
- , fHasSecondaryOutput(false) |
, fSetupFragPosition(false) |
, fTopLeftFragPosRead(kTopLeftFragPosRead_FragPosKey == fragPosKey) |
, fCustomColorOutputIndex(-1) |
@@ -118,18 +110,18 @@ SkString GrGLFragmentShaderBuilder::ensureFSCoords2D(const GrGLSLTransformedCoor |
const char* GrGLFragmentShaderBuilder::fragmentPosition() { |
fHasReadFragmentPosition = true; |
- GrGLGpu* gpu = fProgramBuilder->gpu(); |
+ const GrGLSLCaps* glslCaps = fProgramBuilder->glslCaps(); |
// We only declare "gl_FragCoord" when we're in the case where we want to use layout qualifiers |
// to reverse y. Otherwise it isn't necessary and whether the "in" qualifier appears in the |
// declaration varies in earlier GLSL specs. So it is simpler to omit it. |
if (fTopLeftFragPosRead) { |
fSetupFragPosition = true; |
return "gl_FragCoord"; |
- } else if (gpu->glCaps().fragCoordConventionsSupport()) { |
+ } else if (const char* extension = glslCaps->fragCoordConventionsExtensionString()) { |
if (!fSetupFragPosition) { |
- if (gpu->glslGeneration() < k150_GrGLSLGeneration) { |
+ if (glslCaps->generation() < k150_GrGLSLGeneration) { |
this->addFeature(1 << kFragCoordConventions_GLSLPrivateFeature, |
- "GL_ARB_fragment_coord_conventions"); |
+ extension); |
} |
fInputs.push_back().set(kVec4f_GrSLType, |
GrGLSLShaderVar::kIn_TypeModifier, |
@@ -147,7 +139,7 @@ const char* GrGLFragmentShaderBuilder::fragmentPosition() { |
const char* rtHeightName; |
fProgramBuilder->fUniformHandles.fRTHeightUni = |
- fProgramBuilder->addFragPosUniform(GrGLProgramBuilder::kFragment_Visibility, |
+ fProgramBuilder->addFragPosUniform(GrGLSLProgramBuilder::kFragment_Visibility, |
kFloat_GrSLType, |
kDefault_GrSLPrecision, |
"RTHeight", |
@@ -181,7 +173,7 @@ const char* GrGLFragmentShaderBuilder::dstColor() { |
if (glslCaps->fbFetchNeedsCustomOutput()) { |
this->enableCustomOutput(); |
fOutputs[fCustomColorOutputIndex].setTypeModifier(GrShaderVar::kInOut_TypeModifier); |
- fbFetchColorName = declared_color_output_name(); |
+ fbFetchColorName = DeclaredColorOutputName(); |
} |
return fbFetchColorName; |
} else { |
@@ -212,35 +204,35 @@ void GrGLFragmentShaderBuilder::enableCustomOutput() { |
fCustomColorOutputIndex = fOutputs.count(); |
fOutputs.push_back().set(kVec4f_GrSLType, |
GrGLSLShaderVar::kOut_TypeModifier, |
- declared_color_output_name()); |
+ DeclaredColorOutputName()); |
} |
} |
void GrGLFragmentShaderBuilder::enableSecondaryOutput() { |
SkASSERT(!fHasSecondaryOutput); |
fHasSecondaryOutput = true; |
- if (kGLES_GrGLStandard == fProgramBuilder->gpu()->ctxInfo().standard()) { |
- this->addFeature(1 << kBlendFuncExtended_GLSLPrivateFeature, "GL_EXT_blend_func_extended"); |
+ const GrGLSLCaps& caps = *fProgramBuilder->glslCaps(); |
+ if (const char* extension = caps.secondaryOutputExtensionString()) { |
+ this->addFeature(1 << kBlendFuncExtended_GLSLPrivateFeature, extension); |
} |
// If the primary output is declared, we must declare also the secondary output |
// and vice versa, since it is not allowed to use a built-in gl_FragColor and a custom |
// output. The condition also co-incides with the condition in whici GLES SL 2.0 |
// requires the built-in gl_SecondaryFragColorEXT, where as 3.0 requires a custom output. |
- const GrGLSLCaps& caps = *fProgramBuilder->glslCaps(); |
if (caps.mustDeclareFragmentShaderOutput()) { |
fOutputs.push_back().set(kVec4f_GrSLType, GrGLSLShaderVar::kOut_TypeModifier, |
- declared_secondary_color_output_name()); |
+ DeclaredSecondaryColorOutputName()); |
} |
} |
const char* GrGLFragmentShaderBuilder::getPrimaryColorOutputName() const { |
- return fHasCustomColorOutput ? declared_color_output_name() : "gl_FragColor"; |
+ return fHasCustomColorOutput ? DeclaredColorOutputName() : "gl_FragColor"; |
} |
const char* GrGLFragmentShaderBuilder::getSecondaryColorOutputName() const { |
- const GrGLSLCaps& caps = *fProgramBuilder->gpu()->glCaps().glslCaps(); |
- return caps.mustDeclareFragmentShaderOutput() ? declared_secondary_color_output_name() |
+ const GrGLSLCaps& caps = *fProgramBuilder->glslCaps(); |
+ return caps.mustDeclareFragmentShaderOutput() ? DeclaredSecondaryColorOutputName() |
: "gl_SecondaryFragColorEXT"; |
} |
@@ -250,18 +242,7 @@ void GrGLFragmentShaderBuilder::onFinalize() { |
&this->precisionQualifier()); |
} |
-void GrGLFragmentShaderBuilder::bindFragmentShaderLocations(GrGLuint programID) { |
- const GrGLCaps& caps = fProgramBuilder->gpu()->glCaps(); |
- if (fHasCustomColorOutput && caps.bindFragDataLocationSupport()) { |
- GL_CALL(BindFragDataLocation(programID, 0, declared_color_output_name())); |
- } |
- if (fHasSecondaryOutput && caps.glslCaps()->mustDeclareFragmentShaderOutput()) { |
- GL_CALL(BindFragDataLocationIndexed(programID, 0, 1, |
- declared_secondary_color_output_name())); |
- } |
-} |
- |
-void GrGLFragmentShaderBuilder::addVarying(GrGLVarying* v, GrSLPrecision fsPrec) { |
+void GrGLFragmentShaderBuilder::addVarying(GrGLSLVarying* v, GrSLPrecision fsPrec) { |
v->fFsIn = v->fVsOut; |
if (v->fGsOut) { |
v->fFsIn = v->fGsOut; |
@@ -284,3 +265,4 @@ void GrGLFragmentBuilder::onAfterChildProcEmitCode() { |
int removeAt = fMangleString.findLastOf('_'); |
fMangleString.remove(removeAt, fMangleString.size() - removeAt); |
} |
+ |