~mmach/netext73/webkit2gtk

« back to all changes in this revision

Viewing changes to Source/ThirdParty/ANGLE/src/tests/compiler_tests/EmulateGLBaseVertexBaseInstance_test.cpp

  • Committer: mmach
  • Date: 2023-06-16 17:21:37 UTC
  • Revision ID: netbit73@gmail.com-20230616172137-2rqx6yr96ga9g3kp
1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
//
 
2
// Copyright 2019 The ANGLE Project Authors. All rights reserved.
 
3
// Use of this source code is governed by a BSD-style license that can be
 
4
// found in the LICENSE file.
 
5
//
 
6
// ANGLE_base_vertex_base_instance.cpp:
 
7
//   Test for ANGLE_base_vertex_base_instance extension
 
8
//
 
9
 
 
10
#include "GLSLANG/ShaderLang.h"
 
11
#include "angle_gl.h"
 
12
#include "compiler/translator/tree_ops/EmulateMultiDrawShaderBuiltins.h"
 
13
#include "gtest/gtest.h"
 
14
#include "tests/test_utils/compiler_test.h"
 
15
 
 
16
using namespace sh;
 
17
 
 
18
class EmulateGLBaseVertexBaseInstanceTest : public MatchOutputCodeTest
 
19
{
 
20
  public:
 
21
    EmulateGLBaseVertexBaseInstanceTest()
 
22
        : MatchOutputCodeTest(GL_VERTEX_SHADER, SH_VARIABLES, SH_GLSL_COMPATIBILITY_OUTPUT)
 
23
    {
 
24
        getResources()->ANGLE_base_vertex_base_instance = 1;
 
25
    }
 
26
 
 
27
  protected:
 
28
    void CheckCompileFailure(const std::string &shaderString, const char *expectedError = nullptr)
 
29
    {
 
30
        std::string translatedCode;
 
31
        std::string infoLog;
 
32
        bool success = compileTestShader(GL_VERTEX_SHADER, SH_GLES3_SPEC,
 
33
                                         SH_GLSL_COMPATIBILITY_OUTPUT, shaderString, getResources(),
 
34
                                         SH_VARIABLES, &translatedCode, &infoLog);
 
35
        EXPECT_FALSE(success);
 
36
        if (expectedError)
 
37
        {
 
38
            EXPECT_TRUE(infoLog.find(expectedError) != std::string::npos);
 
39
        }
 
40
    }
 
41
};
 
42
 
 
43
// Check that compilation fails if the compile option to emulate gl_BaseVertex and gl_BaseInstance
 
44
// is not set
 
45
TEST_F(EmulateGLBaseVertexBaseInstanceTest, RequiresEmulation)
 
46
{
 
47
    CheckCompileFailure(
 
48
        "#extension GL_ANGLE_base_vertex_base_instance : require\n"
 
49
        "void main() {\n"
 
50
        "   gl_Position = vec4(float(gl_BaseVertex), float(gl_BaseInstance), 0.0, 1.0);\n"
 
51
        "}\n",
 
52
        "extension is not supported");
 
53
}
 
54
 
 
55
// Check that compiling with emulation with gl_BaseVertex and gl_BaseInstance works with different
 
56
// shader versions
 
57
TEST_F(EmulateGLBaseVertexBaseInstanceTest, CheckCompile)
 
58
{
 
59
    const std::string shaderString =
 
60
        "#extension GL_ANGLE_base_vertex_base_instance : require\n"
 
61
        "void main() {\n"
 
62
        "   gl_Position = vec4(float(gl_BaseVertex), float(gl_BaseInstance), 0.0, 1.0);\n"
 
63
        "}\n";
 
64
 
 
65
    compile("#version 300 es\n" + shaderString,
 
66
            SH_OBJECT_CODE | SH_VARIABLES | SH_EMULATE_GL_BASE_VERTEX_BASE_INSTANCE);
 
67
}
 
68
 
 
69
// Check that gl_BaseVertex and gl_BaseInstance is properly emulated
 
70
TEST_F(EmulateGLBaseVertexBaseInstanceTest, EmulatesUniform)
 
