Merge branch 'master' into pipe-format-simplify
authorMichal Krol <michal@vmware.com>
Thu, 17 Dec 2009 21:37:15 +0000 (22:37 +0100)
committerMichal Krol <michal@vmware.com>
Thu, 17 Dec 2009 21:37:15 +0000 (22:37 +0100)
Conflicts:
src/gallium/auxiliary/draw/draw_pipe_aaline.c
src/gallium/auxiliary/draw/draw_pipe_pstipple.c
src/gallium/auxiliary/util/u_blit.c
src/gallium/auxiliary/util/u_gen_mipmap.c
src/gallium/auxiliary/util/u_surface.c
src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.c
src/gallium/drivers/cell/ppu/cell_texture.c
src/gallium/drivers/llvmpipe/lp_texture.c
src/gallium/drivers/r300/r300_emit.c
src/gallium/drivers/r300/r300_texture.c
src/gallium/drivers/softpipe/sp_texture.c
src/gallium/drivers/softpipe/sp_tile_cache.c
src/gallium/drivers/svga/svga_state_vs.c
src/gallium/include/pipe/p_format.h
src/gallium/state_trackers/dri/dri_drawable.c
src/gallium/state_trackers/egl/egl_surface.c
src/gallium/state_trackers/python/p_device.i
src/gallium/state_trackers/python/st_softpipe_winsys.c
src/gallium/state_trackers/vega/api_filters.c
src/gallium/state_trackers/vega/image.c
src/gallium/state_trackers/vega/mask.c
src/gallium/state_trackers/vega/paint.c
src/gallium/state_trackers/vega/renderer.c
src/gallium/state_trackers/vega/vg_tracker.c
src/gallium/state_trackers/xorg/xorg_crtc.c
src/gallium/state_trackers/xorg/xorg_dri2.c
src/gallium/state_trackers/xorg/xorg_exa.c
src/gallium/state_trackers/xorg/xorg_renderer.c
src/gallium/state_trackers/xorg/xorg_xv.c
src/gallium/state_trackers/xorg/xvmc/surface.c
src/gallium/winsys/drm/nouveau/drm/nouveau_drm_api.c
src/gallium/winsys/drm/radeon/core/radeon_buffer.c
src/gallium/winsys/egl_xlib/sw_winsys.c
src/gallium/winsys/g3dvl/xlib/xsp_winsys.c
src/gallium/winsys/gdi/gdi_llvmpipe_winsys.c
src/gallium/winsys/gdi/gdi_softpipe_winsys.c
src/gallium/winsys/xlib/xlib_cell.c
src/gallium/winsys/xlib/xlib_llvmpipe.c
src/gallium/winsys/xlib/xlib_softpipe.c
src/mesa/state_tracker/st_cb_fbo.c
src/mesa/state_tracker/st_cb_texture.c
src/mesa/state_tracker/st_texture.c

47 files changed:
1  2 
src/gallium/auxiliary/draw/draw_pipe_aaline.c
src/gallium/auxiliary/draw/draw_pipe_pstipple.c
src/gallium/auxiliary/util/u_blit.c
src/gallium/auxiliary/util/u_format.h
src/gallium/auxiliary/util/u_format_table.py
src/gallium/auxiliary/util/u_gen_mipmap.c
src/gallium/auxiliary/util/u_pack_color.h
src/gallium/auxiliary/util/u_surface.c
src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.c
src/gallium/drivers/cell/ppu/cell_texture.c
src/gallium/drivers/llvmpipe/lp_texture.c
src/gallium/drivers/nv50/nv50_tex.c
src/gallium/drivers/r300/r300_emit.c
src/gallium/drivers/r300/r300_texture.c
src/gallium/drivers/softpipe/sp_texture.c
src/gallium/drivers/softpipe/sp_tile_cache.c
src/gallium/drivers/svga/svga_screen_texture.c
src/gallium/include/pipe/p_format.h
src/gallium/state_trackers/dri/dri_drawable.c
src/gallium/state_trackers/egl/egl_surface.c
src/gallium/state_trackers/python/p_device.i
src/gallium/state_trackers/python/st_softpipe_winsys.c
src/gallium/state_trackers/vega/api_filters.c
src/gallium/state_trackers/vega/image.c
src/gallium/state_trackers/vega/mask.c
src/gallium/state_trackers/vega/paint.c
src/gallium/state_trackers/vega/renderer.c
src/gallium/state_trackers/vega/vg_tracker.c
src/gallium/state_trackers/wgl/stw_framebuffer.c
src/gallium/state_trackers/xorg/xorg_crtc.c
src/gallium/state_trackers/xorg/xorg_dri2.c
src/gallium/state_trackers/xorg/xorg_exa.c
src/gallium/state_trackers/xorg/xorg_renderer.c
src/gallium/state_trackers/xorg/xorg_xv.c
src/gallium/winsys/drm/nouveau/drm/nouveau_drm_api.c
src/gallium/winsys/egl_xlib/sw_winsys.c
src/gallium/winsys/g3dvl/xlib/xsp_winsys.c
src/gallium/winsys/gdi/gdi_llvmpipe_winsys.c
src/gallium/winsys/gdi/gdi_softpipe_winsys.c
src/gallium/winsys/xlib/xlib_cell.c
src/gallium/winsys/xlib/xlib_llvmpipe.c
src/gallium/winsys/xlib/xlib_softpipe.c
src/mesa/state_tracker/st_cb_drawpixels.c
src/mesa/state_tracker/st_cb_fbo.c
src/mesa/state_tracker/st_cb_texture.c
src/mesa/state_tracker/st_format.c
src/mesa/state_tracker/st_texture.c

@@@ -35,8 -35,6 +35,8 @@@
  #include "pipe/p_context.h"
  #include "pipe/p_defines.h"
  #include "pipe/p_shader_tokens.h"
 +
 +#include "util/u_format.h"
  #include "util/u_math.h"
  #include "util/u_memory.h"
  
