Merge remote branch 'origin/master' into radeon-rewrite
authorDave Airlie <airlied@redhat.com>
Thu, 9 Apr 2009 00:14:35 +0000 (10:14 +1000)
committerDave Airlie <airlied@redhat.com>
Thu, 9 Apr 2009 00:31:08 +0000 (10:31 +1000)
Conflicts:
src/mesa/drivers/dri/r200/r200_tex.c
src/mesa/drivers/dri/r300/r300_cmdbuf.c
src/mesa/drivers/dri/r300/r300_context.h
src/mesa/drivers/dri/r300/r300_swtcl.c
src/mesa/drivers/dri/r300/r300_tex.c
src/mesa/drivers/dri/r300/r300_texmem.c
src/mesa/drivers/dri/r300/r300_texstate.c
src/mesa/drivers/dri/radeon/radeon_tex.c

1  2 
configure.ac
src/mesa/drivers/dri/r200/r200_state.c
src/mesa/drivers/dri/r200/r200_tex.c
src/mesa/drivers/dri/r300/r300_context.c
src/mesa/drivers/dri/r300/r300_context.h
src/mesa/drivers/dri/r300/r300_swtcl.c
src/mesa/drivers/dri/r300/r300_tex.c
src/mesa/drivers/dri/radeon/radeon_bocs_wrapper.h
src/mesa/drivers/dri/radeon/radeon_screen.c
src/mesa/drivers/dri/radeon/radeon_state.c
src/mesa/drivers/dri/radeon/radeon_tex.c

diff --cc configure.ac
Simple merge
@@@ -270,15 -267,701 +270,16 @@@ static void r200SetTexFilter( radeonTex
     }
  }
  
- static void r200SetTexBorderColor( radeonTexObjPtr t, GLubyte c[4] )
 -static void r200SetTexBorderColor( r200TexObjPtr t, const GLfloat color[4] )
