Merge "GLES2Dbg: use dump.gles2dbg file when fails to create socket"

This commit is contained in:
David Li
2011-04-18 15:26:51 -07:00
committed by Android (Google) Code Review
8 changed files with 71 additions and 31 deletions

View File

@@ -311,7 +311,7 @@ static void initEglTraceLevel() {
int propertyLevel = atoi(value);
int applicationLevel = gEGLApplicationTraceLevel;
gEGLTraceLevel = propertyLevel > applicationLevel ? propertyLevel : applicationLevel;
property_get("debug.egl.debug_proc", value, "");
long pid = getpid();
char procPath[128] = {};
@@ -324,14 +324,20 @@ static void initEglTraceLevel() {
{
if (!strcmp(value, cmdline))
gEGLDebugLevel = 1;
}
}
fclose(file);
}
if (gEGLDebugLevel > 0)
{
property_get("debug.egl.debug_port", value, "5039");
StartDebugServer(atoi(value));
const unsigned short port = (unsigned short)atoi(value);
property_get("debug.egl.debug_forceUseFile", value, "0");
const bool forceUseFile = (bool)atoi(value);
property_get("debug.egl.debug_maxFileSize", value, "8");
const unsigned int maxFileSize = atoi(value) << 20;
property_get("debug.egl.debug_filePath", value, "/data/local/tmp/dump.gles2dbg");
StartDebugServer(port, forceUseFile, maxFileSize, value);
}
}

View File

@@ -106,6 +106,7 @@ message Message
AfterCall = 1;
AfterGeneratedCall = 2;
Response = 3; // currently used for misc messages
CompleteCall = 4; // BeforeCall and AfterCall merged
}
required Type type = 3;
required bool expect_response = 4;

View File

@@ -16,16 +16,13 @@
#define EXTEND_Debug_glCopyTexImage2D \
DbgContext * const dbg = getDbgContextThreadSpecific(); \
GLint readFormat, readType; \
dbg->hooks->gl.glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, &readFormat); \
dbg->hooks->gl.glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, &readType); \
unsigned readSize = GetBytesPerPixel(readFormat, readType) * width * height; \
void * readData = dbg->GetReadPixelsBuffer(readSize); \
dbg->hooks->gl.glReadPixels(x, y, width, height, readFormat, readType, readData); \
void * readData = dbg->GetReadPixelsBuffer(4 * width * height); \
/* pick easy format for client to convert */ \
dbg->hooks->gl.glReadPixels(x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, readData); \
dbg->CompressReadPixelBuffer(msg.mutable_data()); \
msg.set_data_type(msg.ReferencedImage); \
msg.set_pixel_format(readFormat); \
msg.set_pixel_type(readType);
msg.set_pixel_format(GL_RGBA); \
msg.set_pixel_type(GL_UNSIGNED_BYTE);
#define EXTEND_Debug_glCopyTexSubImage2D EXTEND_Debug_glCopyTexImage2D

View File

