X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=wrappers%2Fgltrace.py;h=853a4bc36ec81d192ab70f28814fa81a28d5d827;hb=ddf6d2c5e347f8ca25dad4d9be4a1494d8929d30;hp=411a19b16a630c71deec2cc6581e94f9c6eebe4d;hpb=c748fbcb434374ec13e14cc837ade7c581789e0c;p=apitrace diff --git a/wrappers/gltrace.py b/wrappers/gltrace.py index 411a19b..853a4bc 100644 --- a/wrappers/gltrace.py +++ b/wrappers/gltrace.py @@ -141,6 +141,8 @@ class GlTracer(Tracer): print '}' print + self.defineShadowBufferHelper() + # Whether we need user arrays print 'static inline bool _need_user_arrays(void)' print '{' @@ -296,12 +298,7 @@ class GlTracer(Tracer): print ' switch (pname) {' for function, type, count, name in glparams.parameters: if type is not None: - print ' case %s: return %u;' % (name, count) - print ' case GL_COMPRESSED_TEXTURE_FORMATS: {' - print ' GLint num_compressed_texture_formats = 0;' - print ' _glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS, &num_compressed_texture_formats);' - print ' return num_compressed_texture_formats;' - print ' }' + print ' case %s: return %s;' % (name, count) print ' default:' print r' os::log("apitrace: warning: %s: unknown GLenum 0x%04X\n", __FUNCTION__, pname);' print ' return 1;' @@ -335,7 +332,7 @@ class GlTracer(Tracer): print ' if (!procPtr) {' print ' return procPtr;' print ' }' - for function in api.functions: + for function in api.getAllFunctions(): ptype = function_pointer_type(function) pvalue = function_pointer_value(function) print ' if (strcmp("%s", (const char *)procName) == 0) {' % function.name @@ -349,6 +346,52 @@ class GlTracer(Tracer): else: Tracer.traceApi(self, api) + def defineShadowBufferHelper(self): + print 'void _shadow_glGetBufferSubData(GLenum target, GLintptr offset,' + print ' GLsizeiptr size, GLvoid *data)' + print '{' + print ' gltrace::Context *ctx = gltrace::getContext();' + print ' if (!ctx->needsShadowBuffers() || target != GL_ELEMENT_ARRAY_BUFFER) {' + print ' _glGetBufferSubData(target, offset, size, data);' + print ' return;' + print ' }' + print + print ' GLint buffer_binding = 0;' + print ' _glGetIntegerv(target, &buffer_binding);' + print ' if (buffer_binding > 0) {' + print ' gltrace::Buffer & buf = ctx->buffers[buffer_binding];' + print ' buf.getSubData(offset, size, data);' + print ' }' + print '}' + + def shadowBufferMethod(self, method): + # Emit code to fetch the shadow buffer, and invoke a method + print ' gltrace::Context *ctx = gltrace::getContext();' + print ' if (ctx->needsShadowBuffers() && target == GL_ELEMENT_ARRAY_BUFFER) {' + print ' GLint buffer_binding = 0;' + print ' _glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &buffer_binding);' + print ' if (buffer_binding > 0) {' + print ' gltrace::Buffer & buf = ctx->buffers[buffer_binding];' + print ' buf.' + method + ';' + print ' }' + print ' }' + print + + def shadowBufferProlog(self, function): + if function.name == 'glBufferData': + self.shadowBufferMethod('bufferData(size, data)') + + if function.name == 'glBufferSubData': + self.shadowBufferMethod('bufferSubData(offset, size, data)') + + if function.name == 'glDeleteBuffers': + print ' gltrace::Context *ctx = gltrace::getContext();' + print ' if (ctx->needsShadowBuffers()) {' + print ' for (GLsizei i = 0; i < n; i++) {' + print ' ctx->buffers.erase(buffer[i]);' + print ' }' + print ' }' + array_pointer_function_names = set(( "glVertexPointer", "glNormalPointer", @@ -557,6 +600,7 @@ class GlTracer(Tracer): print ' _glGetBufferParameteriv(target, GL_BUFFER_SIZE, &size);' print ' if (map && size > 0) {' self.emit_memcpy('map', 'map', 'size') + self.shadowBufferMethod('bufferSubData(0, size, map)') print ' }' print ' }' if function.name == 'glUnmapNamedBufferEXT': @@ -632,6 +676,8 @@ class GlTracer(Tracer): print ' }' print ' }' + self.shadowBufferProlog(function) + Tracer.traceFunctionImplBody(self, function) marker_functions = [ @@ -773,25 +819,6 @@ class GlTracer(Tracer): ]) def serializeArgValue(self, function, arg): - if function.name in self.draw_function_names and arg.name == 'indices': - print ' GLint _element_array_buffer = 0;' - print ' _glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &_element_array_buffer);' - print ' if (!_element_array_buffer) {' - if isinstance(arg.type, stdapi.Array): - print ' trace::localWriter.beginArray(%s);' % arg.type.length - print ' for(GLsizei i = 0; i < %s; ++i) {' % arg.type.length - print ' trace::localWriter.beginElement();' - print ' trace::localWriter.writeBlob(%s[i], count[i]*_gl_type_size(type));' % (arg.name) - print ' trace::localWriter.endElement();' - print ' }' - print ' trace::localWriter.endArray();' - else: - print ' trace::localWriter.writeBlob(%s, count*_gl_type_size(type));' % (arg.name) - print ' } else {' - Tracer.serializeArgValue(self, function, arg) - print ' }' - return - # Recognize offsets instead of blobs when a PBO is bound if function.name in self.unpack_function_names \ and (isinstance(arg.type, stdapi.Blob) \