summaryrefslogtreecommitdiffstats
path: root/opengl
diff options
context:
space:
mode:
authorSiva Velusamy <vsiva@google.com>2011-12-07 16:00:58 -0800
committerSiva Velusamy <vsiva@google.com>2011-12-07 16:00:58 -0800
commit1598ef959bcd2898185885d75afe0e041846d369 (patch)
tree3aba630a4eda48a48a87bf50ea73e0c332eaee78 /opengl
parent63051d71ef3da31c9764f6998e275adedbbcd9f5 (diff)
downloadframeworks_base-1598ef959bcd2898185885d75afe0e041846d369.zip
frameworks_base-1598ef959bcd2898185885d75afe0e041846d369.tar.gz
frameworks_base-1598ef959bcd2898185885d75afe0e041846d369.tar.bz2
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
Diffstat (limited to 'opengl')
-rw-r--r--opengl/libs/GLES_trace/src/gltrace_context.cpp24
-rw-r--r--opengl/libs/GLES_trace/src/gltrace_context.h6
-rw-r--r--opengl/libs/GLES_trace/src/gltrace_egl.cpp3
-rw-r--r--opengl/libs/GLES_trace/src/gltrace_fixup.cpp6
-rw-r--r--opengl/libs/GLES_trace/src/gltrace_fixup.h7
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 8cf5a51..e0dd5f4 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, &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];
diff --git a/opengl/libs/GLES_trace/src/gltrace_context.h b/opengl/libs/GLES_trace/src/gltrace_context.h
index 7dbbca4..35436cb 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 5d1f370..8470a5b 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 c5b0451..ec59d2f 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 bf15a88..4ea4450 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);
};
};