++static void r200SetTexBorderColor( radeonTexObjPtr t, const GLfloat color[4] )
  {
 -   t->pp_border_color = r200PackColor( 4, c[0], c[1], c[2], c[3] );
 -}
 -
 -
 -/**
 - * Allocate space for and load the mesa images into the texture memory block.
 - * This will happen before drawing with a new texture, or drawing with a
 - * texture after it was swapped out or teximaged again.
 - */
 -
 -static r200TexObjPtr r200AllocTexObj( struct gl_texture_object *texObj )
 -{
 -   r200TexObjPtr t;
 -
 -   t = CALLOC_STRUCT( r200_tex_obj );
 -   texObj->DriverData = t;
 -   if ( t != NULL ) {
 -      if ( R200_DEBUG & DEBUG_TEXTURE ) {
 -       fprintf( stderr, "%s( %p, %p )\n", __FUNCTION__, (void *)texObj, 
 -                (void *)t );
 -      }
 -
 -      /* Initialize non-image-dependent parts of the state:
 -       */
 -      t->base.tObj = texObj;
 -      t->border_fallback = GL_FALSE;
 -
 -      make_empty_list( & t->base );
 -
 -      r200SetTexWrap( t, texObj->WrapS, texObj->WrapT, texObj->WrapR );
 -      r200SetTexMaxAnisotropy( t, texObj->MaxAnisotropy );
 -      r200SetTexFilter( t, texObj->MinFilter, texObj->MagFilter );
 -      r200SetTexBorderColor( t, texObj->BorderColor );
 -   }
 -
 -   return t;
 -}
 -
 -/* try to find a format which will only need a memcopy */
 -static const struct gl_texture_format *
 -r200Choose8888TexFormat( GLenum srcFormat, GLenum srcType )
 -{
 -   const GLuint ui = 1;
 -   const GLubyte littleEndian = *((const GLubyte *) &ui);
 -
 -   if ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8) ||
 -       (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && !littleEndian) ||
 -       (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) ||
 -       (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_BYTE && littleEndian)) {
 -      return &_mesa_texformat_rgba8888;
 -   }
 -   else if ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) ||
 -       (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && littleEndian) ||
 -       (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_INT_8_8_8_8) ||
 -       (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_BYTE && !littleEndian)) {
 -      return &_mesa_texformat_rgba8888_rev;
 -   }
 -   else return _dri_texformat_argb8888;
 -}
 -
 -static const struct gl_texture_format *
 -r200ChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
 -                           GLenum format, GLenum type )
 -{
 -   r200ContextPtr rmesa = R200_CONTEXT(ctx);
 -   const GLboolean do32bpt =
 -       ( rmesa->texture_depth == DRI_CONF_TEXTURE_DEPTH_32 );
 -   const GLboolean force16bpt =
 -       ( rmesa->texture_depth == DRI_CONF_TEXTURE_DEPTH_FORCE_16 );
 -   (void) format;
 -
 -   switch ( internalFormat ) {
 -   case 4:
 -   case GL_RGBA:
 -   case GL_COMPRESSED_RGBA:
 -      switch ( type ) {
 -      case GL_UNSIGNED_INT_10_10_10_2:
 -      case GL_UNSIGNED_INT_2_10_10_10_REV:
 -       return do32bpt ? _dri_texformat_argb8888 : _dri_texformat_argb1555;
 -      case GL_UNSIGNED_SHORT_4_4_4_4:
 -      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
 -       return _dri_texformat_argb4444;
 -      case GL_UNSIGNED_SHORT_5_5_5_1:
 -      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
 -       return _dri_texformat_argb1555;
 -      default:
 -         return do32bpt ?
 -          r200Choose8888TexFormat(format, type) : _dri_texformat_argb4444;
 -      }
 -
 -   case 3:
 -   case GL_RGB:
 -   case GL_COMPRESSED_RGB:
 -      switch ( type ) {
 -      case GL_UNSIGNED_SHORT_4_4_4_4:
 -      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
 -       return _dri_texformat_argb4444;
 -      case GL_UNSIGNED_SHORT_5_5_5_1:
 -      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
 -       return _dri_texformat_argb1555;
 -      case GL_UNSIGNED_SHORT_5_6_5:
 -      case GL_UNSIGNED_SHORT_5_6_5_REV:
 -       return _dri_texformat_rgb565;
 -      default:
 -         return do32bpt ? _dri_texformat_argb8888 : _dri_texformat_rgb565;
 -      }
 -
 -   case GL_RGBA8:
 -   case GL_RGB10_A2:
 -   case GL_RGBA12:
 -   case GL_RGBA16:
 -      return !force16bpt ?
 -        r200Choose8888TexFormat(format, type) : _dri_texformat_argb4444;
 -
 -   case GL_RGBA4:
 -   case GL_RGBA2:
 -      return _dri_texformat_argb4444;
 -
 -   case GL_RGB5_A1:
 -      return _dri_texformat_argb1555;
 -
 -   case GL_RGB8:
 -   case GL_RGB10:
 -   case GL_RGB12:
 -   case GL_RGB16:
 -      return !force16bpt ? _dri_texformat_argb8888 : _dri_texformat_rgb565;
 -
 -   case GL_RGB5:
 -   case GL_RGB4:
 -   case GL_R3_G3_B2:
 -      return _dri_texformat_rgb565;
 -
 -   case GL_ALPHA:
 -   case GL_ALPHA4:
 -   case GL_ALPHA8:
 -   case GL_ALPHA12:
 -   case GL_ALPHA16:
 -   case GL_COMPRESSED_ALPHA:
 -   /* can't use a8 format since interpreting hw I8 as a8 would result
 -      in wrong rgb values (same as alpha value instead of 0). */
 -      return _dri_texformat_al88;
 -
 -   case 1:
 -   case GL_LUMINANCE:
 -   case GL_LUMINANCE4:
 -   case GL_LUMINANCE8:
 -   case GL_LUMINANCE12:
 -   case GL_LUMINANCE16:
 -   case GL_COMPRESSED_LUMINANCE:
 -      return _dri_texformat_l8;
 -
 -   case 2:
 -   case GL_LUMINANCE_ALPHA:
 -   case GL_LUMINANCE4_ALPHA4:
 -   case GL_LUMINANCE6_ALPHA2:
 -   case GL_LUMINANCE8_ALPHA8:
 -   case GL_LUMINANCE12_ALPHA4:
 -   case GL_LUMINANCE12_ALPHA12:
 -   case GL_LUMINANCE16_ALPHA16:
 -   case GL_COMPRESSED_LUMINANCE_ALPHA:
 -      return _dri_texformat_al88;
 -
 -   case GL_INTENSITY:
 -   case GL_INTENSITY4:
 -   case GL_INTENSITY8:
 -   case GL_INTENSITY12:
 -   case GL_INTENSITY16:
 -   case GL_COMPRESSED_INTENSITY:
 -       return _dri_texformat_i8;
 -
 -   case GL_YCBCR_MESA:
 -      if (type == GL_UNSIGNED_SHORT_8_8_APPLE ||
 -          type == GL_UNSIGNED_BYTE)
 -         return &_mesa_texformat_ycbcr;
 -      else
 -         return &_mesa_texformat_ycbcr_rev;
 -
 -   case GL_RGB_S3TC:
 -   case GL_RGB4_S3TC:
 -   case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
 -      return &_mesa_texformat_rgb_dxt1;
 -
 -   case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
 -      return &_mesa_texformat_rgba_dxt1;
 -
 -   case GL_RGBA_S3TC:
 -   case GL_RGBA4_S3TC:
 -   case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
 -      return &_mesa_texformat_rgba_dxt3;
 -
 -   case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
 -      return &_mesa_texformat_rgba_dxt5;
 -
 -   default:
 -      _mesa_problem(ctx,
 -         "unexpected internalFormat 0x%x in r200ChooseTextureFormat",
 -         (int) internalFormat);
 -      return NULL;
 -   }
 -
 -   return NULL; /* never get here */
 -}
 -
 -
 -static GLboolean
 -r200ValidateClientStorage( GLcontext *ctx, GLenum target,
 -                         GLint internalFormat,
 -                         GLint srcWidth, GLint srcHeight, 
 -                           GLenum format, GLenum type,  const void *pixels,
 -                         const struct gl_pixelstore_attrib *packing,
 -                         struct gl_texture_object *texObj,
 -                         struct gl_texture_image *texImage)
 -
 -{
 -   r200ContextPtr rmesa = R200_CONTEXT(ctx);
 -
 -   if ( R200_DEBUG & DEBUG_TEXTURE )
 -      fprintf(stderr, "intformat %s format %s type %s\n",
 -            _mesa_lookup_enum_by_nr( internalFormat ),
 -            _mesa_lookup_enum_by_nr( format ),
 -            _mesa_lookup_enum_by_nr( type ));
 -
 -   if (!ctx->Unpack.ClientStorage)
 -      return 0;
 -
 -   if (ctx->_ImageTransferState ||
 -       texImage->IsCompressed ||
 -       texObj->GenerateMipmap)
 -      return 0;
 -
 -
 -   /* This list is incomplete, may be different on ppc???
 -    */
 -   switch ( internalFormat ) {
 -   case GL_RGBA:
 -      if ( format == GL_BGRA && type == GL_UNSIGNED_INT_8_8_8_8_REV ) {
 -       texImage->TexFormat = _dri_texformat_argb8888;
 -      }
 -      else
 -       return 0;
 -      break;
 -
 -   case GL_RGB:
 -      if ( format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5 ) {
 -       texImage->TexFormat = _dri_texformat_rgb565;
 -      }
 -      else
 -       return 0;
 -      break;
 -
 -   case GL_YCBCR_MESA:
 -      if ( format == GL_YCBCR_MESA && 
 -         type == GL_UNSIGNED_SHORT_8_8_REV_APPLE ) {
 -       texImage->TexFormat = &_mesa_texformat_ycbcr_rev;
 -      }
 -      else if ( format == GL_YCBCR_MESA && 
 -              (type == GL_UNSIGNED_SHORT_8_8_APPLE || 
 -               type == GL_UNSIGNED_BYTE)) {
 -       texImage->TexFormat = &_mesa_texformat_ycbcr;
 -      }
 -      else
 -       return 0;
 -      break;
 -
 -   default:
 -      return 0;
 -   }
 -
 -   /* Could deal with these packing issues, but currently don't:
 -    */
 -   if (packing->SkipPixels || 
 -       packing->SkipRows || 
 -       packing->SwapBytes ||
 -       packing->LsbFirst) {
 -      return 0;
 -   }
 -
 -   {      
 -      GLint srcRowStride = _mesa_image_row_stride(packing, srcWidth,
 -                                                format, type);
 -
 -      
 -      if ( R200_DEBUG & DEBUG_TEXTURE )
 -       fprintf(stderr, "%s: srcRowStride %d/%x\n", 
 -               __FUNCTION__, srcRowStride, srcRowStride);
 -
 -      /* Could check this later in upload, pitch restrictions could be
 -       * relaxed, but would need to store the image pitch somewhere,
 -       * as packing details might change before image is uploaded:
 -       */
 -      if (!r200IsGartMemory( rmesa, pixels, srcHeight * srcRowStride ) ||
 -        (srcRowStride & 63))
 -       return 0;
 -
 -
 -      /* Have validated that _mesa_transfer_teximage would be a straight
 -       * memcpy at this point.  NOTE: future calls to TexSubImage will
 -       * overwrite the client data.  This is explicitly mentioned in the
 -       * extension spec.
 -       */
 -      texImage->Data = (void *)pixels;
 -      texImage->IsClientData = GL_TRUE;
 -      texImage->RowStride = srcRowStride / texImage->TexFormat->TexelBytes;
 -
 -      return 1;
 -   }
 -}
 -
 -
 -static void r200TexImage1D( GLcontext *ctx, GLenum target, GLint level,
 -                              GLint internalFormat,
 -                              GLint width, GLint border,
 -                              GLenum format, GLenum type, const GLvoid *pixels,
 -                              const struct gl_pixelstore_attrib *packing,
 -                              struct gl_texture_object *texObj,
 -                              struct gl_texture_image *texImage )
 -{
 -   driTextureObject * t = (driTextureObject *) texObj->DriverData;
 -
 -   if ( t ) {
 -      driSwapOutTextureObject( t );
 -   }
 -   else {
 -      t = (driTextureObject *) r200AllocTexObj( texObj );
 -      if (!t) {
 -         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D");
 -         return;
 -      }
 -   }
 -
 -   /* Note, this will call ChooseTextureFormat */
 -   _mesa_store_teximage1d(ctx, target, level, internalFormat,
 -                          width, border, format, type, pixels,
 -                          &ctx->Unpack, texObj, texImage);
 -
 -   t->dirty_images[0] |= (1 << level);
 -}
 -
 -
 -static void r200TexSubImage1D( GLcontext *ctx, GLenum target, GLint level,
 -                                 GLint xoffset,
 -                                 GLsizei width,
 -                                 GLenum format, GLenum type,
 -                                 const GLvoid *pixels,
 -                                 const struct gl_pixelstore_attrib *packing,
 -                                 struct gl_texture_object *texObj,
 -                                 struct gl_texture_image *texImage )
 -{
 -   driTextureObject * t = (driTextureObject *) texObj->DriverData;
 -
 -   assert( t ); /* this _should_ be true */
 -   if ( t ) {
 -      driSwapOutTextureObject( t );
 -   }
 -   else {
 -      t = (driTextureObject *) r200AllocTexObj( texObj );
 -      if (!t) {
 -         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage1D");
 -         return;
 -      }
 -   }
 -
 -   _mesa_store_texsubimage1d(ctx, target, level, xoffset, width,
 -                           format, type, pixels, packing, texObj,
 -                           texImage);
 -
 -   t->dirty_images[0] |= (1 << level);
 -}
 -
 -
 -static void r200TexImage2D( GLcontext *ctx, GLenum target, GLint level,
 -                              GLint internalFormat,
 -                              GLint width, GLint height, GLint border,
 -                              GLenum format, GLenum type, const GLvoid *pixels,
 -                              const struct gl_pixelstore_attrib *packing,
 -                              struct gl_texture_object *texObj,
 -                              struct gl_texture_image *texImage )
 -{
 -   driTextureObject * t = (driTextureObject *) texObj->DriverData;
 -   GLuint face;
 -
 -   /* which cube face or ordinary 2D image */
 -   switch (target) {
 -   case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
 -   case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
 -   case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
 -   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
 -   case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
 -   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
 -      face = (GLuint) target - (GLuint) GL_TEXTURE_CUBE_MAP_POSITIVE_X;
 -      ASSERT(face < 6);
 -      break;
 -   default:
 -      face = 0;
 -   }
 -
 -   if ( t != NULL ) {
 -      driSwapOutTextureObject( t );
 -   }
 -   else {
 -      t = (driTextureObject *) r200AllocTexObj( texObj );
 -      if (!t) {
 -         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");
 -         return;
 -      }
 -   }
 -
 -   texImage->IsClientData = GL_FALSE;
 -
 -   if (r200ValidateClientStorage( ctx, target, 
 -                                internalFormat, 
 -                                width, height, 
 -                                format, type, pixels, 
 -                                packing, texObj, texImage)) {
 -      if (R200_DEBUG & DEBUG_TEXTURE)
 -       fprintf(stderr, "%s: Using client storage\n", __FUNCTION__); 
 -   }
 -   else {
 -      if (R200_DEBUG & DEBUG_TEXTURE)
 -       fprintf(stderr, "%s: Using normal storage\n", __FUNCTION__); 
 -
 -      /* Normal path: copy (to cached memory) and eventually upload
 -       * via another copy to GART memory and then a blit...  Could
 -       * eliminate one copy by going straight to (permanent) GART.
 -       *
 -       * Note, this will call r200ChooseTextureFormat.
 -       */
 -      _mesa_store_teximage2d(ctx, target, level, internalFormat,
 -                           width, height, border, format, type, pixels,
 -                           &ctx->Unpack, texObj, texImage);
 -      
 -      t->dirty_images[face] |= (1 << level);
 -   }
 -}
 -
 -
 -static void r200TexSubImage2D( GLcontext *ctx, GLenum target, GLint level,
 -                                 GLint xoffset, GLint yoffset,
 -                                 GLsizei width, GLsizei height,
 -                                 GLenum format, GLenum type,
 -                                 const GLvoid *pixels,
 -                                 const struct gl_pixelstore_attrib *packing,
 -                                 struct gl_texture_object *texObj,
 -                                 struct gl_texture_image *texImage )
 -{
 -   driTextureObject * t = (driTextureObject *) texObj->DriverData;
 -   GLuint face;
 -
 -   /* which cube face or ordinary 2D image */
 -   switch (target) {
 -   case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
 -   case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
 -   case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
 -   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
 -   case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
 -   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
 -      face = (GLuint) target - (GLuint) GL_TEXTURE_CUBE_MAP_POSITIVE_X;
 -      ASSERT(face < 6);
 -      break;
 -   default:
 -      face = 0;
 -   }
 -
 -   assert( t ); /* this _should_ be true */
 -   if ( t ) {
 -      driSwapOutTextureObject( t );
 -   }
 -   else {
 -      t = (driTextureObject *) r200AllocTexObj( texObj );
 -      if (!t) {
 -         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage2D");
 -         return;
 -      }
 -   }
 -
 -   _mesa_store_texsubimage2d(ctx, target, level, xoffset, yoffset, width,
 -                           height, format, type, pixels, packing, texObj,
 -                           texImage);
 -
 -   t->dirty_images[face] |= (1 << level);
 -}
 -
 -
 -static void r200CompressedTexImage2D( GLcontext *ctx, GLenum target, GLint level,
 -                              GLint internalFormat,
 -                              GLint width, GLint height, GLint border,
 -                              GLsizei imageSize, const GLvoid *data,
 -                              struct gl_texture_object *texObj,
 -                              struct gl_texture_image *texImage )
 -{
 -   driTextureObject * t = (driTextureObject *) texObj->DriverData;
 -   GLuint face;
 -
 -   /* which cube face or ordinary 2D image */
 -   switch (target) {
 -   case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
 -   case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
 -   case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
 -   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
 -   case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
 -   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
 -      face = (GLuint) target - (GLuint) GL_TEXTURE_CUBE_MAP_POSITIVE_X;
 -      ASSERT(face < 6);
 -      break;
 -   default:
 -      face = 0;
 -   }
 -
 -   if ( t != NULL ) {
 -      driSwapOutTextureObject( t );
 -   }
 -   else {
 -      t = (driTextureObject *) r200AllocTexObj( texObj );
 -      if (!t) {
 -         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2D");
 -         return;
 -      }
 -   }
 -
 -   texImage->IsClientData = GL_FALSE;
 -/* can't call this, different parameters. Would never evaluate to true anyway currently
 -   if (r200ValidateClientStorage( ctx, target, 
 -                                internalFormat,
 -                                width, height,
 -                                format, type, pixels,
 -                                packing, texObj, texImage)) {
 -      if (R200_DEBUG & DEBUG_TEXTURE)
 -       fprintf(stderr, "%s: Using client storage\n", __FUNCTION__);
 -   }
 -   else */{
 -      if (R200_DEBUG & DEBUG_TEXTURE)
 -       fprintf(stderr, "%s: Using normal storage\n", __FUNCTION__);
 -
 -      /* Normal path: copy (to cached memory) and eventually upload
 -       * via another copy to GART memory and then a blit...  Could
 -       * eliminate one copy by going straight to (permanent) GART.
 -       *
 -       * Note, this will call r200ChooseTextureFormat.
 -       */
 -      _mesa_store_compressed_teximage2d(ctx, target, level, internalFormat, width,
 -                                 height, border, imageSize, data, texObj, texImage);
 -
 -      t->dirty_images[face] |= (1 << level);
 -   }
+    GLubyte c[4];
+    CLAMPED_FLOAT_TO_UBYTE(c[0], color[0]);
+    CLAMPED_FLOAT_TO_UBYTE(c[1], color[1]);
+    CLAMPED_FLOAT_TO_UBYTE(c[2], color[2]);
+    CLAMPED_FLOAT_TO_UBYTE(c[3], color[3]);
 +   t->pp_border_color = radeonPackColor( 4, c[0], c[1], c[2], c[3] );
  }
  
 -
 -static void r200CompressedTexSubImage2D( GLcontext *ctx, GLenum target, GLint level,
 -                                 GLint xoffset, GLint yoffset,
 -                                 GLsizei width, GLsizei height,
 -                                 GLenum format,
 -                                 GLsizei imageSize, const GLvoid *data,
 -                                 struct gl_texture_object *texObj,
 -                                 struct gl_texture_image *texImage )
 -{
 -   driTextureObject * t = (driTextureObject *) texObj->DriverData;
 -   GLuint face;
 -
 -
 -   /* which cube face or ordinary 2D image */
 -   switch (target) {
 -   case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
 -   case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
 -   case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
 -   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
 -   case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
 -   case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
 -      face = (GLuint) target - (GLuint) GL_TEXTURE_CUBE_MAP_POSITIVE_X;
 -      ASSERT(face < 6);
 -      break;
 -   default:
 -      face = 0;
 -   }
 -
 -   assert( t ); /* this _should_ be true */
 -   if ( t ) {
 -      driSwapOutTextureObject( t );
 -   }
 -   else {
 -      t = (driTextureObject *) r200AllocTexObj( texObj );
 -      if (!t) {
 -         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexSubImage2D");
 -         return;
 -      }
 -   }
 -
 -   _mesa_store_compressed_texsubimage2d(ctx, target, level, xoffset, yoffset, width,
 -                            height, format, imageSize, data, texObj, texImage);
 -
 -   t->dirty_images[face] |= (1 << level);
 -}
 -
 -
 -#if ENABLE_HW_3D_TEXTURE
 -static void r200TexImage3D( GLcontext *ctx, GLenum target, GLint level,
 -                            GLint internalFormat,
 -                            GLint width, GLint height, GLint depth,
 -                            GLint border,
 -                            GLenum format, GLenum type, const GLvoid *pixels,
 -                            const struct gl_pixelstore_attrib *packing,
 -                            struct gl_texture_object *texObj,
 -                            struct gl_texture_image *texImage )
 -{
 -   driTextureObject * t = (driTextureObject *) texObj->DriverData;
 -
 -   if ( t ) {
 -      driSwapOutTextureObject( t );
 -   }
 -   else {
 -      t = (driTextureObject *) r200AllocTexObj( texObj );
 -      if (!t) {
 -         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D");
 -         return;
 -      }
 -   }
 -
 -   texImage->IsClientData = GL_FALSE;
 -
 -#if 0
 -   if (r200ValidateClientStorage( ctx, target, 
 -                                internalFormat, 
 -                                width, height, 
 -                                format, type, pixels, 
 -                                packing, texObj, texImage)) {
 -      if (R200_DEBUG & DEBUG_TEXTURE)
 -       fprintf(stderr, "%s: Using client storage\n", __FUNCTION__); 
 -   }
 -   else
 -#endif
 -   {
 -      if (R200_DEBUG & DEBUG_TEXTURE)
 -       fprintf(stderr, "%s: Using normal storage\n", __FUNCTION__); 
 -
 -      /* Normal path: copy (to cached memory) and eventually upload
 -       * via another copy to GART memory and then a blit...  Could
 -       * eliminate one copy by going straight to (permanent) GART.
 -       *
 -       * Note, this will call r200ChooseTextureFormat.
 -       */
 -      _mesa_store_teximage3d(ctx, target, level, internalFormat,
 -                           width, height, depth, border,
 -                             format, type, pixels,
 -                           &ctx->Unpack, texObj, texImage);
 -      
 -      t->dirty_images[0] |= (1 << level);
 -   }
 -}
 -#endif
 -
 -
 -#if ENABLE_HW_3D_TEXTURE
 -static void
 -r200TexSubImage3D( GLcontext *ctx, GLenum target, GLint level,
 -                   GLint xoffset, GLint yoffset, GLint zoffset,
 -                   GLsizei width, GLsizei height, GLsizei depth,
 -                   GLenum format, GLenum type,
 -                   const GLvoid *pixels,
 -                   const struct gl_pixelstore_attrib *packing,
 -                   struct gl_texture_object *texObj,
 -                   struct gl_texture_image *texImage )
 -{
 -   driTextureObject * t = (driTextureObject *) texObj->DriverData;
 -
 -/*     fprintf(stderr, "%s\n", __FUNCTION__); */
 -
 -   assert( t ); /* this _should_ be true */
 -   if ( t ) {
 -      driSwapOutTextureObject( t );
 -   }
 -   else {
 -      t = (driTextureObject *) r200AllocTexObj( texObj );
 -      if (!t) {
 -         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage3D");
 -         return;
 -      }
 -      texObj->DriverData = t;
 -   }
 -
 -   _mesa_store_texsubimage3d(ctx, target, level, xoffset, yoffset, zoffset,
 -                             width, height, depth,
 -                             format, type, pixels, packing, texObj, texImage);
--
 -   t->dirty_images[0] |= (1 << level);
 -}
 -#endif
