[Piglit] [PATCH 22/23] util: Add fields to piglit_gl_test_config for listing supported GL flavors
Chad Versace
chad.versace at linux.intel.com
Fri Sep 28 13:53:02 PDT 2012
This patch has 3 interrelated components.
1) Add the following fields to piglit_gl_test_config:
supports_gl_core_version
supports_gl_compat_version
supports_gl_es1
supports_gl_es2
These allow a test to specify what GL flavors under which it can run. For
details, see the documentation for struct piglit_gl_test_config.
2. In tests/util/piglit-framework-gl, implement support for the new
fields.
3. In each GL test source, add one of the new fields to the
PIGLIT_GL_TEST_CONFIG_BEGIN/END block.
For GLES1 tests, add `supports_gl_es1 = true`. For GLES2 tests, add
`supports_gl_es2 = true`. For desktop GL tests, add
`supports_gl_compat_version = 10`. For an explanation of why version 1.0
is used for desktop GL tests, see the documentation for
supports_gl_compat_version. No tests yet require a GL core context.
Signed-off-by: Chad Versace <chad.versace at linux.intel.com>
=======================================================================
This is a giant sed-job patch. Here are example diffs to the test files, one
for each of GL, GLES1, and GLES2.
diff --git a/tests/asmparsertest/asmparsertest.c b/tests/asmparsertest/asmparsertest.c
index b916555..6dfc744 100644
--- a/tests/asmparsertest/asmparsertest.c
+++ b/tests/asmparsertest/asmparsertest.c
@@ -32,6 +32,8 @@
PIGLIT_GL_TEST_CONFIG_BEGIN
+ config.supports_gl_compat_version = 10;
+
config.window_width = 250;
config.window_height = 250;
config.window_visual = PIGLIT_GL_VISUAL_RGB | PIGLIT_GL_VISUAL_SINGLE | PIGLIT_GL_VISUAL_DEPTH;
diff --git a/tests/spec/oes_compressed_etc1_rgb8_texture/oes_compressed_etc1_rgb8_texture-basic.c b/tests/spec/oes_compressed_etc1_rgb8_texture/oes_compressed_etc1_rgb8_texture-basic.c
index 197d81c..d52d6fb 100644
--- a/tests/spec/oes_compressed_etc1_rgb8_texture/oes_compressed_etc1_rgb8_texture-basic.c
+++ b/tests/spec/oes_compressed_etc1_rgb8_texture/oes_compressed_etc1_rgb8_texture-basic.c
@@ -29,6 +29,8 @@
PIGLIT_GL_TEST_CONFIG_BEGIN
+ config.supports_gl_es1 = true;
+
config.window_width = 100;
config.window_height = 100;
config.window_visual = PIGLIT_GL_VISUAL_RGB | PIGLIT_GL_VISUAL_DOUBLE;
diff --git a/tests/spec/oes_compressed_etc1_rgb8_texture/oes_compressed_etc1_rgb8_texture-miptree.c b/tests/spec/oes_compressed_etc1_rgb8_texture/oes_compressed_etc1_rgb8_texture-miptree.c
index c1e53ca..d038de4 100644
--- a/tests/spec/oes_compressed_etc1_rgb8_texture/oes_compressed_etc1_rgb8_texture-miptree.c
+++ b/tests/spec/oes_compressed_etc1_rgb8_texture/oes_compressed_etc1_rgb8_texture-miptree.c
@@ -55,6 +55,8 @@ static const int window_height = 2 * level0_height;
PIGLIT_GL_TEST_CONFIG_BEGIN
+ config.supports_gl_es2 = true;
+
config.window_width = window_width;
config.window_height = window_height;
config.window_visual = PIGLIT_GL_VISUAL_RGB | PIGLIT_GL_VISUAL_DOUBLE;
==========================================================================================
And here is the complete diff for tests/util.
diff --git a/tests/util/piglit-framework-gl.h b/tests/util/piglit-framework-gl.h
index 568318d..96df3b8 100644
--- a/tests/util/piglit-framework-gl.h
+++ b/tests/util/piglit-framework-gl.h
@@ -56,10 +56,94 @@ enum piglit_gl_visual {
* This is named piglit_gl_test_config, rather than piglit_test_config, in
* order to distinguish it from other test types, such as EGL and GLX tests.
*
- * TODO: Add fields here that declare test requirements on GL context
- * TODO: flavor, extensions, and window system.
+ * At least one of the `supports` fields must be set.
+ *
+ * If `supports_gl_core_version` and `supports_gl_compat_version` are both
+ * set, then Piglit will first attempt to run the test under a GL core context
+ * of the requested version. If context creation fails, then Piglit will then
+ * attempt to run the test under a GL compatibility context of the requested
+ * version.
*/
struct piglit_gl_test_config {
+ /**
+ * If this field is non-zero, then the test is able to run under a GL
+ * core context having at least the given version.
+ *
+ * When attempting run a test under a GL core context, Piglit chooses
+ * a waffle_config with the following attributes set. (Note that
+ * Waffle ignores the profile attribute for versions less than 3.2).
+ * - WAFFLE_CONTEXT_PROFILE = WAFFLE_CONTEXT_CORE_PROFILE
+ * - WAFFLE_CONTEXT_MAJOR_VERSION = supports_gl_core_version / 10
+ * - WAFFLE_CONTEXT_MINOR_VERSION = supports_gl_core_version % 10
+ * If Piglit fails to acquire the waffle_config or to create the
+ * waffle_context, then it skips its attempt to run the test under
+ * a GL core context.
+ *
+ * It is an error if this field is less than 3.1 because the concept
+ * of "core context" does not apply before GL 3.1.
+ *
+ * Piglit handles a request for a GL 3.1 core context as a special
+ * case. As noted above, Waffle ignores the profile attribute when
+ * choosing a 3.1 config. However, the concept of "core profile" is
+ * still applicable to 3.1 contexts and is indicated by the context's
+ * lack of support for the GL_ARB_compatibility extension. Therefore,
+ * Piglit attempts to run the test under a GL 3.1 core context by
+ * first creating the context and then skipping the attempt if the
+ * context supports the GL_ARB_compatibility extension.
+ *
+ * If this field is 0, then the test is not able to run under a GL
+ * core context of any version.
+ */
+ int supports_gl_core_version;
+
+ /**
+ * If this field is non-zero, then the test is able to run under a GL
+ * compatibility context having at least the given version.
+ *
+ * When attempting run a test under a GL compatibility context, Piglit
+ * chooses a waffle_config with the following attributes set. (Note
+ * that Waffle ignores the profile attribute for versions less than
+ * 3.2).
+ * - WAFFLE_CONTEXT_PROFILE = WAFFLE_CONTEXT_COMPATIBILITY_PROFILE
+ * - WAFFLE_CONTEXT_MAJOR_VERSION = supports_gl_core_version / 10
+ * - WAFFLE_CONTEXT_MINOR_VERSION = supports_gl_core_version % 10
+ * If Piglit fails to acquire the waffle_config or to create the
+ * waffle_context, then it skips its attempt to run the test under
+ * a GL compatibility context.
+ *
+ * Piglit handles a request for a GL 3.1 compatibility context as
+ * a special case. As noted above, Waffle ignores the profile
+ * attribute when choosing a 3.1 config. However, the concept of
+ * "compatibility profile" is still applicable to 3.1 contexts and is
+ * indicated by the context's support for the GL_ARB_compatibility
+ * extension. Therefore, Piglit attempts to run under a GL 3.1
+ * compatibility context by first creating the context and then
+ * skipping the attempt if the context lacks the GL_ARB_compatibility
+ * extension.
+ *
+ * Be aware that, if this field is greater than 10, then the test will
+ * skip on platforms for which specifying a context version is
+ * unsupported (that is, GLX that lacks GLX_ARB_create_context and EGL
+ * that lacks EGL_KHR_create_context). If the test requires a GL
+ * version greater than 1.0, then consider setting this field to 10
+ * and checking the GL version from within the test with
+ * piglit_require_gl_version().
+ *
+ * If this field is 0, then the test is not able to run under a GL
+ * compatibility context of any version.
+ */
+ int supports_gl_compat_version;
+
+ /**
+ * The test is able to run under an OpenGL ES1 context.
+ */
+ bool supports_gl_es1;
+
+ /**
+ * The test is able to run under an OpenGL ES2 context.
+ */
+ bool supports_gl_es2;
+
int window_width;
int window_height;
diff --git a/tests/util/piglit-framework-gl/piglit_gl_framework.c b/tests/util/piglit-framework-gl/piglit_gl_framework.c
index f1ede1c..11edbe0 100644
--- a/tests/util/piglit-framework-gl/piglit_gl_framework.c
+++ b/tests/util/piglit-framework-gl/piglit_gl_framework.c
@@ -21,10 +21,12 @@
* IN THE SOFTWARE.
*/
+#include <stdio.h>
#include <string.h>
#include "piglit-util-gl-common.h"
#include "piglit_gl_framework.h"
+#include "piglit-util-gl-common.h"
#ifdef PIGLIT_USE_WAFFLE
# include "piglit_fbo_framework.h"
@@ -54,10 +56,50 @@ piglit_gl_framework_factory(const struct piglit_gl_test_config *test_config)
#endif
}
+static void
+validate_supported_apis(const struct piglit_gl_test_config *test_config)
+{
+ int supported_apis = !!test_config->supports_gl_core_version
+ + !!test_config->supports_gl_compat_version
+ + !!test_config->supports_gl_es1
+ + !!test_config->supports_gl_es2;
+
+ if (supported_apis == 0) {
+ printf("The test config supports no GL API's.\n");
+ piglit_report_result(PIGLIT_FAIL);
+ }
+
+ if (test_config->supports_gl_core_version > 0 &&
+ test_config->supports_gl_core_version < 31) {
+ printf("Config attribute 'supports_gl_core_version' is %d, "
+ "but must be either 0 or at least 31\n",
+ test_config->supports_gl_core_version);
+ piglit_report_result(PIGLIT_FAIL);
+ }
+
+#if defined(PIGLIT_USE_OPENGL)
+ if (!test_config->supports_gl_core_version
+ && !test_config->supports_gl_compat_version) {
+ piglit_report_result(PIGLIT_SKIP);
+ }
+#elif defined(PIGLIT_USE_OPENGL_ES1)
+ if (!test_config->supports_gl_es1) {
+ piglit_report_result(PIGLIT_SKIP);
+ }
+#elif defined(PIGLIT_USE_OPENGL_ES2)
+ if (!test_config->supports_gl_es2) {
+ piglit_report_result(PIGLIT_SKIP);
+ }
+#else
+# error
+#endif
+}
+
bool
piglit_gl_framework_init(struct piglit_gl_framework *gl_fw,
const struct piglit_gl_test_config *test_config)
{
+ validate_supported_apis(test_config);
memset(gl_fw, 0, sizeof(*gl_fw));
gl_fw->test_config = test_config;
return true;
diff --git a/tests/util/piglit-framework-gl/piglit_glut_framework.c b/tests/util/piglit-framework-gl/piglit_glut_framework.c
index 032e032..29c75ec 100644
--- a/tests/util/piglit-framework-gl/piglit_glut_framework.c
+++ b/tests/util/piglit-framework-gl/piglit_glut_framework.c
@@ -159,6 +159,12 @@ piglit_glut_framework_create(const struct piglit_gl_test_config *test_config)
{
bool ok = true;
+ if (!test_config->supports_gl_compat_version) {
+ printf("GLUT can create only GL compatibility contexts, "
+ "which the test does not support running under.\n");
+ piglit_report_result(PIGLIT_SKIP);
+ }
+
ok = piglit_gl_framework_init(&glut_fw.gl_fw, test_config);
if (!ok)
return NULL;
diff --git a/tests/util/piglit-framework-gl/piglit_wfl_framework.c b/tests/util/piglit-framework-gl/piglit_wfl_framework.c
index 530c3fc..29f09e8 100644
--- a/tests/util/piglit-framework-gl/piglit_wfl_framework.c
+++ b/tests/util/piglit-framework-gl/piglit_wfl_framework.c
@@ -28,6 +28,13 @@
#include "piglit_wfl_framework.h"
+enum context_flavor {
+ CONTEXT_GL_CORE,
+ CONTEXT_GL_COMPAT,
+ CONTEXT_GL_ES1,
+ CONTEXT_GL_ES2,
+};
+
struct piglit_wfl_framework*
piglit_wfl_framework(struct piglit_gl_framework *gl_fw)
{
@@ -89,21 +96,6 @@ piglit_wfl_framework_choose_platform(void)
return 0;
}
-static int32_t
-get_context_api(void)
-{
- /* FINISHME: Choose the OpenGL API at runtime. */
-#if defined(PIGLIT_USE_OPENGL)
- return WAFFLE_CONTEXT_OPENGL;
-#elif defined(PIGLIT_USE_OPENGL_ES1)
- return WAFFLE_CONTEXT_OPENGL_ES1;
-#elif defined(PIGLIT_USE_OPENGL_ES2)
- return WAFFLE_CONTEXT_OPENGL_ES2;
-#else
-# error
-#endif
-}
-
/**
* \brief Concatenate two zero-terminated attribute lists.
*
@@ -128,35 +120,256 @@ concat_attrib_lists(const int32_t a[], const int32_t b[])
int32_t *r = piglit_calloc(r_size);
memcpy(r, a, a_copy_size);
- memcpy(r + a_copy_size, b, b_copy_size);
- r[r_size - 1] = 0;
+ memcpy(r + 2 * a_length, b, b_copy_size);
+ r[2 * r_length] = 0;
return r;
}
-static void
+static struct waffle_config*
choose_config(struct piglit_wfl_framework *wfl_fw,
+ enum context_flavor flavor,
const int32_t partial_attrib_list[])
{
- int32_t head_attrib_list[3];
+ const struct piglit_gl_test_config *test_config = wfl_fw->gl_fw.test_config;
+
+ struct waffle_config *config;
+ int32_t head_attrib_list[64];
int32_t *full_attrib_list;
int32_t junk;
+ int i;
+
+ /* Derived class must not provide any context attributes. */
+ assert(waffle_attrib_list_get(partial_attrib_list, WAFFLE_CONTEXT_API, &junk) == false);
+ assert(waffle_attrib_list_get(partial_attrib_list, WAFFLE_CONTEXT_PROFILE, &junk) == false);
+ assert(waffle_attrib_list_get(partial_attrib_list, WAFFLE_CONTEXT_MAJOR_VERSION, &junk) == false);
+ assert(waffle_attrib_list_get(partial_attrib_list, WAFFLE_CONTEXT_MINOR_VERSION, &junk) == false);
+
+ switch (flavor) {
+ case CONTEXT_GL_CORE:
+ assert(test_config->supports_gl_core_version);
- /* Derived class must not provide the context api. */
- assert(waffle_attrib_list_get(partial_attrib_list,
- WAFFLE_CONTEXT_API,
- &junk) == false);
+ i = 0;
+ head_attrib_list[i++] = WAFFLE_CONTEXT_API;
+ head_attrib_list[i++] = WAFFLE_CONTEXT_OPENGL;
- head_attrib_list[0] = WAFFLE_CONTEXT_API;
- head_attrib_list[1] = get_context_api();
- head_attrib_list[2] = 0;
+ head_attrib_list[i++] = WAFFLE_CONTEXT_MAJOR_VERSION;
+ head_attrib_list[i++] = test_config->supports_gl_core_version / 10;
+
+ head_attrib_list[i++] = WAFFLE_CONTEXT_MINOR_VERSION;
+ head_attrib_list[i++] = test_config->supports_gl_compat_version % 10;
+
+ head_attrib_list[i++] = 0;
+ break;
+
+ case CONTEXT_GL_COMPAT:
+ assert(test_config->supports_gl_compat_version);
+
+ i = 0;
+ head_attrib_list[i++] = WAFFLE_CONTEXT_API;
+ head_attrib_list[i++] = WAFFLE_CONTEXT_OPENGL;
+
+ head_attrib_list[i++] = WAFFLE_CONTEXT_MAJOR_VERSION;
+ head_attrib_list[i++] = test_config->supports_gl_compat_version / 10;
+
+ head_attrib_list[i++] = WAFFLE_CONTEXT_MINOR_VERSION;
+ head_attrib_list[i++] = test_config->supports_gl_compat_version % 10;
+
+ head_attrib_list[i++] = 0;
+ break;
+
+ case CONTEXT_GL_ES1:
+ assert(test_config->supports_gl_es1);
+
+ i = 0;
+ head_attrib_list[i++] = WAFFLE_CONTEXT_API;
+ head_attrib_list[i++] = WAFFLE_CONTEXT_OPENGL_ES1;
+ head_attrib_list[i++] = 0;
+ break;
+
+ case CONTEXT_GL_ES2:
+ assert(test_config->supports_gl_es2);
+
+ i = 0;
+ head_attrib_list[i++] = WAFFLE_CONTEXT_API;
+ head_attrib_list[i++] = WAFFLE_CONTEXT_OPENGL_ES2;
+ head_attrib_list[i++] = 0;
+ break;
+
+ default:
+ assert(0);
+ break;
+ }
full_attrib_list = concat_attrib_lists(head_attrib_list,
partial_attrib_list);
- wfl_fw->config = wfl_checked_config_choose(wfl_fw->display,
- full_attrib_list);
+
+ config = waffle_config_choose(wfl_fw->display,
+ full_attrib_list);
+ if (!config)
+ wfl_log_debug("waffle_config_choose");
+
free(full_attrib_list);
+ return config;
+}
+
+/**
+ * Handle the special case when a test requests GL 3.1.
+ */
+static bool
+special_case_gl_31(const struct piglit_gl_test_config *test_config,
+ enum context_flavor flavor)
+{
+ int gl_version;
+
+ if (flavor == CONTEXT_GL_CORE
+ && test_config->supports_gl_core_version == 31) {
+
+ gl_version = piglit_get_gl_version();
+ assert(gl_version >= 31);
+
+ if (gl_version == 31
+ && piglit_is_extension_supported("GL_ARB_compatibility"))
+ return false;
+ else
+ return true;
+
+ } else if (flavor == CONTEXT_GL_COMPAT
+ && test_config->supports_gl_compat_version == 31) {
+
+ gl_version = piglit_get_gl_version();
+ assert(gl_version >= 31);
+
+ if (gl_version == 31
+ && !piglit_is_extension_supported("GL_ARB_compatibility"))
+ return false;
+ else
+ return true;
+ } else {
+ /* No need to check the special case. */
+ return true;
+ }
+}
+
+static bool
+make_context_current_singlepass(struct piglit_wfl_framework *wfl_fw,
+ const struct piglit_gl_test_config *test_config,
+ enum context_flavor flavor,
+ const int32_t partial_config_attrib_list[])
+{
+ bool ok;
+
+ assert(wfl_fw->config == NULL);
+ assert(wfl_fw->context == NULL);
+ assert(wfl_fw->window == NULL);
+
+ wfl_fw->config = choose_config(wfl_fw, flavor,
+ partial_config_attrib_list);
+ if (!wfl_fw->config)
+ goto fail;
+
+ wfl_fw->context = waffle_context_create(wfl_fw->config, NULL);
+ if (!wfl_fw->context) {
+ wfl_log_debug("waffle_context_create");
+ goto fail;
+ }
+
+ wfl_fw->window = wfl_checked_window_create(wfl_fw->config,
+ test_config->window_width,
+ test_config->window_height);
+
+ wfl_checked_make_current(wfl_fw->display,
+ wfl_fw->window,
+ wfl_fw->context);
+
+#ifdef PIGLIT_USE_OPENGL
+ piglit_dispatch_default_init();
+#endif
+
+ ok = special_case_gl_31(test_config, flavor);
+ if (!ok)
+ goto fail;
+
+ return true;
+
+fail:
+ waffle_window_destroy(wfl_fw->window);
+ waffle_context_destroy(wfl_fw->context);
+ waffle_config_destroy(wfl_fw->config);
+
+ wfl_fw->window = NULL;
+ wfl_fw->context = NULL;
+ wfl_fw->config = NULL;
+
+ return false;
+}
+
+static void
+make_context_current(struct piglit_wfl_framework *wfl_fw,
+ const struct piglit_gl_test_config *test_config,
+ const int32_t partial_config_attrib_list[])
+{
+ bool ok = false;
+
+#if defined(PIGLIT_USE_OPENGL)
+
+ if (test_config->supports_gl_core_version) {
+ ok = make_context_current_singlepass(wfl_fw, test_config,
+ CONTEXT_GL_CORE,
+ partial_config_attrib_list);
+ if (ok) {
+ return;
+ } else {
+ printf("piglit: info: Failed to create GL %d.%d "
+ "core context\n",
+ test_config->supports_gl_core_version / 10,
+ test_config->supports_gl_core_version % 10);
+ }
+ }
+
+ if (test_config->supports_gl_compat_version) {
+ ok = make_context_current_singlepass(wfl_fw, test_config,
+ CONTEXT_GL_COMPAT,
+ partial_config_attrib_list);
+ if (ok) {
+ return;
+ } else {
+ printf("piglit: info: Failed to create GL %d.%d "
+ "compatibility context\n",
+ test_config->supports_gl_compat_version / 10,
+ test_config->supports_gl_compat_version % 10);
+ }
+ }
+
+#elif defined(PIGLIT_USE_OPENGL_ES1)
+ ok = make_context_current_singlepass(wfl_fw, test_config,
+ CONTEXT_GL_ES1,
+ partial_config_attrib_list);
+
+ if (ok)
+ return;
+ else
+ printf("piglit: info: Failed to create GL ES1 context\n");
+
+#elif defined(PIGLIT_USE_OPENGL_ES2)
+ ok = make_context_current_singlepass(wfl_fw, test_config,
+ CONTEXT_GL_ES2,
+ partial_config_attrib_list);
+
+ if (ok)
+ return;
+ else
+ printf("piglit: info: Failed to create GL ES2 context\n");
+#else
+# error
+#endif
+
+ if (!ok) {
+ printf("piglit: info: Failed to create any GL context\n");
+ piglit_report_result(PIGLIT_SKIP);
+ }
}
+
bool
piglit_wfl_framework_init(struct piglit_wfl_framework *wfl_fw,
const struct piglit_gl_test_config *test_config,
@@ -187,18 +400,7 @@ piglit_wfl_framework_init(struct piglit_wfl_framework *wfl_fw,
wfl_fw->platform = platform;
wfl_fw->display = wfl_checked_display_connect(NULL);
- choose_config(wfl_fw, partial_config_attrib_list);
- wfl_fw->context = wfl_checked_context_create(wfl_fw->config, NULL);
- wfl_fw->window = wfl_checked_window_create(wfl_fw->config,
- test_config->window_width,
- test_config->window_height);
- wfl_checked_make_current(wfl_fw->display,
- wfl_fw->window,
- wfl_fw->context);
-
-#ifdef PIGLIT_USE_OPENGL
- piglit_dispatch_default_init();
-#endif
+ make_context_current(wfl_fw, test_config, partial_config_attrib_list);
return true;
--
1.7.12.1
More information about the Piglit
mailing list