mirror of
https://github.com/bkaradzic/bgfx.git
synced 2026-02-17 20:52:36 +01:00
shaderc: Added gl_ViewportIndex and gl_Layer.
This commit is contained in:
@@ -19,7 +19,7 @@ extern "C"
|
||||
#define BGFX_CHUNK_MAGIC_VSH BX_MAKEFOURCC('V', 'S', 'H', BGFX_SHADER_BIN_VERSION)
|
||||
|
||||
#define BGFX_SHADERC_VERSION_MAJOR 1
|
||||
#define BGFX_SHADERC_VERSION_MINOR 17
|
||||
#define BGFX_SHADERC_VERSION_MINOR 18
|
||||
|
||||
namespace bgfx
|
||||
{
|
||||
@@ -90,6 +90,16 @@ namespace bgfx
|
||||
NULL
|
||||
};
|
||||
|
||||
// To be use from vertex program require:
|
||||
// https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_shader_viewport_layer_array.txt
|
||||
// DX11 11_1 feature level
|
||||
static const char* s_ARB_shader_viewport_layer_array[] =
|
||||
{
|
||||
"gl_ViewportIndex",
|
||||
"gl_Layer",
|
||||
NULL
|
||||
};
|
||||
|
||||
static const char* s_ARB_gpu_shader5[] =
|
||||
{
|
||||
"bitfieldReverse",
|
||||
@@ -896,18 +906,18 @@ namespace bgfx
|
||||
" orbis\n"
|
||||
" osx\n"
|
||||
" windows\n"
|
||||
" -p, --profile <profile> Shader model (default GLSL).\n"
|
||||
" s_3\n"
|
||||
" s_4\n"
|
||||
" s_4_0_level\n"
|
||||
" s_5\n"
|
||||
" metal\n"
|
||||
" pssl\n"
|
||||
" spirv Alias for spirv10-10. \n"
|
||||
" spirv10-10\n"
|
||||
" spirv13-11\n"
|
||||
" spirv14-11\n"
|
||||
" spirv15-12\n"
|
||||
" -p, --profile <profile> Shader model (default GLSL).\n"
|
||||
" s_3\n"
|
||||
" s_4\n"
|
||||
" s_4_0_level\n"
|
||||
" s_5\n"
|
||||
" metal\n"
|
||||
" pssl\n"
|
||||
" spirv Alias for spirv10-10.\n"
|
||||
" spirv10-10\n"
|
||||
" spirv13-11\n"
|
||||
" spirv14-11\n"
|
||||
" spirv15-12\n"
|
||||
" --preprocess Preprocess only.\n"
|
||||
" --define <defines> Add defines to preprocessor (semicolon separated).\n"
|
||||
" --raw Do not process shader. No preprocessor, and no glsl-optimizer (GLSL only).\n"
|
||||
@@ -1822,8 +1832,10 @@ namespace bgfx
|
||||
}
|
||||
else if ('v' == _options.shaderType)
|
||||
{
|
||||
const bool hasVertexId = !bx::strFind(input, "gl_VertexID").isEmpty();
|
||||
const bool hasInstanceId = !bx::strFind(input, "gl_InstanceID").isEmpty();
|
||||
const bool hasVertexId = !bx::strFind(input, "gl_VertexID").isEmpty();
|
||||
const bool hasInstanceId = !bx::strFind(input, "gl_InstanceID").isEmpty();
|
||||
const bool hasViewportId = !bx::strFind(input, "gl_ViewportIndex").isEmpty();
|
||||
const bool hasLayerId = !bx::strFind(input, "gl_Layer").isEmpty();
|
||||
|
||||
bx::StringView brace = bx::strFind(bx::StringView(entry.getPtr(), shader.getTerm() ), "{");
|
||||
if (!brace.isEmpty() )
|
||||
@@ -1841,6 +1853,7 @@ namespace bgfx
|
||||
"\tvec4 gl_Position : SV_POSITION;\n"
|
||||
"#define gl_Position _varying_.gl_Position\n"
|
||||
);
|
||||
|
||||
for (InOut::const_iterator it = shaderOutputs.begin(), itEnd = shaderOutputs.end(); it != itEnd; ++it)
|
||||
{
|
||||
VaryingMap::const_iterator varyingIt = varyingMap.find(*it);
|
||||
@@ -1861,6 +1874,39 @@ namespace bgfx
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (hasViewportId)
|
||||
{
|
||||
if (d3d > 9)
|
||||
{
|
||||
preprocessor.writef(
|
||||
"\tuint gl_ViewportIndex : SV_ViewportArrayIndex;\n"
|
||||
"#define gl_ViewportIndex _varying_.gl_ViewportIndex\n"
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
bx::printf("gl_ViewportIndex builtin is not supported by this D3D9 HLSL.\n");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (hasLayerId)
|
||||
{
|
||||
if (d3d > 9)
|
||||
{
|
||||
preprocessor.writef(
|
||||
"\tuint gl_Layer : SV_RenderTargetArrayIndex;\n"
|
||||
"#define gl_Layer _varying_.gl_Layer\n"
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
bx::printf("gl_Layer builtin is not supported by this D3D9 HLSL.\n");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
preprocessor.writef(
|
||||
"};\n"
|
||||
);
|
||||
@@ -2023,12 +2069,13 @@ namespace bgfx
|
||||
&& !bx::findIdentifierMatch(input, s_ARB_gpu_shader5).isEmpty()
|
||||
;
|
||||
|
||||
const bool usesInstanceID = !bx::findIdentifierMatch(input, "gl_InstanceID").isEmpty();
|
||||
const bool usesGpuShader4 = !bx::findIdentifierMatch(input, s_EXT_gpu_shader4).isEmpty();
|
||||
const bool usesTexelFetch = !bx::findIdentifierMatch(input, s_texelFetch).isEmpty();
|
||||
const bool usesTextureMS = !bx::findIdentifierMatch(input, s_ARB_texture_multisample).isEmpty();
|
||||
const bool usesTextureArray = !bx::findIdentifierMatch(input, s_textureArray).isEmpty();
|
||||
const bool usesPacking = !bx::findIdentifierMatch(input, s_ARB_shading_language_packing).isEmpty();
|
||||
const bool usesInstanceID = !bx::findIdentifierMatch(input, "gl_InstanceID").isEmpty();
|
||||
const bool usesGpuShader4 = !bx::findIdentifierMatch(input, s_EXT_gpu_shader4).isEmpty();
|
||||
const bool usesTexelFetch = !bx::findIdentifierMatch(input, s_texelFetch).isEmpty();
|
||||
const bool usesTextureMS = !bx::findIdentifierMatch(input, s_ARB_texture_multisample).isEmpty();
|
||||
const bool usesTextureArray = !bx::findIdentifierMatch(input, s_textureArray).isEmpty();
|
||||
const bool usesPacking = !bx::findIdentifierMatch(input, s_ARB_shading_language_packing).isEmpty();
|
||||
const bool usesViewportLayerArray = !bx::findIdentifierMatch(input, s_ARB_shader_viewport_layer_array).isEmpty();
|
||||
|
||||
if (0 == essl)
|
||||
{
|
||||
@@ -2055,6 +2102,13 @@ namespace bgfx
|
||||
);
|
||||
}
|
||||
|
||||
if (usesViewportLayerArray)
|
||||
{
|
||||
bx::stringPrintf(code
|
||||
, "#extension GL_ARB_shader_viewport_layer_array : enable\n"
|
||||
);
|
||||
}
|
||||
|
||||
if (usesGpuShader4)
|
||||
{
|
||||
bx::stringPrintf(code
|
||||
|
||||
Reference in New Issue
Block a user