[Piglit] [PATCH] wgl: initial check-in of wgl utility code and wgl sanity check program
Brian Paul
brianp at vmware.com
Tue Jul 11 16:06:47 UTC 2017
Like the glx tests/utility code, but for wgl.
Note, one must set the PIGLIT_PLATFORM env var to "wgl" before running
Piglit. It looks like there's some Waffle work to look at before this
can be made automatic.
---
CMakeLists.txt | 7 ++
framework/core.py | 2 +-
tests/CMakeLists.txt | 1 +
tests/all.py | 5 ++
tests/util/CMakeLists.gl.txt | 25 ++++++
tests/util/piglit-wgl-util.c | 190 +++++++++++++++++++++++++++++++++++++++++++
tests/util/piglit-wgl-util.h | 41 ++++++++++
tests/wgl/CMakeLists.gl.txt | 27 ++++++
tests/wgl/CMakeLists.txt | 1 +
tests/wgl/wgl-sanity.c | 88 ++++++++++++++++++++
10 files changed, 386 insertions(+), 1 deletion(-)
create mode 100644 tests/util/piglit-wgl-util.c
create mode 100644 tests/util/piglit-wgl-util.h
create mode 100644 tests/wgl/CMakeLists.gl.txt
create mode 100644 tests/wgl/CMakeLists.txt
create mode 100644 tests/wgl/wgl-sanity.c
diff --git a/CMakeLists.txt b/CMakeLists.txt
index cc26fa8..d560bcc 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -179,6 +179,13 @@ ELSE()
option(PIGLIT_BUILD_GLX_TESTS "Build tests that require GLX" OFF)
ENDIF()
+IF(PIGLIT_HAS_WGL)
+ option(PIGLIT_BUILD_WGL_TESTS "Build tests that require WGL" ON)
+ELSE()
+ option(PIGLIT_BUILD_WGL_TESTS "Build tests that require WGL" OFF)
+ENDIF()
+
+
# Choose to build tests that use dma_buf.
#
# Piglit's dma_buf utilities require xcb-dri2 to gain DRM authentication.
diff --git a/framework/core.py b/framework/core.py
index c2de5d0..9abc128 100644
--- a/framework/core.py
+++ b/framework/core.py
@@ -44,7 +44,7 @@ __all__ = [
'parse_listfile',
]
-PLATFORMS = ["glx", "x11_egl", "wayland", "gbm", "mixed_glx_egl"]
+PLATFORMS = ["glx", "x11_egl", "wayland", "gbm", "mixed_glx_egl", "wgl"]
class PiglitConfig(configparser.SafeConfigParser):
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 7aab33f..ae50d0a 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -17,6 +17,7 @@ add_subdirectory (texturing)
add_subdirectory (spec)
add_subdirectory (fast_color_clear)
add_subdirectory (perf)
+add_subdirectory (wgl)
if (NOT APPLE)
# glean relies on AGL which is deprecated/broken on recent Mac OS X
diff --git a/tests/all.py b/tests/all.py
index 4959789..f98b703 100644
--- a/tests/all.py
+++ b/tests/all.py
@@ -835,6 +835,11 @@ with profile.test_list.group_manager(
g(['glx-query-renderer-coverage'], 'coverage')
with profile.test_list.group_manager(
+ PiglitGLTest, 'wgl',
+ require_platforms=['wgl']) as g:
+ g(['wgl-sanity'])
+
+with profile.test_list.group_manager(
PiglitGLTest,
grouptools.join('spec', '!opengl 1.1')) as g:
g(['copyteximage', '1D'], run_concurrent=False)
diff --git a/tests/util/CMakeLists.gl.txt b/tests/util/CMakeLists.gl.txt
index a01fce3..e11213a 100644
--- a/tests/util/CMakeLists.gl.txt
+++ b/tests/util/CMakeLists.gl.txt
@@ -33,6 +33,31 @@ IF(PIGLIT_BUILD_GLX_TESTS)
)
ENDIF(PIGLIT_BUILD_GLX_TESTS)
+IF(PIGLIT_BUILD_WGL_TESTS)
+ # XXX: This is currently duplicated wherever tests
+ # include "piglit-wgl-util.h". Is it possible to refactor it?
+ include_directories(
+ ${GLPROTO_INCLUDE_DIRS}
+ )
+
+ add_definitions ( -DPIGLIT_USE_WGL )
+ piglit_add_library (piglitwglutil
+ piglit-shader.c
+ piglit-util-gl.c
+ piglit-wgl-util.c
+ piglit-dispatch.c
+ piglit-dispatch-init.c
+ ${piglit_dispatch_gen_output_dir}/piglit-util-gl-enum-gen.c
+ )
+ target_link_libraries(piglitwglutil
+ piglitutil_${piglit_target_api}
+ )
+ set (UTIL_GL_SOURCES
+ ${UTIL_GL_SOURCES}
+ piglit-wgl-util.c
+ )
+ENDIF(PIGLIT_BUILD_WGL_TESTS)
+
piglit_add_library (piglitutil_${piglit_target_api}
${UTIL_GL_SOURCES}
)
diff --git a/tests/util/piglit-wgl-util.c b/tests/util/piglit-wgl-util.c
new file mode 100644
index 0000000..80f0f52
--- /dev/null
+++ b/tests/util/piglit-wgl-util.c
@@ -0,0 +1,190 @@
+/*
+ * Copyright © 2017 VMware, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ * WGL utility functions, based on GLX utility functions by Eric Anholt.
+ *
+ * Authors:
+ * Brian Paul
+ *
+ */
+
+#include <stdio.h>
+#include "piglit-util-gl.h"
+#include "piglit-wgl-util.h"
+
+
+int piglit_width = 100;
+int piglit_height = 100;
+
+
+static LRESULT CALLBACK
+WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ switch (uMsg) {
+ case WM_CLOSE:
+ PostQuitMessage(0);
+ return 0;
+ case WM_SIZE:
+ //reshape(LOWORD(lParam), HIWORD(lParam));
+ return 0;
+ case WM_KEYDOWN:
+ if (wParam == VK_ESCAPE)
+ PostQuitMessage(0);
+ return 0;
+ }
+
+ return DefWindowProc(hWnd, uMsg, wParam, lParam);
+}
+
+
+HWND
+piglit_get_wgl_window(void)
+{
+ int pixelFormat;
+ WNDCLASS wc;
+ DWORD dwExStyle, dwStyle;
+ HDC hDC;
+ RECT winrect;
+ HINSTANCE hInst;
+ HWND hWnd;
+ char *name = "wgl";
+
+ static const PIXELFORMATDESCRIPTOR pfd = {
+ sizeof(PIXELFORMATDESCRIPTOR),
+ 1,
+ PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
+ PFD_TYPE_RGBA,
+ 24,
+ 0, 0, 0, 0, 0, 0,
+ 0,
+ 0,
+ 0,
+ 0, 0, 0, 0,
+ 16,
+ 0,
+ 0,
+ PFD_MAIN_PLANE,
+ 0,
+ 0, 0, 0
+ };
+
+ winrect.left = 0;
+ winrect.right = piglit_width;
+ winrect.top = 0;
+ winrect.bottom = piglit_height;
+
+ hInst = GetModuleHandle(NULL);
+ wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
+ wc.lpfnWndProc = (WNDPROC)WndProc;
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = 0;
+ wc.hInstance = hInst;
+ wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
+ wc.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wc.hbrBackground = NULL;
+ wc.lpszMenuName = NULL;
+ wc.lpszClassName = name;
+ if (!RegisterClass(&wc)) {
+ fprintf(stderr, "failed to register class\n");
+ return 0;
+ }
+
+ dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
+ dwStyle = WS_OVERLAPPEDWINDOW;
+ AdjustWindowRectEx(&winrect, dwStyle, FALSE, dwExStyle);
+
+ if (!(hWnd = CreateWindowEx(dwExStyle, name, name,
+ WS_CLIPSIBLINGS | WS_CLIPCHILDREN | dwStyle,
+ 0, 0,
+ winrect.right - winrect.left,
+ winrect.bottom - winrect.top,
+ NULL, NULL, hInst, NULL))) {
+ fprintf(stderr, "failed to create window\n");
+ return 0;
+ }
+
+ if (!(hDC = GetDC(hWnd))) {
+ fprintf(stderr, "GetDC failed\n");
+ return 0;
+ }
+
+ if (!(pixelFormat = ChoosePixelFormat(hDC, &pfd))) {
+ fprintf(stderr, "ChoosePixelFormat failed\n");
+ return 0;
+ }
+
+ if (!(SetPixelFormat(hDC, pixelFormat, &pfd))) {
+ fprintf(stderr, "SetPixelFormat failed\n");
+ return 0;
+ }
+
+ ShowWindow(hWnd, SW_SHOW);
+ SetForegroundWindow(hWnd);
+ SetFocus(hWnd);
+
+ return hWnd;
+}
+
+
+HGLRC
+piglit_get_wgl_context(HWND hWnd)
+{
+ HDC hDC;
+ HGLRC hRC;
+
+ if (!(hDC = GetDC(hWnd))) {
+ fprintf(stderr, "GetDC failed\n");
+ return 0;
+ }
+
+ if (!(hRC = wglCreateContext(hDC))) {
+ fprintf(stderr, "wglCreateContext failed\n");
+ return 0;
+ }
+
+ return hRC;
+}
+
+
+void
+piglit_wgl_event_loop(enum piglit_result (*draw)(void))
+{
+ MSG msg;
+ enum piglit_result result = PIGLIT_SKIP;
+
+ while(1) {
+ if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
+ if (msg.message == WM_QUIT)
+ break;
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+
+ result = draw();
+
+ if (piglit_automatic) {
+ break;
+ }
+ }
+
+ piglit_report_result(result);
+}
diff --git a/tests/util/piglit-wgl-util.h b/tests/util/piglit-wgl-util.h
new file mode 100644
index 0000000..dce11b9
--- /dev/null
+++ b/tests/util/piglit-wgl-util.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright © 2017 VMware, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#ifndef PIGLIT_WGL_UTIL_H
+#define PIGLIT_WGL_UTIL_H
+
+#include <windows.h>
+#include "piglit-framework-gl.h"
+
+
+HWND
+piglit_get_wgl_window(void);
+
+HGLRC
+piglit_get_wgl_context(HWND hWnd);
+
+void
+piglit_wgl_event_loop(enum piglit_result (*draw)(void));
+
+
+#endif
diff --git a/tests/wgl/CMakeLists.gl.txt b/tests/wgl/CMakeLists.gl.txt
new file mode 100644
index 0000000..c631f85
--- /dev/null
+++ b/tests/wgl/CMakeLists.gl.txt
@@ -0,0 +1,27 @@
+
+include_directories(
+ ${GLEXT_INCLUDE_DIR}
+ ${OPENGL_INCLUDE_PATH}
+)
+
+if(PIGLIT_BUILD_WGL_TESTS)
+ link_libraries (
+ piglitwglutil
+ )
+endif(PIGLIT_BUILD_WGL_TESTS)
+
+link_libraries (
+ ${OPENGL_gl_LIBRARY}
+)
+
+IF(PIGLIT_BUILD_WGL_TESTS)
+ include_directories(
+ ${GLPROTO_INCLUDE_DIRS}
+ )
+ link_libraries (
+ ${X11_X11_LIB}
+ )
+ piglit_add_executable (wgl-sanity wgl-sanity.c)
+ENDIF(PIGLIT_BUILD_WGL_TESTS)
+
+# vim: ft=cmake:
diff --git a/tests/wgl/CMakeLists.txt b/tests/wgl/CMakeLists.txt
new file mode 100644
index 0000000..144a306
--- /dev/null
+++ b/tests/wgl/CMakeLists.txt
@@ -0,0 +1 @@
+piglit_include_target_api()
diff --git a/tests/wgl/wgl-sanity.c b/tests/wgl/wgl-sanity.c
new file mode 100644
index 0000000..133501d
--- /dev/null
+++ b/tests/wgl/wgl-sanity.c
@@ -0,0 +1,88 @@
+/*
+ * Copyright © 2017 VMware, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+/*
+ * Basic WGL sanity check: create a window, context, clear window to green.
+ *
+ * Authors:
+ * Brian Paul
+ */
+
+#include <assert.h>
+#include <stdio.h>
+#include "piglit-util-gl.h"
+#include "piglit-wgl-util.h"
+
+HWND hWnd;
+HGLRC ctx;
+
+
+enum piglit_result
+draw(void)
+{
+ static const float green[4] = { 0, 1, 0, 1 };
+ bool pass = true;
+
+ glClearColor(0, 1, 0, 1);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ if (!piglit_probe_rect_rgba(0, 0, piglit_width, piglit_height,
+ green)) {
+ pass = false;
+ }
+
+ SwapBuffers(GetDC(hWnd));
+
+ return pass ? PIGLIT_PASS : PIGLIT_FAIL;
+}
+
+
+int
+main(int argc, char **argv)
+{
+ int i;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-auto") == 0) {
+ piglit_automatic = 1;
+ break;
+ }
+ }
+
+ hWnd = piglit_get_wgl_window();
+ assert(hWnd);
+
+ ctx = piglit_get_wgl_context(hWnd);
+ assert(ctx);
+
+ if (!wglMakeCurrent(GetDC(hWnd), ctx)) {
+ fprintf(stderr, "wglMakeCurrent failed\n");
+ return 0;
+ }
+
+ piglit_dispatch_default_init(PIGLIT_DISPATCH_GL);
+
+ piglit_wgl_event_loop(draw);
+
+ return 0;
+}
--
1.9.1
More information about the Piglit
mailing list