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