--
--
--
  static void r200TexEnv( GLcontext *ctx, GLenum target,
                          GLenum pname, const GLfloat *param )
  {
@@@ -459,31 -1155,21 +460,31 @@@ static void r200TexGen( GLcontext *ctx
   * Called via ctx->Driver.NewTextureObject.
   * Note: this function will be called during context creation to
   * allocate the default texture objects.
 - * Note: we could use containment here to 'derive' the driver-specific
 - * texture object from the core mesa gl_texture_object.  Not done at this time.
   * Fixup MaxAnisotropy according to user preference.
   */
 -static struct gl_texture_object *
 -r200NewTextureObject( GLcontext *ctx, GLuint name, GLenum target )
 +static struct gl_texture_object *r200NewTextureObject(GLcontext * ctx,
 +                                                    GLuint name,
 +                                                    GLenum target)
  {
     r200ContextPtr rmesa = R200_CONTEXT(ctx);
 -   struct gl_texture_object *obj;
 -   obj = _mesa_new_texture_object(ctx, name, target);
 -   if (!obj)
 -      return NULL;
 -   obj->MaxAnisotropy = rmesa->initialMaxAnisotropy;
 -   r200AllocTexObj( obj );
 -   return obj;
 +   radeonTexObj* t = CALLOC_STRUCT(radeon_tex_obj);
 +
 +
 +   if (RADEON_DEBUG & (DEBUG_STATE | DEBUG_TEXTURE)) {
 +     fprintf(stderr, "%s( %p (target = %s) )\n", __FUNCTION__,
 +           t, _mesa_lookup_enum_by_nr(target));
 +   }
 +
 +   _mesa_initialize_texture_object(&t->base, name, target);
 +   t->base.MaxAnisotropy = rmesa->radeon.initialMaxAnisotropy;
 +
 +   /* Initialize hardware state */
 +   r200SetTexWrap( t, t->base.WrapS, t->base.WrapT, t->base.WrapR );
 +   r200SetTexMaxAnisotropy( t, t->base.MaxAnisotropy );
 +   r200SetTexFilter(t, t->base.MinFilter, t->base.MagFilter);
-    r200SetTexBorderColor(t, t->base._BorderChan);
++   r200SetTexBorderColor(t, t->base.BorderColor);
 +
 +   return &t->base;
  }
  
  
@@@ -345,11 -288,24 +345,11 @@@ GLboolean r300CreateContext(const __GLc
        ctx->Const.MaxTextureMaxAnisotropy = 16.0;
        ctx->Const.MaxTextureLodBias = 16.0;
  
-       if (screen->chip_family >= CHIP_FAMILY_RV515) {
+       if (screen->chip_family >= CHIP_FAMILY_RV515)
            ctx->Const.MaxTextureLevels = 13;
-           ctx->Const.MaxTextureRectSize = 4096;
-       }
+       else
+           ctx->Const.MaxTextureLevels = 12;
  
 -        driCalculateMaxTextureLevels( r300->texture_heaps,
 -                                      r300->nr_heaps,
 -                                      & ctx->Const,
 -                                      4,
 -                                      ctx->Const.MaxTextureLevels - 1,
 -                                      MIN2(ctx->Const.MaxTextureLevels,
 -                                           MAX_3D_TEXTURE_LEVELS) - 1,
 -                                      ctx->Const.MaxTextureLevels - 1,
 -                                      ctx->Const.MaxTextureLevels - 1,
 -                                      ctx->Const.MaxTextureLevels - 1,
 -                                      GL_FALSE,
 -                                      2 );
 -
        ctx->Const.MinPointSize = 1.0;
        ctx->Const.MinPointSizeAA = 1.0;
        ctx->Const.MaxPointSize = R300_POINTSIZE_MAX;
@@@ -74,10 -75,151 +74,8 @@@ typedef struct r300_context *r300Contex
  #include "r300_vertprog.h"
  #include "r500_fragprog.h"
  
 -/**
 - * This function takes a float and packs it into a uint32_t
 - */
 -static INLINE uint32_t r300PackFloat32(float fl)
 -{
 -      union {
 -              float fl;
 -              uint32_t u;
 -      } u;
 -
 -      u.fl = fl;
 -      return u.u;
 -}
 -
 -/* This is probably wrong for some values, I need to test this
 - * some more.  Range checking would be a good idea also..
 - *
 - * But it works for most things.  I'll fix it later if someone
 - * else with a better clue doesn't
 - */
 -static INLINE uint32_t r300PackFloat24(float f)
 -{
 -      float mantissa;
 -      int exponent;
 -      uint32_t float24 = 0;
 -
 -      if (f == 0.0)
 -              return 0;
  
 -      mantissa = frexpf(f, &exponent);
 -
 -      /* Handle -ve */
 -      if (mantissa < 0) {
 -              float24 |= (1 << 23);
 -              mantissa = mantissa * -1.0;
 -      }
 -      /* Handle exponent, bias of 63 */
 -      exponent += 62;
 -      float24 |= (exponent << 16);
 -      /* Kill 7 LSB of mantissa */
 -      float24 |= (r300PackFloat32(mantissa) & 0x7FFFFF) >> 7;
 -
 -      return float24;
 -}
 -
 -/************ DMA BUFFERS **************/
 -
 -/* Need refcounting on dma buffers:
 - */
 -struct r300_dma_buffer {
 -      int refcount;           /**< the number of retained regions in buf */
 -      drmBufPtr buf;
 -      int id;
 -};
 -#undef GET_START
 -#ifdef USER_BUFFERS
 -#define GET_START(rvb) (r300GartOffsetFromVirtual(rmesa, (rvb)->address+(rvb)->start))
 -#else
 -#define GET_START(rvb) (rmesa->radeon.radeonScreen->gart_buffer_offset +              \
 -                      (rvb)->address - rmesa->dma.buf0_address +      \
 -                      (rvb)->start)
 -#endif
 -/* A retained region, eg vertices for indexed vertices.
 - */
 -struct r300_dma_region {
 -      struct r300_dma_buffer *buf;
 -      char *address;          /* == buf->address */
 -      int start, end, ptr;    /* offsets from start of buf */
 -
 -      int aos_offset;         /* address in GART memory */
 -      int aos_stride;         /* distance between elements, in dwords */
 -      int aos_size;           /* number of components (1-4) */
 -};
 -
 -struct r300_dma {
 -      /* Active dma region.  Allocations for vertices and retained
 -       * regions come from here.  Also used for emitting random vertices,
 -       * these may be flushed by calling flush_current();
 -       */
 -      struct r300_dma_region current;
 -
 -      void (*flush) (r300ContextPtr);
 -
 -      char *buf0_address;     /* start of buf[0], for index calcs */
 -
 -      /* Number of "in-flight" DMA buffers, i.e. the number of buffers
 -       * for which a DISCARD command is currently queued in the command buffer.
 -       */
 -      GLuint nr_released_bufs;
 -};
 -
 -       /* Texture related */
 -
 -typedef struct r300_tex_obj r300TexObj, *r300TexObjPtr;
 -
 -/* Maximum number of mipmap levels supported by any supported GPU
 - */
 -#define R300_MAX_TEXTURE_LEVELS 13
 -
 -/* Texture object in locally shared texture space.
 - */
 -struct r300_tex_obj {
 -      driTextureObject base;
 -
 -      GLuint bufAddr;         /* Offset to start of locally
 -                                 shared texture block */
 -
 -      drm_radeon_tex_image_t image[6][R300_MAX_TEXTURE_LEVELS];
 -      /* Six, for the cube faces */
 -
 -      GLboolean image_override;       /* Image overridden by GLX_EXT_tfp */
 -
 -      GLuint pitch;           /* this isn't sent to hardware just used in calculations */
 -      /* hardware register values */
 -      /* Note that R200 has 8 registers per texture and R300 only 7 */
 -      GLuint filter;
 -      GLuint filter_1;
 -      GLuint pitch_reg;
 -      GLuint size;            /* npot only */
 -      GLuint format;
 -      GLuint offset;          /* Image location in the card's address space.
 -                                 All cube faces follow. */
 -      GLuint unknown4;
 -      GLuint unknown5;
 -      /* end hardware registers */
 -
 -      /* registers computed by r200 code - keep them here to
 -         compare against what is actually written.
 -
 -         to be removed later.. */
 -      GLuint pp_border_color;
 -      GLuint pp_cubic_faces;  /* cube face 1,2,3,4 log2 sizes */
 -      GLuint format_x;
 -
 -      GLboolean border_fallback;
 -
 -      GLuint tile_bits;       /* hw texture tile bits used on this texture */
 -};
 -
 -struct r300_texture_env_state {
 -      r300TexObjPtr texobj;
 -      GLenum format;
 -      GLenum envMode;
 -};
  
- /************ DMA BUFFERS **************/
  /* The blit width for texture uploads
   */
  #define R300_BLIT_WIDTH_BYTES 1024
@@@ -176,8 -171,13 +176,13 @@@ static void r300SetTexFilter(radeonTexO
        }
  }
  
- static void r300SetTexBorderColor(radeonTexObjPtr t, GLubyte c[4])
 -static void r300SetTexBorderColor(r300TexObjPtr t, const GLfloat color[4])
++static void r300SetTexBorderColor(radeonTexObjPtr t, const GLfloat color[4])
  {
+       GLubyte c[4];
+       CLAMPED_FLOAT_TO_UBYTE(c[0], color[0]);
+       CLAMPED_FLOAT_TO_UBYTE(c[1], color[1]);
+       CLAMPED_FLOAT_TO_UBYTE(c[2], color[2]);
+       CLAMPED_FLOAT_TO_UBYTE(c[3], color[3]);
        t->pp_border_color = PACK_COLOR_8888(c[3], c[0], c[1], c[2]);
  }
  
@@@ -294,23 -1022,14 +299,23 @@@ static struct gl_texture_object *r300Ne
                                                      GLenum target)
  {
        r300ContextPtr rmesa = R300_CONTEXT(ctx);
 -      struct gl_texture_object *obj;
 -      obj = _mesa_new_texture_object(ctx, name, target);
 -      if (!obj)
 -              return NULL;
 -      obj->MaxAnisotropy = rmesa->initialMaxAnisotropy;
 +      radeonTexObj* t = CALLOC_STRUCT(radeon_tex_obj);
 +
  
 -      r300AllocTexObj(obj);
 -      return obj;
 +      if (RADEON_DEBUG & (DEBUG_STATE | DEBUG_TEXTURE)) {
 +              fprintf(stderr, "%s( %p (target = %s) )\n", __FUNCTION__,
 +                      t, _mesa_lookup_enum_by_nr(target));
 +      }
 +
 +      _mesa_initialize_texture_object(&t->base, name, target);
 +      t->base.MaxAnisotropy = rmesa->radeon.initialMaxAnisotropy;
 +
 +      /* Initialize hardware state */
 +      r300UpdateTexWrap(t);
 +      r300SetTexFilter(t, t->base.MinFilter, t->base.MagFilter, t->base.MaxAnisotropy);
-       r300SetTexBorderColor(t, t->base._BorderChan);
++      r300SetTexBorderColor(t, t->base.BorderColor);
 +
 +      return &t->base;
  }
  
  void r300InitTextureFuncs(struct dd_function_table *functions)
