summaryrefslogtreecommitdiffstats
path: root/opengl
diff options
context:
space:
mode:
authorDavid Li <davidxli@google.com>2011-03-24 16:42:53 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-03-24 16:42:53 -0700
commit83bc2a894cbde00e4ed4e42c6e01192a081b3d71 (patch)
tree4ec8def2a32b23a24f07c3c8d04ccbe03de42473 /opengl
parent63b81568a4923b32f2131d66bbeb30c79cc0bf08 (diff)
parentf9bc124cfedfed6f1eb9488355576e28a93ab252 (diff)
downloadframeworks_base-83bc2a894cbde00e4ed4e42c6e01192a081b3d71.zip
frameworks_base-83bc2a894cbde00e4ed4e42c6e01192a081b3d71.tar.gz
frameworks_base-83bc2a894cbde00e4ed4e42c6e01192a081b3d71.tar.bz2
Merge "GLES2Dbg: added reference frame for glReadPixels"
Diffstat (limited to 'opengl')
-rwxr-xr-xopengl/libs/GLES2_dbg/generate_debugger_message_proto.py10
-rw-r--r--opengl/libs/GLES2_dbg/src/api.h4
-rw-r--r--opengl/libs/GLES2_dbg/src/dbgcontext.cpp34
-rw-r--r--opengl/libs/GLES2_dbg/src/debugger_message.pb.cpp143
-rw-r--r--opengl/libs/GLES2_dbg/src/debugger_message.pb.h115
-rw-r--r--opengl/libs/GLES2_dbg/src/egl.cpp6
-rw-r--r--opengl/libs/GLES2_dbg/src/header.h20
-rw-r--r--opengl/libs/GLES2_dbg/src/server.cpp6
-rw-r--r--opengl/libs/GLES2_dbg/src/vertex.cpp24
9 files changed, 318 insertions, 44 deletions
diff --git a/opengl/libs/GLES2_dbg/generate_debugger_message_proto.py b/opengl/libs/GLES2_dbg/generate_debugger_message_proto.py
index 48a29da..ed8eae2 100755
--- a/opengl/libs/GLES2_dbg/generate_debugger_message_proto.py
+++ b/opengl/libs/GLES2_dbg/generate_debugger_message_proto.py
@@ -118,7 +118,17 @@ message Message
optional int32 arg6 = 18;
optional int32 arg7 = 19;
optional int32 arg8 = 20;
+
optional bytes data = 10; // variable length data used for GL call
+ enum DataType
+ {
+ ReferencedImage = 0; // for image sourced from ReadPixels
+ NonreferencedImage = 1; // for image sourced from ReadPixels
+ };
+ optional DataType data_type = 23; // most data types can be inferred from function
+ optional int32 pixel_format = 24; // used for image data if format and type
+ optional int32 pixel_type = 25; // cannot be determined from arg
+
optional float time = 11; // duration of previous GL call (ms)
enum Prop
{
diff --git a/opengl/libs/GLES2_dbg/src/api.h b/opengl/libs/GLES2_dbg/src/api.h
index 069ac9e..fd6833e 100644
--- a/opengl/libs/GLES2_dbg/src/api.h
+++ b/opengl/libs/GLES2_dbg/src/api.h
@@ -21,7 +21,7 @@
const unsigned compressed = dbg->Compress(pixels, width * height * 4); \
msg.set_data(dbg->lzf_buf, compressed); \
free(pixels);
-
+
#define EXTEND_Debug_glCopyTexSubImage2D EXTEND_Debug_glCopyTexImage2D
#define EXTEND_Debug_glShaderSource \
@@ -30,4 +30,4 @@
if (!length || length[i] < 0) \
data->append(string[i]); \
else \
- data->append(string[i], length[i]); \ No newline at end of file
+ data->append(string[i], length[i]);
diff --git a/opengl/libs/GLES2_dbg/src/dbgcontext.cpp b/opengl/libs/GLES2_dbg/src/dbgcontext.cpp
index 28439ba..951f255 100644
--- a/opengl/libs/GLES2_dbg/src/dbgcontext.cpp
+++ b/opengl/libs/GLES2_dbg/src/dbgcontext.cpp
@@ -16,7 +16,8 @@
#include "header.h"
-extern "C" {
+extern "C"
+{
#include "liblzf/lzf.h"
}
@@ -26,11 +27,13 @@ namespace android
DbgContext::DbgContext(const unsigned version, const gl_hooks_t * const hooks,
const unsigned MAX_VERTEX_ATTRIBS)
: lzf_buf(NULL), lzf_bufSize(0)
+ , lzf_readIndex(0), lzf_refSize(0), lzf_refBufSize(0)
, version(version), hooks(hooks)
, MAX_VERTEX_ATTRIBS(MAX_VERTEX_ATTRIBS)
, vertexAttribs(new VertexAttrib[MAX_VERTEX_ATTRIBS])
, hasNonVBOAttribs(false), indexBuffers(NULL), indexBuffer(NULL)
{
+ lzf_ref[0] = lzf_ref[1] = NULL;
for (unsigned i = 0; i < MAX_VERTEX_ATTRIBS; i++)
vertexAttribs[i] = VertexAttrib();
}
@@ -39,6 +42,8 @@ DbgContext::~DbgContext()
{
delete vertexAttribs;
free(lzf_buf);
+ free(lzf_ref[0]);
+ free(lzf_ref[1]);
}
DbgContext * CreateDbgContext(const unsigned version, const gl_hooks_t * const hooks)
@@ -76,12 +81,35 @@ unsigned DbgContext::Compress(const void * in_data, unsigned in_len)
lzf_buf = (char *)realloc(lzf_buf, lzf_bufSize);
}
unsigned compressedSize = lzf_compress((const char *)in_data,
- in_len, lzf_buf, lzf_bufSize);
- LOGD("DbgContext::lzf_compress in=%u out=%u", in_len, compressedSize);
+ in_len, lzf_buf, lzf_bufSize);
assert (0 < compressedSize);
return compressedSize;
}
+void * DbgContext::GetReadPixelsBuffer(const unsigned size)
+{
+ if (lzf_refSize < size) {
+ lzf_refSize = size;
+ lzf_refBufSize = lzf_refSize + 64;
+ lzf_ref[0] = (unsigned *)realloc(lzf_ref[0], lzf_refBufSize);
+ memset(lzf_ref[0], 0, lzf_refSize);
+ lzf_ref[1] = (unsigned *)realloc(lzf_ref[1], lzf_refBufSize);
+ memset(lzf_ref[1], 0, lzf_refSize);
+ }
+ lzf_refSize = size;
+ lzf_readIndex ^= 1;
+ return lzf_ref[lzf_readIndex];
+}
+
+unsigned DbgContext::CompressReadPixelBuffer()
+{
+ unsigned * const ref = lzf_ref[lzf_readIndex ^ 1];
+ unsigned * const src = lzf_ref[lzf_readIndex];
+ for (unsigned i = 0; i < lzf_refSize / sizeof(*ref) + 1; i++)
+ ref[i] ^= src[i];
+ return Compress(ref, lzf_refSize);
+}
+
void DbgContext::glUseProgram(GLuint program)
{
while (GLenum error = hooks->gl.glGetError())
diff --git a/opengl/libs/GLES2_dbg/src/debugger_message.pb.cpp b/opengl/libs/GLES2_dbg/src/debugger_message.pb.cpp
index 1f404c2..94bf3ef 100644
--- a/opengl/libs/GLES2_dbg/src/debugger_message.pb.cpp
+++ b/opengl/libs/GLES2_dbg/src/debugger_message.pb.cpp
@@ -450,6 +450,23 @@ const Message_Type Message::Type_MIN;
const Message_Type Message::Type_MAX;
const int Message::Type_ARRAYSIZE;
#endif // _MSC_VER
+bool Message_DataType_IsValid(int value) {
+ switch(value) {
+ case 0:
+ case 1:
+ return true;
+ default:
+ return false;
+ }
+}
+
+#ifndef _MSC_VER
+const Message_DataType Message::ReferencedImage;
+const Message_DataType Message::NonreferencedImage;
+const Message_DataType Message::DataType_MIN;
+const Message_DataType Message::DataType_MAX;
+const int Message::DataType_ARRAYSIZE;
+#endif // _MSC_VER
bool Message_Prop_IsValid(int value) {
switch(value) {
case 0:
@@ -484,6 +501,9 @@ const int Message::kArg6FieldNumber;
const int Message::kArg7FieldNumber;
const int Message::kArg8FieldNumber;
const int Message::kDataFieldNumber;
+const int Message::kDataTypeFieldNumber;
+const int Message::kPixelFormatFieldNumber;
+const int Message::kPixelTypeFieldNumber;
const int Message::kTimeFieldNumber;
const int Message::kPropFieldNumber;
const int Message::kClockFieldNumber;
@@ -520,6 +540,9 @@ void Message::SharedCtor() {
arg7_ = 0;
arg8_ = 0;
data_ = const_cast< ::std::string*>(&_default_data_);
+ data_type_ = 0;
+ pixel_format_ = 0;
+ pixel_type_ = 0;
time_ = 0;
prop_ = 0;
clock_ = 0;
@@ -576,9 +599,12 @@ void Message::Clear() {
data_->clear();
}
}
- time_ = 0;
+ data_type_ = 0;
}
if (_has_bits_[16 / 32] & (0xffu << (16 % 32))) {
+ pixel_format_ = 0;
+ pixel_type_ = 0;
+ time_ = 0;
prop_ = 0;
clock_ = 0;
}
@@ -762,7 +788,7 @@ bool Message::MergePartialFromCodedStream(
DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
float, ::google::protobuf::internal::WireFormatLite::TYPE_FLOAT>(
input, &time_)));
- _set_bit(15);
+ _set_bit(18);
} else {
goto handle_uninterpreted;
}
@@ -877,6 +903,57 @@ bool Message::MergePartialFromCodedStream(
DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
float, ::google::protobuf::internal::WireFormatLite::TYPE_FLOAT>(
input, &clock_)));
+ _set_bit(20);
+ } else {
+ goto handle_uninterpreted;
+ }
+ if (input->ExpectTag(184)) goto parse_data_type;
+ break;
+ }
+
+ // optional .com.android.glesv2debugger.Message.DataType data_type = 23;
+ case 23: {
+ if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+ ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+ parse_data_type:
+ int value;
+ DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+ int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
+ input, &value)));
+ if (::com::android::glesv2debugger::Message_DataType_IsValid(value)) {
+ set_data_type(static_cast< ::com::android::glesv2debugger::Message_DataType >(value));
+ }
+ } else {
+ goto handle_uninterpreted;
+ }
+ if (input->ExpectTag(192)) goto parse_pixel_format;
+ break;
+ }
+
+ // optional int32 pixel_format = 24;
+ case 24: {
+ if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+ ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+ parse_pixel_format:
+ DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+ ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
+ input, &pixel_format_)));
+ _set_bit(16);
+ } else {
+ goto handle_uninterpreted;
+ }
+ if (input->ExpectTag(200)) goto parse_pixel_type;
+ break;
+ }
+
+ // optional int32 pixel_type = 25;
+ case 25: {
+ if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+ ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+ parse_pixel_type:
+ DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+ ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>(
+ input, &pixel_type_)));
_set_bit(17);
} else {
goto handle_uninterpreted;
@@ -956,7 +1033,7 @@ void Message::SerializeWithCachedSizes(
}
// optional float time = 11;
- if (_has_bit(15)) {
+ if (_has_bit(18)) {
::google::protobuf::internal::WireFormatLite::WriteFloat(11, this->time(), output);
}
@@ -986,16 +1063,32 @@ void Message::SerializeWithCachedSizes(
}
// optional .com.android.glesv2debugger.Message.Prop prop = 21;
- if (_has_bit(16)) {
+ if (_has_bit(19)) {
::google::protobuf::internal::WireFormatLite::WriteEnum(
21, this->prop(), output);
}
// optional float clock = 22;
- if (_has_bit(17)) {
+ if (_has_bit(20)) {
::google::protobuf::internal::WireFormatLite::WriteFloat(22, this->clock(), output);
}
+ // optional .com.android.glesv2debugger.Message.DataType data_type = 23;
+ if (_has_bit(15)) {
+ ::google::protobuf::internal::WireFormatLite::WriteEnum(
+ 23, this->data_type(), output);
+ }
+
+ // optional int32 pixel_format = 24;
+ if (_has_bit(16)) {
+ ::google::protobuf::internal::WireFormatLite::WriteInt32(24, this->pixel_format(), output);
+ }
+
+ // optional int32 pixel_type = 25;
+ if (_has_bit(17)) {
+ ::google::protobuf::internal::WireFormatLite::WriteInt32(25, this->pixel_type(), output);
+ }
+
}
int Message::ByteSize() const {
@@ -1105,13 +1198,33 @@ int Message::ByteSize() const {
this->data());
}
+ // optional .com.android.glesv2debugger.Message.DataType data_type = 23;
+ if (has_data_type()) {
+ total_size += 2 +
+ ::google::protobuf::internal::WireFormatLite::EnumSize(this->data_type());
+ }
+
+ }
+ if (_has_bits_[16 / 32] & (0xffu << (16 % 32))) {
+ // optional int32 pixel_format = 24;
+ if (has_pixel_format()) {
+ total_size += 2 +
+ ::google::protobuf::internal::WireFormatLite::Int32Size(
+ this->pixel_format());
+ }
+
+ // optional int32 pixel_type = 25;
+ if (has_pixel_type()) {
+ total_size += 2 +
+ ::google::protobuf::internal::WireFormatLite::Int32Size(
+ this->pixel_type());
+ }
+
// optional float time = 11;
if (has_time()) {
total_size += 1 + 4;
}
- }
- if (_has_bits_[16 / 32] & (0xffu << (16 % 32))) {
// optional .com.android.glesv2debugger.Message.Prop prop = 21;
if (has_prop()) {
total_size += 2 +
@@ -1186,14 +1299,23 @@ void Message::MergeFrom(const Message& from) {
set_data(from.data());
}
if (from._has_bit(15)) {
- set_time(from.time());
+ set_data_type(from.data_type());
}
}
if (from._has_bits_[16 / 32] & (0xffu << (16 % 32))) {
if (from._has_bit(16)) {
- set_prop(from.prop());
+ set_pixel_format(from.pixel_format());
}
if (from._has_bit(17)) {
+ set_pixel_type(from.pixel_type());
+ }
+ if (from._has_bit(18)) {
+ set_time(from.time());
+ }
+ if (from._has_bit(19)) {
+ set_prop(from.prop());
+ }
+ if (from._has_bit(20)) {
set_clock(from.clock());
}
}
@@ -1228,6 +1350,9 @@ void Message::Swap(Message* other) {
std::swap(arg7_, other->arg7_);
std::swap(arg8_, other->arg8_);
std::swap(data_, other->data_);
+ std::swap(data_type_, other->data_type_);
+ std::swap(pixel_format_, other->pixel_format_);
+ std::swap(pixel_type_, other->pixel_type_);
std::swap(time_, other->time_);
std::swap(prop_, other->prop_);
std::swap(clock_, other->clock_);
diff --git a/opengl/libs/GLES2_dbg/src/debugger_message.pb.h b/opengl/libs/GLES2_dbg/src/debugger_message.pb.h
index 59e7bab..12ef781 100644
--- a/opengl/libs/GLES2_dbg/src/debugger_message.pb.h
+++ b/opengl/libs/GLES2_dbg/src/debugger_message.pb.h
@@ -243,6 +243,15 @@ const Message_Type Message_Type_Type_MIN = Message_Type_BeforeCall;
const Message_Type Message_Type_Type_MAX = Message_Type_Response;
const int Message_Type_Type_ARRAYSIZE = Message_Type_Type_MAX + 1;
+enum Message_DataType {
+ Message_DataType_ReferencedImage = 0,
+ Message_DataType_NonreferencedImage = 1
+};
+bool Message_DataType_IsValid(int value);
+const Message_DataType Message_DataType_DataType_MIN = Message_DataType_ReferencedImage;
+const Message_DataType Message_DataType_DataType_MAX = Message_DataType_NonreferencedImage;
+const int Message_DataType_DataType_ARRAYSIZE = Message_DataType_DataType_MAX + 1;
+
enum Message_Prop {
Message_Prop_Capture = 0,
Message_Prop_TimeMode = 1
@@ -511,6 +520,19 @@ class Message : public ::google::protobuf::MessageLite {
static const int Type_ARRAYSIZE =
Message_Type_Type_ARRAYSIZE;
+ typedef Message_DataType DataType;
+ static const DataType ReferencedImage = Message_DataType_ReferencedImage;
+ static const DataType NonreferencedImage = Message_DataType_NonreferencedImage;
+ static inline bool DataType_IsValid(int value) {
+ return Message_DataType_IsValid(value);
+ }
+ static const DataType DataType_MIN =
+ Message_DataType_DataType_MIN;
+ static const DataType DataType_MAX =
+ Message_DataType_DataType_MAX;
+ static const int DataType_ARRAYSIZE =
+ Message_DataType_DataType_ARRAYSIZE;
+
typedef Message_Prop Prop;
static const Prop Capture = Message_Prop_Capture;
static const Prop TimeMode = Message_Prop_TimeMode;
@@ -634,6 +656,27 @@ class Message : public ::google::protobuf::MessageLite {
inline void set_data(const void* value, size_t size);
inline ::std::string* mutable_data();
+ // optional .com.android.glesv2debugger.Message.DataType data_type = 23;
+ inline bool has_data_type() const;
+ inline void clear_data_type();
+ static const int kDataTypeFieldNumber = 23;
+ inline ::com::android::glesv2debugger::Message_DataType data_type() const;
+ inline void set_data_type(::com::android::glesv2debugger::Message_DataType value);
+
+ // optional int32 pixel_format = 24;
+ inline bool has_pixel_format() const;
+ inline void clear_pixel_format();
+ static const int kPixelFormatFieldNumber = 24;
+ inline ::google::protobuf::int32 pixel_format() const;
+ inline void set_pixel_format(::google::protobuf::int32 value);
+
+ // optional int32 pixel_type = 25;
+ inline bool has_pixel_type() const;
+ inline void clear_pixel_type();
+ static const int kPixelTypeFieldNumber = 25;
+ inline ::google::protobuf::int32 pixel_type() const;
+ inline void set_pixel_type(::google::protobuf::int32 value);
+
// optional float time = 11;
inline bool has_time() const;
inline void clear_time();
@@ -675,6 +718,9 @@ class Message : public ::google::protobuf::MessageLite {
::google::protobuf::int32 arg8_;
::std::string* data_;
static const ::std::string _default_data_;
+ int data_type_;
+ ::google::protobuf::int32 pixel_format_;
+ ::google::protobuf::int32 pixel_type_;
float time_;
int prop_;
float clock_;
@@ -682,7 +728,7 @@ class Message : public ::google::protobuf::MessageLite {
friend void protobuf_AssignDesc_debugger_5fmessage_2eproto();
friend void protobuf_ShutdownFile_debugger_5fmessage_2eproto();
- ::google::protobuf::uint32 _has_bits_[(18 + 31) / 32];
+ ::google::protobuf::uint32 _has_bits_[(21 + 31) / 32];
// WHY DOES & HAVE LOWER PRECEDENCE THAN != !?
inline bool _has_bit(int index) const {
@@ -973,52 +1019,101 @@ inline ::std::string* Message::mutable_data() {
return data_;
}
+// optional .com.android.glesv2debugger.Message.DataType data_type = 23;
+inline bool Message::has_data_type() const {
+ return _has_bit(15);
+}
+inline void Message::clear_data_type() {
+ data_type_ = 0;
+ _clear_bit(15);
+}
+inline ::com::android::glesv2debugger::Message_DataType Message::data_type() const {
+ return static_cast< ::com::android::glesv2debugger::Message_DataType >(data_type_);
+}
+inline void Message::set_data_type(::com::android::glesv2debugger::Message_DataType value) {
+ GOOGLE_DCHECK(::com::android::glesv2debugger::Message_DataType_IsValid(value));
+ _set_bit(15);
+ data_type_ = value;
+}
+
+// optional int32 pixel_format = 24;
+inline bool Message::has_pixel_format() const {
+ return _has_bit(16);
+}
+inline void Message::clear_pixel_format() {
+ pixel_format_ = 0;
+ _clear_bit(16);
+}
+inline ::google::protobuf::int32 Message::pixel_format() const {
+ return pixel_format_;
+}
+inline void Message::set_pixel_format(::google::protobuf::int32 value) {
+ _set_bit(16);
+ pixel_format_ = value;
+}
+
+// optional int32 pixel_type = 25;
+inline bool Message::has_pixel_type() const {
+ return _has_bit(17);
+}
+inline void Message::clear_pixel_type() {
+ pixel_type_ = 0;
+ _clear_bit(17);
+}
+inline ::google::protobuf::int32 Message::pixel_type() const {
+ return pixel_type_;
+}
+inline void Message::set_pixel_type(::google::protobuf::int32 value) {
+ _set_bit(17);
+ pixel_type_ = value;
+}
+
// optional float time = 11;
inline bool Message::has_time() const {
- return _has_bit(15);
+ return _has_bit(18);
}
inline void Message::clear_time() {
time_ = 0;
- _clear_bit(15);
+ _clear_bit(18);
}
inline float Message::time() const {
return time_;
}
inline void Message::set_time(float value) {
- _set_bit(15);
+ _set_bit(18);
time_ = value;
}
// optional .com.android.glesv2debugger.Message.Prop prop = 21;
inline bool Message::has_prop() const {
- return _has_bit(16);
+ return _has_bit(19);
}
inline void Message::clear_prop() {
prop_ = 0;
- _clear_bit(16);
+ _clear_bit(19);
}
inline ::com::android::glesv2debugger::Message_Prop Message::prop() const {
return static_cast< ::com::android::glesv2debugger::Message_Prop >(prop_);
}
inline void Message::set_prop(::com::android::glesv2debugger::Message_Prop value) {
GOOGLE_DCHECK(::com::android::glesv2debugger::Message_Prop_IsValid(value));
- _set_bit(16);
+ _set_bit(19);
prop_ = value;
}
// optional float clock = 22;
inline bool Message::has_clock() const {
- return _has_bit(17);
+ return _has_bit(20);
}
inline void Message::clear_clock() {
clock_ = 0;
- _clear_bit(17);
+ _clear_bit(20);
}
inline float Message::clock() const {
return clock_;
}
inline void Message::set_clock(float value) {
- _set_bit(17);
+ _set_bit(20);
clock_ = value;
}
diff --git a/opengl/libs/GLES2_dbg/src/egl.cpp b/opengl/libs/GLES2_dbg/src/egl.cpp
index 27c7f7e..3e78e16 100644
--- a/opengl/libs/GLES2_dbg/src/egl.cpp
+++ b/opengl/libs/GLES2_dbg/src/egl.cpp
@@ -23,7 +23,7 @@ EGLBoolean Debug_eglSwapBuffers(EGLDisplay dpy, EGLSurface draw)
struct : public FunctionCall {
EGLDisplay dpy;
EGLSurface draw;
-
+
const int * operator()(gl_hooks_t::gl_t const * const _c, glesv2debugger::Message & msg) {
msg.set_time(-1);
return reinterpret_cast<const int *>(true);
@@ -31,10 +31,10 @@ EGLBoolean Debug_eglSwapBuffers(EGLDisplay dpy, EGLSurface draw)
} caller;
caller.dpy = dpy;
caller.draw = draw;
-
+
msg.set_arg0(reinterpret_cast<int>(dpy));
msg.set_arg1(reinterpret_cast<int>(draw));
-
+
int * ret = MessageLoop(caller, msg, expectResponse,
glesv2debugger::Message_Function_eglSwapBuffers);
return static_cast<EGLBoolean>(reinterpret_cast<int>(ret));
diff --git a/opengl/libs/GLES2_dbg/src/header.h b/opengl/libs/GLES2_dbg/src/header.h
index 21b1dfb..0623a5d 100644
--- a/opengl/libs/GLES2_dbg/src/header.h
+++ b/opengl/libs/GLES2_dbg/src/header.h
@@ -59,14 +59,19 @@ namespace android
struct DbgContext {
private:
unsigned lzf_bufSize;
-
+
+ // used as buffer and reference frame for ReadPixels; malloc/free
+ unsigned * lzf_ref [2];
+ unsigned lzf_readIndex; // 0 or 1
+ unsigned lzf_refSize, lzf_refBufSize; // bytes
+
public:
- char * lzf_buf;
-
+ char * lzf_buf; // auto malloc/free; output of lzf_compress
+
const unsigned version; // 0 is GLES1, 1 is GLES2
const gl_hooks_t * const hooks;
const unsigned MAX_VERTEX_ATTRIBS;
-
+
struct VertexAttrib {
GLenum type; // element data type
unsigned size; // number of data per element
@@ -100,7 +105,12 @@ public:
void Fetch(const unsigned index, std::string * const data) const;
unsigned Compress(const void * in_data, unsigned in_len); // compressed to lzf_buf
-
+ void * GetReadPixelsBuffer(const unsigned size);
+ bool IsReadPixelBuffer(const void * const ptr) {
+ return ptr == lzf_ref[lzf_readIndex];
+ }
+ unsigned CompressReadPixelBuffer();
+
void glUseProgram(GLuint program);
void glEnableVertexAttribArray(GLuint index);
void glDisableVertexAttribArray(GLuint index);
diff --git a/opengl/libs/GLES2_dbg/src/server.cpp b/opengl/libs/GLES2_dbg/src/server.cpp
index 03c3dae..b3a9d69 100644
--- a/opengl/libs/GLES2_dbg/src/server.cpp
+++ b/opengl/libs/GLES2_dbg/src/server.cpp
@@ -153,10 +153,9 @@ float Send(const glesv2debugger::Message & msg, glesv2debugger::Message & cmd)
assert(msg.has_context_id() && msg.context_id() != 0);
static std::string str;
msg.SerializeToString(&str);
- unsigned len = str.length();
- len = htonl(len);
+ uint32_t len = htonl(str.length());
int sent = -1;
- sent = send(clientSock, (const char *)&len, sizeof(len), 0);
+ sent = send(clientSock, &len, sizeof(len), 0);
if (sent != sizeof(len)) {
LOGD("actual sent=%d expected=%d clientSock=%d", sent, sizeof(len), clientSock);
Die("Failed to send message length");
@@ -182,7 +181,6 @@ float Send(const glesv2debugger::Message & msg, glesv2debugger::Message & cmd)
} else
Receive(cmd);
- //LOGD("Message sent tid=%lu len=%d", pthread_self(), str.length());
pthread_mutex_unlock(&mutex);
return t;
}
diff --git a/opengl/libs/GLES2_dbg/src/vertex.cpp b/opengl/libs/GLES2_dbg/src/vertex.cpp
index c4598f5..71ebe36 100644
--- a/opengl/libs/GLES2_dbg/src/vertex.cpp
+++ b/opengl/libs/GLES2_dbg/src/vertex.cpp
@@ -37,7 +37,7 @@ void Debug_glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum
msg.set_arg4(format);
msg.set_arg5(type);
msg.set_arg6(reinterpret_cast<int>(pixels));
-
+
const unsigned size = width * height * GetBytesPerPixel(format, type);
unsigned compressed = 0;
if (!expectResponse)
@@ -55,7 +55,13 @@ void Debug_glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum
msg.set_function(glesv2debugger::Message_Function_glReadPixels);
msg.set_type(glesv2debugger::Message_Type_AfterCall);
msg.set_expect_response(expectResponse);
- compressed = dbg->Compress(pixels, size);
+ if (dbg->IsReadPixelBuffer(pixels)) {
+ compressed = dbg->CompressReadPixelBuffer();
+ msg.set_data_type(msg.ReferencedImage);
+ } else {
+ compressed = dbg->Compress(pixels, size);
+ msg.set_data_type(msg.NonreferencedImage);
+ }
msg.set_data(dbg->lzf_buf, compressed);
if (!expectResponse)
cmd.set_function(glesv2debugger::Message_Function_SKIP);
@@ -120,10 +126,10 @@ void Debug_glDrawArrays(GLenum mode, GLint first, GLsizei count)
dbg->hooks->gl.glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, &readType);
// LOGD("glDrawArrays CAPTURE: x=%d y=%d width=%d height=%d format=0x%.4X type=0x%.4X",
// viewport[0], viewport[1], viewport[2], viewport[3], readFormat, readType);
- pixels = malloc(viewport[2] * viewport[3] * 4);
+ pixels = dbg->GetReadPixelsBuffer(viewport[2] * viewport[3] *
+ GetBytesPerPixel(readFormat, readType));
Debug_glReadPixels(viewport[0], viewport[1], viewport[2], viewport[3],
readFormat, readType, pixels);
- free(pixels);
}
break;
case glesv2debugger::Message_Function_SKIP:
@@ -169,12 +175,14 @@ void Debug_glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid*
std::string * const data = msg.mutable_data();
if (GL_UNSIGNED_BYTE == type) {
if (dbg->indexBuffer)
- FetchIndexed(count, (unsigned char *)dbg->indexBuffer->data + (unsigned long)indices, data, dbg);
+ FetchIndexed(count, (unsigned char *)dbg->indexBuffer->data +
+ (unsigned long)indices, data, dbg);
else
FetchIndexed(count, (unsigned char *)indices, data, dbg);
} else if (GL_UNSIGNED_SHORT == type) {
if (dbg->indexBuffer)
- FetchIndexed(count, (unsigned short *)((char *)dbg->indexBuffer->data + (unsigned long)indices), data, dbg);
+ FetchIndexed(count, (unsigned short *)((char *)dbg->indexBuffer->data +
+ (unsigned long)indices), data, dbg);
else
FetchIndexed(count, (unsigned short *)indices, data, dbg);
} else
@@ -206,10 +214,10 @@ void Debug_glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid*
dbg->hooks->gl.glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, &readType);
// LOGD("glDrawArrays CAPTURE: x=%d y=%d width=%d height=%d format=0x%.4X type=0x%.4X",
// viewport[0], viewport[1], viewport[2], viewport[3], readFormat, readType);
- pixels = malloc(viewport[2] * viewport[3] * 4);
+ pixels = dbg->GetReadPixelsBuffer(viewport[2] * viewport[3] *
+ GetBytesPerPixel(readFormat, readType));
Debug_glReadPixels(viewport[0], viewport[1], viewport[2], viewport[3],
readFormat, readType, pixels);
- free(pixels);
}
break;
case glesv2debugger::Message_Function_SKIP: