12185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal/*------------------------------------------------------------------------
23c17bc60af5c131488c834c64851a00449e4ef59Peter Gal * Vulkan Conformance Tests
33c17bc60af5c131488c834c64851a00449e4ef59Peter Gal * ------------------------
43c17bc60af5c131488c834c64851a00449e4ef59Peter Gal *
52185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal * Copyright (c) 2015 The Khronos Group Inc.
62185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal * Copyright (c) 2015 Samsung Electronics Co., Ltd.
7c05b7f1437e619205c96eaa31c0b79ec97a0d47dPyry Haulos * Copyright (c) 2016 The Android Open Source Project
82185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal *
9978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Licensed under the Apache License, Version 2.0 (the "License");
10978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * you may not use this file except in compliance with the License.
11978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * You may obtain a copy of the License at
122185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal *
13978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos *      http://www.apache.org/licenses/LICENSE-2.0
142185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal *
15978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * Unless required by applicable law or agreed to in writing, software
16978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * distributed under the License is distributed on an "AS IS" BASIS,
17978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * See the License for the specific language governing permissions and
19978d3d585aa549eb1e729b51e9d85fc6477240f9Pyry Haulos * limitations under the License.
202185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal *
212185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal *//*!
222185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal * \file
232185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal * \brief Shader discard statement tests.
242185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal *//*--------------------------------------------------------------------*/
252185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
26c5a432af8404a1620230c8b0f31bc9a469196726Peter Gal#include "vktShaderRenderDiscardTests.hpp"
2713086ecc37fec225c6b7ac7980b86255c862cc81Pyry Haulos#include "vktShaderRender.hpp"
282185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal#include "tcuStringTemplate.hpp"
292185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal#include "gluTexture.hpp"
302185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
312185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal#include <string>
322185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
332185af86a083b44632c83a4dcd095af6b3c3757ePeter Galusing tcu::StringTemplate;
342185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
352185af86a083b44632c83a4dcd095af6b3c3757ePeter Galnamespace vkt
362185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal{
37c5a432af8404a1620230c8b0f31bc9a469196726Peter Galnamespace sr
382185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal{
39a9345461f31dc15bdb79875cdd701ff1f20297bdPeter Galnamespace
40a9345461f31dc15bdb79875cdd701ff1f20297bdPeter Gal{
412185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
422185af86a083b44632c83a4dcd095af6b3c3757ePeter Galclass SamplerUniformSetup : public UniformSetup
432185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal{
442185af86a083b44632c83a4dcd095af6b3c3757ePeter Galpublic:
45a9345461f31dc15bdb79875cdd701ff1f20297bdPeter Gal						SamplerUniformSetup			(bool useSampler)
462185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal							: m_useSampler(useSampler)
472185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal						{}
482185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
49a9345461f31dc15bdb79875cdd701ff1f20297bdPeter Gal	virtual void		setup						 (ShaderRenderCaseInstance& instance, const tcu::Vec4&) const
502185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal						{
512185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal							instance.useUniform(0u, UI_ONE);
522185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal							instance.useUniform(1u, UI_TWO);
532185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal							if (m_useSampler)
5430ce08903679a18155ace4ae14042f8af01261c1Akos Dirner								instance.useSampler(2u, 0u); // To the uniform binding location 2 bind the texture 0
552185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal						}
562185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
572185af86a083b44632c83a4dcd095af6b3c3757ePeter Galprivate:
5894128dffb454628346f09bb736e0f4ace9df0b9ePyry Haulos	const bool			m_useSampler;
592185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal};
602185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
612185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
622185af86a083b44632c83a4dcd095af6b3c3757ePeter Galclass ShaderDiscardCaseInstance : public ShaderRenderCaseInstance
632185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal{
642185af86a083b44632c83a4dcd095af6b3c3757ePeter Galpublic:
65fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal						ShaderDiscardCaseInstance	(Context&				context,
66a9345461f31dc15bdb79875cdd701ff1f20297bdPeter Gal													bool					isVertexCase,
67a9345461f31dc15bdb79875cdd701ff1f20297bdPeter Gal													const ShaderEvaluator&	evaluator,
68fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal													const UniformSetup&		uniformSetup,
69a9345461f31dc15bdb79875cdd701ff1f20297bdPeter Gal													bool					usesTexture);
702185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	virtual				~ShaderDiscardCaseInstance	(void);
712185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal};
722185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
73fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter GalShaderDiscardCaseInstance::ShaderDiscardCaseInstance (Context&					context,
74a9345461f31dc15bdb79875cdd701ff1f20297bdPeter Gal													 bool						isVertexCase,
75a9345461f31dc15bdb79875cdd701ff1f20297bdPeter Gal													 const ShaderEvaluator&		evaluator,
76fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal													 const UniformSetup&		uniformSetup,
77a9345461f31dc15bdb79875cdd701ff1f20297bdPeter Gal													 bool						usesTexture)
78a9345461f31dc15bdb79875cdd701ff1f20297bdPeter Gal	: ShaderRenderCaseInstance	(context, isVertexCase, evaluator, uniformSetup, DE_NULL)
792185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal{
80baa4bb8dff87dc81ad289516e0b82027b8d7d7c2Peter Gal	if (usesTexture)
812185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	{
823038af220852000e643054412d14679c61d58838Peter Gal		de::SharedPtr<TextureBinding> brickTexture(new TextureBinding(m_context.getTestContext().getArchive(),
833038af220852000e643054412d14679c61d58838Peter Gal																	  "vulkan/data/brick.png",
843038af220852000e643054412d14679c61d58838Peter Gal																	  TextureBinding::TYPE_2D,
853038af220852000e643054412d14679c61d58838Peter Gal																	  tcu::Sampler(tcu::Sampler::CLAMP_TO_EDGE,
863038af220852000e643054412d14679c61d58838Peter Gal																					tcu::Sampler::CLAMP_TO_EDGE,
873038af220852000e643054412d14679c61d58838Peter Gal																					tcu::Sampler::CLAMP_TO_EDGE,
883038af220852000e643054412d14679c61d58838Peter Gal																					tcu::Sampler::LINEAR,
893038af220852000e643054412d14679c61d58838Peter Gal																					tcu::Sampler::LINEAR)));
903038af220852000e643054412d14679c61d58838Peter Gal		m_textures.push_back(brickTexture);
912185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	}
922185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal}
932185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
942185af86a083b44632c83a4dcd095af6b3c3757ePeter GalShaderDiscardCaseInstance::~ShaderDiscardCaseInstance (void)
952185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal{
962185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal}
972185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
983bb836ef57cb5b8ddd048eec9817acd9f6ea2d26Peter Galclass ShaderDiscardCase : public ShaderRenderCase
992185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal{
1002185af86a083b44632c83a4dcd095af6b3c3757ePeter Galpublic:
101fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal							ShaderDiscardCase			(tcu::TestContext&		testCtx,
102fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal														 const char*			name,
103fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal														 const char*			description,
104fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal														 const char*			shaderSource,
105fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal														 const ShaderEvalFunc	evalFunc,
106a9345461f31dc15bdb79875cdd701ff1f20297bdPeter Gal														 bool					usesTexture);
107fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal	virtual TestInstance*	createInstance				(Context& context) const
1082185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal							{
1092185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal								DE_ASSERT(m_evaluator != DE_NULL);
1102185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal								DE_ASSERT(m_uniformSetup != DE_NULL);
1112185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal								return new ShaderDiscardCaseInstance(context, m_isVertexCase, *m_evaluator, *m_uniformSetup, m_usesTexture);
1122185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal							}
1132185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
1142185af86a083b44632c83a4dcd095af6b3c3757ePeter Galprivate:
115fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal	const bool				m_usesTexture;
1162185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal};
1172185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
118fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter GalShaderDiscardCase::ShaderDiscardCase (tcu::TestContext&		testCtx,
119fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal									  const char*			name,
120fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal									  const char*			description,
121fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal									  const char*			shaderSource,
122fd55d45dec3cf8f7dfe47f8809938da17553ffc9Peter Gal									  const ShaderEvalFunc	evalFunc,
123a9345461f31dc15bdb79875cdd701ff1f20297bdPeter Gal									  bool					usesTexture)
1242185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	: ShaderRenderCase	(testCtx, name, description, false, evalFunc, new SamplerUniformSetup(usesTexture), DE_NULL)
1252185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	, m_usesTexture		(usesTexture)
1262185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal{
1272185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	m_fragShaderSource	= shaderSource;
1282185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	m_vertShaderSource	=
129168546fb8ff28c2a81bf2dd37a5f865c3730fa2dCsaba Osztrogonác		"#version 310 es\n"
1302185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		"layout(location=0) in  highp   vec4 a_position;\n"
1312185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		"layout(location=1) in  highp   vec4 a_coords;\n"
1322185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		"layout(location=0) out mediump vec4 v_color;\n"
1332185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		"layout(location=1) out mediump vec4 v_coords;\n\n"
1342185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		"void main (void)\n"
1352185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		"{\n"
1362185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		"    gl_Position = a_position;\n"
1372185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		"    v_color = vec4(a_coords.xyz, 1.0);\n"
1382185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		"    v_coords = a_coords;\n"
1392185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		"}\n";
1402185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal}
1412185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
1422185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
1432185af86a083b44632c83a4dcd095af6b3c3757ePeter Galenum DiscardMode
1442185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal{
1452185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	DISCARDMODE_ALWAYS = 0,
1462185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	DISCARDMODE_NEVER,
1472185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	DISCARDMODE_UNIFORM,
1482185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	DISCARDMODE_DYNAMIC,
1492185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	DISCARDMODE_TEXTURE,
1502185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
1512185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	DISCARDMODE_LAST
1522185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal};
1532185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
1542185af86a083b44632c83a4dcd095af6b3c3757ePeter Galenum DiscardTemplate
1552185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal{
1562185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	DISCARDTEMPLATE_MAIN_BASIC = 0,
1572185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	DISCARDTEMPLATE_FUNCTION_BASIC,
1582185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	DISCARDTEMPLATE_MAIN_STATIC_LOOP,
1592185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	DISCARDTEMPLATE_MAIN_DYNAMIC_LOOP,
1602185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	DISCARDTEMPLATE_FUNCTION_STATIC_LOOP,
1612185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
1622185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	DISCARDTEMPLATE_LAST
1632185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal};
1642185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
1652185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal// Evaluation functions
1662185af86a083b44632c83a4dcd095af6b3c3757ePeter Galinline void evalDiscardAlways	(ShaderEvalContext& c) { c.discard(); }
1672185af86a083b44632c83a4dcd095af6b3c3757ePeter Galinline void evalDiscardNever	(ShaderEvalContext& c) { c.color.xyz() = c.coords.swizzle(0,1,2); }
1682185af86a083b44632c83a4dcd095af6b3c3757ePeter Galinline void evalDiscardDynamic	(ShaderEvalContext& c) { c.color.xyz() = c.coords.swizzle(0,1,2); if (c.coords.x()+c.coords.y() > 0.0f) c.discard(); }
1692185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
1702185af86a083b44632c83a4dcd095af6b3c3757ePeter Galinline void evalDiscardTexture (ShaderEvalContext& c)
1712185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal{
1722185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	c.color.xyz() = c.coords.swizzle(0,1,2);
1732185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	if (c.texture2D(0, c.coords.swizzle(0,1) * 0.25f + 0.5f).x() < 0.7f)
1742185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		c.discard();
1752185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal}
1762185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
1772185af86a083b44632c83a4dcd095af6b3c3757ePeter Galstatic ShaderEvalFunc getEvalFunc (DiscardMode mode)
1782185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal{
1792185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	switch (mode)
1802185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	{
1812185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDMODE_ALWAYS:	return evalDiscardAlways;
1822185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDMODE_NEVER:		return evalDiscardNever;
1832185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDMODE_UNIFORM:	return evalDiscardAlways;
1842185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDMODE_DYNAMIC:	return evalDiscardDynamic;
1852185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDMODE_TEXTURE:	return evalDiscardTexture;
1862185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		default:
1872185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal			DE_ASSERT(DE_FALSE);
1882185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal			return evalDiscardAlways;
1892185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	}
1902185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal}
1912185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
1922185af86a083b44632c83a4dcd095af6b3c3757ePeter Galstatic const char* getTemplate (DiscardTemplate variant)
1932185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal{
194a9345461f31dc15bdb79875cdd701ff1f20297bdPeter Gal	#define GLSL_SHADER_TEMPLATE_HEADER \
195168546fb8ff28c2a81bf2dd37a5f865c3730fa2dCsaba Osztrogonác				"#version 310 es\n"	\
1962185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				"layout(location = 0) in mediump vec4 v_color;\n"	\
1972185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				"layout(location = 1) in mediump vec4 v_coords;\n"	\
1982185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				"layout(location = 0) out mediump vec4 o_color;\n"	\
1992185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				"layout(set = 0, binding = 2) uniform sampler2D    ut_brick;\n"	\
2002185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				"layout(set = 0, binding = 0) uniform block0 { mediump int  ui_one; };\n\n"
2012185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
2022185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	switch (variant)
2032185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	{
2042185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDTEMPLATE_MAIN_BASIC:
205a9345461f31dc15bdb79875cdd701ff1f20297bdPeter Gal			return GLSL_SHADER_TEMPLATE_HEADER
2062185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "void main (void)\n"
2072185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "{\n"
2082185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "    o_color = v_color;\n"
2092185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "    ${DISCARD};\n"
2102185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "}\n";
2112185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
2122185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDTEMPLATE_FUNCTION_BASIC:
213a9345461f31dc15bdb79875cdd701ff1f20297bdPeter Gal			return GLSL_SHADER_TEMPLATE_HEADER
2142185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "void myfunc (void)\n"
2152185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "{\n"
2162185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "    ${DISCARD};\n"
2172185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "}\n\n"
2182185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "void main (void)\n"
2192185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "{\n"
2202185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "    o_color = v_color;\n"
2212185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "    myfunc();\n"
2222185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "}\n";
2232185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
2242185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDTEMPLATE_MAIN_STATIC_LOOP:
225a9345461f31dc15bdb79875cdd701ff1f20297bdPeter Gal			return GLSL_SHADER_TEMPLATE_HEADER
2262185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "void main (void)\n"
2272185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "{\n"
2282185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "    o_color = v_color;\n"
2292185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "    for (int i = 0; i < 2; i++)\n"
2302185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "    {\n"
2312185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "        if (i > 0)\n"
2322185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "            ${DISCARD};\n"
2332185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "    }\n"
2342185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "}\n";
2352185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
2362185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDTEMPLATE_MAIN_DYNAMIC_LOOP:
237a9345461f31dc15bdb79875cdd701ff1f20297bdPeter Gal			return GLSL_SHADER_TEMPLATE_HEADER
2382185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "layout(set = 0, binding = 1) uniform block1 { mediump int  ui_two; };\n\n"
2392185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "void main (void)\n"
2402185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "{\n"
2412185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "    o_color = v_color;\n"
2422185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "    for (int i = 0; i < ui_two; i++)\n"
2432185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "    {\n"
2442185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "        if (i > 0)\n"
2452185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "            ${DISCARD};\n"
2462185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "    }\n"
2472185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "}\n";
2482185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
2492185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDTEMPLATE_FUNCTION_STATIC_LOOP:
250a9345461f31dc15bdb79875cdd701ff1f20297bdPeter Gal			return GLSL_SHADER_TEMPLATE_HEADER
2512185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "void myfunc (void)\n"
2522185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "{\n"
2532185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "    for (int i = 0; i < 2; i++)\n"
2542185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "    {\n"
2552185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "        if (i > 0)\n"
2562185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "            ${DISCARD};\n"
2572185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "    }\n"
2582185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "}\n\n"
2592185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "void main (void)\n"
2602185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "{\n"
2612185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "    o_color = v_color;\n"
2622185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "    myfunc();\n"
2632185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal				   "}\n";
2642185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
2652185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		default:
2662185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal			DE_ASSERT(DE_FALSE);
2672185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal			return DE_NULL;
2682185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	}
2692185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
270a9345461f31dc15bdb79875cdd701ff1f20297bdPeter Gal	#undef GLSL_SHADER_TEMPLATE_HEADER
2712185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal}
2722185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
2732185af86a083b44632c83a4dcd095af6b3c3757ePeter Galstatic const char* getTemplateName (DiscardTemplate variant)
2742185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal{
2752185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	switch (variant)
2762185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	{
2772185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDTEMPLATE_MAIN_BASIC:			return "basic";
2782185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDTEMPLATE_FUNCTION_BASIC:		return "function";
2792185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDTEMPLATE_MAIN_STATIC_LOOP:		return "static_loop";
2802185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDTEMPLATE_MAIN_DYNAMIC_LOOP:		return "dynamic_loop";
2812185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDTEMPLATE_FUNCTION_STATIC_LOOP:	return "function_static_loop";
2822185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		default:
2832185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal			DE_ASSERT(DE_FALSE);
2842185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal			return DE_NULL;
2852185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	}
2862185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal}
2872185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
2882185af86a083b44632c83a4dcd095af6b3c3757ePeter Galstatic const char* getModeName (DiscardMode mode)
2892185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal{
2902185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	switch (mode)
2912185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	{
2922185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDMODE_ALWAYS:	return "always";
2932185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDMODE_NEVER:		return "never";
2942185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDMODE_UNIFORM:	return "uniform";
2952185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDMODE_DYNAMIC:	return "dynamic";
2962185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDMODE_TEXTURE:	return "texture";
2972185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		default:
2982185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal			DE_ASSERT(DE_FALSE);
2992185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal			return DE_NULL;
3002185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	}
3012185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal}
3022185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
3032185af86a083b44632c83a4dcd095af6b3c3757ePeter Galstatic const char* getTemplateDesc (DiscardTemplate variant)
3042185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal{
3052185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	switch (variant)
3062185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	{
3072185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDTEMPLATE_MAIN_BASIC:			return "main";
3082185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDTEMPLATE_FUNCTION_BASIC:		return "function";
3092185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDTEMPLATE_MAIN_STATIC_LOOP:		return "static loop";
3102185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDTEMPLATE_MAIN_DYNAMIC_LOOP:		return "dynamic loop";
3112185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDTEMPLATE_FUNCTION_STATIC_LOOP:	return "static loop in function";
3122185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		default:
3132185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal			DE_ASSERT(DE_FALSE);
3142185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal			return DE_NULL;
3152185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	}
3162185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal}
3172185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
3182185af86a083b44632c83a4dcd095af6b3c3757ePeter Galstatic const char* getModeDesc (DiscardMode mode)
3192185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal{
3202185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	switch (mode)
3212185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	{
3222185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDMODE_ALWAYS:	return "Always discard";
3232185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDMODE_NEVER:		return "Never discard";
3242185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDMODE_UNIFORM:	return "Discard based on uniform value";
3252185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDMODE_DYNAMIC:	return "Discard based on varying values";
3262185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDMODE_TEXTURE:	return "Discard based on texture value";
3272185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		default:
3282185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal			DE_ASSERT(DE_FALSE);
3292185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal			return DE_NULL;
3302185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	}
3312185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal}
3322185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
333bc5f828f01fc1f70bf680629a099820c27f9c0b3Peter Galde::MovePtr<ShaderDiscardCase> makeDiscardCase (tcu::TestContext& testCtx, DiscardTemplate tmpl, DiscardMode mode)
3342185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal{
3352185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	StringTemplate shaderTemplate(getTemplate(tmpl));
3362185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
3378ed54649f60533ea6bf5032a23c765b703735c61Peter Gal	std::map<std::string, std::string> params;
3382185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
3392185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	switch (mode)
3402185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	{
3412185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDMODE_ALWAYS:	params["DISCARD"] = "discard";										break;
3422185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDMODE_NEVER:		params["DISCARD"] = "if (false) discard";							break;
3432185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDMODE_UNIFORM:	params["DISCARD"] = "if (ui_one > 0) discard";						break;
3442185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDMODE_DYNAMIC:	params["DISCARD"] = "if (v_coords.x+v_coords.y > 0.0) discard";		break;
3452185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		case DISCARDMODE_TEXTURE:	params["DISCARD"] = "if (texture(ut_brick, v_coords.xy*0.25+0.5).x < 0.7) discard";	break;
3462185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		default:
3472185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal			DE_ASSERT(DE_FALSE);
3482185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal			break;
3492185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	}
3502185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
3518ed54649f60533ea6bf5032a23c765b703735c61Peter Gal	std::string name		= std::string(getTemplateName(tmpl)) + "_" + getModeName(mode);
3528ed54649f60533ea6bf5032a23c765b703735c61Peter Gal	std::string description	= std::string(getModeDesc(mode)) + " in " + getTemplateDesc(tmpl);
3532185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
354bc5f828f01fc1f70bf680629a099820c27f9c0b3Peter Gal	return de::MovePtr<ShaderDiscardCase>(new ShaderDiscardCase(testCtx, name.c_str(), description.c_str(), shaderTemplate.specialize(params).c_str(), getEvalFunc(mode), mode == DISCARDMODE_TEXTURE));
355bc5f828f01fc1f70bf680629a099820c27f9c0b3Peter Gal}
356a9345461f31dc15bdb79875cdd701ff1f20297bdPeter Gal
35713086ecc37fec225c6b7ac7980b86255c862cc81Pyry Haulosclass ShaderDiscardTests : public tcu::TestCaseGroup
35813086ecc37fec225c6b7ac7980b86255c862cc81Pyry Haulos{
35913086ecc37fec225c6b7ac7980b86255c862cc81Pyry Haulospublic:
36013086ecc37fec225c6b7ac7980b86255c862cc81Pyry Haulos							ShaderDiscardTests		(tcu::TestContext& textCtx);
36113086ecc37fec225c6b7ac7980b86255c862cc81Pyry Haulos	virtual					~ShaderDiscardTests		(void);
36213086ecc37fec225c6b7ac7980b86255c862cc81Pyry Haulos
36313086ecc37fec225c6b7ac7980b86255c862cc81Pyry Haulos	virtual void			init					(void);
36413086ecc37fec225c6b7ac7980b86255c862cc81Pyry Haulos
36513086ecc37fec225c6b7ac7980b86255c862cc81Pyry Haulosprivate:
36613086ecc37fec225c6b7ac7980b86255c862cc81Pyry Haulos							ShaderDiscardTests		(const ShaderDiscardTests&);		// not allowed!
36713086ecc37fec225c6b7ac7980b86255c862cc81Pyry Haulos	ShaderDiscardTests&		operator=				(const ShaderDiscardTests&);		// not allowed!
36813086ecc37fec225c6b7ac7980b86255c862cc81Pyry Haulos};
369a9345461f31dc15bdb79875cdd701ff1f20297bdPeter Gal
370a9345461f31dc15bdb79875cdd701ff1f20297bdPeter GalShaderDiscardTests::ShaderDiscardTests (tcu::TestContext& testCtx)
371a9345461f31dc15bdb79875cdd701ff1f20297bdPeter Gal	: TestCaseGroup(testCtx, "discard", "Discard statement tests")
372a9345461f31dc15bdb79875cdd701ff1f20297bdPeter Gal{
373a9345461f31dc15bdb79875cdd701ff1f20297bdPeter Gal}
374a9345461f31dc15bdb79875cdd701ff1f20297bdPeter Gal
375a9345461f31dc15bdb79875cdd701ff1f20297bdPeter GalShaderDiscardTests::~ShaderDiscardTests (void)
376a9345461f31dc15bdb79875cdd701ff1f20297bdPeter Gal{
3772185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal}
3782185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
3792185af86a083b44632c83a4dcd095af6b3c3757ePeter Galvoid ShaderDiscardTests::init (void)
3802185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal{
3812185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal	for (int tmpl = 0; tmpl < DISCARDTEMPLATE_LAST; tmpl++)
3822185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal		for (int mode = 0; mode < DISCARDMODE_LAST; mode++)
383bc5f828f01fc1f70bf680629a099820c27f9c0b3Peter Gal			addChild(makeDiscardCase(m_testCtx, (DiscardTemplate)tmpl, (DiscardMode)mode).release());
3842185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal}
3852185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal
38613086ecc37fec225c6b7ac7980b86255c862cc81Pyry Haulos} // anonymous
38713086ecc37fec225c6b7ac7980b86255c862cc81Pyry Haulos
38813086ecc37fec225c6b7ac7980b86255c862cc81Pyry Haulostcu::TestCaseGroup* createDiscardTests (tcu::TestContext& testCtx)
38913086ecc37fec225c6b7ac7980b86255c862cc81Pyry Haulos{
39013086ecc37fec225c6b7ac7980b86255c862cc81Pyry Haulos	return new ShaderDiscardTests(testCtx);
39113086ecc37fec225c6b7ac7980b86255c862cc81Pyry Haulos}
39213086ecc37fec225c6b7ac7980b86255c862cc81Pyry Haulos
393c5a432af8404a1620230c8b0f31bc9a469196726Peter Gal} // sr
3942185af86a083b44632c83a4dcd095af6b3c3757ePeter Gal} // vkt
395