mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 22:08:26 +02:00
radv/gfx10: implement a bug workaround for NGG -> legacy transitions
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
This commit is contained in:
parent
29cca5f381
commit
0e1724af61
2 changed files with 21 additions and 2 deletions
|
|
@ -3626,6 +3626,20 @@ void radv_CmdBindPipeline(
|
|||
/* Prefetch all pipeline shaders at first draw time. */
|
||||
cmd_buffer->state.prefetch_L2_mask |= RADV_PREFETCH_SHADERS;
|
||||
|
||||
if ((cmd_buffer->device->physical_device->rad_info.family == CHIP_NAVI10 ||
|
||||
cmd_buffer->device->physical_device->rad_info.family == CHIP_NAVI12 ||
|
||||
cmd_buffer->device->physical_device->rad_info.family == CHIP_NAVI14) &&
|
||||
cmd_buffer->state.emitted_pipeline &&
|
||||
radv_pipeline_has_ngg(cmd_buffer->state.emitted_pipeline) &&
|
||||
!radv_pipeline_has_ngg(cmd_buffer->state.pipeline)) {
|
||||
/* Transitioning from NGG to legacy GS requires
|
||||
* VGT_FLUSH on Navi10-14. VGT_FLUSH is also emitted
|
||||
* at the beginning of IBs when legacy GS ring pointers
|
||||
* are set.
|
||||
*/
|
||||
cmd_buffer->state.flush_bits |= RADV_CMD_FLAG_VGT_FLUSH;
|
||||
}
|
||||
|
||||
radv_bind_dynamic_state(cmd_buffer, &pipeline->dynamic_state);
|
||||
radv_bind_streamout_state(cmd_buffer, pipeline);
|
||||
|
||||
|
|
|
|||
|
|
@ -878,8 +878,7 @@ gfx10_cs_emit_cache_flush(struct radeon_cmdbuf *cs,
|
|||
unsigned cb_db_event = 0;
|
||||
|
||||
/* We don't need these. */
|
||||
assert(!(flush_bits & (RADV_CMD_FLAG_VGT_FLUSH |
|
||||
RADV_CMD_FLAG_VGT_STREAMOUT_SYNC)));
|
||||
assert(!(flush_bits & (RADV_CMD_FLAG_VGT_STREAMOUT_SYNC)));
|
||||
|
||||
if (flush_bits & RADV_CMD_FLAG_INV_ICACHE)
|
||||
gcr_cntl |= S_586_GLI_INV(V_586_GLI_ALL);
|
||||
|
|
@ -998,6 +997,12 @@ gfx10_cs_emit_cache_flush(struct radeon_cmdbuf *cs,
|
|||
*flush_cnt, 0xffffffff);
|
||||
}
|
||||
|
||||
/* VGT state sync */
|
||||
if (flush_bits & RADV_CMD_FLAG_VGT_FLUSH) {
|
||||
radeon_emit(cs, PKT3(PKT3_EVENT_WRITE, 0, 0));
|
||||
radeon_emit(cs, EVENT_TYPE(V_028A90_VGT_FLUSH) | EVENT_INDEX(0));
|
||||
}
|
||||
|
||||
/* Ignore fields that only modify the behavior of other fields. */
|
||||
if (gcr_cntl & C_586_GL1_RANGE & C_586_GL2_RANGE & C_586_SEQ) {
|
||||
/* Flush caches and wait for the caches to assert idle.
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue