[Piglit] [PATCH] wgl: initial check-in of wgl utility code and wgl sanity check program
Jose Fonseca
jfonseca at vmware.com
Tue Jul 18 07:06:28 UTC 2017
On 11/07/17 17:06, Brian Paul wrote:
> 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}
> + )
There are two possible solutions: -
- add GLPROTO_INCLUDE_DIRS include dir globally, assuming it doesn't
cause interference
- use target_include_directories(piglitwglutil ${GLPROTO_INCLUDE_DIRS})
instead of include_directories(), which in theory should make any
dependent target that links against piglitwglutil automatically include
this include.
But is this really needed for WGL? Aren't these X11 proto headers?
> +
> + 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;
> +}
>
Otherwise looks great AFAICT -- WGL specific tests have indeed been long
standing omission.
Jose
More information about the Piglit
mailing list