case GL_COMPRESSED_RGBA:
return MESA_FORMAT_B8G8R8A8_UNORM;
case GL_RGB5_A1:
- return MESA_FORMAT_ARGB1555;
+ return MESA_FORMAT_B5G5R5A1_UNORM;
case GL_RGB:
case GL_RGB8:
case GL_R3_G3_B2:
case GL_RGB4:
case GL_RGB5:
- return MESA_FORMAT_RGB565;
+ return MESA_FORMAT_B5G6R5_UNORM;
case 2:
case GL_LUMINANCE_ALPHA:
case GL_INTENSITY12:
case GL_INTENSITY16:
case GL_INTENSITY8:
+ case GL_COMPRESSED_INTENSITY:
return MESA_FORMAT_I_UNORM8;
case GL_RGB_S3TC:
height = minify(height, 1);
}
- /* Get new storage. */
- size = align(offset, 64);
+ if (t->BaseLevel <= last) {
+ /* Get new storage. */
+ size = align(offset, 64);
+ assert(size);
- ret = nouveau_bo_new(context_dev(ctx), NOUVEAU_BO_MAP |
- NOUVEAU_BO_GART | NOUVEAU_BO_VRAM,
- 0, size, NULL, &ss[last].bo);
- assert(!ret);
+ ret = nouveau_bo_new(context_dev(ctx), NOUVEAU_BO_MAP |
+ NOUVEAU_BO_GART | NOUVEAU_BO_VRAM,
+ 0, size, NULL, &ss[last].bo);
+ assert(!ret);
- for (i = t->BaseLevel; i < last; i++)
- nouveau_bo_ref(ss[last].bo, &ss[i].bo);
+ for (i = t->BaseLevel; i < last; i++)
+ nouveau_bo_ref(ss[last].bo, &ss[i].bo);
+ }
}
}
return NOUVEAU_BO_GART | NOUVEAU_BO_MAP;
}
+static void
+nouveau_compressed_copy(struct gl_context *ctx, GLint dims,
+ struct gl_texture_image *ti,
+ GLsizei width, GLsizei height, GLsizei depth,
+ const GLvoid *src, GLvoid *dst, int row_stride)
+{
+ struct compressed_pixelstore store;
+ int i;
+
+ _mesa_compute_compressed_pixelstore(dims, ti->TexFormat,
+ width, height, depth,
+ &ctx->Unpack, &store);
+
+ src += store.SkipBytes;
+
+ assert(store.CopySlices == 1);
+
+ /* copy rows of blocks */
+ for (i = 0; i < store.CopyRowsPerSlice; i++) {
+ memcpy(dst, src, store.CopyBytesPerRow);
+ dst += row_stride;
+ src += store.TotalBytesPerRow;
+ }
+}
+
static void
nouveau_teximage(struct gl_context *ctx, GLint dims,
struct gl_texture_image *ti,
GL_MAP_WRITE_BIT,
&map, &row_stride);
- ret = _mesa_texstore(ctx, dims, ti->_BaseFormat,
- ti->TexFormat,
- row_stride,
- &map,
- ti->Width, ti->Height, depth,
- format, type, pixels, packing);
- assert(ret);
+ if (compressed) {
+ nouveau_compressed_copy(ctx, dims, ti,
+ ti->Width, ti->Height, depth,
+ pixels, map, row_stride);
+ } else {
+ ret = _mesa_texstore(ctx, dims, ti->_BaseFormat,
+ ti->TexFormat,
+ row_stride,
+ &map,
+ ti->Width, ti->Height, depth,
+ format, type, pixels, packing);
+ assert(ret);
+ }
nouveau_unmap_texture_image(ctx, ti, 0);
_mesa_unmap_teximage_pbo(ctx, packing);
nouveau_teximage_alloc(struct gl_context *ctx, struct gl_texture_image *ti)
{
nouveau_teximage(ctx, 3, ti, 0, 0, 0, NULL,
- &ctx->DefaultPacking, GL_FALSE);
+ &ctx->DefaultPacking,
+ _mesa_is_format_compressed(ti->TexFormat));
return GL_TRUE;
}
xoffset, yoffset, width, height,
GL_MAP_WRITE_BIT, &map, &row_stride);
- ret = _mesa_texstore(ctx, dims, ti->_BaseFormat, ti->TexFormat,
- row_stride, &map,
- width, height, depth,
- format, type, pixels, packing);
- assert(ret);
+ if (compressed) {
+ nouveau_compressed_copy(ctx, dims, ti,
+ width, height, depth,
+ pixels, map, row_stride);
+ } else {
+ ret = _mesa_texstore(ctx, dims, ti->_BaseFormat,
+ ti->TexFormat,
+ row_stride, &map,
+ width, height, depth,
+ format, type, pixels, packing);
+ assert(ret);
+ }
nouveau_unmap_texture_image(ctx, ti, 0);
_mesa_unmap_teximage_pbo(ctx, packing);
}
static void
-nouveau_bind_texture(struct gl_context *ctx, GLenum target,
- struct gl_texture_object *t)
+nouveau_bind_texture(struct gl_context *ctx, GLuint texUnit,
+ GLenum target, struct gl_texture_object *t)
{
- context_dirty_i(ctx, TEX_OBJ, ctx->Texture.CurrentUnit);
- context_dirty_i(ctx, TEX_ENV, ctx->Texture.CurrentUnit);
+ context_dirty_i(ctx, TEX_OBJ, texUnit);
+ context_dirty_i(ctx, TEX_ENV, texUnit);
}
static mesa_format