From: Marek Ol????k <marek.ol...@amd.com>

The performance is measured by running these:
spec/glsl-1.30/execution/built-in-functions/ (1420 tests)

Running piglit-run.py using the old way: 98 s
Running .../shader_runner *.shader_test:  8 s

It's more than 12x faster!!

The tests being run must be compatible. (we can't mix core, compat, and ES
tests) Thus, running shader_runner once per each spec/ directory should
be OK.

The context-window combo is destroyed and re-created with a different
configuration when test requirements demand it.

shader_runner tries to re-set all states between tests to prevent side
effects.

shader_runner isn't immune to crashes. The python framework must re-launch
shader_runner to run the remaining tests.
---
 tests/shaders/shader_runner.c | 226 ++++++++++++++++++++++++++++++++++-
 1 file changed, 221 insertions(+), 5 deletions(-)

diff --git a/tests/shaders/shader_runner.c b/tests/shaders/shader_runner.c
index 4c52194..eeab08a 100644
--- a/tests/shaders/shader_runner.c
+++ b/tests/shaders/shader_runner.c
@@ -28,10 +28,16 @@
 #include "piglit-util.h"
 #include "piglit-util-gl.h"
 #include "piglit-vbo.h"
+#include "piglit-framework-gl/piglit_gl_framework.h"
 
 #include "shader_runner_gles_workarounds.h"
 #include "parser_utils.h"
 
+#define DEFAULT_WINDOW_WIDTH 250
+#define DEFAULT_WINDOW_HEIGHT 250
+
+static struct piglit_gl_test_config current_config;
+
 static void
 get_required_config(const char *script_name,
                    struct piglit_gl_test_config *config);
@@ -43,8 +49,8 @@ get_uints(const char *line, unsigned *uints, unsigned count);
 
 PIGLIT_GL_TEST_CONFIG_BEGIN
 
-       config.window_width = 250;
-       config.window_height = 250;
+       config.window_width = DEFAULT_WINDOW_WIDTH;
+       config.window_height = DEFAULT_WINDOW_HEIGHT;
        config.window_visual = PIGLIT_GL_VISUAL_RGBA | PIGLIT_GL_VISUAL_DOUBLE;
 
        if (argc > 1)
@@ -52,6 +58,8 @@ PIGLIT_GL_TEST_CONFIG_BEGIN
        else
                config.supports_gl_compat_version = 10;
 
+       current_config = config;
+
 PIGLIT_GL_TEST_CONFIG_END
 
 static const char passthrough_vertex_shader_source[] =
@@ -84,6 +92,7 @@ struct string_to_enum {
 
 extern float piglit_tolerance[4];
 
+static int test_num = 1;
 static struct component_version gl_version;
 static struct component_version glsl_version;
 static struct component_version glsl_req_version;
@@ -3477,6 +3486,62 @@ init_test(const char *file)
        return PIGLIT_PASS;
 }
 
