From: José Fonseca Date: Fri, 20 Jan 2012 18:30:06 +0000 (+0000) Subject: Ignore alpha channels in window drawables until we are able to match the traced visuals. X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=3dfd7d6c16603986e0e3597ff6f47429a7235155;p=apitrace Ignore alpha channels in window drawables until we are able to match the traced visuals. --- diff --git a/common/image.cpp b/common/image.cpp index 0cb38ed..e692313 100644 --- a/common/image.cpp +++ b/common/image.cpp @@ -28,6 +28,8 @@ #include #include +#include + #include "image.hpp" @@ -38,22 +40,28 @@ double Image::compare(Image &ref) { if (width != ref.width || height != ref.height || - channels != ref.channels) { + channels < 3 || + ref.channels < 3) { + return 0.0; + } + + // Ignore missing alpha when comparing RGB w/ RGBA, but enforce an equal + // number of channels otherwise. + unsigned minChannels = std::min(channels, ref.channels); + if (channels != ref.channels && minChannels < 3) { return 0.0; } const unsigned char *pSrc = start(); const unsigned char *pRef = ref.start(); - assert(channels >= 3); - unsigned long long error = 0; for (unsigned y = 0; y < height; ++y) { for (unsigned x = 0; x < width; ++x) { // FIXME: Ignore alpha channel until we are able to pick a visual // that matches the traces - for (unsigned c = 0; c < 3; ++c) { - int delta = pSrc[x*channels + c] - pRef[x*channels + c]; + for (unsigned c = 0; c < minChannels; ++c) { + int delta = pSrc[x*channels + c] - pRef[x*ref.channels + c]; error += delta*delta; } } @@ -63,7 +71,7 @@ double Image::compare(Image &ref) } double numerator = error*2 + 1; - double denominator = height*width*3ULL*255ULL*255ULL*2; + double denominator = height*width*minChannels*255ULL*255ULL*2; double quotient = numerator/denominator; // Precision in bits diff --git a/glretrace_main.cpp b/glretrace_main.cpp index c2ca664..1208632 100644 --- a/glretrace_main.cpp +++ b/glretrace_main.cpp @@ -157,7 +157,7 @@ void snapshot(unsigned call_no) { } } - image::Image *src = glstate::getDrawBufferImage(GL_RGBA); + image::Image *src = glstate::getDrawBufferImage(); if (!src) { return; } diff --git a/glstate.cpp b/glstate.cpp index 329276f..d54764c 100644 --- a/glstate.cpp +++ b/glstate.cpp @@ -953,7 +953,8 @@ getFramebufferAttachmentFormat(GLenum target, GLenum attachment) image::Image * -getDrawBufferImage(GLenum format) { +getDrawBufferImage() { + GLenum format = GL_RGB; GLint channels = __gl_format_channels(format); if (channels > 4) { return NULL; @@ -1204,7 +1205,10 @@ dumpDrawableImages(JSONWriter &json) glGetIntegerv(GL_READ_BUFFER, &read_buffer); GLint alpha_bits = 0; +#if 0 + // XXX: Ignore alpha until we are able to match the traced visual glGetIntegerv(GL_ALPHA_BITS, &alpha_bits); +#endif GLenum format = alpha_bits ? GL_RGBA : GL_RGB; json.beginMember(enumToString(draw_buffer)); dumpReadBufferImage(json, width, height, format); @@ -1229,6 +1233,8 @@ dumpDrawableImages(JSONWriter &json) json.endMember(); } } + + /** * Dump the specified framebuffer attachment. * diff --git a/glstate.hpp b/glstate.hpp index 6704435..0a83a59 100644 --- a/glstate.hpp +++ b/glstate.hpp @@ -52,7 +52,7 @@ void dumpParameters(JSONWriter &json); void dumpCurrentContext(std::ostream &os); image::Image * -getDrawBufferImage(GLenum format); +getDrawBufferImage(void); } /* namespace glstate */