#ifndef _RRFRAGMENTOPERATIONS_HPP
#define _RRFRAGMENTOPERATIONS_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 implementation for per-fragment operations.
 *
 * \note In this file, a multisample buffer means a tcu::PixelBufferAccess
 *		 (or ConstPixelBufferAccess) where the x coordinate is the sample
 *		 index and the y and z coordinates are the pixel's x and y
 *		 coordinates, respectively. To prevent supplying a buffer in
 *		 a wrong format the buffers are wrapped in rr::MultisamplePixelBufferAccess
 *		 wrapper. FragmentProcessor::render() operates on
 *		 this kind of buffers. The function fromSinglesampleAccess() can be
 *		 used to get a one-sampled multisample access to a normal 2d
 *		 buffer.
 *//*--------------------------------------------------------------------*/

#include "rrDefs.hpp"
#include "tcuVector.hpp"
#include "tcuTexture.hpp"
#include "rrRenderState.hpp"
#include "rrGenericVector.hpp"
#include "rrMultisamplePixelBufferAccess.hpp"

namespace rr
{

struct Fragment
{
	tcu::IVec2			pixelCoord;
	GenericVec4			value;
	GenericVec4			value1;
	deUint32			coverage;
	const float*		sampleDepths;

	Fragment (const tcu::IVec2& pixelCoord_, const GenericVec4& value_, deUint32 coverage_, const float* sampleDepths_)
		: pixelCoord	(pixelCoord_)
		, value			(value_)
		, value1		()
		, coverage		(coverage_)
		, sampleDepths	(sampleDepths_)
	{
	}

	Fragment (const tcu::IVec2& pixelCoord_, const GenericVec4& value_, const GenericVec4& value1_, deUint32 coverage_, const float* sampleDepths_)
		: pixelCoord	(pixelCoord_)
		, value			(value_)
		, value1		(value1_)
		, coverage		(coverage_)
		, sampleDepths	(sampleDepths_)
	{
	}

	Fragment (void)
		: pixelCoord	(0)
		, value			()
		, coverage		(0)
		, sampleDepths	(DE_NULL)
	{
	}
} DE_WARN_UNUSED_TYPE;

// These functions are for clearing only a specific pixel rectangle in a multisample buffer.
// When clearing the entire buffer, tcu::clear, tcu::clearDepth and tcu::clearStencil can be used.
void clearMultisampleColorBuffer		(const tcu::PixelBufferAccess& dst, const tcu::Vec4&	value, const WindowRectangle& rect);
void clearMultisampleColorBuffer		(const tcu::PixelBufferAccess& dst, const tcu::IVec4&	value, const WindowRectangle& rect);
void clearMultisampleColorBuffer		(const tcu::PixelBufferAccess& dst, const tcu::UVec4&	value, const WindowRectangle& rect);
void clearMultisampleDepthBuffer		(const tcu::PixelBufferAccess& dst, float				value, const WindowRectangle& rect);
void clearMultisampleStencilBuffer		(const tcu::PixelBufferAccess& dst, int					value, const WindowRectangle& rect);

/*--------------------------------------------------------------------*//*!
 * \brief Reference fragment renderer.
 *
 * FragmentProcessor.render() draws a given set of fragments. No two
 * fragments given in one render() call should have the same pixel
 * coordinates coordinates, and they must all have the same facing.
 *//*--------------------------------------------------------------------*/
class FragmentProcessor
{
public:
				FragmentProcessor	(void);

