mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 11:28:05 +02:00
radeon: go back and repick texture formats.
This might trip up some serious FBO users, will have to see, but it avoids the slow paths for all the demos I have.
This commit is contained in:
parent
6e30fe4873
commit
f9d272fa41
9 changed files with 84 additions and 60 deletions
|
|
@ -493,7 +493,7 @@ void r200InitTextureFuncs( struct dd_function_table *functions )
|
|||
/* Note: we only plug in the functions we implement in the driver
|
||||
* since _mesa_init_driver_functions() was already called.
|
||||
*/
|
||||
functions->ChooseTextureFormat = radeonChooseTextureFormat;
|
||||
functions->ChooseTextureFormat = radeonChooseTextureFormat_mesa;
|
||||
functions->TexImage1D = radeonTexImage1D;
|
||||
functions->TexImage2D = radeonTexImage2D;
|
||||
#if ENABLE_HW_3D_TEXTURE
|
||||
|
|
|
|||
|
|
@ -839,7 +839,7 @@ void r200SetTexBuffer2(__DRIcontext *pDRICtx, GLint target, GLint glx_texture_fo
|
|||
texImage->RowStride = rb->pitch / rb->cpp;
|
||||
texImage->TexFormat = radeonChooseTextureFormat(radeon->glCtx,
|
||||
internalFormat,
|
||||
type, format);
|
||||
type, format, 0);
|
||||
rImage->bo = rb->bo;
|
||||
radeon_bo_ref(rImage->bo);
|
||||
t->bo = rb->bo;
|
||||
|
|
|
|||
|
|
@ -323,7 +323,7 @@ void r300InitTextureFuncs(struct dd_function_table *functions)
|
|||
functions->MapTexture = radeonMapTexture;
|
||||
functions->UnmapTexture = radeonUnmapTexture;
|
||||
|
||||
functions->ChooseTextureFormat = radeonChooseTextureFormat;
|
||||
functions->ChooseTextureFormat = radeonChooseTextureFormat_mesa;
|
||||
functions->TexImage1D = radeonTexImage1D;
|
||||
functions->TexImage2D = radeonTexImage2D;
|
||||
functions->TexImage3D = radeonTexImage3D;
|
||||
|
|
|
|||
|
|
@ -457,7 +457,7 @@ void r300SetTexBuffer2(__DRIcontext *pDRICtx, GLint target, GLint glx_texture_fo
|
|||
texImage->RowStride = rb->pitch / rb->cpp;
|
||||
texImage->TexFormat = radeonChooseTextureFormat(radeon->glCtx,
|
||||
internalFormat,
|
||||
type, format);
|
||||
type, format, 0);
|
||||
rImage->bo = rb->bo;
|
||||
radeon_bo_ref(rImage->bo);
|
||||
t->bo = rb->bo;
|
||||
|
|
|
|||
|
|
@ -382,54 +382,65 @@ static GLboolean
|
|||
radeon_update_wrapper(GLcontext *ctx, struct radeon_renderbuffer *rrb,
|
||||
struct gl_texture_image *texImage)
|
||||
{
|
||||
if (texImage->TexFormat == &_mesa_texformat_argb8888) {
|
||||
rrb->cpp = 4;
|
||||
rrb->base._ActualFormat = GL_RGBA8;
|
||||
rrb->base._BaseFormat = GL_RGBA;
|
||||
rrb->base.DataType = GL_UNSIGNED_BYTE;
|
||||
DBG("Render to RGBA8 texture OK\n");
|
||||
}
|
||||
else if (texImage->TexFormat == &_mesa_texformat_rgb565) {
|
||||
rrb->cpp = 2;
|
||||
rrb->base._ActualFormat = GL_RGB5;
|
||||
rrb->base._BaseFormat = GL_RGB;
|
||||
rrb->base.DataType = GL_UNSIGNED_SHORT;
|
||||
DBG("Render to RGB5 texture OK\n");
|
||||
}
|
||||
else if (texImage->TexFormat == &_mesa_texformat_z16) {
|
||||
rrb->cpp = 2;
|
||||
rrb->base._ActualFormat = GL_DEPTH_COMPONENT16;
|
||||
rrb->base._BaseFormat = GL_DEPTH_COMPONENT;
|
||||
rrb->base.DataType = GL_UNSIGNED_SHORT;
|
||||
DBG("Render to DEPTH16 texture OK\n");
|
||||
}
|
||||
else if (texImage->TexFormat == &_mesa_texformat_s8_z24) {
|
||||
rrb->cpp = 4;
|
||||
rrb->base._ActualFormat = GL_DEPTH24_STENCIL8_EXT;
|
||||
rrb->base._BaseFormat = GL_DEPTH_STENCIL_EXT;
|
||||
rrb->base.DataType = GL_UNSIGNED_INT_24_8_EXT;
|
||||
DBG("Render to DEPTH_STENCIL texture OK\n");
|
||||
}
|
||||
else {
|
||||
DBG("Render to texture BAD FORMAT %d\n",
|
||||
texImage->TexFormat->MesaFormat);
|
||||
return GL_FALSE;
|
||||
}
|
||||
int retry = 0;
|
||||
restart:
|
||||
if (texImage->TexFormat == &_mesa_texformat_argb8888) {
|
||||
rrb->cpp = 4;
|
||||
rrb->base._ActualFormat = GL_RGBA8;
|
||||
rrb->base._BaseFormat = GL_RGBA;
|
||||
rrb->base.DataType = GL_UNSIGNED_BYTE;
|
||||
DBG("Render to RGBA8 texture OK\n");
|
||||
}
|
||||
else if (texImage->TexFormat == &_mesa_texformat_rgb565) {
|
||||
rrb->cpp = 2;
|
||||
rrb->base._ActualFormat = GL_RGB5;
|
||||
rrb->base._BaseFormat = GL_RGB;
|
||||
rrb->base.DataType = GL_UNSIGNED_SHORT;
|
||||
DBG("Render to RGB5 texture OK\n");
|
||||
}
|
||||
else if (texImage->TexFormat == &_mesa_texformat_z16) {
|
||||
rrb->cpp = 2;
|
||||
rrb->base._ActualFormat = GL_DEPTH_COMPONENT16;
|
||||
rrb->base._BaseFormat = GL_DEPTH_COMPONENT;
|
||||
rrb->base.DataType = GL_UNSIGNED_SHORT;
|
||||
DBG("Render to DEPTH16 texture OK\n");
|
||||
}
|
||||
else if (texImage->TexFormat == &_mesa_texformat_s8_z24) {
|
||||
rrb->cpp = 4;
|
||||
rrb->base._ActualFormat = GL_DEPTH24_STENCIL8_EXT;
|
||||
rrb->base._BaseFormat = GL_DEPTH_STENCIL_EXT;
|
||||
rrb->base.DataType = GL_UNSIGNED_INT_24_8_EXT;
|
||||
DBG("Render to DEPTH_STENCIL texture OK\n");
|
||||
}
|
||||
else {
|
||||
/* try redoing the FBO */
|
||||
if (retry == 1) {
|
||||
DBG("Render to texture BAD FORMAT %d\n",
|
||||
texImage->TexFormat->MesaFormat);
|
||||
return GL_FALSE;
|
||||
}
|
||||
texImage->TexFormat = radeonChooseTextureFormat(ctx, texImage->InternalFormat, 0,
|
||||
texImage->TexFormat->DataType,
|
||||
1);
|
||||
|
||||
rrb->pitch = texImage->Width * rrb->cpp;
|
||||
rrb->base.InternalFormat = rrb->base._ActualFormat;
|
||||
rrb->base.Width = texImage->Width;
|
||||
rrb->base.Height = texImage->Height;
|
||||
rrb->base.RedBits = texImage->TexFormat->RedBits;
|
||||
rrb->base.GreenBits = texImage->TexFormat->GreenBits;
|
||||
rrb->base.BlueBits = texImage->TexFormat->BlueBits;
|
||||
rrb->base.AlphaBits = texImage->TexFormat->AlphaBits;
|
||||
rrb->base.DepthBits = texImage->TexFormat->DepthBits;
|
||||
|
||||
rrb->base.Delete = radeon_delete_renderbuffer;
|
||||
rrb->base.AllocStorage = radeon_nop_alloc_storage;
|
||||
|
||||
return GL_TRUE;
|
||||
retry++;
|
||||
goto restart;
|
||||
}
|
||||
|
||||
rrb->pitch = texImage->Width * rrb->cpp;
|
||||
rrb->base.InternalFormat = rrb->base._ActualFormat;
|
||||
rrb->base.Width = texImage->Width;
|
||||
rrb->base.Height = texImage->Height;
|
||||
rrb->base.RedBits = texImage->TexFormat->RedBits;
|
||||
rrb->base.GreenBits = texImage->TexFormat->GreenBits;
|
||||
rrb->base.BlueBits = texImage->TexFormat->BlueBits;
|
||||
rrb->base.AlphaBits = texImage->TexFormat->AlphaBits;
|
||||
rrb->base.DepthBits = texImage->TexFormat->DepthBits;
|
||||
|
||||
rrb->base.Delete = radeon_delete_renderbuffer;
|
||||
rrb->base.AllocStorage = radeon_nop_alloc_storage;
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -447,7 +447,7 @@ radeonNewTextureObject( GLcontext *ctx, GLuint name, GLenum target )
|
|||
|
||||
void radeonInitTextureFuncs( struct dd_function_table *functions )
|
||||
{
|
||||
functions->ChooseTextureFormat = radeonChooseTextureFormat;
|
||||
functions->ChooseTextureFormat = radeonChooseTextureFormat_mesa;
|
||||
functions->TexImage1D = radeonTexImage1D;
|
||||
functions->TexImage2D = radeonTexImage2D;
|
||||
functions->TexSubImage1D = radeonTexSubImage1D;
|
||||
|
|
|
|||
|
|
@ -710,7 +710,7 @@ void radeonSetTexBuffer2(__DRIcontext *pDRICtx, GLint target, GLint glx_texture_
|
|||
texImage->RowStride = rb->pitch / rb->cpp;
|
||||
texImage->TexFormat = radeonChooseTextureFormat(radeon->glCtx,
|
||||
internalFormat,
|
||||
type, format);
|
||||
type, format, 0);
|
||||
rImage->bo = rb->bo;
|
||||
radeon_bo_ref(rImage->bo);
|
||||
t->bo = rb->bo;
|
||||
|
|
|
|||
|
|
@ -257,13 +257,13 @@ void radeonGenerateMipmap(GLcontext* ctx, GLenum target, struct gl_texture_objec
|
|||
/* try to find a format which will only need a memcopy */
|
||||
static const struct gl_texture_format *radeonChoose8888TexFormat(radeonContextPtr rmesa,
|
||||
GLenum srcFormat,
|
||||
GLenum srcType)
|
||||
GLenum srcType, GLboolean fbo)
|
||||
{
|
||||
const GLuint ui = 1;
|
||||
const GLubyte littleEndian = *((const GLubyte *)&ui);
|
||||
|
||||
/* r100 can only do this */
|
||||
if (IS_R100_CLASS(rmesa->radeonScreen))
|
||||
if (IS_R100_CLASS(rmesa->radeonScreen) || fbo)
|
||||
return _dri_texformat_argb8888;
|
||||
|
||||
if ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8) ||
|
||||
|
|
@ -288,10 +288,19 @@ static const struct gl_texture_format *radeonChoose8888TexFormat(radeonContextPt
|
|||
return _dri_texformat_argb8888;
|
||||
}
|
||||
|
||||
const struct gl_texture_format *radeonChooseTextureFormat(GLcontext * ctx,
|
||||
const struct gl_texture_format *radeonChooseTextureFormat_mesa(GLcontext * ctx,
|
||||
GLint internalFormat,
|
||||
GLenum format,
|
||||
GLenum type)
|
||||
{
|
||||
return radeonChooseTextureFormat(ctx, internalFormat, format,
|
||||
type, 0);
|
||||
}
|
||||
|
||||
const struct gl_texture_format *radeonChooseTextureFormat(GLcontext * ctx,
|
||||
GLint internalFormat,
|
||||
GLenum format,
|
||||
GLenum type, GLboolean fbo)
|
||||
{
|
||||
radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
|
||||
const GLboolean do32bpt =
|
||||
|
|
@ -323,7 +332,7 @@ const struct gl_texture_format *radeonChooseTextureFormat(GLcontext * ctx,
|
|||
case GL_UNSIGNED_SHORT_1_5_5_5_REV:
|
||||
return _dri_texformat_argb1555;
|
||||
default:
|
||||
return do32bpt ? radeonChoose8888TexFormat(rmesa, format, type) :
|
||||
return do32bpt ? radeonChoose8888TexFormat(rmesa, format, type, fbo) :
|
||||
_dri_texformat_argb4444;
|
||||
}
|
||||
|
||||
|
|
@ -350,7 +359,7 @@ const struct gl_texture_format *radeonChooseTextureFormat(GLcontext * ctx,
|
|||
case GL_RGBA12:
|
||||
case GL_RGBA16:
|
||||
return !force16bpt ?
|
||||
radeonChoose8888TexFormat(rmesa, format,type) :
|
||||
radeonChoose8888TexFormat(rmesa, format, type, fbo) :
|
||||
_dri_texformat_argb4444;
|
||||
|
||||
case GL_RGBA4:
|
||||
|
|
@ -510,7 +519,7 @@ static void radeon_teximage(
|
|||
}
|
||||
|
||||
/* Choose and fill in the texture format for this image */
|
||||
texImage->TexFormat = radeonChooseTextureFormat(ctx, internalFormat, format, type);
|
||||
texImage->TexFormat = radeonChooseTextureFormat(ctx, internalFormat, format, type, 0);
|
||||
_mesa_set_fetch_functions(texImage, dims);
|
||||
|
||||
if (texImage->TexFormat->TexelBytes == 0) {
|
||||
|
|
|
|||
|
|
@ -40,10 +40,14 @@ void radeonUnmapTexture(GLcontext *ctx, struct gl_texture_object *texObj);
|
|||
void radeonGenerateMipmap(GLcontext* ctx, GLenum target, struct gl_texture_object *texObj);
|
||||
int radeon_validate_texture_miptree(GLcontext * ctx, struct gl_texture_object *texObj);
|
||||
GLuint radeon_face_for_target(GLenum target);
|
||||
const struct gl_texture_format *radeonChooseTextureFormat(GLcontext * ctx,
|
||||
const struct gl_texture_format *radeonChooseTextureFormat_mesa(GLcontext * ctx,
|
||||
GLint internalFormat,
|
||||
GLenum format,
|
||||
GLenum type);
|
||||
const struct gl_texture_format *radeonChooseTextureFormat(GLcontext * ctx,
|
||||
GLint internalFormat,
|
||||
GLenum format,
|
||||
GLenum type, GLboolean fbo);
|
||||
|
||||
void radeonTexImage1D(GLcontext * ctx, GLenum target, GLint level,
|
||||
GLint internalFormat,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue