diff --git a/gfx/drivers_shader/glslang.cpp b/gfx/drivers_shader/glslang.cpp
index 3765d86af8..bc22b68439 100644
--- a/gfx/drivers_shader/glslang.cpp
+++ b/gfx/drivers_shader/glslang.cpp
@@ -13,6 +13,8 @@
* If not, see .
*/
+#include
+
#include "glslang.hpp"
#ifdef HAVE_BUILTINGLSLANG
@@ -43,10 +45,13 @@ struct SlangProcess
TBuiltInResource Resources;
};
-// We don't use glslang from multiple threads, but to be sure.
-// Initializing TLS and freeing it for glslang works around a really bizarre issue
-// where the TLS key is suddenly corrupted *somehow*.
+/* We don't use glslang from multiple threads, but to be sure.
+ * Initializing TLS and freeing it for glslang works around
+ * a really bizarre issue where the TLS key is suddenly
+ * corrupted *somehow*.
+ */
static std::mutex glslang_global_lock;
+
struct SlangProcessHolder
{
SlangProcessHolder()
@@ -159,229 +164,244 @@ SlangProcess::SlangProcess()
"generalVariableIndexing 1\n"
"generalConstantMatrixVectorIndexing 1\n";
- const char *delims = " \t\n\r";
- const char *token = strtok(DefaultConfig, delims);
+ const char *delims = " \t\n\r";
+ char *token = strtok(DefaultConfig, delims);
+
while (token)
{
const char *value_str = strtok(0, delims);
int value = (int)strtoul(value_str, nullptr, 0);
- if (strcmp(token, "MaxLights") == 0)
+ if (string_is_equal(token, "MaxLights"))
Resources.maxLights = value;
- else if (strcmp(token, "MaxClipPlanes") == 0)
+ else if (string_is_equal(token, "MaxClipPlanes"))
Resources.maxClipPlanes = value;
- else if (strcmp(token, "MaxTextureUnits") == 0)
+ else if (string_is_equal(token, "MaxTextureUnits"))
Resources.maxTextureUnits = value;
- else if (strcmp(token, "MaxTextureCoords") == 0)
+ else if (string_is_equal(token, "MaxTextureCoords"))
Resources.maxTextureCoords = value;
- else if (strcmp(token, "MaxVertexAttribs") == 0)
+ else if (string_is_equal(token, "MaxVertexAttribs"))
Resources.maxVertexAttribs = value;
- else if (strcmp(token, "MaxVertexUniformComponents") == 0)
+ else if (string_is_equal(token, "MaxVertexUniformComponents"))
Resources.maxVertexUniformComponents = value;
- else if (strcmp(token, "MaxVaryingFloats") == 0)
+ else if (string_is_equal(token, "MaxVaryingFloats"))
Resources.maxVaryingFloats = value;
- else if (strcmp(token, "MaxVertexTextureImageUnits") == 0)
+ else if (string_is_equal(token, "MaxVertexTextureImageUnits"))
Resources.maxVertexTextureImageUnits = value;
- else if (strcmp(token, "MaxCombinedTextureImageUnits") == 0)
+ else if (string_is_equal(token, "MaxCombinedTextureImageUnits"))
Resources.maxCombinedTextureImageUnits = value;
- else if (strcmp(token, "MaxTextureImageUnits") == 0)
+ else if (string_is_equal(token, "MaxTextureImageUnits"))
Resources.maxTextureImageUnits = value;
- else if (strcmp(token, "MaxFragmentUniformComponents") == 0)
+ else if (string_is_equal(token, "MaxFragmentUniformComponents"))
Resources.maxFragmentUniformComponents = value;
- else if (strcmp(token, "MaxDrawBuffers") == 0)
+ else if (string_is_equal(token, "MaxDrawBuffers"))
Resources.maxDrawBuffers = value;
- else if (strcmp(token, "MaxVertexUniformVectors") == 0)
+ else if (string_is_equal(token, "MaxVertexUniformVectors"))
Resources.maxVertexUniformVectors = value;
- else if (strcmp(token, "MaxVaryingVectors") == 0)
+ else if (string_is_equal(token, "MaxVaryingVectors"))
Resources.maxVaryingVectors = value;
- else if (strcmp(token, "MaxFragmentUniformVectors") == 0)
+ else if (string_is_equal(token, "MaxFragmentUniformVectors"))
Resources.maxFragmentUniformVectors = value;
- else if (strcmp(token, "MaxVertexOutputVectors") == 0)
+ else if (string_is_equal(token, "MaxVertexOutputVectors"))
Resources.maxVertexOutputVectors = value;
- else if (strcmp(token, "MaxFragmentInputVectors") == 0)
+ else if (string_is_equal(token, "MaxFragmentInputVectors"))
Resources.maxFragmentInputVectors = value;
- else if (strcmp(token, "MinProgramTexelOffset") == 0)
+ else if (string_is_equal(token, "MinProgramTexelOffset"))
Resources.minProgramTexelOffset = value;
- else if (strcmp(token, "MaxProgramTexelOffset") == 0)
+ else if (string_is_equal(token, "MaxProgramTexelOffset"))
Resources.maxProgramTexelOffset = value;
- else if (strcmp(token, "MaxClipDistances") == 0)
+ else if (string_is_equal(token, "MaxClipDistances"))
Resources.maxClipDistances = value;
- else if (strcmp(token, "MaxComputeWorkGroupCountX") == 0)
+ else if (string_is_equal(token, "MaxComputeWorkGroupCountX"))
Resources.maxComputeWorkGroupCountX = value;
- else if (strcmp(token, "MaxComputeWorkGroupCountY") == 0)
+ else if (string_is_equal(token, "MaxComputeWorkGroupCountY"))
Resources.maxComputeWorkGroupCountY = value;
- else if (strcmp(token, "MaxComputeWorkGroupCountZ") == 0)
+ else if (string_is_equal(token, "MaxComputeWorkGroupCountZ"))
Resources.maxComputeWorkGroupCountZ = value;
- else if (strcmp(token, "MaxComputeWorkGroupSizeX") == 0)
+ else if (string_is_equal(token, "MaxComputeWorkGroupSizeX"))
Resources.maxComputeWorkGroupSizeX = value;
- else if (strcmp(token, "MaxComputeWorkGroupSizeY") == 0)
+ else if (string_is_equal(token, "MaxComputeWorkGroupSizeY"))
Resources.maxComputeWorkGroupSizeY = value;
- else if (strcmp(token, "MaxComputeWorkGroupSizeZ") == 0)
+ else if (string_is_equal(token, "MaxComputeWorkGroupSizeZ"))
Resources.maxComputeWorkGroupSizeZ = value;
- else if (strcmp(token, "MaxComputeUniformComponents") == 0)
+ else if (string_is_equal(token, "MaxComputeUniformComponents"))
Resources.maxComputeUniformComponents = value;
- else if (strcmp(token, "MaxComputeTextureImageUnits") == 0)
+ else if (string_is_equal(token, "MaxComputeTextureImageUnits"))
Resources.maxComputeTextureImageUnits = value;
- else if (strcmp(token, "MaxComputeImageUniforms") == 0)
+ else if (string_is_equal(token, "MaxComputeImageUniforms"))
Resources.maxComputeImageUniforms = value;
- else if (strcmp(token, "MaxComputeAtomicCounters") == 0)
+ else if (string_is_equal(token, "MaxComputeAtomicCounters"))
Resources.maxComputeAtomicCounters = value;
- else if (strcmp(token, "MaxComputeAtomicCounterBuffers") == 0)
+ else if (string_is_equal(token, "MaxComputeAtomicCounterBuffers"))
Resources.maxComputeAtomicCounterBuffers = value;
- else if (strcmp(token, "MaxVaryingComponents") == 0)
+ else if (string_is_equal(token, "MaxVaryingComponents"))
Resources.maxVaryingComponents = value;
- else if (strcmp(token, "MaxVertexOutputComponents") == 0)
+ else if (string_is_equal(token, "MaxVertexOutputComponents"))
Resources.maxVertexOutputComponents = value;
- else if (strcmp(token, "MaxGeometryInputComponents") == 0)
+ else if (string_is_equal(token, "MaxGeometryInputComponents"))
Resources.maxGeometryInputComponents = value;
- else if (strcmp(token, "MaxGeometryOutputComponents") == 0)
+ else if (string_is_equal(token, "MaxGeometryOutputComponents"))
Resources.maxGeometryOutputComponents = value;
- else if (strcmp(token, "MaxFragmentInputComponents") == 0)
+ else if (string_is_equal(token, "MaxFragmentInputComponents"))
Resources.maxFragmentInputComponents = value;
- else if (strcmp(token, "MaxImageUnits") == 0)
+ else if (string_is_equal(token, "MaxImageUnits"))
Resources.maxImageUnits = value;
- else if (strcmp(token, "MaxCombinedImageUnitsAndFragmentOutputs") == 0)
+ else if (string_is_equal(token, "MaxCombinedImageUnitsAndFragmentOutputs"))
Resources.maxCombinedImageUnitsAndFragmentOutputs = value;
- else if (strcmp(token, "MaxCombinedShaderOutputResources") == 0)
+ else if (string_is_equal(token, "MaxCombinedShaderOutputResources"))
Resources.maxCombinedShaderOutputResources = value;
- else if (strcmp(token, "MaxImageSamples") == 0)
+ else if (string_is_equal(token, "MaxImageSamples"))
Resources.maxImageSamples = value;
- else if (strcmp(token, "MaxVertexImageUniforms") == 0)
+ else if (string_is_equal(token, "MaxVertexImageUniforms"))
Resources.maxVertexImageUniforms = value;
- else if (strcmp(token, "MaxTessControlImageUniforms") == 0)
+ else if (string_is_equal(token, "MaxTessControlImageUniforms"))
Resources.maxTessControlImageUniforms = value;
- else if (strcmp(token, "MaxTessEvaluationImageUniforms") == 0)
+ else if (string_is_equal(token, "MaxTessEvaluationImageUniforms"))
Resources.maxTessEvaluationImageUniforms = value;
- else if (strcmp(token, "MaxGeometryImageUniforms") == 0)
+ else if (string_is_equal(token, "MaxGeometryImageUniforms"))
Resources.maxGeometryImageUniforms = value;
- else if (strcmp(token, "MaxFragmentImageUniforms") == 0)
+ else if (string_is_equal(token, "MaxFragmentImageUniforms"))
Resources.maxFragmentImageUniforms = value;
- else if (strcmp(token, "MaxCombinedImageUniforms") == 0)
+ else if (string_is_equal(token, "MaxCombinedImageUniforms"))
Resources.maxCombinedImageUniforms = value;
- else if (strcmp(token, "MaxGeometryTextureImageUnits") == 0)
+ else if (string_is_equal(token, "MaxGeometryTextureImageUnits"))
Resources.maxGeometryTextureImageUnits = value;
- else if (strcmp(token, "MaxGeometryOutputVertices") == 0)
+ else if (string_is_equal(token, "MaxGeometryOutputVertices"))
Resources.maxGeometryOutputVertices = value;
- else if (strcmp(token, "MaxGeometryTotalOutputComponents") == 0)
+ else if (string_is_equal(token, "MaxGeometryTotalOutputComponents"))
Resources.maxGeometryTotalOutputComponents = value;
- else if (strcmp(token, "MaxGeometryUniformComponents") == 0)
+ else if (string_is_equal(token, "MaxGeometryUniformComponents"))
Resources.maxGeometryUniformComponents = value;
- else if (strcmp(token, "MaxGeometryVaryingComponents") == 0)
+ else if (string_is_equal(token, "MaxGeometryVaryingComponents"))
Resources.maxGeometryVaryingComponents = value;
- else if (strcmp(token, "MaxTessControlInputComponents") == 0)
+ else if (string_is_equal(token, "MaxTessControlInputComponents"))
Resources.maxTessControlInputComponents = value;
- else if (strcmp(token, "MaxTessControlOutputComponents") == 0)
+ else if (string_is_equal(token, "MaxTessControlOutputComponents"))
Resources.maxTessControlOutputComponents = value;
- else if (strcmp(token, "MaxTessControlTextureImageUnits") == 0)
+ else if (string_is_equal(token, "MaxTessControlTextureImageUnits"))
Resources.maxTessControlTextureImageUnits = value;
- else if (strcmp(token, "MaxTessControlUniformComponents") == 0)
+ else if (string_is_equal(token, "MaxTessControlUniformComponents"))
Resources.maxTessControlUniformComponents = value;
- else if (strcmp(token, "MaxTessControlTotalOutputComponents") == 0)
+ else if (string_is_equal(token, "MaxTessControlTotalOutputComponents"))
Resources.maxTessControlTotalOutputComponents = value;
- else if (strcmp(token, "MaxTessEvaluationInputComponents") == 0)
+ else if (string_is_equal(token, "MaxTessEvaluationInputComponents"))
Resources.maxTessEvaluationInputComponents = value;
- else if (strcmp(token, "MaxTessEvaluationOutputComponents") == 0)
+ else if (string_is_equal(token, "MaxTessEvaluationOutputComponents"))
Resources.maxTessEvaluationOutputComponents = value;
- else if (strcmp(token, "MaxTessEvaluationTextureImageUnits") == 0)
+ else if (string_is_equal(token, "MaxTessEvaluationTextureImageUnits"))
Resources.maxTessEvaluationTextureImageUnits = value;
- else if (strcmp(token, "MaxTessEvaluationUniformComponents") == 0)
+ else if (string_is_equal(token, "MaxTessEvaluationUniformComponents"))
Resources.maxTessEvaluationUniformComponents = value;
- else if (strcmp(token, "MaxTessPatchComponents") == 0)
+ else if (string_is_equal(token, "MaxTessPatchComponents"))
Resources.maxTessPatchComponents = value;
- else if (strcmp(token, "MaxPatchVertices") == 0)
+ else if (string_is_equal(token, "MaxPatchVertices"))
Resources.maxPatchVertices = value;
- else if (strcmp(token, "MaxTessGenLevel") == 0)
+ else if (string_is_equal(token, "MaxTessGenLevel"))
Resources.maxTessGenLevel = value;
- else if (strcmp(token, "MaxViewports") == 0)
+ else if (string_is_equal(token, "MaxViewports"))
Resources.maxViewports = value;
- else if (strcmp(token, "MaxVertexAtomicCounters") == 0)
+ else if (string_is_equal(token, "MaxVertexAtomicCounters"))
Resources.maxVertexAtomicCounters = value;
- else if (strcmp(token, "MaxTessControlAtomicCounters") == 0)
+ else if (string_is_equal(token, "MaxTessControlAtomicCounters"))
Resources.maxTessControlAtomicCounters = value;
- else if (strcmp(token, "MaxTessEvaluationAtomicCounters") == 0)
+ else if (string_is_equal(token, "MaxTessEvaluationAtomicCounters"))
Resources.maxTessEvaluationAtomicCounters = value;
- else if (strcmp(token, "MaxGeometryAtomicCounters") == 0)
+ else if (string_is_equal(token, "MaxGeometryAtomicCounters"))
Resources.maxGeometryAtomicCounters = value;
- else if (strcmp(token, "MaxFragmentAtomicCounters") == 0)
+ else if (string_is_equal(token, "MaxFragmentAtomicCounters"))
Resources.maxFragmentAtomicCounters = value;
- else if (strcmp(token, "MaxCombinedAtomicCounters") == 0)
+ else if (string_is_equal(token, "MaxCombinedAtomicCounters"))
Resources.maxCombinedAtomicCounters = value;
- else if (strcmp(token, "MaxAtomicCounterBindings") == 0)
+ else if (string_is_equal(token, "MaxAtomicCounterBindings"))
Resources.maxAtomicCounterBindings = value;
- else if (strcmp(token, "MaxVertexAtomicCounterBuffers") == 0)
+ else if (string_is_equal(token, "MaxVertexAtomicCounterBuffers"))
Resources.maxVertexAtomicCounterBuffers = value;
- else if (strcmp(token, "MaxTessControlAtomicCounterBuffers") == 0)
+ else if (string_is_equal(token, "MaxTessControlAtomicCounterBuffers"))
Resources.maxTessControlAtomicCounterBuffers = value;
- else if (strcmp(token, "MaxTessEvaluationAtomicCounterBuffers") == 0)
+ else if (string_is_equal(token, "MaxTessEvaluationAtomicCounterBuffers"))
Resources.maxTessEvaluationAtomicCounterBuffers = value;
- else if (strcmp(token, "MaxGeometryAtomicCounterBuffers") == 0)
+ else if (string_is_equal(token, "MaxGeometryAtomicCounterBuffers"))
Resources.maxGeometryAtomicCounterBuffers = value;
- else if (strcmp(token, "MaxFragmentAtomicCounterBuffers") == 0)
+ else if (string_is_equal(token, "MaxFragmentAtomicCounterBuffers"))
Resources.maxFragmentAtomicCounterBuffers = value;
- else if (strcmp(token, "MaxCombinedAtomicCounterBuffers") == 0)
+ else if (string_is_equal(token, "MaxCombinedAtomicCounterBuffers"))
Resources.maxCombinedAtomicCounterBuffers = value;
- else if (strcmp(token, "MaxAtomicCounterBufferSize") == 0)
+ else if (string_is_equal(token, "MaxAtomicCounterBufferSize"))
Resources.maxAtomicCounterBufferSize = value;
- else if (strcmp(token, "MaxTransformFeedbackBuffers") == 0)
+ else if (string_is_equal(token, "MaxTransformFeedbackBuffers"))
Resources.maxTransformFeedbackBuffers = value;
- else if (strcmp(token, "MaxTransformFeedbackInterleavedComponents") == 0)
+ else if (string_is_equal(token, "MaxTransformFeedbackInterleavedComponents"))
Resources.maxTransformFeedbackInterleavedComponents = value;
- else if (strcmp(token, "MaxCullDistances") == 0)
+ else if (string_is_equal(token, "MaxCullDistances"))
Resources.maxCullDistances = value;
- else if (strcmp(token, "MaxCombinedClipAndCullDistances") == 0)
+ else if (string_is_equal(token, "MaxCombinedClipAndCullDistances"))
Resources.maxCombinedClipAndCullDistances = value;
- else if (strcmp(token, "MaxSamples") == 0)
+ else if (string_is_equal(token, "MaxSamples"))
Resources.maxSamples = value;
- else if (strcmp(token, "nonInductiveForLoops") == 0)
+ else if (string_is_equal(token, "nonInductiveForLoops"))
Resources.limits.nonInductiveForLoops = (value != 0);
- else if (strcmp(token, "whileLoops") == 0)
+ else if (string_is_equal(token, "whileLoops"))
Resources.limits.whileLoops = (value != 0);
- else if (strcmp(token, "doWhileLoops") == 0)
+ else if (string_is_equal(token, "doWhileLoops"))
Resources.limits.doWhileLoops = (value != 0);
- else if (strcmp(token, "generalUniformIndexing") == 0)
+ else if (string_is_equal(token, "generalUniformIndexing"))
Resources.limits.generalUniformIndexing = (value != 0);
- else if (strcmp(token, "generalAttributeMatrixVectorIndexing") == 0)
+ else if (string_is_equal(token, "generalAttributeMatrixVectorIndexing"))
Resources.limits.generalAttributeMatrixVectorIndexing = (value != 0);
- else if (strcmp(token, "generalVaryingIndexing") == 0)
+ else if (string_is_equal(token, "generalVaryingIndexing"))
Resources.limits.generalVaryingIndexing = (value != 0);
- else if (strcmp(token, "generalSamplerIndexing") == 0)
+ else if (string_is_equal(token, "generalSamplerIndexing"))
Resources.limits.generalSamplerIndexing = (value != 0);
- else if (strcmp(token, "generalVariableIndexing") == 0)
+ else if (string_is_equal(token, "generalVariableIndexing"))
Resources.limits.generalVariableIndexing = (value != 0);
- else if (strcmp(token, "generalConstantMatrixVectorIndexing") == 0)
+ else if (string_is_equal(token, "generalConstantMatrixVectorIndexing"))
Resources.limits.generalConstantMatrixVectorIndexing = (value != 0);
token = strtok(0, delims);
}
}
-bool glslang::compile_spirv(const string &source, Stage stage, std::vector *spirv)
+bool glslang::compile_spirv(const char *src, Stage stage,
+ std::vector *spirv)
{
+ string msg;
static SlangProcess process;
SlangProcessHolder process_holder;
-
TProgram program;
EShLanguage language;
+
switch (stage)
{
- case StageVertex: language = EShLangVertex; break;
- case StageTessControl: language = EShLangTessControl; break;
- case StageTessEvaluation: language = EShLangTessEvaluation; break;
- case StageGeometry: language = EShLangGeometry; break;
- case StageFragment: language = EShLangFragment; break;
- case StageCompute: language = EShLangCompute; break;
- default: return false;
+ case StageVertex:
+ language = EShLangVertex;
+ break;
+ case StageTessControl:
+ language = EShLangTessControl;
+ break;
+ case StageTessEvaluation:
+ language = EShLangTessEvaluation;
+ break;
+ case StageGeometry:
+ language = EShLangGeometry;
+ break;
+ case StageFragment:
+ language = EShLangFragment;
+ break;
+ case StageCompute:
+ language = EShLangCompute;
+ break;
+ default:
+ return false;
}
TShader shader(language);
- const char *src = source.c_str();
shader.setStrings(&src, 1);
EShMessages messages = static_cast(EShMsgDefault | EShMsgVulkanRules | EShMsgSpvRules);
- string msg;
auto forbid_include = glslang::TShader::ForbidIncluder();
- if (!shader.preprocess(&process.GetResources(), 100, ENoProfile, false, false,
+ if (!shader.preprocess(&process.GetResources(),
+ 100, ENoProfile, false, false,
messages, &msg, forbid_include))
{
fprintf(stderr, "%s\n", msg.c_str());
@@ -407,4 +427,3 @@ bool glslang::compile_spirv(const string &source, Stage stage, std::vector *spirv);
+ bool compile_spirv(const char *src, Stage stage, std::vector *spirv);
}
#endif
diff --git a/gfx/drivers_shader/glslang_util_cxx.cpp b/gfx/drivers_shader/glslang_util_cxx.cpp
index a54b16dbd6..890189b294 100644
--- a/gfx/drivers_shader/glslang_util_cxx.cpp
+++ b/gfx/drivers_shader/glslang_util_cxx.cpp
@@ -210,6 +210,7 @@ bool glslang_parse_meta(const struct string_list *lines, glslang_meta *meta)
bool glslang_compile_shader(const char *shader_path, glslang_output *output)
{
#if defined(HAVE_GLSLANG)
+ const char *v_src, *f_src;
struct string_list *lines = string_list_new();
if (!lines)
@@ -223,14 +224,17 @@ bool glslang_compile_shader(const char *shader_path, glslang_output *output)
if (!glslang_parse_meta(lines, &output->meta))
goto error;
- if ( !glslang::compile_spirv(build_stage_source(lines, "vertex"),
+ v_src = build_stage_source(lines, "vertex").c_str();
+ f_src = build_stage_source(lines, "fragment").c_str();
+
+ if (!glslang::compile_spirv(v_src,
glslang::StageVertex, &output->vertex))
{
RARCH_ERR("Failed to compile vertex shader stage.\n");
goto error;
}
- if ( !glslang::compile_spirv(build_stage_source(lines, "fragment"),
+ if (!glslang::compile_spirv(f_src,
glslang::StageFragment, &output->fragment))
{
RARCH_ERR("Failed to compile fragment shader stage.\n");