diff options
author | Jesse Natalie <jenatali@microsoft.com> | 2021-09-01 07:07:57 -0700 |
---|---|---|
committer | Jesse Natalie <jenatali@microsoft.com> | 2021-09-08 07:22:39 -0700 |
commit | f36921effecca59b5dc38e7e1ef73a612dbe78d2 (patch) | |
tree | c38c66686ae9fed3bf7cbc88a4dc89d5f79ea887 /src/gallium/targets/libgl-gdi | |
parent | e2bb111e02f9949b3c044cb9de024d87b96e5aac (diff) |
wgl: Refactor drivers to a libgallium_wgl.dll
I'd like to support EGL on Windows, using the same architecture as Linux.
On Linux, libgallium_dri.so is a "megadriver," containing the Mesa Gallium
state tracker, plus the actual driver implementations.
Now, on Windows, libgallium_wgl.dll is a proper OpenGL ICD, and OpenGL32.dll
is just a stub DLL which implements the wgl* APIs in terms of that ICD.
This is the more "architecturally clean" way to share the state tracker
between EGL and WGL.
Reviewed By: Bill Kristiansen <billkris@microsoft.com>
Reviewed-by: Charmaine Lee >charmainel@vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12677>
Diffstat (limited to 'src/gallium/targets/libgl-gdi')
-rw-r--r-- | src/gallium/targets/libgl-gdi/libgl_gdi.c | 332 | ||||
-rw-r--r-- | src/gallium/targets/libgl-gdi/meson.build | 11 |
2 files changed, 5 insertions, 338 deletions
diff --git a/src/gallium/targets/libgl-gdi/libgl_gdi.c b/src/gallium/targets/libgl-gdi/libgl_gdi.c deleted file mode 100644 index f7898eeebc9..00000000000 --- a/src/gallium/targets/libgl-gdi/libgl_gdi.c +++ /dev/null @@ -1,332 +0,0 @@ -/************************************************************************** - * - * Copyright 2009-2010 VMware, Inc. - * All Rights Reserved. - * - * 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, sub license, 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 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 NON-INFRINGEMENT. IN NO EVENT SHALL - * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS 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. - * - * The above copyright notice and this permission notice (including the - * next paragraph) shall be included in all copies or substantial portions - * of the Software. - * - * - **************************************************************************/ - -/** - * @file - * Softpipe/LLVMpipe support. - * - * @author Jose Fonseca <jfonseca@vmware.com> - */ - - -#include <windows.h> - -#include "util/u_debug.h" -#include "util/debug.h" -#include "stw_winsys.h" -#include "stw_device.h" -#include "gdi/gdi_sw_winsys.h" -#include "pipe/p_screen.h" -#include "pipe/p_context.h" - -#ifdef GALLIUM_SOFTPIPE -#include "softpipe/sp_texture.h" -#include "softpipe/sp_screen.h" -#include "softpipe/sp_public.h" -#endif - -#ifdef GALLIUM_LLVMPIPE -#include "llvmpipe/lp_texture.h" -#include "llvmpipe/lp_screen.h" -#include "llvmpipe/lp_public.h" -#endif - -#ifdef GALLIUM_SWR -#include "swr/swr_public.h" -#endif -#ifdef GALLIUM_D3D12 -#include "d3d12/wgl/d3d12_wgl_public.h" -#endif - -#ifdef GALLIUM_ZINK -#include "zink/zink_public.h" -#endif - -#ifdef GALLIUM_LLVMPIPE -static boolean use_llvmpipe = FALSE; -#endif -#ifdef GALLIUM_SWR -static boolean use_swr = FALSE; -#endif -#ifdef GALLIUM_D3D12 -static boolean use_d3d12 = FALSE; -#endif -#ifdef GALLIUM_ZINK -static boolean use_zink = FALSE; -#endif - -static const char *created_driver_name = NULL; - -static struct pipe_screen * -gdi_screen_create_by_name(HDC hDC, const char* driver, struct sw_winsys *winsys) -{ - struct pipe_screen* screen = NULL; - -#ifdef GALLIUM_LLVMPIPE - if (strcmp(driver, "llvmpipe") == 0) { - screen = llvmpipe_create_screen(winsys); - if (screen) - use_llvmpipe = TRUE; - } -#endif -#ifdef GALLIUM_SWR - if (strcmp(driver, "swr") == 0) { - screen = swr_create_screen(winsys); - if (screen) - use_swr = TRUE; - } -#endif -#ifdef GALLIUM_D3D12 - if (strcmp(driver, "d3d12") == 0) { - screen = d3d12_wgl_create_screen(winsys, hDC); - if (screen) - use_d3d12 = TRUE; - } -#endif -#ifdef GALLIUM_ZINK - if (strcmp(driver, "zink") == 0) { - screen = zink_create_screen(winsys); - if (screen) - use_zink = TRUE; - } -#endif -#ifdef GALLIUM_SOFTPIPE - if (strcmp(driver, "softpipe") == 0) { - screen = softpipe_create_screen(winsys); - } -#endif - - return screen; -} - -static struct pipe_screen * -gdi_screen_create(HDC hDC) -{ - struct sw_winsys *winsys; - UNUSED bool sw_only = env_var_as_boolean("LIBGL_ALWAYS_SOFTWARE", false); - - winsys = gdi_create_sw_winsys(); - if (!winsys) - return NULL; - - const char *const drivers[] = { - debug_get_option("GALLIUM_DRIVER", ""), -#ifdef GALLIUM_D3D12 - sw_only ? "" : "d3d12", -#endif -#if defined(GALLIUM_LLVMPIPE) - "llvmpipe", -#endif -#if GALLIUM_SWR - "swr", -#endif -#if defined(GALLIUM_SOFTPIPE) - "softpipe", -#endif - }; - - /* If the default driver screen creation fails, fall back to the next option in the - * sorted list. Don't do this if GALLIUM_DRIVER is specified. - */ - for (unsigned i = 0; i < ARRAY_SIZE(drivers); ++i) { - struct pipe_screen* screen = gdi_screen_create_by_name(hDC, drivers[i], winsys); - if (screen) { - created_driver_name = drivers[i]; - return screen; - } - if (i == 0 && drivers[i][0] != '\0') - break; - } - - winsys->destroy(winsys); - return NULL; -} - - -static void -gdi_present(struct pipe_screen *screen, - struct pipe_context *ctx, - struct pipe_resource *res, - HDC hDC) -{ - /* This will fail if any interposing layer (trace, debug, etc) has - * been introduced between the gallium frontends and the pipe driver. - * - * Ideally this would get replaced with a call to - * pipe_screen::flush_frontbuffer(). - * - * Failing that, it may be necessary for intervening layers to wrap - * other structs such as this stw_winsys as well... - */ - - struct sw_winsys *winsys = NULL; - struct sw_displaytarget *dt = NULL; - -#ifdef GALLIUM_LLVMPIPE - if (use_llvmpipe) { - winsys = llvmpipe_screen(screen)->winsys; - dt = llvmpipe_resource(res)->dt; - gdi_sw_display(winsys, dt, hDC); - return; - } -#endif - -#ifdef GALLIUM_SWR - if (use_swr) { - swr_gdi_swap(screen, ctx, res, hDC); - return; - } -#endif - -#ifdef GALLIUM_D3D12 - if (use_d3d12) { - d3d12_wgl_present(screen, ctx, res, hDC); - return; - } -#endif - -#ifdef GALLIUM_ZINK - if (use_zink) { - screen->flush_frontbuffer(screen, ctx, res, 0, 0, hDC, NULL); - return; - } -#endif - -#ifdef GALLIUM_SOFTPIPE - winsys = softpipe_screen(screen)->winsys, - dt = softpipe_resource(res)->dt, - gdi_sw_display(winsys, dt, hDC); -#endif -} - - -#if WINVER >= 0xA00 -static boolean -gdi_get_adapter_luid(struct pipe_screen* screen, - HDC hDC, - LUID* adapter_luid) -{ - if (!stw_dev || !stw_dev->callbacks.pfnGetAdapterLuid) - return false; - - stw_dev->callbacks.pfnGetAdapterLuid(hDC, adapter_luid); - return true; -} -#endif - - -static unsigned -gdi_get_pfd_flags(struct pipe_screen *screen) -{ -#ifdef GALLIUM_D3D12 - if (use_d3d12) - return d3d12_wgl_get_pfd_flags(screen); -#endif - return stw_pfd_gdi_support; -} - - -static struct stw_winsys_framebuffer * -gdi_create_framebuffer(struct pipe_screen *screen, - HDC hDC, - int iPixelFormat) -{ -#ifdef GALLIUM_D3D12 - if (use_d3d12) - return d3d12_wgl_create_framebuffer(screen, hDC, iPixelFormat); -#endif - return NULL; -} - -static const char * -gdi_get_name(void) -{ - return created_driver_name; -} - - -static const struct stw_winsys stw_winsys = { - &gdi_screen_create, - &gdi_present, -#if WINVER >= 0xA00 - &gdi_get_adapter_luid, -#else - NULL, /* get_adapter_luid */ -#endif - NULL, /* shared_surface_open */ - NULL, /* shared_surface_close */ - NULL, /* compose */ - &gdi_get_pfd_flags, - &gdi_create_framebuffer, - &gdi_get_name, -}; - - -EXTERN_C BOOL WINAPI -DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved); - - -BOOL WINAPI -DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) -{ - switch (fdwReason) { - case DLL_PROCESS_ATTACH: - stw_init(&stw_winsys); - stw_init_thread(); - break; - - case DLL_THREAD_ATTACH: - stw_init_thread(); - break; - - case DLL_THREAD_DETACH: - stw_cleanup_thread(); - break; - - case DLL_PROCESS_DETACH: - if (lpvReserved == NULL) { - // We're being unloaded from the process. - stw_cleanup_thread(); - stw_cleanup(); - } else { - // Process itself is terminating, and all threads and modules are - // being detached. - // - // The order threads (including llvmpipe rasterizer threads) are - // destroyed can not be relied up, so it's not safe to cleanup. - // - // However global destructors (e.g., LLVM's) will still be called, and - // if Microsoft OPENGL32.DLL's DllMain is called after us, it will - // still try to invoke DrvDeleteContext to destroys all outstanding, - // so set stw_dev to NULL to return immediately if that happens. - stw_dev = NULL; - } - break; - } - return TRUE; -} diff --git a/src/gallium/targets/libgl-gdi/meson.build b/src/gallium/targets/libgl-gdi/meson.build index 588749aa639..d0a21d0742e 100644 --- a/src/gallium/targets/libgl-gdi/meson.build +++ b/src/gallium/targets/libgl-gdi/meson.build @@ -28,18 +28,16 @@ ogldef = files('opengl32.def')[0] libopengl32 = shared_library( 'opengl32', - ['libgl_gdi.c', 'stw_wgl.c'], + ['stw_wgl.c'], vs_module_defs : ogldef, include_directories : [ - inc_include, inc_src, inc_mapi, inc_mesa, inc_gallium, inc_gallium_aux, inc_wgl, inc_gallium_winsys, inc_gallium_winsys_sw, inc_gallium_drivers, + inc_include, inc_wgl, inc_src, ], - link_whole : [libwgl], link_with : [ - libgallium, libglsl, libmesa_gallium, libwsgdi, libglapi_static, libglapi + libgallium_wgl, libglapi_static, libglapi ], dependencies : [ - dep_ws2_32, idep_nir, idep_mesautil, driver_swrast, driver_swr, - driver_d3d12, driver_zink, winsys_d3d12_wgl + idep_mesautil ], c_args : ['-D_GDI32_'], link_args : opengl32_link_args, @@ -69,6 +67,7 @@ if with_tests # The CI pipeline for MinGW doesn't support creating a window, so don't run these tests there if with_tests and cc.get_id() != 'gcc' wgl_test_env = environment() + wgl_test_env.append('PATH', libgallium_wgl_build_dir) if with_shared_glapi wgl_test_env.append('PATH', libglapi_build_dir) endif |