summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2011-09-29 11:30:18 -0700
committerEric Anholt <[email protected]>2011-10-03 13:29:38 -0700
commitfd99cd0e10849205749aad580fea8c970fb46a31 (patch)
tree1e46fc0564c8f4d958d90a75c173cfd909a5e2a5 /src
parent2e0aefc1b9023a3d4003c1974489252d29b1d65b (diff)
intel: Add a helper function for getting miptree size from a texture image.
With 1D array textures, we no longer agree between the GL information about width/height/depth of a texture and how we lay out a miptree.
Diffstat (limited to 'src')
-rw-r--r--src/mesa/drivers/dri/i965/brw_wm_surface_state.c9
-rw-r--r--src/mesa/drivers/dri/i965/gen7_wm_surface_state.c9
-rw-r--r--src/mesa/drivers/dri/intel/intel_blit.c9
-rw-r--r--src/mesa/drivers/dri/intel/intel_fbo.c14
-rw-r--r--src/mesa/drivers/dri/intel/intel_mipmap_tree.c26
-rw-r--r--src/mesa/drivers/dri/intel/intel_mipmap_tree.h4
-rw-r--r--src/mesa/drivers/dri/intel/intel_tex_image.c28
-rw-r--r--src/mesa/drivers/dri/intel/intel_tex_validate.c16
8 files changed, 80 insertions, 35 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
index aae1eed83f2..452ee4e7926 100644
--- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
+++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c
@@ -231,6 +231,9 @@ brw_update_texture_surface( struct gl_context *ctx, GLuint unit )
struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, unit);
const GLuint surf_index = SURF_INDEX_TEXTURE(unit);
uint32_t *surf;
+ int width, height, depth;
+
+ intel_miptree_get_dimensions_for_image(firstImage, &width, &height, &depth);
surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
6 * 4, 32, &brw->wm.surf_offset[surf_index]);
@@ -247,11 +250,11 @@ brw_update_texture_surface( struct gl_context *ctx, GLuint unit )
surf[1] = intelObj->mt->region->bo->offset; /* reloc */
surf[2] = ((intelObj->_MaxLevel - tObj->BaseLevel) << BRW_SURFACE_LOD_SHIFT |
- (firstImage->Width - 1) << BRW_SURFACE_WIDTH_SHIFT |
- (firstImage->Height - 1) << BRW_SURFACE_HEIGHT_SHIFT);
+ (width - 1) << BRW_SURFACE_WIDTH_SHIFT |
+ (height - 1) << BRW_SURFACE_HEIGHT_SHIFT);
surf[3] = (brw_get_surface_tiling_bits(intelObj->mt->region->tiling) |
- (firstImage->Depth - 1) << BRW_SURFACE_DEPTH_SHIFT |
+ (depth - 1) << BRW_SURFACE_DEPTH_SHIFT |
((intelObj->mt->region->pitch * intelObj->mt->cpp) - 1) <<
BRW_SURFACE_PITCH_SHIFT);
diff --git a/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c b/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c
index b148c53deea..50a3385dcb3 100644
--- a/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c
+++ b/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c
@@ -64,6 +64,9 @@ gen7_update_texture_surface(struct gl_context *ctx, GLuint unit)
struct gl_sampler_object *sampler = _mesa_get_samplerobj(ctx, unit);
const GLuint surf_index = SURF_INDEX_TEXTURE(unit);
struct gen7_surface_state *surf;
+ int width, height, depth;
+
+ intel_miptree_get_dimensions_for_image(firstImage, &width, &height, &depth);
surf = brw_state_batch(brw, AUB_TRACE_SURFACE_STATE,
sizeof(*surf), 32, &brw->wm.surf_offset[surf_index]);
@@ -97,11 +100,11 @@ gen7_update_texture_surface(struct gl_context *ctx, GLuint unit)
surf->ss1.base_addr = intelObj->mt->region->bo->offset; /* reloc */
- surf->ss2.width = firstImage->Width - 1;
- surf->ss2.height = firstImage->Height - 1;
+ surf->ss2.width = width - 1;
+ surf->ss2.height = height - 1;
surf->ss3.pitch = (intelObj->mt->region->pitch * intelObj->mt->cpp) - 1;
- surf->ss3.depth = firstImage->Depth - 1;
+ surf->ss3.depth = depth - 1;
/* ss4: ignored? */
diff --git a/src/mesa/drivers/dri/intel/intel_blit.c b/src/mesa/drivers/dri/intel/intel_blit.c
index f0401b7aa0c..166da2a0900 100644
--- a/src/mesa/drivers/dri/intel/intel_blit.c
+++ b/src/mesa/drivers/dri/intel/intel_blit.c
@@ -525,8 +525,13 @@ intel_set_teximage_alpha_to_one(struct gl_context *ctx,
int pitch, cpp;
drm_intel_bo *aper_array[2];
struct intel_region *region = intel_image->mt->region;
+ int width, height, depth;
BATCH_LOCALS;
+ intel_miptree_get_dimensions_for_image(&intel_image->base.Base,
+ &width, &height, &depth);
+ assert(depth == 1);
+
assert(intel_image->base.Base.TexFormat == MESA_FORMAT_ARGB8888);
/* get dest x/y in destination texture */
@@ -538,8 +543,8 @@ intel_set_teximage_alpha_to_one(struct gl_context *ctx,
x1 = image_x;
y1 = image_y;
- x2 = image_x + intel_image->base.Base.Width;
- y2 = image_y + intel_image->base.Base.Height;
+ x2 = image_x + width;
+ y2 = image_y + height;
pitch = region->pitch;
cpp = region->cpp;
diff --git a/src/mesa/drivers/dri/intel/intel_fbo.c b/src/mesa/drivers/dri/intel/intel_fbo.c
index d87dabb3606..3a503a73155 100644
--- a/src/mesa/drivers/dri/intel/intel_fbo.c
+++ b/src/mesa/drivers/dri/intel/intel_fbo.c
@@ -483,6 +483,7 @@ intel_update_wrapper(struct gl_context *ctx, struct intel_renderbuffer *irb,
{
struct intel_context *intel = intel_context(ctx);
struct intel_texture_image *intel_image = intel_texture_image(texImage);
+ int width, height, depth;
if (!intel_span_supports_format(texImage->TexFormat)) {
DBG("Render to texture BAD FORMAT %s\n",
@@ -492,12 +493,14 @@ intel_update_wrapper(struct gl_context *ctx, struct intel_renderbuffer *irb,
DBG("Render to texture %s\n", _mesa_get_format_name(texImage->TexFormat));
}
+ intel_miptree_get_dimensions_for_image(texImage, &width, &height, &depth);
+
irb->Base.Format = texImage->TexFormat;
irb->Base.DataType = intel_mesa_format_to_rb_datatype(texImage->TexFormat);
irb->Base.InternalFormat = texImage->InternalFormat;
irb->Base._BaseFormat = _mesa_base_tex_format(ctx, irb->Base.InternalFormat);
- irb->Base.Width = texImage->Width;
- irb->Base.Height = texImage->Height;
+ irb->Base.Width = width;
+ irb->Base.Height = height;
irb->Base.Delete = intel_delete_renderbuffer;
irb->Base.AllocStorage = intel_nop_alloc_storage;
@@ -730,14 +733,15 @@ intel_render_texture(struct gl_context * ctx,
*/
struct intel_context *intel = intel_context(ctx);
struct intel_mipmap_tree *new_mt;
+ int width, height, depth;
+
+ intel_miptree_get_dimensions_for_image(image, &width, &height, &depth);
new_mt = intel_miptree_create(intel, image->TexObject->Target,
intel_image->base.Base.TexFormat,
intel_image->base.Base.Level,
intel_image->base.Base.Level,
- intel_image->base.Base.Width,
- intel_image->base.Base.Height,
- intel_image->base.Base.Depth,
+ width, height, depth,
GL_TRUE);
intel_miptree_copy_teximage(intel, intel_image, new_mt);
diff --git a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c
index 553a21e817c..683dfb9a045 100644
--- a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c
+++ b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c
@@ -214,6 +214,23 @@ intel_miptree_release(struct intel_mipmap_tree **mt)
*mt = NULL;
}
+void
+intel_miptree_get_dimensions_for_image(struct gl_texture_image *image,
+ int *width, int *height, int *depth)
+{
+ switch (image->TexObject->Target) {
+ case GL_TEXTURE_1D_ARRAY:
+ *width = image->Width;
+ *height = 1;
+ *depth = image->Height;
+ break;
+ default:
+ *width = image->Width;
+ *height = image->Height;
+ *depth = image->Depth;
+ break;
+ }
+}
/**
* Can the image be pulled into a unified mipmap tree? This mirrors
@@ -227,6 +244,7 @@ intel_miptree_match_image(struct intel_mipmap_tree *mt,
{
struct intel_texture_image *intelImage = intel_texture_image(image);
GLuint level = intelImage->base.Base.Level;
+ int width, height, depth;
/* Images with borders are never pulled into mipmap trees. */
if (image->Border)
@@ -235,13 +253,15 @@ intel_miptree_match_image(struct intel_mipmap_tree *mt,
if (image->TexFormat != mt->format)
return GL_FALSE;
+ intel_miptree_get_dimensions_for_image(image, &width, &height, &depth);
+
/* Test image dimensions against the base level image adjusted for
* minification. This will also catch images not present in the
* tree, changed targets, etc.
*/
- if (image->Width != mt->level[level].width ||
- image->Height != mt->level[level].height ||
- image->Depth != mt->level[level].depth)
+ if (width != mt->level[level].width ||
+ height != mt->level[level].height ||
+ depth != mt->level[level].depth)
return GL_FALSE;
return GL_TRUE;
diff --git a/src/mesa/drivers/dri/intel/intel_mipmap_tree.h b/src/mesa/drivers/dri/intel/intel_mipmap_tree.h
index 7c0a3e3caad..22295aae3b8 100644
--- a/src/mesa/drivers/dri/intel/intel_mipmap_tree.h
+++ b/src/mesa/drivers/dri/intel/intel_mipmap_tree.h
@@ -171,6 +171,10 @@ intel_miptree_get_image_offset(struct intel_mipmap_tree *mt,
GLuint level, GLuint face, GLuint depth,
GLuint *x, GLuint *y);
+void
+intel_miptree_get_dimensions_for_image(struct gl_texture_image *image,
+ int *width, int *height, int *depth);
+
void intel_miptree_set_level_info(struct intel_mipmap_tree *mt,
GLuint level,
GLuint nr_images,
diff --git a/src/mesa/drivers/dri/intel/intel_tex_image.c b/src/mesa/drivers/dri/intel/intel_tex_image.c
index 706ec3e37a9..6c6e8a7ae43 100644
--- a/src/mesa/drivers/dri/intel/intel_tex_image.c
+++ b/src/mesa/drivers/dri/intel/intel_tex_image.c
@@ -53,22 +53,21 @@ intel_miptree_create_for_teximage(struct intel_context *intel,
{
GLuint firstLevel;
GLuint lastLevel;
- GLuint width = intelImage->base.Base.Width;
- GLuint height = intelImage->base.Base.Height;
- GLuint depth = intelImage->base.Base.Depth;
+ int width, height, depth;
GLuint i;
+ intel_miptree_get_dimensions_for_image(&intelImage->base.Base,
+ &width, &height, &depth);
+
DBG("%s\n", __FUNCTION__);
if (intelImage->base.Base.Border)
return NULL;
if (intelImage->base.Base.Level > intelObj->base.BaseLevel &&
- (intelImage->base.Base.Width == 1 ||
- (intelObj->base.Target != GL_TEXTURE_1D &&
- intelImage->base.Base.Height == 1) ||
- (intelObj->base.Target == GL_TEXTURE_3D &&
- intelImage->base.Base.Depth == 1))) {
+ (width == 1 ||
+ (intelObj->base.Target != GL_TEXTURE_1D && height == 1) ||
+ (intelObj->base.Target == GL_TEXTURE_3D && depth == 1))) {
/* For this combination, we're at some lower mipmap level and
* some important dimension is 1. We can't extrapolate up to a
* likely base level width/height/depth for a full mipmap stack
@@ -231,9 +230,10 @@ intel_tex_image_s8z24_scattergather(struct intel_context *intel,
struct gl_context *ctx = &intel->ctx;
struct gl_renderbuffer *depth_rb = intel_image->depth_rb;
struct gl_renderbuffer *stencil_rb = intel_image->stencil_rb;
+ int w, h, d;
- int w = intel_image->base.Base.Width;
- int h = intel_image->base.Base.Height;
+ intel_miptree_get_dimensions_for_image(&intel_image->base.Base, &w, &h, &d);
+ assert(d == 1); /* FINISHME */
uint32_t depth_row[w];
uint8_t stencil_row[w];
@@ -292,15 +292,17 @@ intel_tex_image_s8z24_create_renderbuffers(struct intel_context *intel,
struct intel_texture_image *image)
{
struct gl_context *ctx = &intel->ctx;
-
bool ok = true;
- int width = image->base.Base.Width;
- int height = image->base.Base.Height;
+ int width, height, depth;
struct gl_renderbuffer *drb;
struct gl_renderbuffer *srb;
struct intel_renderbuffer *idrb;
struct intel_renderbuffer *isrb;
+ intel_miptree_get_dimensions_for_image(&image->base.Base,
+ &width, &height, &depth);
+ assert(depth == 1); /* FINISHME */
+
assert(intel->has_separate_stencil);
assert(image->base.Base.TexFormat == MESA_FORMAT_S8_Z24);
assert(image->mt != NULL);
diff --git a/src/mesa/drivers/dri/intel/intel_tex_validate.c b/src/mesa/drivers/dri/intel/intel_tex_validate.c
index a2299ee14d1..c06279ce25e 100644
--- a/src/mesa/drivers/dri/intel/intel_tex_validate.c
+++ b/src/mesa/drivers/dri/intel/intel_tex_validate.c
@@ -41,6 +41,7 @@ intel_finalize_mipmap_tree(struct intel_context *intel, GLuint unit)
GLuint face, i;
GLuint nr_faces = 0;
struct intel_texture_image *firstImage;
+ int width, height, depth;
/* We know/require this is true by now:
*/
@@ -58,6 +59,9 @@ intel_finalize_mipmap_tree(struct intel_context *intel, GLuint unit)
return GL_FALSE;
}
+ intel_miptree_get_dimensions_for_image(&firstImage->base.Base,
+ &width, &height, &depth);
+
/* Check tree can hold all active levels. Check tree matches
* target, imageFormat, etc.
*
@@ -71,9 +75,9 @@ intel_finalize_mipmap_tree(struct intel_context *intel, GLuint unit)
intelObj->mt->format != firstImage->base.Base.TexFormat ||
intelObj->mt->first_level != tObj->BaseLevel ||
intelObj->mt->last_level < intelObj->_MaxLevel ||
- intelObj->mt->width0 != firstImage->base.Base.Width ||
- intelObj->mt->height0 != firstImage->base.Base.Height ||
- intelObj->mt->depth0 != firstImage->base.Base.Depth)) {
+ intelObj->mt->width0 != width ||
+ intelObj->mt->height0 != height ||
+ intelObj->mt->depth0 != depth)) {
intel_miptree_release(&intelObj->mt);
}
@@ -86,9 +90,9 @@ intel_finalize_mipmap_tree(struct intel_context *intel, GLuint unit)
firstImage->base.Base.TexFormat,
tObj->BaseLevel,
intelObj->_MaxLevel,
- firstImage->base.Base.Width,
- firstImage->base.Base.Height,
- firstImage->base.Base.Depth,
+ width,
+ height,
+ depth,
GL_TRUE);
if (!intelObj->mt)
return GL_FALSE;