freedreno/a6xx: Write multiple regs for SP_VS_OUT_REG and SP_VS_VPC_DST_REG
Compute the number of writes up front. Signed-off-by: Kristian H. Kristensen <hoegsberg@google.com> Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
@@ -352,11 +352,11 @@ setup_stateobj(struct fd_ringbuffer *ring, struct fd_screen *screen,
|
|||||||
setup_stream_out(state, vs, &l);
|
setup_stream_out(state, vs, &l);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0, j = 0; (i < 16) && (j < l.cnt); i++) {
|
debug_assert(l.cnt < 32);
|
||||||
|
OUT_PKT4(ring, REG_A6XX_SP_VS_OUT_REG(0), DIV_ROUND_UP(l.cnt, 2));
|
||||||
|
for (j = 0; j < l.cnt; ) {
|
||||||
uint32_t reg = 0;
|
uint32_t reg = 0;
|
||||||
|
|
||||||
OUT_PKT4(ring, REG_A6XX_SP_VS_OUT_REG(i), 1);
|
|
||||||
|
|
||||||
reg |= A6XX_SP_VS_OUT_REG_A_REGID(l.var[j].regid);
|
reg |= A6XX_SP_VS_OUT_REG_A_REGID(l.var[j].regid);
|
||||||
reg |= A6XX_SP_VS_OUT_REG_A_COMPMASK(l.var[j].compmask);
|
reg |= A6XX_SP_VS_OUT_REG_A_COMPMASK(l.var[j].compmask);
|
||||||
j++;
|
j++;
|
||||||
@@ -368,11 +368,10 @@ setup_stateobj(struct fd_ringbuffer *ring, struct fd_screen *screen,
|
|||||||
OUT_RING(ring, reg);
|
OUT_RING(ring, reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0, j = 0; (i < 8) && (j < l.cnt); i++) {
|
OUT_PKT4(ring, REG_A6XX_SP_VS_VPC_DST_REG(0), DIV_ROUND_UP(l.cnt, 4));
|
||||||
|
for (j = 0; j < l.cnt; ) {
|
||||||
uint32_t reg = 0;
|
uint32_t reg = 0;
|
||||||
|
|
||||||
OUT_PKT4(ring, REG_A6XX_SP_VS_VPC_DST_REG(i), 1);
|
|
||||||
|
|
||||||
reg |= A6XX_SP_VS_VPC_DST_REG_OUTLOC0(l.var[j++].loc);
|
reg |= A6XX_SP_VS_VPC_DST_REG_OUTLOC0(l.var[j++].loc);
|
||||||
reg |= A6XX_SP_VS_VPC_DST_REG_OUTLOC1(l.var[j++].loc);
|
reg |= A6XX_SP_VS_VPC_DST_REG_OUTLOC1(l.var[j++].loc);
|
||||||
reg |= A6XX_SP_VS_VPC_DST_REG_OUTLOC2(l.var[j++].loc);
|
reg |= A6XX_SP_VS_VPC_DST_REG_OUTLOC2(l.var[j++].loc);
|
||||||
|
Reference in New Issue
Block a user