#ifndef _RRRENDERSTATE_HPP
#define _RRRENDERSTATE_HPP
/*-------------------------------------------------------------------------
 * drawElements Quality Program Reference Renderer
 * -----------------------------------------------
 *
 * 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 Reference renderer render state.
 *//*--------------------------------------------------------------------*/

#include "rrDefs.hpp"
#include "rrMultisamplePixelBufferAccess.hpp"
#include "tcuTexture.hpp"

namespace rr
{

//! Horizontal fill rule
enum HorizontalFill
{
	FILL_LEFT,
	FILL_RIGHT
};

//! Vertical fill rule
enum VerticalFill
{
	FILL_TOP,
	FILL_BOTTOM,
};

//! Winding mode
enum Winding
{
	WINDING_CCW = 0,	//!< Counter-clockwise winding
	WINDING_CW,			//!< Clockwise winding

	WINDING_LAST
};

//! Triangle cull mode
enum CullMode
{
	CULLMODE_NONE,
	CULLMODE_BACK,
	CULLMODE_FRONT,

	CULLMODE_LAST
};

//! Viewport Orientation of renderer this will be compared against
enum ViewportOrientation
{
	VIEWPORTORIENTATION_LOWER_LEFT = 0,	//<! Corresponds to GL
	VIEWPORTORIENTATION_UPPER_LEFT,		//<! Corresponds to Vulkan

	VIEWPORTORIENTATION_LAST
};

struct RasterizationState
{
	RasterizationState (void)
		: winding				(WINDING_CCW)
		, horizontalFill		(FILL_LEFT)
		, verticalFill			(FILL_BOTTOM)
		, viewportOrientation	(VIEWPORTORIENTATION_LAST)
	{
	}

	Winding					winding;
	HorizontalFill			horizontalFill;
	VerticalFill			verticalFill;
	ViewportOrientation		viewportOrientation;
};

enum TestFunc
{
	TESTFUNC_NEVER = 0,
	TESTFUNC_ALWAYS,
	TESTFUNC_LESS,
	TESTFUNC_LEQUAL,
	TESTFUNC_GREATER,
	TESTFUNC_GEQUAL,
	TESTFUNC_EQUAL,
	TESTFUNC_NOTEQUAL,

	TESTFUNC_LAST
};

enum StencilOp
{
	STENCILOP_KEEP = 0,
	STENCILOP_ZERO,
	STENCILOP_REPLACE,
	STENCILOP_INCR, //!< Increment with saturation.
	STENCILOP_DECR, //!< Decrement with saturation.
	STENCILOP_INCR_WRAP,
	STENCILOP_DECR_WRAP,
	STENCILOP_INVERT,

	STENCILOP_LAST
};

enum BlendMode
{
	BLENDMODE_NONE = 0,		//!< No blending.
	BLENDMODE_STANDARD,		//!< Standard blending.
	BLENDMODE_ADVANCED,		//!< Advanced blending mode, as defined in GL_KHR_blend_equation_advanced.

	BLENDMODE_LAST
};

enum BlendEquation
{
	BLENDEQUATION_ADD = 0,
	BLENDEQUATION_SUBTRACT,
	BLENDEQUATION_REVERSE_SUBTRACT,
	BLENDEQUATION_MIN,
	BLENDEQUATION_MAX,

	BLENDEQUATION_LAST
};

enum BlendEquationAdvanced
{
	BLENDEQUATION_ADVANCED_MULTIPLY = 0,
	BLENDEQUATION_ADVANCED_SCREEN,
	BLENDEQUATION_ADVANCED_OVERLAY,
	BLENDEQUATION_ADVANCED_DARKEN,
	BLENDEQUATION_ADVANCED_LIGHTEN,
	BLENDEQUATION_ADVANCED_COLORDODGE,
	BLENDEQUATION_ADVANCED_COLORBURN,
	BLENDEQUATION_ADVANCED_HARDLIGHT,
	BLENDEQUATION_ADVANCED_SOFTLIGHT,
	BLENDEQUATION_ADVANCED_DIFFERENCE,
	BLENDEQUATION_ADVANCED_EXCLUSION,
	BLENDEQUATION_ADVANCED_HSL_HUE,
	BLENDEQUATION_ADVANCED_HSL_SATURATION,
	BLENDEQUATION_ADVANCED_HSL_COLOR,
	BLENDEQUATION_ADVANCED_HSL_LUMINOSITY,

	BLENDEQUATION_ADVANCED_LAST
};

enum BlendFunc
{
	BLENDFUNC_ZERO = 0,
	BLENDFUNC_ONE,
	BLENDFUNC_SRC_COLOR,
	BLENDFUNC_ONE_MINUS_SRC_COLOR,
	BLENDFUNC_DST_COLOR,
	BLENDFUNC_ONE_MINUS_DST_COLOR,
	BLENDFUNC_SRC_ALPHA,
	BLENDFUNC_ONE_MINUS_SRC_ALPHA,
	BLENDFUNC_DST_ALPHA,
	BLENDFUNC_ONE_MINUS_DST_ALPHA,
	BLENDFUNC_CONSTANT_COLOR,
	BLENDFUNC_ONE_MINUS_CONSTANT_COLOR,
	BLENDFUNC_CONSTANT_ALPHA,
	BLENDFUNC_ONE_MINUS_CONSTANT_ALPHA,
	BLENDFUNC_SRC_ALPHA_SATURATE,
	BLENDFUNC_SRC1_COLOR,
	BLENDFUNC_ONE_MINUS_SRC1_COLOR,
	BLENDFUNC_SRC1_ALPHA,
	BLENDFUNC_ONE_MINUS_SRC1_ALPHA,

