From 60a4877c68b1c376e1218beab543c007827d520b Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 3 May 2019 12:32:44 +0100 Subject: [PATCH] Add test that aliased entry points on GL are recorded faithfully --- util/test/demos/demos.vcxproj | 1 + util/test/demos/demos.vcxproj.filters | 3 + util/test/demos/gl/gl_entry_points.cpp | 114 +++++++++++++++++++++++++ util/test/tests/GL/GL_Entry_Points.py | 39 +++++++++ 4 files changed, 157 insertions(+) create mode 100644 util/test/demos/gl/gl_entry_points.cpp create mode 100644 util/test/tests/GL/GL_Entry_Points.py diff --git a/util/test/demos/demos.vcxproj b/util/test/demos/demos.vcxproj index f3ffefebe..a24ff95dc 100644 --- a/util/test/demos/demos.vcxproj +++ b/util/test/demos/demos.vcxproj @@ -165,6 +165,7 @@ + diff --git a/util/test/demos/demos.vcxproj.filters b/util/test/demos/demos.vcxproj.filters index 5fe6c3756..5e99fb59b 100644 --- a/util/test/demos/demos.vcxproj.filters +++ b/util/test/demos/demos.vcxproj.filters @@ -270,6 +270,9 @@ OpenGL\demos + + OpenGL\demos + diff --git a/util/test/demos/gl/gl_entry_points.cpp b/util/test/demos/gl/gl_entry_points.cpp new file mode 100644 index 000000000..2f8b41184 --- /dev/null +++ b/util/test/demos/gl/gl_entry_points.cpp @@ -0,0 +1,114 @@ +/****************************************************************************** + * The MIT License (MIT) + * + * Copyright (c) 2015-2019 Baldur Karlsson + * + * 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 the rights + * to use, copy, modify, merge, publish, distribute, sublicense, 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 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 NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS 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 "gl_test.h" + +struct GL_Entry_Points : OpenGLGraphicsTest +{ + static constexpr const char *Description = + "Test that RenderDoc correctly lists the different function call aliases used."; + + std::string vertex = R"EOSHADER( +#version 420 core + +layout(location = 0) in vec3 Position; + +void main() +{ + gl_Position = vec4(Position.xyz, 1); +} + +)EOSHADER"; + + std::string pixel = R"EOSHADER( +#version 420 core + +layout(location = 0, index = 0) out vec4 Color; + +uniform uint path; +uniform vec4 a; + +void main() +{ + if(path == 1u) + Color = a; + else + Color = vec4(1.0, 0.0, 1.0, 1.0); +} + +)EOSHADER"; + + int main(int argc, char **argv) + { + // initialise, create window, create context, etc + if(!Init(argc, argv)) + return 3; + + GLuint vao = MakeVAO(); + glBindVertexArray(vao); + + GLuint vb = MakeBuffer(); + glBindBuffer(GL_ARRAY_BUFFER, vb); + glBufferStorage(GL_ARRAY_BUFFER, sizeof(DefaultTri), DefaultTri, 0); + + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(DefaultA2V), (void *)(0)); + glEnableVertexAttribArray(0); + + GLuint program = MakeProgram(vertex, pixel); + glObjectLabel(GL_PROGRAM, program, -1, "Full program"); + + while(Running()) + { + float col[] = {0.4f, 0.5f, 0.6f, 1.0f}; + glClearBufferfv(GL_COLOR, 0, col); + + glBindVertexArray(vao); + + glUseProgram(program); + + glViewport(0, 0, GLsizei(100), GLsizei(100)); + setMarker("First Test"); + glUniform1ui(glGetUniformLocation(program, "path"), 0); + glDrawArrays(GL_TRIANGLES, 0, 3); + + glViewport(100, 0, GLsizei(100), GLsizei(100)); + setMarker("Second Test"); + glUniform1uiEXT(glGetUniformLocation(program, "path"), 1); + glProgramUniform4f(program, glGetUniformLocation(program, "a"), 0.0f, 1.0f, 1.0f, 1.0f); + glDrawArrays(GL_TRIANGLES, 0, 3); + + glViewport(200, 0, GLsizei(100), GLsizei(100)); + setMarker("Third Test"); + glMemoryBarrierEXT(GL_COMMAND_BARRIER_BIT); + glUniform4f(glGetUniformLocation(program, "a"), 1.0f, 1.0f, 0.0f, 1.0f); + glDrawArrays(GL_TRIANGLES, 0, 3); + + Present(); + } + + return 0; + } +}; + +REGISTER_TEST(GL_Entry_Points); \ No newline at end of file diff --git a/util/test/tests/GL/GL_Entry_Points.py b/util/test/tests/GL/GL_Entry_Points.py new file mode 100644 index 000000000..6b8b25278 --- /dev/null +++ b/util/test/tests/GL/GL_Entry_Points.py @@ -0,0 +1,39 @@ +import rdtest +import renderdoc as rd + + +class GL_Entry_Points(rdtest.TestCase): + def get_capture(self): + return rdtest.run_and_capture("demos_x64", "GL_Entry_Points", 5) + + def check_capture(self): + sdf = self.controller.GetStructuredFile() + + # The marker name, and the calls that we expect to follow it + expected = { + 'First Test': ['glUniform1ui'], + 'Second Test': ['glUniform1uiEXT', 'glProgramUniform4f'], + 'Third Test': ['glMemoryBarrierEXT', 'glUniform4f'], + } + + for test in expected.keys(): + marker: rd.DrawcallDescription = self.find_draw(test) + draw: rd.DrawcallDescription = marker.next + + calls = [] + + ev: rd.APIEvent + for ev in draw.events: + # skip any events up to and including the marker itself + if ev.eventId <= marker.eventId: + continue + + calls.append(sdf.chunks[ev.chunkIndex].name) + + for i in range(len(expected[test])): + if expected[test][i] != calls[i]: + raise rdtest.TestFailureException('After marker {} got call {} but expected {}' + .format(test, calls[i], expected[test][i])) + + rdtest.log.success("API calls are as expected") +