mirror of
https://github.com/KhronosGroup/SPIRV-Cross.git
synced 2024-11-09 13:50:05 +00:00
GLSL: Improve support for GL_ARB_shader_draw_parameters in desktop GLSL.
Opt-in to using the extension to support gl_InstanceIndex.
This commit is contained in:
parent
ec558bc98e
commit
ef247e75ec
@ -1,4 +1,7 @@
|
||||
#version 450
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#extension GL_ARB_shader_draw_parameters : enable
|
||||
#endif
|
||||
|
||||
struct InstanceData
|
||||
{
|
||||
@ -12,7 +15,11 @@ layout(binding = 0, std430) readonly buffer gInstanceData
|
||||
} gInstanceData_1;
|
||||
|
||||
layout(location = 0) in vec3 PosL;
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#define SPIRV_Cross_BaseInstance gl_BaseInstanceARB
|
||||
#else
|
||||
uniform int SPIRV_Cross_BaseInstance;
|
||||
#endif
|
||||
layout(location = 0) out vec4 _entryPointOutput_Color;
|
||||
|
||||
void main()
|
||||
|
@ -1,6 +1,13 @@
|
||||
#version 450
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#extension GL_ARB_shader_draw_parameters : enable
|
||||
#endif
|
||||
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#define SPIRV_Cross_BaseInstance gl_BaseInstanceARB
|
||||
#else
|
||||
uniform int SPIRV_Cross_BaseInstance;
|
||||
#endif
|
||||
|
||||
void main()
|
||||
{
|
||||
|
@ -0,0 +1,24 @@
|
||||
#version 450
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#extension GL_ARB_shader_draw_parameters : enable
|
||||
#endif
|
||||
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#define SPIRV_Cross_BaseVertex gl_BaseVertexARB
|
||||
#else
|
||||
uniform int SPIRV_Cross_BaseVertex;
|
||||
#endif
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#define SPIRV_Cross_BaseInstance gl_BaseInstanceARB
|
||||
#else
|
||||
uniform int SPIRV_Cross_BaseInstance;
|
||||
#endif
|
||||
#ifndef GL_ARB_shader_draw_parameters
|
||||
#error GL_ARB_shader_draw_parameters is not supported.
|
||||
#endif
|
||||
|
||||
void main()
|
||||
{
|
||||
gl_Position = vec4(float(SPIRV_Cross_BaseVertex), float(SPIRV_Cross_BaseInstance), float(gl_DrawIDARB), 1.0);
|
||||
}
|
||||
|
@ -0,0 +1,24 @@
|
||||
#version 460
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#extension GL_ARB_shader_draw_parameters : enable
|
||||
#endif
|
||||
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#define SPIRV_Cross_BaseVertex gl_BaseVertexARB
|
||||
#else
|
||||
uniform int SPIRV_Cross_BaseVertex;
|
||||
#endif
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#define SPIRV_Cross_BaseInstance gl_BaseInstanceARB
|
||||
#else
|
||||
uniform int SPIRV_Cross_BaseInstance;
|
||||
#endif
|
||||
#ifndef GL_ARB_shader_draw_parameters
|
||||
#error GL_ARB_shader_draw_parameters is not supported.
|
||||
#endif
|
||||
|
||||
void main()
|
||||
{
|
||||
gl_Position = vec4(float(SPIRV_Cross_BaseVertex), float(SPIRV_Cross_BaseInstance), float(gl_DrawIDARB), 1.0);
|
||||
}
|
||||
|
@ -1,4 +1,7 @@
|
||||
#version 310 es
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#extension GL_ARB_shader_draw_parameters : enable
|
||||
#endif
|
||||
|
||||
struct PatchData
|
||||
{
|
||||
@ -44,7 +47,11 @@ layout(binding = 1) uniform mediump sampler2D TexLOD;
|
||||
layout(binding = 0) uniform mediump sampler2D TexHeightmap;
|
||||
|
||||
layout(location = 1) in vec4 LODWeights;
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#define SPIRV_Cross_BaseInstance gl_BaseInstanceARB
|
||||
#else
|
||||
uniform int SPIRV_Cross_BaseInstance;
|
||||
#endif
|
||||
layout(location = 0) in vec2 Position;
|
||||
layout(location = 1) out vec3 EyeVec;
|
||||
layout(location = 0) out vec2 TexCoord;
|
||||
|
@ -1,4 +1,7 @@
|
||||
#version 310 es
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#extension GL_ARB_shader_draw_parameters : enable
|
||||
#endif
|
||||
|
||||
struct PatchData
|
||||
{
|
||||
@ -45,7 +48,11 @@ layout(binding = 1) uniform mediump sampler2D TexLOD;
|
||||
layout(binding = 0) uniform mediump sampler2D TexDisplacement;
|
||||
|
||||
layout(location = 1) in vec4 LODWeights;
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#define SPIRV_Cross_BaseInstance gl_BaseInstanceARB
|
||||
#else
|
||||
uniform int SPIRV_Cross_BaseInstance;
|
||||
#endif
|
||||
layout(location = 0) in vec4 Position;
|
||||
layout(location = 0) out vec3 EyeVec;
|
||||
layout(location = 1) out vec4 TexCoord;
|
||||
|
@ -1,6 +1,13 @@
|
||||
#version 310 es
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#extension GL_ARB_shader_draw_parameters : enable
|
||||
#endif
|
||||
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#define SPIRV_Cross_BaseInstance gl_BaseInstanceARB
|
||||
#else
|
||||
uniform int SPIRV_Cross_BaseInstance;
|
||||
#endif
|
||||
|
||||
void main()
|
||||
{
|
||||
|
@ -1,4 +1,7 @@
|
||||
#version 450
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#extension GL_ARB_shader_draw_parameters : enable
|
||||
#endif
|
||||
|
||||
struct V2F
|
||||
{
|
||||
@ -18,7 +21,11 @@ layout(binding = 0, std430) readonly buffer gInstanceData
|
||||
} gInstanceData_1;
|
||||
|
||||
layout(location = 0) in vec3 PosL;
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#define SPIRV_Cross_BaseInstance gl_BaseInstanceARB
|
||||
#else
|
||||
uniform int SPIRV_Cross_BaseInstance;
|
||||
#endif
|
||||
layout(location = 0) out vec4 _entryPointOutput_Color;
|
||||
|
||||
V2F _VS(vec3 PosL_1, uint instanceID)
|
||||
|
@ -1,6 +1,13 @@
|
||||
#version 450
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#extension GL_ARB_shader_draw_parameters : enable
|
||||
#endif
|
||||
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#define SPIRV_Cross_BaseInstance gl_BaseInstanceARB
|
||||
#else
|
||||
uniform int SPIRV_Cross_BaseInstance;
|
||||
#endif
|
||||
|
||||
vec4 _main(uint vid, uint iid)
|
||||
{
|
||||
|
@ -0,0 +1,24 @@
|
||||
#version 450
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#extension GL_ARB_shader_draw_parameters : enable
|
||||
#endif
|
||||
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#define SPIRV_Cross_BaseVertex gl_BaseVertexARB
|
||||
#else
|
||||
uniform int SPIRV_Cross_BaseVertex;
|
||||
#endif
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#define SPIRV_Cross_BaseInstance gl_BaseInstanceARB
|
||||
#else
|
||||
uniform int SPIRV_Cross_BaseInstance;
|
||||
#endif
|
||||
#ifndef GL_ARB_shader_draw_parameters
|
||||
#error GL_ARB_shader_draw_parameters is not supported.
|
||||
#endif
|
||||
|
||||
void main()
|
||||
{
|
||||
gl_Position = vec4(float(SPIRV_Cross_BaseVertex), float(SPIRV_Cross_BaseInstance), float(gl_DrawIDARB), 1.0);
|
||||
}
|
||||
|
@ -0,0 +1,24 @@
|
||||
#version 460
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#extension GL_ARB_shader_draw_parameters : enable
|
||||
#endif
|
||||
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#define SPIRV_Cross_BaseVertex gl_BaseVertexARB
|
||||
#else
|
||||
uniform int SPIRV_Cross_BaseVertex;
|
||||
#endif
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#define SPIRV_Cross_BaseInstance gl_BaseInstanceARB
|
||||
#else
|
||||
uniform int SPIRV_Cross_BaseInstance;
|
||||
#endif
|
||||
#ifndef GL_ARB_shader_draw_parameters
|
||||
#error GL_ARB_shader_draw_parameters is not supported.
|
||||
#endif
|
||||
|
||||
void main()
|
||||
{
|
||||
gl_Position = vec4(float(SPIRV_Cross_BaseVertex), float(SPIRV_Cross_BaseInstance), float(gl_DrawIDARB), 1.0);
|
||||
}
|
||||
|
@ -1,4 +1,7 @@
|
||||
#version 310 es
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#extension GL_ARB_shader_draw_parameters : enable
|
||||
#endif
|
||||
|
||||
struct PatchData
|
||||
{
|
||||
@ -44,7 +47,11 @@ layout(binding = 1) uniform mediump sampler2D TexLOD;
|
||||
layout(binding = 0) uniform mediump sampler2D TexHeightmap;
|
||||
|
||||
layout(location = 1) in vec4 LODWeights;
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#define SPIRV_Cross_BaseInstance gl_BaseInstanceARB
|
||||
#else
|
||||
uniform int SPIRV_Cross_BaseInstance;
|
||||
#endif
|
||||
layout(location = 0) in vec2 Position;
|
||||
layout(location = 1) out vec3 EyeVec;
|
||||
layout(location = 0) out vec2 TexCoord;
|
||||
|
@ -1,4 +1,7 @@
|
||||
#version 310 es
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#extension GL_ARB_shader_draw_parameters : enable
|
||||
#endif
|
||||
|
||||
struct PatchData
|
||||
{
|
||||
@ -45,7 +48,11 @@ layout(binding = 1) uniform mediump sampler2D TexLOD;
|
||||
layout(binding = 0) uniform mediump sampler2D TexDisplacement;
|
||||
|
||||
layout(location = 1) in vec4 LODWeights;
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#define SPIRV_Cross_BaseInstance gl_BaseInstanceARB
|
||||
#else
|
||||
uniform int SPIRV_Cross_BaseInstance;
|
||||
#endif
|
||||
layout(location = 0) in vec4 Position;
|
||||
layout(location = 0) out vec3 EyeVec;
|
||||
layout(location = 1) out vec4 TexCoord;
|
||||
|
@ -1,6 +1,13 @@
|
||||
#version 310 es
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#extension GL_ARB_shader_draw_parameters : enable
|
||||
#endif
|
||||
|
||||
#ifdef GL_ARB_shader_draw_parameters
|
||||
#define SPIRV_Cross_BaseInstance gl_BaseInstanceARB
|
||||
#else
|
||||
uniform int SPIRV_Cross_BaseInstance;
|
||||
#endif
|
||||
|
||||
void main()
|
||||
{
|
||||
|
109
spirv_glsl.cpp
109
spirv_glsl.cpp
@ -731,6 +731,13 @@ void CompilerGLSL::emit_header()
|
||||
statement("#endif");
|
||||
}
|
||||
}
|
||||
else if (!options.vulkan_semantics && ext == "GL_ARB_shader_draw_parameters")
|
||||
{
|
||||
// Soft-enable this extension on plain GLSL.
|
||||
statement("#ifdef ", ext);
|
||||
statement("#extension ", ext, " : enable");
|
||||
statement("#endif");
|
||||
}
|
||||
else
|
||||
statement("#extension ", ext, " : require");
|
||||
}
|
||||
@ -3082,6 +3089,8 @@ void CompilerGLSL::emit_resources()
|
||||
statement("");
|
||||
emitted = false;
|
||||
|
||||
bool emitted_base_instance = false;
|
||||
|
||||
// Output in/out interfaces.
|
||||
ir.for_each_typed_id<SPIRVariable>([&](uint32_t, SPIRVariable &var) {
|
||||
auto &type = this->get<SPIRType>(var.basetype);
|
||||
@ -3104,13 +3113,42 @@ void CompilerGLSL::emit_resources()
|
||||
}
|
||||
else if (is_builtin_variable(var))
|
||||
{
|
||||
auto builtin = BuiltIn(get_decoration(var.self, DecorationBuiltIn));
|
||||
// For gl_InstanceIndex emulation on GLES, the API user needs to
|
||||
// supply this uniform.
|
||||
if (options.vertex.support_nonzero_base_instance &&
|
||||
ir.meta[var.self].decoration.builtin_type == BuiltInInstanceIndex && !options.vulkan_semantics)
|
||||
|
||||
// The draw parameter extension is soft-enabled on GL with some fallbacks.
|
||||
if (!options.vulkan_semantics)
|
||||
{
|
||||
statement("uniform int SPIRV_Cross_BaseInstance;");
|
||||
emitted = true;
|
||||
if (!emitted_base_instance &&
|
||||
((options.vertex.support_nonzero_base_instance && builtin == BuiltInInstanceIndex) ||
|
||||
(builtin == BuiltInBaseInstance)))
|
||||
{
|
||||
statement("#ifdef GL_ARB_shader_draw_parameters");
|
||||
statement("#define SPIRV_Cross_BaseInstance gl_BaseInstanceARB");
|
||||
statement("#else");
|
||||
// A crude, but simple workaround which should be good enough for non-indirect draws.
|
||||
statement("uniform int SPIRV_Cross_BaseInstance;");
|
||||
statement("#endif");
|
||||
emitted = true;
|
||||
emitted_base_instance = true;
|
||||
}
|
||||
else if (builtin == BuiltInBaseVertex)
|
||||
{
|
||||
statement("#ifdef GL_ARB_shader_draw_parameters");
|
||||
statement("#define SPIRV_Cross_BaseVertex gl_BaseVertexARB");
|
||||
statement("#else");
|
||||
// A crude, but simple workaround which should be good enough for non-indirect draws.
|
||||
statement("uniform int SPIRV_Cross_BaseVertex;");
|
||||
statement("#endif");
|
||||
}
|
||||
else if (builtin == BuiltInDrawIndex)
|
||||
{
|
||||
statement("#ifndef GL_ARB_shader_draw_parameters");
|
||||
// Cannot really be worked around.
|
||||
statement("#error GL_ARB_shader_draw_parameters is not supported.");
|
||||
statement("#endif");
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
@ -6829,7 +6867,14 @@ string CompilerGLSL::builtin_to_glsl(BuiltIn builtin, StorageClass storage)
|
||||
if (options.vulkan_semantics)
|
||||
return "gl_InstanceIndex";
|
||||
else if (options.vertex.support_nonzero_base_instance)
|
||||
{
|
||||
if (!options.vulkan_semantics)
|
||||
{
|
||||
// This is a soft-enable. We will opt-in to using gl_BaseInstanceARB if supported.
|
||||
require_extension_internal("GL_ARB_shader_draw_parameters");
|
||||
}
|
||||
return "(gl_InstanceID + SPIRV_Cross_BaseInstance)"; // ... but not gl_InstanceID.
|
||||
}
|
||||
else
|
||||
return "gl_InstanceID";
|
||||
case BuiltInPrimitiveId:
|
||||
@ -6871,33 +6916,69 @@ string CompilerGLSL::builtin_to_glsl(BuiltIn builtin, StorageClass storage)
|
||||
return "gl_LocalInvocationIndex";
|
||||
case BuiltInHelperInvocation:
|
||||
return "gl_HelperInvocation";
|
||||
|
||||
case BuiltInBaseVertex:
|
||||
if (options.es)
|
||||
SPIRV_CROSS_THROW("BaseVertex not supported in ES profile.");
|
||||
if (options.version < 460)
|
||||
|
||||
if (options.vulkan_semantics)
|
||||
{
|
||||
require_extension_internal("GL_ARB_shader_draw_parameters");
|
||||
return "gl_BaseVertexARB";
|
||||
if (options.version < 460)
|
||||
{
|
||||
require_extension_internal("GL_ARB_shader_draw_parameters");
|
||||
return "gl_BaseVertexARB";
|
||||
}
|
||||
return "gl_BaseVertex";
|
||||
}
|
||||
return "gl_BaseVertex";
|
||||
else
|
||||
{
|
||||
// On regular GL, this is soft-enabled and we emit ifdefs in code.
|
||||
require_extension_internal("GL_ARB_shader_draw_parameters");
|
||||
return "SPIRV_Cross_BaseVertex";
|
||||
}
|
||||
break;
|
||||
|
||||
case BuiltInBaseInstance:
|
||||
if (options.es)
|
||||
SPIRV_CROSS_THROW("BaseInstance not supported in ES profile.");
|
||||
if (options.version < 460)
|
||||
|
||||
if (options.vulkan_semantics)
|
||||
{
|
||||
require_extension_internal("GL_ARB_shader_draw_parameters");
|
||||
return "gl_BaseInstanceARB";
|
||||
if (options.version < 460)
|
||||
{
|
||||
require_extension_internal("GL_ARB_shader_draw_parameters");
|
||||
return "gl_BaseInstanceARB";
|
||||
}
|
||||
return "gl_BaseInstance";
|
||||
}
|
||||
return "gl_BaseInstance";
|
||||
else
|
||||
{
|
||||
// On regular GL, this is soft-enabled and we emit ifdefs in code.
|
||||
require_extension_internal("GL_ARB_shader_draw_parameters");
|
||||
return "SPIRV_Cross_BaseInstance";
|
||||
}
|
||||
break;
|
||||
|
||||
case BuiltInDrawIndex:
|
||||
if (options.es)
|
||||
SPIRV_CROSS_THROW("DrawIndex not supported in ES profile.");
|
||||
if (options.version < 460)
|
||||
|
||||
if (options.vulkan_semantics)
|
||||
{
|
||||
if (options.version < 460)
|
||||
{
|
||||
require_extension_internal("GL_ARB_shader_draw_parameters");
|
||||
return "gl_DrawIDARB";
|
||||
}
|
||||
return "gl_DrawID";
|
||||
}
|
||||
else
|
||||
{
|
||||
// On regular GL, this is soft-enabled and we emit ifdefs in code.
|
||||
require_extension_internal("GL_ARB_shader_draw_parameters");
|
||||
return "gl_DrawIDARB";
|
||||
}
|
||||
return "gl_DrawID";
|
||||
break;
|
||||
|
||||
case BuiltInSampleId:
|
||||
if (options.es && options.version < 320)
|
||||
|
Loading…
Reference in New Issue
Block a user