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:
Chris Wilson 2012-12-17 23:04:25 +00:00
parent 6c50cf4809
commit f522fbe7c9
6 changed files with 11 additions and 18 deletions

View File

@ -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 */

View File

@ -3571,7 +3571,7 @@ static void
gen5_render_context_switch(struct kgem *kgem,
int new_mode)
{
if (!kgem->mode)
if (!kgem->nbatch)
return;
/* WaNonPipelinedStateCommandFlush

View File

@ -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;
}

View File

@ -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;

View File

@ -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;

View File

@ -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;
}