Note: V3 requires this Mesa patch to pass http://lists.freedesktop.org/archives/mesa-dev/2014-February/054407.html
On Wed, 2014-02-19 at 21:59 +1100, Timothy Arceri wrote: > V3: > - moved piglit_display to end of the file > - made while() more readable > - added check for max values of implementation > - to avoid getting messages we are not interested in > test_push_pop_debug_group now only filters in the message types we want > > v2: > - add in subtest I accidently removed when tidying the code > > Pass: Intel i965 Mesa > > Fail: AMD Radeon HD 6670 - Catalyst 13.251 > Catalyst doesnt seem to pop ids correctly and also push doesnt accept a -1 > pararmeter when it should > > Signed-off-by: Timothy Arceri <[email protected]> > --- > tests/all.py | 1 + > tests/spec/khr_debug/CMakeLists.gl.txt | 1 + > tests/spec/khr_debug/debug-push-pop-group.c | 322 > ++++++++++++++++++++++++++++ > 3 files changed, 324 insertions(+) > create mode 100644 tests/spec/khr_debug/debug-push-pop-group.c > > diff --git a/tests/all.py b/tests/all.py > index ba34543..4c373a0 100644 > --- a/tests/all.py > +++ b/tests/all.py > @@ -1820,6 +1820,7 @@ add_plain_test(arb_debug_output, > 'arb_debug_output-api_error') > khr_debug = Group() > spec['KHR_debug'] = khr_debug > khr_debug['object-label'] = concurrent_test('khr_debug-object-label') > +khr_debug['push-pop-group'] = concurrent_test('khr_debug-push-pop-group') > > # Group ARB_occlusion_query2 > arb_occlusion_query2 = Group() > diff --git a/tests/spec/khr_debug/CMakeLists.gl.txt > b/tests/spec/khr_debug/CMakeLists.gl.txt > index b0079df..f7b32bd 100644 > --- a/tests/spec/khr_debug/CMakeLists.gl.txt > +++ b/tests/spec/khr_debug/CMakeLists.gl.txt > @@ -10,5 +10,6 @@ link_libraries ( > ) > > piglit_add_executable (khr_debug-object-label debug-object-label.c) > +piglit_add_executable (khr_debug-push-pop-group debug-push-pop-group.c) > > # vim: ft=cmake: > diff --git a/tests/spec/khr_debug/debug-push-pop-group.c > b/tests/spec/khr_debug/debug-push-pop-group.c > new file mode 100644 > index 0000000..a055b1d > --- /dev/null > +++ b/tests/spec/khr_debug/debug-push-pop-group.c > @@ -0,0 +1,322 @@ > +/* > + * Copyright (c) 2013 Timothy Arceri <[email protected]> > + * > + * Permission is hereby granted, free of charge, to any person obtaining a > + * copy of this software and associated documentation files (the "Software"), > + * to deal in the Software without restriction, including without limitation > + * on the rights to use, copy, modify, merge, publish, distribute, sub > + * license, and/or sell copies of the Software, and to permit persons to whom > + * the Software is furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice (including the next > + * paragraph) shall be included in all copies or substantial portions of the > + * Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, > + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF > + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND > + * NON-INFRINGEMENT. IN NO EVENT SHALL AUTHORS AND/OR THEIR SUPPLIERS > + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN > + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN > + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE > + * SOFTWARE. > + */ > + > +#include "piglit-util-gl-common.h" > + > +static const char *TestMessage1 = "Piglit Message 1"; > +static const char *TestMessage2 = "Piglit Message 2"; > +static const char *TestMessage3 = "Piglit Message 3"; > +static const char *TestMessage4 = "Piglit Message 4"; > + > +static const int MessageId1 = 101; > +static const int MessageId2 = 202; > +static const int MessageId3 = 303; > +static const int MessageId4 = 404; > + > +PIGLIT_GL_TEST_CONFIG_BEGIN > + > + config.supports_gl_compat_version = 11; > + config.require_debug_context = true; > + > + config.window_visual = PIGLIT_GL_VISUAL_RGBA | PIGLIT_GL_VISUAL_DOUBLE; > + > +PIGLIT_GL_TEST_CONFIG_END > + > +static GLboolean fetch_one_log_message() > +{ > + char log[4096]; > + GLboolean ret = > + !!glGetDebugMessageLog(1, 4096, NULL, NULL, NULL, NULL, NULL, > log); > + > + if (ret) { > + printf("Log: %s\n", log); > + } > + return ret; > +} > + > +static bool check_inheritance_messages(int expectedCount, GLuint* > expectedIds) > +{ > + bool pass = true; > + int max_messages = 5; > + int bufSize = 1280; > + int i; > + GLuint count; > + GLuint ids[max_messages]; > + GLchar messageLog[bufSize]; > + > + count = glGetDebugMessageLog(max_messages, > + bufSize, > + NULL, > + NULL, > + ids, > + NULL, > + NULL, > + messageLog); > + > + if (count != expectedCount) { > + fprintf(stderr, "Expected message count: %i Actual message > count: %i\n", > + expectedCount, count); > + pass = false; > + } else { > + for (i = 0; i < expectedCount; i++) { > + if (expectedIds[i] != ids[i]) { > + fprintf(stderr, "Expected id: %i Actual id: > %i\n", > + expectedIds[i], ids[i]); > + pass = false; > + } > + } > + } > + > + return pass; > +} > + > +static void insert_inheritance_messages() > +{ > + glDebugMessageInsert(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, > MessageId1, > + GL_DEBUG_SEVERITY_NOTIFICATION, -1, TestMessage1); > + > + glDebugMessageInsert(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, > MessageId2, > + GL_DEBUG_SEVERITY_NOTIFICATION, -1, TestMessage2); > + > + glDebugMessageInsert(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, > MessageId3, > + GL_DEBUG_SEVERITY_NOTIFICATION, -1, TestMessage3); > + > + glDebugMessageInsert(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, > MessageId4, > + GL_DEBUG_SEVERITY_NOTIFICATION, -1, TestMessage4); > +} > + > +/* > + * Test inheritance of group filtering (nesting) > + */ > +static bool test_push_pop_group_inheritance() > +{ > + bool pass = true; > + GLuint allowedIds1[] = {MessageId1}; > + GLuint allowedIds2[] = {MessageId2}; > + GLuint allowedIds3[] = {MessageId3}; > + > + GLuint expectedIds1[] = {MessageId1}; > + GLuint expectedIds2[] = {MessageId1, MessageId2}; > + GLuint expectedIds3[] = {MessageId1, MessageId2, MessageId3}; > + > + puts("Testing Push debug group inheritance"); > + > + /* Setup of the default active debug group: Filter everything out */ > + glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, > + GL_DONT_CARE, 0, NULL, GL_FALSE); > + > + /* Push debug group 1 and allow messages with the id 101*/ > + glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 1, -1, "Push_Pop 1"); > + glDebugMessageControl(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, > + GL_DONT_CARE, 1, allowedIds1, GL_TRUE); > + insert_inheritance_messages(); > + pass = check_inheritance_messages(1, expectedIds1); > + > + /* Push debug group 1 and allow messages with the id 101 and 202*/ > + glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 1, -1, "Push_Pop 2"); > + glDebugMessageControl(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, > + GL_DONT_CARE, 1, allowedIds2, GL_TRUE); > + insert_inheritance_messages(); > + pass = check_inheritance_messages(2, expectedIds2) && pass; > + > + /* Push debug group 1 and allow messages with the id 101, 202 and 303*/ > + glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 1, -1, "Push_Pop 3"); > + glDebugMessageControl(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, > + GL_DONT_CARE, 1, allowedIds3, GL_TRUE); > + insert_inheritance_messages(); > + pass = check_inheritance_messages(3, expectedIds3) && pass; > + > + puts("Testing Pop debug group inheritance"); > + > + /* Pop debug group 3 */ > + glPopDebugGroup(); > + insert_inheritance_messages(); > + pass = check_inheritance_messages(2, expectedIds2) && pass; > + > + /* Pop debug group 2 */ > + glPopDebugGroup(); > + insert_inheritance_messages(); > + pass = check_inheritance_messages(1, expectedIds1) && pass; > + > + /* Pop group 1, restore the volume control of the default debug group. > */ > + glPopDebugGroup(); > + insert_inheritance_messages(); > + /* check message log is empty, all messages should have been filtered */ > + if (fetch_one_log_message()) { > + fprintf(stderr, "The message log should be empty\n"); > + pass = false; > + } > + > + return pass; > +} > + > +/* > + * Test Push/Pop Debug Group > + */ > +static bool test_push_pop_debug_group() > +{ > + bool pass = true; > + int max_messages = 5; > + int bufSize = 1280; > + int i, nextMessage = 0; > + int messageLen; > + GLuint count; > + GLint maxMessageLength; > + GLint maxMessageLogLength; > + > + GLsizei lengths[max_messages]; > + GLchar messageLog[bufSize]; > + > + /* Make sure the implementation has max values big enough to run this > test > + * since the spec only mandates GL_MAX_DEBUG_MESSAGE_LENGTH and > + * GL_MAX_DEBUG_LOGGED_MESSAGES to be 1 or larger. > + */ > + glGetIntegerv(GL_MAX_DEBUG_MESSAGE_LENGTH, &maxMessageLength); > + glGetIntegerv(GL_MAX_DEBUG_LOGGED_MESSAGES, &maxMessageLogLength); > + /* assume all test messages are of the same length */ > + messageLen = strlen(TestMessage1); > + /* MAX_DEBUG_MESSAGE_LENGTH must be greater than messageLen as it > includes the null terminator */ > + if (maxMessageLength <= messageLen) { > + printf("push_pop_debug_group test skipped implementations > MAX_DEBUG_MESSAGE_LENGTH=%i and max piglit test length=%i\n", > maxMessageLength, messageLen); > + return pass; > + } > + if (maxMessageLogLength < max_messages) { > + printf("push_pop_debug_group test skipped implementations > MAX_DEBUG_LOGGED_MESSAGES=%i and max piglit test length=%i\n", > maxMessageLogLength, max_messages); > + return pass; > + } > + > + puts("Testing Push Pop debug message group"); > + > + /* Setup of the default active debug group, only enabling > + * the messages we will be interested in. > + */ > + glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, > + GL_DONT_CARE, 0, NULL, GL_FALSE); > + glDebugMessageControl(GL_DEBUG_SOURCE_APPLICATION, > GL_DEBUG_TYPE_PUSH_GROUP, > + GL_DEBUG_SEVERITY_NOTIFICATION, 0, NULL, GL_TRUE); > + glDebugMessageControl(GL_DEBUG_SOURCE_APPLICATION, > GL_DEBUG_TYPE_POP_GROUP, > + GL_DEBUG_SEVERITY_NOTIFICATION, 0, NULL, GL_TRUE); > + glDebugMessageControl(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, > + GL_DEBUG_SEVERITY_NOTIFICATION, 0, NULL, GL_TRUE); > + > + /* Generate a debug marker debug output message */ > + glDebugMessageInsert(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, > MessageId1, > + GL_DEBUG_SEVERITY_NOTIFICATION, -1, TestMessage1); > + > + /* Push debug group 1 */ > + glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 1, -1, TestMessage2); > + > + /* Setup of the debug group 1: Filter everything out */ > + glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, > + 0, NULL, GL_FALSE); > + > + /* This message shouldn't appear in the debug output log */ > + glDebugMessageInsert(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, > MessageId1, > + GL_DEBUG_SEVERITY_NOTIFICATION, -1, TestMessage3); > + > + /* Pop group 1, restore the volume control of the default debug group. > */ > + glPopDebugGroup(); > + > + /* Generate a debug marker debug output message */ > + glDebugMessageInsert(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, > MessageId1, > + GL_DEBUG_SEVERITY_NOTIFICATION, -1, TestMessage4); > + > + /* Check that message log has done correct filtering */ > + count = glGetDebugMessageLog(max_messages, > + bufSize, > + NULL, > + NULL, > + NULL, > + NULL, > + lengths, > + messageLog); > + > + if (count != 4) { > + fprintf(stderr, "The message log should contain 4 messages not > %i messages\n", count); > + nextMessage = 0; > + for (i = 0; i < count; i++) { > + fprintf(stderr, "%s\n", messageLog+nextMessage); > + nextMessage += lengths[i]; > + } > + pass = false; > + } > + > + if (pass) { > + /* the thrid message should contain TestMessage2 from > glPopDebugGroup() */ > + nextMessage = lengths[0] + lengths[1]; > + if (strstr(messageLog+nextMessage, TestMessage2) == NULL) { > + fprintf(stderr, "Expected: %s Message: %s\n", > TestMessage2, messageLog+nextMessage); > + pass = false; > + } > + > + /* double check that TestMessage3 didnt sneak into the log */ > + nextMessage = 0; > + for (i = 0; i < count; i++) { > + if (strstr(messageLog+nextMessage, TestMessage3) != > NULL) { > + fprintf(stderr, "The log should not contain the > message: %s", > + messageLog+nextMessage); > + pass = false; > + } > + nextMessage += lengths[i]; > + } > + > + /* the forth message should contain TestMessage4 */ > + nextMessage = lengths[0] + lengths[1] + lengths[2]; > + if (strstr(messageLog+nextMessage, TestMessage4) == NULL) { > + fprintf(stderr, "Expected: %s Message: %s\n", > TestMessage4, messageLog+nextMessage); > + pass = false; > + } > + } > + > + return pass; > +} > + > +void piglit_init(int argc, char **argv) > +{ > + bool pass = true; > + > + piglit_require_extension("GL_KHR_debug"); > + > + glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); > + glEnable(GL_DEBUG_OUTPUT); > + > + if (!piglit_check_gl_error(GL_NO_ERROR)) > + piglit_report_result(PIGLIT_FAIL); > + > + /* clear_message_log */ > + while(fetch_one_log_message()) > + /* empty */ ; > + > + /* test message control and debug groups */ > + pass = test_push_pop_debug_group(); > + pass = test_push_pop_group_inheritance() && pass; > + > + piglit_report_result(pass ? PIGLIT_PASS : PIGLIT_FAIL); > +} > + > +enum piglit_result > +piglit_display(void) > +{ > + return PIGLIT_PASS; > +} _______________________________________________ Piglit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/piglit
