i915g: adapt to clear interface changes

should in theory support separate depth/stencil clears (untested).
Also fix some format omissions?
diff --git a/src/gallium/drivers/i915/i915_blit.c b/src/gallium/drivers/i915/i915_blit.c
index 6717e46..c5b5979 100644
--- a/src/gallium/drivers/i915/i915_blit.c
+++ b/src/gallium/drivers/i915/i915_blit.c
@@ -36,6 +36,7 @@
 void
 i915_fill_blit(struct i915_context *i915,
                unsigned cpp,
+               unsigned rgba_mask,
                unsigned short dst_pitch,
                struct i915_winsys_buffer *dst_buffer,
                unsigned dst_offset,
@@ -62,8 +63,7 @@
    case 4:
       BR13 = (((int) dst_pitch) & 0xffff) |
          (0xF0 << 16) | (1 << 24) | (1 << 25);
-      CMD = (XY_COLOR_BLT_CMD | XY_COLOR_BLT_WRITE_ALPHA |
-             XY_COLOR_BLT_WRITE_RGB);
+      CMD = (XY_COLOR_BLT_CMD | rgba_mask);
       break;
    default:
       return;
diff --git a/src/gallium/drivers/i915/i915_blit.h b/src/gallium/drivers/i915/i915_blit.h
index 43f8e7c..d82d2f2 100644
--- a/src/gallium/drivers/i915/i915_blit.h
+++ b/src/gallium/drivers/i915/i915_blit.h
@@ -44,6 +44,7 @@
 
 extern void i915_fill_blit(struct i915_context *i915,
                            unsigned cpp,
+                           unsigned rgba_mask,
                            unsigned short dst_pitch,
                            struct i915_winsys_buffer *dst_buffer,
                            unsigned dst_offset,
diff --git a/src/gallium/drivers/i915/i915_clear.c b/src/gallium/drivers/i915/i915_clear.c
index 0d0859f..6d824a5 100644
--- a/src/gallium/drivers/i915/i915_clear.c
+++ b/src/gallium/drivers/i915/i915_clear.c
@@ -40,7 +40,7 @@
  */
 void
 i915_clear(struct pipe_context *pipe, unsigned buffers, const float *rgba,
-	   double depth, unsigned stencil)
+           double depth, unsigned stencil)
 {
    util_clear(pipe, &i915_context(pipe)->framebuffer, buffers, rgba, depth,
               stencil);
diff --git a/src/gallium/drivers/i915/i915_screen.c b/src/gallium/drivers/i915/i915_screen.c
index 0897a86..3e2d082 100644
--- a/src/gallium/drivers/i915/i915_screen.c
+++ b/src/gallium/drivers/i915/i915_screen.c
@@ -129,6 +129,9 @@
    case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
    case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
       return 0;
+   case PIPE_CAP_DEPTHSTENCIL_CLEAR_SEPARATE:
+      /* disable for now */
+      return 0;
    default:
       return 0;
    }
@@ -181,6 +184,9 @@
       PIPE_FORMAT_L8A8_UNORM,
       PIPE_FORMAT_UYVY,
       PIPE_FORMAT_YUYV,
+      /* XXX why not?
+      PIPE_FORMAT_Z16_UNORM, */
+      PIPE_FORMAT_Z24X8_UNORM,
       PIPE_FORMAT_Z24_UNORM_S8_USCALED,
       PIPE_FORMAT_NONE  /* list terminator */
    };
@@ -190,6 +196,9 @@
       PIPE_FORMAT_NONE  /* list terminator */
    };
    static const enum pipe_format depth_supported[] = {
+      /* XXX why not?
+      PIPE_FORMAT_Z16_UNORM, */
+      PIPE_FORMAT_Z24X8_UNORM,
       PIPE_FORMAT_Z24_UNORM_S8_USCALED,
       PIPE_FORMAT_NONE  /* list terminator */
    };
