diff options
author | 2016-10-11 08:47:04 -0700 | |
---|---|---|
committer | 2016-10-11 08:47:06 -0700 | |
commit | ccb1dd8f267f9d7fe7c9d0ce222ebc81b41853b3 (patch) | |
tree | 8ba52d3b32da6ed9c3feefb30abd2c9ee66f4a3e /src/gpu | |
parent | 568c98606fee6ad1b8a0714dd4dffbd4aa1d11d0 (diff) |
Turned on SkSL->GLSL compiler
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2288033003
Committed: https://skia.googlesource.com/skia/+/9b0fe3d125f237d9884732a48414fa85fc71b4e3
Committed: https://skia.googlesource.com/skia/+/b12b3c6908c62c908b3680be01e3b5bfd30de310
Committed: https://skia.googlesource.com/skia/+/f008b0a59f45c0d4bea3e66faf3b01805009ec89
Committed: https://skia.googlesource.com/skia/+/08b2ccf398e2b81bc05d2c105837e5419899469b
Committed: https://skia.googlesource.com/skia/+/dcfe6dba4a335e50e86ff68e3252065d4197432c
Review-Url: https://codereview.chromium.org/2288033003
Diffstat (limited to 'src/gpu')
-rw-r--r-- | src/gpu/gl/GrGLContext.cpp | 12 | ||||
-rw-r--r-- | src/gpu/gl/GrGLContext.h | 17 | ||||
-rw-r--r-- | src/gpu/gl/GrGLGpu.cpp | 44 | ||||
-rw-r--r-- | src/gpu/gl/builders/GrGLShaderStringBuilder.cpp | 130 | ||||
-rw-r--r-- | src/gpu/gl/builders/GrGLShaderStringBuilder.h | 3 | ||||
-rw-r--r-- | src/gpu/glsl/GrGLSLFragmentShaderBuilder.cpp | 10 | ||||
-rw-r--r-- | src/gpu/glsl/GrGLSLFragmentShaderBuilder.h | 2 | ||||
-rw-r--r-- | src/gpu/glsl/GrGLSLShaderBuilder.h | 24 | ||||
-rw-r--r-- | src/gpu/glsl/GrGLSLShaderVar.h | 10 | ||||
-rw-r--r-- | src/gpu/instanced/InstanceProcessor.cpp | 34 |
10 files changed, 202 insertions, 84 deletions
diff --git a/src/gpu/gl/GrGLContext.cpp b/src/gpu/gl/GrGLContext.cpp index 9e70b472c5..2126314a7b 100644 --- a/src/gpu/gl/GrGLContext.cpp +++ b/src/gpu/gl/GrGLContext.cpp @@ -7,6 +7,7 @@ #include "GrGLContext.h" #include "GrGLGLSL.h" +#include "SkSLCompiler.h" //////////////////////////////////////////////////////////////////////////////// @@ -63,6 +64,17 @@ GrGLContext* GrGLContext::Create(const GrGLInterface* interface, const GrContext return new GrGLContext(args); } +GrGLContext::~GrGLContext() { + delete fCompiler; +} + +SkSL::Compiler* GrGLContext::compiler() const { + if (!fCompiler) { + fCompiler = new SkSL::Compiler(); + } + return fCompiler; +} + GrGLContextInfo::GrGLContextInfo(const ConstructorArgs& args) { fInterface.reset(SkRef(args.fInterface)); fGLVersion = args.fGLVersion; diff --git a/src/gpu/gl/GrGLContext.h b/src/gpu/gl/GrGLContext.h index 6016f6859a..8207ac89b0 100644 --- a/src/gpu/gl/GrGLContext.h +++ b/src/gpu/gl/GrGLContext.h @@ -15,6 +15,9 @@ #include "GrGLUtil.h" struct GrContextOptions; +namespace SkSL { + class Compiler; +} /** * Encapsulates information about an OpenGL context including the OpenGL @@ -39,6 +42,8 @@ public: const GrGLExtensions& extensions() const { return fInterface->fExtensions; } + virtual ~GrGLContextInfo() {} + protected: struct ConstructorArgs { const GrGLInterface* fInterface; @@ -64,7 +69,7 @@ protected: }; /** - * Extension of GrGLContextInfo that also provides access to GrGLInterface. + * Extension of GrGLContextInfo that also provides access to GrGLInterface and SkSL::Compiler. */ class GrGLContext : public GrGLContextInfo { public: @@ -76,8 +81,16 @@ public: const GrGLInterface* interface() const { return fInterface; } + SkSL::Compiler* compiler() const; + + ~GrGLContext() override; + private: - GrGLContext(const ConstructorArgs& args) : INHERITED(args) {} + GrGLContext(const ConstructorArgs& args) + : INHERITED(args) + , fCompiler(nullptr) {} + + mutable SkSL::Compiler* fCompiler; typedef GrGLContextInfo INHERITED; }; diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp index 5755702463..8c0373ac28 100644 --- a/src/gpu/gl/GrGLGpu.cpp +++ b/src/gpu/gl/GrGLGpu.cpp @@ -3790,20 +3790,11 @@ bool GrGLGpu::createCopyProgram(int progIdx) { fshaderTxt.append(";"); uTexture.appendDecl(glslCaps, &fshaderTxt); fshaderTxt.append(";"); - const char* fsOutName; - if (glslCaps->mustDeclareFragmentShaderOutput()) { - oFragColor.appendDecl(glslCaps, &fshaderTxt); - fshaderTxt.append(";"); - fsOutName = oFragColor.c_str(); - } else { - fsOutName = "gl_FragColor"; - } fshaderTxt.appendf( "// Copy Program FS\n" "void main() {" - " %s = %s(u_texture, v_texCoord);" + " sk_FragColor = %s(u_texture, v_texCoord);" "}", - fsOutName, GrGLSLTexture2DFunctionName(kVec2f_GrSLType, kSamplerTypes[progIdx], this->glslGeneration()) ); @@ -3936,14 +3927,6 @@ bool GrGLGpu::createMipmapProgram(int progIdx) { } uTexture.appendDecl(glslCaps, &fshaderTxt); fshaderTxt.append(";"); - const char* fsOutName; - if (glslCaps->mustDeclareFragmentShaderOutput()) { - oFragColor.appendDecl(glslCaps, &fshaderTxt); - fshaderTxt.append(";"); - fsOutName = oFragColor.c_str(); - } else { - fsOutName = "gl_FragColor"; - } const char* sampleFunction = GrGLSLTexture2DFunctionName(kVec2f_GrSLType, kTexture2DSampler_GrSLType, this->glslGeneration()); @@ -3954,19 +3937,19 @@ bool GrGLGpu::createMipmapProgram(int progIdx) { if (oddWidth && oddHeight) { fshaderTxt.appendf( - " %s = (%s(u_texture, v_texCoord0) + %s(u_texture, v_texCoord1) + " - " %s(u_texture, v_texCoord2) + %s(u_texture, v_texCoord3)) * 0.25;", - fsOutName, sampleFunction, sampleFunction, sampleFunction, sampleFunction + " sk_FragColor = (%s(u_texture, v_texCoord0) + %s(u_texture, v_texCoord1) + " + " %s(u_texture, v_texCoord2) + %s(u_texture, v_texCoord3)) * 0.25;", + sampleFunction, sampleFunction, sampleFunction, sampleFunction ); } else if (oddWidth || oddHeight) { fshaderTxt.appendf( - " %s = (%s(u_texture, v_texCoord0) + %s(u_texture, v_texCoord1)) * 0.5;", - fsOutName, sampleFunction, sampleFunction + " sk_FragColor = (%s(u_texture, v_texCoord0) + %s(u_texture, v_texCoord1)) * 0.5;", + sampleFunction, sampleFunction ); } else { fshaderTxt.appendf( - " %s = %s(u_texture, v_texCoord0);", - fsOutName, sampleFunction + " sk_FragColor = %s(u_texture, v_texCoord0);", + sampleFunction ); } @@ -4053,20 +4036,11 @@ bool GrGLGpu::createWireRectProgram() { &fshaderTxt); uColor.appendDecl(this->glCaps().glslCaps(), &fshaderTxt); fshaderTxt.append(";"); - const char* fsOutName; - if (this->glCaps().glslCaps()->mustDeclareFragmentShaderOutput()) { - oFragColor.appendDecl(this->glCaps().glslCaps(), &fshaderTxt); - fshaderTxt.append(";"); - fsOutName = oFragColor.c_str(); - } else { - fsOutName = "gl_FragColor"; - } fshaderTxt.appendf( "// Write Rect Program FS\n" "void main() {" - " %s = %s;" + " sk_FragColor = %s;" "}", - fsOutName, uColor.c_str() ); diff --git a/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp b/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp index d2e49a5cfb..b26ce894f0 100644 --- a/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp +++ b/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp @@ -9,6 +9,9 @@ #include "gl/GrGLGpu.h" #include "gl/GrGLSLPrettyPrint.h" #include "SkTraceEvent.h" +#include "SkSLCompiler.h" +#include "SkSLGLSLCodeGenerator.h" +#include "ir/SkSLProgram.h" #define GL_CALL(X) GR_GL_CALL(gpu->glInterface(), X) #define GL_CALL_RET(R, X) GR_GL_CALL_RET(gpu->glInterface(), R, X) @@ -18,6 +21,90 @@ static const bool c_PrintShaders{false}; static void print_shader_source(const char** strings, int* lengths, int count); +SkSL::GLCaps GrGLSkSLCapsForContext(const GrGLContext& context) { + GrGLStandard standard = context.standard(); + const GrGLCaps* caps = context.caps(); + const GrGLSLCaps* glslCaps = caps->glslCaps(); + SkSL::GLCaps result; + switch (standard) { + case kGL_GrGLStandard: + result.fStandard = SkSL::GLCaps::kGL_Standard; + break; + case kGLES_GrGLStandard: + result.fStandard = SkSL::GLCaps::kGLES_Standard; + break; + default: + SkASSERT(false); + result.fStandard = SkSL::GLCaps::kGL_Standard; + } + + switch (glslCaps->generation()) { + case k110_GrGLSLGeneration: + if (kGLES_GrGLStandard == standard) { + // ES2's shader language is based on GLSL 1.20 but is version 1.00 of the ES + // language + result.fVersion = 100; + } else { + SkASSERT(kGL_GrGLStandard == standard); + result.fVersion = 110; + } + break; + case k130_GrGLSLGeneration: + SkASSERT(kGL_GrGLStandard == standard); + result.fVersion = 130; + break; + case k140_GrGLSLGeneration: + SkASSERT(kGL_GrGLStandard == standard); + result.fVersion = 140; + break; + case k150_GrGLSLGeneration: + SkASSERT(kGL_GrGLStandard == standard); + result.fVersion = 150; + break; + case k330_GrGLSLGeneration: + if (kGLES_GrGLStandard == standard) { + result.fVersion = 300; + } else { + SkASSERT(kGL_GrGLStandard == standard); + result.fVersion = 330; + } + break; + case k400_GrGLSLGeneration: + SkASSERT(kGL_GrGLStandard == standard); + result.fVersion = 400; + break; + case k310es_GrGLSLGeneration: + SkASSERT(kGLES_GrGLStandard == standard); + result.fVersion = 310; + break; + case k320es_GrGLSLGeneration: + SkASSERT(kGLES_GrGLStandard == standard); + result.fVersion = 320; + break; + } + result.fIsCoreProfile = caps->isCoreProfile(); + result.fUsesPrecisionModifiers = glslCaps->usesPrecisionModifiers(); + result.fMustDeclareFragmentShaderOutput = glslCaps->mustDeclareFragmentShaderOutput(); + result.fCanUseMinAndAbsTogether = glslCaps->canUseMinAndAbsTogether(); + return result; +} + +static void dump_string(std::string s) { + // on Android, SkDebugf only displays the first 1K characters of output, which results in + // incomplete shader source code. Print each line individually to avoid this problem. + size_t index = 0; + for (;;) { + size_t next = s.find("\n", index); + if (next == std::string::npos) { + SkDebugf("%s", s.substr(index).c_str()); + break; + } else { + SkDebugf("%s", s.substr(index, next - index + 1).c_str()); + index = next + 1; + } + } +} + GrGLuint GrGLCompileAndAttachShader(const GrGLContext& glCtx, GrGLuint programId, GrGLenum type, @@ -33,15 +120,40 @@ GrGLuint GrGLCompileAndAttachShader(const GrGLContext& glCtx, return 0; } + std::string sksl; #ifdef SK_DEBUG SkString prettySource = GrGLSLPrettyPrint::PrettyPrintGLSL(strings, lengths, count, false); - const GrGLchar* sourceStr = prettySource.c_str(); - GrGLint sourceLength = static_cast<GrGLint>(prettySource.size()); - GR_GL_CALL(gli, ShaderSource(shaderId, 1, &sourceStr, &sourceLength)); + sksl = std::string(prettySource.c_str()); #else - GR_GL_CALL(gli, ShaderSource(shaderId, count, strings, lengths)); + for (int i = 0; i < count; i++) { + sksl.append(strings[i], lengths[i]); + } +#endif + + std::string glsl; + SkSL::Compiler& compiler = *glCtx.compiler(); + SkSL::GLCaps caps = GrGLSkSLCapsForContext(glCtx); + SkASSERT(type == GR_GL_VERTEX_SHADER || type == GR_GL_FRAGMENT_SHADER); + SkDEBUGCODE(bool result = )compiler.toGLSL(type == GR_GL_VERTEX_SHADER + ? SkSL::Program::kVertex_Kind + : SkSL::Program::kFragment_Kind, + std::string(sksl.c_str()), + caps, + &glsl); +#ifdef SK_DEBUG + if (!result) { + SkDebugf("SKSL compilation error\n----------------------\n"); + SkDebugf("SKSL:\n"); + dump_string(sksl); + SkDebugf("\nErrors:\n%s\n", compiler.errorText().c_str()); + SkDEBUGFAIL("SKSL compilation failed!\n"); + } #endif + const char* glslChars = glsl.c_str(); + GrGLint glslLength = (GrGLint) glsl.length(); + GR_GL_CALL(gli, ShaderSource(shaderId, 1, &glslChars, &glslLength)); + // If tracing is enabled in chrome then we pretty print bool traceShader; TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("skia.gpu"), &traceShader); @@ -72,10 +184,14 @@ GrGLuint GrGLCompileAndAttachShader(const GrGLContext& glCtx, // buffer param validation. GrGLsizei length = GR_GL_INIT_ZERO; GR_GL_CALL(gli, GetShaderInfoLog(shaderId, infoLen+1, &length, (char*)log.get())); - print_shader_source(strings, lengths, count); - SkDebugf("\n%s", (const char*)log.get()); + SkDebugf("GLSL compilation error\n----------------------\n"); + SkDebugf("SKSL:\n"); + dump_string(sksl); + SkDebugf("GLSL:\n"); + dump_string(glsl); + SkDebugf("Errors:\n%s\n", (const char*) log.get()); } - SkDEBUGFAIL("Shader compilation failed!"); + SkDEBUGFAIL("GLSL compilation failed!"); GR_GL_CALL(gli, DeleteShader(shaderId)); return 0; } diff --git a/src/gpu/gl/builders/GrGLShaderStringBuilder.h b/src/gpu/gl/builders/GrGLShaderStringBuilder.h index 062e229cdf..4365751c3a 100644 --- a/src/gpu/gl/builders/GrGLShaderStringBuilder.h +++ b/src/gpu/gl/builders/GrGLShaderStringBuilder.h @@ -11,8 +11,11 @@ #include "GrAllocator.h" #include "GrGpu.h" #include "gl/GrGLContext.h" +#include "SkSLGLSLCodeGenerator.h" #include "SkTypes.h" +SkSL::GLCaps GrGLSkSLCapsForContext(const GrGLContext& context); + GrGLuint GrGLCompileAndAttachShader(const GrGLContext& glCtx, GrGLuint programId, GrGLenum type, diff --git a/src/gpu/glsl/GrGLSLFragmentShaderBuilder.cpp b/src/gpu/glsl/GrGLSLFragmentShaderBuilder.cpp index d35730f633..eb744a9915 100644 --- a/src/gpu/glsl/GrGLSLFragmentShaderBuilder.cpp +++ b/src/gpu/glsl/GrGLSLFragmentShaderBuilder.cpp @@ -291,10 +291,10 @@ void GrGLSLFragmentShaderBuilder::enableCustomOutput() { if (!fHasCustomColorOutput) { fHasCustomColorOutput = true; fCustomColorOutputIndex = fOutputs.count(); - fOutputs.push_back().set(kVec4f_GrSLType, - GrGLSLShaderVar::kOut_TypeModifier, - DeclaredColorOutputName()); - fProgramBuilder->finalizeFragmentOutputColor(fOutputs.back()); + fOutputs.push_back().set(kVec4f_GrSLType, + GrGLSLShaderVar::kOut_TypeModifier, + DeclaredColorOutputName()); + fProgramBuilder->finalizeFragmentOutputColor(fOutputs.back()); } } @@ -318,7 +318,7 @@ void GrGLSLFragmentShaderBuilder::enableSecondaryOutput() { } const char* GrGLSLFragmentShaderBuilder::getPrimaryColorOutputName() const { - return fHasCustomColorOutput ? DeclaredColorOutputName() : "gl_FragColor"; + return fHasCustomColorOutput ? DeclaredColorOutputName() : "sk_FragColor"; } void GrGLSLFragmentBuilder::declAppendf(const char* fmt, ...) { diff --git a/src/gpu/glsl/GrGLSLFragmentShaderBuilder.h b/src/gpu/glsl/GrGLSLFragmentShaderBuilder.h index ecb6d455dd..6a4a184829 100644 --- a/src/gpu/glsl/GrGLSLFragmentShaderBuilder.h +++ b/src/gpu/glsl/GrGLSLFragmentShaderBuilder.h @@ -203,7 +203,7 @@ private: } #endif - static const char* DeclaredColorOutputName() { return "fsColorOut"; } + static const char* DeclaredColorOutputName() { return "sk_FragColor"; } static const char* DeclaredSecondaryColorOutputName() { return "fsSecondaryColorOut"; } GrSurfaceOrigin getSurfaceOrigin() const; diff --git a/src/gpu/glsl/GrGLSLShaderBuilder.h b/src/gpu/glsl/GrGLSLShaderBuilder.h index a6ff96dd1b..f59edb4553 100644 --- a/src/gpu/glsl/GrGLSLShaderBuilder.h +++ b/src/gpu/glsl/GrGLSLShaderBuilder.h @@ -72,23 +72,27 @@ public: void appendTexelFetch(SamplerHandle, const char* coordExpr); /** - * Adds a #define directive to the top of the shader. + * Adds a constant declaration to the top of the shader. */ - void define(const char* macro, const char* replacement) { - this->definitions().appendf("#define %s %s\n", macro, replacement); + void defineConstant(const char* type, const char* name, const char* value) { + this->definitions().appendf("const %s %s = %s;\n", type, name, value); } - void define(const char* macro, int replacement) { - this->definitions().appendf("#define %s %i\n", macro, replacement); + void defineConstant(const char* name, int value) { + this->definitions().appendf("const int %s = %i;\n", name, value); } - void definef(const char* macro, const char* replacement, ...) { - this->definitions().appendf("#define %s ", macro); + void defineConstant(const char* name, float value) { + this->definitions().appendf("const float %s = %f;\n", name, value); + } + + void defineConstantf(const char* type, const char* name, const char* fmt, ...) { + this->definitions().appendf("const %s %s = ", type, name); va_list args; - va_start(args, replacement); - this->definitions().appendVAList(replacement, args); + va_start(args, fmt); + this->definitions().appendVAList(fmt, args); va_end(args); - this->definitions().append("\n"); + this->definitions().append(";\n"); } /** diff --git a/src/gpu/glsl/GrGLSLShaderVar.h b/src/gpu/glsl/GrGLSLShaderVar.h index 9d162ecaa4..35ac4bcb84 100644 --- a/src/gpu/glsl/GrGLSLShaderVar.h +++ b/src/gpu/glsl/GrGLSLShaderVar.h @@ -213,24 +213,20 @@ public: private: static const char* TypeModifierString(const GrGLSLCaps* glslCaps, TypeModifier t) { - GrGLSLGeneration gen = glslCaps->generation(); switch (t) { case kNone_TypeModifier: return ""; + case kAttribute_TypeModifier: // fall through + case kVaryingIn_TypeModifier: // fall through case kIn_TypeModifier: return "in"; case kInOut_TypeModifier: return "inout"; + case kVaryingOut_TypeModifier: // fall through case kOut_TypeModifier: return "out"; case kUniform_TypeModifier: return "uniform"; - case kAttribute_TypeModifier: - return k110_GrGLSLGeneration == gen ? "attribute" : "in"; - case kVaryingIn_TypeModifier: - return k110_GrGLSLGeneration == gen ? "varying" : "in"; - case kVaryingOut_TypeModifier: - return k110_GrGLSLGeneration == gen ? "varying" : "out"; default: SkFAIL("Unknown shader variable type modifier."); return ""; // suppress warning diff --git a/src/gpu/instanced/InstanceProcessor.cpp b/src/gpu/instanced/InstanceProcessor.cpp index 480155b683..82116c4522 100644 --- a/src/gpu/instanced/InstanceProcessor.cpp +++ b/src/gpu/instanced/InstanceProcessor.cpp @@ -107,10 +107,10 @@ public: void initParams(const SamplerHandle paramsBuffer) { fParamsBuffer = paramsBuffer; - fVertexBuilder->definef("PARAMS_IDX_MASK", "0x%xu", kParamsIdx_InfoMask); fVertexBuilder->appendPrecisionModifier(kHigh_GrSLPrecision); - fVertexBuilder->codeAppendf("int paramsIdx = int(%s & PARAMS_IDX_MASK);", - this->attr(Attrib::kInstanceInfo)); + fVertexBuilder->codeAppendf("int paramsIdx = int(%s & 0x%x);", + this->attr(Attrib::kInstanceInfo), + kParamsIdx_InfoMask); } const char* attr(Attrib attr) const { return fInstProc.getAttrib((int)attr).fName; } @@ -224,10 +224,10 @@ void GLSLInstanceProcessor::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { v->codeAppendf("mat2x3 shapeMatrix = mat2x3(%s, %s);", inputs.attr(Attrib::kShapeMatrixX), inputs.attr(Attrib::kShapeMatrixY)); } else { - v->definef("PERSPECTIVE_FLAG", "0x%xu", kPerspective_InfoFlag); + v->defineConstantf("int", "PERSPECTIVE_FLAG", "0x%x", kPerspective_InfoFlag); v->codeAppendf("mat3 shapeMatrix = mat3(%s, %s, vec3(0, 0, 1));", inputs.attr(Attrib::kShapeMatrixX), inputs.attr(Attrib::kShapeMatrixY)); - v->codeAppendf("if (0u != (%s & PERSPECTIVE_FLAG)) {", + v->codeAppendf("if (0 != (%s & PERSPECTIVE_FLAG)) {", inputs.attr(Attrib::kInstanceInfo)); v->codeAppend ( "shapeMatrix[2] = "); inputs.fetchNextParam(kVec3f_GrSLType); @@ -237,7 +237,7 @@ void GLSLInstanceProcessor::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { bool hasSingleShapeType = SkIsPow2(ip.batchInfo().fShapeTypes); if (!hasSingleShapeType) { - v->define("SHAPE_TYPE_BIT", kShapeType_InfoBit); + v->defineConstant("SHAPE_TYPE_BIT", kShapeType_InfoBit); v->codeAppendf("uint shapeType = %s >> SHAPE_TYPE_BIT;", inputs.attr(Attrib::kInstanceInfo)); } @@ -285,8 +285,8 @@ void GLSLInstanceProcessor::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { if (ip.batchInfo().fInnerShapeTypes) { bool hasSingleInnerShapeType = SkIsPow2(ip.batchInfo().fInnerShapeTypes); if (!hasSingleInnerShapeType) { - v->definef("INNER_SHAPE_TYPE_MASK", "0x%xu", kInnerShapeType_InfoMask); - v->define("INNER_SHAPE_TYPE_BIT", kInnerShapeType_InfoBit); + v->defineConstantf("int", "INNER_SHAPE_TYPE_MASK", "0x%x", kInnerShapeType_InfoMask); + v->defineConstant("INNER_SHAPE_TYPE_BIT", kInnerShapeType_InfoBit); v->codeAppendf("uint innerShapeType = ((%s & INNER_SHAPE_TYPE_MASK) >> " "INNER_SHAPE_TYPE_BIT);", inputs.attr(Attrib::kInstanceInfo)); @@ -346,13 +346,13 @@ void GLSLInstanceProcessor::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { } if (usedShapeDefinitions & kOval_ShapeFlag) { - v->definef("OVAL_SHAPE_TYPE", "%du", (int)ShapeType::kOval); + v->defineConstant("OVAL_SHAPE_TYPE", (int)ShapeType::kOval); } if (usedShapeDefinitions & kSimpleRRect_ShapeFlag) { - v->definef("SIMPLE_R_RECT_SHAPE_TYPE", "%du", (int)ShapeType::kSimpleRRect); + v->defineConstant("SIMPLE_R_RECT_SHAPE_TYPE", (int)ShapeType::kSimpleRRect); } if (usedShapeDefinitions & kNinePatch_ShapeFlag) { - v->definef("NINE_PATCH_SHAPE_TYPE", "%du", (int)ShapeType::kNinePatch); + v->defineConstant("NINE_PATCH_SHAPE_TYPE", (int)ShapeType::kNinePatch); } SkASSERT(!(usedShapeDefinitions & (kRect_ShapeFlag | kComplexRRect_ShapeFlag))); @@ -367,8 +367,8 @@ void GLSLInstanceProcessor::onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) { inputs.attr(Attrib::kLocalRect), inputs.attr(Attrib::kLocalRect)); } if (ip.batchInfo().fHasLocalMatrix && ip.batchInfo().fHasParams) { - v->definef("LOCAL_MATRIX_FLAG", "0x%xu", kLocalMatrix_InfoFlag); - v->codeAppendf("if (0u != (%s & LOCAL_MATRIX_FLAG)) {", + v->defineConstantf("int", "LOCAL_MATRIX_FLAG", "0x%x", kLocalMatrix_InfoFlag); + v->codeAppendf("if (0 != (%s & LOCAL_MATRIX_FLAG)) {", inputs.attr(Attrib::kInstanceInfo)); if (!ip.batchInfo().fUsesLocalCoords) { inputs.skipParams(2); @@ -1179,7 +1179,7 @@ void GLSLInstanceProcessor::BackendMultisample::onInit(GrGLSLVaryingHandler* var } } if (kRect_ShapeFlag != fBatchInfo.fShapeTypes) { - v->definef("SAMPLE_MASK_ALL", "0x%x", (1 << fEffectiveSampleCnt) - 1); + v->defineConstantf("int", "SAMPLE_MASK_ALL", "0x%x", (1 << fEffectiveSampleCnt) - 1); varyingHandler->addFlatVarying("earlyAccept", &fEarlyAccept, kHigh_GrSLPrecision); } } @@ -1360,10 +1360,10 @@ void GLSLInstanceProcessor::BackendMultisample::onSetupInnerSimpleRRect(GrGLSLVe void GLSLInstanceProcessor::BackendMultisample::onEmitCode(GrGLSLVertexBuilder*, GrGLSLPPFragmentBuilder* f, const char*, const char*) { - f->define("SAMPLE_COUNT", fEffectiveSampleCnt); + f->defineConstant("SAMPLE_COUNT", fEffectiveSampleCnt); if (this->isMixedSampled()) { - f->definef("SAMPLE_MASK_ALL", "0x%x", (1 << fEffectiveSampleCnt) - 1); - f->definef("SAMPLE_MASK_MSB", "0x%x", 1 << (fEffectiveSampleCnt - 1)); + f->defineConstantf("int", "SAMPLE_MASK_ALL", "0x%x", (1 << fEffectiveSampleCnt) - 1); + f->defineConstantf("int", "SAMPLE_MASK_MSB", "0x%x", 1 << (fEffectiveSampleCnt - 1)); } if (kRect_ShapeFlag != (fBatchInfo.fShapeTypes | fBatchInfo.fInnerShapeTypes)) { |