From eecde759ff6e2f919318739526a7fa0d76133bdc Mon Sep 17 00:00:00 2001 From: Rich Geldreich Date: Fri, 21 Mar 2014 20:49:39 -0700 Subject: [PATCH] - Initial support for KHR_debug API's in tracer/replayer --- glspec/dbg_final_gl_glx_whitelisted_funcs.txt | 7 + glspec/dbg_gl_all_funcs.txt | 12 +- glspec/dbg_gl_funcs.txt | 12 +- glspec/dbg_gl_glx_array_sizes.txt | 1 - glspec/gl.spec | 12 +- glspec/gl_glx_simple_replay_funcs.txt | 4 + glspec/gl_glx_whitelisted_funcs.txt | 11 +- src/voglcommon/vogl_gl_replayer.cpp | 158 ++++++++++++++++-- src/voglcommon/vogl_gl_replayer.h | 1 + src/vogltrace/vogl_intercept.cpp | 6 + 10 files changed, 190 insertions(+), 34 deletions(-) diff --git a/glspec/dbg_final_gl_glx_whitelisted_funcs.txt b/glspec/dbg_final_gl_glx_whitelisted_funcs.txt index 162c057..9be7ab3 100644 --- a/glspec/dbg_final_gl_glx_whitelisted_funcs.txt +++ b/glspec/dbg_final_gl_glx_whitelisted_funcs.txt @@ -184,8 +184,11 @@ glCreateShaderObjectARB glCullFace glCullParameterdvEXT glCullParameterfvEXT +glDebugMessageCallback glDebugMessageCallbackARB +glDebugMessageControl glDebugMessageControlARB +glDebugMessageInsert glDebugMessageInsertARB glDeleteBuffers glDeleteBuffersARB @@ -882,6 +885,8 @@ glNormalP3ui glNormalP3uiv glNormalPointer glNormalPointerEXT +glObjectLabel +glObjectPtrLabel glOrtho glPassThrough glPixelMapfv @@ -907,6 +912,7 @@ glPolygonOffsetEXT glPolygonStipple glPopAttrib glPopClientAttrib +glPopDebugGroup glPopMatrix glPopName glPrimitiveRestartIndex @@ -964,6 +970,7 @@ glProvokingVertex glProvokingVertexEXT glPushAttrib glPushClientAttrib +glPushDebugGroup glPushMatrix glPushName glQueryCounter diff --git a/glspec/dbg_gl_all_funcs.txt b/glspec/dbg_gl_all_funcs.txt index a4c487c..fd60019 100644 --- a/glspec/dbg_gl_all_funcs.txt +++ b/glspec/dbg_gl_all_funcs.txt @@ -5640,12 +5640,12 @@ Name: "DebugMessageCallback", ParamNames: 2, Params: 2, Return: "void", Category Name: "GetDebugMessageLog", ParamNames: 8, Params: 8, Return: "UInt32", Category: "KHR_debug", Version: "4.3", Profile: "", Deprecated: "", Lib: "gl" notlistable: 1 Name: "count", Type: "UInt32", Direction: "in", Semantic: "value", ArraySize: "", Retained: 0 Name: "bufsize", Type: "SizeI", Direction: "in", Semantic: "value", ArraySize: "", Retained: 0 - Name: "sources", Type: "GLenum", Direction: "out", Semantic: "array", ArraySize: "[COMPSIZE(count)]", Retained: 0 - Name: "types", Type: "GLenum", Direction: "out", Semantic: "array", ArraySize: "[COMPSIZE(count)]", Retained: 0 - Name: "ids", Type: "UInt32", Direction: "out", Semantic: "array", ArraySize: "[COMPSIZE(count)]", Retained: 0 - Name: "severities", Type: "GLenum", Direction: "out", Semantic: "array", ArraySize: "[COMPSIZE(count)]", Retained: 0 - Name: "lengths", Type: "SizeI", Direction: "out", Semantic: "array", ArraySize: "[COMPSIZE(count)]", Retained: 0 - Name: "messageLog", Type: "Char", Direction: "out", Semantic: "array", ArraySize: "[COMPSIZE(bufsize)]", Retained: 0 + Name: "sources", Type: "GLenum", Direction: "out", Semantic: "array", ArraySize: "[count]", Retained: 0 + Name: "types", Type: "GLenum", Direction: "out", Semantic: "array", ArraySize: "[count]", Retained: 0 + Name: "ids", Type: "UInt32", Direction: "out", Semantic: "array", ArraySize: "[count]", Retained: 0 + Name: "severities", Type: "GLenum", Direction: "out", Semantic: "array", ArraySize: "[count]", Retained: 0 + Name: "lengths", Type: "SizeI", Direction: "out", Semantic: "array", ArraySize: "[count]", Retained: 0 + Name: "messageLog", Type: "Char", Direction: "out", Semantic: "array", ArraySize: "[bufsize]", Retained: 0 Name: "PushDebugGroup", ParamNames: 4, Params: 4, Return: "void", Category: "KHR_debug", Version: "4.3", Profile: "", Deprecated: "", Lib: "gl" notlistable: 0 Name: "source", Type: "GLenum", Direction: "in", Semantic: "value", ArraySize: "", Retained: 0 diff --git a/glspec/dbg_gl_funcs.txt b/glspec/dbg_gl_funcs.txt index c8775f0..faf63cf 100644 --- a/glspec/dbg_gl_funcs.txt +++ b/glspec/dbg_gl_funcs.txt @@ -5640,12 +5640,12 @@ Name: "DebugMessageCallback", ParamNames: 2, Params: 2, Return: "void", Category Name: "GetDebugMessageLog", ParamNames: 8, Params: 8, Return: "UInt32", Category: "KHR_debug", Version: "4.3", Profile: "", Deprecated: "", Lib: "gl" notlistable: 1 Name: "count", Type: "UInt32", Direction: "in", Semantic: "value", ArraySize: "", Retained: 0 Name: "bufsize", Type: "SizeI", Direction: "in", Semantic: "value", ArraySize: "", Retained: 0 - Name: "sources", Type: "GLenum", Direction: "out", Semantic: "array", ArraySize: "[COMPSIZE(count)]", Retained: 0 - Name: "types", Type: "GLenum", Direction: "out", Semantic: "array", ArraySize: "[COMPSIZE(count)]", Retained: 0 - Name: "ids", Type: "UInt32", Direction: "out", Semantic: "array", ArraySize: "[COMPSIZE(count)]", Retained: 0 - Name: "severities", Type: "GLenum", Direction: "out", Semantic: "array", ArraySize: "[COMPSIZE(count)]", Retained: 0 - Name: "lengths", Type: "SizeI", Direction: "out", Semantic: "array", ArraySize: "[COMPSIZE(count)]", Retained: 0 - Name: "messageLog", Type: "Char", Direction: "out", Semantic: "array", ArraySize: "[COMPSIZE(bufsize)]", Retained: 0 + Name: "sources", Type: "GLenum", Direction: "out", Semantic: "array", ArraySize: "[count]", Retained: 0 + Name: "types", Type: "GLenum", Direction: "out", Semantic: "array", ArraySize: "[count]", Retained: 0 + Name: "ids", Type: "UInt32", Direction: "out", Semantic: "array", ArraySize: "[count]", Retained: 0 + Name: "severities", Type: "GLenum", Direction: "out", Semantic: "array", ArraySize: "[count]", Retained: 0 + Name: "lengths", Type: "SizeI", Direction: "out", Semantic: "array", ArraySize: "[count]", Retained: 0 + Name: "messageLog", Type: "Char", Direction: "out", Semantic: "array", ArraySize: "[bufsize]", Retained: 0 Name: "PushDebugGroup", ParamNames: 4, Params: 4, Return: "void", Category: "KHR_debug", Version: "4.3", Profile: "", Deprecated: "", Lib: "gl" notlistable: 0 Name: "source", Type: "GLenum", Direction: "in", Semantic: "value", ArraySize: "", Retained: 0 diff --git a/glspec/dbg_gl_glx_array_sizes.txt b/glspec/dbg_gl_glx_array_sizes.txt index 3327d90..a76ac9c 100644 --- a/glspec/dbg_gl_glx_array_sizes.txt +++ b/glspec/dbg_gl_glx_array_sizes.txt @@ -9,7 +9,6 @@ [COMPSIZE(attribute)] [COMPSIZE(buf,length)] [COMPSIZE(buffer)] -[COMPSIZE(bufsize)] [COMPSIZE(count)] [COMPSIZE(count,type)] [COMPSIZE(drawcount,stride)] diff --git a/glspec/gl.spec b/glspec/gl.spec index 64c356f..ca6c273 100644 --- a/glspec/gl.spec +++ b/glspec/gl.spec @@ -15495,12 +15495,12 @@ GetDebugMessageLog(count, bufsize, sources, types, ids, severities, lengths, mes return UInt32 param count UInt32 in value param bufsize SizeI in value - param sources GLenum out array [COMPSIZE(count)] - param types GLenum out array [COMPSIZE(count)] - param ids UInt32 out array [COMPSIZE(count)] - param severities GLenum out array [COMPSIZE(count)] - param lengths SizeI out array [COMPSIZE(count)] - param messageLog Char out array [COMPSIZE(bufsize)] + param sources GLenum out array [count] + param types GLenum out array [count] + param ids UInt32 out array [count] + param severities GLenum out array [count] + param lengths SizeI out array [count] + param messageLog Char out array [bufsize] category KHR_debug dlflags notlistable version 4.3 diff --git a/glspec/gl_glx_simple_replay_funcs.txt b/glspec/gl_glx_simple_replay_funcs.txt index 38f311e..bc0f584 100644 --- a/glspec/gl_glx_simple_replay_funcs.txt +++ b/glspec/gl_glx_simple_replay_funcs.txt @@ -648,3 +648,7 @@ glWindowPos3s glWindowPos3sARB glWindowPos3sv glWindowPos3svARB +glPopDebugGroup +glDebugMessageControl +glDebugMessageControlARB +glPushDebugGroup diff --git a/glspec/gl_glx_whitelisted_funcs.txt b/glspec/gl_glx_whitelisted_funcs.txt index 6a63034..4ac6be1 100644 --- a/glspec/gl_glx_whitelisted_funcs.txt +++ b/glspec/gl_glx_whitelisted_funcs.txt @@ -58,7 +58,6 @@ glCreateProgramObjectARB glCreateShader glCreateShaderObjectARB glDebugMessageCallbackARB -glDebugMessageControlARB glDebugMessageInsertARB glDeleteBuffers glDeleteBuffersARB @@ -192,7 +191,6 @@ glGetConvolutionParameterfvEXT glGetConvolutionParameteriv glGetConvolutionParameterivEXT glGetConvolutionParameterxvOES -glGetDebugMessageLog glGetDebugMessageLogAMD glGetDebugMessageLogARB glGetDetailTexFuncSGIS @@ -322,11 +320,9 @@ glGetnUniformivARB glGetnUniformuivARB glGetObjectBufferfvATI glGetObjectBufferivATI -glGetObjectLabel glGetObjectParameterfvARB glGetObjectParameterivAPPLE glGetObjectParameterivARB -glGetObjectPtrLabel glGetOcclusionQueryivNV glGetOcclusionQueryuivNV glGetPathColorGenfvNV @@ -730,3 +726,10 @@ glXSwapIntervalSGI glXUseXFont glXWaitGL glXWaitX +glDebugMessageInsert +glDebugMessageCallback +glObjectLabel +glObjectPtrLabel +glGetObjectLabel +glGetObjectPtrLabel +glGetDebugMessageLog diff --git a/src/voglcommon/vogl_gl_replayer.cpp b/src/voglcommon/vogl_gl_replayer.cpp index 2f7ef0a..deb3cea 100644 --- a/src/voglcommon/vogl_gl_replayer.cpp +++ b/src/voglcommon/vogl_gl_replayer.cpp @@ -1499,6 +1499,32 @@ void vogl_gl_replayer::debug_callback_arb(GLenum source, GLenum type, GLuint id, } } +//---------------------------------------------------------------------------------------------------------------------- +// vogl_replayer::debug_callback +//---------------------------------------------------------------------------------------------------------------------- +void vogl_gl_replayer::debug_callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, GLvoid *pUser_param) +{ + VOGL_FUNC_TRACER + + VOGL_NOTE_UNUSED(length); + + char final_message[4096]; + + context_state *pContext_state = (context_state *)(pUser_param); + + vogl_format_debug_output_arb(final_message, sizeof(final_message), source, type, id, severity, reinterpret_cast(message)); + + if (pContext_state) + { + vogl_warning_printf("%s: Trace context: 0x%" PRIX64 ", Replay context 0x%" PRIX64 ", Last trace call counter: %" PRIu64 "\n%s\n", VOGL_FUNCTION_NAME, + cast_val_to_uint64(pContext_state->m_trace_context), cast_val_to_uint64(pContext_state->m_replay_context), cast_val_to_uint64(pContext_state->m_last_call_counter), final_message); + } + else + { + vogl_warning_printf("%s: %s\n", VOGL_FUNCTION_NAME, final_message); + } +} + //---------------------------------------------------------------------------------------------------------------------- // vogl_replayer::is_extension_supported //---------------------------------------------------------------------------------------------------------------------- @@ -8449,14 +8475,6 @@ vogl_gl_replayer::status_t vogl_gl_replayer::process_gl_entrypoint_packet_intern // TODO - we need to hook up this extension to the tracer break; } - case VOGL_ENTRYPOINT_glDebugMessageCallbackARB: - case VOGL_ENTRYPOINT_glGetDebugMessageLogARB: - case VOGL_ENTRYPOINT_glDebugMessageControlARB: - case VOGL_ENTRYPOINT_glDebugMessageInsertARB: - { - // TODO - break; - } case VOGL_ENTRYPOINT_glBitmap: { VOGL_REPLAY_LOAD_PARAMS_HELPER_glBitmap; @@ -8723,6 +8741,126 @@ vogl_gl_replayer::status_t vogl_gl_replayer::process_gl_entrypoint_packet_intern break; } + case VOGL_ENTRYPOINT_glDebugMessageInsert: + { + VOGL_REPLAY_LOAD_PARAMS_HELPER_glDebugMessageInsert; + + VOGL_REPLAY_CALL_GL_HELPER_glDebugMessageInsert; + break; + } + case VOGL_ENTRYPOINT_glDebugMessageInsertARB: + { + VOGL_REPLAY_LOAD_PARAMS_HELPER_glDebugMessageInsertARB; + + VOGL_REPLAY_CALL_GL_HELPER_glDebugMessageInsertARB; + break; + } + case VOGL_ENTRYPOINT_glDebugMessageCallbackARB: + { + GL_ENTRYPOINT(glDebugMessageCallbackARB)(debug_callback_arb, (GLvoid *)m_pCur_context_state); + + break; + } + case VOGL_ENTRYPOINT_glDebugMessageCallback: + { + GL_ENTRYPOINT(glDebugMessageCallback)(debug_callback, (GLvoid *)m_pCur_context_state); + + break; + } + case VOGL_ENTRYPOINT_glObjectLabel: + { + VOGL_REPLAY_LOAD_PARAMS_HELPER_glObjectLabel; + + switch (identifier) + { + case GL_BUFFER: + { + name = map_handle(get_shared_state()->m_buffers, name); + break; + } + case GL_SHADER: + case GL_PROGRAM: + { + name = map_handle(get_shared_state()->m_shadow_state.m_objs, name); + break; + } + case GL_VERTEX_ARRAY: + { + name = map_handle(get_shared_state()->m_vertex_array_objects, name); + break; + } + case GL_QUERY: + { + name = map_handle(get_shared_state()->m_queries, name); + break; + } + case GL_SAMPLER: + { + name = map_handle(get_shared_state()->m_sampler_objects, name); + break; + } + case GL_TEXTURE: + { + name = map_handle(get_shared_state()->m_shadow_state.m_textures, name); + break; + } + case GL_RENDERBUFFER: + { + name = map_handle(get_shared_state()->m_shadow_state.m_rbos, name); + break; + } + case GL_FRAMEBUFFER: + { + name = map_handle(get_shared_state()->m_framebuffers, name); + break; + } + case GL_DISPLAY_LIST: + { + name = map_handle(get_shared_state()->m_lists, name); + break; + } + case GL_TRANSFORM_FEEDBACK: // TODO: Investigate this more + case GL_PROGRAM_PIPELINE: // TODO: We don't support program pipelines yet + default: + { + process_entrypoint_error("%s: Unsupported object identifier 0x%X\n", VOGL_METHOD_NAME, identifier); + return cStatusSoftFailure; + } + } + + VOGL_REPLAY_CALL_GL_HELPER_glObjectLabel; + + break; + } + case VOGL_ENTRYPOINT_glObjectPtrLabel: + { + vogl_sync_ptr_value trace_sync = trace_packet.get_param_ptr_value(0); + GLsizei length = trace_packet.get_param_value(1); + const GLchar *pTrace_label = reinterpret_cast(trace_packet.get_param_client_memory_ptr(2)); + GLsync replay_sync = NULL; + + if (trace_sync) + { + gl_sync_hash_map::const_iterator it = get_shared_state()->m_syncs.find(trace_sync); + if (it == get_shared_state()->m_syncs.end()) + { + process_entrypoint_error("%s: Failed remapping trace sync value 0x%" PRIx64 "\n", VOGL_METHOD_NAME, static_cast(trace_sync)); + return cStatusSoftFailure; + } + else + { + replay_sync = it->second; + } + } + + GL_ENTRYPOINT(glObjectPtrLabel)(replay_sync, length, pTrace_label); + + break; + } + case VOGL_ENTRYPOINT_glGetDebugMessageLogARB: + case VOGL_ENTRYPOINT_glGetObjectLabel: + case VOGL_ENTRYPOINT_glGetObjectPtrLabel: + case VOGL_ENTRYPOINT_glGetDebugMessageLog: case VOGL_ENTRYPOINT_glAreTexturesResident: case VOGL_ENTRYPOINT_glAreTexturesResidentEXT: case VOGL_ENTRYPOINT_glGetActiveAtomicCounterBufferiv: @@ -8774,7 +8912,7 @@ vogl_gl_replayer::status_t vogl_gl_replayer::process_gl_entrypoint_packet_intern case VOGL_ENTRYPOINT_glGetConvolutionParameteriv: case VOGL_ENTRYPOINT_glGetConvolutionParameterivEXT: case VOGL_ENTRYPOINT_glGetConvolutionParameterxvOES: - case VOGL_ENTRYPOINT_glGetDebugMessageLog: + case VOGL_ENTRYPOINT_glGetDebugMessageLogAMD: case VOGL_ENTRYPOINT_glGetDetailTexFuncSGIS: case VOGL_ENTRYPOINT_glGetDoubleIndexedvEXT: @@ -8876,10 +9014,8 @@ vogl_gl_replayer::status_t vogl_gl_replayer::process_gl_entrypoint_packet_intern case VOGL_ENTRYPOINT_glGetNamedStringivARB: case VOGL_ENTRYPOINT_glGetObjectBufferfvATI: case VOGL_ENTRYPOINT_glGetObjectBufferivATI: - case VOGL_ENTRYPOINT_glGetObjectLabel: case VOGL_ENTRYPOINT_glGetObjectParameterfvARB: case VOGL_ENTRYPOINT_glGetObjectParameterivAPPLE: - case VOGL_ENTRYPOINT_glGetObjectPtrLabel: case VOGL_ENTRYPOINT_glGetOcclusionQueryivNV: case VOGL_ENTRYPOINT_glGetOcclusionQueryuivNV: case VOGL_ENTRYPOINT_glGetPathColorGenfvNV: diff --git a/src/voglcommon/vogl_gl_replayer.h b/src/voglcommon/vogl_gl_replayer.h index 4d15b54..2ae259c 100644 --- a/src/voglcommon/vogl_gl_replayer.h +++ b/src/voglcommon/vogl_gl_replayer.h @@ -1281,6 +1281,7 @@ private: // Loosely derived from http://www.altdevblogaday.com/2011/06/23/improving-opengl-error-messages/ static void debug_callback_arb(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, GLvoid *pUser_param); + static void debug_callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, GLvoid *pUser_param); bool is_extension_supported(const char *pExt); diff --git a/src/vogltrace/vogl_intercept.cpp b/src/vogltrace/vogl_intercept.cpp index e8c8121..9037524 100644 --- a/src/vogltrace/vogl_intercept.cpp +++ b/src/vogltrace/vogl_intercept.cpp @@ -3080,6 +3080,12 @@ static inline bool vogl_func_is_nulled(gl_entrypoint_id_t id) #define DEF_FUNCTION_PARAM_COMPUTE_ARRAY_SIZE_FUNC_glMap2f_points(e, c, rt, r, nu, ne, a, p) vogl_determine_glMap2_size(target, ustride, uorder, vstride, vorder) #define DEF_FUNCTION_PARAM_COMPUTE_ARRAY_SIZE_FUNC_glMap2d_points(e, c, rt, r, nu, ne, a, p) vogl_determine_glMap2_size(target, ustride, uorder, vstride, vorder) +// KHR_debug +#define DEF_FUNCTION_PARAM_COMPUTE_ARRAY_SIZE_FUNC_glDebugMessageInsert_buf(e, c, rt, r, nu, ne, a, p) ((length < 0) ? (buf ? strlen((const char *)buf) : 0 ) : length) +#define DEF_FUNCTION_PARAM_COMPUTE_ARRAY_SIZE_FUNC_glPushDebugGroup_message(e, c, rt, r, nu, ne, a, p) ((length < 0) ? (message ? strlen((const char *)message) : 0 ) : length) +#define DEF_FUNCTION_PARAM_COMPUTE_ARRAY_SIZE_FUNC_glObjectLabel_label(e, c, rt, r, nu, ne, a, p) ((length < 0) ? (label ? strlen((const char *)label) : 0 ) : length) +#define DEF_FUNCTION_PARAM_COMPUTE_ARRAY_SIZE_FUNC_glObjectPtrLabel_label(e, c, rt, r, nu, ne, a, p) ((length < 0) ? (label ? strlen((const char *)label) : 0 ) : length) + //---------------------------------------------------------------------------------------------------------------------- // Texture/image API's array size helper macros // TODO: For glTexImage3DEXT, glTexSubImage1DEXT, etc. - should these check the currently bound GL_PIXEL_UNPACK_BUFFER? -- 2.43.0