sna: Refine check for an unset context switch
So it appears that we end up performing a context switch on an empty batch, but already has a mode. This is caught later, too late, by assertions. However, we can change the guards slightly to prevent those assertions without altering the code too greatly. And I can then think how to detect where we are setting a mode on the batch but doing no work - which is likely masking a bigger bug. Reported-by: Jiri Slaby <jirislaby@gmail.com> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=47597 Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
parent
6c50cf4809
commit
f522fbe7c9
|
|
@ -3214,7 +3214,7 @@ gen2_render_context_switch(struct kgem *kgem,
|
|||
{
|
||||
struct sna *sna = container_of(kgem, struct sna, kgem);
|
||||
|
||||
if (!kgem->mode)
|
||||
if (!kgem->nbatch)
|
||||
return;
|
||||
|
||||
/* Reload BLT registers following a lost context */
|
||||
|
|
|
|||
|
|
@ -3571,7 +3571,7 @@ static void
|
|||
gen5_render_context_switch(struct kgem *kgem,
|
||||
int new_mode)
|
||||
{
|
||||
if (!kgem->mode)
|
||||
if (!kgem->nbatch)
|
||||
return;
|
||||
|
||||
/* WaNonPipelinedStateCommandFlush
|
||||
|
|
|
|||
|
|
@ -2405,7 +2405,7 @@ static bool prefer_blt_ring(struct sna *sna)
|
|||
return sna->kgem.ring != KGEM_RENDER;
|
||||
}
|
||||
|
||||
static bool can_switch_to_blt(struct sna *sna)
|
||||
inline static bool can_switch_to_blt(struct sna *sna)
|
||||
{
|
||||
if (sna->kgem.ring != KGEM_RENDER)
|
||||
return true;
|
||||
|
|
@ -4191,13 +4191,10 @@ static void
|
|||
gen6_render_context_switch(struct kgem *kgem,
|
||||
int new_mode)
|
||||
{
|
||||
if (!new_mode)
|
||||
return;
|
||||
|
||||
DBG(("%s: from %d to %d\n", __FUNCTION__, kgem->mode, new_mode));
|
||||
|
||||
if (kgem->mode)
|
||||
kgem_submit(kgem);
|
||||
if (kgem->nbatch) {
|
||||
DBG(("%s: from %d to %d\n", __FUNCTION__, kgem->mode, new_mode));
|
||||
_kgem_submit(kgem);
|
||||
}
|
||||
|
||||
kgem->ring = new_mode;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4252,13 +4252,10 @@ static void
|
|||
gen7_render_context_switch(struct kgem *kgem,
|
||||
int new_mode)
|
||||
{
|
||||
if (!new_mode)
|
||||
return;
|
||||
|
||||
if (kgem->mode) {
|
||||
if (kgem->nbatch) {
|
||||
DBG(("%s: switch rings %d -> %d\n",
|
||||
__FUNCTION__, kgem->mode, new_mode));
|
||||
kgem_submit(kgem);
|
||||
_kgem_submit(kgem);
|
||||
}
|
||||
|
||||
kgem->ring = new_mode;
|
||||
|
|
|
|||
|
|
@ -354,7 +354,7 @@ static inline void kgem_set_mode(struct kgem *kgem,
|
|||
#endif
|
||||
|
||||
if (kgem->nexec && bo->exec == NULL && kgem_ring_is_idle(kgem, kgem->ring))
|
||||
kgem_submit(kgem);
|
||||
_kgem_submit(kgem);
|
||||
|
||||
if (kgem->mode == mode)
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -246,7 +246,7 @@ static void
|
|||
no_render_context_switch(struct kgem *kgem,
|
||||
int new_mode)
|
||||
{
|
||||
if (!kgem->mode)
|
||||
if (!kgem->nbatch)
|
||||
return;
|
||||
|
||||
if (kgem_ring_is_idle(kgem, kgem->ring)) {
|
||||
|
|
@ -254,7 +254,6 @@ no_render_context_switch(struct kgem *kgem,
|
|||
_kgem_submit(kgem);
|
||||
}
|
||||
|
||||
(void)kgem;
|
||||
(void)new_mode;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue