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
This commit is contained in:
Siva Velusamy 2011-12-07 16:00:58 -08:00
parent 3005c4f778
commit f132ac35d8
5 changed files with 33 additions and 13 deletions

View File

@ -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, &currentFb);
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];

View File

@ -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();

View File

@ -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);
}

View File

@ -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;

View File

@ -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);
};
};