st/glsl_to_tgsi: fix whitespace

everytime I open this file in emacs with show trailing whitespace
or git add from it my screen flares with red.

Just do a general cleanup, makes working on fp64 support not as
jarring.

I'm not saying this is perfect, its just better than before.

Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
Dave Airlie 2015-02-17 10:05:45 +10:00
parent b53fbec01d
commit 59292b38eb
1 changed files with 178 additions and 202 deletions

View File

@ -394,14 +394,14 @@ public:
glsl_to_tgsi_instruction *emit(ir_instruction *ir, unsigned op); glsl_to_tgsi_instruction *emit(ir_instruction *ir, unsigned op);
glsl_to_tgsi_instruction *emit(ir_instruction *ir, unsigned op, glsl_to_tgsi_instruction *emit(ir_instruction *ir, unsigned op,
st_dst_reg dst, st_src_reg src0); st_dst_reg dst, st_src_reg src0);
glsl_to_tgsi_instruction *emit(ir_instruction *ir, unsigned op, glsl_to_tgsi_instruction *emit(ir_instruction *ir, unsigned op,
st_dst_reg dst, st_src_reg src0, st_src_reg src1); st_dst_reg dst, st_src_reg src0, st_src_reg src1);
glsl_to_tgsi_instruction *emit(ir_instruction *ir, unsigned op, glsl_to_tgsi_instruction *emit(ir_instruction *ir, unsigned op,
st_dst_reg dst, st_dst_reg dst,
st_src_reg src0, st_src_reg src1, st_src_reg src2); st_src_reg src0, st_src_reg src1, st_src_reg src2);
glsl_to_tgsi_instruction *emit(ir_instruction *ir, unsigned op, glsl_to_tgsi_instruction *emit(ir_instruction *ir, unsigned op,
st_dst_reg dst, st_dst_reg dst,
@ -422,15 +422,15 @@ public:
unsigned elements); unsigned elements);
void emit_scalar(ir_instruction *ir, unsigned op, void emit_scalar(ir_instruction *ir, unsigned op,
st_dst_reg dst, st_src_reg src0); st_dst_reg dst, st_src_reg src0);
void emit_scalar(ir_instruction *ir, unsigned op, void emit_scalar(ir_instruction *ir, unsigned op,
st_dst_reg dst, st_src_reg src0, st_src_reg src1); st_dst_reg dst, st_src_reg src0, st_src_reg src1);
void emit_arl(ir_instruction *ir, st_dst_reg dst, st_src_reg src0); void emit_arl(ir_instruction *ir, st_dst_reg dst, st_src_reg src0);
void emit_scs(ir_instruction *ir, unsigned op, void emit_scs(ir_instruction *ir, unsigned op,
st_dst_reg dst, const st_src_reg &src); st_dst_reg dst, const st_src_reg &src);
bool try_emit_mad(ir_expression *ir, bool try_emit_mad(ir_expression *ir,
int mul_operand); int mul_operand);
@ -577,7 +577,7 @@ glsl_to_tgsi_visitor::emit(ir_instruction *ir, unsigned op,
} }
} }
else { else {
for (i=0; i<4; i++) { for (i = 0; i < 4; i++) {
if(inst->src[i].reladdr) { if(inst->src[i].reladdr) {
switch(inst->src[i].file) { switch(inst->src[i].file) {
case PROGRAM_STATE_VAR: case PROGRAM_STATE_VAR:
@ -610,14 +610,14 @@ glsl_to_tgsi_visitor::emit(ir_instruction *ir, unsigned op,
glsl_to_tgsi_instruction * glsl_to_tgsi_instruction *
glsl_to_tgsi_visitor::emit(ir_instruction *ir, unsigned op, glsl_to_tgsi_visitor::emit(ir_instruction *ir, unsigned op,
st_dst_reg dst, st_src_reg src0, st_src_reg src1) st_dst_reg dst, st_src_reg src0, st_src_reg src1)
{ {
return emit(ir, op, dst, src0, src1, undef_src, undef_src); return emit(ir, op, dst, src0, src1, undef_src, undef_src);
} }
glsl_to_tgsi_instruction * glsl_to_tgsi_instruction *
glsl_to_tgsi_visitor::emit(ir_instruction *ir, unsigned op, glsl_to_tgsi_visitor::emit(ir_instruction *ir, unsigned op,
st_dst_reg dst, st_src_reg src0) st_dst_reg dst, st_src_reg src0)
{ {
assert(dst.writemask != 0); assert(dst.writemask != 0);
return emit(ir, op, dst, src0, undef_src, undef_src, undef_src); return emit(ir, op, dst, src0, undef_src, undef_src, undef_src);
@ -635,8 +635,8 @@ glsl_to_tgsi_visitor::emit(ir_instruction *ir, unsigned op)
*/ */
unsigned unsigned
glsl_to_tgsi_visitor::get_opcode(ir_instruction *ir, unsigned op, glsl_to_tgsi_visitor::get_opcode(ir_instruction *ir, unsigned op,
st_dst_reg dst, st_dst_reg dst,
st_src_reg src0, st_src_reg src1) st_src_reg src0, st_src_reg src1)
{ {
int type = GLSL_TYPE_FLOAT; int type = GLSL_TYPE_FLOAT;
@ -710,8 +710,8 @@ glsl_to_tgsi_visitor::get_opcode(ir_instruction *ir, unsigned op,
glsl_to_tgsi_instruction * glsl_to_tgsi_instruction *
glsl_to_tgsi_visitor::emit_dp(ir_instruction *ir, glsl_to_tgsi_visitor::emit_dp(ir_instruction *ir,
st_dst_reg dst, st_src_reg src0, st_src_reg src1, st_dst_reg dst, st_src_reg src0, st_src_reg src1,
unsigned elements) unsigned elements)
{ {
static const unsigned dot_opcodes[] = { static const unsigned dot_opcodes[] = {
TGSI_OPCODE_DP2, TGSI_OPCODE_DP3, TGSI_OPCODE_DP4 TGSI_OPCODE_DP2, TGSI_OPCODE_DP3, TGSI_OPCODE_DP4
@ -730,8 +730,8 @@ glsl_to_tgsi_visitor::emit_dp(ir_instruction *ir,
*/ */
void void
glsl_to_tgsi_visitor::emit_scalar(ir_instruction *ir, unsigned op, glsl_to_tgsi_visitor::emit_scalar(ir_instruction *ir, unsigned op,
st_dst_reg dst, st_dst_reg dst,
st_src_reg orig_src0, st_src_reg orig_src1) st_src_reg orig_src0, st_src_reg orig_src1)
{ {
int i, j; int i, j;
int done_mask = ~dst.writemask; int done_mask = ~dst.writemask;
@ -763,9 +763,9 @@ glsl_to_tgsi_visitor::emit_scalar(ir_instruction *ir, unsigned op,
} }
} }
src0.swizzle = MAKE_SWIZZLE4(src0_swiz, src0_swiz, src0.swizzle = MAKE_SWIZZLE4(src0_swiz, src0_swiz,
src0_swiz, src0_swiz); src0_swiz, src0_swiz);
src1.swizzle = MAKE_SWIZZLE4(src1_swiz, src1_swiz, src1.swizzle = MAKE_SWIZZLE4(src1_swiz, src1_swiz,
src1_swiz, src1_swiz); src1_swiz, src1_swiz);
inst = emit(ir, op, dst, src0, src1); inst = emit(ir, op, dst, src0, src1);
inst->dst.writemask = this_mask; inst->dst.writemask = this_mask;
@ -775,7 +775,7 @@ glsl_to_tgsi_visitor::emit_scalar(ir_instruction *ir, unsigned op,
void void
glsl_to_tgsi_visitor::emit_scalar(ir_instruction *ir, unsigned op, glsl_to_tgsi_visitor::emit_scalar(ir_instruction *ir, unsigned op,
st_dst_reg dst, st_src_reg src0) st_dst_reg dst, st_src_reg src0)
{ {
st_src_reg undef = undef_src; st_src_reg undef = undef_src;
@ -786,7 +786,7 @@ glsl_to_tgsi_visitor::emit_scalar(ir_instruction *ir, unsigned op,
void void
glsl_to_tgsi_visitor::emit_arl(ir_instruction *ir, glsl_to_tgsi_visitor::emit_arl(ir_instruction *ir,
st_dst_reg dst, st_src_reg src0) st_dst_reg dst, st_src_reg src0)
{ {
int op = TGSI_OPCODE_ARL; int op = TGSI_OPCODE_ARL;
@ -816,8 +816,8 @@ glsl_to_tgsi_visitor::emit_arl(ir_instruction *ir,
*/ */
void void
glsl_to_tgsi_visitor::emit_scs(ir_instruction *ir, unsigned op, glsl_to_tgsi_visitor::emit_scs(ir_instruction *ir, unsigned op,
st_dst_reg dst, st_dst_reg dst,
const st_src_reg &src) const st_src_reg &src)
{ {
/* Vertex programs cannot use the SCS opcode. /* Vertex programs cannot use the SCS opcode.
*/ */
@ -856,7 +856,7 @@ glsl_to_tgsi_visitor::emit_scs(ir_instruction *ir, unsigned op,
unsigned src0_swiz = GET_SWZ(src.swizzle, i); unsigned src0_swiz = GET_SWZ(src.swizzle, i);
src0.swizzle = MAKE_SWIZZLE4(src0_swiz, src0_swiz, src0.swizzle = MAKE_SWIZZLE4(src0_swiz, src0_swiz,
src0_swiz, src0_swiz); src0_swiz, src0_swiz);
for (unsigned j = i + 1; j < 4; j++) { for (unsigned j = i + 1; j < 4; j++) {
/* If there is another enabled component in the destination that is /* If there is another enabled component in the destination that is
* derived from the same inputs, generate its value on this pass as * derived from the same inputs, generate its value on this pass as
@ -881,7 +881,7 @@ glsl_to_tgsi_visitor::emit_scs(ir_instruction *ir, unsigned op,
* the destination. * the destination.
*/ */
tmp.swizzle = MAKE_SWIZZLE4(component, component, tmp.swizzle = MAKE_SWIZZLE4(component, component,
component, component); component, component);
inst = emit(ir, TGSI_OPCODE_SCS, dst, tmp); inst = emit(ir, TGSI_OPCODE_SCS, dst, tmp);
inst->dst.writemask = this_mask; inst->dst.writemask = this_mask;
} else { } else {
@ -897,8 +897,8 @@ glsl_to_tgsi_visitor::emit_scs(ir_instruction *ir, unsigned op,
int int
glsl_to_tgsi_visitor::add_constant(gl_register_file file, glsl_to_tgsi_visitor::add_constant(gl_register_file file,
gl_constant_value values[4], int size, int datatype, gl_constant_value values[4], int size, int datatype,
GLuint *swizzle_out) GLuint *swizzle_out)
{ {
if (file == PROGRAM_CONSTANT) { if (file == PROGRAM_CONSTANT) {
return _mesa_add_typed_unnamed_constant(this->prog->Parameters, values, return _mesa_add_typed_unnamed_constant(this->prog->Parameters, values,
@ -1111,7 +1111,7 @@ glsl_to_tgsi_visitor::visit(ir_variable *ir)
for (unsigned int i = 0; i < ir->get_num_state_slots(); i++) { for (unsigned int i = 0; i < ir->get_num_state_slots(); i++) {
int index = _mesa_add_state_reference(this->prog->Parameters, int index = _mesa_add_state_reference(this->prog->Parameters,
(gl_state_index *)slots[i].tokens); (gl_state_index *)slots[i].tokens);
if (storage->file == PROGRAM_STATE_VAR) { if (storage->file == PROGRAM_STATE_VAR) {
if (storage->index == -1) { if (storage->index == -1) {
@ -1120,11 +1120,11 @@ glsl_to_tgsi_visitor::visit(ir_variable *ir)
assert(index == storage->index + (int)i); assert(index == storage->index + (int)i);
} }
} else { } else {
/* We use GLSL_TYPE_FLOAT here regardless of the actual type of /* We use GLSL_TYPE_FLOAT here regardless of the actual type of
* the data being moved since MOV does not care about the type of * the data being moved since MOV does not care about the type of
* data it is moving, and we don't want to declare registers with * data it is moving, and we don't want to declare registers with
* array or struct types. * array or struct types.
*/ */
st_src_reg src(PROGRAM_STATE_VAR, index, GLSL_TYPE_FLOAT); st_src_reg src(PROGRAM_STATE_VAR, index, GLSL_TYPE_FLOAT);
src.swizzle = slots[i].swizzle; src.swizzle = slots[i].swizzle;
emit(ir, TGSI_OPCODE_MOV, dst, src); emit(ir, TGSI_OPCODE_MOV, dst, src);
@ -1136,9 +1136,9 @@ glsl_to_tgsi_visitor::visit(ir_variable *ir)
if (storage->file == PROGRAM_TEMPORARY && if (storage->file == PROGRAM_TEMPORARY &&
dst.index != storage->index + (int) ir->get_num_state_slots()) { dst.index != storage->index + (int) ir->get_num_state_slots()) {
fail_link(this->shader_program, fail_link(this->shader_program,
"failed to load builtin uniform `%s' (%d/%d regs loaded)\n", "failed to load builtin uniform `%s' (%d/%d regs loaded)\n",
ir->name, dst.index - storage->index, ir->name, dst.index - storage->index,
type_size(ir->type)); type_size(ir->type));
} }
} }
} }
@ -1262,7 +1262,7 @@ glsl_to_tgsi_visitor::try_emit_mad_for_and_not(ir_expression *ir, int try_operan
void void
glsl_to_tgsi_visitor::reladdr_to_temp(ir_instruction *ir, glsl_to_tgsi_visitor::reladdr_to_temp(ir_instruction *ir,
st_src_reg *reg, int *num_reladdr) st_src_reg *reg, int *num_reladdr)
{ {
if (!reg->reladdr && !reg->reladdr2) if (!reg->reladdr && !reg->reladdr2)
return; return;
@ -1301,9 +1301,9 @@ glsl_to_tgsi_visitor::visit(ir_expression *ir)
*/ */
if (!native_integers && ir->operation == ir_binop_logic_and) { if (!native_integers && ir->operation == ir_binop_logic_and) {
if (try_emit_mad_for_and_not(ir, 1)) if (try_emit_mad_for_and_not(ir, 1))
return; return;
if (try_emit_mad_for_and_not(ir, 0)) if (try_emit_mad_for_and_not(ir, 0))
return; return;
} }
if (ir->operation == ir_quadop_vector) if (ir->operation == ir_quadop_vector)
@ -1329,7 +1329,7 @@ glsl_to_tgsi_visitor::visit(ir_expression *ir)
int vector_elements = ir->operands[0]->type->vector_elements; int vector_elements = ir->operands[0]->type->vector_elements;
if (ir->operands[1]) { if (ir->operands[1]) {
vector_elements = MAX2(vector_elements, vector_elements = MAX2(vector_elements,
ir->operands[1]->type->vector_elements); ir->operands[1]->type->vector_elements);
} }
this->result.file = PROGRAM_UNDEFINED; this->result.file = PROGRAM_UNDEFINED;
@ -1757,8 +1757,7 @@ glsl_to_tgsi_visitor::visit(ir_expression *ir)
case ir_unop_sqrt: case ir_unop_sqrt:
if (have_sqrt) { if (have_sqrt) {
emit_scalar(ir, TGSI_OPCODE_SQRT, result_dst, op[0]); emit_scalar(ir, TGSI_OPCODE_SQRT, result_dst, op[0]);
} } else {
else {
/* sqrt(x) = x * rsq(x). */ /* sqrt(x) = x * rsq(x). */
emit_scalar(ir, TGSI_OPCODE_RSQ, result_dst, op[0]); emit_scalar(ir, TGSI_OPCODE_RSQ, result_dst, op[0]);
emit(ir, TGSI_OPCODE_MUL, result_dst, result_src, op[0]); emit(ir, TGSI_OPCODE_MUL, result_dst, result_src, op[0]);
@ -2092,7 +2091,7 @@ glsl_to_tgsi_visitor::visit(ir_dereference_variable *ir)
switch (var->data.mode) { switch (var->data.mode) {
case ir_var_uniform: case ir_var_uniform:
entry = new(mem_ctx) variable_storage(var, PROGRAM_UNIFORM, entry = new(mem_ctx) variable_storage(var, PROGRAM_UNIFORM,
var->data.location); var->data.location);
this->variables.push_tail(entry); this->variables.push_tail(entry);
break; break;
case ir_var_shader_in: case ir_var_shader_in:
@ -2932,8 +2931,8 @@ glsl_to_tgsi_visitor::visit(ir_texture *ir)
tmp_src = get_temp(glsl_type::vec4_type); tmp_src = get_temp(glsl_type::vec4_type);
st_dst_reg tmp_dst = st_dst_reg(tmp_src); st_dst_reg tmp_dst = st_dst_reg(tmp_src);
/* Projective division not allowed for array samplers. */ /* Projective division not allowed for array samplers. */
assert(!sampler_type->sampler_array); assert(!sampler_type->sampler_array);
tmp_dst.writemask = WRITEMASK_Z; tmp_dst.writemask = WRITEMASK_Z;
emit(ir, TGSI_OPCODE_MOV, tmp_dst, this->result); emit(ir, TGSI_OPCODE_MOV, tmp_dst, this->result);
@ -2975,7 +2974,6 @@ glsl_to_tgsi_visitor::visit(ir_texture *ir)
} else { } else {
coord_dst.writemask = WRITEMASK_Z; coord_dst.writemask = WRITEMASK_Z;
} }
emit(ir, TGSI_OPCODE_MOV, coord_dst, this->result); emit(ir, TGSI_OPCODE_MOV, coord_dst, this->result);
coord_dst.writemask = WRITEMASK_XYZW; coord_dst.writemask = WRITEMASK_XYZW;
} }
@ -3225,7 +3223,6 @@ count_resources(glsl_to_tgsi_visitor *v, gl_program *prog)
} }
} }
} }
prog->SamplersUsed = v->samplers_used; prog->SamplersUsed = v->samplers_used;
if (v->shader_program != NULL) if (v->shader_program != NULL)
@ -3264,9 +3261,9 @@ get_src_arg_mask(st_dst_reg dst, st_src_reg src)
* Here is why this conversion is safe: * Here is why this conversion is safe:
* CMP T0, T1 T2 T0 can be expanded to: * CMP T0, T1 T2 T0 can be expanded to:
* if (T1 < 0.0) * if (T1 < 0.0)
* MOV T0, T2; * MOV T0, T2;
* else * else
* MOV T0, T0; * MOV T0, T0;
* *
* If (T1 < 0.0) evaluates to true then our replacement MOV T0, T2 is the same * If (T1 < 0.0) evaluates to true then our replacement MOV T0, T2 is the same
* as the original program. If (T1 < 0.0) evaluates to false, executing * as the original program. If (T1 < 0.0) evaluates to false, executing
@ -3344,14 +3341,14 @@ glsl_to_tgsi_visitor::rename_temp_register(int index, int new_index)
foreach_in_list(glsl_to_tgsi_instruction, inst, &this->instructions) { foreach_in_list(glsl_to_tgsi_instruction, inst, &this->instructions) {
unsigned j; unsigned j;
for (j=0; j < num_inst_src_regs(inst->op); j++) { for (j = 0; j < num_inst_src_regs(inst->op); j++) {
if (inst->src[j].file == PROGRAM_TEMPORARY && if (inst->src[j].file == PROGRAM_TEMPORARY &&
inst->src[j].index == index) { inst->src[j].index == index) {
inst->src[j].index = new_index; inst->src[j].index = new_index;
} }
} }
for (j=0; j < inst->tex_offset_num_offset; j++) { for (j = 0; j < inst->tex_offset_num_offset; j++) {
if (inst->tex_offsets[j].file == PROGRAM_TEMPORARY && if (inst->tex_offsets[j].file == PROGRAM_TEMPORARY &&
inst->tex_offsets[j].index == index) { inst->tex_offsets[j].index == index) {
inst->tex_offsets[j].index = new_index; inst->tex_offsets[j].index = new_index;
@ -3372,19 +3369,18 @@ glsl_to_tgsi_visitor::get_first_temp_read(int index)
unsigned i = 0, j; unsigned i = 0, j;
foreach_in_list(glsl_to_tgsi_instruction, inst, &this->instructions) { foreach_in_list(glsl_to_tgsi_instruction, inst, &this->instructions) {
for (j=0; j < num_inst_src_regs(inst->op); j++) { for (j = 0; j < num_inst_src_regs(inst->op); j++) {
if (inst->src[j].file == PROGRAM_TEMPORARY && if (inst->src[j].file == PROGRAM_TEMPORARY &&
inst->src[j].index == index) { inst->src[j].index == index) {
return (depth == 0) ? i : loop_start; return (depth == 0) ? i : loop_start;
} }
} }
for (j=0; j < inst->tex_offset_num_offset; j++) { for (j = 0; j < inst->tex_offset_num_offset; j++) {
if (inst->tex_offsets[j].file == PROGRAM_TEMPORARY && if (inst->tex_offsets[j].file == PROGRAM_TEMPORARY &&
inst->tex_offsets[j].index == index) { inst->tex_offsets[j].index == index) {
return (depth == 0) ? i : loop_start; return (depth == 0) ? i : loop_start;
} }
} }
if (inst->op == TGSI_OPCODE_BGNLOOP) { if (inst->op == TGSI_OPCODE_BGNLOOP) {
if(depth++ == 0) if(depth++ == 0)
loop_start = i; loop_start = i;
@ -3393,10 +3389,8 @@ glsl_to_tgsi_visitor::get_first_temp_read(int index)
loop_start = -1; loop_start = -1;
} }
assert(depth >= 0); assert(depth >= 0);
i++; i++;
} }
return -1; return -1;
} }
@ -3411,7 +3405,6 @@ glsl_to_tgsi_visitor::get_first_temp_write(int index)
if (inst->dst.file == PROGRAM_TEMPORARY && inst->dst.index == index) { if (inst->dst.file == PROGRAM_TEMPORARY && inst->dst.index == index) {
return (depth == 0) ? i : loop_start; return (depth == 0) ? i : loop_start;
} }
if (inst->op == TGSI_OPCODE_BGNLOOP) { if (inst->op == TGSI_OPCODE_BGNLOOP) {
if(depth++ == 0) if(depth++ == 0)
loop_start = i; loop_start = i;
@ -3420,10 +3413,8 @@ glsl_to_tgsi_visitor::get_first_temp_write(int index)
loop_start = -1; loop_start = -1;
} }
assert(depth >= 0); assert(depth >= 0);
i++; i++;
} }
return -1; return -1;
} }
@ -3435,28 +3426,25 @@ glsl_to_tgsi_visitor::get_last_temp_read(int index)
unsigned i = 0, j; unsigned i = 0, j;
foreach_in_list(glsl_to_tgsi_instruction, inst, &this->instructions) { foreach_in_list(glsl_to_tgsi_instruction, inst, &this->instructions) {
for (j=0; j < num_inst_src_regs(inst->op); j++) { for (j = 0; j < num_inst_src_regs(inst->op); j++) {
if (inst->src[j].file == PROGRAM_TEMPORARY && if (inst->src[j].file == PROGRAM_TEMPORARY &&
inst->src[j].index == index) { inst->src[j].index == index) {
last = (depth == 0) ? i : -2; last = (depth == 0) ? i : -2;
} }
} }
for (j=0; j < inst->tex_offset_num_offset; j++) { for (j = 0; j < inst->tex_offset_num_offset; j++) {
if (inst->tex_offsets[j].file == PROGRAM_TEMPORARY && if (inst->tex_offsets[j].file == PROGRAM_TEMPORARY &&
inst->tex_offsets[j].index == index) inst->tex_offsets[j].index == index)
last = (depth == 0) ? i : -2; last = (depth == 0) ? i : -2;
} }
if (inst->op == TGSI_OPCODE_BGNLOOP) if (inst->op == TGSI_OPCODE_BGNLOOP)
depth++; depth++;
else if (inst->op == TGSI_OPCODE_ENDLOOP) else if (inst->op == TGSI_OPCODE_ENDLOOP)
if (--depth == 0 && last == -2) if (--depth == 0 && last == -2)
last = i; last = i;
assert(depth >= 0); assert(depth >= 0);
i++; i++;
} }
assert(last >= -1); assert(last >= -1);
return last; return last;
} }
@ -3478,10 +3466,8 @@ glsl_to_tgsi_visitor::get_last_temp_write(int index)
if (--depth == 0 && last == -2) if (--depth == 0 && last == -2)
last = i; last = i;
assert(depth >= 0); assert(depth >= 0);
i++; i++;
} }
assert(last >= -1); assert(last >= -1);
return last; return last;
} }
@ -3510,8 +3496,8 @@ void
glsl_to_tgsi_visitor::copy_propagate(void) glsl_to_tgsi_visitor::copy_propagate(void)
{ {
glsl_to_tgsi_instruction **acp = rzalloc_array(mem_ctx, glsl_to_tgsi_instruction **acp = rzalloc_array(mem_ctx,
glsl_to_tgsi_instruction *, glsl_to_tgsi_instruction *,
this->next_temp * 4); this->next_temp * 4);
int *acp_level = rzalloc_array(mem_ctx, int, this->next_temp * 4); int *acp_level = rzalloc_array(mem_ctx, int, this->next_temp * 4);
int level = 0; int level = 0;
@ -3551,8 +3537,8 @@ glsl_to_tgsi_visitor::copy_propagate(void)
if (first->src[0].file != copy_chan->src[0].file || if (first->src[0].file != copy_chan->src[0].file ||
first->src[0].index != copy_chan->src[0].index || first->src[0].index != copy_chan->src[0].index ||
first->src[0].index2D != copy_chan->src[0].index2D) { first->src[0].index2D != copy_chan->src[0].index2D) {
good = false; good = false;
break; break;
} }
} }
} }
@ -3570,8 +3556,7 @@ glsl_to_tgsi_visitor::copy_propagate(void)
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
int src_chan = GET_SWZ(inst->src[r].swizzle, i); int src_chan = GET_SWZ(inst->src[r].swizzle, i);
glsl_to_tgsi_instruction *copy_inst = acp[acp_base + src_chan]; glsl_to_tgsi_instruction *copy_inst = acp[acp_base + src_chan];
swizzle |= (GET_SWZ(copy_inst->src[0].swizzle, src_chan) << swizzle |= (GET_SWZ(copy_inst->src[0].swizzle, src_chan) << (3 * i));
(3 * i));
} }
inst->src[r].swizzle = swizzle; inst->src[r].swizzle = swizzle;
} }
@ -3597,10 +3582,10 @@ glsl_to_tgsi_visitor::copy_propagate(void)
for (int r = 0; r < this->next_temp; r++) { for (int r = 0; r < this->next_temp; r++) {
for (int c = 0; c < 4; c++) { for (int c = 0; c < 4; c++) {
if (!acp[4 * r + c]) if (!acp[4 * r + c])
continue; continue;
if (acp_level[4 * r + c] >= level) if (acp_level[4 * r + c] >= level)
acp[4 * r + c] = NULL; acp[4 * r + c] = NULL;
} }
} }
if (inst->op == TGSI_OPCODE_ENDIF) if (inst->op == TGSI_OPCODE_ENDIF)
@ -3617,44 +3602,42 @@ glsl_to_tgsi_visitor::copy_propagate(void)
*/ */
memset(acp, 0, sizeof(*acp) * this->next_temp * 4); memset(acp, 0, sizeof(*acp) * this->next_temp * 4);
} else if (inst->dst.file == PROGRAM_OUTPUT && } else if (inst->dst.file == PROGRAM_OUTPUT &&
inst->dst.reladdr) { inst->dst.reladdr) {
/* Any output might be written, so no copy propagation /* Any output might be written, so no copy propagation
* from outputs across this instruction. * from outputs across this instruction.
*/ */
for (int r = 0; r < this->next_temp; r++) { for (int r = 0; r < this->next_temp; r++) {
for (int c = 0; c < 4; c++) { for (int c = 0; c < 4; c++) {
if (!acp[4 * r + c]) if (!acp[4 * r + c])
continue; continue;
if (acp[4 * r + c]->src[0].file == PROGRAM_OUTPUT) if (acp[4 * r + c]->src[0].file == PROGRAM_OUTPUT)
acp[4 * r + c] = NULL; acp[4 * r + c] = NULL;
} }
} }
} else if (inst->dst.file == PROGRAM_TEMPORARY || } else if (inst->dst.file == PROGRAM_TEMPORARY ||
inst->dst.file == PROGRAM_OUTPUT) { inst->dst.file == PROGRAM_OUTPUT) {
/* Clear where it's used as dst. */ /* Clear where it's used as dst. */
if (inst->dst.file == PROGRAM_TEMPORARY) { if (inst->dst.file == PROGRAM_TEMPORARY) {
for (int c = 0; c < 4; c++) { for (int c = 0; c < 4; c++) {
if (inst->dst.writemask & (1 << c)) { if (inst->dst.writemask & (1 << c)) {
acp[4 * inst->dst.index + c] = NULL; acp[4 * inst->dst.index + c] = NULL;
} }
} }
} }
/* Clear where it's used as src. */ /* Clear where it's used as src. */
for (int r = 0; r < this->next_temp; r++) { for (int r = 0; r < this->next_temp; r++) {
for (int c = 0; c < 4; c++) { for (int c = 0; c < 4; c++) {
if (!acp[4 * r + c]) if (!acp[4 * r + c])
continue; continue;
int src_chan = GET_SWZ(acp[4 * r + c]->src[0].swizzle, c); int src_chan = GET_SWZ(acp[4 * r + c]->src[0].swizzle, c);
if (acp[4 * r + c]->src[0].file == inst->dst.file && if (acp[4 * r + c]->src[0].file == inst->dst.file &&
acp[4 * r + c]->src[0].index == inst->dst.index && acp[4 * r + c]->src[0].index == inst->dst.index &&
inst->dst.writemask & (1 << src_chan)) inst->dst.writemask & (1 << src_chan))
{ acp[4 * r + c] = NULL;
acp[4 * r + c] = NULL;
}
} }
} }
} }
@ -3738,23 +3721,20 @@ glsl_to_tgsi_visitor::eliminate_dead_code(void)
for (int r = 0; r < this->next_temp; r++) { for (int r = 0; r < this->next_temp; r++) {
for (int c = 0; c < 4; c++) { for (int c = 0; c < 4; c++) {
if (!writes[4 * r + c]) if (!writes[4 * r + c])
continue; continue;
if (write_level[4 * r + c] == level) if (write_level[4 * r + c] == level)
write_level[4 * r + c] = level-1; write_level[4 * r + c] = level-1;
} }
} }
if(inst->op == TGSI_OPCODE_ENDIF) if(inst->op == TGSI_OPCODE_ENDIF)
--level; --level;
break; break;
case TGSI_OPCODE_IF: case TGSI_OPCODE_IF:
case TGSI_OPCODE_UIF: case TGSI_OPCODE_UIF:
++level; ++level;
/* fallthrough to default case to mark the condition as read */ /* fallthrough to default case to mark the condition as read */
default: default:
/* Continuing the block, clear any channels from the write array that /* Continuing the block, clear any channels from the write array that
* are read by this instruction. * are read by this instruction.
@ -3773,9 +3753,8 @@ glsl_to_tgsi_visitor::eliminate_dead_code(void)
src_chans |= 1 << GET_SWZ(inst->src[i].swizzle, 3); src_chans |= 1 << GET_SWZ(inst->src[i].swizzle, 3);
for (int c = 0; c < 4; c++) { for (int c = 0; c < 4; c++) {
if (src_chans & (1 << c)) { if (src_chans & (1 << c))
writes[4 * inst->src[i].index + c] = NULL; writes[4 * inst->src[i].index + c] = NULL;
}
} }
} }
} }
@ -3793,9 +3772,8 @@ glsl_to_tgsi_visitor::eliminate_dead_code(void)
src_chans |= 1 << GET_SWZ(inst->tex_offsets[i].swizzle, 3); src_chans |= 1 << GET_SWZ(inst->tex_offsets[i].swizzle, 3);
for (int c = 0; c < 4; c++) { for (int c = 0; c < 4; c++) {
if (src_chans & (1 << c)) { if (src_chans & (1 << c))
writes[4 * inst->tex_offsets[i].index + c] = NULL; writes[4 * inst->tex_offsets[i].index + c] = NULL;
}
} }
} }
} }
@ -3868,18 +3846,18 @@ glsl_to_tgsi_visitor::merge_registers(void)
/* Read the indices of the last read and first write to each temp register /* Read the indices of the last read and first write to each temp register
* into an array so that we don't have to traverse the instruction list as * into an array so that we don't have to traverse the instruction list as
* much. */ * much. */
for (i=0; i < this->next_temp; i++) { for (i = 0; i < this->next_temp; i++) {
last_reads[i] = get_last_temp_read(i); last_reads[i] = get_last_temp_read(i);
first_writes[i] = get_first_temp_write(i); first_writes[i] = get_first_temp_write(i);
} }
/* Start looking for registers with non-overlapping usages that can be /* Start looking for registers with non-overlapping usages that can be
* merged together. */ * merged together. */
for (i=0; i < this->next_temp; i++) { for (i = 0; i < this->next_temp; i++) {
/* Don't touch unused registers. */ /* Don't touch unused registers. */
if (last_reads[i] < 0 || first_writes[i] < 0) continue; if (last_reads[i] < 0 || first_writes[i] < 0) continue;
for (j=0; j < this->next_temp; j++) { for (j = 0; j < this->next_temp; j++) {
/* Don't touch unused registers. */ /* Don't touch unused registers. */
if (last_reads[j] < 0 || first_writes[j] < 0) continue; if (last_reads[j] < 0 || first_writes[j] < 0) continue;
@ -3888,8 +3866,7 @@ glsl_to_tgsi_visitor::merge_registers(void)
* register at index i will always be used earlier or at the same time * register at index i will always be used earlier or at the same time
* as the register at index j. */ * as the register at index j. */
if (first_writes[i] <= first_writes[j] && if (first_writes[i] <= first_writes[j] &&
last_reads[i] <= first_writes[j]) last_reads[i] <= first_writes[j]) {
{
rename_temp_register(j, i); /* Replace all references to j with i.*/ rename_temp_register(j, i); /* Replace all references to j with i.*/
/* Update the first_writes and last_reads arrays with the new /* Update the first_writes and last_reads arrays with the new
@ -3914,7 +3891,7 @@ glsl_to_tgsi_visitor::renumber_registers(void)
int i = 0; int i = 0;
int new_index = 0; int new_index = 0;
for (i=0; i < this->next_temp; i++) { for (i = 0; i < this->next_temp; i++) {
if (get_first_temp_read(i) < 0) continue; if (get_first_temp_read(i) < 0) continue;
if (i != new_index) if (i != new_index)
rename_temp_register(i, new_index); rename_temp_register(i, new_index);
@ -4031,11 +4008,10 @@ get_pixel_transfer_visitor(struct st_fragment_program *fp,
if (inst->dst.file == PROGRAM_OUTPUT) if (inst->dst.file == PROGRAM_OUTPUT)
prog->OutputsWritten |= BITFIELD64_BIT(inst->dst.index); prog->OutputsWritten |= BITFIELD64_BIT(inst->dst.index);
for (int i=0; i<3; i++) { for (int i = 0; i < 3; i++) {
src_regs[i] = inst->src[i]; src_regs[i] = inst->src[i];
if (src_regs[i].file == PROGRAM_INPUT && if (src_regs[i].file == PROGRAM_INPUT &&
src_regs[i].index == VARYING_SLOT_COL0) src_regs[i].index == VARYING_SLOT_COL0) {
{
src_regs[i].file = PROGRAM_TEMPORARY; src_regs[i].file = PROGRAM_TEMPORARY;
src_regs[i].index = src0.index; src_regs[i].index = src0.index;
} }
@ -4117,7 +4093,7 @@ get_bitmap_visitor(struct st_fragment_program *fp,
if (inst->dst.file == PROGRAM_OUTPUT) if (inst->dst.file == PROGRAM_OUTPUT)
prog->OutputsWritten |= BITFIELD64_BIT(inst->dst.index); prog->OutputsWritten |= BITFIELD64_BIT(inst->dst.index);
for (int i=0; i<3; i++) { for (int i = 0; i < 3; i++) {
src_regs[i] = inst->src[i]; src_regs[i] = inst->src[i];
if (src_regs[i].file == PROGRAM_INPUT) if (src_regs[i].file == PROGRAM_INPUT)
prog->InputsRead |= BITFIELD64_BIT(src_regs[i].index); prog->InputsRead |= BITFIELD64_BIT(src_regs[i].index);
@ -5020,7 +4996,7 @@ st_translate_program(
ureg_writemask(t->outputs[i], TGSI_WRITEMASK_YZW), ureg_writemask(t->outputs[i], TGSI_WRITEMASK_YZW),
ureg_imm4f(ureg, 0.0f, 0.0f, 0.0f, 1.0f)); ureg_imm4f(ureg, 0.0f, 0.0f, 0.0f, 1.0f));
t->outputs[i] = ureg_writemask(t->outputs[i], TGSI_WRITEMASK_X); t->outputs[i] = ureg_writemask(t->outputs[i], TGSI_WRITEMASK_X);
} }
} }
if (passthrough_edgeflags) if (passthrough_edgeflags)
emit_edgeflags(t); emit_edgeflags(t);
@ -5252,7 +5228,7 @@ get_mesa_program(struct gl_context *ctx,
_mesa_copy_linked_program_data(shader->Stage, shader_program, prog); _mesa_copy_linked_program_data(shader->Stage, shader_program, prog);
_mesa_generate_parameters_list_for_uniforms(shader_program, shader, _mesa_generate_parameters_list_for_uniforms(shader_program, shader,
prog->Parameters); prog->Parameters);
/* Remove reads from output registers. */ /* Remove reads from output registers. */
lower_output_reads(shader->ir); lower_output_reads(shader->ir);
@ -5290,7 +5266,7 @@ get_mesa_program(struct gl_context *ctx,
#if 0 #if 0
/* Print out some information (for debugging purposes) used by the /* Print out some information (for debugging purposes) used by the
* optimization passes. */ * optimization passes. */
for (i=0; i < v->next_temp; i++) { for (i = 0; i < v->next_temp; i++) {
int fr = v->get_first_temp_read(i); int fr = v->get_first_temp_read(i);
int fw = v->get_first_temp_write(i); int fw = v->get_first_temp_write(i);
int lr = v->get_last_temp_read(i); int lr = v->get_last_temp_read(i);
@ -5446,7 +5422,7 @@ st_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
progress = do_common_optimization(ir, true, true, options, progress = do_common_optimization(ir, true, true, options,
ctx->Const.NativeIntegers) ctx->Const.NativeIntegers)
|| progress; || progress;
progress = lower_if_to_cond_assign(ir, options->MaxIfDepth) || progress; progress = lower_if_to_cond_assign(ir, options->MaxIfDepth) || progress;
@ -5464,13 +5440,13 @@ st_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
linked_prog = get_mesa_program(ctx, prog, prog->_LinkedShaders[i]); linked_prog = get_mesa_program(ctx, prog, prog->_LinkedShaders[i]);
if (linked_prog) { if (linked_prog) {
_mesa_reference_program(ctx, &prog->_LinkedShaders[i]->Program, _mesa_reference_program(ctx, &prog->_LinkedShaders[i]->Program,
linked_prog); linked_prog);
if (!ctx->Driver.ProgramStringNotify(ctx, if (!ctx->Driver.ProgramStringNotify(ctx,
_mesa_shader_stage_to_program(i), _mesa_shader_stage_to_program(i),
linked_prog)) { linked_prog)) {
_mesa_reference_program(ctx, &prog->_LinkedShaders[i]->Program, _mesa_reference_program(ctx, &prog->_LinkedShaders[i]->Program,
NULL); NULL);
_mesa_reference_program(ctx, &linked_prog, NULL); _mesa_reference_program(ctx, &linked_prog, NULL);
return GL_FALSE; return GL_FALSE;
} }