aboutsummaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/dri/radeon/radeon_texture.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/drivers/dri/radeon/radeon_texture.c')
-rw-r--r--src/mesa/drivers/dri/radeon/radeon_texture.c103
1 files changed, 44 insertions, 59 deletions
diff --git a/src/mesa/drivers/dri/radeon/radeon_texture.c b/src/mesa/drivers/dri/radeon/radeon_texture.c
index 24e40e9853b..2d17d30bb50 100644
--- a/src/mesa/drivers/dri/radeon/radeon_texture.c
+++ b/src/mesa/drivers/dri/radeon/radeon_texture.c
@@ -104,7 +104,7 @@ void radeonFreeTextureImageBuffer(struct gl_context *ctx, struct gl_texture_imag
if (image->mt) {
radeon_miptree_unreference(&image->mt);
- assert(!image->base.Base.Data);
+ assert(!image->base.Data);
} else {
_mesa_free_texture_image_data(ctx, timage);
}
@@ -112,9 +112,14 @@ void radeonFreeTextureImageBuffer(struct gl_context *ctx, struct gl_texture_imag
radeon_bo_unref(image->bo);
image->bo = NULL;
}
- if (timage->Data) {
- _mesa_free_texmemory(timage->Data);
- timage->Data = NULL;
+ if (image->base.Data) {
+ _mesa_free_texmemory(image->base.Data);
+ image->base.Data = NULL;
+ }
+
+ if (image->base.ImageOffsets) {
+ free(image->base.ImageOffsets);
+ image->base.ImageOffsets = NULL;
}
}
@@ -132,8 +137,8 @@ static void teximage_set_map_data(radeon_texture_image *image)
lvl = &image->mt->levels[image->mtlevel];
- image->base.Base.Data = image->mt->bo->ptr + lvl->faces[image->mtface].offset;
- image->base.Base.RowStride = lvl->rowstride / _mesa_get_format_bytes(image->base.Base.TexFormat);
+ image->base.Data = image->mt->bo->ptr + lvl->faces[image->mtface].offset;
+ image->base.RowStride = lvl->rowstride / _mesa_get_format_bytes(image->base.Base.TexFormat);
}
@@ -147,7 +152,7 @@ void radeon_teximage_map(radeon_texture_image *image, GLboolean write_enable)
__func__, image,
write_enable ? "true": "false");
if (image->mt) {
- assert(!image->base.Base.Data);
+ assert(!image->base.Data);
radeon_bo_map(image->mt->bo, write_enable);
teximage_set_map_data(image);
@@ -161,9 +166,9 @@ void radeon_teximage_unmap(radeon_texture_image *image)
"%s(img %p)\n",
__func__, image);
if (image->mt) {
- assert(image->base.Base.Data);
+ assert(image->base.Data);
- image->base.Base.Data = 0;
+ image->base.Data = 0;
radeon_bo_unmap(image->mt->bo);
}
}
@@ -174,7 +179,7 @@ static void map_override(struct gl_context *ctx, radeonTexObj *t)
radeon_bo_map(t->bo, GL_FALSE);
- img->base.Base.Data = t->bo->ptr;
+ img->base.Data = t->bo->ptr;
}
static void unmap_override(struct gl_context *ctx, radeonTexObj *t)
@@ -183,7 +188,7 @@ static void unmap_override(struct gl_context *ctx, radeonTexObj *t)
radeon_bo_unmap(t->bo);
- img->base.Base.Data = NULL;
+ img->base.Data = NULL;
}
/**
@@ -243,8 +248,11 @@ void radeonUnmapTexture(struct gl_context *ctx, struct gl_texture_object *texObj
return;
for(face = 0; face < t->mt->faces; ++face) {
- for(level = t->minLod; level <= t->maxLod; ++level)
- texObj->Image[face][level]->Data = 0;
+ for(level = t->minLod; level <= t->maxLod; ++level) {
+ radeon_texture_image *image =
+ get_radeon_texture_image(texObj->Image[face][level]);
+ image->base.Data = NULL;
+ }
}
radeon_bo_unmap(t->mt->bo);
}
@@ -306,7 +314,7 @@ radeon_map_texture_image(struct gl_context *ctx,
assert(map);
*stride = _mesa_format_row_stride(texImage->TexFormat, width);
- *map = texImage->Data + (slice * height) * *stride;
+ *map = image->base.Data + (slice * height) * *stride;
}
*map += y * *stride + x * texel_size;
@@ -690,26 +698,6 @@ static void teximage_assign_miptree(radeonContextPtr rmesa,
"%s Failed to allocate miptree.\n", __func__);
}
-static GLuint * allocate_image_offsets(struct gl_context *ctx,
- unsigned alignedWidth,
- unsigned height,
- unsigned depth)
-{
- int i;
- GLuint *offsets;
-
- offsets = malloc(depth * sizeof(GLuint)) ;
- if (!offsets) {
- _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTex[Sub]Image");
- return NULL;
- }
-
- for (i = 0; i < depth; ++i) {
- offsets[i] = alignedWidth * height * i;
- }
-
- return offsets;
-}
/**
* Update a subregion of the given texture image.
@@ -728,9 +716,11 @@ static void radeon_store_teximage(struct gl_context* ctx, int dims,
radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
radeonTexObj *t = radeon_tex_obj(texObj);
radeon_texture_image* image = get_radeon_texture_image(texImage);
+ GLuint texel_size = _mesa_get_format_bytes(texImage->TexFormat);
GLuint dstRowStride;
- GLuint *dstImageOffsets;
+ GLuint alignedWidth;
+ GLint i;
radeon_print(RADEON_TEXTURE, RADEON_TRACE,
"%s(%p, tex %p, image %p) compressed %d\n",
@@ -747,16 +737,13 @@ static void radeon_store_teximage(struct gl_context* ctx, int dims,
assert(dstRowStride);
- if (dims == 3) {
- unsigned alignedWidth = dstRowStride/_mesa_get_format_bytes(texImage->TexFormat);
- dstImageOffsets = allocate_image_offsets(ctx, alignedWidth, texImage->Height, texImage->Depth);
- if (!dstImageOffsets) {
- radeon_warning("%s Failed to allocate dstImaeOffset.\n", __func__);
- return;
- }
- } else {
- dstImageOffsets = texImage->ImageOffsets;
+ /* fill in the ImageOffsets array */
+ alignedWidth = dstRowStride / texel_size;
+ for (i = 0; i < texImage->Depth; ++i) {
+ image->base.ImageOffsets[i] = alignedWidth * texImage->Height * i;
}
+ /* and fill in RowStride (in texels) */
+ image->base.RowStride = alignedWidth;
radeon_teximage_map(image, GL_TRUE);
@@ -770,13 +757,13 @@ static void radeon_store_teximage(struct gl_context* ctx, int dims,
dstRowStride = _mesa_format_row_stride(texImage->TexFormat, texImage->Width);
img_start = _mesa_compressed_image_address(xoffset, yoffset, 0,
texImage->TexFormat,
- texImage->Width, texImage->Data);
+ texImage->Width, image->base.Data);
}
else {
uint32_t offset;
- offset = dstRowStride / _mesa_get_format_bytes(texImage->TexFormat) * yoffset / block_height + xoffset / block_width;
- offset *= _mesa_get_format_bytes(texImage->TexFormat);
- img_start = texImage->Data + offset;
+ offset = dstRowStride / texel_size * yoffset / block_height + xoffset / block_width;
+ offset *= texel_size;
+ img_start = image->base.Data + offset;
}
srcRowStride = _mesa_format_row_stride(texImage->TexFormat, width);
bytesPerRow = srcRowStride;
@@ -786,12 +773,11 @@ static void radeon_store_teximage(struct gl_context* ctx, int dims,
}
else {
GLubyte *slices[512];
- GLuint texelBytes = _mesa_get_format_bytes(texImage->TexFormat);
GLuint i;
assert(depth <= 512);
for (i = 0; i < depth; i++) {
- slices[i] = (GLubyte *) texImage->Data
- + dstImageOffsets[i] * texelBytes;
+ slices[i] = (GLubyte *) image->base.Data
+ + image->base.ImageOffsets[i] * texel_size;
}
if (!_mesa_texstore(ctx, dims, texImage->_BaseFormat,
texImage->TexFormat,
@@ -804,10 +790,6 @@ static void radeon_store_teximage(struct gl_context* ctx, int dims,
}
}
- if (dims == 3) {
- free(dstImageOffsets);
- }
-
radeon_teximage_unmap(image);
}
@@ -837,7 +819,6 @@ static void radeon_teximage(
t->validated = GL_FALSE;
- /* Mesa core only clears texImage->Data but not image->mt */
radeonFreeTextureImageBuffer(ctx, texImage);
if (!t->bo) {
@@ -847,11 +828,11 @@ static void radeon_teximage(
texImage->Width,
texImage->Height,
texImage->Depth);
- texImage->Data = _mesa_alloc_texmemory(size);
+ image->base.Data = _mesa_alloc_texmemory(size);
radeon_print(RADEON_TEXTURE, RADEON_VERBOSE,
"%s %dd: texObj %p, texImage %p, "
" no miptree assigned, using local memory %p\n",
- __func__, dims, texObj, texImage, texImage->Data);
+ __func__, dims, texObj, texImage, image->base.Data);
}
}
@@ -867,6 +848,10 @@ static void radeon_teximage(
}
}
+ image->base.ImageOffsets =
+ (GLuint *) malloc(texImage->Depth * sizeof(GLuint));
+
+
/* Upload texture image; note that the spec allows pixels to be NULL */
if (compressed) {
pixels = _mesa_validate_pbo_compressed_teximage(
@@ -1090,7 +1075,7 @@ void radeon_image_target_texture_2d(struct gl_context *ctx, GLenum target,
texImage->Depth = 1;
texImage->_BaseFormat = GL_RGBA;
texImage->TexFormat = image->format;
- texImage->RowStride = image->pitch;
+ radeonImage->base.RowStride = image->pitch;
texImage->InternalFormat = image->internal_format;
if(t->mt)