Merge branch '7.8'
authorMichel Dänzer <daenzer@vmware.com>
Fri, 12 Mar 2010 18:00:47 +0000 (19:00 +0100)
committerMichel Dänzer <daenzer@vmware.com>
Fri, 12 Mar 2010 18:00:47 +0000 (19:00 +0100)
1  2 
configure.ac
src/mesa/drivers/dri/r200/r200_reg.h
src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c
src/mesa/drivers/dri/radeon/radeon_state.c

diff --combined configure.ac
index 049c9e5e8ec43e077c0dca5ddd7f35e67c0bd3d4,61487c3905ef61e3c014ade038c8ba0477ce28b6..ed47f428c9e1a02da970651b0e5d677e702d6ee8
@@@ -22,6 -22,8 +22,8 @@@ LIBDRM_REQUIRED=2.4.1
  LIBDRM_RADEON_REQUIRED=2.4.17
  DRI2PROTO_REQUIRED=2.1
  GLPROTO_REQUIRED=1.4.11
+ LIBDRM_XORG_REQUIRED=2.4.17
+ LIBKMS_XORG_REQUIRED=1.0.0
  
  dnl Check for progs
  AC_PROG_CPP
@@@ -457,8 -459,8 +459,8 @@@ CORE_DIRS="glsl mesa
  
  SRC_DIRS="glew"
  GLU_DIRS="sgi"
 -WINDOW_SYSTEM=""
  GALLIUM_DIRS="auxiliary drivers state_trackers"
 +GALLIUM_TARGET_DIRS=""
  GALLIUM_WINSYS_DIRS=""
  GALLIUM_WINSYS_DRM_DIRS=""
  GALLIUM_DRIVERS_DIRS="softpipe failover trace identity"
@@@ -468,12 -470,12 +470,12 @@@ case "$mesa_driver" i
  xlib)
      DRIVER_DIRS="x11"
      GALLIUM_WINSYS_DIRS="$GALLIUM_WINSYS_DIRS xlib"
 +    GALLIUM_TARGET_DIRS="$GALLIUM_TARGET_DIRS libgl-xlib"
      ;;
  dri)
      SRC_DIRS="$SRC_DIRS glx"
      DRIVER_DIRS="dri"
 -    WINDOW_SYSTEM="dri"
 -    GALLIUM_WINSYS_DIRS="$GALLIUM_WINSYS_DIRS drm"
 +    GALLIUM_WINSYS_DIRS="$GALLIUM_WINSYS_DIRS xlib drm"
      ;;
  osmesa)
      DRIVER_DIRS="osmesa"
@@@ -482,8 -484,8 +484,8 @@@ esa
  AC_SUBST([SRC_DIRS])
  AC_SUBST([GLU_DIRS])
  AC_SUBST([DRIVER_DIRS])
 -AC_SUBST([WINDOW_SYSTEM])
  AC_SUBST([GALLIUM_DIRS])
 +AC_SUBST([GALLIUM_TARGET_DIRS])
  AC_SUBST([GALLIUM_WINSYS_DIRS])
  AC_SUBST([GALLIUM_WINSYS_DRM_DIRS])
  AC_SUBST([GALLIUM_DRIVERS_DIRS])
@@@ -1203,7 -1205,7 +1205,7 @@@ yes
              GALLIUM_STATE_TRACKERS_DIRS="$GALLIUM_STATE_TRACKERS_DIRS egl"
          fi
          # Have only tested st/xorg on 1.6.0 servers
-         PKG_CHECK_MODULES(XORG, [xorg-server >= 1.6.0],
+         PKG_CHECK_MODULES(XORG, [xorg-server >= 1.6.0 libdrm >= $LIBDRM_XORG_REQUIRED libkms >= $LIBKMS_XORG_REQUIRED],
              HAVE_XORG="yes"; GALLIUM_STATE_TRACKERS_DIRS="$GALLIUM_STATE_TRACKERS_DIRS xorg",
              HAVE_XORG="no")
          ;;
              fi
              ;;
          xorg)
