From 04d9da1fe3ed0b1ce719b63ed0d461bf69f84304 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Fri, 10 May 2013 09:43:43 +0100 Subject: [PATCH] glxtrace: Always use GL_RGBA for glXBindTexImageEXT. --- wrappers/glxtrace.py | 46 +++++++++++++++++--------------------------- 1 file changed, 18 insertions(+), 28 deletions(-) diff --git a/wrappers/glxtrace.py b/wrappers/glxtrace.py index 0fb7d0b..d611d0b 100644 --- a/wrappers/glxtrace.py +++ b/wrappers/glxtrace.py @@ -115,36 +115,26 @@ class GlxTracer(GlTracer): GLint height = 0; _glGetTexLevelParameteriv(target, level, GL_TEXTURE_HEIGHT, &height); GLint border = 0; - unsigned glx_format = 0; - _glXQueryDrawable(display, drawable, GLX_TEXTURE_FORMAT_EXT, &glx_format); - GLenum format; - switch (glx_format) { - case GLX_TEXTURE_FORMAT_RGB_EXT: - format = GL_RGB; - break; - case GLX_TEXTURE_FORMAT_RGBA_EXT: - format = GL_RGBA; - break; - case GLX_TEXTURE_FORMAT_NONE_EXT: - // XXX: This really shouldn't happen but some - // implementations (Mesa) appear return bogus results to - // the GLX_TEXTURE_FORMAT_EXT query - default: - //os::log("apitrace: warning: %s: unexpected GLX_TEXTURE_FORMAT_EXT 0x%u\n", __FUNCTION__, glx_format); - format = GL_RGBA; - break; - } + // XXX: We always use GL_RGBA format to read the pixels because: + // - some implementations (Mesa) seem to return bogus results + // for GLX_TEXTURE_FORMAT_EXT + // - hardware usually stores GL_RGB with 32bpp, so it should be + // faster to read/write + // - it is more robust against GL_(UN)PACK_ALIGNMENT state + // changes + // The drawback is that traces will be slightly bigger. + GLenum format = GL_RGBA; GLenum type = GL_UNSIGNED_BYTE; - if (target && internalformat && height && width && format) { - GLint channels = _gl_format_channels(format); - // FIXME: This assumes (UN)PACK state is set to its - // defaults. We really should temporarily reset the state - // here (and emit according fake calls) to cope when its - // not. At very least we need a heads up warning that this - // will cause problems. + if (target && internalformat && height && width) { + // FIXME: This assumes (UN)PACK state (in particular + // GL_(UN)PACK_ROW_LENGTH) is set to its defaults. We + // really should temporarily reset the state here (and emit + // according fake calls) to cope when its not. At very + // least we need a heads up warning that this will cause + // problems. GLint alignment = 4; - GLint stride = _align(width * channels, alignment); - GLvoid * pixels = malloc(height * stride); + GLint row_stride = _align(width * 4, alignment); + GLvoid * pixels = malloc(height * row_stride); _glGetTexImage(target, level, format, type, pixels); ''' self.emitFakeTexture2D() -- 2.43.0