On Thu, Aug 20, 2009 at 4:59 AM, Maciej Cencora<m.cenc...@gmail.com> wrote:
> 2009/8/20 Alex Deucher <alexdeuc...@gmail.com>:
>> Previous drm patches had some problems.  Untested.
>>
>> Alex
>>
>> ------------------------------------------------------------------------------
>> Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day
>> trial. Simplify your report design, integration and deployment - and focus on
>> what you do best, core application coding. Discover what's new with
>> Crystal Reports now.  http://p.sf.net/sfu/bobj-july
>> --
>> _______________________________________________
>> Dri-devel mailing list
>> Dri-devel@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/dri-devel
>>
>>
>
> I haven't tested these yet, but I have two comments:
> - please set default num_z_pipes to 2 when dri.minor < 31 (using
> rv530_emit_query_finish_single_z on non-KMS seems to trigger GPU hang
> on my 2 pipe RV535, and using rv530_emit_query_finish_double_z on
> single Z pipe card results in incorrect values - as Dave has
> reported),
> - r300 variable is unused in rv530_emit_query_finish_double_z function.

Updated.

Alex
From c784772c0c1360211b5ef546e4552b4e19d22f5e Mon Sep 17 00:00:00 2001
From: Alex Deucher <alexdeuc...@gmail.com>
Date: Thu, 20 Aug 2009 10:56:35 -0400
Subject: [PATCH] r300: add support for getting Z pipe info from drm

Needed for occulsion queries on rv530 chips

Signed-off-by: Alex Deucher <alexdeuc...@gmail.com>
---
 src/mesa/drivers/dri/r300/r300_context.c          |   24 +++++++-------------
 src/mesa/drivers/dri/r300/r300_context.h          |    1 -
 src/mesa/drivers/dri/radeon/radeon_bocs_wrapper.h |    8 +++++++
 src/mesa/drivers/dri/radeon/radeon_screen.c       |   18 +++++++++++++++
 src/mesa/drivers/dri/radeon/radeon_screen.h       |    1 +
 5 files changed, 36 insertions(+), 16 deletions(-)

diff --git a/src/mesa/drivers/dri/r300/r300_context.c b/src/mesa/drivers/dri/r300/r300_context.c
index ca8021d..6f7f577 100644
--- a/src/mesa/drivers/dri/r300/r300_context.c
+++ b/src/mesa/drivers/dri/r300/r300_context.c
@@ -239,8 +239,8 @@ static void r300_emit_query_finish(radeonContextPtr radeon)
 	struct radeon_query_object *query = radeon->query.current;
 	BATCH_LOCALS(radeon);
 
-	BEGIN_BATCH_NO_AUTOSTATE(3 * 2 *r300->num_z_pipes + 2);
-	switch (r300->num_z_pipes) {
+	BEGIN_BATCH_NO_AUTOSTATE(3 * 2 *r300->radeon.radeonScreen->num_gb_pipes + 2);
+	switch (r300->radeon.radeonScreen->num_gb_pipes) {
 	case 4:
 		OUT_BATCH_REGVAL(R300_SU_REG_DEST, R300_RASTER_PIPE_SELECT_3);
 		OUT_BATCH_REGSEQ(R300_ZB_ZPASS_ADDR, 1);
@@ -266,7 +266,7 @@ static void r300_emit_query_finish(radeonContextPtr radeon)
 	}
 	OUT_BATCH_REGVAL(R300_SU_REG_DEST, R300_RASTER_PIPE_SELECT_ALL);
 	END_BATCH();
-	query->curr_offset += r300->num_z_pipes * sizeof(uint32_t);
+	query->curr_offset += r300->radeon.radeonScreen->num_gb_pipes * sizeof(uint32_t);
 	assert(query->curr_offset < RADEON_QUERY_PAGE_SIZE);
 	query->emitted_begin = GL_FALSE;
 }
@@ -288,10 +288,8 @@ static void rv530_emit_query_finish_single_z(radeonContextPtr radeon)
 	query->emitted_begin = GL_FALSE;
 }
 
-#if 0
 static void rv530_emit_query_finish_double_z(radeonContextPtr radeon)
 {
-	r300ContextPtr r300 = (r300ContextPtr)radeon;
 	BATCH_LOCALS(radeon);
 	struct radeon_query_object *query = radeon->query.current;
 
@@ -309,7 +307,6 @@ static void rv530_emit_query_finish_double_z(radeonContextPtr radeon)
 	assert(query->curr_offset < RADEON_QUERY_PAGE_SIZE);
 	query->emitted_begin = GL_FALSE;
 }
-#endif
 
 static void r300_init_vtbl(radeonContextPtr radeon)
 {
@@ -319,11 +316,12 @@ static void r300_init_vtbl(radeonContextPtr radeon)
 	radeon->vtbl.swtcl_flush = r300_swtcl_flush;
 	radeon->vtbl.pre_emit_atoms = r300_vtbl_pre_emit_atoms;
 	radeon->vtbl.fallback = r300_fallback;
-	if (radeon->radeonScreen->chip_family == CHIP_FAMILY_RV530)
-		/* single Z gives me correct results on my hw need to check if we ever need
-		 * double z */
-		radeon->vtbl.emit_query_finish = rv530_emit_query_finish_single_z;
-	else
+	if (radeon->radeonScreen->chip_family == CHIP_FAMILY_RV530) {
+		if (radeon->radeonScreen->num_z_pipes == 2)
+			radeon->vtbl.emit_query_finish = rv530_emit_query_finish_double_z;
+		else
+			radeon->vtbl.emit_query_finish = rv530_emit_query_finish_single_z;
+	} else
 		radeon->vtbl.emit_query_finish = r300_emit_query_finish;
 }
 
