This patch's goal is to change the the behavior of the dataflow between test executables and libpiglitutil. To accomplish that, it removes some weak global symbols in libpiglitutil and changes the semantics of others. All changes are located in the piglit-framework-* files.
(I believe that, after this patch, libpiglit can be built as a shared library on MSVC because it no longer defines weak symbols. But I haven't tested this.) Before this patch, the dataflow operated solely via global symbols. Some symbols were used by the test executable to provide data to libpiglitutil; some symbols were used for the other direction; and, confusingly, some symbols provided bidirectional dataflow and conveyed different data according to direction. The dataflow worked like this: Direction A: test executable => libpiglitutil - Test behavior, via global functions piglit_init and piglit_display. - Initialization parameters, via global variables piglit_width, piglit_height, and piglit_window_mode. Direction B: libpiglitutil => test executable - User-requested test options, via global variables piglit_use_fbo and piglit_automatic. - Dynamic test state, via global variables piglit_width and piglit_height. Observe that, in direction A, piglit_width and piglit_height serve as initialization parameters. In direction B, they serve to convey dynamic state. After this patch, global symbols are used for dataflow in only direction B, and that dataflow remains unchanged. The dataflow for direction A now works like this: Direction A: test executable => libpiglitutil - Test behavior, via function pointers piglit_gl_test_info::{init,display}. - Initialization parameters, via piglit_gl_test_info::window_{width,height,visual}. As a consequence of this change, the following symbols in libpiglitutil are no longer used and are removed: - piglit_init - piglit_display - piglit_window_mode Also, since piglit_width and piglit_height are no longer defined by test executables, but are defined exclusively by libpiglitutil, they need no longer be declared as weak symbols. Signed-off-by: Chad Versace <chad.vers...@linux.intel.com> --- tests/util/piglit-framework-fbo.c | 13 +++++++------ tests/util/piglit-framework-fbo.h | 9 +++++++-- tests/util/piglit-framework-glut.c | 24 +++++++++++++++++++----- tests/util/piglit-framework-glut.h | 10 +++++++--- tests/util/piglit-framework.c | 26 +++++++------------------- tests/util/piglit-framework.h | 3 --- 6 files changed, 47 insertions(+), 38 deletions(-) diff --git a/tests/util/piglit-framework-fbo.c b/tests/util/piglit-framework-fbo.c index faf1ef7..85de51e 100644 --- a/tests/util/piglit-framework-fbo.c +++ b/tests/util/piglit-framework-fbo.c @@ -227,7 +227,7 @@ piglit_framework_fbo_waffle_destroy(void) #endif static bool -piglit_framework_fbo_gl_init() +piglit_framework_fbo_gl_init(const struct piglit_gl_test_info *info) { #ifdef PIGLIT_FRAMEWORK_FBO_DISABLED return false; @@ -256,7 +256,7 @@ piglit_framework_fbo_gl_init() tex, 0); - if (piglit_window_mode & (GLUT_DEPTH | GLUT_STENCIL)) { + if (info->window_visual & (GLUT_DEPTH | GLUT_STENCIL)) { GLenum depth_stencil; #ifdef USE_OPENGL @@ -303,7 +303,7 @@ piglit_framework_fbo_gl_init() } bool -piglit_framework_fbo_init(void) +piglit_framework_fbo_init(const struct piglit_gl_test_info *info) { #if defined(PIGLIT_FRAMEWORK_FBO_USE_GLX) piglit_framework_fbo_glx_init(); @@ -311,7 +311,7 @@ piglit_framework_fbo_init(void) piglit_framework_fbo_waffle_init(); #endif - return piglit_framework_fbo_gl_init(); + return piglit_framework_fbo_gl_init(info); } static void @@ -330,9 +330,10 @@ piglit_framework_fbo_destroy(void) #endif } -void piglit_framework_fbo_run(void) +void +piglit_framework_fbo_run(const struct piglit_gl_test_info *info) { - enum piglit_result result = piglit_display(); + enum piglit_result result = info->display(); piglit_framework_fbo_destroy(); piglit_report_result(result); } diff --git a/tests/util/piglit-framework-fbo.h b/tests/util/piglit-framework-fbo.h index 7e52e50..f9da2ae 100644 --- a/tests/util/piglit-framework-fbo.h +++ b/tests/util/piglit-framework-fbo.h @@ -23,5 +23,10 @@ #include <stdbool.h> -bool piglit_framework_fbo_init(void); -void piglit_framework_fbo_run(void); +struct piglit_gl_test_info; + +bool +piglit_framework_fbo_init(const struct piglit_gl_test_info *info); + +void +piglit_framework_fbo_run(const struct piglit_gl_test_info *info); diff --git a/tests/util/piglit-framework-glut.c b/tests/util/piglit-framework-glut.c index 6e91ec4..bd6fbb7 100644 --- a/tests/util/piglit-framework-glut.c +++ b/tests/util/piglit-framework-glut.c @@ -35,6 +35,14 @@ #include "piglit-glx-util.h" #endif +/** + * \brief Set by piglit_framework_glut_init(). + * + * This global variable exists because GLUT's API requires that data be passed + * to the display function via a global. Ugh, what an awful API. + */ +static const struct piglit_gl_test_info *test_info; + static int piglit_window; static enum piglit_result result; @@ -42,7 +50,7 @@ static enum piglit_result result; static void display(void) { - result = piglit_display(); + result = test_info->display(); if (piglit_automatic) { glutDestroyWindow(piglit_window); @@ -78,8 +86,13 @@ piglit_present_results() } void -piglit_framework_glut_init(int argc, char *argv[]) +piglit_framework_glut_init(int argc, char *argv[], + const struct piglit_gl_test_info *info) { + if (test_info != NULL) + assert(!"already init"); + + test_info = info; glutInit(&argc, argv); # if defined(USE_WAFFLE) @@ -95,8 +108,9 @@ piglit_framework_glut_init(int argc, char *argv[]) # endif glutInitWindowPosition(0, 0); - glutInitWindowSize(piglit_width, piglit_height); - glutInitDisplayMode(piglit_window_mode); + glutInitWindowSize(info->window_width, + info->window_height); + glutInitDisplayMode(info->window_visual); piglit_window = glutCreateWindow(argv[0]); #if defined(USE_GLX) && !defined(USE_WAFFLE) @@ -120,7 +134,7 @@ piglit_framework_glut_init(int argc, char *argv[]) } void -piglit_framework_glut_run(void) +piglit_framework_glut_run(const struct piglit_gl_test_info *info) { glutMainLoop(); piglit_report_result(result); diff --git a/tests/util/piglit-framework-glut.h b/tests/util/piglit-framework-glut.h index 7116adc..c94ef51 100644 --- a/tests/util/piglit-framework-glut.h +++ b/tests/util/piglit-framework-glut.h @@ -23,7 +23,11 @@ #pragma once -#include "piglit-util.h" +struct piglit_gl_test_info; -void piglit_framework_glut_init(int argc, char *argv[]); -void piglit_framework_glut_run(void); +void +piglit_framework_glut_init(int argc, char *argv[], + const struct piglit_gl_test_info *info); + +void +piglit_framework_glut_run(const struct piglit_gl_test_info *info); diff --git a/tests/util/piglit-framework.c b/tests/util/piglit-framework.c index a5fb421..2a0730e 100644 --- a/tests/util/piglit-framework.c +++ b/tests/util/piglit-framework.c @@ -41,19 +41,8 @@ bool piglit_use_fbo = false; int piglit_automatic = 0; unsigned piglit_winsys_fbo = 0; -#ifndef _WIN32 -__attribute__((weak)) int piglit_width = 100; -__attribute__((weak)) int piglit_height = 100; -__attribute__((weak)) int piglit_window_mode = GLUT_RGB | GLUT_DOUBLE; - -__attribute__((weak)) enum piglit_result piglit_display(void) -{ - return PIGLIT_FAIL; -} -__attribute__((weak)) void piglit_init(int argc, char **argv) -{ -} -#endif +int piglit_width; +int piglit_height; void piglit_gl_test_info_init(struct piglit_gl_test_info *info) @@ -132,22 +121,21 @@ piglit_gl_test_run(int argc, char *argv[], piglit_width = info->window_width; piglit_height = info->window_height; - piglit_window_mode = info->window_visual; if (piglit_use_fbo) { - if (!piglit_framework_fbo_init()) + if (!piglit_framework_fbo_init(info)) piglit_use_fbo = false; } if (!piglit_use_fbo) - piglit_framework_glut_init(argc, argv); + piglit_framework_glut_init(argc, argv, info); - piglit_init(argc, argv); + info->init(argc, argv); if (piglit_use_fbo) { - piglit_framework_fbo_run(); + piglit_framework_fbo_run(info); } else { - piglit_framework_glut_run(); + piglit_framework_glut_run(info); } assert(false); diff --git a/tests/util/piglit-framework.h b/tests/util/piglit-framework.h index 04894bb..7fa4927 100644 --- a/tests/util/piglit-framework.h +++ b/tests/util/piglit-framework.h @@ -125,12 +125,9 @@ piglit_gl_test_run(int argc, char *argv[], extern int piglit_automatic; -extern int piglit_window_mode; extern int piglit_width; extern int piglit_height; extern bool piglit_use_fbo; extern unsigned int piglit_winsys_fbo; -extern enum piglit_result piglit_display(void); -extern void piglit_init(int argc, char **argv); extern void piglit_present_results(); -- 1.7.10.4 _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/piglit