i915g: Try to do better in the shader compiler.
- Copy i915c's support for phases, that should allow us to run a coupe more shaders. - Fix the error messages. - Still try to proceed when we get a shader that's too long.
This commit is contained in:
parent
5349b95920
commit
5d7609715a
|
@ -70,6 +70,7 @@ struct i915_fp_compile {
|
||||||
uint temp_flag; /**< Tracks temporary regs which are in use */
|
uint temp_flag; /**< Tracks temporary regs which are in use */
|
||||||
uint utemp_flag; /**< Tracks TYPE_U temporary regs which are in use */
|
uint utemp_flag; /**< Tracks TYPE_U temporary regs which are in use */
|
||||||
|
|
||||||
|
uint register_phases[16];
|
||||||
uint nr_tex_indirect;
|
uint nr_tex_indirect;
|
||||||
uint nr_tex_insn;
|
uint nr_tex_insn;
|
||||||
uint nr_alu_insn;
|
uint nr_alu_insn;
|
||||||
|
|
|
@ -67,7 +67,7 @@ i915_get_temp(struct i915_fp_compile *p)
|
||||||
{
|
{
|
||||||
int bit = ffs(~p->temp_flag);
|
int bit = ffs(~p->temp_flag);
|
||||||
if (!bit) {
|
if (!bit) {
|
||||||
i915_program_error(p, "i915_get_temp: out of temporaries\n");
|
i915_program_error(p, "i915_get_temp: out of temporaries");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,7 +92,7 @@ i915_get_utemp(struct i915_fp_compile * p)
|
||||||
{
|
{
|
||||||
int bit = ffs(~p->utemp_flag);
|
int bit = ffs(~p->utemp_flag);
|
||||||
if (!bit) {
|
if (!bit) {
|
||||||
i915_program_error(p, "i915_get_utemp: out of temporaries\n");
|
i915_program_error(p, "i915_get_utemp: out of temporaries");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,7 +134,7 @@ i915_emit_decl(struct i915_fp_compile *p,
|
||||||
*(p->decl++) = D2_MBZ;
|
*(p->decl++) = D2_MBZ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
i915_program_error(p, "Out of declarations\n");
|
i915_program_error(p, "Out of declarations");
|
||||||
|
|
||||||
p->nr_decl_insn++;
|
p->nr_decl_insn++;
|
||||||
return reg;
|
return reg;
|
||||||
|
@ -197,7 +197,10 @@ i915_emit_arith(struct i915_fp_compile * p,
|
||||||
*(p->csr++) = (A2_SRC1(src1) | A2_SRC2(src2));
|
*(p->csr++) = (A2_SRC1(src1) | A2_SRC2(src2));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
i915_program_error(p, "Out of instructions\n");
|
i915_program_error(p, "Out of instructions");
|
||||||
|
|
||||||
|
if (GET_UREG_TYPE(dest) == REG_TYPE_R)
|
||||||
|
p->register_phases[GET_UREG_NR(dest)] = p->nr_tex_indirect;
|
||||||
|
|
||||||
p->nr_alu_insn++;
|
p->nr_alu_insn++;
|
||||||
return dest;
|
return dest;
|
||||||
|
@ -253,21 +256,31 @@ uint i915_emit_texld( struct i915_fp_compile *p,
|
||||||
assert(GET_UREG_TYPE(dest) != REG_TYPE_CONST);
|
assert(GET_UREG_TYPE(dest) != REG_TYPE_CONST);
|
||||||
assert(dest == UREG(GET_UREG_TYPE(dest), GET_UREG_NR(dest)));
|
assert(dest == UREG(GET_UREG_TYPE(dest), GET_UREG_NR(dest)));
|
||||||
|
|
||||||
/* is the sampler coord a texcoord input reg? */
|
/* Output register being oC or oD defines a phase boundary */
|
||||||
if (GET_UREG_TYPE(coord) != REG_TYPE_T) {
|
if (GET_UREG_TYPE(dest) == REG_TYPE_OC ||
|
||||||
p->nr_tex_indirect++;
|
GET_UREG_TYPE(dest) == REG_TYPE_OD)
|
||||||
}
|
p->nr_tex_indirect++;
|
||||||
|
|
||||||
|
/* Reading from an r# register whose contents depend on output of the
|
||||||
|
* current phase defines a phase boundary.
|
||||||
|
*/
|
||||||
|
if (GET_UREG_TYPE(coord) == REG_TYPE_R &&
|
||||||
|
p->register_phases[GET_UREG_NR(coord)] == p->nr_tex_indirect)
|
||||||
|
p->nr_tex_indirect++;
|
||||||
|
|
||||||
if (p->csr< p->program + I915_PROGRAM_SIZE) {
|
if (p->csr< p->program + I915_PROGRAM_SIZE) {
|
||||||
*(p->csr++) = (opcode |
|
*(p->csr++) = (opcode |
|
||||||
T0_DEST( dest ) |
|
T0_DEST( dest ) |
|
||||||
T0_SAMPLER( sampler ));
|
T0_SAMPLER( sampler ));
|
||||||
|
|
||||||
*(p->csr++) = T1_ADDRESS_REG( coord );
|
*(p->csr++) = T1_ADDRESS_REG( coord );
|
||||||
*(p->csr++) = T2_MBZ;
|
*(p->csr++) = T2_MBZ;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
i915_program_error(p, "Out of instructions\n");
|
i915_program_error(p, "Out of instructions");
|
||||||
|
|
||||||
|
if (GET_UREG_TYPE(dest) == REG_TYPE_R)
|
||||||
|
p->register_phases[GET_UREG_NR(dest)] = p->nr_tex_indirect;
|
||||||
|
|
||||||
p->nr_tex_insn++;
|
p->nr_tex_insn++;
|
||||||
}
|
}
|
||||||
|
@ -305,7 +318,7 @@ i915_emit_const1f(struct i915_fp_compile * p, float c0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
i915_program_error(p, "i915_emit_const1f: out of constants\n");
|
i915_program_error(p, "i915_emit_const1f: out of constants");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -343,7 +356,7 @@ i915_emit_const2f(struct i915_fp_compile * p, float c0, float c1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
i915_program_error(p, "i915_emit_const2f: out of constants\n");
|
i915_program_error(p, "i915_emit_const2f: out of constants");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -354,6 +367,9 @@ i915_emit_const4f(struct i915_fp_compile * p,
|
||||||
struct i915_fragment_shader *ifs = p->shader;
|
struct i915_fragment_shader *ifs = p->shader;
|
||||||
unsigned reg;
|
unsigned reg;
|
||||||
|
|
||||||
|
// XXX emit swizzle here for 0, 1, -1 and any combination thereof
|
||||||
|
// we can use swizzle + neg for that
|
||||||
|
printf("const %f %f %f %f\n",c0,c1,c2,c3);
|
||||||
for (reg = 0; reg < I915_MAX_CONSTANT; reg++) {
|
for (reg = 0; reg < I915_MAX_CONSTANT; reg++) {
|
||||||
if (ifs->constant_flags[reg] == 0xf &&
|
if (ifs->constant_flags[reg] == 0xf &&
|
||||||
ifs->constants[reg][0] == c0 &&
|
ifs->constants[reg][0] == c0 &&
|
||||||
|
@ -375,7 +391,7 @@ i915_emit_const4f(struct i915_fp_compile * p,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
i915_program_error(p, "i915_emit_const4f: out of constants\n");
|
i915_program_error(p, "i915_emit_const4f: out of constants");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -276,7 +276,7 @@ src_vector(struct i915_fp_compile *p,
|
||||||
assert(!source->Register.Absolute);
|
assert(!source->Register.Absolute);
|
||||||
#endif
|
#endif
|
||||||
if (source->Register.Absolute)
|
if (source->Register.Absolute)
|
||||||
debug_printf("Unhandler absolute value\n");
|
debug_printf("Unhandled absolute value\n");
|
||||||
|
|
||||||
return src;
|
return src;
|
||||||
}
|
}
|
||||||
|
@ -1089,9 +1089,11 @@ i915_translate_instructions(struct i915_fp_compile *p,
|
||||||
for (i = parse.FullToken.FullDeclaration.Range.First;
|
for (i = parse.FullToken.FullDeclaration.Range.First;
|
||||||
i <= parse.FullToken.FullDeclaration.Range.Last;
|
i <= parse.FullToken.FullDeclaration.Range.Last;
|
||||||
i++) {
|
i++) {
|
||||||
assert(i < I915_MAX_TEMPORARY);
|
if (i >= I915_MAX_TEMPORARY)
|
||||||
/* XXX just use shader->info->file_mask[TGSI_FILE_TEMPORARY] */
|
debug_printf("Too many temps (%d)\n",i);
|
||||||
p->temp_flag |= (1 << i); /* mark temp as used */
|
else
|
||||||
|
/* XXX just use shader->info->file_mask[TGSI_FILE_TEMPORARY] */
|
||||||
|
p->temp_flag |= (1 << i); /* mark temp as used */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1163,6 +1165,8 @@ i915_init_compile(struct i915_context *i915,
|
||||||
ifs->num_constants = 0;
|
ifs->num_constants = 0;
|
||||||
memset(ifs->constant_flags, 0, sizeof(ifs->constant_flags));
|
memset(ifs->constant_flags, 0, sizeof(ifs->constant_flags));
|
||||||
|
|
||||||
|
memset(&p->register_phases, 0, sizeof(p->register_phases));
|
||||||
|
|
||||||
for (i = 0; i < I915_TEX_UNITS; i++)
|
for (i = 0; i < I915_TEX_UNITS; i++)
|
||||||
ifs->generic_mapping[i] = -1;
|
ifs->generic_mapping[i] = -1;
|
||||||
|
|
||||||
|
@ -1198,7 +1202,7 @@ i915_fini_compile(struct i915_context *i915, struct i915_fp_compile *p)
|
||||||
unsigned long decl_size = (unsigned long) (p->decl - p->declarations);
|
unsigned long decl_size = (unsigned long) (p->decl - p->declarations);
|
||||||
|
|
||||||
if (p->nr_tex_indirect > I915_MAX_TEX_INDIRECT)
|
if (p->nr_tex_indirect > I915_MAX_TEX_INDIRECT)
|
||||||
i915_program_error(p, "Exceeded max nr indirect texture lookups");
|
debug_printf("Exceeded max nr indirect texture lookups\n");
|
||||||
|
|
||||||
if (p->nr_tex_insn > I915_MAX_TEX_INSN)
|
if (p->nr_tex_insn > I915_MAX_TEX_INSN)
|
||||||
i915_program_error(p, "Exceeded max TEX instructions");
|
i915_program_error(p, "Exceeded max TEX instructions");
|
||||||
|
|
Loading…
Reference in New Issue