13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#ifndef _TCUWGL_HPP
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#define _TCUWGL_HPP
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program Tester Core
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * ----------------------------------------
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License.
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License.
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*!
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief WGL Utilities.
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuDefs.hpp"
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluRenderContext.hpp"
283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deDynamicLibrary.h"
293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuWin32API.h"
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include <vector>
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace glu
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyrystruct RenderConfig;
363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace tcu
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
403c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace wgl
413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Library;
443c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Context;
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief WGL pixel format info.
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass PixelFormatInfo
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enum PixelType
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		PIXELTYPE_RGBA = 0,
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		PIXELTYPE_RGBA_FLOAT,
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		PIXELTYPE_RGBA_UNSIGNED_FLOAT,
573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		PIXELTYPE_COLOR_INDEX,
583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		PIXELTYPE_UNKNOWN,
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		PIXELTYPE_LAST
613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enum SurfaceFlags
643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SURFACE_WINDOW	= (1<<0),
663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		SURFACE_PIXMAP	= (1<<1)
673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	enum Acceleration
703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ACCELERATION_NONE = 0,
723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ACCELERATION_GENERIC,
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ACCELERATION_FULL,
743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ACCELERATION_UNKNOWN,
753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		ACCELERATION_LAST
773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int				pixelFormat;
803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// From WGL_ARB_pixel_format
823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	deUint32		surfaceTypes;
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Acceleration	acceleration;
843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	bool			needPalette;
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	bool			needSystemPalette;
863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	bool			swapLayerBuffers;
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	SwapMethod		swapMethod; { EXCHANGE, UNDEFINED }
883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	int				numOverlays;
893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	int				numUnderlays;
903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	bool			transparent;
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	int				transparentRedValue;
923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	int				transparentGreenValue;
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	int				transparentBlueValue;
943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	int				transparentAlphaValue;
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	int				transparentIndexValue;
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	bool			shareDepth;
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	bool			shareStencil;
983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	bool			shareAccum;
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	bool			supportGDI;
1003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool			supportOpenGL;
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	bool			doubleBuffer;
1023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	bool			stereo;
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	PixelType		pixelType;
1043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	int				colorBits;
1063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int				redBits;
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	int				redShift;
1083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int				greenBits;
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	int				greenShift;
1103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int				blueBits;
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	int				blueShift;
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int				alphaBits;
1133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	int				alphaShift;
1143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	int				accumBits;
1163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	int				accumRedBits;
1173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	int				accumGreenBits;
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	int				accumBlueBits;
1193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	int				accumAlphaBits;
1203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int				depthBits;
1223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int				stencilBits;
1233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//	int				numAuxBuffers;
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// From WGL_ARB_multisample
1273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int				sampleBuffers;
1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	int				samples;
1293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// \todo [2013-04-14 pyry] Version bits?
1313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	PixelFormatInfo (void)
1333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		: pixelFormat	(0)
1343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, surfaceTypes	(0)
1353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, acceleration	(ACCELERATION_LAST)
1363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, supportOpenGL	(false)
1373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, doubleBuffer	(false)
1383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, pixelType		(PIXELTYPE_LAST)
1393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, redBits		(0)
1403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, greenBits		(0)
1413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, blueBits		(0)
1423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, alphaBits		(0)
1433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, depthBits		(0)
1443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, stencilBits	(0)
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, sampleBuffers	(0)
1463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		, samples		(0)
1473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
1503c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
1523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief Core WGL API
1533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
1543c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \note Created API objects depend on Core object being live. User is
1553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *		 resposible of keeping Core live as long as there are API objects
1563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *		 (such as GL contexts) live!
1573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
1583c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Core
1593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1603c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
1613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						Core				(HINSTANCE instance);
1623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						~Core				(void);
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	std::vector<int>	getPixelFormats		(HDC deviceCtx) const;
1653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	PixelFormatInfo		getPixelFormatInfo	(HDC deviceCtx, int pixelFormat) const;
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	// Internal
1683c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const Library*		getLibrary			(void) const { return m_library; }
1693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1703c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
1713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						Core				(const Core& other);
1723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Core&				operator=			(const Core& other);
1733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Library*			m_library;
1753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//! Function pointer type.
1783c827367444ee418f129b2c238299f49d3264554Jarkko Poyrytypedef void (__stdcall* FunctionPtr) (void);
1793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*--------------------------------------------------------------------*//*!
1813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief WGL context
1823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
1833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Context is currently made current to current thread in constructor
1843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * and detached in destructor. Thus context should be created in and
1853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * accessed from a single thread.
1863c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
1873c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass Context
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						Context				(const Core* core, HDC deviceCtx, glu::ContextType ctxType, int pixelFormat);
1913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						~Context			(void);
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	FunctionPtr			getGLFunction		(const char* name) const;
1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	void				swapBuffers			(void) const;
1963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	HDC					getDeviceContext	(void) const { return m_deviceCtx;	}
1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	HGLRC				getGLContext		(void) const { return m_context;	}
1993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2003c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
2013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry						Context				(const Context& other);
2023c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	Context&			operator=			(const Context& other);
2033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const Core*			m_core;
2053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	HDC					m_deviceCtx;
2063c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	HGLRC				m_context;
2073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry//! Utility for selecting config. Returns -1 if no matching pixel format was found.
2103c827367444ee418f129b2c238299f49d3264554Jarkko Poyryint		choosePixelFormat	(const Core& wgl, HDC deviceCtx, const glu::RenderConfig& config);
2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // wgl
2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // tcu
2143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#endif // _TCUWGL_HPP
216