Unverified Commit 29c49e10 by John Kessenich Committed by GitHub

Merge pull request #1266 from amdrexu/feature

Implement the extension GL_AMD_gpu_shader_half_float_fetch
parents 2c40e856 1e5d7b0b
......@@ -27,13 +27,8 @@
#ifndef GLSLextAMD_H
#define GLSLextAMD_H
enum BuiltIn;
enum Capability;
enum Decoration;
enum Op;
static const int GLSLextAMDVersion = 100;
static const int GLSLextAMDRevision = 6;
static const int GLSLextAMDRevision = 7;
// SPV_AMD_shader_ballot
static const char* const E_SPV_AMD_shader_ballot = "SPV_AMD_shader_ballot";
......@@ -107,4 +102,10 @@ static const char* const E_SPV_AMD_shader_image_load_store_lod = "SPV_AMD_shader
// SPV_AMD_shader_fragment_mask
static const char* const E_SPV_AMD_shader_fragment_mask = "SPV_AMD_shader_fragment_mask";
// SPV_AMD_gpu_shader_half_float_fetch
static const char* const E_SPV_AMD_gpu_shader_half_float_fetch = "SPV_AMD_gpu_shader_half_float_fetch";
enum Capability;
static const Capability CapabilityFloat16ImageAMD = static_cast<Capability>(5008);
#endif // #ifndef GLSLextAMD_H
......@@ -2340,6 +2340,12 @@ spv::Id TGlslangToSpvTraverser::getSampledType(const glslang::TSampler& sampler)
{
switch (sampler.type) {
case glslang::EbtFloat: return builder.makeFloatType(32);
#ifdef AMD_EXTENSIONS
case glslang::EbtFloat16:
builder.addExtension(spv::E_SPV_AMD_gpu_shader_half_float_fetch);
builder.addCapability(spv::CapabilityFloat16ImageAMD);
return builder.makeFloatType(16);
#endif
case glslang::EbtInt: return builder.makeIntType(32);
case glslang::EbtUint: return builder.makeUintType(32);
default:
......@@ -3159,9 +3165,15 @@ void TGlslangToSpvTraverser::translateArguments(const glslang::TIntermAggregate&
glslang::TSampler sampler = {};
bool cubeCompare = false;
#ifdef AMD_EXTENSIONS
bool f16ShadowCompare = false;
#endif
if (node.isTexture() || node.isImage()) {
sampler = glslangArguments[0]->getAsTyped()->getType().getSampler();
cubeCompare = sampler.dim == glslang::EsdCube && sampler.arrayed && sampler.shadow;
#ifdef AMD_EXTENSIONS
f16ShadowCompare = sampler.shadow && glslangArguments[1]->getAsTyped()->getType().getBasicType() == glslang::EbtFloat16;
#endif
}
for (int i = 0; i < (int)glslangArguments.size(); ++i) {
......@@ -3186,6 +3198,21 @@ void TGlslangToSpvTraverser::translateArguments(const glslang::TIntermAggregate&
if ((sampler.ms && i == 3) || (! sampler.ms && i == 2))
lvalue = true;
break;
#ifdef AMD_EXTENSIONS
case glslang::EOpSparseTexture:
if (((cubeCompare || f16ShadowCompare) && i == 3) || (! (cubeCompare || f16ShadowCompare) && i == 2))
lvalue = true;
break;
case glslang::EOpSparseTextureClamp:
if (((cubeCompare || f16ShadowCompare) && i == 4) || (! (cubeCompare || f16ShadowCompare) && i == 3))
lvalue = true;
break;
case glslang::EOpSparseTextureLod:
case glslang::EOpSparseTextureOffset:
if ((f16ShadowCompare && i == 4) || (! f16ShadowCompare && i == 3))
lvalue = true;
break;
#else
case glslang::EOpSparseTexture:
if ((cubeCompare && i == 3) || (! cubeCompare && i == 2))
lvalue = true;
......@@ -3199,6 +3226,7 @@ void TGlslangToSpvTraverser::translateArguments(const glslang::TIntermAggregate&
if (i == 3)
lvalue = true;
break;
#endif
case glslang::EOpSparseTextureFetch:
if ((sampler.dim != glslang::EsdRect && i == 3) || (sampler.dim == glslang::EsdRect && i == 2))
lvalue = true;
......@@ -3207,6 +3235,23 @@ void TGlslangToSpvTraverser::translateArguments(const glslang::TIntermAggregate&
if ((sampler.dim != glslang::EsdRect && i == 4) || (sampler.dim == glslang::EsdRect && i == 3))
lvalue = true;
break;
#ifdef AMD_EXTENSIONS
case glslang::EOpSparseTextureLodOffset:
case glslang::EOpSparseTextureGrad:
case glslang::EOpSparseTextureOffsetClamp:
if ((f16ShadowCompare && i == 5) || (! f16ShadowCompare && i == 4))
lvalue = true;
break;
case glslang::EOpSparseTextureGradOffset:
case glslang::EOpSparseTextureGradClamp:
if ((f16ShadowCompare && i == 6) || (! f16ShadowCompare && i == 5))
lvalue = true;
break;
case glslang::EOpSparseTextureGradOffsetClamp:
if ((f16ShadowCompare && i == 7) || (! f16ShadowCompare && i == 6))
lvalue = true;
break;
#else
case glslang::EOpSparseTextureLodOffset:
case glslang::EOpSparseTextureGrad:
case glslang::EOpSparseTextureOffsetClamp:
......@@ -3222,6 +3267,7 @@ void TGlslangToSpvTraverser::translateArguments(const glslang::TIntermAggregate&
if (i == 6)
lvalue = true;
break;
#endif
case glslang::EOpSparseTextureGather:
if ((sampler.shadow && i == 3) || (! sampler.shadow && i == 2))
lvalue = true;
......@@ -3274,6 +3320,12 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
// Process a GLSL texturing op (will be SPV image)
const glslang::TSampler sampler = node->getAsAggregate() ? node->getAsAggregate()->getSequence()[0]->getAsTyped()->getType().getSampler()
: node->getAsUnaryNode()->getOperand()->getAsTyped()->getType().getSampler();
#ifdef AMD_EXTENSIONS
bool f16ShadowCompare = (sampler.shadow && node->getAsAggregate())
? node->getAsAggregate()->getSequence()[1]->getAsTyped()->getType().getBasicType() == glslang::EbtFloat16
: false;
#endif
std::vector<spv::Id> arguments;
if (node->getAsAggregate())
translateArguments(*node->getAsAggregate(), arguments);
......@@ -3517,6 +3569,9 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
#ifdef AMD_EXTENSIONS
if (cracked.gather)
++nonBiasArgCount; // comp argument should be present when bias argument is present
if (f16ShadowCompare)
++nonBiasArgCount;
#endif
if (cracked.offset)
++nonBiasArgCount;
......@@ -3560,7 +3615,11 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
bool noImplicitLod = false;
// sort out where Dref is coming from
#ifdef AMD_EXTENSIONS
if (cubeCompare || f16ShadowCompare) {
#else
if (cubeCompare) {
#endif
params.Dref = arguments[2];
++extraArgs;
} else if (sampler.shadow && cracked.gather) {
......
......@@ -1751,7 +1751,11 @@ Id Builder::createTextureQueryCall(Op opCode, const TextureParameters& parameter
break;
}
case OpImageQueryLod:
#ifdef AMD_EXTENSIONS
resultType = makeVectorType(getScalarTypeId(getTypeId(parameters.coords)), 2);
#else
resultType = makeVectorType(makeFloatType(32), 2);
#endif
break;
case OpImageQueryLevels:
case OpImageQuerySamples:
......
......@@ -849,6 +849,7 @@ const char* CapabilityString(int info)
case 5013: return "StencilExportEXT";
#ifdef AMD_EXTENSIONS
case 5008: return "Float16ImageAMD";
case 5009: return "ImageGatherBiasLodAMD";
case 5010: return "FragmentMaskAMD";
case 5015: return "ImageReadWriteLodAMD";
......
......@@ -52,7 +52,7 @@ ERROR: 0:209: 'assign' : cannot convert from ' const float' to ' temp 4-compone
ERROR: 0:212: 'sampler2DRect' : Reserved word.
ERROR: 0:244: ':' : wrong operand types: no operation ':' exists that takes a left-hand operand of type ' global void' and a right operand of type ' const int' (or there is no acceptable conversion)
ERROR: 0:245: ':' : wrong operand types: no operation ':' exists that takes a left-hand operand of type ' const int' and a right operand of type ' global void' (or there is no acceptable conversion)
ERROR: 0:248: 'shader half float' : required extension not requested: GL_AMD_gpu_shader_half_float
ERROR: 0:248: 'half floating-point suffix' : required extension not requested: GL_AMD_gpu_shader_half_float
ERROR: 0:248: 'half floating-point suffix' : not supported with this profile: none
ERROR: 0:248: '' : syntax error, unexpected IDENTIFIER, expecting COMMA or SEMICOLON
ERROR: 56 compilation errors. No code generated.
......
This source diff could not be displayed because it is too large. You can view the blob instead.
#version 450 core
#extension GL_ARB_sparse_texture2: enable
#extension GL_ARB_sparse_texture_clamp: enable
#extension GL_AMD_gpu_shader_half_float: enable
#extension GL_AMD_gpu_shader_half_float_fetch: enable
#extension GL_AMD_texture_gather_bias_lod: enable
layout(set = 0, binding = 0) uniform f16sampler1D s1D;
layout(set = 0, binding = 1) uniform f16sampler2D s2D;
layout(set = 0, binding = 2) uniform f16sampler3D s3D;
layout(set = 0, binding = 3) uniform f16sampler2DRect s2DRect;
layout(set = 0, binding = 4) uniform f16samplerCube sCube;
layout(set = 0, binding = 5) uniform f16samplerBuffer sBuffer;
layout(set = 0, binding = 6) uniform f16sampler2DMS s2DMS;
layout(set = 0, binding = 7) uniform f16sampler1DArray s1DArray;
layout(set = 0, binding = 8) uniform f16sampler2DArray s2DArray;
layout(set = 0, binding = 9) uniform f16samplerCubeArray sCubeArray;
layout(set = 0, binding = 10) uniform f16sampler2DMSArray s2DMSArray;
layout(set = 0, binding = 11) uniform f16sampler1DShadow s1DShadow;
layout(set = 0, binding = 12) uniform f16sampler2DShadow s2DShadow;
layout(set = 0, binding = 13) uniform f16sampler2DRectShadow s2DRectShadow;
layout(set = 0, binding = 14) uniform f16samplerCubeShadow sCubeShadow;
layout(set = 0, binding = 15) uniform f16sampler1DArrayShadow s1DArrayShadow;
layout(set = 0, binding = 16) uniform f16sampler2DArrayShadow s2DArrayShadow;
layout(set = 0, binding = 17) uniform f16samplerCubeArrayShadow sCubeArrayShadow;
layout(set = 1, binding = 0) layout(rgba16f) uniform f16image1D i1D;
layout(set = 1, binding = 1) layout(rgba16f) uniform f16image2D i2D;
layout(set = 1, binding = 2) layout(rgba16f) uniform f16image3D i3D;
layout(set = 1, binding = 3) layout(rgba16f) uniform f16image2DRect i2DRect;
layout(set = 1, binding = 4) layout(rgba16f) uniform f16imageCube iCube;
layout(set = 1, binding = 5) layout(rgba16f) uniform f16image1DArray i1DArray;
layout(set = 1, binding = 6) layout(rgba16f) uniform f16image2DArray i2DArray;
layout(set = 1, binding = 7) layout(rgba16f) uniform f16imageCubeArray iCubeArray;
layout(set = 1, binding = 8) layout(rgba16f) uniform f16imageBuffer iBuffer;
layout(set = 1, binding = 9) layout(rgba16f) uniform f16image2DMS i2DMS;
layout(set = 1, binding = 10) layout(rgba16f) uniform f16image2DMSArray i2DMSArray;
layout(set = 2, binding = 0) uniform f16texture1D t1D;
layout(set = 2, binding = 1) uniform f16texture2D t2D;
layout(set = 2, binding = 2) uniform f16texture3D t3D;
layout(set = 2, binding = 3) uniform f16texture2DRect t2DRect;
layout(set = 2, binding = 4) uniform f16textureCube tCube;
layout(set = 2, binding = 5) uniform f16texture1DArray t1DArray;
layout(set = 2, binding = 6) uniform f16texture2DArray t2DArray;
layout(set = 2, binding = 7) uniform f16textureCubeArray tCubeArray;
layout(set = 2, binding = 8) uniform f16textureBuffer tBuffer;
layout(set = 2, binding = 9) uniform f16texture2DMS t2DMS;
layout(set = 2, binding = 10) uniform f16texture2DMSArray t2DMSArray;
layout(set = 2, binding = 11) uniform sampler s;
layout(set = 2, binding = 12) uniform samplerShadow sShadow;
layout(set = 3, binding = 0, input_attachment_index = 0) uniform f16subpassInput subpass;
layout(set = 3, binding = 1, input_attachment_index = 0) uniform f16subpassInputMS subpassMS;
layout(location = 0) in float c1;
layout(location = 1) in vec2 c2;
layout(location = 2) in vec3 c3;
layout(location = 3) in vec4 c4;
layout(location = 4) in float compare;
layout(location = 5) in float lod;
layout(location = 6) in float bias;
layout(location = 7) in float lodClamp;
layout(location = 8) in float dPdxy1;
layout(location = 9) in vec2 dPdxy2;
layout(location = 10) in vec3 dPdxy3;
layout(location = 11) in float16_t f16c1;
layout(location = 12) in f16vec2 f16c2;
layout(location = 13) in f16vec3 f16c3;
layout(location = 14) in f16vec4 f16c4;
layout(location = 15) in float16_t f16lod;
layout(location = 16) in float16_t f16bias;
layout(location = 17) in float16_t f16lodClamp;
layout(location = 18) in float16_t f16dPdxy1;
layout(location = 19) in f16vec2 f16dPdxy2;
layout(location = 20) in f16vec3 f16dPdxy3;
const int offset1 = 1;
const ivec2 offset2 = ivec2(1);
const ivec3 offset3 = ivec3(1);
const ivec2 offsets[4] = { offset2, offset2, offset2, offset2 };
layout(location = 0) out vec4 fragColor;
f16vec4 testTexture()
{
f16vec4 texel = f16vec4(0.0hf);
texel += texture(s1D, c1);
texel += texture(s1D, f16c1, f16bias);
texel += texture(s2D, c2);
texel += texture(s2D, f16c2, f16bias);
texel += texture(s3D, c3);
texel += texture(s3D, f16c3, f16bias);
texel += texture(sCube, c3);
texel += texture(sCube, f16c3, f16bias);
texel.x += texture(s1DShadow, c3);
texel.x += texture(s1DShadow, f16c2, compare, f16bias);
texel.x += texture(s2DShadow, c3);
texel.x += texture(s2DShadow, f16c2, compare, f16bias);
texel.x += texture(sCubeShadow, c4);
texel.x += texture(sCubeShadow, f16c3, compare, f16bias);
texel += texture(s1DArray, c2);
texel += texture(s1DArray, f16c2, f16bias);
texel += texture(s2DArray, c3);
texel += texture(s2DArray, f16c3, f16bias);
texel += texture(sCubeArray, c4);
texel += texture(sCubeArray, f16c4, f16bias);
texel.x += texture(s1DArrayShadow, c3);
texel.x += texture(s1DArrayShadow, f16c2, compare, f16bias);
texel.x += texture(s2DArrayShadow, c4);
texel.x += texture(s2DArrayShadow, f16c3, compare);
texel += texture(s2DRect, c2);
texel += texture(s2DRect, f16c2);
texel.x += texture(s2DRectShadow, c3);
texel.x += texture(s2DRectShadow, f16c2, compare);
texel.x += texture(sCubeArrayShadow, c4, compare);
texel.x += texture(sCubeArrayShadow, f16c4, compare);
return texel;
}
f16vec4 testTextureProj()
{
f16vec4 texel = f16vec4(0.0hf);
texel += textureProj(s1D, c2);
texel += textureProj(s1D, f16c2, f16bias);
texel += textureProj(s1D, c4);
texel += textureProj(s1D, f16c4, f16bias);
texel += textureProj(s2D, c3);
texel += textureProj(s2D, f16c3, f16bias);
texel += textureProj(s2D, c4);
texel += textureProj(s2D, f16c4, f16bias);
texel += textureProj(s3D, c4);
texel += textureProj(s3D, f16c4, f16bias);
texel.x += textureProj(s1DShadow, c4);
texel.x += textureProj(s1DShadow, f16c3, compare, f16bias);
texel.x += textureProj(s2DShadow, c4);
texel.x += textureProj(s2DShadow, f16c3, compare, f16bias);
texel += textureProj(s2DRect, c3);
texel += textureProj(s2DRect, f16c3);
texel += textureProj(s2DRect, c4);
texel += textureProj(s2DRect, f16c4);
texel.x += textureProj(s2DRectShadow, c4);
texel.x += textureProj(s2DRectShadow, f16c3, compare);
return texel;
}
f16vec4 testTextureLod()
{
f16vec4 texel = f16vec4(0.0hf);
texel += textureLod(s1D, c1, lod);
texel += textureLod(s1D, f16c1, f16lod);
texel += textureLod(s2D, c2, lod);
texel += textureLod(s2D, f16c2, f16lod);
texel += textureLod(s3D, c3, lod);
texel += textureLod(s3D, f16c3, f16lod);
texel += textureLod(sCube, c3, lod);
texel += textureLod(sCube, f16c3, f16lod);
texel.x += textureLod(s1DShadow, c3, lod);
texel.x += textureLod(s1DShadow, f16c2, compare, f16lod);
texel.x += textureLod(s2DShadow, c3, lod);
texel.x += textureLod(s2DShadow, f16c2, compare, f16lod);
texel += textureLod(s1DArray, c2, lod);
texel += textureLod(s1DArray, f16c2, f16lod);
texel += textureLod(s2DArray, c3, lod);
texel += textureLod(s2DArray, f16c3, f16lod);
texel.x += textureLod(s1DArrayShadow, c3, lod);
texel.x += textureLod(s1DArrayShadow, f16c2, compare, f16lod);
texel += textureLod(sCubeArray, c4, lod);
texel += textureLod(sCubeArray, f16c4, f16lod);
return texel;
}
f16vec4 testTextureOffset()
{
f16vec4 texel = f16vec4(0.0hf);
texel += textureOffset(s1D, c1, offset1);
texel += textureOffset(s1D, f16c1, offset1, f16bias);
texel += textureOffset(s2D, c2, offset2);
texel += textureOffset(s2D, f16c2, offset2, f16bias);
texel += textureOffset(s3D, c3, offset3);
texel += textureOffset(s3D, f16c3, offset3, f16bias);
texel += textureOffset(s2DRect, c2, offset2);
texel += textureOffset(s2DRect, f16c2, offset2);
texel.x += textureOffset(s2DRectShadow, c3, offset2);
texel.x += textureOffset(s2DRectShadow, f16c2, compare, offset2);
texel.x += textureOffset(s1DShadow, c3, offset1);
texel.x += textureOffset(s1DShadow, f16c2, compare, offset1, f16bias);
texel.x += textureOffset(s2DShadow, c3, offset2);
texel.x += textureOffset(s2DShadow, f16c2, compare, offset2, f16bias);
texel += textureOffset(s1DArray, c2, offset1);
texel += textureOffset(s1DArray, f16c2, offset1, f16bias);
texel += textureOffset(s2DArray, c3, offset2);
texel += textureOffset(s2DArray, f16c3, offset2, f16bias);
texel.x += textureOffset(s1DArrayShadow, c3, offset1);
texel.x += textureOffset(s1DArrayShadow, f16c2, compare, offset1, f16bias);
texel.x += textureOffset(s2DArrayShadow, c4, offset2);
texel.x += textureOffset(s2DArrayShadow, f16c3, compare, offset2);
return texel;
}
f16vec4 testTextureProjOffset()
{
f16vec4 texel = f16vec4(0.0hf);
texel += textureProjOffset(s1D, c2, offset1);
texel += textureProjOffset(s1D, f16c2, offset1, f16bias);
texel += textureProjOffset(s1D, c4, offset1);
texel += textureProjOffset(s1D, f16c4, offset1, f16bias);
texel += textureProjOffset(s2D, c3, offset2);
texel += textureProjOffset(s2D, f16c3, offset2, f16bias);
texel += textureProjOffset(s2D, c4, offset2);
texel += textureProjOffset(s2D, f16c4, offset2, f16bias);
texel += textureProjOffset(s3D, c4, offset3);
texel += textureProjOffset(s3D, f16c4, offset3, f16bias);
texel += textureProjOffset(s2DRect, c3, offset2);
texel += textureProjOffset(s2DRect, f16c3, offset2);
texel += textureProjOffset(s2DRect, c4, offset2);
texel += textureProjOffset(s2DRect, f16c4, offset2);
texel.x += textureProjOffset(s2DRectShadow, c4, offset2);
texel.x += textureProjOffset(s2DRectShadow, f16c3, compare, offset2);
texel.x += textureProjOffset(s1DShadow, c4, offset1);
texel.x += textureProjOffset(s1DShadow, f16c3, compare, offset1, f16bias);
texel.x += textureProjOffset(s2DShadow, c4, offset2);
texel.x += textureProjOffset(s2DShadow, f16c3, compare, offset2, f16bias);
return texel;
}
f16vec4 testTextureLodOffset()
{
f16vec4 texel = f16vec4(0.0hf);
texel += textureLodOffset(s1D, c1, lod, offset1);
texel += textureLodOffset(s1D, f16c1, f16lod, offset1);
texel += textureLodOffset(s2D, c2, lod, offset2);
texel += textureLodOffset(s2D, f16c2, f16lod, offset2);
texel += textureLodOffset(s3D, c3, lod, offset3);
texel += textureLodOffset(s3D, f16c3, f16lod, offset3);
texel.x += textureLodOffset(s1DShadow, c3, lod, offset1);
texel.x += textureLodOffset(s1DShadow, f16c2, compare, f16lod, offset1);
texel.x += textureLodOffset(s2DShadow, c3, lod, offset2);
texel.x += textureLodOffset(s2DShadow, f16c2, compare, f16lod, offset2);
texel += textureLodOffset(s1DArray, c2, lod, offset1);
texel += textureLodOffset(s1DArray, f16c2, f16lod, offset1);
texel += textureLodOffset(s2DArray, c3, lod, offset2);
texel += textureLodOffset(s2DArray, f16c3, f16lod, offset2);
texel.x += textureLodOffset(s1DArrayShadow, c3, lod, offset1);
texel.x += textureLodOffset(s1DArrayShadow, f16c2, compare, f16lod, offset1);
return texel;
}
f16vec4 testTextureProjLodOffset()
{
f16vec4 texel = f16vec4(0.0hf);
texel += textureProjLodOffset(s1D, c2, lod, offset1);
texel += textureProjLodOffset(s1D, f16c2, f16lod, offset1);
texel += textureProjLodOffset(s1D, c4, lod, offset1);
texel += textureProjLodOffset(s1D, f16c4, f16lod, offset1);
texel += textureProjLodOffset(s2D, c3, lod, offset2);
texel += textureProjLodOffset(s2D, f16c3, f16lod, offset2);
texel += textureProjLodOffset(s2D, c4, lod, offset2);
texel += textureProjLodOffset(s2D, f16c4, f16lod, offset2);
texel += textureProjLodOffset(s3D, c4, lod, offset3);
texel += textureProjLodOffset(s3D, f16c4, f16lod, offset3);
texel.x += textureProjLodOffset(s1DShadow, c4, lod, offset1);
texel.x += textureProjLodOffset(s1DShadow, f16c3, compare, f16lod, offset1);
texel.x += textureProjLodOffset(s2DShadow, c4, lod, offset2);
texel.x += textureProjLodOffset(s2DShadow, f16c3, compare, f16lod, offset2);
return texel;
}
f16vec4 testTexelFetch()
{
f16vec4 texel = f16vec4(0.0hf);
texel += texelFetch(s1D, int(c1), int(lod));
texel += texelFetch(s2D, ivec2(c2), int(lod));
texel += texelFetch(s3D, ivec3(c3), int(lod));
texel += texelFetch(s2DRect, ivec2(c2));
texel += texelFetch(s1DArray, ivec2(c2), int(lod));
texel += texelFetch(s2DArray, ivec3(c3), int(lod));
texel += texelFetch(sBuffer, int(c1));
texel += texelFetch(s2DMS, ivec2(c2), 1);
texel += texelFetch(s2DMSArray, ivec3(c3), 2);
return texel;
}
f16vec4 testTexelFetchOffset()
{
f16vec4 texel = f16vec4(0.0hf);
texel += texelFetchOffset(s1D, int(c1), int(lod), offset1);
texel += texelFetchOffset(s2D, ivec2(c2), int(lod), offset2);
texel += texelFetchOffset(s3D, ivec3(c3), int(lod), offset3);
texel += texelFetchOffset(s2DRect, ivec2(c2), offset2);
texel += texelFetchOffset(s1DArray, ivec2(c2), int(lod), offset1);
texel += texelFetchOffset(s2DArray, ivec3(c3), int(lod), offset2);
return texel;
}
f16vec4 testTextureGrad()
{
f16vec4 texel = f16vec4(0.0hf);
texel += textureGrad(s1D, c1, dPdxy1, dPdxy1);
texel += textureGrad(s1D, f16c1, f16dPdxy1, f16dPdxy1);
texel += textureGrad(s2D, c2, dPdxy2, dPdxy2);
texel += textureGrad(s2D, f16c2, f16dPdxy2, f16dPdxy2);
texel += textureGrad(s3D, c3, dPdxy3, dPdxy3);
texel += textureGrad(s3D, f16c3, f16dPdxy3, f16dPdxy3);
texel += textureGrad(sCube, c3, dPdxy3, dPdxy3);
texel += textureGrad(sCube, f16c3, f16dPdxy3, f16dPdxy3);
texel += textureGrad(s2DRect, c2, dPdxy2, dPdxy2);
texel += textureGrad(s2DRect, f16c2, f16dPdxy2, f16dPdxy2);
texel.x += textureGrad(s2DRectShadow, c3, dPdxy2, dPdxy2);
texel.x += textureGrad(s2DRectShadow, f16c2, compare, f16dPdxy2, f16dPdxy2);
texel.x += textureGrad(s1DShadow, c3, dPdxy1, dPdxy1);
texel.x += textureGrad(s1DShadow, f16c2, compare, f16dPdxy1, f16dPdxy1);
texel.x += textureGrad(s2DShadow, c3, dPdxy2, dPdxy2);
texel.x += textureGrad(s2DShadow, f16c2, compare, f16dPdxy2, f16dPdxy2);
texel.x += textureGrad(sCubeShadow, c4, dPdxy3, dPdxy3);
texel.x += textureGrad(sCubeShadow, f16c3, compare, f16dPdxy3, f16dPdxy3);
texel += textureGrad(s1DArray, c2, dPdxy1, dPdxy1);
texel += textureGrad(s1DArray, f16c2, f16dPdxy1, f16dPdxy1);
texel += textureGrad(s2DArray, c3, dPdxy2, dPdxy2);
texel += textureGrad(s2DArray, f16c3, f16dPdxy2, f16dPdxy2);
texel.x += textureGrad(s1DArrayShadow, c3, dPdxy1, dPdxy1);
texel.x += textureGrad(s1DArrayShadow, f16c2, compare, f16dPdxy1, f16dPdxy1);
texel.x += textureGrad(s2DArrayShadow, c4, dPdxy2, dPdxy2);
texel.x += textureGrad(s2DArrayShadow, f16c3, compare, f16dPdxy2, f16dPdxy2);
texel += textureGrad(sCubeArray, c4, dPdxy3, dPdxy3);
texel += textureGrad(sCubeArray, f16c4, f16dPdxy3, f16dPdxy3);
return texel;
}
f16vec4 testTextureGradOffset()
{
f16vec4 texel = f16vec4(0.0hf);
texel += textureGradOffset(s1D, c1, dPdxy1, dPdxy1, offset1);
texel += textureGradOffset(s1D, f16c1, f16dPdxy1, f16dPdxy1, offset1);
texel += textureGradOffset(s2D, c2, dPdxy2, dPdxy2, offset2);
texel += textureGradOffset(s2D, f16c2, f16dPdxy2, f16dPdxy2, offset2);
texel += textureGradOffset(s3D, c3, dPdxy3, dPdxy3, offset3);
texel += textureGradOffset(s3D, f16c3, f16dPdxy3, f16dPdxy3, offset3);
texel += textureGradOffset(s2DRect, c2, dPdxy2, dPdxy2, offset2);
texel += textureGradOffset(s2DRect, f16c2, f16dPdxy2, f16dPdxy2, offset2);
texel.x += textureGradOffset(s2DRectShadow, c3, dPdxy2, dPdxy2, offset2);
texel.x += textureGradOffset(s2DRectShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, offset2);
texel.x += textureGradOffset(s1DShadow, c3, dPdxy1, dPdxy1, offset1);
texel.x += textureGradOffset(s1DShadow, f16c2, compare, f16dPdxy1, f16dPdxy1, offset1);
texel.x += textureGradOffset(s2DShadow, c3, dPdxy2, dPdxy2, offset2);
texel.x += textureGradOffset(s2DShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, offset2);
texel += textureGradOffset(s1DArray, c2, dPdxy1, dPdxy1, offset1);
texel += textureGradOffset(s1DArray, f16c2, f16dPdxy1, f16dPdxy1, offset1);
texel += textureGradOffset(s2DArray, c3, dPdxy2, dPdxy2, offset2);
texel += textureGradOffset(s2DArray, f16c3, f16dPdxy2, f16dPdxy2, offset2);
texel.x += textureGradOffset(s1DArrayShadow, c3, dPdxy1, dPdxy1, offset1);
texel.x += textureGradOffset(s1DArrayShadow, f16c2, compare, f16dPdxy1, f16dPdxy1, offset1);
texel.x += textureGradOffset(s2DArrayShadow, c4, dPdxy2, dPdxy2, offset2);
texel.x += textureGradOffset(s2DArrayShadow, f16c3, compare, f16dPdxy2, f16dPdxy2, offset2);
return texel;
}
f16vec4 testTextureProjGrad()
{
f16vec4 texel = f16vec4(0.0hf);
texel += textureProjGrad(s1D, c2, dPdxy1, dPdxy1);
texel += textureProjGrad(s1D, f16c2, f16dPdxy1, f16dPdxy1);
texel += textureProjGrad(s1D, c4, dPdxy1, dPdxy1);
texel += textureProjGrad(s1D, f16c4, f16dPdxy1, f16dPdxy1);
texel += textureProjGrad(s2D, c3, dPdxy2, dPdxy2);
texel += textureProjGrad(s2D, f16c3, f16dPdxy2, f16dPdxy2);
texel += textureProjGrad(s2D, c4, dPdxy2, dPdxy2);
texel += textureProjGrad(s2D, f16c4, f16dPdxy2, f16dPdxy2);
texel += textureProjGrad(s3D, c4, dPdxy3, dPdxy3);
texel += textureProjGrad(s3D, f16c4, f16dPdxy3, f16dPdxy3);
texel += textureProjGrad(s2DRect, c3, dPdxy2, dPdxy2);
texel += textureProjGrad(s2DRect, f16c3, f16dPdxy2, f16dPdxy2);
texel += textureProjGrad(s2DRect, c4, dPdxy2, dPdxy2);
texel += textureProjGrad(s2DRect, f16c4, f16dPdxy2, f16dPdxy2);
texel.x += textureProjGrad(s2DRectShadow, c4, dPdxy2, dPdxy2);
texel.x += textureProjGrad(s2DRectShadow, f16c3, compare, f16dPdxy2, f16dPdxy2);
texel.x += textureProjGrad(s1DShadow, c4, dPdxy1, dPdxy1);
texel.x += textureProjGrad(s1DShadow, f16c3, compare, f16dPdxy1, f16dPdxy1);
texel.x += textureProjGrad(s2DShadow, c4, dPdxy2, dPdxy2);
texel.x += textureProjGrad(s2DShadow, f16c3, compare, f16dPdxy2, f16dPdxy2);
return texel;
}
f16vec4 testTextureProjGradoffset()
{
f16vec4 texel = f16vec4(0.0hf);
texel += textureProjGradOffset(s1D, c2, dPdxy1, dPdxy1, offset1);
texel += textureProjGradOffset(s1D, f16c2, f16dPdxy1, f16dPdxy1, offset1);
texel += textureProjGradOffset(s1D, c4, dPdxy1, dPdxy1, offset1);
texel += textureProjGradOffset(s1D, f16c4, f16dPdxy1, f16dPdxy1, offset1);
texel += textureProjGradOffset(s2D, c3, dPdxy2, dPdxy2, offset2);
texel += textureProjGradOffset(s2D, f16c3, f16dPdxy2, f16dPdxy2, offset2);
texel += textureProjGradOffset(s2D, c4, dPdxy2, dPdxy2, offset2);
texel += textureProjGradOffset(s2D, f16c4, f16dPdxy2, f16dPdxy2, offset2);
texel += textureProjGradOffset(s2DRect, c3, dPdxy2, dPdxy2, offset2);
texel += textureProjGradOffset(s2DRect, f16c3, f16dPdxy2, f16dPdxy2, offset2);
texel += textureProjGradOffset(s2DRect, c4, dPdxy2, dPdxy2, offset2);
texel += textureProjGradOffset(s2DRect, f16c4, f16dPdxy2, f16dPdxy2, offset2);
texel.x += textureProjGradOffset(s2DRectShadow, c4, dPdxy2, dPdxy2, offset2);
texel.x += textureProjGradOffset(s2DRectShadow, f16c3, compare, f16dPdxy2, f16dPdxy2, offset2);
texel += textureProjGradOffset(s3D, c4, dPdxy3, dPdxy3, offset3);
texel += textureProjGradOffset(s3D, f16c4, f16dPdxy3, f16dPdxy3, offset3);
texel.x += textureProjGradOffset(s1DShadow, c4, dPdxy1, dPdxy1, offset1);
texel.x += textureProjGradOffset(s1DShadow, f16c3, compare, f16dPdxy1, f16dPdxy1, offset1);
texel.x += textureProjGradOffset(s2DShadow, c4, dPdxy2, dPdxy2, offset2);
texel.x += textureProjGradOffset(s2DShadow, f16c3, compare, f16dPdxy2, f16dPdxy2, offset2);
return texel;
}
f16vec4 testTextureGather()
{
f16vec4 texel = f16vec4(0.0hf);
texel += textureGather(s2D, c2, 0);
texel += textureGather(s2D, f16c2, 0, f16bias);
texel += textureGather(s2DArray, c3, 0);
texel += textureGather(s2DArray, f16c3, 0, f16bias);
texel += textureGather(sCube, c3, 0);
texel += textureGather(sCube, f16c3, 0, f16bias);
texel += textureGather(sCubeArray, c4, 0);
texel += textureGather(sCubeArray, f16c4, 0, f16bias);
texel += textureGather(s2DRect, c2, 0);
texel += textureGather(s2DRect, f16c2, 0);
texel += textureGather(s2DShadow, c2, compare);
texel += textureGather(s2DShadow, f16c2, compare);
texel += textureGather(s2DArrayShadow, c3, compare);
texel += textureGather(s2DArrayShadow, f16c3, compare);
texel += textureGather(sCubeShadow, c3, compare);
texel += textureGather(sCubeShadow, f16c3, compare);
texel += textureGather(sCubeArrayShadow, c4, compare);
texel += textureGather(sCubeArrayShadow, f16c4, compare);
texel += textureGather(s2DRectShadow, c2, compare);
texel += textureGather(s2DRectShadow, f16c2, compare);
return texel;
}
f16vec4 testTextureGatherOffset()
{
f16vec4 texel = f16vec4(0.0hf);
texel += textureGatherOffset(s2D, c2, offset2, 0);
texel += textureGatherOffset(s2D, f16c2, offset2, 0, f16bias);
texel += textureGatherOffset(s2DArray, c3, offset2, 0);
texel += textureGatherOffset(s2DArray, f16c3, offset2, 0, f16bias);
texel += textureGatherOffset(s2DRect, c2, offset2, 0);
texel += textureGatherOffset(s2DRect, f16c2, offset2, 0);
texel += textureGatherOffset(s2DShadow, c2, compare, offset2);
texel += textureGatherOffset(s2DShadow, f16c2, compare, offset2);
texel += textureGatherOffset(s2DArrayShadow, c3, compare, offset2);
texel += textureGatherOffset(s2DArrayShadow, f16c3, compare, offset2);
texel += textureGatherOffset(s2DRectShadow, c2, compare, offset2);
texel += textureGatherOffset(s2DRectShadow, f16c2, compare, offset2);
return texel;
}
f16vec4 testTextureGatherOffsets()
{
f16vec4 texel = f16vec4(0.0hf);
texel += textureGatherOffsets(s2D, c2, offsets, 0);
texel += textureGatherOffsets(s2D, f16c2, offsets, 0, f16bias);
texel += textureGatherOffsets(s2DArray, c3, offsets, 0);
texel += textureGatherOffsets(s2DArray, f16c3, offsets, 0, f16bias);
texel += textureGatherOffsets(s2DRect, c2, offsets, 0);
texel += textureGatherOffsets(s2DRect, f16c2, offsets, 0);
texel += textureGatherOffsets(s2DShadow, c2, compare, offsets);
texel += textureGatherOffsets(s2DShadow, f16c2, compare, offsets);
texel += textureGatherOffsets(s2DArrayShadow, c3, compare, offsets);
texel += textureGatherOffsets(s2DArrayShadow, f16c3, compare, offsets);
texel += textureGatherOffsets(s2DRectShadow, c2, compare, offsets);
texel += textureGatherOffsets(s2DRectShadow, f16c2, compare, offsets);
return texel;
}
f16vec4 testTextureGatherLod()
{
f16vec4 texel = f16vec4(0.0hf);
texel += textureGatherLodAMD(s2D, c2, lod, 0);
texel += textureGatherLodAMD(s2D, f16c2, f16lod, 0);
texel += textureGatherLodAMD(s2DArray, c3, lod, 0);
texel += textureGatherLodAMD(s2DArray, f16c3, f16lod, 0);
texel += textureGatherLodAMD(sCube, c3, lod, 0);
texel += textureGatherLodAMD(sCube, f16c3, f16lod, 0);
texel += textureGatherLodAMD(sCubeArray, c4, lod, 0);
texel += textureGatherLodAMD(sCubeArray, f16c4, f16lod, 0);
return texel;
}
f16vec4 testTextureGatherLodOffset()
{
f16vec4 texel = f16vec4(0.0hf);
texel += textureGatherLodOffsetAMD(s2D, c2, lod, offset2, 0);
texel += textureGatherLodOffsetAMD(s2D, f16c2, f16lod, offset2, 0);
texel += textureGatherLodOffsetAMD(s2DArray, c3, lod, offset2, 0);
texel += textureGatherLodOffsetAMD(s2DArray, f16c3, f16lod, offset2, 0);
return texel;
}
f16vec4 testTextureGatherLodOffsets()
{
f16vec4 texel = f16vec4(0.0hf);
texel += textureGatherLodOffsetsAMD(s2D, c2, lod, offsets, 0);
texel += textureGatherLodOffsetsAMD(s2D, f16c2, f16lod, offsets, 0);
texel += textureGatherLodOffsetsAMD(s2DArray, c3, lod, offsets, 0);
texel += textureGatherLodOffsetsAMD(s2DArray, f16c3, f16lod, offsets, 0);
return texel;
}
ivec4 testTextureSize()
{
ivec4 size = ivec4(0);
size.x += textureSize(s1D, int(lod));
size.xy += textureSize(s2D, int(lod));
size.xyz += textureSize(s3D, int(lod));
size.xy += textureSize(sCube, int(lod));
size.x += textureSize(s1DShadow, int(lod));
size.xy += textureSize(s2DShadow, int(lod));
size.xy += textureSize(sCubeShadow, int(lod));
size.xyz += textureSize(sCubeArray, int(lod));
size.xyz += textureSize(sCubeArrayShadow, int(lod));
size.xy += textureSize(s2DRect);
size.xy += textureSize(s2DRectShadow);
size.xy += textureSize(s1DArray, int(lod));
size.xyz += textureSize(s2DArray, int(lod));
size.xy += textureSize(s1DArrayShadow, int(lod));
size.xyz += textureSize(s2DArrayShadow, int(lod));
size.x += textureSize(sBuffer);
size.xy += textureSize(s2DMS);
size.xyz += textureSize(s2DMSArray);
return size;
}
vec2 testTextureQueryLod()
{
vec2 lod = vec2(0.0);
lod += textureQueryLod(s1D, c1);
lod += textureQueryLod(s1D, f16c1);
lod += textureQueryLod(s2D, c2);
lod += textureQueryLod(s2D, f16c2);
lod += textureQueryLod(s3D, c3);
lod += textureQueryLod(s3D, f16c3);
lod += textureQueryLod(sCube, c3);
lod += textureQueryLod(sCube, f16c3);
lod += textureQueryLod(s1DArray, c1);
lod += textureQueryLod(s1DArray, f16c1);
lod += textureQueryLod(s2DArray, c2);
lod += textureQueryLod(s2DArray, f16c2);
lod += textureQueryLod(sCubeArray, c3);
lod += textureQueryLod(sCubeArray, f16c3);
lod += textureQueryLod(s1DShadow, c1);
lod += textureQueryLod(s1DShadow, f16c1);
lod += textureQueryLod(s2DShadow, c2);
lod += textureQueryLod(s2DShadow, f16c2);
lod += textureQueryLod(sCubeArrayShadow, c3);
lod += textureQueryLod(sCubeArrayShadow, f16c3);
lod += textureQueryLod(s1DArrayShadow, c1);
lod += textureQueryLod(s1DArrayShadow, f16c1);
lod += textureQueryLod(s2DArrayShadow, c2);
lod += textureQueryLod(s2DArrayShadow, f16c2);
lod += textureQueryLod(sCubeArrayShadow, c3);
lod += textureQueryLod(sCubeArrayShadow, f16c3);
return lod;
}
int testTextureQueryLevels()
{
int levels = 0;
levels += textureQueryLevels(s1D);
levels += textureQueryLevels(s2D);
levels += textureQueryLevels(s3D);
levels += textureQueryLevels(sCube);
levels += textureQueryLevels(s1DShadow);
levels += textureQueryLevels(s2DShadow);
levels += textureQueryLevels(sCubeShadow);
levels += textureQueryLevels(sCubeArray);
levels += textureQueryLevels(sCubeArrayShadow);
levels += textureQueryLevels(s1DArray);
levels += textureQueryLevels(s2DArray);
levels += textureQueryLevels(s1DArrayShadow);
levels += textureQueryLevels(s2DArrayShadow);
return levels;
}
int testTextureSamples()
{
int samples = 0;
samples += textureSamples(s2DMS);
samples += textureSamples(s2DMSArray);
return samples;
}
f16vec4 testImageLoad()
{
f16vec4 texel = f16vec4(0.0hf);
texel += imageLoad(i1D, int(c1));
texel += imageLoad(i2D, ivec2(c2));
texel += imageLoad(i3D, ivec3(c3));
texel += imageLoad(i2DRect, ivec2(c2));
texel += imageLoad(iCube, ivec3(c3));
texel += imageLoad(iBuffer, int(c1));
texel += imageLoad(i1DArray, ivec2(c2));
texel += imageLoad(i2DArray, ivec3(c3));
texel += imageLoad(iCubeArray, ivec3(c3));
texel += imageLoad(i2DMS, ivec2(c2), 1);
texel += imageLoad(i2DMSArray, ivec3(c3), 1);
return texel;
}
void testImageStore(f16vec4 data)
{
imageStore(i1D, int(c1), data);
imageStore(i2D, ivec2(c2), data);
imageStore(i3D, ivec3(c3), data);
imageStore(i2DRect, ivec2(c2), data);
imageStore(iCube, ivec3(c3), data);
imageStore(iBuffer, int(c1), data);
imageStore(i1DArray, ivec2(c2), data);
imageStore(i2DArray, ivec3(c3), data);
imageStore(iCubeArray, ivec3(c3), data);
imageStore(i2DMS, ivec2(c2), 1, data);
imageStore(i2DMSArray, ivec3(c3), 1, data);
}
f16vec4 testSparseTexture()
{
f16vec4 texel = f16vec4(0.0hf);
sparseTextureARB(s2D, c2, texel);
sparseTextureARB(s2D, f16c2, texel, f16bias);
sparseTextureARB(s3D, c3, texel);
sparseTextureARB(s3D, f16c3, texel, f16bias);
sparseTextureARB(sCube, c3, texel);
sparseTextureARB(sCube, f16c3, texel, f16bias);
sparseTextureARB(s2DShadow, c3, texel.x);
sparseTextureARB(s2DShadow, f16c2, compare, texel.x, f16bias);
sparseTextureARB(sCubeShadow, c4, texel.x);
sparseTextureARB(sCubeShadow, f16c3, compare, texel.x, f16bias);
sparseTextureARB(s2DArray, c3, texel);
sparseTextureARB(s2DArray, f16c3, texel, f16bias);
sparseTextureARB(sCubeArray, c4, texel);
sparseTextureARB(sCubeArray, f16c4, texel, f16bias);
sparseTextureARB(s2DArrayShadow, c4, texel.x);
sparseTextureARB(s2DArrayShadow, f16c3, compare, texel.x);
sparseTextureARB(s2DRect, c2, texel);
sparseTextureARB(s2DRect, f16c2, texel);
sparseTextureARB(s2DRectShadow, c3, texel.x);
sparseTextureARB(s2DRectShadow, f16c2, compare, texel.x);
sparseTextureARB(sCubeArrayShadow, c4, compare, texel.x);
sparseTextureARB(sCubeArrayShadow, f16c4, compare, texel.x);
return texel;
}
f16vec4 testSparseTextureLod()
{
f16vec4 texel = f16vec4(0.0hf);
sparseTextureLodARB(s2D, c2, lod, texel);
sparseTextureLodARB(s2D, f16c2, f16lod, texel);
sparseTextureLodARB(s3D, c3, lod, texel);
sparseTextureLodARB(s3D, f16c3, f16lod, texel);
sparseTextureLodARB(sCube, c3, lod, texel);
sparseTextureLodARB(sCube, f16c3, f16lod, texel);
sparseTextureLodARB(s2DShadow, c3, lod, texel.x);
sparseTextureLodARB(s2DShadow, f16c2, compare, f16lod, texel.x);
sparseTextureLodARB(s2DArray, c3, lod, texel);
sparseTextureLodARB(s2DArray, f16c3, f16lod, texel);
sparseTextureLodARB(sCubeArray, c4, lod, texel);
sparseTextureLodARB(sCubeArray, f16c4, f16lod, texel);
return texel;
}
f16vec4 testSparseTextureOffset()
{
f16vec4 texel = f16vec4(0.0hf);
sparseTextureOffsetARB(s2D, c2, offset2, texel);
sparseTextureOffsetARB(s2D, f16c2, offset2, texel, f16bias);
sparseTextureOffsetARB(s3D, c3, offset3, texel);
sparseTextureOffsetARB(s3D, f16c3, offset3, texel, f16bias);
sparseTextureOffsetARB(s2DRect, c2, offset2, texel);
sparseTextureOffsetARB(s2DRect, f16c2, offset2, texel);
sparseTextureOffsetARB(s2DRectShadow, c3, offset2, texel.x);
sparseTextureOffsetARB(s2DRectShadow, f16c2, compare, offset2, texel.x);
sparseTextureOffsetARB(s2DShadow, c3, offset2, texel.x);
sparseTextureOffsetARB(s2DShadow, f16c2, compare, offset2, texel.x, f16bias);
sparseTextureOffsetARB(s2DArray, c3, offset2, texel);
sparseTextureOffsetARB(s2DArray, f16c3, offset2, texel, f16bias);
sparseTextureOffsetARB(s2DArrayShadow, c4, offset2, texel.x);
sparseTextureOffsetARB(s2DArrayShadow, f16c3, compare, offset2, texel.x);
return texel;
}
f16vec4 testSparseTextureLodOffset()
{
f16vec4 texel = f16vec4(0.0hf);
sparseTextureLodOffsetARB(s2D, c2, lod, offset2, texel);
sparseTextureLodOffsetARB(s2D, f16c2, f16lod, offset2, texel);
sparseTextureLodOffsetARB(s3D, c3, lod, offset3, texel);
sparseTextureLodOffsetARB(s3D, f16c3, f16lod, offset3, texel);
sparseTextureLodOffsetARB(s2DShadow, c3, lod, offset2, texel.x);
sparseTextureLodOffsetARB(s2DShadow, f16c2, compare, f16lod, offset2, texel.x);
sparseTextureLodOffsetARB(s2DArray, c3, lod, offset2, texel);
sparseTextureLodOffsetARB(s2DArray, f16c3, f16lod, offset2, texel);
return texel;
}
f16vec4 testSparseTextureGrad()
{
f16vec4 texel = f16vec4(0.0hf);
sparseTextureGradARB(s2D, c2, dPdxy2, dPdxy2, texel);
sparseTextureGradARB(s2D, f16c2, f16dPdxy2, f16dPdxy2, texel);
sparseTextureGradARB(s3D, c3, dPdxy3, dPdxy3, texel);
sparseTextureGradARB(s3D, f16c3, f16dPdxy3, f16dPdxy3, texel);
sparseTextureGradARB(sCube, c3, dPdxy3, dPdxy3, texel);
sparseTextureGradARB(sCube, f16c3, f16dPdxy3, f16dPdxy3, texel);
sparseTextureGradARB(s2DRect, c2, dPdxy2, dPdxy2, texel);
sparseTextureGradARB(s2DRect, f16c2, f16dPdxy2, f16dPdxy2, texel);
sparseTextureGradARB(s2DRectShadow, c3, dPdxy2, dPdxy2, texel.x);
sparseTextureGradARB(s2DRectShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, texel.x);
sparseTextureGradARB(s2DShadow, c3, dPdxy2, dPdxy2, texel.x);
sparseTextureGradARB(s2DShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, texel.x);
sparseTextureGradARB(sCubeShadow, c4, dPdxy3, dPdxy3, texel.x);
sparseTextureGradARB(sCubeShadow, f16c3, compare, f16dPdxy3, f16dPdxy3, texel.x);
sparseTextureGradARB(s2DArray, c3, dPdxy2, dPdxy2, texel);
sparseTextureGradARB(s2DArray, f16c3, f16dPdxy2, f16dPdxy2, texel);
sparseTextureGradARB(s2DArrayShadow, c4, dPdxy2, dPdxy2, texel.x);
sparseTextureGradARB(s2DArrayShadow, f16c3, compare, f16dPdxy2, f16dPdxy2, texel.x);
sparseTextureGradARB(sCubeArray, c4, dPdxy3, dPdxy3, texel);
sparseTextureGradARB(sCubeArray, f16c4, f16dPdxy3, f16dPdxy3, texel);
return texel;
}
f16vec4 testSparseTextureGradOffset()
{
f16vec4 texel = f16vec4(0.0hf);
sparseTextureGradOffsetARB(s2D, c2, dPdxy2, dPdxy2, offset2, texel);
sparseTextureGradOffsetARB(s2D, f16c2, f16dPdxy2, f16dPdxy2, offset2, texel);
sparseTextureGradOffsetARB(s3D, c3, dPdxy3, dPdxy3, offset3, texel);
sparseTextureGradOffsetARB(s3D, f16c3, f16dPdxy3, f16dPdxy3, offset3, texel);
sparseTextureGradOffsetARB(s2DRect, c2, dPdxy2, dPdxy2, offset2, texel);
sparseTextureGradOffsetARB(s2DRect, f16c2, f16dPdxy2, f16dPdxy2, offset2, texel);
sparseTextureGradOffsetARB(s2DRectShadow, c3, dPdxy2, dPdxy2, offset2, texel.x);
sparseTextureGradOffsetARB(s2DRectShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, offset2, texel.x);
sparseTextureGradOffsetARB(s2DShadow, c3, dPdxy2, dPdxy2, offset2, texel.x);
sparseTextureGradOffsetARB(s2DShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, offset2, texel.x);
sparseTextureGradOffsetARB(s2DArray, c3, dPdxy2, dPdxy2, offset2, texel);
sparseTextureGradOffsetARB(s2DArray, f16c3, f16dPdxy2, f16dPdxy2, offset2, texel);
sparseTextureGradOffsetARB(s2DArrayShadow, c4, dPdxy2, dPdxy2, offset2, texel.x);
sparseTextureGradOffsetARB(s2DArrayShadow, f16c3, compare, f16dPdxy2, f16dPdxy2, offset2, texel.x);
return texel;
}
f16vec4 testSparseTexelFetch()
{
f16vec4 texel = f16vec4(0.0hf);
sparseTexelFetchARB(s2D, ivec2(c2), int(lod), texel);
sparseTexelFetchARB(s3D, ivec3(c3), int(lod), texel);
sparseTexelFetchARB(s2DRect, ivec2(c2), texel);
sparseTexelFetchARB(s2DArray, ivec3(c3), int(lod), texel);
sparseTexelFetchARB(s2DMS, ivec2(c2), 1, texel);
sparseTexelFetchARB(s2DMSArray, ivec3(c3), 2, texel);
return texel;
}
f16vec4 testSparseTexelFetchOffset()
{
f16vec4 texel = f16vec4(0.0hf);
sparseTexelFetchOffsetARB(s2D, ivec2(c2), int(lod), offset2, texel);
sparseTexelFetchOffsetARB(s3D, ivec3(c3), int(lod), offset3, texel);
sparseTexelFetchOffsetARB(s2DRect, ivec2(c2), offset2, texel);
sparseTexelFetchOffsetARB(s2DArray, ivec3(c3), int(lod), offset2, texel);
return texel;
}
f16vec4 testSparseTextureGather()
{
f16vec4 texel = f16vec4(0.0hf);
sparseTextureGatherARB(s2D, c2, texel, 0);
sparseTextureGatherARB(s2D, f16c2, texel, 0, f16bias);
sparseTextureGatherARB(s2DArray, c3, texel, 0);
sparseTextureGatherARB(s2DArray, f16c3, texel, 0, f16bias);
sparseTextureGatherARB(sCube, c3, texel, 0);
sparseTextureGatherARB(sCube, f16c3, texel, 0, f16bias);
sparseTextureGatherARB(sCubeArray, c4, texel, 0);
sparseTextureGatherARB(sCubeArray, f16c4, texel, 0, f16bias);
sparseTextureGatherARB(s2DRect, c2, texel, 0);
sparseTextureGatherARB(s2DRect, f16c2, texel, 0);
sparseTextureGatherARB(s2DShadow, c2, compare, texel);
sparseTextureGatherARB(s2DShadow, f16c2, compare, texel);
sparseTextureGatherARB(s2DArrayShadow, c3, compare, texel);
sparseTextureGatherARB(s2DArrayShadow, f16c3, compare, texel);
sparseTextureGatherARB(sCubeShadow, c3, compare, texel);
sparseTextureGatherARB(sCubeShadow, f16c3, compare, texel);
sparseTextureGatherARB(sCubeArrayShadow, c4, compare, texel);
sparseTextureGatherARB(sCubeArrayShadow, f16c4, compare, texel);
sparseTextureGatherARB(s2DRectShadow, c2, compare, texel);
sparseTextureGatherARB(s2DRectShadow, f16c2, compare, texel);
return texel;
}
f16vec4 testSparseTextureGatherOffset()
{
f16vec4 texel = f16vec4(0.0hf);
sparseTextureGatherOffsetARB(s2D, c2, offset2, texel, 0);
sparseTextureGatherOffsetARB(s2D, f16c2, offset2, texel, 0, f16bias);
sparseTextureGatherOffsetARB(s2DArray, c3, offset2, texel, 0);
sparseTextureGatherOffsetARB(s2DArray, f16c3, offset2, texel, 0, f16bias);
sparseTextureGatherOffsetARB(s2DRect, c2, offset2, texel, 0);
sparseTextureGatherOffsetARB(s2DRect, f16c2, offset2, texel, 0);
sparseTextureGatherOffsetARB(s2DShadow, c2, compare, offset2, texel);
sparseTextureGatherOffsetARB(s2DShadow, f16c2, compare, offset2, texel);
sparseTextureGatherOffsetARB(s2DArrayShadow, c3, compare, offset2, texel);
sparseTextureGatherOffsetARB(s2DArrayShadow, f16c3, compare, offset2, texel);
sparseTextureGatherOffsetARB(s2DRectShadow, c2, compare, offset2, texel);
sparseTextureGatherOffsetARB(s2DRectShadow, f16c2, compare, offset2, texel);
return texel;
}
f16vec4 testSparseTextureGatherOffsets()
{
f16vec4 texel = f16vec4(0.0hf);
sparseTextureGatherOffsetsARB(s2D, c2, offsets, texel, 0);
sparseTextureGatherOffsetsARB(s2D, f16c2, offsets, texel, 0, f16bias);
sparseTextureGatherOffsetsARB(s2DArray, c3, offsets, texel, 0);
sparseTextureGatherOffsetsARB(s2DArray, f16c3, offsets, texel, 0, f16bias);
sparseTextureGatherOffsetsARB(s2DRect, c2, offsets, texel, 0);
sparseTextureGatherOffsetsARB(s2DRect, f16c2, offsets, texel, 0);
sparseTextureGatherOffsetsARB(s2DShadow, c2, compare, offsets, texel);
sparseTextureGatherOffsetsARB(s2DShadow, f16c2, compare, offsets, texel);
sparseTextureGatherOffsetsARB(s2DArrayShadow, c3, compare, offsets, texel);
sparseTextureGatherOffsetsARB(s2DArrayShadow, f16c3, compare, offsets, texel);
sparseTextureGatherOffsetsARB(s2DRectShadow, c2, compare, offsets, texel);
sparseTextureGatherOffsetsARB(s2DRectShadow, f16c2, compare, offsets, texel);
return texel;
}
f16vec4 testSparseTextureGatherLod()
{
f16vec4 texel = f16vec4(0.0hf);
sparseTextureGatherLodAMD(s2D, c2, lod, texel, 0);
sparseTextureGatherLodAMD(s2D, f16c2, f16lod, texel, 0);
sparseTextureGatherLodAMD(s2DArray, c3, lod, texel, 0);
sparseTextureGatherLodAMD(s2DArray, f16c3, f16lod, texel, 0);
sparseTextureGatherLodAMD(sCube, c3, lod, texel, 0);
sparseTextureGatherLodAMD(sCube, f16c3, f16lod, texel, 0);
sparseTextureGatherLodAMD(sCubeArray, c4, lod, texel, 0);
sparseTextureGatherLodAMD(sCubeArray, f16c4, f16lod, texel, 0);
return texel;
}
f16vec4 testSparseTextureGatherLodOffset()
{
f16vec4 texel = f16vec4(0.0hf);
sparseTextureGatherLodOffsetAMD(s2D, c2, lod, offset2, texel, 0);
sparseTextureGatherLodOffsetAMD(s2D, f16c2, f16lod, offset2, texel, 0);
sparseTextureGatherLodOffsetAMD(s2DArray, c3, lod, offset2, texel, 0);
sparseTextureGatherLodOffsetAMD(s2DArray, f16c3, f16lod, offset2, texel, 0);
return texel;
}
f16vec4 testSparseTextureGatherLodOffsets()
{
f16vec4 texel = f16vec4(0.0hf);
sparseTextureGatherLodOffsetsAMD(s2D, c2, lod, offsets, texel, 0);
sparseTextureGatherLodOffsetsAMD(s2D, f16c2, f16lod, offsets, texel, 0);
sparseTextureGatherLodOffsetsAMD(s2DArray, c3, lod, offsets, texel, 0);
sparseTextureGatherLodOffsetsAMD(s2DArray, f16c3, f16lod, offsets, texel, 0);
return texel;
}
f16vec4 testSparseImageLoad()
{
f16vec4 texel = f16vec4(0.0hf);
sparseImageLoadARB(i2D, ivec2(c2), texel);
sparseImageLoadARB(i3D, ivec3(c3), texel);
sparseImageLoadARB(i2DRect, ivec2(c2), texel);
sparseImageLoadARB(iCube, ivec3(c3), texel);
sparseImageLoadARB(i2DArray, ivec3(c3), texel);
sparseImageLoadARB(iCubeArray, ivec3(c3), texel);
sparseImageLoadARB(i2DMS, ivec2(c2), 1, texel);
sparseImageLoadARB(i2DMSArray, ivec3(c3), 2, texel);
return texel;
}
f16vec4 testSparseTextureClamp()
{
f16vec4 texel = f16vec4(0.0hf);
sparseTextureClampARB(s2D, c2, lodClamp, texel);
sparseTextureClampARB(s2D, f16c2, f16lodClamp, texel, f16bias);
sparseTextureClampARB(s3D, c3, lodClamp, texel);
sparseTextureClampARB(s3D, f16c3, f16lodClamp, texel, f16bias);
sparseTextureClampARB(sCube, c3, lodClamp, texel);
sparseTextureClampARB(sCube, f16c3, f16lodClamp, texel, f16bias);
sparseTextureClampARB(s2DShadow, c3, lodClamp, texel.x);
sparseTextureClampARB(s2DShadow, f16c2, compare, f16lodClamp, texel.x, f16bias);
sparseTextureClampARB(sCubeShadow, c4, lodClamp, texel.x);
sparseTextureClampARB(sCubeShadow, f16c3, compare, f16lodClamp, texel.x, f16bias);
sparseTextureClampARB(s2DArray, c3, lodClamp, texel);
sparseTextureClampARB(s2DArray, f16c3, f16lodClamp, texel, f16bias);
sparseTextureClampARB(sCubeArray, c4, lodClamp, texel);
sparseTextureClampARB(sCubeArray, f16c4, f16lodClamp, texel, f16bias);
sparseTextureClampARB(s2DArrayShadow, c4, lodClamp, texel.x);
sparseTextureClampARB(s2DArrayShadow, f16c3, compare, f16lodClamp, texel.x);
sparseTextureClampARB(sCubeArrayShadow, c4, compare, lodClamp, texel.x);
sparseTextureClampARB(sCubeArrayShadow, f16c4, compare, f16lodClamp, texel.x);
return texel;
}
f16vec4 testTextureClamp()
{
f16vec4 texel = f16vec4(0.0hf);
texel += textureClampARB(s1D, c1, lodClamp);
texel += textureClampARB(s1D, f16c1, f16lodClamp, f16bias);
texel += textureClampARB(s2D, c2, lodClamp);
texel += textureClampARB(s2D, f16c2, f16lodClamp, f16bias);
texel += textureClampARB(s3D, c3, lodClamp);
texel += textureClampARB(s3D, f16c3, f16lodClamp, f16bias);
texel += textureClampARB(sCube, c3, lodClamp);
texel += textureClampARB(sCube, f16c3, f16lodClamp, f16bias);
texel.x += textureClampARB(s1DShadow, c3, lodClamp);
texel.x += textureClampARB(s1DShadow, f16c2, compare, f16lodClamp, f16bias);
texel.x += textureClampARB(s2DShadow, c3, lodClamp);
texel.x += textureClampARB(s2DShadow, f16c2, compare, f16lodClamp, f16bias);
texel.x += textureClampARB(sCubeShadow, c4, lodClamp);
texel.x += textureClampARB(sCubeShadow, f16c3, compare, f16lodClamp, f16bias);
texel += textureClampARB(s1DArray, c2, lodClamp);
texel += textureClampARB(s1DArray, f16c2, f16lodClamp, f16bias);
texel += textureClampARB(s2DArray, c3, lodClamp);
texel += textureClampARB(s2DArray, f16c3, f16lodClamp, f16bias);
texel += textureClampARB(sCubeArray, c4, lodClamp);
texel += textureClampARB(sCubeArray, f16c4, f16lodClamp, f16bias);
texel.x += textureClampARB(s1DArrayShadow, c3, lodClamp);
texel.x += textureClampARB(s1DArrayShadow, f16c2, compare, f16lodClamp, f16bias);
texel.x += textureClampARB(s2DArrayShadow, c4, lodClamp);
texel.x += textureClampARB(s2DArrayShadow, f16c3, compare, f16lodClamp);
texel.x += textureClampARB(sCubeArrayShadow, c4, compare, lodClamp);
texel.x += textureClampARB(sCubeArrayShadow, f16c4, compare, f16lodClamp);
return texel;
}
f16vec4 testSparseTextureOffsetClamp()
{
f16vec4 texel = f16vec4(0.0hf);
sparseTextureOffsetClampARB(s2D, c2, offset2, lodClamp, texel);
sparseTextureOffsetClampARB(s2D, f16c2, offset2, f16lodClamp, texel, f16bias);
sparseTextureOffsetClampARB(s3D, c3, offset3, lodClamp, texel);
sparseTextureOffsetClampARB(s3D, f16c3, offset3, f16lodClamp, texel, f16bias);
sparseTextureOffsetClampARB(s2DShadow, c3, offset2, lodClamp, texel.x);
sparseTextureOffsetClampARB(s2DShadow, f16c2, compare, offset2, f16lodClamp, texel.x, f16bias);
sparseTextureOffsetClampARB(s2DArray, c3, offset2, lodClamp, texel);
sparseTextureOffsetClampARB(s2DArray, f16c3, offset2, f16lodClamp, texel, f16bias);
sparseTextureOffsetClampARB(s2DArrayShadow, c4, offset2, lodClamp, texel.x);
sparseTextureOffsetClampARB(s2DArrayShadow, f16c3, compare, offset2, f16lodClamp, texel.x);
return texel;
}
f16vec4 testTextureOffsetClamp()
{
f16vec4 texel = f16vec4(0.0hf);
texel += textureOffsetClampARB(s1D, c1, offset1, lodClamp);
texel += textureOffsetClampARB(s1D, f16c1, offset1, f16lodClamp, f16bias);
texel += textureOffsetClampARB(s2D, c2, offset2, lodClamp);
texel += textureOffsetClampARB(s2D, f16c2, offset2, f16lodClamp, f16bias);
texel += textureOffsetClampARB(s3D, c3, offset3, lodClamp);
texel += textureOffsetClampARB(s3D, f16c3, offset3, f16lodClamp, f16bias);
texel.x += textureOffsetClampARB(s1DShadow, c3, offset1, lodClamp);
texel.x += textureOffsetClampARB(s1DShadow, f16c2, compare, offset1, f16lodClamp, f16bias);
texel.x += textureOffsetClampARB(s2DShadow, c3, offset2, lodClamp);
texel.x += textureOffsetClampARB(s2DShadow, f16c2, compare, offset2, f16lodClamp, f16bias);
texel += textureOffsetClampARB(s1DArray, c2, offset1, lodClamp);
texel += textureOffsetClampARB(s1DArray, f16c2, offset1, f16lodClamp, f16bias);
texel += textureOffsetClampARB(s2DArray, c3, offset2, lodClamp);
texel += textureOffsetClampARB(s2DArray, f16c3, offset2, f16lodClamp, f16bias);
texel.x += textureOffsetClampARB(s1DArrayShadow, c3, offset1, lodClamp);
texel.x += textureOffsetClampARB(s1DArrayShadow, f16c2, compare, offset1, f16lodClamp, f16bias);
texel.x += textureOffsetClampARB(s2DArrayShadow, c4, offset2, lodClamp);
texel.x += textureOffsetClampARB(s2DArrayShadow, f16c3, compare, offset2, f16lodClamp);
return texel;
}
f16vec4 testSparseTextureGradClamp()
{
f16vec4 texel = f16vec4(0.0hf);
sparseTextureGradClampARB(s2D, c2, dPdxy2, dPdxy2, lodClamp, texel);
sparseTextureGradClampARB(s2D, f16c2, f16dPdxy2, f16dPdxy2, f16lodClamp, texel);
sparseTextureGradClampARB(s3D, c3, dPdxy3, dPdxy3, lodClamp, texel);
sparseTextureGradClampARB(s3D, f16c3, f16dPdxy3, f16dPdxy3, f16lodClamp, texel);
sparseTextureGradClampARB(sCube, c3, dPdxy3, dPdxy3, lodClamp, texel);
sparseTextureGradClampARB(sCube, f16c3, f16dPdxy3, f16dPdxy3, f16lodClamp, texel);
sparseTextureGradClampARB(s2DShadow, c3, dPdxy2, dPdxy2, lodClamp, texel.x);
sparseTextureGradClampARB(s2DShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, f16lodClamp, texel.x);
sparseTextureGradClampARB(sCubeShadow, c4, dPdxy3, dPdxy3, lodClamp, texel.x);
sparseTextureGradClampARB(sCubeShadow, f16c3, compare, f16dPdxy3, f16dPdxy3, f16lodClamp, texel.x);
sparseTextureGradClampARB(s2DArray, c3, dPdxy2, dPdxy2, lodClamp, texel);
sparseTextureGradClampARB(s2DArray, f16c3, f16dPdxy2, f16dPdxy2, f16lodClamp, texel);
sparseTextureGradClampARB(s2DArrayShadow, c4, dPdxy2, dPdxy2, lodClamp, texel.x);
sparseTextureGradClampARB(s2DArrayShadow, f16c3, compare, f16dPdxy2, f16dPdxy2, f16lodClamp, texel.x);
sparseTextureGradClampARB(sCubeArray, c4, dPdxy3, dPdxy3, lodClamp, texel);
sparseTextureGradClampARB(sCubeArray, f16c4, f16dPdxy3, f16dPdxy3, f16lodClamp, texel);
return texel;
}
f16vec4 testTextureGradClamp()
{
f16vec4 texel = f16vec4(0.0hf);
texel += textureGradClampARB(s1D, c1, dPdxy1, dPdxy1, lodClamp);
texel += textureGradClampARB(s1D, f16c1, f16dPdxy1, f16dPdxy1, f16lodClamp);
texel += textureGradClampARB(s2D, c2, dPdxy2, dPdxy2, lodClamp);
texel += textureGradClampARB(s2D, f16c2, f16dPdxy2, f16dPdxy2, f16lodClamp);
texel += textureGradClampARB(s3D, c3, dPdxy3, dPdxy3, lodClamp);
texel += textureGradClampARB(s3D, f16c3, f16dPdxy3, f16dPdxy3, f16lodClamp);
texel += textureGradClampARB(sCube, c3, dPdxy3, dPdxy3, lodClamp);
texel += textureGradClampARB(sCube, f16c3, f16dPdxy3, f16dPdxy3, f16lodClamp);
texel.x += textureGradClampARB(s1DShadow, c3, dPdxy1, dPdxy1, lodClamp);
texel.x += textureGradClampARB(s1DShadow, f16c2, compare, f16dPdxy1, f16dPdxy1, f16lodClamp);
texel.x += textureGradClampARB(s2DShadow, c3, dPdxy2, dPdxy2, lodClamp);
texel.x += textureGradClampARB(s2DShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, f16lodClamp);
texel.x += textureGradClampARB(sCubeShadow, c4, dPdxy3, dPdxy3, lodClamp);
texel.x += textureGradClampARB(sCubeShadow, f16c3, compare, f16dPdxy3, f16dPdxy3, f16lodClamp);
texel += textureGradClampARB(s1DArray, c2, dPdxy1, dPdxy1, lodClamp);
texel += textureGradClampARB(s1DArray, f16c2, f16dPdxy1, f16dPdxy1, f16lodClamp);
texel += textureGradClampARB(s2DArray, c3, dPdxy2, dPdxy2, lodClamp);
texel += textureGradClampARB(s2DArray, f16c3, f16dPdxy2, f16dPdxy2, f16lodClamp);
texel.x += textureGradClampARB(s1DArrayShadow, c3, dPdxy1, dPdxy1, lodClamp);
texel.x += textureGradClampARB(s1DArrayShadow, f16c2, compare, f16dPdxy1, f16dPdxy1, f16lodClamp);
texel.x += textureGradClampARB(s2DArrayShadow, c4, dPdxy2, dPdxy2, lodClamp);
texel.x += textureGradClampARB(s2DArrayShadow, f16c3, compare, f16dPdxy2, f16dPdxy2, f16lodClamp);
texel += textureGradClampARB(sCubeArray, c4, dPdxy3, dPdxy3, lodClamp);
texel += textureGradClampARB(sCubeArray, f16c4, f16dPdxy3, f16dPdxy3, f16lodClamp);
return texel;
}
f16vec4 testSparseTextureGradOffsetClamp()
{
f16vec4 texel = f16vec4(0.0hf);
sparseTextureGradOffsetClampARB(s2D, c2, dPdxy2, dPdxy2, offset2, lodClamp, texel);
sparseTextureGradOffsetClampARB(s2D, f16c2, f16dPdxy2, f16dPdxy2, offset2, f16lodClamp, texel);
sparseTextureGradOffsetClampARB(s3D, c3, dPdxy3, dPdxy3, offset3, lodClamp, texel);
sparseTextureGradOffsetClampARB(s3D, f16c3, f16dPdxy3, f16dPdxy3, offset3, f16lodClamp, texel);
sparseTextureGradOffsetClampARB(s2DShadow, c3, dPdxy2, dPdxy2, offset2, lodClamp, texel.x);
sparseTextureGradOffsetClampARB(s2DShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, offset2, f16lodClamp, texel.x);
sparseTextureGradOffsetClampARB(s2DArray, c3, dPdxy2, dPdxy2, offset2, lodClamp, texel);
sparseTextureGradOffsetClampARB(s2DArray, f16c3, f16dPdxy2, f16dPdxy2, offset2, f16lodClamp, texel);
sparseTextureGradOffsetClampARB(s2DArrayShadow, c4, dPdxy2, dPdxy2, offset2, lodClamp, texel.x);
sparseTextureGradOffsetClampARB(s2DArrayShadow, f16c3, compare, f16dPdxy2, f16dPdxy2, offset2, f16lodClamp, texel.x);
return texel;
}
f16vec4 testTextureGradOffsetClamp()
{
f16vec4 texel = f16vec4(0.0hf);
texel += textureGradOffsetClampARB(s1D, c1, dPdxy1, dPdxy1, offset1, lodClamp);
texel += textureGradOffsetClampARB(s1D, f16c1, f16dPdxy1, f16dPdxy1, offset1, f16lodClamp);
texel += textureGradOffsetClampARB(s2D, c2, dPdxy2, dPdxy2, offset2, lodClamp);
texel += textureGradOffsetClampARB(s2D, f16c2, f16dPdxy2, f16dPdxy2, offset2, f16lodClamp);
texel += textureGradOffsetClampARB(s3D, c3, dPdxy3, dPdxy3, offset3, lodClamp);
texel += textureGradOffsetClampARB(s3D, f16c3, f16dPdxy3, f16dPdxy3, offset3, f16lodClamp);
texel.x += textureGradOffsetClampARB(s1DShadow, c3, dPdxy1, dPdxy1, offset1, lodClamp);
texel.x += textureGradOffsetClampARB(s1DShadow, f16c2, compare, f16dPdxy1, f16dPdxy1, offset1, f16lodClamp);
texel.x += textureGradOffsetClampARB(s2DShadow, c3, dPdxy2, dPdxy2, offset2, lodClamp);
texel.x += textureGradOffsetClampARB(s2DShadow, f16c2, compare, f16dPdxy2, f16dPdxy2, offset2, f16lodClamp);
texel += textureGradOffsetClampARB(s1DArray, c2, dPdxy1, dPdxy1, offset1, lodClamp);
texel += textureGradOffsetClampARB(s1DArray, f16c2, f16dPdxy1, f16dPdxy1, offset1, f16lodClamp);
texel += textureGradOffsetClampARB(s2DArray, c3, dPdxy2, dPdxy2, offset2, lodClamp);
texel += textureGradOffsetClampARB(s2DArray, f16c3, f16dPdxy2, f16dPdxy2, offset2, f16lodClamp);
texel.x += textureGradOffsetClampARB(s1DArrayShadow, c3, dPdxy1, dPdxy1, offset1, lodClamp);
texel.x += textureGradOffsetClampARB(s1DArrayShadow, f16c2, compare, f16dPdxy1, f16dPdxy1, offset1, f16lodClamp);
texel.x += textureGradOffsetClampARB(s2DArrayShadow, c4, dPdxy2, dPdxy2, offset2, lodClamp);
texel.x += textureGradOffsetClampARB(s2DArrayShadow, f16c3, compare, f16dPdxy2, f16dPdxy2, offset2, f16lodClamp);
return texel;
}
f16vec4 testCombinedTextureSampler()
{
f16vec4 texel = f16vec4(0.0hf);
texel += texture(f16sampler1D(t1D, s), c1);
texel += texture(f16sampler1D(t1D, s), f16c1, f16bias);
texel += texture(f16sampler2D(t2D, s), c2);
texel += texture(f16sampler2D(t2D, s), f16c2, f16bias);
texel += texture(f16sampler3D(t3D, s), c3);
texel += texture(f16sampler3D(t3D, s), f16c3, f16bias);
texel += texture(f16samplerCube(tCube, s), c3);
texel += texture(f16samplerCube(tCube, s), f16c3, f16bias);
texel.x += texture(f16sampler1DShadow(t1D, sShadow), c3);
texel.x += texture(f16sampler1DShadow(t1D, sShadow), f16c2, compare, f16bias);
texel.x += texture(f16sampler2DShadow(t2D, sShadow), c3);
texel.x += texture(f16sampler2DShadow(t2D, sShadow), f16c2, compare, f16bias);
texel.x += texture(f16samplerCubeShadow(tCube, sShadow), c4);
texel.x += texture(f16samplerCubeShadow(tCube, sShadow), f16c3, compare, f16bias);
texel += texture(f16sampler1DArray(t1DArray, s), c2);
texel += texture(f16sampler1DArray(t1DArray, s), f16c2, f16bias);
texel += texture(f16sampler2DArray(t2DArray, s), c3);
texel += texture(f16sampler2DArray(t2DArray, s), f16c3, f16bias);
texel += texture(f16samplerCubeArray(tCubeArray, s), c4);
texel += texture(f16samplerCubeArray(tCubeArray, s), f16c4, f16bias);
texel.x += texture(f16sampler1DArrayShadow(t1DArray, sShadow), c3);
texel.x += texture(f16sampler1DArrayShadow(t1DArray, sShadow), f16c2, compare, f16bias);
texel.x += texture(f16sampler2DArrayShadow(t2DArray, sShadow), c4);
texel.x += texture(f16sampler2DArrayShadow(t2DArray, sShadow), f16c3, compare);
texel += texture(f16sampler2DRect(t2DRect, s), c2);
texel += texture(f16sampler2DRect(t2DRect, s), f16c2);
texel.x += texture(f16sampler2DRectShadow(t2DRect, sShadow), c3);
texel.x += texture(f16sampler2DRectShadow(t2DRect, sShadow), f16c2, compare);
texel.x += texture(f16samplerCubeArrayShadow(tCubeArray, sShadow), c4, compare);
texel.x += texture(f16samplerCubeArrayShadow(tCubeArray, sShadow), f16c4, compare);
return texel;
}
f16vec4 testSubpassLoad()
{
return subpassLoad(subpass) + subpassLoad(subpassMS, 2);
}
void main()
{
f16vec4 result = f16vec4(0.0hf);
result += testTexture();
result += testTextureProj();
result += testTextureLod();
result += testTextureOffset();
result += testTextureLodOffset();
result += testTextureProjLodOffset();
result += testTexelFetch();
result += testTexelFetchOffset();
result += testTextureGrad();
result += testTextureGradOffset();
result += testTextureProjGrad();
result += testTextureProjGradoffset();
result += testTextureGather();
result += testTextureGatherOffset();
result += testTextureGatherOffsets();
result += testTextureGatherLod();
result += testTextureGatherLodOffset();
result += testTextureGatherLodOffsets();
result += f16vec4(testTextureSize());
result.xy += f16vec2(testTextureQueryLod());
result.x += float16_t(testTextureQueryLevels());
result.x += float16_t(testTextureSamples());
result += testImageLoad();
testImageStore(result);
result += testSparseTexture();
result += testSparseTextureLod();
result += testSparseTextureOffset();
result += testSparseTextureLodOffset();
result += testSparseTextureGrad();
result += testSparseTextureGradOffset();
result += testSparseTexelFetch();
result += testSparseTexelFetchOffset();
result += testSparseTextureGather();
result += testSparseTextureGatherOffset();
result += testSparseTextureGatherOffsets();
result += testSparseTextureGatherLod();
result += testSparseTextureGatherLodOffset();
result += testSparseTextureGatherLodOffsets();
result += testSparseImageLoad();
result += testSparseTextureClamp();
result += testTextureClamp();
result += testSparseTextureOffsetClamp();
result += testTextureOffsetClamp();
result += testSparseTextureGrad();
result += testTextureGrad();
result += testSparseTextureGradOffsetClamp();
result += testTextureGradOffsetClamp();
result += testCombinedTextureSampler();
result += testSubpassLoad();
fragColor = result;
}
......@@ -205,6 +205,9 @@ struct TSampler { // misnomer now; includes images, textures without sampler,
switch (type) {
case EbtFloat: break;
#ifdef AMD_EXTENSIONS
case EbtFloat16: s.append("f16"); break;
#endif
case EbtInt: s.append("i"); break;
case EbtUint: s.append("u"); break;
default: break; // some compilers want this
......
......@@ -83,6 +83,9 @@ TBuiltIns::TBuiltIns()
// Set up textual representations for making all the permutations
// of texturing/imaging functions.
prefixes[EbtFloat] = "";
#ifdef AMD_EXTENSIONS
prefixes[EbtFloat16] = "f16";
#endif
prefixes[EbtInt] = "i";
prefixes[EbtUint] = "u";
postfixes[2] = "2";
......@@ -4059,8 +4062,11 @@ void TBuiltIns::add2ndGenerationSamplingImaging(int version, EProfile profile, c
// In this function proper, enumerate the types, then calls the next set of functions
// to enumerate all the uses for that type.
//
#ifdef AMD_EXTENSIONS
TBasicType bTypes[4] = { EbtFloat, EbtFloat16, EbtInt, EbtUint };
#else
TBasicType bTypes[3] = { EbtFloat, EbtInt, EbtUint };
#endif
bool skipBuffer = (profile == EEsProfile && version < 310) || (profile != EEsProfile && version < 140);
bool skipCubeArrayed = (profile == EEsProfile && version < 310) || (profile != EEsProfile && version < 130);
......@@ -4100,12 +4106,20 @@ void TBuiltIns::add2ndGenerationSamplingImaging(int version, EProfile profile, c
continue;
if (ms && arrayed && profile == EEsProfile && version < 310)
continue;
#ifdef AMD_EXTENSIONS
for (int bType = 0; bType < 4; ++bType) { // float, float16, int, uint results
if (shadow && bType > 1)
continue;
if (bTypes[bType] == EbtFloat16 && (profile == EEsProfile ||version < 450))
continue;
#else
for (int bType = 0; bType < 3; ++bType) { // float, int, uint results
if (shadow && bType > 0)
continue;
#endif
if (dim == EsdRect && version < 140 && bType > 0)
continue;
......@@ -4223,15 +4237,37 @@ void TBuiltIns::addQueryFunctions(TSampler sampler, const TString& typeName, int
//
if (profile != EEsProfile && version >= 400 && ! sampler.image && sampler.dim != EsdRect && ! sampler.ms && sampler.dim != EsdBuffer) {
#ifdef AMD_EXTENSIONS
for (int f16TexAddr = 0; f16TexAddr < 2; ++f16TexAddr) {
if (f16TexAddr && sampler.type != EbtFloat16)
continue;
#endif
stageBuiltins[EShLangFragment].append("vec2 textureQueryLod(");
stageBuiltins[EShLangFragment].append(typeName);
if (dimMap[sampler.dim] == 1)
#ifdef AMD_EXTENSIONS
if (f16TexAddr)
stageBuiltins[EShLangFragment].append(", float16_t");
else
stageBuiltins[EShLangFragment].append(", float");
#else
stageBuiltins[EShLangFragment].append(", float");
#endif
else {
#ifdef AMD_EXTENSIONS
if (f16TexAddr)
stageBuiltins[EShLangFragment].append(", f16vec");
else
stageBuiltins[EShLangFragment].append(", vec");
#else
stageBuiltins[EShLangFragment].append(", vec");
#endif
stageBuiltins[EShLangFragment].append(postfixes[dimMap[sampler.dim]]);
}
stageBuiltins[EShLangFragment].append(");\n");
#ifdef AMD_EXTENSIONS
}
#endif
}
//
......@@ -4421,7 +4457,7 @@ void TBuiltIns::addSamplingFunctions(TSampler sampler, const TString& typeName,
if (bias && (lod || sampler.ms))
continue;
if (bias && sampler.dim == Esd2D && sampler.shadow && sampler.arrayed)
if (bias && (sampler.dim == Esd2D || sampler.dim == EsdCube) && sampler.shadow && sampler.arrayed)
continue;
if (bias && (sampler.dim == EsdRect || sampler.dim == EsdBuffer))
continue;
......@@ -4470,7 +4506,16 @@ void TBuiltIns::addSamplingFunctions(TSampler sampler, const TString& typeName,
continue;
if (extraProj && (sampler.dim == Esd3D || sampler.shadow))
continue;
#ifdef AMD_EXTENSIONS
for (int f16TexAddr = 0; f16TexAddr <= 1; ++f16TexAddr) { // loop over 16-bit floating-point texel addressing
if (f16TexAddr && sampler.type != EbtFloat16)
continue;
if (f16TexAddr && sampler.shadow && ! compare) {
compare = true; // compare argument is always present
totalDims--;
}
#endif
for (int lodClamp = 0; lodClamp <= 1 ;++lodClamp) { // loop over "bool" lod clamp
if (lodClamp && (profile == EEsProfile || version < 450))
......@@ -4493,7 +4538,14 @@ void TBuiltIns::addSamplingFunctions(TSampler sampler, const TString& typeName,
s.append("int ");
else {
if (sampler.shadow)
#ifdef AMD_EXTENSIONS
if (sampler.type == EbtFloat16)
s.append("float16_t ");
else
s.append("float ");
#else
s.append("float ");
#endif
else {
s.append(prefixes[sampler.type]);
s.append("vec4 ");
......@@ -4506,7 +4558,8 @@ void TBuiltIns::addSamplingFunctions(TSampler sampler, const TString& typeName,
s.append("sparseTexel");
else
s.append("sparseTexture");
} else {
}
else {
if (fetch)
s.append("texel");
else
......@@ -4530,7 +4583,25 @@ void TBuiltIns::addSamplingFunctions(TSampler sampler, const TString& typeName,
// sampler type
s.append(typeName);
#ifdef AMD_EXTENSIONS
// P coordinate
if (extraProj) {
if (f16TexAddr)
s.append(",f16vec4");
else
s.append(",vec4");
} else {
s.append(",");
TBasicType t = fetch ? EbtInt : (f16TexAddr ? EbtFloat16 : EbtFloat);
if (totalDims == 1)
s.append(TType::getBasicString(t));
else {
s.append(prefixes[t]);
s.append("vec");
s.append(postfixes[totalDims]);
}
}
#else
// P coordinate
if (extraProj)
s.append(",vec4");
......@@ -4545,15 +4616,45 @@ void TBuiltIns::addSamplingFunctions(TSampler sampler, const TString& typeName,
s.append(postfixes[totalDims]);
}
}
if (bias && compare)
continue;
#endif
// non-optional compare
if (compare)
s.append(",float");
// non-optional lod argument (lod that's not driven by lod loop) or sample
if ((fetch && sampler.dim != EsdBuffer && sampler.dim != EsdRect && !sampler.ms) ||
(sampler.ms && fetch))
s.append(",int");
#ifdef AMD_EXTENSIONS
// non-optional lod
if (lod) {
if (f16TexAddr)
s.append(",float16_t");
else
s.append(",float");
}
// gradient arguments
if (grad) {
if (dimMap[sampler.dim] == 1) {
if (f16TexAddr)
s.append(",float16_t,float16_t");
else
s.append(",float,float");
} else {
if (f16TexAddr)
s.append(",f16vec");
else
s.append(",vec");
s.append(postfixes[dimMap[sampler.dim]]);
if (f16TexAddr)
s.append(",f16vec");
else
s.append(",vec");
s.append(postfixes[dimMap[sampler.dim]]);
}
}
#else
// non-optional lod
if (lod)
s.append(",float");
......@@ -4569,7 +4670,7 @@ void TBuiltIns::addSamplingFunctions(TSampler sampler, const TString& typeName,
s.append(postfixes[dimMap[sampler.dim]]);
}
}
#endif
// offset
if (offset) {
if (dimMap[sampler.dim] == 1)
......@@ -4580,39 +4681,62 @@ void TBuiltIns::addSamplingFunctions(TSampler sampler, const TString& typeName,
}
}
// non-optional compare
if (compare)
#ifdef AMD_EXTENSIONS
// lod clamp
if (lodClamp) {
if (f16TexAddr)
s.append(",float16_t");
else
s.append(",float");
}
#else
// lod clamp
if (lodClamp)
s.append(",float");
#endif
// texel out (for sparse texture)
if (sparse) {
s.append(",out ");
if (sampler.shadow)
s.append("float ");
#ifdef AMD_EXTENSIONS
if (sampler.type == EbtFloat16)
s.append("float16_t");
else
s.append("float");
#else
s.append("float");
#endif
else {
s.append(prefixes[sampler.type]);
s.append("vec4 ");
s.append("vec4");
}
}
#ifdef AMD_EXTENSIONS
// optional bias
if (bias) {
if (f16TexAddr)
s.append(",float16_t");
else
s.append(",float");
}
#else
// optional bias
if (bias)
s.append(",float");
#endif
s.append(");\n");
// Add to the per-language set of built-ins
if (bias || lodClamp)
stageBuiltins[EShLangFragment].append(s);
else
commonBuiltins.append(s);
}
}
#ifdef AMD_EXTENSIONS
}
#endif
}
}
}
......@@ -4645,6 +4769,12 @@ void TBuiltIns::addGatherFunctions(TSampler sampler, const TString& typeName, in
if (version < 140 && sampler.dim == EsdRect && sampler.type != EbtFloat)
return;
#ifdef AMD_EXTENSIONS
for (int f16TexAddr = 0; f16TexAddr <= 1; ++f16TexAddr) { // loop over 16-bit floating-point texel addressing
if (f16TexAddr && sampler.type != EbtFloat16)
continue;
#endif
for (int offset = 0; offset < 3; ++offset) { // loop over three forms of offset in the call name: none, Offset, and Offsets
for (int comp = 0; comp < 2; ++comp) { // loop over presence of comp argument
......@@ -4683,7 +4813,6 @@ void TBuiltIns::addGatherFunctions(TSampler sampler, const TString& typeName, in
default:
break;
}
if (sparse)
s.append("ARB");
s.append("(");
......@@ -4692,7 +4821,14 @@ void TBuiltIns::addGatherFunctions(TSampler sampler, const TString& typeName, in
s.append(typeName);
// P coordinate argument
#ifdef AMD_EXTENSIONS
if (f16TexAddr)
s.append(",f16vec");
else
s.append(",vec");
#else
s.append(",vec");
#endif
int totalDims = dimMap[sampler.dim] + (sampler.arrayed ? 1 : 0);
s.append(postfixes[totalDims]);
......@@ -4720,6 +4856,9 @@ void TBuiltIns::addGatherFunctions(TSampler sampler, const TString& typeName, in
s.append(");\n");
commonBuiltins.append(s);
#ifdef AMD_EXTENSIONS
}
#endif
}
}
}
......@@ -4738,6 +4877,11 @@ void TBuiltIns::addGatherFunctions(TSampler sampler, const TString& typeName, in
if ((lod && bias) || (lod == 0 && bias == 0))
continue;
for (int f16TexAddr = 0; f16TexAddr <= 1; ++f16TexAddr) { // loop over 16-bit floating-point texel addressing
if (f16TexAddr && sampler.type != EbtFloat16)
continue;
for (int offset = 0; offset < 3; ++offset) { // loop over three forms of offset in the call name: none, Offset, and Offsets
for (int comp = 0; comp < 2; ++comp) { // loop over presence of comp argument
......@@ -4792,13 +4936,20 @@ void TBuiltIns::addGatherFunctions(TSampler sampler, const TString& typeName, in
s.append(typeName);
// P coordinate argument
if (f16TexAddr)
s.append(",f16vec");
else
s.append(",vec");
int totalDims = dimMap[sampler.dim] + (sampler.arrayed ? 1 : 0);
s.append(postfixes[totalDims]);
// lod argument
if (lod)
if (lod) {
if (f16TexAddr)
s.append(",float16_t");
else
s.append(",float");
}
// offset argument
if (offset > 0) {
......@@ -4819,8 +4970,12 @@ void TBuiltIns::addGatherFunctions(TSampler sampler, const TString& typeName, in
s.append(",int");
// bias argument
if (bias)
if (bias) {
if (f16TexAddr)
s.append(",float16_t");
else
s.append(",float");
}
s.append(");\n");
if (bias)
......@@ -4832,6 +4987,7 @@ void TBuiltIns::addGatherFunctions(TSampler sampler, const TString& typeName, in
}
}
}
}
#endif
}
......
......@@ -1520,6 +1520,12 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan
}
if (arg > 0) {
#ifdef AMD_EXTENSIONS
bool f16ShadowCompare = (*argp)[1]->getAsTyped()->getBasicType() == EbtFloat16 && arg0->getType().getSampler().shadow;
if (f16ShadowCompare)
++arg;
#endif
if (! (*argp)[arg]->getAsConstantUnion())
error(loc, "argument must be compile-time constant", "texel offset", "");
else {
......
......@@ -579,6 +579,54 @@ void TScanContext::fillInKeywordMap()
(*KeywordMap)["usubpassInput"] = USUBPASSINPUT;
(*KeywordMap)["usubpassInputMS"] = USUBPASSINPUTMS;
#ifdef AMD_EXTENSIONS
(*KeywordMap)["f16sampler1D"] = F16SAMPLER1D;
(*KeywordMap)["f16sampler2D"] = F16SAMPLER2D;
(*KeywordMap)["f16sampler3D"] = F16SAMPLER3D;
(*KeywordMap)["f16sampler2DRect"] = F16SAMPLER2DRECT;
(*KeywordMap)["f16samplerCube"] = F16SAMPLERCUBE;
(*KeywordMap)["f16sampler1DArray"] = F16SAMPLER1DARRAY;
(*KeywordMap)["f16sampler2DArray"] = F16SAMPLER2DARRAY;
(*KeywordMap)["f16samplerCubeArray"] = F16SAMPLERCUBEARRAY;
(*KeywordMap)["f16samplerBuffer"] = F16SAMPLERBUFFER;
(*KeywordMap)["f16sampler2DMS"] = F16SAMPLER2DMS;
(*KeywordMap)["f16sampler2DMSArray"] = F16SAMPLER2DMSARRAY;
(*KeywordMap)["f16sampler1DShadow"] = F16SAMPLER1DSHADOW;
(*KeywordMap)["f16sampler2DShadow"] = F16SAMPLER2DSHADOW;
(*KeywordMap)["f16sampler2DRectShadow"] = F16SAMPLER2DRECTSHADOW;
(*KeywordMap)["f16samplerCubeShadow"] = F16SAMPLERCUBESHADOW;
(*KeywordMap)["f16sampler1DArrayShadow"] = F16SAMPLER1DARRAYSHADOW;
(*KeywordMap)["f16sampler2DArrayShadow"] = F16SAMPLER2DARRAYSHADOW;
(*KeywordMap)["f16samplerCubeArrayShadow"] = F16SAMPLERCUBEARRAYSHADOW;
(*KeywordMap)["f16image1D"] = F16IMAGE1D;
(*KeywordMap)["f16image2D"] = F16IMAGE2D;
(*KeywordMap)["f16image3D"] = F16IMAGE3D;
(*KeywordMap)["f16image2DRect"] = F16IMAGE2DRECT;
(*KeywordMap)["f16imageCube"] = F16IMAGECUBE;
(*KeywordMap)["f16image1DArray"] = F16IMAGE1DARRAY;
(*KeywordMap)["f16image2DArray"] = F16IMAGE2DARRAY;
(*KeywordMap)["f16imageCubeArray"] = F16IMAGECUBEARRAY;
(*KeywordMap)["f16imageBuffer"] = F16IMAGEBUFFER;
(*KeywordMap)["f16image2DMS"] = F16IMAGE2DMS;
(*KeywordMap)["f16image2DMSArray"] = F16IMAGE2DMSARRAY;
(*KeywordMap)["f16texture1D"] = F16TEXTURE1D;
(*KeywordMap)["f16texture2D"] = F16TEXTURE2D;
(*KeywordMap)["f16texture3D"] = F16TEXTURE3D;
(*KeywordMap)["f16texture2DRect"] = F16TEXTURE2DRECT;
(*KeywordMap)["f16textureCube"] = F16TEXTURECUBE;
(*KeywordMap)["f16texture1DArray"] = F16TEXTURE1DARRAY;
(*KeywordMap)["f16texture2DArray"] = F16TEXTURE2DARRAY;
(*KeywordMap)["f16textureCubeArray"] = F16TEXTURECUBEARRAY;
(*KeywordMap)["f16textureBuffer"] = F16TEXTUREBUFFER;
(*KeywordMap)["f16texture2DMS"] = F16TEXTURE2DMS;
(*KeywordMap)["f16texture2DMSArray"] = F16TEXTURE2DMSARRAY;
(*KeywordMap)["f16subpassInput"] = F16SUBPASSINPUT;
(*KeywordMap)["f16subpassInputMS"] = F16SUBPASSINPUTMS;
#endif
(*KeywordMap)["noperspective"] = NOPERSPECTIVE;
(*KeywordMap)["smooth"] = SMOOTH;
(*KeywordMap)["flat"] = FLAT;
......@@ -1029,6 +1077,7 @@ int TScanContext::tokenizeIdentifier()
(parseContext.profile != EEsProfile && parseContext.version >= 450 &&
parseContext.extensionTurnedOn(E_GL_AMD_gpu_shader_half_float)))
return keyword;
return identifierOrType();
#endif
......@@ -1211,6 +1260,60 @@ int TScanContext::tokenizeIdentifier()
else
return identifierOrType();
#ifdef AMD_EXTENSIONS
case F16SAMPLER1D:
case F16SAMPLER2D:
case F16SAMPLER3D:
case F16SAMPLER2DRECT:
case F16SAMPLERCUBE:
case F16SAMPLER1DARRAY:
case F16SAMPLER2DARRAY:
case F16SAMPLERCUBEARRAY:
case F16SAMPLERBUFFER:
case F16SAMPLER2DMS:
case F16SAMPLER2DMSARRAY:
case F16SAMPLER1DSHADOW:
case F16SAMPLER2DSHADOW:
case F16SAMPLER1DARRAYSHADOW:
case F16SAMPLER2DARRAYSHADOW:
case F16SAMPLER2DRECTSHADOW:
case F16SAMPLERCUBESHADOW:
case F16SAMPLERCUBEARRAYSHADOW:
case F16IMAGE1D:
case F16IMAGE2D:
case F16IMAGE3D:
case F16IMAGE2DRECT:
case F16IMAGECUBE:
case F16IMAGE1DARRAY:
case F16IMAGE2DARRAY:
case F16IMAGECUBEARRAY:
case F16IMAGEBUFFER:
case F16IMAGE2DMS:
case F16IMAGE2DMSARRAY:
case F16TEXTURE1D:
case F16TEXTURE2D:
case F16TEXTURE3D:
case F16TEXTURE2DRECT:
case F16TEXTURECUBE:
case F16TEXTURE1DARRAY:
case F16TEXTURE2DARRAY:
case F16TEXTURECUBEARRAY:
case F16TEXTUREBUFFER:
case F16TEXTURE2DMS:
case F16TEXTURE2DMSARRAY:
case F16SUBPASSINPUT:
case F16SUBPASSINPUTMS:
afterType = true;
if (parseContext.symbolTable.atBuiltInLevel() ||
(parseContext.extensionTurnedOn(E_GL_AMD_gpu_shader_half_float_fetch) &&
parseContext.profile != EEsProfile && parseContext.version >= 450))
return keyword;
return identifierOrType();
#endif
case NOPERSPECTIVE:
return es30ReservedFromGLSL(130);
......
......@@ -75,6 +75,9 @@ void TType::buildMangledName(TString& mangledName) const
case EbtAtomicUint: mangledName += "au"; break;
case EbtSampler:
switch (sampler.type) {
#ifdef AMD_EXTENSIONS
case EbtFloat16: mangledName += "f16"; break;
#endif
case EbtInt: mangledName += "i"; break;
case EbtUint: mangledName += "u"; break;
default: break; // some compilers want this
......
......@@ -204,6 +204,7 @@ void TParseVersions::initializeExtensionBehavior()
extensionBehavior[E_GL_AMD_gpu_shader_int16] = EBhDisable;
extensionBehavior[E_GL_AMD_shader_image_load_store_lod] = EBhDisable;
extensionBehavior[E_GL_AMD_shader_fragment_mask] = EBhDisable;
extensionBehavior[E_GL_AMD_gpu_shader_half_float_fetch] = EBhDisable;
#endif
#ifdef NV_EXTENSIONS
......@@ -341,6 +342,7 @@ void TParseVersions::getPreamble(std::string& preamble)
"#define GL_AMD_gpu_shader_int16 1\n"
"#define GL_AMD_shader_image_load_store_lod 1\n"
"#define GL_AMD_shader_fragment_mask 1\n"
"#define GL_AMD_gpu_shader_half_float_fetch 1\n"
#endif
#ifdef NV_EXTENSIONS
......@@ -749,7 +751,7 @@ void TParseVersions::doubleCheck(const TSourceLoc& loc, const char* op)
void TParseVersions::int16Check(const TSourceLoc& loc, const char* op, bool builtIn)
{
if (! builtIn) {
requireExtensions(loc, 1, &E_GL_AMD_gpu_shader_int16, "shader int16");
requireExtensions(loc, 1, &E_GL_AMD_gpu_shader_int16, op);
requireProfile(loc, ECoreProfile | ECompatibilityProfile, op);
profileRequires(loc, ECoreProfile, 450, nullptr, op);
profileRequires(loc, ECompatibilityProfile, 450, nullptr, op);
......@@ -760,7 +762,18 @@ void TParseVersions::int16Check(const TSourceLoc& loc, const char* op, bool buil
void TParseVersions::float16Check(const TSourceLoc& loc, const char* op, bool builtIn)
{
if (! builtIn) {
requireExtensions(loc, 1, &E_GL_AMD_gpu_shader_half_float, "shader half float");
requireExtensions(loc, 1, &E_GL_AMD_gpu_shader_half_float, op);
requireProfile(loc, ECoreProfile | ECompatibilityProfile, op);
profileRequires(loc, ECoreProfile, 450, nullptr, op);
profileRequires(loc, ECompatibilityProfile, 450, nullptr, op);
}
}
// Call for any operation needing GLSL float16 opaque-type support
void TParseVersions::float16OpaqueCheck(const TSourceLoc& loc, const char* op, bool builtIn)
{
if (! builtIn) {
requireExtensions(loc, 1, &E_GL_AMD_gpu_shader_half_float_fetch, op);
requireProfile(loc, ECoreProfile | ECompatibilityProfile, op);
profileRequires(loc, ECoreProfile, 450, nullptr, op);
profileRequires(loc, ECompatibilityProfile, 450, nullptr, op);
......@@ -772,7 +785,7 @@ void TParseVersions::float16Check(const TSourceLoc& loc, const char* op, bool bu
void TParseVersions::int64Check(const TSourceLoc& loc, const char* op, bool builtIn)
{
if (! builtIn) {
requireExtensions(loc, 1, &E_GL_ARB_gpu_shader_int64, "shader int64");
requireExtensions(loc, 1, &E_GL_ARB_gpu_shader_int64, op);
requireProfile(loc, ECoreProfile | ECompatibilityProfile, op);
profileRequires(loc, ECoreProfile, 450, nullptr, op);
profileRequires(loc, ECompatibilityProfile, 450, nullptr, op);
......
......@@ -174,6 +174,7 @@ const char* const E_GL_AMD_texture_gather_bias_lod = "GL_AMD_textur
const char* const E_GL_AMD_gpu_shader_int16 = "GL_AMD_gpu_shader_int16";
const char* const E_GL_AMD_shader_image_load_store_lod = "GL_AMD_shader_image_load_store_lod";
const char* const E_GL_AMD_shader_fragment_mask = "GL_AMD_shader_fragment_mask";
const char* const E_GL_AMD_gpu_shader_half_float_fetch = "GL_AMD_gpu_shader_half_float_fetch";
#endif
#ifdef NV_EXTENSIONS
......
......@@ -117,6 +117,40 @@
#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C
#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D
#ifdef AMD_EXTENSIONS
#define GL_FLOAT16_SAMPLER_1D_AMD 0x91CE
#define GL_FLOAT16_SAMPLER_2D_AMD 0x91CF
#define GL_FLOAT16_SAMPLER_3D_AMD 0x91D0
#define GL_FLOAT16_SAMPLER_CUBE_AMD 0x91D1
#define GL_FLOAT16_SAMPLER_2D_RECT_AMD 0x91D2
#define GL_FLOAT16_SAMPLER_1D_ARRAY_AMD 0x91D3
#define GL_FLOAT16_SAMPLER_2D_ARRAY_AMD 0x91D4
#define GL_FLOAT16_SAMPLER_CUBE_MAP_ARRAY_AMD 0x91D5
#define GL_FLOAT16_SAMPLER_BUFFER_AMD 0x91D6
#define GL_FLOAT16_SAMPLER_2D_MULTISAMPLE_AMD 0x91D7
#define GL_FLOAT16_SAMPLER_2D_MULTISAMPLE_ARRAY_AMD 0x91D8
#define GL_FLOAT16_SAMPLER_1D_SHADOW_AMD 0x91D9
#define GL_FLOAT16_SAMPLER_2D_SHADOW_AMD 0x91DA
#define GL_FLOAT16_SAMPLER_2D_RECT_SHADOW_AMD 0x91DB
#define GL_FLOAT16_SAMPLER_1D_ARRAY_SHADOW_AMD 0x91DC
#define GL_FLOAT16_SAMPLER_2D_ARRAY_SHADOW_AMD 0x91DD
#define GL_FLOAT16_SAMPLER_CUBE_SHADOW_AMD 0x91DE
#define GL_FLOAT16_SAMPLER_CUBE_MAP_ARRAY_SHADOW_AMD 0x91DF
#define GL_FLOAT16_IMAGE_1D_AMD 0x91E0
#define GL_FLOAT16_IMAGE_2D_AMD 0x91E1
#define GL_FLOAT16_IMAGE_3D_AMD 0x91E2
#define GL_FLOAT16_IMAGE_2D_RECT_AMD 0x91E3
#define GL_FLOAT16_IMAGE_CUBE_AMD 0x91E4
#define GL_FLOAT16_IMAGE_1D_ARRAY_AMD 0x91E5
#define GL_FLOAT16_IMAGE_2D_ARRAY_AMD 0x91E6
#define GL_FLOAT16_IMAGE_CUBE_MAP_ARRAY_AMD 0x91E7
#define GL_FLOAT16_IMAGE_BUFFER_AMD 0x91E8
#define GL_FLOAT16_IMAGE_2D_MULTISAMPLE_AMD 0x91E9
#define GL_FLOAT16_IMAGE_2D_MULTISAMPLE_ARRAY_AMD 0x91EA
#endif
#define GL_INT_SAMPLER_1D 0x8DC9
#define GL_INT_SAMPLER_2D 0x8DCA
#define GL_INT_SAMPLER_3D 0x8DCB
......
......@@ -159,6 +159,12 @@ extern int yylex(YYSTYPE*, TParseContext&);
%token <lex> SAMPLER2DMSARRAY ISAMPLER2DMSARRAY USAMPLER2DMSARRAY
%token <lex> SAMPLEREXTERNALOES
%token <lex> F16SAMPLER1D F16SAMPLER2D F16SAMPLER3D F16SAMPLER2DRECT F16SAMPLERCUBE
%token <lex> F16SAMPLER1DARRAY F16SAMPLER2DARRAY F16SAMPLERCUBEARRAY
%token <lex> F16SAMPLERBUFFER F16SAMPLER2DMS F16SAMPLER2DMSARRAY
%token <lex> F16SAMPLER1DSHADOW F16SAMPLER2DSHADOW F16SAMPLER1DARRAYSHADOW F16SAMPLER2DARRAYSHADOW
%token <lex> F16SAMPLER2DRECTSHADOW F16SAMPLERCUBESHADOW F16SAMPLERCUBEARRAYSHADOW
// pure sampler
%token <lex> SAMPLER SAMPLERSHADOW
......@@ -174,8 +180,13 @@ extern int yylex(YYSTYPE*, TParseContext&);
%token <lex> TEXTURE2DMS ITEXTURE2DMS UTEXTURE2DMS
%token <lex> TEXTURE2DMSARRAY ITEXTURE2DMSARRAY UTEXTURE2DMSARRAY
%token <lex> F16TEXTURE1D F16TEXTURE2D F16TEXTURE3D F16TEXTURE2DRECT F16TEXTURECUBE
%token <lex> F16TEXTURE1DARRAY F16TEXTURE2DARRAY F16TEXTURECUBEARRAY
%token <lex> F16TEXTUREBUFFER F16TEXTURE2DMS F16TEXTURE2DMSARRAY
// input attachments
%token <lex> SUBPASSINPUT SUBPASSINPUTMS ISUBPASSINPUT ISUBPASSINPUTMS USUBPASSINPUT USUBPASSINPUTMS
%token <lex> F16SUBPASSINPUT F16SUBPASSINPUTMS
%token <lex> IMAGE1D IIMAGE1D UIMAGE1D IMAGE2D IIMAGE2D
%token <lex> UIMAGE2D IMAGE3D IIMAGE3D UIMAGE3D
......@@ -188,6 +199,10 @@ extern int yylex(YYSTYPE*, TParseContext&);
%token <lex> IMAGE2DMS IIMAGE2DMS UIMAGE2DMS
%token <lex> IMAGE2DMSARRAY IIMAGE2DMSARRAY UIMAGE2DMSARRAY
%token <lex> F16IMAGE1D F16IMAGE2D F16IMAGE3D F16IMAGE2DRECT
%token <lex> F16IMAGECUBE F16IMAGE1DARRAY F16IMAGE2DARRAY F16IMAGECUBEARRAY
%token <lex> F16IMAGEBUFFER F16IMAGE2DMS F16IMAGE2DMSARRAY
%token <lex> STRUCT VOID WHILE
%token <lex> IDENTIFIER TYPE_NAME
......@@ -1890,6 +1905,110 @@ type_specifier_nonarray
$$.basicType = EbtSampler;
$$.sampler.set(EbtFloat, EsdCube, true, true);
}
| F16SAMPLER1D {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.set(EbtFloat16, Esd1D);
#endif
}
| F16SAMPLER2D {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.set(EbtFloat16, Esd2D);
#endif
}
| F16SAMPLER3D {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.set(EbtFloat16, Esd3D);
#endif
}
| F16SAMPLERCUBE {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.set(EbtFloat16, EsdCube);
#endif
}
| F16SAMPLER1DSHADOW {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.set(EbtFloat16, Esd1D, false, true);
#endif
}
| F16SAMPLER2DSHADOW {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.set(EbtFloat16, Esd2D, false, true);
#endif
}
| F16SAMPLERCUBESHADOW {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.set(EbtFloat16, EsdCube, false, true);
#endif
}
| F16SAMPLER1DARRAY {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.set(EbtFloat16, Esd1D, true);
#endif
}
| F16SAMPLER2DARRAY {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.set(EbtFloat16, Esd2D, true);
#endif
}
| F16SAMPLER1DARRAYSHADOW {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.set(EbtFloat16, Esd1D, true, true);
#endif
}
| F16SAMPLER2DARRAYSHADOW {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.set(EbtFloat16, Esd2D, true, true);
#endif
}
| F16SAMPLERCUBEARRAY {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.set(EbtFloat16, EsdCube, true);
#endif
}
| F16SAMPLERCUBEARRAYSHADOW {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.set(EbtFloat16, EsdCube, true, true);
#endif
}
| ISAMPLER1D {
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
......@@ -1970,6 +2089,22 @@ type_specifier_nonarray
$$.basicType = EbtSampler;
$$.sampler.set(EbtFloat, EsdRect, false, true);
}
| F16SAMPLER2DRECT {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.set(EbtFloat16, EsdRect);
#endif
}
| F16SAMPLER2DRECTSHADOW {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.set(EbtFloat16, EsdRect, false, true);
#endif
}
| ISAMPLER2DRECT {
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
......@@ -1985,6 +2120,14 @@ type_specifier_nonarray
$$.basicType = EbtSampler;
$$.sampler.set(EbtFloat, EsdBuffer);
}
| F16SAMPLERBUFFER {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.set(EbtFloat16, EsdBuffer);
#endif
}
| ISAMPLERBUFFER {
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
......@@ -2000,6 +2143,14 @@ type_specifier_nonarray
$$.basicType = EbtSampler;
$$.sampler.set(EbtFloat, Esd2D, false, false, true);
}
| F16SAMPLER2DMS {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.set(EbtFloat16, Esd2D, false, false, true);
#endif
}
| ISAMPLER2DMS {
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
......@@ -2015,6 +2166,14 @@ type_specifier_nonarray
$$.basicType = EbtSampler;
$$.sampler.set(EbtFloat, Esd2D, true, false, true);
}
| F16SAMPLER2DMSARRAY {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float sampler", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.set(EbtFloat16, Esd2D, true, false, true);
#endif
}
| ISAMPLER2DMSARRAY {
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
......@@ -2040,36 +2199,92 @@ type_specifier_nonarray
$$.basicType = EbtSampler;
$$.sampler.setTexture(EbtFloat, Esd1D);
}
| F16TEXTURE1D {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setTexture(EbtFloat16, Esd1D);
#endif
}
| TEXTURE2D {
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setTexture(EbtFloat, Esd2D);
}
| F16TEXTURE2D {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setTexture(EbtFloat16, Esd2D);
#endif
}
| TEXTURE3D {
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setTexture(EbtFloat, Esd3D);
}
| F16TEXTURE3D {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setTexture(EbtFloat16, Esd3D);
#endif
}
| TEXTURECUBE {
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setTexture(EbtFloat, EsdCube);
}
| F16TEXTURECUBE {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setTexture(EbtFloat16, EsdCube);
#endif
}
| TEXTURE1DARRAY {
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setTexture(EbtFloat, Esd1D, true);
}
| F16TEXTURE1DARRAY {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setTexture(EbtFloat16, Esd1D, true);
#endif
}
| TEXTURE2DARRAY {
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setTexture(EbtFloat, Esd2D, true);
}
| F16TEXTURE2DARRAY {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setTexture(EbtFloat16, Esd2D, true);
#endif
}
| TEXTURECUBEARRAY {
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setTexture(EbtFloat, EsdCube, true);
}
| F16TEXTURECUBEARRAY {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setTexture(EbtFloat16, EsdCube, true);
#endif
}
| ITEXTURE1D {
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
......@@ -2145,6 +2360,14 @@ type_specifier_nonarray
$$.basicType = EbtSampler;
$$.sampler.setTexture(EbtFloat, EsdRect);
}
| F16TEXTURE2DRECT {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setTexture(EbtFloat16, EsdRect);
#endif
}
| ITEXTURE2DRECT {
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
......@@ -2160,6 +2383,14 @@ type_specifier_nonarray
$$.basicType = EbtSampler;
$$.sampler.setTexture(EbtFloat, EsdBuffer);
}
| F16TEXTUREBUFFER {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setTexture(EbtFloat16, EsdBuffer);
#endif
}
| ITEXTUREBUFFER {
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
......@@ -2175,6 +2406,14 @@ type_specifier_nonarray
$$.basicType = EbtSampler;
$$.sampler.setTexture(EbtFloat, Esd2D, false, false, true);
}
| F16TEXTURE2DMS {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setTexture(EbtFloat16, Esd2D, false, false, true);
#endif
}
| ITEXTURE2DMS {
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
......@@ -2190,6 +2429,14 @@ type_specifier_nonarray
$$.basicType = EbtSampler;
$$.sampler.setTexture(EbtFloat, Esd2D, true, false, true);
}
| F16TEXTURE2DMSARRAY {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float texture", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setTexture(EbtFloat16, Esd2D, true, false, true);
#endif
}
| ITEXTURE2DMSARRAY {
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
......@@ -2205,6 +2452,14 @@ type_specifier_nonarray
$$.basicType = EbtSampler;
$$.sampler.setImage(EbtFloat, Esd1D);
}
| F16IMAGE1D {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setImage(EbtFloat16, Esd1D);
#endif
}
| IIMAGE1D {
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
......@@ -2220,6 +2475,14 @@ type_specifier_nonarray
$$.basicType = EbtSampler;
$$.sampler.setImage(EbtFloat, Esd2D);
}
| F16IMAGE2D {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setImage(EbtFloat16, Esd2D);
#endif
}
| IIMAGE2D {
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
......@@ -2235,6 +2498,14 @@ type_specifier_nonarray
$$.basicType = EbtSampler;
$$.sampler.setImage(EbtFloat, Esd3D);
}
| F16IMAGE3D {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setImage(EbtFloat16, Esd3D);
#endif
}
| IIMAGE3D {
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
......@@ -2250,6 +2521,14 @@ type_specifier_nonarray
$$.basicType = EbtSampler;
$$.sampler.setImage(EbtFloat, EsdRect);
}
| F16IMAGE2DRECT {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setImage(EbtFloat16, EsdRect);
#endif
}
| IIMAGE2DRECT {
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
......@@ -2265,6 +2544,14 @@ type_specifier_nonarray
$$.basicType = EbtSampler;
$$.sampler.setImage(EbtFloat, EsdCube);
}
| F16IMAGECUBE {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setImage(EbtFloat16, EsdCube);
#endif
}
| IIMAGECUBE {
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
......@@ -2280,6 +2567,14 @@ type_specifier_nonarray
$$.basicType = EbtSampler;
$$.sampler.setImage(EbtFloat, EsdBuffer);
}
| F16IMAGEBUFFER {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setImage(EbtFloat16, EsdBuffer);
#endif
}
| IIMAGEBUFFER {
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
......@@ -2295,6 +2590,14 @@ type_specifier_nonarray
$$.basicType = EbtSampler;
$$.sampler.setImage(EbtFloat, Esd1D, true);
}
| F16IMAGE1DARRAY {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setImage(EbtFloat16, Esd1D, true);
#endif
}
| IIMAGE1DARRAY {
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
......@@ -2310,6 +2613,14 @@ type_specifier_nonarray
$$.basicType = EbtSampler;
$$.sampler.setImage(EbtFloat, Esd2D, true);
}
| F16IMAGE2DARRAY {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setImage(EbtFloat16, Esd2D, true);
#endif
}
| IIMAGE2DARRAY {
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
......@@ -2325,6 +2636,14 @@ type_specifier_nonarray
$$.basicType = EbtSampler;
$$.sampler.setImage(EbtFloat, EsdCube, true);
}
| F16IMAGECUBEARRAY {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setImage(EbtFloat16, EsdCube, true);
#endif
}
| IIMAGECUBEARRAY {
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
......@@ -2340,6 +2659,14 @@ type_specifier_nonarray
$$.basicType = EbtSampler;
$$.sampler.setImage(EbtFloat, Esd2D, false, false, true);
}
| F16IMAGE2DMS {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setImage(EbtFloat16, Esd2D, false, false, true);
#endif
}
| IIMAGE2DMS {
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
......@@ -2355,6 +2682,14 @@ type_specifier_nonarray
$$.basicType = EbtSampler;
$$.sampler.setImage(EbtFloat, Esd2D, true, false, true);
}
| F16IMAGE2DMSARRAY {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float image", parseContext.symbolTable.atBuiltInLevel());
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setImage(EbtFloat16, Esd2D, true, false, true);
#endif
}
| IIMAGE2DMSARRAY {
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
......@@ -2383,6 +2718,24 @@ type_specifier_nonarray
$$.basicType = EbtSampler;
$$.sampler.setSubpass(EbtFloat, true);
}
| F16SUBPASSINPUT {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float subpass input", parseContext.symbolTable.atBuiltInLevel());
parseContext.requireStage($1.loc, EShLangFragment, "subpass input");
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setSubpass(EbtFloat16);
#endif
}
| F16SUBPASSINPUTMS {
#ifdef AMD_EXTENSIONS
parseContext.float16OpaqueCheck($1.loc, "half float subpass input", parseContext.symbolTable.atBuiltInLevel());
parseContext.requireStage($1.loc, EShLangFragment, "subpass input");
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
$$.basicType = EbtSampler;
$$.sampler.setSubpass(EbtFloat16, true);
#endif
}
| ISUBPASSINPUT {
parseContext.requireStage($1.loc, EShLangFragment, "subpass input");
$$.init($1.loc, parseContext.symbolTable.atGlobalLevel());
......
This source diff could not be displayed because it is too large. You can view the blob instead.
/* A Bison parser, made by GNU Bison 3.0. */
/* A Bison parser, made by GNU Bison 3.0.4. */
/* Bison interface for Yacc-like parsers in C
Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
......@@ -30,8 +30,8 @@
This special exception was added by the Free Software Foundation in
version 2.2 of Bison. */
#ifndef YY_YY_MACHINEINDEPENDENT_GLSLANG_TAB_CPP_H_INCLUDED
# define YY_YY_MACHINEINDEPENDENT_GLSLANG_TAB_CPP_H_INCLUDED
#ifndef YY_YY_GLSLANG_TAB_CPP_H_INCLUDED
# define YY_YY_GLSLANG_TAB_CPP_H_INCLUDED
/* Debug traces. */
#ifndef YYDEBUG
# define YYDEBUG 1
......@@ -197,158 +197,200 @@ extern int yydebug;
ISAMPLER2DMSARRAY = 407,
USAMPLER2DMSARRAY = 408,
SAMPLEREXTERNALOES = 409,
SAMPLER = 410,
SAMPLERSHADOW = 411,
TEXTURE1D = 412,
TEXTURE2D = 413,
TEXTURE3D = 414,
TEXTURECUBE = 415,
TEXTURE1DARRAY = 416,
TEXTURE2DARRAY = 417,
ITEXTURE1D = 418,
ITEXTURE2D = 419,
ITEXTURE3D = 420,
ITEXTURECUBE = 421,
ITEXTURE1DARRAY = 422,
ITEXTURE2DARRAY = 423,
UTEXTURE1D = 424,
UTEXTURE2D = 425,
UTEXTURE3D = 426,
UTEXTURECUBE = 427,
UTEXTURE1DARRAY = 428,
UTEXTURE2DARRAY = 429,
TEXTURE2DRECT = 430,
ITEXTURE2DRECT = 431,
UTEXTURE2DRECT = 432,
TEXTUREBUFFER = 433,
ITEXTUREBUFFER = 434,
UTEXTUREBUFFER = 435,
TEXTURECUBEARRAY = 436,
ITEXTURECUBEARRAY = 437,
UTEXTURECUBEARRAY = 438,
TEXTURE2DMS = 439,
ITEXTURE2DMS = 440,
UTEXTURE2DMS = 441,
TEXTURE2DMSARRAY = 442,
ITEXTURE2DMSARRAY = 443,
UTEXTURE2DMSARRAY = 444,
SUBPASSINPUT = 445,
SUBPASSINPUTMS = 446,
ISUBPASSINPUT = 447,
ISUBPASSINPUTMS = 448,
USUBPASSINPUT = 449,
USUBPASSINPUTMS = 450,
IMAGE1D = 451,
IIMAGE1D = 452,
UIMAGE1D = 453,
IMAGE2D = 454,
IIMAGE2D = 455,
UIMAGE2D = 456,
IMAGE3D = 457,
IIMAGE3D = 458,
UIMAGE3D = 459,
IMAGE2DRECT = 460,
IIMAGE2DRECT = 461,
UIMAGE2DRECT = 462,
IMAGECUBE = 463,
IIMAGECUBE = 464,
UIMAGECUBE = 465,
IMAGEBUFFER = 466,
IIMAGEBUFFER = 467,
UIMAGEBUFFER = 468,
IMAGE1DARRAY = 469,
IIMAGE1DARRAY = 470,
UIMAGE1DARRAY = 471,
IMAGE2DARRAY = 472,
IIMAGE2DARRAY = 473,
UIMAGE2DARRAY = 474,
IMAGECUBEARRAY = 475,
IIMAGECUBEARRAY = 476,
UIMAGECUBEARRAY = 477,
IMAGE2DMS = 478,
IIMAGE2DMS = 479,
UIMAGE2DMS = 480,
IMAGE2DMSARRAY = 481,
IIMAGE2DMSARRAY = 482,
UIMAGE2DMSARRAY = 483,
STRUCT = 484,
VOID = 485,
WHILE = 486,
IDENTIFIER = 487,
TYPE_NAME = 488,
FLOATCONSTANT = 489,
DOUBLECONSTANT = 490,
INTCONSTANT = 491,
UINTCONSTANT = 492,
INT64CONSTANT = 493,
UINT64CONSTANT = 494,
INT16CONSTANT = 495,
UINT16CONSTANT = 496,
BOOLCONSTANT = 497,
FLOAT16CONSTANT = 498,
LEFT_OP = 499,
RIGHT_OP = 500,
INC_OP = 501,
DEC_OP = 502,
LE_OP = 503,
GE_OP = 504,
EQ_OP = 505,
NE_OP = 506,
AND_OP = 507,
OR_OP = 508,
XOR_OP = 509,
MUL_ASSIGN = 510,
DIV_ASSIGN = 511,
ADD_ASSIGN = 512,
MOD_ASSIGN = 513,
LEFT_ASSIGN = 514,
RIGHT_ASSIGN = 515,
AND_ASSIGN = 516,
XOR_ASSIGN = 517,
OR_ASSIGN = 518,
SUB_ASSIGN = 519,
LEFT_PAREN = 520,
RIGHT_PAREN = 521,
LEFT_BRACKET = 522,
RIGHT_BRACKET = 523,
LEFT_BRACE = 524,
RIGHT_BRACE = 525,
DOT = 526,
COMMA = 527,
COLON = 528,
EQUAL = 529,
SEMICOLON = 530,
BANG = 531,
DASH = 532,
TILDE = 533,
PLUS = 534,
STAR = 535,
SLASH = 536,
PERCENT = 537,
LEFT_ANGLE = 538,
RIGHT_ANGLE = 539,
VERTICAL_BAR = 540,
CARET = 541,
AMPERSAND = 542,
QUESTION = 543,
INVARIANT = 544,
PRECISE = 545,
HIGH_PRECISION = 546,
MEDIUM_PRECISION = 547,
LOW_PRECISION = 548,
PRECISION = 549,
PACKED = 550,
RESOURCE = 551,
SUPERP = 552
F16SAMPLER1D = 410,
F16SAMPLER2D = 411,
F16SAMPLER3D = 412,
F16SAMPLER2DRECT = 413,
F16SAMPLERCUBE = 414,
F16SAMPLER1DARRAY = 415,
F16SAMPLER2DARRAY = 416,
F16SAMPLERCUBEARRAY = 417,
F16SAMPLERBUFFER = 418,
F16SAMPLER2DMS = 419,
F16SAMPLER2DMSARRAY = 420,
F16SAMPLER1DSHADOW = 421,
F16SAMPLER2DSHADOW = 422,
F16SAMPLER1DARRAYSHADOW = 423,
F16SAMPLER2DARRAYSHADOW = 424,
F16SAMPLER2DRECTSHADOW = 425,
F16SAMPLERCUBESHADOW = 426,
F16SAMPLERCUBEARRAYSHADOW = 427,
SAMPLER = 428,
SAMPLERSHADOW = 429,
TEXTURE1D = 430,
TEXTURE2D = 431,
TEXTURE3D = 432,
TEXTURECUBE = 433,
TEXTURE1DARRAY = 434,
TEXTURE2DARRAY = 435,
ITEXTURE1D = 436,
ITEXTURE2D = 437,
ITEXTURE3D = 438,
ITEXTURECUBE = 439,
ITEXTURE1DARRAY = 440,
ITEXTURE2DARRAY = 441,
UTEXTURE1D = 442,
UTEXTURE2D = 443,
UTEXTURE3D = 444,
UTEXTURECUBE = 445,
UTEXTURE1DARRAY = 446,
UTEXTURE2DARRAY = 447,
TEXTURE2DRECT = 448,
ITEXTURE2DRECT = 449,
UTEXTURE2DRECT = 450,
TEXTUREBUFFER = 451,
ITEXTUREBUFFER = 452,
UTEXTUREBUFFER = 453,
TEXTURECUBEARRAY = 454,
ITEXTURECUBEARRAY = 455,
UTEXTURECUBEARRAY = 456,
TEXTURE2DMS = 457,
ITEXTURE2DMS = 458,
UTEXTURE2DMS = 459,
TEXTURE2DMSARRAY = 460,
ITEXTURE2DMSARRAY = 461,
UTEXTURE2DMSARRAY = 462,
F16TEXTURE1D = 463,
F16TEXTURE2D = 464,
F16TEXTURE3D = 465,
F16TEXTURE2DRECT = 466,
F16TEXTURECUBE = 467,
F16TEXTURE1DARRAY = 468,
F16TEXTURE2DARRAY = 469,
F16TEXTURECUBEARRAY = 470,
F16TEXTUREBUFFER = 471,
F16TEXTURE2DMS = 472,
F16TEXTURE2DMSARRAY = 473,
SUBPASSINPUT = 474,
SUBPASSINPUTMS = 475,
ISUBPASSINPUT = 476,
ISUBPASSINPUTMS = 477,
USUBPASSINPUT = 478,
USUBPASSINPUTMS = 479,
F16SUBPASSINPUT = 480,
F16SUBPASSINPUTMS = 481,
IMAGE1D = 482,
IIMAGE1D = 483,
UIMAGE1D = 484,
IMAGE2D = 485,
IIMAGE2D = 486,
UIMAGE2D = 487,
IMAGE3D = 488,
IIMAGE3D = 489,
UIMAGE3D = 490,
IMAGE2DRECT = 491,
IIMAGE2DRECT = 492,
UIMAGE2DRECT = 493,
IMAGECUBE = 494,
IIMAGECUBE = 495,
UIMAGECUBE = 496,
IMAGEBUFFER = 497,
IIMAGEBUFFER = 498,
UIMAGEBUFFER = 499,
IMAGE1DARRAY = 500,
IIMAGE1DARRAY = 501,
UIMAGE1DARRAY = 502,
IMAGE2DARRAY = 503,
IIMAGE2DARRAY = 504,
UIMAGE2DARRAY = 505,
IMAGECUBEARRAY = 506,
IIMAGECUBEARRAY = 507,
UIMAGECUBEARRAY = 508,
IMAGE2DMS = 509,
IIMAGE2DMS = 510,
UIMAGE2DMS = 511,
IMAGE2DMSARRAY = 512,
IIMAGE2DMSARRAY = 513,
UIMAGE2DMSARRAY = 514,
F16IMAGE1D = 515,
F16IMAGE2D = 516,
F16IMAGE3D = 517,
F16IMAGE2DRECT = 518,
F16IMAGECUBE = 519,
F16IMAGE1DARRAY = 520,
F16IMAGE2DARRAY = 521,
F16IMAGECUBEARRAY = 522,
F16IMAGEBUFFER = 523,
F16IMAGE2DMS = 524,
F16IMAGE2DMSARRAY = 525,
STRUCT = 526,
VOID = 527,
WHILE = 528,
IDENTIFIER = 529,
TYPE_NAME = 530,
FLOATCONSTANT = 531,
DOUBLECONSTANT = 532,
INTCONSTANT = 533,
UINTCONSTANT = 534,
INT64CONSTANT = 535,
UINT64CONSTANT = 536,
INT16CONSTANT = 537,
UINT16CONSTANT = 538,
BOOLCONSTANT = 539,
FLOAT16CONSTANT = 540,
LEFT_OP = 541,
RIGHT_OP = 542,
INC_OP = 543,
DEC_OP = 544,
LE_OP = 545,
GE_OP = 546,
EQ_OP = 547,
NE_OP = 548,
AND_OP = 549,
OR_OP = 550,
XOR_OP = 551,
MUL_ASSIGN = 552,
DIV_ASSIGN = 553,
ADD_ASSIGN = 554,
MOD_ASSIGN = 555,
LEFT_ASSIGN = 556,
RIGHT_ASSIGN = 557,
AND_ASSIGN = 558,
XOR_ASSIGN = 559,
OR_ASSIGN = 560,
SUB_ASSIGN = 561,
LEFT_PAREN = 562,
RIGHT_PAREN = 563,
LEFT_BRACKET = 564,
RIGHT_BRACKET = 565,
LEFT_BRACE = 566,
RIGHT_BRACE = 567,
DOT = 568,
COMMA = 569,
COLON = 570,
EQUAL = 571,
SEMICOLON = 572,
BANG = 573,
DASH = 574,
TILDE = 575,
PLUS = 576,
STAR = 577,
SLASH = 578,
PERCENT = 579,
LEFT_ANGLE = 580,
RIGHT_ANGLE = 581,
VERTICAL_BAR = 582,
CARET = 583,
AMPERSAND = 584,
QUESTION = 585,
INVARIANT = 586,
PRECISE = 587,
HIGH_PRECISION = 588,
MEDIUM_PRECISION = 589,
LOW_PRECISION = 590,
PRECISION = 591,
PACKED = 592,
RESOURCE = 593,
SUPERP = 594
};
#endif
/* Value type. */
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef union YYSTYPE YYSTYPE;
union YYSTYPE
{
#line 69 "MachineIndependent/glslang.y" /* yacc.c:1909 */
#line 69 "glslang.y" /* yacc.c:1909 */
struct {
glslang::TSourceLoc loc;
......@@ -383,8 +425,10 @@ union YYSTYPE
};
} interm;
#line 387 "MachineIndependent/glslang_tab.cpp.h" /* yacc.c:1909 */
#line 429 "glslang_tab.cpp.h" /* yacc.c:1909 */
};
typedef union YYSTYPE YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1
# define YYSTYPE_IS_DECLARED 1
#endif
......@@ -393,4 +437,4 @@ union YYSTYPE
int yyparse (glslang::TParseContext* pParseContext);
#endif /* !YY_YY_MACHINEINDEPENDENT_GLSLANG_TAB_CPP_H_INCLUDED */
#endif /* !YY_YY_GLSLANG_TAB_CPP_H_INCLUDED */
......@@ -80,6 +80,7 @@ public:
#ifdef AMD_EXTENSIONS
virtual void int16Check(const TSourceLoc& loc, const char* op, bool builtIn = false);
virtual void float16Check(const TSourceLoc&, const char* op, bool builtIn = false);
virtual void float16OpaqueCheck(const TSourceLoc&, const char* op, bool builtIn = false);
#endif
virtual void int64Check(const TSourceLoc&, const char* op, bool builtIn = false);
virtual void spvRemoved(const TSourceLoc&, const char* op);
......
......@@ -415,6 +415,36 @@ public:
case EsdBuffer:
return GL_SAMPLER_BUFFER;
}
#ifdef AMD_EXTENSIONS
case EbtFloat16:
switch ((int)sampler.dim) {
case Esd1D:
switch ((int)sampler.shadow) {
case false: return sampler.arrayed ? GL_FLOAT16_SAMPLER_1D_ARRAY_AMD : GL_FLOAT16_SAMPLER_1D_AMD;
case true: return sampler.arrayed ? GL_FLOAT16_SAMPLER_1D_ARRAY_SHADOW_AMD : GL_FLOAT16_SAMPLER_1D_SHADOW_AMD;
}
case Esd2D:
switch ((int)sampler.ms) {
case false:
switch ((int)sampler.shadow) {
case false: return sampler.arrayed ? GL_FLOAT16_SAMPLER_2D_ARRAY_AMD : GL_FLOAT16_SAMPLER_2D_AMD;
case true: return sampler.arrayed ? GL_FLOAT16_SAMPLER_2D_ARRAY_SHADOW_AMD : GL_FLOAT16_SAMPLER_2D_SHADOW_AMD;
}
case true: return sampler.arrayed ? GL_FLOAT16_SAMPLER_2D_MULTISAMPLE_ARRAY_AMD : GL_FLOAT16_SAMPLER_2D_MULTISAMPLE_AMD;
}
case Esd3D:
return GL_FLOAT16_SAMPLER_3D_AMD;
case EsdCube:
switch ((int)sampler.shadow) {
case false: return sampler.arrayed ? GL_FLOAT16_SAMPLER_CUBE_MAP_ARRAY_AMD : GL_FLOAT16_SAMPLER_CUBE_AMD;
case true: return sampler.arrayed ? GL_FLOAT16_SAMPLER_CUBE_MAP_ARRAY_SHADOW_AMD : GL_FLOAT16_SAMPLER_CUBE_SHADOW_AMD;
}
case EsdRect:
return sampler.shadow ? GL_FLOAT16_SAMPLER_2D_RECT_SHADOW_AMD : GL_FLOAT16_SAMPLER_2D_RECT_AMD;
case EsdBuffer:
return GL_FLOAT16_SAMPLER_BUFFER_AMD;
}
#endif
case EbtInt:
switch ((int)sampler.dim) {
case Esd1D:
......@@ -477,6 +507,26 @@ public:
case EsdBuffer:
return GL_IMAGE_BUFFER;
}
#ifdef AMD_EXTENSIONS
case EbtFloat16:
switch ((int)sampler.dim) {
case Esd1D:
return sampler.arrayed ? GL_FLOAT16_IMAGE_1D_ARRAY_AMD : GL_FLOAT16_IMAGE_1D_AMD;
case Esd2D:
switch ((int)sampler.ms) {
case false: return sampler.arrayed ? GL_FLOAT16_IMAGE_2D_ARRAY_AMD : GL_FLOAT16_IMAGE_2D_AMD;
case true: return sampler.arrayed ? GL_FLOAT16_IMAGE_2D_MULTISAMPLE_ARRAY_AMD : GL_FLOAT16_IMAGE_2D_MULTISAMPLE_AMD;
}
case Esd3D:
return GL_FLOAT16_IMAGE_3D_AMD;
case EsdCube:
return sampler.arrayed ? GL_FLOAT16_IMAGE_CUBE_MAP_ARRAY_AMD : GL_FLOAT16_IMAGE_CUBE_AMD;
case EsdRect:
return GL_FLOAT16_IMAGE_2D_RECT_AMD;
case EsdBuffer:
return GL_FLOAT16_IMAGE_BUFFER_AMD;
}
#endif
case EbtInt:
switch ((int)sampler.dim) {
case Esd1D:
......
......@@ -419,6 +419,7 @@ INSTANTIATE_TEST_CASE_P(
Glsl, CompileVulkanToSpirvTestAMD,
::testing::ValuesIn(std::vector<std::string>({
"spv.float16.frag",
"spv.float16Fetch.frag",
"spv.imageLoadStoreLod.frag",
"spv.int16.frag",
"spv.shaderBallotAMD.comp",
......
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