intel: fix abort issue with shadowtex demo when use
authorXiang, Haihao <haihao.xiang@intel.com>
Fri, 14 Mar 2008 03:39:08 +0000 (11:39 +0800)
committerXiang, Haihao <haihao.xiang@intel.com>
Fri, 14 Mar 2008 03:50:11 +0000 (11:50 +0800)
DEPTH_STENCIL texture. (bug#14952).

src/mesa/drivers/dri/i915/i915_texstate.c
src/mesa/drivers/dri/i965/brw_wm_surface_state.c
src/mesa/drivers/dri/intel/intel_fbo.c

index 1c45fd5dcd5dbbb2f2afb7d766a2462db138f5cb..ba42093287071b20e813871602e8489bea04bdd5 100644 (file)
@@ -74,7 +74,7 @@ translate_texture_format(GLuint mesa_format)
    case MESA_FORMAT_RGBA_DXT5:
       return (MAPSURF_COMPRESSED | MT_COMPRESS_DXT4_5);
    case MESA_FORMAT_Z24_S8:
-      return (MAPSURF_32BIT | MT_32BIT_xL824);
+      return (MAPSURF_32BIT | MT_32BIT_xI824);
    default:
       fprintf(stderr, "%s: bad image format %x\n", __FUNCTION__, mesa_format);
       abort();
index d0f86b5687b1684567ebae72973d4f2586b90084..86566df388c64f1c62a0a5d49e95102094e0fed8 100644 (file)
@@ -133,6 +133,9 @@ static GLuint translate_tex_format( GLuint mesa_format )
    case MESA_FORMAT_SRGB_DXT1:
       return BRW_SURFACEFORMAT_BC1_UNORM_SRGB;
 
+   case MESA_FORMAT_Z24_S8:
+      return BRW_SURFACEFORMAT_I24X8_UNORM;
+
    default:
       assert(0);
       return 0;
index 94d499f001cde9674cffebdce620eb2c655e4ecd..b3f6610546971ef810364db1d320963f0c4311fa 100644 (file)
@@ -517,28 +517,10 @@ intel_framebuffer_renderbuffer(GLcontext * ctx,
    intel_draw_buffer(ctx, fb);
 }
 
-
-/**
- * When glFramebufferTexture[123]D is called this function sets up the
- * gl_renderbuffer wrapper around the texture image.
- * This will have the region info needed for hardware rendering.
- */
-static struct intel_renderbuffer *
-intel_wrap_texture(GLcontext * ctx, struct gl_texture_image *texImage)
+static GLboolean
+intel_update_wrapper(GLcontext *ctx, struct intel_renderbuffer *irb, 
+                          struct gl_texture_image *texImage)
 {
-   const GLuint name = ~0;      /* not significant, but distinct for debugging */
-   struct intel_renderbuffer *irb;
-
-   /* make an intel_renderbuffer to wrap the texture image */
-   irb = CALLOC_STRUCT(intel_renderbuffer);
-   if (!irb) {
-      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glFramebufferTexture");
-      return NULL;
-   }
-
-   _mesa_init_renderbuffer(&irb->Base, name);
-   irb->Base.ClassID = INTEL_RB_CLASS;
-
    if (texImage->TexFormat == &_mesa_texformat_argb8888) {
       irb->Base._ActualFormat = GL_RGBA8;
       irb->Base._BaseFormat = GL_RGBA;
@@ -553,12 +535,15 @@ intel_wrap_texture(GLcontext * ctx, struct gl_texture_image *texImage)
       irb->Base._ActualFormat = GL_DEPTH_COMPONENT16;
       irb->Base._BaseFormat = GL_DEPTH_COMPONENT;
       DBG("Render to DEPTH16 texture OK\n");
+   } else if (texImage->TexFormat == &_mesa_texformat_z24_s8) {
+      irb->Base._ActualFormat = GL_DEPTH24_STENCIL8_EXT;
+      irb->Base._BaseFormat = GL_DEPTH_STENCIL_EXT;
+      DBG("Render to DEPTH_STENCIL texture OK\n");
    }
    else {
       DBG("Render to texture BAD FORMAT %d\n",
          texImage->TexFormat->MesaFormat);
-      _mesa_free(irb);
-      return NULL;
+      return GL_FALSE;
    }
 
    irb->Base.InternalFormat = irb->Base._ActualFormat;
@@ -577,6 +562,35 @@ intel_wrap_texture(GLcontext * ctx, struct gl_texture_image *texImage)
 
    irb->RenderToTexture = GL_TRUE;
 
+   return GL_TRUE;
+}
+
+/**
+ * When glFramebufferTexture[123]D is called this function sets up the
+ * gl_renderbuffer wrapper around the texture image.
+ * This will have the region info needed for hardware rendering.
+ */
+static struct intel_renderbuffer *
+intel_wrap_texture(GLcontext * ctx, struct gl_texture_image *texImage)
+{
+   const GLuint name = ~0;      /* not significant, but distinct for debugging */
+   struct intel_renderbuffer *irb;
+
+   /* make an intel_renderbuffer to wrap the texture image */
+   irb = CALLOC_STRUCT(intel_renderbuffer);
+   if (!irb) {
+      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glFramebufferTexture");
+      return NULL;
+   }
+
+   _mesa_init_renderbuffer(&irb->Base, name);
+   irb->Base.ClassID = INTEL_RB_CLASS;
+
+   if (!intel_update_wrapper(ctx, irb, texImage)) {
+      _mesa_free(irb);
+      return NULL;
+   }
+
    return irb;
 }
 
@@ -613,6 +627,10 @@ intel_render_texture(GLcontext * ctx,
          _mesa_render_texture(ctx, fb, att);
          return;
       }
+   } if (!intel_update_wrapper(ctx, irb, newImage)) {
+       _mesa_reference_renderbuffer(&att->Renderbuffer, NULL);
+       _mesa_render_texture(ctx, fb, att);
+       return;
    }
 
    DBG("Begin render texture tid %x tex=%u w=%d h=%d refcount=%d\n",