@@ -397,10 +395,6 @@ static void r300InitConstValues(GLcontext *ctx, radeonScreenPtr screen)
 		ctx->Const.FragmentProgram.MaxNativeAddressRegs = 0;
 	}
 
-	if (r300->radeon.radeonScreen->chip_family == CHIP_FAMILY_RV530)
-		r300->num_z_pipes = 2;
-	else
-		r300->num_z_pipes = r300->radeon.radeonScreen->num_gb_pipes;
 }
 
 static void r300ParseOptions(r300ContextPtr r300, radeonScreenPtr screen)
diff --git a/src/mesa/drivers/dri/r300/r300_context.h b/src/mesa/drivers/dri/r300/r300_context.h
index 339b304..a8fe508 100644
--- a/src/mesa/drivers/dri/r300/r300_context.h
+++ b/src/mesa/drivers/dri/r300/r300_context.h
@@ -529,7 +529,6 @@ struct r300_context {
 	uint32_t fallback;
 
 	DECLARE_RENDERINPUTS(render_inputs_bitset);
-	int num_z_pipes;
 };
 
 #define R300_CONTEXT(ctx)		((r300ContextPtr)(ctx->DriverCtx))
diff --git a/src/mesa/drivers/dri/radeon/radeon_bocs_wrapper.h b/src/mesa/drivers/dri/radeon/radeon_bocs_wrapper.h
index a42870f..4520a7d 100644
--- a/src/mesa/drivers/dri/radeon/radeon_bocs_wrapper.h
+++ b/src/mesa/drivers/dri/radeon/radeon_bocs_wrapper.h
@@ -45,6 +45,10 @@ struct drm_radeon_info {
 #define RADEON_PARAM_DEVICE_ID 16
 #endif
 
+#ifndef RADEON_PARAM_NUM_Z_PIPES
+#define RADEON_PARAM_NUM_Z_PIPES 17
+#endif
+
 #ifndef RADEON_INFO_DEVICE_ID
 #define RADEON_INFO_DEVICE_ID 0
 #endif
@@ -52,6 +56,10 @@ struct drm_radeon_info {
 #define RADEON_INFO_NUM_GB_PIPES 0
 #endif
 
+#ifndef RADEON_INFO_NUM_Z_PIPES
+#define RADEON_INFO_NUM_Z_PIPES 0
+#endif
+
 #ifndef DRM_RADEON_INFO
 #define DRM_RADEON_INFO 0x1
 #endif
diff --git a/src/mesa/drivers/dri/radeon/radeon_screen.c b/src/mesa/drivers/dri/radeon/radeon_screen.c
index c8d4916..cc8d696 100644
--- a/src/mesa/drivers/dri/radeon/radeon_screen.c
+++ b/src/mesa/drivers/dri/radeon/radeon_screen.c
@@ -267,6 +267,9 @@ radeonGetParam(__DRIscreenPrivate *sPriv, int param, void *value)
       case RADEON_PARAM_NUM_GB_PIPES:
           info.request = RADEON_INFO_NUM_GB_PIPES;
           break;
+      case RADEON_PARAM_NUM_Z_PIPES:
+          info.request = RADEON_INFO_NUM_Z_PIPES;
+          break;
       default:
           return -EINVAL;
       }
@@ -1163,6 +1166,15 @@ radeonCreateScreen( __DRIscreenPrivate *sPriv )
        default:
 	   break;
        }
+
+       if ( sPriv->drm_version.minor >= 31 ) {
+	       ret = radeonGetParam(sPriv, RADEON_PARAM_NUM_Z_PIPES, &temp);
+	       if (ret)
+		       screen->num_z_pipes = 2;
+	       else
+		       screen->num_z_pipes = temp;
+       } else
+	       screen->num_z_pipes = 2;
    }
 
    if ( sPriv->drm_version.minor >= 10 ) {
@@ -1364,6 +1376,12 @@ radeonCreateScreen2(__DRIscreenPrivate *sPriv)
 	   break;
        }
 
+       ret = radeonGetParam(sPriv, RADEON_PARAM_NUM_Z_PIPES, &temp);
+       if (ret)
+	       screen->num_z_pipes = 2;
+       else
+	       screen->num_z_pipes = temp;
+
    }
 
    i = 0;
diff --git a/src/mesa/drivers/dri/radeon/radeon_screen.h b/src/mesa/drivers/dri/radeon/radeon_screen.h
index f0dd46b..15744e8 100644
--- a/src/mesa/drivers/dri/radeon/radeon_screen.h
+++ b/src/mesa/drivers/dri/radeon/radeon_screen.h
@@ -108,6 +108,7 @@ typedef struct radeon_screen {
    const __DRIextension *extensions[16];
 
    int num_gb_pipes;
+   int num_z_pipes;
    int kernel_mm;
    drm_radeon_sarea_t *sarea;	/* Private SAREA data */
    struct radeon_bo_manager *bom;
-- 
1.5.6.3

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to