rendered paste bodydiff --git a/src/mesa/drivers/dri/nouveau/nouveau_texture.c b/src/mesa/drivers/dri/nouveau/nouveau_texture.c
index 442f4e8..02eea8e 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);
@@ -501,15 +514,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)
{
@@ -651,7 +689,9 @@ nouveau_texture_functions_init(struct dd_function_table *functions)
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;