rendered paste bodydiff --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;