+static void
+recreate_gl_context(char *exec_arg, int param_argc, char **param_argv)
+{
+       int argc = param_argc + 3;
+       char **argv = malloc(sizeof(char*) * argc);
+
+       if (!argv) {
+               fprintf(stderr, "%s: malloc failed.\n", __func__);
+               piglit_report_result(PIGLIT_FAIL);
+       }
+
+       argv[0] = exec_arg;
+       memcpy(&argv[1], param_argv, param_argc * sizeof(char*));
+       argv[argc-2] = "-auto";
+       argv[argc-1] = "-fbo";
+
+       if (gl_fw->destroy)
+               gl_fw->destroy(gl_fw);
+       gl_fw = NULL;
+
+       exit(main(argc, argv));
+}
+
+static bool
+validate_current_gl_context(const char *filename)
+{
+       struct piglit_gl_test_config config = {};
+
+       config.window_width = DEFAULT_WINDOW_WIDTH;
+       config.window_height = DEFAULT_WINDOW_HEIGHT;
+
+       get_required_config(filename, &config);
+
+       if (!current_config.supports_gl_compat_version !=
+           !config.supports_gl_compat_version)
+               return false;
+
+       if (!current_config.supports_gl_core_version !=
+           !config.supports_gl_core_version)
+               return false;
+
+       if (!current_config.supports_gl_es_version !=
+           !config.supports_gl_es_version)
+               return false;
+
+       if (current_config.window_width != config.window_width ||
+           current_config.window_height != config.window_height)
+               return false;
+
+       if (!(current_config.window_visual & PIGLIT_GL_VISUAL_DEPTH) &&
+           config.window_visual & PIGLIT_GL_VISUAL_DEPTH)
+               return false;
+
+       return true;
+}
+
 void
 piglit_init(int argc, char **argv)
 {
@@ -3485,6 +3550,10 @@ piglit_init(int argc, char **argv)
        bool core = piglit_is_core_profile;
        bool es;
        enum piglit_result result;
+       float default_piglit_tolerance[4];
+
+       memcpy(default_piglit_tolerance, piglit_tolerance,
+              sizeof(piglit_tolerance));
 
        piglit_require_GLSL();
 
@@ -3539,11 +3608,158 @@ piglit_init(int argc, char **argv)
                exit(1);
        }
 
