fix up radeon span functions using latest r200 code from Brian,
[mesa.git] / src / mesa / drivers / dri / i915 / intel_tex.c
index 3a67943fefa0532eaa7622a336dc77f0841dc5b7..d256dbf7cb833fc620c4970943601a3bcad4e8e0 100644 (file)
@@ -28,6 +28,7 @@
 #include "glheader.h"
 #include "mtypes.h"
 #include "imports.h"
+#include "macros.h"
 #include "simple_list.h"
 #include "enums.h"
 #include "image.h"
@@ -304,6 +305,83 @@ static void intelTexSubImage2D( GLcontext *ctx,
    }
 }
 
+static void intelCompressedTexImage2D( 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;
+   }
+
+   assert(t);
+   intelFlush( ctx );
+   
+   driSwapOutTextureObject( t );
+   texImage->IsClientData = GL_FALSE;
+
+   if (INTEL_DEBUG & DEBUG_TEXTURE)
+     fprintf(stderr, "%s: Using normal storage\n", __FUNCTION__); 
+   
+   _mesa_store_compressed_teximage2d(ctx, target, level, internalFormat, width,
+                                    height, border, imageSize, data, texObj, texImage);
+   
+   t->dirty_images[face] |= (1 << level);
+}
+
+
+static void intelCompressedTexSubImage2D( 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 */
+   intelFlush( ctx );
+   driSwapOutTextureObject( t );
+   
+   _mesa_store_compressed_texsubimage2d(ctx, target, level, xoffset, yoffset, width,
+                                       height, format, imageSize, data, texObj, texImage);
+   
+   t->dirty_images[face] |= (1 << level);
+}
 
 
 static void intelTexImage3D( GLcontext *ctx, GLenum target, GLint level,
@@ -375,7 +453,7 @@ intelChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
 {
    intelContextPtr intel = INTEL_CONTEXT( ctx );
    const GLboolean do32bpt = ( intel->intelScreen->cpp == 4 &&
-                              intel->intelScreen->textureSize > 4*1024*1024);
+                              intel->intelScreen->tex.size > 4*1024*1024);
 
    switch ( internalFormat ) {
    case 4:
@@ -432,10 +510,7 @@ intelChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
    case GL_ALPHA12:
    case GL_ALPHA16:
    case GL_COMPRESSED_ALPHA:
-/*       if (1 || intel->intelScreen->deviceID == PCI_CHIP_I915_G) */
-        return &_mesa_texformat_a8;
-/*       else */
-/*      return &_mesa_texformat_al88; */
+      return &_mesa_texformat_a8;
 
    case 1:
    case GL_LUMINANCE:
@@ -472,8 +547,37 @@ intelChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
       else
          return &_mesa_texformat_ycbcr_rev;
 
+   case GL_COMPRESSED_RGB_FXT1_3DFX:
+     return &_mesa_texformat_rgb_fxt1;
+   case GL_COMPRESSED_RGBA_FXT1_3DFX:
+     return &_mesa_texformat_rgba_fxt1;
+
+   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;
+
+   case GL_DEPTH_COMPONENT:
+   case GL_DEPTH_COMPONENT16:
+   case GL_DEPTH_COMPONENT24:
+   case GL_DEPTH_COMPONENT32:
+      return &_mesa_texformat_depth_component16;
+
    default:
-      fprintf(stderr, "unexpected texture format in %s\n", __FUNCTION__);
+      fprintf(stderr, "unexpected texture format %s in %s\n", 
+             _mesa_lookup_enum_by_nr(internalFormat),
+             __FUNCTION__);
       return NULL;
    }
 
@@ -529,6 +633,45 @@ static void intelUploadTexImage( intelContextPtr intel,
                               image->Width,
                               image->Height);
    }
+   else if (image->IsCompressed) {
+      GLuint row_len = image->Width * 2;
+      GLubyte *dst = (GLubyte *)(t->BufAddr + offset);
+      GLubyte *src = (GLubyte *)image->Data;
+      GLuint j;
+
+      if (INTEL_DEBUG & DEBUG_TEXTURE)
+        fprintf(stderr, 
+                "Upload image %dx%dx%d offset %xm row_len %x "
+                "pitch %x depth_pitch %x\n",
+                image->Width, image->Height, image->Depth, offset,
+                row_len, t->Pitch, t->depth_pitch);
+
+      switch (image->InternalFormat) {
+       case GL_COMPRESSED_RGB_FXT1_3DFX:
+       case GL_COMPRESSED_RGBA_FXT1_3DFX:
+       case GL_RGB_S3TC:
+       case GL_RGB4_S3TC:
+       case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
+       case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
+         for (j = 0 ; j < image->Height/4 ; j++, dst += (t->Pitch)) {
+           __memcpy(dst, src, row_len );
+           src += row_len;
+         }
+         break;
+       case GL_RGBA_S3TC:
+       case GL_RGBA4_S3TC:
+       case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
+       case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
+         for (j = 0 ; j < image->Height/4 ; j++, dst += (t->Pitch)) {
+           __memcpy(dst, src, (image->Width*4) );
+           src += image->Width*4;
+         }
+         break;
+       default:
+         fprintf(stderr,"Internal Compressed format not supported %d\n", image->InternalFormat);
+         break;
+      }
+   }
    else {
       GLuint row_len = image->Width * image->TexFormat->TexelBytes;
       GLubyte *dst = (GLubyte *)(t->BufAddr + offset);
@@ -605,7 +748,7 @@ int intelUploadTexImages( intelContextPtr intel,
 
         /* Set the base offset of the texture image */
         t->BufAddr = intel->intelScreen->tex.map + t->base.memBlock->ofs;
-        t->TextureOffset = intel->intelScreen->textureOffset + t->base.memBlock->ofs;
+        t->TextureOffset = intel->intelScreen->tex.offset + t->base.memBlock->ofs;
         t->dirty = ~0;
       }
 
@@ -682,4 +825,6 @@ void intelInitTextureFuncs( struct dd_function_table *functions )
    functions->IsTextureResident         = driIsTextureResident;
    functions->TestProxyTexImage         = _mesa_test_proxy_teximage;
    functions->DeleteTexture             = intelDeleteTexture;
+   functions->CompressedTexImage2D      = intelCompressedTexImage2D;
+   functions->CompressedTexSubImage2D   = intelCompressedTexSubImage2D;
 }