Path: blob/main_old/src/tests/compiler_tests/EXT_YUV_target_test.cpp
1693 views
//1// Copyright 2017 The ANGLE Project Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file.4//5// EXT_YUV_target.cpp:6// Test for EXT_YUV_target implementation.7//89#include "tests/test_utils/ShaderExtensionTest.h"1011using EXTYUVTargetTest = sh::ShaderExtensionTest;1213namespace14{15const char EXTYTPragma[] = "#extension GL_EXT_YUV_target : require\n";1617const char ESSL300_SimpleShader[] =18"precision mediump float;\n"19"uniform __samplerExternal2DY2YEXT uSampler;\n"20"out vec4 fragColor;\n"21"void main() { \n"22" fragColor = vec4(1.0);\n"23"}\n";2425// Shader that samples the texture and writes to FragColor.26const char ESSL300_FragColorShader[] =27"precision mediump float;\n"28"uniform __samplerExternal2DY2YEXT uSampler;\n"29"layout(yuv) out vec4 fragColor;\n"30"void main() { \n"31" fragColor = texture(uSampler, vec2(0.0));\n"32"}\n";3334// Shader that specifies yuv layout qualifier multiple times.35const char ESSL300_YUVQualifierMultipleTimesShader[] =36"precision mediump float;\n"37"layout(yuv, yuv, yuv) out vec4 fragColor;\n"38"void main() { \n"39"}\n";4041// Shader that specifies yuv layout qualifier for not output fails to compile.42const char ESSL300_YUVQualifierFailureShader1[] =43"precision mediump float;\n"44"layout(yuv) in vec4 fragColor;\n"45"void main() { \n"46"}\n";4748const char ESSL300_YUVQualifierFailureShader2[] =49"precision mediump float;\n"50"layout(yuv) uniform;\n"51"layout(yuv) uniform Transform {\n"52" mat4 M1;\n"53"}\n"54"void main() { \n"55"}\n";5657// Shader that specifies yuv layout qualifier with location fails to compile.58const char ESSL300_LocationAndYUVFailureShader[] =59"precision mediump float;\n"60"layout(location = 0, yuv) out vec4 fragColor;\n"61"void main() { \n"62"}\n";6364// Shader that specifies yuv layout qualifier with multiple color outputs fails to compile.65const char ESSL300_MultipleColorAndYUVOutputsFailureShader1[] =66"precision mediump float;\n"67"layout(yuv) out vec4 fragColor;\n"68"layout out vec4 fragColor1;\n"69"void main() { \n"70"}\n";7172const char ESSL300_MultipleColorAndYUVOutputsFailureShader2[] =73"precision mediump float;\n"74"layout(yuv) out vec4 fragColor;\n"75"layout(location = 1) out vec4 fragColor1;\n"76"void main() { \n"77"}\n";7879// Shader that specifies yuv layout qualifier with depth output fails to compile.80const char ESSL300_DepthAndYUVOutputsFailureShader[] =81"precision mediump float;\n"82"layout(yuv) out vec4 fragColor;\n"83"void main() { \n"84" gl_FragDepth = 1.0f;\n"85"}\n";8687// Shader that specifies yuv layout qualifier with multiple outputs fails to compile.88const char ESSL300_MultipleYUVOutputsFailureShader[] =89"precision mediump float;\n"90"layout(yuv) out vec4 fragColor;\n"91"layout(yuv) out vec4 fragColor1;\n"92"void main() { \n"93"}\n";9495// Shader that specifies yuvCscStandartEXT type and associated values.96const char ESSL300_YuvCscStandardEXTShader[] =97R"(precision mediump float;98yuvCscStandardEXT;99yuvCscStandardEXT conv;100yuvCscStandardEXT conv1 = itu_601;101yuvCscStandardEXT conv2 = itu_601_full_range;102yuvCscStandardEXT conv3 = itu_709;103const yuvCscStandardEXT conv4 = itu_709;104105uniform int u;106out vec4 my_color;107108yuvCscStandardEXT conv_standard()109{110switch(u)111{112case 1:113return conv1;114case 2:115return conv2;116case 3:117return conv3;118default:119return conv;120}121}122bool is_itu_601(inout yuvCscStandardEXT csc)123{124csc = itu_601;125return csc == itu_601;126}127bool is_itu_709(yuvCscStandardEXT csc)128{129return csc == itu_709;130}131void main()132{133yuvCscStandardEXT conv = conv_standard();134bool csc_check1 = is_itu_601(conv);135bool csc_check2 = is_itu_709(itu_709);136if (csc_check1 && csc_check2) {137my_color = vec4(0, 1, 0, 1);138}139})";140141// Shader that specifies yuvCscStandartEXT type constructor fails to compile.142const char ESSL300_YuvCscStandartdEXTConstructFailureShader1[] =143"precision mediump float;\n"144"yuvCscStandardEXT conv = yuvCscStandardEXT();\n"145"void main() { \n"146"}\n";147148const char ESSL300_YuvCscStandartdEXTConstructFailureShader2[] =149"precision mediump float;\n"150"yuvCscStandardEXT conv = yuvCscStandardEXT(itu_601);\n"151"void main() { \n"152"}\n";153154// Shader that specifies yuvCscStandartEXT type conversion fails to compile.155const char ESSL300_YuvCscStandartdEXTConversionFailureShader1[] =156"precision mediump float;\n"157"yuvCscStandardEXT conv = false;\n"158"void main() { \n"159"}\n";160161const char ESSL300_YuvCscStandartdEXTConversionFailureShader2[] =162"precision mediump float;\n"163"yuvCscStandardEXT conv = 0;\n"164"void main() { \n"165"}\n";166167const char ESSL300_YuvCscStandartdEXTConversionFailureShader3[] =168"precision mediump float;\n"169"yuvCscStandardEXT conv = 2.0f;\n"170"void main() { \n"171"}\n";172173const char ESSL300_YuvCscStandartdEXTConversionFailureShader4[] =174"precision mediump float;\n"175"yuvCscStandardEXT conv = itu_601 | itu_709;\n"176"void main() { \n"177"}\n";178179const char ESSL300_YuvCscStandartdEXTConversionFailureShader5[] =180"precision mediump float;\n"181"yuvCscStandardEXT conv = itu_601 & 3.0f;\n"182"void main() { \n"183"}\n";184185// Shader that specifies yuvCscStandartEXT type qualifiers fails to compile.186const char ESSL300_YuvCscStandartdEXTQualifiersFailureShader1[] =187"precision mediump float;\n"188"in yuvCscStandardEXT conv = itu_601;\n"189"void main() { \n"190"}\n";191192const char ESSL300_YuvCscStandartdEXTQualifiersFailureShader2[] =193"precision mediump float;\n"194"out yuvCscStandardEXT conv = itu_601;\n"195"void main() { \n"196"}\n";197198const char ESSL300_YuvCscStandartdEXTQualifiersFailureShader3[] =199"precision mediump float;\n"200"uniform yuvCscStandardEXT conv = itu_601;\n"201"void main() { \n"202"}\n";203204// Shader that specifies yuv_to_rgb() and rgb_to_yuv() built-in functions.205const char ESSL300_BuiltInFunctionsShader[] =206R"(precision mediump float;207yuvCscStandardEXT conv = itu_601;208209out vec4 my_color;210211void main()212{213vec3 yuv = rgb_2_yuv(vec3(0.0f), conv);214vec3 rgb = yuv_2_rgb(yuv, itu_601);215my_color = vec4(rgb, 1.0);216})";217218const char ESSL300_OverloadRgb2Yuv[] =219R"(precision mediump float;220float rgb_2_yuv(float x) { return x + 1.0; }221222in float i;223out float o;224225void main()226{227o = rgb_2_yuv(i);228})";229230const char ESSL300_OverloadYuv2Rgb[] =231R"(precision mediump float;232float yuv_2_rgb(float x) { return x + 1.0; }233234in float i;235out float o;236237void main()238{239o = yuv_2_rgb(i);240})";241242// Extension flag is required to compile properly. Expect failure when it is243// not present.244TEST_P(EXTYUVTargetTest, CompileFailsWithoutExtension)245{246mResources.EXT_YUV_target = 0;247InitializeCompiler();248EXPECT_FALSE(TestShaderCompile(EXTYTPragma));249}250251// Extension directive is required to compile properly. Expect failure when252// it is not present.253TEST_P(EXTYUVTargetTest, CompileFailsWithExtensionWithoutPragma)254{255mResources.EXT_YUV_target = 1;256InitializeCompiler();257EXPECT_FALSE(TestShaderCompile(""));258}259260// With extension flag and extension directive, compiling succeeds.261// Also test that the extension directive state is reset correctly.262TEST_P(EXTYUVTargetTest, CompileSucceedsWithExtensionAndPragma)263{264mResources.EXT_YUV_target = 1;265InitializeCompiler();266EXPECT_TRUE(TestShaderCompile(EXTYTPragma));267// Test reset functionality.268EXPECT_FALSE(TestShaderCompile(""));269EXPECT_TRUE(TestShaderCompile(EXTYTPragma));270}271272INSTANTIATE_TEST_SUITE_P(CorrectVariantsWithExtensionAndPragma,273EXTYUVTargetTest,274Combine(Values(SH_GLES3_SPEC),275Values(sh::ESSLVersion300),276Values(ESSL300_SimpleShader, ESSL300_FragColorShader)));277278class EXTYUVTargetCompileSuccessTest : public EXTYUVTargetTest279{};280281TEST_P(EXTYUVTargetCompileSuccessTest, CompileSucceeds)282{283// Expect compile success.284mResources.EXT_YUV_target = 1;285InitializeCompiler();286EXPECT_TRUE(TestShaderCompile(EXTYTPragma));287}288289INSTANTIATE_TEST_SUITE_P(CorrectESSL300Shaders,290EXTYUVTargetCompileSuccessTest,291Combine(Values(SH_GLES3_SPEC),292Values(sh::ESSLVersion300),293Values(ESSL300_FragColorShader,294ESSL300_YUVQualifierMultipleTimesShader,295ESSL300_YuvCscStandardEXTShader,296ESSL300_BuiltInFunctionsShader)));297298class EXTYUVTargetCompileFailureTest : public EXTYUVTargetTest299{};300301TEST_P(EXTYUVTargetCompileFailureTest, CompileFails)302{303// Expect compile failure due to shader error, with shader having correct pragma.304mResources.EXT_YUV_target = 1;305InitializeCompiler();306EXPECT_FALSE(TestShaderCompile(EXTYTPragma));307}308309INSTANTIATE_TEST_SUITE_P(IncorrectESSL300Shaders,310EXTYUVTargetCompileFailureTest,311Combine(Values(SH_GLES3_SPEC),312Values(sh::ESSLVersion300),313Values(ESSL300_YUVQualifierFailureShader1,314ESSL300_YUVQualifierFailureShader2,315ESSL300_LocationAndYUVFailureShader,316ESSL300_MultipleColorAndYUVOutputsFailureShader1,317ESSL300_MultipleColorAndYUVOutputsFailureShader2,318ESSL300_DepthAndYUVOutputsFailureShader,319ESSL300_MultipleYUVOutputsFailureShader,320ESSL300_YuvCscStandartdEXTConstructFailureShader1,321ESSL300_YuvCscStandartdEXTConstructFailureShader2,322ESSL300_YuvCscStandartdEXTConversionFailureShader1,323ESSL300_YuvCscStandartdEXTConversionFailureShader2,324ESSL300_YuvCscStandartdEXTConversionFailureShader3,325ESSL300_YuvCscStandartdEXTConversionFailureShader4,326ESSL300_YuvCscStandartdEXTConversionFailureShader5,327ESSL300_YuvCscStandartdEXTQualifiersFailureShader1,328ESSL300_YuvCscStandartdEXTQualifiersFailureShader2,329ESSL300_YuvCscStandartdEXTQualifiersFailureShader3)));330331class EXTYUVNotEnabledTest : public EXTYUVTargetTest332{};333334TEST_P(EXTYUVNotEnabledTest, CanOverloadConversions)335{336// Expect compile success with a shader that overloads functions in the EXT_YUV_target337// extension.338mResources.EXT_YUV_target = 0;339InitializeCompiler();340EXPECT_TRUE(TestShaderCompile(""));341}342343INSTANTIATE_TEST_SUITE_P(CoreESSL300Shaders,344EXTYUVNotEnabledTest,345Combine(Values(SH_GLES3_SPEC),346Values(sh::ESSLVersion300),347Values(ESSL300_OverloadRgb2Yuv, ESSL300_OverloadYuv2Rgb)));348349} // namespace350351352