+       render_width = piglit_width;
+       render_height = piglit_height;
+
+       /* Automatic mode can run multiple tests per session. */
+       if (piglit_automatic) {
+               char testname[4096], *ext;
+               int i, j;
+
+               for (i = 1; i < argc; i++) {
+                       const char *hit, *filename = argv[i];
+
+                       memcpy(piglit_tolerance, default_piglit_tolerance,
+                              sizeof(piglit_tolerance));
+
+                       /* Re-initialize the GL context if a different GL 
config is required. */
+                       if (!validate_current_gl_context(filename))
+                               recreate_gl_context(argv[0], argc - i, argv + 
i);
+
+                       /* Clear global variables to defaults. */
+                       test_start = NULL;
+                       num_vertex_shaders = 0;
+                       num_tess_ctrl_shaders = 0;
+                       num_tess_eval_shaders = 0;
+                       num_geometry_shaders = 0;
+                       num_fragment_shaders = 0;
+                       num_compute_shaders = 0;
+                       num_uniform_blocks = 0;
+                       assert(uniform_block_bos == NULL);
+                       geometry_layout_input_type = GL_TRIANGLES;
+                       geometry_layout_output_type = GL_TRIANGLE_STRIP;
+                       geometry_layout_vertices_out = 0;
+                       atomics_bo = 0;
+                       memset(ssbo, 0, sizeof(ssbo));
+                       for (j = 0; j < ARRAY_SIZE(subuniform_locations); j++)
+                               assert(subuniform_locations == NULL);
+                       memset(num_subuniform_locations, 0, 
sizeof(num_subuniform_locations));
+                       shader_string = NULL;
+                       shader_string_size = 0;
+                       vertex_data_start = NULL;
+                       vertex_data_end = NULL;
+                       prog = 0;
+                       sso_vertex_prog = 0;
+                       sso_tess_control_prog = 0;
+                       sso_tess_eval_prog = 0;
+                       sso_geometry_prog = 0;
+                       sso_fragment_prog = 0;
+                       sso_compute_prog = 0;
+                       num_vbo_rows = 0;
+                       vbo_present = false;
+                       link_ok = false;
+                       prog_in_use = false;
+                       sso_in_use = false;
+                       prog_err_info = NULL;
+                       vao = 0;
+                       fbo = 0;
+
+                       /* Clear GL states to defaults. */
+                       glClearColor(0, 0, 0, 0);
+                       glClearDepth(1);
+                       glBindFramebuffer(GL_FRAMEBUFFER, piglit_winsys_fbo);
+                       glActiveTexture(GL_TEXTURE0);
+                       glUseProgram(0);
+                       glDisable(GL_DEPTH_TEST);
+                       glBindBuffer(GL_ARRAY_BUFFER, 0);
+                       glDisable(GL_CLIP_PLANE0);
+                       glDisable(GL_CLIP_PLANE1);
+                       glDisable(GL_CLIP_PLANE2);
+                       glDisable(GL_CLIP_PLANE3);
+                       glDisable(GL_CLIP_PLANE4);
+                       glDisable(GL_CLIP_PLANE5);
+                       if (es || gl_version.num >= 30) {
+                               glDisable(GL_CLIP_PLANE0+6);
+                               glDisable(GL_CLIP_PLANE0+7);
+                       }
+
+                       if (es)
+                               glEnable(GL_PROGRAM_POINT_SIZE);
+                       else if (gl_version.num >= 20 ||
+                                
piglit_is_extension_supported("GL_ARB_vertex_program"))
+                               glDisable(GL_PROGRAM_POINT_SIZE);
+
+                       for (int i = 0; i < 16; i++)
+                               glDisableVertexAttribArray(i);
+
+                       if (!piglit_is_core_profile) {
+                               glMatrixMode(GL_PROJECTION);
+                               glLoadIdentity();
+                               glMatrixMode(GL_MODELVIEW);
+                               glLoadIdentity();
+                               glShadeModel(GL_SMOOTH);
+                               glDisable(GL_VERTEX_PROGRAM_TWO_SIDE);
+                       }
+
+                       if 
(piglit_is_extension_supported("GL_ARB_vertex_program")) {
+                               glDisable(GL_VERTEX_PROGRAM_ARB);
+                               glBindProgramARB(GL_VERTEX_PROGRAM_ARB, 0);
+                       }
+                       if 
(piglit_is_extension_supported("GL_ARB_fragment_program")) {
+                               glDisable(GL_FRAGMENT_PROGRAM_ARB);
+                               glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, 0);
+                       }
+                       if 
(piglit_is_extension_supported("GL_ARB_separate_shader_objects")) {
+                               if (!pipeline)
+                                       glGenProgramPipelines(1, &pipeline);
+                               glBindProgramPipeline(0);
+                       }
+
+                       if 
(piglit_is_extension_supported("GL_EXT_provoking_vertex"))
+                               
glProvokingVertexEXT(GL_LAST_VERTEX_CONVENTION_EXT);
+
+                       if (gl_version.num >= (gl_version.es ? 32 : 40) ||
+                           piglit_is_extension_supported(gl_version.es ?
+                                                         
"GL_OES_tessellation_shader" :
+                                                         
"GL_ARB_tessellation_shader")) {
+                               static float ones[] = {1, 1, 1, 1};
+                               glPatchParameteri(GL_PATCH_VERTICES, 3);
+                               
glPatchParameterfv(GL_PATCH_DEFAULT_OUTER_LEVEL, ones);
+                               
glPatchParameterfv(GL_PATCH_DEFAULT_INNER_LEVEL, ones);
+                       }
+
+                       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+                       /* Strip the file path. */
+                       hit = strrchr(filename, PIGLIT_PATH_SEP);
+                       if (hit)
+                               strcpy(testname, hit+1);
+                       else
+                               strcpy(testname, filename);
+
+                       /* Strip the file extension. */
+                       ext = strstr(testname, ".shader_test");
+                       if (ext && !ext[12])
+                               *ext = 0;
+
+                       /* Run the test. */
+                       printf("TEST %i: %s\n", test_num++, testname);
+                       result = init_test(filename);
+
+                       if (result != PIGLIT_PASS) {
+                               piglit_report_subtest_result(result, "%s", 
testname);
+                               continue;
+                       }
+
+                       result = piglit_display();
+                       piglit_report_subtest_result(result, "%s", testname);
+
+                       /* destroy GL objects? */
+               }
+               exit(0);
+       }
 
        result = init_test(argv[1]);
        if (result != PIGLIT_PASS)
                piglit_report_result(result);
-
-       render_width = piglit_width;
-       render_height = piglit_height;
 }
-- 
git-series 0.8.10
_______________________________________________
Piglit mailing list
Piglit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to