/* Win32Private.h Author: Patrick Baggett Created: 1/7/2012 Purpose: Private defintions and functions for Win32 implementation of libsst-wm License: This program is free software. It comes without any warranty, to the extent permitted by applicable law. You can redistribute it and/or modify it under the terms of the Do What The Fuck You Want To Public License, Version 2, as published by Sam Hocevar. See http://sam.zoy.org/wtfpl/COPYING for more details. */ #pragma once #ifndef _WIN32PRIVATE_H #define _WIN32PRIVATE_H #include #include /* More Win32 macros */ #include #include #include "../EventQueue.h" #define ADAPTER_NAME_STRLEN 128 #define STRLEN_GUID ((size_t)64) /* Storage enough to hold a Win32 GUID if it was written as a string of hex characters with dashes (need only like 36-38) */ #define MIN_BPP 24 /* Minimum BPP for a mode to be considered */ #define SST_WINCLASS "libsstwm" #define SST_DLGCLASS "libsstwmdlg" #define MAX_GL_ATTRS 32 /*************************************************************************/ typedef HGLRC (WINAPI * pf_wglCreateContext)(HDC hdc); typedef BOOL (WINAPI * pf_wglMakeCurrent)(HDC hdc, HGLRC hglrc); typedef PROC (WINAPI * pf_wglGetProcAddress)(LPCSTR lpszProc); typedef BOOL (WINAPI * pf_wglDeleteContext)(HGLRC hglrc); typedef BOOL (WINAPI * pf_wglShareLists)(HGLRC hglrc1, HGLRC hglrc2); typedef HGLRC (WINAPI * pf_wglGetCurrentContext)(void); typedef HDC (WINAPI * pf_wglGetCurrentDC)(void); typedef const char* (WINAPI * pf_wglGetExtensionsStringARB)(HDC hdc); typedef BOOL (WINAPI * pf_wglChoosePixelFormatARB)(HDC hdc, const int* piAttribIList, const FLOAT* pfAttribFList, UINT nMaxFormats, int* piFormats, UINT* nNumFormats); typedef HGLRC (WINAPI * pf_wglCreateContextAttribsARB)(HDC hDC, HGLRC hshareContext, const int *attribList); typedef BOOL (WINAPI * pf_wglGetPixelFormatAttribivARB)(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues); /*************************************************************************/ /* Note about memory management -- these functions all use the Win32 API (HeapAlloc()/HeapFree()) instead of the CRT functions (malloc()/free()). This is so that it has less of dependency on the CRT. */ /*************************************************************************/ /* Structure to maps an adapter-display pair to a DISPLAY_DEVICE */ typedef struct ASMapEntry { SST_VideoMode defaultVmode; const DISPLAY_DEVICEA* dev; SST_VideoMode* vmodes; size_t adapter; size_t screen; size_t vmodeCount; } ASMapEntry; /*************************************************************************/ typedef struct FindMonitorInfo { const DISPLAY_DEVICEA* dev; /* Name of the device we are trying to find a matching HMONITOR for */ BOOL foundIt; /* Did we find it? */ LONG top, left; /* Monitor corner (top,left) */ LONG bottom, right; } FindMonitorInfo; /*************************************************************************/ typedef struct SST_GraphicsEnumerator_Win32 { char* adapterNames; DISPLAY_DEVICEA* devsFound; size_t* screenCount; ASMapEntry* ASMap; size_t adapterCount; size_t devCount; size_t ASPairCount; } SST_GraphicsEnumerator_Win32; /*************************************************************************/ typedef struct SST_DisplayTarget_Win32 { CRITICAL_SECTION userEventLock; /* Lock protection user events */ EventQueue userEventQueue; DISPLAY_DEVICEA* devs; /* Array of devices representing this display target */ struct SST_Window_Win32* firstWindow; /* First window in a list of windows */ size_t screenCount; size_t screenIndex; BOOL relativeMouse; } SST_DisplayTarget_Win32; /*************************************************************************/ typedef struct SST_Window_Win32 { WINDOWPLACEMENT wp; EventQueue eventQueue; struct SST_Window_Win32* next; SST_DisplayTarget_Win32* owner; HWND hWnd; BOOL isFullscreen; BOOL setPixelFormat; /* If TRUE, then SetPixelFormat() was called on this window */ /* Software rendering support */ HBITMAP softwareImage; HDC softwareDC; void* softwareBackbuffer; size_t softwarePitch; } SST_Window_Win32; /*************************************************************************/ typedef struct WGLFunctions { pf_wglCreateContext CreateContext; pf_wglMakeCurrent MakeCurrent; pf_wglGetProcAddress GetProcAddress; pf_wglDeleteContext DeleteContext; pf_wglShareLists ShareLists; pf_wglGetCurrentContext GetCurrentContext; pf_wglGetCurrentDC GetCurrentDC; /* WGL Extensions */ pf_wglGetExtensionsStringARB GetExtensionsStringARB; pf_wglChoosePixelFormatARB ChoosePixelFormatARB; pf_wglCreateContextAttribsARB CreateContextAttribsARB; pf_wglGetPixelFormatAttribivARB GetPixelFormatAttribivARB; BOOL supportsProfiles; BOOL supportsMultisample; } WGLFunctions; /*************************************************************************/ typedef struct SST_OpenGLContext_Win32 { WGLFunctions wgl; SST_DisplayTarget_Win32* displayTarget; HMODULE opengl32; HGLRC context; HDC hDCActive; HWND hSlaveWnd; /* Slave contexts use a dummy window. Regular (master) GL contexts have this as NULL */ int pixelFormat; short ctxVersion[2]; /* context version major/minor */ BOOL isLegacy; /* Did we use legacy context creation functions? */ BOOL legacyEnabled; /* Did we use legacy OpenGL (< 3.0) context support? */ BOOL debugEnabled; /* Did we use debug OpenGL context support? */ } SST_OpenGLContext_Win32; /*************************************************************************/ DISPLAY_DEVICEA* get_win32devs(size_t* devCountReturn); char* get_adapters(const DISPLAY_DEVICEA* devsFound, size_t devCount, size_t* adapterCountReturn, char** adapterGUIDReturn); /* Filter a list of Win32 devices in-place; modify list so that only relevant Win32 devices are returned. For example, if there are 3 devices: { Gpu0Screen0, Gpu1Screen0, Gpu1Screen1}, and adapterIndex == 1, then this returns { Gpu1Screen0, Gpu1Screen1 } in place. The number of devices in the filtered list are returned (in the example, 2). */ size_t filter_win32devs(DISPLAY_DEVICEA* devsFound, size_t devCount, size_t adapterIndex); ASMapEntry* build_asmap(const DISPLAY_DEVICEA* devsFound, const char* adapterGUIDs, size_t devCount, size_t adapterCount, size_t* screenCount, size_t* mapSizeReturn); SST_VideoMode* get_vmodes(const DISPLAY_DEVICEA* dev, size_t* modeCountReturn, SST_VideoMode* defaultMode); LRESULT WINAPI libsstWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); void resolveWGLSymbols(HMODULE opengl32, WGLFunctions* wgl); void resolveWGLExtSymbols(HDC hDC, WGLFunctions* wgl); void findMonitor(const DISPLAY_DEVICEA* dev, FindMonitorInfo* fmi); /* WGL_ARB_multisample */ #define WGL_SAMPLE_BUFFERS_ARB 0x2041 #define WGL_SAMPLES_ARB 0x2042 /* WGL_ARB_pixel_format */ #define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 #define WGL_DRAW_TO_WINDOW_ARB 0x2001 #define WGL_DRAW_TO_BITMAP_ARB 0x2002 #define WGL_ACCELERATION_ARB 0x2003 #define WGL_NEED_PALETTE_ARB 0x2004 #define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 #define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 #define WGL_SWAP_METHOD_ARB 0x2007 #define WGL_NUMBER_OVERLAYS_ARB 0x2008 #define WGL_NUMBER_UNDERLAYS_ARB 0x2009 #define WGL_TRANSPARENT_ARB 0x200A #define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 #define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 #define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 #define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A #define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B #define WGL_SHARE_DEPTH_ARB 0x200C #define WGL_SHARE_STENCIL_ARB 0x200D #define WGL_SHARE_ACCUM_ARB 0x200E #define WGL_SUPPORT_GDI_ARB 0x200F #define WGL_SUPPORT_OPENGL_ARB 0x2010 #define WGL_DOUBLE_BUFFER_ARB 0x2011 #define WGL_STEREO_ARB 0x2012 #define WGL_PIXEL_TYPE_ARB 0x2013 #define WGL_COLOR_BITS_ARB 0x2014 #define WGL_RED_BITS_ARB 0x2015 #define WGL_RED_SHIFT_ARB 0x2016 #define WGL_GREEN_BITS_ARB 0x2017 #define WGL_GREEN_SHIFT_ARB 0x2018 #define WGL_BLUE_BITS_ARB 0x2019 #define WGL_BLUE_SHIFT_ARB 0x201A #define WGL_ALPHA_BITS_ARB 0x201B #define WGL_ALPHA_SHIFT_ARB 0x201C #define WGL_ACCUM_BITS_ARB 0x201D #define WGL_ACCUM_RED_BITS_ARB 0x201E #define WGL_ACCUM_GREEN_BITS_ARB 0x201F #define WGL_ACCUM_BLUE_BITS_ARB 0x2020 #define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 #define WGL_DEPTH_BITS_ARB 0x2022 #define WGL_STENCIL_BITS_ARB 0x2023 #define WGL_AUX_BUFFERS_ARB 0x2024 #define WGL_NO_ACCELERATION_ARB 0x2025 #define WGL_GENERIC_ACCELERATION_ARB 0x2026 #define WGL_FULL_ACCELERATION_ARB 0x2027 #define WGL_SWAP_EXCHANGE_ARB 0x2028 #define WGL_SWAP_COPY_ARB 0x2029 #define WGL_SWAP_UNDEFINED_ARB 0x202A #define WGL_TYPE_RGBA_ARB 0x202B #define WGL_TYPE_COLORINDEX_ARB 0x202C /* WGL_ARB_create_context */ #define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 #define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 #define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093 #define WGL_CONTEXT_FLAGS_ARB 0x2094 #define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126 #define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001 #define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 #define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 #define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 #define ERROR_INVALID_VERSION_ARB 0x2095 #define ERROR_INVALID_PROFILE_ARB 0x2096 #endif