aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpu')
-rw-r--r--src/gpu/gl/builders/GrGLShaderStringBuilder.cpp76
-rw-r--r--src/gpu/gl/builders/GrGLShaderStringBuilder.h2
-rw-r--r--src/gpu/glsl/GrGLSLCaps.h5
3 files changed, 77 insertions, 6 deletions
diff --git a/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp b/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp
index 1e42259128..8a5b700a90 100644
--- a/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp
+++ b/src/gpu/gl/builders/GrGLShaderStringBuilder.cpp
@@ -21,6 +21,79 @@ 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.fShaderDerivativeSupport = glslCaps->shaderDerivativeSupport();
+ if (result.fShaderDerivativeSupport && glslCaps->shaderDerivativeExtensionString()) {
+ result.fShaderDerivativeExtensionString = glslCaps->shaderDerivativeExtensionString();
+ }
+ result.fCanUseMinAndAbsTogether = glslCaps->canUseMinAndAbsTogether();
+ result.fMustForceNegatedAtanParamToFloat = glslCaps->mustForceNegatedAtanParamToFloat();
+ 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.
@@ -64,12 +137,13 @@ GrGLuint GrGLCompileAndAttachShader(const GrGLContext& glCtx,
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()),
- *glCtx.caps()->glslCaps(),
+ caps,
&glsl);
#ifdef SK_DEBUG
if (!result) {
diff --git a/src/gpu/gl/builders/GrGLShaderStringBuilder.h b/src/gpu/gl/builders/GrGLShaderStringBuilder.h
index 71fce6a95a..4365751c3a 100644
--- a/src/gpu/gl/builders/GrGLShaderStringBuilder.h
+++ b/src/gpu/gl/builders/GrGLShaderStringBuilder.h
@@ -14,6 +14,8 @@
#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/GrGLSLCaps.h b/src/gpu/glsl/GrGLSLCaps.h
index 1a89d1690b..ac409a36ba 100644
--- a/src/gpu/glsl/GrGLSLCaps.h
+++ b/src/gpu/glsl/GrGLSLCaps.h
@@ -13,10 +13,6 @@
#include "GrGLSL.h"
#include "GrSwizzle.h"
-namespace SkSL {
- class GLSLCapsFactory;
-}
-
class GrGLSLCaps : public GrShaderCaps {
public:
@@ -235,7 +231,6 @@ private:
friend class GrGLCaps; // For initialization.
friend class GrVkCaps;
- friend class SkSL::GLSLCapsFactory;
typedef GrShaderCaps INHERITED;
};