i915g: adapt to clear interface changes
authorRoland Scheidegger <sroland@vmware.com>
Fri, 28 May 2010 23:28:21 +0000 (01:28 +0200)
committerRoland Scheidegger <sroland@vmware.com>
Fri, 28 May 2010 23:28:21 +0000 (01:28 +0200)
should in theory support separate depth/stencil clears (untested).
Also fix some format omissions?

src/gallium/drivers/i915/i915_blit.c
src/gallium/drivers/i915/i915_blit.h
src/gallium/drivers/i915/i915_clear.c
src/gallium/drivers/i915/i915_screen.c
src/gallium/drivers/i915/i915_state_emit.c
src/gallium/drivers/i915/i915_state_sampler.c
src/gallium/drivers/i915/i915_surface.c

index 6717e46e1b4a92d518308f21717d45d64bfeae50..c5b5979bf98cbb38db3a4e1b029e5a97aebe63fd 100644 (file)
@@ -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 @@ i915_fill_blit(struct i915_context *i915,
    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;
index 43f8e7c9aadb68f9ba73ba096079850f0a61a9c4..d82d2f258e1ff52d85d107db155e8b2e3ee0f609 100644 (file)
@@ -44,6 +44,7 @@ extern void i915_copy_blit(struct i915_context *i915,
 
 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,
index 0d0859f8f335478f0111f994a12f77b336e60ed1..6d824a507aa38c65b1881b0cec424416b09faa62 100644 (file)
@@ -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);
index 0897a863dbd2ba01597b03b139006d5223853cc5..3e2d0824ff6d7b6fb2253638f9df0f826b29e0b9 100644 (file)
@@ -129,6 +129,9 @@ i915_get_param(struct pipe_screen *screen, enum pipe_cap param)
    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 @@ i915_is_format_supported(struct pipe_screen *screen,
       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 @@ i915_is_format_supported(struct pipe_screen *screen,
       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 */
    };
index 4d069fffa85abc780bd182be1b1362a98482961e..22082fece82be67e6e20d826a09e7b83633e739f 100644 (file)
@@ -51,6 +51,7 @@ static unsigned translate_format( enum pipe_format format )
 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:
index 73e61b662405f9be4d2cc64cce6d66fd20190502..77b9bccbb741128c94da0b878b3a4c8ece79ab5f 100644 (file)
@@ -222,6 +222,7 @@ translate_texture_format(enum pipe_format pipeFormat)
       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",
index 41b1fed36d0b9aa5440084bf9032a1a18686d9d5..d9316a1f36f84bc8d1f47ea7535373674513cc9a 100644 (file)
 #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 -
  */
 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 @@ i915_surface_copy(struct pipe_context *pipe,
 
 
 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 @@ void
 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.