From f132ac35d82a2960542619fb3fb91d22ab256dc7 Mon Sep 17 00:00:00 2001 From: Siva Velusamy Date: Wed, 7 Dec 2011 16:00:58 -0800 Subject: [PATCH] gltrace: attach contents of the appropriate framebuffer Currently, gltrace always attaches the contents of the currently bound framebuffer. This patch changes it to attach the contents of FB0 on eglSwap, and the currently bound framebuffer for the glDraw* calls. Change-Id: Ice0520d45d75638fe61cd91149df773074216510 --- .../libs/GLES_trace/src/gltrace_context.cpp | 24 +++++++++++++++---- opengl/libs/GLES_trace/src/gltrace_context.h | 6 ++++- opengl/libs/GLES_trace/src/gltrace_egl.cpp | 3 ++- opengl/libs/GLES_trace/src/gltrace_fixup.cpp | 6 ++--- opengl/libs/GLES_trace/src/gltrace_fixup.h | 7 +++--- 5 files changed, 33 insertions(+), 13 deletions(-) diff --git a/opengl/libs/GLES_trace/src/gltrace_context.cpp b/opengl/libs/GLES_trace/src/gltrace_context.cpp index 8cf5a5109..e0dd5f41a 100644 --- a/opengl/libs/GLES_trace/src/gltrace_context.cpp +++ b/opengl/libs/GLES_trace/src/gltrace_context.cpp @@ -82,19 +82,33 @@ void GLTraceContext::resizeFBMemory(unsigned minSize) { /** obtain a pointer to the compressed framebuffer image */ void GLTraceContext::getCompressedFB(void **fb, unsigned *fbsize, unsigned *fbwidth, - unsigned *fbheight) { + unsigned *fbheight, FBBinding fbToRead) { int viewport[4] = {}; hooks->gl.glGetIntegerv(GL_VIEWPORT, viewport); unsigned fbContentsSize = viewport[2] * viewport[3] * 4; resizeFBMemory(fbContentsSize); - //TODO: On eglSwapBuffer, read FB0. For glDraw calls, read currently - // bound FB. - //hooks->gl.glGetIntegerv(GL_FRAMEBUFFER_BINDING, &bound_fb); - //hooks->gl.glBindFramebuffer(GL_FRAMEBUFFER, 0); + // switch current framebuffer binding if necessary + GLint currentFb = -1; + bool fbSwitched = false; + if (fbToRead != CURRENTLY_BOUND_FB) { + hooks->gl.glGetIntegerv(GL_FRAMEBUFFER_BINDING, ¤tFb); + + if (currentFb != 0) { + hooks->gl.glBindFramebuffer(GL_FRAMEBUFFER, 0); + fbSwitched = true; + } + } + hooks->gl.glReadPixels(viewport[0], viewport[1], viewport[2], viewport[3], GL_RGBA, GL_UNSIGNED_BYTE, fbcontents); + + // switch back to previously bound buffer if necessary + if (fbSwitched) { + hooks->gl.glBindFramebuffer(GL_FRAMEBUFFER, currentFb); + } + *fbsize = lzf_compress(fbcontents, fbContentsSize, fbcompressed, fbContentsSize); *fb = fbcompressed; *fbwidth = viewport[2]; diff --git a/opengl/libs/GLES_trace/src/gltrace_context.h b/opengl/libs/GLES_trace/src/gltrace_context.h index 7dbbca49c..35436cb71 100644 --- a/opengl/libs/GLES_trace/src/gltrace_context.h +++ b/opengl/libs/GLES_trace/src/gltrace_context.h @@ -24,6 +24,8 @@ namespace gltrace { using ::android::gl_hooks_t; +enum FBBinding {CURRENTLY_BOUND_FB, FB0}; + class GLTraceContext { void *fbcontents; /* memory area to read framebuffer contents */ void *fbcompressed; /* destination for lzf compressed framebuffer */ @@ -34,7 +36,9 @@ public: gl_hooks_t *hooks; GLTraceContext(); - void getCompressedFB(void **fb, unsigned *fbsize, unsigned *fbwidth, unsigned *fbheight); + void getCompressedFB(void **fb, unsigned *fbsize, + unsigned *fbwidth, unsigned *fbheight, + FBBinding fbToRead); }; GLTraceContext *getGLTraceContext(); diff --git a/opengl/libs/GLES_trace/src/gltrace_egl.cpp b/opengl/libs/GLES_trace/src/gltrace_egl.cpp index 5d1f37023..8470a5baf 100644 --- a/opengl/libs/GLES_trace/src/gltrace_egl.cpp +++ b/opengl/libs/GLES_trace/src/gltrace_egl.cpp @@ -31,7 +31,8 @@ void GLTrace_eglSwapBuffers(void *dpy, void *draw) { glmessage.set_context_id(1); glmessage.set_function(GLMessage::eglSwapBuffers); - fixup_addFBContents(&glmessage); + // read FB0 since that is what is displayed on the screen + fixup_addFBContents(&glmessage, FB0); traceGLMessage(&glmessage); } diff --git a/opengl/libs/GLES_trace/src/gltrace_fixup.cpp b/opengl/libs/GLES_trace/src/gltrace_fixup.cpp index c5b04511a..ec59d2f4f 100644 --- a/opengl/libs/GLES_trace/src/gltrace_fixup.cpp +++ b/opengl/libs/GLES_trace/src/gltrace_fixup.cpp @@ -96,10 +96,10 @@ void fixup_glGetString(GLMessage *glmsg) { } /* Add the contents of the framebuffer to the protobuf message */ -void fixup_addFBContents(GLMessage *glmsg) { +void fixup_addFBContents(GLMessage *glmsg, FBBinding fbToRead) { void *fbcontents; unsigned fbsize, fbwidth, fbheight; - getGLTraceContext()->getCompressedFB(&fbcontents, &fbsize, &fbwidth, &fbheight); + getGLTraceContext()->getCompressedFB(&fbcontents, &fbsize, &fbwidth, &fbheight, fbToRead); GLMessage_FrameBuffer *fb = glmsg->mutable_fb(); fb->set_width(fbwidth); @@ -299,7 +299,7 @@ void fixupGLMessage(GLMessage *glmsg) { case GLMessage::glDrawElements: /* void glDrawArrays(GLenum mode, GLint first, GLsizei count) */ /* void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices) */ - fixup_addFBContents(glmsg); + fixup_addFBContents(glmsg, CURRENTLY_BOUND_FB); break; default: break; diff --git a/opengl/libs/GLES_trace/src/gltrace_fixup.h b/opengl/libs/GLES_trace/src/gltrace_fixup.h index bf15a8827..4ea445046 100644 --- a/opengl/libs/GLES_trace/src/gltrace_fixup.h +++ b/opengl/libs/GLES_trace/src/gltrace_fixup.h @@ -14,16 +14,17 @@ * limitations under the License. */ -#include "gltrace.pb.h" - #ifndef __GLTRACE_FIXUP_H_ #define __GLTRACE_FIXUP_H_ +#include "gltrace.pb.h" +#include "gltrace_context.h" + namespace android { namespace gltrace { void fixupGLMessage(GLMessage *message); -void fixup_addFBContents(GLMessage *message); +void fixup_addFBContents(GLMessage *message, FBBinding fbToRead); }; };