Parser & SPV: Implement two extensions regarding GLSL sparse texture.
Implement extension "GL_ARB_sparse_texture2". Implement extension "GL_ARB_sparse_texture_clamp".
This commit is contained in:
parent
e23c9849c2
commit
48edadfd24
12 changed files with 1621 additions and 151 deletions
|
|
@ -1956,6 +1956,14 @@ void TBuiltIns::add2ndGenerationSamplingImaging(int version, EProfile profile, i
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// sparseTexelsResidentARB()
|
||||
//
|
||||
|
||||
if (profile != EEsProfile && version >= 450) {
|
||||
commonBuiltins.append("bool sparseTexelsResidentARB(int code);\n");
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
|
|
@ -2069,6 +2077,15 @@ void TBuiltIns::addImageFunctions(TSampler sampler, TString& typeName, int versi
|
|||
commonBuiltins.append(prefixes[sampler.type]);
|
||||
commonBuiltins.append("vec4);\n");
|
||||
|
||||
if (sampler.dim != Esd1D && sampler.dim != EsdBuffer && profile != EEsProfile && version >= 450) {
|
||||
commonBuiltins.append("int sparseImageLoadARB(readonly volatile coherent ");
|
||||
commonBuiltins.append(imageParams);
|
||||
commonBuiltins.append(", out ");
|
||||
commonBuiltins.append(prefixes[sampler.type]);
|
||||
commonBuiltins.append("vec4");
|
||||
commonBuiltins.append(");\n");
|
||||
}
|
||||
|
||||
if ( profile != EEsProfile ||
|
||||
(profile == EEsProfile && version >= 310)) {
|
||||
if (sampler.type == EbtInt || sampler.type == EbtUint) {
|
||||
|
|
@ -2123,7 +2140,7 @@ void TBuiltIns::addImageFunctions(TSampler sampler, TString& typeName, int versi
|
|||
//
|
||||
// Add all the texture lookup functions for the given type.
|
||||
//
|
||||
void TBuiltIns::addSamplingFunctions(TSampler sampler, TString& typeName, int /*version*/, EProfile /*profile*/)
|
||||
void TBuiltIns::addSamplingFunctions(TSampler sampler, TString& typeName, int version, EProfile profile)
|
||||
{
|
||||
//
|
||||
// texturing
|
||||
|
|
@ -2196,97 +2213,148 @@ void TBuiltIns::addSamplingFunctions(TSampler sampler, TString& typeName, int /*
|
|||
if (extraProj && (sampler.dim == Esd3D || sampler.shadow))
|
||||
continue;
|
||||
|
||||
TString s;
|
||||
for (int lodClamp = 0; lodClamp <= 1 ;++lodClamp) { // loop over "bool" lod clamp
|
||||
|
||||
// return type
|
||||
if (sampler.shadow)
|
||||
s.append("float ");
|
||||
else {
|
||||
s.append(prefixes[sampler.type]);
|
||||
s.append("vec4 ");
|
||||
}
|
||||
if (lodClamp && (profile == EEsProfile || version < 450))
|
||||
continue;
|
||||
if (lodClamp && (proj || lod || fetch))
|
||||
continue;
|
||||
|
||||
// name
|
||||
if (fetch)
|
||||
s.append("texel");
|
||||
else
|
||||
s.append("texture");
|
||||
if (proj)
|
||||
s.append("Proj");
|
||||
if (lod)
|
||||
s.append("Lod");
|
||||
if (grad)
|
||||
s.append("Grad");
|
||||
if (fetch)
|
||||
s.append("Fetch");
|
||||
if (offset)
|
||||
s.append("Offset");
|
||||
s.append("(");
|
||||
for (int sparse = 0; sparse <= 1; ++sparse) { // loop over "bool" sparse or not
|
||||
|
||||
// sampler type
|
||||
s.append(typeName);
|
||||
if (sparse && (profile == EEsProfile || version < 450))
|
||||
continue;
|
||||
// Sparse sampling is not for 1D/1D array texture, buffer texture, and projective texture
|
||||
if (sparse && (sampler.dim == Esd1D || sampler.dim == EsdBuffer || proj))
|
||||
continue;
|
||||
|
||||
// P coordinate
|
||||
if (extraProj)
|
||||
s.append(",vec4");
|
||||
else {
|
||||
s.append(",");
|
||||
TBasicType t = fetch ? EbtInt : EbtFloat;
|
||||
if (totalDims == 1)
|
||||
s.append(TType::getBasicString(t));
|
||||
else {
|
||||
s.append(prefixes[t]);
|
||||
s.append("vec");
|
||||
s.append(postfixes[totalDims]);
|
||||
TString s;
|
||||
|
||||
// return type
|
||||
if (sparse)
|
||||
s.append("int ");
|
||||
else {
|
||||
if (sampler.shadow)
|
||||
s.append("float ");
|
||||
else {
|
||||
s.append(prefixes[sampler.type]);
|
||||
s.append("vec4 ");
|
||||
}
|
||||
}
|
||||
|
||||
// name
|
||||
if (sparse) {
|
||||
if (fetch)
|
||||
s.append("sparseTexel");
|
||||
else
|
||||
s.append("sparseTexture");
|
||||
} else {
|
||||
if (fetch)
|
||||
s.append("texel");
|
||||
else
|
||||
s.append("texture");
|
||||
}
|
||||
if (proj)
|
||||
s.append("Proj");
|
||||
if (lod)
|
||||
s.append("Lod");
|
||||
if (grad)
|
||||
s.append("Grad");
|
||||
if (fetch)
|
||||
s.append("Fetch");
|
||||
if (offset)
|
||||
s.append("Offset");
|
||||
if (lodClamp)
|
||||
s.append("Clamp");
|
||||
if (lodClamp || sparse)
|
||||
s.append("ARB");
|
||||
s.append("(");
|
||||
|
||||
// sampler type
|
||||
s.append(typeName);
|
||||
|
||||
// P coordinate
|
||||
if (extraProj)
|
||||
s.append(",vec4");
|
||||
else {
|
||||
s.append(",");
|
||||
TBasicType t = fetch ? EbtInt : EbtFloat;
|
||||
if (totalDims == 1)
|
||||
s.append(TType::getBasicString(t));
|
||||
else {
|
||||
s.append(prefixes[t]);
|
||||
s.append("vec");
|
||||
s.append(postfixes[totalDims]);
|
||||
}
|
||||
}
|
||||
|
||||
if (bias && compare)
|
||||
continue;
|
||||
|
||||
// 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");
|
||||
|
||||
// non-optional lod
|
||||
if (lod)
|
||||
s.append(",float");
|
||||
|
||||
// gradient arguments
|
||||
if (grad) {
|
||||
if (dimMap[sampler.dim] == 1)
|
||||
s.append(",float,float");
|
||||
else {
|
||||
s.append(",vec");
|
||||
s.append(postfixes[dimMap[sampler.dim]]);
|
||||
s.append(",vec");
|
||||
s.append(postfixes[dimMap[sampler.dim]]);
|
||||
}
|
||||
}
|
||||
|
||||
// offset
|
||||
if (offset) {
|
||||
if (dimMap[sampler.dim] == 1)
|
||||
s.append(",int");
|
||||
else {
|
||||
s.append(",ivec");
|
||||
s.append(postfixes[dimMap[sampler.dim]]);
|
||||
}
|
||||
}
|
||||
|
||||
// non-optional compare
|
||||
if (compare)
|
||||
s.append(",float");
|
||||
|
||||
// lod clamp
|
||||
if (lodClamp)
|
||||
s.append(",float");
|
||||
|
||||
// texel out (for sparse texture)
|
||||
if (sparse) {
|
||||
s.append(",out ");
|
||||
if (sampler.shadow)
|
||||
s.append("float ");
|
||||
else {
|
||||
s.append(prefixes[sampler.type]);
|
||||
s.append("vec4 ");
|
||||
}
|
||||
}
|
||||
|
||||
// optional bias
|
||||
if (bias)
|
||||
s.append(",float");
|
||||
|
||||
s.append(");\n");
|
||||
|
||||
// Add to the per-language set of built-ins
|
||||
|
||||
if (bias)
|
||||
stageBuiltins[EShLangFragment].append(s);
|
||||
else
|
||||
commonBuiltins.append(s);
|
||||
}
|
||||
}
|
||||
|
||||
if (bias && compare)
|
||||
continue;
|
||||
|
||||
// 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");
|
||||
|
||||
// non-optional lod
|
||||
if (lod)
|
||||
s.append(",float");
|
||||
|
||||
// gradient arguments
|
||||
if (grad) {
|
||||
if (dimMap[sampler.dim] == 1)
|
||||
s.append(",float,float");
|
||||
else {
|
||||
s.append(",vec");
|
||||
s.append(postfixes[dimMap[sampler.dim]]);
|
||||
s.append(",vec");
|
||||
s.append(postfixes[dimMap[sampler.dim]]);
|
||||
}
|
||||
}
|
||||
|
||||
// offset
|
||||
if (offset) {
|
||||
if (dimMap[sampler.dim] == 1)
|
||||
s.append(",int");
|
||||
else {
|
||||
s.append(",ivec");
|
||||
s.append(postfixes[dimMap[sampler.dim]]);
|
||||
}
|
||||
}
|
||||
|
||||
// optional bias or non-optional compare
|
||||
if (bias || compare)
|
||||
s.append(",float");
|
||||
|
||||
s.append(");\n");
|
||||
|
||||
// Add to the per-language set of built-ins
|
||||
|
||||
if (bias)
|
||||
stageBuiltins[EShLangFragment].append(s);
|
||||
else
|
||||
commonBuiltins.append(s);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2303,7 +2371,7 @@ void TBuiltIns::addSamplingFunctions(TSampler sampler, TString& typeName, int /*
|
|||
//
|
||||
// Add all the texture gather functions for the given type.
|
||||
//
|
||||
void TBuiltIns::addGatherFunctions(TSampler sampler, TString& typeName, int version, EProfile /* profile */)
|
||||
void TBuiltIns::addGatherFunctions(TSampler sampler, TString& typeName, int version, EProfile profile)
|
||||
{
|
||||
switch (sampler.dim) {
|
||||
case Esd2D:
|
||||
|
|
@ -2330,51 +2398,71 @@ void TBuiltIns::addGatherFunctions(TSampler sampler, TString& typeName, int vers
|
|||
if (offset > 0 && sampler.dim == EsdCube)
|
||||
continue;
|
||||
|
||||
TString s;
|
||||
for (int sparse = 0; sparse <= 1; ++sparse) { // loop over "bool" sparse or not
|
||||
if (sparse && (profile == EEsProfile || version < 450))
|
||||
continue;
|
||||
|
||||
// return type
|
||||
s.append(prefixes[sampler.type]);
|
||||
s.append("vec4 ");
|
||||
TString s;
|
||||
|
||||
// name
|
||||
s.append("textureGather");
|
||||
switch (offset) {
|
||||
case 1:
|
||||
s.append("Offset");
|
||||
break;
|
||||
case 2:
|
||||
s.append("Offsets");
|
||||
default:
|
||||
break;
|
||||
// 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");
|
||||
switch (offset) {
|
||||
case 1:
|
||||
s.append("Offset");
|
||||
break;
|
||||
case 2:
|
||||
s.append("Offsets");
|
||||
default:
|
||||
break;
|
||||
}
|
||||
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]);
|
||||
|
||||
// refZ argument
|
||||
if (sampler.shadow)
|
||||
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");
|
||||
|
||||
s.append(");\n");
|
||||
commonBuiltins.append(s);
|
||||
}
|
||||
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]);
|
||||
|
||||
// refZ argument
|
||||
if (sampler.shadow)
|
||||
s.append(",float");
|
||||
|
||||
// offset argument
|
||||
if (offset > 0) {
|
||||
s.append(",ivec2");
|
||||
if (offset == 2)
|
||||
s.append("[4]");
|
||||
}
|
||||
|
||||
// comp argument
|
||||
if (comp)
|
||||
s.append(",int");
|
||||
|
||||
s.append(");\n");
|
||||
commonBuiltins.append(s);
|
||||
//printf("%s", s.c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -3164,6 +3252,37 @@ void IdentifyBuiltIns(int version, EProfile profile, int spv, EShLanguage langua
|
|||
symbolTable.setFunctionExtensions("fwidthCoarse", 1, &E_GL_ARB_derivative_control);
|
||||
}
|
||||
|
||||
// E_GL_ARB_sparse_texture2
|
||||
if (profile != EEsProfile)
|
||||
{
|
||||
symbolTable.setFunctionExtensions("sparseTextureARB", 1, &E_GL_ARB_sparse_texture2);
|
||||
symbolTable.setFunctionExtensions("sparseTextureLodARB", 1, &E_GL_ARB_sparse_texture2);
|
||||
symbolTable.setFunctionExtensions("sparseTextureOffsetARB", 1, &E_GL_ARB_sparse_texture2);
|
||||
symbolTable.setFunctionExtensions("sparseTexelFetchARB", 1, &E_GL_ARB_sparse_texture2);
|
||||
symbolTable.setFunctionExtensions("sparseTexelFetchOffsetARB", 1, &E_GL_ARB_sparse_texture2);
|
||||
symbolTable.setFunctionExtensions("sparseTextureLodOffsetARB", 1, &E_GL_ARB_sparse_texture2);
|
||||
symbolTable.setFunctionExtensions("sparseTextureGradARB", 1, &E_GL_ARB_sparse_texture2);
|
||||
symbolTable.setFunctionExtensions("sparseTextureGradOffsetARB", 1, &E_GL_ARB_sparse_texture2);
|
||||
symbolTable.setFunctionExtensions("sparseTextureGatherARB", 1, &E_GL_ARB_sparse_texture2);
|
||||
symbolTable.setFunctionExtensions("sparseTextureGatherOffsetARB", 1, &E_GL_ARB_sparse_texture2);
|
||||
symbolTable.setFunctionExtensions("sparseTextureGatherOffsetsARB", 1, &E_GL_ARB_sparse_texture2);
|
||||
symbolTable.setFunctionExtensions("sparseImageLoadARB", 1, &E_GL_ARB_sparse_texture2);
|
||||
symbolTable.setFunctionExtensions("sparseTexelsResident", 1, &E_GL_ARB_sparse_texture2);
|
||||
}
|
||||
|
||||
// E_GL_ARB_sparse_texture_clamp
|
||||
if (profile != EEsProfile)
|
||||
{
|
||||
symbolTable.setFunctionExtensions("sparseTextureClampARB", 1, &E_GL_ARB_sparse_texture_clamp);
|
||||
symbolTable.setFunctionExtensions("sparseTextureOffsetClampARB", 1, &E_GL_ARB_sparse_texture_clamp);
|
||||
symbolTable.setFunctionExtensions("sparseTextureGradClampARB", 1, &E_GL_ARB_sparse_texture_clamp);
|
||||
symbolTable.setFunctionExtensions("sparseTextureGradOffsetClampARB", 1, &E_GL_ARB_sparse_texture_clamp);
|
||||
symbolTable.setFunctionExtensions("textureClampARB", 1, &E_GL_ARB_sparse_texture_clamp);
|
||||
symbolTable.setFunctionExtensions("textureOffsetClampARB", 1, &E_GL_ARB_sparse_texture_clamp);
|
||||
symbolTable.setFunctionExtensions("textureGradClampARB", 1, &E_GL_ARB_sparse_texture_clamp);
|
||||
symbolTable.setFunctionExtensions("textureGradOffsetClampARB", 1, &E_GL_ARB_sparse_texture_clamp);
|
||||
}
|
||||
|
||||
symbolTable.setVariableExtensions("gl_FragDepthEXT", 1, &E_GL_EXT_frag_depth);
|
||||
|
||||
if (profile == EEsProfile) {
|
||||
|
|
@ -3423,6 +3542,32 @@ void IdentifyBuiltIns(int version, EProfile profile, int spv, EShLanguage langua
|
|||
symbolTable.relateToOperator("shadow1DProjLod", EOpTextureProjLod);
|
||||
symbolTable.relateToOperator("shadow2DProjLod", EOpTextureProjLod);
|
||||
}
|
||||
|
||||
if (profile != EEsProfile)
|
||||
{
|
||||
symbolTable.relateToOperator("sparseTextureARB", EOpSparseTexture);
|
||||
symbolTable.relateToOperator("sparseTextureLodARB", EOpSparseTextureLod);
|
||||
symbolTable.relateToOperator("sparseTextureOffsetARB", EOpSparseTextureOffset);
|
||||
symbolTable.relateToOperator("sparseTexelFetchARB", EOpSparseTextureFetch);
|
||||
symbolTable.relateToOperator("sparseTexelFetchOffsetARB", EOpSparseTextureFetchOffset);
|
||||
symbolTable.relateToOperator("sparseTextureLodOffsetARB", EOpSparseTextureLodOffset);
|
||||
symbolTable.relateToOperator("sparseTextureGradARB", EOpSparseTextureGrad);
|
||||
symbolTable.relateToOperator("sparseTextureGradOffsetARB", EOpSparseTextureGradOffset);
|
||||
symbolTable.relateToOperator("sparseTextureGatherARB", EOpSparseTextureGather);
|
||||
symbolTable.relateToOperator("sparseTextureGatherOffsetARB", EOpSparseTextureGatherOffset);
|
||||
symbolTable.relateToOperator("sparseTextureGatherOffsetsARB", EOpSparseTextureGatherOffsets);
|
||||
symbolTable.relateToOperator("sparseImageLoadARB", EOpSparseImageLoad);
|
||||
symbolTable.relateToOperator("sparseTexelsResidentARB", EOpSparseTexelsResident);
|
||||
|
||||
symbolTable.relateToOperator("sparseTextureClampARB", EOpSparseTextureClamp);
|
||||
symbolTable.relateToOperator("sparseTextureOffsetClampARB", EOpSparseTextureOffsetClamp);
|
||||
symbolTable.relateToOperator("sparseTextureGradClampARB", EOpSparseTextureGradClamp);
|
||||
symbolTable.relateToOperator("sparseTextureGradOffsetClampARB", EOpSparseTextureGradOffsetClamp);
|
||||
symbolTable.relateToOperator("textureClampARB", EOpTextureClamp);
|
||||
symbolTable.relateToOperator("textureOffsetClampARB", EOpTextureOffsetClamp);
|
||||
symbolTable.relateToOperator("textureGradClampARB", EOpTextureGradClamp);
|
||||
symbolTable.relateToOperator("textureGradOffsetClampARB", EOpTextureGradOffsetClamp);
|
||||
}
|
||||
}
|
||||
|
||||
switch(language) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue