| // |
| // Copyright 2025 The ANGLE Project Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| // CompilerTest.h: |
| // Helpers to test shader validation and translated output. |
| // |
| |
| #ifndef TESTS_TEST_UTILS_COMPILER_TEST_H_ |
| #define TESTS_TEST_UTILS_COMPILER_TEST_H_ |
| |
| #include "test_utils/ANGLETest.h" |
| |
| class CompiledShader |
| { |
| public: |
| ~CompiledShader(); |
| |
| // Compile the source and return the GL shader object. |
| // |
| // If compilation is successful, the return value will be non-zero and mTranslatedSource will |
| // contain the translated source if ANGLE_translated_shader_source is supported. Note that with |
| // SPIR-V, the translated source is mostly hex numbers, so the test pretends the extension is |
| // not supported in that case. If compilation fails, 0 is returned. |
| // |
| // In either case, the compiler's logs are placed in mInfoLog. |
| GLuint compile(GLenum type, const char *source); |
| void destroy(); |
| |
| bool success() const { return mShader != 0; } |
| GLuint getShader() const { return mShader; } |
| const std::string &getInfoLog() const { return mInfoLog; } |
| const std::string &getTranslatedSource() const { return mTranslatedSource; } |
| |
| // Returns true if the expected message is found in the info log. |
| bool hasInfoLog(const char *expect) const; |
| |
| // Returns true if either the translated source does not exist or it contains this substring. |
| bool verifyInTranslatedSource(const char *expect) const; |
| // Returns true if either the translated source does not exist or it does not contains this |
| // substring. |
| bool verifyNotInTranslatedSource(const char *expect) const; |
| // Returns true if either the translated source does not exist or it contains this substring |
| // exactly N times. |
| bool verifyCountInTranslatedSource(const char *expect, size_t expectCount) const; |
| |
| private: |
| std::string mInfoLog; |
| std::string mTranslatedSource; |
| GLuint mShader = 0; |
| }; |
| |
| class CompilerTest : public ANGLETest<> |
| { |
| public: |
| CompilerTest() |
| { |
| setWindowWidth(128); |
| setWindowHeight(128); |
| setConfigRedBits(8); |
| setConfigGreenBits(8); |
| setConfigBlueBits(8); |
| setConfigAlphaBits(8); |
| } |
| |
| void reset(); |
| |
| const CompiledShader &compile(GLenum type, const char *source); |
| CompiledShader &getCompiledShader(GLenum type); |
| |
| // Link the compiled shaders into a program, and return it. The focus of this class is the |
| // shader compiler, so if asked to link, it assumes that link is going to succeed. |
| GLuint link(); |
| |
| protected: |
| void testSetUp() override; |
| void testTearDown() override; |
| |
| private: |
| CompiledShader mVertexShader; |
| CompiledShader mTessellationControlShader; |
| CompiledShader mTessellationEvaluationShader; |
| CompiledShader mGeometryShader; |
| CompiledShader mFragmentShader; |
| CompiledShader mComputeShader; |
| |
| GLuint mProgram = 0; |
| }; |
| |
| #endif // TESTS_TEST_UTILS_COMPILER_TEST_H_ |