/*-------------------------------------------------------------------------
 * drawElements Quality Program OpenGL ES 3.0 Module
 * -------------------------------------------------
 *
 * 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 Screen clearing test.
 *//*--------------------------------------------------------------------*/

#include "es3fColorClearTest.hpp"
#include "tcuRGBA.hpp"
#include "tcuSurface.hpp"
#include "tcuTestLog.hpp"
#include "gluRenderContext.hpp"
#include "gluPixelTransfer.hpp"
#include "tcuVector.hpp"
#include "tcuRenderTarget.hpp"
#include "deRandom.hpp"
#include "deInt32.h"

#include "glwFunctions.hpp"
#include "glwEnums.hpp"

#include <vector>

using tcu::RGBA;
using tcu::Surface;
using tcu::TestLog;

using namespace std;

namespace deqp
{
namespace gles3
{
namespace Functional
{

class ColorClearCase : public TestCase
{
public:
	ColorClearCase(Context& context, const char* name, int numIters, int numClearsMin, int numClearsMax, bool testAlpha, bool testScissoring, bool testColorMasks, bool firstClearFull)
		: TestCase			(context, name, name)
		, m_numIters		(numIters)
		, m_numClearsMin	(numClearsMin)
		, m_numClearsMax	(numClearsMax)
		, m_testAlpha		(testAlpha)
		, m_testScissoring	(testScissoring)
		, m_testColorMasks	(testColorMasks)
		, m_firstClearFull	(firstClearFull)
	{
		m_curIter = 0;
	}

	virtual ~ColorClearCase (void)
	{
	}

	virtual IterateResult iterate (void);

private:
	const int		m_numIters;
	const int		m_numClearsMin;
	const int		m_numClearsMax;
	const bool		m_testAlpha;
	const bool		m_testScissoring;
	const bool		m_testColorMasks;
	const bool		m_firstClearFull;

	int				m_curIter;
};

class ClearInfo
{
public:
	ClearInfo (const tcu::IVec4& rect, deUint8 colorMask, tcu::RGBA color)
		: m_rect(rect), m_colorMask(colorMask), m_color(color)
	{
	}

