148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos/*-------------------------------------------------------------------------
248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * OpenGL Conformance Test Suite
348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * -----------------------------
448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Copyright (c) 2014-2016 The Khronos Group Inc.
648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License");
848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * you may not use this file except in compliance with the License.
948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * You may obtain a copy of the License at
1048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
1148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
1248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
1348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * Unless required by applicable law or agreed to in writing, software
1448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS,
1548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * See the License for the specific language governing permissions and
1748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * limitations under the License.
1848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos *
1984322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin */ /*!
2048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \file
2148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos * \brief
2284322c9402f810da3cd80b52e9f9ef72150a9004Alexander Galazin */ /*-------------------------------------------------------------------*/
2348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
2448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "es31cSampleShadingTests.hpp"
2548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "deRandom.hpp"
2648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "deStringUtil.hpp"
2748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gluContextInfo.hpp"
2848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gluDrawUtil.hpp"
2948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gluPixelTransfer.hpp"
3048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "gluShaderProgram.hpp"
3148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "glw.h"
3248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "glwFunctions.hpp"
3348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuCommandLine.hpp"
3448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuStringTemplate.hpp"
3548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuSurface.hpp"
3648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos#include "tcuTestLog.hpp"
3748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
3848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosnamespace tcu
3948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
4048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstatic bool operator<(tcu::Vec4 const& k1, tcu::Vec4 const& k2)
4148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
4248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (k1.y() < k2.y())
4348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
4448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return true;
4548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
4648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else if (k1.y() == k2.y())
4748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
4848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return k1.x() < k2.x();
4948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
5048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
5148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
5248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return false;
5348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
5448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
5548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
5648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
5748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosnamespace glcts
5848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
5948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
6048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing tcu::TestLog;
6148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing std::string;
6248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing std::vector;
6348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosusing glcts::Context;
6448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
6548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosstatic std::string specializeVersion(std::string const& source, glu::GLSLVersion version, std::string const& sampler,
6648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									 std::string const& outType)
6748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
6848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_ASSERT(version == glu::GLSL_VERSION_310_ES || version >= glu::GLSL_VERSION_400);
6948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::map<std::string, std::string> args;
7048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	args["VERSION_DECL"] = glu::getGLSLVersionDeclaration(version);
7148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	args["SAMPLER"]		 = sampler;
7248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	args["OUT_TYPE"]	 = outType;
7348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return tcu::StringTemplate(source.c_str()).specialize(args);
7448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
7548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
7648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass SampleShadingApiCaseGroup : public TestCaseGroup
7748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
7848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulospublic:
7948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	SampleShadingApiCaseGroup(Context& context, glu::GLSLVersion glslVersion)
8048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		: TestCaseGroup(context, "api", "Basic API verification"), m_glslVersion(glslVersion)
8148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
8248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
8348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
8448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	void init(void)
8548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
8648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		addChild(new SampleShadingApiCase(m_context, m_glslVersion));
8748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
8848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
8948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosprivate:
9048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	class SampleShadingApiCase : public deqp::TestCase
9148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
9248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	public:
9348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		SampleShadingApiCase(Context& context, glu::GLSLVersion glslVersion);
9448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		~SampleShadingApiCase();
9548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
9648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		IterateResult iterate();
9748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
9848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	protected:
9948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glu::GLSLVersion			m_glslVersion;
10048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glw::glMinSampleShadingFunc m_pGLMinSampleShading;
10148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	};
10248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
10348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glu::GLSLVersion m_glslVersion;
10448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
10548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
10648087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosSampleShadingApiCaseGroup::SampleShadingApiCase::SampleShadingApiCase(Context& context, glu::GLSLVersion glslVersion)
10748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TestCase(context, "verify", ""), m_glslVersion(glslVersion)
10848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
10948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_ASSERT(glslVersion == glu::GLSL_VERSION_310_ES || glslVersion >= glu::GLSL_VERSION_400);
11048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
11148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
11248087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosSampleShadingApiCaseGroup::SampleShadingApiCase::~SampleShadingApiCase()
11348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
11448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
11548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
11648087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosSampleShadingApiCaseGroup::SampleShadingApiCase::IterateResult SampleShadingApiCaseGroup::SampleShadingApiCase::
11748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	iterate()
11848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
11948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl   = m_context.getRenderContext().getFunctions();
12048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool				  isOk = true;
12148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
12248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_glslVersion == glu::GLSL_VERSION_310_ES &&
12348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		!m_context.getContextInfo().isExtensionSupported("GL_OES_sample_shading"))
12448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
12548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "GL_OES_sample_shading");
12648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return STOP;
12748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
12848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
12948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_pGLMinSampleShading = gl.minSampleShading;
13048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
13148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	struct Test
13248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
13348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLfloat input;
13448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLfloat result;
13548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	} tests[] = {
13648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{ 0.0f, 0.0f }, { 0.5f, 0.5f }, { -1.0f, 0.0f }, { 2.0f, 1.0f },
13748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	};
13848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (int i = 0; i < DE_LENGTH_OF_ARRAY(tests); ++i)
13948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
14048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_pGLMinSampleShading(tests[i].input);
14148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLfloat result = -1.0f;
14248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.getFloatv(GL_MIN_SAMPLE_SHADING_VALUE_OES, &result);
14348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (result != tests[i].result)
14448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
14548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			isOk = false;
14648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
14748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
14848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
14948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.enable(GL_SAMPLE_SHADING_OES);
15048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (!gl.isEnabled(GL_SAMPLE_SHADING_OES))
15148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
15248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		isOk = false;
15348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
15448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.disable(GL_SAMPLE_SHADING_OES);
15548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (gl.isEnabled(GL_SAMPLE_SHADING_OES))
15648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
15748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		isOk = false;
15848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
15948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
16048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_pGLMinSampleShading(0.0f);
16148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
16248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL, isOk ? "Pass" : "Fail");
16348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return STOP;
16448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
16548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
16648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass SampleShadingRenderCase : public TestCase
16748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
16848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulospublic:
16948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	SampleShadingRenderCase(Context& context, const char* name, const char* description, glu::GLSLVersion glslVersion,
17048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							GLenum internalFormat, tcu::TextureFormat const& texFormat, const char* m_sampler,
17148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							const char* m_outType, GLfloat min, GLfloat max, const char* m_extension,
17248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos							GLfloat sampleShading);
17348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	~SampleShadingRenderCase();
17448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
17548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	IterateResult iterate();
17648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
17748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosprotected:
17848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glu::GLSLVersion			m_glslVersion;
17948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glw::glMinSampleShadingFunc m_pGLMinSampleShading;
18048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLenum						m_internalFormat;
18148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	tcu::TextureFormat			m_texFormat;
18248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::string					m_sampler;
18348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::string					m_outType;
18448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLfloat						m_min;
18548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLfloat						m_max;
18648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::string					m_extension;
18748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLfloat						m_sampleShading;
18848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
18948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	enum
19048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
19148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		WIDTH		= 16,
19248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		HEIGHT		= 16,
19348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		MAX_SAMPLES = 4,
19448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	};
19548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
19648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	int countUniquePixels(tcu::ConstPixelBufferAccess const& pixels);
19748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	int countUniquePixels(const std::vector<tcu::Vec4>& pixels);
19848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
19948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
20048087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosSampleShadingRenderCase::SampleShadingRenderCase(Context& context, const char* name, const char* description,
20148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												 glu::GLSLVersion glslVersion, GLenum internalFormat,
20248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												 tcu::TextureFormat const& texFormat, const char* sampler,
20348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												 const char* outType, GLfloat min, GLfloat max, const char* extension,
20448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												 GLfloat sampleShading)
20548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TestCase(context, name, description)
20648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_glslVersion(glslVersion)
20748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_internalFormat(internalFormat)
20848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_texFormat(texFormat)
20948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_sampler(sampler)
21048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_outType(outType)
21148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_min(min)
21248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_max(max)
21348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_extension(extension)
21448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_sampleShading(sampleShading)
21548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
21648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	DE_ASSERT(glslVersion == glu::GLSL_VERSION_310_ES || glslVersion >= glu::GLSL_VERSION_400);
21748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
21848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
21948087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosSampleShadingRenderCase::~SampleShadingRenderCase()
22048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
22148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
22248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
22348087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosSampleShadingRenderCase::IterateResult SampleShadingRenderCase::iterate()
22448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
22548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	TestLog&			  log  = m_testCtx.getLog();
22648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const glw::Functions& gl   = m_context.getRenderContext().getFunctions();
22748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	bool				  isOk = true;
22848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
22948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (m_glslVersion == glu::GLSL_VERSION_310_ES &&
23048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		!m_context.getContextInfo().isExtensionSupported("GL_OES_sample_shading"))
23148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
23248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "GL_OES_sample_shading");
23348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return STOP;
23448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
23548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (!m_extension.empty() && !m_context.getContextInfo().isExtensionSupported(m_extension.c_str()))
23648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
23748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, m_extension.c_str());
23848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		return STOP;
23948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
24048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
24148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_pGLMinSampleShading = gl.minSampleShading;
24248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
24348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLint maxSamples = 0;
24448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (((m_texFormat.type == tcu::TextureFormat::FLOAT) && (m_texFormat.order == tcu::TextureFormat::RGBA)) ||
24548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		((m_texFormat.type == tcu::TextureFormat::FLOAT) && (m_texFormat.order == tcu::TextureFormat::RG)) ||
24648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		((m_texFormat.type == tcu::TextureFormat::FLOAT) && (m_texFormat.order == tcu::TextureFormat::R)) ||
24748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		((m_texFormat.type == tcu::TextureFormat::HALF_FLOAT) && (m_texFormat.order == tcu::TextureFormat::RGBA)))
24848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
24948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.getInternalformativ(GL_TEXTURE_2D_MULTISAMPLE, m_internalFormat, GL_SAMPLES, 1, &maxSamples);
25048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (maxSamples == 0)
25148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
25248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_testCtx.setTestResult(QP_TEST_RESULT_NOT_SUPPORTED, "Multisample is not supported on this format");
25348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			return STOP;
25448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
25548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
25648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else if (m_texFormat.type == tcu::TextureFormat::SIGNED_INT8 ||
25748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			 m_texFormat.type == tcu::TextureFormat::UNSIGNED_INT8)
25848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
25948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.getIntegerv(GL_MAX_INTEGER_SAMPLES, &maxSamples);
26048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
26148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
26248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
26348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.getIntegerv(GL_MAX_SAMPLES, &maxSamples);
26448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
26548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLint samples = de::min<GLint>(maxSamples, MAX_SAMPLES);
26648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
26748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint tex;
26848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genTextures(1, &tex);
26948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, tex);
27048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.texStorage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, m_internalFormat, WIDTH, HEIGHT, GL_FALSE);
27148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
27248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint fboMs;
27348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genFramebuffers(1, &fboMs);
27448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindFramebuffer(GL_FRAMEBUFFER, fboMs);
27548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, tex, 0);
27648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.viewport(0, 0, WIDTH, HEIGHT);
27748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
27848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_pGLMinSampleShading(m_sampleShading);
27948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.enable(GL_SAMPLE_SHADING_OES);
28048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
28148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	static const deUint16 quadIndices[] = { 0, 1, 2, 2, 1, 3 };
28248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
28348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
28448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		static char const* vss = "${VERSION_DECL}\n"
28548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 "in highp vec2 a_position;\n"
28648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 "in highp vec4 a_color;\n"
28748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 "out highp vec4 v_color;\n"
28848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 "void main (void)\n"
28948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 "{\n"
29048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 "   gl_Position = vec4(a_position, 0.0, 1.0);\n"
29148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 "   v_color = a_color;\n"
29248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 "}\n";
29348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
29448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		static char const* fss = "${VERSION_DECL}\n"
29548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 "in highp vec4 v_color;\n"
29648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 "layout(location = 0) out highp ${OUT_TYPE} o_color;\n"
29748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 "void main (void)\n"
29848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 "{\n"
29948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 "   o_color = ${OUT_TYPE}(v_color.x, v_color.y, 0.0, 0.0);\n"
30048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 "}\n";
30148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
30248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glu::ShaderProgram program(
30348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getRenderContext(),
30448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glu::makeVtxFragSources(specializeVersion(vss, m_glslVersion, m_sampler, m_outType).c_str(),
30548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									specializeVersion(fss, m_glslVersion, m_sampler, m_outType).c_str()));
30648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		log << program;
30748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!program.isOk())
30848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
30948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			TCU_FAIL("Compile failed");
31048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
31148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
31248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const float position[] = {
31348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			-1.0f, -1.0f, -1.0f, +1.0f, +1.0f, -1.0f, +1.0f, +1.0f,
31448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		};
31548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		const float color[] = {
31648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_min, m_min, 0.0f, 1.0f, m_min, m_max, 0.0f, 1.0f, m_max, m_min, 0.0f, 1.0f, m_max, m_max, 0.0f, 1.0f,
31748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		};
31848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
31948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.useProgram(program.getProgram());
32048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
32148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glu::VertexArrayBinding vertexArrays[] = {
32248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glu::va::Float("a_position", 2, 4, 0, &position[0]), glu::va::Float("a_color", 4, 4, 0, &color[0]),
32348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		};
32448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glu::draw(m_context.getRenderContext(), program.getProgram(), DE_LENGTH_OF_ARRAY(vertexArrays),
32548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				  &vertexArrays[0], glu::pr::TriangleStrip(DE_LENGTH_OF_ARRAY(quadIndices), &quadIndices[0]));
32648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
32748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "Draw quad");
32848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
32948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_pGLMinSampleShading(0.0f);
33048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.disable(GL_SAMPLE_SHADING_OES);
33148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindFramebuffer(GL_FRAMEBUFFER, m_context.getRenderContext().getDefaultFramebuffer());
33248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.deleteFramebuffers(1, &fboMs);
33348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
33448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLsizei width = WIDTH * samples;
33548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
33648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint rbo;
33748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genRenderbuffers(1, &rbo);
33848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindRenderbuffer(GL_RENDERBUFFER, rbo);
33948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.renderbufferStorage(GL_RENDERBUFFER, m_internalFormat, width, HEIGHT);
34048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
34148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLuint fbo;
34248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.genFramebuffers(1, &fbo);
34348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindFramebuffer(GL_FRAMEBUFFER, fbo);
34448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.framebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
34548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.viewport(0, 0, width, HEIGHT);
34648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
34748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
34848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		static char const* vss = "${VERSION_DECL}\n"
34948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 "in highp vec2 a_position;\n"
35048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 "void main(void)\n"
35148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 "{\n"
35248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 "   gl_Position = vec4(a_position, 0.0, 1.0);\n"
35348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 "}\n";
35448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
35548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		static char const* fss = "${VERSION_DECL}\n"
35648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 "uniform highp ${SAMPLER} u_tex;\n"
35748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 "uniform int u_samples;\n"
35848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 "layout(location = 0) out highp ${OUT_TYPE} o_color;\n"
35948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 "void main(void)\n"
36048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 "{\n"
36148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 "   ivec2 coord = ivec2(int(gl_FragCoord.x) / u_samples, gl_FragCoord.y);\n"
36248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 "   int sampleId = int(gl_FragCoord.x) % u_samples;\n"
36348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 "   o_color = texelFetch(u_tex, coord, sampleId);\n"
36448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								 "}\n";
36548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
36648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glu::ShaderProgram program(
36748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			m_context.getRenderContext(),
36848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glu::makeVtxFragSources(specializeVersion(vss, m_glslVersion, m_sampler, m_outType).c_str(),
36948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos									specializeVersion(fss, m_glslVersion, m_sampler, m_outType).c_str()));
37048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		log << program;
37148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		if (!program.isOk())
37248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
37348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			TCU_FAIL("Compile failed");
37448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
37548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
37648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		float const position[] = {
37748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			-1.0f, -1.0f, -1.0f, +1.0f, +1.0f, -1.0f, +1.0f, +1.0f,
37848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		};
37948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
38048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.useProgram(program.getProgram());
38148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.uniform1i(gl.getUniformLocation(program.getProgram(), "u_samples"), samples);
38248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.uniform1i(gl.getUniformLocation(program.getProgram(), "u_tex"), 0);
38348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
38448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glu::VertexArrayBinding vertexArrays[] = {
38548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			glu::va::Float("a_position", 2, 4, 0, &position[0]),
38648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		};
38748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glu::draw(m_context.getRenderContext(), program.getProgram(), DE_LENGTH_OF_ARRAY(vertexArrays),
38848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				  &vertexArrays[0], glu::pr::TriangleStrip(DE_LENGTH_OF_ARRAY(quadIndices), &quadIndices[0]));
38948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
39048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		GLU_EXPECT_NO_ERROR(gl.getError(), "Draw quad");
39148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
39248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
39348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	tcu::TextureLevel	  results(m_texFormat, width, HEIGHT);
39448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	tcu::PixelBufferAccess pixels = results.getAccess();
39548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::vector<tcu::Vec4> result(pixels.getHeight() * pixels.getWidth());
39648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	int					   uniquePixels;
39748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
39848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (pixels.getFormat().type == tcu::TextureFormat::SIGNED_INT8)
39948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
40048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		std::vector<GLint> data(pixels.getHeight() * pixels.getWidth() * 4);
40148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.readPixels(0, 0, pixels.getWidth(), pixels.getHeight(), GL_RGBA_INTEGER, GL_INT, &data[0]);
40248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (unsigned int i = 0; i < data.size(); i += 4)
40348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
40448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			result[i / 4] =
40548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				tcu::Vec4((GLfloat)data[i], (GLfloat)data[i + 1], (GLfloat)data[i + 2], (GLfloat)data[i + 3]);
40648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
40748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		uniquePixels = countUniquePixels(result);
40848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
40948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else if (pixels.getFormat().type == tcu::TextureFormat::UNSIGNED_INT8)
41048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
41148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		std::vector<GLuint> data(pixels.getHeight() * pixels.getWidth() * 4);
41248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		gl.readPixels(0, 0, pixels.getWidth(), pixels.getHeight(), GL_RGBA_INTEGER, GL_UNSIGNED_INT, &data[0]);
41348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (unsigned int i = 0; i < data.size(); i += 4)
41448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
41548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			result[i / 4] =
41648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos				tcu::Vec4((GLfloat)data[i], (GLfloat)data[i + 1], (GLfloat)data[i + 2], (GLfloat)data[i + 3]);
41748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
41848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		uniquePixels = countUniquePixels(result);
41948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
42048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	else
42148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
42248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		glu::readPixels(m_context.getRenderContext(), 0, 0, pixels);
42348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		uniquePixels = countUniquePixels(pixels);
42448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
42548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	int expectedUnique = WIDTH * HEIGHT * (de::clamp(int(float(samples) * m_sampleShading), 1, samples));
42648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	if (uniquePixels < expectedUnique)
42748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
42848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		isOk = false;
42948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
43048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
43148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindFramebuffer(GL_FRAMEBUFFER, m_context.getRenderContext().getDefaultFramebuffer());
43248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.deleteFramebuffers(1, &fbo);
43348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
43448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindRenderbuffer(GL_RENDERBUFFER, 0);
43548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.deleteRenderbuffers(1, &rbo);
43648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
43748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.bindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
43848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	gl.deleteTextures(1, &tex);
43948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
44048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	m_testCtx.setTestResult(isOk ? QP_TEST_RESULT_PASS : QP_TEST_RESULT_FAIL, isOk ? "Pass" : "Fail");
44148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return STOP;
44248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
44348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
44448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosint SampleShadingRenderCase::countUniquePixels(tcu::ConstPixelBufferAccess const& pixels)
44548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
44648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::set<tcu::Vec4> uniquePixels;
44748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
44848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (int y = 0; y < pixels.getHeight(); ++y)
44948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
45048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		for (int x = 0; x < pixels.getWidth(); ++x)
45148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		{
45248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos			uniquePixels.insert(pixels.getPixel(x, y));
45348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		}
45448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
45548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
45648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return (int)uniquePixels.size();
45748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
45848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
45948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosint SampleShadingRenderCase::countUniquePixels(const std::vector<tcu::Vec4>& pixels)
46048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
46148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::set<tcu::Vec4> uniquePixels;
46248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
46348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	for (unsigned int i = 0; i < pixels.size(); ++i)
46448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	{
46548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		uniquePixels.insert(pixels[i]);
46648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	}
46748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
46848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	return (int)uniquePixels.size();
46948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
47048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
47148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass SampleShadingRenderFormatTests : public glcts::TestCaseGroup
47248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
47348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulospublic:
47448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	SampleShadingRenderFormatTests(glcts::Context& context, glu::GLSLVersion glslVersion, GLenum internalFormat,
47548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								   const char* format, tcu::TextureFormat const& texFormat, const char* sampler,
47648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos								   const char* outType, GLfloat min, GLfloat max, const char* extension = "");
47748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	~SampleShadingRenderFormatTests(void);
47848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
47948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	void init(void);
48048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
48148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosprivate:
48248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	SampleShadingRenderFormatTests(const SampleShadingTests& other);
48348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	SampleShadingRenderFormatTests& operator=(const SampleShadingTests& other);
48448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
48548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glu::GLSLVersion   m_glslVersion;
48648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLenum			   m_internalFormat;
48748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	tcu::TextureFormat m_texFormat;
48848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::string		   m_sampler;
48948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::string		   m_outType;
49048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLfloat			   m_min;
49148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	GLfloat			   m_max;
49248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	std::string		   m_extension;
49348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
49448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
49548087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosSampleShadingRenderFormatTests::SampleShadingRenderFormatTests(Context& context, glu::GLSLVersion glslVersion,
49648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															   GLenum internalFormat, const char* format,
49748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															   tcu::TextureFormat const& texFormat, const char* sampler,
49848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															   const char* outType, GLfloat min, GLfloat max,
49948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos															   const char* extension)
50048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TestCaseGroup(context, format, "")
50148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_glslVersion(glslVersion)
50248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_internalFormat(internalFormat)
50348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_texFormat(texFormat)
50448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_sampler(sampler)
50548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_outType(outType)
50648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_min(min)
50748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_max(max)
50848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	, m_extension(extension)
50948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
51048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
51148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
51248087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosSampleShadingRenderFormatTests::~SampleShadingRenderFormatTests(void)
51348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
51448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
51548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
51648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid SampleShadingRenderFormatTests::init(void)
51748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
51848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	// sample_shading.render.full
51948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new SampleShadingRenderCase(m_context, "full", "Sample shader functionality", m_glslVersion,
52048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										 m_internalFormat, m_texFormat, m_sampler.c_str(), m_outType.c_str(), m_min,
52148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										 m_max, m_extension.c_str(), 1.0));
52248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	// sample_shading.render.half
52348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new SampleShadingRenderCase(m_context, "half", "Sample shader functionality", m_glslVersion,
52448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										 m_internalFormat, m_texFormat, m_sampler.c_str(), m_outType.c_str(), m_min,
52548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										 m_max, m_extension.c_str(), 0.5));
52648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	// sample_shading.render.none
52748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new SampleShadingRenderCase(m_context, "none", "Sample shader functionality", m_glslVersion,
52848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										 m_internalFormat, m_texFormat, m_sampler.c_str(), m_outType.c_str(), m_min,
52948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos										 m_max, m_extension.c_str(), 0.0));
53048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
53148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
53248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosclass SampleShadingRenderTests : public glcts::TestCaseGroup
53348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
53448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulospublic:
53548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	SampleShadingRenderTests(glcts::Context& context, glu::GLSLVersion glslVersion);
53648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	~SampleShadingRenderTests(void);
53748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
53848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	void init(void);
53948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
54048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosprivate:
54148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	SampleShadingRenderTests(const SampleShadingTests& other);
54248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	SampleShadingRenderTests& operator=(const SampleShadingTests& other);
54348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
54448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	glu::GLSLVersion m_glslVersion;
54548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos};
54648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
54748087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosSampleShadingRenderTests::SampleShadingRenderTests(Context& context, glu::GLSLVersion glslVersion)
54848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TestCaseGroup(context, "render", "Sample Shading render tests"), m_glslVersion(glslVersion)
54948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
55048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
55148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
55248087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosSampleShadingRenderTests::~SampleShadingRenderTests(void)
55348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
55448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
55548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
55648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid SampleShadingRenderTests::init(void)
55748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
55848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	// sample_shading.render.rgba8
55948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new SampleShadingRenderFormatTests(
56048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context, m_glslVersion, GL_RGBA8, "rgba8",
56148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), "sampler2DMS", "vec4", 0.0, 1.0));
56248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	// sample_shading.render.rgba8i
56348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new SampleShadingRenderFormatTests(
56448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context, m_glslVersion, GL_RGBA8I, "rgba8i",
56548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::SIGNED_INT8), "isampler2DMS", "ivec4", -128.0,
56648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		127.0));
56748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	// sample_shading.render.rgba8ui
56848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new SampleShadingRenderFormatTests(
56948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		m_context, m_glslVersion, GL_RGBA8UI, "rgba8ui",
57048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNSIGNED_INT8), "usampler2DMS", "uvec4", 0.0,
57148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		255.0));
57248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	// sample_shading.render.rgba32f
57348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	const char* extension =
57448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos		(glu::isContextTypeES(m_context.getRenderContext().getType())) ? "GL_EXT_color_buffer_float" : "";
57548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new SampleShadingRenderFormatTests(m_context, m_glslVersion, GL_RGBA32F, "rgba32f",
57648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::FLOAT),
57748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos												"sampler2DMS", "vec4", 0.0, 1.0, extension));
57848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
57948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
58048087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosSampleShadingTests::SampleShadingTests(Context& context, glu::GLSLVersion glslVersion)
58148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	: TestCaseGroup(context, "sample_shading", "Sample Shading tests"), m_glslVersion(glslVersion)
58248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
58348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
58448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
58548087f5f0eb08759ee763f98daf3b34becb74559Pyry HaulosSampleShadingTests::~SampleShadingTests(void)
58648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
58748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
58848087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
58948087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulosvoid SampleShadingTests::init(void)
59048087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos{
59148087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	// sample_shading.api
59248087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new SampleShadingApiCaseGroup(m_context, m_glslVersion));
59348087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	// sample_shading.render
59448087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos	addChild(new SampleShadingRenderTests(m_context, m_glslVersion));
59548087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos}
59648087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos
59748087f5f0eb08759ee763f98daf3b34becb74559Pyry Haulos} // glcts
598