[Piglit] [PATCH 14/14] util: Remove and refactor weak global symbols in libpiglitutil

Chad Versace chad.versace at linux.intel.com
Tue Jun 12 16:03:00 PDT 2012


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.versace at 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



More information about the Piglit mailing list