i915: Add an option for testing the effect of early Z in classic mode.
authorEric Anholt <eric@anholt.net>
Tue, 9 Jun 2009 23:12:43 +0000 (16:12 -0700)
committerEric Anholt <eric@anholt.net>
Tue, 9 Jun 2009 23:12:43 +0000 (16:12 -0700)
The early Z stuff is supposed to be unsafe without some more work in the
enable/disable path (in particular, how do we want to get it disabled on
the way out to the X Server?), but at the moment is 6% in OA.

src/mesa/drivers/dri/i915/i915_reg.h
src/mesa/drivers/dri/i915/i915_vtbl.c
src/mesa/drivers/dri/intel/intel_context.c
src/mesa/drivers/dri/intel/intel_context.h
src/mesa/drivers/dri/intel/intel_screen.c

index b02e2c7628686213470ce7275b8e1d5b251345bc..84db58ea9507d4982f79b20674dbb6c6a784d1bf 100644 (file)
 /* p161 */
 #define _3DSTATE_DST_BUF_VARS_CMD      (CMD_3D | (0x1d<<24) | (0x85<<16))
 /* Dword 1 */
+#define CLASSIC_EARLY_DEPTH            (1<<31)
 #define TEX_DEFAULT_COLOR_OGL           (0<<30)
 #define TEX_DEFAULT_COLOR_D3D           (1<<30)
 #define ZR_EARLY_DEPTH                  (1<<29)
index 6ecbc4709bc63d938544a1609dc4c8c2871fd512..2fca247af198a741d9e7451a98ef7fe2026c4848 100644 (file)
@@ -42,6 +42,7 @@
 #include "intel_regions.h"
 #include "intel_tris.h"
 #include "intel_fbo.h"
+#include "intel_chipset.h"
 
 #include "i915_reg.h"
 #include "i915_context.h"
@@ -611,6 +612,14 @@ i915_state_draw_region(struct intel_context *intel,
       }
    }
 
+   /* This isn't quite safe, thus being hidden behind an option.  When changing
+    * the value of this bit, the pipeline needs to be MI_FLUSHed.  And it
+    * can only be set when a depth buffer is already defined.
+    */
+   if (IS_945(intel->intelScreen->deviceID) && intel->use_early_z &&
+       depth_region->tiling != I915_TILING_NONE)
+      value |= CLASSIC_EARLY_DEPTH;
+
    if (depth_region && depth_region->cpp == 4) {
       value |= DEPTH_FRMT_24_FIXED_8_OTHER;
    }
index 3a948439933120fbcd5264520473c275fb9a4114..f88b37d0f3a368b22f60bd323b5094153fc6e8c0 100644 (file)
@@ -729,6 +729,7 @@ intelInitContext(struct intel_context *intel,
    }
    intel->use_texture_tiling = driQueryOptionb(&intel->optionCache,
                                               "texture_tiling");
+   intel->use_early_z = driQueryOptionb(&intel->optionCache, "early_z");
 
    intel->prim.primitive = ~0;
 
index 4e45f1a91fb5408fff5060ee881eb594f3252170..7d3c80bb21cce1385eb0238c987c2f7f4c21b6f8 100644 (file)
@@ -306,6 +306,7 @@ struct intel_context
    GLboolean is_front_buffer_rendering;
 
    GLboolean use_texture_tiling;
+   GLboolean use_early_z;
 
    drm_clip_rect_t fboRect;     /**< cliprect for FBO rendering */
 
index 53782c56048dc6185898313e521101303a019dfc..8da96ede644753520d95ece1d5147a95c6beb34a 100644 (file)
@@ -75,6 +75,10 @@ PUBLIC const char __driConfigOptions[] =
      DRI_CONF_TEXTURE_TILING(true)
 #endif
 
+      DRI_CONF_OPT_BEGIN(early_z, bool, false)
+        DRI_CONF_DESC(en, "Enable early Z in classic mode (unstable, 945-only).")
+      DRI_CONF_OPT_END
+
    DRI_CONF_SECTION_END
    DRI_CONF_SECTION_QUALITY
       DRI_CONF_FORCE_S3TC_ENABLE(false)
@@ -87,7 +91,7 @@ PUBLIC const char __driConfigOptions[] =
    DRI_CONF_SECTION_END
 DRI_CONF_END;
 
-const GLuint __driNConfigOptions = 9;
+const GLuint __driNConfigOptions = 10;
 
 #ifdef USE_NEW_INTERFACE
 static PFNGLXCREATECONTEXTMODES create_context_modes = NULL;