Merge "GLES2Dbg: added reference frame for glReadPixels"

This commit is contained in:
David Li 2011-03-24 16:42:53 -07:00 committed by Android (Google) Code Review
commit 3f9c90c1ec
9 changed files with 318 additions and 44 deletions

View File

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

View File

@ -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]);
data->append(string[i], length[i]);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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