Browse Source

r600: align for mipmap tree changes

tags/mesa_7_7_rc1
Maciej Cencora 16 years ago
parent
commit
7118db8700

+ 3
- 14
src/mesa/drivers/dri/r600/r600_tex.c View File

case GL_TEXTURE_MAX_LEVEL: case GL_TEXTURE_MAX_LEVEL:
case GL_TEXTURE_MIN_LOD: case GL_TEXTURE_MIN_LOD:
case GL_TEXTURE_MAX_LOD: case GL_TEXTURE_MAX_LOD:
/* This isn't the most efficient solution but there doesn't appear to
* be a nice alternative. Since there's no LOD clamping,
* we just have to rely on loading the right subset of mipmap levels
* to simulate a clamped LOD.
*/
if (t->mt) {
radeon_miptree_unreference(t->mt);
t->mt = 0;
t->validated = GL_FALSE;
}
t->validated = GL_FALSE;
break; break;


case GL_DEPTH_TEXTURE_MODE: case GL_DEPTH_TEXTURE_MODE:
t->bo = NULL; t->bo = NULL;
} }


if (t->mt) {
radeon_miptree_unreference(t->mt);
t->mt = 0;
}
radeon_miptree_unreference(&t->mt);

_mesa_delete_texture_object(ctx, texObj); _mesa_delete_texture_object(ctx, texObj);
} }



+ 14
- 23
src/mesa/drivers/dri/r600/r600_texstate.c View File