@@@ -404,7 -402,6 +404,6 @@@ aaline_create_texture(struct aaline_sta
     texTemp.width0 = 1 << MAX_TEXTURE_LEVEL;
     texTemp.height0 = 1 << MAX_TEXTURE_LEVEL;
     texTemp.depth0 = 1;
-    util_format_get_block(texTemp.format, &texTemp.block);
  
     aaline->texture = screen->texture_create(screen, &texTemp);
     if (!aaline->texture)
@@@ -38,7 -38,6 +38,7 @@@
  #include "pipe/p_defines.h"
  #include "pipe/p_shader_tokens.h"
  
 +#include "util/u_format.h"
  #include "util/u_math.h"
  #include "util/u_memory.h"
  
@@@ -432,7 -431,6 +432,6 @@@ pstip_create_texture(struct pstip_stag
     texTemp.width0 = 32;
     texTemp.height0 = 32;
     texTemp.depth0 = 1;
-    util_format_get_block(texTemp.format, &texTemp.block);
  
     pstip->texture = screen->texture_create(screen, &texTemp);
     if (pstip->texture == NULL)
@@@ -42,7 -42,6 +42,7 @@@
  
  #include "util/u_blit.h"
  #include "util/u_draw_quad.h"
 +#include "util/u_format.h"
  #include "util/u_math.h"
  #include "util/u_memory.h"
  #include "util/u_simple_shaders.h"
@@@ -127,7 -126,8 +127,8 @@@ util_create_blit(struct pipe_context *p
     }
  
     /* fragment shader */
-    ctx->fs[TGSI_WRITEMASK_XYZW] = util_make_fragment_tex_shader(pipe);
+    ctx->fs[TGSI_WRITEMASK_XYZW] =
+       util_make_fragment_tex_shader(pipe, TGSI_TEXTURE_2D);
     ctx->vbuf = NULL;
  
     /* init vertex data that doesn't change */
@@@ -358,7 -358,6 +359,6 @@@ util_blit_pixels_writemask(struct blit_
        texTemp.width0 = srcW;
        texTemp.height0 = srcH;
        texTemp.depth0 = 1;
-       util_format_get_block(src->format, &texTemp.block);
  
        tex = screen->texture_create(screen, &texTemp);
        if (!tex)
     cso_set_sampler_textures(ctx->cso, 1, &tex);
  
     if (ctx->fs[writemask] == NULL)
-       ctx->fs[writemask] = util_make_fragment_tex_shader_writemask(pipe, writemask);
+       ctx->fs[writemask] =
+          util_make_fragment_tex_shader_writemask(pipe, TGSI_TEXTURE_2D,
+                                                  writemask);
  
     /* shaders */
     cso_set_fragment_shader_handle(ctx->cso, ctx->fs[writemask]);
  #include "pipe/p_format.h"
  
  
+ /**
+  * Describe how to best pack/unpack pixels into/from the prescribed format.
+  *
+  * These are used for automatic code generation of pixel packing and unpacking
+  * routines (in compile time, e.g., u_format_access.py, or in runtime, like
+  * llvmpipe does).
+  *
+  * Thumb rule is: if you're not code generating pixel packing/unpacking then
+  * these are irrelevant for you.
+  *
+  * Note that this can be deduced from other values in util_format_description
+  * structure. This is by design, to make code generation of pixel
+  * packing/unpacking/sampling routines simple and efficient.
+  *
+  * XXX: This should be renamed to something like util_format_pack.
+  */
  enum util_format_layout {
+    /**
+     * Single scalar component.
+     */
     UTIL_FORMAT_LAYOUT_SCALAR = 0,
+    /**
+     * One or more components of mixed integer formats, arithmetically encoded
+     * in a word up to 32bits.
+     */
     UTIL_FORMAT_LAYOUT_ARITH = 1,
+    /**
+     * One or more components, no mixed formats, each with equal power of two
+     * number of bytes.
+     */
     UTIL_FORMAT_LAYOUT_ARRAY = 2,
+    /**
+     * XXX: Not used yet. These might go away and be replaced by a single entry,
+     * for formats where multiple pixels have to be
+     * read in order to determine a single pixel value (i.e., block.width > 1
+     * || block.height > 1)
+     */
     UTIL_FORMAT_LAYOUT_YUV = 3,
     UTIL_FORMAT_LAYOUT_DXT = 4
  };
@@@ -111,155 -147,6 +147,155 @@@ const struct util_format_description 
  util_format_description(enum pipe_format format);
  
  
 +/*
 + * Format query functions.
 + */
 +
 +static INLINE boolean 
 +util_format_is_compressed(enum pipe_format format)
 +{
 +   const struct util_format_description *desc = util_format_description(format);
 +
 +   assert(format);
 +   if (!format) {
 +      return FALSE;
 +   }
 +
 +   return desc->layout == UTIL_FORMAT_LAYOUT_DXT ? TRUE : FALSE;
 +}
 +
 +static INLINE boolean 
 +util_format_is_depth_or_stencil(enum pipe_format format)
 +{
 +   const struct util_format_description *desc = util_format_description(format);
 +
 +   assert(format);
 +   if (!format) {
 +      return FALSE;
 +   }
 +
 +   return desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS ? TRUE : FALSE;
 +}
 +
 +static INLINE boolean 
 +util_format_is_depth_and_stencil(enum pipe_format format)
 +{
 +   const struct util_format_description *desc = util_format_description(format);
 +
 +   assert(format);
 +   if (!format) {
 +      return FALSE;
 +   }
 +
 +   if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS) {
 +      return FALSE;
 +   }
 +
 +   return (desc->swizzle[0] != UTIL_FORMAT_SWIZZLE_NONE &&
 +           desc->swizzle[1] != UTIL_FORMAT_SWIZZLE_NONE) ? TRUE : FALSE;
 +}
 +
 +/**
 + * Describe pixel format's block.   
 + * 
 + * @sa http://msdn2.microsoft.com/en-us/library/ms796147.aspx
 + */
 +static INLINE void 
 +util_format_get_block(enum pipe_format format,
 +                      struct pipe_format_block *block)
 +{
 +   const struct util_format_description *desc = util_format_description(format);
 +
 +   assert(format);
 +   if (!format) {
 +      block->size = 0;
 +      block->width = 1;
 +      block->height = 1;
 +      return;
 +   }
 +
 +   block->size = desc->block.bits / 8;
 +   block->width = desc->block.width;
 +   block->height = desc->block.height;
 +}
 +
 +/**
 + * Return total bits needed for the pixel format.
 + */
 +static INLINE uint
 +util_format_get_bits(enum pipe_format format)
 +{
 +   const struct util_format_description *desc = util_format_description(format);
 +
 +   assert(format);
 +   if (!format) {
 +      return 0;
 +   }
 +
 +   return desc->block.bits / (desc->block.width * desc->block.height);
 +}
 +
 +/**
 + * Return bytes per pixel for the given format.
 + */
 +static INLINE uint
 +util_format_get_size(enum pipe_format format)
 +{
 +   uint bits = util_format_get_bits(format);
 +
 +   assert(bits % 8 == 0);
 +
 +   return bits / 8;
 +}
 +
 +static INLINE uint
 +util_format_get_component_bits(enum pipe_format format,
 +                               enum util_format_colorspace colorspace,
 +                               uint component)
 +{
 +   const struct util_format_description *desc = util_format_description(format);
 +   enum util_format_colorspace desc_colorspace;
 +
 +   assert(format);
 +   if (!format) {
 +      return 0;
 +   }
 +
 +   assert(component < 4);
 +
 +   /* Treat RGB and SRGB as equivalent. */
 +   if (colorspace == UTIL_FORMAT_COLORSPACE_SRGB) {
 +      colorspace = UTIL_FORMAT_COLORSPACE_RGB;
 +   }
 +   if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) {
 +      desc_colorspace = UTIL_FORMAT_COLORSPACE_RGB;
 +   } else {
 +      desc_colorspace = desc->colorspace;
 +   }
 +
 +   if (desc_colorspace != colorspace) {
 +      return 0;
 +   }
 +
 +   switch (desc->swizzle[component]) {
 +   case UTIL_FORMAT_SWIZZLE_X:
 +      return desc->channel[0].size;
 +   case UTIL_FORMAT_SWIZZLE_Y:
 +      return desc->channel[1].size;
 +   case UTIL_FORMAT_SWIZZLE_Z:
 +      return desc->channel[2].size;
 +   case UTIL_FORMAT_SWIZZLE_W:
 +      return desc->channel[3].size;
 +   default:
 +      return 0;
 +   }
 +}
 +
 +
 +/*
 + * Format access functions.
 + */
 +
  void
  util_format_read_4f(enum pipe_format format,
                      float *dst, unsigned dst_stride, 
@@@ -44,11 -44,10 +44,10 @@@ def colorspace_map(colorspace)
  
  
  colorspace_channels_map = {
-     'rgb': 'rgba',
-     'rgba': 'rgba',
-     'zs': 'zs',
-     'yuv': ['y1', 'y2', 'u', 'v'],
-     'dxt': []
+     'rgb': ['r', 'g', 'b', 'a'],
+     'srgb': ['sr', 'sg', 'sb', 'a'],
+     'zs': ['z', 's'],
+     'yuv': ['y', 'u', 'v'],
  }
  
  
@@@ -90,20 -89,11 +89,20 @@@ def write_format_table(formats)
      print 'const struct util_format_description'
      print 'util_format_description_table[] = '
      print "{"
 +    print "   {"
 +    print "      PIPE_FORMAT_NONE,"
 +    print "      \"PIPE_FORMAT_NONE\","
 +    print "      {0, 0, 0},"
 +    print "      0,"
 +    print "      {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},"
 +    print "      {0, 0, 0, 0},"
 +    print "      0"
 +    print "   },"
      for format in formats:
          print "   {"
          print "      %s," % (format.name,)
          print "      \"%s\"," % (format.name,)
-         print "      {%u, %u, %u}, /* block */" % (format.block_width, format.block_height, format.block_size())
+         print "      {%u, %u, %u},\t/* block */" % (format.block_width, format.block_height, format.block_size())
          print "      %s," % (layout_map(format.layout),)
          print "      {"
          for i in range(4):
                  sep = ","
              else:
                  sep = ""
-             print "         {%s, %s, %u}%s /* %s */" % (kind_map[type.kind], bool_map(type.norm), type.size, sep, "xyzw"[i])
+             print "         {%s, %s, %u}%s\t/* %s */" % (kind_map[type.kind], bool_map(type.norm), type.size, sep, "xyzw"[i])
          print "      },"
          print "      {"
          for i in range(4):
              else:
                  sep = ""
              try:
-                 comment = layout_channels_map[format.layout][i]
-             except:
+                 comment = colorspace_channels_map[format.colorspace][i]
+             except (KeyError, IndexError):
                  comment = 'ignored'
-             print "         %s%s /* %s */" % (swizzle_map[swizzle], sep, comment)
+             print "         %s%s\t/* %s */" % (swizzle_map[swizzle], sep, comment)
          print "      },"
          print "      %s," % (colorspace_map(format.colorspace),)
          print "   },"
 -    print "   {"
 -    print "      PIPE_FORMAT_NONE,"
 -    print "      \"PIPE_FORMAT_NONE\","
 -    print "      {0, 0, 0},"
 -    print "      0,"
 -    print "      {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}},"
 -    print "      {0, 0, 0, 0},"
 -    print "      0"
 -    print "   },"
      print "};"
  
  
  #include "pipe/p_shader_tokens.h"
  #include "pipe/p_state.h"
  
 +#include "util/u_format.h"
  #include "util/u_memory.h"
  #include "util/u_draw_quad.h"
  #include "util/u_gen_mipmap.h"
  #include "util/u_simple_shaders.h"
  #include "util/u_math.h"
+ #include "util/u_texture.h"
  
  #include "cso_cache/cso_context.h"
  
@@@ -997,7 -997,7 +998,7 @@@ reduce_2d(enum pipe_format pformat
  {
     enum dtype datatype;
     uint comps;
 -   const int bpt = pf_get_blocksize(pformat);
 +   const int bpt = util_format_get_size(pformat);
     const ubyte *srcA, *srcB;
     ubyte *dst;
     int row;
@@@ -1036,7 -1036,7 +1037,7 @@@ reduce_3d(enum pipe_format pformat
            int dstWidth, int dstHeight, int dstDepth,
            int dstRowStride, ubyte *dstPtr)
  {
 -   const int bpt = pf_get_blocksize(pformat);
 +   const int bpt = util_format_get_size(pformat);
     const int border = 0;
     int img, row;
     int bytesPerSrcImage, bytesPerDstImage;
@@@ -1160,8 -1160,8 +1161,8 @@@ make_2d_mipmap(struct gen_mipmap_state 
     const uint zslice = 0;
     uint dstLevel;
     
-    assert(pt->block.width == 1);
-    assert(pt->block.height == 1);
+    assert(pf_get_blockwidth(pt->format) == 1);
+    assert(pf_get_blockheight(pt->format) == 1);
  
     for (dstLevel = baseLevel + 1; dstLevel <= lastLevel; dstLevel++) {
        const uint srcLevel = dstLevel - 1;
@@@ -1205,8 -1205,8 +1206,8 @@@ make_3d_mipmap(struct gen_mipmap_state 
     struct pipe_screen *screen = pipe->screen;
     uint dstLevel, zslice = 0;
  
-    assert(pt->block.width == 1);
-    assert(pt->block.height == 1);
+    assert(pf_get_blockwidth(pt->format) == 1);
+    assert(pf_get_blockheight(pt->format) == 1);
  
     for (dstLevel = baseLevel + 1; dstLevel <= lastLevel; dstLevel++) {
        const uint srcLevel = dstLevel - 1;
@@@ -1318,7 -1318,7 +1319,7 @@@ util_create_gen_mipmap(struct pipe_cont
     }
  
     /* fragment shader */
-    ctx->fs = util_make_fragment_tex_shader(pipe);
+    ctx->fs = util_make_fragment_tex_shader(pipe, TGSI_TEXTURE_2D);
  
     /* vertex data that doesn't change */
     for (i = 0; i < 4; i++) {
@@@ -1384,59 -1384,9 +1385,9 @@@ set_vertex_data(struct gen_mipmap_stat
        static const float st[4][2] = {
           {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f}, {0.0f, 1.0f}
        };
-       float rx, ry, rz;
-       uint i;
-       /* loop over quad verts */
-       for (i = 0; i < 4; i++) {
-          /* Compute sc = +/-scale and tc = +/-scale.
-           * Not +/-1 to avoid cube face selection ambiguity near the edges,
-           * though that can still sometimes happen with this scale factor...
-           */
-          const float scale = 0.9999f;
-          const float sc = (2.0f * st[i][0] - 1.0f) * scale;
-          const float tc = (2.0f * st[i][1] - 1.0f) * scale;
-          switch (face) {
-          case PIPE_TEX_FACE_POS_X:
-             rx = 1.0f;
-             ry = -tc;
-             rz = -sc;
-             break;
-          case PIPE_TEX_FACE_NEG_X:
-             rx = -1.0f;
-             ry = -tc;
-             rz = sc;
-             break;
-          case PIPE_TEX_FACE_POS_Y:
-             rx = sc;
-             ry = 1.0f;
-             rz = tc;
-             break;
-          case PIPE_TEX_FACE_NEG_Y:
-             rx = sc;
-             ry = -1.0f;
-             rz = -tc;
-             break;
-          case PIPE_TEX_FACE_POS_Z:
-             rx = sc;
-             ry = -tc;
-             rz = 1.0f;
-             break;
-          case PIPE_TEX_FACE_NEG_Z:
-             rx = -sc;
-             ry = -tc;
-             rz = -1.0f;
-             break;
-          default:
-             rx = ry = rz = 0.0f;
-             assert(0);
-          }
  
-          ctx->vertices[i][1][0] = rx; /*s*/
-          ctx->vertices[i][1][1] = ry; /*t*/
-          ctx->vertices[i][1][2] = rz; /*r*/
-       }
+       util_map_texcoords2d_onto_cubemap(face, &st[0][0], 2,
+                                         &ctx->vertices[0][1][0], 8);
     }
     else {
        /* 1D/2D */
  
  #include "pipe/p_compiler.h"
  #include "pipe/p_format.h"
 +#include "util/u_format.h"
  #include "util/u_math.h"
  
  
+ union util_color {
+    ubyte ub;
+    ushort us;
+    uint ui;
+    float f[4];
+ };
  /**
   * Pack ubyte R,G,B,A into dest pixel.
   */
  static INLINE void
  util_pack_color_ub(ubyte r, ubyte g, ubyte b, ubyte a,
-                    enum pipe_format format, void *dest)
+                    enum pipe_format format, union util_color *uc)
  {
     switch (format) {
     case PIPE_FORMAT_R8G8B8A8_UNORM:
        {
-          uint *d = (uint *) dest;
-          *d = (r << 24) | (g << 16) | (b << 8) | a;
+          uc->ui = (r << 24) | (g << 16) | (b << 8) | a;
        }
        return;
     case PIPE_FORMAT_R8G8B8X8_UNORM:
        {
-          uint *d = (uint *) dest;
-          *d = (r << 24) | (g << 16) | (b << 8) | 0xff;
+          uc->ui = (r << 24) | (g << 16) | (b << 8) | 0xff;
        }
        return;
     case PIPE_FORMAT_A8R8G8B8_UNORM:
        {
-          uint *d = (uint *) dest;
-          *d = (a << 24) | (r << 16) | (g << 8) | b;
+          uc->ui = (a << 24) | (r << 16) | (g << 8) | b;
        }
        return;
     case PIPE_FORMAT_X8R8G8B8_UNORM:
        {
-          uint *d = (uint *) dest;
-          *d = (0xff << 24) | (r << 16) | (g << 8) | b;
+          uc->ui = (0xff << 24) | (r << 16) | (g << 8) | b;
        }
        return;
     case PIPE_FORMAT_B8G8R8A8_UNORM:
        {
-          uint *d = (uint *) dest;
-          *d = (b << 24) | (g << 16) | (r << 8) | a;
+          uc->ui = (b << 24) | (g << 16) | (r << 8) | a;
        }
        return;
     case PIPE_FORMAT_B8G8R8X8_UNORM:
        {
-          uint *d = (uint *) dest;
-          *d = (b << 24) | (g << 16) | (r << 8) | 0xff;
+          uc->ui = (b << 24) | (g << 16) | (r << 8) | 0xff;
        }
        return;
     case PIPE_FORMAT_R5G6B5_UNORM:
        {
-          ushort *d = (ushort *) dest;
-          *d = ((r & 0xf8) << 8) | ((g & 0xfc) << 3) | (b >> 3);
+          uc->us = ((r & 0xf8) << 8) | ((g & 0xfc) << 3) | (b >> 3);
        }
        return;
     case PIPE_FORMAT_A1R5G5B5_UNORM:
        {
-          ushort *d = (ushort *) dest;
-          *d = ((a & 0x80) << 8) | ((r & 0xf8) << 7) | ((g & 0xf8) << 2) | (b >> 3);
+          uc->us = ((a & 0x80) << 8) | ((r & 0xf8) << 7) | ((g & 0xf8) << 2) | (b >> 3);
        }
        return;
     case PIPE_FORMAT_A4R4G4B4_UNORM:
        {
-          ushort *d = (ushort *) dest;
-          *d = ((a & 0xf0) << 8) | ((r & 0xf0) << 4) | ((g & 0xf0) << 0) | (b >> 4);
+          uc->us = ((a & 0xf0) << 8) | ((r & 0xf0) << 4) | ((g & 0xf0) << 0) | (b >> 4);
        }
        return;
     case PIPE_FORMAT_A8_UNORM:
        {
-          ubyte *d = (ubyte *) dest;
-          *d = a;
+          uc->ub = a;
        }
        return;
     case PIPE_FORMAT_L8_UNORM:
     case PIPE_FORMAT_I8_UNORM:
        {
-          ubyte *d = (ubyte *) dest;
-          *d = r;
+          uc->ub = a;
        }
        return;
     case PIPE_FORMAT_R32G32B32A32_FLOAT:
        {
-          float *d = (float *) dest;
-          d[0] = (float)r / 255.0f;
-          d[1] = (float)g / 255.0f;
-          d[2] = (float)b / 255.0f;
-          d[3] = (float)a / 255.0f;
+          uc->f[0] = (float)r / 255.0f;
+          uc->f[1] = (float)g / 255.0f;
+          uc->f[2] = (float)b / 255.0f;
+          uc->f[3] = (float)a / 255.0f;
        }
        return;
     case PIPE_FORMAT_R32G32B32_FLOAT:
        {
-          float *d = (float *) dest;
-          d[0] = (float)r / 255.0f;
-          d[1] = (float)g / 255.0f;
-          d[2] = (float)b / 255.0f;
+          uc->f[0] = (float)r / 255.0f;
+          uc->f[1] = (float)g / 255.0f;
+          uc->f[2] = (float)b / 255.0f;
        }
        return;
  
     /* XXX lots more cases to add */
     default:
+       uc->ui = 0; /* keep compiler happy */
        debug_print_format("gallium: unhandled format in util_pack_color_ub()", format);
        assert(0);
     }
   * Unpack RGBA from a packed pixel, returning values as ubytes in [0,255].
   */
  static INLINE void
- util_unpack_color_ub(enum pipe_format format, const void *src,
+ util_unpack_color_ub(enum pipe_format format, union util_color *uc,
                       ubyte *r, ubyte *g, ubyte *b, ubyte *a)
  {
     switch (format) {
     case PIPE_FORMAT_R8G8B8A8_UNORM:
        {
-          uint p = ((const uint *) src)[0];
+          uint p = uc->ui;
           *r = (ubyte) ((p >> 24) & 0xff);
           *g = (ubyte) ((p >> 16) & 0xff);
           *b = (ubyte) ((p >>  8) & 0xff);
        return;
     case PIPE_FORMAT_R8G8B8X8_UNORM:
        {
-          uint p = ((const uint *) src)[0];
+          uint p = uc->ui;
           *r = (ubyte) ((p >> 24) & 0xff);
           *g = (ubyte) ((p >> 16) & 0xff);
           *b = (ubyte) ((p >>  8) & 0xff);
        return;
     case PIPE_FORMAT_A8R8G8B8_UNORM:
        {
-          uint p = ((const uint *) src)[0];
+          uint p = uc->ui;
           *r = (ubyte) ((p >> 16) & 0xff);
           *g = (ubyte) ((p >>  8) & 0xff);
           *b = (ubyte) ((p >>  0) & 0xff);
        return;
     case PIPE_FORMAT_X8R8G8B8_UNORM:
        {
-          uint p = ((const uint *) src)[0];
+          uint p = uc->ui;
           *r = (ubyte) ((p >> 16) & 0xff);
           *g = (ubyte) ((p >>  8) & 0xff);
           *b = (ubyte) ((p >>  0) & 0xff);
        return;
     case PIPE_FORMAT_B8G8R8A8_UNORM:
        {
-          uint p = ((const uint *) src)[0];
+          uint p = uc->ui;
           *r = (ubyte) ((p >>  8) & 0xff);
           *g = (ubyte) ((p >> 16) & 0xff);
           *b = (ubyte) ((p >> 24) & 0xff);
        return;
     case PIPE_FORMAT_B8G8R8X8_UNORM:
        {
-          uint p = ((const uint *) src)[0];
+          uint p = uc->ui;
           *r = (ubyte) ((p >>  8) & 0xff);
           *g = (ubyte) ((p >> 16) & 0xff);
           *b = (ubyte) ((p >> 24) & 0xff);
        return;
     case PIPE_FORMAT_R5G6B5_UNORM:
        {
-          ushort p = ((const ushort *) src)[0];
+          ushort p = uc->us;
           *r = (ubyte) (((p >> 8) & 0xf8) | ((p >> 13) & 0x7));
           *g = (ubyte) (((p >> 3) & 0xfc) | ((p >>  9) & 0x3));
           *b = (ubyte) (((p << 3) & 0xf8) | ((p >>  2) & 0x7));
        return;
     case PIPE_FORMAT_A1R5G5B5_UNORM:
        {
-          ushort p = ((const ushort *) src)[0];
+          ushort p = uc->us;
           *r = (ubyte) (((p >>  7) & 0xf8) | ((p >> 12) & 0x7));
           *g = (ubyte) (((p >>  2) & 0xf8) | ((p >>  7) & 0x7));
           *b = (ubyte) (((p <<  3) & 0xf8) | ((p >>  2) & 0x7));
        return;
     case PIPE_FORMAT_A4R4G4B4_UNORM:
        {
-          ushort p = ((const ushort *) src)[0];
+          ushort p = uc->us;
           *r = (ubyte) (((p >> 4) & 0xf0) | ((p >>  8) & 0xf));
           *g = (ubyte) (((p >> 0) & 0xf0) | ((p >>  4) & 0xf));
           *b = (ubyte) (((p << 4) & 0xf0) | ((p >>  0) & 0xf));
        return;
     case PIPE_FORMAT_A8_UNORM:
        {
-          ubyte p = ((const ubyte *) src)[0];
+          ubyte p = uc->ub;
           *r = *g = *b = (ubyte) 0xff;
           *a = p;
        }
        return;
     case PIPE_FORMAT_L8_UNORM:
        {
-          ubyte p = ((const ubyte *) src)[0];
+          ubyte p = uc->ub;
           *r = *g = *b = p;
           *a = (ubyte) 0xff;
        }
        return;
     case PIPE_FORMAT_I8_UNORM:
        {
-          ubyte p = ((const ubyte *) src)[0];
+          ubyte p = uc->ub;
           *r = *g = *b = *a = p;
        }
        return;
     case PIPE_FORMAT_R32G32B32A32_FLOAT:
        {
-          const float *p = (const float *) src;
+          const float *p = &uc->f[0];
           *r = float_to_ubyte(p[0]);
           *g = float_to_ubyte(p[1]);
           *b = float_to_ubyte(p[2]);
        return;
     case PIPE_FORMAT_R32G32B32_FLOAT:
        {
-          const float *p = (const float *) src;
+          const float *p = &uc->f[0];
           *r = float_to_ubyte(p[0]);
           *g = float_to_ubyte(p[1]);
           *b = float_to_ubyte(p[2]);
  
     case PIPE_FORMAT_R32G32_FLOAT:
        {
-          const float *p = (const float *) src;
+          const float *p = &uc->f[0];
           *r = float_to_ubyte(p[0]);
           *g = float_to_ubyte(p[1]);
           *b = *a = (ubyte) 0xff;
  
     case PIPE_FORMAT_R32_FLOAT:
        {
-          const float *p = (const float *) src;
+          const float *p = &uc->f[0];
           *r = float_to_ubyte(p[0]);
           *g = *b = *a = (ubyte) 0xff;
        }
        assert(0);
     }
  }
-  
  
  
  /**
   * Note rgba outside [0,1] will be clamped for int pixel formats.
   */
  static INLINE void
- util_pack_color(const float rgba[4], enum pipe_format format, void *dest)
+ util_pack_color(const float rgba[4], enum pipe_format format, union util_color *uc)
  {
     ubyte r = 0;
     ubyte g = 0;
     ubyte b = 0;
     ubyte a = 0;
  
 -   if (pf_size_x(format) <= 8) {
 +   if (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 0) <= 8) {
        /* format uses 8-bit components or less */
        r = float_to_ubyte(rgba[0]);
        g = float_to_ubyte(rgba[1]);
     switch (format) {
     case PIPE_FORMAT_R8G8B8A8_UNORM:
        {
-          uint *d = (uint *) dest;
-          *d = (r << 24) | (g << 16) | (b << 8) | a;
+          uc->ui = (r << 24) | (g << 16) | (b << 8) | a;
        }
        return;
     case PIPE_FORMAT_R8G8B8X8_UNORM:
        {
-          uint *d = (uint *) dest;
-          *d = (r << 24) | (g << 16) | (b << 8) | 0xff;
+          uc->ui = (r << 24) | (g << 16) | (b << 8) | 0xff;
        }
        return;
     case PIPE_FORMAT_A8R8G8B8_UNORM:
        {
-          uint *d = (uint *) dest;
-          *d = (a << 24) | (r << 16) | (g << 8) | b;
+          uc->ui = (a << 24) | (r << 16) | (g << 8) | b;
        }
        return;
     case PIPE_FORMAT_X8R8G8B8_UNORM:
        {
-          uint *d = (uint *) dest;
-          *d = (0xff << 24) | (r << 16) | (g << 8) | b;
+          uc->ui = (0xff << 24) | (r << 16) | (g << 8) | b;
        }
        return;
     case PIPE_FORMAT_B8G8R8A8_UNORM:
        {
-          uint *d = (uint *) dest;
-          *d = (b << 24) | (g << 16) | (r << 8) | a;
+          uc->ui = (b << 24) | (g << 16) | (r << 8) | a;
        }
        return;
     case PIPE_FORMAT_B8G8R8X8_UNORM:
        {
-          uint *d = (uint *) dest;
-          *d = (b << 24) | (g << 16) | (r << 8) | 0xff;
+          uc->ui = (b << 24) | (g << 16) | (r << 8) | 0xff;
        }
        return;
     case PIPE_FORMAT_R5G6B5_UNORM:
        {
-          ushort *d = (ushort *) dest;
-          *d = ((r & 0xf8) << 8) | ((g & 0xfc) << 3) | (b >> 3);
+          uc->us = ((r & 0xf8) << 8) | ((g & 0xfc) << 3) | (b >> 3);
        }
        return;
     case PIPE_FORMAT_A1R5G5B5_UNORM:
        {
-          ushort *d = (ushort *) dest;
-          *d = ((a & 0x80) << 8) | ((r & 0xf8) << 7) | ((g & 0xf8) << 2) | (b >> 3);
+          uc->us = ((a & 0x80) << 8) | ((r & 0xf8) << 7) | ((g & 0xf8) << 2) | (b >> 3);
        }
        return;
     case PIPE_FORMAT_A4R4G4B4_UNORM:
        {
-          ushort *d = (ushort *) dest;
-          *d = ((a & 0xf0) << 8) | ((r & 0xf0) << 4) | ((g & 0xf0) << 0) | (b >> 4);
+          uc->ub = ((a & 0xf0) << 8) | ((r & 0xf0) << 4) | ((g & 0xf0) << 0) | (b >> 4);
        }
        return;
     case PIPE_FORMAT_A8_UNORM:
        {
-          ubyte *d = (ubyte *) dest;
-          *d = a;
+          uc->ub = a;
        }
        return;
     case PIPE_FORMAT_L8_UNORM:
     case PIPE_FORMAT_I8_UNORM:
        {
-          ubyte *d = (ubyte *) dest;
-          *d = r;
+          uc->ub = r;
        }
        return;
     case PIPE_FORMAT_R32G32B32A32_FLOAT:
        {
-          float *d = (float *) dest;
-          d[0] = rgba[0];
-          d[1] = rgba[1];
-          d[2] = rgba[2];
-          d[3] = rgba[3];
+          uc->f[0] = rgba[0];
+          uc->f[1] = rgba[1];
+          uc->f[2] = rgba[2];
+          uc->f[3] = rgba[3];
        }
        return;
     case PIPE_FORMAT_R32G32B32_FLOAT:
        {
-          float *d = (float *) dest;
-          d[0] = rgba[0];
-          d[1] = rgba[1];
-          d[2] = rgba[2];
+          uc->f[0] = rgba[0];
+          uc->f[1] = rgba[1];
+          uc->f[2] = rgba[2];
        }
        return;
     /* XXX lots more cases to add */
     default:
+       uc->ui = 0; /* keep compiler happy */
        debug_print_format("gallium: unhandled format in util_pack_color()", format);
        assert(0);
     }
@@@ -36,7 -36,6 +36,7 @@@
  #include "pipe/p_state.h"
  #include "pipe/p_defines.h"
  
 +#include "util/u_format.h"
  #include "util/u_surface.h"
  
  
@@@ -83,7 -82,6 +83,6 @@@ util_create_rgba_surface(struct pipe_sc
     templ.width0 = width;
     templ.height0 = height;
     templ.depth0 = 1;
-    util_format_get_block(format, &templ.block);
     templ.tex_usage = usage;
  
     *textureOut = screen->texture_create(screen, &templ);
@@@ -29,7 -29,6 +29,7 @@@
  #include <assert.h>
  #include <pipe/p_context.h>
  #include <pipe/p_inlines.h>
 +#include <util/u_format.h>
  #include <util/u_math.h>
  #include <util/u_memory.h>
  #include <tgsi/tgsi_parse.h>
@@@ -835,7 -834,6 +835,6 @@@ init_buffers(struct vl_mpeg12_mc_render
     template.height0 = r->pot_buffers ?
        util_next_power_of_two(r->picture_height) : r->picture_height;
     template.depth0 = 1;
-    util_format_get_block(template.format, &template.block);
     template.tex_usage = PIPE_TEXTURE_USAGE_SAMPLER | PIPE_TEXTURE_USAGE_DYNAMIC;
  
     r->textures.individual.y = r->pipe->screen->texture_create(r->pipe->screen, &template);
@@@ -1445,7 -1443,7 +1444,7 @@@ grab_blocks(struct vl_mpeg12_mc_rendere
     assert(r);
     assert(blocks);
  
-    tex_pitch = r->tex_transfer[0]->stride / r->tex_transfer[0]->block.size;
+    tex_pitch = r->tex_transfer[0]->stride / pf_get_blocksize(r->tex_transfer[0]->texture->format);
     texels = r->texels[0] + mbpy * tex_pitch + mbpx;
  
     for (y = 0; y < 2; ++y) {
     mbpy /= 2;
  
     for (tb = 0; tb < 2; ++tb) {
-       tex_pitch = r->tex_transfer[tb + 1]->stride / r->tex_transfer[tb + 1]->block.size;
+       tex_pitch = r->tex_transfer[tb + 1]->stride / pf_get_blocksize(r->tex_transfer[tb + 1]->texture->format);
        texels = r->texels[tb + 1] + mbpy * tex_pitch + mbpx;
  
        if ((cbp >> (1 - tb)) & 1) {
@@@ -35,8 -35,6 +35,8 @@@
  #include "pipe/p_defines.h"
  #include "pipe/p_inlines.h"
  #include "pipe/internal/p_winsys_screen.h"
 +
 +#include "util/u_format.h"
  #include "util/u_math.h"
  #include "util/u_memory.h"
  
@@@ -67,14 -65,11 +67,11 @@@ cell_texture_layout(struct cell_textur
        w_tile = align(width, TILE_SIZE);
        h_tile = align(height, TILE_SIZE);
  
-       pt->nblocksx[level] = pf_get_nblocksx(&pt->block, w_tile);  
-       pt->nblocksy[level] = pf_get_nblocksy(&pt->block, h_tile);  
-       ct->stride[level] = pt->nblocksx[level] * pt->block.size;
+       ct->stride[level] = pf_get_stride(pt->format, w_tile);
  
        ct->level_offset[level] = ct->buffer_size;
  
-       size = pt->nblocksx[level] * pt->nblocksy[level] * pt->block.size;
+       size = ct->stride[level] * pf_get_nblocksy(pt->format, h_tile);
        if (pt->target == PIPE_TEXTURE_CUBE)
           size *= 6;
        else
@@@ -285,10 -280,12 +282,12 @@@ cell_get_tex_surface(struct pipe_scree
        ps->zslice = zslice;
  
        if (pt->target == PIPE_TEXTURE_CUBE) {
-          ps->offset += face * pt->nblocksy[level] * ct->stride[level];
+          unsigned h_tile = align(ps->height, TILE_SIZE);
+          ps->offset += face * pf_get_nblocksy(ps->format, h_tile) * ct->stride[level];
        }
        else if (pt->target == PIPE_TEXTURE_3D) {
-          ps->offset += zslice * pt->nblocksy[level] * ct->stride[level];
+          unsigned h_tile = align(ps->height, TILE_SIZE);
+          ps->offset += zslice * pf_get_nblocksy(ps->format, h_tile) * ct->stride[level];
        }
        else {
           assert(face == 0);
@@@ -329,14 -326,10 +328,10 @@@ cell_get_tex_transfer(struct pipe_scree
     if (ctrans) {
        struct pipe_transfer *pt = &ctrans->base;
        pipe_texture_reference(&pt->texture, texture);
-       pt->format = texture->format;
-       pt->block = texture->block;
        pt->x = x;
        pt->y = y;
        pt->width = w;
        pt->height = h;
-       pt->nblocksx = texture->nblocksx[level];
-       pt->nblocksy = texture->nblocksy[level];
        pt->stride = ct->stride[level];
        pt->usage = usage;
        pt->face = face;
        ctrans->offset = ct->level_offset[level];
  
        if (texture->target == PIPE_TEXTURE_CUBE) {
-          ctrans->offset += face * pt->nblocksy * pt->stride;
+          unsigned h_tile = align(u_minify(texture->height0, level), TILE_SIZE);
+          ctrans->offset += face * pf_get_nblocksy(texture->format, h_tile) * pt->stride;
        }
        else if (texture->target == PIPE_TEXTURE_3D) {
-          ctrans->offset += zslice * pt->nblocksy * pt->stride;
+          unsigned h_tile = align(u_minify(texture->height0, level), TILE_SIZE);
+          ctrans->offset += zslice * pf_get_nblocksy(texture->format, h_tile) * pt->stride;
        }
        else {
           assert(face == 0);
@@@ -402,7 -397,8 +399,8 @@@ cell_transfer_map(struct pipe_screen *s
      * Create a buffer of ordinary memory for the linear texture.
      * This is the memory that the user will read/write.
      */
-    size = pt->nblocksx[level] * pt->nblocksy[level] * pt->block.size;
+    size = pf_get_stride(pt->format, align(texWidth, TILE_SIZE)) *
+           pf_get_nblocksy(pt->format, align(texHeight, TILE_SIZE));
  
     ctrans->map = align_malloc(size, 16);
     if (!ctrans->map)
  
     if (transfer->usage & PIPE_TRANSFER_READ) {
        /* need to untwiddle the texture to make a linear version */
 -      const uint bpp = pf_get_blocksize(ct->base.format);
 +      const uint bpp = util_format_get_size(ct->base.format);
        if (bpp == 4) {
           const uint *src = (uint *) (ct->mapped + ctrans->offset);
           uint *dst = ctrans->map;
@@@ -453,7 -449,7 +451,7 @@@ cell_transfer_unmap(struct pipe_screen 
        /* The user wrote new texture data into the mapped buffer.
         * We need to convert the new linear data into the twiddled/tiled format.
         */
 -      const uint bpp = pf_get_blocksize(ct->base.format);
 +      const uint bpp = util_format_get_size(ct->base.format);
        if (bpp == 4) {
           const uint *src = ctrans->map;
           uint *dst = (uint *) (ct->mapped + ctrans->offset);
@@@ -34,8 -34,6 +34,8 @@@
  #include "pipe/p_defines.h"
  #include "pipe/p_inlines.h"
  #include "pipe/internal/p_winsys_screen.h"
 +
 +#include "util/u_format.h"
  #include "util/u_math.h"
  #include "util/u_memory.h"
  
@@@ -50,7 -48,6 +50,6 @@@
  /* Simple, maximally packed layout.
   */
  
  /* Conventional allocation path for non-display textures:
   */
  static boolean
@@@ -65,20 -62,15 +64,15 @@@ llvmpipe_texture_layout(struct llvmpipe
  
     unsigned buffer_size = 0;
  
-    util_format_get_block(lpt->base.format, &lpt->base.block);
     for (level = 0; level <= pt->last_level; level++) {
        unsigned nblocksx, nblocksy;
  
-       pt->nblocksx[level] = pf_get_nblocksx(&pt->block, width);  
-       pt->nblocksy[level] = pf_get_nblocksy(&pt->block, height);
        /* Allocate storage for whole quads. This is particularly important
         * for depth surfaces, which are currently stored in a swizzled format. */
-       nblocksx = pf_get_nblocksx(&pt->block, align(width, 2));
-       nblocksy = pf_get_nblocksy(&pt->block, align(height, 2));
+       nblocksx = pf_get_nblocksx(pt->format, align(width, 2));
+       nblocksy = pf_get_nblocksy(pt->format, align(height, 2));
  
-       lpt->stride[level] = align(nblocksx*pt->block.size, 16);
+       lpt->stride[level] = align(nblocksx * pf_get_blocksize(pt->format), 16);
  
        lpt->level_offset[level] = buffer_size;
  
@@@ -102,10 -94,6 +96,6 @@@ llvmpipe_displaytarget_layout(struct ll
  {
     struct llvmpipe_winsys *winsys = screen->winsys;
  
-    util_format_get_block(lpt->base.format, &lpt->base.block);
-    lpt->base.nblocksx[0] = pf_get_nblocksx(&lpt->base.block, lpt->base.width0);  
-    lpt->base.nblocksy[0] = pf_get_nblocksy(&lpt->base.block, lpt->base.height0);  
     lpt->dt = winsys->displaytarget_create(winsys,
                                            lpt->base.format,
                                            lpt->base.width0,
@@@ -182,8 -170,6 +172,6 @@@ llvmpipe_texture_blanket(struct pipe_sc
     lpt->base = *base;
     pipe_reference_init(&lpt->base.reference, 1);
     lpt->base.screen = screen;
-    lpt->base.nblocksx[0] = pf_get_nblocksx(&lpt->base.block, lpt->base.width0);  
-    lpt->base.nblocksy[0] = pf_get_nblocksy(&lpt->base.block, lpt->base.height0);  
     lpt->stride[0] = stride[0];
  
     pipe_buffer_reference(&lpt->buffer, buffer);
@@@ -257,11 -243,17 +245,17 @@@ llvmpipe_get_tex_surface(struct pipe_sc
        ps->level = level;
        ps->zslice = zslice;
  
+       /* XXX shouldn't that rather be
+          tex_height = align(ps->height, 2);
+          to account for alignment done in llvmpipe_texture_layout ?
+       */
        if (pt->target == PIPE_TEXTURE_CUBE) {
-          ps->offset += face * pt->nblocksy[level] * lpt->stride[level];
+          unsigned tex_height = ps->height;
+          ps->offset += face * pf_get_nblocksy(pt->format, tex_height) * lpt->stride[level];
        }
        else if (pt->target == PIPE_TEXTURE_3D) {
-          ps->offset += zslice * pt->nblocksy[level] * lpt->stride[level];
+          unsigned tex_height = ps->height;
+          ps->offset += zslice * pf_get_nblocksy(pt->format, tex_height) * lpt->stride[level];
        }
        else {
           assert(face == 0);
@@@ -302,14 -294,10 +296,10 @@@ llvmpipe_get_tex_transfer(struct pipe_s
     if (lpt) {
        struct pipe_transfer *pt = &lpt->base;
        pipe_texture_reference(&pt->texture, texture);
-       pt->format = texture->format;
-       pt->block = texture->block;
        pt->x = x;
        pt->y = y;
        pt->width = w;
        pt->height = h;
-       pt->nblocksx = texture->nblocksx[level];
-       pt->nblocksy = texture->nblocksy[level];
        pt->stride = lptex->stride[level];
        pt->usage = usage;
        pt->face = face;
  
        lpt->offset = lptex->level_offset[level];
  
+       /* XXX shouldn't that rather be
+          tex_height = align(u_minify(texture->height0, level), 2)
+          to account for alignment done in llvmpipe_texture_layout ?
+       */
        if (texture->target == PIPE_TEXTURE_CUBE) {
-          lpt->offset += face * pt->nblocksy * pt->stride;
+          unsigned tex_height = u_minify(texture->height0, level);
+          lpt->offset += face *  pf_get_nblocksy(texture->format, tex_height) * pt->stride;
        }
        else if (texture->target == PIPE_TEXTURE_3D) {
-          lpt->offset += zslice * pt->nblocksy * pt->stride;
+          unsigned tex_height = u_minify(texture->height0, level);
+          lpt->offset += zslice * pf_get_nblocksy(texture->format, tex_height) * pt->stride;
        }
        else {
           assert(face == 0);
@@@ -354,9 -348,11 +350,11 @@@ llvmpipe_transfer_map( struct pipe_scre
     struct llvmpipe_screen *screen = llvmpipe_screen(_screen);
     ubyte *map, *xfer_map;
     struct llvmpipe_texture *lpt;
+    enum pipe_format format;
  
     assert(transfer->texture);
     lpt = llvmpipe_texture(transfer->texture);
+    format = lpt->base.format;
  
     if(lpt->dt) {
        struct llvmpipe_winsys *winsys = screen->winsys;
     }
     
     xfer_map = map + llvmpipe_transfer(transfer)->offset +
-       transfer->y / transfer->block.height * transfer->stride +
-       transfer->x / transfer->block.width * transfer->block.size;
+       transfer->y / pf_get_blockheight(format) * transfer->stride +
+       transfer->x / pf_get_blockwidth(format) * pf_get_blocksize(format);
     /*printf("map = %p  xfer map = %p\n", map, xfer_map);*/
     return xfer_map;
  }
@@@ -25,8 -25,6 +25,8 @@@
  
  #include "nouveau/nouveau_stateobj.h"
  
 +#include "util/u_format.h"
 +
  #define _MIXED(pf, t0, t1, t2, t3, cr, cg, cb, ca, f)         \
  {                                                             \
        PIPE_FORMAT_##pf,                                       \
@@@ -70,6 -68,7 +70,7 @@@ static const struct nv50_texture_forma
        _(DXT5_RGBA, UNORM, C0, C1, C2, C3, DXT5),
  
        _MIXED(Z24S8_UNORM, UINT, UNORM, UINT, UINT, C1, C1, C1, ONE, 24_8),
+       _MIXED(S8Z24_UNORM, UNORM, UINT, UINT, UINT, C0, C0, C0, ONE, 8_24),
  
        _(R16G16B16A16_SNORM, UNORM, C0, C1, C2, C3, 16_16_16_16),
        _(R16G16B16A16_UNORM, SNORM, C0, C1, C2, C3, 16_16_16_16),
  
  static int
  nv50_tex_construct(struct nv50_context *nv50, struct nouveau_stateobj *so,
-                  struct nv50_miptree *mt, int unit)
+                  struct nv50_miptree *mt, int unit, unsigned p)
  {
        unsigned i;
        uint32_t mode;
 +      const struct util_format_description *desc;
  
        for (i = 0; i < NV50_TEX_FORMAT_LIST_SIZE; i++)
                if (nv50_tex_format_list[i].pf == mt->base.base.format)
        if (i == NV50_TEX_FORMAT_LIST_SIZE)
                  return 1;
  
-       if (nv50->sampler[unit]->normalized)
+       if (nv50->sampler[p][unit]->normalized)
                mode = 0x50001000 | (1 << 31);
        else {
                mode = 0x50001000 | (7 << 14);
        mode |= ((mt->base.bo->tile_mode & 0x0f) << 22) |
                ((mt->base.bo->tile_mode & 0xf0) << 21);
  
 -      if (pf_type(mt->base.base.format) == PIPE_FORMAT_TYPE_SRGB)
 +      desc = util_format_description(mt->base.base.format);
 +      assert(desc);
 +
 +      if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB)
                mode |= 0x0400;
  
        switch (mt->base.base.target) {
        return 0;
  }
  
- void
- nv50_tex_validate(struct nv50_context *nv50)
+ #ifndef NV50TCL_BIND_TIC
+ #define NV50TCL_BIND_TIC(n) (0x1448 + 8 * n)
+ #endif
+ static boolean
+ nv50_validate_textures(struct nv50_context *nv50, struct nouveau_stateobj *so,
+                      unsigned p)
  {
+       static const unsigned p_remap[PIPE_SHADER_TYPES] = { 0, 2 };
        struct nouveau_grobj *eng2d = nv50->screen->eng2d;
        struct nouveau_grobj *tesla = nv50->screen->tesla;
-       struct nouveau_stateobj *so;
-       unsigned i, unit, push;
-       push = MAX2(nv50->miptree_nr, nv50->state.miptree_nr) * 2 + 23 + 6;
-       so = so_new(nv50->miptree_nr * 9 + push, nv50->miptree_nr * 2 + 2);
+       unsigned unit, j, p_hw = p_remap[p];
  
        nv50_so_init_sifc(nv50, so, nv50->screen->tic, NOUVEAU_BO_VRAM,
-                         nv50->miptree_nr * 8 * 4);
+                         p * (32 * 8 * 4), nv50->miptree_nr[p] * 8 * 4);
  
-       for (i = 0, unit = 0; unit < nv50->miptree_nr; ++unit) {
-               struct nv50_miptree *mt = nv50->miptree[unit];
-               if (!mt)
-                       continue;
+       for (unit = 0; unit < nv50->miptree_nr[p]; ++unit) {
+               struct nv50_miptree *mt = nv50->miptree[p][unit];
  
                so_method(so, eng2d, NV50_2D_SIFC_DATA | (2 << 29), 8);
-               if (nv50_tex_construct(nv50, so, mt, unit)) {
-                       NOUVEAU_ERR("failed tex validate\n");
-                       so_ref(NULL, &so);
-                       return;
+               if (mt) {
+                       if (nv50_tex_construct(nv50, so, mt, unit, p))
+                               return FALSE;
+                       /* Set TEX insn $t src binding $unit in program type p
+                        * to TIC, TSC entry (32 * p + unit), mark valid (1).
+                        */
+                       so_method(so, tesla, NV50TCL_BIND_TIC(p_hw), 1);
+                       so_data  (so, ((32 * p + unit) << 9) | (unit << 1) | 1);
+               } else {
+                       for (j = 0; j < 8; ++j)
+                               so_data(so, 0);
+                       so_method(so, tesla, NV50TCL_BIND_TIC(p_hw), 1);
+                       so_data  (so, (unit << 1) | 0);
                }
+       }
+       for (; unit < nv50->state.miptree_nr[p]; unit++) {
+               /* Make other bindings invalid. */
+               so_method(so, tesla, NV50TCL_BIND_TIC(p_hw), 1);
+               so_data  (so, (unit << 1) | 0);
+       }
+       nv50->state.miptree_nr[p] = nv50->miptree_nr[p];
+       return TRUE;
+ }
  
-               so_method(so, tesla, NV50TCL_SET_SAMPLER_TEX, 1);
-               so_data  (so, (i++ << NV50TCL_SET_SAMPLER_TEX_TIC_SHIFT) |
-                         (unit << NV50TCL_SET_SAMPLER_TEX_SAMPLER_SHIFT) |
-                         NV50TCL_SET_SAMPLER_TEX_VALID);
+ void
+ nv50_tex_validate(struct nv50_context *nv50)
+ {
+       struct nouveau_stateobj *so;
+       struct nouveau_grobj *tesla = nv50->screen->tesla;
+       unsigned p, push, nrlc;
+       for (nrlc = 0, push = 0, p = 0; p < PIPE_SHADER_TYPES; ++p) {
+               push += MAX2(nv50->miptree_nr[p], nv50->state.miptree_nr[p]);
+               nrlc += nv50->miptree_nr[p];
        }
+       push = push * 11 + 23 * PIPE_SHADER_TYPES + 4;
+       nrlc = nrlc * 2 + 2 * PIPE_SHADER_TYPES;
+       so = so_new(push, nrlc);
+       if (nv50_validate_textures(nv50, so, PIPE_SHADER_VERTEX) == FALSE ||
+           nv50_validate_textures(nv50, so, PIPE_SHADER_FRAGMENT) == FALSE) {
+               so_ref(NULL, &so);
  
-       for (; unit < nv50->state.miptree_nr; unit++) {
-               so_method(so, tesla, NV50TCL_SET_SAMPLER_TEX, 1);
-               so_data  (so,
-                         (unit << NV50TCL_SET_SAMPLER_TEX_SAMPLER_SHIFT) | 0);
+               NOUVEAU_ERR("failed tex validate\n");
+               return;
        }
  
        /* not sure if the following really do what I think: */
-       so_method(so, tesla, 0x1440, 1); /* sync SIFC */
-       so_data  (so, 0);
        so_method(so, tesla, 0x1330, 1); /* flush TIC */
        so_data  (so, 0);
        so_method(so, tesla, 0x1338, 1); /* flush texture caches */
  
        so_ref(so, &nv50->state.tic_upload);
        so_ref(NULL, &so);
-       nv50->state.miptree_nr = nv50->miptree_nr;
  }
@@@ -1,5 -1,6 +1,6 @@@
  /*
   * Copyright 2008 Corbin Simpson <MostAwesomeDude@gmail.com>
+  * Copyright 2009 Marek Olšák <maraeo@gmail.com>
   *
   * Permission is hereby granted, free of charge, to any person obtaining a
   * copy of this software and associated documentation files (the "Software"),
@@@ -22,7 -23,6 +23,7 @@@
  
  /* r300_emit: Functions for emitting state. */
  
 +#include "util/u_format.h"
  #include "util/u_math.h"
  
  #include "r300_context.h"
@@@ -41,9 -41,16 +42,16 @@@ void r300_emit_blend_state(struct r300_
      CS_LOCALS(r300);
      BEGIN_CS(8);
      OUT_CS_REG_SEQ(R300_RB3D_CBLEND, 3);
-     OUT_CS(blend->blend_control);
-     OUT_CS(blend->alpha_blend_control);
-     OUT_CS(blend->color_channel_mask);
+     if (r300->framebuffer_state.nr_cbufs) {
+         OUT_CS(blend->blend_control);
+         OUT_CS(blend->alpha_blend_control);
+         OUT_CS(blend->color_channel_mask);
+     } else {
+         OUT_CS(0);
+         OUT_CS(0);
+         OUT_CS(0);
+         /* XXX also disable fastfill here once it's supported */
+     }
      OUT_CS_REG(R300_RB3D_ROPCNTL, blend->rop);
      OUT_CS_REG(R300_RB3D_DITHER_CTL, blend->dither);
      END_CS;
@@@ -277,7 -284,7 +285,7 @@@ void r500_emit_fragment_program_code(st
  
      BEGIN_CS(13 +
               ((code->inst_end + 1) * 6));
-     OUT_CS_REG(R500_US_CONFIG, 0);
+     OUT_CS_REG(R500_US_CONFIG, R500_ZERO_TIMES_ANYTHING_EQUALS_ZERO);
      OUT_CS_REG(R500_US_PIXSIZE, code->max_temp_idx);
      OUT_CS_REG(R500_US_CODE_RANGE,
                 R500_US_CODE_RANGE_ADDR(0) | R500_US_CODE_RANGE_SIZE(code->inst_end));
@@@ -331,7 -338,13 +339,13 @@@ void r300_emit_fb_state(struct r300_con
      int i;
      CS_LOCALS(r300);
  
-     BEGIN_CS((10 * fb->nr_cbufs) + (fb->zsbuf ? 10 : 0) + 4);
+     /* Shouldn't fail unless there is a bug in the state tracker. */
+     assert(fb->nr_cbufs <= 4);
+     BEGIN_CS((10 * fb->nr_cbufs) + (2 * (4 - fb->nr_cbufs)) +
+              (fb->zsbuf ? 10 : 0) + 6);
+     /* Flush and free renderbuffer caches. */
      OUT_CS_REG(R300_RB3D_DSTCACHE_CTLSTAT,
          R300_RB3D_DSTCACHE_CTLSTAT_DC_FREE_FREE_3D_TAGS |
          R300_RB3D_DSTCACHE_CTLSTAT_DC_FLUSH_FLUSH_DIRTY_3D);
          R300_ZB_ZCACHE_CTLSTAT_ZC_FLUSH_FLUSH_AND_FREE |
          R300_ZB_ZCACHE_CTLSTAT_ZC_FREE_FREE);
  
+     /* Set the number of colorbuffers. */
+     OUT_CS_REG(R300_RB3D_CCTL, R300_RB3D_CCTL_NUM_MULTIWRITES(fb->nr_cbufs));
+     /* Set up colorbuffers. */
      for (i = 0; i < fb->nr_cbufs; i++) {
          surf = fb->cbufs[i];
          tex = (struct r300_texture*)surf->texture;
              r300_translate_out_fmt(surf->format));
      }
  
+     /* Disable unused colorbuffers. */
+     for (; i < 4; i++) {
+         OUT_CS_REG(R300_US_OUT_FMT_0 + (4 * i), R300_US_OUT_FMT_UNUSED);
+     }
+     /* Set up a zbuffer. */
      if (fb->zsbuf) {
          surf = fb->zsbuf;
          tex = (struct r300_texture*)surf->texture;
@@@ -383,8 -406,6 +407,6 @@@ static void r300_emit_query_start(struc
      if (!query)
        return;
  
-     /* XXX This will almost certainly not return good results
-      * for overlapping queries. */
      BEGIN_CS(4);
      if (caps->family == CHIP_FAMILY_RV530) {
          OUT_CS_REG(RV530_FG_ZBREG_DEST, RV530_FG_ZBREG_DEST_PIPE_SELECT_ALL);
@@@ -566,18 -587,28 +588,28 @@@ void r300_emit_rs_block_state(struct r3
      END_CS;
  }
  
void r300_emit_scissor_state(struct r300_context* r300,
-                              struct r300_scissor_state* scissor)
static void r300_emit_scissor_regs(struct r300_context* r300,
+                                    struct r300_scissor_regs* scissor)
  {
      CS_LOCALS(r300);
  
      BEGIN_CS(3);
      OUT_CS_REG_SEQ(R300_SC_SCISSORS_TL, 2);
-     OUT_CS(scissor->scissor_top_left);
-     OUT_CS(scissor->scissor_bottom_right);
+     OUT_CS(scissor->top_left);
+     OUT_CS(scissor->bottom_right);
      END_CS;
  }
  
+ void r300_emit_scissor_state(struct r300_context* r300,
+                              struct r300_scissor_state* scissor)
+ {
+     if (r300->rs_state->rs.scissor) {
+         r300_emit_scissor_regs(r300, &scissor->scissor);
+     } else {
+         r300_emit_scissor_regs(r300, &scissor->framebuffer);
+     }
+ }
  void r300_emit_texture(struct r300_context* r300,
                         struct r300_sampler_state* sampler,
                         struct r300_texture* tex,
      END_CS;
  }
  
- /* XXX I can't read this and that's not good */
- void r300_emit_aos(struct r300_context* r300, unsigned offset)
+ static boolean r300_validate_aos(struct r300_context *r300)
  {
      struct pipe_vertex_buffer *vbuf = r300->vertex_buffer;
      struct pipe_vertex_element *velem = r300->vertex_element;
-     CS_LOCALS(r300);
      int i;
-     unsigned aos_count = r300->vertex_element_count;
  
+     /* Check if formats and strides are aligned to the size of DWORD. */
+     for (i = 0; i < r300->vertex_element_count; i++) {
+         if (vbuf[velem[i].vertex_buffer_index].stride % 4 != 0 ||
+             pf_get_blocksize(velem[i].src_format) % 4 != 0) {
+             return FALSE;
+         }
+     }
+     return TRUE;
+ }
+ void r300_emit_aos(struct r300_context* r300, unsigned offset)
+ {
+     struct pipe_vertex_buffer *vb1, *vb2, *vbuf = r300->vertex_buffer;
+     struct pipe_vertex_element *velem = r300->vertex_element;
+     int i;
+     unsigned size1, size2, aos_count = r300->vertex_element_count;
      unsigned packet_size = (aos_count * 3 + 1) / 2;
+     CS_LOCALS(r300);
+     /* XXX Move this checking to a more approriate place. */
+     if (!r300_validate_aos(r300)) {
+         /* XXX We should fallback using Draw. */
+         assert(0);
+     }
      BEGIN_CS(2 + packet_size + aos_count * 2);
      OUT_CS_PKT3(R300_PACKET3_3D_LOAD_VBPNTR, packet_size);
      OUT_CS(aos_count);
      for (i = 0; i < aos_count - 1; i += 2) {
-         int buf_num1 = velem[i].vertex_buffer_index;
-         int buf_num2 = velem[i+1].vertex_buffer_index;
-         assert(vbuf[buf_num1].stride % 4 == 0 && util_format_get_size(velem[i].src_format) % 4 == 0);
-         assert(vbuf[buf_num2].stride % 4 == 0 && util_format_get_size(velem[i+1].src_format) % 4 == 0);
-         OUT_CS((util_format_get_size(velem[i].src_format) >> 2) | (vbuf[buf_num1].stride << 6) |
-                (util_format_get_size(velem[i+1].src_format) << 14) | (vbuf[buf_num2].stride << 22));
-         OUT_CS(vbuf[buf_num1].buffer_offset + velem[i].src_offset +
-                offset * vbuf[buf_num1].stride);
-         OUT_CS(vbuf[buf_num2].buffer_offset + velem[i+1].src_offset +
-                offset * vbuf[buf_num2].stride);
+         vb1 = &vbuf[velem[i].vertex_buffer_index];
+         vb2 = &vbuf[velem[i+1].vertex_buffer_index];
 -        size1 = pf_get_blocksize(velem[i].src_format);
 -        size2 = pf_get_blocksize(velem[i+1].src_format);
++        size1 = util_format_get_size(velem[i].src_format);
++        size2 = util_format_get_size(velem[i+1].src_format);
+         OUT_CS(R300_VBPNTR_SIZE0(size1) | R300_VBPNTR_STRIDE0(vb1->stride) |
+                R300_VBPNTR_SIZE1(size2) | R300_VBPNTR_STRIDE1(vb2->stride));
+         OUT_CS(vb1->buffer_offset + velem[i].src_offset   + offset * vb1->stride);
+         OUT_CS(vb2->buffer_offset + velem[i+1].src_offset + offset * vb2->stride);
      }
      if (aos_count & 1) {
-         int buf_num = velem[i].vertex_buffer_index;
-         assert(vbuf[buf_num].stride % 4 == 0 && util_format_get_size(velem[i].src_format) % 4 == 0);
-         OUT_CS((util_format_get_size(velem[i].src_format) >> 2) | (vbuf[buf_num].stride << 6));
-         OUT_CS(vbuf[buf_num].buffer_offset + velem[i].src_offset +
-                offset * vbuf[buf_num].stride);
+         vb1 = &vbuf[velem[i].vertex_buffer_index];
 -        size1 = pf_get_blocksize(velem[i].src_format);
++        size1 = util_format_get_size(velem[i].src_format);
+         OUT_CS(R300_VBPNTR_SIZE0(size1) | R300_VBPNTR_STRIDE0(vb1->stride));
+         OUT_CS(vb1->buffer_offset + velem[i].src_offset + offset * vb1->stride);
      }
  
-     /* XXX bare CS reloc */
      for (i = 0; i < aos_count; i++) {
-         cs_winsys->write_cs_reloc(cs_winsys,
-                                   vbuf[velem[i].vertex_buffer_index].buffer,
-                                   RADEON_GEM_DOMAIN_GTT,
-                                   0,
-                                   0);
-         cs_count -= 2;
+         OUT_CS_RELOC_NO_OFFSET(vbuf[velem[i].vertex_buffer_index].buffer,
+                                RADEON_GEM_DOMAIN_GTT, 0, 0);
      }
      END_CS;
  }
  #if 0
  void r300_emit_draw_packet(struct r300_context* r300)
  {
@@@ -834,10 -883,21 +884,21 @@@ void r300_emit_viewport_state(struct r3
  
  void r300_emit_texture_count(struct r300_context* r300)
  {
+     uint32_t tx_enable = 0;
+     int i;
      CS_LOCALS(r300);
  
+     /* Notice that texture_count and sampler_count are just sizes
+      * of the respective arrays. We still have to check for the individual
+      * elements. */
+     for (i = 0; i < MIN2(r300->sampler_count, r300->texture_count); i++) {
+         if (r300->textures[i]) {
+             tx_enable |= 1 << i;
+         }
+     }
      BEGIN_CS(2);
-     OUT_CS_REG(R300_TX_ENABLE, (1 << r300->texture_count) - 1);
+     OUT_CS_REG(R300_TX_ENABLE, tx_enable);
      END_CS;
  
  }
@@@ -872,10 -932,17 +933,17 @@@ void r300_emit_dirty_state(struct r300_
          return;
      }
  
+     /* Check size of CS. */
+     /* Make sure we have at least 8*1024 spare dwords. */
+     /* XXX It would be nice to know the number of dwords we really need to
+      * XXX emit. */
+     if (!r300->winsys->check_cs(r300->winsys, 8*1024)) {
+         r300->context.flush(&r300->context, 0, NULL);
+     }
      /* Clean out BOs. */
      r300->winsys->reset_bos(r300->winsys);
  
-     /* XXX check size */
  validate:
      /* Color buffers... */
      for (i = 0; i < r300->framebuffer_state.nr_cbufs; i++) {
@@@ -22,7 -22,6 +22,7 @@@
  
  #include "pipe/p_screen.h"
  
 +#include "util/u_format.h"
  #include "util/u_math.h"
  #include "util/u_memory.h"
  
@@@ -106,7 -105,7 +106,7 @@@ unsigned r300_texture_get_stride(struc
          return 0;
      }
  
-     return align(pf_get_stride(&tex->tex.block, u_minify(tex->tex.width0, level)), 32);
+     return align(pf_get_stride(tex->tex.format, u_minify(tex->tex.width0, level)), 32);
  }
  
  static void r300_setup_miptree(struct r300_texture* tex)
      int i;
  
      for (i = 0; i <= base->last_level; i++) {
-         base->nblocksx[i] = pf_get_nblocksx(&base->block, u_minify(base->width0, i));
-         base->nblocksy[i] = pf_get_nblocksy(&base->block, u_minify(base->height0, i));
+         unsigned nblocksy = pf_get_nblocksy(base->format, u_minify(base->height0, i));
  
          stride = r300_texture_get_stride(tex, i);
-         layer_size = stride * base->nblocksy[i];
+         layer_size = stride * nblocksy;
  
          if (base->target == PIPE_TEXTURE_CUBE)
              size = layer_size * 6;
          tex->offset[i] = align(tex->size, 32);
          tex->size = tex->offset[i] + size;
          tex->layer_size[i] = layer_size;
-         tex->pitch[i] = stride / base->block.size;
+         tex->pitch[i] = stride / pf_get_blocksize(base->format);
  
          debug_printf("r300: Texture miptree: Level %d "
                  "(%dx%dx%d px, pitch %d bytes)\n",
@@@ -246,7 -244,7 +245,7 @@@ static struct pipe_texture
      tex->tex.screen = screen;
  
      tex->stride_override = *stride;
-     tex->pitch[0] = *stride / base->block.size;
+     tex->pitch[0] = *stride / pf_get_blocksize(base->format);
  
      r300_setup_flags(tex);
      r300_setup_texture_state(tex, r300_screen(screen)->caps->is_r500);
@@@ -284,7 -282,6 +283,6 @@@ r300_video_surface_create(struct pipe_s
      template.width0 = util_next_power_of_two(width);
      template.height0 = util_next_power_of_two(height);
      template.depth0 = 1;
-     util_format_get_block(template.format, &template.block);
      template.tex_usage = PIPE_TEXTURE_USAGE_SAMPLER |
                           PIPE_TEXTURE_USAGE_RENDER_TARGET;
  
@@@ -32,8 -32,6 +32,8 @@@
  
  #include "pipe/p_defines.h"
  #include "pipe/p_inlines.h"
 +
 +#include "util/u_format.h"
  #include "util/u_math.h"
  #include "util/u_memory.h"
  
@@@ -65,13 -63,11 +65,11 @@@ softpipe_texture_layout(struct pipe_scr
     pt->depth0 = depth;
  
     for (level = 0; level <= pt->last_level; level++) {
-       pt->nblocksx[level] = pf_get_nblocksx(&pt->block, width);  
-       pt->nblocksy[level] = pf_get_nblocksy(&pt->block, height);  
-       spt->stride[level] = pt->nblocksx[level]*pt->block.size;
+       spt->stride[level] = pf_get_stride(pt->format, width);
  
        spt->level_offset[level] = buffer_size;
  
-       buffer_size += (pt->nblocksy[level] *
+       buffer_size += (pf_get_nblocksy(pt->format, height) *
                        ((pt->target == PIPE_TEXTURE_CUBE) ? 6 : depth) *
                        spt->stride[level]);
  
@@@ -99,9 -95,6 +97,6 @@@ softpipe_displaytarget_layout(struct pi
                       PIPE_BUFFER_USAGE_GPU_READ_WRITE);
     unsigned tex_usage = spt->base.tex_usage;
  
-    spt->base.nblocksx[0] = pf_get_nblocksx(&spt->base.block, spt->base.width0);  
-    spt->base.nblocksy[0] = pf_get_nblocksy(&spt->base.block, spt->base.height0);  
     spt->buffer = screen->surface_buffer_create( screen, 
                                                  spt->base.width0, 
                                                  spt->base.height0,
@@@ -177,8 -170,6 +172,6 @@@ softpipe_texture_blanket(struct pipe_sc
     spt->base = *base;
     pipe_reference_init(&spt->base.reference, 1);
     spt->base.screen = screen;
-    spt->base.nblocksx[0] = pf_get_nblocksx(&spt->base.block, spt->base.width0);  
-    spt->base.nblocksy[0] = pf_get_nblocksy(&spt->base.block, spt->base.height0);  
     spt->stride[0] = stride[0];
  
     pipe_buffer_reference(&spt->buffer, buffer);
@@@ -246,10 -237,12 +239,12 @@@ softpipe_get_tex_surface(struct pipe_sc
        ps->zslice = zslice;
  
        if (pt->target == PIPE_TEXTURE_CUBE) {
-          ps->offset += face * pt->nblocksy[level] * spt->stride[level];
+          ps->offset += face * pf_get_nblocksy(pt->format, u_minify(pt->height0, level)) *
+                        spt->stride[level];
        }
        else if (pt->target == PIPE_TEXTURE_3D) {
-          ps->offset += zslice * pt->nblocksy[level] * spt->stride[level];
+          ps->offset += zslice * pf_get_nblocksy(pt->format, u_minify(pt->height0, level)) *
+                        spt->stride[level];
        }
        else {
           assert(face == 0);
@@@ -304,15 -297,12 +299,12 @@@ softpipe_get_tex_transfer(struct pipe_s
     spt = CALLOC_STRUCT(softpipe_transfer);
     if (spt) {
        struct pipe_transfer *pt = &spt->base;
+       int nblocksy = pf_get_nblocksy(texture->format, u_minify(texture->height0, level));
        pipe_texture_reference(&pt->texture, texture);
-       pt->format = texture->format;
-       pt->block = texture->block;
        pt->x = x;
        pt->y = y;
        pt->width = w;
        pt->height = h;
-       pt->nblocksx = texture->nblocksx[level];
-       pt->nblocksy = texture->nblocksy[level];
        pt->stride = sptex->stride[level];
        pt->usage = usage;
        pt->face = face;
        spt->offset = sptex->level_offset[level];
  
        if (texture->target == PIPE_TEXTURE_CUBE) {
-          spt->offset += face * pt->nblocksy * pt->stride;
+          spt->offset += face * nblocksy * pt->stride;
        }
        else if (texture->target == PIPE_TEXTURE_3D) {
-          spt->offset += zslice * pt->nblocksy * pt->stride;
+          spt->offset += zslice * nblocksy * pt->stride;
        }
        else {
           assert(face == 0);
@@@ -363,9 -353,11 +355,11 @@@ softpipe_transfer_map( struct pipe_scre
  {
     ubyte *map, *xfer_map;
     struct softpipe_texture *spt;
+    enum pipe_format format;
  
     assert(transfer->texture);
     spt = softpipe_texture(transfer->texture);
+    format = transfer->texture->format;
  
     map = pipe_buffer_map(screen, spt->buffer, pipe_transfer_buffer_flags(transfer));
     if (map == NULL)
     }
  
     xfer_map = map + softpipe_transfer(transfer)->offset +
-       transfer->y / transfer->block.height * transfer->stride +
-       transfer->x / transfer->block.width * transfer->block.size;
+       transfer->y / pf_get_blockheight(format) * transfer->stride +
+       transfer->x / pf_get_blockwidth(format) * pf_get_blocksize(format);
     /*printf("map = %p  xfer map = %p\n", map, xfer_map);*/
     return xfer_map;
  }
@@@ -440,7 -432,6 +434,6 @@@ softpipe_video_surface_create(struct pi
     template.width0 = util_next_power_of_two(width);
     template.height0 = util_next_power_of_two(height);
     template.depth0 = 1;
-    util_format_get_block(template.format, &template.block);
     template.tex_usage = PIPE_TEXTURE_USAGE_SAMPLER | PIPE_TEXTURE_USAGE_RENDER_TARGET;
  
     sp_vsfc->tex = screen->texture_create(screen, &template);
@@@ -33,7 -33,6 +33,7 @@@
   */
  
  #include "pipe/p_inlines.h"
 +#include "util/u_format.h"
  #include "util/u_memory.h"
  #include "util/u_tile.h"
  #include "sp_tile_cache.h"
@@@ -239,7 -238,7 +239,7 @@@ clear_tile(struct softpipe_cached_tile 
  {
     uint i, j;
  
 -   switch (pf_get_blocksize(format)) {
 +   switch (util_format_get_size(format)) {
     case 1:
        memset(tile->data.any, clear_value, TILE_SIZE * TILE_SIZE);
        break;
@@@ -285,8 -284,9 +285,9 @@@ sp_tile_cache_flush_clear(struct softpi
     uint x, y;
     uint numCleared = 0;
  
+    assert(pt->texture);
     /* clear the scratch tile to the clear value */
-    clear_tile(&tc->tile, pt->format, tc->clear_val);
+    clear_tile(&tc->tile, pt->texture->format, tc->clear_val);
  
     /* push the tile to all positions marked as clear */
     for (y = 0; y < h; y += TILE_SIZE) {
@@@ -373,6 -373,7 +374,7 @@@ sp_find_cached_tile(struct softpipe_til
  
     if (addr.value != tile->addr.value) {
  
+       assert(pt->texture);
        if (tile->addr.bits.invalid == 0) {
           /* put dirty tile back in framebuffer */
           if (tc->depth_stencil) {
        if (is_clear_flag_set(tc->clear_flags, addr)) {
           /* don't get tile from framebuffer, just clear it */
           if (tc->depth_stencil) {
-             clear_tile(tile, pt->format, tc->clear_val);
+             clear_tile(tile, pt->texture->format, tc->clear_val);
           }
           else {
-             clear_tile_rgba(tile, pt->format, tc->clear_color);
+             clear_tile_rgba(tile, pt->texture->format, tc->clear_color);
           }
           clear_clear_flag(tc->clear_flags, addr);
        }
@@@ -29,7 -29,6 +29,7 @@@
  #include "pipe/p_defines.h"
  #include "pipe/p_inlines.h"
  #include "pipe/p_thread.h"
 +#include "util/u_format.h"
  #include "util/u_math.h"
  #include "util/u_memory.h"
  
@@@ -159,7 -158,8 +159,8 @@@ svga_transfer_dma_band(struct svga_tran
                  st->base.x + st->base.width,
                  y + h,
                  st->base.zslice + 1,
-                 texture->base.block.size*8/(texture->base.block.width*texture->base.block.height));
+                 pf_get_blocksize(texture->base.format)*8/
+                 (pf_get_blockwidth(texture->base.format)*pf_get_blockheight(texture->base.format)));
     
     box.x = st->base.x;
     box.y = y;
@@@ -209,7 -209,8 +210,8 @@@ svga_transfer_dma(struct svga_transfer 
     }
     else {
        unsigned y, h, srcy;
-       h = st->hw_nblocksy * st->base.block.height;
+       unsigned blockheight = pf_get_blockheight(st->base.texture->format);
+       h = st->hw_nblocksy * blockheight;
        srcy = 0;
        for(y = 0; y < st->base.height; y += h) {
           unsigned offset, length;
              h = st->base.height - y;
  
           /* Transfer band must be aligned to pixel block boundaries */
-          assert(y % st->base.block.height == 0);
-          assert(h % st->base.block.height == 0);
+          assert(y % blockheight == 0);
+          assert(h % blockheight == 0);
           
-          offset = y * st->base.stride / st->base.block.height;
-          length = h * st->base.stride / st->base.block.height;
+          offset = y * st->base.stride / blockheight;
+          length = h * st->base.stride / blockheight;
  
           sw = (uint8_t *)st->swbuf + offset;
           
@@@ -286,8 -287,6 +288,6 @@@ svga_texture_create(struct pipe_screen 
     height = templat->height0;
     depth = templat->depth0;
     for(level = 0; level <= templat->last_level; ++level) {
-       tex->base.nblocksx[level] = pf_get_nblocksx(&tex->base.block, width);  
-       tex->base.nblocksy[level] = pf_get_nblocksy(&tex->base.block, height);  
        width = u_minify(width, 1);
        height = u_minify(height, 1);
        depth = u_minify(depth, 1);
      */
  #if 0
     if((templat->tex_usage & PIPE_TEXTURE_USAGE_RENDER_TARGET) &&
 -      !pf_is_compressed(templat->format))
 +      !util_format_is_compressed(templat->format))
        tex->key.flags |= SVGA3D_SURFACE_HINT_RENDERTARGET;
  #endif
     
@@@ -526,7 -525,7 +526,7 @@@ svga_texture_view_surface(struct pipe_c
  {
     struct svga_screen *ss = svga_screen(tex->base.screen);
     struct svga_winsys_surface *handle;
-    int i, j;
+    uint32_t i, j;
     unsigned z_offset = 0;
  
     SVGA_DBG(DEBUG_PERF, 
@@@ -658,13 -657,11 +658,11 @@@ svga_get_tex_surface(struct pipe_scree
        s->real_level = 0;
        s->real_zslice = 0;
     } else {
-       struct svga_winsys_screen *sws = svga_winsys_screen(screen);
        SVGA_DBG(DEBUG_VIEWS, "svga: Surface view: no %p, level %u, face %u, z %u, %p\n",
                 pt, level, face, zslice, s);
  
        memset(&s->key, 0, sizeof s->key);
-       sws->surface_reference(sws, &s->handle, tex->handle);
+       s->handle = tex->handle;
        s->real_face = face;
        s->real_level = level;
        s->real_zslice = zslice;
@@@ -678,11 -675,14 +676,14 @@@ static voi
  svga_tex_surface_destroy(struct pipe_surface *surf)
  {
     struct svga_surface *s = svga_surface(surf);
+    struct svga_texture *t = svga_texture(surf->texture);
     struct svga_screen *ss = svga_screen(surf->texture->screen);
  
-    SVGA_DBG(DEBUG_DMA, "unref sid %p (tex surface)\n", s->handle);
-    assert(s->key.cachable == 0);
-    svga_screen_surface_destroy(ss, &s->key, &s->handle);
+    if(s->handle != t->handle) {
+       SVGA_DBG(DEBUG_DMA, "unref sid %p (tex surface)\n", s->handle);
+       svga_screen_surface_destroy(ss, &s->key, &s->handle);
+    }
     pipe_texture_reference(&surf->texture, NULL);
     FREE(surf);
  }
@@@ -771,6 -771,8 +772,8 @@@ svga_get_tex_transfer(struct pipe_scree
     struct svga_screen *ss = svga_screen(screen);
     struct svga_winsys_screen *sws = ss->sws;
     struct svga_transfer *st;
+    unsigned nblocksx = pf_get_nblocksx(texture->format, w);
+    unsigned nblocksy = pf_get_nblocksy(texture->format, h);
  
     /* We can't map texture storage directly */
     if (usage & PIPE_TRANSFER_MAP_DIRECTLY)
     if (!st)
        return NULL;
     
-    st->base.format = texture->format;
-    st->base.block = texture->block;
     st->base.x = x;
     st->base.y = y;
     st->base.width = w;
     st->base.height = h;
-    st->base.nblocksx = pf_get_nblocksx(&texture->block, w);
-    st->base.nblocksy = pf_get_nblocksy(&texture->block, h);
-    st->base.stride = st->base.nblocksx*st->base.block.size;
+    st->base.stride = nblocksx*pf_get_blocksize(texture->format);
     st->base.usage = usage;
     st->base.face = face;
     st->base.level = level;
     st->base.zslice = zslice;
  
-    st->hw_nblocksy = st->base.nblocksy;
+    st->hw_nblocksy = nblocksy;
     
     st->hwbuf = svga_winsys_buffer_create(ss, 
                                           1, 
     if(!st->hwbuf)
        goto no_hwbuf;
  
-    if(st->hw_nblocksy < st->base.nblocksy) {
+    if(st->hw_nblocksy < nblocksy) {
        /* We couldn't allocate a hardware buffer big enough for the transfer, 
         * so allocate regular malloc memory instead */
        debug_printf("%s: failed to allocate %u KB of DMA, splitting into %u x %u KB DMA transfers\n",
                     __FUNCTION__,
-                    (st->base.nblocksy*st->base.stride + 1023)/1024,
-                    (st->base.nblocksy + st->hw_nblocksy - 1)/st->hw_nblocksy,
+                    (nblocksy*st->base.stride + 1023)/1024,
+                    (nblocksy + st->hw_nblocksy - 1)/st->hw_nblocksy,
                     (st->hw_nblocksy*st->base.stride + 1023)/1024);
-       st->swbuf = MALLOC(st->base.nblocksy*st->base.stride);
+       st->swbuf = MALLOC(nblocksy*st->base.stride);
        if(!st->swbuf)
           goto no_swbuf;
     }
@@@ -912,7 -910,6 +911,6 @@@ svga_get_tex_sampler_view(struct pipe_c
                            unsigned min_lod, unsigned max_lod)
  {
     struct svga_screen *ss = svga_screen(pt->screen);
-    struct svga_winsys_screen *sws = ss->sws;
     struct svga_texture *tex = svga_texture(pt); 
     struct svga_sampler_view *sv = NULL;
     SVGA3dSurfaceFormat format = svga_translate_format(pt->format);
        if (min_lod == 0 && max_lod >= pt->last_level)
           view = FALSE;
  
 -      if (pf_is_compressed(pt->format) && view) {
 +      if (util_format_is_compressed(pt->format) && view) {
           format = svga_translate_format_render(pt->format);
        }
  
  
     sv = CALLOC_STRUCT(svga_sampler_view);
     pipe_reference_init(&sv->reference, 1);
-    sv->texture = tex;
+    pipe_texture_reference(&sv->texture, pt);
     sv->min_lod = min_lod;
     sv->max_lod = max_lod;
  
                 pt->depth0,
                 pt->last_level);
        sv->key.cachable = 0;
-       sws->surface_reference(sws, &sv->handle, tex->handle);
+       sv->handle = tex->handle;
        return sv;
     }
  
     if (!sv->handle) {
        assert(0);
        sv->key.cachable = 0;
-       sws->surface_reference(sws, &sv->handle, tex->handle);
+       sv->handle = tex->handle;
        return sv;
     }
  
  void
  svga_validate_sampler_view(struct svga_context *svga, struct svga_sampler_view *v)
  {
-    struct svga_texture *tex = v->texture;
+    struct svga_texture *tex = svga_texture(v->texture);
     unsigned numFaces;
     unsigned age = 0;
     int i, k;
  
     assert(svga);
  
-    if (v->handle == v->texture->handle)
+    if (v->handle == tex->handle)
        return;
  
     age = tex->age;
  void
  svga_destroy_sampler_view_priv(struct svga_sampler_view *v)
  {
-    struct svga_screen *ss = svga_screen(v->texture->base.screen);
-    SVGA_DBG(DEBUG_DMA, "unref sid %p (sampler view)\n", v->handle);
-    svga_screen_surface_destroy(ss, &v->key, &v->handle);
+    struct svga_texture *tex = svga_texture(v->texture);
  
+    if(v->handle != tex->handle) {
+       struct svga_screen *ss = svga_screen(v->texture->screen);
+       SVGA_DBG(DEBUG_DMA, "unref sid %p (sampler view)\n", v->handle);
+       svga_screen_surface_destroy(ss, &v->key, &v->handle);
+    }
+    pipe_texture_reference(&v->texture, NULL);
     FREE(v);
  }
  
@@@ -1070,8 -1070,7 +1071,7 @@@ svga_screen_buffer_from_texture(struct 
         svga_translate_format(texture->format),
         stex->handle);
  
-    *stride = pf_get_nblocksx(&texture->block, texture->width0) *
-       texture->block.size;
+    *stride = pf_get_stride(texture->format, texture->width0);
  
     return *buffer != NULL;
  }
@@@ -40,133 -40,353 +40,133 @@@ extern "C" 
  #endif
  
  /**
 - * The pipe_format enum is a 32-bit wide bitfield that encodes all the
 - * information needed to uniquely describe a pixel format.
 - */
 -
 -/**
 - * Possible format layouts are encoded in the first 2 bits.
 - * The interpretation of the remaining 30 bits depends on a particular
 - * format layout.
 - */
 -#define PIPE_FORMAT_LAYOUT_RGBAZS   0
 -#define PIPE_FORMAT_LAYOUT_YCBCR    1
 -#define PIPE_FORMAT_LAYOUT_DXT      2  /**< XXX temporary? */
 -#define PIPE_FORMAT_LAYOUT_MIXED    3
 -
 -static INLINE uint pf_layout(uint f)  /**< PIPE_FORMAT_LAYOUT_ */
 -{
 -   return f & 0x3;
 -}
 -
 -/**
 - * RGBAZS Format Layout.
 - */
 -
 -/**
 - * Format component selectors for RGBAZS & MIXED layout.
 - */
 -#define PIPE_FORMAT_COMP_R    0
 -#define PIPE_FORMAT_COMP_G    1
 -#define PIPE_FORMAT_COMP_B    2
 -#define PIPE_FORMAT_COMP_A    3
 -#define PIPE_FORMAT_COMP_0    4
 -#define PIPE_FORMAT_COMP_1    5
 -#define PIPE_FORMAT_COMP_Z    6
 -#define PIPE_FORMAT_COMP_S    7
 -
 -/**
 - * Format types for RGBAZS layout.
 - */
 -#define PIPE_FORMAT_TYPE_UNKNOWN 0
 -#define PIPE_FORMAT_TYPE_FLOAT   1  /**< 16/32/64-bit/channel formats */
 -#define PIPE_FORMAT_TYPE_UNORM   2  /**< uints, normalized to [0,1] */
 -#define PIPE_FORMAT_TYPE_SNORM   3  /**< ints, normalized to [-1,1] */
 -#define PIPE_FORMAT_TYPE_USCALED 4  /**< uints, not normalized */
 -#define PIPE_FORMAT_TYPE_SSCALED 5  /**< ints, not normalized */
 -#define PIPE_FORMAT_TYPE_SRGB    6  /**< sRGB colorspace */
 -#define PIPE_FORMAT_TYPE_FIXED   7  /**< 16.16 fixed point */
 -
 -
 -/**
 - * Because the destination vector is assumed to be RGBA FLOAT, we
 - * need to know how to swizzle and expand components from the source
 - * vector.
 - * Let's take U_A1_R5_G5_B5 as an example. X swizzle is A, X size
 - * is 1 bit and type is UNORM. So we take the most significant bit
 - * from source vector, convert 0 to 0.0 and 1 to 1.0 and save it
 - * in the last component of the destination RGBA component.
 - * Next, Y swizzle is R, Y size is 5 and type is UNORM. We normalize
 - * those 5 bits into [0.0; 1.0] range and put it into second
 - * component of the destination vector. Rinse and repeat for
 - * components Z and W.
 - * If any of size fields is zero, it means the source format contains
 - * less than four components.
 - * If any swizzle is 0 or 1, the corresponding destination component
 - * should be filled with 0.0 and 1.0, respectively.
 - */
 -typedef uint pipe_format_rgbazs_t;
 -
 -static INLINE uint pf_get(pipe_format_rgbazs_t f, uint shift, uint mask)
 -{
 -   return (f >> shift) & mask;
 -}
 -
 -#define pf_swizzle_x(f)       pf_get(f, 2, 0x7)  /**< PIPE_FORMAT_COMP_ */
 -#define pf_swizzle_y(f)       pf_get(f, 5, 0x7)  /**< PIPE_FORMAT_COMP_ */
 -#define pf_swizzle_z(f)       pf_get(f, 8, 0x7)  /**< PIPE_FORMAT_COMP_ */
 -#define pf_swizzle_w(f)       pf_get(f, 11, 0x7) /**< PIPE_FORMAT_COMP_ */
 -#define pf_swizzle_xyzw(f,i)  pf_get(f, 2+((i)*3), 0x7)
 -#define pf_size_x(f)          pf_get(f, 14, 0x7) /**< Size of X */
 -#define pf_size_y(f)          pf_get(f, 17, 0x7) /**< Size of Y */
 -#define pf_size_z(f)          pf_get(f, 20, 0x7) /**< Size of Z */
 -#define pf_size_w(f)          pf_get(f, 23, 0x7) /**< Size of W */
 -#define pf_size_xyzw(f,i)     pf_get(f, 14+((i)*3), 0x7)
 -#define pf_exp2(f)            pf_get(f, 26, 0x7) /**< Scale size by 2 ^ exp2 */
 -#define pf_type(f)            pf_get(f, 29, 0x7) /**< PIPE_FORMAT_TYPE_ */
 -
 -/**
 - * Helper macro to encode the above structure into a 32-bit value.
 - */
 -#define _PIPE_FORMAT_RGBAZS( SWZ, SIZEX, SIZEY, SIZEZ, SIZEW, EXP2, TYPE ) (\
 -   (PIPE_FORMAT_LAYOUT_RGBAZS << 0) |\
 -   ((SWZ) << 2) |\
 -   ((SIZEX) << 14) |\
 -   ((SIZEY) << 17) |\
 -   ((SIZEZ) << 20) |\
 -   ((SIZEW) << 23) |\
 -   ((EXP2) << 26) |\
 -   ((TYPE) << 29) )
 -
 -/**
 - * Helper macro to encode the swizzle part of the structure above.
 - */
 -#define _PIPE_FORMAT_SWZ( SWZX, SWZY, SWZZ, SWZW ) (((SWZX) << 0) | ((SWZY) << 3) | ((SWZZ) << 6) | ((SWZW) << 9))
 -
 -/**
 - * Shorthand macro for RGBAZS layout with component sizes in 1-bit units.
 - */
 -#define _PIPE_FORMAT_RGBAZS_1( SWZ, SIZEX, SIZEY, SIZEZ, SIZEW, TYPE )\
 -   _PIPE_FORMAT_RGBAZS( SWZ, SIZEX, SIZEY, SIZEZ, SIZEW, 0, TYPE )
 -
 -/**
 - * Shorthand macro for RGBAZS layout with component sizes in 2-bit units.
 - */
 -#define _PIPE_FORMAT_RGBAZS_2( SWZ, SIZEX, SIZEY, SIZEZ, SIZEW, TYPE )\
 -   _PIPE_FORMAT_RGBAZS( SWZ, SIZEX, SIZEY, SIZEZ, SIZEW, 1, TYPE )
 -
 -/**
 - * Shorthand macro for RGBAZS layout with component sizes in 8-bit units.
 - */
 -#define _PIPE_FORMAT_RGBAZS_8( SWZ, SIZEX, SIZEY, SIZEZ, SIZEW, TYPE )\
 -   _PIPE_FORMAT_RGBAZS( SWZ, SIZEX, SIZEY, SIZEZ, SIZEW, 3, TYPE )
 -
 -/**
 - * Shorthand macro for RGBAZS layout with component sizes in 64-bit units.
 - */
 -#define _PIPE_FORMAT_RGBAZS_64( SWZ, SIZEX, SIZEY, SIZEZ, SIZEW, TYPE )\
 -   _PIPE_FORMAT_RGBAZS( SWZ, SIZEX, SIZEY, SIZEZ, SIZEW, 6, TYPE )
 -
 -typedef uint pipe_format_mixed_t;
 -
 -/* NOTE: Use pf_swizzle_* and pf_size_* macros for swizzles and sizes.
 - */
 -
 -#define pf_mixed_sign_x(f)       pf_get( f, 26, 0x1 )       /*< Sign of X */
 -#define pf_mixed_sign_y(f)       pf_get( f, 27, 0x1 )       /*< Sign of Y */
 -#define pf_mixed_sign_z(f)       pf_get( f, 28, 0x1 )       /*< Sign of Z */
 -#define pf_mixed_sign_w(f)       pf_get( f, 29, 0x1 )       /*< Sign of W */
 -#define pf_mixed_sign_xyzw(f, i) pf_get( f, 26 + (i), 0x1 )
 -#define pf_mixed_normalized(f)   pf_get( f, 30, 0x1 )       /*< Type is NORM (1) or SCALED (0) */
 -#define pf_mixed_scale8(f)       pf_get( f, 31, 0x1 )       /*< Scale size by either one (0) or eight (1) */
 -
 -/**
 - * Helper macro to encode the above structure into a 32-bit value.
 - */
 -#define _PIPE_FORMAT_MIXED( SWZ, SIZEX, SIZEY, SIZEZ, SIZEW, SIGNX, SIGNY, SIGNZ, SIGNW, NORMALIZED, SCALE8 ) (\
 -   (PIPE_FORMAT_LAYOUT_MIXED << 0) |\
 -   ((SWZ) << 2) |\
 -   ((SIZEX) << 14) |\
 -   ((SIZEY) << 17) |\
 -   ((SIZEZ) << 20) |\
 -   ((SIZEW) << 23) |\
 -   ((SIGNX) << 26) |\
 -   ((SIGNY) << 27) |\
 -   ((SIGNZ) << 28) |\
 -   ((SIGNW) << 29) |\
 -   ((NORMALIZED) << 30) |\
 -   ((SCALE8) << 31) )
 -
 -/**
 - * Shorthand macro for common format swizzles.
 - */
 -#define _PIPE_FORMAT_R001 _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_1 )
 -#define _PIPE_FORMAT_RG01 _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_G, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_1 )
 -#define _PIPE_FORMAT_RGB1 _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_G, PIPE_FORMAT_COMP_B, PIPE_FORMAT_COMP_1 )
 -#define _PIPE_FORMAT_RGBA _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_G, PIPE_FORMAT_COMP_B, PIPE_FORMAT_COMP_A )
 -#define _PIPE_FORMAT_ARGB _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_A, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_G, PIPE_FORMAT_COMP_B )
 -#define _PIPE_FORMAT_ABGR _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_A, PIPE_FORMAT_COMP_B, PIPE_FORMAT_COMP_G, PIPE_FORMAT_COMP_R )
 -#define _PIPE_FORMAT_BGRA _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_B, PIPE_FORMAT_COMP_G, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_A )
 -#define _PIPE_FORMAT_1RGB _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_1, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_G, PIPE_FORMAT_COMP_B )
 -#define _PIPE_FORMAT_1BGR _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_1, PIPE_FORMAT_COMP_B, PIPE_FORMAT_COMP_G, PIPE_FORMAT_COMP_R )
 -#define _PIPE_FORMAT_BGR1 _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_B, PIPE_FORMAT_COMP_G, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_1 )
 -#define _PIPE_FORMAT_0000 _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0 )
 -#define _PIPE_FORMAT_000R _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_R )
 -#define _PIPE_FORMAT_RRR1 _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_1 )
 -#define _PIPE_FORMAT_RRRR _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_R )
 -#define _PIPE_FORMAT_RRRG _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_R, PIPE_FORMAT_COMP_G )
 -#define _PIPE_FORMAT_Z000 _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_Z, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0 )
 -#define _PIPE_FORMAT_0Z00 _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_Z, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0 )
 -#define _PIPE_FORMAT_SZ00 _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_S, PIPE_FORMAT_COMP_Z, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0 )
 -#define _PIPE_FORMAT_ZS00 _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_Z, PIPE_FORMAT_COMP_S, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0 )
 -#define _PIPE_FORMAT_S000 _PIPE_FORMAT_SWZ( PIPE_FORMAT_COMP_S, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0, PIPE_FORMAT_COMP_0 )
 -
 -/**
 - * YCBCR Format Layout.
 - */
 -
 -/**
 - * This only contains a flag that indicates whether the format is reversed or
 - * not.
 - */
 -typedef uint pipe_format_ycbcr_t;
 -
 -/**
 - * Helper macro to encode the above structure into a 32-bit value.
 - */
 -#define _PIPE_FORMAT_YCBCR( REV ) (\
 -   (PIPE_FORMAT_LAYOUT_YCBCR << 0) |\
 -   ((REV) << 2) )
 -
 -static INLINE uint pf_rev(pipe_format_ycbcr_t f)
 -{
 -   return (f >> 2) & 0x1;
 -}
 -
 -
 -/**
 -  * Compresssed format layouts (this will probably change)
 -  */
 -#define _PIPE_FORMAT_DXT( LEVEL, RSIZE, GSIZE, BSIZE, ASIZE, TYPE ) \
 -   ((PIPE_FORMAT_LAYOUT_DXT << 0) | \
 -    ((LEVEL) << 2) | \
 -    ((RSIZE) << 5) | \
 -    ((GSIZE) << 8) | \
 -    ((BSIZE) << 11) | \
 -    ((ASIZE) << 14) | \
 -    ((TYPE) << 29))
 -
 -
 -
 -/**
   * Texture/surface image formats (preliminary)
   */
  
  /* KW: Added lots of surface formats to support vertex element layout
 - * definitions, and eventually render-to-vertex-buffer.  Could
 - * consider making float/int/uint/scaled/normalized a separate
 - * parameter, but on the other hand there are special cases like
 - * z24s8, compressed textures, ycbcr, etc that won't fit that model.
 + * definitions, and eventually render-to-vertex-buffer.
   */
  
  enum pipe_format {
 -   PIPE_FORMAT_NONE                  = _PIPE_FORMAT_RGBAZS_1 ( _PIPE_FORMAT_0000, 0, 0, 0, 0, PIPE_FORMAT_TYPE_UNKNOWN ),
 -   PIPE_FORMAT_A8R8G8B8_UNORM        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_ARGB, 1, 1, 1, 1, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_X8R8G8B8_UNORM        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_1RGB, 1, 1, 1, 1, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_B8G8R8A8_UNORM        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_BGRA, 1, 1, 1, 1, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_B8G8R8X8_UNORM        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_BGR1, 1, 1, 1, 1, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_A1R5G5B5_UNORM        = _PIPE_FORMAT_RGBAZS_1 ( _PIPE_FORMAT_ARGB, 1, 5, 5, 5, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_A4R4G4B4_UNORM        = _PIPE_FORMAT_RGBAZS_1 ( _PIPE_FORMAT_ARGB, 4, 4, 4, 4, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_R5G6B5_UNORM          = _PIPE_FORMAT_RGBAZS_1 ( _PIPE_FORMAT_RGB1, 5, 6, 5, 0, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_A2B10G10R10_UNORM     = _PIPE_FORMAT_RGBAZS_2 ( _PIPE_FORMAT_ABGR, 1, 5, 5, 5, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_L8_UNORM              = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RRR1, 1, 1, 1, 0, PIPE_FORMAT_TYPE_UNORM ), /**< ubyte luminance */
 -   PIPE_FORMAT_A8_UNORM              = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_000R, 0, 0, 0, 1, PIPE_FORMAT_TYPE_UNORM ), /**< ubyte alpha */
 -   PIPE_FORMAT_I8_UNORM              = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RRRR, 1, 1, 1, 1, PIPE_FORMAT_TYPE_UNORM ), /**< ubyte intensity */
 -   PIPE_FORMAT_A8L8_UNORM            = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RRRG, 1, 1, 1, 1, PIPE_FORMAT_TYPE_UNORM ), /**< ubyte alpha, luminance */
 -   PIPE_FORMAT_L16_UNORM             = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RRR1, 2, 2, 2, 0, PIPE_FORMAT_TYPE_UNORM ), /**< ushort luminance */
 -   PIPE_FORMAT_YCBCR                 = _PIPE_FORMAT_YCBCR( 0 ),
 -   PIPE_FORMAT_YCBCR_REV             = _PIPE_FORMAT_YCBCR( 1 ),
 -   PIPE_FORMAT_Z16_UNORM             = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_Z000, 2, 0, 0, 0, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_Z32_UNORM             = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_Z000, 4, 0, 0, 0, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_Z32_FLOAT             = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_Z000, 4, 0, 0, 0, PIPE_FORMAT_TYPE_FLOAT ),
 -   PIPE_FORMAT_S8Z24_UNORM           = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_SZ00, 1, 3, 0, 0, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_Z24S8_UNORM           = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_ZS00, 3, 1, 0, 0, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_X8Z24_UNORM           = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_0Z00, 1, 3, 0, 0, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_Z24X8_UNORM           = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_Z000, 3, 1, 0, 0, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_S8_UNORM              = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_S000, 1, 0, 0, 0, PIPE_FORMAT_TYPE_UNORM ), /**< ubyte stencil */
 -   PIPE_FORMAT_R64_FLOAT             = _PIPE_FORMAT_RGBAZS_64( _PIPE_FORMAT_R001, 1, 0, 0, 0, PIPE_FORMAT_TYPE_FLOAT ),
 -   PIPE_FORMAT_R64G64_FLOAT          = _PIPE_FORMAT_RGBAZS_64( _PIPE_FORMAT_RG01, 1, 1, 0, 0, PIPE_FORMAT_TYPE_FLOAT ),
 -   PIPE_FORMAT_R64G64B64_FLOAT       = _PIPE_FORMAT_RGBAZS_64( _PIPE_FORMAT_RGB1, 1, 1, 1, 0, PIPE_FORMAT_TYPE_FLOAT ),
 -   PIPE_FORMAT_R64G64B64A64_FLOAT    = _PIPE_FORMAT_RGBAZS_64( _PIPE_FORMAT_RGBA, 1, 1, 1, 1, PIPE_FORMAT_TYPE_FLOAT ),
 -   PIPE_FORMAT_R32_FLOAT             = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 4, 0, 0, 0, PIPE_FORMAT_TYPE_FLOAT ),
 -   PIPE_FORMAT_R32G32_FLOAT          = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 4, 4, 0, 0, PIPE_FORMAT_TYPE_FLOAT ),
 -   PIPE_FORMAT_R32G32B32_FLOAT       = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 4, 4, 4, 0, PIPE_FORMAT_TYPE_FLOAT ),
 -   PIPE_FORMAT_R32G32B32A32_FLOAT    = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 4, 4, 4, 4, PIPE_FORMAT_TYPE_FLOAT ),
 -   PIPE_FORMAT_R32_UNORM             = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 4, 0, 0, 0, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_R32G32_UNORM          = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 4, 4, 0, 0, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_R32G32B32_UNORM       = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 4, 4, 4, 0, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_R32G32B32A32_UNORM    = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 4, 4, 4, 4, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_R32_USCALED           = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 4, 0, 0, 0, PIPE_FORMAT_TYPE_USCALED ),
 -   PIPE_FORMAT_R32G32_USCALED        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 4, 4, 0, 0, PIPE_FORMAT_TYPE_USCALED ),
 -   PIPE_FORMAT_R32G32B32_USCALED     = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 4, 4, 4, 0, PIPE_FORMAT_TYPE_USCALED ),
 -   PIPE_FORMAT_R32G32B32A32_USCALED  = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 4, 4, 4, 4, PIPE_FORMAT_TYPE_USCALED ),
 -   PIPE_FORMAT_R32_SNORM             = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 4, 0, 0, 0, PIPE_FORMAT_TYPE_SNORM ),
 -   PIPE_FORMAT_R32G32_SNORM          = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 4, 4, 0, 0, PIPE_FORMAT_TYPE_SNORM ),
 -   PIPE_FORMAT_R32G32B32_SNORM       = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 4, 4, 4, 0, PIPE_FORMAT_TYPE_SNORM ),
 -   PIPE_FORMAT_R32G32B32A32_SNORM    = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 4, 4, 4, 4, PIPE_FORMAT_TYPE_SNORM ),
 -   PIPE_FORMAT_R32_SSCALED           = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 4, 0, 0, 0, PIPE_FORMAT_TYPE_SSCALED ),
 -   PIPE_FORMAT_R32G32_SSCALED        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 4, 4, 0, 0, PIPE_FORMAT_TYPE_SSCALED ),
 -   PIPE_FORMAT_R32G32B32_SSCALED     = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 4, 4, 4, 0, PIPE_FORMAT_TYPE_SSCALED ),
 -   PIPE_FORMAT_R32G32B32A32_SSCALED  = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 4, 4, 4, 4, PIPE_FORMAT_TYPE_SSCALED ),
 -   PIPE_FORMAT_R16_UNORM             = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 2, 0, 0, 0, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_R16G16_UNORM          = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 2, 2, 0, 0, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_R16G16B16_UNORM       = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 2, 2, 2, 0, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_R16G16B16A16_UNORM    = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 2, 2, 2, 2, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_R16_USCALED           = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 2, 0, 0, 0, PIPE_FORMAT_TYPE_USCALED ),
 -   PIPE_FORMAT_R16G16_USCALED        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 2, 2, 0, 0, PIPE_FORMAT_TYPE_USCALED ),
 -   PIPE_FORMAT_R16G16B16_USCALED     = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 2, 2, 2, 0, PIPE_FORMAT_TYPE_USCALED ),
 -   PIPE_FORMAT_R16G16B16A16_USCALED  = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 2, 2, 2, 2, PIPE_FORMAT_TYPE_USCALED ),
 -   PIPE_FORMAT_R16_SNORM             = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 2, 0, 0, 0, PIPE_FORMAT_TYPE_SNORM ),
 -   PIPE_FORMAT_R16G16_SNORM          = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 2, 2, 0, 0, PIPE_FORMAT_TYPE_SNORM ),
 -   PIPE_FORMAT_R16G16B16_SNORM       = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 2, 2, 2, 0, PIPE_FORMAT_TYPE_SNORM ),
 -   PIPE_FORMAT_R16G16B16A16_SNORM    = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 2, 2, 2, 2, PIPE_FORMAT_TYPE_SNORM ),
 -   PIPE_FORMAT_R16_SSCALED           = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 2, 0, 0, 0, PIPE_FORMAT_TYPE_SSCALED ),
 -   PIPE_FORMAT_R16G16_SSCALED        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 2, 2, 0, 0, PIPE_FORMAT_TYPE_SSCALED ),
 -   PIPE_FORMAT_R16G16B16_SSCALED     = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 2, 2, 2, 0, PIPE_FORMAT_TYPE_SSCALED ),
 -   PIPE_FORMAT_R16G16B16A16_SSCALED  = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 2, 2, 2, 2, PIPE_FORMAT_TYPE_SSCALED ),
 -   PIPE_FORMAT_R8_UNORM              = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 1, 0, 0, 0, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_R8G8_UNORM            = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 1, 1, 0, 0, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_R8G8B8_UNORM          = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 0, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_R8G8B8A8_UNORM        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 1, 1, 1, 1, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_R8G8B8X8_UNORM        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 1, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_R8_USCALED            = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 1, 0, 0, 0, PIPE_FORMAT_TYPE_USCALED ),
 -   PIPE_FORMAT_R8G8_USCALED          = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 1, 1, 0, 0, PIPE_FORMAT_TYPE_USCALED ),
 -   PIPE_FORMAT_R8G8B8_USCALED        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 0, PIPE_FORMAT_TYPE_USCALED ),
 -   PIPE_FORMAT_R8G8B8A8_USCALED      = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 1, 1, 1, 1, PIPE_FORMAT_TYPE_USCALED ),
 -   PIPE_FORMAT_R8G8B8X8_USCALED      = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 1, PIPE_FORMAT_TYPE_USCALED ),
 -   PIPE_FORMAT_R8_SNORM              = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 1, 0, 0, 0, PIPE_FORMAT_TYPE_SNORM ),
 -   PIPE_FORMAT_R8G8_SNORM            = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 1, 1, 0, 0, PIPE_FORMAT_TYPE_SNORM ),
 -   PIPE_FORMAT_R8G8B8_SNORM          = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 0, PIPE_FORMAT_TYPE_SNORM ),
 -   PIPE_FORMAT_R8G8B8A8_SNORM        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SNORM ),
 -   PIPE_FORMAT_R8G8B8X8_SNORM        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SNORM ),
 -   PIPE_FORMAT_B6G5R5_SNORM          = _PIPE_FORMAT_RGBAZS_1 ( _PIPE_FORMAT_BGR1, 6, 5, 5, 0, PIPE_FORMAT_TYPE_SNORM ),
 -   PIPE_FORMAT_A8B8G8R8_SNORM        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_BGRA, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SNORM ),
 -   PIPE_FORMAT_X8B8G8R8_SNORM        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_BGR1, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SNORM ),
 -   PIPE_FORMAT_R8_SSCALED            = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 1, 0, 0, 0, PIPE_FORMAT_TYPE_SSCALED ),
 -   PIPE_FORMAT_R8G8_SSCALED          = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 1, 1, 0, 0, PIPE_FORMAT_TYPE_SSCALED ),
 -   PIPE_FORMAT_R8G8B8_SSCALED        = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 0, PIPE_FORMAT_TYPE_SSCALED ),
 -   PIPE_FORMAT_R8G8B8A8_SSCALED      = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SSCALED ),
 -   PIPE_FORMAT_R8G8B8X8_SSCALED      = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SSCALED ),
 -   PIPE_FORMAT_R32_FIXED             = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_R001, 4, 0, 0, 0, PIPE_FORMAT_TYPE_FIXED ),
 -   PIPE_FORMAT_R32G32_FIXED          = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RG01, 4, 4, 0, 0, PIPE_FORMAT_TYPE_FIXED ),
 -   PIPE_FORMAT_R32G32B32_FIXED       = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 4, 4, 4, 0, PIPE_FORMAT_TYPE_FIXED ),
 -   PIPE_FORMAT_R32G32B32A32_FIXED    = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 4, 4, 4, 4, PIPE_FORMAT_TYPE_FIXED ),
 +   PIPE_FORMAT_NONE                  = 0,
 +   PIPE_FORMAT_A8R8G8B8_UNORM        = 1,
 +   PIPE_FORMAT_X8R8G8B8_UNORM        = 2,
 +   PIPE_FORMAT_B8G8R8A8_UNORM        = 3,
 +   PIPE_FORMAT_B8G8R8X8_UNORM        = 4,
 +   PIPE_FORMAT_A1R5G5B5_UNORM        = 5,
 +   PIPE_FORMAT_A4R4G4B4_UNORM        = 6,
 +   PIPE_FORMAT_R5G6B5_UNORM          = 7,
 +   PIPE_FORMAT_A2B10G10R10_UNORM     = 8,
 +   PIPE_FORMAT_L8_UNORM              = 9,    /**< ubyte luminance */
 +   PIPE_FORMAT_A8_UNORM              = 10,   /**< ubyte alpha */
 +   PIPE_FORMAT_I8_UNORM              = 11,   /**< ubyte intensity */
 +   PIPE_FORMAT_A8L8_UNORM            = 12,   /**< ubyte alpha, luminance */
 +   PIPE_FORMAT_L16_UNORM             = 13,   /**< ushort luminance */
 +   PIPE_FORMAT_YCBCR                 = 14,
 +   PIPE_FORMAT_YCBCR_REV             = 15,
 +   PIPE_FORMAT_Z16_UNORM             = 16,
 +   PIPE_FORMAT_Z32_UNORM             = 17,
 +   PIPE_FORMAT_Z32_FLOAT             = 18,
 +   PIPE_FORMAT_S8Z24_UNORM           = 19,
 +   PIPE_FORMAT_Z24S8_UNORM           = 20,
 +   PIPE_FORMAT_X8Z24_UNORM           = 21,
 +   PIPE_FORMAT_Z24X8_UNORM           = 22,
 +   PIPE_FORMAT_S8_UNORM              = 23,   /**< ubyte stencil */
 +   PIPE_FORMAT_R64_FLOAT             = 24,
 +   PIPE_FORMAT_R64G64_FLOAT          = 25,
 +   PIPE_FORMAT_R64G64B64_FLOAT       = 26,
 +   PIPE_FORMAT_R64G64B64A64_FLOAT    = 27,
 +   PIPE_FORMAT_R32_FLOAT             = 28,
 +   PIPE_FORMAT_R32G32_FLOAT          = 29,
 +   PIPE_FORMAT_R32G32B32_FLOAT       = 30,
 +   PIPE_FORMAT_R32G32B32A32_FLOAT    = 31,
 +   PIPE_FORMAT_R32_UNORM             = 32,
 +   PIPE_FORMAT_R32G32_UNORM          = 33,
 +   PIPE_FORMAT_R32G32B32_UNORM       = 34,
 +   PIPE_FORMAT_R32G32B32A32_UNORM    = 35,
 +   PIPE_FORMAT_R32_USCALED           = 36,
 +   PIPE_FORMAT_R32G32_USCALED        = 37,
 +   PIPE_FORMAT_R32G32B32_USCALED     = 38,
 +   PIPE_FORMAT_R32G32B32A32_USCALED  = 39,
 +   PIPE_FORMAT_R32_SNORM             = 40,
 +   PIPE_FORMAT_R32G32_SNORM          = 41,
 +   PIPE_FORMAT_R32G32B32_SNORM       = 42,
 +   PIPE_FORMAT_R32G32B32A32_SNORM    = 43,
 +   PIPE_FORMAT_R32_SSCALED           = 44,
 +   PIPE_FORMAT_R32G32_SSCALED        = 45,
 +   PIPE_FORMAT_R32G32B32_SSCALED     = 46,
 +   PIPE_FORMAT_R32G32B32A32_SSCALED  = 47,
 +   PIPE_FORMAT_R16_UNORM             = 48,
 +   PIPE_FORMAT_R16G16_UNORM          = 49,
 +   PIPE_FORMAT_R16G16B16_UNORM       = 50,
 +   PIPE_FORMAT_R16G16B16A16_UNORM    = 51,
 +   PIPE_FORMAT_R16_USCALED           = 52,
 +   PIPE_FORMAT_R16G16_USCALED        = 53,
 +   PIPE_FORMAT_R16G16B16_USCALED     = 54,
 +   PIPE_FORMAT_R16G16B16A16_USCALED  = 55,
 +   PIPE_FORMAT_R16_SNORM             = 56,
 +   PIPE_FORMAT_R16G16_SNORM          = 57,
 +   PIPE_FORMAT_R16G16B16_SNORM       = 58,
 +   PIPE_FORMAT_R16G16B16A16_SNORM    = 59,
 +   PIPE_FORMAT_R16_SSCALED           = 60,
 +   PIPE_FORMAT_R16G16_SSCALED        = 61,
 +   PIPE_FORMAT_R16G16B16_SSCALED     = 62,
 +   PIPE_FORMAT_R16G16B16A16_SSCALED  = 63,
 +   PIPE_FORMAT_R8_UNORM              = 64,
 +   PIPE_FORMAT_R8G8_UNORM            = 65,
 +   PIPE_FORMAT_R8G8B8_UNORM          = 66,
 +   PIPE_FORMAT_R8G8B8A8_UNORM        = 67,
 +   PIPE_FORMAT_R8G8B8X8_UNORM        = 68,
 +   PIPE_FORMAT_R8_USCALED            = 69,
 +   PIPE_FORMAT_R8G8_USCALED          = 70,
 +   PIPE_FORMAT_R8G8B8_USCALED        = 71,
 +   PIPE_FORMAT_R8G8B8A8_USCALED      = 72,
 +   PIPE_FORMAT_R8G8B8X8_USCALED      = 73,
 +   PIPE_FORMAT_R8_SNORM              = 74,
 +   PIPE_FORMAT_R8G8_SNORM            = 75,
 +   PIPE_FORMAT_R8G8B8_SNORM          = 76,
 +   PIPE_FORMAT_R8G8B8A8_SNORM        = 77,
 +   PIPE_FORMAT_R8G8B8X8_SNORM        = 78,
 +   PIPE_FORMAT_B6G5R5_SNORM          = 79,
 +   PIPE_FORMAT_A8B8G8R8_SNORM        = 80,
 +   PIPE_FORMAT_X8B8G8R8_SNORM        = 81,
 +   PIPE_FORMAT_R8_SSCALED            = 82,
 +   PIPE_FORMAT_R8G8_SSCALED          = 83,
 +   PIPE_FORMAT_R8G8B8_SSCALED        = 84,
 +   PIPE_FORMAT_R8G8B8A8_SSCALED      = 85,
 +   PIPE_FORMAT_R8G8B8X8_SSCALED      = 86,
 +   PIPE_FORMAT_R32_FIXED             = 87,
 +   PIPE_FORMAT_R32G32_FIXED          = 88,
 +   PIPE_FORMAT_R32G32B32_FIXED       = 89,
 +   PIPE_FORMAT_R32G32B32A32_FIXED    = 90,
     /* sRGB formats */
 -   PIPE_FORMAT_L8_SRGB               = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RRR1, 1, 1, 1, 0, PIPE_FORMAT_TYPE_SRGB ),
 -   PIPE_FORMAT_A8L8_SRGB             = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RRRG, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SRGB ),
 -   PIPE_FORMAT_R8G8B8_SRGB           = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 0, PIPE_FORMAT_TYPE_SRGB ),
 -   PIPE_FORMAT_R8G8B8A8_SRGB         = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGBA, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SRGB ),
 -   PIPE_FORMAT_R8G8B8X8_SRGB         = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_RGB1, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SRGB ),
 -   PIPE_FORMAT_A8R8G8B8_SRGB         = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_ARGB, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SRGB ),
 -   PIPE_FORMAT_X8R8G8B8_SRGB         = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_1RGB, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SRGB ),
 -   PIPE_FORMAT_B8G8R8A8_SRGB         = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_BGRA, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SRGB ),
 -   PIPE_FORMAT_B8G8R8X8_SRGB         = _PIPE_FORMAT_RGBAZS_8 ( _PIPE_FORMAT_BGR1, 1, 1, 1, 1, PIPE_FORMAT_TYPE_SRGB ),
 +   PIPE_FORMAT_L8_SRGB               = 91,
 +   PIPE_FORMAT_A8L8_SRGB             = 92,
 +   PIPE_FORMAT_R8G8B8_SRGB           = 93,
 +   PIPE_FORMAT_R8G8B8A8_SRGB         = 94,
 +   PIPE_FORMAT_R8G8B8X8_SRGB         = 95,
 +   PIPE_FORMAT_A8R8G8B8_SRGB         = 96,
 +   PIPE_FORMAT_X8R8G8B8_SRGB         = 97,
 +   PIPE_FORMAT_B8G8R8A8_SRGB         = 98,
 +   PIPE_FORMAT_B8G8R8X8_SRGB         = 99,
  
     /* mixed formats */
 -   PIPE_FORMAT_X8UB8UG8SR8S_NORM     = _PIPE_FORMAT_MIXED( _PIPE_FORMAT_1BGR, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1 ),
 -   PIPE_FORMAT_B6UG5SR5S_NORM        = _PIPE_FORMAT_MIXED( _PIPE_FORMAT_BGR1, 6, 5, 5, 0, 0, 1, 1, 0, 1, 0 ),
 +   PIPE_FORMAT_X8UB8UG8SR8S_NORM     = 100,
 +   PIPE_FORMAT_B6UG5SR5S_NORM        = 101,
  
     /* compressed formats */
 -   PIPE_FORMAT_DXT1_RGB              = _PIPE_FORMAT_DXT( 1, 8, 8, 8, 0, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_DXT1_RGBA             = _PIPE_FORMAT_DXT( 1, 8, 8, 8, 8, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_DXT3_RGBA             = _PIPE_FORMAT_DXT( 3, 8, 8, 8, 8, PIPE_FORMAT_TYPE_UNORM ),
 -   PIPE_FORMAT_DXT5_RGBA             = _PIPE_FORMAT_DXT( 5, 8, 8, 8, 8, PIPE_FORMAT_TYPE_UNORM ),
 +   PIPE_FORMAT_DXT1_RGB              = 102,
 +   PIPE_FORMAT_DXT1_RGBA             = 103,
 +   PIPE_FORMAT_DXT3_RGBA             = 104,
 +   PIPE_FORMAT_DXT5_RGBA             = 105,
  
     /* sRGB, compressed */
 -   PIPE_FORMAT_DXT1_SRGB             = _PIPE_FORMAT_DXT( 1, 8, 8, 8, 0, PIPE_FORMAT_TYPE_SRGB ),
 -   PIPE_FORMAT_DXT1_SRGBA            = _PIPE_FORMAT_DXT( 1, 8, 8, 8, 8, PIPE_FORMAT_TYPE_SRGB ),
 -   PIPE_FORMAT_DXT3_SRGBA            = _PIPE_FORMAT_DXT( 3, 8, 8, 8, 8, PIPE_FORMAT_TYPE_SRGB ),
 -   PIPE_FORMAT_DXT5_SRGBA            = _PIPE_FORMAT_DXT( 5, 8, 8, 8, 8, PIPE_FORMAT_TYPE_SRGB )
 +   PIPE_FORMAT_DXT1_SRGB             = 106,
 +   PIPE_FORMAT_DXT1_SRGBA            = 107,
 +   PIPE_FORMAT_DXT3_SRGBA            = 108,
 +   PIPE_FORMAT_DXT5_SRGBA            = 109,
 +
 +   PIPE_FORMAT_COUNT
  };
  
  /**
   */
  extern const char *pf_name( enum pipe_format format );
  
+ /**
+  * Return bits for a particular component.
+  * \param comp  component index, starting at 0
+  */
+ static INLINE uint pf_get_component_bits( enum pipe_format format, uint comp )
+ {
+    uint size;
+    if (pf_swizzle_x(format) == comp) {
+       size = pf_size_x(format);
+    }
+    else if (pf_swizzle_y(format) == comp) {
+       size = pf_size_y(format);
+    }
+    else if (pf_swizzle_z(format) == comp) {
+       size = pf_size_z(format);
+    }
+    else if (pf_swizzle_w(format) == comp) {
+       size = pf_size_w(format);
+    }
+    else {
+       size = 0;
+    }
+    if (pf_layout( format ) == PIPE_FORMAT_LAYOUT_RGBAZS)
+       return size << pf_exp2( format );
+    return size << (pf_mixed_scale8( format ) * 3);
+ }
  
  /**
-  * Describe accurately the pixel format.
-  * 
-  * The chars-per-pixel concept falls apart with compressed and yuv images, where
-  * more than one pixel are coded in a single data block. This structure 
-  * describes that block.
-  * 
-  * Simple pixel formats are effectively a 1x1xcpp block.
+  * Return total bits needed for the pixel format per block.
   */
- struct pipe_format_block
+ static INLINE uint pf_get_blocksizebits( enum pipe_format format )
  {
-    /** Block size in bytes */
-    unsigned size;
-    
-    /** Block width in pixels */
-    unsigned width;
-    
-    /** Block height in pixels */
-    unsigned height;
- };
+    switch (pf_layout(format)) {
+    case PIPE_FORMAT_LAYOUT_RGBAZS:
+    case PIPE_FORMAT_LAYOUT_MIXED:
+       return
+          pf_get_component_bits( format, PIPE_FORMAT_COMP_0 ) +
+          pf_get_component_bits( format, PIPE_FORMAT_COMP_1 ) +
+          pf_get_component_bits( format, PIPE_FORMAT_COMP_R ) +
+          pf_get_component_bits( format, PIPE_FORMAT_COMP_G ) +
+          pf_get_component_bits( format, PIPE_FORMAT_COMP_B ) +
+          pf_get_component_bits( format, PIPE_FORMAT_COMP_A ) +
+          pf_get_component_bits( format, PIPE_FORMAT_COMP_Z ) +
+          pf_get_component_bits( format, PIPE_FORMAT_COMP_S );
+    case PIPE_FORMAT_LAYOUT_YCBCR:
+       assert( format == PIPE_FORMAT_YCBCR || format == PIPE_FORMAT_YCBCR_REV );
+       return 32;
+    case PIPE_FORMAT_LAYOUT_DXT:
+         switch(format) {
+         case PIPE_FORMAT_DXT1_RGBA:
+         case PIPE_FORMAT_DXT1_RGB:
+         case PIPE_FORMAT_DXT1_SRGBA:
+         case PIPE_FORMAT_DXT1_SRGB:
+            return 64;
+         case PIPE_FORMAT_DXT3_RGBA:
+         case PIPE_FORMAT_DXT5_RGBA:
+         case PIPE_FORMAT_DXT3_SRGBA:
+         case PIPE_FORMAT_DXT5_SRGBA:
+            return 128;
+         default:
+            assert( 0 );
+            return 0;
+         }
+    default:
+       assert( 0 );
+       return 0;
+    }
+ }
+ /**
+  * Return bytes per element for the given format.
+  */
+ static INLINE uint pf_get_blocksize( enum pipe_format format )
+ {
+    assert(pf_get_blocksizebits(format) % 8 == 0);
+    return pf_get_blocksizebits(format) / 8;
+ }
+ static INLINE uint pf_get_blockwidth( enum pipe_format format )
+ {
+    switch (pf_layout(format)) {
+    case PIPE_FORMAT_LAYOUT_YCBCR:
+       return 2;
+    case PIPE_FORMAT_LAYOUT_DXT:
+       return 4;
+    default:
+       return 1;
+    }
+ }
+ static INLINE uint pf_get_blockheight( enum pipe_format format )
+ {
+    switch (pf_layout(format)) {
+    case PIPE_FORMAT_LAYOUT_DXT:
+       return 4;
+    default:
+       return 1;
+    }
+ }
  
  static INLINE unsigned
- pf_get_nblocksx(const struct pipe_format_block *block, unsigned x)
+ pf_get_nblocksx(enum pipe_format format, unsigned x)
  {
-    return (x + block->width - 1)/block->width;
+    unsigned blockwidth = pf_get_blockwidth(format);
+    return (x + blockwidth - 1) / blockwidth;
  }
  
  static INLINE unsigned
- pf_get_nblocksy(const struct pipe_format_block *block, unsigned y)
+ pf_get_nblocksy(enum pipe_format format, unsigned y)
  {
-    return (y + block->height - 1)/block->height;
+    unsigned blockheight = pf_get_blockheight(format);
+    return (y + blockheight - 1) / blockheight;
  }
  
  static INLINE unsigned
- pf_get_nblocks(const struct pipe_format_block *block, unsigned width, unsigned height)
+ pf_get_nblocks(enum pipe_format format, unsigned width, unsigned height)
  {
-    return pf_get_nblocksx(block, width)*pf_get_nblocksy(block, height);
+    return pf_get_nblocksx(format, width) * pf_get_nblocksy(format, height);
  }
  
  static INLINE size_t
- pf_get_stride(const struct pipe_format_block *block, unsigned width)
+ pf_get_stride(enum pipe_format format, unsigned width)
  {
-    return pf_get_nblocksx(block, width)*block->size;
+    return pf_get_nblocksx(format, width) * pf_get_blocksize(format);
  }
  
  static INLINE size_t
- pf_get_2d_size(const struct pipe_format_block *block, size_t stride, unsigned height)
+ pf_get_2d_size(enum pipe_format format, size_t stride, unsigned height)
  {
-    return pf_get_nblocksy(block, height)*stride;
+    return pf_get_nblocksy(format, height) * stride;
  }
  
 -static INLINE boolean 
 -pf_is_depth_or_stencil( enum pipe_format format )
 -{
 -   return (pf_get_component_bits( format, PIPE_FORMAT_COMP_Z ) +
 -           pf_get_component_bits( format, PIPE_FORMAT_COMP_S )) != 0;
 -}
 -
 -static INLINE boolean 
 -pf_is_depth_and_stencil( enum pipe_format format )
 -{
 -   return (pf_get_component_bits( format, PIPE_FORMAT_COMP_Z ) != 0 &&
 -           pf_get_component_bits( format, PIPE_FORMAT_COMP_S ) != 0);
 -}
 -
 -/** DEPRECATED: For backwards compatibility */
 -static INLINE boolean
 -pf_is_depth_stencil( enum pipe_format format )
 -{
 -   return pf_is_depth_or_stencil( format );
 -}
 -
 -static INLINE boolean 
 -pf_is_compressed( enum pipe_format format )
 -{
 -   return pf_layout(format) == PIPE_FORMAT_LAYOUT_DXT ? TRUE : FALSE;
 -}
 -
 -static INLINE boolean 
 -pf_is_ycbcr( enum pipe_format format )
 -{
 -   return pf_layout(format) == PIPE_FORMAT_LAYOUT_YCBCR ? TRUE : FALSE;
 -}
 -
 -static INLINE boolean 
 -pf_has_alpha( enum pipe_format format )
 -{
 -   switch (pf_layout(format)) {
 -   case PIPE_FORMAT_LAYOUT_RGBAZS:
 -   case PIPE_FORMAT_LAYOUT_MIXED:
 -      /* FIXME: pf_get_component_bits( PIPE_FORMAT_A8L8_UNORM, PIPE_FORMAT_COMP_A ) should not return 0 right? */
 -      if(format == PIPE_FORMAT_A8_UNORM || 
 -         format == PIPE_FORMAT_A8L8_UNORM || 
 -         format == PIPE_FORMAT_A8L8_SRGB)
 -         return TRUE;
 -      return pf_get_component_bits( format, PIPE_FORMAT_COMP_A ) ? TRUE : FALSE;
 -   case PIPE_FORMAT_LAYOUT_YCBCR:
 -      return FALSE; 
 -   case PIPE_FORMAT_LAYOUT_DXT:
 -      switch (format) {
 -      case PIPE_FORMAT_DXT1_RGBA:
 -      case PIPE_FORMAT_DXT3_RGBA:
 -      case PIPE_FORMAT_DXT5_RGBA:
 -      case PIPE_FORMAT_DXT1_SRGBA:
 -      case PIPE_FORMAT_DXT3_SRGBA:
 -      case PIPE_FORMAT_DXT5_SRGBA:
 -         return TRUE;
 -      default:
 -         return FALSE;
 -      }
 -   default:
 -      assert( 0 );
 -      return FALSE;
 -   }
 -}
 -
  enum pipe_video_chroma_format
  {
     PIPE_VIDEO_CHROMA_FORMAT_420,
@@@ -44,7 -44,6 +44,7 @@@
  #include "state_tracker/st_context.h"
  #include "state_tracker/st_cb_fbo.h"
  
 +#include "util/u_format.h"
  #include "util/u_memory.h"
  #include "util/u_rect.h"
   
@@@ -67,7 -66,6 +67,6 @@@ dri_surface_from_handle(struct drm_api 
     templat.format = format;
     templat.width0 = width;
     templat.height0 = height;
-    util_format_get_block(templat.format, &templat.block);
  
     texture = api->texture_from_shared_handle(api, screen, &templat,
                                               "dri2 buffer", pitch, handle);
@@@ -12,7 -12,6 +12,7 @@@
  
  #include "state_tracker/drm_api.h"
  
 +#include "util/u_format.h"
  #include "util/u_rect.h"
  
  /*
@@@ -119,7 -118,6 +119,6 @@@ drm_create_texture(_EGLDisplay *dpy
        templat.format = PIPE_FORMAT_A8R8G8B8_UNORM;
        templat.width0 = w;
        templat.height0 = h;
-       util_format_get_block(templat.format, &templat.block);
  
        texture = screen->texture_create(dev->screen,
                                         &templat);
@@@ -112,7 -112,6 +112,10 @@@ struct st_device 
        struct pipe_texture templat;
        memset(&templat, 0, sizeof(templat));
        templat.format = format;
++<<<<<<< HEAD
 +      util_format_get_block(templat.format, &templat.block);
++=======
++>>>>>>> master
        templat.width0 = width;
        templat.height0 = height;
        templat.depth0 = depth;
@@@ -40,7 -40,6 +40,7 @@@
  #include "pipe/p_format.h"
  #include "pipe/p_context.h"
  #include "pipe/p_inlines.h"
 +#include "util/u_format.h"
  #include "util/u_math.h"
  #include "util/u_memory.h"
  #include "softpipe/sp_winsys.h"
@@@ -158,16 -157,6 +158,6 @@@ st_softpipe_user_buffer_create(struct p
  }
  
  
- /**
-  * Round n up to next multiple.
-  */
- static INLINE unsigned
- round_up(unsigned n, unsigned multiple)
- {
-    return (n + multiple - 1) & ~(multiple - 1);
- }
  static struct pipe_buffer *
  st_softpipe_surface_buffer_create(struct pipe_winsys *winsys,
                                    unsigned width, unsigned height,
                                    unsigned *stride)
  {
     const unsigned alignment = 64;
-    struct pipe_format_block block;
-    unsigned nblocksx, nblocksy;
+    unsigned nblocksy;
  
-    util_format_get_block(format, &block);
-    nblocksx = pf_get_nblocksx(&block, width);
-    nblocksy = pf_get_nblocksy(&block, height);
-    *stride = round_up(nblocksx * block.size, alignment);
+    nblocksy = pf_get_nblocksy(format, height);
+    *stride = align(pf_get_stride(format, width), alignment);
  
     return winsys->buffer_create(winsys, alignment,
                                  usage,
@@@ -38,7 -38,6 +38,7 @@@
  #include "pipe/p_screen.h"
  #include "pipe/p_shader_tokens.h"
  
 +#include "util/u_format.h"
  #include "util/u_memory.h"
  
  
@@@ -72,7 -71,6 +72,6 @@@ static INLINE struct pipe_texture *crea
     templ.width0 = color_data_len;
     templ.height0 = 1;
     templ.depth0 = 1;
-    util_format_get_block(PIPE_FORMAT_A8R8G8B8_UNORM, &templ.block);
     templ.tex_usage = PIPE_TEXTURE_USAGE_SAMPLER;
  
     tex = screen->texture_create(screen, &templ);
@@@ -39,7 -39,6 +39,7 @@@
  #include "pipe/p_screen.h"
  #include "pipe/p_inlines.h"
  #include "util/u_blit.h"
 +#include "util/u_format.h"
  #include "util/u_tile.h"
  #include "util/u_memory.h"
  #include "util/u_math.h"
@@@ -271,7 -270,6 +271,6 @@@ struct vg_image * image_create(VGImageF
     memset(&pt, 0, sizeof(pt));
     pt.target = PIPE_TEXTURE_2D;
     pt.format = pformat;
-    util_format_get_block(pformat, &pt.block);
     pt.last_level = 0;
     pt.width0 = width;
     pt.height0 = height;
@@@ -36,7 -36,6 +36,7 @@@
  #include "pipe/p_context.h"
  #include "pipe/p_screen.h"
  #include "pipe/p_inlines.h"
 +#include "util/u_format.h"
  #include "util/u_memory.h"
  
  struct vg_mask_layer {
@@@ -492,7 -491,6 +492,6 @@@ struct vg_mask_layer * mask_layer_creat
        memset(&pt, 0, sizeof(pt));
        pt.target = PIPE_TEXTURE_2D;
        pt.format = PIPE_FORMAT_A8R8G8B8_UNORM;
-       util_format_get_block(PIPE_FORMAT_A8R8G8B8_UNORM, &pt.block);
        pt.last_level = 0;
        pt.width0 = width;
        pt.height0 = height;
@@@ -34,7 -34,6 +34,7 @@@
  #include "pipe/p_compiler.h"
  #include "pipe/p_inlines.h"
  
 +#include "util/u_format.h"
  #include "util/u_memory.h"
  #include "util/u_math.h"
  
@@@ -155,7 -154,6 +155,6 @@@ static INLINE struct pipe_texture *crea
     templ.width0 = 1024;
     templ.height0 = 1;
     templ.depth0 = 1;
-    util_format_get_block(PIPE_FORMAT_A8R8G8B8_UNORM, &templ.block);
     templ.tex_usage = PIPE_TEXTURE_USAGE_SAMPLER;
  
     tex = screen->texture_create(screen, &templ);
@@@ -35,7 -35,6 +35,7 @@@
  #include "pipe/p_shader_tokens.h"
  
  #include "util/u_draw_quad.h"
 +#include "util/u_format.h"
  #include "util/u_simple_shaders.h"
  #include "util/u_memory.h"
  #include "util/u_rect.h"
@@@ -449,7 -448,6 +449,6 @@@ void renderer_copy_surface(struct rende
     texTemp.width0 = srcW;
     texTemp.height0 = srcH;
     texTemp.depth0 = 1;
-    util_format_get_block(src->format, &texTemp.block);
  
     tex = screen->texture_create(screen, &texTemp);
     if (!tex)
  #include "pipe/p_context.h"
  #include "pipe/p_inlines.h"
  #include "pipe/p_screen.h"
 +#include "util/u_format.h"
  #include "util/u_memory.h"
  #include "util/u_math.h"
+ #include "util/u_rect.h"
  
  static struct pipe_texture *
  create_texture(struct pipe_context *pipe, enum pipe_format format,
     }
  
     templ.target = PIPE_TEXTURE_2D;
-    util_format_get_block(templ.format, &templ.block);
     templ.width0 = width;
     templ.height0 = height;
     templ.depth0 = 1;
     templ.last_level = 0;
  
 -   if (pf_get_component_bits(format, PIPE_FORMAT_COMP_S)) {
 +   if (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 1)) {
        templ.tex_usage = PIPE_TEXTURE_USAGE_DEPTH_STENCIL;
     } else {
        templ.tex_usage = (PIPE_TEXTURE_USAGE_DISPLAY_TARGET |
@@@ -30,7 -30,6 +30,7 @@@
  #include "main/context.h"
  #include "pipe/p_format.h"
  #include "pipe/p_screen.h"
 +#include "util/u_format.h"
  #include "state_tracker/st_context.h"
  #include "state_tracker/st_public.h"
  
@@@ -268,13 -267,15 +268,13 @@@ stw_framebuffer_allocate
        enum pipe_format colorFormat, depthFormat, stencilFormat;
  
        colorFormat = pfi->color_format;
 -      
 -      assert(pf_layout( pfi->depth_stencil_format ) == PIPE_FORMAT_LAYOUT_RGBAZS );
 -   
 -      if(pf_get_component_bits( pfi->depth_stencil_format, PIPE_FORMAT_COMP_Z ))
 +
 +      if(util_format_get_component_bits(pfi->depth_stencil_format, UTIL_FORMAT_COLORSPACE_ZS, 0))
           depthFormat = pfi->depth_stencil_format;
        else
           depthFormat = PIPE_FORMAT_NONE;
     
 -      if(pf_get_component_bits( pfi->depth_stencil_format, PIPE_FORMAT_COMP_S ))
 +      if(util_format_get_component_bits(pfi->depth_stencil_format, UTIL_FORMAT_COLORSPACE_ZS, 1))
           stencilFormat = pfi->depth_stencil_format;
        else
           stencilFormat = PIPE_FORMAT_NONE;
@@@ -474,8 -475,6 +474,6 @@@ DrvPresentBuffers(HDC hdc, PGLPRESENTBU
     struct stw_framebuffer *fb;
     struct pipe_screen *screen;
     struct pipe_surface *surface;
-    unsigned surface_index;
-    BOOL ret = FALSE;
  
     fb = stw_framebuffer_from_hdc( hdc );
     if (fb == NULL)
  
     screen = stw_dev->screen;
  
-    surface_index = (unsigned)(uintptr_t)data->pPrivateData;
-    if(!st_get_framebuffer_surface( fb->stfb, surface_index, &surface ))
-       goto fail;
+    surface = (struct pipe_surface *)data->pPrivateData;
  
  #ifdef DEBUG
     if(stw_dev->trace_running) {
        stw_dev->stw_winsys->present( screen, surface, hdc );
     }
  
-    ret = TRUE;
- fail:
     stw_framebuffer_update(fb);
  
     stw_framebuffer_release(fb);
  
-    return ret;
+    return TRUE;
  }
  
  
  BOOL
  stw_framebuffer_present_locked(HDC hdc,
                                 struct stw_framebuffer *fb,
-                                unsigned surface_index)
+                                struct pipe_surface *surface)
  {
     if(stw_dev->callbacks.wglCbPresentBuffers &&
        stw_dev->stw_winsys->compose) {
        data.magic2 = 0;
        data.AdapterLuid = stw_dev->AdapterLuid;
        data.rect = fb->client_rect;
-       data.pPrivateData = (void *)(uintptr_t)surface_index;
+       data.pPrivateData = (void *)surface;
  
        stw_framebuffer_release(fb);
  
     }
     else {
        struct pipe_screen *screen = stw_dev->screen;
-       struct pipe_surface *surface;
-       if(!st_get_framebuffer_surface( fb->stfb, surface_index, &surface )) {
-          /* FIXME: this shouldn't happen, but does on glean */
-          stw_framebuffer_release(fb);
-          return FALSE;
-       }
  
  #ifdef DEBUG
        if(stw_dev->trace_running) {
@@@ -589,6 -575,7 +574,7 @@@ DrvSwapBuffers
     HDC hdc )
  {
     struct stw_framebuffer *fb;
+    struct pipe_surface *surface = NULL;
  
     fb = stw_framebuffer_from_hdc( hdc );
     if (fb == NULL)
        return TRUE;
     }
  
-    /* If we're swapping the buffer associated with the current context
-     * we have to flush any pending rendering commands first.
-     */
-    st_notify_swapbuffers( fb->stfb );
+    st_swapbuffers(fb->stfb, &surface, NULL);
  
-    return stw_framebuffer_present_locked(hdc, fb, ST_SURFACE_BACK_LEFT);
+    return stw_framebuffer_present_locked(hdc, fb, surface);
  }
  
  
@@@ -50,7 -50,6 +50,7 @@@
  #endif
  
  #include "pipe/p_inlines.h"
 +#include "util/u_format.h"
  #include "util/u_rect.h"
  
  #ifdef HAVE_LIBKMS
@@@ -201,7 -200,6 +201,6 @@@ crtc_load_cursor_argb_ga3d(xf86CrtcPtr 
        templat.format = PIPE_FORMAT_A8R8G8B8_UNORM;
        templat.width0 = 64;
        templat.height0 = 64;
-       util_format_get_block(templat.format, &templat.block);
  
        crtcp->cursor_tex = ms->screen->texture_create(ms->screen,
                                                       &templat);
                                            PIPE_TRANSFER_WRITE,
                                            0, 0, 64, 64);
      ptr = ms->screen->transfer_map(ms->screen, transfer);
-     util_copy_rect(ptr, &crtcp->cursor_tex->block,
+     util_copy_rect(ptr, crtcp->cursor_tex->format,
                   transfer->stride, 0, 0,
                   64, 64, (void*)image, 64 * 4, 0, 0);
      ms->screen->transfer_unmap(ms->screen, transfer);
@@@ -258,7 -256,7 +257,7 @@@ crtc_load_cursor_argb_kms(xf86CrtcPtr c
      return;
  
  err_bo_destroy:
-     kms_bo_destroy(crtcp->cursor_bo);
+     kms_bo_destroy(&crtcp->cursor_bo);
  }
  #endif
  
@@@ -306,10 -304,8 +305,8 @@@ xorg_crtc_cursor_destroy(xf86CrtcPtr cr
        pipe_texture_reference(&crtcp->cursor_tex, NULL);
  #ifdef HAVE_LIBKMS
      if (crtcp->cursor_bo)
-       kms_bo_destroy(crtcp->cursor_bo);
+       kms_bo_destroy(&crtcp->cursor_bo);
  #endif
-     xfree(crtcp);
  }
  
  /*
@@@ -321,11 -317,12 +318,12 @@@ crtc_destroy(xf86CrtcPtr crtc
  {
      struct crtc_private *crtcp = crtc->driver_private;
  
-     if (crtcp->cursor_tex)
-       pipe_texture_reference(&crtcp->cursor_tex, NULL);
+     xorg_crtc_cursor_destroy(crtc);
  
      drmModeFreeCrtc(crtcp->drm_crtc);
      xfree(crtcp);
+     crtc->driver_private = NULL;
  }
  
  static const xf86CrtcFuncsRec crtc_funcs = {
@@@ -40,7 -40,6 +40,7 @@@
  #include "pipe/p_state.h"
  #include "pipe/p_inlines.h"
  
 +#include "util/u_format.h"
  #include "util/u_rect.h"
  
  /* Make all the #if cases in the code esier to read */
@@@ -93,7 -92,7 +93,7 @@@ dri2_do_create_buffer(DrawablePtr pDraw
      case 9:
  #endif
        if (exa_priv->depth_stencil_tex &&
 -          !pf_is_depth_stencil(exa_priv->depth_stencil_tex->format))
 +          !util_format_is_depth_or_stencil(exa_priv->depth_stencil_tex->format))
            exa_priv->depth_stencil_tex = NULL;
          /* Fall through */
      case DRI2BufferDepth:
            else
                template.format = ms->ds_depth_bits_last ?
                    PIPE_FORMAT_S8Z24_UNORM : PIPE_FORMAT_Z24S8_UNORM;
-           util_format_get_block(template.format, &template.block);
            template.width0 = pDraw->width;
            template.height0 = pDraw->height;
            template.depth0 = 1;
@@@ -43,7 -43,6 +43,7 @@@
  #include "pipe/p_state.h"
  #include "pipe/p_inlines.h"
  
 +#include "util/u_format.h"
  #include "util/u_rect.h"
  #include "util/u_math.h"
  #include "util/u_debug.h"
@@@ -203,7 -202,7 +203,7 @@@ ExaDownloadFromScreen(PixmapPtr pPix, i
                   x, y, w, h, dst_pitch);
  #endif
  
-     util_copy_rect((unsigned char*)dst, &priv->tex->block, dst_pitch, 0, 0,
+     util_copy_rect((unsigned char*)dst, priv->tex->format, dst_pitch, 0, 0,
                   w, h, exa->scrn->transfer_map(exa->scrn, transfer),
                   transfer->stride, 0, 0);
  
@@@ -243,7 -242,7 +243,7 @@@ ExaUploadToScreen(PixmapPtr pPix, int x
  #endif
  
      util_copy_rect(exa->scrn->transfer_map(exa->scrn, transfer),
-                  &priv->tex->block, transfer->stride, 0, 0, w, h,
+                  priv->tex->format, transfer->stride, 0, 0, w, h,
                   (unsigned char*)src, src_pitch, 0, 0);
  
      exa->scrn->transfer_unmap(exa->scrn, transfer);
@@@ -900,7 -899,6 +900,6 @@@ ExaModifyPixmapHeader(PixmapPtr pPixmap
        memset(&template, 0, sizeof(template));
        template.target = PIPE_TEXTURE_2D;
        exa_get_pipe_format(depth, &template.format, &bitsPerPixel, &priv->picture_format);
-       util_format_get_block(template.format, &template.block);
          if (ROUND_UP_TEXTURES && priv->flags == 0) {
             template.width0 = util_next_power_of_two(width);
             template.height0 = util_next_power_of_two(height);
@@@ -986,7 -984,6 +985,6 @@@ xorg_exa_create_root_texture(ScrnInfoPt
      memset(&template, 0, sizeof(template));
      template.target = PIPE_TEXTURE_2D;
      exa_get_pipe_format(depth, &template.format, &bitsPerPixel, &dummy);
-     util_format_get_block(template.format, &template.block);
      template.width0 = width;
      template.height0 = height;
      template.depth0 = 1;
@@@ -5,7 -5,6 +5,7 @@@
  
  #include "cso_cache/cso_context.h"
  #include "util/u_draw_quad.h"
 +#include "util/u_format.h"
  #include "util/u_math.h"
  #include "util/u_memory.h"
  #include "util/u_rect.h"
@@@ -513,7 -512,6 +513,6 @@@ renderer_clone_texture(struct xorg_rend
     templ.width0 = src->width0;
     templ.height0 = src->height0;
     templ.depth0 = 1;
-    util_format_get_block(format, &templ.block);
     templ.tex_usage = PIPE_TEXTURE_USAGE_SAMPLER;
  
     pt = screen->texture_create(screen, &templ);
@@@ -13,8 -13,6 +13,8 @@@
  #include "pipe/p_screen.h"
  #include "pipe/p_inlines.h"
  
 +#include "util/u_format.h"
 +
  /*XXX get these from pipe's texture limits */
  #define IMAGE_MAX_WIDTH               2048
  #define IMAGE_MAX_HEIGHT      2048
@@@ -172,7 -170,6 +172,6 @@@ create_component_texture(struct pipe_co
     templ.width0 = width;
     templ.height0 = height;
     templ.depth0 = 1;
-    util_format_get_block(PIPE_FORMAT_L8_UNORM, &templ.block);
     templ.tex_usage = PIPE_TEXTURE_USAGE_SAMPLER;
  
     tex = screen->texture_create(screen, &templ);
@@@ -215,17 -212,67 +214,67 @@@ check_yuv_textures(struct xorg_xv_port_
     return Success;
  }
  
+ static int
+ query_image_attributes(ScrnInfoPtr pScrn,
+                        int id,
+                        unsigned short *w, unsigned short *h,
+                        int *pitches, int *offsets)
+ {
+    int size, tmp;
+    if (*w > IMAGE_MAX_WIDTH)
+       *w = IMAGE_MAX_WIDTH;
+    if (*h > IMAGE_MAX_HEIGHT)
+       *h = IMAGE_MAX_HEIGHT;
+    *w = (*w + 1) & ~1;
+    if (offsets)
+       offsets[0] = 0;
+    switch (id) {
+    case FOURCC_YV12:
+       *h = (*h + 1) & ~1;
+       size = (*w + 3) & ~3;
+       if (pitches) {
+          pitches[0] = size;
+       }
+       size *= *h;
+       if (offsets) {
+          offsets[1] = size;
+       }
+       tmp = ((*w >> 1) + 3) & ~3;
+       if (pitches) {
+          pitches[1] = pitches[2] = tmp;
+       }
+       tmp *= (*h >> 1);
+       size += tmp;
+       if (offsets) {
+          offsets[2] = size;
+       }
+       size += tmp;
+       break;
+    case FOURCC_UYVY:
+    case FOURCC_YUY2:
+    default:
+       size = *w << 1;
+       if (pitches)
+        pitches[0] = size;
+       size *= *h;
+       break;
+    }
+    return size;
+ }
  static void
  copy_packed_data(ScrnInfoPtr pScrn,
                   struct xorg_xv_port_priv *port,
                   int id,
                   unsigned char *buf,
-                  int srcPitch,
                   int left,
                   int top,
-                  int w, int h)
+                  unsigned short w, unsigned short h)
  {
-    unsigned char *src;
     int i, j;
     struct pipe_texture **dst = port->yuv[port->current_set];
     struct pipe_transfer *ytrans, *utrans, *vtrans;
     int yidx, uidx, vidx;
     int y_array_size = w * h;
  
-    src = buf + (top * srcPitch) + (left << 1);
     ytrans = screen->get_tex_transfer(screen, dst[0],
                                       0, 0, 0,
                                       PIPE_TRANSFER_WRITE,
  
     switch (id) {
     case FOURCC_YV12: {
-       for (i = 0; i < w; ++i) {
-          for (j = 0; j < h; ++j) {
-             /*XXX use src? */
-             y1  = buf[j*w + i];
-             u   = buf[(j/2) * (w/2) + i/2 + y_array_size];
-             v   = buf[(j/2) * (w/2) + i/2 + y_array_size + y_array_size/4];
-             ymap[yidx++] = y1;
-             umap[uidx++] = u;
-             vmap[vidx++] = v;
+       int pitches[3], offsets[3];
+       unsigned char *y, *u, *v;
+       query_image_attributes(pScrn, FOURCC_YV12,
+                              &w, &h, pitches, offsets);
+       y = buf + offsets[0];
+       v = buf + offsets[1];
+       u = buf + offsets[2];
+       for (i = 0; i < h; ++i) {
+          for (j = 0; j < w; ++j) {
+             int yoffset = (w*i+j);
+             int ii = (i|1), jj = (j|1);
+             int vuoffset = (w/2)*(ii/2) + (jj/2);
+             ymap[yidx++] = y[yoffset];
+             umap[uidx++] = u[vuoffset];
+             vmap[vidx++] = v[vuoffset];
           }
        }
     }
@@@ -513,7 -565,6 +567,6 @@@ put_image(ScrnInfoPtr pScrn
     ScreenPtr pScreen = screenInfo.screens[pScrn->scrnIndex];
     PixmapPtr pPixmap;
     INT32 x1, x2, y1, y2;
-    int srcPitch;
     BoxRec dstBox;
     int ret;
  
                              width, height))
        return Success;
  
-    switch (id) {
-    case FOURCC_UYVY:
-    case FOURCC_YUY2:
-    case FOURCC_YV12:
-    default:
-       srcPitch = width << 1;
-       break;
-    }
     ret = check_yuv_textures(pPriv, width, height);
  
     if (ret)
        return ret;
  
-    copy_packed_data(pScrn, pPriv, id, buf, srcPitch,
+    copy_packed_data(pScrn, pPriv, id, buf,
                      src_x, src_y, width, height);
  
     if (pDraw->type == DRAWABLE_WINDOW) {
     return Success;
  }
  
- static int
- query_image_attributes(ScrnInfoPtr pScrn,
-                        int id,
-                        unsigned short *w, unsigned short *h,
-                        int *pitches, int *offsets)
- {
-    int size;
-    if (*w > IMAGE_MAX_WIDTH)
-       *w = IMAGE_MAX_WIDTH;
-    if (*h > IMAGE_MAX_HEIGHT)
-       *h = IMAGE_MAX_HEIGHT;
-    *w = (*w + 1) & ~1;
-    if (offsets)
-       offsets[0] = 0;
-    switch (id) {
-    case FOURCC_UYVY:
-    case FOURCC_YUY2:
-    case FOURCC_YV12:
-    default:
-       size = *w << 1;
-       if (pitches)
-        pitches[0] = size;
-       size *= *h;
-       break;
-    }
-    return size;
- }
  static struct xorg_xv_port_priv *
  port_priv_create(struct xorg_renderer *r)
  {
@@@ -1,6 -1,5 +1,6 @@@
  #include "pipe/p_context.h"
  #include "pipe/p_state.h"
 +#include "util/u_format.h"
  #include "util/u_memory.h"
  
  #include "nouveau_drm_api.h"
@@@ -29,7 -28,6 +29,6 @@@ dri_surface_from_handle(struct drm_api 
        tmpl.format = format;
        tmpl.width0 = width;
        tmpl.height0 = height;
-       util_format_get_block(tmpl.format, &tmpl.block);
  
        pt = api->texture_from_shared_handle(api, pscreen, &tmpl,
                                             "front buffer", pitch, handle);
@@@ -248,7 -246,7 +247,7 @@@ nouveau_drm_handle_from_pt(struct drm_a
                return false;
  
        *handle = mt->bo->handle;
-       *stride = mt->base.nblocksx[0] * mt->base.block.size;
+       *stride = pf_get_stride(mt->base.format, mt->base.width0);
        return true;
  }
  
@@@ -38,7 -38,6 +38,7 @@@
  #include "pipe/internal/p_winsys_screen.h"
  #include "pipe/p_state.h"
  #include "pipe/p_inlines.h"
 +#include "util/u_format.h"
  #include "util/u_math.h"
  #include "util/u_memory.h"
  
@@@ -72,16 -71,6 +72,6 @@@ sw_pipe_buffer(struct pipe_buffer *b
  }
  
  
- /**
-  * Round n up to next multiple.
-  */
- static INLINE unsigned
- round_up(unsigned n, unsigned multiple)
- {
-    return (n + multiple - 1) & ~(multiple - 1);
- }
  static const char *
  get_name(struct pipe_winsys *pws)
  {
@@@ -171,13 -160,10 +161,10 @@@ surface_buffer_create(struct pipe_winsy
                        unsigned *stride)
  {
     const unsigned alignment = 64;
-    struct pipe_format_block block;
-    unsigned nblocksx, nblocksy;
+    unsigned nblocksy;
  
-    util_format_get_block(format, &block);
-    nblocksx = pf_get_nblocksx(&block, width);
-    nblocksy = pf_get_nblocksy(&block, height);
-    *stride = round_up(nblocksx * block.size, alignment);
+    nblocksy = pf_get_nblocksy(format, height);
+    *stride = align(pf_get_stride(format, width), alignment);
  
     return winsys->buffer_create(winsys, alignment,
                                  usage,
@@@ -30,7 -30,6 +30,7 @@@
  #include <pipe/internal/p_winsys_screen.h>
  #include <pipe/p_state.h>
  #include <pipe/p_inlines.h>
 +#include <util/u_format.h>
  #include <util/u_memory.h>
  #include <util/u_math.h>
  #include <softpipe/sp_winsys.h>
@@@ -139,13 -138,10 +139,10 @@@ static struct pipe_buffer* xsp_surface_
  )
  {
     const unsigned int ALIGNMENT = 1;
-    struct pipe_format_block block;
-    unsigned nblocksx, nblocksy;
+    unsigned nblocksy;
  
-    util_format_get_block(format, &block);
-    nblocksx = pf_get_nblocksx(&block, width);
-    nblocksy = pf_get_nblocksy(&block, height);
-    *stride = align(nblocksx * block.size, ALIGNMENT);
+    nblocksy = pf_get_nblocksy(format, height);
+    *stride = align(pf_get_stride(format, width), ALIGNMENT);
  
     return pws->buffer_create(pws, ALIGNMENT, usage,
                               *stride * nblocksy);
@@@ -39,7 -39,6 +39,7 @@@
  #include "pipe/p_format.h"
  #include "pipe/p_context.h"
  #include "pipe/p_inlines.h"
 +#include "util/u_format.h"
  #include "util/u_math.h"
  #include "util/u_memory.h"
  #include "llvmpipe/lp_winsys.h"
@@@ -50,7 -49,6 +50,6 @@@
  struct gdi_llvmpipe_displaytarget
  {
     enum pipe_format format;
-    struct pipe_format_block block;
     unsigned width;
     unsigned height;
     unsigned stride;
@@@ -119,16 -117,6 +118,6 @@@ gdi_llvmpipe_displaytarget_destroy(stru
  }
  
  
- /**
-  * Round n up to next multiple.
-  */
- static INLINE unsigned
- round_up(unsigned n, unsigned multiple)
- {
-    return (n + multiple - 1) & ~(multiple - 1);
- }
  static struct llvmpipe_displaytarget *
  gdi_llvmpipe_displaytarget_create(struct llvmpipe_winsys *winsys,
                                    enum pipe_format format,
     gdt->width = width;
     gdt->height = height;
  
 -   bpp = pf_get_blocksizebits(format);
 -   cpp = pf_get_blocksize(format);
 +   bpp = util_format_get_bits(format);
 +   cpp = util_format_get_size(format);
     
-    gdt->stride = round_up(width * cpp, alignment);
+    gdt->stride = align(width * cpp, alignment);
     gdt->size = gdt->stride * height;
     
     gdt->data = align_malloc(gdt->size, alignment);
@@@ -42,7 -42,6 +42,7 @@@
  #include "pipe/p_format.h"
  #include "pipe/p_context.h"
  #include "pipe/p_inlines.h"
 +#include "util/u_format.h"
  #include "util/u_math.h"
  #include "util/u_memory.h"
  #include "softpipe/sp_winsys.h"
@@@ -152,16 -151,6 +152,6 @@@ gdi_softpipe_user_buffer_create(struct 
  }
  
  
- /**
-  * Round n up to next multiple.
-  */
- static INLINE unsigned
- round_up(unsigned n, unsigned multiple)
- {
-    return (n + multiple - 1) & ~(multiple - 1);
- }
  static struct pipe_buffer *
  gdi_softpipe_surface_buffer_create(struct pipe_winsys *winsys,
                                     unsigned width, unsigned height,
                                     unsigned *stride)
  {
     const unsigned alignment = 64;
-    struct pipe_format_block block;
-    unsigned nblocksx, nblocksy;
+    unsigned nblocksy;
  
-    util_format_get_block(format, &block);
-    nblocksx = pf_get_nblocksx(&block, width);
-    nblocksy = pf_get_nblocksy(&block, height);
-    *stride = round_up(nblocksx * block.size, alignment);
+    nblocksy = pf_get_nblocksy(format, height);
+    *stride = align(pf_get_stride(format, width), alignment);
  
     return winsys->buffer_create(winsys, alignment,
                                  usage,
@@@ -284,10 -270,10 +271,10 @@@ gdi_softpipe_present(struct pipe_scree
  
      memset(&bmi, 0, sizeof(BITMAPINFO));
      bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
 -    bmi.bmiHeader.biWidth = texture->stride[surface->level] / pf_get_blocksize(surface->format);
 +    bmi.bmiHeader.biWidth = texture->stride[surface->level] / util_format_get_size(surface->format);
      bmi.bmiHeader.biHeight= -(long)surface->height;
      bmi.bmiHeader.biPlanes = 1;
 -    bmi.bmiHeader.biBitCount = pf_get_blocksizebits(surface->format);
 +    bmi.bmiHeader.biBitCount = util_format_get_bits(surface->format);
      bmi.bmiHeader.biCompression = BI_RGB;
      bmi.bmiHeader.biSizeImage = 0;
      bmi.bmiHeader.biXPelsPerMeter = 0;
@@@ -45,7 -45,6 +45,7 @@@
  #include "pipe/p_format.h"
  #include "pipe/p_context.h"
  #include "pipe/p_inlines.h"
 +#include "util/u_format.h"
  #include "util/u_math.h"
  #include "util/u_memory.h"
  
@@@ -278,35 -277,24 +278,24 @@@ xm_user_buffer_create(struct pipe_winsy
  
  
  
- /**
-  * Round n up to next multiple.
-  */
- static INLINE unsigned
- round_up(unsigned n, unsigned multiple)
- {
-    return (n + multiple - 1) & ~(multiple - 1);
- }
  static struct pipe_buffer *
  xm_surface_buffer_create(struct pipe_winsys *winsys,
                           unsigned width, unsigned height,
                           enum pipe_format format,
                           unsigned usage,
+                          unsigned tex_usage,
                           unsigned *stride)
  {
     const unsigned alignment = 64;
-    struct pipe_format_block block;
-    unsigned nblocksx, nblocksy;
+    unsigned nblocksy;
  
-    util_format_get_block(format, &block);
-    nblocksx = pf_get_nblocksx(&block, width);
-    nblocksy = pf_get_nblocksy(&block, height);
-    *stride = round_up(nblocksx * block.size, alignment);
+    nblocksy = pf_get_nblocksy(format, height);
+    *stride = align(pf_get_stride(format, width), alignment);
  
     return winsys->buffer_create(winsys, alignment,
                                  usage,
                                  /* XXX a bit of a hack */
-                                 *stride * round_up(nblocksy, TILE_SIZE));
+                                 *stride * align(nblocksy, TILE_SIZE));
  }
  
  
@@@ -44,7 -44,6 +44,7 @@@
  #include "pipe/p_format.h"
  #include "pipe/p_context.h"
  #include "pipe/p_inlines.h"
 +#include "util/u_format.h"
  #include "util/u_math.h"
  #include "util/u_memory.h"
  #include "llvmpipe/lp_winsys.h"
@@@ -59,7 -58,6 +59,6 @@@
  struct xm_displaytarget
  {
     enum pipe_format format;
-    struct pipe_format_block block;
     unsigned width;
     unsigned height;
     unsigned stride;
@@@ -263,10 -261,10 +262,10 @@@ xm_llvmpipe_display(struct xmesa_buffe
     {
        if (xm_dt->tempImage == NULL)
        {
-          assert(xm_dt->block.width == 1);
-          assert(xm_dt->block.height == 1);
+          assert(pf_get_blockwidth(xm_dt->format) == 1);
+          assert(pf_get_blockheight(xm_dt->format) == 1);
           alloc_shm_ximage(xm_dt, xm_buffer,
-                           xm_dt->stride / xm_dt->block.size,
+                           xm_dt->stride / pf_get_blocksize(xm_dt->format),
                            xm_dt->height);
        }
  
@@@ -322,7 -320,7 +321,7 @@@ xm_displaytarget_create(struct llvmpipe
                          unsigned *stride)
  {
     struct xm_displaytarget *xm_dt = CALLOC_STRUCT(xm_displaytarget);
-    unsigned nblocksx, nblocksy, size;
+    unsigned nblocksy, size;
  
     xm_dt = CALLOC_STRUCT(xm_displaytarget);
     if(!xm_dt)
     xm_dt->width = width;
     xm_dt->height = height;
  
-    util_format_get_block(format, &xm_dt->block);
-    nblocksx = pf_get_nblocksx(&xm_dt->block, width);
-    nblocksy = pf_get_nblocksy(&xm_dt->block, height);
-    xm_dt->stride = align(nblocksx * xm_dt->block.size, alignment);
+    nblocksy = pf_get_nblocksy(format, height);
+    xm_dt->stride = align(pf_get_stride(format, width), alignment);
     size = xm_dt->stride * nblocksy;
  
  #ifdef USE_XSHM
@@@ -42,7 -42,6 +42,7 @@@
  #include "pipe/p_format.h"
  #include "pipe/p_context.h"
  #include "pipe/p_inlines.h"
 +#include "util/u_format.h"
  #include "util/u_math.h"
  #include "util/u_memory.h"
  #include "softpipe/sp_winsys.h"
@@@ -255,10 -254,10 +255,10 @@@ xlib_softpipe_display_surface(struct xm
     {
        if (xm_buf->tempImage == NULL) 
        {
-          assert(surf->texture->block.width == 1);
-          assert(surf->texture->block.height == 1);
+          assert(pf_get_blockwidth(surf->texture->format) == 1);
+          assert(pf_get_blockheight(surf->texture->format) == 1);
           alloc_shm_ximage(xm_buf, b, spt->stride[surf->level] /
-                           surf->texture->block.size, surf->height);
+                           pf_get_blocksize(surf->texture->format), surf->height);
        }
  
        ximage = xm_buf->tempImage;
@@@ -361,13 -360,10 +361,10 @@@ xm_surface_buffer_create(struct pipe_wi
                           unsigned *stride)
  {
     const unsigned alignment = 64;
-    struct pipe_format_block block;
-    unsigned nblocksx, nblocksy, size;
+    unsigned nblocksy, size;
  
-    util_format_get_block(format, &block);
-    nblocksx = pf_get_nblocksx(&block, width);
-    nblocksy = pf_get_nblocksy(&block, height);
-    *stride = align(nblocksx * block.size, alignment);
+    nblocksy = pf_get_nblocksy(format, height);
+    *stride = align(pf_get_stride(format, width), alignment);
     size = *stride * nblocksy;
  
  #ifdef USE_XSHM
@@@ -63,7 -63,6 +63,7 @@@
  #include "tgsi/tgsi_ureg.h"
  #include "util/u_tile.h"
  #include "util/u_draw_quad.h"
 +#include "util/u_format.h"
  #include "util/u_math.h"
  #include "util/u_rect.h"
  #include "shader/prog_instruction.h"
@@@ -648,7 -647,7 +648,7 @@@ draw_stencil_pixels(GLcontext *ctx, GLi
     }
  
     if(format != GL_DEPTH_STENCIL && 
 -      pf_get_component_bits( strb->format, PIPE_FORMAT_COMP_Z ) != 0)
 +      util_format_get_component_bits(strb->format, UTIL_FORMAT_COLORSPACE_ZS, 0) != 0)
        usage = PIPE_TRANSFER_READ_WRITE;
     else
        usage = PIPE_TRANSFER_WRITE;
              }
  
              /* now pack the stencil (and Z) values in the dest format */
-             switch (pt->format) {
+             switch (pt->texture->format) {
              case PIPE_FORMAT_S8_UNORM:
                 {
                    ubyte *dest = stmap + spanY * pt->stride + spanX;
@@@ -843,7 -842,7 +843,7 @@@ copy_stencil_pixels(GLcontext *ctx, GLi
                            GL_STENCIL_INDEX, GL_UNSIGNED_BYTE,
                            &ctx->DefaultPacking, buffer);
  
 -   if(pf_get_component_bits( rbDraw->format, PIPE_FORMAT_COMP_Z ) != 0)
 +   if(util_format_get_component_bits(rbDraw->format, UTIL_FORMAT_COLORSPACE_ZS, 0) != 0)
        usage = PIPE_TRANSFER_READ_WRITE;
     else
        usage = PIPE_TRANSFER_WRITE;
                                           usage, dstx, dsty,
                                           width, height);
  
-    assert(ptDraw->block.width == 1);
-    assert(ptDraw->block.height == 1);
+    assert(pf_get_blockwidth(ptDraw->texture->format) == 1);
+    assert(pf_get_blockheight(ptDraw->texture->format) == 1);
  
     /* map the stencil buffer */
     drawMap = screen->transfer_map(screen, ptDraw);
        dst = drawMap + y * ptDraw->stride;
        src = buffer + i * width;
  
-       switch (ptDraw->format) {
+       switch (ptDraw->texture->format) {
        case PIPE_FORMAT_S8Z24_UNORM:
           {
              uint *dst4 = (uint *) dst;
@@@ -1084,7 -1083,7 +1084,7 @@@ st_CopyPixels(GLcontext *ctx, GLint src
        if (ST_DEBUG & DEBUG_FALLBACK)
           debug_printf("%s: fallback processing\n", __FUNCTION__);
  
 -      if (type == GL_DEPTH && pf_is_depth_and_stencil(pt->format))
 +      if (type == GL_DEPTH && util_format_is_depth_and_stencil(pt->format))
           transfer_usage = PIPE_TRANSFER_READ_WRITE;
        else
           transfer_usage = PIPE_TRANSFER_WRITE;
@@@ -49,7 -49,6 +49,7 @@@
  #include "st_public.h"
  #include "st_texture.h"
  
 +#include "util/u_format.h"
  #include "util/u_rect.h"
  
  
@@@ -99,16 -98,14 +99,14 @@@ st_renderbuffer_alloc_storage(GLcontex
     strb->defined = GL_FALSE;  /* undefined contents now */
  
     if(strb->software) {
-       struct pipe_format_block block;
        size_t size;
        
        _mesa_free(strb->data);
  
        assert(strb->format != PIPE_FORMAT_NONE);
-       util_format_get_block(strb->format, &block);
        
-       strb->stride = pf_get_stride(&block, width);
-       size = pf_get_2d_size(&block, strb->stride, height);
+       strb->stride = pf_get_stride(strb->format, width);
+       size = pf_get_2d_size(strb->format, strb->stride, height);
        
        strb->data = _mesa_malloc(size);
        
        memset(&template, 0, sizeof(template));
        template.target = PIPE_TEXTURE_2D;
        template.format = format;
-       util_format_get_block(format, &template.block);
        template.width0 = width;
        template.height0 = height;
        template.depth0 = 1;
        template.last_level = 0;
        template.nr_samples = rb->NumSamples;
 -      if (pf_is_depth_stencil(format)) {
 +      if (util_format_is_depth_or_stencil(format)) {
           template.tex_usage = PIPE_TEXTURE_USAGE_DEPTH_STENCIL;
        }
        else {
@@@ -62,7 -62,6 +62,7 @@@
  #include "pipe/p_shader_tokens.h"
  #include "util/u_tile.h"
  #include "util/u_blit.h"
 +#include "util/u_format.h"
  #include "util/u_surface.h"
  #include "util/u_math.h"
  
@@@ -205,7 -204,7 +205,7 @@@ static GLuin
  default_usage(enum pipe_format fmt)
  {
     GLuint usage = PIPE_TEXTURE_USAGE_SAMPLER;
 -   if (pf_is_depth_stencil(fmt))
 +   if (util_format_is_depth_or_stencil(fmt))
        usage |= PIPE_TEXTURE_USAGE_DEPTH_STENCIL;
     else
        usage |= PIPE_TEXTURE_USAGE_RENDER_TARGET;
@@@ -406,7 -405,6 +406,6 @@@ compress_with_blit(GLcontext * ctx
     memset(&templ, 0, sizeof(templ));
     templ.target = PIPE_TEXTURE_2D;
     templ.format = st_mesa_format_to_pipe_format(mesa_format);
-    util_format_get_block(templ.format, &templ.block);
     templ.width0 = width;
     templ.height0 = height;
     templ.depth0 = 1;
@@@ -635,7 -633,7 +634,7 @@@ st_TexImage(GLcontext * ctx
  
     if (stImage->pt) {
        if (format == GL_DEPTH_COMPONENT &&
 -          pf_is_depth_and_stencil(stImage->pt->format))
 +          util_format_is_depth_and_stencil(stImage->pt->format))
           transfer_usage = PIPE_TRANSFER_READ_WRITE;
        else
           transfer_usage = PIPE_TRANSFER_WRITE;
@@@ -834,7 -832,7 +833,7 @@@ decompress_with_blit(GLcontext * ctx, G
     /* copy/pack data into user buffer */
     if (st_equal_formats(stImage->pt->format, format, type)) {
        /* memcpy */
 -      const uint bytesPerRow = width * pf_get_blocksize(stImage->pt->format);
 +      const uint bytesPerRow = width * util_format_get_size(stImage->pt->format);
        ubyte *map = screen->transfer_map(screen, tex_xfer);
        GLuint row;
        for (row = 0; row < height; row++) {
@@@ -891,7 -889,7 +890,7 @@@ st_get_tex_image(GLcontext * ctx, GLenu
     GLubyte *dest;
  
     if (stImage->pt &&
 -       pf_is_compressed(stImage->pt->format) &&
 +       util_format_is_compressed(stImage->pt->format) &&
         !compressed_dst) {
        /* Need to decompress the texture.
         * We'll do this by rendering a textured quad.
                                              PIPE_TRANSFER_READ, 0, 0,
                                              stImage->base.Width,
                                              stImage->base.Height);
-       texImage->RowStride = stImage->transfer->stride / stImage->pt->block.size;
+       texImage->RowStride = stImage->transfer->stride / pf_get_blocksize(stImage->pt->format);
     }
     else {
        /* Otherwise, the image should actually be stored in
@@@ -1042,7 -1040,7 +1041,7 @@@ st_TexSubimage(GLcontext *ctx, GLint di
        unsigned face = _mesa_tex_target_to_face(target);
  
        if (format == GL_DEPTH_COMPONENT &&
 -          pf_is_depth_and_stencil(stImage->pt->format))
 +          util_format_is_depth_and_stencil(stImage->pt->format))
           transfer_usage = PIPE_TRANSFER_READ_WRITE;
        else
           transfer_usage = PIPE_TRANSFER_WRITE;
@@@ -1164,10 -1162,10 +1163,10 @@@ st_CompressedTexSubImage2D(GLcontext *c
                             struct gl_texture_image *texImage)
  {
     struct st_texture_image *stImage = st_texture_image(texImage);
-    struct pipe_format_block block;
     int srcBlockStride;
     int dstBlockStride;
     int y;
+    enum pipe_format pformat= stImage->pt->format;
  
     if (stImage->pt) {
        unsigned face = _mesa_tex_target_to_face(target);
                                              xoffset, yoffset,
                                              width, height);
        
-       block = stImage->pt->block;
-       srcBlockStride = pf_get_stride(&block, width);
+       srcBlockStride = pf_get_stride(pformat, width);
        dstBlockStride = stImage->transfer->stride;
     } else {
        assert(stImage->pt);
        return;
     }
  
-    assert(xoffset % block.width == 0);
-    assert(yoffset % block.height == 0);
-    assert(width % block.width == 0);
-    assert(height % block.height == 0);
+    assert(xoffset % pf_get_blockwidth(pformat) == 0);
+    assert(yoffset % pf_get_blockheight(pformat) == 0);
+    assert(width % pf_get_blockwidth(pformat) == 0);
+    assert(height % pf_get_blockheight(pformat) == 0);
  
-    for (y = 0; y < height; y += block.height) {
+    for (y = 0; y < height; y += pf_get_blockheight(pformat)) {
        /* don't need to adjust for xoffset and yoffset as st_texture_image_map does that */
-       const char *src = (const char*)data + srcBlockStride * pf_get_nblocksy(&block, y);
-       char *dst = (char*)texImage->Data + dstBlockStride * pf_get_nblocksy(&block, y);
-       memcpy(dst, src, pf_get_stride(&block, width));
+       const char *src = (const char*)data + srcBlockStride * pf_get_nblocksy(pformat, y);
+       char *dst = (char*)texImage->Data + dstBlockStride * pf_get_nblocksy(pformat, y);
+       memcpy(dst, src, pf_get_stride(pformat, width));
     }
  
     if (stImage->pt) {
@@@ -1267,7 -1264,7 +1265,7 @@@ fallback_copy_texsubimage(GLcontext *ct
  
     if ((baseFormat == GL_DEPTH_COMPONENT ||
          baseFormat == GL_DEPTH_STENCIL) &&
 -       pf_is_depth_and_stencil(stImage->pt->format))
 +       util_format_is_depth_and_stencil(stImage->pt->format))
        transfer_usage = PIPE_TRANSFER_READ_WRITE;
     else
        transfer_usage = PIPE_TRANSFER_WRITE;
@@@ -1693,10 -1690,10 +1691,10 @@@ copy_image_data_to_texture(struct st_co
                              dstLevel,
                              stImage->base.Data,
                              stImage->base.RowStride * 
-                             stObj->pt->block.size,
+                             pf_get_blocksize(stObj->pt->format),
                              stImage->base.RowStride *
                              stImage->base.Height *
-                             stObj->pt->block.size);
+                             pf_get_blocksize(stObj->pt->format));
        _mesa_align_free(stImage->base.Data);
        stImage->base.Data = NULL;
     }
@@@ -1764,8 -1761,7 +1762,7 @@@ st_finalize_texture(GLcontext *ctx
            stObj->pt->last_level < stObj->lastLevel ||
            stObj->pt->width0 != firstImage->base.Width2 ||
            stObj->pt->height0 != firstImage->base.Height2 ||
-           stObj->pt->depth0 != firstImage->base.Depth2 ||
-           stObj->pt->block.size != blockSize)
+           stObj->pt->depth0 != firstImage->base.Depth2)
        {
           pipe_texture_reference(&stObj->pt, NULL);
           ctx->st->dirty.st |= ST_NEW_FRAMEBUFFER;
  #include "pipe/p_context.h"
  #include "pipe/p_defines.h"
  #include "pipe/p_screen.h"
 +#include "util/u_format.h"
  #include "st_context.h"
  #include "st_format.h"
  
 -static GLuint
 -format_bits(
 -   pipe_format_rgbazs_t  info,
 -   GLuint comp )
 -{
 -   return pf_get_component_bits( (enum pipe_format) info, comp );
 -}
  
  static GLuint
 -format_max_bits(
 -   pipe_format_rgbazs_t  info )
 +format_max_bits(enum pipe_format format)
  {
 -   GLuint   size = format_bits( info, PIPE_FORMAT_COMP_R );
 +   GLuint size = util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 0);
  
 -   size = MAX2( size, format_bits( info, PIPE_FORMAT_COMP_G ) );
 -   size = MAX2( size, format_bits( info, PIPE_FORMAT_COMP_B ) );
 -   size = MAX2( size, format_bits( info, PIPE_FORMAT_COMP_A ) );
 -   size = MAX2( size, format_bits( info, PIPE_FORMAT_COMP_Z ) );
 -   size = MAX2( size, format_bits( info, PIPE_FORMAT_COMP_S ) );
 +   size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 1));
 +   size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 2));
 +   size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 3));
 +   size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 0));
 +   size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 1));
     return size;
  }
  
  static GLuint
 -format_size(
 -   pipe_format_rgbazs_t  info )
 +format_size(enum pipe_format format)
  {
     return
 -      format_bits( info, PIPE_FORMAT_COMP_R ) +
 -      format_bits( info, PIPE_FORMAT_COMP_G ) +
 -      format_bits( info, PIPE_FORMAT_COMP_B ) +
 -      format_bits( info, PIPE_FORMAT_COMP_A ) +
 -      format_bits( info, PIPE_FORMAT_COMP_Z ) +
 -      format_bits( info, PIPE_FORMAT_COMP_S );
 +      util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 0) +
 +      util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 1) +
 +      util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 2) +
 +      util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 3) +
 +      util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 0) +
 +      util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 1);
  }
  
  /*
  GLboolean
  st_get_format_info(enum pipe_format format, struct pipe_format_info *pinfo)
  {
 -   if (pf_layout(format) == PIPE_FORMAT_LAYOUT_RGBAZS) {
 -      pipe_format_rgbazs_t info;
 +   const struct util_format_description *desc;
  
 -      info = format;
 +   desc = util_format_description(format);
 +   assert(desc);
  
 +   if (desc->layout == UTIL_FORMAT_LAYOUT_ARITH ||
 +       desc->layout == UTIL_FORMAT_LAYOUT_ARRAY) {
  #if 0
        printf("%s\n", pf_name( format ) );
  #endif
           pinfo->datatype = GL_UNSIGNED_INT_24_8;
        }
        else {
 -         const GLuint size = format_max_bits( info );
 +         const GLuint size = format_max_bits(format);
           if (size == 8) {
 -            if (pf_type(info) == PIPE_FORMAT_TYPE_UNORM)
 +            if (desc->channel[0].type == UTIL_FORMAT_TYPE_UNSIGNED)
                 pinfo->datatype = GL_UNSIGNED_BYTE;
              else
                 pinfo->datatype = GL_BYTE;
           }
           else if (size == 16) {
 -            if (pf_type(info) == PIPE_FORMAT_TYPE_UNORM)
 +            if (desc->channel[0].type == UTIL_FORMAT_TYPE_UNSIGNED)
                 pinfo->datatype = GL_UNSIGNED_SHORT;
              else
                 pinfo->datatype = GL_SHORT;
           }
           else {
              assert( size <= 32 );
 -            if (pf_type(info) == PIPE_FORMAT_TYPE_UNORM)
 +            if (desc->channel[0].type == UTIL_FORMAT_TYPE_UNSIGNED)
                 pinfo->datatype = GL_UNSIGNED_INT;
              else
                 pinfo->datatype = GL_INT;
        }
  
        /* Component bits */
 -      pinfo->red_bits = format_bits( info, PIPE_FORMAT_COMP_R );
 -      pinfo->green_bits = format_bits( info, PIPE_FORMAT_COMP_G );
 -      pinfo->blue_bits = format_bits( info, PIPE_FORMAT_COMP_B );
 -      pinfo->alpha_bits = format_bits( info, PIPE_FORMAT_COMP_A );
 -      pinfo->depth_bits = format_bits( info, PIPE_FORMAT_COMP_Z );
 -      pinfo->stencil_bits = format_bits( info, PIPE_FORMAT_COMP_S );
 +      pinfo->red_bits = util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 0);
 +      pinfo->green_bits = util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 1);
 +      pinfo->blue_bits = util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 2);
 +      pinfo->alpha_bits = util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 3);
 +      pinfo->depth_bits = util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 0);
 +      pinfo->stencil_bits = util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 1);
        pinfo->luminance_bits = 0;
        pinfo->intensity_bits = 0;
  
        /* Format size */
 -      pinfo->size = format_size( info ) / 8;
 +      pinfo->size = format_size(format) / 8;
  
        /* Luminance & Intensity bits */
 -      if( pf_swizzle_x(info) == PIPE_FORMAT_COMP_R &&
 -          pf_swizzle_y(info) == PIPE_FORMAT_COMP_R &&
 -          pf_swizzle_z(info) == PIPE_FORMAT_COMP_R ) {
 -         if( pf_swizzle_w(info) == PIPE_FORMAT_COMP_R ) {
 +      if (desc->swizzle[0] == UTIL_FORMAT_SWIZZLE_X &&
 +          desc->swizzle[1] == UTIL_FORMAT_SWIZZLE_X &&
 +          desc->swizzle[2] == UTIL_FORMAT_SWIZZLE_X) {
 +         if (desc->swizzle[3] == UTIL_FORMAT_SWIZZLE_X) {
              pinfo->intensity_bits = pinfo->red_bits;
           }
           else {
  
        pinfo->mesa_format = st_pipe_format_to_mesa_format(format);
     }
 -   else if (pf_layout(format) == PIPE_FORMAT_LAYOUT_YCBCR) {
 +   else if (desc->layout == UTIL_FORMAT_LAYOUT_YUV) {
        pinfo->mesa_format = MESA_FORMAT_YCBCR;
        pinfo->datatype = GL_UNSIGNED_SHORT;
        pinfo->size = 2; /* two bytes per "texel" */
@@@ -383,6 -389,33 +383,33 @@@ default_rgba_format(struct pipe_screen 
  }
  
  /**
+  * Find an RGB format supported by the context/winsys.
+  */
+ static enum pipe_format
+ default_rgb_format(struct pipe_screen *screen, 
+                    enum pipe_texture_target target,
+                    unsigned tex_usage, 
+                    unsigned geom_flags)
+ {
+    static const enum pipe_format colorFormats[] = {
+       PIPE_FORMAT_X8R8G8B8_UNORM,
+       PIPE_FORMAT_B8G8R8X8_UNORM,
+       PIPE_FORMAT_R8G8B8X8_UNORM,
+       PIPE_FORMAT_A8R8G8B8_UNORM,
+       PIPE_FORMAT_B8G8R8A8_UNORM,
+       PIPE_FORMAT_R8G8B8A8_UNORM,
+       PIPE_FORMAT_R5G6B5_UNORM
+    };
+    uint i;
+    for (i = 0; i < Elements(colorFormats); i++) {
+       if (screen->is_format_supported( screen, colorFormats[i], target, tex_usage, geom_flags )) {
+          return colorFormats[i];
+       }
+    }
+    return PIPE_FORMAT_NONE;
+ }
+ /**
   * Find an sRGBA format supported by the context/winsys.
   */
  static enum pipe_format
@@@ -466,13 -499,14 +493,14 @@@ st_choose_format(struct pipe_screen *sc
     case 4:
     case GL_RGBA:
     case GL_COMPRESSED_RGBA:
-    case 3:
-    case GL_RGB:
-    case GL_COMPRESSED_RGB:
     case GL_RGBA8:
     case GL_RGB10_A2:
     case GL_RGBA12:
        return default_rgba_format( screen, target, tex_usage, geom_flags );
+    case 3:
+    case GL_RGB:
+    case GL_COMPRESSED_RGB:
+       return default_rgb_format( screen, target, tex_usage, geom_flags );
     case GL_RGBA16:
        if (tex_usage & PIPE_TEXTURE_USAGE_RENDER_TARGET)
           return default_deep_rgba_format( screen, target, tex_usage, geom_flags );
     case GL_RGB10:
     case GL_RGB12:
     case GL_RGB16:
-       return default_rgba_format( screen, target, tex_usage, geom_flags );
+       return default_rgb_format( screen, target, tex_usage, geom_flags );
  
     case GL_RGB5:
     case GL_RGB4:
@@@ -43,7 -43,6 +43,7 @@@
  #include "pipe/p_context.h"
  #include "pipe/p_defines.h"
  #include "pipe/p_inlines.h"
 +#include "util/u_format.h"
  #include "util/u_rect.h"
  #include "util/u_math.h"
  
@@@ -105,7 -104,6 +105,6 @@@ st_texture_create(struct st_context *st
     pt.width0 = width0;
     pt.height0 = height0;
     pt.depth0 = depth0;
-    util_format_get_block(format, &pt.block);
     pt.tex_usage = usage;
  
     newtex = screen->texture_create(screen, &pt);
@@@ -243,8 -241,9 +242,9 @@@ st_surface_data(struct pipe_context *pi
     struct pipe_screen *screen = pipe->screen;
     void *map = screen->transfer_map(screen, dst);
  
+    assert(dst->texture);
     util_copy_rect(map,
-                   &dst->block,
+                   dst->texture->format,
                    dst->stride,
                    dstx, dsty, 
                    width, height, 
@@@ -406,7 -405,7 +406,7 @@@ st_bind_texture_surface(struct pipe_sur
     }
  
     /* map pipe format to base format for now */
 -   if (pf_get_component_bits(format, PIPE_FORMAT_COMP_A) > 0)
 +   if (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 3) > 0)
        internalFormat = GL_RGBA;
     else
        internalFormat = GL_RGB;