nir/tex_instr: Add a nir_tex_src struct and dynamically allocate the src array

This solves a number of problems.  First is the ability to change the
number of sources that a texture instruction has.  Second, it solves the
delema that may occur if a texture instruction has more than 4 sources.

Reviewed-by: Connor Abbott <cwabbott0@gmail.com>
This commit is contained in:
Jason Ekstrand
2015-01-09 20:01:13 -08:00
parent dcb1acdea0
commit 4aa6162f6e
7 changed files with 51 additions and 43 deletions

View File

@@ -1662,20 +1662,20 @@ nir_visitor::visit(ir_texture *ir)
if (ir->coordinate != NULL) {
instr->coord_components = ir->coordinate->type->vector_elements;
instr->src[src_number] = evaluate_rvalue(ir->coordinate);
instr->src_type[src_number] = nir_tex_src_coord;
instr->src[src_number].src = evaluate_rvalue(ir->coordinate);
instr->src[src_number].src_type = nir_tex_src_coord;
src_number++;
}
if (ir->projector != NULL) {
instr->src[src_number] = evaluate_rvalue(ir->projector);
instr->src_type[src_number] = nir_tex_src_projector;
instr->src[src_number].src = evaluate_rvalue(ir->projector);
instr->src[src_number].src_type = nir_tex_src_projector;
src_number++;
}
if (ir->shadow_comparitor != NULL) {
instr->src[src_number] = evaluate_rvalue(ir->shadow_comparitor);
instr->src_type[src_number] = nir_tex_src_comparitor;
instr->src[src_number].src = evaluate_rvalue(ir->shadow_comparitor);
instr->src[src_number].src_type = nir_tex_src_comparitor;
src_number++;
}
@@ -1688,16 +1688,16 @@ nir_visitor::visit(ir_texture *ir)
for (unsigned i = 0; i < const_offset->type->vector_elements; i++)
instr->const_offset[i] = const_offset->value.i[i];
} else {
instr->src[src_number] = evaluate_rvalue(ir->offset);
instr->src_type[src_number] = nir_tex_src_offset;
instr->src[src_number].src = evaluate_rvalue(ir->offset);
instr->src[src_number].src_type = nir_tex_src_offset;
src_number++;
}
}
switch (ir->op) {
case ir_txb:
instr->src[src_number] = evaluate_rvalue(ir->lod_info.bias);
instr->src_type[src_number] = nir_tex_src_bias;
instr->src[src_number].src = evaluate_rvalue(ir->lod_info.bias);
instr->src[src_number].src_type = nir_tex_src_bias;
src_number++;
break;
@@ -1705,24 +1705,24 @@ nir_visitor::visit(ir_texture *ir)
case ir_txf:
case ir_txs:
if (ir->lod_info.lod != NULL) {
instr->src[src_number] = evaluate_rvalue(ir->lod_info.lod);
instr->src_type[src_number] = nir_tex_src_lod;
instr->src[src_number].src = evaluate_rvalue(ir->lod_info.lod);
instr->src[src_number].src_type = nir_tex_src_lod;
src_number++;
}
break;
case ir_txd:
instr->src[src_number] = evaluate_rvalue(ir->lod_info.grad.dPdx);
instr->src_type[src_number] = nir_tex_src_ddx;
instr->src[src_number].src = evaluate_rvalue(ir->lod_info.grad.dPdx);
instr->src[src_number].src_type = nir_tex_src_ddx;
src_number++;
instr->src[src_number] = evaluate_rvalue(ir->lod_info.grad.dPdy);
instr->src_type[src_number] = nir_tex_src_ddy;
instr->src[src_number].src = evaluate_rvalue(ir->lod_info.grad.dPdy);
instr->src[src_number].src_type = nir_tex_src_ddy;
src_number++;
break;
case ir_txf_ms:
instr->src[src_number] = evaluate_rvalue(ir->lod_info.sample_index);
instr->src_type[src_number] = nir_tex_src_ms_index;
instr->src[src_number].src = evaluate_rvalue(ir->lod_info.sample_index);
instr->src[src_number].src_type = nir_tex_src_ms_index;
src_number++;
break;