	tcu::IVec4		m_rect;
	deUint8			m_colorMask;
	tcu::RGBA		m_color;
};

TestCase::IterateResult ColorClearCase::iterate (void)
{
	TestLog&					log						= m_testCtx.getLog();
	const glw::Functions&		gl						= m_context.getRenderContext().getFunctions();
	const tcu::RenderTarget&	renderTarget			= m_context.getRenderTarget();
	const tcu::PixelFormat&		pixelFormat				= renderTarget.getPixelFormat();
	const int					targetWidth				= renderTarget.getWidth();
	const int					targetHeight			= renderTarget.getHeight();
	const int					numPixels				= targetWidth * targetHeight;

	de::Random					rnd						(deInt32Hash(m_curIter));
	vector<deUint8>				pixelKnownChannelMask	(numPixels, 0);
	Surface						refImage				(targetWidth, targetHeight);
	Surface						resImage				(targetWidth, targetHeight);
	Surface						diffImage				(targetWidth, targetHeight);
	int							numClears				= rnd.getUint32() % (m_numClearsMax + 1 - m_numClearsMin) + m_numClearsMin;
	std::vector<ClearInfo>		clearOps;

	if (m_testScissoring)
		gl.enable(GL_SCISSOR_TEST);

	for (int clearNdx = 0; clearNdx < numClears; clearNdx++)
	{
		// Rectangle.
		int clearX;
		int clearY;
		int clearWidth;
		int clearHeight;
		if (!m_testScissoring || (clearNdx == 0 && m_firstClearFull))
		{
			clearX		= 0;
			clearY		= 0;
			clearWidth	= targetWidth;
			clearHeight	= targetHeight;
		}
		else
		{
			clearX		= (rnd.getUint32() % (2*targetWidth)) - targetWidth;
			clearY		= (rnd.getUint32() % (2*targetHeight)) - targetHeight;
			clearWidth	= (rnd.getUint32() % targetWidth);
			clearHeight	= (rnd.getUint32() % targetHeight);
		}
		gl.scissor(clearX, clearY, clearWidth, clearHeight);

		// Color.
		int		r = (int)(rnd.getUint32() & 0xFF);
		int		g = (int)(rnd.getUint32() & 0xFF);
		int		b = (int)(rnd.getUint32() & 0xFF);
		int		a = m_testAlpha ? (int)(rnd.getUint32() & 0xFF) : 0xFF;
		RGBA	clearCol(r, g, b, a);
		gl.clearColor(r/255.0f, g/255.0f, b/255.0f, a/255.0f);

		// Mask.
		deUint8	clearMask;
		if (!m_testColorMasks || (clearNdx == 0 && m_firstClearFull))
			clearMask = 0xF;
		else
			clearMask = (rnd.getUint32() & 0xF);
		gl.colorMask((clearMask&0x1) != 0, (clearMask&0x2) != 0, (clearMask&0x4) != 0, (clearMask&0x8) != 0);

		// Clear & store op.
		gl.clear(GL_COLOR_BUFFER_BIT);
		clearOps.push_back(ClearInfo(tcu::IVec4(clearX, clearY, clearWidth, clearHeight), clearMask, clearCol));

		// Let watchdog know we're alive.
		m_testCtx.touchWatchdog();
	}

	// Compute reference image.
	{
		for (int y = 0; y < targetHeight; y++)
		{
			std::vector<ClearInfo>	scanlineClearOps;

			// Find all rectangles affecting this scanline.
			for (int opNdx = 0; opNdx < (int)clearOps.size(); opNdx++)
			{
				ClearInfo& op = clearOps[opNdx];
				if (de::inBounds(y, op.m_rect.y(), op.m_rect.y()+op.m_rect.w()))
					scanlineClearOps.push_back(op);
			}

			// Compute reference for scanline.
			int x = 0;
			while (x < targetWidth)
			{
				tcu::RGBA	spanColor;
				deUint8		spanKnownMask	= 0;
				int			spanLength		= (targetWidth - x);

				for (int opNdx = (int)scanlineClearOps.size() - 1; opNdx >= 0; opNdx--)
				{
					const ClearInfo& op = scanlineClearOps[opNdx];

					if (de::inBounds(x, op.m_rect.x(), op.m_rect.x()+op.m_rect.z()) &&
						de::inBounds(y, op.m_rect.y(), op.m_rect.y()+op.m_rect.w()))
					{
						// Compute span length until end of given rectangle.
						spanLength = deMin32(spanLength, op.m_rect.x() + op.m_rect.z() - x);

						tcu::RGBA	clearCol	= op.m_color;
						deUint8		clearMask	= op.m_colorMask;
						if ((clearMask & 0x1) && !(spanKnownMask & 0x1)) spanColor.setRed(clearCol.getRed());
						if ((clearMask & 0x2) && !(spanKnownMask & 0x2)) spanColor.setGreen(clearCol.getGreen());
						if ((clearMask & 0x4) && !(spanKnownMask & 0x4)) spanColor.setBlue(clearCol.getBlue());
						if ((clearMask & 0x8) && !(spanKnownMask & 0x8)) spanColor.setAlpha(clearCol.getAlpha());
						spanKnownMask |= clearMask;

						// Break if have all colors.
						if (spanKnownMask == 0xF)
							break;
					}
					else if (op.m_rect.x() > x)
						spanLength = deMin32(spanLength, op.m_rect.x() - x);
				}

				// Set reference alpha channel to 0xFF, if no alpha in target.
				if (pixelFormat.alphaBits == 0)
					spanColor.setAlpha(0xFF);

				// Fill the span.
				for (int ndx = 0; ndx < spanLength; ndx++)
				{
					refImage.setPixel(x + ndx, y, spanColor);
					pixelKnownChannelMask[y*targetWidth + x + ndx] |= spanKnownMask;
				}

				x += spanLength;
			}
		}
	}

	glu::readPixels(m_context.getRenderContext(), 0, 0, resImage.getAccess());
	GLU_EXPECT_NO_ERROR(gl.getError(), "glReadPixels");

	// Compute difference image.
	RGBA colorThreshold = pixelFormat.getColorThreshold();
	RGBA matchColor(0, 255, 0, 255);
	RGBA diffColor(255, 0, 0, 255);
	RGBA maxDiff(0, 0, 0, 0);
	bool isImageOk = true;

	if (gl.isEnabled(GL_DITHER))
	{
		colorThreshold.setRed(colorThreshold.getRed() + 1);
		colorThreshold.setGreen(colorThreshold.getGreen() + 1);
		colorThreshold.setBlue(colorThreshold.getBlue() + 1);
		colorThreshold.setAlpha(colorThreshold.getAlpha() + 1);
	}

	for (int y = 0; y < targetHeight; y++)
	for (int x = 0; x < targetWidth; x++)
	{
		int			offset		= (y*targetWidth + x);
		RGBA		refRGBA		= refImage.getPixel(x, y);
		RGBA		resRGBA		= resImage.getPixel(x, y);
		deUint8		colMask		= pixelKnownChannelMask[offset];
		RGBA		diff		= computeAbsDiffMasked(refRGBA, resRGBA, colMask);
		bool		isPixelOk	= diff.isBelowThreshold(colorThreshold);

		diffImage.setPixel(x, y, isPixelOk ? matchColor : diffColor);

		isImageOk	= isImageOk && isPixelOk;
		maxDiff		= max(maxDiff, diff);
	}

	if (isImageOk)
	{
		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
	}
	else
	{
		m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Fail");

		m_testCtx.getLog() << tcu::TestLog::Message << "Image comparison failed, max diff = " << maxDiff << ", threshold = " << colorThreshold << tcu::TestLog::EndMessage;

		log << TestLog::ImageSet("Result", "Resulting framebuffer")
			<< TestLog::Image("Result",		"Resulting framebuffer",	resImage)
			<< TestLog::Image("Reference",	"Reference image",			refImage)
			<< TestLog::Image("DiffMask",	"Failing pixels",			diffImage)
			<< TestLog::EndImageSet;
		return TestCase::STOP;
	}

	bool isFinal = (++m_curIter == m_numIters);

	// On final frame, dump images.
	if (isFinal)
	{
		log << TestLog::ImageSet("Result", "Resulting framebuffer")
			<< TestLog::Image("Result",		"Resulting framebuffer",	resImage)
			<< TestLog::EndImageSet;
	}

	return isFinal ? TestCase::STOP : TestCase::CONTINUE;
}

ColorClearTest::ColorClearTest (Context& context) : TestCaseGroup(context, "color_clear", "Color Clear Tests")
{
}

ColorClearTest::~ColorClearTest (void)
{
}

void ColorClearTest::init (void)
{
	//										name					iters,	#..#,		alpha?,	scissor,masks,	1stfull?
	addChild(new ColorClearCase(m_context, "single_rgb",			30,		1,3,		false,	false,	false,	true	));
	addChild(new ColorClearCase(m_context, "single_rgba",			30,		1,3,		true,	false,	false,	true	));
	addChild(new ColorClearCase(m_context, "multiple_rgb",			15,		4,20,		false,	false,	false,	true	));
	addChild(new ColorClearCase(m_context, "multiple_rgba",			15,		4,20,		true,	false,	false,	true	));
	addChild(new ColorClearCase(m_context, "long_rgb",				2,		100,500,	false,	false,	false,	true	));
	addChild(new ColorClearCase(m_context, "long_rgba",				2,		100,500,	true,	false,	false,	true	));
	addChild(new ColorClearCase(m_context, "subclears_rgb",			15,		4,30,		false,	false,	false,	false	));
	addChild(new ColorClearCase(m_context, "subclears_rgba",		15,		4,30,		true,	false,	false,	false	));
	addChild(new ColorClearCase(m_context, "short_scissored_rgb",	30,		2,4,		false,	true,	false,	true	));
	addChild(new ColorClearCase(m_context, "scissored_rgb",			15,		4,30,		false,	true,	false,	true	));
	addChild(new ColorClearCase(m_context, "scissored_rgba",		15,		4,30,		true,	true,	false,	true	));
	addChild(new ColorClearCase(m_context, "masked_rgb",			15,		4,30,		false,	true,	false,	true	));
	addChild(new ColorClearCase(m_context, "masked_rgba",			15,		4,30,		true,	true,	false,	true	));
	addChild(new ColorClearCase(m_context, "masked_scissored_rgb",	15,		4,30,		false,	true,	true,	true	));
	addChild(new ColorClearCase(m_context, "masked_scissored_rgba",	15,		4,30,		true,	true,	true,	true	));
	addChild(new ColorClearCase(m_context, "complex_rgb",			15,		5,50,		false,	true,	true,	false	));
	addChild(new ColorClearCase(m_context, "complex_rgba",			15,		5,50,		true,	true,	true,	false	));
	addChild(new ColorClearCase(m_context, "long_masked_rgb",		2,		100,500,	false,	true,	true,	true	));
	addChild(new ColorClearCase(m_context, "long_masked_rgba",		2,		100,500,	true,	true,	true,	true	));
}

} // Functional
} // gles3
} // deqp
