Module: vkd3d Branch: master Commit: 0f3a42c34b3d8d8b38564f79029e9ac8758d22dc URL: https://gitlab.winehq.org/wine/vkd3d/-/commit/0f3a42c34b3d8d8b38564f79029e9a...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Mon Feb 12 19:57:42 2024 +0100
tests: Implement check_requirements() for the OpenGL shader runner.
---
tests/shader_runner.c | 4 +--- tests/shader_runner_gl.c | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 5 deletions(-)
diff --git a/tests/shader_runner.c b/tests/shader_runner.c index a683866c..c645e6c0 100644 --- a/tests/shader_runner.c +++ b/tests/shader_runner.c @@ -1350,10 +1350,8 @@ void run_shader_tests(struct shader_runner *runner, const struct shader_runner_o
case STATE_REQUIRE: if (runner->maximum_shader_model < runner->minimum_shader_model - || (runner->ops->check_requirements && !runner->ops->check_requirements(runner))) - { + || !runner->ops->check_requirements(runner)) skip_tests = true; - } break;
case STATE_RESOURCE: diff --git a/tests/shader_runner_gl.c b/tests/shader_runner_gl.c index a898d021..881ca77a 100644 --- a/tests/shader_runner_gl.c +++ b/tests/shader_runner_gl.c @@ -59,6 +59,12 @@ struct gl_runner { struct shader_runner r;
+ struct + { + bool float64; + bool int64; + } caps; + EGLDisplay display; EGLContext context;
@@ -93,7 +99,7 @@ static bool check_gl_extension(const char *extension, GLint extension_count) return false; }
-static bool check_gl_extensions(void) +static bool check_gl_extensions(struct gl_runner *runner) { GLint count;
@@ -114,6 +120,11 @@ static bool check_gl_extensions(void) return false; }
+ if (check_gl_extension("GL_ARB_gpu_shader_fp64", count)) + runner->caps.float64 = true; + if (check_gl_extension("GL_ARB_gpu_shader_int64", count)) + runner->caps.int64 = true; + return true; }
@@ -210,7 +221,8 @@ static bool gl_runner_init(struct gl_runner *runner) continue; }
- if (!check_gl_extensions()) + memset(&runner->caps, 0, sizeof(runner->caps)); + if (!check_gl_extensions(runner)) { trace("Device %u lacks required extensions.\n", i); eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); @@ -237,6 +249,9 @@ static bool gl_runner_init(struct gl_runner *runner) trace("GL_RENDERER: %s\n", glGetString(GL_RENDERER)); trace(" GL_VERSION: %s\n", glGetString(GL_VERSION));
+ trace(" float64: %u.\n", runner->caps.float64); + trace(" int64: %u.\n", runner->caps.int64); + p_glSpecializeShader = (void *)eglGetProcAddress("glSpecializeShader");
glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_NOTIFICATION, 0, NULL, GL_FALSE); @@ -274,6 +289,18 @@ static void gl_runner_cleanup(struct gl_runner *runner) ok(ret, "Failed to terminate EGL display connection.\n"); }
+static bool gl_runner_check_requirements(struct shader_runner *r) +{ + struct gl_runner *runner = gl_runner(r); + + if (r->require_float64 && !runner->caps.float64) + return false; + if (r->require_int64 && !runner->caps.int64) + return false; + + return true; +} + static const struct format_info *get_format_info(enum DXGI_FORMAT format) { size_t i; @@ -979,6 +1006,7 @@ static void gl_runner_release_readback(struct shader_runner *runner, struct reso
static const struct shader_runner_ops gl_runner_ops = { + .check_requirements = gl_runner_check_requirements, .create_resource = gl_runner_create_resource, .destroy_resource = gl_runner_destroy_resource, .dispatch = gl_runner_dispatch,