diff options
Diffstat (limited to 'mesalib/src/glsl')
-rw-r--r-- | mesalib/src/glsl/glsl_parser_extras.cpp | 118 | ||||
-rw-r--r-- | mesalib/src/glsl/glsl_parser_extras.h | 3 | ||||
-rw-r--r-- | mesalib/src/glsl/ir.h | 12 | ||||
-rw-r--r-- | mesalib/src/glsl/ir_hierarchical_visitor.h | 2 | ||||
-rw-r--r-- | mesalib/src/glsl/ir_print_visitor.cpp | 3 | ||||
-rw-r--r-- | mesalib/src/glsl/ir_print_visitor.h | 3 | ||||
-rw-r--r-- | mesalib/src/glsl/ir_rvalue_visitor.cpp | 1 | ||||
-rw-r--r-- | mesalib/src/glsl/ir_visitor.h | 2 | ||||
-rw-r--r-- | mesalib/src/glsl/link_varyings.cpp | 15 | ||||
-rw-r--r-- | mesalib/src/glsl/linker.cpp | 4 | ||||
-rw-r--r-- | mesalib/src/glsl/main.cpp | 60 | ||||
-rw-r--r-- | mesalib/src/glsl/opt_array_splitting.cpp | 1 | ||||
-rw-r--r-- | mesalib/src/glsl/opt_noop_swizzle.cpp | 1 | ||||
-rw-r--r-- | mesalib/src/glsl/opt_structure_splitting.cpp | 1 | ||||
-rw-r--r-- | mesalib/src/glsl/program.h | 16 | ||||
-rw-r--r-- | mesalib/src/glsl/test_optpass.cpp | 1 |
16 files changed, 167 insertions, 76 deletions
diff --git a/mesalib/src/glsl/glsl_parser_extras.cpp b/mesalib/src/glsl/glsl_parser_extras.cpp index 98627145a..f4087df30 100644 --- a/mesalib/src/glsl/glsl_parser_extras.cpp +++ b/mesalib/src/glsl/glsl_parser_extras.cpp @@ -28,6 +28,7 @@ extern "C" { #include "main/core.h" /* for struct gl_context */ #include "main/context.h" +#include "main/shaderobj.h" } #include "ralloc.h" @@ -302,6 +303,41 @@ _mesa_glsl_parse_state::process_version_directive(YYLTYPE *locp, int version, } } +extern "C" { + +/** + * The most common use of _mesa_glsl_shader_target_name(), which is + * shared with C code in Mesa core to translate a GLenum to a short + * shader stage name in debug printouts. + * + * It recognizes the PROGRAM variants of the names so it can be used + * with a struct gl_program->Target, not just a struct + * gl_shader->Type. + */ +const char * +_mesa_glsl_shader_target_name(GLenum type) +{ + switch (type) { + case GL_VERTEX_SHADER: + case GL_VERTEX_PROGRAM_ARB: + return "vertex"; + case GL_FRAGMENT_SHADER: + case GL_FRAGMENT_PROGRAM_ARB: + return "fragment"; + case GL_GEOMETRY_SHADER: + return "geometry"; + default: + assert(!"Should not get here."); + return "unknown"; + } +} + +} /* extern "C" */ + +/** + * Overloaded C++ variant usable within the compiler for translating + * our internal enum into short stage names. + */ const char * _mesa_glsl_shader_target_name(enum _mesa_glsl_parser_targets target) { @@ -1202,6 +1238,88 @@ ast_struct_specifier::ast_struct_specifier(const char *identifier, this->declarations.push_degenerate_list_at_head(&declarator_list->link); } +extern "C" { + +void +_mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader, + bool dump_ast, bool dump_hir) +{ + struct _mesa_glsl_parse_state *state = + new(shader) _mesa_glsl_parse_state(ctx, shader->Type, shader); + const char *source = shader->Source; + + state->error = glcpp_preprocess(state, &source, &state->info_log, + &ctx->Extensions, ctx); + + if (!state->error) { + _mesa_glsl_lexer_ctor(state, source); + _mesa_glsl_parse(state); + _mesa_glsl_lexer_dtor(state); + } + + if (dump_ast) { + foreach_list_const(n, &state->translation_unit) { + ast_node *ast = exec_node_data(ast_node, n, link); + ast->print(); + } + printf("\n\n"); + } + + ralloc_free(shader->ir); + shader->ir = new(shader) exec_list; + if (!state->error && !state->translation_unit.is_empty()) + _mesa_ast_to_hir(shader->ir, state); + + if (!state->error) { + validate_ir_tree(shader->ir); + + /* Print out the unoptimized IR. */ + if (dump_hir) { + _mesa_print_ir(shader->ir, state); + } + } + + + if (!state->error && !shader->ir->is_empty()) { + struct gl_shader_compiler_options *options = + &ctx->ShaderCompilerOptions[_mesa_shader_type_to_index(shader->Type)]; + + /* Do some optimization at compile time to reduce shader IR size + * and reduce later work if the same shader is linked multiple times + */ + while (do_common_optimization(shader->ir, false, false, 32, options)) + ; + + validate_ir_tree(shader->ir); + } + + if (shader->InfoLog) + ralloc_free(shader->InfoLog); + + shader->symbols = state->symbols; + shader->CompileStatus = !state->error; + shader->InfoLog = state->info_log; + shader->Version = state->language_version; + shader->InfoLog = state->info_log; + shader->IsES = state->es_shader; + + memcpy(shader->builtins_to_link, state->builtins_to_link, + sizeof(shader->builtins_to_link[0]) * state->num_builtins_to_link); + shader->num_builtins_to_link = state->num_builtins_to_link; + + if (shader->UniformBlocks) + ralloc_free(shader->UniformBlocks); + shader->NumUniformBlocks = state->num_uniform_blocks; + shader->UniformBlocks = state->uniform_blocks; + ralloc_steal(shader, shader->UniformBlocks); + + /* Retain any live IR, but trash the rest. */ + reparent_ir(shader->ir, shader->ir); + + ralloc_free(state); +} + +} /* extern "C" */ /** * Do the set of common optimizations passes * diff --git a/mesalib/src/glsl/glsl_parser_extras.h b/mesalib/src/glsl/glsl_parser_extras.h index 95918de72..7f478df80 100644 --- a/mesalib/src/glsl/glsl_parser_extras.h +++ b/mesalib/src/glsl/glsl_parser_extras.h @@ -371,6 +371,9 @@ _mesa_glsl_shader_target_name(enum _mesa_glsl_parser_targets target); extern "C" { #endif +extern const char * +_mesa_glsl_shader_target_name(GLenum type); + extern int glcpp_preprocess(void *ctx, const char **shader, char **info_log, const struct gl_extensions *extensions, struct gl_context *gl_ctx); diff --git a/mesalib/src/glsl/ir.h b/mesalib/src/glsl/ir.h index 6d4150136..1f0dc0906 100644 --- a/mesalib/src/glsl/ir.h +++ b/mesalib/src/glsl/ir.h @@ -36,6 +36,8 @@ #include "ir_hierarchical_visitor.h" #include "main/mtypes.h" +#ifdef __cplusplus + /** * \defgroup IR Intermediate representation nodes * @@ -2050,4 +2052,14 @@ extern char * prototype_string(const glsl_type *return_type, const char *name, exec_list *parameters); +extern "C" { +#endif /* __cplusplus */ + +extern void _mesa_print_ir(struct exec_list *instructions, + struct _mesa_glsl_parse_state *state); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + #endif /* IR_H */ diff --git a/mesalib/src/glsl/ir_hierarchical_visitor.h b/mesalib/src/glsl/ir_hierarchical_visitor.h index 143eb7c88..1988ad091 100644 --- a/mesalib/src/glsl/ir_hierarchical_visitor.h +++ b/mesalib/src/glsl/ir_hierarchical_visitor.h @@ -36,6 +36,7 @@ enum ir_visitor_status { }; +#ifdef __cplusplus /** * Base class of hierarchical visitors of IR instruction trees * @@ -181,5 +182,6 @@ void visit_tree(ir_instruction *ir, ir_visitor_status visit_list_elements(ir_hierarchical_visitor *v, exec_list *l, bool statement_list = true); +#endif /* __cplusplus */ #endif /* IR_HIERARCHICAL_VISITOR_H */ diff --git a/mesalib/src/glsl/ir_print_visitor.cpp b/mesalib/src/glsl/ir_print_visitor.cpp index f01019c98..ca973a5f3 100644 --- a/mesalib/src/glsl/ir_print_visitor.cpp +++ b/mesalib/src/glsl/ir_print_visitor.cpp @@ -38,6 +38,7 @@ ir_instruction::print(void) const deconsted->accept(&v); } +extern "C" { void _mesa_print_ir(exec_list *instructions, struct _mesa_glsl_parse_state *state) @@ -69,6 +70,8 @@ _mesa_print_ir(exec_list *instructions, printf("\n)"); } +} /* extern "C" */ + ir_print_visitor::ir_print_visitor() { indentation = 0; diff --git a/mesalib/src/glsl/ir_print_visitor.h b/mesalib/src/glsl/ir_print_visitor.h index 6c308f31e..a84056d16 100644 --- a/mesalib/src/glsl/ir_print_visitor.h +++ b/mesalib/src/glsl/ir_print_visitor.h @@ -33,9 +33,6 @@ extern "C" { #include "program/symbol_table.h" } -extern void _mesa_print_ir(exec_list *instructions, - struct _mesa_glsl_parse_state *state); - /** * Abstract base class of visitors of IR instruction trees */ diff --git a/mesalib/src/glsl/ir_rvalue_visitor.cpp b/mesalib/src/glsl/ir_rvalue_visitor.cpp index 3504a4dda..8eb1c62c3 100644 --- a/mesalib/src/glsl/ir_rvalue_visitor.cpp +++ b/mesalib/src/glsl/ir_rvalue_visitor.cpp @@ -32,7 +32,6 @@ #include "ir.h" #include "ir_visitor.h" #include "ir_rvalue_visitor.h" -#include "ir_print_visitor.h" #include "glsl_types.h" ir_visitor_status diff --git a/mesalib/src/glsl/ir_visitor.h b/mesalib/src/glsl/ir_visitor.h index 4a00155be..bd47ef7d5 100644 --- a/mesalib/src/glsl/ir_visitor.h +++ b/mesalib/src/glsl/ir_visitor.h @@ -26,6 +26,7 @@ #ifndef IR_VISITOR_H #define IR_VISITOR_H +#ifdef __cplusplus /** * Abstract base class of visitors of IR instruction trees */ @@ -81,5 +82,6 @@ public: virtual void visit(class ir_constant *) {} virtual void visit(class ir_call *) {} }; +#endif /* __cplusplus */ #endif /* IR_VISITOR_H */ diff --git a/mesalib/src/glsl/link_varyings.cpp b/mesalib/src/glsl/link_varyings.cpp index 34e3440d6..4fdbdc199 100644 --- a/mesalib/src/glsl/link_varyings.cpp +++ b/mesalib/src/glsl/link_varyings.cpp @@ -31,6 +31,7 @@ #include "main/mtypes.h" #include "glsl_symbol_table.h" +#include "glsl_parser_extras.h" #include "ir_optimization.h" #include "linker.h" #include "link_varyings.h" @@ -47,9 +48,10 @@ cross_validate_outputs_to_inputs(struct gl_shader_program *prog, gl_shader *producer, gl_shader *consumer) { glsl_symbol_table parameters; - /* FINISHME: Figure these out dynamically. */ - const char *const producer_stage = "vertex"; - const char *const consumer_stage = "fragment"; + const char *const producer_stage = + _mesa_glsl_shader_target_name(producer->Type); + const char *const consumer_stage = + _mesa_glsl_shader_target_name(consumer->Type); /* Find all shader outputs in the "producer" stage. */ @@ -1135,8 +1137,11 @@ assign_varying_locations(struct gl_context *ctx, * "glsl1-varying read but not written" in piglit. */ - linker_error(prog, "fragment shader varying %s not written " - "by vertex shader\n.", var->name); + linker_error(prog, "%s shader varying %s not written " + "by %s shader\n.", + _mesa_glsl_shader_target_name(consumer->Type), + var->name, + _mesa_glsl_shader_target_name(producer->Type)); } /* An 'in' variable is only really a shader input if its diff --git a/mesalib/src/glsl/linker.cpp b/mesalib/src/glsl/linker.cpp index cd8d680ae..c168e47e0 100644 --- a/mesalib/src/glsl/linker.cpp +++ b/mesalib/src/glsl/linker.cpp @@ -66,6 +66,7 @@ #include "main/core.h" #include "glsl_symbol_table.h" +#include "glsl_parser_extras.h" #include "ir.h" #include "program.h" #include "program/hash_table.h" @@ -1009,8 +1010,7 @@ link_intrastage_shaders(void *mem_ctx, if (main == NULL) { linker_error(prog, "%s shader lacks `main'\n", - (shader_list[0]->Type == GL_VERTEX_SHADER) - ? "vertex" : "fragment"); + _mesa_glsl_shader_target_name(shader_list[0]->Type)); return NULL; } diff --git a/mesalib/src/glsl/main.cpp b/mesalib/src/glsl/main.cpp index d7e35bcb3..60bc62827 100644 --- a/mesalib/src/glsl/main.cpp +++ b/mesalib/src/glsl/main.cpp @@ -34,7 +34,6 @@ #include "ast.h" #include "glsl_parser_extras.h" #include "ir_optimization.h" -#include "ir_print_visitor.h" #include "program.h" #include "loop_analysis.h" #include "standalone_scaffolding.h" @@ -144,70 +143,13 @@ compile_shader(struct gl_context *ctx, struct gl_shader *shader) struct _mesa_glsl_parse_state *state = new(shader) _mesa_glsl_parse_state(ctx, shader->Type, shader); - const char *source = shader->Source; - state->error = glcpp_preprocess(state, &source, &state->info_log, - state->extensions, ctx) != 0; - - if (!state->error) { - _mesa_glsl_lexer_ctor(state, source); - _mesa_glsl_parse(state); - _mesa_glsl_lexer_dtor(state); - } - - if (dump_ast) { - foreach_list_const(n, &state->translation_unit) { - ast_node *ast = exec_node_data(ast_node, n, link); - ast->print(); - } - printf("\n\n"); - } - - shader->ir = new(shader) exec_list; - if (!state->error && !state->translation_unit.is_empty()) - _mesa_ast_to_hir(shader->ir, state); - - /* Print out the unoptimized IR. */ - if (!state->error && dump_hir) { - validate_ir_tree(shader->ir); - _mesa_print_ir(shader->ir, state); - } - - /* Optimization passes */ - if (!state->error && !shader->ir->is_empty()) { - const struct gl_shader_compiler_options *opts = - &ctx->ShaderCompilerOptions[_mesa_shader_type_to_index(shader->Type)]; - bool progress; - do { - progress = do_common_optimization(shader->ir, false, false, 32, opts); - } while (progress); - - validate_ir_tree(shader->ir); - } - + _mesa_glsl_compile_shader(ctx, shader, dump_ast, dump_hir); /* Print out the resulting IR */ if (!state->error && dump_lir) { _mesa_print_ir(shader->ir, state); } - shader->symbols = state->symbols; - shader->CompileStatus = !state->error; - shader->Version = state->language_version; - shader->IsES = state->es_shader; - memcpy(shader->builtins_to_link, state->builtins_to_link, - sizeof(shader->builtins_to_link[0]) * state->num_builtins_to_link); - shader->num_builtins_to_link = state->num_builtins_to_link; - - if (shader->InfoLog) - ralloc_free(shader->InfoLog); - - shader->InfoLog = state->info_log; - - /* Retain any live IR, but trash the rest. */ - reparent_ir(shader->ir, shader); - - ralloc_free(state); - return; } diff --git a/mesalib/src/glsl/opt_array_splitting.cpp b/mesalib/src/glsl/opt_array_splitting.cpp index 67733ca6b..f4a7ef99b 100644 --- a/mesalib/src/glsl/opt_array_splitting.cpp +++ b/mesalib/src/glsl/opt_array_splitting.cpp @@ -36,7 +36,6 @@ #include "ir.h" #include "ir_visitor.h" #include "ir_rvalue_visitor.h" -#include "ir_print_visitor.h" #include "glsl_types.h" static bool debug = false; diff --git a/mesalib/src/glsl/opt_noop_swizzle.cpp b/mesalib/src/glsl/opt_noop_swizzle.cpp index 693719e3d..586ad5e61 100644 --- a/mesalib/src/glsl/opt_noop_swizzle.cpp +++ b/mesalib/src/glsl/opt_noop_swizzle.cpp @@ -32,7 +32,6 @@ #include "ir.h" #include "ir_visitor.h" #include "ir_rvalue_visitor.h" -#include "ir_print_visitor.h" #include "glsl_types.h" namespace { diff --git a/mesalib/src/glsl/opt_structure_splitting.cpp b/mesalib/src/glsl/opt_structure_splitting.cpp index 806c079e5..9f4b3dd8f 100644 --- a/mesalib/src/glsl/opt_structure_splitting.cpp +++ b/mesalib/src/glsl/opt_structure_splitting.cpp @@ -34,7 +34,6 @@ #include "ir.h" #include "ir_visitor.h" -#include "ir_print_visitor.h" #include "ir_rvalue_visitor.h" #include "glsl_types.h" diff --git a/mesalib/src/glsl/program.h b/mesalib/src/glsl/program.h index 6a76d4d54..f15113a08 100644 --- a/mesalib/src/glsl/program.h +++ b/mesalib/src/glsl/program.h @@ -24,15 +24,27 @@ #include "main/core.h" +#ifdef __cplusplus +extern "C" { +#endif + +extern void +_mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader, + bool dump_ast, bool dump_hir); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + extern void link_shaders(struct gl_context *ctx, struct gl_shader_program *prog); extern void -linker_error(gl_shader_program *prog, const char *fmt, ...) +linker_error(struct gl_shader_program *prog, const char *fmt, ...) PRINTFLIKE(2, 3); extern void -linker_warning(gl_shader_program *prog, const char *fmt, ...) +linker_warning(struct gl_shader_program *prog, const char *fmt, ...) PRINTFLIKE(2, 3); extern long diff --git a/mesalib/src/glsl/test_optpass.cpp b/mesalib/src/glsl/test_optpass.cpp index fc10cbbde..67e2ab2b1 100644 --- a/mesalib/src/glsl/test_optpass.cpp +++ b/mesalib/src/glsl/test_optpass.cpp @@ -39,7 +39,6 @@ #include "ast.h" #include "ir_optimization.h" -#include "ir_print_visitor.h" #include "program.h" #include "ir_reader.h" #include "standalone_scaffolding.h" |