Commit e93d24ef by Martin Radev Committed by Commit Bot

Add es3.1 shader constants

The patch adds all shader built-in constants. BUG=angleproject:1442 TEST=angle_unittests TEST=angle_end2end_tests Change-Id: I81cae479d6506a8faa2dce023d5fcc2c1291d521 Reviewed-on: https://chromium-review.googlesource.com/364460Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
parent 3cbb27a1
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include "KHR/khrplatform.h" #include "KHR/khrplatform.h"
#include <array>
#include <map> #include <map>
#include <string> #include <string>
#include <vector> #include <vector>
...@@ -48,7 +49,7 @@ typedef unsigned int GLenum; ...@@ -48,7 +49,7 @@ typedef unsigned int GLenum;
// Version number for shader translation API. // Version number for shader translation API.
// It is incremented every time the API changes. // It is incremented every time the API changes.
#define ANGLE_SH_VERSION 151 #define ANGLE_SH_VERSION 152
typedef enum { typedef enum {
SH_GLES2_SPEC, SH_GLES2_SPEC,
...@@ -318,6 +319,68 @@ typedef struct ...@@ -318,6 +319,68 @@ typedef struct
// The maximum number of parameters a function can have when SH_LIMIT_EXPRESSION_COMPLEXITY is // The maximum number of parameters a function can have when SH_LIMIT_EXPRESSION_COMPLEXITY is
// turned on. // turned on.
int MaxFunctionParameters; int MaxFunctionParameters;
// GLES 3.1 constants
// maximum number of available image units
int MaxImageUnits;
// maximum number of image uniforms in a vertex shader
int MaxVertexImageUniforms;
// maximum number of image uniforms in a fragment shader
int MaxFragmentImageUniforms;
// maximum number of image uniforms in a compute shader
int MaxComputeImageUniforms;
// maximum total number of image uniforms in a program
int MaxCombinedImageUniforms;
// maximum number of ssbos and images in a shader
int MaxCombinedShaderOutputResources;
// maximum number of groups in each dimension
std::array<int, 3> MaxComputeWorkGroupCount;
// maximum number of threads per work group in each dimension
std::array<int, 3> MaxComputeWorkGroupSize;
// maximum number of total uniform components
int MaxComputeUniformComponents;
// maximum number of texture image units in a compute shader
int MaxComputeTextureImageUnits;
// maximum number of atomic counters in a compute shader
int MaxComputeAtomicCounters;
// maximum number of atomic counter buffers in a compute shader
int MaxComputeAtomicCounterBuffers;
// maximum number of atomic counters in a vertex shader
int MaxVertexAtomicCounters;
// maximum number of atomic counters in a fragment shader
int MaxFragmentAtomicCounters;
// maximum number of atomic counters in a program
int MaxCombinedAtomicCounters;
// maximum binding for an atomic counter
int MaxAtomicCounterBindings;
// maximum number of atomic counter buffers in a vertex shader
int MaxVertexAtomicCounterBuffers;
// maximum number of atomic counter buffers in a fragment shader
int MaxFragmentAtomicCounterBuffers;
// maximum number of atomic counter buffers in a program
int MaxCombinedAtomicCounterBuffers;
// maximum number of buffer object storage in machine units
int MaxAtomicCounterBufferSize;
} ShBuiltInResources; } ShBuiltInResources;
// //
......
...@@ -427,6 +427,7 @@ bool TCompiler::InitBuiltInSymbolTable(const ShBuiltInResources &resources) ...@@ -427,6 +427,7 @@ bool TCompiler::InitBuiltInSymbolTable(const ShBuiltInResources &resources)
symbolTable.push(); // COMMON_BUILTINS symbolTable.push(); // COMMON_BUILTINS
symbolTable.push(); // ESSL1_BUILTINS symbolTable.push(); // ESSL1_BUILTINS
symbolTable.push(); // ESSL3_BUILTINS symbolTable.push(); // ESSL3_BUILTINS
symbolTable.push(); // ESSL3_1_BUILTINS
TPublicType integer; TPublicType integer;
integer.type = EbtInt; integer.type = EbtInt;
...@@ -515,7 +516,31 @@ void TCompiler::setResourceString() ...@@ -515,7 +516,31 @@ void TCompiler::setResourceString()
<< ":MaxProgramTexelOffset:" << compileResources.MaxProgramTexelOffset << ":MaxProgramTexelOffset:" << compileResources.MaxProgramTexelOffset
<< ":MaxDualSourceDrawBuffers:" << compileResources.MaxDualSourceDrawBuffers << ":MaxDualSourceDrawBuffers:" << compileResources.MaxDualSourceDrawBuffers
<< ":NV_draw_buffers:" << compileResources.NV_draw_buffers << ":NV_draw_buffers:" << compileResources.NV_draw_buffers
<< ":WEBGL_debug_shader_precision:" << compileResources.WEBGL_debug_shader_precision; << ":WEBGL_debug_shader_precision:" << compileResources.WEBGL_debug_shader_precision
<< ":MaxImageUnits:" << compileResources.MaxImageUnits
<< ":MaxVertexImageUniforms:" << compileResources.MaxVertexImageUniforms
<< ":MaxFragmentImageUniforms:" << compileResources.MaxFragmentImageUniforms
<< ":MaxComputeImageUniforms:" << compileResources.MaxComputeImageUniforms
<< ":MaxCombinedImageUniforms:" << compileResources.MaxCombinedImageUniforms
<< ":MaxCombinedShaderOutputResources:" << compileResources.MaxCombinedShaderOutputResources
<< ":MaxComputeWorkGroupCountX:" << compileResources.MaxComputeWorkGroupCount[0]
<< ":MaxComputeWorkGroupCountY:" << compileResources.MaxComputeWorkGroupCount[1]
<< ":MaxComputeWorkGroupCountZ:" << compileResources.MaxComputeWorkGroupCount[2]
<< ":MaxComputeWorkGroupSizeX:" << compileResources.MaxComputeWorkGroupSize[0]
<< ":MaxComputeWorkGroupSizeY:" << compileResources.MaxComputeWorkGroupSize[1]
<< ":MaxComputeWorkGroupSizeZ:" << compileResources.MaxComputeWorkGroupSize[2]
<< ":MaxComputeUniformComponents:" << compileResources.MaxComputeUniformComponents
<< ":MaxComputeTextureImageUnits:" << compileResources.MaxComputeTextureImageUnits
<< ":MaxComputeAtomicCounters:" << compileResources.MaxComputeAtomicCounters
<< ":MaxComputeAtomicCounterBuffers:" << compileResources.MaxComputeAtomicCounterBuffers
<< ":MaxVertexAtomicCounters:" << compileResources.MaxVertexAtomicCounters
<< ":MaxFragmentAtomicCounters:" << compileResources.MaxFragmentAtomicCounters
<< ":MaxCombinedAtomicCounters:" << compileResources.MaxCombinedAtomicCounters
<< ":MaxAtomicCounterBindings:" << compileResources.MaxAtomicCounterBindings
<< ":MaxVertexAtomicCounterBuffers:" << compileResources.MaxVertexAtomicCounterBuffers
<< ":MaxFragmentAtomicCounterBuffers:" << compileResources.MaxFragmentAtomicCounterBuffers
<< ":MaxCombinedAtomicCounterBuffers:" << compileResources.MaxCombinedAtomicCounterBuffers
<< ":MaxAtomicCounterBufferSize:" << compileResources.MaxAtomicCounterBufferSize;
// clang-format on // clang-format on
builtInResourcesString = strstream.str(); builtInResourcesString = strstream.str();
......
...@@ -495,18 +495,26 @@ void InsertBuiltInFunctions(sh::GLenum type, ShShaderSpec spec, const ShBuiltInR ...@@ -495,18 +495,26 @@ void InsertBuiltInFunctions(sh::GLenum type, ShShaderSpec spec, const ShBuiltInR
// //
// Implementation dependent built-in constants. // Implementation dependent built-in constants.
// //
symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxVertexAttribs", resources.MaxVertexAttribs); symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxVertexAttribs", resources.MaxVertexAttribs,
symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxVertexUniformVectors", resources.MaxVertexUniformVectors); EbpMedium);
symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxVertexTextureImageUnits", resources.MaxVertexTextureImageUnits); symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxVertexUniformVectors",
symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxCombinedTextureImageUnits", resources.MaxCombinedTextureImageUnits); resources.MaxVertexUniformVectors, EbpMedium);
symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxTextureImageUnits", resources.MaxTextureImageUnits); symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxVertexTextureImageUnits",
symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxFragmentUniformVectors", resources.MaxFragmentUniformVectors); resources.MaxVertexTextureImageUnits, EbpMedium);
symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxCombinedTextureImageUnits",
symbolTable.insertConstInt(ESSL1_BUILTINS, "gl_MaxVaryingVectors", resources.MaxVaryingVectors); resources.MaxCombinedTextureImageUnits, EbpMedium);
symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxTextureImageUnits",
resources.MaxTextureImageUnits, EbpMedium);
symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxFragmentUniformVectors",
resources.MaxFragmentUniformVectors, EbpMedium);
symbolTable.insertConstInt(ESSL1_BUILTINS, "gl_MaxVaryingVectors", resources.MaxVaryingVectors,
EbpMedium);
if (spec != SH_CSS_SHADERS_SPEC) if (spec != SH_CSS_SHADERS_SPEC)
{ {
symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxDrawBuffers", resources.MaxDrawBuffers); symbolTable.insertConstInt(COMMON_BUILTINS, "gl_MaxDrawBuffers", resources.MaxDrawBuffers,
EbpMedium);
if (resources.EXT_blend_func_extended) if (resources.EXT_blend_func_extended)
{ {
symbolTable.insertConstIntExt(COMMON_BUILTINS, "GL_EXT_blend_func_extended", symbolTable.insertConstIntExt(COMMON_BUILTINS, "GL_EXT_blend_func_extended",
...@@ -515,10 +523,60 @@ void InsertBuiltInFunctions(sh::GLenum type, ShShaderSpec spec, const ShBuiltInR ...@@ -515,10 +523,60 @@ void InsertBuiltInFunctions(sh::GLenum type, ShShaderSpec spec, const ShBuiltInR
} }
} }
symbolTable.insertConstInt(ESSL3_BUILTINS, "gl_MaxVertexOutputVectors", resources.MaxVertexOutputVectors); symbolTable.insertConstInt(ESSL3_BUILTINS, "gl_MaxVertexOutputVectors",
symbolTable.insertConstInt(ESSL3_BUILTINS, "gl_MaxFragmentInputVectors", resources.MaxFragmentInputVectors); resources.MaxVertexOutputVectors, EbpMedium);
symbolTable.insertConstInt(ESSL3_BUILTINS, "gl_MinProgramTexelOffset", resources.MinProgramTexelOffset); symbolTable.insertConstInt(ESSL3_BUILTINS, "gl_MaxFragmentInputVectors",
symbolTable.insertConstInt(ESSL3_BUILTINS, "gl_MaxProgramTexelOffset", resources.MaxProgramTexelOffset); resources.MaxFragmentInputVectors, EbpMedium);
symbolTable.insertConstInt(ESSL3_BUILTINS, "gl_MinProgramTexelOffset",
resources.MinProgramTexelOffset, EbpMedium);
symbolTable.insertConstInt(ESSL3_BUILTINS, "gl_MaxProgramTexelOffset",
resources.MaxProgramTexelOffset, EbpMedium);
symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxImageUnits", resources.MaxImageUnits,
EbpMedium);
symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxVertexImageUniforms",
resources.MaxVertexImageUniforms, EbpMedium);
symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxFragmentImageUniforms",
resources.MaxFragmentImageUniforms, EbpMedium);
symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxComputeImageUniforms",
resources.MaxComputeImageUniforms, EbpMedium);
symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxCombinedImageUniforms",
resources.MaxCombinedImageUniforms, EbpMedium);
symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxCombinedShaderOutputResources",
resources.MaxCombinedShaderOutputResources, EbpMedium);
symbolTable.insertConstIvec3(ESSL3_1_BUILTINS, "gl_MaxComputeWorkGroupCount",
resources.MaxComputeWorkGroupCount, EbpHigh);
symbolTable.insertConstIvec3(ESSL3_1_BUILTINS, "gl_MaxComputeWorkGroupSize",
resources.MaxComputeWorkGroupSize, EbpHigh);
symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxComputeUniformComponents",
resources.MaxComputeUniformComponents, EbpMedium);
symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxComputeTextureImageUnits",
resources.MaxComputeTextureImageUnits, EbpMedium);
symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxComputeAtomicCounters",
resources.MaxComputeAtomicCounters, EbpMedium);
symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxComputeAtomicCounterBuffers",
resources.MaxComputeAtomicCounterBuffers, EbpMedium);
symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxVertexAtomicCounters",
resources.MaxVertexAtomicCounters, EbpMedium);
symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxFragmentAtomicCounters",
resources.MaxFragmentAtomicCounters, EbpMedium);
symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxCombinedAtomicCounters",
resources.MaxCombinedAtomicCounters, EbpMedium);
symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxAtomicCounterBindings",
resources.MaxAtomicCounterBindings, EbpMedium);
symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxVertexAtomicCounterBuffers",
resources.MaxVertexAtomicCounterBuffers, EbpMedium);
symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxFragmentAtomicCounterBuffers",
resources.MaxFragmentAtomicCounterBuffers, EbpMedium);
symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxCombinedAtomicCounterBuffers",
resources.MaxCombinedAtomicCounterBuffers, EbpMedium);
symbolTable.insertConstInt(ESSL3_1_BUILTINS, "gl_MaxAtomicCounterBufferSize",
resources.MaxAtomicCounterBufferSize, EbpMedium);
} }
void IdentifyBuiltIns(sh::GLenum type, ShShaderSpec spec, void IdentifyBuiltIns(sh::GLenum type, ShShaderSpec spec,
......
...@@ -182,6 +182,37 @@ void ShInitBuiltInResources(ShBuiltInResources* resources) ...@@ -182,6 +182,37 @@ void ShInitBuiltInResources(ShBuiltInResources* resources)
resources->MaxExpressionComplexity = 256; resources->MaxExpressionComplexity = 256;
resources->MaxCallStackDepth = 256; resources->MaxCallStackDepth = 256;
resources->MaxFunctionParameters = 1024; resources->MaxFunctionParameters = 1024;
// ES 3.1 Revision 4, 7.2 Built-in Constants
resources->MaxImageUnits = 4;
resources->MaxVertexImageUniforms = 0;
resources->MaxFragmentImageUniforms = 0;
resources->MaxComputeImageUniforms = 4;
resources->MaxCombinedImageUniforms = 4;
resources->MaxCombinedShaderOutputResources = 4;
resources->MaxComputeWorkGroupCount[0] = 65535;
resources->MaxComputeWorkGroupCount[1] = 65535;
resources->MaxComputeWorkGroupCount[2] = 65535;
resources->MaxComputeWorkGroupSize[0] = 128;
resources->MaxComputeWorkGroupSize[1] = 128;
resources->MaxComputeWorkGroupSize[2] = 64;
resources->MaxComputeUniformComponents = 512;
resources->MaxComputeTextureImageUnits = 16;
resources->MaxComputeAtomicCounters = 8;
resources->MaxComputeAtomicCounterBuffers = 1;
resources->MaxVertexAtomicCounters = 0;
resources->MaxFragmentAtomicCounters = 0;
resources->MaxCombinedAtomicCounters = 8;
resources->MaxAtomicCounterBindings = 1;
resources->MaxVertexAtomicCounterBuffers = 0;
resources->MaxFragmentAtomicCounterBuffers = 0;
resources->MaxCombinedAtomicCounterBuffers = 1;
resources->MaxAtomicCounterBufferSize = 32;
} }
// //
......
...@@ -88,7 +88,9 @@ TSymbol *TSymbolTable::find(const TString &name, int shaderVersion, ...@@ -88,7 +88,9 @@ TSymbol *TSymbolTable::find(const TString &name, int shaderVersion,
do do
{ {
if (level == ESSL3_BUILTINS && shaderVersion != 300) if (level == ESSL3_1_BUILTINS && shaderVersion != 310)
level--;
if (level == ESSL3_BUILTINS && shaderVersion < 300)
level--; level--;
if (level == ESSL1_BUILTINS && shaderVersion != 100) if (level == ESSL1_BUILTINS && shaderVersion != 100)
level--; level--;
...@@ -110,7 +112,9 @@ TSymbol *TSymbolTable::findBuiltIn( ...@@ -110,7 +112,9 @@ TSymbol *TSymbolTable::findBuiltIn(
{ {
for (int level = LAST_BUILTIN_LEVEL; level >= 0; level--) for (int level = LAST_BUILTIN_LEVEL; level >= 0; level--)
{ {
if (level == ESSL3_BUILTINS && shaderVersion != 300) if (level == ESSL3_1_BUILTINS && shaderVersion != 310)
level--;
if (level == ESSL3_BUILTINS && shaderVersion < 300)
level--; level--;
if (level == ESSL1_BUILTINS && shaderVersion != 100) if (level == ESSL1_BUILTINS && shaderVersion != 100)
level--; level--;
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
// are tracked in the intermediate representation, not the symbol table. // are tracked in the intermediate representation, not the symbol table.
// //
#include <array>
#include <assert.h> #include <assert.h>
#include <set> #include <set>
...@@ -317,8 +318,9 @@ typedef int ESymbolLevel; ...@@ -317,8 +318,9 @@ typedef int ESymbolLevel;
const int COMMON_BUILTINS = 0; const int COMMON_BUILTINS = 0;
const int ESSL1_BUILTINS = 1; const int ESSL1_BUILTINS = 1;
const int ESSL3_BUILTINS = 2; const int ESSL3_BUILTINS = 2;
const int LAST_BUILTIN_LEVEL = ESSL3_BUILTINS; const int ESSL3_1_BUILTINS = 3;
const int GLOBAL_LEVEL = 3; const int LAST_BUILTIN_LEVEL = ESSL3_1_BUILTINS;
const int GLOBAL_LEVEL = 4;
class TSymbolTable : angle::NonCopyable class TSymbolTable : angle::NonCopyable
{ {
...@@ -379,10 +381,10 @@ class TSymbolTable : angle::NonCopyable ...@@ -379,10 +381,10 @@ class TSymbolTable : angle::NonCopyable
return table[level]->insert(symbol); return table[level]->insert(symbol);
} }
bool insertConstInt(ESymbolLevel level, const char *name, int value) bool insertConstInt(ESymbolLevel level, const char *name, int value, TPrecision precision)
{ {
TVariable *constant = new TVariable( TVariable *constant =
NewPoolTString(name), TType(EbtInt, EbpUndefined, EvqConst, 1)); new TVariable(NewPoolTString(name), TType(EbtInt, precision, EvqConst, 1));
TConstantUnion *unionArray = new TConstantUnion[1]; TConstantUnion *unionArray = new TConstantUnion[1];
unionArray[0].setIConst(value); unionArray[0].setIConst(value);
constant->shareConstPointer(unionArray); constant->shareConstPointer(unionArray);
...@@ -399,6 +401,24 @@ class TSymbolTable : angle::NonCopyable ...@@ -399,6 +401,24 @@ class TSymbolTable : angle::NonCopyable
return insert(level, ext, constant); return insert(level, ext, constant);
} }
bool insertConstIvec3(ESymbolLevel level,
const char *name,
const std::array<int, 3> &values,
TPrecision precision)
{
TVariable *constantIvec3 =
new TVariable(NewPoolTString(name), TType(EbtInt, precision, EvqConst, 3));
TConstantUnion *unionArray = new TConstantUnion[3];
for (size_t index = 0u; index < 3u; ++index)
{
unionArray[index].setIConst(values[index]);
}
constantIvec3->shareConstPointer(unionArray);
return insert(level, constantIvec3);
}
void insertBuiltIn(ESymbolLevel level, TOperator op, const char *ext, const TType *rvalue, const char *name, void insertBuiltIn(ESymbolLevel level, TOperator op, const char *ext, const TType *rvalue, const char *name,
const TType *ptype1, const TType *ptype2 = 0, const TType *ptype3 = 0, const TType *ptype4 = 0, const TType *ptype5 = 0); const TType *ptype1, const TType *ptype2 = 0, const TType *ptype3 = 0, const TType *ptype4 = 0, const TType *ptype5 = 0);
......
...@@ -78,6 +78,35 @@ Compiler::Compiler(rx::GLImplFactory *implFactory, const ContextState &state) ...@@ -78,6 +78,35 @@ Compiler::Compiler(rx::GLImplFactory *implFactory, const ContextState &state)
mResources.MaxFragmentInputVectors = caps.maxFragmentInputComponents / 4; mResources.MaxFragmentInputVectors = caps.maxFragmentInputComponents / 4;
mResources.MinProgramTexelOffset = caps.minProgramTexelOffset; mResources.MinProgramTexelOffset = caps.minProgramTexelOffset;
mResources.MaxProgramTexelOffset = caps.maxProgramTexelOffset; mResources.MaxProgramTexelOffset = caps.maxProgramTexelOffset;
// GLSL ES 3.1 compute shader constants
mResources.MaxImageUnits = caps.maxImageUnits;
mResources.MaxVertexImageUniforms = caps.maxVertexImageUniforms;
mResources.MaxFragmentImageUniforms = caps.maxFragmentImageUniforms;
mResources.MaxComputeImageUniforms = caps.maxComputeImageUniforms;
mResources.MaxCombinedImageUniforms = caps.maxCombinedImageUniforms;
mResources.MaxCombinedShaderOutputResources = caps.maxCombinedShaderOutputResources;
for (size_t index = 0u; index < 3u; ++index)
{
mResources.MaxComputeWorkGroupCount[index] = caps.maxComputeWorkGroupCount[index];
mResources.MaxComputeWorkGroupSize[index] = caps.maxComputeWorkGroupSize[index];
}
mResources.MaxComputeUniformComponents = caps.maxComputeUniformComponents;
mResources.MaxComputeTextureImageUnits = caps.maxComputeTextureImageUnits;
mResources.MaxComputeAtomicCounters = caps.maxComputeAtomicCounters;
mResources.MaxComputeAtomicCounterBuffers = caps.maxComputeAtomicCounterBuffers;
mResources.MaxVertexAtomicCounters = caps.maxVertexAtomicCounters;
mResources.MaxFragmentAtomicCounters = caps.maxFragmentAtomicCounters;
mResources.MaxCombinedAtomicCounters = caps.maxCombinedAtomicCounters;
mResources.MaxAtomicCounterBindings = caps.maxAtomicCounterBufferBindings;
mResources.MaxVertexAtomicCounterBuffers = caps.maxVertexAtomicCounterBuffers;
mResources.MaxFragmentAtomicCounterBuffers = caps.maxFragmentAtomicCounterBuffers;
mResources.MaxCombinedAtomicCounterBuffers = caps.maxCombinedAtomicCounterBuffers;
mResources.MaxAtomicCounterBufferSize = caps.maxAtomicCounterBufferSize;
} }
Compiler::~Compiler() Compiler::~Compiler()
......
...@@ -1655,3 +1655,20 @@ TEST_F(MalformedShaderTest, LineDirectiveNegativeShift) ...@@ -1655,3 +1655,20 @@ TEST_F(MalformedShaderTest, LineDirectiveNegativeShift)
FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog; FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog;
} }
} }
// gl_MaxImageUnits is only available in ES 3.1 shaders
TEST_F(MalformedShaderTest, MaxImageUnitsInES3Shader)
{
const std::string &shaderString =
"#version 300 es\n"
"precision mediump float;\n"
"out vec4 myOutput;"
"void main() {\n"
" float ff = float(gl_MaxImageUnits);\n"
" myOutput = vec4(ff);\n"
"}\n";
if (compile(shaderString))
{
FAIL() << "Shader compilation succeeded, expecting failure " << mInfoLog;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment