1 /*------------------------------------------------------------------------
2 * Vulkan Conformance Tests
3 * ------------------------
5 * Copyright (c) 2015 The Khronos Group Inc.
6 * Copyright (c) 2015 Samsung Electronics Co., Ltd.
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and/or associated documentation files (the
10 * "Materials"), to deal in the Materials without restriction, including
11 * without limitation the rights to use, copy, modify, merge, publish,
12 * distribute, sublicense, and/or sell copies of the Materials, and to
13 * permit persons to whom the Materials are furnished to do so, subject to
14 * the following conditions:
16 * The above copyright notice(s) and this permission notice shall be included
17 * in all copies or substantial portions of the Materials.
19 * The Materials are Confidential Information as defined by the
20 * Khronos Membership Agreement until designated non-confidential by Khronos,
21 * at which point this condition clause shall be removed.
23 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
26 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
27 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
28 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
29 * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
33 * \brief Shader discard statement tests.
34 *//*--------------------------------------------------------------------*/
36 #include "vktShaderRenderDiscardTests.hpp"
37 #include "vktShaderRender.hpp"
38 #include "tcuStringTemplate.hpp"
39 #include "gluTexture.hpp"
43 using tcu::StringTemplate;
52 class SamplerUniformSetup : public UniformSetup
55 SamplerUniformSetup (bool useSampler)
56 : m_useSampler(useSampler)
59 virtual void setup (ShaderRenderCaseInstance& instance, const tcu::Vec4&) const
61 instance.useUniform(0u, UI_ONE);
62 instance.useUniform(1u, UI_TWO);
64 instance.useSampler2D(2u, 0u); // To the uniform binding location 2 bind the texture 0
68 const bool m_useSampler;
72 class ShaderDiscardCaseInstance : public ShaderRenderCaseInstance
75 ShaderDiscardCaseInstance (Context& context,
77 const ShaderEvaluator& evaluator,
78 const UniformSetup& uniformSetup,
80 virtual ~ShaderDiscardCaseInstance (void);
83 ShaderDiscardCaseInstance::ShaderDiscardCaseInstance (Context& context,
85 const ShaderEvaluator& evaluator,
86 const UniformSetup& uniformSetup,
88 : ShaderRenderCaseInstance (context, isVertexCase, evaluator, uniformSetup, DE_NULL)
92 de::SharedPtr<TextureBinding> brickTexture(new TextureBinding(m_context.getTestContext().getArchive(),
93 "vulkan/data/brick.png",
94 TextureBinding::TYPE_2D,
95 tcu::Sampler(tcu::Sampler::CLAMP_TO_EDGE,
96 tcu::Sampler::CLAMP_TO_EDGE,
97 tcu::Sampler::CLAMP_TO_EDGE,
99 tcu::Sampler::LINEAR)));
100 m_textures.push_back(brickTexture);
104 ShaderDiscardCaseInstance::~ShaderDiscardCaseInstance (void)
108 class ShaderDiscardCase : public ShaderRenderCase
111 ShaderDiscardCase (tcu::TestContext& testCtx,
113 const char* description,
114 const char* shaderSource,
115 const ShaderEvalFunc evalFunc,
117 virtual TestInstance* createInstance (Context& context) const
119 DE_ASSERT(m_evaluator != DE_NULL);
120 DE_ASSERT(m_uniformSetup != DE_NULL);
121 return new ShaderDiscardCaseInstance(context, m_isVertexCase, *m_evaluator, *m_uniformSetup, m_usesTexture);
125 const bool m_usesTexture;
128 ShaderDiscardCase::ShaderDiscardCase (tcu::TestContext& testCtx,
130 const char* description,
131 const char* shaderSource,
132 const ShaderEvalFunc evalFunc,
134 : ShaderRenderCase (testCtx, name, description, false, evalFunc, new SamplerUniformSetup(usesTexture), DE_NULL)
135 , m_usesTexture (usesTexture)
137 m_fragShaderSource = shaderSource;
140 "#extension GL_ARB_separate_shader_objects : enable\n"
141 "#extension GL_ARB_shading_language_420pack : enable\n"
142 "layout(location=0) in highp vec4 a_position;\n"
143 "layout(location=1) in highp vec4 a_coords;\n"
144 "layout(location=0) out mediump vec4 v_color;\n"
145 "layout(location=1) out mediump vec4 v_coords;\n\n"
148 " gl_Position = a_position;\n"
149 " v_color = vec4(a_coords.xyz, 1.0);\n"
150 " v_coords = a_coords;\n"
157 DISCARDMODE_ALWAYS = 0,
168 DISCARDTEMPLATE_MAIN_BASIC = 0,
169 DISCARDTEMPLATE_FUNCTION_BASIC,
170 DISCARDTEMPLATE_MAIN_STATIC_LOOP,
171 DISCARDTEMPLATE_MAIN_DYNAMIC_LOOP,
172 DISCARDTEMPLATE_FUNCTION_STATIC_LOOP,
177 // Evaluation functions
178 inline void evalDiscardAlways (ShaderEvalContext& c) { c.discard(); }
179 inline void evalDiscardNever (ShaderEvalContext& c) { c.color.xyz() = c.coords.swizzle(0,1,2); }
180 inline void evalDiscardDynamic (ShaderEvalContext& c) { c.color.xyz() = c.coords.swizzle(0,1,2); if (c.coords.x()+c.coords.y() > 0.0f) c.discard(); }
182 inline void evalDiscardTexture (ShaderEvalContext& c)
184 c.color.xyz() = c.coords.swizzle(0,1,2);
185 if (c.texture2D(0, c.coords.swizzle(0,1) * 0.25f + 0.5f).x() < 0.7f)
189 static ShaderEvalFunc getEvalFunc (DiscardMode mode)
193 case DISCARDMODE_ALWAYS: return evalDiscardAlways;
194 case DISCARDMODE_NEVER: return evalDiscardNever;
195 case DISCARDMODE_UNIFORM: return evalDiscardAlways;
196 case DISCARDMODE_DYNAMIC: return evalDiscardDynamic;
197 case DISCARDMODE_TEXTURE: return evalDiscardTexture;
200 return evalDiscardAlways;
204 static const char* getTemplate (DiscardTemplate variant)
206 #define GLSL_SHADER_TEMPLATE_HEADER \
208 "#extension GL_ARB_separate_shader_objects : enable\n" \
209 "#extension GL_ARB_shading_language_420pack : enable\n" \
210 "layout(location = 0) in mediump vec4 v_color;\n" \
211 "layout(location = 1) in mediump vec4 v_coords;\n" \
212 "layout(location = 0) out mediump vec4 o_color;\n" \
213 "layout(set = 0, binding = 2) uniform sampler2D ut_brick;\n" \
214 "layout(set = 0, binding = 0) uniform block0 { mediump int ui_one; };\n\n"
218 case DISCARDTEMPLATE_MAIN_BASIC:
219 return GLSL_SHADER_TEMPLATE_HEADER
222 " o_color = v_color;\n"
226 case DISCARDTEMPLATE_FUNCTION_BASIC:
227 return GLSL_SHADER_TEMPLATE_HEADER
228 "void myfunc (void)\n"
234 " o_color = v_color;\n"
238 case DISCARDTEMPLATE_MAIN_STATIC_LOOP:
239 return GLSL_SHADER_TEMPLATE_HEADER
242 " o_color = v_color;\n"
243 " for (int i = 0; i < 2; i++)\n"
250 case DISCARDTEMPLATE_MAIN_DYNAMIC_LOOP:
251 return GLSL_SHADER_TEMPLATE_HEADER
252 "layout(set = 0, binding = 1) uniform block1 { mediump int ui_two; };\n\n"
255 " o_color = v_color;\n"
256 " for (int i = 0; i < ui_two; i++)\n"
263 case DISCARDTEMPLATE_FUNCTION_STATIC_LOOP:
264 return GLSL_SHADER_TEMPLATE_HEADER
265 "void myfunc (void)\n"
267 " for (int i = 0; i < 2; i++)\n"
275 " o_color = v_color;\n"
284 #undef GLSL_SHADER_TEMPLATE_HEADER
287 static const char* getTemplateName (DiscardTemplate variant)
291 case DISCARDTEMPLATE_MAIN_BASIC: return "basic";
292 case DISCARDTEMPLATE_FUNCTION_BASIC: return "function";
293 case DISCARDTEMPLATE_MAIN_STATIC_LOOP: return "static_loop";
294 case DISCARDTEMPLATE_MAIN_DYNAMIC_LOOP: return "dynamic_loop";
295 case DISCARDTEMPLATE_FUNCTION_STATIC_LOOP: return "function_static_loop";
302 static const char* getModeName (DiscardMode mode)
306 case DISCARDMODE_ALWAYS: return "always";
307 case DISCARDMODE_NEVER: return "never";
308 case DISCARDMODE_UNIFORM: return "uniform";
309 case DISCARDMODE_DYNAMIC: return "dynamic";
310 case DISCARDMODE_TEXTURE: return "texture";
317 static const char* getTemplateDesc (DiscardTemplate variant)
321 case DISCARDTEMPLATE_MAIN_BASIC: return "main";
322 case DISCARDTEMPLATE_FUNCTION_BASIC: return "function";
323 case DISCARDTEMPLATE_MAIN_STATIC_LOOP: return "static loop";
324 case DISCARDTEMPLATE_MAIN_DYNAMIC_LOOP: return "dynamic loop";
325 case DISCARDTEMPLATE_FUNCTION_STATIC_LOOP: return "static loop in function";
332 static const char* getModeDesc (DiscardMode mode)
336 case DISCARDMODE_ALWAYS: return "Always discard";
337 case DISCARDMODE_NEVER: return "Never discard";
338 case DISCARDMODE_UNIFORM: return "Discard based on uniform value";
339 case DISCARDMODE_DYNAMIC: return "Discard based on varying values";
340 case DISCARDMODE_TEXTURE: return "Discard based on texture value";
347 de::MovePtr<ShaderDiscardCase> makeDiscardCase (tcu::TestContext& testCtx, DiscardTemplate tmpl, DiscardMode mode)
349 StringTemplate shaderTemplate(getTemplate(tmpl));
351 std::map<std::string, std::string> params;
355 case DISCARDMODE_ALWAYS: params["DISCARD"] = "discard"; break;
356 case DISCARDMODE_NEVER: params["DISCARD"] = "if (false) discard"; break;
357 case DISCARDMODE_UNIFORM: params["DISCARD"] = "if (ui_one > 0) discard"; break;
358 case DISCARDMODE_DYNAMIC: params["DISCARD"] = "if (v_coords.x+v_coords.y > 0.0) discard"; break;
359 case DISCARDMODE_TEXTURE: params["DISCARD"] = "if (texture(ut_brick, v_coords.xy*0.25+0.5).x < 0.7) discard"; break;
365 std::string name = std::string(getTemplateName(tmpl)) + "_" + getModeName(mode);
366 std::string description = std::string(getModeDesc(mode)) + " in " + getTemplateDesc(tmpl);
368 return de::MovePtr<ShaderDiscardCase>(new ShaderDiscardCase(testCtx, name.c_str(), description.c_str(), shaderTemplate.specialize(params).c_str(), getEvalFunc(mode), mode == DISCARDMODE_TEXTURE));
371 class ShaderDiscardTests : public tcu::TestCaseGroup
374 ShaderDiscardTests (tcu::TestContext& textCtx);
375 virtual ~ShaderDiscardTests (void);
377 virtual void init (void);
380 ShaderDiscardTests (const ShaderDiscardTests&); // not allowed!
381 ShaderDiscardTests& operator= (const ShaderDiscardTests&); // not allowed!
384 ShaderDiscardTests::ShaderDiscardTests (tcu::TestContext& testCtx)
385 : TestCaseGroup(testCtx, "discard", "Discard statement tests")
389 ShaderDiscardTests::~ShaderDiscardTests (void)
393 void ShaderDiscardTests::init (void)
395 for (int tmpl = 0; tmpl < DISCARDTEMPLATE_LAST; tmpl++)
396 for (int mode = 0; mode < DISCARDMODE_LAST; mode++)
397 addChild(makeDiscardCase(m_testCtx, (DiscardTemplate)tmpl, (DiscardMode)mode).release());
402 tcu::TestCaseGroup* createDiscardTests (tcu::TestContext& testCtx)
404 return new ShaderDiscardTests(testCtx);