aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/gl/GrGLShaderBuilder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpu/gl/GrGLShaderBuilder.cpp')
-rw-r--r--src/gpu/gl/GrGLShaderBuilder.cpp86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/gpu/gl/GrGLShaderBuilder.cpp b/src/gpu/gl/GrGLShaderBuilder.cpp
index 321e507e4b..289e7be634 100644
--- a/src/gpu/gl/GrGLShaderBuilder.cpp
+++ b/src/gpu/gl/GrGLShaderBuilder.cpp
@@ -6,6 +6,7 @@
*/
#include "gl/GrGLShaderBuilder.h"
+#include "gl/GrGLProgram.h"
namespace {
@@ -33,6 +34,7 @@ GrGLShaderBuilder::GrGLShaderBuilder()
, fFSOutputs(sMaxFSOutputs)
, fUsesGS(false)
, fVaryingDims(0)
+ , fSamplerMode(kDefault_SamplerMode)
, fComplexCoord(false) {
}
@@ -85,3 +87,87 @@ void GrGLShaderBuilder::appendVarying(GrSLType type,
nameWithStage.appendS32(stageNum);
this->appendVarying(type, nameWithStage.c_str(), vsOutName, fsInName);
}
+
+void GrGLShaderBuilder::computeSwizzle(uint32_t configFlags) {
+ static const uint32_t kMulByAlphaMask =
+ (GrGLProgram::StageDesc::kMulRGBByAlpha_RoundUp_InConfigFlag |
+ GrGLProgram::StageDesc::kMulRGBByAlpha_RoundDown_InConfigFlag);
+
+ fSwizzle = "";
+ if (configFlags & GrGLProgram::StageDesc::kSwapRAndB_InConfigFlag) {
+ GrAssert(!(configFlags &
+ GrGLProgram::StageDesc::kSmearAlpha_InConfigFlag));
+ GrAssert(!(configFlags &
+ GrGLProgram::StageDesc::kSmearRed_InConfigFlag));
+ fSwizzle = ".bgra";
+ } else if (configFlags & GrGLProgram::StageDesc::kSmearAlpha_InConfigFlag) {
+ GrAssert(!(configFlags & kMulByAlphaMask));
+ GrAssert(!(configFlags &
+ GrGLProgram::StageDesc::kSmearRed_InConfigFlag));
+ fSwizzle = ".aaaa";
+ } else if (configFlags & GrGLProgram::StageDesc::kSmearRed_InConfigFlag) {
+ GrAssert(!(configFlags & kMulByAlphaMask));
+ GrAssert(!(configFlags &
+ GrGLProgram::StageDesc::kSmearAlpha_InConfigFlag));
+ fSwizzle = ".rrrr";
+ }
+}
+
+void GrGLShaderBuilder::computeModulate(const char* fsInColor) {
+ if (NULL != fsInColor) {
+ fModulate.printf(" * %s", fsInColor);
+ }
+}
+
+void GrGLShaderBuilder::emitTextureSetup() {
+ GrStringBuilder retval;
+
+ switch (fSamplerMode) {
+ case kDefault_SamplerMode:
+ // Fall through
+ case kProj_SamplerMode:
+ // Do nothing
+ break;
+ case kExplicitDivide_SamplerMode:
+ retval = "inCoord";
+ fFSCode.appendf("\t %s %s = %s%s / %s%s\n",
+ GrGLShaderVar::TypeString
+ (GrSLFloatVectorType(fCoordDims)),
+ retval.c_str(),
+ fSampleCoords.c_str(),
+ GrGLSLVectorNonhomogCoords(fVaryingDims),
+ fSampleCoords.c_str(),
+ GrGLSLVectorHomogCoord(fVaryingDims));
+ fSampleCoords = retval;
+ break;
+ }
+}
+
+void GrGLShaderBuilder::emitTextureLookup(const char* samplerName,
+ const char* coordName) {
+ if (NULL == coordName) {
+ coordName = fSampleCoords.c_str();
+ }
+ switch (fSamplerMode) {
+ default:
+ SkDEBUGFAIL("Unknown sampler mode");
+ // Fall through
+ case kDefault_SamplerMode:
+ // Fall through
+ case kExplicitDivide_SamplerMode:
+ fFSCode.appendf("texture2D(%s, %s)", samplerName, coordName);
+ break;
+ case kProj_SamplerMode:
+ fFSCode.appendf("texture2DProj(%s, %s)", samplerName, coordName);
+ break;
+ }
+
+}
+
+void GrGLShaderBuilder::emitDefaultFetch(const char* outColor,
+ const char* samplerName) {
+ fFSCode.appendf("\t%s = ", outColor);
+ this->emitTextureLookup(samplerName);
+ fFSCode.appendf("%s%s;\n", fSwizzle.c_str(), fModulate.c_str());
+}
+