Commit 4021932f by JiangYizhou Committed by Commit Bot

translator: Add ES3.1 multisample texture support.

Implement shader objects, [iu]sampler2DMS, textureSize(gsampler2DMS). as well as texelFetch(gsampler2DMS,P,sample) for the glsl. BUG=angleproject:1590 TEST=angle_unittests TEST=angle_end2end_tests Change-Id: I781023f7bec34ad0264af69f34bb182b50bd1fbd Reviewed-on: https://chromium-review.googlesource.com/423175 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarOlli Etuaho <oetuaho@nvidia.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 80ab03c5
...@@ -429,6 +429,15 @@ void PrintVariable(const std::string &prefix, size_t index, const sh::ShaderVari ...@@ -429,6 +429,15 @@ void PrintVariable(const std::string &prefix, size_t index, const sh::ShaderVari
case GL_FLOAT_MAT3x4: typeName = "GL_FLOAT_MAT3x4"; break; case GL_FLOAT_MAT3x4: typeName = "GL_FLOAT_MAT3x4"; break;
case GL_FLOAT_MAT4x3: typeName = "GL_FLOAT_MAT4x3"; break; case GL_FLOAT_MAT4x3: typeName = "GL_FLOAT_MAT4x3"; break;
case GL_SAMPLER_2D: typeName = "GL_SAMPLER_2D"; break; case GL_SAMPLER_2D: typeName = "GL_SAMPLER_2D"; break;
case GL_SAMPLER_2D_MULTISAMPLE:
typeName = "GL_SAMPLER_2D_MULTISAMPLE";
break;
case GL_INT_SAMPLER_2D_MULTISAMPLE:
typeName = "GL_INT_SAMPLER_2D_MULTISAMPLE";
break;
case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
typeName = "GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE";
break;
case GL_SAMPLER_CUBE: typeName = "GL_SAMPLER_CUBE"; break; case GL_SAMPLER_CUBE: typeName = "GL_SAMPLER_CUBE"; break;
case GL_SAMPLER_EXTERNAL_OES: typeName = "GL_SAMPLER_EXTERNAL_OES"; break; case GL_SAMPLER_EXTERNAL_OES: typeName = "GL_SAMPLER_EXTERNAL_OES"; break;
default: typeName = "UNKNOWN"; break; default: typeName = "UNKNOWN"; break;
......
...@@ -128,14 +128,17 @@ GLenum VariableComponentType(GLenum type) ...@@ -128,14 +128,17 @@ GLenum VariableComponentType(GLenum type)
case GL_SAMPLER_CUBE: case GL_SAMPLER_CUBE:
case GL_SAMPLER_2D_ARRAY: case GL_SAMPLER_2D_ARRAY:
case GL_SAMPLER_EXTERNAL_OES: case GL_SAMPLER_EXTERNAL_OES:
case GL_SAMPLER_2D_MULTISAMPLE:
case GL_INT_SAMPLER_2D: case GL_INT_SAMPLER_2D:
case GL_INT_SAMPLER_3D: case GL_INT_SAMPLER_3D:
case GL_INT_SAMPLER_CUBE: case GL_INT_SAMPLER_CUBE:
case GL_INT_SAMPLER_2D_ARRAY: case GL_INT_SAMPLER_2D_ARRAY:
case GL_INT_SAMPLER_2D_MULTISAMPLE:
case GL_UNSIGNED_INT_SAMPLER_2D: case GL_UNSIGNED_INT_SAMPLER_2D:
case GL_UNSIGNED_INT_SAMPLER_3D: case GL_UNSIGNED_INT_SAMPLER_3D:
case GL_UNSIGNED_INT_SAMPLER_CUBE: case GL_UNSIGNED_INT_SAMPLER_CUBE:
case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
case GL_SAMPLER_2D_SHADOW: case GL_SAMPLER_2D_SHADOW:
case GL_SAMPLER_CUBE_SHADOW: case GL_SAMPLER_CUBE_SHADOW:
case GL_SAMPLER_2D_ARRAY_SHADOW: case GL_SAMPLER_2D_ARRAY_SHADOW:
...@@ -236,14 +239,17 @@ int VariableRowCount(GLenum type) ...@@ -236,14 +239,17 @@ int VariableRowCount(GLenum type)
case GL_SAMPLER_2D_ARRAY: case GL_SAMPLER_2D_ARRAY:
case GL_SAMPLER_EXTERNAL_OES: case GL_SAMPLER_EXTERNAL_OES:
case GL_SAMPLER_2D_RECT_ARB: case GL_SAMPLER_2D_RECT_ARB:
case GL_SAMPLER_2D_MULTISAMPLE:
case GL_INT_SAMPLER_2D: case GL_INT_SAMPLER_2D:
case GL_INT_SAMPLER_3D: case GL_INT_SAMPLER_3D:
case GL_INT_SAMPLER_CUBE: case GL_INT_SAMPLER_CUBE:
case GL_INT_SAMPLER_2D_ARRAY: case GL_INT_SAMPLER_2D_ARRAY:
case GL_INT_SAMPLER_2D_MULTISAMPLE:
case GL_UNSIGNED_INT_SAMPLER_2D: case GL_UNSIGNED_INT_SAMPLER_2D:
case GL_UNSIGNED_INT_SAMPLER_3D: case GL_UNSIGNED_INT_SAMPLER_3D:
case GL_UNSIGNED_INT_SAMPLER_CUBE: case GL_UNSIGNED_INT_SAMPLER_CUBE:
case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
case GL_SAMPLER_2D_SHADOW: case GL_SAMPLER_2D_SHADOW:
case GL_SAMPLER_CUBE_SHADOW: case GL_SAMPLER_CUBE_SHADOW:
case GL_SAMPLER_2D_ARRAY_SHADOW: case GL_SAMPLER_2D_ARRAY_SHADOW:
...@@ -294,16 +300,19 @@ int VariableColumnCount(GLenum type) ...@@ -294,16 +300,19 @@ int VariableColumnCount(GLenum type)
case GL_SAMPLER_3D: case GL_SAMPLER_3D:
case GL_SAMPLER_CUBE: case GL_SAMPLER_CUBE:
case GL_SAMPLER_2D_ARRAY: case GL_SAMPLER_2D_ARRAY:
case GL_SAMPLER_2D_MULTISAMPLE:
case GL_INT_SAMPLER_2D: case GL_INT_SAMPLER_2D:
case GL_INT_SAMPLER_3D: case GL_INT_SAMPLER_3D:
case GL_INT_SAMPLER_CUBE: case GL_INT_SAMPLER_CUBE:
case GL_INT_SAMPLER_2D_ARRAY: case GL_INT_SAMPLER_2D_ARRAY:
case GL_INT_SAMPLER_2D_MULTISAMPLE:
case GL_SAMPLER_EXTERNAL_OES: case GL_SAMPLER_EXTERNAL_OES:
case GL_SAMPLER_2D_RECT_ARB: case GL_SAMPLER_2D_RECT_ARB:
case GL_UNSIGNED_INT_SAMPLER_2D: case GL_UNSIGNED_INT_SAMPLER_2D:
case GL_UNSIGNED_INT_SAMPLER_3D: case GL_UNSIGNED_INT_SAMPLER_3D:
case GL_UNSIGNED_INT_SAMPLER_CUBE: case GL_UNSIGNED_INT_SAMPLER_CUBE:
case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
case GL_SAMPLER_2D_SHADOW: case GL_SAMPLER_2D_SHADOW:
case GL_SAMPLER_CUBE_SHADOW: case GL_SAMPLER_CUBE_SHADOW:
case GL_SAMPLER_2D_ARRAY_SHADOW: case GL_SAMPLER_2D_ARRAY_SHADOW:
...@@ -348,14 +357,17 @@ bool IsSamplerType(GLenum type) ...@@ -348,14 +357,17 @@ bool IsSamplerType(GLenum type)
case GL_SAMPLER_CUBE: case GL_SAMPLER_CUBE:
case GL_SAMPLER_2D_ARRAY: case GL_SAMPLER_2D_ARRAY:
case GL_SAMPLER_EXTERNAL_OES: case GL_SAMPLER_EXTERNAL_OES:
case GL_SAMPLER_2D_MULTISAMPLE:
case GL_INT_SAMPLER_2D: case GL_INT_SAMPLER_2D:
case GL_INT_SAMPLER_3D: case GL_INT_SAMPLER_3D:
case GL_INT_SAMPLER_CUBE: case GL_INT_SAMPLER_CUBE:
case GL_INT_SAMPLER_2D_ARRAY: case GL_INT_SAMPLER_2D_ARRAY:
case GL_INT_SAMPLER_2D_MULTISAMPLE:
case GL_UNSIGNED_INT_SAMPLER_2D: case GL_UNSIGNED_INT_SAMPLER_2D:
case GL_UNSIGNED_INT_SAMPLER_3D: case GL_UNSIGNED_INT_SAMPLER_3D:
case GL_UNSIGNED_INT_SAMPLER_CUBE: case GL_UNSIGNED_INT_SAMPLER_CUBE:
case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
case GL_SAMPLER_2D_SHADOW: case GL_SAMPLER_2D_SHADOW:
case GL_SAMPLER_CUBE_SHADOW: case GL_SAMPLER_CUBE_SHADOW:
case GL_SAMPLER_2D_ARRAY_SHADOW: case GL_SAMPLER_2D_ARRAY_SHADOW:
...@@ -395,6 +407,11 @@ GLenum SamplerTypeToTextureType(GLenum samplerType) ...@@ -395,6 +407,11 @@ GLenum SamplerTypeToTextureType(GLenum samplerType)
case GL_UNSIGNED_INT_SAMPLER_3D: case GL_UNSIGNED_INT_SAMPLER_3D:
return GL_TEXTURE_3D; return GL_TEXTURE_3D;
case GL_SAMPLER_2D_MULTISAMPLE:
case GL_INT_SAMPLER_2D_MULTISAMPLE:
case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
return GL_TEXTURE_2D_MULTISAMPLE;
default: default:
UNREACHABLE(); UNREACHABLE();
return 0; return 0;
...@@ -605,15 +622,18 @@ int VariableSortOrder(GLenum type) ...@@ -605,15 +622,18 @@ int VariableSortOrder(GLenum type)
case GL_SAMPLER_EXTERNAL_OES: case GL_SAMPLER_EXTERNAL_OES:
case GL_SAMPLER_2D_RECT_ARB: case GL_SAMPLER_2D_RECT_ARB:
case GL_SAMPLER_2D_ARRAY: case GL_SAMPLER_2D_ARRAY:
case GL_SAMPLER_2D_MULTISAMPLE:
case GL_SAMPLER_3D: case GL_SAMPLER_3D:
case GL_INT_SAMPLER_2D: case GL_INT_SAMPLER_2D:
case GL_INT_SAMPLER_3D: case GL_INT_SAMPLER_3D:
case GL_INT_SAMPLER_CUBE: case GL_INT_SAMPLER_CUBE:
case GL_INT_SAMPLER_2D_ARRAY: case GL_INT_SAMPLER_2D_ARRAY:
case GL_INT_SAMPLER_2D_MULTISAMPLE:
case GL_UNSIGNED_INT_SAMPLER_2D: case GL_UNSIGNED_INT_SAMPLER_2D:
case GL_UNSIGNED_INT_SAMPLER_3D: case GL_UNSIGNED_INT_SAMPLER_3D:
case GL_UNSIGNED_INT_SAMPLER_CUBE: case GL_UNSIGNED_INT_SAMPLER_CUBE:
case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY: case GL_UNSIGNED_INT_SAMPLER_2D_ARRAY:
case GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE:
case GL_SAMPLER_2D_SHADOW: case GL_SAMPLER_2D_SHADOW:
case GL_SAMPLER_2D_ARRAY_SHADOW: case GL_SAMPLER_2D_ARRAY_SHADOW:
case GL_SAMPLER_CUBE_SHADOW: case GL_SAMPLER_CUBE_SHADOW:
......
...@@ -72,14 +72,17 @@ enum TBasicType ...@@ -72,14 +72,17 @@ enum TBasicType
EbtSampler2DArray, EbtSampler2DArray,
EbtSamplerExternalOES, // Only valid if OES_EGL_image_external exists. EbtSamplerExternalOES, // Only valid if OES_EGL_image_external exists.
EbtSampler2DRect, // Only valid if GL_ARB_texture_rectangle exists. EbtSampler2DRect, // Only valid if GL_ARB_texture_rectangle exists.
EbtSampler2DMS,
EbtISampler2D, EbtISampler2D,
EbtISampler3D, EbtISampler3D,
EbtISamplerCube, EbtISamplerCube,
EbtISampler2DArray, EbtISampler2DArray,
EbtISampler2DMS,
EbtUSampler2D, EbtUSampler2D,
EbtUSampler3D, EbtUSampler3D,
EbtUSamplerCube, EbtUSamplerCube,
EbtUSampler2DArray, EbtUSampler2DArray,
EbtUSampler2DMS,
EbtSampler2DShadow, EbtSampler2DShadow,
EbtSamplerCubeShadow, EbtSamplerCubeShadow,
EbtSampler2DArrayShadow, EbtSampler2DArrayShadow,
...@@ -89,6 +92,7 @@ enum TBasicType ...@@ -89,6 +92,7 @@ enum TBasicType
EbtGSamplerCube, // non type: represents samplerCube, isamplerCube, and usamplerCube EbtGSamplerCube, // non type: represents samplerCube, isamplerCube, and usamplerCube
EbtGSampler2DArray, // non type: represents sampler2DArray, isampler2DArray, and EbtGSampler2DArray, // non type: represents sampler2DArray, isampler2DArray, and
// usampler2DArray // usampler2DArray
EbtGSampler2DMS, // non type: represents sampler2DMS, isampler2DMS, and usampler2DMS
// images // images
EbtGuardImageBegin, EbtGuardImageBegin,
...@@ -206,10 +210,12 @@ inline bool IsIntegerSampler(TBasicType type) ...@@ -206,10 +210,12 @@ inline bool IsIntegerSampler(TBasicType type)
case EbtISampler3D: case EbtISampler3D:
case EbtISamplerCube: case EbtISamplerCube:
case EbtISampler2DArray: case EbtISampler2DArray:
case EbtISampler2DMS:
case EbtUSampler2D: case EbtUSampler2D:
case EbtUSampler3D: case EbtUSampler3D:
case EbtUSamplerCube: case EbtUSamplerCube:
case EbtUSampler2DArray: case EbtUSampler2DArray:
case EbtUSampler2DMS:
return true; return true;
case EbtSampler2D: case EbtSampler2D:
case EbtSampler3D: case EbtSampler3D:
...@@ -220,6 +226,7 @@ inline bool IsIntegerSampler(TBasicType type) ...@@ -220,6 +226,7 @@ inline bool IsIntegerSampler(TBasicType type)
case EbtSampler2DShadow: case EbtSampler2DShadow:
case EbtSamplerCubeShadow: case EbtSamplerCubeShadow:
case EbtSampler2DArrayShadow: case EbtSampler2DArrayShadow:
case EbtSampler2DMS:
return false; return false;
default: default:
assert(!IsSampler(type)); assert(!IsSampler(type));
...@@ -292,6 +299,9 @@ inline bool IsSampler2D(TBasicType type) ...@@ -292,6 +299,9 @@ inline bool IsSampler2D(TBasicType type)
case EbtSamplerExternalOES: case EbtSamplerExternalOES:
case EbtSampler2DShadow: case EbtSampler2DShadow:
case EbtSampler2DArrayShadow: case EbtSampler2DArrayShadow:
case EbtSampler2DMS:
case EbtISampler2DMS:
case EbtUSampler2DMS:
return true; return true;
case EbtSampler3D: case EbtSampler3D:
case EbtISampler3D: case EbtISampler3D:
...@@ -322,12 +332,15 @@ inline bool IsSamplerCube(TBasicType type) ...@@ -322,12 +332,15 @@ inline bool IsSamplerCube(TBasicType type)
case EbtSamplerExternalOES: case EbtSamplerExternalOES:
case EbtSampler2DRect: case EbtSampler2DRect:
case EbtSampler2DArray: case EbtSampler2DArray:
case EbtSampler2DMS:
case EbtISampler2D: case EbtISampler2D:
case EbtISampler3D: case EbtISampler3D:
case EbtISampler2DArray: case EbtISampler2DArray:
case EbtISampler2DMS:
case EbtUSampler2D: case EbtUSampler2D:
case EbtUSampler3D: case EbtUSampler3D:
case EbtUSampler2DArray: case EbtUSampler2DArray:
case EbtUSampler2DMS:
case EbtSampler2DShadow: case EbtSampler2DShadow:
case EbtSampler2DArrayShadow: case EbtSampler2DArrayShadow:
return false; return false;
...@@ -351,12 +364,15 @@ inline bool IsSampler3D(TBasicType type) ...@@ -351,12 +364,15 @@ inline bool IsSampler3D(TBasicType type)
case EbtSamplerExternalOES: case EbtSamplerExternalOES:
case EbtSampler2DRect: case EbtSampler2DRect:
case EbtSampler2DArray: case EbtSampler2DArray:
case EbtSampler2DMS:
case EbtISampler2D: case EbtISampler2D:
case EbtISamplerCube: case EbtISamplerCube:
case EbtISampler2DArray: case EbtISampler2DArray:
case EbtISampler2DMS:
case EbtUSampler2D: case EbtUSampler2D:
case EbtUSamplerCube: case EbtUSamplerCube:
case EbtUSampler2DArray: case EbtUSampler2DArray:
case EbtUSampler2DMS:
case EbtSampler2DShadow: case EbtSampler2DShadow:
case EbtSamplerCubeShadow: case EbtSamplerCubeShadow:
case EbtSampler2DArrayShadow: case EbtSampler2DArrayShadow:
...@@ -390,6 +406,9 @@ inline bool IsSamplerArray(TBasicType type) ...@@ -390,6 +406,9 @@ inline bool IsSamplerArray(TBasicType type)
case EbtSamplerCube: case EbtSamplerCube:
case EbtSampler2DShadow: case EbtSampler2DShadow:
case EbtSamplerCubeShadow: case EbtSamplerCubeShadow:
case EbtSampler2DMS:
case EbtISampler2DMS:
case EbtUSampler2DMS:
return false; return false;
default: default:
assert(!IsSampler(type)); assert(!IsSampler(type));
...@@ -410,16 +429,19 @@ inline bool IsShadowSampler(TBasicType type) ...@@ -410,16 +429,19 @@ inline bool IsShadowSampler(TBasicType type)
case EbtISampler3D: case EbtISampler3D:
case EbtISamplerCube: case EbtISamplerCube:
case EbtISampler2DArray: case EbtISampler2DArray:
case EbtISampler2DMS:
case EbtUSampler2D: case EbtUSampler2D:
case EbtUSampler3D: case EbtUSampler3D:
case EbtUSamplerCube: case EbtUSamplerCube:
case EbtUSampler2DArray: case EbtUSampler2DArray:
case EbtUSampler2DMS:
case EbtSampler2D: case EbtSampler2D:
case EbtSampler3D: case EbtSampler3D:
case EbtSamplerCube: case EbtSamplerCube:
case EbtSamplerExternalOES: case EbtSamplerExternalOES:
case EbtSampler2DRect: case EbtSampler2DRect:
case EbtSampler2DArray: case EbtSampler2DArray:
case EbtSampler2DMS:
return false; return false;
default: default:
assert(!IsSampler(type)); assert(!IsSampler(type));
......
...@@ -373,6 +373,7 @@ void InsertBuiltInFunctions(sh::GLenum type, ...@@ -373,6 +373,7 @@ void InsertBuiltInFunctions(sh::GLenum type,
const TType *gsamplerCube = TCache::getType(EbtGSamplerCube); const TType *gsamplerCube = TCache::getType(EbtGSamplerCube);
const TType *gsampler3D = TCache::getType(EbtGSampler3D); const TType *gsampler3D = TCache::getType(EbtGSampler3D);
const TType *gsampler2DArray = TCache::getType(EbtGSampler2DArray); const TType *gsampler2DArray = TCache::getType(EbtGSampler2DArray);
const TType *gsampler2DMS = TCache::getType(EbtGSampler2DMS);
// //
// Texture Functions for GLSL ES 3.0 // Texture Functions for GLSL ES 3.0
...@@ -452,6 +453,7 @@ void InsertBuiltInFunctions(sh::GLenum type, ...@@ -452,6 +453,7 @@ void InsertBuiltInFunctions(sh::GLenum type,
symbolTable.insertBuiltIn(ESSL3_BUILTINS, int2, "textureSize", sampler2DShadow, int1); symbolTable.insertBuiltIn(ESSL3_BUILTINS, int2, "textureSize", sampler2DShadow, int1);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, int2, "textureSize", samplerCubeShadow, int1); symbolTable.insertBuiltIn(ESSL3_BUILTINS, int2, "textureSize", samplerCubeShadow, int1);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, int3, "textureSize", sampler2DArrayShadow, int1); symbolTable.insertBuiltIn(ESSL3_BUILTINS, int3, "textureSize", sampler2DArrayShadow, int1);
symbolTable.insertBuiltIn(ESSL3_BUILTINS, int2, "textureSize", gsampler2DMS);
if (resources.OES_EGL_image_external_essl3) if (resources.OES_EGL_image_external_essl3)
{ {
...@@ -620,6 +622,8 @@ void InsertBuiltInFunctions(sh::GLenum type, ...@@ -620,6 +622,8 @@ void InsertBuiltInFunctions(sh::GLenum type,
symbolTable.insertBuiltInFunctionNoParameters(ESSL3_1_BUILTINS, EOpMemoryBarrierImage, voidType, symbolTable.insertBuiltInFunctionNoParameters(ESSL3_1_BUILTINS, EOpMemoryBarrierImage, voidType,
"memoryBarrierImage"); "memoryBarrierImage");
symbolTable.insertBuiltIn(ESSL3_1_BUILTINS, gvec4, "texelFetch", gsampler2DMS, int2, int1);
if (type == GL_COMPUTE_SHADER) if (type == GL_COMPUTE_SHADER)
{ {
symbolTable.insertBuiltInFunctionNoParameters(ESSL3_1_BUILTINS, EOpBarrier, voidType, symbolTable.insertBuiltInFunctionNoParameters(ESSL3_1_BUILTINS, EOpBarrier, voidType,
......
...@@ -290,6 +290,17 @@ void TSymbolTable::insertBuiltIn(ESymbolLevel level, ...@@ -290,6 +290,17 @@ void TSymbolTable::insertBuiltIn(ESymbolLevel level,
insertBuiltIn(level, gvec4 ? TCache::getType(EbtUInt, 4) : rvalue, name, insertBuiltIn(level, gvec4 ? TCache::getType(EbtUInt, 4) : rvalue, name,
TCache::getType(EbtUSampler2DArray), ptype2, ptype3, ptype4, ptype5); TCache::getType(EbtUSampler2DArray), ptype2, ptype3, ptype4, ptype5);
} }
else if (ptype1->getBasicType() == EbtGSampler2DMS)
{
insertUnmangledBuiltInName(name, level);
bool gvec4 = (rvalue->getBasicType() == EbtGVec4);
insertBuiltIn(level, gvec4 ? TCache::getType(EbtFloat, 4) : rvalue, name,
TCache::getType(EbtSampler2DMS), ptype2, ptype3, ptype4, ptype5);
insertBuiltIn(level, gvec4 ? TCache::getType(EbtInt, 4) : rvalue, name,
TCache::getType(EbtISampler2DMS), ptype2, ptype3, ptype4, ptype5);
insertBuiltIn(level, gvec4 ? TCache::getType(EbtUInt, 4) : rvalue, name,
TCache::getType(EbtUSampler2DMS), ptype2, ptype3, ptype4, ptype5);
}
else if (IsGImage(ptype1->getBasicType())) else if (IsGImage(ptype1->getBasicType()))
{ {
insertUnmangledBuiltInName(name, level); insertUnmangledBuiltInName(name, level);
......
...@@ -45,6 +45,8 @@ const char *getBasicString(TBasicType t) ...@@ -45,6 +45,8 @@ const char *getBasicString(TBasicType t)
return "sampler2DRect"; return "sampler2DRect";
case EbtSampler2DArray: case EbtSampler2DArray:
return "sampler2DArray"; return "sampler2DArray";
case EbtSampler2DMS:
return "sampler2DMS";
case EbtISampler2D: case EbtISampler2D:
return "isampler2D"; return "isampler2D";
case EbtISampler3D: case EbtISampler3D:
...@@ -53,6 +55,8 @@ const char *getBasicString(TBasicType t) ...@@ -53,6 +55,8 @@ const char *getBasicString(TBasicType t)
return "isamplerCube"; return "isamplerCube";
case EbtISampler2DArray: case EbtISampler2DArray:
return "isampler2DArray"; return "isampler2DArray";
case EbtISampler2DMS:
return "isampler2DMS";
case EbtUSampler2D: case EbtUSampler2D:
return "usampler2D"; return "usampler2D";
case EbtUSampler3D: case EbtUSampler3D:
...@@ -61,6 +65,8 @@ const char *getBasicString(TBasicType t) ...@@ -61,6 +65,8 @@ const char *getBasicString(TBasicType t)
return "usamplerCube"; return "usamplerCube";
case EbtUSampler2DArray: case EbtUSampler2DArray:
return "usampler2DArray"; return "usampler2DArray";
case EbtUSampler2DMS:
return "usampler2DMS";
case EbtSampler2DShadow: case EbtSampler2DShadow:
return "sampler2DShadow"; return "sampler2DShadow";
case EbtSamplerCubeShadow: case EbtSamplerCubeShadow:
...@@ -304,6 +310,9 @@ TString TType::buildMangledName() const ...@@ -304,6 +310,9 @@ TString TType::buildMangledName() const
case EbtSampler2DRect: case EbtSampler2DRect:
mangledName += "s2r"; mangledName += "s2r";
break; break;
case EbtSampler2DMS:
mangledName += "s2ms";
break;
case EbtISampler2D: case EbtISampler2D:
mangledName += "is2"; mangledName += "is2";
break; break;
...@@ -316,6 +325,9 @@ TString TType::buildMangledName() const ...@@ -316,6 +325,9 @@ TString TType::buildMangledName() const
case EbtISampler2DArray: case EbtISampler2DArray:
mangledName += "is2a"; mangledName += "is2a";
break; break;
case EbtISampler2DMS:
mangledName += "is2ms";
break;
case EbtUSampler2D: case EbtUSampler2D:
mangledName += "us2"; mangledName += "us2";
break; break;
...@@ -328,6 +340,9 @@ TString TType::buildMangledName() const ...@@ -328,6 +340,9 @@ TString TType::buildMangledName() const
case EbtUSampler2DArray: case EbtUSampler2DArray:
mangledName += "us2a"; mangledName += "us2a";
break; break;
case EbtUSampler2DMS:
mangledName += "us2ms";
break;
case EbtSampler2DShadow: case EbtSampler2DShadow:
mangledName += "s2s"; mangledName += "s2s";
break; break;
......
...@@ -180,14 +180,17 @@ O [0-7] ...@@ -180,14 +180,17 @@ O [0-7]
"sampler3DRect" { return ES2_reserved_ES3_keyword(context, SAMPLER3DRECT); } "sampler3DRect" { return ES2_reserved_ES3_keyword(context, SAMPLER3DRECT); }
"sampler2DRect" { return SAMPLER2DRECT; } "sampler2DRect" { return SAMPLER2DRECT; }
"sampler2DArray" { return ES2_ident_ES3_keyword(context, SAMPLER2DARRAY); } "sampler2DArray" { return ES2_ident_ES3_keyword(context, SAMPLER2DARRAY); }
"sampler2DMS" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, SAMPLER2DMS); }
"isampler2D" { return ES2_ident_ES3_keyword(context, ISAMPLER2D); } "isampler2D" { return ES2_ident_ES3_keyword(context, ISAMPLER2D); }
"isampler3D" { return ES2_ident_ES3_keyword(context, ISAMPLER3D); } "isampler3D" { return ES2_ident_ES3_keyword(context, ISAMPLER3D); }
"isamplerCube" { return ES2_ident_ES3_keyword(context, ISAMPLERCUBE); } "isamplerCube" { return ES2_ident_ES3_keyword(context, ISAMPLERCUBE); }
"isampler2DArray" { return ES2_ident_ES3_keyword(context, ISAMPLER2DARRAY); } "isampler2DArray" { return ES2_ident_ES3_keyword(context, ISAMPLER2DARRAY); }
"isampler2DMS" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, ISAMPLER2DMS); }
"usampler2D" { return ES2_ident_ES3_keyword(context, USAMPLER2D); } "usampler2D" { return ES2_ident_ES3_keyword(context, USAMPLER2D); }
"usampler3D" { return ES2_ident_ES3_keyword(context, USAMPLER3D); } "usampler3D" { return ES2_ident_ES3_keyword(context, USAMPLER3D); }
"usamplerCube" { return ES2_ident_ES3_keyword(context, USAMPLERCUBE); } "usamplerCube" { return ES2_ident_ES3_keyword(context, USAMPLERCUBE); }
"usampler2DArray" { return ES2_ident_ES3_keyword(context, USAMPLER2DARRAY); } "usampler2DArray" { return ES2_ident_ES3_keyword(context, USAMPLER2DARRAY); }
"usampler2DMS" { return ES2_ident_ES3_reserved_ES3_1_keyword(context, USAMPLER2DMS); }
"sampler2DShadow" { return ES2_reserved_ES3_keyword(context, SAMPLER2DSHADOW); } "sampler2DShadow" { return ES2_reserved_ES3_keyword(context, SAMPLER2DSHADOW); }
"samplerCubeShadow" { return ES2_ident_ES3_keyword(context, SAMPLERCUBESHADOW); } "samplerCubeShadow" { return ES2_ident_ES3_keyword(context, SAMPLERCUBESHADOW); }
"sampler2DArrayShadow" { return ES2_ident_ES3_keyword(context, SAMPLER2DARRAYSHADOW); } "sampler2DArrayShadow" { return ES2_ident_ES3_keyword(context, SAMPLER2DARRAYSHADOW); }
...@@ -251,9 +254,6 @@ O [0-7] ...@@ -251,9 +254,6 @@ O [0-7]
"samplerBuffer" | "samplerBuffer" |
"isamplerBuffer" | "isamplerBuffer" |
"usamplerBuffer" | "usamplerBuffer" |
"sampler2DMS" |
"isampler2DMS" |
"usampler2DMS" |
"sampler2DMSArray" | "sampler2DMSArray" |
"isampler2DMSArray" | "isampler2DMSArray" |
"usampler2DMSArray" { "usampler2DMSArray" {
......
...@@ -174,6 +174,7 @@ extern void yyerror(YYLTYPE* yylloc, TParseContext* context, void *scanner, cons ...@@ -174,6 +174,7 @@ extern void yyerror(YYLTYPE* yylloc, TParseContext* context, void *scanner, cons
%token <lex> SAMPLER2D SAMPLERCUBE SAMPLER_EXTERNAL_OES SAMPLER2DRECT SAMPLER2DARRAY %token <lex> SAMPLER2D SAMPLERCUBE SAMPLER_EXTERNAL_OES SAMPLER2DRECT SAMPLER2DARRAY
%token <lex> ISAMPLER2D ISAMPLER3D ISAMPLERCUBE ISAMPLER2DARRAY %token <lex> ISAMPLER2D ISAMPLER3D ISAMPLERCUBE ISAMPLER2DARRAY
%token <lex> USAMPLER2D USAMPLER3D USAMPLERCUBE USAMPLER2DARRAY %token <lex> USAMPLER2D USAMPLER3D USAMPLERCUBE USAMPLER2DARRAY
%token <lex> SAMPLER2DMS ISAMPLER2DMS USAMPLER2DMS
%token <lex> SAMPLER3D SAMPLER3DRECT SAMPLER2DSHADOW SAMPLERCUBESHADOW SAMPLER2DARRAYSHADOW %token <lex> SAMPLER3D SAMPLER3DRECT SAMPLER2DSHADOW SAMPLERCUBESHADOW SAMPLER2DARRAYSHADOW
%token <lex> IMAGE2D IIMAGE2D UIMAGE2D IMAGE3D IIMAGE3D UIMAGE3D IMAGE2DARRAY IIMAGE2DARRAY UIMAGE2DARRAY %token <lex> IMAGE2D IIMAGE2D UIMAGE2D IMAGE3D IIMAGE3D UIMAGE3D IMAGE2DARRAY IIMAGE2DARRAY UIMAGE2DARRAY
%token <lex> IMAGECUBE IIMAGECUBE UIMAGECUBE %token <lex> IMAGECUBE IIMAGECUBE UIMAGECUBE
...@@ -1147,6 +1148,9 @@ type_specifier_nonarray ...@@ -1147,6 +1148,9 @@ type_specifier_nonarray
| SAMPLER2DARRAY { | SAMPLER2DARRAY {
$$.initialize(EbtSampler2DArray, @1); $$.initialize(EbtSampler2DArray, @1);
} }
| SAMPLER2DMS {
$$.initialize(EbtSampler2DMS, @1);
}
| ISAMPLER2D { | ISAMPLER2D {
$$.initialize(EbtISampler2D, @1); $$.initialize(EbtISampler2D, @1);
} }
...@@ -1159,6 +1163,9 @@ type_specifier_nonarray ...@@ -1159,6 +1163,9 @@ type_specifier_nonarray
| ISAMPLER2DARRAY { | ISAMPLER2DARRAY {
$$.initialize(EbtISampler2DArray, @1); $$.initialize(EbtISampler2DArray, @1);
} }
| ISAMPLER2DMS {
$$.initialize(EbtISampler2DMS, @1);
}
| USAMPLER2D { | USAMPLER2D {
$$.initialize(EbtUSampler2D, @1); $$.initialize(EbtUSampler2D, @1);
} }
...@@ -1171,6 +1178,9 @@ type_specifier_nonarray ...@@ -1171,6 +1178,9 @@ type_specifier_nonarray
| USAMPLER2DARRAY { | USAMPLER2DARRAY {
$$.initialize(EbtUSampler2DArray, @1); $$.initialize(EbtUSampler2DArray, @1);
} }
| USAMPLER2DMS {
$$.initialize(EbtUSampler2DMS, @1);
}
| SAMPLER2DSHADOW { | SAMPLER2DSHADOW {
$$.initialize(EbtSampler2DShadow, @1); $$.initialize(EbtSampler2DShadow, @1);
} }
......
...@@ -222,7 +222,7 @@ typedef size_t yy_size_t; ...@@ -222,7 +222,7 @@ typedef size_t yy_size_t;
#define YY_LESS_LINENO(n) \ #define YY_LESS_LINENO(n) \
do { \ do { \
yy_size_t yyl;\ yy_size_t yyl;\
for ( yyl = n; yyl < yyleng; ++yyl )\ for ( yyl = n; yyl < static_cast<yy_site_t>(yyleng); ++yyl )\
if ( yytext[yyl] == '\n' )\ if ( yytext[yyl] == '\n' )\
--yylineno;\ --yylineno;\
}while(0) }while(0)
...@@ -397,7 +397,7 @@ static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner ); ...@@ -397,7 +397,7 @@ static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner );
*/ */
#define YY_DO_BEFORE_ACTION \ #define YY_DO_BEFORE_ACTION \
yyg->yytext_ptr = yy_bp; \ 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; \ yyg->yy_hold_char = *yy_cp; \
*yy_cp = '\0'; \ *yy_cp = '\0'; \
yyg->yy_c_buf_p = yy_cp; yyg->yy_c_buf_p = yy_cp;
...@@ -455,55 +455,55 @@ static yyconst flex_int16_t yy_accept[824] = ...@@ -455,55 +455,55 @@ static yyconst flex_int16_t yy_accept[824] =
178, 165, 166, 167, 178, 33, 178, 157, 27, 168, 178, 165, 166, 167, 178, 33, 178, 157, 27, 168,
169, 170, 2, 162, 163, 164, 178, 178, 178, 25, 169, 170, 2, 162, 163, 164, 178, 178, 178, 25,
160, 178, 178, 178, 51, 52, 53, 178, 178, 178, 160, 178, 178, 178, 51, 52, 53, 178, 178, 178,
178, 178, 178, 178, 178, 178, 178, 178, 100, 178, 178, 178, 178, 178, 178, 178, 178, 178, 103, 178,
178, 178, 178, 178, 178, 178, 178, 154, 178, 178, 178, 178, 178, 178, 178, 178, 178, 154, 178, 178,
178, 178, 178, 178, 178, 178, 178, 178, 178, 140, 178, 178, 178, 178, 178, 178, 178, 178, 178, 140,
178, 178, 177, 57, 58, 59, 178, 178, 14, 178, 178, 178, 177, 57, 58, 59, 178, 178, 14, 178,
105, 178, 178, 178, 178, 103, 178, 178, 178, 155, 108, 178, 178, 178, 178, 106, 178, 178, 178, 155,
150, 106, 178, 178, 178, 178, 178, 178, 146, 178, 150, 109, 178, 178, 178, 178, 178, 178, 146, 178,
178, 178, 79, 39, 42, 44, 43, 40, 46, 45, 178, 178, 82, 39, 42, 44, 43, 40, 46, 45,
47, 41, 178, 178, 178, 178, 161, 137, 178, 178, 47, 41, 178, 178, 178, 178, 161, 137, 178, 178,
148, 178, 178, 178, 35, 101, 26, 174, 22, 149, 148, 178, 178, 178, 35, 104, 26, 174, 22, 149,
78, 178, 159, 17, 178, 178, 178, 178, 178, 178, 81, 178, 159, 17, 178, 178, 178, 178, 178, 178,
178, 178, 178, 178, 178, 178, 178, 178, 19, 34, 178, 178, 178, 178, 178, 178, 178, 178, 19, 34,
178, 178, 178, 178, 178, 178, 107, 80, 86, 178, 178, 178, 178, 178, 178, 178, 110, 83, 89, 178,
178, 178, 178, 178, 3, 178, 178, 178, 178, 178, 178, 178, 178, 178, 3, 178, 178, 178, 178, 178,
178, 178, 178, 178, 178, 178, 142, 178, 178, 178, 178, 178, 178, 178, 178, 178, 142, 178, 178, 178,
178, 178, 8, 178, 178, 9, 178, 178, 178, 178, 178, 178, 8, 178, 178, 9, 178, 178, 178, 178,
20, 94, 11, 151, 108, 81, 88, 178, 178, 178, 20, 97, 11, 151, 111, 84, 91, 178, 178, 178,
178, 178, 178, 178, 178, 178, 178, 178, 178, 147, 178, 178, 178, 178, 178, 178, 178, 178, 178, 147,
178, 178, 178, 92, 97, 95, 178, 178, 178, 178, 178, 178, 178, 95, 100, 98, 178, 178, 178, 178,
178, 178, 178, 143, 109, 82, 87, 178, 178, 158, 178, 178, 178, 143, 112, 85, 90, 178, 178, 158,
178, 96, 178, 178, 6, 178, 178, 178, 178, 178, 178, 99, 178, 178, 6, 178, 178, 178, 178, 178,
178, 178, 178, 178, 91, 152, 1, 178, 178, 178, 178, 178, 178, 178, 94, 152, 1, 178, 178, 178,
178, 178, 176, 178, 104, 5, 171, 60, 63, 178, 178, 178, 176, 178, 107, 5, 171, 60, 63, 178,
178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
178, 178, 93, 178, 178, 178, 178, 89, 178, 178, 178, 178, 96, 178, 178, 178, 178, 92, 178, 178,
178, 178, 178, 122, 67, 68, 178, 178, 178, 178, 178, 178, 178, 125, 68, 69, 178, 178, 178, 178,
178, 178, 178, 178, 178, 178, 178, 178, 178, 102, 178, 178, 178, 178, 178, 178, 178, 178, 178, 105,
178, 178, 178, 90, 124, 71, 72, 178, 178, 98, 178, 178, 178, 93, 127, 73, 74, 178, 178, 101,
178, 178, 178, 178, 178, 178, 178, 117, 178, 178, 178, 178, 178, 178, 178, 178, 178, 120, 178, 178,
178, 178, 178, 178, 178, 178, 178, 178, 131, 178, 178, 178, 178, 178, 178, 178, 178, 178, 67, 178,
178, 178, 178, 61, 178, 178, 178, 178, 178, 178, 178, 178, 178, 61, 178, 178, 178, 178, 178, 178,
178, 178, 178, 178, 178, 178, 118, 110, 178, 83, 178, 178, 178, 178, 178, 178, 121, 113, 178, 86,
178, 178, 178, 132, 178, 178, 69, 178, 178, 178, 178, 178, 178, 72, 178, 178, 70, 178, 178, 178,
178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178,
119, 178, 178, 133, 178, 178, 73, 111, 84, 178, 122, 178, 178, 77, 178, 178, 75, 114, 87, 178,
113, 178, 114, 178, 178, 178, 178, 178, 99, 178, 116, 178, 117, 178, 178, 178, 178, 178, 102, 178,
178, 178, 178, 65, 178, 64, 128, 178, 178, 112, 178, 178, 178, 65, 178, 64, 131, 178, 178, 115,
85, 178, 178, 178, 178, 178, 178, 178, 178, 178, 88, 178, 178, 178, 178, 178, 178, 178, 178, 178,
178, 126, 129, 120, 178, 66, 178, 178, 178, 178, 178, 129, 132, 123, 178, 66, 178, 178, 178, 178,
178, 178, 178, 178, 127, 130, 178, 178, 123, 70, 178, 178, 178, 178, 130, 133, 178, 178, 126, 71,
178, 178, 172, 178, 178, 178, 75, 178, 178, 125, 178, 178, 172, 178, 178, 178, 78, 178, 178, 128,
74, 178, 178, 178, 178, 178, 178, 134, 178, 178, 76, 178, 178, 178, 178, 178, 178, 134, 178, 178,
178, 178, 178, 178, 135, 178, 178, 178, 76, 178, 178, 178, 178, 178, 135, 178, 178, 178, 79, 178,
136, 115, 116, 178, 178, 178, 62, 178, 178, 173, 136, 118, 119, 178, 178, 178, 62, 178, 178, 173,
121, 77, 0 124, 80, 0
} ; } ;
static yyconst flex_int32_t yy_ec[256] = static yyconst flex_int32_t yy_ec[256] =
...@@ -1381,7 +1381,7 @@ yy_find_action: ...@@ -1381,7 +1381,7 @@ yy_find_action:
if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] )
{ {
yy_size_t yyl; yy_size_t yyl;
for ( yyl = 0; yyl < yyleng; ++yyl ) for ( yyl = 0; yyl < static_cast<yy_size_t>(yyleng); ++yyl )
if ( yytext[yyl] == '\n' ) if ( yytext[yyl] == '\n' )
do{ yylineno++; do{ yylineno++;
...@@ -1667,128 +1667,137 @@ YY_RULE_SETUP ...@@ -1667,128 +1667,137 @@ YY_RULE_SETUP
YY_BREAK YY_BREAK
case 67: case 67:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, ISAMPLER2D); } { return ES2_ident_ES3_reserved_ES3_1_keyword(context, SAMPLER2DMS); }
YY_BREAK YY_BREAK
case 68: case 68:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, ISAMPLER3D); } { return ES2_ident_ES3_keyword(context, ISAMPLER2D); }
YY_BREAK YY_BREAK
case 69: case 69:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, ISAMPLERCUBE); } { return ES2_ident_ES3_keyword(context, ISAMPLER3D); }
YY_BREAK YY_BREAK
case 70: case 70:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, ISAMPLER2DARRAY); } { return ES2_ident_ES3_keyword(context, ISAMPLERCUBE); }
YY_BREAK YY_BREAK
case 71: case 71:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, USAMPLER2D); } { return ES2_ident_ES3_keyword(context, ISAMPLER2DARRAY); }
YY_BREAK YY_BREAK
case 72: case 72:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, USAMPLER3D); } { return ES2_ident_ES3_reserved_ES3_1_keyword(context, ISAMPLER2DMS); }
YY_BREAK YY_BREAK
case 73: case 73:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, USAMPLERCUBE); } { return ES2_ident_ES3_keyword(context, USAMPLER2D); }
YY_BREAK YY_BREAK
case 74: case 74:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, USAMPLER2DARRAY); } { return ES2_ident_ES3_keyword(context, USAMPLER3D); }
YY_BREAK YY_BREAK
case 75: case 75:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_reserved_ES3_keyword(context, SAMPLER2DSHADOW); } { return ES2_ident_ES3_keyword(context, USAMPLERCUBE); }
YY_BREAK YY_BREAK
case 76: case 76:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, SAMPLERCUBESHADOW); } { return ES2_ident_ES3_keyword(context, USAMPLER2DARRAY); }
YY_BREAK YY_BREAK
case 77: case 77:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, SAMPLER2DARRAYSHADOW); } { return ES2_ident_ES3_reserved_ES3_1_keyword(context, USAMPLER2DMS); }
YY_BREAK YY_BREAK
case 78: case 78:
YY_RULE_SETUP YY_RULE_SETUP
{ return STRUCT; } { return ES2_reserved_ES3_keyword(context, SAMPLER2DSHADOW); }
YY_BREAK YY_BREAK
case 79: case 79:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_keyword(context, LAYOUT); } { return ES2_ident_ES3_keyword(context, SAMPLERCUBESHADOW); }
YY_BREAK YY_BREAK
case 80: case 80:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGE2D); } { return ES2_ident_ES3_keyword(context, SAMPLER2DARRAYSHADOW); }
YY_BREAK YY_BREAK
case 81: case 81:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGE2D); } { return STRUCT; }
YY_BREAK YY_BREAK
case 82: case 82:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGE2D); } { return ES2_ident_ES3_keyword(context, LAYOUT); }
YY_BREAK YY_BREAK
case 83: case 83:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGE2DARRAY); } { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGE2D); }
YY_BREAK YY_BREAK
case 84: case 84:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGE2DARRAY); } { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGE2D); }
YY_BREAK YY_BREAK
case 85: case 85:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGE2DARRAY); } { return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGE2D); }
YY_BREAK YY_BREAK
case 86: case 86:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGE3D); } { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGE2DARRAY); }
YY_BREAK YY_BREAK
case 87: case 87:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGE3D); } { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGE2DARRAY); }
YY_BREAK YY_BREAK
case 88: case 88:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGE3D); } { return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGE2DARRAY); }
YY_BREAK YY_BREAK
case 89: case 89:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGECUBE); } { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGE3D); }
YY_BREAK YY_BREAK
case 90: case 90:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGECUBE); } { return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGE3D); }
YY_BREAK YY_BREAK
case 91: case 91:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGECUBE); } { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGE3D); }
YY_BREAK YY_BREAK
case 92: case 92:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, READONLY); } { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IIMAGECUBE); }
YY_BREAK YY_BREAK
case 93: case 93:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, WRITEONLY); } { return ES2_ident_ES3_reserved_ES3_1_keyword(context, UIMAGECUBE); }
YY_BREAK YY_BREAK
case 94: case 94:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, COHERENT); } { return ES2_ident_ES3_reserved_ES3_1_keyword(context, IMAGECUBE); }
YY_BREAK YY_BREAK
case 95: case 95:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, RESTRICT); } { return ES2_ident_ES3_reserved_ES3_1_keyword(context, READONLY); }
YY_BREAK YY_BREAK
case 96: case 96:
YY_RULE_SETUP YY_RULE_SETUP
{ return ES2_and_ES3_reserved_ES3_1_keyword(context, VOLATILE); } { return ES2_ident_ES3_reserved_ES3_1_keyword(context, WRITEONLY); }
YY_BREAK YY_BREAK
/* Reserved keywords for GLSL ES 3.00 that are not reserved for GLSL ES 1.00 */
case 97: case 97:
YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, COHERENT); }
YY_BREAK
case 98: case 98:
YY_RULE_SETUP
{ return ES2_ident_ES3_reserved_ES3_1_keyword(context, RESTRICT); }
YY_BREAK
case 99: case 99:
YY_RULE_SETUP
{ return ES2_and_ES3_reserved_ES3_1_keyword(context, VOLATILE); }
YY_BREAK
/* Reserved keywords for GLSL ES 3.00 that are not reserved for GLSL ES 1.00 */
case 100: case 100:
case 101: case 101:
case 102: case 102:
...@@ -2385,7 +2394,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner) ...@@ -2385,7 +2394,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
number_to_move - 1; static_cast<int>(number_to_move) - 1;
} }
...@@ -2393,8 +2402,10 @@ static int yy_get_next_buffer (yyscan_t yyscanner) ...@@ -2393,8 +2402,10 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
num_to_read = YY_READ_BUF_SIZE; num_to_read = YY_READ_BUF_SIZE;
/* Read in more data. */ /* Read in more data. */
size_t result = 0;
YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
yyg->yy_n_chars, num_to_read ); result, num_to_read );
yyg->yy_n_chars = static_cast<int>(result);
YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
} }
...@@ -2835,7 +2846,7 @@ static void yyensure_buffer_stack (yyscan_t yyscanner) ...@@ -2835,7 +2846,7 @@ static void yyensure_buffer_stack (yyscan_t yyscanner)
/* Increase the buffer to prepare for a possible push. */ /* Increase the buffer to prepare for a possible push. */
int grow_size = 8 /* arbitrary grow size */; int grow_size = 8 /* arbitrary grow size */;
num_to_alloc = yyg->yy_buffer_stack_max + grow_size; num_to_alloc = static_cast<int>(yyg->yy_buffer_stack_max + grow_size);
yyg->yy_buffer_stack = (struct yy_buffer_state**)yyrealloc yyg->yy_buffer_stack = (struct yy_buffer_state**)yyrealloc
(yyg->yy_buffer_stack, (yyg->yy_buffer_stack,
num_to_alloc * sizeof(struct yy_buffer_state*) num_to_alloc * sizeof(struct yy_buffer_state*)
...@@ -2869,7 +2880,7 @@ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscann ...@@ -2869,7 +2880,7 @@ YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscann
if ( ! b ) if ( ! b )
YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ b->yy_buf_size = static_cast<int>(size) - 2; /* "- 2" to take care of EOB's */
b->yy_buf_pos = b->yy_ch_buf = base; b->yy_buf_pos = b->yy_ch_buf = base;
b->yy_is_our_buffer = 0; b->yy_is_our_buffer = 0;
b->yy_input_file = 0; b->yy_input_file = 0;
...@@ -2918,7 +2929,7 @@ YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len ...@@ -2918,7 +2929,7 @@ YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len
if ( ! buf ) if ( ! buf )
YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
for ( i = 0; i < _yybytes_len; ++i ) for ( i = 0; i < static_cast<yy_size_t>(_yybytes_len); ++i )
buf[i] = yybytes[i]; buf[i] = yybytes[i];
buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -122,76 +122,79 @@ enum yytokentype ...@@ -122,76 +122,79 @@ enum yytokentype
USAMPLER3D = 328, USAMPLER3D = 328,
USAMPLERCUBE = 329, USAMPLERCUBE = 329,
USAMPLER2DARRAY = 330, USAMPLER2DARRAY = 330,
SAMPLER3D = 331, SAMPLER2DMS = 331,
SAMPLER3DRECT = 332, ISAMPLER2DMS = 332,
SAMPLER2DSHADOW = 333, USAMPLER2DMS = 333,
SAMPLERCUBESHADOW = 334, SAMPLER3D = 334,
SAMPLER2DARRAYSHADOW = 335, SAMPLER3DRECT = 335,
IMAGE2D = 336, SAMPLER2DSHADOW = 336,
IIMAGE2D = 337, SAMPLERCUBESHADOW = 337,
UIMAGE2D = 338, SAMPLER2DARRAYSHADOW = 338,
IMAGE3D = 339, IMAGE2D = 339,
IIMAGE3D = 340, IIMAGE2D = 340,
UIMAGE3D = 341, UIMAGE2D = 341,
IMAGE2DARRAY = 342, IMAGE3D = 342,
IIMAGE2DARRAY = 343, IIMAGE3D = 343,
UIMAGE2DARRAY = 344, UIMAGE3D = 344,
IMAGECUBE = 345, IMAGE2DARRAY = 345,
IIMAGECUBE = 346, IIMAGE2DARRAY = 346,
UIMAGECUBE = 347, UIMAGE2DARRAY = 347,
LAYOUT = 348, IMAGECUBE = 348,
IDENTIFIER = 349, IIMAGECUBE = 349,
TYPE_NAME = 350, UIMAGECUBE = 350,
FLOATCONSTANT = 351, LAYOUT = 351,
INTCONSTANT = 352, IDENTIFIER = 352,
UINTCONSTANT = 353, TYPE_NAME = 353,
BOOLCONSTANT = 354, FLOATCONSTANT = 354,
FIELD_SELECTION = 355, INTCONSTANT = 355,
LEFT_OP = 356, UINTCONSTANT = 356,
RIGHT_OP = 357, BOOLCONSTANT = 357,
INC_OP = 358, FIELD_SELECTION = 358,
DEC_OP = 359, LEFT_OP = 359,
LE_OP = 360, RIGHT_OP = 360,
GE_OP = 361, INC_OP = 361,
EQ_OP = 362, DEC_OP = 362,
NE_OP = 363, LE_OP = 363,
AND_OP = 364, GE_OP = 364,
OR_OP = 365, EQ_OP = 365,
XOR_OP = 366, NE_OP = 366,
MUL_ASSIGN = 367, AND_OP = 367,
DIV_ASSIGN = 368, OR_OP = 368,
ADD_ASSIGN = 369, XOR_OP = 369,
MOD_ASSIGN = 370, MUL_ASSIGN = 370,
LEFT_ASSIGN = 371, DIV_ASSIGN = 371,
RIGHT_ASSIGN = 372, ADD_ASSIGN = 372,
AND_ASSIGN = 373, MOD_ASSIGN = 373,
XOR_ASSIGN = 374, LEFT_ASSIGN = 374,
OR_ASSIGN = 375, RIGHT_ASSIGN = 375,
SUB_ASSIGN = 376, AND_ASSIGN = 376,
LEFT_PAREN = 377, XOR_ASSIGN = 377,
RIGHT_PAREN = 378, OR_ASSIGN = 378,
LEFT_BRACKET = 379, SUB_ASSIGN = 379,
RIGHT_BRACKET = 380, LEFT_PAREN = 380,
LEFT_BRACE = 381, RIGHT_PAREN = 381,
RIGHT_BRACE = 382, LEFT_BRACKET = 382,
DOT = 383, RIGHT_BRACKET = 383,
COMMA = 384, LEFT_BRACE = 384,
COLON = 385, RIGHT_BRACE = 385,
EQUAL = 386, DOT = 386,
SEMICOLON = 387, COMMA = 387,
BANG = 388, COLON = 388,
DASH = 389, EQUAL = 389,
TILDE = 390, SEMICOLON = 390,
PLUS = 391, BANG = 391,
STAR = 392, DASH = 392,
SLASH = 393, TILDE = 393,
PERCENT = 394, PLUS = 394,
LEFT_ANGLE = 395, STAR = 395,
RIGHT_ANGLE = 396, SLASH = 396,
VERTICAL_BAR = 397, PERCENT = 397,
CARET = 398, LEFT_ANGLE = 398,
AMPERSAND = 399, RIGHT_ANGLE = 399,
QUESTION = 400 VERTICAL_BAR = 400,
CARET = 401,
AMPERSAND = 402,
QUESTION = 403
}; };
#endif #endif
......
...@@ -338,6 +338,8 @@ GLenum GLVariableType(const TType &type) ...@@ -338,6 +338,8 @@ GLenum GLVariableType(const TType &type)
return GL_SAMPLER_2D_RECT_ARB; return GL_SAMPLER_2D_RECT_ARB;
case EbtSampler2DArray: case EbtSampler2DArray:
return GL_SAMPLER_2D_ARRAY; return GL_SAMPLER_2D_ARRAY;
case EbtSampler2DMS:
return GL_SAMPLER_2D_MULTISAMPLE;
case EbtISampler2D: case EbtISampler2D:
return GL_INT_SAMPLER_2D; return GL_INT_SAMPLER_2D;
case EbtISampler3D: case EbtISampler3D:
...@@ -346,6 +348,8 @@ GLenum GLVariableType(const TType &type) ...@@ -346,6 +348,8 @@ GLenum GLVariableType(const TType &type)
return GL_INT_SAMPLER_CUBE; return GL_INT_SAMPLER_CUBE;
case EbtISampler2DArray: case EbtISampler2DArray:
return GL_INT_SAMPLER_2D_ARRAY; return GL_INT_SAMPLER_2D_ARRAY;
case EbtISampler2DMS:
return GL_INT_SAMPLER_2D_MULTISAMPLE;
case EbtUSampler2D: case EbtUSampler2D:
return GL_UNSIGNED_INT_SAMPLER_2D; return GL_UNSIGNED_INT_SAMPLER_2D;
case EbtUSampler3D: case EbtUSampler3D:
...@@ -354,6 +358,8 @@ GLenum GLVariableType(const TType &type) ...@@ -354,6 +358,8 @@ GLenum GLVariableType(const TType &type)
return GL_UNSIGNED_INT_SAMPLER_CUBE; return GL_UNSIGNED_INT_SAMPLER_CUBE;
case EbtUSampler2DArray: case EbtUSampler2DArray:
return GL_UNSIGNED_INT_SAMPLER_2D_ARRAY; return GL_UNSIGNED_INT_SAMPLER_2D_ARRAY;
case EbtUSampler2DMS:
return GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE;
case EbtSampler2DShadow: case EbtSampler2DShadow:
return GL_SAMPLER_2D_SHADOW; return GL_SAMPLER_2D_SHADOW;
case EbtSamplerCubeShadow: case EbtSamplerCubeShadow:
......
...@@ -66,6 +66,7 @@ ...@@ -66,6 +66,7 @@
'<(angle_path)/src/tests/compiler_tests/QualificationOrder_test.cpp', '<(angle_path)/src/tests/compiler_tests/QualificationOrder_test.cpp',
'<(angle_path)/src/tests/compiler_tests/RecordConstantPrecision_test.cpp', '<(angle_path)/src/tests/compiler_tests/RecordConstantPrecision_test.cpp',
'<(angle_path)/src/tests/compiler_tests/RemovePow_test.cpp', '<(angle_path)/src/tests/compiler_tests/RemovePow_test.cpp',
'<(angle_path)/src/tests/compiler_tests/SamplerMultisample_test.cpp',
'<(angle_path)/src/tests/compiler_tests/ShaderExtension_test.cpp', '<(angle_path)/src/tests/compiler_tests/ShaderExtension_test.cpp',
'<(angle_path)/src/tests/compiler_tests/ShaderImage_test.cpp', '<(angle_path)/src/tests/compiler_tests/ShaderImage_test.cpp',
'<(angle_path)/src/tests/compiler_tests/ShaderValidation_test.cpp', '<(angle_path)/src/tests/compiler_tests/ShaderValidation_test.cpp',
......
//
// Copyright (c) 2016 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// SamplerMultisample_test.cpp:
// Tests compiling shaders that use gsampler2DMS types
//
#include "angle_gl.h"
#include "gtest/gtest.h"
#include "GLSLANG/ShaderLang.h"
#include "tests/test_utils/ShaderCompileTreeTest.h"
using namespace sh;
class SamplerMultisampleTest : public ShaderCompileTreeTest
{
public:
SamplerMultisampleTest() {}
protected:
::GLenum getShaderType() const override { return GL_FRAGMENT_SHADER; }
ShShaderSpec getShaderSpec() const override { return SH_GLES3_1_SPEC; }
};
// checks whether compiler has parsed the gsampler2DMS, texelfetch qualifiers correctly
TEST_F(SamplerMultisampleTest, TexelFetchSampler2DMSQualifier)
{
const std::string &shaderString =
"#version 310 es\n"
"precision highp float;\n"
"uniform highp sampler2DMS s;\n"
"uniform highp isampler2DMS is;\n"
"uniform highp usampler2DMS us;\n"
""
"void main() {\n"
" vec4 tex1 = texelFetch(s, ivec2(0, 0), 0);\n"
" ivec4 tex2 = texelFetch(is, ivec2(0, 0), 0);\n"
" uvec4 tex3 = texelFetch(us, ivec2(0, 0), 0);\n"
"}\n";
if (!compile(shaderString))
{
FAIL() << "Shader compilation failed, expecting success:\n" << mInfoLog;
}
}
// checks whether compiler has parsed the gsampler2DMS, texturesize qualifiers correctly
TEST_F(SamplerMultisampleTest, TextureSizeSampler2DMSQualifier)
{
const std::string &shaderString =
"#version 310 es\n"
"precision highp float;\n"
"uniform highp sampler2DMS s;\n"
"uniform highp isampler2DMS is;\n"
"uniform highp usampler2DMS us;\n"
""
"void main() {\n"
" ivec2 size = textureSize(s);\n"
" size = textureSize(is);\n"
" size = textureSize(us);\n"
"}\n";
if (!compile(shaderString))
{
FAIL() << "Shader compilation failed, expecting success:\n" << mInfoLog;
}
}
// checks gsampler2DMS has no default precision
TEST_F(SamplerMultisampleTest, NoPrecisionSampler2DMS)
{
const std::string &shaderString =
"#version 310 es\n"
"precision highp float;\n"
"uniform sampler2DMS s;\n"
"uniform isampler2DMS is;\n"
"uniform usampler2DMS us;\n"
""
"void main() {}\n";
if (compile(shaderString))
{
FAIL() << "Shader compilation succeeded, expecting failure:\n" << mInfoLog;
}
}
...@@ -3355,4 +3355,18 @@ TEST_F(FragmentShaderValidationTest, ValidUseOfMemoryBarrierImageInFragmentShade ...@@ -3355,4 +3355,18 @@ TEST_F(FragmentShaderValidationTest, ValidUseOfMemoryBarrierImageInFragmentShade
{ {
FAIL() << "Shader compilation failed, expecting success " << mInfoLog; FAIL() << "Shader compilation failed, expecting success " << mInfoLog;
} }
}
// checks that gsampler2DMS is not supported in version lower than 310
TEST_F(FragmentShaderValidationTest, Sampler2DMSInESSL300Shader)
{
const std::string &shaderString =
"#version 300 es\n"
"uniform highp sampler2DMS s;\n"
"void main() {}\n";
if (compile(shaderString))
{
FAIL() << "Shader compilation succeed, expecting failure " << mInfoLog;
}
} }
\ No newline at end of file
...@@ -48,6 +48,7 @@ ...@@ -48,6 +48,7 @@
1442 OPENGL D3D11 : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.vertex_fragment.default_block_struct_member = SKIP 1442 OPENGL D3D11 : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.name_length.vertex_fragment.default_block_struct_member = SKIP
1442 OPENGL D3D11 : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct.* = SKIP 1442 OPENGL D3D11 : dEQP-GLES31.functional.program_interface_query.transform_feedback_varying.type.vertex_fragment.struct.* = SKIP
1442 D3D11 : dEQP-GLES31.functional.stencil_texturing.* = SKIP 1442 D3D11 : dEQP-GLES31.functional.stencil_texturing.* = SKIP
1442 D3D11 : dEQP-GLES31.functional.state_query.shader.sampler_type = SKIP
// D3D11 Failing Tests // D3D11 Failing Tests
1442 D3D11 : dEQP-GLES31.functional.draw_indirect.* = FAIL 1442 D3D11 : dEQP-GLES31.functional.draw_indirect.* = FAIL
...@@ -1180,7 +1181,6 @@ ...@@ -1180,7 +1181,6 @@
1442 OPENGL D3D11 : dEQP-GLES31.functional.state_query.texture.texture_2d_multisample.* = FAIL 1442 OPENGL D3D11 : dEQP-GLES31.functional.state_query.texture.texture_2d_multisample.* = FAIL
1442 OPENGL D3D11 : dEQP-GLES31.functional.state_query.texture_level.* = FAIL 1442 OPENGL D3D11 : dEQP-GLES31.functional.state_query.texture_level.* = FAIL
1442 OPENGL D3D11 : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.* = FAIL 1442 OPENGL D3D11 : dEQP-GLES31.functional.state_query.texture_level.texture_2d_multisample.* = FAIL
1442 OPENGL D3D11 : dEQP-GLES31.functional.state_query.shader.sampler_type = FAIL
1442 OPENGL D3D11 : dEQP-GLES31.functional.state_query.internal_format.renderbuffer.rgb10_a2ui_samples = FAIL 1442 OPENGL D3D11 : dEQP-GLES31.functional.state_query.internal_format.renderbuffer.rgb10_a2ui_samples = FAIL
1442 OPENGL D3D11 : dEQP-GLES31.functional.state_query.internal_format.renderbuffer.r8i_samples = FAIL 1442 OPENGL D3D11 : dEQP-GLES31.functional.state_query.internal_format.renderbuffer.r8i_samples = FAIL
1442 OPENGL D3D11 : dEQP-GLES31.functional.state_query.internal_format.renderbuffer.r8ui_samples = FAIL 1442 OPENGL D3D11 : dEQP-GLES31.functional.state_query.internal_format.renderbuffer.r8ui_samples = FAIL
......
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