From: José Fonseca Date: Mon, 9 May 2011 10:11:37 +0000 (+0100) Subject: Handle user pointer arrays in more draw calls. X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=5c749e38f3bf40677bf3fcd71d36ab694699dfea;p=apitrace Handle user pointer arrays in more draw calls. --- diff --git a/glapi.py b/glapi.py index f97e42d..a1f3ab0 100644 --- a/glapi.py +++ b/glapi.py @@ -360,7 +360,7 @@ glapi.add_functions([ # GL_VERSION_1_1 GlFunction(Void, "glDrawArrays", [(GLenum_mode, "mode"), (GLint, "first"), (GLsizei, "count")]), - GlFunction(Void, "glDrawElements", [(GLenum_mode, "mode"), (GLsizei, "count"), (GLenum, "type"), (Const(OpaquePointer(GLvoid)), "indices")]), + GlFunction(Void, "glDrawElements", [(GLenum_mode, "mode"), (GLsizei, "count"), (GLenum, "type"), (OpaquePointer(Const(GLvoid)), "indices")]), GlFunction(Void, "glGetPointerv", [(GLenum, "pname"), Out(Pointer(OpaquePointer(GLvoid)), "params")], sideeffects=False), GlFunction(Void, "glPolygonOffset", [(GLfloat, "factor"), (GLfloat, "units")]), GlFunction(Void, "glCopyTexImage1D", [(GLenum, "target"), (GLint, "level"), (GLenum, "internalformat"), (GLint, "x"), (GLint, "y"), (GLsizei, "width"), (GLint, "border")]), @@ -395,7 +395,7 @@ glapi.add_functions([ # GL_VERSION_1_2 GlFunction(Void, "glBlendColor", [(GLclampf, "red"), (GLclampf, "green"), (GLclampf, "blue"), (GLclampf, "alpha")]), GlFunction(Void, "glBlendEquation", [(GLenum, "mode")]), - GlFunction(Void, "glDrawRangeElements", [(GLenum_mode, "mode"), (GLuint, "start"), (GLuint, "end"), (GLsizei, "count"), (GLenum, "type"), (Const(OpaquePointer(GLvoid)), "indices")]), + GlFunction(Void, "glDrawRangeElements", [(GLenum_mode, "mode"), (GLuint, "start"), (GLuint, "end"), (GLsizei, "count"), (GLenum, "type"), (OpaquePointer(Const(GLvoid)), "indices")]), GlFunction(Void, "glTexImage3D", [(GLenum, "target"), (GLint, "level"), (GLenum_int, "internalformat"), (GLsizei, "width"), (GLsizei, "height"), (GLsizei, "depth"), (GLint, "border"), (GLenum, "format"), (GLenum, "type"), (Blob(Const(GLvoid), "__glTexImage3D_size(format, type, width, height, depth)"), "pixels")]), GlFunction(Void, "glTexSubImage3D", [(GLenum, "target"), (GLint, "level"), (GLint, "xoffset"), (GLint, "yoffset"), (GLint, "zoffset"), (GLsizei, "width"), (GLsizei, "height"), (GLsizei, "depth"), (GLenum, "format"), (GLenum, "type"), (Blob(Const(GLvoid), "__glTexSubImage3D_size(format, type, width, height, depth)"), "pixels")]), GlFunction(Void, "glCopyTexSubImage3D", [(GLenum, "target"), (GLint, "level"), (GLint, "xoffset"), (GLint, "yoffset"), (GLint, "zoffset"), (GLint, "x"), (GLint, "y"), (GLsizei, "width"), (GLsizei, "height")]), @@ -718,8 +718,8 @@ glapi.add_functions([ GlFunction(String("const GLubyte *"), "glGetStringi", [(GLenum, "name"), (GLuint, "index")], sideeffects=False), # GL_VERSION_3_1 - GlFunction(Void, "glDrawArraysInstanced", [(GLenum, "mode"), (GLint, "first"), (GLsizei, "count"), (GLsizei, "primcount")]), - GlFunction(Void, "glDrawElementsInstanced", [(GLenum, "mode"), (GLsizei, "count"), (GLenum, "type"), (Const(OpaqueBlob(GLvoid, "__glDrawElementsInstanced_size(count, type)")), "indices"), (GLsizei, "primcount")]), + GlFunction(Void, "glDrawArraysInstanced", [(GLenum_mode, "mode"), (GLint, "first"), (GLsizei, "count"), (GLsizei, "primcount")]), + GlFunction(Void, "glDrawElementsInstanced", [(GLenum_mode, "mode"), (GLsizei, "count"), (GLenum, "type"), (OpaquePointer(Const(GLvoid)), "indices"), (GLsizei, "primcount")]), GlFunction(Void, "glTexBuffer", [(GLenum, "target"), (GLenum, "internalformat"), (GLuint, "buffer")]), GlFunction(Void, "glPrimitiveRestartIndex", [(GLuint, "index")]), @@ -973,8 +973,8 @@ glapi.add_functions([ GlFunction(Void, "glClampColorARB", [(GLenum, "target"), (GLenum, "clamp")]), # GL_ARB_draw_instanced - GlFunction(Void, "glDrawArraysInstancedARB", [(GLenum, "mode"), (GLint, "first"), (GLsizei, "count"), (GLsizei, "primcount")]), - GlFunction(Void, "glDrawElementsInstancedARB", [(GLenum, "mode"), (GLsizei, "count"), (GLenum, "type"), (Const(OpaquePointer(GLvoid)), "indices"), (GLsizei, "primcount")]), + GlFunction(Void, "glDrawArraysInstancedARB", [(GLenum_mode, "mode"), (GLint, "first"), (GLsizei, "count"), (GLsizei, "primcount")]), + GlFunction(Void, "glDrawElementsInstancedARB", [(GLenum_mode, "mode"), (GLsizei, "count"), (GLenum, "type"), (OpaquePointer(Const(GLvoid)), "indices"), (GLsizei, "primcount")]), # GL_ARB_framebuffer_object GlFunction(GLboolean, "glIsRenderbuffer", [(GLrenderbuffer, "renderbuffer")], sideeffects=False), @@ -1033,10 +1033,10 @@ glapi.add_functions([ GlFunction(Void, "glCopyBufferSubData", [(GLenum, "readTarget"), (GLenum, "writeTarget"), (GLintptr, "readOffset"), (GLintptr, "writeOffset"), (GLsizeiptr, "size")]), # GL_ARB_draw_elements_base_vertex - GlFunction(Void, "glDrawElementsBaseVertex", [(GLenum, "mode"), (GLsizei, "count"), (GLenum, "type"), (Const(OpaqueArray(GLvoid, "__glDrawElementsBaseVertex_size(count, type)")), "indices"), (GLint, "basevertex")]), - GlFunction(Void, "glDrawRangeElementsBaseVertex", [(GLenum, "mode"), (GLuint, "start"), (GLuint, "end"), (GLsizei, "count"), (GLenum, "type"), (Const(OpaqueArray(GLvoid, "__glDrawRangeElementsBaseVertex_size(count, type)")), "indices"), (GLint, "basevertex")]), - GlFunction(Void, "glDrawElementsInstancedBaseVertex", [(GLenum, "mode"), (GLsizei, "count"), (GLenum, "type"), (Const(OpaqueBlob(GLvoid, "__glDrawElementsInstancedBaseVertex_size(count, type)")), "indices"), (GLsizei, "primcount"), (GLint, "basevertex")]), - GlFunction(Void, "glMultiDrawElementsBaseVertex", [(GLenum, "mode"), (Const(Array(GLsizei, "primcount")), "count"), (GLenum, "type"), (Array(Opaque("const GLvoid *"), "primcount"), "indices"), (GLsizei, "primcount"), (Const(Array(GLint, "primcount")), "basevertex")]), + GlFunction(Void, "glDrawElementsBaseVertex", [(GLenum_mode, "mode"), (GLsizei, "count"), (GLenum, "type"), (OpaquePointer(Const(GLvoid)), "indices"), (GLint, "basevertex")]), + GlFunction(Void, "glDrawRangeElementsBaseVertex", [(GLenum_mode, "mode"), (GLuint, "start"), (GLuint, "end"), (GLsizei, "count"), (GLenum, "type"), (OpaquePointer(Const(GLvoid)), "indices"), (GLint, "basevertex")]), + GlFunction(Void, "glDrawElementsInstancedBaseVertex", [(GLenum_mode, "mode"), (GLsizei, "count"), (GLenum, "type"), (OpaquePointer(Const(GLvoid)), "indices"), (GLsizei, "primcount"), (GLint, "basevertex")]), + GlFunction(Void, "glMultiDrawElementsBaseVertex", [(GLenum_mode, "mode"), (Const(Array(GLsizei, "primcount")), "count"), (GLenum, "type"), (Array(Opaque("const GLvoid *"), "primcount"), "indices"), (GLsizei, "primcount"), (Const(Array(GLint, "primcount")), "basevertex")]), # GL_ARB_provoking_vertex GlFunction(Void, "glProvokingVertex", [(GLenum, "mode")]), @@ -1139,8 +1139,8 @@ glapi.add_functions([ GlFunction(Void, "glVertexAttribP4uiv", [(GLuint, "index"), (GLenum, "type"), (GLboolean, "normalized"), (Const(Pointer(GLuint)), "value")]), # GL_ARB_draw_indirect - GlFunction(Void, "glDrawArraysIndirect", [(GLenum, "mode"), (Const(OpaquePointer(GLvoid)), "indirect")]), - GlFunction(Void, "glDrawElementsIndirect", [(GLenum, "mode"), (GLenum, "type"), (Const(OpaquePointer(GLvoid)), "indirect")]), + GlFunction(Void, "glDrawArraysIndirect", [(GLenum_mode, "mode"), (Const(OpaquePointer(GLvoid)), "indirect")]), + GlFunction(Void, "glDrawElementsIndirect", [(GLenum_mode, "mode"), (GLenum, "type"), (Const(OpaquePointer(GLvoid)), "indirect")]), # GL_ARB_gpu_shader_fp64 GlFunction(Void, "glUniform1d", [(GLlocation, "location"), (GLdouble, "x")]), @@ -1368,7 +1368,7 @@ glapi.add_functions([ # GL_EXT_vertex_array GlFunction(Void, "glArrayElementEXT", [(GLint, "i")]), GlFunction(Void, "glColorPointerEXT", [(GLint, "size"), (GLenum, "type"), (GLsizei, "stride"), (GLsizei, "count"), (Const(OpaquePointer(GLvoid)), "pointer")]), - GlFunction(Void, "glDrawArraysEXT", [(GLenum, "mode"), (GLint, "first"), (GLsizei, "count")]), + GlFunction(Void, "glDrawArraysEXT", [(GLenum_mode, "mode"), (GLint, "first"), (GLsizei, "count")]), GlFunction(Void, "glEdgeFlagPointerEXT", [(GLsizei, "stride"), (GLsizei, "count"), (Const(OpaquePointer(GLboolean)), "pointer")]), GlFunction(Void, "glGetPointervEXT", [(GLenum, "pname"), Out(Pointer(OpaquePointer(GLvoid)), "params")], sideeffects=False), GlFunction(Void, "glIndexPointerEXT", [(GLenum, "type"), (GLsizei, "stride"), (GLsizei, "count"), (Const(OpaquePointer(GLvoid)), "pointer")]), @@ -1408,7 +1408,7 @@ glapi.add_functions([ GlFunction(Void, "glCullParameterfvEXT", [(GLenum, "pname"), (Array(GLfloat, "4"), "params")]), # GL_EXT_draw_range_elements - GlFunction(Void, "glDrawRangeElementsEXT", [(GLenum, "mode"), (GLuint, "start"), (GLuint, "end"), (GLsizei, "count"), (GLenum, "type"), (Const(OpaqueBlob(GLvoid, "__glDrawRangeElementsEXT_size(count, type)")), "indices")]), + GlFunction(Void, "glDrawRangeElementsEXT", [(GLenum_mode, "mode"), (GLuint, "start"), (GLuint, "end"), (GLsizei, "count"), (GLenum, "type"), (OpaquePointer(Const(GLvoid)), "indices")]), # GL_EXT_light_texture GlFunction(Void, "glApplyTextureEXT", [(GLenum, "mode")]), @@ -1902,8 +1902,8 @@ glapi.add_functions([ GlFunction(Void, "glUniform4uivEXT", [(GLint, "location"), (GLsizei, "count"), (Const(Array(GLuint, "count*4")), "value")]), # GL_EXT_draw_instanced - GlFunction(Void, "glDrawArraysInstancedEXT", [(GLenum, "mode"), (GLint, "start"), (GLsizei, "count"), (GLsizei, "primcount")]), - GlFunction(Void, "glDrawElementsInstancedEXT", [(GLenum, "mode"), (GLsizei, "count"), (GLenum, "type"), (Const(OpaqueBlob(GLvoid, "__glDrawElementsInstancedEXT_size(count, type)")), "indices"), (GLsizei, "primcount")]), + GlFunction(Void, "glDrawArraysInstancedEXT", [(GLenum_mode, "mode"), (GLint, "start"), (GLsizei, "count"), (GLsizei, "primcount")]), + GlFunction(Void, "glDrawElementsInstancedEXT", [(GLenum_mode, "mode"), (GLsizei, "count"), (GLenum, "type"), (OpaquePointer(Const(GLvoid)), "indices"), (GLsizei, "primcount")]), # GL_EXT_texture_buffer_object GlFunction(Void, "glTexBufferEXT", [(GLenum, "target"), (GLenum, "internalformat"), (GLuint, "buffer")]), diff --git a/glsize.hpp b/glsize.hpp index a897c46..37e370d 100644 --- a/glsize.hpp +++ b/glsize.hpp @@ -98,7 +98,7 @@ __glDrawArrays_maxindex(GLint first, GLsizei count) #define __glDrawArraysEXT_maxindex __glDrawArrays_maxindex static inline GLuint -__glDrawElements_maxindex(GLsizei count, GLenum type, const GLvoid *indices) +__glDrawElementsBaseVertex_maxindex(GLsizei count, GLenum type, const GLvoid *indices, GLint basevertex) { GLvoid *temp = 0; GLint __element_array_buffer = 0; @@ -155,18 +155,64 @@ __glDrawElements_maxindex(GLsizei count, GLenum type, const GLvoid *indices) free(temp); } + maxindex += basevertex; + return maxindex; } +#define __glDrawRangeElementsBaseVertex_maxindex(start, end, count, type, indices, basevertex) __glDrawElementsBaseVertex_maxindex(count, type, indices, basevertex) + +#define __glDrawElements_maxindex(count, type, indices) __glDrawElementsBaseVertex_maxindex(count, type, indices, 0); +#define __glDrawRangeElements_maxindex(start, end, count, type, indices) __glDrawElements_maxindex(count, type, indices) +#define __glDrawRangeElementsEXT_maxindex __glDrawRangeElements_maxindex + +#define __glDrawArraysInstanced_maxindex(first, count, primcount) __glDrawArrays_maxindex(first, count) +#define __glDrawElementsInstanced_maxindex(count, type, indices, primcount) __glDrawElements_maxindex(count, type, indices) +#define __glDrawElementsInstancedBaseVertex_maxindex(count, type, indices, primcount, basevertex) __glDrawElementsBaseVertex_maxindex(count, type, indices, basevertex) +#define __glDrawRangeElementsInstanced_maxindex(start, end, count, type, indices, primcount) __glDrawRangeElements_maxindex(start, end, count, type, indices) +#define __glDrawRangeElementsInstancedBaseVertex_maxindex(start, end, count, type, indices, primcount, basevertex) __glDrawRangeElementsBaseVertex_maxindex(start, end, count, type, indices, basevertex) + +#define __glDrawArraysInstancedARB_maxindex __glDrawArraysInstanced_maxindex +#define __glDrawElementsInstancedARB_maxindex __glDrawElementsInstanced_maxindex +#define __glDrawArraysInstancedEXT_maxindex __glDrawArraysInstanced_maxindex +#define __glDrawElementsInstancedEXT_maxindex __glDrawElementsInstanced_maxindex + static inline GLuint -__glDrawRangeElements_maxindex(GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices) -{ - (void)start; - (void)end; - return __glDrawElements_maxindex(count, type, indices); +__glDrawArraysIndirect_maxindex(const GLvoid *indirect) { + OS::DebugMessage("warning: %s: unsupported\n", __FUNCTION__); + return 0; } -#define __glDrawRangeElementsEXT_maxindex __glDrawRangeElements_maxindex +static inline GLuint +__glDrawElementsIndirect_maxindex(GLenum type, const GLvoid *indirect) { + OS::DebugMessage("warning: %s: unsupported\n", __FUNCTION__); + return 0; +} + +static inline GLuint +__glMultiDrawArrays_maxindex(const GLint *first, const GLsizei *count, GLsizei primcount) { + OS::DebugMessage("warning: %s: unsupported\n", __FUNCTION__); + return 0; +} + +static inline GLuint +__glMultiDrawElements_maxindex(const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount) { + OS::DebugMessage("warning: %s: unsupported\n", __FUNCTION__); + return 0; +} + +static inline GLuint +__glMultiDrawElementsBaseVertex_maxindex(const GLsizei *count, GLenum type, const GLvoid* *indices, GLsizei primcount, const GLint * basevertex) { + OS::DebugMessage("warning: %s: unsupported\n", __FUNCTION__); + return 0; +} + +#define __glMultiDrawArraysEXT_maxindex __glMultiDrawArrays_maxindex +#define __glMultiDrawElementsEXT_maxindex __glMultiDrawElements_maxindex + +#define __glMultiModeDrawArraysIBM_maxindex(first, count, primcount, modestride) __glMultiDrawArrays_maxindex(first, count, primcount) +#define __glMultiModeDrawElementsIBM_maxindex(count, type, indices, primcount, modestride) __glMultiDrawElements_maxindex(count, type, (const GLvoid **)indices, primcount) + static inline size_t __glCallLists_size(GLsizei n, GLenum type) diff --git a/gltrace.py b/gltrace.py index 665a2a7..c137f10 100644 --- a/gltrace.py +++ b/gltrace.py @@ -250,10 +250,29 @@ class GlTracer(Tracer): draw_function_names = set(( 'glDrawArrays', - 'glDrawArraysEXT', 'glDrawElements', 'glDrawRangeElements', + 'glMultiDrawArrays', + 'glMultiDrawElements', + 'glDrawArraysInstanced', + 'glDrawElementsInstanced', + 'glDrawArraysInstancedARB', + 'glDrawElementsInstancedARB', + 'glDrawElementsBaseVertex', + 'glDrawRangeElementsBaseVertex', + 'glDrawElementsInstancedBaseVertex', + 'glMultiDrawElementsBaseVertex', + 'glDrawArraysIndirect', + 'glDrawElementsIndirect', + 'glDrawArraysEXT', 'glDrawRangeElementsEXT', + 'glDrawRangeElementsEXT_size', + 'glMultiDrawArraysEXT', + 'glMultiDrawElementsEXT', + 'glMultiModeDrawArraysIBM', + 'glMultiModeDrawElementsIBM', + 'glDrawArraysInstancedEXT', + 'glDrawElementsInstancedEXT', )) interleaved_formats = [ @@ -395,9 +414,19 @@ class GlTracer(Tracer): print ' GLint __element_array_buffer = 0;' print ' __glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &__element_array_buffer);' print ' if (!__element_array_buffer) {' - print ' Trace::LiteralBlob((const void *)%s, count*__gl_type_size(type));' % (arg.name) + if isinstance(arg.type, stdapi.Array): + Tracer.dump_arg_instance(self, function, arg) + print ' Trace::BeginArray(%s);' % arg.type.length + print ' for(GLsizei i = 0; i < %s; ++i) {' % arg.type.length + print ' Trace::BeginElement();' + print ' Trace::LiteralBlob((const void *)%s, count[i]*__gl_type_size(type));' % (arg.name) + print ' Trace::EndElement();' + print ' }' + print ' Trace::EndArray();' + else: + print ' Trace::LiteralBlob((const void *)%s, count*__gl_type_size(type));' % (arg.name) print ' } else {' - print ' Trace::LiteralOpaque((const void *)%s);' % (arg.name) + Tracer.dump_arg_instance(self, function, arg) print ' }' return