• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef _TCUWGL_HPP
2 #define _TCUWGL_HPP
3 /*-------------------------------------------------------------------------
4  * drawElements Quality Program Tester Core
5  * ----------------------------------------
6  *
7  * Copyright 2014 The Android Open Source Project
8  *
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  *
21  *//*!
22  * \file
23  * \brief WGL Utilities.
24  *//*--------------------------------------------------------------------*/
25 
26 #include "tcuDefs.hpp"
27 #include "gluRenderContext.hpp"
28 #include "deDynamicLibrary.h"
29 #include "tcuWin32API.h"
30 
31 #include <vector>
32 
33 namespace glu
34 {
35 struct RenderConfig;
36 }
37 
38 namespace tcu
39 {
40 namespace wgl
41 {
42 
43 class Library;
44 class Context;
45 
46 /*--------------------------------------------------------------------*//*!
47  * \brief WGL pixel format info.
48  *//*--------------------------------------------------------------------*/
49 class PixelFormatInfo
50 {
51 public:
52 	enum PixelType
53 	{
54 		PIXELTYPE_RGBA = 0,
55 		PIXELTYPE_RGBA_FLOAT,
56 		PIXELTYPE_RGBA_UNSIGNED_FLOAT,
57 		PIXELTYPE_COLOR_INDEX,
58 		PIXELTYPE_UNKNOWN,
59 
60 		PIXELTYPE_LAST
61 	};
62 
63 	enum SurfaceFlags
64 	{
65 		SURFACE_WINDOW	= (1<<0),
66 		SURFACE_PIXMAP	= (1<<1)
67 	};
68 
69 	enum Acceleration
70 	{
71 		ACCELERATION_NONE = 0,
72 		ACCELERATION_GENERIC,
73 		ACCELERATION_FULL,
74 		ACCELERATION_UNKNOWN,
75 
76 		ACCELERATION_LAST
77 	};
78 
79 	int				pixelFormat;
80 
81 	// From WGL_ARB_pixel_format
82 	deUint32		surfaceTypes;
83 	Acceleration	acceleration;
84 //	bool			needPalette;
85 //	bool			needSystemPalette;
86 //	bool			swapLayerBuffers;
87 //	SwapMethod		swapMethod; { EXCHANGE, UNDEFINED }
88 //	int				numOverlays;
89 //	int				numUnderlays;
90 //	bool			transparent;
91 //	int				transparentRedValue;
92 //	int				transparentGreenValue;
93 //	int				transparentBlueValue;
94 //	int				transparentAlphaValue;
95 //	int				transparentIndexValue;
96 //	bool			shareDepth;
97 //	bool			shareStencil;
98 //	bool			shareAccum;
99 //	bool			supportGDI;
100 	bool			supportOpenGL;
101 	bool			doubleBuffer;
102 //	bool			stereo;
103 	PixelType		pixelType;
104 
105 //	int				colorBits;
106 	int				redBits;
107 //	int				redShift;
108 	int				greenBits;
109 //	int				greenShift;
110 	int				blueBits;
111 //	int				blueShift;
112 	int				alphaBits;
113 //	int				alphaShift;
114 
115 //	int				accumBits;
116 //	int				accumRedBits;
117 //	int				accumGreenBits;
118 //	int				accumBlueBits;
119 //	int				accumAlphaBits;
120 
121 	int				depthBits;
122 	int				stencilBits;
123 
124 //	int				numAuxBuffers;
125 
126 	// From WGL_ARB_multisample
127 	int				sampleBuffers;
128 	int				samples;
129 
130 	// \todo [2013-04-14 pyry] Version bits?
131 
PixelFormatInfo(void)132 	PixelFormatInfo (void)
133 		: pixelFormat	(0)
134 		, surfaceTypes	(0)
135 		, acceleration	(ACCELERATION_LAST)
136 		, supportOpenGL	(false)
137 		, doubleBuffer	(false)
138 		, pixelType		(PIXELTYPE_LAST)
139 		, redBits		(0)
140 		, greenBits		(0)
141 		, blueBits		(0)
142 		, alphaBits		(0)
143 		, depthBits		(0)
144 		, stencilBits	(0)
145 		, sampleBuffers	(0)
146 		, samples		(0)
147 	{
148 	}
149 };
150 
151 /*--------------------------------------------------------------------*//*!
152  * \brief Core WGL API
153  *
154  * \note Created API objects depend on Core object being live. User is
155  *		 resposible of keeping Core live as long as there are API objects
156  *		 (such as GL contexts) live!
157  *//*--------------------------------------------------------------------*/
158 class Core
159 {
160 public:
161 						Core				(HINSTANCE instance);
162 						~Core				(void);
163 
164 	std::vector<int>	getPixelFormats		(HDC deviceCtx) const;
165 	PixelFormatInfo		getPixelFormatInfo	(HDC deviceCtx, int pixelFormat) const;
166 
167 	// Internal
getLibrary(void) const168 	const Library*		getLibrary			(void) const { return m_library; }
169 
170 private:
171 						Core				(const Core& other);
172 	Core&				operator=			(const Core& other);
173 
174 	Library*			m_library;
175 };
176 
177 //! Function pointer type.
178 typedef void (__stdcall* FunctionPtr) (void);
179 
180 /*--------------------------------------------------------------------*//*!
181  * \brief WGL context
182  *
183  * Context is currently made current to current thread in constructor
184  * and detached in destructor. Thus context should be created in and
185  * accessed from a single thread.
186  *//*--------------------------------------------------------------------*/
187 class Context
188 {
189 public:
190 						Context				(const Core* core, HDC deviceCtx, glu::ContextType ctxType, int pixelFormat);
191 						~Context			(void);
192 
193 	FunctionPtr			getGLFunction		(const char* name) const;
194 
195 	void				swapBuffers			(void) const;
196 
getDeviceContext(void) const197 	HDC					getDeviceContext	(void) const { return m_deviceCtx;	}
getGLContext(void) const198 	HGLRC				getGLContext		(void) const { return m_context;	}
199 
200 private:
201 						Context				(const Context& other);
202 	Context&			operator=			(const Context& other);
203 
204 	const Core*			m_core;
205 	HDC					m_deviceCtx;
206 	HGLRC				m_context;
207 };
208 
209 //! Utility for selecting config. Returns -1 if no matching pixel format was found.
210 int		choosePixelFormat	(const Core& wgl, HDC deviceCtx, const glu::RenderConfig& config);
211 
212 } // wgl
213 } // tcu
214 
215 #endif // _TCUWGL_HPP
216