1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2011 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkWGL_DEFINED 8*c8dee2aaSAndroid Build Coastguard Worker #define SkWGL_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkLeanWindows.h" 12*c8dee2aaSAndroid Build Coastguard Worker 13*c8dee2aaSAndroid Build Coastguard Worker /** 14*c8dee2aaSAndroid Build Coastguard Worker * Working with WGL extensions can be a pain. Among the reasons is that you must 15*c8dee2aaSAndroid Build Coastguard Worker * have a GL context to get the proc addresses, but you want to use the procs to 16*c8dee2aaSAndroid Build Coastguard Worker * create a context in the first place. So you have to create a placeholder GL 17*c8dee2aaSAndroid Build Coastguard Worker * ctx to get the proc addresses. 18*c8dee2aaSAndroid Build Coastguard Worker * 19*c8dee2aaSAndroid Build Coastguard Worker * This file helps by providing SkCreateWGLInterface(). It returns a struct of 20*c8dee2aaSAndroid Build Coastguard Worker * function pointers that it initializes. It also has a helper function to query 21*c8dee2aaSAndroid Build Coastguard Worker * for WGL extensions. It handles the fact that wglGetExtensionsString is itself 22*c8dee2aaSAndroid Build Coastguard Worker * an extension. 23*c8dee2aaSAndroid Build Coastguard Worker */ 24*c8dee2aaSAndroid Build Coastguard Worker 25*c8dee2aaSAndroid Build Coastguard Worker #define SK_WGL_DRAW_TO_WINDOW 0x2001 26*c8dee2aaSAndroid Build Coastguard Worker #define SK_WGL_ACCELERATION 0x2003 27*c8dee2aaSAndroid Build Coastguard Worker #define SK_WGL_SUPPORT_OPENGL 0x2010 28*c8dee2aaSAndroid Build Coastguard Worker #define SK_WGL_DOUBLE_BUFFER 0x2011 29*c8dee2aaSAndroid Build Coastguard Worker #define SK_WGL_COLOR_BITS 0x2014 30*c8dee2aaSAndroid Build Coastguard Worker #define SK_WGL_RED_BITS 0x2015 31*c8dee2aaSAndroid Build Coastguard Worker #define SK_WGL_GREEN_BITS 0x2017 32*c8dee2aaSAndroid Build Coastguard Worker #define SK_WGL_BLUE_BITS 0x2019 33*c8dee2aaSAndroid Build Coastguard Worker #define SK_WGL_ALPHA_BITS 0x201B 34*c8dee2aaSAndroid Build Coastguard Worker #define SK_WGL_STENCIL_BITS 0x2023 35*c8dee2aaSAndroid Build Coastguard Worker #define SK_WGL_FULL_ACCELERATION 0x2027 36*c8dee2aaSAndroid Build Coastguard Worker #define SK_WGL_SAMPLE_BUFFERS 0x2041 37*c8dee2aaSAndroid Build Coastguard Worker #define SK_WGL_SAMPLES 0x2042 38*c8dee2aaSAndroid Build Coastguard Worker #define SK_WGL_CONTEXT_MAJOR_VERSION 0x2091 39*c8dee2aaSAndroid Build Coastguard Worker #define SK_WGL_CONTEXT_MINOR_VERSION 0x2092 40*c8dee2aaSAndroid Build Coastguard Worker #define SK_WGL_CONTEXT_LAYER_PLANE 0x2093 41*c8dee2aaSAndroid Build Coastguard Worker #define SK_WGL_CONTEXT_FLAGS 0x2094 42*c8dee2aaSAndroid Build Coastguard Worker #define SK_WGL_CONTEXT_PROFILE_MASK 0x9126 43*c8dee2aaSAndroid Build Coastguard Worker #define SK_WGL_CONTEXT_DEBUG_BIT 0x0001 44*c8dee2aaSAndroid Build Coastguard Worker #define SK_WGL_CONTEXT_FORWARD_COMPATIBLE_BIT 0x0002 45*c8dee2aaSAndroid Build Coastguard Worker #define SK_WGL_CONTEXT_CORE_PROFILE_BIT 0x00000001 46*c8dee2aaSAndroid Build Coastguard Worker #define SK_WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 47*c8dee2aaSAndroid Build Coastguard Worker #define SK_WGL_CONTEXT_ES2_PROFILE_BIT 0x00000004 48*c8dee2aaSAndroid Build Coastguard Worker #define SK_ERROR_INVALID_VERSION 0x2095 49*c8dee2aaSAndroid Build Coastguard Worker #define SK_ERROR_INVALID_PROFILE 0x2096 50*c8dee2aaSAndroid Build Coastguard Worker 51*c8dee2aaSAndroid Build Coastguard Worker DECLARE_HANDLE(HPBUFFER); 52*c8dee2aaSAndroid Build Coastguard Worker 53*c8dee2aaSAndroid Build Coastguard Worker class SkWGLExtensions { 54*c8dee2aaSAndroid Build Coastguard Worker public: 55*c8dee2aaSAndroid Build Coastguard Worker SkWGLExtensions(); 56*c8dee2aaSAndroid Build Coastguard Worker /** 57*c8dee2aaSAndroid Build Coastguard Worker * Determines if an extensions is available for a given DC. 58*c8dee2aaSAndroid Build Coastguard Worker * WGL_extensions_string is considered a prerequisite for all other 59*c8dee2aaSAndroid Build Coastguard Worker * extensions. It is necessary to check this before calling other class 60*c8dee2aaSAndroid Build Coastguard Worker * functions. 61*c8dee2aaSAndroid Build Coastguard Worker */ 62*c8dee2aaSAndroid Build Coastguard Worker bool hasExtension(HDC dc, const char* ext) const; 63*c8dee2aaSAndroid Build Coastguard Worker 64*c8dee2aaSAndroid Build Coastguard Worker const char* getExtensionsString(HDC hdc) const; 65*c8dee2aaSAndroid Build Coastguard Worker BOOL choosePixelFormat(HDC hdc, const int*, const FLOAT*, UINT, int*, UINT*) const; 66*c8dee2aaSAndroid Build Coastguard Worker BOOL getPixelFormatAttribiv(HDC, int, int, UINT, const int*, int*) const; 67*c8dee2aaSAndroid Build Coastguard Worker BOOL getPixelFormatAttribfv(HDC hdc, int, int, UINT, const int*, FLOAT*) const; 68*c8dee2aaSAndroid Build Coastguard Worker HGLRC createContextAttribs(HDC, HGLRC, const int *) const; 69*c8dee2aaSAndroid Build Coastguard Worker 70*c8dee2aaSAndroid Build Coastguard Worker BOOL swapInterval(int interval) const; 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard Worker HPBUFFER createPbuffer(HDC, int , int, int, const int*) const; 73*c8dee2aaSAndroid Build Coastguard Worker HDC getPbufferDC(HPBUFFER) const; 74*c8dee2aaSAndroid Build Coastguard Worker int releasePbufferDC(HPBUFFER, HDC) const; 75*c8dee2aaSAndroid Build Coastguard Worker BOOL destroyPbuffer(HPBUFFER) const; 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker /** 78*c8dee2aaSAndroid Build Coastguard Worker * WGL doesn't have precise rules for the ordering of formats returned 79*c8dee2aaSAndroid Build Coastguard Worker * by wglChoosePixelFormat. This function helps choose among the set of 80*c8dee2aaSAndroid Build Coastguard Worker * formats returned by wglChoosePixelFormat. The rules in decreasing 81*c8dee2aaSAndroid Build Coastguard Worker * priority are: 82*c8dee2aaSAndroid Build Coastguard Worker * * Choose formats with the smallest sample count that is >= 83*c8dee2aaSAndroid Build Coastguard Worker * desiredSampleCount (or the largest sample count if all formats have 84*c8dee2aaSAndroid Build Coastguard Worker * fewer samples than desiredSampleCount.) If desiredSampleCount is 1 then 85*c8dee2aaSAndroid Build Coastguard Worker * all msaa formats are excluded from consideration. 86*c8dee2aaSAndroid Build Coastguard Worker * * Choose formats with the fewest color samples when coverage sampling 87*c8dee2aaSAndroid Build Coastguard Worker * is available. 88*c8dee2aaSAndroid Build Coastguard Worker * * If the above rules leave multiple formats, choose the one that 89*c8dee2aaSAndroid Build Coastguard Worker * appears first in the formats array parameter. 90*c8dee2aaSAndroid Build Coastguard Worker */ 91*c8dee2aaSAndroid Build Coastguard Worker int selectFormat(const int formats[], 92*c8dee2aaSAndroid Build Coastguard Worker int formatCount, 93*c8dee2aaSAndroid Build Coastguard Worker HDC dc, 94*c8dee2aaSAndroid Build Coastguard Worker int desiredSampleCount) const; 95*c8dee2aaSAndroid Build Coastguard Worker private: 96*c8dee2aaSAndroid Build Coastguard Worker typedef const char* (WINAPI *GetExtensionsStringProc)(HDC); 97*c8dee2aaSAndroid Build Coastguard Worker typedef BOOL (WINAPI *ChoosePixelFormatProc)(HDC, const int *, const FLOAT *, UINT, int *, UINT *); 98*c8dee2aaSAndroid Build Coastguard Worker typedef BOOL (WINAPI *GetPixelFormatAttribivProc)(HDC, int, int, UINT, const int*, int*); 99*c8dee2aaSAndroid Build Coastguard Worker typedef BOOL (WINAPI *GetPixelFormatAttribfvProc)(HDC, int, int, UINT, const int*, FLOAT*); 100*c8dee2aaSAndroid Build Coastguard Worker typedef HGLRC (WINAPI *CreateContextAttribsProc)(HDC, HGLRC, const int *); 101*c8dee2aaSAndroid Build Coastguard Worker typedef BOOL (WINAPI* SwapIntervalProc)(int); 102*c8dee2aaSAndroid Build Coastguard Worker typedef HPBUFFER (WINAPI* CreatePbufferProc)(HDC, int , int, int, const int*); 103*c8dee2aaSAndroid Build Coastguard Worker typedef HDC (WINAPI* GetPbufferDCProc)(HPBUFFER); 104*c8dee2aaSAndroid Build Coastguard Worker typedef int (WINAPI* ReleasePbufferDCProc)(HPBUFFER, HDC); 105*c8dee2aaSAndroid Build Coastguard Worker typedef BOOL (WINAPI* DestroyPbufferProc)(HPBUFFER); 106*c8dee2aaSAndroid Build Coastguard Worker 107*c8dee2aaSAndroid Build Coastguard Worker static GetExtensionsStringProc fGetExtensionsString; 108*c8dee2aaSAndroid Build Coastguard Worker static ChoosePixelFormatProc fChoosePixelFormat; 109*c8dee2aaSAndroid Build Coastguard Worker static GetPixelFormatAttribfvProc fGetPixelFormatAttribfv; 110*c8dee2aaSAndroid Build Coastguard Worker static GetPixelFormatAttribivProc fGetPixelFormatAttribiv; 111*c8dee2aaSAndroid Build Coastguard Worker static CreateContextAttribsProc fCreateContextAttribs; 112*c8dee2aaSAndroid Build Coastguard Worker static SwapIntervalProc fSwapInterval; 113*c8dee2aaSAndroid Build Coastguard Worker static CreatePbufferProc fCreatePbuffer; 114*c8dee2aaSAndroid Build Coastguard Worker static GetPbufferDCProc fGetPbufferDC; 115*c8dee2aaSAndroid Build Coastguard Worker static ReleasePbufferDCProc fReleasePbufferDC; 116*c8dee2aaSAndroid Build Coastguard Worker static DestroyPbufferProc fDestroyPbuffer; 117*c8dee2aaSAndroid Build Coastguard Worker }; 118*c8dee2aaSAndroid Build Coastguard Worker 119*c8dee2aaSAndroid Build Coastguard Worker enum SkWGLContextRequest { 120*c8dee2aaSAndroid Build Coastguard Worker /** Requests to create core profile context if possible, otherwise 121*c8dee2aaSAndroid Build Coastguard Worker compatibility profile. */ 122*c8dee2aaSAndroid Build Coastguard Worker kGLPreferCoreProfile_SkWGLContextRequest, 123*c8dee2aaSAndroid Build Coastguard Worker /** Requests to create compatibility profile context if possible, otherwise 124*c8dee2aaSAndroid Build Coastguard Worker core profile. */ 125*c8dee2aaSAndroid Build Coastguard Worker kGLPreferCompatibilityProfile_SkWGLContextRequest, 126*c8dee2aaSAndroid Build Coastguard Worker /** Requests to create GL ES profile context. */ 127*c8dee2aaSAndroid Build Coastguard Worker kGLES_SkWGLContextRequest 128*c8dee2aaSAndroid Build Coastguard Worker }; 129*c8dee2aaSAndroid Build Coastguard Worker /** 130*c8dee2aaSAndroid Build Coastguard Worker * Helper to create an OpenGL context for a DC using WGL. Configs with a sample count >= to 131*c8dee2aaSAndroid Build Coastguard Worker * msaaSampleCount are preferred but if none is available then a context with a lower sample count 132*c8dee2aaSAndroid Build Coastguard Worker * (including non-MSAA) will be created. If msaaSampleCount is 1 then this will fail if a non-msaa 133*c8dee2aaSAndroid Build Coastguard Worker * context cannot be created. If preferCoreProfile is true but a core profile cannot be created 134*c8dee2aaSAndroid Build Coastguard Worker * then a compatible profile context will be created. 135*c8dee2aaSAndroid Build Coastguard Worker */ 136*c8dee2aaSAndroid Build Coastguard Worker HGLRC SkCreateWGLContext(HDC dc, int msaaSampleCount, bool deepColor, SkWGLContextRequest context, 137*c8dee2aaSAndroid Build Coastguard Worker HGLRC shareContext = nullptr); 138*c8dee2aaSAndroid Build Coastguard Worker 139*c8dee2aaSAndroid Build Coastguard Worker /** 140*c8dee2aaSAndroid Build Coastguard Worker * Helper class for creating a pbuffer context and deleting all the handles when finished. This 141*c8dee2aaSAndroid Build Coastguard Worker * requires that a device context has been created. However, the pbuffer gets its own device 142*c8dee2aaSAndroid Build Coastguard Worker * context. The original device context can be released once the pbuffer context is created. 143*c8dee2aaSAndroid Build Coastguard Worker */ 144*c8dee2aaSAndroid Build Coastguard Worker class SkWGLPbufferContext : public SkRefCnt { 145*c8dee2aaSAndroid Build Coastguard Worker public: 146*c8dee2aaSAndroid Build Coastguard Worker static sk_sp<SkWGLPbufferContext> Create(HDC parentDC, SkWGLContextRequest contextType, 147*c8dee2aaSAndroid Build Coastguard Worker HGLRC shareContext); 148*c8dee2aaSAndroid Build Coastguard Worker 149*c8dee2aaSAndroid Build Coastguard Worker ~SkWGLPbufferContext() override; 150*c8dee2aaSAndroid Build Coastguard Worker getDC()151*c8dee2aaSAndroid Build Coastguard Worker HDC getDC() const { return fDC; } getGLRC()152*c8dee2aaSAndroid Build Coastguard Worker HGLRC getGLRC() const { return fGLRC; } 153*c8dee2aaSAndroid Build Coastguard Worker 154*c8dee2aaSAndroid Build Coastguard Worker private: 155*c8dee2aaSAndroid Build Coastguard Worker SkWGLPbufferContext(HPBUFFER pbuffer, HDC dc, HGLRC glrc); 156*c8dee2aaSAndroid Build Coastguard Worker 157*c8dee2aaSAndroid Build Coastguard Worker HPBUFFER fPbuffer; 158*c8dee2aaSAndroid Build Coastguard Worker HDC fDC; 159*c8dee2aaSAndroid Build Coastguard Worker HGLRC fGLRC; 160*c8dee2aaSAndroid Build Coastguard Worker SkWGLExtensions fExtensions; 161*c8dee2aaSAndroid Build Coastguard Worker }; 162*c8dee2aaSAndroid Build Coastguard Worker 163*c8dee2aaSAndroid Build Coastguard Worker #endif 164