/**
+ This code is based on the glslang_c_interface implementation by Viktor Latypov
+**/
+
+/**
BSD 2-Clause License
Copyright (c) 2019, Viktor Latypov
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
**/
-#include "glslang_c_interface.h"
+#include "glslang/Include/glslang_c_interface.h"
#include "SPIRV/GlslangToSpv.h"
#include "SPIRV/Logger.h"
return EShLangCount;
}
-static EShMessages c_shader_messages(glslang_messages_t messages)
+static int c_shader_messages(glslang_messages_t messages)
{
- switch (messages) {
- case SH_MSG_RELAXED_ERRORS:
- return EShMsgRelaxedErrors;
- case SH_MSG_SUPPRESS_WARNINGS:
- return EShMsgSuppressWarnings;
- case SH_MSG_AST:
- return EShMsgAST;
- case SH_MSG_SPV_RULES:
- return EShMsgSpvRules;
- case SH_MSG_VULKAN_RULES:
- return EShMsgVulkanRules;
- case SH_MSG_ONLY_PREPROCESSOR:
- return EShMsgOnlyPreprocessor;
- case SH_MSG_READ_HLSL:
- return EShMsgReadHlsl;
- case SH_MSG_CASCADING_ERRORS:
- return EShMsgCascadingErrors;
- case SH_MSG_KEEP_UNCALLED:
- return EShMsgKeepUncalled;
- case SH_MSG_HLSL_OFFSETS:
- return EShMsgHlslOffsets;
- case SH_MSG_DEBUG_INFO:
- return EShMsgDebugInfo;
- case SH_MSG_HLSL_ENABLE_16BIT_TYPES:
- return EShMsgHlslEnable16BitTypes;
- case SH_MSG_HLSL_LEGALIZATION:
- return EShMsgHlslLegalization;
- case SH_MSG_HLSL_DX9_COMPATIBLE:
- return EShMsgHlslDX9Compatible;
- case SH_MSG_BUILTIN_SYMBOL_TABLE:
- return EShMsgBuiltinSymbolTable;
- default:
- break;
- }
- return EShMsgDefault;
+#define CONVERT_MSG(in, out) \
+ if ((messages & in) == in) \
+ res |= out;
+
+ int res = 0;
+
+ CONVERT_MSG(SH_MSG_RELAXED_ERRORS_BIT, EShMsgRelaxedErrors);
+ CONVERT_MSG(SH_MSG_SUPPRESS_WARNINGS_BIT, EShMsgSuppressWarnings);
+ CONVERT_MSG(SH_MSG_AST_BIT, EShMsgAST);
+ CONVERT_MSG(SH_MSG_SPV_RULES_BIT, EShMsgSpvRules);
+ CONVERT_MSG(SH_MSG_VULKAN_RULES_BIT, EShMsgVulkanRules);
+ CONVERT_MSG(SH_MSG_ONLY_PREPROCESSOR_BIT, EShMsgOnlyPreprocessor);
+ CONVERT_MSG(SH_MSG_READ_HLSL_BIT, EShMsgReadHlsl);
+ CONVERT_MSG(SH_MSG_CASCADING_ERRORS_BIT, EShMsgCascadingErrors);
+ CONVERT_MSG(SH_MSG_KEEP_UNCALLED_BIT, EShMsgKeepUncalled);
+ CONVERT_MSG(SH_MSG_HLSL_OFFSETS_BIT, EShMsgHlslOffsets);
+ CONVERT_MSG(SH_MSG_DEBUG_INFO_BIT, EShMsgDebugInfo);
+ CONVERT_MSG(SH_MSG_HLSL_ENABLE_16BIT_TYPES_BIT, EShMsgHlslEnable16BitTypes);
+ CONVERT_MSG(SH_MSG_HLSL_LEGALIZATION_BIT, EShMsgHlslLegalization);
+ CONVERT_MSG(SH_MSG_HLSL_DX9_COMPATIBLE_BIT, EShMsgHlslDX9Compatible);
+ CONVERT_MSG(SH_MSG_BUILTIN_SYMBOL_TABLE_BIT, EShMsgBuiltinSymbolTable);
+ return res;
+#undef CONVERT_MSG
}
static glslang::EShTargetLanguageVersion
return EProfile();
}
-glslang_shader_t* glslang_shader_create(glslang_input_t* input)
+glslang_shader_t* glslang_shader_create(const glslang_input_t* input)
{
if (!input || !input->code) {
printf("Error creating shader: null input(%p)/input->code\n", input);
const char* glslang_shader_get_preprocessed_code(glslang_shader_t* shader) { return shader->preprocessedGLSL.c_str(); }
-int glslang_shader_preprocess(glslang_shader_t* shader, glslang_input_t* i)
+int glslang_shader_preprocess(glslang_shader_t* shader, const glslang_input_t* i)
{
DirStackFileIncluder Includer;
/* TODO: use custom callbacks if they are available in 'i->callbacks' */
return shader->shader->preprocess(
/* No user-defined resources limit */
&glslang::DefaultTBuiltInResource, i->default_version, c_shader_profile(i->default_profile),
- (bool)i->force_default_version_and_profile, (bool)i->forward_compatible, c_shader_messages(i->messages),
- &shader->preprocessedGLSL, Includer);
+ (bool)i->force_default_version_and_profile, (bool)i->forward_compatible,
+ (EShMessages)c_shader_messages(i->messages), &shader->preprocessedGLSL, Includer);
}
-int glslang_shader_parse(glslang_shader_t* shader, glslang_input_t* input)
+int glslang_shader_parse(glslang_shader_t* shader, const glslang_input_t* input)
{
const char* preprocessedCStr = shader->preprocessedGLSL.c_str();
shader->shader->setStrings(&preprocessedCStr, 1);
return shader->shader->parse(
/* No user-defined resource limits for now */
&glslang::DefaultTBuiltInResource, input->default_version, (bool)input->forward_compatible,
- c_shader_messages(input->messages));
+ (EShMessages)c_shader_messages(input->messages));
}
const char* glslang_shader_get_info_log(glslang_shader_t* shader) { return shader->shader->getInfoLog(); }
/**
+ This code is based on the glslang_c_interface implementation by Viktor Latypov
+**/
+
+/**
BSD 2-Clause License
Copyright (c) 2019, Viktor Latypov
#include <stdlib.h>
-#include "c_shader_types.h"
+#include "glslang_c_shader_types.h"
typedef struct glslang_shader_s glslang_shader_t;
typedef struct glslang_program_s glslang_program_t;
int glslang_initialize_process();
void glslang_finalize_process();
-glslang_shader_t* glslang_shader_create(glslang_input_t* input);
+glslang_shader_t* glslang_shader_create(const glslang_input_t* input);
void glslang_shader_delete(glslang_shader_t* shader);
-int glslang_shader_preprocess(glslang_shader_t* shader, glslang_input_t* input);
-int glslang_shader_parse(glslang_shader_t* shader, glslang_input_t* input);
+int glslang_shader_preprocess(glslang_shader_t* shader, const glslang_input_t* input);
+int glslang_shader_parse(glslang_shader_t* shader, const glslang_input_t* input);
const char* glslang_shader_get_preprocessed_code(glslang_shader_t* shader);
const char* glslang_shader_get_info_log(glslang_shader_t* shader);
const char* glslang_shader_get_info_debug_log(glslang_shader_t* shader);
glslang_program_t* glslang_program_create();
void glslang_program_delete(glslang_program_t* program);
void glslang_program_add_shader(glslang_program_t* program, glslang_shader_t* shader);
-int glslang_program_link(glslang_program_t* program, int messages);
+int glslang_program_link(glslang_program_t* program, int messages); // glslang_messages_t
void glslang_program_SPIRV_generate(glslang_program_t* program, glslang_stage_t stage);
size_t glslang_program_SPIRV_get_size(glslang_program_t* program);
void glslang_program_SPIRV_get(glslang_program_t* program, unsigned int*);
/**
+ This code is based on the glslang_c_interface implementation by Viktor Latypov
+**/
+
+/**
BSD 2-Clause License
Copyright (c) 2019, Viktor Latypov
/* EShMessages counterpart */
typedef enum {
- SH_MSG_DEFAULT = 0,
- SH_MSG_RELAXED_ERRORS = (1 << 0),
- SH_MSG_SUPPRESS_WARNINGS = (1 << 1),
- SH_MSG_AST = (1 << 2),
- SH_MSG_SPV_RULES = (1 << 3),
- SH_MSG_VULKAN_RULES = (1 << 4),
- SH_MSG_ONLY_PREPROCESSOR = (1 << 5),
- SH_MSG_READ_HLSL = (1 << 6),
- SH_MSG_CASCADING_ERRORS = (1 << 7),
- SH_MSG_KEEP_UNCALLED = (1 << 8),
- SH_MSG_HLSL_OFFSETS = (1 << 9),
- SH_MSG_DEBUG_INFO = (1 << 10),
- SH_MSG_HLSL_ENABLE_16BIT_TYPES = (1 << 11),
- SH_MSG_HLSL_LEGALIZATION = (1 << 12),
- SH_MSG_HLSL_DX9_COMPATIBLE = (1 << 13),
- SH_MSG_BUILTIN_SYMBOL_TABLE = (1 << 14),
+ SH_MSG_DEFAULT_BIT = 0,
+ SH_MSG_RELAXED_ERRORS_BIT = (1 << 0),
+ SH_MSG_SUPPRESS_WARNINGS_BIT = (1 << 1),
+ SH_MSG_AST_BIT = (1 << 2),
+ SH_MSG_SPV_RULES_BIT = (1 << 3),
+ SH_MSG_VULKAN_RULES_BIT = (1 << 4),
+ SH_MSG_ONLY_PREPROCESSOR_BIT = (1 << 5),
+ SH_MSG_READ_HLSL_BIT = (1 << 6),
+ SH_MSG_CASCADING_ERRORS_BIT = (1 << 7),
+ SH_MSG_KEEP_UNCALLED_BIT = (1 << 8),
+ SH_MSG_HLSL_OFFSETS_BIT = (1 << 9),
+ SH_MSG_DEBUG_INFO_BIT = (1 << 10),
+ SH_MSG_HLSL_ENABLE_16BIT_TYPES_BIT = (1 << 11),
+ SH_MSG_HLSL_LEGALIZATION_BIT = (1 << 12),
+ SH_MSG_HLSL_DX9_COMPATIBLE_BIT = (1 << 13),
+ SH_MSG_BUILTIN_SYMBOL_TABLE_BIT = (1 << 14),
} glslang_messages_t;
/* EShReflectionOptions counterpart */
typedef enum {
- SH_REFLECTION_DEFAULT = 0,
- SH_REFLECTION_STRICT_ARRAY_SUFFIX = (1 << 0),
- SH_REFLECTION_BASIC_ARRAY_SUFFIX = (1 << 1),
- SH_REFLECTION_INTERMEDIATE_IOO = (1 << 2),
- SH_REFLECTION_SEPARATE_BUFFERS = (1 << 3),
- SH_REFLECTION_ALL_BLOCK_VARIABLES = (1 << 4),
- SH_REFLECTION_UNWRAP_IO_BLOCKS = (1 << 5),
+ SH_REFLECTION_DEFAULT_BIT = 0,
+ SH_REFLECTION_STRICT_ARRAY_SUFFIX_BIT = (1 << 0),
+ SH_REFLECTION_BASIC_ARRAY_SUFFIX_BIT = (1 << 1),
+ SH_REFLECTION_INTERMEDIATE_IOO_BIT = (1 << 2),
+ SH_REFLECTION_SEPARATE_BUFFERS_BIT = (1 << 3),
+ SH_REFLECTION_ALL_BLOCK_VARIABLES_BIT = (1 << 4),
+ SH_REFLECTION_UNWRAP_IO_BLOCKS_BIT = (1 << 5),
} glslang_reflection_options_t;
/* EProfile counterpart (from Versions.h) */