{ {
radeonTexObj *t = radeon_tex_obj(texObj); radeonTexObj *t = radeon_tex_obj(texObj);
const struct gl_texture_image *firstImage; const struct gl_texture_image *firstImage;
int firstlevel = t->mt ? t->mt->firstLevel : 0;
GLuint uTexelPitch, row_align; GLuint uTexelPitch, row_align;


if (rmesa->radeon.radeonScreen->driScreen->dri2.enabled && if (rmesa->radeon.radeonScreen->driScreen->dri2.enabled &&
t->bo) t->bo)
return; return;


firstImage = t->base.Image[0][firstlevel];
firstImage = t->base.Image[0][t->minLod];


if (!t->image_override) { if (!t->image_override) {
if (!r600GetTexFormat(texObj, firstImage->TexFormat)) { if (!r600GetTexFormat(texObj, firstImage->TexFormat)) {
} }


row_align = rmesa->radeon.texture_row_align - 1; row_align = rmesa->radeon.texture_row_align - 1;
uTexelPitch = ((firstImage->Width * t->mt->bpp + row_align) & ~row_align) / t->mt->bpp;
uTexelPitch = (_mesa_format_row_stride(firstImage->TexFormat, firstImage->Width) + row_align) & ~row_align;
uTexelPitch = uTexelPitch / _mesa_get_format_bytes(firstImage->TexFormat);
uTexelPitch = (uTexelPitch + R700_TEXEL_PITCH_ALIGNMENT_MASK) uTexelPitch = (uTexelPitch + R700_TEXEL_PITCH_ALIGNMENT_MASK)
& ~R700_TEXEL_PITCH_ALIGNMENT_MASK; & ~R700_TEXEL_PITCH_ALIGNMENT_MASK;


SETfield(t->SQ_TEX_RESOURCE1, firstImage->Height - 1, SETfield(t->SQ_TEX_RESOURCE1, firstImage->Height - 1,
TEX_HEIGHT_shift, TEX_HEIGHT_mask); TEX_HEIGHT_shift, TEX_HEIGHT_mask);


if ((t->mt->lastLevel - t->mt->firstLevel) > 0) {
t->SQ_TEX_RESOURCE3 = t->mt->levels[0].size / 256;
SETfield(t->SQ_TEX_RESOURCE4, t->mt->firstLevel, BASE_LEVEL_shift, BASE_LEVEL_mask);
SETfield(t->SQ_TEX_RESOURCE5, t->mt->lastLevel, LAST_LEVEL_shift, LAST_LEVEL_mask);
if ((t->maxLod - t->minLod) > 0) {
t->SQ_TEX_RESOURCE3 = t->mt->levels[t->minLod].size / 256;
SETfield(t->SQ_TEX_RESOURCE4, 0, BASE_LEVEL_shift, BASE_LEVEL_mask);
SETfield(t->SQ_TEX_RESOURCE5, t->maxLod - t->minLod, LAST_LEVEL_shift, LAST_LEVEL_mask);
} }
} }


struct gl_texture_object *tObj = struct gl_texture_object *tObj =
_mesa_lookup_texture(rmesa->radeon.glCtx, texname); _mesa_lookup_texture(rmesa->radeon.glCtx, texname);
radeonTexObjPtr t = radeon_tex_obj(tObj); radeonTexObjPtr t = radeon_tex_obj(tObj);
int firstlevel = t->mt ? t->mt->firstLevel : 0;
const struct gl_texture_image *firstImage; const struct gl_texture_image *firstImage;
uint32_t pitch_val, size, row_align, bpp;
uint32_t pitch_val, size, row_align;


if (!tObj) if (!tObj)
return; return;
if (!offset) if (!offset)
return; return;


bpp = depth / 8;
if (bpp == 3)
bpp = 4;

firstImage = t->base.Image[0][firstlevel];
firstImage = t->base.Image[0][t->minLod];
row_align = rmesa->radeon.texture_row_align - 1; row_align = rmesa->radeon.texture_row_align - 1;
size = ((firstImage->Width * bpp + row_align) & ~row_align) * firstImage->Height;
size = ((_mesa_format_row_stride(firstImage->TexFormat, firstImage->Width) + row_align) & ~row_align) * firstImage->Height;
if (t->bo) { if (t->bo) {
radeon_bo_unref(t->bo); radeon_bo_unref(t->bo);
t->bo = NULL; t->bo = NULL;
radeon_bo_unref(rImage->bo); radeon_bo_unref(rImage->bo);
rImage->bo = NULL; rImage->bo = NULL;
} }
if (t->mt) {
radeon_miptree_unreference(t->mt);
t->mt = NULL;
}
if (rImage->mt) {
radeon_miptree_unreference(rImage->mt);
rImage->mt = NULL;
}

radeon_miptree_unreference(&t->mt);
radeon_miptree_unreference(&rImage->mt);

_mesa_init_teximage_fields(radeon->glCtx, target, texImage, _mesa_init_teximage_fields(radeon->glCtx, target, texImage,
rb->base.Width, rb->base.Height, 1, 0, rb->cpp); rb->base.Width, rb->base.Height, 1, 0, rb->cpp);
texImage->RowStride = rb->pitch / rb->cpp; texImage->RowStride = rb->pitch / rb->cpp;

+ 7
- 3
src/mesa/drivers/dri/r600/r700_chip.c View File

for (i = 0; i < R700_TEXTURE_NUMBERUNITS; i++) { for (i = 0; i < R700_TEXTURE_NUMBERUNITS; i++) {
if (ctx->Texture.Unit[i]._ReallyEnabled) { if (ctx->Texture.Unit[i]._ReallyEnabled) {
radeonTexObj *t = r700->textures[i]; radeonTexObj *t = r700->textures[i];
uint32_t offset;
if (t) { if (t) {
if (!t->image_override)
if (!t->image_override) {
bo = t->mt->bo; bo = t->mt->bo;
else
offset = get_base_teximage_offset(t);
} else {
bo = t->bo; bo = t->bo;
offset = 0;
}
if (bo) { if (bo) {


r700SyncSurf(context, bo, r700SyncSurf(context, bo,
R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE6); R600_OUT_BATCH(r700->textures[i]->SQ_TEX_RESOURCE6);
R600_OUT_BATCH_RELOC(r700->textures[i]->SQ_TEX_RESOURCE2, R600_OUT_BATCH_RELOC(r700->textures[i]->SQ_TEX_RESOURCE2,
bo, bo,
0,
offset,
RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0); RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0, 0);
R600_OUT_BATCH_RELOC(r700->textures[i]->SQ_TEX_RESOURCE3, R600_OUT_BATCH_RELOC(r700->textures[i]->SQ_TEX_RESOURCE3,
bo, bo,

Loading…
Cancel
Save