All pastes #1932599 Raw Edit

Miscellany

public text v1 · immutable
#1932599 ·published 2010-09-04 12:33 UTC
rendered paste body
diff --git a/src/mesa/drivers/dri/nouveau/nouveau_texture.c b/src/mesa/drivers/dri/nouveau/nouveau_texture.c
index 442f4e8..1c11df5 100644
--- a/src/mesa/drivers/dri/nouveau/nouveau_texture.c
+++ b/src/mesa/drivers/dri/nouveau/nouveau_texture.c
@@ -171,6 +171,19 @@ nouveau_choose_tex_format(GLcontext *ctx, GLint internalFormat,
 	case GL_COLOR_INDEX16_EXT:
 	case GL_COLOR_INDEX8_EXT:
 		return MESA_FORMAT_CI8;
+		
+	case GL_RGB_S3TC:
+	case GL_RGB4_S3TC:
+	case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
+		return MESA_FORMAT_RGB_DXT1;
+	case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
+		return MESA_FORMAT_RGBA_DXT1;
+	case GL_RGBA_S3TC:
+	case GL_RGBA4_S3TC:
+	case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
+		return MESA_FORMAT_RGBA_DXT3;
+	case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
+		return MESA_FORMAT_RGBA_DXT5;
 
 	default:
 		assert(0);
@@ -333,10 +346,12 @@ static void
 nouveau_teximage(GLcontext *ctx, GLint dims, GLenum target, GLint level,
 		 GLint internalFormat,
 		 GLint width, GLint height, GLint depth, GLint border,
+		 GLsizei imageSize,
 		 GLenum format, GLenum type, const GLvoid *pixels,
 		 const struct gl_pixelstore_attrib *packing,
 		 struct gl_texture_object *t,
-		 struct gl_texture_image *ti)
+		 struct gl_texture_image *ti,
+		 int compressed)
 {
 	struct nouveau_surface *s = &to_nouveau_teximage(ti)->surface;
 	int ret;
@@ -345,10 +360,14 @@ nouveau_teximage(GLcontext *ctx, GLint dims, GLenum target, GLint level,
 	nouveau_surface_alloc(ctx, s, LINEAR, get_teximage_placement(ti),
 			      ti->TexFormat, width, height);
 	ti->RowStride = s->pitch / s->cpp;
-
+	if (compressed) {
+		pixels = _mesa_validate_pbo_compressed_teximage(
+			ctx, imageSize, pixels, packing, "glCompressedTexImage");
+	} else {
 	pixels = _mesa_validate_pbo_teximage(ctx, dims, width, height, depth,
 					     format, type, pixels, packing,
 					     "glTexImage");
+	}
 	if (pixels) {
 		/* Store the pixel data. */
 		nouveau_teximage_map(ctx, ti);
@@ -380,6 +399,18 @@ nouveau_teximage(GLcontext *ctx, GLint dims, GLenum target, GLint level,
 	context_dirty_i(ctx, TEX_ENV, ctx->Texture.CurrentUnit);
 }
 
+static void 
+nouveau_CompressedTexImage2D(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)
+{
+	nouveau_teximage(ctx, 2, target, level, internalFormat, width, height, 1, border,
+		imageSize, 0, 0, data, &ctx->Unpack, texObj, texImage, 1);
+}
+
 static void
 nouveau_teximage_1d(GLcontext *ctx, GLenum target, GLint level,
 		    GLint internalFormat,
@@ -390,8 +421,8 @@ nouveau_teximage_1d(GLcontext *ctx, GLenum target, GLint level,
 		    struct gl_texture_image *ti)
 {
 	nouveau_teximage(ctx, 1, target, level, internalFormat,
-			 width, 1, 1, border, format, type, pixels,
-			 packing, t, ti);
+			 width, 1, 1, border, 0, format, type, pixels,
+			 packing, t, ti, 0);
 }
 
 static void
@@ -404,8 +435,8 @@ nouveau_teximage_2d(GLcontext *ctx, GLenum target, GLint level,
 		    struct gl_texture_image *ti)
 {
 	nouveau_teximage(ctx, 2, target, level, internalFormat,
-			 width, height, 1, border, format, type, pixels,
-			 packing, t, ti);
+			 width, height, 1, border, 0, format, type, pixels,
+			 packing, t, ti, 0);
 }
 
 static void
@@ -418,8 +449,8 @@ nouveau_teximage_3d(GLcontext *ctx, GLenum target, GLint level,
 		    struct gl_texture_image *ti)
 {
 	nouveau_teximage(ctx, 3, target, level, internalFormat,
-			 width, height, depth, border, format, type, pixels,
-			 packing, t, ti);
+			 width, height, depth, border, 0, format, type, pixels,
+			 packing, t, ti, 0);
 }
 
 static void
@@ -501,15 +532,40 @@ static void
 nouveau_get_teximage(GLcontext *ctx, GLenum target, GLint level,
 		     GLenum format, GLenum type, GLvoid *pixels,
 		     struct gl_texture_object *t,
-		     struct gl_texture_image *ti)
+		     struct gl_texture_image *ti, int compressed)
 {
 	nouveau_teximage_map(ctx, ti);
+	 if (compressed) { 
+	 _mesa_get_compressed_teximage(ctx, target, level, pixels,
+					t, ti);
+	} else {
 	_mesa_get_teximage(ctx, target, level, format, type, pixels,
 			   t, ti);
+	}
 	nouveau_teximage_unmap(ctx, ti);
 }
 
 static void
+nouveau_GetTexImage(GLcontext * ctx, GLenum target, GLint level,
+          GLenum format, GLenum type, GLvoid * pixels,
+          struct gl_texture_object *texObj,
+          struct gl_texture_image *texImage)
+{
+    nouveau_get_teximage(ctx, target, level, format, type, pixels,
+                 texObj, texImage, 0);
+}
+
+static void 
+nouveau_GetCompressedTexImage(GLcontext *ctx, GLenum target, GLint level,
+                GLvoid *pixels,
+                struct gl_texture_object *texObj,
+                struct gl_texture_image *texImage)
+{
+    nouveau_get_teximage(ctx, target, level, 0, 0, pixels,
+                 texObj, texImage, 1);
+}
+
+static void
 nouveau_bind_texture(GLcontext *ctx, GLenum target,
 		     struct gl_texture_object *t)
 {
@@ -611,8 +667,8 @@ store_mipmap(GLcontext *ctx, GLenum target, int first, int last,
 
 		nouveau_teximage(ctx, 3, target, i, ti->InternalFormat,
 				 ti->Width, ti->Height, ti->Depth,
-				 ti->Border, base_format, type, data,
-				 &packing, t, ti);
+				 ti->Border, 0, base_format, type, data,
+				 &packing, t, ti, 0);
 
 		_mesa_free_texmemory(data);
 	}
@@ -648,10 +704,13 @@ nouveau_texture_functions_init(struct dd_function_table *functions)
 	functions->TexImage1D = nouveau_teximage_1d;
 	functions->TexImage2D = nouveau_teximage_2d;
 	functions->TexImage3D = nouveau_teximage_3d;
+	functions->CompressedTexImage2D = nouveau_CompressedTexImage2D;
 	functions->TexSubImage1D = nouveau_texsubimage_1d;
 	functions->TexSubImage2D = nouveau_texsubimage_2d;
 	functions->TexSubImage3D = nouveau_texsubimage_3d;
-	functions->GetTexImage = nouveau_get_teximage;
+	// functions->GetTexImage = nouveau_get_teximage;
+	functions->GetTexImage =  nouveau_GetTexImage;
+	functions->GetCompressedTexImage = nouveau_GetCompressedTexImage;
 	functions->BindTexture = nouveau_bind_texture;
 	functions->MapTexture = nouveau_texture_map;
 	functions->UnmapTexture = nouveau_texture_unmap;
diff --git a/src/mesa/drivers/dri/nouveau/nv10_context.c b/src/mesa/drivers/dri/nouveau/nv10_context.c
index b6d1036..b39c2bc 100644
--- a/src/mesa/drivers/dri/nouveau/nv10_context.c
+++ b/src/mesa/drivers/dri/nouveau/nv10_context.c
@@ -34,6 +34,8 @@
 
 static const struct dri_extension nv10_extensions[] = {
 	{ "GL_EXT_texture_rectangle",	NULL },
+	{ "GL_EXT_texture_compression_s3tc",  NULL },
+	{ "GL_S3_s3tc", NULL },
 	{ NULL,				NULL }
 };
 
diff --git a/src/mesa/drivers/dri/nouveau/nv10_state_tex.c b/src/mesa/drivers/dri/nouveau/nv10_state_tex.c
index 6dedb18..9bb8c42 100644
--- a/src/mesa/drivers/dri/nouveau/nv10_state_tex.c
+++ b/src/mesa/drivers/dri/nouveau/nv10_state_tex.c
@@ -96,6 +96,14 @@ static uint32_t
 get_tex_format_pot(struct gl_texture_image *ti)
 {
 	switch (ti->TexFormat) {
+	case MESA_FORMAT_RGB_DXT1:
+	case MESA_FORMAT_RGBA_DXT1:
+		return NV10TCL_TX_FORMAT_FORMAT_DXT1;
+	case MESA_FORMAT_RGBA_DXT3:
+		return NV10TCL_TX_FORMAT_FORMAT_DXT3;
+	case MESA_FORMAT_RGBA_DXT5:
+		return NV10TCL_TX_FORMAT_FORMAT_DXT5;
+	
 	case MESA_FORMAT_ARGB8888:
 		return NV10TCL_TX_FORMAT_FORMAT_A8R8G8B8;