71
{
 
72
    addOutputType(SH_GLSL_COMPATIBILITY_OUTPUT);
 
73
    addOutputType(SH_ESSL_OUTPUT);
 
74
#ifdef ANGLE_ENABLE_VULKAN
 
75
    addOutputType(SH_GLSL_VULKAN_OUTPUT);
 
76
#endif
 
77
#ifdef ANGLE_ENABLE_HLSL
 
78
    addOutputType(SH_HLSL_3_0_OUTPUT);
 
79
    addOutputType(SH_HLSL_3_0_OUTPUT);
 
80
#endif
 
81
 
 
82
    const std::string &shaderString =
 
83
        "#version 300 es\n"
 
84
        "#extension GL_ANGLE_base_vertex_base_instance : require\n"
 
85
        "void main() {\n"
 
86
        "   gl_Position = vec4(float(gl_BaseVertex), float(gl_BaseInstance), 0.0, 1.0);\n"
 
87
        "}\n";
 
88
 
 
89
    compile(shaderString, SH_OBJECT_CODE | SH_VARIABLES | SH_EMULATE_GL_BASE_VERTEX_BASE_INSTANCE);
 
90
 
 
91
    EXPECT_TRUE(notFoundInCode("gl_BaseVertex"));
 
92
    EXPECT_TRUE(foundInCode("angle_BaseVertex"));
 
93
    EXPECT_TRUE(notFoundInCode("gl_BaseInstance"));
 
94
    EXPECT_TRUE(foundInCode("angle_BaseInstance"));
 
95
    EXPECT_TRUE(notFoundInCode("GL_ANGLE_base_vertex_base_instance"));
 
96
 
 
97
    EXPECT_TRUE(foundInCode(SH_GLSL_COMPATIBILITY_OUTPUT, "uniform int angle_BaseVertex"));
 
98
    EXPECT_TRUE(foundInCode(SH_GLSL_COMPATIBILITY_OUTPUT, "uniform int angle_BaseInstance"));
 
99
    EXPECT_TRUE(foundInCode(SH_ESSL_OUTPUT, "uniform highp int angle_BaseVertex"));
 
100
    EXPECT_TRUE(foundInCode(SH_ESSL_OUTPUT, "uniform highp int angle_BaseInstance"));
 
101
 
 
102
#ifdef ANGLE_ENABLE_VULKAN
 
103
    EXPECT_TRUE(foundInCode(
 
104
        SH_GLSL_VULKAN_OUTPUT,
 
105
        "uniform defaultUniformsVS\n{\n    int angle_BaseInstance;\n    int angle_BaseVertex;"));
 
106
#endif
 
107
#ifdef ANGLE_ENABLE_HLSL
 
108
    EXPECT_TRUE(foundInCode(SH_HLSL_3_0_OUTPUT, "uniform int angle_BaseVertex : register"));
 
109
    EXPECT_TRUE(foundInCode(SH_HLSL_3_0_OUTPUT, "uniform int angle_BaseInstance : register"));
 
110
#endif
 
111
}
 
112
 
 
113
// Check that a user-defined "gl_BaseVertex" or "gl_BaseInstance" is not permitted
 
114
TEST_F(EmulateGLBaseVertexBaseInstanceTest, DisallowsUserDefinedGLDrawID)
 
