mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-07 21:40:20 +01:00
intel: Clarify first_level/last_level vs baselevel/maxlevel by deletion.
This has always been ugly about our texture code -- object base/max level vs intel object first/last level vs image level vs miptree first/last level. We now get rid of intelObj->first_level which is just tObj->BaseLevel, and make intelObj->_MaxLevel clearly based off of tObj->_MaxLevel instead of duplicating its code (incorrectly, as image->MaxLog2 only considers width/height and not depth!)
This commit is contained in:
parent
9b7f57b18e
commit
1b18b45d79
7 changed files with 30 additions and 56 deletions
|
|
@ -140,9 +140,9 @@ i830_update_tex_unit(struct intel_context *intel, GLuint unit, GLuint ss3)
|
|||
/* Get first image here, since intelObj->firstLevel will get set in
|
||||
* the intel_finalize_mipmap_tree() call above.
|
||||
*/
|
||||
firstImage = tObj->Image[0][intelObj->firstLevel];
|
||||
firstImage = tObj->Image[0][tObj->BaseLevel];
|
||||
|
||||
intel_miptree_get_image_offset(intelObj->mt, intelObj->firstLevel, 0, 0,
|
||||
intel_miptree_get_image_offset(intelObj->mt, tObj->BaseLevel, 0, 0,
|
||||
&dst_x, &dst_y);
|
||||
|
||||
drm_intel_bo_reference(intelObj->mt->region->buffer);
|
||||
|
|
|
|||
|
|
@ -156,7 +156,7 @@ i915_update_tex_unit(struct intel_context *intel, GLuint unit, GLuint ss3)
|
|||
/* Get first image here, since intelObj->firstLevel will get set in
|
||||
* the intel_finalize_mipmap_tree() call above.
|
||||
*/
|
||||
firstImage = tObj->Image[0][intelObj->firstLevel];
|
||||
firstImage = tObj->Image[0][tObj->BaseLevel];
|
||||
|
||||
drm_intel_bo_reference(intelObj->mt->region->buffer);
|
||||
i915->state.tex_buffer[unit] = intelObj->mt->region->buffer;
|
||||
|
|
|
|||
|
|
@ -63,8 +63,8 @@ static GLboolean do_check_fallback(struct brw_context *brw)
|
|||
for (i = 0; i < BRW_MAX_TEX_UNIT; i++) {
|
||||
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[i];
|
||||
if (texUnit->_ReallyEnabled) {
|
||||
struct intel_texture_object *intelObj = intel_texture_object(texUnit->_Current);
|
||||
struct gl_texture_image *texImage = intelObj->base.Image[0][intelObj->firstLevel];
|
||||
struct gl_texture_object *tex_obj = texUnit->_Current;
|
||||
struct gl_texture_image *texImage = tex_obj->Image[0][tex_obj->BaseLevel];
|
||||
if (texImage->Border) {
|
||||
DBG("FALLBACK: texture border\n");
|
||||
return GL_TRUE;
|
||||
|
|
|
|||
|
|
@ -276,9 +276,8 @@ brw_wm_sampler_populate_key(struct brw_context *brw,
|
|||
struct wm_sampler_entry *entry = &key->sampler[unit];
|
||||
struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
|
||||
struct gl_texture_object *texObj = texUnit->_Current;
|
||||
struct intel_texture_object *intelObj = intel_texture_object(texObj);
|
||||
struct gl_texture_image *firstImage =
|
||||
texObj->Image[0][intelObj->firstLevel];
|
||||
texObj->Image[0][texObj->BaseLevel];
|
||||
|
||||
memset(last_entry_end, 0,
|
||||
(char*)entry - last_entry_end + sizeof(*entry));
|
||||
|
|
|
|||
|
|
@ -163,7 +163,7 @@ brw_update_texture_surface( struct gl_context *ctx, GLuint unit )
|
|||
struct brw_context *brw = brw_context(ctx);
|
||||
struct gl_texture_object *tObj = ctx->Texture.Unit[unit]._Current;
|
||||
struct intel_texture_object *intelObj = intel_texture_object(tObj);
|
||||
struct gl_texture_image *firstImage = tObj->Image[0][intelObj->firstLevel];
|
||||
struct gl_texture_image *firstImage = tObj->Image[0][tObj->BaseLevel];
|
||||
const GLuint surf_index = SURF_INDEX_TEXTURE(unit);
|
||||
struct brw_surface_state surf;
|
||||
void *map;
|
||||
|
|
@ -181,7 +181,7 @@ brw_update_texture_surface( struct gl_context *ctx, GLuint unit )
|
|||
/* surf.ss0.data_return_format = BRW_SURFACERETURNFORMAT_S1; */
|
||||
surf.ss1.base_addr = intelObj->mt->region->buffer->offset; /* reloc */
|
||||
|
||||
surf.ss2.mip_count = intelObj->lastLevel - intelObj->firstLevel;
|
||||
surf.ss2.mip_count = intelObj->_MaxLevel - tObj->BaseLevel;
|
||||
surf.ss2.width = firstImage->Width - 1;
|
||||
surf.ss2.height = firstImage->Height - 1;
|
||||
brw_set_surface_tiling(&surf, intelObj->mt->region->tiling);
|
||||
|
|
|
|||
|
|
@ -32,11 +32,11 @@ struct intel_texture_object
|
|||
{
|
||||
struct gl_texture_object base; /* The "parent" object */
|
||||
|
||||
/* The mipmap tree must include at least these levels once
|
||||
* validated:
|
||||
/* This is a mirror of base._MaxLevel, updated at validate time,
|
||||
* except that we don't bother with the non-base levels for
|
||||
* non-mipmapped textures.
|
||||
*/
|
||||
GLuint firstLevel;
|
||||
GLuint lastLevel;
|
||||
unsigned int _MaxLevel;
|
||||
|
||||
/* Offset for firstLevel image:
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -8,46 +8,21 @@
|
|||
#define FILE_DEBUG_FLAG DEBUG_TEXTURE
|
||||
|
||||
/**
|
||||
* Compute which mipmap levels that really need to be sent to the hardware.
|
||||
* This depends on the base image size, GL_TEXTURE_MIN_LOD,
|
||||
* GL_TEXTURE_MAX_LOD, GL_TEXTURE_BASE_LEVEL, and GL_TEXTURE_MAX_LEVEL.
|
||||
* When validating, we only care about the texture images that could
|
||||
* be seen, so for non-mipmapped modes we want to ignore everything
|
||||
* but BaseLevel.
|
||||
*/
|
||||
static void
|
||||
intel_calculate_first_last_level(struct intel_context *intel,
|
||||
struct intel_texture_object *intelObj)
|
||||
intel_update_max_level(struct intel_context *intel,
|
||||
struct intel_texture_object *intelObj)
|
||||
{
|
||||
struct gl_texture_object *tObj = &intelObj->base;
|
||||
const struct gl_texture_image *const baseImage =
|
||||
tObj->Image[0][tObj->BaseLevel];
|
||||
|
||||
/* These must be signed values. MinLod and MaxLod can be negative numbers,
|
||||
* and having firstLevel and lastLevel as signed prevents the need for
|
||||
* extra sign checks.
|
||||
*/
|
||||
int firstLevel = tObj->BaseLevel;
|
||||
int lastLevel;
|
||||
|
||||
/* Yes, this looks overly complicated, but it's all needed.
|
||||
*/
|
||||
if (tObj->MinFilter == GL_NEAREST || tObj->MinFilter == GL_LINEAR) {
|
||||
/* GL_NEAREST and GL_LINEAR only care about GL_TEXTURE_BASE_LEVEL.
|
||||
*/
|
||||
lastLevel = tObj->BaseLevel;
|
||||
intelObj->_MaxLevel = tObj->BaseLevel;
|
||||
} else {
|
||||
/* Min/max LOD are taken into account in sampler state. We don't
|
||||
* want to re-layout textures just because clamping has been applied
|
||||
* since it means a bunch of blitting around and probably no memory
|
||||
* savings (since we have to keep the other levels around anyway).
|
||||
*/
|
||||
lastLevel = MIN2(tObj->BaseLevel + baseImage->MaxLog2,
|
||||
tObj->MaxLevel);
|
||||
/* need at least one level */
|
||||
lastLevel = MAX2(firstLevel, lastLevel);
|
||||
intelObj->_MaxLevel = tObj->_MaxLevel;
|
||||
}
|
||||
|
||||
/* save these values */
|
||||
intelObj->firstLevel = firstLevel;
|
||||
intelObj->lastLevel = lastLevel;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -109,8 +84,8 @@ intel_finalize_mipmap_tree(struct intel_context *intel, GLuint unit)
|
|||
|
||||
/* What levels must the tree include at a minimum?
|
||||
*/
|
||||
intel_calculate_first_last_level(intel, intelObj);
|
||||
firstImage = intel_texture_image(tObj->Image[0][intelObj->firstLevel]);
|
||||
intel_update_max_level(intel, intelObj);
|
||||
firstImage = intel_texture_image(tObj->Image[0][tObj->BaseLevel]);
|
||||
|
||||
/* Fallback case:
|
||||
*/
|
||||
|
|
@ -129,8 +104,8 @@ intel_finalize_mipmap_tree(struct intel_context *intel, GLuint unit)
|
|||
*/
|
||||
if (firstImage->mt &&
|
||||
firstImage->mt != intelObj->mt &&
|
||||
firstImage->mt->first_level <= intelObj->firstLevel &&
|
||||
firstImage->mt->last_level >= intelObj->lastLevel) {
|
||||
firstImage->mt->first_level <= tObj->BaseLevel &&
|
||||
firstImage->mt->last_level >= intelObj->_MaxLevel) {
|
||||
|
||||
if (intelObj->mt)
|
||||
intel_miptree_release(intel, &intelObj->mt);
|
||||
|
|
@ -157,8 +132,8 @@ intel_finalize_mipmap_tree(struct intel_context *intel, GLuint unit)
|
|||
if (intelObj->mt &&
|
||||
(intelObj->mt->target != intelObj->base.Target ||
|
||||
intelObj->mt->internal_format != firstImage->base.InternalFormat ||
|
||||
intelObj->mt->first_level != intelObj->firstLevel ||
|
||||
intelObj->mt->last_level != intelObj->lastLevel ||
|
||||
intelObj->mt->first_level != tObj->BaseLevel ||
|
||||
intelObj->mt->last_level != intelObj->_MaxLevel ||
|
||||
intelObj->mt->width0 != firstImage->base.Width ||
|
||||
intelObj->mt->height0 != firstImage->base.Height ||
|
||||
intelObj->mt->depth0 != firstImage->base.Depth ||
|
||||
|
|
@ -175,8 +150,8 @@ intel_finalize_mipmap_tree(struct intel_context *intel, GLuint unit)
|
|||
intelObj->base.Target,
|
||||
firstImage->base._BaseFormat,
|
||||
firstImage->base.InternalFormat,
|
||||
intelObj->firstLevel,
|
||||
intelObj->lastLevel,
|
||||
tObj->BaseLevel,
|
||||
intelObj->_MaxLevel,
|
||||
firstImage->base.Width,
|
||||
firstImage->base.Height,
|
||||
firstImage->base.Depth,
|
||||
|
|
@ -189,7 +164,7 @@ intel_finalize_mipmap_tree(struct intel_context *intel, GLuint unit)
|
|||
*/
|
||||
nr_faces = (intelObj->base.Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1;
|
||||
for (face = 0; face < nr_faces; face++) {
|
||||
for (i = intelObj->firstLevel; i <= intelObj->lastLevel; i++) {
|
||||
for (i = tObj->BaseLevel; i <= intelObj->_MaxLevel; i++) {
|
||||
struct intel_texture_image *intelImage =
|
||||
intel_texture_image(intelObj->base.Image[face][i]);
|
||||
|
||||
|
|
@ -263,7 +238,7 @@ intel_tex_map_images(struct intel_context *intel,
|
|||
|
||||
DBG("%s\n", __FUNCTION__);
|
||||
|
||||
for (i = intelObj->firstLevel; i <= intelObj->lastLevel; i++)
|
||||
for (i = intelObj->base.BaseLevel; i <= intelObj->_MaxLevel; i++)
|
||||
intel_tex_map_level_images(intel, intelObj, i);
|
||||
}
|
||||
|
||||
|
|
@ -273,6 +248,6 @@ intel_tex_unmap_images(struct intel_context *intel,
|
|||
{
|
||||
int i;
|
||||
|
||||
for (i = intelObj->firstLevel; i <= intelObj->lastLevel; i++)
|
||||
for (i = intelObj->base.BaseLevel; i <= intelObj->_MaxLevel; i++)
|
||||
intel_tex_unmap_level_images(intel, intelObj, i);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue