diff -u mesa-7.3/debian/changelog mesa-7.3/debian/changelog --- mesa-7.3/debian/changelog +++ mesa-7.3/debian/changelog @@ -1,3 +1,11 @@ +mesa (7.3-1ubuntu4) jaunty; urgency=low + + * Add 104_fix_dri2_with_GL_RGB.diff from upstream: + Fix DRI2 accelerated EXT_texture_from_pixmap with GL_RGB format. + (LP: #324854) + + -- Tormod Volden Tue, 24 Mar 2009 21:58:46 +0100 + mesa (7.3-1ubuntu3) jaunty; urgency=low * Add 103_rs600_support.patch: Adds support for the RS600 chip and sets diff -u mesa-7.3/debian/patches/series mesa-7.3/debian/patches/series --- mesa-7.3/debian/patches/series +++ mesa-7.3/debian/patches/series @@ -6,0 +7 @@ +104_fix_dri2_with_GL_RGB.diff only in patch2: unchanged: --- mesa-7.3.orig/debian/patches/104_fix_dri2_with_GL_RGB.diff +++ mesa-7.3/debian/patches/104_fix_dri2_with_GL_RGB.diff @@ -0,0 +1,342 @@ +# +# Ubuntu: https://bugs.launchpad.net/bugs/324854 +# Patch: http://cgit.freedesktop.org/mesa/mesa/patch/?id=66175aac7609ad314f25fbdff0d3958af310dc24 +# + +Index: mesa-7.3/include/GL/internal/dri_interface.h +=================================================================== +--- mesa-7.3.orig/include/GL/internal/dri_interface.h 2009-03-24 21:56:37.000000000 +0100 ++++ mesa-7.3/include/GL/internal/dri_interface.h 2009-03-24 21:56:48.000000000 +0100 +@@ -230,7 +230,7 @@ + + + #define __DRI_TEX_BUFFER "DRI_TexBuffer" +-#define __DRI_TEX_BUFFER_VERSION 1 ++#define __DRI_TEX_BUFFER_VERSION 2 + struct __DRItexBufferExtensionRec { + __DRIextension base; + +@@ -238,11 +238,23 @@ + * Method to override base texture image with the contents of a + * __DRIdrawable. + * +- * For GLX_EXT_texture_from_pixmap with AIGLX. ++ * For GLX_EXT_texture_from_pixmap with AIGLX. Deprecated in favor of ++ * setTexBuffer2 in version 2 of this interface + */ + void (*setTexBuffer)(__DRIcontext *pDRICtx, + GLint target, + __DRIdrawable *pDraw); ++ ++ /** ++ * Method to override base texture image with the contents of a ++ * __DRIdrawable, including the required texture format attribute. ++ * ++ * For GLX_EXT_texture_from_pixmap with AIGLX. ++ */ ++ void (*setTexBuffer2)(__DRIcontext *pDRICtx, ++ GLint target, ++ GLint format, ++ __DRIdrawable *pDraw); + }; + + +Index: mesa-7.3/include/GL/internal/glcore.h +=================================================================== +--- mesa-7.3.orig/include/GL/internal/glcore.h 2009-03-24 21:56:37.000000000 +0100 ++++ mesa-7.3/include/GL/internal/glcore.h 2009-03-24 21:56:48.000000000 +0100 +@@ -176,4 +176,8 @@ + #define GLX_TEXTURE_2D_BIT_EXT 0x00000002 + #define GLX_TEXTURE_RECTANGLE_BIT_EXT 0x00000004 + ++#define GLX_TEXTURE_FORMAT_NONE_EXT 0x20D8 ++#define GLX_TEXTURE_FORMAT_RGB_EXT 0x20D9 ++#define GLX_TEXTURE_FORMAT_RGBA_EXT 0x20DA ++ + #endif /* __gl_core_h_ */ +Index: mesa-7.3/src/glx/x11/glx_pbuffer.c +=================================================================== +--- mesa-7.3.orig/src/glx/x11/glx_pbuffer.c 2009-03-24 21:56:37.000000000 +0100 ++++ mesa-7.3/src/glx/x11/glx_pbuffer.c 2009-03-24 21:56:48.000000000 +0100 +@@ -189,6 +189,21 @@ + + return target; + } ++ ++ ++static GLenum ++determineTextureFormat(const int *attribs, int numAttribs) ++{ ++ GLenum target = 0; ++ int i; ++ ++ for (i = 0; i < numAttribs; i++) { ++ if (attribs[2 * i] == GLX_TEXTURE_FORMAT_EXT) ++ return attribs[2 * i + 1]; ++ } ++ ++ return 0; ++} + #endif + + /** +@@ -294,6 +309,9 @@ + if (pdraw != NULL && !pdraw->textureTarget) + pdraw->textureTarget = + determineTextureTarget((const int *) data, num_attributes); ++ if (pdraw != NULL && !pdraw->textureFormat) ++ pdraw->textureFormat = ++ determineTextureFormat((const int *) data, num_attributes); + } + #endif + +@@ -374,6 +392,7 @@ + } + + pdraw->textureTarget = determineTextureTarget(attrib_list, i); ++ pdraw->textureFormat = determineTextureFormat(attrib_list, i); + } while (0); + #endif + +Index: mesa-7.3/src/glx/x11/glxclient.h +=================================================================== +--- mesa-7.3.orig/src/glx/x11/glxclient.h 2009-03-24 21:56:37.000000000 +0100 ++++ mesa-7.3/src/glx/x11/glxclient.h 2009-03-24 21:56:48.000000000 +0100 +@@ -159,6 +159,7 @@ + __GLXscreenConfigs *psc; + GLenum textureTarget; + __DRIdrawable *driDrawable; ++ GLenum textureFormat; /* EXT_texture_from_pixmap support */ + }; + + /* +Index: mesa-7.3/src/glx/x11/glxcmds.c +=================================================================== +--- mesa-7.3.orig/src/glx/x11/glxcmds.c 2009-03-24 21:56:37.000000000 +0100 ++++ mesa-7.3/src/glx/x11/glxcmds.c 2009-03-24 21:56:48.000000000 +0100 +@@ -2619,11 +2619,19 @@ + if (gc->driContext) { + __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable, NULL); + +- if (pdraw != NULL) +- (*pdraw->psc->texBuffer->setTexBuffer)(gc->__driContext, +- pdraw->textureTarget, +- pdraw->driDrawable); +- ++ if (pdraw != NULL) { ++ if (pdraw->psc->texBuffer->base.version >= 2 && ++ pdraw->psc->texBuffer->setTexBuffer2 != NULL) { ++ (*pdraw->psc->texBuffer->setTexBuffer2)(gc->__driContext, ++ pdraw->textureTarget, ++ pdraw->textureFormat, ++ pdraw->driDrawable); ++ } else { ++ (*pdraw->psc->texBuffer->setTexBuffer)(gc->__driContext, ++ pdraw->textureTarget, ++ pdraw->driDrawable); ++ } ++ } + return; + } + #endif +Index: mesa-7.3/src/mesa/drivers/dri/i915/i830_texstate.c +=================================================================== +--- mesa-7.3.orig/src/mesa/drivers/dri/i915/i830_texstate.c 2009-03-24 21:56:37.000000000 +0100 ++++ mesa-7.3/src/mesa/drivers/dri/i915/i830_texstate.c 2009-03-24 21:56:48.000000000 +0100 +@@ -38,7 +38,7 @@ + + + static GLuint +-translate_texture_format(GLuint mesa_format) ++translate_texture_format(GLuint mesa_format, GLuint internal_format) + { + switch (mesa_format) { + case MESA_FORMAT_L8: +@@ -56,7 +56,10 @@ + case MESA_FORMAT_ARGB4444: + return MAPSURF_16BIT | MT_16BIT_ARGB4444; + case MESA_FORMAT_ARGB8888: +- return MAPSURF_32BIT | MT_32BIT_ARGB8888; ++ if (internal_format == GL_RGB) ++ return MAPSURF_32BIT | MT_32BIT_XRGB8888; ++ else ++ return MAPSURF_32BIT | MT_32BIT_ARGB8888; + case MESA_FORMAT_YCBCR_REV: + return (MAPSURF_422 | MT_422_YCRCB_NORMAL); + case MESA_FORMAT_YCBCR: +@@ -162,7 +165,8 @@ + 0, intelObj-> + firstLevel); + +- format = translate_texture_format(firstImage->TexFormat->MesaFormat); ++ format = translate_texture_format(firstImage->TexFormat->MesaFormat, ++ firstImage->InternalFormat); + pitch = intelObj->mt->pitch * intelObj->mt->cpp; + } + +Index: mesa-7.3/src/mesa/drivers/dri/i915/i915_texstate.c +=================================================================== +--- mesa-7.3.orig/src/mesa/drivers/dri/i915/i915_texstate.c 2009-03-24 21:56:37.000000000 +0100 ++++ mesa-7.3/src/mesa/drivers/dri/i915/i915_texstate.c 2009-03-24 21:56:48.000000000 +0100 +@@ -37,7 +37,8 @@ + + + static GLuint +-translate_texture_format(GLuint mesa_format, GLenum DepthMode) ++translate_texture_format(GLuint mesa_format, GLuint internal_format, ++ GLenum DepthMode) + { + switch (mesa_format) { + case MESA_FORMAT_L8: +@@ -55,7 +56,10 @@ + case MESA_FORMAT_ARGB4444: + return MAPSURF_16BIT | MT_16BIT_ARGB4444; + case MESA_FORMAT_ARGB8888: +- return MAPSURF_32BIT | MT_32BIT_ARGB8888; ++ if (internal_format == GL_RGB) ++ return MAPSURF_32BIT | MT_32BIT_XRGB8888; ++ else ++ return MAPSURF_32BIT | MT_32BIT_ARGB8888; + case MESA_FORMAT_YCBCR_REV: + return (MAPSURF_422 | MT_422_YCRCB_NORMAL); + case MESA_FORMAT_YCBCR: +@@ -173,7 +177,8 @@ + firstLevel); + + format = translate_texture_format(firstImage->TexFormat->MesaFormat, +- tObj->DepthMode); ++ firstImage->InternalFormat, ++ tObj->DepthMode); + pitch = intelObj->mt->pitch * intelObj->mt->cpp; + } + +Index: mesa-7.3/src/mesa/drivers/dri/i965/brw_wm_surface_state.c +=================================================================== +--- mesa-7.3.orig/src/mesa/drivers/dri/i965/brw_wm_surface_state.c 2009-03-24 21:56:37.000000000 +0100 ++++ mesa-7.3/src/mesa/drivers/dri/i965/brw_wm_surface_state.c 2009-03-24 21:56:48.000000000 +0100 +@@ -69,7 +69,8 @@ + } + + +-static GLuint translate_tex_format( GLuint mesa_format, GLenum depth_mode ) ++static GLuint translate_tex_format( GLuint mesa_format, GLenum internal_format, ++ GLenum depth_mode ) + { + switch( mesa_format ) { + case MESA_FORMAT_L8: +@@ -89,10 +90,16 @@ + return BRW_SURFACEFORMAT_R8G8B8_UNORM; + + case MESA_FORMAT_ARGB8888: +- return BRW_SURFACEFORMAT_B8G8R8A8_UNORM; ++ if (internal_format == GL_RGB) ++ return BRW_SURFACEFORMAT_B8G8R8X8_UNORM; ++ else ++ return BRW_SURFACEFORMAT_B8G8R8A8_UNORM; + + case MESA_FORMAT_RGBA8888_REV: +- return BRW_SURFACEFORMAT_R8G8B8A8_UNORM; ++ if (internal_format == GL_RGB) ++ return BRW_SURFACEFORMAT_R8G8B8X8_UNORM; ++ else ++ return BRW_SURFACEFORMAT_R8G8B8A8_UNORM; + + case MESA_FORMAT_RGB565: + return BRW_SURFACEFORMAT_B5G6R5_UNORM; +@@ -150,7 +157,7 @@ + struct brw_wm_surface_key { + GLenum target, depthmode; + dri_bo *bo; +- GLint format; ++ GLint format, internal_format; + GLint first_level, last_level; + GLint width, height, depth; + GLint pitch, cpp; +@@ -188,9 +195,11 @@ + + surf.ss0.mipmap_layout_mode = BRW_SURFACE_MIPMAPLAYOUT_BELOW; + surf.ss0.surface_type = translate_tex_target(key->target); +- +- if (key->bo) +- surf.ss0.surface_format = translate_tex_format(key->format, key->depthmode); ++ if (key->bo) { ++ surf.ss0.surface_format = translate_tex_format(key->format, ++ key->internal_format, ++ key->depthmode); ++ } + else { + switch (key->depth) { + case 32: +@@ -267,6 +276,7 @@ + key.offset = intelObj->textureOffset; + } else { + key.format = firstImage->TexFormat->MesaFormat; ++ key.internal_format = firstImage->InternalFormat; + key.pitch = intelObj->mt->pitch; + key.depth = firstImage->Depth; + key.bo = intelObj->mt->region->buffer; +Index: mesa-7.3/src/mesa/drivers/dri/intel/intel_screen.c +=================================================================== +--- mesa-7.3.orig/src/mesa/drivers/dri/intel/intel_screen.c 2009-03-24 21:56:37.000000000 +0100 ++++ mesa-7.3/src/mesa/drivers/dri/intel/intel_screen.c 2009-03-24 21:56:48.000000000 +0100 +@@ -209,6 +209,7 @@ + static const __DRItexBufferExtension intelTexBufferExtension = { + { __DRI_TEX_BUFFER, __DRI_TEX_BUFFER_VERSION }, + intelSetTexBuffer, ++ intelSetTexBuffer2, + }; + + static const __DRIextension *intelScreenExtensions[] = { +Index: mesa-7.3/src/mesa/drivers/dri/intel/intel_tex.h +=================================================================== +--- mesa-7.3.orig/src/mesa/drivers/dri/intel/intel_tex.h 2009-03-24 21:56:37.000000000 +0100 ++++ mesa-7.3/src/mesa/drivers/dri/intel/intel_tex.h 2009-03-24 21:56:48.000000000 +0100 +@@ -149,6 +149,8 @@ + unsigned long long offset, GLint depth, GLuint pitch); + void intelSetTexBuffer(__DRIcontext *pDRICtx, + GLint target, __DRIdrawable *pDraw); ++void intelSetTexBuffer2(__DRIcontext *pDRICtx, ++ GLint target, GLint format, __DRIdrawable *pDraw); + + GLuint intel_finalize_mipmap_tree(struct intel_context *intel, GLuint unit); + +Index: mesa-7.3/src/mesa/drivers/dri/intel/intel_tex_image.c +=================================================================== +--- mesa-7.3.orig/src/mesa/drivers/dri/intel/intel_tex_image.c 2009-03-24 21:56:37.000000000 +0100 ++++ mesa-7.3/src/mesa/drivers/dri/intel/intel_tex_image.c 2009-03-24 21:56:48.000000000 +0100 +@@ -710,7 +710,9 @@ + } + + void +-intelSetTexBuffer(__DRIcontext *pDRICtx, GLint target, __DRIdrawable *dPriv) ++intelSetTexBuffer2(__DRIcontext *pDRICtx, GLint target, ++ GLint glx_texture_format, ++ __DRIdrawable *dPriv) + { + struct intel_framebuffer *intel_fb = dPriv->driverPrivate; + struct intel_context *intel = pDRICtx->driverPrivate; +@@ -741,7 +743,10 @@ + + type = GL_BGRA; + format = GL_UNSIGNED_BYTE; +- internalFormat = (rb->region->cpp == 3 ? 3 : 4); ++ if (glx_texture_format == GLX_TEXTURE_FORMAT_RGB_EXT) ++ internalFormat = GL_RGB; ++ else ++ internalFormat = GL_RGBA; + + mt = intel_miptree_create_for_region(intel, target, + internalFormat, +@@ -776,3 +781,12 @@ + + _mesa_unlock_texture(&intel->ctx, texObj); + } ++ ++void ++intelSetTexBuffer(__DRIcontext *pDRICtx, GLint target, __DRIdrawable *dPriv) ++{ ++ /* The old interface didn't have the format argument, so copy our ++ * implementation's behavior at the time. ++ */ ++ intelSetTexBuffer2(pDRICtx, target, GLX_TEXTURE_FORMAT_RGBA_EXT, dPriv); ++}