115
{
 
116
    // Check that it is not permitted without the extension
 
117
    CheckCompileFailure(
 
118
        "#version 300 es\n"
 
119
        "uniform int gl_BaseVertex;\n"
 
120
        "void main() {\n"
 
121
        "   gl_Position = vec4(float(gl_BaseVertex), 0.0, 0.0, 1.0);\n"
 
122
        "}\n",
 
123
        "reserved built-in name");
 
124
 
 
125
    CheckCompileFailure(
 
126
        "#version 300 es\n"
 
127
        "uniform int gl_BaseInstance;\n"
 
128
        "void main() {\n"
 
129
        "   gl_Position = vec4(float(gl_BaseInstance), 0.0, 0.0, 1.0);\n"
 
130
        "}\n",
 
131
        "reserved built-in name");
 
132
 
 
133
    CheckCompileFailure(
 
134
        "#version 300 es\n"
 
135
        "void main() {\n"
 
136
        "   int gl_BaseVertex = 0;\n"
 
137
        "   gl_Position = vec4(float(gl_BaseVertex), 0.0, 0.0, 1.0);\n"
 
138
        "}\n",
 
139
        "reserved built-in name");
 
140
 
 
141
    CheckCompileFailure(
 
142
        "#version 300 es\n"
 
143
        "void main() {\n"
 
144
        "   int gl_BaseInstance = 0;\n"
 
145
        "   gl_Position = vec4(float(gl_BaseInstance), 0.0, 0.0, 1.0);\n"
 
146
        "}\n",
 
147
        "reserved built-in name");
 
148
 
 
149
    // Check that it is not permitted with the extension
 
150
    CheckCompileFailure(
 
151
        "#version 300 es\n"
 
152
        "#extension GL_ANGLE_base_vertex_base_instance : require\n"
 
153
        "uniform int gl_BaseVertex;\n"
 
154
        "void main() {\n"
 
155
        "   gl_Position = vec4(float(gl_BaseVertex), 0.0, 0.0, 1.0);\n"
 
156
        "}\n",
 
157
        "reserved built-in name");
 
158
 
 
159
    CheckCompileFailure(
 
160
        "#version 300 es\n"
 
161
        "#extension GL_ANGLE_base_vertex_base_instance : require\n"
 
162
        "uniform int gl_BaseInstance;\n"
 
163
        "void main() {\n"
 
164
        "   gl_Position = vec4(float(gl_BaseInstance), 0.0, 0.0, 1.0);\n"
 
165
        "}\n",
 
166
        "reserved built-in name");
 
167
 
 
168
    CheckCompileFailure(
 
169
        "#version 300 es\n"
 
170
        "#extension GL_ANGLE_base_vertex_base_instance : require\n"
 
171
        "void main() {\n"
 
172
        "   int gl_BaseVertex = 0;\n"
 
173
        "   gl_Position = vec4(float(gl_BaseVertex), 0.0, 0.0, 1.0);\n"
 
174
        "}\n",
 
175
        "reserved built-in name");
 
176
 
 
177
    CheckCompileFailure(
 
178
        "#version 300 es\n"
 
179
        "#extension GL_ANGLE_base_vertex_base_instance : require\n"
 
180
        "void main() {\n"
 
181
        "   int gl_BaseInstance = 0;\n"
 
182
        "   gl_Position = vec4(float(gl_BaseInstance), 0.0, 0.0, 1.0);\n"
 
183
        "}\n",
 
184
        "reserved built-in name");
 
185
}
 
186
 
 
187
// gl_BaseVertex and gl_BaseInstance are translated to angle_BaseVertex and angle_BaseInstance
 
188
// internally. Check that a user-defined angle_BaseVertex or angle_BaseInstance is permitted
 
189
TEST_F(EmulateGLBaseVertexBaseInstanceTest, AllowsUserDefinedANGLEDrawID)
 
190
{
 
191
    addOutputType(SH_GLSL_COMPATIBILITY_OUTPUT);
 
192
    addOutputType(SH_ESSL_OUTPUT);
 
193
#ifdef ANGLE_ENABLE_VULKAN
 
194
    addOutputType(SH_GLSL_VULKAN_OUTPUT);
 
195
#endif
 
196
#ifdef ANGLE_ENABLE_HLSL
 
197
    addOutputType(SH_HLSL_3_0_OUTPUT);
 
198
    addOutputType(SH_HLSL_3_0_OUTPUT);
 
199
#endif
 
200
 
 
201
    const std::string &shaderString =
 
202
        "#version 300 es\n"
 
203
        "#extension GL_ANGLE_base_vertex_base_instance : require\n"
 
204
        "uniform int angle_BaseVertex;\n"
 
205
        "uniform int angle_BaseInstance;\n"
 
206
        "void main() {\n"
 
207
        "   gl_Position = vec4(\n"
 
208
        "           float(angle_BaseVertex + gl_BaseVertex),\n"
 
209
        "           float(angle_BaseInstance + gl_BaseInstance),\n"
 
210
        "           0.0, 1.0);\n"
 
211
        "}\n";
 
212
 
 
213
    compile(shaderString, SH_OBJECT_CODE | SH_VARIABLES | SH_EMULATE_GL_BASE_VERTEX_BASE_INSTANCE);
 
214
 
 
215
    // " angle_BaseVertex" (note the space) should appear exactly twice:
 
216
    //    once in the declaration and once in the body.
 
217
    // The user-defined angle_BaseVertex should be decorated
 
218
    EXPECT_TRUE(foundInCode(" angle_BaseVertex", 2));
 
219
    EXPECT_TRUE(foundInCode(" angle_BaseInstance", 2));
 
220
}