static pthread_once_t sPthreadOnceKey = PTHREAD_ONCE_INIT;
void createTLSKey() {
- pthread_key_create(&sTLSKey, NULL);
+ pthread_key_create(&sTLSKey, (void (*)(void*))&releaseContext);
}
GLTraceContext *getGLTraceContext() {
const size_t DEFAULT_BUFFER_SIZE = 8192;
BufferedOutputStream *stream = new BufferedOutputStream(mStream, DEFAULT_BUFFER_SIZE);
- GLTraceContext *traceContext = new GLTraceContext(id, this, stream);
+ GLTraceContext *traceContext = new GLTraceContext(id, version, this, stream);
mPerContextState[eglContext] = traceContext;
return traceContext;
return mPerContextState[c];
}
-GLTraceContext::GLTraceContext(int id, GLTraceState *state, BufferedOutputStream *stream) {
- mId = id;
- mState = state;
-
+GLTraceContext::GLTraceContext(int id, int version, GLTraceState *state,
+ BufferedOutputStream *stream) :
+ mId(id),
+ mVersion(version),
+ mState(state),
+ mBufferedOutputStream(stream),
+ mElementArrayBuffers(DefaultKeyedVector<GLuint, ElementArrayBuffer*>(NULL))
+{
fbcontents = fbcompressed = NULL;
fbcontentsSize = 0;
- mBufferedOutputStream = stream;
}
int GLTraceContext::getId() {
return mId;
}
+int GLTraceContext::getVersion() {
+ return mVersion;
+}
+
GLTraceState *GLTraceContext::getGlobalTraceState() {
return mState;
}
GLMessage_Function func = msg->function();
if (func == GLMessage::eglSwapBuffers
+ || func == GLMessage::eglCreateContext
+ || func == GLMessage::eglMakeCurrent
|| func == GLMessage::glDrawArrays
|| func == GLMessage::glDrawElements) {
mBufferedOutputStream->flush();
}
}
+void GLTraceContext::bindBuffer(GLuint bufferId, GLvoid *data, GLsizeiptr size) {
+ // free previously bound buffer if any
+ ElementArrayBuffer *oldBuffer = mElementArrayBuffers.valueFor(bufferId);
+ if (oldBuffer != NULL) {
+ delete oldBuffer;
+ }
+
+ mElementArrayBuffers.add(bufferId, new ElementArrayBuffer(data, size));
+}
+
+void GLTraceContext::getBuffer(GLuint bufferId, GLvoid **data, GLsizeiptr *size) {
+ ElementArrayBuffer *buffer = mElementArrayBuffers.valueFor(bufferId);
+ if (buffer == NULL) {
+ *data = NULL;
+ *size = 0;
+ } else {
+ *data = buffer->getBuffer();
+ *size = buffer->getSize();
+ }
+}
+
+void GLTraceContext::updateBufferSubData(GLuint bufferId, GLintptr offset, GLvoid *data,
+ GLsizeiptr size) {
+ ElementArrayBuffer *buffer = mElementArrayBuffers.valueFor(bufferId);
+ if (buffer != NULL) {
+ buffer->updateSubBuffer(offset, data, size);
+ }
+}
+
+void GLTraceContext::deleteBuffer(GLuint bufferId) {
+ ElementArrayBuffer *buffer = mElementArrayBuffers.valueFor(bufferId);
+ if (buffer != NULL) {
+ delete buffer;
+ mElementArrayBuffers.removeItem(bufferId);
+ }
+}
+
+ElementArrayBuffer::ElementArrayBuffer(GLvoid *buf, GLsizeiptr size) {
+ mBuf = malloc(size);
+ mSize = size;
+
+ if (buf != NULL) {
+ memcpy(mBuf, buf, size);
+ }
+}
+
+ElementArrayBuffer::~ElementArrayBuffer() {
+ if (mBuf != NULL) {
+ free(mBuf);
+ mSize = 0;
+ }
+
+ mBuf = NULL;
+}
+
+void ElementArrayBuffer::updateSubBuffer(GLintptr offset, const GLvoid* data, GLsizeiptr size) {
+ if (offset + size <= mSize) {
+ memcpy((char*)mBuf + offset, data, size);
+ }
+}
+
+GLvoid *ElementArrayBuffer::getBuffer() {
+ return mBuf;
+}
+
+GLsizeiptr ElementArrayBuffer::getSize() {
+ return mSize;
+}
+
}; // namespace gltrace
}; // namespace android