Mesa (radeon-rewrite): radeon: go back and repick texture formats.

Dave Airlie airlied at kemper.freedesktop.org
Wed Apr 1 06:26:18 UTC 2009


Module: Mesa
Branch: radeon-rewrite
Commit: f9d272fa414ec04d9cc608840436f29e6adf84bc
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=f9d272fa414ec04d9cc608840436f29e6adf84bc

Author: Dave Airlie <airlied at redhat.com>
Date:   Wed Apr  1 16:13:30 2009 +1000

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.

---

 src/mesa/drivers/dri/r200/r200_tex.c          |    2 +-
 src/mesa/drivers/dri/r200/r200_texstate.c     |    2 +-
 src/mesa/drivers/dri/r300/r300_tex.c          |    2 +-
 src/mesa/drivers/dri/r300/r300_texstate.c     |    2 +-
 src/mesa/drivers/dri/radeon/radeon_fbo.c      |  107 ++++++++++++++-----------
 src/mesa/drivers/dri/radeon/radeon_tex.c      |    2 +-
 src/mesa/drivers/dri/radeon/radeon_texstate.c |    2 +-
 src/mesa/drivers/dri/radeon/radeon_texture.c  |   21 ++++--
 src/mesa/drivers/dri/radeon/radeon_texture.h  |    6 +-
 9 files changed, 85 insertions(+), 61 deletions(-)

diff --git a/src/mesa/drivers/dri/r200/r200_tex.c b/src/mesa/drivers/dri/r200/r200_tex.c
index 19a6cad..fc2caab 100644
--- a/src/mesa/drivers/dri/r200/r200_tex.c
+++ b/src/mesa/drivers/dri/r200/r200_tex.c
@@ -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
diff --git a/src/mesa/drivers/dri/r200/r200_texstate.c b/src/mesa/drivers/dri/r200/r200_texstate.c
index 72b7f3d..9797f77 100644
--- a/src/mesa/drivers/dri/r200/r200_texstate.c
+++ b/src/mesa/drivers/dri/r200/r200_texstate.c
@@ -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;
diff --git a/src/mesa/drivers/dri/r300/r300_tex.c b/src/mesa/drivers/dri/r300/r300_tex.c
index 0f5afbf..0cbb2bc 100644
--- a/src/mesa/drivers/dri/r300/r300_tex.c
+++ b/src/mesa/drivers/dri/r300/r300_tex.c
@@ -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;
diff --git a/src/mesa/drivers/dri/r300/r300_texstate.c b/src/mesa/drivers/dri/r300/r300_texstate.c
index 0c6d092..baaca5f 100644
--- a/src/mesa/drivers/dri/r300/r300_texstate.c
+++ b/src/mesa/drivers/dri/r300/r300_texstate.c
@@ -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;
diff --git a/src/mesa/drivers/dri/radeon/radeon_fbo.c b/src/mesa/drivers/dri/radeon/radeon_fbo.c
index d17835b..f62ca7f 100644
--- a/src/mesa/drivers/dri/radeon/radeon_fbo.c
+++ b/src/mesa/drivers/dri/radeon/radeon_fbo.c
@@ -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;
-   }
-
-   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;
+	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);
+
+		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;
 }
 
 
diff --git a/src/mesa/drivers/dri/radeon/radeon_tex.c b/src/mesa/drivers/dri/radeon/radeon_tex.c
index 2dfb504..21509c6 100644
--- a/src/mesa/drivers/dri/radeon/radeon_tex.c
+++ b/src/mesa/drivers/dri/radeon/radeon_tex.c
@@ -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;
diff --git a/src/mesa/drivers/dri/radeon/radeon_texstate.c b/src/mesa/drivers/dri/radeon/radeon_texstate.c
index dab0df0..e4df337 100644
--- a/src/mesa/drivers/dri/radeon/radeon_texstate.c
+++ b/src/mesa/drivers/dri/radeon/radeon_texstate.c
@@ -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;
diff --git a/src/mesa/drivers/dri/radeon/radeon_texture.c b/src/mesa/drivers/dri/radeon/radeon_texture.c
index 21529f6..35ed542 100644
--- a/src/mesa/drivers/dri/radeon/radeon_texture.c
+++ b/src/mesa/drivers/dri/radeon/radeon_texture.c
@@ -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,11 +288,20 @@ 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 =
 	    (rmesa->texture_depth == DRI_CONF_TEXTURE_DEPTH_32);
@@ -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) {
diff --git a/src/mesa/drivers/dri/radeon/radeon_texture.h b/src/mesa/drivers/dri/radeon/radeon_texture.h
index d90fda7..888a55b 100644
--- a/src/mesa/drivers/dri/radeon/radeon_texture.h
+++ b/src/mesa/drivers/dri/radeon/radeon_texture.h
@@ -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,




More information about the mesa-commit mailing list