#ifndef _GLURENDERCONFIG_HPP
#define _GLURENDERCONFIG_HPP
/*-------------------------------------------------------------------------
 * drawElements Quality Program OpenGL ES Utilities
 * ------------------------------------------------
 *
 * 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 OpenGL rendering configuration.
 *//*--------------------------------------------------------------------*/

#include "tcuDefs.hpp"
#include "gluRenderContext.hpp"

namespace tcu
{
class CommandLine;
}

namespace glu
{

enum ResetNotificationStrategy
{
	RESET_NOTIFICATION_STRATEGY_NOT_SPECIFIED = 0,		//!< Not specified, implementation-dependent
	RESET_NOTIFICATION_STRATEGY_NO_RESET_NOTIFICATION,	//!< No reset notification (may not be supported)
	RESET_NOTIFICATION_STRATEGY_LOSE_CONTEXT_ON_RESET,	//!< Lose context on reset (may not be supported)

	RESET_NOTIFICATION_STRATEGY_LAST
};

/*--------------------------------------------------------------------*//*!
 * \brief Rendering context configuration.
 *//*--------------------------------------------------------------------*/
struct RenderConfig
{
	enum SurfaceType
	{
		SURFACETYPE_DONT_CARE = 0,
		SURFACETYPE_WINDOW,				//!< Native window.
		SURFACETYPE_OFFSCREEN_NATIVE,	//!< Native renderable offscreen buffer, such as pixmap or bitmap.
		SURFACETYPE_OFFSCREEN_GENERIC,	//!< Generic offscreen buffer, such as EGL pbuffer.

		SURFACETYPE_LAST
	};

	enum Visibility
	{
		VISIBILITY_HIDDEN = 0,
		VISIBILITY_VISIBLE,
		VISIBILITY_FULLSCREEN,

		VISIBILITY_LAST
	};

	enum
	{
		DONT_CARE = -1
	};

	ContextType					type;

	int							width;
	int							height;
	SurfaceType					surfaceType;
	Visibility					windowVisibility;

	int							id;

	int							redBits;
	int							greenBits;
	int							blueBits;
	int							alphaBits;
	int							depthBits;
	int							stencilBits;
	int							numSamples;

	ResetNotificationStrategy	resetNotificationStrategy;

	RenderConfig (ContextType type_ = ContextType())
		: type						(type_)
		, width						(DONT_CARE)
		, height					(DONT_CARE)
		, surfaceType				(SURFACETYPE_DONT_CARE)
		, windowVisibility			(VISIBILITY_VISIBLE)
		, id						(DONT_CARE)
		, redBits					(DONT_CARE)
		, greenBits					(DONT_CARE)
		, blueBits					(DONT_CARE)
		, alphaBits					(DONT_CARE)
		, depthBits					(DONT_CARE)
		, stencilBits				(DONT_CARE)
		, numSamples				(DONT_CARE)
		, resetNotificationStrategy	(RESET_NOTIFICATION_STRATEGY_NOT_SPECIFIED)
	{
	}
} DE_WARN_UNUSED_TYPE;

// Utilities

void						parseRenderConfig		(RenderConfig* config, const tcu::CommandLine& cmdLine);
RenderConfig::Visibility	parseWindowVisibility	(const tcu::CommandLine& cmdLine);

template<typename T>
T getValueOrDefault (const RenderConfig& config, const T RenderConfig::*field, T defaultValue)
{
	T value = config.*field;
	return value == (T)RenderConfig::DONT_CARE ? defaultValue : value;
}

} // glu

#endif // _GLURENDERCONFIG_HPP