blob: 6120d7c5fd8e27126a4233f1afc521c9774e3a22 [file] [log] [blame] [edit]
//
// 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_