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:
|
2017-08-16 14:53:04 +00:00
|
|
|
SK_ABORT("Unexpected precision type.");
|
2016-04-11 18:30:50 +00:00
|
|
|
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";
|
2017-08-16 20:41:30 +00:00
|
|
|
case kHighFloat_GrSLType:
|
|
|
|
return "highfloat";
|
|
|
|
case kHighFloat2_GrSLType:
|
|
|
|
return "highfloat2";
|
|
|
|
case kHighFloat3_GrSLType:
|
|
|
|
return "highfloat3";
|
|
|
|
case kHighFloat4_GrSLType:
|
|
|
|
return "highfloat4";
|
|
|
|
case kHalf_GrSLType:
|
|
|
|
return "half";
|
|
|
|
case kHalf2_GrSLType:
|
|
|
|
return "half2";
|
|
|
|
case kHalf3_GrSLType:
|
|
|
|
return "half3";
|
|
|
|
case kHalf4_GrSLType:
|
|
|
|
return "half4";
|
|
|
|
case kHighFloat2x2_GrSLType:
|
|
|
|
return "highfloat2x2";
|
|
|
|
case kHighFloat3x3_GrSLType:
|
|
|
|
return "highfloat3x3";
|
|
|
|
case kHighFloat4x4_GrSLType:
|
|
|
|
return "highfloat4x4";
|
|
|
|
case kHalf2x2_GrSLType:
|
|
|
|
return "half2x2";
|
|
|
|
case kHalf3x3_GrSLType:
|
|
|
|
return "half3x3";
|
|
|
|
case kHalf4x4_GrSLType:
|
|
|
|
return "half4x4";
|
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";
|
2017-08-16 20:41:30 +00:00
|
|
|
case kShort_GrSLType:
|
|
|
|
return "short";
|
|
|
|
case kUShort_GrSLType:
|
|
|
|
return "ushort";
|
2016-01-30 17:59:10 +00:00
|
|
|
case kInt_GrSLType:
|
|
|
|
return "int";
|
2017-08-16 20:41:30 +00:00
|
|
|
case kInt2_GrSLType:
|
|
|
|
return "int2";
|
|
|
|
case kInt3_GrSLType:
|
|
|
|
return "int3";
|
|
|
|
case kInt4_GrSLType:
|
|
|
|
return "int4";
|
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
|
|
|
}
|
2017-08-16 14:53:04 +00:00
|
|
|
SK_ABORT("Unknown shader var type.");
|
2016-11-11 21:08:03 +00:00
|
|
|
return ""; // suppress warning
|
2013-04-18 19:36:09 +00:00
|
|
|
}
|
2012-02-10 15:56:06 +00:00
|
|
|
|
|
|
|
#endif
|