diff --git a/src/gallium/drivers/i915/i915_state_emit.c b/src/gallium/drivers/i915/i915_state_emit.c
index 4d069ff..22082fe 100644
--- a/src/gallium/drivers/i915/i915_state_emit.c
+++ b/src/gallium/drivers/i915/i915_state_emit.c
@@ -51,6 +51,7 @@
 static unsigned translate_depth_format( enum pipe_format zformat )
 {
    switch (zformat) {
+   case PIPE_FORMAT_Z24X8_UNORM:
    case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
       return DEPTH_FRMT_24_FIXED_8_OTHER;
    case PIPE_FORMAT_Z16_UNORM:
diff --git a/src/gallium/drivers/i915/i915_state_sampler.c b/src/gallium/drivers/i915/i915_state_sampler.c
index 73e61b6..77b9bcc 100644
--- a/src/gallium/drivers/i915/i915_state_sampler.c
+++ b/src/gallium/drivers/i915/i915_state_sampler.c
@@ -222,6 +222,7 @@
       return (MAPSURF_COMPRESSED | MT_COMPRESS_DXT4_5);
 #endif
    case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
+   case PIPE_FORMAT_Z24X8_UNORM:
       return (MAPSURF_32BIT | MT_32BIT_xI824);
    default:
       debug_printf("i915: translate_texture_format() bad image format %x\n",
diff --git a/src/gallium/drivers/i915/i915_surface.c b/src/gallium/drivers/i915/i915_surface.c
index 41b1fed..d9316a1 100644
--- a/src/gallium/drivers/i915/i915_surface.c
+++ b/src/gallium/drivers/i915/i915_surface.c
@@ -28,12 +28,14 @@
 #include "i915_surface.h"
 #include "i915_resource.h"
 #include "i915_blit.h"
+#include "i915_reg.h"
 #include "i915_screen.h"
 #include "pipe/p_defines.h"
 #include "util/u_inlines.h"
 #include "util/u_math.h"
 #include "util/u_format.h"
 #include "util/u_memory.h"
+#include "util/u_pack_color.h"
 
 
 /* Assumes all values are within bounds -- no checking at this level -
@@ -41,11 +43,11 @@
  */
 static void
 i915_surface_copy(struct pipe_context *pipe,
-		  struct pipe_resource *dst, struct pipe_subresource subdst,
-		  unsigned dstx, unsigned dsty, unsigned dstz,
-		  struct pipe_resource *src, struct pipe_subresource subsrc,
-		  unsigned srcx, unsigned srcy, unsigned srcz,
-		  unsigned width, unsigned height)
+                  struct pipe_resource *dst, struct pipe_subresource subdst,
+                  unsigned dstx, unsigned dsty, unsigned dstz,
+                  struct pipe_resource *src, struct pipe_subresource subsrc,
+                  unsigned srcx, unsigned srcy, unsigned srcz,
+                  unsigned width, unsigned height)
 {
    struct i915_texture *dst_tex = i915_texture(dst);
    struct i915_texture *src_tex = i915_texture(src);
@@ -93,39 +95,67 @@
 
 
 static void
-i915_surface_fill(struct pipe_context *pipe,
-		  struct pipe_resource *dst, struct pipe_subresource subdst,
-		  unsigned dstx, unsigned dsty, unsigned dstz,
-		  unsigned width, unsigned height, unsigned value)
+i915_clearRT(struct pipe_context *pipe,
+             struct pipe_surface *dst,
+             const float *rgba,
+             unsigned dstx, unsigned dsty,
+             unsigned width, unsigned height)
 {
-   struct i915_texture *tex = i915_texture(dst);
+   struct i915_texture *tex = i915_texture(dst->texture);
    struct pipe_resource *pt = &tex->b.b;
-   unsigned dst_offset;  /* in bytes */
-
-   if (dst->target == PIPE_TEXTURE_CUBE) {
-      dst_offset = tex->image_offset[subdst.level][subdst.face];
-   }
-   else if (dst->target == PIPE_TEXTURE_3D) {
-      dst_offset = tex->image_offset[subdst.level][dstz];
-   }
-   else {
-      dst_offset = tex->image_offset[subdst.level][0];
-      assert(subdst.face == 0);
-      assert(dstz == 0);
-   }
+   union util_color uc;
 
    assert(util_format_get_blockwidth(pt->format) == 1);
    assert(util_format_get_blockheight(pt->format) == 1);
 
+   util_pack_color(rgba, dst->format, &uc);
    i915_fill_blit( i915_context(pipe),
                    util_format_get_blocksize(pt->format),
+                   XY_COLOR_BLT_WRITE_ALPHA | XY_COLOR_BLT_WRITE_RGB,
                    (unsigned short) tex->stride,
-                   tex->buffer, dst_offset,
+                   tex->buffer, dst->offset,
                    (short) dstx, (short) dsty,
                    (short) width, (short) height,
-                   value );
+                   uc.ui );
 }
 
+static void
+i915_clearDS(struct pipe_context *pipe,
+             struct pipe_surface *dst,
+             unsigned clear_flags,
+             double depth,
+             unsigned stencil,
+             unsigned dstx, unsigned dsty,
+             unsigned width, unsigned height)
+{
+   struct i915_texture *tex = i915_texture(dst->texture);
+   struct pipe_resource *pt = &tex->b.b;
+   unsigned packedds;
+   unsigned mask = 0;
+
+   assert(util_format_get_blockwidth(pt->format) == 1);
+   assert(util_format_get_blockheight(pt->format) == 1);
+
+   packedds = util_pack_z_stencil(dst->format, depth, stencil);
+
+   if (clear_flags & PIPE_CLEAR_DEPTH)
+      mask |= XY_COLOR_BLT_WRITE_RGB;
+   /* XXX presumably this does read-modify-write
+      (otherwise this won't work anyway). Hence will only want to
+      do it if really have stencil and it isn't cleared */
+   if (!((clear_flags & PIPE_CLEAR_STENCIL) ||
+       (dst->format != PIPE_FORMAT_Z24_UNORM_S8_USCALED)))
+      mask |= XY_COLOR_BLT_WRITE_ALPHA;
+
+   i915_fill_blit( i915_context(pipe),
+                   util_format_get_blocksize(pt->format),
+                   mask,
+                   (unsigned short) tex->stride,
+                   tex->buffer, dst->offset,
+                   (short) dstx, (short) dsty,
+                   (short) width, (short) height,
+                   packedds );
+}
 
 /*
  * Screen surface functions
@@ -179,7 +209,8 @@
 i915_init_surface_functions(struct i915_context *i915)
 {
    i915->base.resource_copy_region = i915_surface_copy;
-   i915->base.resource_fill_region = i915_surface_fill;
+   i915->base.clearRT = i915_clearRT;
+   i915->base.clearDS = i915_clearDS;
 }
 
 /* No good reason for these to be in the screen.