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;