aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--bench/GLBench.cpp29
-rw-r--r--bench/GLBench.h4
-rw-r--r--bench/GLInstancedArraysBench.cpp4
-rw-r--r--bench/GLVec4ScalarBench.cpp4
-rw-r--r--bench/GLVertexAttributesBench.cpp6
-rw-r--r--gyp/sksl.gyp2
-rw-r--r--src/gpu/gl/GrGLContext.cpp12
-rw-r--r--src/gpu/gl/GrGLContext.h17
-rw-r--r--src/gpu/gl/GrGLGpu.cpp44
-rw-r--r--src/gpu/gl/builders/GrGLShaderStringBuilder.cpp130
-rw-r--r--src/gpu/gl/builders/GrGLShaderStringBuilder.h3
-rw-r--r--src/gpu/glsl/GrGLSLFragmentShaderBuilder.cpp10
-rw-r--r--src/gpu/glsl/GrGLSLFragmentShaderBuilder.h2
-rw-r--r--src/gpu/glsl/GrGLSLShaderBuilder.h24
-rw-r--r--src/gpu/glsl/GrGLSLShaderVar.h10
-rw-r--r--src/gpu/instanced/InstanceProcessor.cpp34
-rw-r--r--src/sksl/README35
-rw-r--r--src/sksl/SkSLCompiler.cpp32
-rw-r--r--src/sksl/SkSLCompiler.h5
-rw-r--r--src/sksl/SkSLContext.h2
-rw-r--r--src/sksl/SkSLGLSLCodeGenerator.cpp206
-rw-r--r--src/sksl/SkSLGLSLCodeGenerator.h16
-rw-r--r--src/sksl/SkSLIRGenerator.cpp82
-rw-r--r--src/sksl/SkSLIRGenerator.h4
-rw-r--r--src/sksl/SkSLMain.cpp52
-rw-r--r--src/sksl/SkSLParser.cpp72
-rw-r--r--src/sksl/SkSLParser.h3
-rw-r--r--src/sksl/SkSLSPIRVCodeGenerator.cpp25
-rw-r--r--src/sksl/SkSLSPIRVCodeGenerator.h2
-rw-r--r--src/sksl/SkSLToken.h6
-rw-r--r--src/sksl/SkSLUtil.cpp47
-rw-r--r--src/sksl/SkSLUtil.h14
-rw-r--r--src/sksl/ast/SkSLASTDeclaration.h4
-rw-r--r--src/sksl/ast/SkSLASTIndexSuffix.h16
-rw-r--r--src/sksl/ast/SkSLASTLayout.h17
-rw-r--r--src/sksl/ast/SkSLASTModifiersDeclaration.h37
-rw-r--r--src/sksl/ast/SkSLASTPrecision.h45
-rw-r--r--src/sksl/ir/SkSLIndexExpression.h6
-rw-r--r--src/sksl/ir/SkSLIntLiteral.h4
-rw-r--r--src/sksl/ir/SkSLLayout.h34
-rw-r--r--src/sksl/ir/SkSLModifiersDeclaration.h37
-rw-r--r--src/sksl/ir/SkSLProgram.h9
-rw-r--r--src/sksl/ir/SkSLProgramElement.h3
-rw-r--r--src/sksl/lex.sksl.c527
-rw-r--r--src/sksl/sksl.flex6
-rw-r--r--src/sksl/sksl.include3
-rw-r--r--src/sksl/sksl_frag.include14
-rw-r--r--tests/SkSLErrorTest.cpp4
-rw-r--r--tests/SkSLGLSLTest.cpp226
49 files changed, 517 insertions, 1413 deletions
diff --git a/bench/GLBench.cpp b/bench/GLBench.cpp
index b6975508cf..8cf41c2056 100644
--- a/bench/GLBench.cpp
+++ b/bench/GLBench.cpp
@@ -11,10 +11,7 @@
#include "GrGpu.h"
#include "GrTest.h"
#include "gl/GrGLContext.h"
-#include "gl/builders/GrGLShaderStringBuilder.h"
-#include "SkSLCompiler.h"
#include <stdio.h>
-#include <string>
const GrGLContext* GLBench::getGLContext(SkCanvas* canvas) {
// This bench exclusively tests GL calls directly
@@ -64,26 +61,13 @@ void GLBench::onDraw(int loops, SkCanvas* canvas) {
canvas->getGrContext()->resetContext();
}
-GrGLuint GLBench::CompileShader(const GrGLContext* context, const char* sksl, GrGLenum type) {
- const GrGLInterface* gl = context->interface();
- std::string glsl;
- bool result = context->compiler()->toGLSL(type == GR_GL_VERTEX_SHADER
- ? SkSL::Program::kVertex_Kind
- : SkSL::Program::kFragment_Kind,
- std::string(sksl),
- GrGLSkSLCapsForContext(*context),
- &glsl);
- if (!result) {
- SkDebugf("SkSL compilation failed:\n%s\n%s\n", sksl,
- context->compiler()->errorText().c_str());
- }
+GrGLuint GLBench::CompileShader(const GrGLInterface* gl, const char* shaderSrc, GrGLenum type) {
GrGLuint shader;
// Create the shader object
GR_GL_CALL_RET(gl, shader, CreateShader(type));
// Load the shader source
- const char* glslPtr = glsl.c_str();
- GR_GL_CALL(gl, ShaderSource(shader, 1, (const char**) &glslPtr, nullptr));
+ GR_GL_CALL(gl, ShaderSource(shader, 1, &shaderSrc, nullptr));
// Compile the shader
GR_GL_CALL(gl, CompileShader(shader));
@@ -100,11 +84,10 @@ GrGLuint GLBench::CompileShader(const GrGLContext* context, const char* sksl, Gr
return shader;
}
-GrGLuint GLBench::CreateProgram(const GrGLContext* context, const char* vshader,
- const char* fshader) {
- const GrGLInterface* gl = context->interface();
- GrGLuint vertexShader = CompileShader(context, vshader, GR_GL_VERTEX_SHADER);
- GrGLuint fragmentShader = CompileShader(context, fshader, GR_GL_FRAGMENT_SHADER);
+GrGLuint GLBench::CreateProgram(const GrGLInterface* gl, const char* vshader, const char* fshader) {
+
+ GrGLuint vertexShader = CompileShader(gl, vshader, GR_GL_VERTEX_SHADER);
+ GrGLuint fragmentShader = CompileShader(gl, fshader, GR_GL_FRAGMENT_SHADER);
GrGLuint shaderProgram;
GR_GL_CALL_RET(gl, shaderProgram, CreateProgram());
diff --git a/bench/GLBench.h b/bench/GLBench.h
index a358894cb4..9033b12e55 100644
--- a/bench/GLBench.h
+++ b/bench/GLBench.h
@@ -35,8 +35,8 @@ protected:
virtual void teardown(const GrGLInterface*)=0;
void onDraw(int loops, SkCanvas*) override;
virtual void glDraw(int loops, const GrGLContext*)=0;
- static GrGLuint CompileShader(const GrGLContext*, const char* shaderSrc, GrGLenum type);
- static GrGLuint CreateProgram(const GrGLContext*, const char* vshader, const char* fshader);
+ static GrGLuint CompileShader(const GrGLInterface*, const char* shaderSrc, GrGLenum type);
+ static GrGLuint CreateProgram(const GrGLInterface*, const char* vshader, const char* fshader);
static GrGLuint SetupFramebuffer(const GrGLInterface*, int screenWidth, int screenHeight);
static void DumpImage(const GrGLInterface* gl, uint32_t screenWidth, uint32_t screenHeight,
const char* filename);
diff --git a/bench/GLInstancedArraysBench.cpp b/bench/GLInstancedArraysBench.cpp
index e98ab72587..d89c087605 100644
--- a/bench/GLInstancedArraysBench.cpp
+++ b/bench/GLInstancedArraysBench.cpp
@@ -130,6 +130,8 @@ GrGLuint GLCpuPosInstancedArraysBench::setupShader(const GrGLContext* ctx) {
"o_color = a_color;\n"
"}\n");
+ const GrGLInterface* gl = ctx->interface();
+
// setup fragment shader
GrGLSLShaderVar oFragColor("o_FragColor", kVec4f_GrSLType, GrShaderVar::kOut_TypeModifier);
SkString fshaderTxt(version);
@@ -153,7 +155,7 @@ GrGLuint GLCpuPosInstancedArraysBench::setupShader(const GrGLContext* ctx) {
"%s = vec4(o_color, 1.0);\n"
"}\n", fsOutName);
- return CreateProgram(ctx, vshaderTxt.c_str(), fshaderTxt.c_str());
+ return CreateProgram(gl, vshaderTxt.c_str(), fshaderTxt.c_str());
}
template<typename Func>
diff --git a/bench/GLVec4ScalarBench.cpp b/bench/GLVec4ScalarBench.cpp
index 373ae6b7bc..e3837a7225 100644
--- a/bench/GLVec4ScalarBench.cpp
+++ b/bench/GLVec4ScalarBench.cpp
@@ -124,6 +124,8 @@ GrGLuint GLVec4ScalarBench::setupShader(const GrGLContext* ctx) {
" o_color = a_color;\n"
"}\n");
+ const GrGLInterface* gl = ctx->interface();
+
// set up fragment shader; this fragment shader will have fNumStages coverage stages plus an
// XP stage at the end. Each coverage stage computes the pixel's distance from some hard-
// coded center and compare that to some hard-coded circle radius to compute a coverage.
@@ -184,7 +186,7 @@ GrGLuint GLVec4ScalarBench::setupShader(const GrGLContext* ctx) {
"}\n",
fsOutName);
- return CreateProgram(ctx, vshaderTxt.c_str(), fshaderTxt.c_str());
+ return CreateProgram(gl, vshaderTxt.c_str(), fshaderTxt.c_str());
}
template<typename Func>
diff --git a/bench/GLVertexAttributesBench.cpp b/bench/GLVertexAttributesBench.cpp
index f579a3ea39..040ca18300 100644
--- a/bench/GLVertexAttributesBench.cpp
+++ b/bench/GLVertexAttributesBench.cpp
@@ -114,6 +114,8 @@ GrGLuint GLVertexAttributesBench::setupShader(const GrGLContext* ctx, uint32_t a
vshaderTxt.append("}\n");
+ const GrGLInterface* gl = ctx->interface();
+
// setup fragment shader
GrGLSLShaderVar oFragColor("o_FragColor", kVec4f_GrSLType, GrShaderVar::kOut_TypeModifier);
SkString fshaderTxt(version);
@@ -125,7 +127,7 @@ GrGLuint GLVertexAttributesBench::setupShader(const GrGLContext* ctx, uint32_t a
fshaderTxt.append(";\n");
fsOutName = oFragColor.c_str();
} else {
- fsOutName = "sk_FragColor";
+ fsOutName = "gl_FragColor";
}
for (uint32_t i = 0; i < maxAttribs; i++) {
@@ -147,7 +149,7 @@ GrGLuint GLVertexAttributesBench::setupShader(const GrGLContext* ctx, uint32_t a
fshaderTxt.append(";\n"
"}\n");
- return CreateProgram(ctx, vshaderTxt.c_str(), fshaderTxt.c_str());
+ return CreateProgram(gl, vshaderTxt.c_str(), fshaderTxt.c_str());
}
///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/gyp/sksl.gyp b/gyp/sksl.gyp
index f45b702a7b..609ace9ac8 100644
--- a/gyp/sksl.gyp
+++ b/gyp/sksl.gyp
@@ -18,7 +18,7 @@
],
'all_dependent_settings': {
'include_dirs': [
- '<(skia_src_path)/sksl',
+ '../src/sksl',
],
},
},
diff --git a/src/gpu/gl/GrGLContext.cpp b/src/gpu/gl/GrGLContext.cpp
index 2126314a7b..9e70b472c5 100644
--- a/src/gpu/gl/GrGLContext.cpp
+++ b/src/gpu/gl/GrGLContext.cpp
@@ -7,7 +7,6 @@
#include "GrGLContext.h"
#include "GrGLGLSL.h"
-#include "SkSLCompiler.h"
////////////////////////////////////////////////////////////////////////////////
@@ -64,17 +63,6 @@ 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 8207ac89b0..6016f6859a 100644
--- a/src/gpu/gl/GrGLContext.h
+++ b/src/gpu/gl/GrGLContext.h
@@ -15,9 +15,6 @@
#include "GrGLUtil.h"
struct GrContextOptions;
-namespace SkSL {
- class Compiler;
-}
/**
* Encapsulates information about an OpenGL context including the OpenGL
@@ -42,8 +39,6 @@ public:
const GrGLExtensions& extensions() const { return fInterface->fExtensions; }
- virtual ~GrGLContextInfo() {}
-
protected:
struct ConstructorArgs {
const GrGLInterface* fInterface;
@@ -69,7 +64,7 @@ protected:
};
/**
- * Extension of GrGLContextInfo that also provides access to GrGLInterface and SkSL::Compiler.
+ * Extension of GrGLContextInfo that also provides access to GrGLInterface.
*/
class GrGLContext : public GrGLContextInfo {
public:
@@ -81,16 +76,8 @@ public:
const GrGLInterface* interface() const { return fInterface; }
- SkSL::Compiler* compiler() const;
-
- ~GrGLContext() override;
-
private:
- GrGLContext(const ConstructorArgs& args)
- : INHERITED(args)
- , fCompiler(nullptr) {}
-
- mutable SkSL::Compiler* fCompiler;
+ GrGLContext(const ConstructorArgs& args) : INHERITED(args) {}
typedef GrGLContextInfo INHERITED;
};
diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp
index 8c0373ac28..5755702463 100644
--- a/src/gpu/gl/GrGLGpu.cpp
+++ b/src/gpu/gl/GrGLGpu.cpp
@@ -3790,11 +3790,20 @@ 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() {"
- " sk_FragColor = %s(u_texture, v_texCoord);"
+ " %s = %s(u_texture, v_texCoord);"
"}",
+ fsOutName,
GrGLSLTexture2DFunctionName(kVec2f_GrSLType, kSamplerTypes[progIdx], this->glslGeneration())
);
@@ -3927,6 +3936,14 @@ 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());
@@ -3937,19 +3954,19 @@ bool GrGLGpu::createMipmapProgram(int progIdx) {
if (oddWidth && oddHeight) {
fshaderTxt.appendf(
- " 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
+ " %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
);
} else if (oddWidth || oddHeight) {
fshaderTxt.appendf(
- " sk_FragColor = (%s(u_texture, v_texCoord0) + %s(u_texture, v_texCoord1)) * 0.5;",
- sampleFunction, sampleFunction
+ " %s = (%s(u_texture, v_texCoord0) + %s(u_texture, v_texCoord1)) * 0.5;",
+ fsOutName, sampleFunction, sampleFunction
);
} else {
fshaderTxt.appendf(
- " sk_FragColor = %s(u_texture, v_texCoord0);",
- sampleFunction
+ " %s = %s(u_texture, v_texCoord0);",
+ fsOutName, sampleFunction
);
}
@@ -4036,11 +4053,20 @@ 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() {"
- " sk_FragColor = %s;"
+ " %s = %s;"
"}",
+ fsOutName,
uColor.c_str()
);
diff --git a/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp b/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp
index b26ce894f0..d2e49a5cfb 100644
--- a/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp
+++ b/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp
@@ -9,9 +9,6 @@
#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)
@@ -21,90 +18,6 @@ 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,
@@ -120,40 +33,15 @@ GrGLuint GrGLCompileAndAttachShader(const GrGLContext& glCtx,
return 0;
}
- std::string sksl;
#ifdef SK_DEBUG
SkString prettySource = GrGLSLPrettyPrint::PrettyPrintGLSL(strings, lengths, count, false);
- sksl = std::string(prettySource.c_str());
+ const GrGLchar* sourceStr = prettySource.c_str();
+ GrGLint sourceLength = static_cast<GrGLint>(prettySource.size());
+ GR_GL_CALL(gli, ShaderSource(shaderId, 1, &sourceStr, &sourceLength));
#else
- 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");
- }
+ GR_GL_CALL(gli, ShaderSource(shaderId, count, strings, lengths));
#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);
@@ -184,14 +72,10 @@ 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()));
- 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());
+ print_shader_source(strings, lengths, count);
+ SkDebugf("\n%s", (const char*)log.get());
}
- SkDEBUGFAIL("GLSL compilation failed!");
+ SkDEBUGFAIL("Shader 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 4365751c3a..062e229cdf 100644
--- a/src/gpu/gl/builders/GrGLShaderStringBuilder.h
+++ b/src/gpu/gl/builders/GrGLShaderStringBuilder.h
@@ -11,11 +11,8 @@
#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 eb744a9915..d35730f633 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() : "sk_FragColor";
+ return fHasCustomColorOutput ? DeclaredColorOutputName() : "gl_FragColor";
}
void GrGLSLFragmentBuilder::declAppendf(const char* fmt, ...) {
diff --git a/src/gpu/glsl/GrGLSLFragmentShaderBuilder.h b/src/gpu/glsl/GrGLSLFragmentShaderBuilder.h
index 6a4a184829..ecb6d455dd 100644
--- a/src/gpu/glsl/GrGLSLFragmentShaderBuilder.h
+++ b/src/gpu/glsl/GrGLSLFragmentShaderBuilder.h
@@ -203,7 +203,7 @@ private:
}
#endif
- static const char* DeclaredColorOutputName() { return "sk_FragColor"; }
+ static const char* DeclaredColorOutputName() { return "fsColorOut"; }
static const char* DeclaredSecondaryColorOutputName() { return "fsSecondaryColorOut"; }
GrSurfaceOrigin getSurfaceOrigin() const;
diff --git a/src/gpu/glsl/GrGLSLShaderBuilder.h b/src/gpu/glsl/GrGLSLShaderBuilder.h
index f59edb4553..a6ff96dd1b 100644
--- a/src/gpu/glsl/GrGLSLShaderBuilder.h
+++ b/src/gpu/glsl/GrGLSLShaderBuilder.h
@@ -72,27 +72,23 @@ public:
void appendTexelFetch(SamplerHandle, const char* coordExpr);
/**
- * Adds a constant declaration to the top of the shader.
+ * Adds a #define directive to the top of the shader.
*/
- 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, const char* replacement) {
+ this->definitions().appendf("#define %s %s\n", macro, replacement);
}
- void defineConstant(const char* name, int value) {
- this->definitions().appendf("const int %s = %i;\n", name, value);
+ void define(const char* macro, int replacement) {
+ this->definitions().appendf("#define %s %i\n", macro, replacement);
}
- 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);
+ void definef(const char* macro, const char* replacement, ...) {
+ this->definitions().appendf("#define %s ", macro);
va_list args;
- va_start(args, fmt);
- this->definitions().appendVAList(fmt, args);
+ va_start(args, replacement);
+ this->definitions().appendVAList(replacement, 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 35ac4bcb84..9d162ecaa4 100644
--- a/src/gpu/glsl/GrGLSLShaderVar.h
+++ b/src/gpu/glsl/GrGLSLShaderVar.h
@@ -213,20 +213,24 @@ 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 82116c4522..480155b683 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 & 0x%x);",
- this->attr(Attrib::kInstanceInfo),
- kParamsIdx_InfoMask);
+ fVertexBuilder->codeAppendf("int paramsIdx = int(%s & PARAMS_IDX_MASK);",
+ this->attr(Attrib::kInstanceInfo));
}
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->defineConstantf("int", "PERSPECTIVE_FLAG", "0x%x", kPerspective_InfoFlag);
+ v->definef("PERSPECTIVE_FLAG", "0x%xu", kPerspective_InfoFlag);
v->codeAppendf("mat3 shapeMatrix = mat3(%s, %s, vec3(0, 0, 1));",
inputs.attr(Attrib::kShapeMatrixX), inputs.attr(Attrib::kShapeMatrixY));
- v->codeAppendf("if (0 != (%s & PERSPECTIVE_FLAG)) {",
+ v->codeAppendf("if (0u != (%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->defineConstant("SHAPE_TYPE_BIT", kShapeType_InfoBit);
+ v->define("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->defineConstantf("int", "INNER_SHAPE_TYPE_MASK", "0x%x", kInnerShapeType_InfoMask);
- v->defineConstant("INNER_SHAPE_TYPE_BIT", kInnerShapeType_InfoBit);
+ v->definef("INNER_SHAPE_TYPE_MASK", "0x%xu", kInnerShapeType_InfoMask);
+ v->define("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->defineConstant("OVAL_SHAPE_TYPE", (int)ShapeType::kOval);
+ v->definef("OVAL_SHAPE_TYPE", "%du", (int)ShapeType::kOval);
}
if (usedShapeDefinitions & kSimpleRRect_ShapeFlag) {
- v->defineConstant("SIMPLE_R_RECT_SHAPE_TYPE", (int)ShapeType::kSimpleRRect);
+ v->definef("SIMPLE_R_RECT_SHAPE_TYPE", "%du", (int)ShapeType::kSimpleRRect);
}
if (usedShapeDefinitions & kNinePatch_ShapeFlag) {
- v->defineConstant("NINE_PATCH_SHAPE_TYPE", (int)ShapeType::kNinePatch);
+ v->definef("NINE_PATCH_SHAPE_TYPE", "%du", (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->defineConstantf("int", "LOCAL_MATRIX_FLAG", "0x%x", kLocalMatrix_InfoFlag);
- v->codeAppendf("if (0 != (%s & LOCAL_MATRIX_FLAG)) {",
+ v->definef("LOCAL_MATRIX_FLAG", "0x%xu", kLocalMatrix_InfoFlag);
+ v->codeAppendf("if (0u != (%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->defineConstantf("int", "SAMPLE_MASK_ALL", "0x%x", (1 << fEffectiveSampleCnt) - 1);
+ v->definef("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->defineConstant("SAMPLE_COUNT", fEffectiveSampleCnt);
+ f->define("SAMPLE_COUNT", fEffectiveSampleCnt);
if (this->isMixedSampled()) {
- f->defineConstantf("int", "SAMPLE_MASK_ALL", "0x%x", (1 << fEffectiveSampleCnt) - 1);
- f->defineConstantf("int", "SAMPLE_MASK_MSB", "0x%x", 1 << (fEffectiveSampleCnt - 1));
+ f->definef("SAMPLE_MASK_ALL", "0x%x", (1 << fEffectiveSampleCnt) - 1);
+ f->definef("SAMPLE_MASK_MSB", "0x%x", 1 << (fEffectiveSampleCnt - 1));
}
if (kRect_ShapeFlag != (fBatchInfo.fShapeTypes | fBatchInfo.fInnerShapeTypes)) {
diff --git a/src/sksl/README b/src/sksl/README
deleted file mode 100644
index 1427c21926..0000000000
--- a/src/sksl/README
+++ /dev/null
@@ -1,35 +0,0 @@
-Overview
-========
-
-SkSL ("Skia Shading Language") is a variant of GLSL which is used as Skia's
-internal shading language. SkSL is, at its heart, a single standardized version
-of GLSL which avoids all of the various version and dialect differences found
-in GLSL "in the wild", but it does bring a few of its own changes to the table.
-
-Skia uses the SkSL compiler to convert SkSL code to GLSL, GLSL ES, or SPIR-V
-before handing it over to the graphics driver.
-
-Differences from GLSL
-=====================
-
-SkSL is based on GLSL 4.5. For the most part, write SkSL exactly as you would
-desktop GLSL, and the SkSL compiler will take care of version and dialect
-differences (for instance, you always use "in" and "out", and skslc will handle
-translating them to "varying" and "attribute" as appropriate). Be aware of the
-following differences between SkSL and GLSL:
-
-* no #version or "precision" statement is required, and they will be ignored if
- present
-* the output color is sk_FragColor (do not declare it)
-* lowp, mediump, and highp are always permitted (but will only be respected if
- you run on a GLES device)
-* you do not need to include ".0" to make a number a float (meaning that
- "vec2(x, y) * 4" is perfectly legal in SkSL, unlike GLSL where it would often
- have to be expressed "vec2(x, y) * 4.0". There is no performance penalty for
- this, as the number is converted to a float at compile time)
-* type suffixes on numbers (1.0f, 0xFFu) are both unnecessary and unsupported
-* some built-in functions and one or two rarely-used language features are not
- yet supported (sorry!)
-
-SkSL is still under development, and is expected to diverge further from GLSL
-over time.
diff --git a/src/sksl/SkSLCompiler.cpp b/src/sksl/SkSLCompiler.cpp
index 88df8aeb57..d2ad81223e 100644
--- a/src/sksl/SkSLCompiler.cpp
+++ b/src/sksl/SkSLCompiler.cpp
@@ -10,13 +10,11 @@
#include <fstream>
#include <streambuf>
-#include "ast/SkSLASTPrecision.h"
#include "SkSLIRGenerator.h"
#include "SkSLParser.h"
#include "SkSLSPIRVCodeGenerator.h"
#include "ir/SkSLExpression.h"
#include "ir/SkSLIntLiteral.h"
-#include "ir/SkSLModifiersDeclaration.h"
#include "ir/SkSLSymbolTable.h"
#include "ir/SkSLVarDeclaration.h"
#include "SkMutex.h"
@@ -99,7 +97,6 @@ Compiler::Compiler()
ADD_TYPE(Sampler1D);
ADD_TYPE(Sampler2D);
ADD_TYPE(Sampler3D);
- ADD_TYPE(SamplerExternalOES);
ADD_TYPE(SamplerCube);
ADD_TYPE(Sampler2DRect);
ADD_TYPE(Sampler1DArray);
@@ -131,9 +128,8 @@ Compiler::Compiler()
ADD_TYPE(GSampler2DArrayShadow);
ADD_TYPE(GSamplerCubeArrayShadow);
- Modifiers::Flag ignored1;
- std::vector<std::unique_ptr<ProgramElement>> ignored2;
- this->internalConvertProgram(SKSL_INCLUDE, &ignored1, &ignored2);
+ std::vector<std::unique_ptr<ProgramElement>> ignored;
+ this->internalConvertProgram(SKSL_INCLUDE, &ignored);
ASSERT(!fErrorCount);
}
@@ -142,14 +138,12 @@ Compiler::~Compiler() {
}
void Compiler::internalConvertProgram(std::string text,
- Modifiers::Flag* defaultPrecision,
std::vector<std::unique_ptr<ProgramElement>>* result) {
Parser parser(text, *fTypes, *this);
std::vector<std::unique_ptr<ASTDeclaration>> parsed = parser.file();
if (fErrorCount) {
return;
}
- *defaultPrecision = Modifiers::kHighp_Flag;
for (size_t i = 0; i < parsed.size(); i++) {
ASTDeclaration& decl = *parsed[i];
switch (decl.fKind) {
@@ -170,14 +164,6 @@ void Compiler::internalConvertProgram(std::string text,
}
break;
}
- case ASTDeclaration::kModifiers_Kind: {
- std::unique_ptr<ModifiersDeclaration> f = fIRGenerator->convertModifiersDeclaration(
- (ASTModifiersDeclaration&) decl);
- if (f) {
- result->push_back(std::move(f));
- }
- break;
- }
case ASTDeclaration::kInterfaceBlock_Kind: {
std::unique_ptr<InterfaceBlock> i = fIRGenerator->convertInterfaceBlock(
(ASTInterfaceBlock&) decl);
@@ -193,10 +179,6 @@ void Compiler::internalConvertProgram(std::string text,
}
break;
}
- case ASTDeclaration::kPrecision_Kind: {
- *defaultPrecision = ((ASTPrecision&) decl).fPrecision;
- break;
- }
default:
ABORT("unsupported declaration: %s\n", decl.description().c_str());
}
@@ -208,18 +190,16 @@ std::unique_ptr<Program> Compiler::convertProgram(Program::Kind kind, std::strin
fErrorCount = 0;
fIRGenerator->pushSymbolTable();
std::vector<std::unique_ptr<ProgramElement>> elements;
- Modifiers::Flag ignored;
switch (kind) {
case Program::kVertex_Kind:
- this->internalConvertProgram(SKSL_VERT_INCLUDE, &ignored, &elements);
+ this->internalConvertProgram(SKSL_VERT_INCLUDE, &elements);
break;
case Program::kFragment_Kind:
- this->internalConvertProgram(SKSL_FRAG_INCLUDE, &ignored, &elements);
+ this->internalConvertProgram(SKSL_FRAG_INCLUDE, &elements);
break;
}
- Modifiers::Flag defaultPrecision;
- this->internalConvertProgram(text, &defaultPrecision, &elements);
- auto result = std::unique_ptr<Program>(new Program(kind, defaultPrecision, std::move(elements),
+ this->internalConvertProgram(text, &elements);
+ auto result = std::unique_ptr<Program>(new Program(kind, std::move(elements),
fIRGenerator->fSymbolTable));;
fIRGenerator->popSymbolTable();
this->writeErrorCount();
diff --git a/src/sksl/SkSLCompiler.h b/src/sksl/SkSLCompiler.h
index 96ae7d06bc..9cd1eac3f9 100644
--- a/src/sksl/SkSLCompiler.h
+++ b/src/sksl/SkSLCompiler.h
@@ -15,8 +15,6 @@
#include "SkSLErrorReporter.h"
#include "SkSLGLSLCodeGenerator.h"
-#define SK_FRAGCOLOR_BUILTIN 10001
-
namespace SkSL {
class IRGenerator;
@@ -26,8 +24,6 @@ class IRGenerator;
* file into an abstract syntax tree (a tree of ASTNodes), then performs semantic analysis to
* produce a Program (a tree of IRNodes), then feeds the Program into a CodeGenerator to produce
* compiled output.
- *
- * See the README for information about SkSL.
*/
class Compiler : public ErrorReporter {
public:
@@ -54,7 +50,6 @@ public:
private:
void internalConvertProgram(std::string text,
- Modifiers::Flag* defaultPrecision,
std::vector<std::unique_ptr<ProgramElement>>* result);
std::shared_ptr<SymbolTable> fTypes;
diff --git a/src/sksl/SkSLContext.h b/src/sksl/SkSLContext.h
index 82c265bbb2..1f124d05eb 100644
--- a/src/sksl/SkSLContext.h
+++ b/src/sksl/SkSLContext.h
@@ -60,7 +60,6 @@ public:
, fSampler1D_Type(new Type("sampler1D", SpvDim1D, false, false, false, true))
, fSampler2D_Type(new Type("sampler2D", SpvDim2D, false, false, false, true))
, fSampler3D_Type(new Type("sampler3D", SpvDim3D, false, false, false, true))
- , fSamplerExternalOES_Type(new Type("samplerExternalOES", SpvDim2D, false, false, false, true))
, fSamplerCube_Type(new Type("samplerCube"))
, fSampler2DRect_Type(new Type("sampler2DRect"))
, fSampler1DArray_Type(new Type("sampler1DArray"))
@@ -170,7 +169,6 @@ public:
const std::unique_ptr<Type> fSampler1D_Type;
const std::unique_ptr<Type> fSampler2D_Type;
const std::unique_ptr<Type> fSampler3D_Type;
- const std::unique_ptr<Type> fSamplerExternalOES_Type;
const std::unique_ptr<Type> fSamplerCube_Type;
const std::unique_ptr<Type> fSampler2DRect_Type;
const std::unique_ptr<Type> fSampler1DArray_Type;
diff --git a/src/sksl/SkSLGLSLCodeGenerator.cpp b/src/sksl/SkSLGLSLCodeGenerator.cpp
index 58cf7d3c36..da0bcb903c 100644
--- a/src/sksl/SkSLGLSLCodeGenerator.cpp
+++ b/src/sksl/SkSLGLSLCodeGenerator.cpp
@@ -14,11 +14,8 @@
#include "ir/SkSLExpressionStatement.h"
#include "ir/SkSLExtension.h"
#include "ir/SkSLIndexExpression.h"
-#include "ir/SkSLModifiersDeclaration.h"
#include "ir/SkSLVariableReference.h"
-#define SK_FRAGCOLOR_BUILTIN 10001
-
namespace SkSL {
void GLSLCodeGenerator::write(const char* s) {
@@ -69,7 +66,7 @@ void GLSLCodeGenerator::writeType(const Type& type) {
this->writeLine("struct " + type.name() + " {");
fIndentation++;
for (const auto& f : type.fields()) {
- this->writeModifiers(f.fModifiers, false);
+ this->writeModifiers(f.fModifiers);
// sizes (which must be static in structs) are part of the type name here
this->writeType(*f.fType);
this->writeLine(" " + f.fName + ";");
@@ -127,42 +124,7 @@ void GLSLCodeGenerator::writeExpression(const Expression& expr, Precedence paren
}
}
-static bool is_abs(Expression& expr) {
- if (expr.fKind != Expression::kFunctionCall_Kind) {
- return false;
- }
- return ((FunctionCall&) expr).fFunction.fName == "abs";
-}
-
-// turns min(abs(x), y) into ((tmpVar1 = abs(x)) < (tmpVar2 = y) ? tmpVar1 : tmpVar2) to avoid a
-// Tegra3 compiler bug.
-void GLSLCodeGenerator::writeMinAbsHack(Expression& absExpr, Expression& otherExpr) {
- ASSERT(!fCaps.fCanUseMinAndAbsTogether);
- std::string tmpVar1 = "minAbsHackVar" + to_string(fVarCount++);
- std::string tmpVar2 = "minAbsHackVar" + to_string(fVarCount++);
- this->fFunctionHeader += " " + absExpr.fType.name() + " " + tmpVar1 + ";\n";
- this->fFunctionHeader += " " + otherExpr.fType.name() + " " + tmpVar2 + ";\n";
- this->write("((" + tmpVar1 + " = ");
- this->writeExpression(absExpr, kTopLevel_Precedence);
- this->write(") < (" + tmpVar2 + " = ");
- this->writeExpression(otherExpr, kAssignment_Precedence);
- this->write(") ? " + tmpVar1 + " : " + tmpVar2 + ")");
-}
-
void GLSLCodeGenerator::writeFunctionCall(const FunctionCall& c) {
- if (!fCaps.fCanUseMinAndAbsTogether && c.fFunction.fName == "min") {
- ASSERT(c.fArguments.size() == 2);
- if (is_abs(*c.fArguments[0])) {
- this->writeMinAbsHack(*c.fArguments[0], *c.fArguments[1]);
- return;
- }
- if (is_abs(*c.fArguments[1])) {
- // note that this violates the GLSL left-to-right evaluation semantics. I doubt it will
- // ever end up mattering, but it's worth calling out.
- this->writeMinAbsHack(*c.fArguments[1], *c.fArguments[0]);
- return;
- }
- }
this->write(c.fFunction.fName + "(");
const char* separator = "";
for (const auto& arg : c.fArguments) {
@@ -185,15 +147,7 @@ void GLSLCodeGenerator::writeConstructor(const Constructor& c) {
}
void GLSLCodeGenerator::writeVariableReference(const VariableReference& ref) {
- if (ref.fVariable.fModifiers.fLayout.fBuiltin == SK_FRAGCOLOR_BUILTIN) {
- if (fCaps.fMustDeclareFragmentShaderOutput) {
- this->write("sk_FragColor");
- } else {
- this->write("gl_FragColor");
- }
- } else {
- this->write(ref.fVariable.fName);
- }
+ this->write(ref.fVariable.fName);
}
void GLSLCodeGenerator::writeIndexExpression(const IndexExpression& expr) {
@@ -316,11 +270,7 @@ void GLSLCodeGenerator::writeBoolLiteral(const BoolLiteral& b) {
}
void GLSLCodeGenerator::writeIntLiteral(const IntLiteral& i) {
- if (i.fType == *fContext.fUInt_Type) {
- this->write(to_string(i.fValue & 0xffffffff) + "u");
- } else {
- this->write(to_string((int32_t) i.fValue));
- }
+ this->write(to_string(i.fValue));
}
void GLSLCodeGenerator::writeFloatLiteral(const FloatLiteral& f) {
@@ -334,99 +284,28 @@ void GLSLCodeGenerator::writeFunction(const FunctionDefinition& f) {
for (const auto& param : f.fDeclaration.fParameters) {
this->write(separator);
separator = ", ";
- this->writeModifiers(param->fModifiers, false);
- std::vector<int> sizes;
- const Type* type = &param->fType;
- while (type->kind() == Type::kArray_Kind) {
- sizes.push_back(type->columns());
- type = &type->componentType();
- }
- this->writeType(*type);
+ this->writeModifiers(param->fModifiers);
+ this->writeType(param->fType);
this->write(" " + param->fName);
- for (int s : sizes) {
- if (s <= 0) {
- this->write("[]");
- } else {
- this->write("[" + to_string(s) + "]");
- }
- }
}
- this->writeLine(") {");
-
- fFunctionHeader = "";
- std::ostream* oldOut = fOut;
- std::stringstream buffer;
- fOut = &buffer;
- fIndentation++;
- for (const auto& s : f.fBody->fStatements) {
- this->writeStatement(*s);
- this->writeLine();
- }
- fIndentation--;
- this->writeLine("}");
-
- fOut = oldOut;
- this->write(fFunctionHeader);
- this->write(buffer.str());
+ this->write(") ");
+ this->writeBlock(*f.fBody);
+ this->writeLine();
}
-void GLSLCodeGenerator::writeModifiers(const Modifiers& modifiers,
- bool globalContext) {
- if (modifiers.fFlags & Modifiers::kNoPerspective_Flag) {
- this->write("noperspective ");
- }
- if (modifiers.fFlags & Modifiers::kFlat_Flag) {
- this->write("flat ");
- }
- std::string layout = modifiers.fLayout.description();
- if (layout.length()) {
- this->write(layout + " ");
- }
- if ((modifiers.fFlags & Modifiers::kIn_Flag) &&
- (modifiers.fFlags & Modifiers::kOut_Flag)) {
- this->write("inout ");
- } else if (modifiers.fFlags & Modifiers::kIn_Flag) {
- if (globalContext && fCaps.fVersion < 130) {
- this->write(fProgramKind == Program::kVertex_Kind ? "attribute "
- : "varying ");
- } else {
- this->write("in ");
- }
- } else if (modifiers.fFlags & Modifiers::kOut_Flag) {
- if (globalContext && fCaps.fVersion < 130) {
- this->write("varying ");
- } else {
- this->write("out ");
- }
- }
- if (modifiers.fFlags & Modifiers::kUniform_Flag) {
- this->write("uniform ");
- }
- if (modifiers.fFlags & Modifiers::kConst_Flag) {
- this->write("const ");
- }
- if (fCaps.fUsesPrecisionModifiers) {
- if (modifiers.fFlags & Modifiers::kLowp_Flag) {
- this->write("lowp ");
- }
- if (modifiers.fFlags & Modifiers::kMediump_Flag) {
- this->write("mediump ");
- }
- if (modifiers.fFlags & Modifiers::kHighp_Flag) {
- this->write("highp ");
- }
- }
+void GLSLCodeGenerator::writeModifiers(const Modifiers& modifiers) {
+ this->write(modifiers.description());
}
void GLSLCodeGenerator::writeInterfaceBlock(const InterfaceBlock& intf) {
if (intf.fVariable.fName == "gl_PerVertex") {
return;
}
- this->writeModifiers(intf.fVariable.fModifiers, true);
+ this->writeModifiers(intf.fVariable.fModifiers);
this->writeLine(intf.fVariable.fType.name() + " {");
fIndentation++;
for (const auto& f : intf.fVariable.fType.fields()) {
- this->writeModifiers(f.fModifiers, false);
+ this->writeModifiers(f.fModifiers);
this->writeType(*f.fType);
this->writeLine(" " + f.fName + ";");
}
@@ -434,9 +313,9 @@ void GLSLCodeGenerator::writeInterfaceBlock(const InterfaceBlock& intf) {
this->writeLine("};");
}
-void GLSLCodeGenerator::writeVarDeclarations(const VarDeclarations& decl, bool global) {
+void GLSLCodeGenerator::writeVarDeclarations(const VarDeclarations& decl) {
ASSERT(decl.fVars.size() > 0);
- this->writeModifiers(decl.fVars[0].fVar->fModifiers, global);
+ this->writeModifiers(decl.fVars[0].fVar->fModifiers);
this->writeType(decl.fBaseType);
std::string separator = " ";
for (const auto& var : decl.fVars) {
@@ -446,9 +325,7 @@ void GLSLCodeGenerator::writeVarDeclarations(const VarDeclarations& decl, bool g
this->write(var.fVar->fName);
for (const auto& size : var.fSizes) {
this->write("[");
- if (size) {
- this->writeExpression(*size, kTopLevel_Precedence);
- }
+ this->writeExpression(*size, kTopLevel_Precedence);
this->write("]");
}
if (var.fValue) {
@@ -472,7 +349,7 @@ void GLSLCodeGenerator::writeStatement(const Statement& s) {
this->writeReturnStatement((ReturnStatement&) s);
break;
case Statement::kVarDeclarations_Kind:
- this->writeVarDeclarations(*((VarDeclarationsStatement&) s).fDeclaration, false);
+ this->writeVarDeclarations(*((VarDeclarationsStatement&) s).fDeclaration);
break;
case Statement::kIf_Kind:
this->writeIfStatement((IfStatement&) s);
@@ -567,57 +444,22 @@ void GLSLCodeGenerator::writeReturnStatement(const ReturnStatement& r) {
void GLSLCodeGenerator::generateCode(const Program& program, std::ostream& out) {
ASSERT(fOut == nullptr);
fOut = &out;
- fProgramKind = program.fKind;
this->write("#version " + to_string(fCaps.fVersion));
- if (fCaps.fStandard == GLCaps::kGLES_Standard && fCaps.fVersion >= 300) {
+ if (fCaps.fStandard == GLCaps::kGLES_Standard) {
this->write(" es");
- } else if (fCaps.fIsCoreProfile) {
- this->write(" core");
}
this->writeLine();
for (const auto& e : program.fElements) {
- if (e->fKind == ProgramElement::kExtension_Kind) {
- this->writeExtension((Extension&) *e);
- }
- }
- if (fCaps.fStandard == GLCaps::kGLES_Standard) {
- this->write("precision ");
- switch (program.fDefaultPrecision) {
- case Modifiers::kLowp_Flag:
- this->write("lowp");
- break;
- case Modifiers::kMediump_Flag:
- this->write("mediump");
- break;
- case Modifiers::kHighp_Flag:
- this->write("highp");
- break;
- default:
- ASSERT(false);
- this->write("<error>");
- }
- this->writeLine(" float;");
- }
- for (const auto& e : program.fElements) {
switch (e->fKind) {
case ProgramElement::kExtension_Kind:
+ this->writeExtension((Extension&) *e);
break;
case ProgramElement::kVar_Kind: {
VarDeclarations& decl = (VarDeclarations&) *e;
- if (decl.fVars.size() > 0) {
- int builtin = decl.fVars[0].fVar->fModifiers.fLayout.fBuiltin;
- if (builtin == -1) {
- // normal var
- this->writeVarDeclarations(decl, true);
- this->writeLine();
- } else if (builtin == SK_FRAGCOLOR_BUILTIN &&
- fCaps.fMustDeclareFragmentShaderOutput) {
- this->write("out ");
- if (fCaps.fUsesPrecisionModifiers) {
- this->write("mediump ");
- }
- this->writeLine("vec4 sk_FragColor;");
- }
+ if (decl.fVars.size() > 0 &&
+ decl.fVars[0].fVar->fModifiers.fLayout.fBuiltin == -1) {
+ this->writeVarDeclarations(decl);
+ this->writeLine();
}
break;
}
@@ -627,10 +469,6 @@ void GLSLCodeGenerator::generateCode(const Program& program, std::ostream& out)
case ProgramElement::kFunction_Kind:
this->writeFunction((FunctionDefinition&) *e);
break;
- case ProgramElement::kModifiers_Kind:
- this->writeModifiers(((ModifiersDeclaration&) *e).fModifiers, true);
- this->writeLine(";");
- break;
default:
printf("%s\n", e->description().c_str());
ABORT("unsupported program element");
diff --git a/src/sksl/SkSLGLSLCodeGenerator.h b/src/sksl/SkSLGLSLCodeGenerator.h
index 9851123708..3534affccc 100644
--- a/src/sksl/SkSLGLSLCodeGenerator.h
+++ b/src/sksl/SkSLGLSLCodeGenerator.h
@@ -50,11 +50,6 @@ struct GLCaps {
kGL_Standard,
kGLES_Standard
} fStandard;
- bool fIsCoreProfile;
- bool fUsesPrecisionModifiers;
- bool fMustDeclareFragmentShaderOutput;
- // The Tegra3 compiler will sometimes never return if we have min(abs(x), y)
- bool fCanUseMinAndAbsTogether;
};
/**
@@ -86,8 +81,6 @@ public:
GLSLCodeGenerator(const Context* context, GLCaps caps)
: fContext(*context)
, fCaps(caps)
- , fOut(nullptr)
- , fVarCount(0)
, fIndentation(0)
, fAtLineStart(true) {}
@@ -118,11 +111,11 @@ private:
void writeLayout(const Layout& layout);
- void writeModifiers(const Modifiers& modifiers, bool globalContext);
+ void writeModifiers(const Modifiers& modifiers);
void writeGlobalVars(const VarDeclaration& vs);
- void writeVarDeclarations(const VarDeclarations& decl, bool global);
+ void writeVarDeclarations(const VarDeclarations& decl);
void writeVariableReference(const VariableReference& ref);
@@ -130,8 +123,6 @@ private:
void writeIntrinsicCall(const FunctionCall& c);
- void writeMinAbsHack(Expression& absExpr, Expression& otherExpr);
-
void writeFunctionCall(const FunctionCall& c);
void writeConstructor(const Constructor& c);
@@ -173,9 +164,6 @@ private:
const Context& fContext;
const GLCaps fCaps;
std::ostream* fOut;
- std::string fFunctionHeader;
- Program::Kind fProgramKind;
- int fVarCount;
int fIndentation;
bool fAtLineStart;
// Keeps track of which struct types we have written. Given that we are unlikely to ever write
diff --git a/src/sksl/SkSLIRGenerator.cpp b/src/sksl/SkSLIRGenerator.cpp
index d64684e62d..c30cac17d7 100644
--- a/src/sksl/SkSLIRGenerator.cpp
+++ b/src/sksl/SkSLIRGenerator.cpp
@@ -189,11 +189,7 @@ std::unique_ptr<VarDeclarations> IRGenerator::convertVarDeclarations(const ASTVa
}
value = this->coerce(std::move(value), *type);
}
- if ("sk_FragColor" == varDecl.fName && (*fSymbolTable)[varDecl.fName]) {
- // already defined, ignore
- } else if ((*fSymbolTable)[varDecl.fName] &&
- (*fSymbolTable)[varDecl.fName]->fKind == Symbol::kVariable_Kind &&
- ((Variable*) (*fSymbolTable)[varDecl.fName])->fModifiers.fLayout.fBuiltin >= 0) {
+ if ("gl_FragCoord" == varDecl.fName && (*fSymbolTable)[varDecl.fName]) {
// already defined, just update the modifiers
Variable* old = (Variable*) (*fSymbolTable)[varDecl.fName];
old->fModifiers = var->fModifiers;
@@ -207,12 +203,6 @@ std::unique_ptr<VarDeclarations> IRGenerator::convertVarDeclarations(const ASTVa
std::move(variables)));
}
-std::unique_ptr<ModifiersDeclaration> IRGenerator::convertModifiersDeclaration(
- const ASTModifiersDeclaration& m) {
- Modifiers modifiers = this->convertModifiers(m.fModifiers);
- return std::unique_ptr<ModifiersDeclaration>(new ModifiersDeclaration(modifiers));
-}
-
std::unique_ptr<Statement> IRGenerator::convertIf(const ASTIfStatement& s) {
std::unique_ptr<Expression> test = this->coerce(this->convertExpression(*s.fTest),
*fContext.fBool_Type);
@@ -429,9 +419,8 @@ std::unique_ptr<FunctionDefinition> IRGenerator::convertFunction(const ASTFuncti
for (size_t i = 0; i < parameters.size(); i++) {
if (parameters[i]->fModifiers != other->fParameters[i]->fModifiers) {
fErrors.error(f.fPosition, "modifiers on parameter " +
- to_string((uint64_t) i + 1) +
- " differ between declaration and "
- "definition");
+ to_string(i + 1) + " differ between " +
+ "declaration and definition");
return nullptr;
}
}
@@ -627,9 +616,8 @@ std::unique_ptr<Expression> IRGenerator::coerce(std::unique_ptr<Expression> expr
ASSERT(ctor);
return this->call(Position(), std::move(ctor), std::move(args));
}
- std::vector<std::unique_ptr<Expression>> args;
- args.push_back(std::move(expr));
- return std::unique_ptr<Expression>(new Constructor(Position(), type, std::move(args)));
+ ABORT("cannot coerce %s to %s", expr->fType.description().c_str(),
+ type.description().c_str());
}
static bool is_matrix_multiply(const Type& left, const Type& right) {
@@ -844,12 +832,12 @@ std::unique_ptr<Expression> IRGenerator::call(Position position,
std::vector<std::unique_ptr<Expression>> arguments) {
if (function.fParameters.size() != arguments.size()) {
std::string msg = "call to '" + function.fName + "' expected " +
- to_string((uint64_t) function.fParameters.size()) +
+ to_string(function.fParameters.size()) +
" argument";
if (function.fParameters.size() != 1) {
msg += "s";
}
- msg += ", but found " + to_string((uint64_t) arguments.size());
+ msg += ", but found " + to_string(arguments.size());
fErrors.error(position, msg);
return nullptr;
}
@@ -933,8 +921,7 @@ std::unique_ptr<Expression> IRGenerator::convertConstructor(
std::vector<std::unique_ptr<Expression>> args) {
// FIXME: add support for structs and arrays
Type::Kind kind = type.kind();
- if (!type.isNumber() && kind != Type::kVector_Kind && kind != Type::kMatrix_Kind &&
- kind != Type::kArray_Kind) {
+ if (!type.isNumber() && kind != Type::kVector_Kind && kind != Type::kMatrix_Kind) {
fErrors.error(position, "cannot construct '" + type.description() + "'");
return nullptr;
}
@@ -951,7 +938,7 @@ std::unique_ptr<Expression> IRGenerator::convertConstructor(
if (args.size() != 1) {
fErrors.error(position, "invalid arguments to '" + type.description() +
"' constructor, (expected exactly 1 argument, but found " +
- to_string((uint64_t) args.size()) + ")");
+ to_string(args.size()) + ")");
}
if (args[0]->fType == *fContext.fBool_Type) {
std::unique_ptr<IntLiteral> zero(new IntLiteral(fContext, position, 0));
@@ -966,18 +953,6 @@ std::unique_ptr<Expression> IRGenerator::convertConstructor(
"' constructor (expected a number or bool, but found '" +
args[0]->fType.description() + "')");
}
- if (args[0]->fKind == Expression::kIntLiteral_Kind && (type == *fContext.fInt_Type ||
- type == *fContext.fUInt_Type)) {
- return std::unique_ptr<Expression>(new IntLiteral(fContext,
- position,
- ((IntLiteral&) *args[0]).fValue,
- &type));
- }
- } else if (kind == Type::kArray_Kind) {
- const Type& base = type.componentType();
- for (size_t i = 0; i < args.size(); i++) {
- args[i] = this->coerce(std::move(args[i]), base);
- }
} else {
ASSERT(kind == Type::kVector_Kind || kind == Type::kMatrix_Kind);
int actual = 0;
@@ -1062,7 +1037,7 @@ std::unique_ptr<Expression> IRGenerator::convertPrefixExpression(
}
this->markWrittenTo(*base);
break;
- case Token::LOGICALNOT:
+ case Token::NOT:
if (base->fType != *fContext.fBool_Type) {
fErrors.error(expression.fPosition,
"'" + Token::OperatorName(expression.fOperator) +
@@ -1070,14 +1045,6 @@ std::unique_ptr<Expression> IRGenerator::convertPrefixExpression(
return nullptr;
}
break;
- case Token::BITWISENOT:
- if (base->fType != *fContext.fInt_Type) {
- fErrors.error(expression.fPosition,
- "'" + Token::OperatorName(expression.fOperator) +
- "' cannot operate on '" + base->fType.description() + "'");
- return nullptr;
- }
- break;
default:
ABORT("unsupported prefix operator\n");
}
@@ -1087,8 +1054,7 @@ std::unique_ptr<Expression> IRGenerator::convertPrefixExpression(
std::unique_ptr<Expression> IRGenerator::convertIndex(std::unique_ptr<Expression> base,
const ASTExpression& index) {
- if (base->fType.kind() != Type::kArray_Kind && base->fType.kind() != Type::kMatrix_Kind &&
- base->fType.kind() != Type::kVector_Kind) {
+ if (base->fType.kind() != Type::kArray_Kind && base->fType.kind() != Type::kMatrix_Kind) {
fErrors.error(base->fPosition, "expected array, but found '" + base->fType.description() +
"'");
return nullptr;
@@ -1097,11 +1063,9 @@ std::unique_ptr<Expression> IRGenerator::convertIndex(std::unique_ptr<Expression
if (!converted) {
return nullptr;
}
- if (converted->fType != *fContext.fUInt_Type) {
- converted = this->coerce(std::move(converted), *fContext.fInt_Type);
- if (!converted) {
- return nullptr;
- }
+ converted = this->coerce(std::move(converted), *fContext.fInt_Type);
+ if (!converted) {
+ return nullptr;
}
return std::unique_ptr<Expression>(new IndexExpression(fContext, std::move(base),
std::move(converted)));
@@ -1179,21 +1143,9 @@ std::unique_ptr<Expression> IRGenerator::convertSuffixExpression(
return nullptr;
}
switch (expression.fSuffix->fKind) {
- case ASTSuffix::kIndex_Kind: {
- const ASTExpression* expr = ((ASTIndexSuffix&) *expression.fSuffix).fExpression.get();
- if (expr) {
- return this->convertIndex(std::move(base), *expr);
- } else if (base->fKind == Expression::kTypeReference_Kind) {
- const Type& oldType = ((TypeReference&) *base).fValue;
- Type* newType = new Type(oldType.name() + "[]", Type::kArray_Kind, oldType,
- -1);
- fSymbolTable->takeOwnership(newType);
- return std::unique_ptr<Expression>(new TypeReference(fContext, base->fPosition,
- *newType));
- } else {
- fErrors.error(expression.fPosition, "'[]' must follow a type name");
- }
- }
+ case ASTSuffix::kIndex_Kind:
+ return this->convertIndex(std::move(base),
+ *((ASTIndexSuffix&) *expression.fSuffix).fExpression);
case ASTSuffix::kCall_Kind: {
auto rawArguments = &((ASTCallSuffix&) *expression.fSuffix).fArguments;
std::vector<std::unique_ptr<Expression>> arguments;
diff --git a/src/sksl/SkSLIRGenerator.h b/src/sksl/SkSLIRGenerator.h
index 834ed8de81..a3ff210b45 100644
--- a/src/sksl/SkSLIRGenerator.h
+++ b/src/sksl/SkSLIRGenerator.h
@@ -25,7 +25,6 @@
#include "ast/SkSLASTIfStatement.h"
#include "ast/SkSLASTInterfaceBlock.h"
#include "ast/SkSLASTModifiers.h"
-#include "ast/SkSLASTModifiersDeclaration.h"
#include "ast/SkSLASTPrefixExpression.h"
#include "ast/SkSLASTReturnStatement.h"
#include "ast/SkSLASTStatement.h"
@@ -40,7 +39,6 @@
#include "ir/SkSLFunctionDefinition.h"
#include "ir/SkSLInterfaceBlock.h"
#include "ir/SkSLModifiers.h"
-#include "ir/SkSLModifiersDeclaration.h"
#include "ir/SkSLSymbolTable.h"
#include "ir/SkSLStatement.h"
#include "ir/SkSLType.h"
@@ -63,8 +61,6 @@ public:
std::unique_ptr<FunctionDefinition> convertFunction(const ASTFunction& f);
std::unique_ptr<Statement> convertStatement(const ASTStatement& statement);
std::unique_ptr<Expression> convertExpression(const ASTExpression& expression);
- std::unique_ptr<ModifiersDeclaration> convertModifiersDeclaration(
- const ASTModifiersDeclaration& m);
private:
void pushSymbolTable();
diff --git a/src/sksl/SkSLMain.cpp b/src/sksl/SkSLMain.cpp
index de1b9819d5..24fbb6c260 100644
--- a/src/sksl/SkSLMain.cpp
+++ b/src/sksl/SkSLMain.cpp
@@ -9,24 +9,6 @@
#include <fstream>
#include "SkSLCompiler.h"
-bool endsWith(const std::string& s, const std::string& ending) {
- if (s.length() >= ending.length()) {
- return (0 == s.compare(s.length() - ending.length(), ending.length(), ending));
- }
- return false;
-}
-
-static SkSL::GLCaps default_caps() {
- return {
- 400,
- SkSL::GLCaps::kGL_Standard,
- false, // isCoreProfile
- false, // usesPrecisionModifiers;
- false, // mustDeclareFragmentShaderOutput
- true // canUseMinAndAbsTogether
- };
-}
-
/**
* Very simple standalone executable to facilitate testing.
*/
@@ -53,30 +35,14 @@ int main(int argc, const char** argv) {
printf("error reading '%s'\n", argv[1]);
exit(2);
}
- std::string name(argv[2]);
- if (endsWith(name, ".spirv")) {
- std::ofstream out(argv[2], std::ofstream::binary);
- SkSL::Compiler compiler;
- if (!compiler.toSPIRV(kind, text, out)) {
- printf("%s", compiler.errorText().c_str());
- exit(3);
- }
- if (out.rdstate()) {
- printf("error writing '%s'\n", argv[2]);
- exit(4);
- }
- } else if (endsWith(name, ".glsl")) {
- std::ofstream out(argv[2], std::ofstream::binary);
- SkSL::Compiler compiler;
- if (!compiler.toGLSL(kind, text, default_caps(), out)) {
- printf("%s", compiler.errorText().c_str());
- exit(3);
- }
- if (out.rdstate()) {
- printf("error writing '%s'\n", argv[2]);
- exit(4);
- }
- } else {
- printf("expected output filename to end with '.spirv' or '.glsl'");
+ std::ofstream out(argv[2], std::ofstream::binary);
+ SkSL::Compiler compiler;
+ if (!compiler.toSPIRV(kind, text, out)) {
+ printf("%s", compiler.errorText().c_str());
+ exit(3);
+ }
+ if (out.rdstate()) {
+ printf("error writing '%s'\n", argv[2]);
+ exit(4);
}
}
diff --git a/src/sksl/SkSLParser.cpp b/src/sksl/SkSLParser.cpp
index 29f1dbd178..b240e4501e 100644
--- a/src/sksl/SkSLParser.cpp
+++ b/src/sksl/SkSLParser.cpp
@@ -56,9 +56,7 @@
#include "ast/SkSLASTIndexSuffix.h"
#include "ast/SkSLASTInterfaceBlock.h"
#include "ast/SkSLASTIntLiteral.h"
-#include "ast/SkSLASTModifiersDeclaration.h"
#include "ast/SkSLASTParameter.h"
-#include "ast/SkSLASTPrecision.h"
#include "ast/SkSLASTPrefixExpression.h"
#include "ast/SkSLASTReturnStatement.h"
#include "ast/SkSLASTStatement.h"
@@ -99,13 +97,9 @@ std::vector<std::unique_ptr<ASTDeclaration>> Parser::file() {
switch (this->peek().fKind) {
case Token::END_OF_FILE:
return result;
- case Token::PRECISION: {
- std::unique_ptr<ASTDeclaration> precision = this->precision();
- if (precision) {
- result.push_back(std::move(precision));
- }
+ case Token::PRECISION:
+ this->precision();
break;
- }
case Token::DIRECTIVE: {
std::unique_ptr<ASTDeclaration> decl = this->directive();
if (decl) {
@@ -169,37 +163,29 @@ bool Parser::isType(std::string name) {
}
/* PRECISION (LOWP | MEDIUMP | HIGHP) type SEMICOLON */
-std::unique_ptr<ASTDeclaration> Parser::precision() {
+void Parser::precision() {
if (!this->expect(Token::PRECISION, "'precision'")) {
- return nullptr;
+ return;
}
- Modifiers::Flag result;
Token p = this->nextToken();
switch (p.fKind) {
- case Token::LOWP:
- result = Modifiers::kLowp_Flag;
- break;
- case Token::MEDIUMP:
- result = Modifiers::kMediump_Flag;
- break;
+ case Token::LOWP: // fall through
+ case Token::MEDIUMP: // fall through
case Token::HIGHP:
- result = Modifiers::kHighp_Flag;
+ // ignored for now
break;
default:
this->error(p.fPosition, "expected 'lowp', 'mediump', or 'highp', but found '" +
p.fText + "'");
- return nullptr;
+ return;
}
- // FIXME handle the type
if (!this->type()) {
- return nullptr;
+ return;
}
this->expect(Token::SEMICOLON, "';'");
- return std::unique_ptr<ASTDeclaration>(new ASTPrecision(p.fPosition, result));
}
-/* DIRECTIVE(#version) INT_LITERAL ("es" | "compatibility")? |
- DIRECTIVE(#extension) IDENTIFIER COLON IDENTIFIER */
+/* DIRECTIVE(#version) INT_LITERAL | DIRECTIVE(#extension) IDENTIFIER COLON IDENTIFIER */
std::unique_ptr<ASTDeclaration> Parser::directive() {
Token start;
if (!this->expect(Token::DIRECTIVE, "a directive", &start)) {
@@ -207,12 +193,7 @@ std::unique_ptr<ASTDeclaration> Parser::directive() {
}
if (start.fText == "#version") {
this->expect(Token::INT_LITERAL, "a version number");
- Token next = this->peek();
- if (next.fText == "es" || next.fText == "compatibility") {
- this->nextToken();
- }
- // version is ignored for now; it will eventually become an error when we stop pretending
- // to be GLSL
+ // ignored for now
return nullptr;
} else if (start.fText == "#extension") {
Token name;
@@ -246,10 +227,6 @@ std::unique_ptr<ASTDeclaration> Parser::declaration() {
if (lookahead.fKind == Token::STRUCT) {
return this->structVarDeclaration(modifiers);
}
- if (lookahead.fKind == Token::SEMICOLON) {
- this->nextToken();
- return std::unique_ptr<ASTDeclaration>(new ASTModifiersDeclaration(modifiers));
- }
std::unique_ptr<ASTType> type(this->type());
if (!type) {
return nullptr;
@@ -500,13 +477,10 @@ ASTLayout Parser::layout() {
int set = -1;
int builtin = -1;
bool originUpperLeft = false;
- bool overrideCoverage = false;
- bool blendSupportAllEquations = false;
if (this->peek().fKind == Token::LAYOUT) {
this->nextToken();
if (!this->expect(Token::LPAREN, "'('")) {
- return ASTLayout(location, binding, index, set, builtin, originUpperLeft,
- overrideCoverage, blendSupportAllEquations);
+ return ASTLayout(location, binding, index, set, builtin, originUpperLeft);
}
for (;;) {
Token t = this->nextToken();
@@ -522,10 +496,6 @@ ASTLayout Parser::layout() {
builtin = this->layoutInt();
} else if (t.fText == "origin_upper_left") {
originUpperLeft = true;
- } else if (t.fText == "override_coverage") {
- overrideCoverage = true;
- } else if (t.fText == "blend_support_all_equations") {
- blendSupportAllEquations = true;
} else {
this->error(t.fPosition, ("'" + t.fText +
"' is not a valid layout qualifier").c_str());
@@ -539,8 +509,7 @@ ASTLayout Parser::layout() {
}
}
}
- return ASTLayout(location, binding, index, set, builtin, originUpperLeft, overrideCoverage,
- blendSupportAllEquations);
+ return ASTLayout(location, binding, index, set, builtin, originUpperLeft);
}
/* layout? (UNIFORM | CONST | IN | OUT | INOUT | LOWP | MEDIUMP | HIGHP | FLAT | NOPERSPECTIVE)* */
@@ -1242,11 +1211,10 @@ std::unique_ptr<ASTExpression> Parser::multiplicativeExpression() {
/* postfixExpression | (PLUS | MINUS | NOT | PLUSPLUS | MINUSMINUS) unaryExpression */
std::unique_ptr<ASTExpression> Parser::unaryExpression() {
switch (this->peek().fKind) {
- case Token::PLUS: // fall through
- case Token::MINUS: // fall through
- case Token::LOGICALNOT: // fall through
- case Token::BITWISENOT: // fall through
- case Token::PLUSPLUS: // fall through
+ case Token::PLUS: // fall through
+ case Token::MINUS: // fall through
+ case Token::NOT: // fall through
+ case Token::PLUSPLUS: // fall through
case Token::MINUSMINUS: {
Token t = this->nextToken();
std::unique_ptr<ASTExpression> expr = this->unaryExpression();
@@ -1286,16 +1254,12 @@ std::unique_ptr<ASTExpression> Parser::postfixExpression() {
}
}
-/* LBRACKET expression? RBRACKET | DOT IDENTIFIER | LPAREN parameters RPAREN |
+/* LBRACKET expression RBRACKET | DOT IDENTIFIER | LPAREN parameters RPAREN |
PLUSPLUS | MINUSMINUS */
std::unique_ptr<ASTSuffix> Parser::suffix() {
Token next = this->nextToken();
switch (next.fKind) {
case Token::LBRACKET: {
- if (this->peek().fKind == Token::RBRACKET) {
- this->nextToken();
- return std::unique_ptr<ASTSuffix>(new ASTIndexSuffix(next.fPosition));
- }
std::unique_ptr<ASTExpression> e = this->expression();
if (!e) {
return nullptr;
diff --git a/src/sksl/SkSLParser.h b/src/sksl/SkSLParser.h
index d1ae0d0e9f..75f304bc8c 100644
--- a/src/sksl/SkSLParser.h
+++ b/src/sksl/SkSLParser.h
@@ -35,7 +35,6 @@ struct ASTInterfaceBlock;
struct ASTLayout;
struct ASTModifiers;
struct ASTParameter;
-struct ASTPrecision;
struct ASTReturnStatement;
struct ASTStatement;
struct ASTSuffix;
@@ -101,7 +100,7 @@ private:
// don't need to call any of these outside of the parser. The function declarations in the .cpp
// file have comments describing the grammar rules.
- std::unique_ptr<ASTDeclaration> precision();
+ void precision();
std::unique_ptr<ASTDeclaration> directive();
diff --git a/src/sksl/SkSLSPIRVCodeGenerator.cpp b/src/sksl/SkSLSPIRVCodeGenerator.cpp
index 5403ba3628..d17e3c42a2 100644
--- a/src/sksl/SkSLSPIRVCodeGenerator.cpp
+++ b/src/sksl/SkSLSPIRVCodeGenerator.cpp
@@ -15,7 +15,6 @@
#include "ir/SkSLExtension.h"
#include "ir/SkSLIndexExpression.h"
#include "ir/SkSLVariableReference.h"
-#include "SkSLCompiler.h"
namespace SkSL {
@@ -2163,19 +2162,13 @@ SpvId SPIRVCodeGenerator::writePrefixExpression(const PrefixExpression& p, std::
lv->store(result, out);
return result;
}
- case Token::LOGICALNOT: {
+ case Token::NOT: {
ASSERT(p.fOperand->fType == *fContext.fBool_Type);
SpvId result = this->nextId();
this->writeInstruction(SpvOpLogicalNot, this->getType(p.fOperand->fType), result,
this->writeExpression(*p.fOperand, out), out);
return result;
}
- case Token::BITWISENOT: {
- SpvId result = this->nextId();
- this->writeInstruction(SpvOpNot, this->getType(p.fOperand->fType), result,
- this->writeExpression(*p.fOperand, out), out);
- return result;
- }
default:
ABORT("unsupported prefix expression: %s", p.description().c_str());
}
@@ -2328,7 +2321,7 @@ void SPIRVCodeGenerator::writeLayout(const Layout& layout, SpvId target) {
this->writeInstruction(SpvOpDecorate, target, SpvDecorationDescriptorSet, layout.fSet,
fDecorationBuffer);
}
- if (layout.fBuiltin >= 0 && layout.fBuiltin != SK_FRAGCOLOR_BUILTIN) {
+ if (layout.fBuiltin >= 0) {
this->writeInstruction(SpvOpDecorate, target, SpvDecorationBuiltIn, layout.fBuiltin,
fDecorationBuffer);
}
@@ -2370,19 +2363,10 @@ SpvId SPIRVCodeGenerator::writeInterfaceBlock(const InterfaceBlock& intf) {
return result;
}
-#define BUILTIN_IGNORE 9999
-void SPIRVCodeGenerator::writeGlobalVars(Program::Kind kind, const VarDeclarations& decl,
- std::ostream& out) {
+void SPIRVCodeGenerator::writeGlobalVars(const VarDeclarations& decl, std::ostream& out) {
for (size_t i = 0; i < decl.fVars.size(); i++) {
const VarDeclaration& varDecl = decl.fVars[i];
const Variable* var = varDecl.fVar;
- if (var->fModifiers.fLayout.fBuiltin == BUILTIN_IGNORE) {
- continue;
- }
- if (var->fModifiers.fLayout.fBuiltin == SK_FRAGCOLOR_BUILTIN &&
- kind != Program::kFragment_Kind) {
- continue;
- }
if (!var->fIsReadFrom && !var->fIsWrittenTo &&
!(var->fModifiers.fFlags & (Modifiers::kIn_Flag |
Modifiers::kOut_Flag |
@@ -2578,8 +2562,7 @@ void SPIRVCodeGenerator::writeInstructions(const Program& program, std::ostream&
}
for (size_t i = 0; i < program.fElements.size(); i++) {
if (program.fElements[i]->fKind == ProgramElement::kVar_Kind) {
- this->writeGlobalVars(program.fKind, ((VarDeclarations&) *program.fElements[i]),
- body);
+ this->writeGlobalVars(((VarDeclarations&) *program.fElements[i]), body);
}
}
for (size_t i = 0; i < program.fElements.size(); i++) {
diff --git a/src/sksl/SkSLSPIRVCodeGenerator.h b/src/sksl/SkSLSPIRVCodeGenerator.h
index 2800a861b8..e7b2b30232 100644
--- a/src/sksl/SkSLSPIRVCodeGenerator.h
+++ b/src/sksl/SkSLSPIRVCodeGenerator.h
@@ -115,7 +115,7 @@ private:
SpvId writeFunction(const FunctionDefinition& f, std::ostream& out);
- void writeGlobalVars(Program::Kind kind, const VarDeclarations& v, std::ostream& out);
+ void writeGlobalVars(const VarDeclarations& v, std::ostream& out);
void writeVarDeclarations(const VarDeclarations& decl, std::ostream& out);
diff --git a/src/sksl/SkSLToken.h b/src/sksl/SkSLToken.h
index b8a364c269..29fa81e2e0 100644
--- a/src/sksl/SkSLToken.h
+++ b/src/sksl/SkSLToken.h
@@ -49,11 +49,10 @@ struct Token {
BITWISEOR,
BITWISEXOR,
BITWISEAND,
- BITWISENOT,
LOGICALOR,
LOGICALXOR,
LOGICALAND,
- LOGICALNOT,
+ NOT,
QUESTION,
COLON,
EQ,
@@ -112,11 +111,9 @@ struct Token {
case Token::PERCENT: return "%";
case Token::SHL: return "<<";
case Token::SHR: return ">>";
- case Token::LOGICALNOT: return "!";
case Token::LOGICALAND: return "&&";
case Token::LOGICALOR: return "||";
case Token::LOGICALXOR: return "^^";
- case Token::BITWISENOT: return "~";
case Token::BITWISEAND: return "&";
case Token::BITWISEOR: return "|";
case Token::BITWISEXOR: return "^";
@@ -142,6 +139,7 @@ struct Token {
case Token::BITWISEXOREQ: return "^=";
case Token::PLUSPLUS: return "++";
case Token::MINUSMINUS: return "--";
+ case Token::NOT: return "!";
default:
ABORT("unsupported operator: %d\n", kind);
}
diff --git a/src/sksl/SkSLUtil.cpp b/src/sksl/SkSLUtil.cpp
index 51ad9fe808..327bffe4f1 100644
--- a/src/sksl/SkSLUtil.cpp
+++ b/src/sksl/SkSLUtil.cpp
@@ -9,48 +9,7 @@
namespace SkSL {
-std::string to_string(double value) {
- std::stringstream buffer;
- buffer << std::setprecision(std::numeric_limits<double>::digits10) << value;
- std::string result = buffer.str();
- if (result.find_last_of(".") == std::string::npos &&
- result.find_last_of("e") == std::string::npos) {
- result += ".0";
- }
- return result;
-}
-
-std::string to_string(int32_t value) {
- std::stringstream buffer;
- buffer << value;
- return buffer.str();
-}
-
-std::string to_string(uint32_t value) {
- std::stringstream buffer;
- buffer << value;
- return buffer.str();
-}
-
-std::string to_string(int64_t value) {
- std::stringstream buffer;
- buffer << value;
- return buffer.str();
-}
-
-std::string to_string(uint64_t value) {
- std::stringstream buffer;
- buffer << value;
- return buffer.str();
-}
-
int stoi(std::string s) {
- if (s.size() > 2 && s[0] == '0' && s[1] == 'x') {
- char* p;
- int result = strtoul(s.substr(2).c_str(), &p, 16);
- ASSERT(*p == 0);
- return result;
- }
return atoi(s.c_str());
}
@@ -59,12 +18,6 @@ double stod(std::string s) {
}
long stol(std::string s) {
- if (s.size() > 2 && s[0] == '0' && s[1] == 'x') {
- char* p;
- long result = strtoul(s.substr(2).c_str(), &p, 16);
- ASSERT(*p == 0);
- return result;
- }
return atol(s.c_str());
}
diff --git a/src/sksl/SkSLUtil.h b/src/sksl/SkSLUtil.h
index efffaaec01..33611cde02 100644
--- a/src/sksl/SkSLUtil.h
+++ b/src/sksl/SkSLUtil.h
@@ -19,15 +19,11 @@ namespace SkSL {
// our own definitions of certain std:: functions, because they are not always present on Android
-std::string to_string(double value);
-
-std::string to_string(int32_t value);
-
-std::string to_string(uint32_t value);
-
-std::string to_string(int64_t value);
-
-std::string to_string(uint64_t value);
+template <typename T> std::string to_string(T value) {
+ std::stringstream buffer;
+ buffer << std::setprecision(std::numeric_limits<T>::digits10) << value;
+ return buffer.str();
+}
#if _MSC_VER
#define NORETURN __declspec(noreturn)
diff --git a/src/sksl/ast/SkSLASTDeclaration.h b/src/sksl/ast/SkSLASTDeclaration.h
index 70f0ebc72d..8b55ecf832 100644
--- a/src/sksl/ast/SkSLASTDeclaration.h
+++ b/src/sksl/ast/SkSLASTDeclaration.h
@@ -20,9 +20,7 @@ struct ASTDeclaration : public ASTPositionNode {
kVar_Kind,
kFunction_Kind,
kInterfaceBlock_Kind,
- kExtension_Kind,
- kPrecision_Kind,
- kModifiers_Kind
+ kExtension_Kind
};
ASTDeclaration(Position position, Kind kind)
diff --git a/src/sksl/ast/SkSLASTIndexSuffix.h b/src/sksl/ast/SkSLASTIndexSuffix.h
index 755029b0a2..44d91fa4c4 100644
--- a/src/sksl/ast/SkSLASTIndexSuffix.h
+++ b/src/sksl/ast/SkSLASTIndexSuffix.h
@@ -14,27 +14,17 @@
namespace SkSL {
/**
- * A bracketed expression, as in '[0]', indicating an array access. Empty brackets (as occur in
- * 'float[](5, 6)' are represented with a null fExpression.
+ * A bracketed expression, as in '[0]', indicating an array access.
*/
struct ASTIndexSuffix : public ASTSuffix {
- ASTIndexSuffix(Position position)
- : INHERITED(position, ASTSuffix::kIndex_Kind)
- , fExpression(nullptr) {}
-
ASTIndexSuffix(std::unique_ptr<ASTExpression> expression)
- : INHERITED(expression ? expression->fPosition : Position(), ASTSuffix::kIndex_Kind)
+ : INHERITED(expression->fPosition, ASTSuffix::kIndex_Kind)
, fExpression(std::move(expression)) {}
std::string description() const override {
- if (fExpression) {
- return "[" + fExpression->description() + "]";
- } else {
- return "[]";
- }
+ return "[" + fExpression->description() + "]";
}
- // may be null
std::unique_ptr<ASTExpression> fExpression;
typedef ASTSuffix INHERITED;
diff --git a/src/sksl/ast/SkSLASTLayout.h b/src/sksl/ast/SkSLASTLayout.h
index 515eb2bdbb..08d67531c3 100644
--- a/src/sksl/ast/SkSLASTLayout.h
+++ b/src/sksl/ast/SkSLASTLayout.h
@@ -20,16 +20,13 @@ namespace SkSL {
*/
struct ASTLayout : public ASTNode {
// For all parameters, a -1 means no value
- ASTLayout(int location, int binding, int index, int set, int builtin, bool originUpperLeft,
- bool overrideCoverage, bool blendSupportAllEquations)
+ ASTLayout(int location, int binding, int index, int set, int builtin, bool originUpperLeft)
: fLocation(location)
, fBinding(binding)
, fIndex(index)
, fSet(set)
, fBuiltin(builtin)
- , fOriginUpperLeft(originUpperLeft)
- , fOverrideCoverage(overrideCoverage)
- , fBlendSupportAllEquations(blendSupportAllEquations) {}
+ , fOriginUpperLeft(originUpperLeft) {}
std::string description() const {
std::string result;
@@ -58,14 +55,6 @@ struct ASTLayout : public ASTNode {
result += separator + "origin_upper_left";
separator = ", ";
}
- if (fOverrideCoverage) {
- result += separator + "override_coverage";
- separator = ", ";
- }
- if (fBlendSupportAllEquations) {
- result += separator + "blend_support_all_equations";
- separator = ", ";
- }
if (result.length() > 0) {
result = "layout (" + result + ")";
}
@@ -78,8 +67,6 @@ struct ASTLayout : public ASTNode {
const int fSet;
const int fBuiltin;
const bool fOriginUpperLeft;
- const bool fOverrideCoverage;
- const bool fBlendSupportAllEquations;
};
} // namespace
diff --git a/src/sksl/ast/SkSLASTModifiersDeclaration.h b/src/sksl/ast/SkSLASTModifiersDeclaration.h
deleted file mode 100644
index f5cc620899..0000000000
--- a/src/sksl/ast/SkSLASTModifiersDeclaration.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2016 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef SKSL_ASTMODIFIERDECLARATION
-#define SKSL_ASTMODIFIERDECLARATION
-
-#include "SkSLASTDeclaration.h"
-#include "SkSLASTModifiers.h"
-
-namespace SkSL {
-
-/**
- * A declaration that consists only of modifiers, e.g.:
- *
- * layout(blend_support_all_equations) out;
- */
-struct ASTModifiersDeclaration : public ASTDeclaration {
- ASTModifiersDeclaration(ASTModifiers modifiers)
- : INHERITED(Position(), kModifiers_Kind)
- , fModifiers(modifiers) {}
-
- std::string description() const {
- return fModifiers.description() + ";";
- }
-
- ASTModifiers fModifiers;
-
- typedef ASTDeclaration INHERITED;
-};
-
-} // namespace
-
-#endif
diff --git a/src/sksl/ast/SkSLASTPrecision.h b/src/sksl/ast/SkSLASTPrecision.h
deleted file mode 100644
index a7df57948e..0000000000
--- a/src/sksl/ast/SkSLASTPrecision.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2016 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef SKSL_ASTPRECISION
-#define SKSL_ASTPRECISION
-
-#include "SkSLASTDeclaration.h"
-#include "../ir/SkSLModifiers.h"
-
-namespace SkSL {
-
-/**
- * Represents a precision declaration (e.g. 'precision mediump float;').
- */
-struct ASTPrecision : public ASTDeclaration {
- // FIXME handle the type
- ASTPrecision(Position position, Modifiers::Flag precision)
- : INHERITED(position, kPrecision_Kind)
- , fPrecision(precision) {}
-
- std::string description() const {
- switch (fPrecision) {
- case Modifiers::kLowp_Flag: return "precision lowp float;";
- case Modifiers::kMediump_Flag: return "precision mediump float;";
- case Modifiers::kHighp_Flag: return "precision highp float;";
- default:
- ASSERT(false);
- return "<error>";
- }
- ASSERT(false);
- return "<error>";
- }
-
- const Modifiers::Flag fPrecision;
-
- typedef ASTDeclaration INHERITED;
-};
-
-} // namespace
-
-#endif
diff --git a/src/sksl/ir/SkSLIndexExpression.h b/src/sksl/ir/SkSLIndexExpression.h
index ea9af3d897..f5b0d09c2c 100644
--- a/src/sksl/ir/SkSLIndexExpression.h
+++ b/src/sksl/ir/SkSLIndexExpression.h
@@ -19,7 +19,7 @@ namespace SkSL {
static const Type& index_type(const Context& context, const Type& type) {
if (type.kind() == Type::kMatrix_Kind) {
if (type.componentType() == *context.fFloat_Type) {
- switch (type.rows()) {
+ switch (type.columns()) {
case 2: return *context.fVec2_Type;
case 3: return *context.fVec3_Type;
case 4: return *context.fVec4_Type;
@@ -27,7 +27,7 @@ static const Type& index_type(const Context& context, const Type& type) {
}
} else {
ASSERT(type.componentType() == *context.fDouble_Type);
- switch (type.rows()) {
+ switch (type.columns()) {
case 2: return *context.fDVec2_Type;
case 3: return *context.fDVec3_Type;
case 4: return *context.fDVec4_Type;
@@ -47,7 +47,7 @@ struct IndexExpression : public Expression {
: INHERITED(base->fPosition, kIndex_Kind, index_type(context, base->fType))
, fBase(std::move(base))
, fIndex(std::move(index)) {
- ASSERT(fIndex->fType == *context.fInt_Type || fIndex->fType == *context.fUInt_Type);
+ ASSERT(fIndex->fType == *context.fInt_Type);
}
std::string description() const override {
diff --git a/src/sksl/ir/SkSLIntLiteral.h b/src/sksl/ir/SkSLIntLiteral.h
index 8921c283b5..2bc565712e 100644
--- a/src/sksl/ir/SkSLIntLiteral.h
+++ b/src/sksl/ir/SkSLIntLiteral.h
@@ -18,8 +18,8 @@ namespace SkSL {
struct IntLiteral : public Expression {
// FIXME: we will need to revisit this if/when we add full support for both signed and unsigned
// 64-bit integers, but for right now an int64_t will hold every value we care about
- IntLiteral(const Context& context, Position position, int64_t value, const Type* type = nullptr)
- : INHERITED(position, kIntLiteral_Kind, type ? *type : *context.fInt_Type)
+ IntLiteral(const Context& context, Position position, int64_t value)
+ : INHERITED(position, kIntLiteral_Kind, *context.fInt_Type)
, fValue(value) {}
virtual std::string description() const override {
diff --git a/src/sksl/ir/SkSLLayout.h b/src/sksl/ir/SkSLLayout.h
index 24087d0612..d8dc98096f 100644
--- a/src/sksl/ir/SkSLLayout.h
+++ b/src/sksl/ir/SkSLLayout.h
@@ -22,20 +22,15 @@ struct Layout {
, fIndex(layout.fIndex)
, fSet(layout.fSet)
, fBuiltin(layout.fBuiltin)
- , fOriginUpperLeft(layout.fOriginUpperLeft)
- , fOverrideCoverage(layout.fOverrideCoverage)
- , fBlendSupportAllEquations(layout.fBlendSupportAllEquations) {}
+ , fOriginUpperLeft(layout.fOriginUpperLeft) {}
- Layout(int location, int binding, int index, int set, int builtin, bool originUpperLeft,
- bool overrideCoverage, bool blendSupportAllEquations)
+ Layout(int location, int binding, int index, int set, int builtin, bool originUpperLeft)
: fLocation(location)
, fBinding(binding)
, fIndex(index)
, fSet(set)
, fBuiltin(builtin)
- , fOriginUpperLeft(originUpperLeft)
- , fOverrideCoverage(overrideCoverage)
- , fBlendSupportAllEquations(blendSupportAllEquations) {}
+ , fOriginUpperLeft(originUpperLeft) {}
std::string description() const {
std::string result;
@@ -64,14 +59,6 @@ struct Layout {
result += separator + "origin_upper_left";
separator = ", ";
}
- if (fOverrideCoverage) {
- result += separator + "override_coverage";
- separator = ", ";
- }
- if (fBlendSupportAllEquations) {
- result += separator + "blend_support_all_equations";
- separator = ", ";
- }
if (result.length() > 0) {
result = "layout (" + result + ")";
}
@@ -79,14 +66,11 @@ struct Layout {
}
bool operator==(const Layout& other) const {
- return fLocation == other.fLocation &&
- fBinding == other.fBinding &&
- fIndex == other.fIndex &&
- fSet == other.fSet &&
- fBuiltin == other.fBuiltin &&
- fOriginUpperLeft == other.fOriginUpperLeft &&
- fOverrideCoverage == other.fOverrideCoverage &&
- fBlendSupportAllEquations == other.fBlendSupportAllEquations;
+ return fLocation == other.fLocation &&
+ fBinding == other.fBinding &&
+ fIndex == other.fIndex &&
+ fSet == other.fSet &&
+ fBuiltin == other.fBuiltin;
}
bool operator!=(const Layout& other) const {
@@ -101,8 +85,6 @@ struct Layout {
int fSet;
int fBuiltin;
bool fOriginUpperLeft;
- bool fOverrideCoverage;
- bool fBlendSupportAllEquations;
};
} // namespace
diff --git a/src/sksl/ir/SkSLModifiersDeclaration.h b/src/sksl/ir/SkSLModifiersDeclaration.h
deleted file mode 100644
index 0066fab877..0000000000
--- a/src/sksl/ir/SkSLModifiersDeclaration.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2016 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#ifndef SKSL_MODIFIERDECLARATION
-#define SKSL_MODIFIERDECLARATION
-
-#include "SkSLProgramElement.h"
-#include "SkSLModifiers.h"
-
-namespace SkSL {
-
-/**
- * A declaration that consists only of modifiers, e.g.:
- *
- * layout(blend_support_all_equations) out;
- */
-struct ModifiersDeclaration : public ProgramElement {
- ModifiersDeclaration(Modifiers modifiers)
- : INHERITED(Position(), kModifiers_Kind)
- , fModifiers(modifiers) {}
-
- std::string description() const {
- return fModifiers.description() + ";";
- }
-
- Modifiers fModifiers;
-
- typedef ProgramElement INHERITED;
-};
-
-} // namespace
-
-#endif
diff --git a/src/sksl/ir/SkSLProgram.h b/src/sksl/ir/SkSLProgram.h
index 8393341269..205db6e932 100644
--- a/src/sksl/ir/SkSLProgram.h
+++ b/src/sksl/ir/SkSLProgram.h
@@ -11,7 +11,6 @@
#include <vector>
#include <memory>
-#include "SkSLModifiers.h"
#include "SkSLProgramElement.h"
#include "SkSLSymbolTable.h"
@@ -26,18 +25,14 @@ struct Program {
kVertex_Kind
};
- Program(Kind kind,
- Modifiers::Flag defaultPrecision,
- std::vector<std::unique_ptr<ProgramElement>> elements,
+ Program(Kind kind, std::vector<std::unique_ptr<ProgramElement>> elements,
std::shared_ptr<SymbolTable> symbols)
: fKind(kind)
- , fDefaultPrecision(defaultPrecision)
, fElements(std::move(elements))
, fSymbols(symbols) {}
Kind fKind;
- // FIXME handle different types; currently it assumes this is for floats
- Modifiers::Flag fDefaultPrecision;
+
std::vector<std::unique_ptr<ProgramElement>> fElements;
std::shared_ptr<SymbolTable> fSymbols;
};
diff --git a/src/sksl/ir/SkSLProgramElement.h b/src/sksl/ir/SkSLProgramElement.h
index 2f1ce77199..44fc340667 100644
--- a/src/sksl/ir/SkSLProgramElement.h
+++ b/src/sksl/ir/SkSLProgramElement.h
@@ -20,8 +20,7 @@ struct ProgramElement : public IRNode {
kVar_Kind,
kFunction_Kind,
kInterfaceBlock_Kind,
- kExtension_Kind,
- kModifiers_Kind
+ kExtension_Kind
};
ProgramElement(Position position, Kind kind)
diff --git a/src/sksl/lex.sksl.c b/src/sksl/lex.sksl.c
index 710b67bba5..4993fac3a5 100644
--- a/src/sksl/lex.sksl.c
+++ b/src/sksl/lex.sksl.c
@@ -4,7 +4,7 @@
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
-
+
#line 3 "lex.sksl.c"
#define YY_INT_ALIGNED short int
@@ -14,7 +14,7 @@
#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 5
-#define YY_FLEX_SUBMINOR_VERSION 35
+#define YY_FLEX_SUBMINOR_VERSION 37
#if YY_FLEX_SUBMINOR_VERSION > 0
#define FLEX_BETA
#endif
@@ -52,7 +52,6 @@ typedef int16_t flex_int16_t;
typedef uint16_t flex_uint16_t;
typedef int32_t flex_int32_t;
typedef uint32_t flex_uint32_t;
-typedef uint64_t flex_uint64_t;
#else
typedef signed char flex_int8_t;
typedef short int flex_int16_t;
@@ -60,7 +59,6 @@ typedef int flex_int32_t;
typedef unsigned char flex_uint8_t;
typedef unsigned short int flex_uint16_t;
typedef unsigned int flex_uint32_t;
-#endif /* ! C99 */
/* Limits of integral types. */
#ifndef INT8_MIN
@@ -91,6 +89,8 @@ typedef unsigned int flex_uint32_t;
#define UINT32_MAX (4294967295U)
#endif
+#endif /* ! C99 */
+
#endif /* ! FLEXINT_H */
#ifdef __cplusplus
@@ -194,7 +194,7 @@ typedef size_t yy_size_t;
*/
#define YY_LESS_LINENO(n) \
do { \
- yy_size_t yyl;\
+ int yyl;\
for ( yyl = n; yyl < yyleng; ++yyl )\
if ( yytext[yyl] == '\n' )\
--yylineno;\
@@ -360,13 +360,13 @@ static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner );
*/
#define YY_DO_BEFORE_ACTION \
yyg->yytext_ptr = yy_bp; \
- yyleng = (yy_size_t) (yy_cp - yy_bp); \
+ yyleng = (size_t) (yy_cp - yy_bp); \
yyg->yy_hold_char = *yy_cp; \
*yy_cp = '\0'; \
yyg->yy_c_buf_p = yy_cp;
-#define YY_NUM_RULES 84
-#define YY_END_OF_BUFFER 85
+#define YY_NUM_RULES 82
+#define YY_END_OF_BUFFER 83
/* This struct is not used in this scanner,
but its presence is necessary. */
struct yy_trans_info
@@ -374,31 +374,30 @@ struct yy_trans_info
flex_int32_t yy_verify;
flex_int32_t yy_nxt;
};
-static yyconst flex_int16_t yy_accept[205] =
+static yyconst flex_int16_t yy_accept[201] =
{ 0,
- 0, 0, 85, 83, 82, 82, 56, 83, 30, 46,
- 51, 32, 33, 44, 42, 39, 43, 38, 45, 4,
- 4, 58, 79, 63, 59, 62, 57, 36, 37, 50,
- 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 34, 49, 35,
- 52, 82, 61, 31, 30, 70, 55, 75, 68, 40,
- 66, 41, 67, 1, 0, 80, 69, 2, 4, 0,
- 0, 47, 65, 60, 64, 48, 74, 54, 30, 30,
- 30, 12, 30, 30, 30, 30, 30, 8, 17, 30,
- 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
-
- 73, 53, 31, 78, 0, 0, 0, 80, 1, 0,
- 0, 3, 5, 71, 72, 77, 30, 30, 30, 30,
- 30, 30, 10, 30, 30, 30, 30, 30, 30, 18,
- 30, 30, 30, 30, 30, 30, 76, 0, 1, 81,
- 0, 0, 2, 30, 30, 30, 30, 9, 30, 25,
- 30, 30, 30, 22, 30, 30, 30, 30, 30, 6,
- 30, 30, 0, 1, 13, 21, 30, 30, 7, 24,
- 19, 30, 30, 30, 30, 30, 30, 30, 11, 30,
- 30, 28, 30, 30, 30, 16, 27, 30, 30, 15,
- 23, 30, 30, 20, 14, 30, 30, 30, 29, 30,
-
- 30, 30, 26, 0
+ 0, 0, 83, 81, 80, 80, 54, 81, 29, 45,
+ 50, 31, 32, 43, 41, 38, 42, 37, 44, 4,
+ 56, 77, 61, 57, 60, 55, 35, 36, 49, 29,
+ 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 33, 48, 34, 80,
+ 59, 30, 29, 68, 53, 73, 66, 39, 64, 40,
+ 65, 1, 0, 78, 67, 2, 4, 0, 46, 63,
+ 58, 62, 47, 72, 52, 29, 29, 29, 11, 29,
+ 29, 29, 29, 29, 7, 16, 29, 29, 29, 29,
+ 29, 29, 29, 29, 29, 29, 29, 71, 51, 30,
+
+ 76, 0, 0, 0, 78, 1, 0, 0, 3, 69,
+ 70, 75, 29, 29, 29, 29, 29, 29, 9, 29,
+ 29, 29, 29, 29, 29, 17, 29, 29, 29, 29,
+ 29, 29, 74, 0, 1, 79, 0, 0, 2, 29,
+ 29, 29, 29, 8, 29, 24, 29, 29, 29, 21,
+ 29, 29, 29, 29, 29, 5, 29, 29, 0, 1,
+ 12, 20, 29, 29, 6, 23, 18, 29, 29, 29,
+ 29, 29, 29, 29, 10, 29, 29, 27, 29, 29,
+ 29, 15, 26, 29, 29, 14, 22, 29, 29, 19,
+ 13, 29, 29, 29, 28, 29, 29, 29, 25, 0
+
} ;
static yyconst flex_int32_t yy_ec[256] =
@@ -407,16 +406,16 @@ static yyconst flex_int32_t yy_ec[256] =
1, 1, 2, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 2, 4, 1, 5, 6, 7, 8, 1, 9,
- 10, 11, 12, 13, 14, 15, 16, 17, 18, 18,
- 18, 18, 18, 18, 18, 18, 18, 19, 20, 21,
- 22, 23, 24, 1, 25, 25, 25, 25, 26, 25,
+ 10, 11, 12, 13, 14, 15, 16, 17, 17, 17,
+ 17, 17, 17, 17, 17, 17, 17, 18, 19, 20,
+ 21, 22, 23, 1, 6, 6, 6, 6, 24, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 27, 1, 28, 29, 6, 1, 30, 31, 32, 33,
+ 25, 1, 26, 27, 6, 1, 28, 29, 30, 31,
- 34, 35, 36, 37, 38, 6, 39, 40, 41, 42,
- 43, 44, 6, 45, 46, 47, 48, 49, 50, 51,
- 52, 6, 53, 54, 55, 56, 1, 1, 1, 1,
+ 32, 33, 34, 35, 36, 6, 37, 38, 39, 40,
+ 41, 42, 6, 43, 44, 45, 46, 47, 48, 6,
+ 49, 6, 50, 51, 52, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -433,158 +432,152 @@ static yyconst flex_int32_t yy_ec[256] =
1, 1, 1, 1, 1
} ;
-static yyconst flex_int32_t yy_meta[57] =
+static yyconst flex_int32_t yy_meta[53] =
{ 0,
1, 1, 2, 1, 1, 3, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 4, 4, 1, 1,
- 1, 1, 1, 1, 5, 5, 1, 1, 1, 5,
- 5, 5, 5, 5, 5, 3, 3, 3, 3, 3,
+ 1, 1, 1, 1, 1, 1, 4, 1, 1, 1,
+ 1, 1, 1, 3, 1, 1, 1, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 1, 1, 1, 1
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 1,
+ 1, 1
} ;
-static yyconst flex_int16_t yy_base[211] =
+static yyconst flex_int16_t yy_base[206] =
{ 0,
- 0, 0, 273, 274, 55, 57, 250, 0, 0, 249,
- 53, 274, 274, 248, 50, 274, 49, 47, 57, 52,
- 59, 274, 274, 59, 247, 60, 274, 274, 274, 62,
- 223, 224, 49, 226, 58, 227, 54, 64, 230, 220,
- 214, 216, 226, 212, 213, 215, 219, 274, 68, 274,
- 274, 97, 274, 0, 0, 274, 233, 274, 274, 274,
- 274, 274, 274, 87, 243, 0, 274, 91, 97, 112,
- 0, 231, 274, 274, 274, 230, 274, 229, 216, 207,
- 202, 0, 201, 206, 215, 199, 207, 0, 199, 189,
- 190, 206, 194, 190, 202, 188, 189, 185, 194, 193,
-
- 274, 208, 0, 274, 120, 218, 212, 0, 93, 127,
- 118, 125, 0, 274, 274, 274, 197, 100, 194, 191,
- 178, 176, 0, 185, 173, 177, 175, 180, 183, 0,
- 184, 167, 166, 179, 177, 171, 274, 131, 133, 274,
- 140, 138, 142, 171, 162, 170, 177, 0, 172, 0,
- 161, 157, 155, 0, 154, 156, 162, 154, 166, 0,
- 154, 162, 144, 146, 0, 0, 153, 149, 0, 0,
- 0, 146, 151, 145, 144, 147, 141, 142, 0, 138,
- 147, 0, 122, 109, 102, 0, 0, 92, 94, 0,
- 0, 86, 75, 0, 0, 84, 64, 55, 0, 59,
-
- 46, 32, 0, 274, 162, 165, 168, 173, 178, 180
+ 0, 0, 238, 239, 51, 53, 216, 0, 0, 215,
+ 49, 239, 239, 214, 46, 239, 45, 217, 52, 45,
+ 239, 239, 44, 212, 50, 239, 239, 239, 53, 189,
+ 190, 40, 192, 47, 193, 46, 50, 196, 186, 180,
+ 182, 192, 178, 179, 181, 185, 239, 61, 239, 81,
+ 239, 0, 0, 239, 198, 239, 239, 239, 239, 239,
+ 239, 70, 207, 0, 239, 72, 75, 81, 196, 239,
+ 239, 239, 195, 239, 194, 182, 173, 168, 0, 167,
+ 172, 181, 165, 173, 0, 165, 156, 156, 172, 160,
+ 156, 168, 154, 155, 151, 160, 159, 239, 173, 0,
+
+ 239, 89, 182, 176, 0, 91, 97, 174, 173, 239,
+ 239, 239, 161, 72, 158, 155, 142, 140, 0, 149,
+ 137, 141, 139, 144, 147, 0, 148, 131, 130, 143,
+ 141, 135, 239, 155, 154, 239, 107, 153, 152, 131,
+ 122, 130, 137, 0, 132, 0, 121, 117, 115, 0,
+ 114, 116, 122, 114, 126, 0, 114, 122, 136, 135,
+ 0, 0, 111, 107, 0, 0, 0, 104, 109, 103,
+ 102, 105, 99, 100, 0, 96, 110, 0, 98, 97,
+ 102, 0, 0, 98, 102, 0, 0, 90, 79, 0,
+ 0, 88, 73, 65, 0, 69, 53, 65, 0, 239,
+
+ 58, 122, 124, 128, 132
} ;
-static yyconst flex_int16_t yy_def[211] =
+static yyconst flex_int16_t yy_def[206] =
{ 0,
- 204, 1, 204, 204, 204, 204, 204, 205, 206, 204,
- 204, 204, 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204, 204, 204,
- 206, 206, 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 204, 204, 204,
- 204, 204, 204, 207, 206, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 208, 209, 204, 204, 204, 204,
- 210, 204, 204, 204, 204, 204, 204, 204, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206, 206, 206,
-
- 204, 204, 207, 204, 204, 208, 208, 209, 204, 204,
- 204, 204, 210, 204, 204, 204, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 204, 204, 204, 204,
- 204, 204, 204, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 204, 204, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206, 206, 206,
- 206, 206, 206, 206, 206, 206, 206, 206, 206, 206,
-
- 206, 206, 206, 0, 204, 204, 204, 204, 204, 204
+ 200, 1, 200, 200, 200, 200, 200, 201, 202, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200, 200, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 200, 200, 200, 200,
+ 200, 203, 202, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 204, 205, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 200, 200, 203,
+
+ 200, 200, 204, 204, 205, 200, 200, 200, 200, 200,
+ 200, 200, 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 200, 200, 200, 200, 200, 200, 200, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202, 200, 200,
+ 202, 202, 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202, 202, 202,
+ 202, 202, 202, 202, 202, 202, 202, 202, 202, 0,
+
+ 200, 200, 200, 200, 200
} ;
-static yyconst flex_int16_t yy_nxt[331] =
+static yyconst flex_int16_t yy_nxt[292] =
{ 0,
4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
- 24, 25, 26, 27, 9, 9, 28, 29, 30, 9,
- 31, 32, 33, 34, 35, 9, 36, 37, 9, 38,
- 39, 40, 41, 42, 43, 44, 45, 46, 9, 47,
- 9, 9, 48, 49, 50, 51, 52, 52, 52, 52,
- 57, 60, 62, 64, 64, 203, 68, 65, 69, 69,
- 63, 61, 66, 68, 58, 69, 69, 70, 67, 72,
- 73, 75, 76, 77, 70, 70, 81, 84, 88, 101,
- 78, 82, 70, 90, 202, 89, 201, 85, 52, 52,
-
- 86, 200, 71, 64, 64, 199, 91, 109, 109, 109,
- 109, 68, 105, 69, 69, 198, 110, 197, 141, 196,
- 105, 102, 70, 111, 110, 111, 141, 195, 112, 112,
- 70, 138, 194, 138, 112, 112, 139, 139, 142, 193,
- 142, 112, 112, 143, 143, 145, 146, 139, 139, 139,
- 139, 163, 192, 163, 143, 143, 164, 164, 143, 143,
- 164, 164, 164, 164, 54, 191, 54, 55, 55, 55,
- 103, 103, 103, 106, 106, 106, 106, 106, 108, 190,
- 108, 108, 108, 113, 113, 189, 188, 187, 186, 185,
- 184, 183, 182, 181, 180, 179, 178, 177, 176, 175,
-
- 174, 173, 172, 171, 170, 169, 168, 167, 166, 165,
- 162, 161, 160, 159, 158, 157, 156, 155, 154, 153,
- 152, 151, 150, 149, 148, 147, 144, 140, 107, 137,
- 136, 135, 134, 133, 132, 131, 130, 129, 128, 127,
+ 24, 25, 26, 9, 27, 28, 29, 9, 30, 31,
+ 32, 33, 34, 9, 35, 36, 9, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 9, 46, 9, 47,
+ 48, 49, 50, 50, 50, 50, 55, 58, 60, 66,
+ 52, 67, 63, 69, 70, 61, 59, 64, 68, 56,
+ 72, 73, 65, 74, 81, 78, 68, 87, 85, 75,
+ 79, 98, 50, 50, 82, 86, 62, 83, 106, 66,
+ 88, 67, 108, 102, 108, 107, 199, 109, 68, 198,
+
+ 134, 102, 134, 107, 197, 135, 68, 106, 138, 196,
+ 138, 99, 195, 139, 137, 141, 142, 194, 159, 193,
+ 159, 192, 137, 160, 53, 53, 100, 100, 103, 103,
+ 103, 103, 105, 191, 105, 105, 190, 189, 188, 187,
+ 186, 185, 184, 183, 182, 181, 180, 179, 178, 177,
+ 176, 160, 160, 175, 174, 173, 172, 171, 170, 169,
+ 168, 167, 166, 165, 164, 163, 162, 161, 139, 139,
+ 135, 135, 158, 157, 156, 155, 154, 153, 152, 151,
+ 150, 149, 148, 147, 146, 145, 144, 143, 140, 109,
+ 109, 136, 104, 133, 132, 131, 130, 129, 128, 127,
+
126, 125, 124, 123, 122, 121, 120, 119, 118, 117,
- 116, 115, 114, 107, 104, 100, 99, 98, 97, 96,
- 95, 94, 93, 92, 87, 83, 80, 79, 74, 59,
- 56, 53, 204, 3, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204, 204, 204,
-
- 204, 204, 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204, 204, 204
+ 116, 115, 114, 113, 112, 111, 110, 104, 101, 97,
+ 96, 95, 94, 93, 92, 91, 90, 89, 84, 80,
+ 77, 76, 71, 62, 57, 54, 51, 200, 3, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
+ 200
+
} ;
-static yyconst flex_int16_t yy_chk[331] =
+static yyconst flex_int16_t yy_chk[292] =
{ 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 5, 5, 6, 6,
- 11, 15, 17, 18, 18, 202, 20, 19, 20, 20,
- 17, 15, 19, 21, 11, 21, 21, 20, 19, 24,
- 24, 26, 26, 30, 21, 20, 33, 35, 37, 49,
- 30, 33, 21, 38, 201, 37, 200, 35, 52, 52,
-
- 35, 198, 20, 64, 64, 197, 38, 68, 68, 109,
- 109, 69, 64, 69, 69, 196, 68, 193, 109, 192,
- 64, 49, 69, 70, 68, 70, 109, 189, 70, 70,
- 69, 105, 188, 105, 111, 111, 105, 105, 110, 185,
- 110, 112, 112, 110, 110, 118, 118, 138, 138, 139,
- 139, 141, 184, 141, 142, 142, 141, 141, 143, 143,
- 163, 163, 164, 164, 205, 183, 205, 206, 206, 206,
- 207, 207, 207, 208, 208, 208, 208, 208, 209, 181,
- 209, 209, 209, 210, 210, 180, 178, 177, 176, 175,
- 174, 173, 172, 168, 167, 162, 161, 159, 158, 157,
-
- 156, 155, 153, 152, 151, 149, 147, 146, 145, 144,
- 136, 135, 134, 133, 132, 131, 129, 128, 127, 126,
- 125, 124, 122, 121, 120, 119, 117, 107, 106, 102,
- 100, 99, 98, 97, 96, 95, 94, 93, 92, 91,
- 90, 89, 87, 86, 85, 84, 83, 81, 80, 79,
- 78, 76, 72, 65, 57, 47, 46, 45, 44, 43,
- 42, 41, 40, 39, 36, 34, 32, 31, 25, 14,
- 10, 7, 3, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204, 204, 204,
-
- 204, 204, 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204, 204, 204,
- 204, 204, 204, 204, 204, 204, 204, 204, 204, 204
+ 1, 1, 5, 5, 6, 6, 11, 15, 17, 20,
+ 201, 20, 19, 23, 23, 17, 15, 19, 20, 11,
+ 25, 25, 19, 29, 34, 32, 20, 37, 36, 29,
+ 32, 48, 50, 50, 34, 36, 62, 34, 66, 67,
+ 37, 67, 68, 62, 68, 66, 198, 68, 67, 197,
+
+ 102, 62, 102, 66, 196, 102, 67, 106, 107, 194,
+ 107, 48, 193, 107, 106, 114, 114, 192, 137, 189,
+ 137, 188, 106, 137, 202, 202, 203, 203, 204, 204,
+ 204, 204, 205, 185, 205, 205, 184, 181, 180, 179,
+ 177, 176, 174, 173, 172, 171, 170, 169, 168, 164,
+ 163, 160, 159, 158, 157, 155, 154, 153, 152, 151,
+ 149, 148, 147, 145, 143, 142, 141, 140, 139, 138,
+ 135, 134, 132, 131, 130, 129, 128, 127, 125, 124,
+ 123, 122, 121, 120, 118, 117, 116, 115, 113, 109,
+ 108, 104, 103, 99, 97, 96, 95, 94, 93, 92,
+
+ 91, 90, 89, 88, 87, 86, 84, 83, 82, 81,
+ 80, 78, 77, 76, 75, 73, 69, 63, 55, 46,
+ 45, 44, 43, 42, 41, 40, 39, 38, 35, 33,
+ 31, 30, 24, 18, 14, 10, 7, 3, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
+ 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
+ 200
+
} ;
/* Table of booleans, true if rule could match eol. */
-static yyconst flex_int32_t yy_rule_can_match_eol[85] =
+static yyconst flex_int32_t yy_rule_can_match_eol[83] =
{ 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 1, 0, 0, };
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+ 1, 0, 0, };
/* The intent behind this definition is that it'll catch
* any uses of REJECT which flex missed.
@@ -607,7 +600,7 @@ static yyconst flex_int32_t yy_rule_can_match_eol[85] =
*/
#define YY_NO_UNISTD_H 1
-#line 605 "lex.sksl.c"
+#line 598 "lex.sksl.c"
#define INITIAL 0
@@ -692,6 +685,10 @@ int skslget_lineno (yyscan_t yyscanner );
void skslset_lineno (int line_number ,yyscan_t yyscanner );
+int skslget_column (yyscan_t yyscanner );
+
+void skslset_column (int column_no ,yyscan_t yyscanner );
+
/* Macros after this point can all be overridden by user definitions in
* section 1.
*/
@@ -734,7 +731,7 @@ static int input (yyscan_t yyscanner );
/* This used to be an fputs(), but since the string might contain NUL's,
* we now use fwrite().
*/
-#define ECHO fwrite( yytext, yyleng, 1, yyout )
+#define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0)
#endif
/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
@@ -745,7 +742,7 @@ static int input (yyscan_t yyscanner );
if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
{ \
int c = '*'; \
- yy_size_t n; \
+ size_t n; \
for ( n = 0; n < max_size && \
(c = getc( yyin )) != EOF && c != '\n'; ++n ) \
buf[n] = (char) c; \
@@ -831,7 +828,7 @@ YY_DECL
#line 23 "sksl.flex"
-#line 829 "lex.sksl.c"
+#line 826 "lex.sksl.c"
if ( !yyg->yy_init )
{
@@ -884,13 +881,13 @@ yy_match:
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 205 )
+ if ( yy_current_state >= 201 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
++yy_cp;
}
- while ( yy_current_state != 204 );
+ while ( yy_current_state != 200 );
yy_cp = yyg->yy_last_accepting_cpos;
yy_current_state = yyg->yy_last_accepting_state;
@@ -901,7 +898,7 @@ yy_find_action:
if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] )
{
- yy_size_t yyl;
+ int yyl;
for ( yyl = 0; yyl < yyleng; ++yyl )
if ( yytext[yyl] == '\n' )
@@ -945,406 +942,396 @@ YY_RULE_SETUP
case 5:
YY_RULE_SETUP
#line 33 "sksl.flex"
-{ return SkSL::Token::INT_LITERAL; }
+{ return SkSL::Token::TRUE_LITERAL; }
YY_BREAK
case 6:
YY_RULE_SETUP
#line 35 "sksl.flex"
-{ return SkSL::Token::TRUE_LITERAL; }
+{ return SkSL::Token::FALSE_LITERAL; }
YY_BREAK
case 7:
YY_RULE_SETUP
#line 37 "sksl.flex"
-{ return SkSL::Token::FALSE_LITERAL; }
+{ return SkSL::Token::IF; }
YY_BREAK
case 8:
YY_RULE_SETUP
#line 39 "sksl.flex"
-{ return SkSL::Token::IF; }
+{ return SkSL::Token::ELSE; }
YY_BREAK
case 9:
YY_RULE_SETUP
#line 41 "sksl.flex"
-{ return SkSL::Token::ELSE; }
+{ return SkSL::Token::FOR; }
YY_BREAK
case 10:
YY_RULE_SETUP
#line 43 "sksl.flex"
-{ return SkSL::Token::FOR; }
+{ return SkSL::Token::WHILE; }
YY_BREAK
case 11:
YY_RULE_SETUP
#line 45 "sksl.flex"
-{ return SkSL::Token::WHILE; }
+{ return SkSL::Token::DO; }
YY_BREAK
case 12:
YY_RULE_SETUP
#line 47 "sksl.flex"
-{ return SkSL::Token::DO; }
+{ return SkSL::Token::BREAK; }
YY_BREAK
case 13:
YY_RULE_SETUP
#line 49 "sksl.flex"
-{ return SkSL::Token::BREAK; }
+{ return SkSL::Token::CONTINUE; }
YY_BREAK
case 14:
YY_RULE_SETUP
#line 51 "sksl.flex"
-{ return SkSL::Token::CONTINUE; }
+{ return SkSL::Token::DISCARD; }
YY_BREAK
case 15:
YY_RULE_SETUP
#line 53 "sksl.flex"
-{ return SkSL::Token::DISCARD; }
+{ return SkSL::Token::RETURN; }
YY_BREAK
case 16:
YY_RULE_SETUP
#line 55 "sksl.flex"
-{ return SkSL::Token::RETURN; }
+{ return SkSL::Token::IN; }
YY_BREAK
case 17:
YY_RULE_SETUP
#line 57 "sksl.flex"
-{ return SkSL::Token::IN; }
+{ return SkSL::Token::OUT; }
YY_BREAK
case 18:
YY_RULE_SETUP
#line 59 "sksl.flex"
-{ return SkSL::Token::OUT; }
+{ return SkSL::Token::INOUT; }
YY_BREAK
case 19:
YY_RULE_SETUP
#line 61 "sksl.flex"
-{ return SkSL::Token::INOUT; }
+{ return SkSL::Token::UNIFORM; }
YY_BREAK
case 20:
YY_RULE_SETUP
#line 63 "sksl.flex"
-{ return SkSL::Token::UNIFORM; }
+{ return SkSL::Token::CONST; }
YY_BREAK
case 21:
YY_RULE_SETUP
#line 65 "sksl.flex"
-{ return SkSL::Token::CONST; }
+{ return SkSL::Token::LOWP; }
YY_BREAK
case 22:
YY_RULE_SETUP
#line 67 "sksl.flex"
-{ return SkSL::Token::LOWP; }
+{ return SkSL::Token::MEDIUMP; }
YY_BREAK
case 23:
YY_RULE_SETUP
#line 69 "sksl.flex"
-{ return SkSL::Token::MEDIUMP; }
+{ return SkSL::Token::HIGHP; }
YY_BREAK
case 24:
YY_RULE_SETUP
#line 71 "sksl.flex"
-{ return SkSL::Token::HIGHP; }
+{ return SkSL::Token::FLAT; }
YY_BREAK
case 25:
YY_RULE_SETUP
#line 73 "sksl.flex"
-{ return SkSL::Token::FLAT; }
+{ return SkSL::Token::NOPERSPECTIVE; }
YY_BREAK
case 26:
YY_RULE_SETUP
#line 75 "sksl.flex"
-{ return SkSL::Token::NOPERSPECTIVE; }
+{ return SkSL::Token::STRUCT; }
YY_BREAK
case 27:
YY_RULE_SETUP
#line 77 "sksl.flex"
-{ return SkSL::Token::STRUCT; }
+{ return SkSL::Token::LAYOUT; }
YY_BREAK
case 28:
YY_RULE_SETUP
#line 79 "sksl.flex"
-{ return SkSL::Token::LAYOUT; }
+{ return SkSL::Token::PRECISION; }
YY_BREAK
case 29:
YY_RULE_SETUP
#line 81 "sksl.flex"
-{ return SkSL::Token::PRECISION; }
+{ return SkSL::Token::IDENTIFIER; }
YY_BREAK
case 30:
YY_RULE_SETUP
#line 83 "sksl.flex"
-{ return SkSL::Token::IDENTIFIER; }
+{ return SkSL::Token::DIRECTIVE; }
YY_BREAK
case 31:
YY_RULE_SETUP
#line 85 "sksl.flex"
-{ return SkSL::Token::DIRECTIVE; }
+{ return SkSL::Token::LPAREN; }
YY_BREAK
case 32:
YY_RULE_SETUP
#line 87 "sksl.flex"
-{ return SkSL::Token::LPAREN; }
+{ return SkSL::Token::RPAREN; }
YY_BREAK
case 33:
YY_RULE_SETUP
#line 89 "sksl.flex"
-{ return SkSL::Token::RPAREN; }
+{ return SkSL::Token::LBRACE; }
YY_BREAK
case 34:
YY_RULE_SETUP
#line 91 "sksl.flex"
-{ return SkSL::Token::LBRACE; }
+{ return SkSL::Token::RBRACE; }
YY_BREAK
case 35:
YY_RULE_SETUP
#line 93 "sksl.flex"
-{ return SkSL::Token::RBRACE; }
+{ return SkSL::Token::LBRACKET; }
YY_BREAK
case 36:
YY_RULE_SETUP
#line 95 "sksl.flex"
-{ return SkSL::Token::LBRACKET; }
+{ return SkSL::Token::RBRACKET; }
YY_BREAK
case 37:
YY_RULE_SETUP
#line 97 "sksl.flex"
-{ return SkSL::Token::RBRACKET; }
+{ return SkSL::Token::DOT; }
YY_BREAK
case 38:
YY_RULE_SETUP
#line 99 "sksl.flex"
-{ return SkSL::Token::DOT; }
+{ return SkSL::Token::COMMA; }
YY_BREAK
case 39:
YY_RULE_SETUP
#line 101 "sksl.flex"
-{ return SkSL::Token::COMMA; }
+{ return SkSL::Token::PLUSPLUS; }
YY_BREAK
case 40:
YY_RULE_SETUP
#line 103 "sksl.flex"
-{ return SkSL::Token::PLUSPLUS; }
+{ return SkSL::Token::MINUSMINUS; }
YY_BREAK
case 41:
YY_RULE_SETUP
#line 105 "sksl.flex"
-{ return SkSL::Token::MINUSMINUS; }
+{ return SkSL::Token::PLUS; }
YY_BREAK
case 42:
YY_RULE_SETUP
#line 107 "sksl.flex"
-{ return SkSL::Token::PLUS; }
+{ return SkSL::Token::MINUS; }
YY_BREAK
case 43:
YY_RULE_SETUP
#line 109 "sksl.flex"
-{ return SkSL::Token::MINUS; }
+{ return SkSL::Token::STAR; }
YY_BREAK
case 44:
YY_RULE_SETUP
#line 111 "sksl.flex"
-{ return SkSL::Token::STAR; }
+{ return SkSL::Token::SLASH; }
YY_BREAK
case 45:
YY_RULE_SETUP
#line 113 "sksl.flex"
-{ return SkSL::Token::SLASH; }
+{ return SkSL::Token::PERCENT; }
YY_BREAK
case 46:
YY_RULE_SETUP
#line 115 "sksl.flex"
-{ return SkSL::Token::PERCENT; }
+{ return SkSL::Token::SHL; }
YY_BREAK
case 47:
YY_RULE_SETUP
#line 117 "sksl.flex"
-{ return SkSL::Token::SHL; }
+{ return SkSL::Token::SHR; }
YY_BREAK
case 48:
YY_RULE_SETUP
#line 119 "sksl.flex"
-{ return SkSL::Token::SHR; }
+{ return SkSL::Token::BITWISEOR; }
YY_BREAK
case 49:
YY_RULE_SETUP
#line 121 "sksl.flex"
-{ return SkSL::Token::BITWISEOR; }
+{ return SkSL::Token::BITWISEXOR; }
YY_BREAK
case 50:
YY_RULE_SETUP
#line 123 "sksl.flex"
-{ return SkSL::Token::BITWISEXOR; }
+{ return SkSL::Token::BITWISEAND; }
YY_BREAK
case 51:
YY_RULE_SETUP
#line 125 "sksl.flex"
-{ return SkSL::Token::BITWISEAND; }
+{ return SkSL::Token::LOGICALOR; }
YY_BREAK
case 52:
YY_RULE_SETUP
#line 127 "sksl.flex"
-{ return SkSL::Token::BITWISENOT; }
+{ return SkSL::Token::LOGICALXOR; }
YY_BREAK
case 53:
YY_RULE_SETUP
#line 129 "sksl.flex"
-{ return SkSL::Token::LOGICALOR; }
+{ return SkSL::Token::LOGICALAND; }
YY_BREAK
case 54:
YY_RULE_SETUP
#line 131 "sksl.flex"
-{ return SkSL::Token::LOGICALXOR; }
+{ return SkSL::Token::NOT; }
YY_BREAK
case 55:
YY_RULE_SETUP
#line 133 "sksl.flex"
-{ return SkSL::Token::LOGICALAND; }
+{ return SkSL::Token::QUESTION; }
YY_BREAK
case 56:
YY_RULE_SETUP
#line 135 "sksl.flex"
-{ return SkSL::Token::LOGICALNOT; }
+{ return SkSL::Token::COLON; }
YY_BREAK
case 57:
YY_RULE_SETUP
#line 137 "sksl.flex"
-{ return SkSL::Token::QUESTION; }
+{ return SkSL::Token::EQ; }
YY_BREAK
case 58:
YY_RULE_SETUP
#line 139 "sksl.flex"
-{ return SkSL::Token::COLON; }
+{ return SkSL::Token::EQEQ; }
YY_BREAK
case 59:
YY_RULE_SETUP
#line 141 "sksl.flex"
-{ return SkSL::Token::EQ; }
+{ return SkSL::Token::NEQ; }
YY_BREAK
case 60:
YY_RULE_SETUP
#line 143 "sksl.flex"
-{ return SkSL::Token::EQEQ; }
+{ return SkSL::Token::GT; }
YY_BREAK
case 61:
YY_RULE_SETUP
#line 145 "sksl.flex"
-{ return SkSL::Token::NEQ; }
+{ return SkSL::Token::LT; }
YY_BREAK
case 62:
YY_RULE_SETUP
#line 147 "sksl.flex"
-{ return SkSL::Token::GT; }
+{ return SkSL::Token::GTEQ; }
YY_BREAK
case 63:
YY_RULE_SETUP
#line 149 "sksl.flex"
-{ return SkSL::Token::LT; }
+{ return SkSL::Token::LTEQ; }
YY_BREAK
case 64:
YY_RULE_SETUP
#line 151 "sksl.flex"
-{ return SkSL::Token::GTEQ; }
+{ return SkSL::Token::PLUSEQ; }
YY_BREAK
case 65:
YY_RULE_SETUP
#line 153 "sksl.flex"
-{ return SkSL::Token::LTEQ; }
+{ return SkSL::Token::MINUSEQ; }
YY_BREAK
case 66:
YY_RULE_SETUP
#line 155 "sksl.flex"
-{ return SkSL::Token::PLUSEQ; }
+{ return SkSL::Token::STAREQ; }
YY_BREAK
case 67:
YY_RULE_SETUP
#line 157 "sksl.flex"
-{ return SkSL::Token::MINUSEQ; }
+{ return SkSL::Token::SLASHEQ; }
YY_BREAK
case 68:
YY_RULE_SETUP
#line 159 "sksl.flex"
-{ return SkSL::Token::STAREQ; }
+{ return SkSL::Token::PERCENTEQ; }
YY_BREAK
case 69:
YY_RULE_SETUP
#line 161 "sksl.flex"
-{ return SkSL::Token::SLASHEQ; }
+{ return SkSL::Token::SHLEQ; }
YY_BREAK
case 70:
YY_RULE_SETUP
#line 163 "sksl.flex"
-{ return SkSL::Token::PERCENTEQ; }
+{ return SkSL::Token::SHREQ; }
YY_BREAK
case 71:
YY_RULE_SETUP
#line 165 "sksl.flex"
-{ return SkSL::Token::SHLEQ; }
+{ return SkSL::Token::BITWISEOREQ; }
YY_BREAK
case 72:
YY_RULE_SETUP
#line 167 "sksl.flex"
-{ return SkSL::Token::SHREQ; }
+{ return SkSL::Token::BITWISEXOREQ; }
YY_BREAK
case 73:
YY_RULE_SETUP
#line 169 "sksl.flex"
-{ return SkSL::Token::BITWISEOREQ; }
+{ return SkSL::Token::BITWISEANDEQ; }
YY_BREAK
case 74:
YY_RULE_SETUP
#line 171 "sksl.flex"
-{ return SkSL::Token::BITWISEXOREQ; }
+{ return SkSL::Token::LOGICALOREQ; }
YY_BREAK
case 75:
YY_RULE_SETUP
#line 173 "sksl.flex"
-{ return SkSL::Token::BITWISEANDEQ; }
+{ return SkSL::Token::LOGICALXOREQ; }
YY_BREAK
case 76:
YY_RULE_SETUP
#line 175 "sksl.flex"
-{ return SkSL::Token::LOGICALOREQ; }
+{ return SkSL::Token::LOGICALANDEQ; }
YY_BREAK
case 77:
YY_RULE_SETUP
#line 177 "sksl.flex"
-{ return SkSL::Token::LOGICALXOREQ; }
+{ return SkSL::Token::SEMICOLON; }
YY_BREAK
case 78:
YY_RULE_SETUP
#line 179 "sksl.flex"
-{ return SkSL::Token::LOGICALANDEQ; }
+/* line comment */
YY_BREAK
case 79:
+/* rule 79 can match eol */
YY_RULE_SETUP
#line 181 "sksl.flex"
-{ return SkSL::Token::SEMICOLON; }
+/* block comment */
YY_BREAK
case 80:
+/* rule 80 can match eol */
YY_RULE_SETUP
#line 183 "sksl.flex"
-/* line comment */
+/* whitespace */
YY_BREAK
case 81:
-/* rule 81 can match eol */
YY_RULE_SETUP
#line 185 "sksl.flex"
-/* block comment */
+{ return SkSL::Token::INVALID_TOKEN; }
YY_BREAK
case 82:
-/* rule 82 can match eol */
YY_RULE_SETUP
#line 187 "sksl.flex"
-/* whitespace */
- YY_BREAK
-case 83:
-YY_RULE_SETUP
-#line 189 "sksl.flex"
-{ return SkSL::Token::INVALID_TOKEN; }
- YY_BREAK
-case 84:
-YY_RULE_SETUP
-#line 191 "sksl.flex"
ECHO;
YY_BREAK
-#line 1342 "lex.sksl.c"
+#line 1329 "lex.sksl.c"
case YY_STATE_EOF(INITIAL):
yyterminate();
@@ -1539,7 +1526,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
{ /* Not enough room in the buffer - grow it. */
/* just a shorter name for the current buffer */
- YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
+ YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE;
int yy_c_buf_p_offset =
(int) (yyg->yy_c_buf_p - b->yy_ch_buf);
@@ -1639,7 +1626,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 205 )
+ if ( yy_current_state >= 201 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
@@ -1668,12 +1655,13 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 205 )
+ if ( yy_current_state >= 201 )
yy_c = yy_meta[(unsigned int) yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- yy_is_jam = (yy_current_state == 204);
+ yy_is_jam = (yy_current_state == 200);
+ (void)yyg;
return yy_is_jam ? 0 : yy_current_state;
}
@@ -1768,7 +1756,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
case EOB_ACT_END_OF_FILE:
{
if ( skslwrap(yyscanner ) )
- return 0;
+ return EOF;
if ( ! yyg->yy_did_buffer_switch_on_eof )
YY_NEW_FILE;
@@ -2124,8 +2112,8 @@ YY_BUFFER_STATE sksl_scan_string (yyconst char * yystr , yyscan_t yyscanner)
/** Setup the input buffer state to scan the given bytes. The next call to sksllex() will
* scan from a @e copy of @a bytes.
- * @param bytes the byte buffer to scan
- * @param len the number of bytes in the buffer pointed to by @a bytes.
+ * @param yybytes the byte buffer to scan
+ * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
* @param yyscanner The scanner object.
* @return the newly allocated buffer state object.
*/
@@ -2133,7 +2121,8 @@ YY_BUFFER_STATE sksl_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_le
{
YY_BUFFER_STATE b;
char *buf;
- yy_size_t n, i;
+ yy_size_t n;
+ int i;
/* Get memory for full buffer, including space for trailing EOB's. */
n = _yybytes_len + 2;
@@ -2279,7 +2268,7 @@ void skslset_lineno (int line_number , yyscan_t yyscanner)
/* lineno is only valid if an input buffer exists. */
if (! YY_CURRENT_BUFFER )
- yy_fatal_error( "skslset_lineno called with no buffer" , yyscanner);
+ YY_FATAL_ERROR( "skslset_lineno called with no buffer" );
yylineno = line_number;
}
@@ -2294,7 +2283,7 @@ void skslset_column (int column_no , yyscan_t yyscanner)
/* column is only valid if an input buffer exists. */
if (! YY_CURRENT_BUFFER )
- yy_fatal_error( "skslset_column called with no buffer" , yyscanner);
+ YY_FATAL_ERROR( "skslset_column called with no buffer" );
yycolumn = column_no;
}
@@ -2506,7 +2495,7 @@ void skslfree (void * ptr , yyscan_t yyscanner)
#define YYTABLES_NAME "yytables"
-#line 191 "sksl.flex"
+#line 187 "sksl.flex"
diff --git a/src/sksl/sksl.flex b/src/sksl/sksl.flex
index 4455f50084..67b48e9cb9 100644
--- a/src/sksl/sksl.flex
+++ b/src/sksl/sksl.flex
@@ -30,8 +30,6 @@ LETTER [a-zA-Z_$]
{DIGIT}+ { return SkSL::Token::INT_LITERAL; }
-"0x"[0-9a-fA-F]+ { return SkSL::Token::INT_LITERAL; }
-
true { return SkSL::Token::TRUE_LITERAL; }
false { return SkSL::Token::FALSE_LITERAL; }
@@ -124,15 +122,13 @@ precision { return SkSL::Token::PRECISION; }
"&" { return SkSL::Token::BITWISEAND; }
-"~" { return SkSL::Token::BITWISENOT; }
-
"||" { return SkSL::Token::LOGICALOR; }
"^^" { return SkSL::Token::LOGICALXOR; }
"&&" { return SkSL::Token::LOGICALAND; }
-"!" { return SkSL::Token::LOGICALNOT; }
+"!" { return SkSL::Token::NOT; }
"?" { return SkSL::Token::QUESTION; }
diff --git a/src/sksl/sksl.include b/src/sksl/sksl.include
index 6dc1ff8cf2..4fd5511ee3 100644
--- a/src/sksl/sksl.include
+++ b/src/sksl/sksl.include
@@ -244,8 +244,6 @@ int textureQueryLevels(samplerCubeArrayShadow sampler);
$gvec4 texture($gsampler1D sampler, float P);
$gvec4 texture($gsampler1D sampler, float P, float bias);
$gvec4 texture($gsampler2D sampler, vec2 P);
-vec4 texture(samplerExternalOES sampler, vec2 P, float bias);
-vec4 texture(samplerExternalOES sampler, vec2 P);
$gvec4 texture($gsampler2D sampler, vec2 P, float bias);
$gvec4 texture($gsampler3D sampler, vec3 P);
$gvec4 texture($gsampler3D sampler, vec3 P, float bias);
@@ -466,7 +464,6 @@ vec4 texture1DLod(sampler1D sampler, float coord, float lod);
vec4 texture1DProjLod(sampler1D sampler, vec2 coord, float lod);
vec4 texture1DProjLod(sampler1D sampler, vec4 coord, float lod);
vec4 texture2D(sampler2D sampler, vec2 coord);
-vec4 texture2D(samplerExternalOES sampler, vec2 coord);
vec4 texture2D(sampler2D sampler, vec2 coord, float bias);
vec4 texture2DProj(sampler2D sampler, vec3 coord);
vec4 texture2DProj(sampler2D sampler, vec3 coord, float bias);
diff --git a/src/sksl/sksl_frag.include b/src/sksl/sksl_frag.include
index 98dbc90252..123c3393a2 100644
--- a/src/sksl/sksl_frag.include
+++ b/src/sksl/sksl_frag.include
@@ -4,17 +4,5 @@ STRINGIFY(
layout(builtin=15) in vec4 gl_FragCoord;
-// 9999 is a temporary value that causes us to ignore these declarations beyond
-// adding them to the symbol table. This works fine in GLSL (where they do not
-// require any further handling) but will fail in SPIR-V. We'll have a better
-// solution for this soon.
-layout(builtin=9999) vec4 gl_LastFragData[1];
-layout(builtin=9999) vec4 gl_LastFragColor;
-layout(builtin=9999) vec4 gl_LastFragColorARM;
-layout(builtin=9999) int gl_SampleMaskIn[];
-layout(builtin=9999) out int gl_SampleMask[];
-layout(builtin=9999) vec4 gl_SecondaryFragColorEXT;
-
-layout(location=0,index=0,builtin=10001) out vec4 sk_FragColor;
-
)
+
diff --git a/tests/SkSLErrorTest.cpp b/tests/SkSLErrorTest.cpp
index 400ab6dc57..75fa20d7e3 100644
--- a/tests/SkSLErrorTest.cpp
+++ b/tests/SkSLErrorTest.cpp
@@ -263,8 +263,8 @@ DEF_TEST(SkSLBadIndex, r) {
"void main() { int x = 2[0]; }",
"error: 1: expected array, but found 'int'\n1 error\n");
test_failure(r,
- "void main() { vec2 x = vec2(0); int y = x[0][0]; }",
- "error: 1: expected array, but found 'float'\n1 error\n");
+ "void main() { vec2 x = vec2(0); int y = x[0]; }",
+ "error: 1: expected array, but found 'vec2'\n1 error\n");
}
DEF_TEST(SkSLTernaryMismatch, r) {
diff --git a/tests/SkSLGLSLTest.cpp b/tests/SkSLGLSLTest.cpp
index dedddad1f8..3906f67115 100644
--- a/tests/SkSLGLSLTest.cpp
+++ b/tests/SkSLGLSLTest.cpp
@@ -26,52 +26,46 @@ static void test(skiatest::Reporter* r, const char* src, SkSL::GLCaps caps, cons
}
}
-static SkSL::GLCaps default_caps() {
- return {
- 400,
- SkSL::GLCaps::kGL_Standard,
- false, // isCoreProfile
- false, // usesPrecisionModifiers;
- false, // mustDeclareFragmentShaderOutput
- true // canUseMinAndAbsTogether
- };
-}
-
DEF_TEST(SkSLHelloWorld, r) {
+ SkSL::GLCaps caps = { 400, SkSL::GLCaps::kGL_Standard };
test(r,
- "void main() { sk_FragColor = vec4(0.75); }",
- default_caps(),
+ "out vec4 fragColor; void main() { fragColor = vec4(0.75); }",
+ caps,
"#version 400\n"
+ "out vec4 fragColor;\n"
"void main() {\n"
- " gl_FragColor = vec4(0.75);\n"
+ " fragColor = vec4(0.75);\n"
"}\n");
}
DEF_TEST(SkSLControl, r) {
+ SkSL::GLCaps caps = { 400, SkSL::GLCaps::kGL_Standard };
test(r,
+ "out vec4 fragColor;"
"void main() {"
- "if (1 + 2 + 3 > 5) { sk_FragColor = vec4(0.75); } else { discard; }"
+ "if (1 + 2 + 3 > 5) { fragColor = vec4(0.75); } else { discard; }"
"int i = 0;"
- "while (i < 10) sk_FragColor *= 0.5;"
- "do { sk_FragColor += 0.01; } while (sk_FragColor.x < 0.7);"
+ "while (i < 10) fragColor *= 0.5;"
+ "do { fragColor += 0.01; } while (fragColor.x < 0.7);"
"for (int i = 0; i < 10; i++) {"
"if (i % 0 == 1) break; else continue;"
"}"
"return;"
"}",
- default_caps(),
+ caps,
"#version 400\n"
+ "out vec4 fragColor;\n"
"void main() {\n"
" if ((1 + 2) + 3 > 5) {\n"
- " gl_FragColor = vec4(0.75);\n"
+ " fragColor = vec4(0.75);\n"
" } else {\n"
" discard;\n"
" }\n"
" int i = 0;\n"
- " while (i < 10) gl_FragColor *= 0.5;\n"
+ " while (i < 10) fragColor *= 0.5;\n"
" do {\n"
- " gl_FragColor += 0.01;\n"
- " } while (gl_FragColor.x < 0.7);\n"
+ " fragColor += 0.01;\n"
+ " } while (fragColor.x < 0.7);\n"
" for (int i = 0;i < 10; i++) {\n"
" if (i % 0 == 1) break; else continue;\n"
" }\n"
@@ -80,30 +74,34 @@ DEF_TEST(SkSLControl, r) {
}
DEF_TEST(SkSLFunctions, r) {
+ SkSL::GLCaps caps = { 400, SkSL::GLCaps::kGL_Standard };
test(r,
+ "out vec4 fragColor;"
"float foo(float v[2]) { return v[0] * v[1]; }"
"void bar(inout float x) { float y[2], z; y[0] = x; y[1] = x * 2; z = foo(y); x = z; }"
- "void main() { float x = 10; bar(x); sk_FragColor = vec4(x); }",
- default_caps(),
+ "void main() { float x = 10; bar(x); fragColor = vec4(x); }",
+ caps,
"#version 400\n"
- "float foo(in float v[2]) {\n"
+ "out vec4 fragColor;\n"
+ "float foo(in float[2] v) {\n"
" return v[0] * v[1];\n"
"}\n"
"void bar(inout float x) {\n"
" float y[2], z;\n"
" y[0] = x;\n"
- " y[1] = x * 2.0;\n"
+ " y[1] = x * 2;\n"
" z = foo(y);\n"
" x = z;\n"
"}\n"
"void main() {\n"
- " float x = 10.0;\n"
+ " float x = 10;\n"
" bar(x);\n"
- " gl_FragColor = vec4(x);\n"
+ " fragColor = vec4(x);\n"
"}\n");
}
DEF_TEST(SkSLOperators, r) {
+ SkSL::GLCaps caps = { 400, SkSL::GLCaps::kGL_Standard };
test(r,
"void main() {"
"float x = 1, y = 2;"
@@ -125,17 +123,17 @@ DEF_TEST(SkSLOperators, r) {
"z <<= 4;"
"z %= 5;"
"}",
- default_caps(),
+ caps,
"#version 400\n"
"void main() {\n"
- " float x = 1.0, y = 2.0;\n"
+ " float x = 1, y = 2;\n"
" int z = 3;\n"
" x = x + ((y * float(z)) * x) * (y - float(z));\n"
" y = (x / y) / float(z);\n"
" z = (((z / 2) % 3 << 4) >> 2) << 1;\n"
- " bool b = x > 4.0 == x < 2.0 || (2 >= 5 && y <= float(z)) && 12 != 11;\n"
- " x += 12.0;\n"
- " x -= 12.0;\n"
+ " bool b = x > 4 == x < 2 || (2 >= 5 && y <= float(z)) && 12 != 11;\n"
+ " x += 12;\n"
+ " x -= 12;\n"
" x *= (y /= float(z = 10));\n"
" b ||= false;\n"
" b &&= true;\n"
@@ -150,6 +148,7 @@ DEF_TEST(SkSLOperators, r) {
}
DEF_TEST(SkSLMatrices, r) {
+ SkSL::GLCaps caps = { 400, SkSL::GLCaps::kGL_Standard };
test(r,
"void main() {"
"mat2x4 x = mat2x4(1);"
@@ -158,18 +157,19 @@ DEF_TEST(SkSLMatrices, r) {
"vec3 v1 = mat3(1) * vec3(1);"
"vec3 v2 = vec3(1) * mat3(1);"
"}",
- default_caps(),
+ caps,
"#version 400\n"
"void main() {\n"
- " mat2x4 x = mat2x4(1.0);\n"
- " mat3x2 y = mat3x2(1.0, 0.0, 0.0, 1.0, vec2(2.0, 2.0));\n"
+ " mat2x4 x = mat2x4(1);\n"
+ " mat3x2 y = mat3x2(1, 0, 0, 1, vec2(2, 2));\n"
" mat3x4 z = x * y;\n"
- " vec3 v1 = mat3(1.0) * vec3(1.0);\n"
- " vec3 v2 = vec3(1.0) * mat3(1.0);\n"
+ " vec3 v1 = mat3(1) * vec3(1);\n"
+ " vec3 v2 = vec3(1) * mat3(1);\n"
"}\n");
}
DEF_TEST(SkSLInterfaceBlock, r) {
+ SkSL::GLCaps caps = { 400, SkSL::GLCaps::kGL_Standard };
test(r,
"uniform testBlock {"
"float x;"
@@ -179,12 +179,12 @@ DEF_TEST(SkSLInterfaceBlock, r) {
"};"
"void main() {"
"}",
- default_caps(),
+ caps,
"#version 400\n"
"uniform testBlock {\n"
" float x;\n"
" float[2] y;\n"
- " layout (binding = 12) mat3x2 z;\n"
+ " layout (binding = 12)mat3x2 z;\n"
" bool w;\n"
"};\n"
"void main() {\n"
@@ -192,6 +192,7 @@ DEF_TEST(SkSLInterfaceBlock, r) {
}
DEF_TEST(SkSLStructs, r) {
+ SkSL::GLCaps caps = { 400, SkSL::GLCaps::kGL_Standard };
test(r,
"struct A {"
"int x;"
@@ -206,7 +207,7 @@ DEF_TEST(SkSLStructs, r) {
"B b1, b2, b3;"
"void main() {"
"}",
- default_caps(),
+ caps,
"#version 400\n"
"struct A {\n"
" int x;\n"
@@ -217,151 +218,10 @@ DEF_TEST(SkSLStructs, r) {
"struct B {\n"
" float x;\n"
" float[2] y;\n"
- " layout (binding = 1) A z;\n"
+ " layout (binding = 1)A z;\n"
"}\n"
" b1, b2, b3;\n"
"void main() {\n"
"}\n");
-}
-
-DEF_TEST(SkSLVersion, r) {
- SkSL::GLCaps caps = default_caps();
- caps.fVersion = 450;
- caps.fIsCoreProfile = true;
- test(r,
- "in float test; void main() { sk_FragColor = vec4(0.75); }",
- caps,
- "#version 450 core\n"
- "in float test;\n"
- "void main() {\n"
- " gl_FragColor = vec4(0.75);\n"
- "}\n");
- caps.fVersion = 110;
- caps.fIsCoreProfile = false;
- test(r,
- "in float test; void main() { sk_FragColor = vec4(0.75); }",
- caps,
- "#version 110\n"
- "varying float test;\n"
- "void main() {\n"
- " gl_FragColor = vec4(0.75);\n"
- "}\n");
-}
-
-DEF_TEST(SkSLDeclareOutput, r) {
- SkSL::GLCaps caps = default_caps();
- caps.fMustDeclareFragmentShaderOutput = true;
- test(r,
- "void main() { sk_FragColor = vec4(0.75); }",
- caps,
- "#version 400\n"
- "out vec4 sk_FragColor;\n"
- "void main() {\n"
- " sk_FragColor = vec4(0.75);\n"
- "}\n");
-}
-DEF_TEST(SkSLUsesPrecisionModifiers, r) {
- SkSL::GLCaps caps = default_caps();
- test(r,
- "void main() { float x = 0.75; highp float y = 1; }",
- caps,
- "#version 400\n"
- "void main() {\n"
- " float x = 0.75;\n"
- " float y = 1.0;\n"
- "}\n");
- caps.fStandard = SkSL::GLCaps::kGLES_Standard;
- caps.fUsesPrecisionModifiers = true;
- test(r,
- "void main() { float x = 0.75; highp float y = 1; }",
- caps,
- "#version 400 es\n"
- "precision highp float;\n"
- "void main() {\n"
- " float x = 0.75;\n"
- " highp float y = 1.0;\n"
- "}\n");
-}
-
-DEF_TEST(SkSLMinAbs, r) {
- test(r,
- "void main() {"
- "float x = -5;"
- "x = min(abs(x), 6);"
- "}",
- default_caps(),
- "#version 400\n"
- "void main() {\n"
- " float x = -5.0;\n"
- " x = min(abs(x), 6.0);\n"
- "}\n");
-
- SkSL::GLCaps caps = default_caps();
- caps.fCanUseMinAndAbsTogether = false;
- test(r,
- "void main() {"
- "float x = -5.0;"
- "x = min(abs(x), 6.0);"
- "}",
- caps,
- "#version 400\n"
- "void main() {\n"
- " float minAbsHackVar0;\n"
- " float minAbsHackVar1;\n"
- " float x = -5.0;\n"
- " x = ((minAbsHackVar0 = abs(x)) < (minAbsHackVar1 = 6.0) ? minAbsHackVar0 : "
- "minAbsHackVar1);\n"
- "}\n");
-}
-
-DEF_TEST(SkSLModifiersDeclaration, r) {
- test(r,
- "layout(blend_support_all_equations) out;"
- "void main() { }",
- default_caps(),
- "#version 400\n"
- "layout (blend_support_all_equations) out ;\n"
- "void main() {\n"
- "}\n");
-}
-
-DEF_TEST(SkSLHex, r) {
- test(r,
- "void main() {"
- "int i1 = 0x0;"
- "int i2 = 0x1234abcd;"
- "int i3 = 0x7fffffff;"
- "int i4 = 0xffffffff;"
- "int i5 = -0xbeef;"
- "uint u1 = 0x0;"
- "uint u2 = 0x1234abcd;"
- "uint u3 = 0x7fffffff;"
- "uint u4 = 0xffffffff;"
- "}",
- default_caps(),
- "#version 400\n"
- "void main() {\n"
- " int i1 = 0;\n"
- " int i2 = 305441741;\n"
- " int i3 = 2147483647;\n"
- " int i4 = -1;\n"
- " int i5 = -48879;\n"
- " uint u1 = 0u;\n"
- " uint u2 = 305441741u;\n"
- " uint u3 = 2147483647u;\n"
- " uint u4 = 4294967295u;\n"
- "}\n");
-}
-
-DEF_TEST(SkSLArrayConstructors, r) {
- test(r,
- "float test1[] = float[](1, 2, 3, 4);"
- "vec2 test2[] = vec2[](vec2(1, 2), vec2(3, 4));"
- "mat4 test3[] = mat4[]();",
- default_caps(),
- "#version 400\n"
- "float test1[] = float[](1.0, 2.0, 3.0, 4.0);\n"
- "vec2 test2[] = vec2[](vec2(1.0, 2.0), vec2(3.0, 4.0));\n"
- "mat4 test3[] = mat4[]();\n");
}