2011-12-08 14:44:10 +00:00
|
|
|
/*
|
|
|
|
* Copyright 2011 Google Inc.
|
|
|
|
*
|
|
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
|
|
* found in the LICENSE file.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef GrGLSL_DEFINED
|
|
|
|
#define GrGLSL_DEFINED
|
|
|
|
|
2013-03-12 12:26:08 +00:00
|
|
|
#include "GrTypesPriv.h"
|
Express (GLSL expression, possibly known value) pairs as a class
Express (GLSL expression, possibly known value) pairs as a class
instead of two variables Introduces GrGLSLExpr<N> to encapsulate
the expression and possibly constant-folded value of the expression.
This simplifies passing of the expressions to functions.
Changes the shaders with following patterns:
{ // Stage 0: Linear Gradient
vec4 colorTemp = mix(uGradientStartColor_Stage0, uGradientEndColor_Stage0, clamp(vMatrixCoord_Stage0.x, 0.0, 1
colorTemp.rgb *= colorTemp.a;
- output_Stage0 = vec4((vColor) * (colorTemp));
+ output_Stage0 = (vColor * colorTemp);
+ }
Previously the vector cast was always added if constant folding was
effective, regardless of the term dimensions. Now the vector upcast is
not inserted in places where it is not needed, ie. when the binary
operator term is of the target dimension.
Also, some parentheses can be omitted. It is assumed that
GrGLSLExpr<N>("string") constructors construct a simple expression or
parenthesized expression.
Otherwise the shader code remains identical.
R=jvanverth@google.com, bsalomon@google.com, robertphillips@google.com
Author: kkinnunen@nvidia.com
Review URL: https://codereview.chromium.org/25048002
git-svn-id: http://skia.googlecode.com/svn/trunk@11690 2bbb7eff-a529-9590-31e7-b0007b416f81
2013-10-10 06:30:18 +00:00
|
|
|
#include "SkString.h"
|
2011-12-08 14:44:10 +00:00
|
|
|
|
2016-11-29 18:43:05 +00:00
|
|
|
class GrShaderCaps;
|
2015-10-26 15:38:25 +00:00
|
|
|
|
2011-12-08 14:44:10 +00:00
|
|
|
// Limited set of GLSL versions we build shaders for. Caller should round
|
|
|
|
// down the GLSL version to one of these enums.
|
|
|
|
enum GrGLSLGeneration {
|
|
|
|
/**
|
2012-10-23 14:31:30 +00:00
|
|
|
* Desktop GLSL 1.10 and ES2 shading language (based on desktop GLSL 1.20)
|
2011-12-08 14:44:10 +00:00
|
|
|
*/
|
2012-02-10 15:56:06 +00:00
|
|
|
k110_GrGLSLGeneration,
|
2011-12-08 14:44:10 +00:00
|
|
|
/**
|
|
|
|
* Desktop GLSL 1.30
|
|
|
|
*/
|
2012-02-10 15:56:06 +00:00
|
|
|
k130_GrGLSLGeneration,
|
2011-12-08 14:44:10 +00:00
|
|
|
/**
|
2012-10-23 14:31:30 +00:00
|
|
|
* Desktop GLSL 1.40
|
|
|
|
*/
|
|
|
|
k140_GrGLSLGeneration,
|
|
|
|
/**
|
|
|
|
* Desktop GLSL 1.50
|
2011-12-08 14:44:10 +00:00
|
|
|
*/
|
2012-02-10 15:56:06 +00:00
|
|
|
k150_GrGLSLGeneration,
|
2014-10-17 13:07:08 +00:00
|
|
|
/**
|
|
|
|
* Desktop GLSL 3.30, and ES GLSL 3.00
|
|
|
|
*/
|
|
|
|
k330_GrGLSLGeneration,
|
2016-02-22 15:55:44 +00:00
|
|
|
/**
|
|
|
|
* Desktop GLSL 4.00
|
|
|
|
*/
|
|
|
|
k400_GrGLSLGeneration,
|
2016-11-15 18:26:08 +00:00
|
|
|
/**
|
|
|
|
* Desktop GLSL 4.20
|
|
|
|
*/
|
|
|
|
k420_GrGLSLGeneration,
|
2014-10-17 13:07:08 +00:00
|
|
|
/**
|
|
|
|
* ES GLSL 3.10 only TODO Make GLSLCap objects to make this more granular
|
|
|
|
*/
|
|
|
|
k310es_GrGLSLGeneration,
|
2016-02-22 15:55:44 +00:00
|
|
|
/**
|
|
|
|
* ES GLSL 3.20
|
|
|
|
*/
|
|
|
|
k320es_GrGLSLGeneration,
|
2011-12-08 14:44:10 +00:00
|
|
|
};
|
|
|
|
|
2015-06-04 15:49:34 +00:00
|
|
|
bool GrGLSLSupportsNamedFragmentShaderOutputs(GrGLSLGeneration);
|
|
|
|
|
2015-10-26 15:38:25 +00:00
|
|
|
/**
|
|
|
|
* Adds a line of GLSL code to declare the default precision for float types.
|
|
|
|
*/
|
|
|
|
void GrGLSLAppendDefaultFloatPrecisionDeclaration(GrSLPrecision,
|
2016-11-29 18:43:05 +00:00
|
|
|
const GrShaderCaps&,
|
2015-10-26 15:38:25 +00:00
|
|
|
SkString* out);
|
|
|
|
|
2016-04-11 18:30:50 +00:00
|
|
|
/**
|
|
|
|
* Converts a GrSLPrecision to its corresponding GLSL precision qualifier.
|
|
|
|
*/
|
|
|
|
static inline const char* GrGLSLPrecisionString(GrSLPrecision p) {
|
|
|
|
switch (p) {
|
|
|
|
case kLow_GrSLPrecision:
|
|
|
|
return "lowp";
|
|
|
|
case kMedium_GrSLPrecision:
|
|
|
|
return "mediump";
|
|
|
|
case kHigh_GrSLPrecision:
|
|
|
|
return "highp";
|
2017-04-05 13:26:15 +00:00
|
|
|
case kDefault_GrSLPrecision:
|
|
|
|
return "";
|
2016-04-11 18:30:50 +00:00
|
|
|
default:
|
|
|
|
SkFAIL("Unexpected precision type.");
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-04-18 19:36:09 +00:00
|
|
|
/**
|
|
|
|
* Converts a GrSLType to a string containing the name of the equivalent GLSL type.
|
|
|
|
*/
|
Express (GLSL expression, possibly known value) pairs as a class
Express (GLSL expression, possibly known value) pairs as a class
instead of two variables Introduces GrGLSLExpr<N> to encapsulate
the expression and possibly constant-folded value of the expression.
This simplifies passing of the expressions to functions.
Changes the shaders with following patterns:
{ // Stage 0: Linear Gradient
vec4 colorTemp = mix(uGradientStartColor_Stage0, uGradientEndColor_Stage0, clamp(vMatrixCoord_Stage0.x, 0.0, 1
colorTemp.rgb *= colorTemp.a;
- output_Stage0 = vec4((vColor) * (colorTemp));
+ output_Stage0 = (vColor * colorTemp);
+ }
Previously the vector cast was always added if constant folding was
effective, regardless of the term dimensions. Now the vector upcast is
not inserted in places where it is not needed, ie. when the binary
operator term is of the target dimension.
Also, some parentheses can be omitted. It is assumed that
GrGLSLExpr<N>("string") constructors construct a simple expression or
parenthesized expression.
Otherwise the shader code remains identical.
R=jvanverth@google.com, bsalomon@google.com, robertphillips@google.com
Author: kkinnunen@nvidia.com
Review URL: https://codereview.chromium.org/25048002
git-svn-id: http://skia.googlecode.com/svn/trunk@11690 2bbb7eff-a529-9590-31e7-b0007b416f81
2013-10-10 06:30:18 +00:00
|
|
|
static inline const char* GrGLSLTypeString(GrSLType t) {
|
2013-04-18 19:36:09 +00:00
|
|
|
switch (t) {
|
|
|
|
case kVoid_GrSLType:
|
|
|
|
return "void";
|
|
|
|
case kFloat_GrSLType:
|
|
|
|
return "float";
|
|
|
|
case kVec2f_GrSLType:
|
|
|
|
return "vec2";
|
|
|
|
case kVec3f_GrSLType:
|
|
|
|
return "vec3";
|
|
|
|
case kVec4f_GrSLType:
|
|
|
|
return "vec4";
|
2017-02-08 19:56:27 +00:00
|
|
|
case kVec2i_GrSLType:
|
|
|
|
return "ivec2";
|
|
|
|
case kVec3i_GrSLType:
|
|
|
|
return "ivec3";
|
|
|
|
case kVec4i_GrSLType:
|
|
|
|
return "ivec4";
|
2016-03-07 23:39:09 +00:00
|
|
|
case kMat22f_GrSLType:
|
|
|
|
return "mat2";
|
2013-04-18 19:36:09 +00:00
|
|
|
case kMat33f_GrSLType:
|
|
|
|
return "mat3";
|
|
|
|
case kMat44f_GrSLType:
|
|
|
|
return "mat4";
|
Add Texture2D and Sampler GrSLTypes
These two new types are in support of Vulkan and the ability to send
separate texture and sampler uniforms to the shader. They don't really fit
well in the current system, since the current system ties together to idea
of intended use and how to emit shader code into the same GrSLType enum.
In vulkan, I want the GrGLSLSampler object to be used as a Sampler2D, but
when appending its declaration it will emit a Texture2D and sampler object.
Our query for GrSLTypeIsSamplerType refers more to the combination of texture
and sampler and not just the sampler part. The GrSLTypeIs2DTextureType query
is for is a a SamplerType that uses Texture2Ds. My new types don't really fit
into either these categories as they are just half of the whole.
In some refactoring down the road (possibly connected with SkSL), I suggest we
split apart the concept of how we intend to use a GrGLSLSampler (Sampler2D, SamplerBuffer,
etc.), from how we actually add it to the code (sampler, texture2D, sampler2D, etc.).
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2143143002
Review-Url: https://codereview.chromium.org/2143143002
2016-07-13 21:09:30 +00:00
|
|
|
case kTexture2DSampler_GrSLType:
|
2013-04-18 19:36:09 +00:00
|
|
|
return "sampler2D";
|
2016-11-16 17:55:57 +00:00
|
|
|
case kITexture2DSampler_GrSLType:
|
2016-11-11 21:08:03 +00:00
|
|
|
return "isampler2D";
|
Add Texture2D and Sampler GrSLTypes
These two new types are in support of Vulkan and the ability to send
separate texture and sampler uniforms to the shader. They don't really fit
well in the current system, since the current system ties together to idea
of intended use and how to emit shader code into the same GrSLType enum.
In vulkan, I want the GrGLSLSampler object to be used as a Sampler2D, but
when appending its declaration it will emit a Texture2D and sampler object.
Our query for GrSLTypeIsSamplerType refers more to the combination of texture
and sampler and not just the sampler part. The GrSLTypeIs2DTextureType query
is for is a a SamplerType that uses Texture2Ds. My new types don't really fit
into either these categories as they are just half of the whole.
In some refactoring down the road (possibly connected with SkSL), I suggest we
split apart the concept of how we intend to use a GrGLSLSampler (Sampler2D, SamplerBuffer,
etc.), from how we actually add it to the code (sampler, texture2D, sampler2D, etc.).
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2143143002
Review-Url: https://codereview.chromium.org/2143143002
2016-07-13 21:09:30 +00:00
|
|
|
case kTextureExternalSampler_GrSLType:
|
2015-11-22 22:51:00 +00:00
|
|
|
return "samplerExternalOES";
|
Add Texture2D and Sampler GrSLTypes
These two new types are in support of Vulkan and the ability to send
separate texture and sampler uniforms to the shader. They don't really fit
well in the current system, since the current system ties together to idea
of intended use and how to emit shader code into the same GrSLType enum.
In vulkan, I want the GrGLSLSampler object to be used as a Sampler2D, but
when appending its declaration it will emit a Texture2D and sampler object.
Our query for GrSLTypeIsSamplerType refers more to the combination of texture
and sampler and not just the sampler part. The GrSLTypeIs2DTextureType query
is for is a a SamplerType that uses Texture2Ds. My new types don't really fit
into either these categories as they are just half of the whole.
In some refactoring down the road (possibly connected with SkSL), I suggest we
split apart the concept of how we intend to use a GrGLSLSampler (Sampler2D, SamplerBuffer,
etc.), from how we actually add it to the code (sampler, texture2D, sampler2D, etc.).
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2143143002
Review-Url: https://codereview.chromium.org/2143143002
2016-07-13 21:09:30 +00:00
|
|
|
case kTexture2DRectSampler_GrSLType:
|
2016-01-14 17:24:09 +00:00
|
|
|
return "sampler2DRect";
|
2016-11-16 18:28:16 +00:00
|
|
|
case kBufferSampler_GrSLType:
|
2016-04-11 21:47:28 +00:00
|
|
|
return "samplerBuffer";
|
2016-01-30 17:59:10 +00:00
|
|
|
case kBool_GrSLType:
|
|
|
|
return "bool";
|
|
|
|
case kInt_GrSLType:
|
|
|
|
return "int";
|
2016-02-08 18:11:47 +00:00
|
|
|
case kUint_GrSLType:
|
|
|
|
return "uint";
|
Add Texture2D and Sampler GrSLTypes
These two new types are in support of Vulkan and the ability to send
separate texture and sampler uniforms to the shader. They don't really fit
well in the current system, since the current system ties together to idea
of intended use and how to emit shader code into the same GrSLType enum.
In vulkan, I want the GrGLSLSampler object to be used as a Sampler2D, but
when appending its declaration it will emit a Texture2D and sampler object.
Our query for GrSLTypeIsSamplerType refers more to the combination of texture
and sampler and not just the sampler part. The GrSLTypeIs2DTextureType query
is for is a a SamplerType that uses Texture2Ds. My new types don't really fit
into either these categories as they are just half of the whole.
In some refactoring down the road (possibly connected with SkSL), I suggest we
split apart the concept of how we intend to use a GrGLSLSampler (Sampler2D, SamplerBuffer,
etc.), from how we actually add it to the code (sampler, texture2D, sampler2D, etc.).
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2143143002
Review-Url: https://codereview.chromium.org/2143143002
2016-07-13 21:09:30 +00:00
|
|
|
case kTexture2D_GrSLType:
|
|
|
|
return "texture2D";
|
|
|
|
case kSampler_GrSLType:
|
|
|
|
return "sampler";
|
2016-11-29 16:59:17 +00:00
|
|
|
case kImageStorage2D_GrSLType:
|
|
|
|
return "image2D";
|
|
|
|
case kIImageStorage2D_GrSLType:
|
|
|
|
return "iimage2D";
|
2013-04-18 19:36:09 +00:00
|
|
|
}
|
2016-11-11 21:08:03 +00:00
|
|
|
SkFAIL("Unknown shader var type.");
|
|
|
|
return ""; // suppress warning
|
2013-04-18 19:36:09 +00:00
|
|
|
}
|
2012-02-10 15:56:06 +00:00
|
|
|
|
|
|
|
#endif
|