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