-           PKG_CHECK_MODULES(XEXT, [xextproto >= 7.0.99.1],
-                   HAVE_XEXTPROTO_71="yes"; DEFINES="$DEFINES -DHAVE_XEXTPROTO_71",
-                   HAVE_XEXTPROTO_71="no")
+             PKG_CHECK_MODULES([LIBDRM_XORG], [libdrm >= $LIBDRM_XORG_REQUIRED])
+             PKG_CHECK_MODULES([LIBKMS_XORG], [libkms >= $LIBKMS_XORG_REQUIRED])
+             HAVE_XORG="yes"
              ;;
          es)
              # mesa/es is required to build es state tracker
      ;;
  esac
  
+ if test "x$HAVE_XORG" = xyes; then
+     PKG_CHECK_MODULES(XEXT, [xextproto >= 7.0.99.1],
+         HAVE_XEXTPROTO_71="yes"; DEFINES="$DEFINES -DHAVE_XEXTPROTO_71",
+         HAVE_XEXTPROTO_71="no")
+ fi
  AC_ARG_WITH([egl-displays],
      [AS_HELP_STRING([--with-egl-displays@<:@=DIRS...@:>@],
          [comma delimited native displays libEGL supports, e.g.
@@@ -1418,7 -1426,6 +1426,7 @@@ echo "
  if echo "$SRC_DIRS" | grep 'gallium' >/dev/null 2>&1; then
      echo "        Gallium:         yes"
      echo "        Gallium dirs:    $GALLIUM_DIRS"
 +    echo "        Target dirs:     $GALLIUM_TARGET_DIRS"
      echo "        Winsys dirs:     $GALLIUM_WINSYS_DIRS"
      echo "        Winsys drm dirs:$GALLIUM_WINSYS_DRM_DIRS"
      echo "        Driver dirs:     $GALLIUM_DRIVERS_DIRS"
index 2e52c7c13ff254a49565debddcd8b1930d35e92e,b3a4940a7ad51a71d98fa08139ff55bae435f724..e331be223b8fa99bc2a8dfb5580be4b50b9d839e
@@@ -690,7 -690,7 +690,7 @@@ WITH THE SOFTWARE OR THE USE OR OTHER D
  #       define R200_PVS_CNTL_1_PROGRAM_START_SHIFT   0
  #       define R200_PVS_CNTL_1_POS_END_SHIFT         10
  #       define R200_PVS_CNTL_1_PROGRAM_END_SHIFT     20
- /* Addresses are relative the the vertex program parameters area. */
+ /* Addresses are relative to the vertex program parameters area. */
  #define R200_VAP_PVS_CNTL_2                 0x22d4
  #       define R200_PVS_CNTL_2_PARAM_OFFSET_SHIFT 0
  #       define R200_PVS_CNTL_2_PARAM_COUNT_SHIFT  16
  #define     R200_TXC_OUTPUT_MASK_G                 (5 << 20)
  #define     R200_TXC_OUTPUT_MASK_B                 (6 << 20)
  #define     R200_TXC_OUTPUT_MASK_NONE              (7 << 20)
 +#define     R200_TXC_OUTPUT_ROTATE_RGB             (0 << 24)
 +#define     R200_TXC_OUTPUT_ROTATE_ARG             (1 << 24)
 +#define     R200_TXC_OUTPUT_ROTATE_GBA             (2 << 24)
 +#define     R200_TXC_OUTPUT_ROTATE_RGA             (3 << 24)
  #define     R200_TXC_REPL_NORMAL                   0
  #define     R200_TXC_REPL_RED                      1
  #define     R200_TXC_REPL_GREEN                    2
index 78c5f5dd572e2a7e6e8b2fb59923c8bb817834b0,e0e271b7711901e0bb3051fe16b5437316a4e647..7f5fb99fa4fa5a1cdfbfe701cb25b3647c4ba6f7
@@@ -36,7 -36,6 +36,7 @@@
  #include "main/texobj.h"
  #include "main/enums.h"
  #include "radeon_texture.h"
 +#include "radeon_tile.h"
  
  static unsigned get_aligned_compressed_row_stride(
                gl_format format,
        return stride;
  }
  
 -static unsigned get_compressed_image_size(
 +unsigned get_texture_image_size(
                gl_format format,
                unsigned rowStride,
 -              unsigned height)
 +              unsigned height,
 +              unsigned depth,
 +              unsigned tiling)
  {
 -      unsigned blockWidth, blockHeight;
 +      if (_mesa_is_format_compressed(format)) {
 +              unsigned blockWidth, blockHeight;
  
 -      _mesa_get_format_block_size(format, &blockWidth, &blockHeight);
 +              _mesa_get_format_block_size(format, &blockWidth, &blockHeight);
 +
 +              return rowStride * ((height + blockHeight - 1) / blockHeight) * depth;
 +      } else if (tiling) {
 +              /* Need to align height to tile height */
 +              unsigned tileWidth, tileHeight;
  
 -      return rowStride * ((height + blockHeight - 1) / blockHeight);
 +              get_tile_size(format, &tileWidth, &tileHeight);
 +              tileHeight--;
 +
 +              height = (height + tileHeight) & ~tileHeight;
 +      }
 +
 +      return rowStride * height * depth;
 +}
 +
 +unsigned get_texture_image_row_stride(radeonContextPtr rmesa, gl_format format, unsigned width, unsigned tiling)
 +{
 +      if (_mesa_is_format_compressed(format)) {
 +              return get_aligned_compressed_row_stride(format, width, rmesa->texture_compressed_row_align);
 +      } else {
 +              unsigned row_align;
 +
 +              if (!_mesa_is_pow_two(width)) {
 +                      row_align = rmesa->texture_rect_row_align - 1;
 +              } else if (tiling) {
 +                      unsigned tileWidth, tileHeight;
 +                      get_tile_size(format, &tileWidth, &tileHeight);
 +                      row_align = tileWidth * _mesa_get_format_bytes(format) - 1;
 +              } else {
 +                      row_align = rmesa->texture_row_align - 1;
 +              }
 +
 +              return (_mesa_format_row_stride(format, width) + row_align) & ~row_align;
 +      }
  }
  
  /**
@@@ -128,15 -92,34 +128,15 @@@ static void compute_tex_image_offset(ra
        GLuint face, GLuint level, GLuint* curOffset)
  {
        radeon_mipmap_level *lvl = &mt->levels[level];
 -      uint32_t row_align;
        GLuint height;
  
        height = _mesa_next_pow_two_32(lvl->height);
  
 -      /* Find image size in bytes */
 -      if (_mesa_is_format_compressed(mt->mesaFormat)) {
 -              lvl->rowstride = get_aligned_compressed_row_stride(mt->mesaFormat, lvl->width, rmesa->texture_compressed_row_align);
 -              lvl->size = get_compressed_image_size(mt->mesaFormat, lvl->rowstride, height);
 -      } else if (mt->target == GL_TEXTURE_RECTANGLE_NV) {
 -              row_align = rmesa->texture_rect_row_align - 1;
 -              lvl->rowstride = (_mesa_format_row_stride(mt->mesaFormat, lvl->width) + row_align) & ~row_align;
 -              lvl->size = lvl->rowstride * height;
 -      } else if (mt->tilebits & RADEON_TXO_MICRO_TILE) {
 -              /* tile pattern is 16 bytes x2. mipmaps stay 32 byte aligned,
 -               * though the actual offset may be different (if texture is less than
 -               * 32 bytes width) to the untiled case */
 -              lvl->rowstride = (_mesa_format_row_stride(mt->mesaFormat, lvl->width) * 2 + 31) & ~31;
 -              lvl->size = lvl->rowstride * ((height + 1) / 2) * lvl->depth;
 -      } else {
 -              row_align = rmesa->texture_row_align - 1;
 -              lvl->rowstride = (_mesa_format_row_stride(mt->mesaFormat, lvl->width) + row_align) & ~row_align;
 -              lvl->size = lvl->rowstride * height * lvl->depth;
 -      }
 +      lvl->rowstride = get_texture_image_row_stride(rmesa, mt->mesaFormat, lvl->width, mt->tilebits);
 +      lvl->size = get_texture_image_size(mt->mesaFormat, lvl->rowstride, lvl->height, lvl->depth, mt->tilebits);
 +
        assert(lvl->size > 0);
  
 -      /* All images are aligned to a 32-byte offset */
 -      *curOffset = (*curOffset + 0x1f) & ~0x1f;
        lvl->faces[face].offset = *curOffset;
        *curOffset += lvl->size;
  
@@@ -468,9 -451,12 +468,9 @@@ static void migrate_image_to_miptree(ra
  
                radeon_mipmap_level *srclvl = &image->mt->levels[image->mtlevel];
  
 -              /* TODO: bring back these assertions once the FBOs are fixed */
 -#if 0
                assert(image->mtlevel == level);
                assert(srclvl->size == dstlvl->size);
                assert(srclvl->rowstride == dstlvl->rowstride);
 -#endif
  
                radeon_bo_map(image->mt->bo, GL_FALSE);
  
@@@ -553,6 -539,8 +553,8 @@@ static radeon_mipmap_tree * get_biggest
        }
  
        if (mtCount == 0) {
+               free(mtSizes);
+               free(mts);
                return NULL;
        }
  
index ebae0792aa569fb9a9a2f783dbb342f0e1afa871,583751d64dfe66e658ce8c4b4c91847040afa473..0afbc19c1273a71694f9979d39325fd26b670080
@@@ -45,7 -45,6 +45,7 @@@ WITH THE SOFTWARE OR THE USE OR OTHER D
  #include "tnl/tnl.h"
  #include "tnl/t_pipeline.h"
  #include "swrast_setup/swrast_setup.h"
 +#include "drivers/common/meta.h"
  
  #include "radeon_context.h"
  #include "radeon_mipmap_tree.h"
@@@ -1901,7 -1900,7 +1901,7 @@@ void radeonUploadTexMatrix( r100Context
     So: if we need the q coord in the end (solely determined by the texture
     target, i.e. 2d / 1d / texrect targets) we swap the third and 4th row.
     Additionally, if we don't have texgen but 4 tex coords submitted, we swap
-    column 3 and 4 (for the 2d / 1d / texrect targets) since the the q coord
+    column 3 and 4 (for the 2d / 1d / texrect targets) since the q coord
     will get submitted in the "wrong", i.e. 3rd, slot.
     If an app submits 3 coords for 2d targets, we assume it is saving on vertex
     size and using the texture matrix to swap the r and q coords around (ut2k3
@@@ -2249,11 -2248,6 +2249,11 @@@ void radeonInitStateFuncs( GLcontext *c
  
     ctx->Driver.DrawBuffer             = radeonDrawBuffer;
     ctx->Driver.ReadBuffer             = radeonReadBuffer;
 +   if (dri2) {
 +         ctx->Driver.CopyPixels               = _mesa_meta_CopyPixels;
 +         ctx->Driver.DrawPixels               = _mesa_meta_DrawPixels;
 +         ctx->Driver.ReadPixels               = radeonReadPixels;
 +   }
  
     ctx->Driver.AlphaFunc              = radeonAlphaFunc;
     ctx->Driver.BlendEquationSeparate  = radeonBlendEquationSeparate;