index 9921d35,0000000..6f1a0b4
mode 100644,000000..100644
--- /dev/null
@@@ -1,70 -1,0 +1,85 @@@
-         uint64_t gart_start;
 +#ifndef RADEON_CS_WRAPPER_H
 +#define RADEON_CS_WRAPPER_H
 +
 +#ifndef RADEON_PARAM_DEVICE_ID
 +#define RADEON_PARAM_DEVICE_ID 16
 +#endif
 +
++#ifndef RADEON_INFO_DEVICE_ID
++#define RADEON_INFO_DEVICE_ID 0
++#endif
++#ifndef RADEON_INFO_NUM_GB_PIPES
++#define RADEON_INFO_NUM_GB_PIPES 0
++#endif
++
++#ifndef DRM_RADEON_INFO
++#define DRM_RADEON_INFO 0x1
++#endif
++
 +#ifdef HAVE_LIBDRM_RADEON
 +
 +#include "radeon_bo.h"
 +#include "radeon_bo_gem.h"
 +#include "radeon_cs.h"
 +#include "radeon_cs_gem.h"
 +
 +#else
 +#include <stdint.h>
 +
 +#define RADEON_GEM_DOMAIN_CPU 0x1   // Cached CPU domain
 +#define RADEON_GEM_DOMAIN_GTT 0x2   // GTT or cache flushed
 +#define RADEON_GEM_DOMAIN_VRAM 0x4  // VRAM domain
 +
 +/* to be used to build locally in mesa with no libdrm bits */
 +#include "../radeon/radeon_bo_drm.h"
 +#include "../radeon/radeon_cs_drm.h"
 +
 +#ifndef DRM_RADEON_GEM_INFO
 +#define DRM_RADEON_GEM_INFO 0x1c
 +
 +struct drm_radeon_gem_info {
-         uint64_t vram_start;
 +        uint64_t gart_size;
 +        uint64_t vram_size;
 +        uint64_t vram_visible;
 +};
