summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-01-18 12:59:48 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2012-01-18 15:27:40 +0000
commitf3da610eadd1f560812603ab1a72c2e173679689 (patch)
tree9b99b33acb34443218ce266ce4ef8774296c2107
parent6d31cb2d943be456f4ebaa663275c6a939013d9e (diff)
sna: Prevent switching rings with render disabled
We fudge forced used of the BLT ring unless we install a render backend and so we must also prevent the ring from being reset when the GPU is idle. Therefore we make handing the ring status a backend function. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
-rw-r--r--src/sna/gen6_render.c8
-rw-r--r--src/sna/gen7_render.c8
-rw-r--r--src/sna/kgem.c4
-rw-r--r--src/sna/kgem.h2
-rw-r--r--src/sna/sna.h5
-rw-r--r--src/sna/sna_render.c7
6 files changed, 27 insertions, 7 deletions
diff --git a/src/sna/gen6_render.c b/src/sna/gen6_render.c
index 8d3c0319..86ebf9d9 100644
--- a/src/sna/gen6_render.c
+++ b/src/sna/gen6_render.c
@@ -3886,6 +3886,13 @@ gen6_render_context_switch(struct kgem *kgem,
kgem->ring = new_mode;
}
+static void
+gen6_render_retire(struct kgem *kgem)
+{
+ if (kgem->ring && (kgem->has_semaphores || !kgem->need_retire))
+ kgem->ring = kgem->mode;
+}
+
static void gen6_render_reset(struct sna *sna)
{
sna->render_state.gen6.needs_invariant = TRUE;
@@ -3958,6 +3965,7 @@ Bool gen6_render_init(struct sna *sna)
return FALSE;
sna->kgem.context_switch = gen6_render_context_switch;
+ sna->kgem.retire = gen6_render_retire;
sna->render.composite = gen6_render_composite;
#if !NO_COMPOSITE_SPANS
diff --git a/src/sna/gen7_render.c b/src/sna/gen7_render.c
index 75caa6fc..e73629d5 100644
--- a/src/sna/gen7_render.c
+++ b/src/sna/gen7_render.c
@@ -3848,6 +3848,13 @@ gen7_render_context_switch(struct kgem *kgem,
kgem->ring = new_mode;
}
+static void
+gen7_render_retire(struct kgem *kgem)
+{
+ if (kgem->ring && (kgem->has_semaphores || !kgem->need_retire))
+ kgem->ring = kgem->mode;
+}
+
static void gen7_render_reset(struct sna *sna)
{
sna->render_state.gen7.needs_invariant = TRUE;
@@ -3920,6 +3927,7 @@ Bool gen7_render_init(struct sna *sna)
return FALSE;
sna->kgem.context_switch = gen7_render_context_switch;
+ sna->kgem.retire = gen7_render_retire;
sna->render.composite = gen7_render_composite;
#if !NO_COMPOSITE_SPANS
diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index 01521a9a..1866fcd6 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -1125,10 +1125,10 @@ bool kgem_retire(struct kgem *kgem)
}
kgem->need_retire = !list_is_empty(&kgem->requests);
- if (kgem->ring && (kgem->has_semaphores || !kgem->need_retire))
- kgem->ring = kgem->mode;
DBG(("%s -- need_retire=%d\n", __FUNCTION__, kgem->need_retire));
+ kgem->retire(kgem);
+
return retired;
}
diff --git a/src/sna/kgem.h b/src/sna/kgem.h
index 621e3cd5..92b7cd6b 100644
--- a/src/sna/kgem.h
+++ b/src/sna/kgem.h
@@ -158,6 +158,8 @@ struct kgem {
uint32_t partial_buffer_size;
void (*context_switch)(struct kgem *kgem, int new_mode);
+ void (*retire)(struct kgem *kgem);
+
uint32_t batch[4*1024];
struct drm_i915_gem_exec_object2 exec[256];
struct drm_i915_gem_relocation_entry reloc[384];
diff --git a/src/sna/sna.h b/src/sna/sna.h
index 2f79ac63..247cb46c 100644
--- a/src/sna/sna.h
+++ b/src/sna/sna.h
@@ -374,11 +374,6 @@ void sna_dri_close(struct sna *sna, ScreenPtr pScreen);
extern Bool sna_crtc_on(xf86CrtcPtr crtc);
int sna_crtc_to_pipe(xf86CrtcPtr crtc);
-/* sna_render.c */
-void sna_kgem_reset(struct kgem *kgem);
-void sna_kgem_flush(struct kgem *kgem);
-void sna_kgem_context_switch(struct kgem *kgem, int new_mode);
-
CARD32 sna_format_for_depth(int depth);
CARD32 sna_render_format_for_depth(int depth);
diff --git a/src/sna/sna_render.c b/src/sna/sna_render.c
index a9a170a1..7b6661ef 100644
--- a/src/sna/sna_render.c
+++ b/src/sna/sna_render.c
@@ -244,6 +244,12 @@ no_render_context_switch(struct kgem *kgem,
}
static void
+no_render_retire(struct kgem *kgem)
+{
+ (void)kgem;
+}
+
+static void
no_render_fini(struct sna *sna)
{
(void)sna;
@@ -273,6 +279,7 @@ void no_render_init(struct sna *sna)
render->fini = no_render_fini;
sna->kgem.context_switch = no_render_context_switch;
+ sna->kgem.retire = no_render_retire;
if (sna->kgem.gen >= 60)
sna->kgem.ring = KGEM_BLT;
}