#ifndef _TCUWGL_HPP
#define _TCUWGL_HPP
/*-------------------------------------------------------------------------
 * drawElements Quality Program Tester Core
 * ----------------------------------------
 *
 * Copyright 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *//*!
 * \file
 * \brief WGL Utilities.
 *//*--------------------------------------------------------------------*/

#include "tcuDefs.hpp"
#include "gluRenderConfig.hpp"
#include "gluRenderContext.hpp"
#include "deDynamicLibrary.h"
#include "tcuWin32API.h"

#include <vector>

namespace glu
{
struct RenderConfig;
}

namespace tcu
{
namespace wgl
{

class Library;
class Context;

/*--------------------------------------------------------------------*//*!
 * \brief WGL pixel format info.
 *//*--------------------------------------------------------------------*/
class PixelFormatInfo
{
public:
	enum PixelType
	{
		PIXELTYPE_RGBA = 0,
		PIXELTYPE_RGBA_FLOAT,
		PIXELTYPE_RGBA_UNSIGNED_FLOAT,
		PIXELTYPE_COLOR_INDEX,
		PIXELTYPE_UNKNOWN,

		PIXELTYPE_LAST
	};

	enum SurfaceFlags
	{
		SURFACE_WINDOW	= (1<<0),
		SURFACE_PIXMAP	= (1<<1)
	};

	enum Acceleration
	{
		ACCELERATION_NONE = 0,
		ACCELERATION_GENERIC,
		ACCELERATION_FULL,
		ACCELERATION_UNKNOWN,

		ACCELERATION_LAST
	};

	int				pixelFormat;

	// From WGL_ARB_pixel_format
	deUint32		surfaceTypes;
	Acceleration	acceleration;
	bool			needPalette;
	bool			needSystemPalette;
//	bool			swapLayerBuffers;
//	SwapMethod		swapMethod; { EXCHANGE, UNDEFINED }
	int				numOverlays;
	int				numUnderlays;
//	bool			transparent;
//	int				transparentRedValue;
//	int				transparentGreenValue;
//	int				transparentBlueValue;
//	int				transparentAlphaValue;
//	int				transparentIndexValue;
//	bool			shareDepth;
//	bool			shareStencil;
//	bool			shareAccum;
//	bool			supportGDI;
	bool			supportOpenGL;
	bool			doubleBuffer;
	bool			stereo;
	PixelType		pixelType;

//	int				colorBits;
	int				redBits;
//	int				redShift;
	int				greenBits;
//	int				greenShift;
	int				blueBits;
//	int				blueShift;
	int				alphaBits;
//	int				alphaShift;

	int				accumBits;
//	int				accumRedBits;
//	int				accumGreenBits;
//	int				accumBlueBits;
//	int				accumAlphaBits;

	int				depthBits;
	int				stencilBits;

	int				numAuxBuffers;

	// From WGL_ARB_multisample
	int				sampleBuffers;
	int				samples;

	// \todo [2013-04-14 pyry] Version bits?

	PixelFormatInfo (void)
		: pixelFormat		(0)
		, surfaceTypes		(0)
		, acceleration		(ACCELERATION_LAST)
		, needPalette		(false)
		, needSystemPalette	(false)
		, numOverlays		(0)
		, numUnderlays		(0)
		, supportOpenGL		(false)
		, doubleBuffer		(false)
		, stereo			(false)
		, pixelType			(PIXELTYPE_LAST)
		, redBits			(0)
		, greenBits			(0)
		, blueBits			(0)
		, alphaBits			(0)
		, accumBits			(0)
		, depthBits			(0)
		, stencilBits		(0)
		, numAuxBuffers		(0)
		, sampleBuffers		(0)
		, samples			(0)
	{
	}
};

/*--------------------------------------------------------------------*//*!
 * \brief Core WGL API
 *
 * \note Created API objects depend on Core object being live. User is
 *		 resposible of keeping Core live as long as there are API objects
 *		 (such as GL contexts) live!
 *//*--------------------------------------------------------------------*/
class Core
{
public:
						Core				(HINSTANCE instance);
						~Core				(void);

	std::vector<int>	getPixelFormats		(HDC deviceCtx) const;
	PixelFormatInfo		getPixelFormatInfo	(HDC deviceCtx, int pixelFormat) const;

	// Internal
	const Library*		getLibrary			(void) const { return m_library; }

private:
						Core				(const Core& other);
	Core&				operator=			(const Core& other);

	Library*			m_library;
};

//! Function pointer type.
typedef void (__stdcall* FunctionPtr) (void);

/*--------------------------------------------------------------------*//*!
 * \brief WGL context
 *
 * Context is currently made current to current thread in constructor
 * and detached in destructor. Thus context should be created in and
 * accessed from a single thread.
 *//*--------------------------------------------------------------------*/
class Context
{
public:
						Context				(const Core*					core,
											 HDC							deviceCtx,
											 const Context*					sharedContext,
											 glu::ContextType				ctxType,
											 int							pixelFormat,
											 glu::ResetNotificationStrategy	resetNotificationStrategy);
						~Context			(void);

	FunctionPtr			getGLFunction		(const char* name) const;

	void				makeCurrent			(void);
	void				swapBuffers			(void) const;

	HDC					getDeviceContext	(void) const { return m_deviceCtx;	}
	HGLRC				getGLContext		(void) const { return m_context;	}

private:
						Context				(const Context& other);
	Context&			operator=			(const Context& other);

	const Core*			m_core;
	HDC					m_deviceCtx;
	HGLRC				m_context;
};

//! Utility for selecting config. Returns -1 if no matching pixel format was found.
int		choosePixelFormat	(const Core& wgl, HDC deviceCtx, const glu::RenderConfig& config);

//! Is pixel format in general supported by dEQP tests?
bool	isSupportedByTests	(const PixelFormatInfo& pixelFormatInfo);

} // wgl
} // tcu

#endif // _TCUWGL_HPP
