Commit 21369c82 by John Kessenich Committed by GitHub

Merge pull request #912 from amdrexu/feature

Implement the extension GL_AMD_texture_gather_bias_lod
parents 94c18a84 225e0fca
...@@ -28,11 +28,12 @@ ...@@ -28,11 +28,12 @@
#define GLSLextAMD_H #define GLSLextAMD_H
enum BuiltIn; enum BuiltIn;
enum Capability;
enum Decoration; enum Decoration;
enum Op; enum Op;
static const int GLSLextAMDVersion = 100; static const int GLSLextAMDVersion = 100;
static const int GLSLextAMDRevision = 2; static const int GLSLextAMDRevision = 3;
// SPV_AMD_shader_ballot // SPV_AMD_shader_ballot
static const char* const E_SPV_AMD_shader_ballot = "SPV_AMD_shader_ballot"; static const char* const E_SPV_AMD_shader_ballot = "SPV_AMD_shader_ballot";
...@@ -113,4 +114,9 @@ enum GcnShaderAMD { ...@@ -113,4 +114,9 @@ enum GcnShaderAMD {
// SPV_AMD_gpu_shader_half_float // SPV_AMD_gpu_shader_half_float
static const char* const E_SPV_AMD_gpu_shader_half_float = "SPV_AMD_gpu_shader_half_float"; static const char* const E_SPV_AMD_gpu_shader_half_float = "SPV_AMD_gpu_shader_half_float";
// SPV_AMD_texture_gather_bias_lod
static const char* const E_SPV_AMD_texture_gather_bias_lod = "SPV_AMD_texture_gather_bias_lod";
static const Capability OpCapabilityImageGatherBiasLodAMD = static_cast<Capability>(5009);
#endif // #ifndef GLSLextAMD_H #endif // #ifndef GLSLextAMD_H
...@@ -3044,7 +3044,7 @@ void TGlslangToSpvTraverser::translateArguments(const glslang::TIntermAggregate& ...@@ -3044,7 +3044,7 @@ void TGlslangToSpvTraverser::translateArguments(const glslang::TIntermAggregate&
if (i == 6) if (i == 6)
lvalue = true; lvalue = true;
break; break;
case glslang::EOpSparseTextureGather: case glslang::EOpSparseTextureGather:
if ((sampler.shadow && i == 3) || (! sampler.shadow && i == 2)) if ((sampler.shadow && i == 3) || (! sampler.shadow && i == 2))
lvalue = true; lvalue = true;
break; break;
...@@ -3053,6 +3053,17 @@ void TGlslangToSpvTraverser::translateArguments(const glslang::TIntermAggregate& ...@@ -3053,6 +3053,17 @@ void TGlslangToSpvTraverser::translateArguments(const glslang::TIntermAggregate&
if ((sampler.shadow && i == 4) || (! sampler.shadow && i == 3)) if ((sampler.shadow && i == 4) || (! sampler.shadow && i == 3))
lvalue = true; lvalue = true;
break; break;
#ifdef AMD_EXTENSIONS
case glslang::EOpSparseTextureGatherLod:
if (i == 3)
lvalue = true;
break;
case glslang::EOpSparseTextureGatherLodOffset:
case glslang::EOpSparseTextureGatherLodOffsets:
if (i == 4)
lvalue = true;
break;
#endif
default: default:
break; break;
} }
...@@ -3219,10 +3230,22 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO ...@@ -3219,10 +3230,22 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
// check for bias argument // check for bias argument
bool bias = false; bool bias = false;
#ifdef AMD_EXTENSIONS
if (! cracked.lod && ! cracked.grad && ! cracked.fetch && ! cubeCompare) {
#else
if (! cracked.lod && ! cracked.gather && ! cracked.grad && ! cracked.fetch && ! cubeCompare) { if (! cracked.lod && ! cracked.gather && ! cracked.grad && ! cracked.fetch && ! cubeCompare) {
#endif
int nonBiasArgCount = 2; int nonBiasArgCount = 2;
#ifdef AMD_EXTENSIONS
if (cracked.gather)
++nonBiasArgCount; // comp argument should be present when bias argument is present
#endif
if (cracked.offset) if (cracked.offset)
++nonBiasArgCount; ++nonBiasArgCount;
#ifdef AMD_EXTENSIONS
else if (cracked.offsets)
++nonBiasArgCount;
#endif
if (cracked.grad) if (cracked.grad)
nonBiasArgCount += 2; nonBiasArgCount += 2;
if (cracked.lodClamp) if (cracked.lodClamp)
...@@ -3241,6 +3264,17 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO ...@@ -3241,6 +3264,17 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
params.sampler = builder.createUnaryOp(spv::OpImage, builder.getImageType(params.sampler), params.sampler); params.sampler = builder.createUnaryOp(spv::OpImage, builder.getImageType(params.sampler), params.sampler);
} }
#ifdef AMD_EXTENSIONS
if (cracked.gather) {
const auto& sourceExtensions = glslangIntermediate->getRequestedExtensions();
if (bias || cracked.lod ||
sourceExtensions.find(glslang::E_GL_AMD_texture_gather_bias_lod) != sourceExtensions.end()) {
builder.addExtension(spv::E_SPV_AMD_texture_gather_bias_lod);
builder.addCapability(spv::OpCapabilityImageGatherBiasLodAMD);
}
}
#endif
// set the rest of the arguments // set the rest of the arguments
params.coords = arguments[1]; params.coords = arguments[1];
...@@ -3308,21 +3342,20 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO ...@@ -3308,21 +3342,20 @@ spv::Id TGlslangToSpvTraverser::createImageTextureFunctionCall(glslang::TIntermO
++extraArgs; ++extraArgs;
} }
// bias
if (bias) {
params.bias = arguments[2 + extraArgs];
++extraArgs;
}
// gather component // gather component
if (cracked.gather && ! sampler.shadow) { if (cracked.gather && ! sampler.shadow) {
// default component is 0, if missing, otherwise an argument // default component is 0, if missing, otherwise an argument
if (2 + extraArgs < (int)arguments.size()) { if (2 + extraArgs < (int)arguments.size()) {
params.component = arguments[2 + extraArgs]; params.component = arguments[2 + extraArgs];
++extraArgs; ++extraArgs;
} else { } else
params.component = builder.makeIntConstant(0); params.component = builder.makeIntConstant(0);
} }
// bias
if (bias) {
params.bias = arguments[2 + extraArgs];
++extraArgs;
} }
// projective component (might not to move) // projective component (might not to move)
......
...@@ -839,6 +839,10 @@ const char* CapabilityString(int info) ...@@ -839,6 +839,10 @@ const char* CapabilityString(int info)
case 4437: return "DeviceGroup"; case 4437: return "DeviceGroup";
case 4439: return "MultiView"; case 4439: return "MultiView";
#ifdef AMD_EXTENSIONS
case 5009: return "ImageGatherBiasLodAMD";
#endif
#ifdef NV_EXTENSIONS #ifdef NV_EXTENSIONS
case 5251: return "GeometryShaderPassthroughNV"; case 5251: return "GeometryShaderPassthroughNV";
case 5254: return "ShaderViewportIndexLayerNV"; case 5254: return "ShaderViewportIndexLayerNV";
......
#version 450 core
#extension GL_ARB_sparse_texture2: enable
#extension GL_AMD_texture_gather_bias_lod: enable
uniform sampler2D s2D;
uniform sampler2DArray s2DArray;
uniform samplerCube sCube;
uniform samplerCubeArray sCubeArray;
in vec2 c2;
in vec3 c3;
in vec4 c4;
in float lod;
in float bias;
out vec4 fragColor;
void main()
{
vec4 texel = vec4(0.0);
vec4 result = vec4(0.0);
const ivec2 offsets[4] = { ivec2(0, 0), ivec2(0, 1), ivec2(1, 0), ivec2(1, 1) };
texel += textureGather(s2D, c2, 0, bias);
texel += textureGather(s2DArray, c3, 1, bias);
texel += textureGather(sCube, c3, 2, bias);
texel += textureGather(sCubeArray, c4, 3, bias);
texel += textureGatherOffset(s2D, c2, offsets[0], 0, bias);
texel += textureGatherOffset(s2DArray, c3, offsets[1], 1, bias);
texel += textureGatherOffsets(s2D, c2, offsets, 0, bias);
texel += textureGatherOffsets(s2DArray, c3, offsets, 1, bias);
sparseTextureGatherARB(s2D, c2, result, 0, bias);
texel += result;
sparseTextureGatherARB(s2DArray, c3, result, 1, bias);
texel += result;
sparseTextureGatherARB(sCube, c3, result, 2, bias);
texel += result;
sparseTextureGatherARB(sCubeArray, c4, result, 2, bias);
texel += result;
sparseTextureGatherOffsetARB(s2D, c2, offsets[0], result, 0, bias);
texel += result;
sparseTextureGatherOffsetARB(s2DArray, c3, offsets[1], result, 1, bias);
texel += result;
sparseTextureGatherOffsetsARB(s2D, c2, offsets, result, 0, bias);
texel += result;
sparseTextureGatherOffsetsARB(s2DArray, c3, offsets, result, 1, bias);
texel += result;
texel += textureGatherLodAMD(s2D, c2, lod);
texel += textureGatherLodAMD(s2DArray, c3, lod, 1);
texel += textureGatherLodAMD(sCube, c3, lod, 2);
texel += textureGatherLodAMD(sCubeArray, c4, lod, 3);
texel += textureGatherLodOffsetAMD(s2D, c2, lod, offsets[0]);
texel += textureGatherLodOffsetAMD(s2DArray, c3, lod, offsets[1], 1);
texel += textureGatherLodOffsetsAMD(s2D, c2, lod, offsets);
texel += textureGatherLodOffsetsAMD(s2DArray, c3, lod, offsets, 1);
sparseTextureGatherLodAMD(s2D, c2, lod, result);
texel += result;
sparseTextureGatherLodAMD(s2DArray, c3, lod, result, 1);
texel += result;
sparseTextureGatherLodAMD(sCube, c3, lod, result, 2);
texel += result;
sparseTextureGatherLodAMD(sCubeArray, c4, lod, result, 2);
texel += result;
sparseTextureGatherLodOffsetAMD(s2D, c2, lod, offsets[0], result);
texel += result;
sparseTextureGatherLodOffsetAMD(s2DArray, c3, lod, offsets[1], result, 1);
texel += result;
sparseTextureGatherLodOffsetsAMD(s2D, c2, lod, offsets, result);
texel += result;
sparseTextureGatherLodOffsetsAMD(s2DArray, c3, lod, offsets, result, 1);
texel += result;
fragColor = texel;
}
...@@ -567,6 +567,11 @@ enum TOperator { ...@@ -567,6 +567,11 @@ enum TOperator {
EOpTextureOffsetClamp, EOpTextureOffsetClamp,
EOpTextureGradClamp, EOpTextureGradClamp,
EOpTextureGradOffsetClamp, EOpTextureGradOffsetClamp,
#ifdef AMD_EXTENSIONS
EOpTextureGatherLod,
EOpTextureGatherLodOffset,
EOpTextureGatherLodOffsets,
#endif
EOpSparseTextureGuardBegin, EOpSparseTextureGuardBegin,
...@@ -586,6 +591,11 @@ enum TOperator { ...@@ -586,6 +591,11 @@ enum TOperator {
EOpSparseTextureOffsetClamp, EOpSparseTextureOffsetClamp,
EOpSparseTextureGradClamp, EOpSparseTextureGradClamp,
EOpSparseTextureGradOffsetClamp, EOpSparseTextureGradOffsetClamp,
#ifdef AMD_EXTENSIONS
EOpSparseTextureGatherLod,
EOpSparseTextureGatherLodOffset,
EOpSparseTextureGatherLodOffsets,
#endif
EOpSparseTextureGuardEnd, EOpSparseTextureGuardEnd,
EOpSamplingGuardEnd, EOpSamplingGuardEnd,
...@@ -1075,6 +1085,25 @@ public: ...@@ -1075,6 +1085,25 @@ public:
cracked.gather = true; cracked.gather = true;
cracked.offsets = true; cracked.offsets = true;
break; break;
#ifdef AMD_EXTENSIONS
case EOpTextureGatherLod:
case EOpSparseTextureGatherLod:
cracked.gather = true;
cracked.lod = true;
break;
case EOpTextureGatherLodOffset:
case EOpSparseTextureGatherLodOffset:
cracked.gather = true;
cracked.offset = true;
cracked.lod = true;
break;
case EOpTextureGatherLodOffsets:
case EOpSparseTextureGatherLodOffsets:
cracked.gather = true;
cracked.offsets = true;
cracked.lod = true;
break;
#endif
case EOpSubpassLoad: case EOpSubpassLoad:
case EOpSubpassLoadMS: case EOpSubpassLoadMS:
cracked.subpass = true; cracked.subpass = true;
......
...@@ -3844,6 +3844,7 @@ void TBuiltIns::add2ndGenerationSamplingImaging(int version, EProfile profile, c ...@@ -3844,6 +3844,7 @@ void TBuiltIns::add2ndGenerationSamplingImaging(int version, EProfile profile, c
else { else {
addSamplingFunctions(sampler, typeName, version, profile); addSamplingFunctions(sampler, typeName, version, profile);
addGatherFunctions(sampler, typeName, version, profile); addGatherFunctions(sampler, typeName, version, profile);
if (spvVersion.vulkan > 0 && sampler.dim == EsdBuffer && sampler.isCombined()) { if (spvVersion.vulkan > 0 && sampler.dim == EsdBuffer && sampler.isCombined()) {
// Vulkan wants a textureBuffer to allow texelFetch() -- // Vulkan wants a textureBuffer to allow texelFetch() --
// a sampled image with no sampler. // a sampled image with no sampler.
...@@ -4349,6 +4350,7 @@ void TBuiltIns::addGatherFunctions(TSampler sampler, const TString& typeName, in ...@@ -4349,6 +4350,7 @@ void TBuiltIns::addGatherFunctions(TSampler sampler, const TString& typeName, in
default: default:
break; break;
} }
if (sparse) if (sparse)
s.append("ARB"); s.append("ARB");
s.append("("); s.append("(");
...@@ -4388,6 +4390,116 @@ void TBuiltIns::addGatherFunctions(TSampler sampler, const TString& typeName, in ...@@ -4388,6 +4390,116 @@ void TBuiltIns::addGatherFunctions(TSampler sampler, const TString& typeName, in
} }
} }
} }
#ifdef AMD_EXTENSIONS
if (sampler.dim == EsdRect || sampler.shadow)
return;
if (profile == EEsProfile || version < 450)
return;
for (int bias = 0; bias < 2; ++bias) { // loop over presence of bias argument
for (int lod = 0; lod < 2; ++lod) { // loop over presence of lod argument
if ((lod && bias) || (lod == 0 && bias == 0))
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
if (comp == 0 && bias)
continue;
if (offset > 0 && sampler.dim == EsdCube)
continue;
for (int sparse = 0; sparse <= 1; ++sparse) { // loop over "bool" sparse or not
if (sparse && (profile == EEsProfile || version < 450))
continue;
TString s;
// return type
if (sparse)
s.append("int ");
else {
s.append(prefixes[sampler.type]);
s.append("vec4 ");
}
// name
if (sparse)
s.append("sparseTextureGather");
else
s.append("textureGather");
if (lod)
s.append("Lod");
switch (offset) {
case 1:
s.append("Offset");
break;
case 2:
s.append("Offsets");
default:
break;
}
if (lod)
s.append("AMD");
else if (sparse)
s.append("ARB");
s.append("(");
// sampler type argument
s.append(typeName);
// P coordinate argument
s.append(",vec");
int totalDims = dimMap[sampler.dim] + (sampler.arrayed ? 1 : 0);
s.append(postfixes[totalDims]);
// lod argument
if (lod)
s.append(",float");
// offset argument
if (offset > 0) {
s.append(",ivec2");
if (offset == 2)
s.append("[4]");
}
// texel out (for sparse texture)
if (sparse) {
s.append(",out ");
s.append(prefixes[sampler.type]);
s.append("vec4 ");
}
// comp argument
if (comp)
s.append(",int");
// bias argument
if (bias)
s.append(",float");
s.append(");\n");
if (bias)
stageBuiltins[EShLangFragment].append(s);
else
commonBuiltins.append(s);
}
}
}
}
}
#endif
} }
// //
...@@ -5366,6 +5478,16 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion ...@@ -5366,6 +5478,16 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
BuiltInVariable("gl_BaryCoordSmoothSampleAMD", EbvBaryCoordSmoothSample, symbolTable); BuiltInVariable("gl_BaryCoordSmoothSampleAMD", EbvBaryCoordSmoothSample, symbolTable);
BuiltInVariable("gl_BaryCoordPullModelAMD", EbvBaryCoordPullModel, symbolTable); BuiltInVariable("gl_BaryCoordPullModelAMD", EbvBaryCoordPullModel, symbolTable);
} }
// E_GL_AMD_texture_gather_bias_lod
if (profile != EEsProfile) {
symbolTable.setFunctionExtensions("textureGatherLodAMD", 1, &E_GL_AMD_texture_gather_bias_lod);
symbolTable.setFunctionExtensions("textureGatherLodOffsetAMD", 1, &E_GL_AMD_texture_gather_bias_lod);
symbolTable.setFunctionExtensions("textureGatherLodOffsetsAMD", 1, &E_GL_AMD_texture_gather_bias_lod);
symbolTable.setFunctionExtensions("sparseTextureGatherLodAMD", 1, &E_GL_AMD_texture_gather_bias_lod);
symbolTable.setFunctionExtensions("sparseTextureGatherLodOffsetAMD", 1, &E_GL_AMD_texture_gather_bias_lod);
symbolTable.setFunctionExtensions("sparseTextureGatherLodOffsetsAMD", 1, &E_GL_AMD_texture_gather_bias_lod);
}
#endif #endif
symbolTable.setVariableExtensions("gl_FragDepthEXT", 1, &E_GL_EXT_frag_depth); symbolTable.setVariableExtensions("gl_FragDepthEXT", 1, &E_GL_EXT_frag_depth);
...@@ -5752,6 +5874,13 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion ...@@ -5752,6 +5874,13 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion
symbolTable.relateToOperator("cubeFaceIndexAMD", EOpCubeFaceIndex); symbolTable.relateToOperator("cubeFaceIndexAMD", EOpCubeFaceIndex);
symbolTable.relateToOperator("cubeFaceCoordAMD", EOpCubeFaceCoord); symbolTable.relateToOperator("cubeFaceCoordAMD", EOpCubeFaceCoord);
symbolTable.relateToOperator("timeAMD", EOpTime); symbolTable.relateToOperator("timeAMD", EOpTime);
symbolTable.relateToOperator("textureGatherLodAMD", EOpTextureGatherLod);
symbolTable.relateToOperator("textureGatherLodOffsetAMD", EOpTextureGatherLodOffset);
symbolTable.relateToOperator("textureGatherLodOffsetsAMD", EOpTextureGatherLodOffsets);
symbolTable.relateToOperator("sparseTextureGatherLodAMD", EOpSparseTextureGatherLod);
symbolTable.relateToOperator("sparseTextureGatherLodOffsetAMD", EOpSparseTextureGatherLodOffset);
symbolTable.relateToOperator("sparseTextureGatherLodOffsetsAMD", EOpSparseTextureGatherLodOffsets);
#endif #endif
} }
} }
......
...@@ -1442,9 +1442,56 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan ...@@ -1442,9 +1442,56 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan
error(loc, "must be a compile-time constant:", feature, "component argument"); error(loc, "must be a compile-time constant:", feature, "component argument");
} }
#ifdef AMD_EXTENSIONS
bool bias = false;
if (callNode.getOp() == EOpTextureGather)
bias = fnCandidate.getParamCount() > 3;
else if (callNode.getOp() == EOpTextureGatherOffset ||
callNode.getOp() == EOpTextureGatherOffsets)
bias = fnCandidate.getParamCount() > 4;
if (bias) {
featureString = fnCandidate.getName() + "with bias argument";
feature = featureString.c_str();
profileRequires(loc, ~EEsProfile, 450, nullptr, feature);
requireExtensions(loc, 1, &E_GL_AMD_texture_gather_bias_lod, feature);
}
#endif
break; break;
} }
#ifdef AMD_EXTENSIONS
case EOpSparseTextureGather:
case EOpSparseTextureGatherOffset:
case EOpSparseTextureGatherOffsets:
{
bool bias = false;
if (callNode.getOp() == EOpSparseTextureGather)
bias = fnCandidate.getParamCount() > 4;
else if (callNode.getOp() == EOpSparseTextureGatherOffset ||
callNode.getOp() == EOpSparseTextureGatherOffsets)
bias = fnCandidate.getParamCount() > 5;
if (bias) {
TString featureString = fnCandidate.getName() + "with bias argument";
const char* feature = featureString.c_str();
profileRequires(loc, ~EEsProfile, 450, nullptr, feature);
requireExtensions(loc, 1, &E_GL_AMD_texture_gather_bias_lod, feature);
}
break;
}
case EOpSparseTextureGatherLod:
case EOpSparseTextureGatherLodOffset:
case EOpSparseTextureGatherLodOffsets:
{
requireExtensions(loc, 1, &E_GL_ARB_sparse_texture2, fnCandidate.getName().c_str());
break;
}
#endif
case EOpTextureOffset: case EOpTextureOffset:
case EOpTextureFetchOffset: case EOpTextureFetchOffset:
case EOpTextureProjOffset: case EOpTextureProjOffset:
......
...@@ -194,6 +194,7 @@ void TParseVersions::initializeExtensionBehavior() ...@@ -194,6 +194,7 @@ void TParseVersions::initializeExtensionBehavior()
extensionBehavior[E_GL_AMD_shader_explicit_vertex_parameter] = EBhDisable; extensionBehavior[E_GL_AMD_shader_explicit_vertex_parameter] = EBhDisable;
extensionBehavior[E_GL_AMD_gcn_shader] = EBhDisable; extensionBehavior[E_GL_AMD_gcn_shader] = EBhDisable;
extensionBehavior[E_GL_AMD_gpu_shader_half_float] = EBhDisable; extensionBehavior[E_GL_AMD_gpu_shader_half_float] = EBhDisable;
extensionBehavior[E_GL_AMD_texture_gather_bias_lod] = EBhDisable;
#endif #endif
#ifdef NV_EXTENSIONS #ifdef NV_EXTENSIONS
...@@ -316,6 +317,7 @@ void TParseVersions::getPreamble(std::string& preamble) ...@@ -316,6 +317,7 @@ void TParseVersions::getPreamble(std::string& preamble)
"#define GL_AMD_shader_explicit_vertex_parameter 1\n" "#define GL_AMD_shader_explicit_vertex_parameter 1\n"
"#define GL_AMD_gcn_shader 1\n" "#define GL_AMD_gcn_shader 1\n"
"#define GL_AMD_gpu_shader_half_float 1\n" "#define GL_AMD_gpu_shader_half_float 1\n"
"#define GL_AMD_texture_gather_bias_lod 1\n"
#endif #endif
#ifdef NV_EXTENSIONS #ifdef NV_EXTENSIONS
......
...@@ -146,6 +146,7 @@ const char* const E_GL_AMD_shader_trinary_minmax = "GL_AMD_shader ...@@ -146,6 +146,7 @@ const char* const E_GL_AMD_shader_trinary_minmax = "GL_AMD_shader
const char* const E_GL_AMD_shader_explicit_vertex_parameter = "GL_AMD_shader_explicit_vertex_parameter"; const char* const E_GL_AMD_shader_explicit_vertex_parameter = "GL_AMD_shader_explicit_vertex_parameter";
const char* const E_GL_AMD_gcn_shader = "GL_AMD_gcn_shader"; const char* const E_GL_AMD_gcn_shader = "GL_AMD_gcn_shader";
const char* const E_GL_AMD_gpu_shader_half_float = "GL_AMD_gpu_shader_half_float"; const char* const E_GL_AMD_gpu_shader_half_float = "GL_AMD_gpu_shader_half_float";
const char* const E_GL_AMD_texture_gather_bias_lod = "GL_AMD_texture_gather_bias_lod";
#endif #endif
#ifdef NV_EXTENSIONS #ifdef NV_EXTENSIONS
......
...@@ -390,6 +390,8 @@ bool TOutputTraverser::visitUnary(TVisit /* visit */, TIntermUnary* node) ...@@ -390,6 +390,8 @@ bool TOutputTraverser::visitUnary(TVisit /* visit */, TIntermUnary* node)
case EOpRcp: out.debug << "rcp"; break; case EOpRcp: out.debug << "rcp"; break;
case EOpSaturate: out.debug << "saturate"; break; case EOpSaturate: out.debug << "saturate"; break;
case EOpSparseTexelsResident: out.debug << "sparseTexelsResident"; break;
#ifdef AMD_EXTENSIONS #ifdef AMD_EXTENSIONS
case EOpMinInvocations: out.debug << "minInvocations"; break; case EOpMinInvocations: out.debug << "minInvocations"; break;
case EOpMaxInvocations: out.debug << "maxInvocations"; break; case EOpMaxInvocations: out.debug << "maxInvocations"; break;
...@@ -647,6 +649,37 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node ...@@ -647,6 +649,37 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node
case EOpTextureGather: out.debug << "textureGather"; break; case EOpTextureGather: out.debug << "textureGather"; break;
case EOpTextureGatherOffset: out.debug << "textureGatherOffset"; break; case EOpTextureGatherOffset: out.debug << "textureGatherOffset"; break;
case EOpTextureGatherOffsets: out.debug << "textureGatherOffsets"; break; case EOpTextureGatherOffsets: out.debug << "textureGatherOffsets"; break;
case EOpTextureClamp: out.debug << "textureClamp"; break;
case EOpTextureOffsetClamp: out.debug << "textureOffsetClamp"; break;
case EOpTextureGradClamp: out.debug << "textureGradClamp"; break;
case EOpTextureGradOffsetClamp: out.debug << "textureGradOffsetClamp"; break;
#ifdef AMD_EXTENSIONS
case EOpTextureGatherLod: out.debug << "textureGatherLod"; break;
case EOpTextureGatherLodOffset: out.debug << "textureGatherLodOffset"; break;
case EOpTextureGatherLodOffsets: out.debug << "textureGatherLodOffsets"; break;
#endif
case EOpSparseTexture: out.debug << "sparseTexture"; break;
case EOpSparseTextureOffset: out.debug << "sparseTextureOffset"; break;
case EOpSparseTextureLod: out.debug << "sparseTextureLod"; break;
case EOpSparseTextureLodOffset: out.debug << "sparseTextureLodOffset"; break;
case EOpSparseTextureFetch: out.debug << "sparseTexelFetch"; break;
case EOpSparseTextureFetchOffset: out.debug << "sparseTexelFetchOffset"; break;
case EOpSparseTextureGrad: out.debug << "sparseTextureGrad"; break;
case EOpSparseTextureGradOffset: out.debug << "sparseTextureGradOffset"; break;
case EOpSparseTextureGather: out.debug << "sparseTextureGather"; break;
case EOpSparseTextureGatherOffset: out.debug << "sparseTextureGatherOffset"; break;
case EOpSparseTextureGatherOffsets: out.debug << "sparseTextureGatherOffsets"; break;
case EOpSparseImageLoad: out.debug << "sparseImageLoad"; break;
case EOpSparseTextureClamp: out.debug << "sparseTextureClamp"; break;
case EOpSparseTextureOffsetClamp: out.debug << "sparseTextureOffsetClamp"; break;
case EOpSparseTextureGradClamp: out.debug << "sparseTextureGradClamp"; break;
case EOpSparseTextureGradOffsetClamp: out.debug << "sparseTextureGradOffsetClam"; break;
#ifdef AMD_EXTENSIONS
case EOpSparseTextureGatherLod: out.debug << "sparseTextureGatherLod"; break;
case EOpSparseTextureGatherLodOffset: out.debug << "sparseTextureGatherLodOffset"; break;
case EOpSparseTextureGatherLodOffsets: out.debug << "sparseTextureGatherLodOffsets"; break;
#endif
case EOpAddCarry: out.debug << "addCarry"; break; case EOpAddCarry: out.debug << "addCarry"; break;
case EOpSubBorrow: out.debug << "subBorrow"; break; case EOpSubBorrow: out.debug << "subBorrow"; break;
......
...@@ -396,7 +396,8 @@ INSTANTIATE_TEST_CASE_P( ...@@ -396,7 +396,8 @@ INSTANTIATE_TEST_CASE_P(
Glsl, CompileVulkanToSpirvTestAMD, Glsl, CompileVulkanToSpirvTestAMD,
::testing::ValuesIn(std::vector<std::string>({ ::testing::ValuesIn(std::vector<std::string>({
"spv.float16.frag", "spv.float16.frag",
"spv.shaderBallotAMD.comp" "spv.shaderBallotAMD.comp",
"spv.textureGatherBiasLod.frag"
})), })),
FileNameAsCustomTestSuffix FileNameAsCustomTestSuffix
); );
......
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