xref: /aosp_15_r20/external/angle/src/tests/gl_tests/RendererTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2015 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // RendererTest:
7*8975f5c5SAndroid Build Coastguard Worker //   These tests are designed to ensure that the various configurations of the test fixtures work as
8*8975f5c5SAndroid Build Coastguard Worker //   expected. If one of these tests fails, then it is likely that some of the other tests are being
9*8975f5c5SAndroid Build Coastguard Worker //   configured incorrectly. For example, they might be using the D3D11 renderer when the test is
10*8975f5c5SAndroid Build Coastguard Worker //   meant to be using the D3D9 renderer.
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include "common/string_utils.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "util/shader_utils.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "util/test_utils.h"
17*8975f5c5SAndroid Build Coastguard Worker 
18*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
19*8975f5c5SAndroid Build Coastguard Worker 
20*8975f5c5SAndroid Build Coastguard Worker namespace angle
21*8975f5c5SAndroid Build Coastguard Worker {
22*8975f5c5SAndroid Build Coastguard Worker 
23*8975f5c5SAndroid Build Coastguard Worker class RendererTest : public ANGLETest<>
24*8975f5c5SAndroid Build Coastguard Worker {
25*8975f5c5SAndroid Build Coastguard Worker   protected:
RendererTest()26*8975f5c5SAndroid Build Coastguard Worker     RendererTest()
27*8975f5c5SAndroid Build Coastguard Worker     {
28*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(128);
29*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(128);
30*8975f5c5SAndroid Build Coastguard Worker     }
31*8975f5c5SAndroid Build Coastguard Worker };
32*8975f5c5SAndroid Build Coastguard Worker 
33*8975f5c5SAndroid Build Coastguard Worker // Print vendor, renderer, version and extension strings. Useful for debugging.
TEST_P(RendererTest,Strings)34*8975f5c5SAndroid Build Coastguard Worker TEST_P(RendererTest, Strings)
35*8975f5c5SAndroid Build Coastguard Worker {
36*8975f5c5SAndroid Build Coastguard Worker     std::cout << "Renderer: " << glGetString(GL_RENDERER) << std::endl;
37*8975f5c5SAndroid Build Coastguard Worker     std::cout << "Vendor: " << glGetString(GL_VENDOR) << std::endl;
38*8975f5c5SAndroid Build Coastguard Worker     std::cout << "Version: " << glGetString(GL_VERSION) << std::endl;
39*8975f5c5SAndroid Build Coastguard Worker     std::cout << "Extensions: " << glGetString(GL_EXTENSIONS) << std::endl;
40*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
41*8975f5c5SAndroid Build Coastguard Worker }
42*8975f5c5SAndroid Build Coastguard Worker 
TEST_P(RendererTest,RequestedRendererCreated)43*8975f5c5SAndroid Build Coastguard Worker TEST_P(RendererTest, RequestedRendererCreated)
44*8975f5c5SAndroid Build Coastguard Worker {
45*8975f5c5SAndroid Build Coastguard Worker     std::string rendererString =
46*8975f5c5SAndroid Build Coastguard Worker         std::string(reinterpret_cast<const char *>(glGetString(GL_RENDERER)));
47*8975f5c5SAndroid Build Coastguard Worker     angle::ToLower(&rendererString);
48*8975f5c5SAndroid Build Coastguard Worker 
49*8975f5c5SAndroid Build Coastguard Worker     std::string versionString =
50*8975f5c5SAndroid Build Coastguard Worker         std::string(reinterpret_cast<const char *>(glGetString(GL_VERSION)));
51*8975f5c5SAndroid Build Coastguard Worker     angle::ToLower(&versionString);
52*8975f5c5SAndroid Build Coastguard Worker 
53*8975f5c5SAndroid Build Coastguard Worker     const EGLPlatformParameters &platform = GetParam().eglParameters;
54*8975f5c5SAndroid Build Coastguard Worker 
55*8975f5c5SAndroid Build Coastguard Worker     // Ensure that the renderer string contains D3D11, if we requested a D3D11 renderer.
56*8975f5c5SAndroid Build Coastguard Worker     if (platform.renderer == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE)
57*8975f5c5SAndroid Build Coastguard Worker     {
58*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(rendererString.find(std::string("direct3d11")), std::string::npos);
59*8975f5c5SAndroid Build Coastguard Worker     }
60*8975f5c5SAndroid Build Coastguard Worker 
61*8975f5c5SAndroid Build Coastguard Worker     // Ensure that the renderer string contains D3D9, if we requested a D3D9 renderer.
62*8975f5c5SAndroid Build Coastguard Worker     if (platform.renderer == EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE)
63*8975f5c5SAndroid Build Coastguard Worker     {
64*8975f5c5SAndroid Build Coastguard Worker         ASSERT_NE(rendererString.find(std::string("direct3d9")), std::string::npos);
65*8975f5c5SAndroid Build Coastguard Worker     }
66*8975f5c5SAndroid Build Coastguard Worker 
67*8975f5c5SAndroid Build Coastguard Worker     // Ensure that the major and minor versions trigger expected behavior in D3D11
68*8975f5c5SAndroid Build Coastguard Worker     if (platform.renderer == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE)
69*8975f5c5SAndroid Build Coastguard Worker     {
70*8975f5c5SAndroid Build Coastguard Worker         // Ensure that the renderer uses WARP, if we requested it.
71*8975f5c5SAndroid Build Coastguard Worker         if (platform.deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_D3D_WARP_ANGLE)
72*8975f5c5SAndroid Build Coastguard Worker         {
73*8975f5c5SAndroid Build Coastguard Worker             auto basicRenderPos     = rendererString.find(std::string("microsoft basic render"));
74*8975f5c5SAndroid Build Coastguard Worker             auto softwareAdapterPos = rendererString.find(std::string("software adapter"));
75*8975f5c5SAndroid Build Coastguard Worker             ASSERT_TRUE(basicRenderPos != std::string::npos ||
76*8975f5c5SAndroid Build Coastguard Worker                         softwareAdapterPos != std::string::npos);
77*8975f5c5SAndroid Build Coastguard Worker         }
78*8975f5c5SAndroid Build Coastguard Worker 
79*8975f5c5SAndroid Build Coastguard Worker         std::vector<std::string> acceptableShaderModels;
80*8975f5c5SAndroid Build Coastguard Worker 
81*8975f5c5SAndroid Build Coastguard Worker         // When no specific major/minor version is requested, then ANGLE should return the highest
82*8975f5c5SAndroid Build Coastguard Worker         // possible feature level by default. The current hardware driver might not support Feature
83*8975f5c5SAndroid Build Coastguard Worker         // Level 11_0, but WARP always does. Therefore if WARP is specified but no major/minor
84*8975f5c5SAndroid Build Coastguard Worker         // version is specified, then we test to check that ANGLE returns FL11_0.
85*8975f5c5SAndroid Build Coastguard Worker         if (platform.majorVersion >= 11 || platform.majorVersion == EGL_DONT_CARE)
86*8975f5c5SAndroid Build Coastguard Worker         {
87*8975f5c5SAndroid Build Coastguard Worker             // Feature Level 10_0 corresponds to shader model 5_0
88*8975f5c5SAndroid Build Coastguard Worker             acceptableShaderModels.push_back("ps_5_0");
89*8975f5c5SAndroid Build Coastguard Worker         }
90*8975f5c5SAndroid Build Coastguard Worker 
91*8975f5c5SAndroid Build Coastguard Worker         if (platform.majorVersion >= 10 || platform.majorVersion == EGL_DONT_CARE)
92*8975f5c5SAndroid Build Coastguard Worker         {
93*8975f5c5SAndroid Build Coastguard Worker             if (platform.minorVersion >= 1 || platform.minorVersion == EGL_DONT_CARE)
94*8975f5c5SAndroid Build Coastguard Worker             {
95*8975f5c5SAndroid Build Coastguard Worker                 // Feature Level 10_1 corresponds to shader model 4_1
96*8975f5c5SAndroid Build Coastguard Worker                 acceptableShaderModels.push_back("ps_4_1");
97*8975f5c5SAndroid Build Coastguard Worker             }
98*8975f5c5SAndroid Build Coastguard Worker 
99*8975f5c5SAndroid Build Coastguard Worker             if (platform.minorVersion >= 0 || platform.minorVersion == EGL_DONT_CARE)
100*8975f5c5SAndroid Build Coastguard Worker             {
101*8975f5c5SAndroid Build Coastguard Worker                 // Feature Level 10_0 corresponds to shader model 4_0
102*8975f5c5SAndroid Build Coastguard Worker                 acceptableShaderModels.push_back("ps_4_0");
103*8975f5c5SAndroid Build Coastguard Worker             }
104*8975f5c5SAndroid Build Coastguard Worker         }
105*8975f5c5SAndroid Build Coastguard Worker 
106*8975f5c5SAndroid Build Coastguard Worker         if (platform.majorVersion == 9 && platform.minorVersion == 3)
107*8975f5c5SAndroid Build Coastguard Worker         {
108*8975f5c5SAndroid Build Coastguard Worker             acceptableShaderModels.push_back("ps_4_0_level_9_3");
109*8975f5c5SAndroid Build Coastguard Worker         }
110*8975f5c5SAndroid Build Coastguard Worker 
111*8975f5c5SAndroid Build Coastguard Worker         bool found = false;
112*8975f5c5SAndroid Build Coastguard Worker         for (size_t i = 0; i < acceptableShaderModels.size(); i++)
113*8975f5c5SAndroid Build Coastguard Worker         {
114*8975f5c5SAndroid Build Coastguard Worker             if (rendererString.find(acceptableShaderModels[i]) != std::string::npos)
115*8975f5c5SAndroid Build Coastguard Worker             {
116*8975f5c5SAndroid Build Coastguard Worker                 found = true;
117*8975f5c5SAndroid Build Coastguard Worker             }
118*8975f5c5SAndroid Build Coastguard Worker         }
119*8975f5c5SAndroid Build Coastguard Worker 
120*8975f5c5SAndroid Build Coastguard Worker         ASSERT_TRUE(found);
121*8975f5c5SAndroid Build Coastguard Worker     }
122*8975f5c5SAndroid Build Coastguard Worker 
123*8975f5c5SAndroid Build Coastguard Worker     if (platform.renderer == EGL_PLATFORM_ANGLE_TYPE_NULL_ANGLE)
124*8975f5c5SAndroid Build Coastguard Worker     {
125*8975f5c5SAndroid Build Coastguard Worker         ASSERT_TRUE(IsNULL());
126*8975f5c5SAndroid Build Coastguard Worker     }
127*8975f5c5SAndroid Build Coastguard Worker 
128*8975f5c5SAndroid Build Coastguard Worker     if (platform.renderer == EGL_PLATFORM_ANGLE_TYPE_VULKAN_ANGLE)
129*8975f5c5SAndroid Build Coastguard Worker     {
130*8975f5c5SAndroid Build Coastguard Worker         ASSERT_TRUE(IsVulkan());
131*8975f5c5SAndroid Build Coastguard Worker     }
132*8975f5c5SAndroid Build Coastguard Worker 
133*8975f5c5SAndroid Build Coastguard Worker     EGLint glesMajorVersion = GetParam().majorVersion;
134*8975f5c5SAndroid Build Coastguard Worker     EGLint glesMinorVersion = GetParam().minorVersion;
135*8975f5c5SAndroid Build Coastguard Worker 
136*8975f5c5SAndroid Build Coastguard Worker     std::ostringstream expectedVersionString;
137*8975f5c5SAndroid Build Coastguard Worker     expectedVersionString << "es " << glesMajorVersion << "." << glesMinorVersion;
138*8975f5c5SAndroid Build Coastguard Worker 
139*8975f5c5SAndroid Build Coastguard Worker     ASSERT_NE(versionString.find(expectedVersionString.str()), std::string::npos);
140*8975f5c5SAndroid Build Coastguard Worker 
141*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
142*8975f5c5SAndroid Build Coastguard Worker     ASSERT_EGL_SUCCESS();
143*8975f5c5SAndroid Build Coastguard Worker }
144*8975f5c5SAndroid Build Coastguard Worker 
145*8975f5c5SAndroid Build Coastguard Worker // Perform a simple operation (clear and read pixels) to verify the device is working
TEST_P(RendererTest,SimpleOperation)146*8975f5c5SAndroid Build Coastguard Worker TEST_P(RendererTest, SimpleOperation)
147*8975f5c5SAndroid Build Coastguard Worker {
148*8975f5c5SAndroid Build Coastguard Worker     if (IsNULL())
149*8975f5c5SAndroid Build Coastguard Worker     {
150*8975f5c5SAndroid Build Coastguard Worker         std::cout << "ANGLE NULL backend clears are not functional" << std::endl;
151*8975f5c5SAndroid Build Coastguard Worker         return;
152*8975f5c5SAndroid Build Coastguard Worker     }
153*8975f5c5SAndroid Build Coastguard Worker 
154*8975f5c5SAndroid Build Coastguard Worker     glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
155*8975f5c5SAndroid Build Coastguard Worker     glClear(GL_COLOR_BUFFER_BIT);
156*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255);
157*8975f5c5SAndroid Build Coastguard Worker 
158*8975f5c5SAndroid Build Coastguard Worker     ASSERT_GL_NO_ERROR();
159*8975f5c5SAndroid Build Coastguard Worker }
160*8975f5c5SAndroid Build Coastguard Worker 
161*8975f5c5SAndroid Build Coastguard Worker // Perform a simple buffer operation.
TEST_P(RendererTest,BufferData)162*8975f5c5SAndroid Build Coastguard Worker TEST_P(RendererTest, BufferData)
163*8975f5c5SAndroid Build Coastguard Worker {
164*8975f5c5SAndroid Build Coastguard Worker     constexpr size_t kBufferSize = 1024;
165*8975f5c5SAndroid Build Coastguard Worker     std::array<uint8_t, kBufferSize> data;
166*8975f5c5SAndroid Build Coastguard Worker     for (size_t i = 0; i < kBufferSize; i++)
167*8975f5c5SAndroid Build Coastguard Worker     {
168*8975f5c5SAndroid Build Coastguard Worker         data[i] = static_cast<uint8_t>(i);
169*8975f5c5SAndroid Build Coastguard Worker     }
170*8975f5c5SAndroid Build Coastguard Worker 
171*8975f5c5SAndroid Build Coastguard Worker     // All at once in the glBufferData call
172*8975f5c5SAndroid Build Coastguard Worker     {
173*8975f5c5SAndroid Build Coastguard Worker         GLBuffer buffer;
174*8975f5c5SAndroid Build Coastguard Worker         glBindBuffer(GL_ARRAY_BUFFER, buffer);
175*8975f5c5SAndroid Build Coastguard Worker 
176*8975f5c5SAndroid Build Coastguard Worker         glBufferData(GL_ARRAY_BUFFER, 1024, data.data(), GL_STATIC_DRAW);
177*8975f5c5SAndroid Build Coastguard Worker     }
178*8975f5c5SAndroid Build Coastguard Worker 
179*8975f5c5SAndroid Build Coastguard Worker     // Set data with sub data
180*8975f5c5SAndroid Build Coastguard Worker     {
181*8975f5c5SAndroid Build Coastguard Worker         GLBuffer buffer;
182*8975f5c5SAndroid Build Coastguard Worker         glBindBuffer(GL_ARRAY_BUFFER, buffer);
183*8975f5c5SAndroid Build Coastguard Worker 
184*8975f5c5SAndroid Build Coastguard Worker         glBufferData(GL_ARRAY_BUFFER, 1024, nullptr, GL_STATIC_DRAW);
185*8975f5c5SAndroid Build Coastguard Worker         glBufferSubData(GL_ARRAY_BUFFER, 0, kBufferSize, data.data());
186*8975f5c5SAndroid Build Coastguard Worker     }
187*8975f5c5SAndroid Build Coastguard Worker }
188*8975f5c5SAndroid Build Coastguard Worker 
189*8975f5c5SAndroid Build Coastguard Worker // Compile simple vertex and fragment shaders
TEST_P(RendererTest,CompileShader)190*8975f5c5SAndroid Build Coastguard Worker TEST_P(RendererTest, CompileShader)
191*8975f5c5SAndroid Build Coastguard Worker {
192*8975f5c5SAndroid Build Coastguard Worker     GLuint vs = CompileShader(GL_VERTEX_SHADER, essl1_shaders::vs::Zero());
193*8975f5c5SAndroid Build Coastguard Worker     EXPECT_NE(vs, 0u);
194*8975f5c5SAndroid Build Coastguard Worker     glDeleteShader(vs);
195*8975f5c5SAndroid Build Coastguard Worker 
196*8975f5c5SAndroid Build Coastguard Worker     GLuint fs = CompileShader(GL_FRAGMENT_SHADER, essl1_shaders::fs::Red());
197*8975f5c5SAndroid Build Coastguard Worker     EXPECT_NE(fs, 0u);
198*8975f5c5SAndroid Build Coastguard Worker     glDeleteShader(fs);
199*8975f5c5SAndroid Build Coastguard Worker }
200*8975f5c5SAndroid Build Coastguard Worker 
201*8975f5c5SAndroid Build Coastguard Worker // Link a simple program
TEST_P(RendererTest,LinkProgram)202*8975f5c5SAndroid Build Coastguard Worker TEST_P(RendererTest, LinkProgram)
203*8975f5c5SAndroid Build Coastguard Worker {
204*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(prog, essl1_shaders::vs::Zero(), essl1_shaders::fs::Red());
205*8975f5c5SAndroid Build Coastguard Worker }
206*8975f5c5SAndroid Build Coastguard Worker 
207*8975f5c5SAndroid Build Coastguard Worker // Draw a triangle using no vertex attributes
TEST_P(RendererTest,Draw)208*8975f5c5SAndroid Build Coastguard Worker TEST_P(RendererTest, Draw)
209*8975f5c5SAndroid Build Coastguard Worker {
210*8975f5c5SAndroid Build Coastguard Worker     ANGLE_GL_PROGRAM(prog, essl1_shaders::vs::Zero(), essl1_shaders::fs::Red());
211*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(prog);
212*8975f5c5SAndroid Build Coastguard Worker     glDrawArrays(GL_TRIANGLES, 0, 3);
213*8975f5c5SAndroid Build Coastguard Worker }
214*8975f5c5SAndroid Build Coastguard Worker 
215*8975f5c5SAndroid Build Coastguard Worker // Select configurations (e.g. which renderer, which GLES major version) these tests should be run
216*8975f5c5SAndroid Build Coastguard Worker // against.
217*8975f5c5SAndroid Build Coastguard Worker // TODO(http://anglebug.com/42266907): move ES2_WEBGPU to the definition of
218*8975f5c5SAndroid Build Coastguard Worker // ANGLE_ALL_TEST_PLATFORMS_ES2 once webgpu is developed enough to run more tests.
219*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2_AND_ES3_AND_ES31_AND_NULL_AND(RendererTest,
220*8975f5c5SAndroid Build Coastguard Worker                                                          ES2_WEBGPU());
221*8975f5c5SAndroid Build Coastguard Worker }  // namespace angle
222