i965: add software fallback for conformant 3D textures and GL_CLAMP
authorRobert Ellison <papillo@vmware.com>
Wed, 4 Mar 2009 23:48:51 +0000 (16:48 -0700)
committerRobert Ellison <papillo@vmware.com>
Wed, 4 Mar 2009 23:59:00 +0000 (16:59 -0700)
The i965 hardware cannot do GL_CLAMP behavior on textures; an earlier
commit forced a software fallback if strict conformance was required
(i.e. the INTEL_STRICT_CONFORMANCE environment variable was set) and
2D textures were used, but it was somewhat flawed - it could trigger
the software fallback even if 2D textures weren't enabled, as long
as one texture unit was enabled.

This fixes that, and adds software fallback for GL_CLAMP behavior with
1D and 3D textures.

It also adds support for a particular setting of the INTEL_STRICT_CONFORMANCE
environment variable, which forces software fallbacks to be taken *all*
the time.  This is helpful with debugging.  The value is:
   export INTEL_STRICT_CONFORMANCE=2

src/gallium/drivers/i915simple/i915_state_sampler.c
src/mesa/drivers/dri/i915/intel_tris.c
src/mesa/drivers/dri/i965/brw_draw.c
src/mesa/drivers/dri/intel/intel_context.c
src/mesa/drivers/dri/intel/intel_context.h

index c09c10601b4b449a52534f4bb02c119fc7ed3f46..3667ed1afa7f019ade0a9ade6c9ec44fb3ec6661 100644 (file)
@@ -116,7 +116,7 @@ static void update_sampler(struct i915_context *i915,
            ws == PIPE_TEX_WRAP_CLAMP_TO_BORDER ||
            wt == PIPE_TEX_WRAP_CLAMP_TO_BORDER || 
            wr == PIPE_TEX_WRAP_CLAMP_TO_BORDER)) {
-         if (i915->strict_conformance) {
+         if (i915->conformance_mode > 0) {
             assert(0);
             /*             sampler->fallback = true; */
             /* TODO */
index e80996580c7ca7b4aec3a5248692afdc9d88399e..a857803b2ee41344f24e134c10be7582f9db96b8 100644 (file)
@@ -989,7 +989,7 @@ intelChooseRenderState(GLcontext * ctx)
             intel->draw_tri = intel_fallback_tri;
 
          if (flags & DD_TRI_SMOOTH) {
-           if (intel->strict_conformance)
+           if (intel->conformance_mode > 0)
               intel->draw_tri = intel_fallback_tri;
         }
 
@@ -1001,7 +1001,7 @@ intelChooseRenderState(GLcontext * ctx)
         }
 
         if (flags & DD_POINT_SMOOTH) {
-           if (intel->strict_conformance)
+           if (intel->conformance_mode > 0)
               intel->draw_point = intel_fallback_point;
         }
 
index 7ab1ece2630b533c93b8bf3650dbeb97f94e9c0a..0b6499943772a8e32a2291050642cbf4e9cdcece 100644 (file)
@@ -195,11 +195,15 @@ static GLboolean check_fallbacks( struct brw_context *brw,
    GLuint i;
 
    /* If we don't require strict OpenGL conformance, never 
-    * use fallbacks.
+    * use fallbacks.  If we're forcing fallbacks, always
+    * use fallfacks.
     */
-   if (!brw->intel.strict_conformance)
+   if (brw->intel.conformance_mode == 0)
       return GL_FALSE;
 
+   if (brw->intel.conformance_mode == 2)
+      return GL_TRUE;
+
    if (ctx->Polygon.SmoothFlag) {
       for (i = 0; i < nr_prims; i++)
         if (reduced_prim[prim[i].mode] == GL_TRIANGLES) 
@@ -248,10 +252,25 @@ static GLboolean check_fallbacks( struct brw_context *brw,
    {
       int u;
       for (u = 0; u < ctx->Const.MaxTextureCoordUnits; u++) {
-         if (ctx->Texture.Unit[u].Enabled) {
-            if (ctx->Texture.Unit[u].CurrentTex[TEXTURE_2D_INDEX]->WrapS == GL_CLAMP ||
-                ctx->Texture.Unit[u].CurrentTex[TEXTURE_2D_INDEX]->WrapT == GL_CLAMP) {
+         struct gl_texture_unit *texUnit = &ctx->Texture.Unit[u];
+         if (texUnit->Enabled) {
+            if (texUnit->Enabled & TEXTURE_1D_BIT) {
+               if (texUnit->CurrentTex[TEXTURE_1D_INDEX]->WrapS == GL_CLAMP) {
+                   return GL_TRUE;
+               }
+            }
+            if (texUnit->Enabled & TEXTURE_2D_BIT) {
+               if (texUnit->CurrentTex[TEXTURE_2D_INDEX]->WrapS == GL_CLAMP ||
+                   texUnit->CurrentTex[TEXTURE_2D_INDEX]->WrapT == GL_CLAMP) {
+                   return GL_TRUE;
+               }
+            }
+            if (texUnit->Enabled & TEXTURE_3D_BIT) {
+               if (texUnit->CurrentTex[TEXTURE_3D_INDEX]->WrapS == GL_CLAMP ||
+                   texUnit->CurrentTex[TEXTURE_3D_INDEX]->WrapT == GL_CLAMP ||
+                   texUnit->CurrentTex[TEXTURE_3D_INDEX]->WrapR == GL_CLAMP) {
                    return GL_TRUE;
+               }
             }
          }
       }
index b3f6fc02dff1e8c42ed75e837f987dea65ffeaed..65853234f16f68a4f1a3e26b6b91efdb0bf31dfb 100644 (file)
@@ -506,10 +506,16 @@ intelInitContext(struct intel_context *intel,
     * start.
     */
    if (getenv("INTEL_STRICT_CONFORMANCE")) {
-      intel->strict_conformance = 1;
+      unsigned int value = atoi(getenv("INTEL_STRICT_CONFORMANCE"));
+      if (value > 0) {
+         intel->conformance_mode = value;
+      }
+      else {
+         intel->conformance_mode = 1;
+      }
    }
 
-   if (intel->strict_conformance) {
+   if (intel->conformance_mode > 0) {
       ctx->Const.MinLineWidth = 1.0;
       ctx->Const.MinLineWidthAA = 1.0;
       ctx->Const.MaxLineWidth = 1.0;
index 18dc43c4a42b6ee5e8c054a2960efa85ced9b1b8..f2ecb9eb2793dda212ff1b1e798243b56f66dba6 100644 (file)
@@ -229,7 +229,12 @@ struct intel_context
    GLboolean hw_stipple;
    GLboolean depth_buffer_is_float;
    GLboolean no_rast;
-   GLboolean strict_conformance;
+
+   /* 0 - nonconformant, best performance;
+    * 1 - fallback to sw for known conformance bugs
+    * 2 - always fallback to sw
+    */
+   GLuint conformance_mode;
 
    /* State for intelvb.c and inteltris.c.
     */