yum-mirror/glslang
git clone https://git.yummers.dev/yum-mirror/glslang
4056002e
main
1// 2// Copyright (C) 2016-2017 Google, Inc. 3// 4// All rights reserved. 5// 6// Redistribution and use in source and binary forms, with or without 7// modification, are permitted provided that the following conditions 8// are met: 9// 10// Redistributions of source code must retain the above copyright 11// notice, this list of conditions and the following disclaimer. 12// 13// Redistributions in binary form must reproduce the above 14// copyright notice, this list of conditions and the following 15// disclaimer in the documentation and/or other materials provided 16// with the distribution. 17// 18// Neither the name of Google Inc. nor the names of its 19// contributors may be used to endorse or promote products derived 20// from this software without specific prior written permission. 21// 22// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 23// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 24// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 25// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 26// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 27// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 28// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 29// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 30// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 32// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 33// POSSIBILITY OF SUCH DAMAGE. 34 35#include <memory> 36 37#include <gtest/gtest.h> 38 39#include "TestFixture.h" 40 41namespace glslangtest { 42namespace { 43 44using LinkTestVulkan = GlslangTest < 45 ::testing::TestWithParam < std::vector < std::string >>> ; 46 47TEST_P (LinkTestVulkan ,FromFile ) 48{ 49const auto & fileNames = GetParam (); 50const size_t fileCount = fileNames .size (); 51const EShMessages controls = DeriveOptions (Source ::GLSL ,Semantics ::Vulkan ,Target ::AST ); 52GlslangResult result ; 53result .validationResult = false; 54 55// Compile each input shader file. 56bool success = true; 57 std::vector < std::unique_ptr < glslang::TShader >> shaders ; 58for (size_t i = 0 ;i < fileCount ;++ i ) { 59 std::string contents ; 60tryLoadFile (GlobalTestSettings .testRoot + "/" + fileNames [i ], 61"input" ,& contents ); 62shaders .emplace_back ( 63new glslang::TShader (GetShaderStage (GetSuffix (fileNames [i ])))); 64auto * shader = shaders .back ().get (); 65shader -> setAutoMapLocations (true); 66success &=compile (shader ,contents ,"" ,controls ); 67result .shaderResults .push_back ( 68 {fileNames [i ],shader -> getInfoLog (),shader -> getInfoDebugLog ()}); 69 } 70 71// Link all of them. 72 glslang::TProgram program ; 73for (const auto & shader :shaders )program .addShader (shader .get ()); 74success &=program .link (controls ); 75result .linkingOutput = program .getInfoLog (); 76result .linkingError = program .getInfoDebugLog (); 77 78if (success ) 79program .mapIO (); 80 81if (success && (controls & EShMsgSpvRules )) { 82 spv::SpvBuildLogger logger ; 83 std::vector < uint32_t > spirv_binary ; 84options ().disableOptimizer = true; 85 glslang::GlslangToSpv (* program .getIntermediate (shaders .front ()-> getStage ()), 86spirv_binary ,& logger ,& options ()); 87 88 std::ostringstream disassembly_stream ; 89 spv::Disassemble (disassembly_stream ,spirv_binary ); 90result .spirvWarningsErrors = logger .getAllMessages (); 91result .spirv = disassembly_stream .str (); 92result .validationResult = !options ().validate || logger .getAllMessages ().empty (); 93 } 94 95 std::ostringstream stream ; 96outputResultToStream (& stream ,result ,controls ); 97 98// Check with expected results. 99const std::string expectedOutputFname = 100GlobalTestSettings .testRoot + "/baseResults/" + fileNames .front ()+ ".out" ; 101 std::string expectedOutput ; 102tryLoadFile (expectedOutputFname ,"expected output" ,& expectedOutput ); 103 104checkEqAndUpdateIfRequested (expectedOutput ,stream .str (),expectedOutputFname , 105result .spirvWarningsErrors ); 106} 107 108// clang-format off 109INSTANTIATE_TEST_SUITE_P ( 110Glsl ,LinkTestVulkan , 111 ::testing::ValuesIn (std::vector < std::vector < std::string >> ({ 112 {"link1.vk.frag" ,"link2.vk.frag" }, 113 {"spv.unit1.frag" ,"spv.unit2.frag" ,"spv.unit3.frag" }, 114 {"link.vk.matchingPC.0.0.frag" ,"link.vk.matchingPC.0.1.frag" , 115"link.vk.matchingPC.0.2.frag" }, 116 {"link.vk.differentPC.0.0.frag" ,"link.vk.differentPC.0.1.frag" , 117"link.vk.differentPC.0.2.frag" }, 118 {"link.vk.differentPC.1.0.frag" ,"link.vk.differentPC.1.1.frag" , 119"link.vk.differentPC.1.2.frag" }, 120 {"link.vk.pcNamingValid.0.0.vert" ,"link.vk.pcNamingValid.0.1.vert" }, 121 {"link.vk.pcNamingInvalid.0.0.vert" ,"link.vk.pcNamingInvalid.0.1.vert" }, 122 {"link.vk.multiBlocksValid.0.0.vert" ,"link.vk.multiBlocksValid.0.1.vert" }, 123 {"link.vk.multiBlocksValid.1.0.geom" ,"link.vk.multiBlocksValid.1.1.geom" }, 124 {"link.vk.multiUnitLayout.0.comp" ,"link.vk.multiUnitLayout.1.comp" }, 125 {"link.vk.multiUnitLayout.2.comp" ,"link.vk.multiUnitLayout.0.comp" }, 126 {"link.vk.inconsistentGLPerVertex.0.vert" ,"link.vk.inconsistentGLPerVertex.0.geom" }, 127 {"link.vk.crossStageIO.0.vert" ,"link.vk.crossStageIO.0.frag" }, 128 {"link.vk.crossStageIO.1.vert" ,"link.vk.crossStageIO.1.geom" ,"link.vk.crossStageIO.1.frag" }, 129 {"link.vk.missingCrossStageIO.0.vert" ,"link.vk.missingCrossStageIO.0.frag" }, 130 })) 131); 132// clang-format on 133 134}// anonymous namespace 135}// namespace glslangtest