mesa: temp_texture changes

This commit is contained in:
Brian Paul 2009-09-03 21:47:30 -06:00
parent f477fa7a85
commit b2951ffe96

View file

@ -200,6 +200,7 @@ struct temp_texture
{ {
GLuint TexObj; GLuint TexObj;
GLenum Target; /**< GL_TEXTURE_2D or GL_TEXTURE_RECTANGLE */ GLenum Target; /**< GL_TEXTURE_2D or GL_TEXTURE_RECTANGLE */
GLsizei MinSize; /**< Min texture size to allocate */
GLsizei MaxSize; /**< Max possible texture size */ GLsizei MaxSize; /**< Max possible texture size */
GLboolean NPOT; /**< Non-power of two size OK? */ GLboolean NPOT; /**< Non-power of two size OK? */
GLsizei Width, Height; /**< Current texture size */ GLsizei Width, Height; /**< Current texture size */
@ -718,6 +719,33 @@ _mesa_meta_end(GLcontext *ctx)
} }
/**
* One-time init for a temp_texture object.
* Choose tex target, compute max tex size, etc.
*/
static void
init_temp_texture(GLcontext *ctx, struct temp_texture *tex)
{
/* prefer texture rectangle */
if (ctx->Extensions.NV_texture_rectangle) {
tex->Target = GL_TEXTURE_RECTANGLE;
tex->MaxSize = ctx->Const.MaxTextureRectSize;
tex->NPOT = GL_TRUE;
}
else {
/* use 2D texture, NPOT if possible */
tex->Target = GL_TEXTURE_2D;
tex->MaxSize = 1 << (ctx->Const.MaxTextureLevels - 1);
tex->NPOT = ctx->Extensions.ARB_texture_non_power_of_two;
}
tex->MinSize = 16; /* 16 x 16 at least */
assert(tex->MaxSize > 0);
_mesa_GenTextures(1, &tex->TexObj);
_mesa_BindTexture(tex->Target, tex->TexObj);
}
/** /**
* Return pointer to temp_texture info. This does some one-time init * Return pointer to temp_texture info. This does some one-time init
* if needed. * if needed.
@ -728,24 +756,7 @@ get_temp_texture(GLcontext *ctx)
struct temp_texture *tex = &ctx->Meta->TempTex; struct temp_texture *tex = &ctx->Meta->TempTex;
if (!tex->TexObj) { if (!tex->TexObj) {
/* do one-time init */ init_temp_texture(ctx, tex);
/* prefer texture rectangle */
if (ctx->Extensions.NV_texture_rectangle) {
tex->Target = GL_TEXTURE_RECTANGLE;
tex->MaxSize = ctx->Const.MaxTextureRectSize;
tex->NPOT = GL_TRUE;
}
else {
/* use 2D texture, NPOT if possible */
tex->Target = GL_TEXTURE_2D;
tex->MaxSize = 1 << (ctx->Const.MaxTextureLevels - 1);
tex->NPOT = ctx->Extensions.ARB_texture_non_power_of_two;
}
assert(tex->MaxSize > 0);
_mesa_GenTextures(1, &tex->TexObj);
_mesa_BindTexture(tex->Target, tex->TexObj);
} }
return tex; return tex;
@ -767,6 +778,9 @@ alloc_texture(struct temp_texture *tex,
{ {
GLboolean newTex = GL_FALSE; GLboolean newTex = GL_FALSE;
ASSERT(width <= tex->MaxSize);
ASSERT(height <= tex->MaxSize);
if (width > tex->Width || if (width > tex->Width ||
height > tex->Height || height > tex->Height ||
intFormat != tex->IntFormat) { intFormat != tex->IntFormat) {
@ -774,13 +788,13 @@ alloc_texture(struct temp_texture *tex,
if (tex->NPOT) { if (tex->NPOT) {
/* use non-power of two size */ /* use non-power of two size */
tex->Width = MIN2(64, width); tex->Width = MAX2(tex->MinSize, width);
tex->Height = MIN2(64, height); tex->Height = MAX2(tex->MinSize, height);
} }
else { else {
/* find power of two size */ /* find power of two size */
GLsizei w, h; GLsizei w, h;
w = h = 16; w = h = tex->MinSize;
while (w < width) while (w < width)
w *= 2; w *= 2;
while (h < height) while (h < height)