xf86-video-intel: 2 commits - src/sna/kgem.c src/sna/sna_blt.c src/sna/sna_render.h

Chris Wilson ickle at kemper.freedesktop.org
Mon Nov 4 22:28:44 CET 2013


 src/sna/kgem.c       |   12 ++++++------
 src/sna/sna_blt.c    |   48 ++++++++++++++++++++++++++++++++++++++++++------
 src/sna/sna_render.h |    1 +
 3 files changed, 49 insertions(+), 12 deletions(-)

New commits:
commit a0d1de962a8107cfcaefd82eb8ffaf3e4da0e130
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Nov 4 16:45:00 2013 +0000

    sna: Check for loss of state after setting up a fill BLT op
    
    If we install a BLT fill operation early in the drawing sequence (i.e.
    before calling a mi routine), we may lose our state to delayed
    initialisation of sources and so need to subsequently recheck.
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/sna_blt.c b/src/sna/sna_blt.c
index b4f7d0e..576b785 100644
--- a/src/sna/sna_blt.c
+++ b/src/sna/sna_blt.c
@@ -156,6 +156,7 @@ static bool sna_blt_fill_init(struct sna *sna,
 
 	blt->pixel = pixel;
 	blt->bpp = bpp;
+	blt->alu = alu;
 
 	kgem_set_mode(kgem, KGEM_BLT, bo);
 	if (!kgem_check_batch(kgem, 14) ||
@@ -233,11 +234,14 @@ noinline static void sna_blt_fill_begin(struct sna *sna,
 	struct kgem *kgem = &sna->kgem;
 	uint32_t *b;
 
-	_kgem_submit(kgem);
-	_kgem_set_mode(kgem, KGEM_BLT);
+	if (kgem->nreloc) {
+		_kgem_submit(kgem);
+		_kgem_set_mode(kgem, KGEM_BLT);
+		assert(kgem->nbatch == 0);
+	}
 
-	assert(kgem->nbatch == 0);
-	b = kgem->batch;
+	assert(kgem->mode == KGEM_BLT);
+	b = kgem->batch + kgem->nbatch;
 	if (sna->kgem.gen >= 0100) {
 		b[0] = XY_SETUP_MONO_PATTERN_SL_BLT | 8;
 		if (blt->bpp == 32)
@@ -255,7 +259,7 @@ noinline static void sna_blt_fill_begin(struct sna *sna,
 		b[7] = blt->pixel;
 		b[9] = 0;
 		b[9] = 0;
-		kgem->nbatch = 10;
+		kgem->nbatch += 10;
 	} else {
 		b[0] = XY_SETUP_MONO_PATTERN_SL_BLT | 7;
 		if (blt->bpp == 32)
@@ -272,7 +276,7 @@ noinline static void sna_blt_fill_begin(struct sna *sna,
 		b[6] = blt->pixel;
 		b[7] = 0;
 		b[8] = 0;
-		kgem->nbatch = 9;
+		kgem->nbatch += 9;
 	}
 }
 
@@ -1067,6 +1071,7 @@ static void blt_composite_fill_boxes_no_offset__thread(struct sna *sna,
 	DBG(("%s: %08x x %d\n", __FUNCTION__, blt->pixel, nbox));
 
 	sna_vertex_lock(&sna->render);
+	assert(kgem->mode == KGEM_BLT);
 	if (!kgem_check_batch(kgem, 3)) {
 		sna_vertex_wait__locked(&sna->render);
 		sna_blt_fill_begin(sna, blt);
@@ -1177,6 +1182,7 @@ static void blt_composite_fill_boxes__thread(struct sna *sna,
 	DBG(("%s: %08x x %d\n", __FUNCTION__, blt->pixel, nbox));
 
 	sna_vertex_lock(&sna->render);
+	assert(kgem->mode == KGEM_BLT);
 	if (!kgem_check_batch(kgem, 3)) {
 		sna_vertex_wait__locked(&sna->render);
 		sna_blt_fill_begin(sna, blt);
@@ -2730,6 +2736,16 @@ static void sna_blt_fill_op_blt(struct sna *sna,
 				int16_t x, int16_t y,
 				int16_t width, int16_t height)
 {
+	if (sna->blt_state.fill_bo != op->base.u.blt.bo[0]->unique_id) {
+		const struct sna_blt_state *blt = &op->base.u.blt;
+
+		sna_blt_fill_begin(sna, blt);
+
+		sna->blt_state.fill_bo = blt->bo[0]->unique_id;
+		sna->blt_state.fill_pixel = blt->pixel;
+		sna->blt_state.fill_alu = blt->alu;
+	}
+
 	sna_blt_fill_one(sna, &op->base.u.blt, x, y, width, height);
 }
 
@@ -2737,6 +2753,16 @@ fastcall static void sna_blt_fill_op_box(struct sna *sna,
 					 const struct sna_fill_op *op,
 					 const BoxRec *box)
 {
+	if (sna->blt_state.fill_bo != op->base.u.blt.bo[0]->unique_id) {
+		const struct sna_blt_state *blt = &op->base.u.blt;
+
+		sna_blt_fill_begin(sna, blt);
+
+		sna->blt_state.fill_bo = blt->bo[0]->unique_id;
+		sna->blt_state.fill_pixel = blt->pixel;
+		sna->blt_state.fill_alu = blt->alu;
+	}
+
 	_sna_blt_fill_box(sna, &op->base.u.blt, box);
 }
 
@@ -2745,6 +2771,16 @@ fastcall static void sna_blt_fill_op_boxes(struct sna *sna,
 					   const BoxRec *box,
 					   int nbox)
 {
+	if (sna->blt_state.fill_bo != op->base.u.blt.bo[0]->unique_id) {
+		const struct sna_blt_state *blt = &op->base.u.blt;
+
+		sna_blt_fill_begin(sna, blt);
+
+		sna->blt_state.fill_bo = blt->bo[0]->unique_id;
+		sna->blt_state.fill_pixel = blt->pixel;
+		sna->blt_state.fill_alu = blt->alu;
+	}
+
 	_sna_blt_fill_boxes(sna, &op->base.u.blt, box, nbox);
 }
 
diff --git a/src/sna/sna_render.h b/src/sna/sna_render.h
index c7ba191..38bde39 100644
--- a/src/sna/sna_render.h
+++ b/src/sna/sna_render.h
@@ -113,6 +113,7 @@ struct sna_composite_op {
 			uint32_t inplace :1;
 			uint32_t overwrites:1;
 			uint32_t bpp : 6;
+			uint32_t alu : 4;
 
 			uint32_t cmd;
 			uint32_t br13;
commit fcd081ca77c917c7000f8ab4668e5c863381a4f3
Author: Chris Wilson <chris at chris-wilson.co.uk>
Date:   Mon Nov 4 15:17:51 2013 +0000

    sna: s/active/busy/ to silence compiler warning
    
    kgem.c: In function 'kgem_check_bo':
    kgem.c:4768:7: warning: declaration of 'active' shadows a global declaration [-Wshadow]
    kgem.c:692:21: warning: shadowed declaration is here [-Wshadow]
    kgem.c: In function 'kgem_check_many_bo_fenced':
    kgem.c:4907:7: warning: declaration of 'active' shadows a global declaration [-Wshadow]
    kgem.c:692:21: warning: shadowed declaration is here [-Wshadow]
    
    Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>

diff --git a/src/sna/kgem.c b/src/sna/kgem.c
index cf1262d..21f958c 100644
--- a/src/sna/kgem.c
+++ b/src/sna/kgem.c
@@ -4765,7 +4765,7 @@ bool kgem_check_bo(struct kgem *kgem, ...)
 	int num_exec = 0;
 	int num_pages = 0;
 	bool flush = false;
-	bool active = true;
+	bool busy = true;
 
 	va_start(ap, kgem);
 	while ((bo = va_arg(ap, struct kgem_bo *))) {
@@ -4783,7 +4783,7 @@ bool kgem_check_bo(struct kgem *kgem, ...)
 		num_exec++;
 
 		flush |= bo->flush;
-		active &= bo->rq != NULL;
+		busy &= bo->rq != NULL;
 	}
 	va_end(ap);
 
@@ -4806,7 +4806,7 @@ bool kgem_check_bo(struct kgem *kgem, ...)
 			return false;
 	}
 
-	if (active)
+	if (busy)
 		return true;
 
 	return kgem_flush(kgem, flush);
@@ -4904,7 +4904,7 @@ bool kgem_check_many_bo_fenced(struct kgem *kgem, ...)
 	int num_pages = 0;
 	int fenced_size = 0;
 	bool flush = false;
-	bool active = true;
+	bool busy = true;
 
 	va_start(ap, kgem);
 	while ((bo = va_arg(ap, struct kgem_bo *))) {
@@ -4938,7 +4938,7 @@ bool kgem_check_many_bo_fenced(struct kgem *kgem, ...)
 		}
 
 		flush |= bo->flush;
-		active &= bo->rq != NULL;
+		busy &= bo->rq != NULL;
 	}
 	va_end(ap);
 
@@ -4977,7 +4977,7 @@ bool kgem_check_many_bo_fenced(struct kgem *kgem, ...)
 			return false;
 	}
 
-	if (active)
+	if (busy)
 		return true;
 
 	return kgem_flush(kgem, flush);


More information about the xorg-commit mailing list