	BLENDFUNC_LAST
};

struct StencilState
{
	TestFunc	func;
	int			ref;
	deUint32	compMask;
	StencilOp	sFail;
	StencilOp	dpFail;
	StencilOp	dpPass;
	deUint32	writeMask;

	StencilState (void)
		: func		(TESTFUNC_ALWAYS)
		, ref		(0)
		, compMask	(~0U)
		, sFail		(STENCILOP_KEEP)
		, dpFail	(STENCILOP_KEEP)
		, dpPass	(STENCILOP_KEEP)
		, writeMask	(~0U)
	{
	}
};

struct BlendState
{
	BlendEquation	equation;
	BlendFunc		srcFunc;
	BlendFunc		dstFunc;

	BlendState (void)
		: equation	(BLENDEQUATION_ADD)
		, srcFunc	(BLENDFUNC_ONE)
		, dstFunc	(BLENDFUNC_ZERO)
	{
	}
};

struct WindowRectangle
{
	int left;
	int bottom;
	int width;
	int height;

	WindowRectangle (int left_, int bottom_, int width_, int height_)
		: left		(left_)
		, bottom	(bottom_)
		, width		(width_)
		, height	(height_)
	{
	}
};

struct FragmentOperationState
{
	// Variables corresponding to GL state variables.

	bool						scissorTestEnabled;
	WindowRectangle				scissorRectangle;

	bool						stencilTestEnabled;
	StencilState				stencilStates[2];	//!< Indexed with FACETYPE_FRONT and FACETYPE_BACK.

	bool						depthTestEnabled;
	TestFunc					depthFunc;
	bool						depthMask;

	BlendMode					blendMode;

	// Standard blending state
	BlendState					blendRGBState;
	BlendState					blendAState;
	tcu::Vec4					blendColor;			//!< Components should be in range [0, 1].

	BlendEquationAdvanced		blendEquationAdvaced;

	bool						sRGBEnabled;

	bool						depthClampEnabled;

	bool						polygonOffsetEnabled;
	float						polygonOffsetFactor;
	float						polygonOffsetUnits;

	tcu::BVec4					colorMask;

	// Variables not corresponding to configurable GL state, but other GL variables.

	int							numStencilBits;

	FragmentOperationState (void)
		: scissorTestEnabled	(false)
		, scissorRectangle		(0, 0, 1, 1)

		, stencilTestEnabled	(false)
		// \note stencilStates[] members get default-constructed.

		, depthTestEnabled		(false)
		, depthFunc				(TESTFUNC_LESS)
		, depthMask				(true)

		, blendMode				(BLENDMODE_NONE)
		, blendRGBState			()
		, blendAState			()
		, blendColor			(0.0f)
		, blendEquationAdvaced	(BLENDEQUATION_ADVANCED_LAST)

		, sRGBEnabled			(true)

		, depthClampEnabled		(false)

		, polygonOffsetEnabled	(false)
		, polygonOffsetFactor	(0.0f)
		, polygonOffsetUnits	(0.0f)

		, colorMask				(true)

		, numStencilBits		(8)
	{
	}
};

struct PointState
{
	float	pointSize;

	PointState (void)
		: pointSize(1.0f)
	{
	}
};

struct LineState
{
	float	lineWidth;

	LineState (void)
		: lineWidth(1.0f)
	{
	}
};


struct ViewportState
{
	WindowRectangle	rect;
	float			zn;
	float			zf;

	explicit ViewportState (const WindowRectangle& rect_)
		: rect	(rect_)
		, zn	(0.0f)
		, zf	(1.0f)
	{
	}

	explicit ViewportState (const rr::MultisampleConstPixelBufferAccess& multisampleBuffer)
		: rect	(0, 0, multisampleBuffer.raw().getHeight(), multisampleBuffer.raw().getDepth())
		, zn	(0.0f)
		, zf	(1.0f)
	{
	}
};

struct RestartState
{
	bool		enabled;
	deUint32	restartIndex;

	RestartState (void)
		: enabled		(false)
		, restartIndex	(0xFFFFFFFFul)
	{
	}
};

struct RenderState
{
	explicit RenderState (const ViewportState& viewport_, ViewportOrientation viewportOrientation_ = VIEWPORTORIENTATION_LOWER_LEFT)
		: cullMode					(CULLMODE_NONE)
		, provokingVertexConvention	(PROVOKINGVERTEX_LAST)
		, viewport					(viewport_)
		, viewportOrientation		(viewportOrientation_)
	{
		rasterization.viewportOrientation = viewportOrientation;
	}

	CullMode					cullMode;
	ProvokingVertex				provokingVertexConvention;
	RasterizationState			rasterization;
	FragmentOperationState		fragOps;
	PointState					point;
	ViewportState				viewport;
	LineState					line;
	RestartState				restart;
	ViewportOrientation			viewportOrientation;
};

} // rr

#endif // _RRRENDERSTATE_HPP
