1 2 /* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 #include "SkRefCnt.h" 10 11 #ifndef SkWGL_DEFINED 12 #define SkWGL_DEFINED 13 14 /** 15 * Working with WGL extensions can be a pain. Among the reasons is that You must 16 * have a GL context to get the proc addresses, but you want to use the procs to 17 * create a context in the first place. So you have to create a dummy GL ctx to 18 * get the proc addresses. 19 * 20 * This file helps by providing SkCreateWGLInterface(). It returns a struct of 21 * function pointers that it initializes. It also has a helper function to query 22 * for WGL extensions. It handles the fact that wglGetExtensionsString is itself 23 * an extension. 24 */ 25 26 #if !defined(WIN32_LEAN_AND_MEAN) 27 #define WIN32_LEAN_AND_MEAN 28 #define SK_LOCAL_LEAN_AND_MEAN 29 #endif 30 #include <windows.h> 31 #if defined(SK_LOCAL_LEAN_AND_MEAN) 32 #undef WIN32_LEAN_AND_MEAN 33 #undef SK_LOCAL_LEAN_AND_MEAN 34 #endif 35 36 #define SK_WGL_DRAW_TO_WINDOW 0x2001 37 #define SK_WGL_ACCELERATION 0x2003 38 #define SK_WGL_SUPPORT_OPENGL 0x2010 39 #define SK_WGL_DOUBLE_BUFFER 0x2011 40 #define SK_WGL_COLOR_BITS 0x2014 41 #define SK_WGL_ALPHA_BITS 0x201B 42 #define SK_WGL_STENCIL_BITS 0x2023 43 #define SK_WGL_FULL_ACCELERATION 0x2027 44 #define SK_WGL_SAMPLE_BUFFERS 0x2041 45 #define SK_WGL_SAMPLES 0x2042 46 #define SK_WGL_CONTEXT_MAJOR_VERSION 0x2091 47 #define SK_WGL_CONTEXT_MINOR_VERSION 0x2092 48 #define SK_WGL_CONTEXT_LAYER_PLANE 0x2093 49 #define SK_WGL_CONTEXT_FLAGS 0x2094 50 #define SK_WGL_CONTEXT_PROFILE_MASK 0x9126 51 #define SK_WGL_CONTEXT_DEBUG_BIT 0x0001 52 #define SK_WGL_CONTEXT_FORWARD_COMPATIBLE_BIT 0x0002 53 #define SK_WGL_CONTEXT_CORE_PROFILE_BIT 0x00000001 54 #define SK_WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 55 #define SK_WGL_CONTEXT_ES2_PROFILE_BIT 0x00000004 56 #define SK_ERROR_INVALID_VERSION 0x2095 57 #define SK_ERROR_INVALID_PROFILE 0x2096 58 59 class SkWGLExtensions { 60 public: 61 SkWGLExtensions(); 62 /** 63 * Determines if an extensions is available for a given DC. 64 * WGL_extensions_string is considered a prerequisite for all other 65 * extensions. It is necessary to check this before calling other class 66 * functions. 67 */ 68 bool hasExtension(HDC dc, const char* ext) const; 69 70 const char* getExtensionsString(HDC hdc) const; 71 BOOL choosePixelFormat(HDC hdc, const int*, const FLOAT*, UINT, int*, UINT*) const; 72 BOOL getPixelFormatAttribiv(HDC, int, int, UINT, const int*, int*) const; 73 BOOL getPixelFormatAttribfv(HDC hdc, int, int, UINT, const int*, FLOAT*) const; 74 HGLRC createContextAttribs(HDC, HGLRC, const int *) const; 75 76 /** 77 * WGL doesn't have precise rules for the ordering of formats returned 78 * by wglChoosePixelFormat. This function helps choose among the set of 79 * formats returned by wglChoosePixelFormat. The rules in decreasing 80 * priority are: 81 * * Choose formats with the smallest sample count that is >= 82 * desiredSampleCount (or the largest sample count if all formats have 83 * fewer samples than desiredSampleCount.) 84 * * Choose formats with the fewest color samples when coverage sampling 85 * is available. 86 * * If the above rules leave multiple formats, choose the one that 87 * appears first in the formats array parameter. 88 */ 89 int selectFormat(const int formats[], 90 int formatCount, 91 HDC dc, 92 int desiredSampleCount); 93 private: 94 typedef const char* (WINAPI *GetExtensionsStringProc)(HDC hdc); 95 typedef BOOL (WINAPI *ChoosePixelFormatProc)(HDC hdc, const int *, const FLOAT *, UINT, int *, UINT *); 96 typedef BOOL (WINAPI *GetPixelFormatAttribivProc)(HDC, int, int, UINT, const int*, int*); 97 typedef BOOL (WINAPI *GetPixelFormatAttribfvProc)(HDC hdc, int, int, UINT, const int*, FLOAT*); 98 typedef HGLRC (WINAPI *CreateContextAttribsProc)(HDC hDC, HGLRC, const int *); 99 100 GetExtensionsStringProc fGetExtensionsString; 101 ChoosePixelFormatProc fChoosePixelFormat; 102 GetPixelFormatAttribfvProc fGetPixelFormatAttribfv; 103 GetPixelFormatAttribivProc fGetPixelFormatAttribiv; 104 CreateContextAttribsProc fCreateContextAttribs; 105 }; 106 107 /** 108 * Helper to create an OpenGL context for a DC using WGL. Configs with a sample count >= to 109 * msaaSampleCount are preferred but if none is available then a context with a lower sample count 110 * (including non-MSAA) will be created. If preferCoreProfile is true but a core profile cannot be 111 * created then a compatible profile context will be created. 112 */ 113 HGLRC SkCreateWGLContext(HDC dc, int msaaSampleCount, bool preferCoreProfile); 114 115 #endif 116