mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 16:08:04 +02:00
freedreno/ir3: move some helpers
Split out a few helpers from fd3_program so we don't have to duplicate for fd4_program. Signed-off-by: Rob Clark <robclark@freedesktop.org>
This commit is contained in:
parent
e091c08089
commit
82103206fe
2 changed files with 71 additions and 65 deletions
|
|
@ -126,58 +126,6 @@ emit_shader(struct fd_ringbuffer *ring, const struct ir3_shader_variant *so)
|
|||
}
|
||||
}
|
||||
|
||||
static int
|
||||
find_output(const struct ir3_shader_variant *so, ir3_semantic semantic)
|
||||
{
|
||||
int j;
|
||||
|
||||
for (j = 0; j < so->outputs_count; j++)
|
||||
if (so->outputs[j].semantic == semantic)
|
||||
return j;
|
||||
|
||||
/* it seems optional to have a OUT.BCOLOR[n] for each OUT.COLOR[n]
|
||||
* in the vertex shader.. but the fragment shader doesn't know this
|
||||
* so it will always have both IN.COLOR[n] and IN.BCOLOR[n]. So
|
||||
* at link time if there is no matching OUT.BCOLOR[n], we must map
|
||||
* OUT.COLOR[n] to IN.BCOLOR[n]. And visa versa if there is only
|
||||
* a OUT.BCOLOR[n] but no matching OUT.COLOR[n]
|
||||
*/
|
||||
if (sem2name(semantic) == TGSI_SEMANTIC_BCOLOR) {
|
||||
unsigned idx = sem2idx(semantic);
|
||||
semantic = ir3_semantic_name(TGSI_SEMANTIC_COLOR, idx);
|
||||
} else if (sem2name(semantic) == TGSI_SEMANTIC_COLOR) {
|
||||
unsigned idx = sem2idx(semantic);
|
||||
semantic = ir3_semantic_name(TGSI_SEMANTIC_BCOLOR, idx);
|
||||
}
|
||||
|
||||
for (j = 0; j < so->outputs_count; j++)
|
||||
if (so->outputs[j].semantic == semantic)
|
||||
return j;
|
||||
|
||||
debug_assert(0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
next_varying(const struct ir3_shader_variant *so, int i)
|
||||
{
|
||||
while (++i < so->inputs_count)
|
||||
if (so->inputs[i].compmask && so->inputs[i].bary)
|
||||
break;
|
||||
return i;
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
find_output_regid(const struct ir3_shader_variant *so, ir3_semantic semantic)
|
||||
{
|
||||
int j;
|
||||
for (j = 0; j < so->outputs_count; j++)
|
||||
if (so->outputs[j].semantic == semantic)
|
||||
return so->outputs[j].regid;
|
||||
return regid(63, 0);
|
||||
}
|
||||
|
||||
void
|
||||
fd3_program_emit(struct fd_ringbuffer *ring, struct fd3_emit *emit)
|
||||
{
|
||||
|
|
@ -245,13 +193,13 @@ fd3_program_emit(struct fd_ringbuffer *ring, struct fd3_emit *emit)
|
|||
/* seems like vs->constlen + fs->constlen > 256, then CONSTMODE=1 */
|
||||
constmode = ((vp->constlen + fp->constlen) > 256) ? 1 : 0;
|
||||
|
||||
pos_regid = find_output_regid(vp,
|
||||
pos_regid = ir3_find_output_regid(vp,
|
||||
ir3_semantic_name(TGSI_SEMANTIC_POSITION, 0));
|
||||
posz_regid = find_output_regid(fp,
|
||||
posz_regid = ir3_find_output_regid(fp,
|
||||
ir3_semantic_name(TGSI_SEMANTIC_POSITION, 0));
|
||||
psize_regid = find_output_regid(vp,
|
||||
psize_regid = ir3_find_output_regid(vp,
|
||||
ir3_semantic_name(TGSI_SEMANTIC_PSIZE, 0));
|
||||
color_regid = find_output_regid(fp,
|
||||
color_regid = ir3_find_output_regid(fp,
|
||||
ir3_semantic_name(TGSI_SEMANTIC_COLOR, 0));
|
||||
|
||||
/* we could probably divide this up into things that need to be
|
||||
|
|
@ -311,16 +259,16 @@ fd3_program_emit(struct fd_ringbuffer *ring, struct fd3_emit *emit)
|
|||
|
||||
OUT_PKT0(ring, REG_A3XX_SP_VS_OUT_REG(i), 1);
|
||||
|
||||
j = next_varying(fp, j);
|
||||
j = ir3_next_varying(fp, j);
|
||||
if (j < fp->inputs_count) {
|
||||
k = find_output(vp, fp->inputs[j].semantic);
|
||||
k = ir3_find_output(vp, fp->inputs[j].semantic);
|
||||
reg |= A3XX_SP_VS_OUT_REG_A_REGID(vp->outputs[k].regid);
|
||||
reg |= A3XX_SP_VS_OUT_REG_A_COMPMASK(fp->inputs[j].compmask);
|
||||
}
|
||||
|
||||
j = next_varying(fp, j);
|
||||
j = ir3_next_varying(fp, j);
|
||||
if (j < fp->inputs_count) {
|
||||
k = find_output(vp, fp->inputs[j].semantic);
|
||||
k = ir3_find_output(vp, fp->inputs[j].semantic);
|
||||
reg |= A3XX_SP_VS_OUT_REG_B_REGID(vp->outputs[k].regid);
|
||||
reg |= A3XX_SP_VS_OUT_REG_B_COMPMASK(fp->inputs[j].compmask);
|
||||
}
|
||||
|
|
@ -333,16 +281,16 @@ fd3_program_emit(struct fd_ringbuffer *ring, struct fd3_emit *emit)
|
|||
|
||||
OUT_PKT0(ring, REG_A3XX_SP_VS_VPC_DST_REG(i), 1);
|
||||
|
||||
j = next_varying(fp, j);
|
||||
j = ir3_next_varying(fp, j);
|
||||
if (j < fp->inputs_count)
|
||||
reg |= A3XX_SP_VS_VPC_DST_REG_OUTLOC0(fp->inputs[j].inloc);
|
||||
j = next_varying(fp, j);
|
||||
j = ir3_next_varying(fp, j);
|
||||
if (j < fp->inputs_count)
|
||||
reg |= A3XX_SP_VS_VPC_DST_REG_OUTLOC1(fp->inputs[j].inloc);
|
||||
j = next_varying(fp, j);
|
||||
j = ir3_next_varying(fp, j);
|
||||
if (j < fp->inputs_count)
|
||||
reg |= A3XX_SP_VS_VPC_DST_REG_OUTLOC2(fp->inputs[j].inloc);
|
||||
j = next_varying(fp, j);
|
||||
j = ir3_next_varying(fp, j);
|
||||
if (j < fp->inputs_count)
|
||||
reg |= A3XX_SP_VS_VPC_DST_REG_OUTLOC3(fp->inputs[j].inloc);
|
||||
|
||||
|
|
@ -418,7 +366,7 @@ fd3_program_emit(struct fd_ringbuffer *ring, struct fd3_emit *emit)
|
|||
uint32_t vinterp[4] = {0}, flatshade[2] = {0};
|
||||
|
||||
/* figure out VARYING_INTERP / FLAT_SHAD register values: */
|
||||
for (j = -1; (j = next_varying(fp, j)) < (int)fp->inputs_count; ) {
|
||||
for (j = -1; (j = ir3_next_varying(fp, j)) < (int)fp->inputs_count; ) {
|
||||
uint32_t interp = fp->inputs[j].interpolate;
|
||||
if ((interp == TGSI_INTERPOLATE_CONSTANT) ||
|
||||
((interp == TGSI_INTERPOLATE_COLOR) && emit->rasterflat)) {
|
||||
|
|
|
|||
|
|
@ -214,4 +214,62 @@ void ir3_shader_destroy(struct ir3_shader *shader);
|
|||
struct ir3_shader_variant * ir3_shader_variant(struct ir3_shader *shader,
|
||||
struct ir3_shader_key key);
|
||||
|
||||
/*
|
||||
* Helper/util:
|
||||
*/
|
||||
|
||||
static inline int
|
||||
ir3_find_output(const struct ir3_shader_variant *so, ir3_semantic semantic)
|
||||
{
|
||||
int j;
|
||||
|
||||
for (j = 0; j < so->outputs_count; j++)
|
||||
if (so->outputs[j].semantic == semantic)
|
||||
return j;
|
||||
|
||||
/* it seems optional to have a OUT.BCOLOR[n] for each OUT.COLOR[n]
|
||||
* in the vertex shader.. but the fragment shader doesn't know this
|
||||
* so it will always have both IN.COLOR[n] and IN.BCOLOR[n]. So
|
||||
* at link time if there is no matching OUT.BCOLOR[n], we must map
|
||||
* OUT.COLOR[n] to IN.BCOLOR[n]. And visa versa if there is only
|
||||
* a OUT.BCOLOR[n] but no matching OUT.COLOR[n]
|
||||
*/
|
||||
if (sem2name(semantic) == TGSI_SEMANTIC_BCOLOR) {
|
||||
unsigned idx = sem2idx(semantic);
|
||||
semantic = ir3_semantic_name(TGSI_SEMANTIC_COLOR, idx);
|
||||
} else if (sem2name(semantic) == TGSI_SEMANTIC_COLOR) {
|
||||
unsigned idx = sem2idx(semantic);
|
||||
semantic = ir3_semantic_name(TGSI_SEMANTIC_BCOLOR, idx);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (j = 0; j < so->outputs_count; j++)
|
||||
if (so->outputs[j].semantic == semantic)
|
||||
return j;
|
||||
|
||||
debug_assert(0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
ir3_next_varying(const struct ir3_shader_variant *so, int i)
|
||||
{
|
||||
while (++i < so->inputs_count)
|
||||
if (so->inputs[i].compmask && so->inputs[i].bary)
|
||||
break;
|
||||
return i;
|
||||
}
|
||||
|
||||
static inline uint32_t
|
||||
ir3_find_output_regid(const struct ir3_shader_variant *so, ir3_semantic semantic)
|
||||
{
|
||||
int j;
|
||||
for (j = 0; j < so->outputs_count; j++)
|
||||
if (so->outputs[j].semantic == semantic)
|
||||
return so->outputs[j].regid;
|
||||
return regid(63, 0);
|
||||
}
|
||||
|
||||
#endif /* IR3_SHADER_H_ */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue