int inst_ptr; /* current instruction pointer */
struct etna_inst code[ETNA_MAX_INSTRUCTIONS * ETNA_INST_SIZE];
+ /* constants */
+ uint64_t consts[ETNA_MAX_IMM];
+
/* There was an error during compilation */
bool error;
};
if (DBG_ENABLED(ETNA_DBG_DUMP_SHADERS))
nir_print_shader(s, stdout);
- uint64_t consts[ETNA_MAX_IMM] = {};
-
unsigned block_ptr[nir_shader_get_entrypoint(s)->num_blocks];
c->block_ptr = block_ptr;
- struct emit_options options = {
- .max_temps = ETNA_MAX_TEMPS,
- .max_consts = ETNA_MAX_IMM / 4,
- .id_reg = sf->num_reg,
- .single_const_src = c->specs->halti < 5,
- .etna_new_transcendentals = c->specs->has_new_transcendentals,
- .no_integers = c->specs->halti < 2,
- .user = c,
- .consts = consts,
- };
unsigned num_consts;
- ASSERTED bool ok = emit_shader(c->nir, &options, &v->num_temps, &num_consts);
+ ASSERTED bool ok = emit_shader(c, &v->num_temps, &num_consts);
assert(ok);
/* empty shader, emit NOP */
v->code = code;
v->needs_icache = c->inst_ptr > specs->max_instructions;
- copy_uniform_state_to_shader(v, consts, num_consts);
+ copy_uniform_state_to_shader(v, c->consts, num_consts);
if (s->info.stage == MESA_SHADER_FRAGMENT) {
v->input_count_unk8 = 31; /* XXX what is this */
#include "compiler/nir/nir_worklist.h"
#include "util/register_allocate.h"
-struct emit_options {
- unsigned max_temps; /* max # of vec4 registers */
- unsigned max_consts; /* max # of vec4 consts */
- unsigned id_reg; /* register with vertex/instance id */
- bool single_const_src : 1; /* limited to 1 vec4 const src */
- bool etna_new_transcendentals : 1;
- bool no_integers : 1;
- void *user;
- uint64_t *consts;
-};
-
#define ALU_SWIZ(s) INST_SWIZ((s)->swizzle[0], (s)->swizzle[1], (s)->swizzle[2], (s)->swizzle[3])
#define SRC_DISABLE ((hw_src){})
#define SRC_CONST(idx, s) ((hw_src){.use=1, .rgroup = INST_RGROUP_UNIFORM_0, .reg=idx, .swiz=s})
#define SRC_REG(idx, s) ((hw_src){.use=1, .rgroup = INST_RGROUP_TEMP, .reg=idx, .swiz=s})
-#define option(name) (state->options->name)
-#define emit(type, args...) etna_emit_##type(state->options->user, args)
+#define emit(type, args...) etna_emit_##type(state->c, args)
typedef struct etna_inst_dst hw_dst;
typedef struct etna_inst_src hw_src;
};
struct state {
- const struct emit_options *options;
+ struct etna_compile *c;
+
unsigned const_count;
nir_shader *shader;
unsigned i;
int swiz = -1;
for (i = 0; swiz < 0; i++) {
- uint64_t *a = &option(consts)[i*4];
+ uint64_t *a = &state->c->consts[i*4];
uint64_t save[4];
memcpy(save, a, sizeof(save));
swiz = 0;
}
}
- assert(i <= option(max_consts));
+ assert(i <= ETNA_MAX_IMM / 4);
state->const_count = MAX2(state->const_count, i);
return SRC_CONST(i - 1, swiz);
static void
ra_assign(struct state *state, nir_shader *shader)
{
- struct ra_regs *regs = ra_alloc_reg_set(NULL, option(max_temps) *
+ struct ra_regs *regs = ra_alloc_reg_set(NULL, ETNA_MAX_TEMPS *
NUM_REG_TYPES, false);
/* classes always be created from index 0, so equal to the class enum
for (int c = 0; c < NUM_REG_CLASSES; c++)
ra_alloc_reg_class(regs);
/* add each register of each class */
- for (int r = 0; r < NUM_REG_TYPES * option(max_temps); r++)
+ for (int r = 0; r < NUM_REG_TYPES * ETNA_MAX_TEMPS; r++)
ra_class_add_reg(regs, reg_get_class(r), r);
/* set conflicts */
- for (int r = 0; r < option(max_temps); r++) {
+ for (int r = 0; r < ETNA_MAX_TEMPS; r++) {
for (int i = 0; i < NUM_REG_TYPES; i++) {
for (int j = 0; j < i; j++) {
if (reg_writemask[i] & reg_writemask[j]) {
nir_dest *dest = defs[i].dest;
unsigned c = nir_dest_num_components(*dest) - 1;
- if (instr->type == nir_instr_type_alu && option(etna_new_transcendentals)) {
+ if (instr->type == nir_instr_type_alu &&
+ state->c->specs->has_new_transcendentals) {
switch (nir_instr_as_alu(instr)->op) {
case nir_op_fdiv:
case nir_op_flog2:
}[nir_dest_num_components(*dest) - 1];
break;
case nir_intrinsic_load_instance_id:
- reg = option(id_reg) * NUM_REG_TYPES + REG_TYPE_VIRT_SCALAR_Y;
+ reg = state->c->variant->infile.num_reg * NUM_REG_TYPES + REG_TYPE_VIRT_SCALAR_Y;
break;
default:
continue;
}
} break;
default: {
- if (!option(single_const_src))
+ /* pre-GC7000L can only have 1 uniform src per instruction */
+ if (state->c->specs->halti >= 5)
return;
- /* pre-GC7000L can only have 1 uniform src per instruction */
nir_const_value value[4] = {};
uint8_t swizzle[4][4] = {};
unsigned swiz_max = 0, num_const = 0;
}
static bool
-emit_shader(nir_shader *shader, const struct emit_options *options,
- unsigned *num_temps, unsigned *num_consts)
+emit_shader(struct etna_compile *c, unsigned *num_temps, unsigned *num_consts)
{
+ nir_shader *shader = c->nir;
+
struct state state = {
- .options = options,
+ .c = c,
.shader = shader,
.impl = nir_shader_get_entrypoint(shader),
};
break;
unsigned base = nir_intrinsic_base(intr);
- if (options->no_integers)
+ /* pre halti2 uniform offset will be float */
+ if (c->specs->halti < 2)
base += (unsigned) off[0].f32 / 16;
else
base += off[0].u32 / 16;