Merge "GLES2Dbg: use dump.gles2dbg file when fails to create socket"
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user