@@ -195,10 +195,12 @@ unsigned int DbgContext::GetBufferSize()
void DbgContext::glUseProgram(GLuint program)
{
while (GLenum error = hooks->gl.glGetError())
LOGD("DbgContext::glUseProgram: before glGetError() = 0x%.4X", error);
LOGD("DbgContext::glUseProgram(%u): before glGetError() = 0x%.4X",
program, error);
this->program = program;
maxAttrib = 0;
if (program == 0)
return;
GLint activeAttributes = 0;
hooks->gl.glGetProgramiv(program, GL_ACTIVE_ATTRIBUTES, &activeAttributes);
maxAttrib = 0;
@@ -236,9 +238,9 @@ void DbgContext::glUseProgram(GLuint program)
maxAttrib = slot;
}
delete name;
while (GLenum error = hooks->gl.glGetError())
LOGD("DbgContext::glUseProgram: after glGetError() = 0x%.4X", error);
LOGD("DbgContext::glUseProgram(%u): after glGetError() = 0x%.4X",
program, error);
}
static bool HasNonVBOAttribs(const DbgContext * const ctx)
@@ -288,14 +290,16 @@ void DbgContext::glVertexAttribPointer(GLuint indx, GLint size, GLenum type,
void DbgContext::glEnableVertexAttribArray(GLuint index)
{
assert(index < MAX_VERTEX_ATTRIBS);
if (index >= MAX_VERTEX_ATTRIBS)
return;
vertexAttribs[index].enabled = true;
hasNonVBOAttribs = HasNonVBOAttribs(this);
}
void DbgContext::glDisableVertexAttribArray(GLuint index)
{
assert(index < MAX_VERTEX_ATTRIBS);
if (index >= MAX_VERTEX_ATTRIBS)
return;
vertexAttribs[index].enabled = false;
hasNonVBOAttribs = HasNonVBOAttribs(this);
}

View File

@@ -437,6 +437,7 @@ bool Message_Type_IsValid(int value) {
case 1:
case 2:
case 3:
case 4:
return true;
default:
return false;
@@ -448,6 +449,7 @@ const Message_Type Message::BeforeCall;
const Message_Type Message::AfterCall;
const Message_Type Message::AfterGeneratedCall;
const Message_Type Message::Response;
const Message_Type Message::CompleteCall;
const Message_Type Message::Type_MIN;
const Message_Type Message::Type_MAX;
const int Message::Type_ARRAYSIZE;

View File

@@ -237,11 +237,12 @@ enum Message_Type {
Message_Type_BeforeCall = 0,
Message_Type_AfterCall = 1,
Message_Type_AfterGeneratedCall = 2,
Message_Type_Response = 3
Message_Type_Response = 3,
Message_Type_CompleteCall = 4
};
bool Message_Type_IsValid(int value);
const Message_Type Message_Type_Type_MIN = Message_Type_BeforeCall;
const Message_Type Message_Type_Type_MAX = Message_Type_Response;
const Message_Type Message_Type_Type_MAX = Message_Type_CompleteCall;
const int Message_Type_Type_ARRAYSIZE = Message_Type_Type_MAX + 1;
enum Message_DataType {
@@ -513,6 +514,7 @@ class Message : public ::google::protobuf::MessageLite {
static const Type AfterCall = Message_Type_AfterCall;
static const Type AfterGeneratedCall = Message_Type_AfterGeneratedCall;
static const Type Response = Message_Type_Response;
static const Type CompleteCall = Message_Type_CompleteCall;
static inline bool Type_IsValid(int value) {
return Message_Type_IsValid(value);
}

View File

@@ -28,7 +28,8 @@ namespace android
{
int serverSock = -1, clientSock = -1;
FILE * file = NULL;
unsigned int MAX_FILE_SIZE = 0;
int timeMode = SYSTEM_TIME_THREAD;
static void Die(const char * msg)
@@ -38,18 +39,25 @@ static void Die(const char * msg)
exit(1);
}
void StartDebugServer(unsigned short port)
void StartDebugServer(const unsigned short port, const bool forceUseFile,
const unsigned int maxFileSize, const char * const filePath)
{
MAX_FILE_SIZE = maxFileSize;
LOGD("GLESv2_dbg: StartDebugServer");
if (serverSock >= 0)
if (serverSock >= 0 || file)
return;
LOGD("GLESv2_dbg: StartDebugServer create socket");
struct sockaddr_in server = {}, client = {};
/* Create the TCP socket */
if ((serverSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
Die("Failed to create socket");
if (forceUseFile || (serverSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
file = fopen(filePath, "wb");
if (!file)
Die("Failed to create socket and file");
else
return;
}
/* Construct the server sockaddr_in structure */
server.sin_family = AF_INET; /* Internet/IP */
@@ -92,13 +100,17 @@ void StopDebugServer()
close(serverSock);
serverSock = -1;
}
if (file) {
fclose(file);
file = NULL;
}
}
void Receive(glesv2debugger::Message & cmd)
{
if (clientSock < 0)
return;
unsigned len = 0;
int received = recv(clientSock, &len, 4, MSG_WAITALL);
if (received < 0)
Die("Failed to receive response length");
@@ -106,7 +118,6 @@ void Receive(glesv2debugger::Message & cmd)
LOGD("received %dB: %.8X", received, len);
Die("Received length mismatch, expected 4");
}
len = ntohl(len);
static void * buffer = NULL;
static unsigned bufferSize = 0;
if (bufferSize < len) {
@@ -125,6 +136,8 @@ void Receive(glesv2debugger::Message & cmd)
bool TryReceive(glesv2debugger::Message & cmd)
{
if (clientSock < 0)
return false;
fd_set readSet;
FD_ZERO(&readSet);
FD_SET(clientSock, &readSet);
@@ -153,7 +166,19 @@ 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);
uint32_t len = htonl(str.length());
const uint32_t len = str.length();
if (clientSock < 0) {
if (file) {
fwrite(&len, sizeof(len), 1, file);
fwrite(str.data(), len, 1, file);
if (ftell(file) >= MAX_FILE_SIZE) {
fclose(file);
Die("MAX_FILE_SIZE reached");
}
}
pthread_mutex_unlock(&mutex);
return 0;
}
int sent = -1;
sent = send(clientSock, &len, sizeof(len), 0);
if (sent != sizeof(len)) {

View File

@@ -28,7 +28,10 @@ DbgContext * CreateDbgContext(const pthread_key_t EGLThreadLocalStorageKey,
void DestroyDbgContext(DbgContext * const dbg);
void StartDebugServer(unsigned short port); // create and bind socket if haven't already
// create and bind socket if haven't already, if failed to create socket or
// forceUseFile, then open /data/local/tmp/dump.gles2dbg, exit when size reached
void StartDebugServer(const unsigned short port, const bool forceUseFile,
const unsigned int maxFileSize, const char * const filePath);
void StopDebugServer(); // close socket if open
}; // namespace android