X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fdri%2Fi965%2Fbrw_link.cpp;h=4800be07e8021dfbca61009c2e47f7b13afdf218;hb=cea360a7087f9533ce596f052070195254a28c9e;hp=f48c6fe12a124ef88f04af085caa5a7f09213b39;hpb=741744f691d6ef63e9f9a4c03136f969f2ffb0bf;p=mesa.git diff --git a/src/mesa/drivers/dri/i965/brw_link.cpp b/src/mesa/drivers/dri/i965/brw_link.cpp index f48c6fe12a1..4800be07e80 100644 --- a/src/mesa/drivers/dri/i965/brw_link.cpp +++ b/src/mesa/drivers/dri/i965/brw_link.cpp @@ -26,9 +26,12 @@ #include "brw_fs.h" #include "brw_nir.h" #include "brw_program.h" +#include "compiler/glsl/ir.h" #include "compiler/glsl/ir_optimization.h" +#include "compiler/glsl/program.h" #include "program/program.h" #include "main/shaderapi.h" +#include "main/shaderobj.h" #include "main/uniforms.h" /** @@ -40,12 +43,12 @@ static bool brw_shader_precompile(struct gl_context *ctx, struct gl_shader_program *sh_prog) { - struct gl_shader *vs = sh_prog->_LinkedShaders[MESA_SHADER_VERTEX]; - struct gl_shader *tcs = sh_prog->_LinkedShaders[MESA_SHADER_TESS_CTRL]; - struct gl_shader *tes = sh_prog->_LinkedShaders[MESA_SHADER_TESS_EVAL]; - struct gl_shader *gs = sh_prog->_LinkedShaders[MESA_SHADER_GEOMETRY]; - struct gl_shader *fs = sh_prog->_LinkedShaders[MESA_SHADER_FRAGMENT]; - struct gl_shader *cs = sh_prog->_LinkedShaders[MESA_SHADER_COMPUTE]; + struct gl_linked_shader *vs = sh_prog->_LinkedShaders[MESA_SHADER_VERTEX]; + struct gl_linked_shader *tcs = sh_prog->_LinkedShaders[MESA_SHADER_TESS_CTRL]; + struct gl_linked_shader *tes = sh_prog->_LinkedShaders[MESA_SHADER_TESS_EVAL]; + struct gl_linked_shader *gs = sh_prog->_LinkedShaders[MESA_SHADER_GEOMETRY]; + struct gl_linked_shader *fs = sh_prog->_LinkedShaders[MESA_SHADER_FRAGMENT]; + struct gl_linked_shader *cs = sh_prog->_LinkedShaders[MESA_SHADER_COMPUTE]; if (fs && !brw_fs_precompile(ctx, sh_prog, fs->Program)) return false; @@ -86,7 +89,7 @@ static void process_glsl_ir(gl_shader_stage stage, struct brw_context *brw, struct gl_shader_program *shader_prog, - struct gl_shader *shader) + struct gl_linked_shader *shader) { struct gl_context *ctx = &brw->ctx; const struct brw_compiler *compiler = brw->intelScreen->compiler; @@ -98,20 +101,27 @@ process_glsl_ir(gl_shader_stage stage, ralloc_adopt(mem_ctx, shader->ir); + lower_blend_equation_advanced(shader); + /* lower_packing_builtins() inserts arithmetic instructions, so it * must precede lower_instructions(). */ brw_lower_packing_builtins(brw, shader->Stage, shader->ir); do_mat_op_to_vec(shader->ir); - lower_instructions(shader->ir, - MOD_TO_FLOOR | - DIV_TO_MUL_RCP | - SUB_TO_ADD_NEG | - EXP_TO_EXP2 | - LOG_TO_LOG2 | - LDEXP_TO_ARITH | - CARRY_TO_ARITH | - BORROW_TO_ARITH); + + unsigned instructions_to_lower = (DIV_TO_MUL_RCP | + SUB_TO_ADD_NEG | + EXP_TO_EXP2 | + LOG_TO_LOG2 | + DFREXP_DLDEXP_TO_ARITH); + if (brw->gen < 7) { + instructions_to_lower |= BIT_COUNT_TO_MATH | + EXTRACT_TO_SHIFTS | + INSERT_TO_SHIFTS | + REVERSE_TO_SHIFTS; + } + + lower_instructions(shader->ir, instructions_to_lower); /* Pre-gen6 HW can only nest if-statements 16 deep. Beyond this, * if-statements need to be flattened. @@ -124,10 +134,11 @@ process_glsl_ir(gl_shader_stage stage, do_vec_index_to_cond_assign(shader->ir); lower_vector_insert(shader->ir, true); lower_offset_arrays(shader->ir); - brw_do_lower_unnormalized_offset(shader->ir); lower_noise(shader->ir); lower_quadop_vector(shader->ir, false); + do_copy_propagation(shader->ir); + bool lowered_variable_indexing = lower_variable_index_to_cond_assign((gl_shader_stage)stage, shader->ir, @@ -147,7 +158,9 @@ process_glsl_ir(gl_shader_stage stage, progress = false; if (compiler->scalar_stage[shader->Stage]) { - brw_do_channel_expressions(shader->ir); + if (shader->Stage == MESA_SHADER_VERTEX || + shader->Stage == MESA_SHADER_FRAGMENT) + brw_do_channel_expressions(shader->ir); brw_do_vector_splitting(shader->ir); } @@ -180,6 +193,19 @@ process_glsl_ir(gl_shader_stage stage, } } +extern "C" struct gl_linked_shader * +brw_new_shader(gl_shader_stage stage) +{ + struct brw_shader *shader; + + shader = rzalloc(NULL, struct brw_shader); + if (shader) { + shader->base.Stage = stage; + } + + return &shader->base; +} + extern "C" GLboolean brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg) { @@ -188,15 +214,15 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg) unsigned int stage; for (stage = 0; stage < ARRAY_SIZE(shProg->_LinkedShaders); stage++) { - struct gl_shader *shader = shProg->_LinkedShaders[stage]; + struct gl_linked_shader *shader = shProg->_LinkedShaders[stage]; if (!shader) - continue; + continue; struct gl_program *prog = - ctx->Driver.NewProgram(ctx, _mesa_shader_stage_to_program(stage), - shader->Name); + ctx->Driver.NewProgram(ctx, _mesa_shader_stage_to_program(stage), + 0); if (!prog) - return false; + return false; prog->Parameters = _mesa_new_parameter_list(); _mesa_copy_linked_program_data((gl_shader_stage) stage, shProg, prog); @@ -211,19 +237,19 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg) * get sent to the shader. */ foreach_in_list(ir_instruction, node, shader->ir) { - ir_variable *var = node->as_variable(); + ir_variable *var = node->as_variable(); - if ((var == NULL) || (var->data.mode != ir_var_uniform) - || (strncmp(var->name, "gl_", 3) != 0)) - continue; + if ((var == NULL) || (var->data.mode != ir_var_uniform) + || (strncmp(var->name, "gl_", 3) != 0)) + continue; - const ir_state_slot *const slots = var->get_state_slots(); - assert(slots != NULL); + const ir_state_slot *const slots = var->get_state_slots(); + assert(slots != NULL); - for (unsigned int i = 0; i < var->get_num_state_slots(); i++) { - _mesa_add_state_reference(prog->Parameters, - (gl_state_index *) slots[i].tokens); - } + for (unsigned int i = 0; i < var->get_num_state_slots(); i++) { + _mesa_add_state_reference(prog->Parameters, + (gl_state_index *) slots[i].tokens); + } } do_set_program_inouts(shader->ir, prog, shader->Stage); @@ -259,5 +285,6 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg) if (brw->precompile && !brw_shader_precompile(ctx, shProg)) return false; + build_program_resource_list(ctx, shProg); return true; }