++
++struct drm_radeon_info {
++      uint32_t request;
++      uint32_t pad;
++      uint32_t value;
++};
 +#endif
 +
 +
 +static inline uint32_t radeon_gem_name_bo(struct radeon_bo *dummy)
 +{
 +  return 0;
 +}
 +
 +static inline void *radeon_bo_manager_gem_ctor(int fd)
 +{
 +  return NULL;
 +}
 +
 +static inline void radeon_bo_manager_gem_dtor(void *dummy)
 +{
 +}
 +
 +static inline void *radeon_cs_manager_gem_ctor(int fd)
 +{
 +  return NULL;
 +}
 +
 +static inline void radeon_cs_manager_gem_dtor(void *dummy)
 +{
 +}
 +
 +static inline void radeon_tracker_print(void *ptr, int io)
 +{
 +}
 +#endif
 +
 +#include "radeon_bo_legacy.h"
 +#include "radeon_cs_legacy.h"
 +
 +#endif
@@@ -424,23 -851,14 +429,23 @@@ static void radeonTexGen( GLcontext *ct
  static struct gl_texture_object *
  radeonNewTextureObject( GLcontext *ctx, GLuint name, GLenum target )
  {
 -   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
 -   struct gl_texture_object *obj;
 -   obj = _mesa_new_texture_object(ctx, name, target);
 -   if (!obj)
 -      return NULL;
 -   obj->MaxAnisotropy = rmesa->initialMaxAnisotropy;
 -   radeonAllocTexObj( obj );
 -   return obj;
 +   r100ContextPtr rmesa = R100_CONTEXT(ctx);
 +   radeonTexObj* t = CALLOC_STRUCT(radeon_tex_obj);
 +
 +   _mesa_initialize_texture_object(&t->base, name, target);
 +   t->base.MaxAnisotropy = rmesa->radeon.initialMaxAnisotropy;
 +
 +   t->border_fallback = GL_FALSE;
 +
 +   t->pp_txfilter = RADEON_BORDER_MODE_OGL;
 +   t->pp_txformat = (RADEON_TXFORMAT_ENDIAN_NO_SWAP |
 +                   RADEON_TXFORMAT_PERSPECTIVE_ENABLE);
 +   
 +   radeonSetTexWrap( t, t->base.WrapS, t->base.WrapT );
 +   radeonSetTexMaxAnisotropy( t, t->base.MaxAnisotropy );
 +   radeonSetTexFilter( t, t->base.MinFilter, t->base.MagFilter );
-    radeonSetTexBorderColor( t, t->base._BorderChan );
++   radeonSetTexBorderColor( t, t->base.BorderColor );
 +   return &t->base;
  }