freedreno/a6xx: move VS driverparams to it's own stateobj
If driver-params are required, we really should emit it on every draw for correctness. And if not required, we should emit a DISABLE so that un-applied state updates from previous draws don't corrupt the const state. Signed-off-by: Rob Clark <robdclark@chromium.org>
This commit is contained in:
@@ -934,9 +934,6 @@ fd6_emit_state(struct fd_ringbuffer *ring, struct fd6_emit *emit)
|
|||||||
ir3_emit_image_dims(ctx->screen, vp, vsconstobj,
|
ir3_emit_image_dims(ctx->screen, vp, vsconstobj,
|
||||||
&ctx->shaderimg[PIPE_SHADER_VERTEX]);
|
&ctx->shaderimg[PIPE_SHADER_VERTEX]);
|
||||||
|
|
||||||
if (ir3_needs_vs_driver_params(vp))
|
|
||||||
ir3_emit_vs_driver_params(vp, vsconstobj, ctx, emit->info);
|
|
||||||
|
|
||||||
fd6_emit_take_group(emit, vsconstobj, FD6_GROUP_VS_CONST, 0x7);
|
fd6_emit_take_group(emit, vsconstobj, FD6_GROUP_VS_CONST, 0x7);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -956,6 +953,16 @@ fd6_emit_state(struct fd_ringbuffer *ring, struct fd6_emit *emit)
|
|||||||
fd6_emit_take_group(emit, fsconstobj, FD6_GROUP_FS_CONST, 0x6);
|
fd6_emit_take_group(emit, fsconstobj, FD6_GROUP_FS_CONST, 0x6);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* if driver-params are needed, emit each time: */
|
||||||
|
if (ir3_needs_vs_driver_params(vp)) {
|
||||||
|
struct fd_ringbuffer *dpconstobj = fd_submit_new_ringbuffer(
|
||||||
|
ctx->batch->submit, IR3_DP_VS_COUNT * 4, FD_RINGBUFFER_STREAMING);
|
||||||
|
ir3_emit_vs_driver_params(vp, dpconstobj, ctx, emit->info);
|
||||||
|
fd6_emit_take_group(emit, dpconstobj, FD6_GROUP_VS_DRIVER_PARAMS, 0x7);
|
||||||
|
} else {
|
||||||
|
fd6_emit_take_group(emit, NULL, FD6_GROUP_VS_DRIVER_PARAMS, 0x7);
|
||||||
|
}
|
||||||
|
|
||||||
struct ir3_stream_output_info *info = &vp->shader->stream_output;
|
struct ir3_stream_output_info *info = &vp->shader->stream_output;
|
||||||
if (info->num_outputs)
|
if (info->num_outputs)
|
||||||
fd6_emit_streamout(ring, emit, info);
|
fd6_emit_streamout(ring, emit, info);
|
||||||
@@ -1054,7 +1061,8 @@ fd6_emit_state(struct fd_ringbuffer *ring, struct fd6_emit *emit)
|
|||||||
OUT_PKT7(ring, CP_SET_DRAW_STATE, 3 * emit->num_groups);
|
OUT_PKT7(ring, CP_SET_DRAW_STATE, 3 * emit->num_groups);
|
||||||
for (unsigned i = 0; i < emit->num_groups; i++) {
|
for (unsigned i = 0; i < emit->num_groups; i++) {
|
||||||
struct fd6_state_group *g = &emit->groups[i];
|
struct fd6_state_group *g = &emit->groups[i];
|
||||||
unsigned n = fd_ringbuffer_size(g->stateobj) / 4;
|
unsigned n = g->stateobj ?
|
||||||
|
fd_ringbuffer_size(g->stateobj) / 4 : 0;
|
||||||
|
|
||||||
if (n == 0) {
|
if (n == 0) {
|
||||||
OUT_RING(ring, CP_SET_DRAW_STATE__0_COUNT(0) |
|
OUT_RING(ring, CP_SET_DRAW_STATE__0_COUNT(0) |
|
||||||
@@ -1070,6 +1078,7 @@ fd6_emit_state(struct fd_ringbuffer *ring, struct fd6_emit *emit)
|
|||||||
OUT_RB(ring, g->stateobj);
|
OUT_RB(ring, g->stateobj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (g->stateobj)
|
||||||
fd_ringbuffer_del(g->stateobj);
|
fd_ringbuffer_del(g->stateobj);
|
||||||
}
|
}
|
||||||
emit->num_groups = 0;
|
emit->num_groups = 0;
|
||||||
|
@@ -51,6 +51,7 @@ enum fd6_state_id {
|
|||||||
FD6_GROUP_VBO,
|
FD6_GROUP_VBO,
|
||||||
FD6_GROUP_VS_CONST,
|
FD6_GROUP_VS_CONST,
|
||||||
FD6_GROUP_FS_CONST,
|
FD6_GROUP_FS_CONST,
|
||||||
|
FD6_GROUP_VS_DRIVER_PARAMS,
|
||||||
FD6_GROUP_VS_TEX,
|
FD6_GROUP_VS_TEX,
|
||||||
FD6_GROUP_FS_TEX,
|
FD6_GROUP_FS_TEX,
|
||||||
FD6_GROUP_IBO,
|
FD6_GROUP_IBO,
|
||||||
|
Reference in New Issue
Block a user