diff --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;