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