#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
