Cleanups - change function signature of compile_spirv to const char *

This commit is contained in:
twinaphex 2020-03-03 10:49:47 +01:00
parent 67d00f4772
commit d1ebb58580
3 changed files with 136 additions and 113 deletions

View File

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

View File

@ -17,7 +17,7 @@ namespace glslang
StageCompute StageCompute
}; };
bool compile_spirv(const std::string &source, Stage stage, std::vector<uint32_t> *spirv); bool compile_spirv(const char *src, Stage stage, std::vector<uint32_t> *spirv);
} }
#endif #endif

View File

@ -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) bool glslang_compile_shader(const char *shader_path, glslang_output *output)
{ {
#if defined(HAVE_GLSLANG) #if defined(HAVE_GLSLANG)
const char *v_src, *f_src;
struct string_list *lines = string_list_new(); struct string_list *lines = string_list_new();
if (!lines) if (!lines)
@ -223,14 +224,17 @@ bool glslang_compile_shader(const char *shader_path, glslang_output *output)
if (!glslang_parse_meta(lines, &output->meta)) if (!glslang_parse_meta(lines, &output->meta))
goto error; 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)) glslang::StageVertex, &output->vertex))
{ {
RARCH_ERR("Failed to compile vertex shader stage.\n"); RARCH_ERR("Failed to compile vertex shader stage.\n");
goto error; goto error;
} }
if ( !glslang::compile_spirv(build_stage_source(lines, "fragment"), if (!glslang::compile_spirv(f_src,
glslang::StageFragment, &output->fragment)) glslang::StageFragment, &output->fragment))
{ {
RARCH_ERR("Failed to compile fragment shader stage.\n"); RARCH_ERR("Failed to compile fragment shader stage.\n");