Path: blob/main_old/src/tests/test_utils/ShaderCompileTreeTest.cpp
1693 views
//1// Copyright 2016 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// ShaderCompileTreeTest.cpp:6// Test that shader validation results in the correct compile status.7//89#include "tests/test_utils/ShaderCompileTreeTest.h"1011#include "compiler/translator/TranslatorESSL.h"12#include "compiler/translator/tree_util/IntermTraverse.h"1314namespace sh15{1617namespace18{1920// Checks that the node traversed is a zero node. It can be made out of multiple constructors and21// constant union nodes as long as there's no arithmetic involved and all constants are zero.22class OnlyContainsZeroConstantsTraverser final : public TIntermTraverser23{24public:25OnlyContainsZeroConstantsTraverser()26: TIntermTraverser(true, false, false), mOnlyContainsConstantZeros(true)27{}2829bool visitUnary(Visit, TIntermUnary *node) override30{31mOnlyContainsConstantZeros = false;32return false;33}3435bool visitBinary(Visit, TIntermBinary *node) override36{37mOnlyContainsConstantZeros = false;38return false;39}4041bool visitTernary(Visit, TIntermTernary *node) override42{43mOnlyContainsConstantZeros = false;44return false;45}4647bool visitSwizzle(Visit, TIntermSwizzle *node) override48{49mOnlyContainsConstantZeros = false;50return false;51}5253bool visitAggregate(Visit, TIntermAggregate *node) override54{55if (node->getOp() != EOpConstruct)56{57mOnlyContainsConstantZeros = false;58return false;59}60return true;61}6263void visitSymbol(TIntermSymbol *node) override { mOnlyContainsConstantZeros = false; }6465void visitConstantUnion(TIntermConstantUnion *node) override66{67if (!mOnlyContainsConstantZeros)68{69return;70}7172const TType &type = node->getType();73size_t objectSize = type.getObjectSize();74for (size_t i = 0u; i < objectSize && mOnlyContainsConstantZeros; ++i)75{76bool isZero = false;77switch (type.getBasicType())78{79case EbtFloat:80isZero = (node->getFConst(i) == 0.0f);81break;82case EbtInt:83isZero = (node->getIConst(i) == 0);84break;85case EbtUInt:86isZero = (node->getUConst(i) == 0u);87break;88case EbtBool:89isZero = (node->getBConst(i) == false);90break;91default:92// Cannot handle.93break;94}95if (!isZero)96{97mOnlyContainsConstantZeros = false;98return;99}100}101}102103bool onlyContainsConstantZeros() const { return mOnlyContainsConstantZeros; }104105private:106bool mOnlyContainsConstantZeros;107};108109} // anonymous namespace110111void ShaderCompileTreeTest::SetUp()112{113mAllocator.push();114SetGlobalPoolAllocator(&mAllocator);115116ShBuiltInResources resources;117sh::InitBuiltInResources(&resources);118119initResources(&resources);120121mTranslator = new TranslatorESSL(getShaderType(), getShaderSpec());122ASSERT_TRUE(mTranslator->Init(resources));123}124125void ShaderCompileTreeTest::TearDown()126{127delete mTranslator;128129SetGlobalPoolAllocator(nullptr);130mAllocator.pop();131}132133bool ShaderCompileTreeTest::compile(const std::string &shaderString)134{135const char *shaderStrings[] = {shaderString.c_str()};136mASTRoot = mTranslator->compileTreeForTesting(shaderStrings, 1, mExtraCompileOptions);137TInfoSink &infoSink = mTranslator->getInfoSink();138mInfoLog = infoSink.info.c_str();139return mASTRoot != nullptr;140}141142void ShaderCompileTreeTest::compileAssumeSuccess(const std::string &shaderString)143{144if (!compile(shaderString))145{146FAIL() << "Shader compilation into ESSL failed, log:\n" << mInfoLog;147}148}149150bool ShaderCompileTreeTest::hasWarning() const151{152return mInfoLog.find("WARNING: ") != std::string::npos;153}154155const std::vector<sh::ShaderVariable> &ShaderCompileTreeTest::getUniforms() const156{157ASSERT(mExtraCompileOptions & SH_VARIABLES);158return mTranslator->getUniforms();159}160161const std::vector<sh::ShaderVariable> &ShaderCompileTreeTest::getAttributes() const162{163ASSERT(mExtraCompileOptions & SH_VARIABLES);164return mTranslator->getAttributes();165}166167bool IsZero(TIntermNode *node)168{169if (!node->getAsTyped())170{171return false;172}173OnlyContainsZeroConstantsTraverser traverser;174node->traverse(&traverser);175return traverser.onlyContainsConstantZeros();176}177178} // namespace sh179180181