13c827367444ee418f129b2c238299f49d3264554Jarkko Poyry/*-------------------------------------------------------------------------
23c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * drawElements Quality Program OpenGL (ES) Module
33c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * -----------------------------------------------
43c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
53c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Copyright 2014 The Android Open Source Project
63c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
73c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Licensed under the Apache License, Version 2.0 (the "License");
83c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * you may not use this file except in compliance with the License.
93c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * You may obtain a copy of the License at
103c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *      http://www.apache.org/licenses/LICENSE-2.0
123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * Unless required by applicable law or agreed to in writing, software
143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * distributed under the License is distributed on an "AS IS" BASIS,
153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * See the License for the specific language governing permissions and
173c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * limitations under the License.
183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *
193c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*!
203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \file
213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry * \brief GLES Scissor tests
223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry *//*--------------------------------------------------------------------*/
233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glsScissorTests.hpp"
253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glsTextureTestUtil.hpp"
263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "deMath.h"
288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "deRandom.hpp"
298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "deUniquePtr.hpp"
303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTestCase.hpp"
323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuImageCompare.hpp"
333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuVector.hpp"
343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuVectorUtil.hpp"
353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "tcuTexture.hpp"
368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "tcuStringTemplate.hpp"
373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluStrUtil.hpp"
393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "gluDrawUtil.hpp"
408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "gluPixelTransfer.hpp"
418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "gluObjectWrapper.hpp"
423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry#include "glwEnums.hpp"
448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include "glwFunctions.hpp"
453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry#include <map>
473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
483c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace deqp
493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
503c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace gls
513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
523c827367444ee418f129b2c238299f49d3264554Jarkko Poyrynamespace Functional
533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrynamespace
553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
563c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing namespace ScissorTestInternal;
588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing namespace glw; // GL types
593c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::ConstPixelBufferAccess;
618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::PixelBufferAccess;
628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::TestLog;
633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing std::vector;
658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing std::string;
668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing std::map;
678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::Vec3;
688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::Vec4;
698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::IVec4;
708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryusing tcu::UVec4;
718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid drawQuad (const glw::Functions& gl, deUint32 program, const Vec3& p0, const Vec3& p1)
733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	// Vertex data.
758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const float hz = (p0.z() + p1.z()) * 0.5f;
768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const float position[] =
778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		p0.x(), p0.y(), p0.z(),	1.0f,
798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		p0.x(), p1.y(), hz,		1.0f,
808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		p1.x(), p0.y(), hz,		1.0f,
818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		p1.x(), p1.y(), p1.z(),	1.0f
828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	};
833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const deUint16	indices[]	= { 0, 1, 2, 2, 1, 3 };
853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const deInt32	posLoc		= gl.getAttribLocation(program, "a_position");
873c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.useProgram(program);
898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.enableVertexAttribArray(posLoc);
908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.vertexAttribPointer(posLoc, 4, GL_FLOAT, GL_FALSE, 0, &position[0]);
913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.drawElements(GL_TRIANGLES, DE_LENGTH_OF_ARRAY(indices), GL_UNSIGNED_SHORT, &indices[0]);
933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.disableVertexAttribArray(posLoc);
953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
963c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
973c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid drawPrimitives (const glw::Functions& gl, deUint32 program, const deUint32 type, const vector<float>& vertices, const vector<deUint16>& indices)
993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const deInt32 posLoc = gl.getAttribLocation(program, "a_position");
1013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	TCU_CHECK(posLoc >= 0);
1033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.useProgram(program);
1058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.enableVertexAttribArray(posLoc);
1068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.vertexAttribPointer(posLoc, 4, GL_FLOAT, GL_FALSE, 0, &vertices[0]);
1073c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.drawElements(type, GLsizei(indices.size()), GL_UNSIGNED_SHORT, &indices[0]);
1093c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.disableVertexAttribArray(posLoc);
1113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrytemplate<typename T>
1148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid clearEdges(const tcu::PixelBufferAccess& access, const T& color, const IVec4& scissorArea)
1153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	for (int y = 0; y < access.getHeight(); y++)
1178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	for (int x = 0; x < access.getWidth(); x++)
1183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		if (y < scissorArea.y() ||
1208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			y >= scissorArea.y() + scissorArea.w() ||
1218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			x < scissorArea.x() ||
1228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			x >= scissorArea.x()+ scissorArea.z())
1238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			access.setPixel(color, x, y);
1243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryglu::ProgramSources genShaders(glu::GLSLVersion version)
1283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const string vtxSource = "${VERSION}\n"
1308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry							 "${IN} highp vec4 a_position;\n"
1318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry							 "void main(){\n"
1328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry							 "	gl_Position = a_position;\n"
1338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry							 "}\n";
1348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const string frgSource = "${VERSION}\n"
1368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry							 "${OUT_DECL}"
1378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry							 "uniform highp vec4 u_color;\n"
1388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry							 "void main(){\n"
1398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry							 "	${OUTPUT} = u_color;\n"
1408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry							 "}\n";
1418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	map<string, string>	params;
1438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	switch(version)
1453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
1468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case glu::GLSL_VERSION_100_ES:
1478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			params["VERSION"] = "#version 100";
1488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			params["IN"] = "attribute";
1498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			params["OUT_DECL"] = "";
1508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			params["OUTPUT"] = "gl_FragColor";
1518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			break;
1528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case glu::GLSL_VERSION_300_ES:
1548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case glu::GLSL_VERSION_310_ES: // Assumed to support 3.0
1558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			params["VERSION"] = "#version 300 es";
1568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			params["IN"] = "in";
1578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			params["OUT_DECL"] = "out mediump vec4 f_color;\n";
1588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			params["OUTPUT"] = "f_color";
1598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			break;
1608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		default:
1628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			DE_ASSERT(!"Unsupported version");
1633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
1643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	return glu::makeVtxFragSources(tcu::StringTemplate(vtxSource).specialize(params), tcu::StringTemplate(frgSource).specialize(params));
1663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry// Wrapper class, provides iterator & reporting logic
1698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryclass ScissorCase : public tcu::TestCase
1708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
1718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrypublic:
1728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry							ScissorCase		(tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char *name, const char* desc, const Vec4& scissorArea);
1738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	virtual					~ScissorCase	(void) {}
1743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	virtual IterateResult	iterate			(void);
1763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryprotected:
1788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	virtual void			render			(GLuint program, const IVec4& viewport) const = 0;
1798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	glu::RenderContext&		m_renderCtx;
1818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const Vec4				m_scissorArea;
1828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry};
1838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
1848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryScissorCase::ScissorCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char *name, const char* desc, const Vec4& scissorArea)
1858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	: TestCase		(testCtx, name, desc)
1868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	, m_renderCtx	(renderCtx)
1878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	, m_scissorArea	(scissorArea)
1883c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
1903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1913c827367444ee418f129b2c238299f49d3264554Jarkko PoyryScissorCase::IterateResult ScissorCase::iterate (void)
1923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
1933c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	using TextureTestUtil::RandomViewport;
1943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const glw::Functions&		gl				= m_renderCtx.getFunctions();
1968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	TestLog&					log				= m_testCtx.getLog();
1978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const glu::ShaderProgram	shader			(m_renderCtx, genShaders(glu::getContextTypeGLSLVersion(m_renderCtx.getType())));
1983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
1998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const RandomViewport		viewport		(m_renderCtx.getRenderTarget(), 256, 256, deStringHash(getName()));
2008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const IVec4					relScissorArea	(int(m_scissorArea.x()*viewport.width),
2018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry												 int(m_scissorArea.y()*viewport.height),
2028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry												 int(m_scissorArea.z()*viewport.width),
2038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry												 int(m_scissorArea.w()*viewport.height));
2048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const IVec4					absScissorArea	(relScissorArea.x() + viewport.x,
2058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry												 relScissorArea.y() + viewport.y,
2068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry												 relScissorArea.z(),
2078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry												 relScissorArea.w());
2083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	tcu::Surface				refImage		(viewport.width, viewport.height);
2108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	tcu::Surface				resImage		(viewport.width, viewport.height);
2113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	if (!shader.isOk())
2133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		log << shader;
2158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Shader compile/link failed");
2168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		return STOP;
2178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	}
2183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	log << TestLog::Message << "Viewport area is " << IVec4(viewport.x, viewport.y, viewport.width, viewport.height) << TestLog::EndMessage;
2208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	log << TestLog::Message << "Scissor area is " << absScissorArea << TestLog::EndMessage;
2218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	// Render reference (no scissors)
2238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
2248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		log << TestLog::Message << "Rendering reference (scissors disabled)" << TestLog::EndMessage;
2253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.useProgram(shader.getProgram());
2278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);
2283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.clearColor(0.125f, 0.25f, 0.5f, 1.0f);
2308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.clearDepthf(1.0f);
2318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.clearStencil(0);
2328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.disable(GL_DEPTH_TEST);
2338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.disable(GL_STENCIL_TEST);
2348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.disable(GL_SCISSOR_TEST);
2358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
2368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		render(shader.getProgram(), IVec4(viewport.x, viewport.y, viewport.width, viewport.height));
2388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		glu::readPixels(m_renderCtx, viewport.x, viewport.y, refImage.getAccess());
2408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GLU_CHECK_ERROR(gl.getError());
2413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	// Render result (scissors)
2443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
2458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		log << TestLog::Message << "Rendering result (scissors enabled)" << TestLog::EndMessage;
2463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.useProgram(shader.getProgram());
2488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.viewport(viewport.x, viewport.y, viewport.width, viewport.height);
2493c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.clearColor(0.125f, 0.25f, 0.5f, 1.0f);
2518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.clearDepthf(1.0f);
2528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.clearStencil(0);
2538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.disable(GL_DEPTH_TEST);
2548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.disable(GL_STENCIL_TEST);
2558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.disable(GL_SCISSOR_TEST);
2568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
2573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.scissor(absScissorArea.x(), absScissorArea.y(), absScissorArea.z(), absScissorArea.w());
2598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.enable(GL_SCISSOR_TEST);
2603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		render(shader.getProgram(), IVec4(viewport.x, viewport.y, viewport.width, viewport.height));
2628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		glu::readPixels(m_renderCtx, viewport.x, viewport.y, resImage.getAccess());
2648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GLU_CHECK_ERROR(gl.getError());
2653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
2668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	// Manual 'scissors' for reference image
2688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	log << TestLog::Message << "Clearing area outside scissor area from reference" << TestLog::EndMessage;
2698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	clearEdges(refImage.getAccess(), IVec4(32, 64, 128, 255), relScissorArea);
2708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
2718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	if (tcu::floatThresholdCompare(log, "ComparisonResult", "Image comparison result", refImage.getAccess(), resImage.getAccess(), Vec4(0.02f, 0.02f, 0.02f, 0.02f), tcu::COMPARE_LOG_RESULT))
2728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
2733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	else
2748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Image comparison failed");
2753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	return STOP;
2773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
2783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry// Tests scissoring with multiple primitive types
2803c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ScissorPrimitiveCase : public ScissorCase
2813c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
2823c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
2838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry								ScissorPrimitiveCase	(tcu::TestContext&		testCtx,
2848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry														 glu::RenderContext&	renderCtx,
2853c827367444ee418f129b2c238299f49d3264554Jarkko Poyry														 const char*			name,
2868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry														 const char*			desc,
2878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry														 const Vec4&			scissorArea,
2888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry														 const Vec4&			renderArea,
2898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry														 PrimitiveType			type,
2908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry														 int					primitiveCount);
2913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	virtual						~ScissorPrimitiveCase	(void){}
2923c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2933c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected:
2948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	virtual void				render					(GLuint program, const IVec4& viewport) const;
2953c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
2963c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
2978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const Vec4					m_renderArea;
2983c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const PrimitiveType			m_primitiveType;
2993c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	const int					m_primitiveCount;
3003c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
3013c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryScissorPrimitiveCase::ScissorPrimitiveCase	(tcu::TestContext&		testCtx,
3038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry											 glu::RenderContext&	renderCtx,
3043c827367444ee418f129b2c238299f49d3264554Jarkko Poyry											 const char*			name,
3058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry											 const char*			desc,
3068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry											 const Vec4&			scissorArea,
3078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry											 const Vec4&			renderArea,
3088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry											 PrimitiveType			type,
3098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry											 int					primitiveCount)
3108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	: ScissorCase		(testCtx, renderCtx, name, desc, scissorArea)
3113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_renderArea		(renderArea)
3123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_primitiveType	(type)
3133c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_primitiveCount	(primitiveCount)
3143c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3163c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid ScissorPrimitiveCase::render (GLuint program, const IVec4&) const
3183c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const glw::Functions&		gl				= m_renderCtx.getFunctions();
3208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const Vec4					white			(1.0f, 1.0f, 1.0f, 1.0);
3218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const Vec4					primitiveArea	(m_renderArea.x()*2.0f-1.0f,
3223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry												 m_renderArea.x()*2.0f-1.0f,
3233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry												 m_renderArea.z()*2.0f,
3243c827367444ee418f129b2c238299f49d3264554Jarkko Poyry												 m_renderArea.w()*2.0f);
3253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3263c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const float quadPositions[] =
3273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3283c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		 0.0f,  1.0f,
3293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		 0.0f,  0.0f,
3303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		 1.0f,  1.0f,
3313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		 1.0f,  0.0f
3323c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
3333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const float triPositions[] =
3343c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3353c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		 0.0f,  0.0f,
3363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		 1.0f,  0.0f,
3373c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		 0.5f,  1.0f,
3383c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
3393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const float linePositions[] =
3403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		 0.0f,  0.0f,
3423c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		 1.0f,  1.0f
3433c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
3443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	static const float pointPosition[] =
3453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		 0.5f,  0.5f
3473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	};
3483c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const float*		positionSet[]	= { pointPosition, linePositions, triPositions, quadPositions };
3508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const int			vertexCountSet[]= { 1, 2, 3, 4 };
3518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const int			indexCountSet[]	= { 1, 2, 3, 6 };
3523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const deUint16		baseIndices[]	= { 0, 1, 2, 2, 1, 3 };
3548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const float*		basePositions	= positionSet[m_primitiveType];
3558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const int			vertexCount		= vertexCountSet[m_primitiveType];
3568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const int			indexCount		= indexCountSet[m_primitiveType];
3573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const float			scale			= 1.44f/deFloatSqrt(float(m_primitiveCount)*2.0f); // Magic value to roughly fill the render area with primitives at a readable density
3598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	vector<float>		positions		(4*vertexCount*m_primitiveCount);
3608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	vector<deUint16>	indices			(indexCount*m_primitiveCount);
3618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	de::Random			rng				(1234);
3623c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3633c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	for (int primNdx = 0; primNdx < m_primitiveCount; primNdx++)
3643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3653c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const float dx = m_primitiveCount>1 ? rng.getFloat() : 0.0f;
3663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		const float dy = m_primitiveCount>1 ? rng.getFloat() : 0.0f;
3673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		for (int vertNdx = 0; vertNdx < vertexCount; vertNdx++)
3693c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		{
3703c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			const int ndx = primNdx*4*vertexCount + vertNdx*4;
3713c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			positions[ndx+0] = (basePositions[vertNdx*2 + 0]*scale + dx)*primitiveArea.z() + primitiveArea.x();
3723c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			positions[ndx+1] = (basePositions[vertNdx*2 + 1]*scale + dy)*primitiveArea.w() + primitiveArea.y();
3733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			positions[ndx+2] = 0.2f;
3743c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			positions[ndx+3] = 1.0f;
3753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		}
3763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3773c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		for (int ndx = 0; ndx < indexCount; ndx++)
3783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry			indices[primNdx*indexCount + ndx] = baseIndices[ndx] + primNdx*vertexCount;
3793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.uniform4fv(gl.getUniformLocation(program, "u_color"), 1, white.m_data);
3823c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3833c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	switch (m_primitiveType)
3843c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
3858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case TRIANGLE:	drawPrimitives(gl, program, GL_TRIANGLES,	positions, indices);	break;
3868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case LINE:		drawPrimitives(gl, program, GL_LINES,		positions, indices);	break;
3878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case POINT:		drawPrimitives(gl, program, GL_POINTS,		positions, indices);	break;
3888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		default:		DE_ASSERT(false);													break;
3893c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
3903c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
3913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
3928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry// Test effect of scissor on default framebuffer clears
3933c827367444ee418f129b2c238299f49d3264554Jarkko Poyryclass ScissorClearCase : public ScissorCase
3943c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
3953c827367444ee418f129b2c238299f49d3264554Jarkko Poyrypublic:
3968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					ScissorClearCase	(tcu::TestContext&		testCtx,
3978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry										 glu::RenderContext&	renderCtx,
3988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry										 const char*			name,
3998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry										 const char*			desc,
4008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry										 const Vec4&			scissorArea,
4018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry										 deUint32				clearMode);
4028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	virtual			~ScissorClearCase	(void) {}
4033c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	virtual void	init				(void);
4053c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4063c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprotected:
4078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	virtual void	render				(GLuint program, const IVec4& viewport) const;
4083c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4093c827367444ee418f129b2c238299f49d3264554Jarkko Poyryprivate:
4108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const deUint32	m_clearMode; //!< Combination of the flags accepted by glClear
4113c827367444ee418f129b2c238299f49d3264554Jarkko Poyry};
4123c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryScissorClearCase::ScissorClearCase	(tcu::TestContext&		testCtx,
4148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry									 glu::RenderContext&	renderCtx,
4153c827367444ee418f129b2c238299f49d3264554Jarkko Poyry									 const char*			name,
4168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry									 const char*			desc,
4178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry									 const Vec4&			scissorArea,
4188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry									 deUint32				clearMode)
4198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	: ScissorCase	(testCtx, renderCtx, name, desc, scissorArea)
4203c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	, m_clearMode	(clearMode)
4213c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4223c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4233c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4243c827367444ee418f129b2c238299f49d3264554Jarkko Poyryvoid ScissorClearCase::init (void)
4253c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	if ((m_clearMode & GL_DEPTH_BUFFER_BIT) && m_renderCtx.getRenderTarget().getDepthBits() == 0)
4273c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		throw tcu::NotSupportedError("Cannot clear depth; no depth buffer present", "", __FILE__, __LINE__);
4288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	else if ((m_clearMode & GL_STENCIL_BUFFER_BIT) && m_renderCtx.getRenderTarget().getStencilBits() == 0)
4293c827367444ee418f129b2c238299f49d3264554Jarkko Poyry		throw tcu::NotSupportedError("Cannot clear stencil; no stencil buffer present", "", __FILE__, __LINE__);
4303c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
4313c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid ScissorClearCase::render (GLuint program, const IVec4&) const
4333c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
4348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const glw::Functions&	gl		= m_renderCtx.getFunctions();
4358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const Vec4				white	(1.0f, 1.0f, 1.0f, 1.0);
4363c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.clearColor(0.6f, 0.1f, 0.1f, 1.0);
4388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.clearDepthf(0.0f);
4393c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4403c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_clearMode & GL_DEPTH_BUFFER_BIT)
4413c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
4428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.enable(GL_DEPTH_TEST);
4438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.depthFunc(GL_GREATER);
4443c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
4453c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4463c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_clearMode & GL_STENCIL_BUFFER_BIT)
4473c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	{
4488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.clearStencil(123);
4498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.enable(GL_STENCIL_TEST);
4508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.stencilFunc(GL_EQUAL, 123, ~0u);
4513c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	}
4523c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4533c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (m_clearMode & GL_COLOR_BUFFER_BIT)
4548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.clearColor(0.1f, 0.6f, 0.1f, 1.0);
4553c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.clear(m_clearMode);
4578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.disable(GL_SCISSOR_TEST);
4583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.uniform4fv(gl.getUniformLocation(program, "u_color"), 1, white.getPtr());
4603c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4613c827367444ee418f129b2c238299f49d3264554Jarkko Poyry	if (!(m_clearMode & GL_COLOR_BUFFER_BIT))
4628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		drawQuad(gl, program, Vec3(-1.0f, -1.0f, 0.5f), Vec3(1.0f, 1.0f, 0.5f));
4638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
4648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.disable(GL_DEPTH_TEST);
4658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.disable(GL_STENCIL_TEST);
4668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}
4678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
4688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryclass FramebufferBlitCase : public ScissorCase
4698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
4708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrypublic:
4718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry					FramebufferBlitCase		(tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* desc, const Vec4& scissorArea);
4728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	virtual			~FramebufferBlitCase	(void) {}
4738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
4748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	virtual void	init					(void);
4758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	virtual void	deinit					(void);
4768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
4778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryprotected:
4788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	typedef de::MovePtr<glu::Framebuffer> FramebufferP;
4798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
4808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	enum {SIZE = 64};
4818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
4828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	virtual void	render					(GLuint program, const IVec4& viewport) const;
4838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
4848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	FramebufferP	m_fbo;
4858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry};
4868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
4878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryFramebufferBlitCase::FramebufferBlitCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* desc, const Vec4& scissorArea)
4888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	: ScissorCase(testCtx, renderCtx, name, desc, scissorArea)
4898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
4908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}
4913c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
4928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid FramebufferBlitCase::init (void)
4938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
4948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	if (m_renderCtx.getRenderTarget().getNumSamples())
4958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		throw tcu::NotSupportedError("Cannot blit to multisampled framebuffer", "", __FILE__, __LINE__);
4968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
4978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const glw::Functions&	gl			= m_renderCtx.getFunctions();
4988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const glu::Renderbuffer	colorbuf	(gl);
4998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const tcu::Vec4			clearColor	(1.0f, 0.5, 0.125f, 1.0f);
5008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	m_fbo = FramebufferP(new glu::Framebuffer(gl));
5028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, **m_fbo);
5048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.bindRenderbuffer(GL_RENDERBUFFER, *colorbuf);
5068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.renderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, SIZE, SIZE);
5078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.framebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, *colorbuf);
5088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.clearBufferfv(GL_COLOR, 0, clearColor.getPtr());
5108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, m_renderCtx.getDefaultFramebuffer());
5118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}
5128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid FramebufferBlitCase::deinit (void)
5148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
5158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	m_fbo.clear();
5168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}
5178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid FramebufferBlitCase::render(GLuint program, const IVec4& viewport) const
5198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
5208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const glw::Functions&	gl					= m_renderCtx.getFunctions();
5218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const int				width				= viewport.z();
5238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const int				height				= viewport.w();
5248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const deInt32			defaultFramebuffer	= m_renderCtx.getDefaultFramebuffer();
5258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	DE_UNREF(program);
5278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	// blit to default framebuffer
5298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.bindFramebuffer(GL_READ_FRAMEBUFFER, **m_fbo);
5308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, defaultFramebuffer);
5318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.blitFramebuffer(0, 0, SIZE, SIZE, viewport.x(), viewport.y(), viewport.x() + width, viewport.y() + height, GL_COLOR_BUFFER_BIT, GL_NEAREST);
5338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.bindFramebuffer(GL_READ_FRAMEBUFFER, defaultFramebuffer);
5358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}
5368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrystruct BufferFmtDesc
5388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
5398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	tcu::TextureFormat	texFmt;
5408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	GLenum				colorFmt;
5418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry};
5428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrystruct Color
5448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
5458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	enum Type {FLOAT, INT, UINT};
5468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	Type type;
5488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	union
5508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
5518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		float		f[4];
5528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		deInt32		i[4];
5538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		deUint32	u[4];
5548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	};
5558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	Color(const float f_[4])    : type(FLOAT) { f[0] = f_[0]; f[1] = f_[1]; f[2] = f_[2]; f[3] = f_[3]; }
5578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	Color(const deInt32 i_[4])  : type(INT)   { i[0] = i_[0]; i[1] = i_[1]; i[2] = i_[2]; i[3] = i_[3]; }
5588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	Color(const deUint32 u_[4]) : type(UINT)  { u[0] = u_[0]; u[1] = u_[1]; u[2] = u_[2]; u[3] = u_[3]; }
5598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry};
5608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryclass FramebufferClearCase : public tcu::TestCase
5628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
5638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrypublic:
5648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry							FramebufferClearCase	(tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* desc, ClearType clearType);
5658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	virtual					~FramebufferClearCase	(void) {}
5668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	virtual IterateResult	iterate					(void);
5688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryprivate:
5708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	static void				clearBuffers			(const glw::Functions& gl, Color color, float depth, int stencil);
5718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	static Color			getBaseColor			(const BufferFmtDesc& bufferFmt);
5728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	static Color			getMainColor			(const BufferFmtDesc& bufferFmt);
5738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	static BufferFmtDesc	getBufferFormat			(ClearType type);
5748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	virtual void			render					(GLuint program) const;
5768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	glu::RenderContext&		m_renderCtx;
5788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const ClearType			m_clearType;
5798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry};
5808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryFramebufferClearCase::FramebufferClearCase (tcu::TestContext& testCtx, glu::RenderContext& renderCtx, const char* name, const char* desc, ClearType clearType)
5828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	: tcu::TestCase	(testCtx, name, desc)
5838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	, m_renderCtx	(renderCtx)
5848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	, m_clearType	(clearType)
5858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
5868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}
5878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid FramebufferClearCase::clearBuffers (const glw::Functions& gl, Color color, float depth, int stencil)
5898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
5908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	switch(color.type)
5918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
5928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case Color::FLOAT:	gl.clearBufferfv (GL_COLOR, 0, color.f); break;
5938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case Color::INT:	gl.clearBufferiv (GL_COLOR, 0, color.i); break;
5948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case Color::UINT:	gl.clearBufferuiv(GL_COLOR, 0, color.u); break;
5958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		default:
5968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			DE_ASSERT(false);
5978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	}
5988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
5998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.clearBufferfv(GL_DEPTH, 0, &depth);
6008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.clearBufferiv(GL_STENCIL, 0, &stencil);
6018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}
6028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
6038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryFramebufferClearCase::IterateResult FramebufferClearCase::iterate (void)
6048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
6058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	TestLog&					log				= m_testCtx.getLog();
6068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const glw::Functions&		gl				= m_renderCtx.getFunctions();
6078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const glu::ShaderProgram	shader			(m_renderCtx, genShaders(glu::getContextTypeGLSLVersion(m_renderCtx.getType())));
6088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
6098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const glu::Framebuffer		fbo				(gl);
6108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const glu::Renderbuffer		colorbuf		(gl);
6118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const glu::Renderbuffer		depthbuf		(gl);
6128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
6138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const BufferFmtDesc			bufferFmt		= getBufferFormat(m_clearType);
6148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const Color					baseColor		= getBaseColor(bufferFmt);
6158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
6168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const int					width			= 64;
6178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const int					height			= 64;
6188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
6198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const IVec4					scissorArea		(8, 8, 48, 48);
6208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
6218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	vector<deUint8>				refData			(width*height*bufferFmt.texFmt.getPixelSize());
6228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	vector<deUint8>				resData			(width*height*bufferFmt.texFmt.getPixelSize());
6238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
6248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	tcu::PixelBufferAccess		refAccess		(bufferFmt.texFmt, width, height, 1, &refData[0]);
6258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	tcu::PixelBufferAccess		resAccess		(bufferFmt.texFmt, width, height, 1, &resData[0]);
6268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
6278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	if (!shader.isOk())
6288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
6298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		log << shader;
6308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Shader compile/link failed");
6318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		return STOP;
6328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	}
6338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
6348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.bindFramebuffer(GL_DRAW_FRAMEBUFFER, *fbo);
6358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.bindFramebuffer(GL_READ_FRAMEBUFFER, *fbo);
6368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
6378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	// Color
6388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.bindRenderbuffer(GL_RENDERBUFFER, *colorbuf);
6398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.renderbufferStorage(GL_RENDERBUFFER, bufferFmt.colorFmt, width, height);
6408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.framebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, *colorbuf);
6418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
6428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	// Depth/stencil
6438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.bindRenderbuffer(GL_RENDERBUFFER, *depthbuf);
6448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.renderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height);
6458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	gl.framebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, *depthbuf);
6468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
6478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	log << TestLog::Message << "Scissor area is " << scissorArea << TestLog::EndMessage;
6488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
6498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	// Render reference
6508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
6518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		log << TestLog::Message << "Rendering reference (scissors disabled)" << TestLog::EndMessage;
6528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
6538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.useProgram(shader.getProgram());
6548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.viewport(0, 0, width, height);
6558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
6568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.disable(GL_DEPTH_TEST);
6578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.disable(GL_STENCIL_TEST);
6588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.disable(GL_SCISSOR_TEST);
6598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
6608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		clearBuffers(gl, baseColor, 1.0f, 0);
6618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
6628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		render(shader.getProgram());
6638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
6648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		glu::readPixels(m_renderCtx, 0, 0, refAccess);
6658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GLU_CHECK_ERROR(gl.getError());
6668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	}
6678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
6688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	// Render result
6698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
6708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		log << TestLog::Message << "Rendering result (scissors enabled)" << TestLog::EndMessage;
6718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
6728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.useProgram(shader.getProgram());
6738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.viewport(0, 0, width, height);
6748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
6758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.disable(GL_DEPTH_TEST);
6768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.disable(GL_STENCIL_TEST);
6778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.disable(GL_SCISSOR_TEST);
6788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
6798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		clearBuffers(gl, baseColor, 1.0f, 0);
6808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
6818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.enable(GL_SCISSOR_TEST);
6828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.scissor(scissorArea.x(), scissorArea.y(), scissorArea.z(), scissorArea.w());
6838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
6848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		render(shader.getProgram());
6858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
6868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		glu::readPixels(m_renderCtx, 0, 0, resAccess);
6878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		GLU_CHECK_ERROR(gl.getError());
6888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	}
6898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
6908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
6918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		bool resultOk = false;
6928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
6938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		switch (baseColor.type)
6948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		{
6958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			case Color::FLOAT:
6968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				clearEdges(refAccess, Vec4(baseColor.f[0], baseColor.f[1], baseColor.f[2], baseColor.f[3]), scissorArea);
6978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				resultOk = tcu::floatThresholdCompare(log, "ComparisonResult", "Image comparison result", refAccess, resAccess, Vec4(0.02f, 0.02f, 0.02f, 0.02f), tcu::COMPARE_LOG_RESULT);
6988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				break;
6998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
7008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			case Color::INT:
7018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				clearEdges(refAccess, IVec4(baseColor.i[0], baseColor.i[1], baseColor.i[2], baseColor.i[3]), scissorArea);
7028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				resultOk = tcu::intThresholdCompare(log, "ComparisonResult", "Image comparison result", refAccess, resAccess, UVec4(2, 2, 2, 2), tcu::COMPARE_LOG_RESULT);
7038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				break;
7048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
7058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			case Color::UINT:
7068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				clearEdges(refAccess, UVec4(baseColor.u[0], baseColor.u[1], baseColor.u[2], baseColor.u[3]), scissorArea);
7078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				resultOk = tcu::intThresholdCompare(log, "ComparisonResult", "Image comparison result", refAccess, resAccess, UVec4(2, 2, 2, 2), tcu::COMPARE_LOG_RESULT);
7088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry				break;
7098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		}
7108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
7118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		if (resultOk)
7128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			m_testCtx.setTestResult(QP_TEST_RESULT_PASS, "Pass");
7138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		else
7148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			m_testCtx.setTestResult(QP_TEST_RESULT_FAIL, "Image comparison failed");
7158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	}
7168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
7178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	return STOP;
7188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}
7198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
7208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryColor FramebufferClearCase::getBaseColor (const BufferFmtDesc& bufferFmt)
7218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
7228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const float		f[4] = {0.125f, 0.25f, 0.5f, 1.0f};
7238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const deInt32	i[4] = {0, 0, 0, 0};
7248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const deUint32	u[4] = {0, 0, 0, 0};
7258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
7268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	switch(bufferFmt.colorFmt)
7278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
7288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case GL_RGBA8:		return Color(f);
7298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case GL_RGBA8I:		return Color(i);
7308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case GL_RGBA8UI:	return Color(u);
7318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		default:
7328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			DE_ASSERT(false);
7338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	}
7348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
7358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	return Color(f);
7368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}
7378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
7388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryColor FramebufferClearCase::getMainColor (const BufferFmtDesc& bufferFmt)
7398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
7408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const float		f[4] = {1.0f, 1.0f, 0.5f, 1.0f};
7418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const deInt32	i[4] = {127, -127, 0, 127};
7428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const deUint32	u[4] = {255, 255, 0, 255};
7438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
7448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	switch(bufferFmt.colorFmt)
7458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
7468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case GL_RGBA8:		return Color(f);
7478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case GL_RGBA8I:		return Color(i);
7488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case GL_RGBA8UI:	return Color(u);
7498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		default:
7508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			DE_ASSERT(false);
7518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	}
7528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
7538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	return Color(f);
7548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}
7558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
7568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko PoyryBufferFmtDesc FramebufferClearCase::getBufferFormat (ClearType type)
7578852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
7588852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	BufferFmtDesc retval;
7598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
7608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	switch (type)
7618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
7628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case CLEAR_COLOR_FLOAT:
7638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			retval.colorFmt	= GL_RGBA16F;
7648852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			retval.texFmt	= tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::HALF_FLOAT);
7658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			DE_ASSERT(!"Floating point clear not implemented");// \todo [2014-1-23 otto] pixel read format & type, nothing guaranteed, need extension...
7668852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			break;
7678852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
7688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case CLEAR_COLOR_INT:
7698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			retval.colorFmt	= GL_RGBA8I;
7708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			retval.texFmt	= tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT32);
7718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			break;
7728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
7738852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case CLEAR_COLOR_UINT:
7748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			retval.colorFmt	= GL_RGBA8UI;
7758852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			retval.texFmt	= tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT32);
7768852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			break;
7778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
7788852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		default:
7798852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			retval.colorFmt = GL_RGBA8;
7808852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			retval.texFmt	= tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8);
7818852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			break;
7828852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	}
7838852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
7848852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	return retval;
7858852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}
7868852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
7878852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyryvoid FramebufferClearCase::render (GLuint program) const
7888852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
7898852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const glw::Functions&	gl					= m_renderCtx.getFunctions();
7908852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
7918852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const BufferFmtDesc		bufferFmt			= getBufferFormat(m_clearType);
7928852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const Color				clearColor			= getMainColor(bufferFmt);
7938852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
7948852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const int				clearStencil		= 123;
7958852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const float				clearDepth			= 0.5f;
7968852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
7978852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	switch (m_clearType)
7988852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
7998852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case CLEAR_COLOR_FIXED:		gl.clearBufferfv (GL_COLOR, 0, clearColor.f);						break;
8008852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case CLEAR_COLOR_FLOAT:		gl.clearBufferfv (GL_COLOR, 0, clearColor.f);						break;
8018852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case CLEAR_COLOR_INT:		gl.clearBufferiv (GL_COLOR, 0, clearColor.i);						break;
8028852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case CLEAR_COLOR_UINT:		gl.clearBufferuiv(GL_COLOR, 0, clearColor.u);						break;
8038852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case CLEAR_DEPTH:			gl.clearBufferfv (GL_DEPTH, 0, &clearDepth);						break;
8048852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case CLEAR_STENCIL:			gl.clearBufferiv (GL_STENCIL, 0, &clearStencil);					break;
8058852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		case CLEAR_DEPTH_STENCIL:	gl.clearBufferfi (GL_DEPTH_STENCIL, 0, clearDepth, clearStencil);	break;
8068852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
8078852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		default:
8088852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			DE_ASSERT(false);
8098852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	}
8108852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
8118852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const bool useDepth		= (m_clearType == CLEAR_DEPTH   || m_clearType == CLEAR_DEPTH_STENCIL);
8128852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	const bool useStencil	= (m_clearType == CLEAR_STENCIL || m_clearType == CLEAR_DEPTH_STENCIL);
8138852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
8148852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	// Render something to expose changes to depth/stencil buffer
8158852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	if (useDepth || useStencil)
8168852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	{
8178852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		if (useDepth)
8188852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			gl.enable(GL_DEPTH_TEST);
8198852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
8208852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		if (useStencil)
8218852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry			gl.enable(GL_STENCIL_TEST);
8228852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
8238852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.stencilFunc(GL_EQUAL, clearStencil, ~0u);
8248852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.depthFunc(GL_GREATER);
8258852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.disable(GL_SCISSOR_TEST);
8268852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
8278852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		gl.uniform4fv(gl.getUniformLocation(program, "u_color"), 1, clearColor.f);
8288852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry		drawQuad(gl, program, tcu::Vec3(-1.0f, -1.0f, 0.6f), tcu::Vec3(1.0f, 1.0f, 0.6f));
8298852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	}
8308852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}
8318852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
8328852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} // Anonymous
8338852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
8348852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrynamespace ScissorTestInternal
8358852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
8368852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
8378852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrytcu::TestNode* createPrimitiveTest (tcu::TestContext&	testCtx,
8388852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry									glu::RenderContext&	renderCtx,
8398852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry									const char*			name,
8408852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry									const char*			desc,
8418852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry									const Vec4&			scissorArea,
8428852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry									const Vec4&			renderArea,
8438852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry									PrimitiveType		type,
8448852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry									int					primitiveCount)
8458852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
8468852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	return new ScissorPrimitiveCase(testCtx, renderCtx, name, desc, scissorArea, renderArea, type, primitiveCount);
8478852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry}
8488852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry
8498852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrytcu::TestNode* createClearTest (tcu::TestContext&	testCtx,
8508852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry								glu::RenderContext&	renderCtx,
8518852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry								const char*			name,
8528852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry								const char*			desc,
8538852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry								const Vec4&			scissorArea,
8548852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry								deUint32			clearMode)
8558852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry{
8568852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	return new ScissorClearCase(testCtx, renderCtx, name, desc, scissorArea, clearMode);
8573c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8583c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8598852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrytcu::TestNode* createFramebufferClearTest (tcu::TestContext&	testCtx,
8608852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry										   glu::RenderContext&	renderCtx,
8618852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry										   const char*			name,
8628852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry										   const char*			desc,
8638852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry										   ClearType			clearType)
8643c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8658852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	return new FramebufferClearCase(testCtx, renderCtx, name, desc, clearType);
8663c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8673c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8688852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyrytcu::TestNode* createFramebufferBlitTest (tcu::TestContext&		testCtx,
8698852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry										  glu::RenderContext&	renderCtx,
8708852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry										  const char*			name,
8718852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry										  const char*			desc,
8728852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry										  const Vec4&			scissorArea)
8733c827367444ee418f129b2c238299f49d3264554Jarkko Poyry{
8748852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry	return new FramebufferBlitCase(testCtx, renderCtx, name, desc, scissorArea);
8753c827367444ee418f129b2c238299f49d3264554Jarkko Poyry}
8763c827367444ee418f129b2c238299f49d3264554Jarkko Poyry
8778852c82a1ffa4760985c17cc6875d5d521daf343Jarkko Poyry} // ScissorTestInternal
8783c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // Functional
8793c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // gls
8803c827367444ee418f129b2c238299f49d3264554Jarkko Poyry} // deqp
881