	void		render				(const rr::MultisamplePixelBufferAccess&	colorMultisampleBuffer,
									 const rr::MultisamplePixelBufferAccess&	depthMultisampleBuffer,
									 const rr::MultisamplePixelBufferAccess&	stencilMultisampleBuffer,
									 const Fragment*							fragments,
									 int										numFragments,
									 FaceType									fragmentFacing,
									 const FragmentOperationState&				state);

private:
	enum
	{
		SAMPLE_REGISTER_SIZE = 64
	};
	struct SampleData
	{
		bool						isAlive;
		bool						stencilPassed;
		bool						depthPassed;
		tcu::Vec4					clampedBlendSrcColor;
		tcu::Vec4					clampedBlendSrc1Color;
		tcu::Vec4					clampedBlendDstColor;
		tcu::Vec3					blendSrcFactorRGB;
		float						blendSrcFactorA;
		tcu::Vec3					blendDstFactorRGB;
		float						blendDstFactorA;
		tcu::Vec3					blendedRGB;
		float						blendedA;
		tcu::Vector<deInt32,  4>	signedValue;		//!< integer targets
		tcu::Vector<deUint32, 4>	unsignedValue;		//!< unsigned integer targets
	};

	// These functions operate on the values in m_sampleRegister and, in some cases, the buffers.

	void		executeScissorTest				(int fragNdxOffset, int numSamplesPerFragment, const Fragment* inputFragments, const WindowRectangle& scissorRect);
	void		executeStencilCompare			(int fragNdxOffset, int numSamplesPerFragment, const Fragment* inputFragments, const StencilState& stencilState, int numStencilBits, const tcu::ConstPixelBufferAccess& stencilBuffer);
	void		executeStencilSFail				(int fragNdxOffset, int numSamplesPerFragment, const Fragment* inputFragments, const StencilState& stencilState, int numStencilBits, const tcu::PixelBufferAccess& stencilBuffer);
	void		executeDepthBoundsTest			(int fragNdxOffset, int numSamplesPerFragment, const Fragment* inputFragments, const float minDepthBound, const float maxDepthBound, const tcu::ConstPixelBufferAccess& depthBuffer);
	void		executeDepthCompare				(int fragNdxOffset, int numSamplesPerFragment, const Fragment* inputFragments, TestFunc depthFunc, const tcu::ConstPixelBufferAccess& depthBuffer);
	void		executeDepthWrite				(int fragNdxOffset, int numSamplesPerFragment, const Fragment* inputFragments, const tcu::PixelBufferAccess& depthBuffer);
	void		executeStencilDpFailAndPass		(int fragNdxOffset, int numSamplesPerFragment, const Fragment* inputFragments, const StencilState& stencilState, int numStencilBits, const tcu::PixelBufferAccess& stencilBuffer);
	void		executeBlendFactorComputeRGB	(const tcu::Vec4& blendColor, const BlendState& blendRGBState);
	void		executeBlendFactorComputeA		(const tcu::Vec4& blendColor, const BlendState& blendAState);
	void		executeBlend					(const BlendState& blendRGBState, const BlendState& blendAState);
	void		executeAdvancedBlend			(BlendEquationAdvanced equation);

	void		executeColorWrite				(int fragNdxOffset, int numSamplesPerFragment, const Fragment* inputFragments, bool isSRGB, const tcu::PixelBufferAccess& colorBuffer);
	void		executeRGBA8ColorWrite			(int fragNdxOffset, int numSamplesPerFragment, const Fragment* inputFragments, const tcu::PixelBufferAccess& colorBuffer);
	void		executeMaskedColorWrite			(int fragNdxOffset, int numSamplesPerFragment, const Fragment* inputFragments, const tcu::Vec4& colorMaskFactor, const tcu::Vec4& colorMaskNegationFactor, bool isSRGB, const tcu::PixelBufferAccess& colorBuffer);
	void		executeSignedValueWrite			(int fragNdxOffset, int numSamplesPerFragment, const Fragment* inputFragments, const tcu::BVec4& colorMask, const tcu::PixelBufferAccess& colorBuffer);
	void		executeUnsignedValueWrite		(int fragNdxOffset, int numSamplesPerFragment, const Fragment* inputFragments, const tcu::BVec4& colorMask, const tcu::PixelBufferAccess& colorBuffer);

	SampleData	m_sampleRegister[SAMPLE_REGISTER_SIZE];
} DE_WARN_UNUSED_TYPE;

} // rr

#endif // _RRFRAGMENTOPERATIONS_HPP
