OLD | NEW |
| (Empty) |
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 DECLARE_HANDLE(HPBUFFER); | |
60 | |
61 class SkWGLExtensions { | |
62 public: | |
63 SkWGLExtensions(); | |
64 /** | |
65 * Determines if an extensions is available for a given DC. | |
66 * WGL_extensions_string is considered a prerequisite for all other | |
67 * extensions. It is necessary to check this before calling other class | |
68 * functions. | |
69 */ | |
70 bool hasExtension(HDC dc, const char* ext) const; | |
71 | |
72 const char* getExtensionsString(HDC hdc) const; | |
73 BOOL choosePixelFormat(HDC hdc, const int*, const FLOAT*, UINT, int*, UINT*)
const; | |
74 BOOL getPixelFormatAttribiv(HDC, int, int, UINT, const int*, int*) const; | |
75 BOOL getPixelFormatAttribfv(HDC hdc, int, int, UINT, const int*, FLOAT*) con
st; | |
76 HGLRC createContextAttribs(HDC, HGLRC, const int *) const; | |
77 | |
78 BOOL swapInterval(int interval) const; | |
79 | |
80 HPBUFFER createPbuffer(HDC, int , int, int, const int*) const; | |
81 HDC getPbufferDC(HPBUFFER) const; | |
82 int releasePbufferDC(HPBUFFER, HDC) const; | |
83 BOOL destroyPbuffer(HPBUFFER) const; | |
84 | |
85 /** | |
86 * WGL doesn't have precise rules for the ordering of formats returned | |
87 * by wglChoosePixelFormat. This function helps choose among the set of | |
88 * formats returned by wglChoosePixelFormat. The rules in decreasing | |
89 * priority are: | |
90 * * Choose formats with the smallest sample count that is >= | |
91 * desiredSampleCount (or the largest sample count if all formats have | |
92 * fewer samples than desiredSampleCount.) | |
93 * * Choose formats with the fewest color samples when coverage sampling | |
94 * is available. | |
95 * * If the above rules leave multiple formats, choose the one that | |
96 * appears first in the formats array parameter. | |
97 */ | |
98 int selectFormat(const int formats[], | |
99 int formatCount, | |
100 HDC dc, | |
101 int desiredSampleCount) const; | |
102 private: | |
103 typedef const char* (WINAPI *GetExtensionsStringProc)(HDC); | |
104 typedef BOOL (WINAPI *ChoosePixelFormatProc)(HDC, const int *, const FLOAT *
, UINT, int *, UINT *); | |
105 typedef BOOL (WINAPI *GetPixelFormatAttribivProc)(HDC, int, int, UINT, const
int*, int*); | |
106 typedef BOOL (WINAPI *GetPixelFormatAttribfvProc)(HDC, int, int, UINT, const
int*, FLOAT*); | |
107 typedef HGLRC (WINAPI *CreateContextAttribsProc)(HDC, HGLRC, const int *); | |
108 typedef BOOL (WINAPI* SwapIntervalProc)(int); | |
109 typedef HPBUFFER (WINAPI* CreatePbufferProc)(HDC, int , int, int, const int*
); | |
110 typedef HDC (WINAPI* GetPbufferDCProc)(HPBUFFER); | |
111 typedef int (WINAPI* ReleasePbufferDCProc)(HPBUFFER, HDC); | |
112 typedef BOOL (WINAPI* DestroyPbufferProc)(HPBUFFER); | |
113 | |
114 GetExtensionsStringProc fGetExtensionsString; | |
115 ChoosePixelFormatProc fChoosePixelFormat; | |
116 GetPixelFormatAttribfvProc fGetPixelFormatAttribfv; | |
117 GetPixelFormatAttribivProc fGetPixelFormatAttribiv; | |
118 CreateContextAttribsProc fCreateContextAttribs; | |
119 SwapIntervalProc fSwapInterval; | |
120 CreatePbufferProc fCreatePbuffer; | |
121 GetPbufferDCProc fGetPbufferDC; | |
122 ReleasePbufferDCProc fReleasePbufferDC; | |
123 DestroyPbufferProc fDestroyPbuffer; | |
124 }; | |
125 | |
126 enum SkWGLContextRequest { | |
127 /** Requests to create core profile context if possible, otherwise | |
128 compatibility profile. */ | |
129 kGLPreferCoreProfile_SkWGLContextRequest, | |
130 /** Requests to create compatibility profile context if possible, otherwise | |
131 core profile. */ | |
132 kGLPreferCompatibilityProfile_SkWGLContextRequest, | |
133 /** Requests to create GL ES profile context. */ | |
134 kGLES_SkWGLContextRequest | |
135 }; | |
136 /** | |
137 * Helper to create an OpenGL context for a DC using WGL. Configs with a sample
count >= to | |
138 * msaaSampleCount are preferred but if none is available then a context with a
lower sample count | |
139 * (including non-MSAA) will be created. If preferCoreProfile is true but a core
profile cannot be | |
140 * created then a compatible profile context will be created. | |
141 */ | |
142 HGLRC SkCreateWGLContext(HDC dc, int msaaSampleCount, SkWGLContextRequest contex
t); | |
143 | |
144 /** | |
145 * Helper class for creating a pbuffer context and deleting all the handles when
finished. This | |
146 * requires that a device context has been created. However, the pbuffer gets it
s own device | |
147 * context. The original device context can be released once the pbuffer context
is created. | |
148 */ | |
149 class SkWGLPbufferContext : public SkRefCnt { | |
150 public: | |
151 static SkWGLPbufferContext* Create(HDC parentDC, int msaaSampleCount, | |
152 SkWGLContextRequest contextType); | |
153 | |
154 virtual ~SkWGLPbufferContext(); | |
155 | |
156 HDC getDC() const { return fDC; } | |
157 HGLRC getGLRC() const { return fGLRC; } | |
158 | |
159 private: | |
160 SkWGLPbufferContext(HPBUFFER pbuffer, HDC dc, HGLRC glrc); | |
161 | |
162 HPBUFFER fPbuffer; | |
163 HDC fDC; | |
164 HGLRC fGLRC; | |
165 SkWGLExtensions fExtensions; | |
166 }; | |
167 | |
168 #endif | |
OLD | NEW |