1 //
2 // Copyright 2020 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 #include "angle_test_platform.h"
7 
8 #include "common/platform.h"
9 #include "gpu_info_util/SystemInfo.h"
10 
11 #if defined(ANGLE_PLATFORM_WINDOWS)
12 #    include <VersionHelpers.h>
13 #endif  // defined(ANGLE_PLATFORM_WINDOWS)
14 
15 using namespace angle;
16 
IsAdreno()17 bool IsAdreno()
18 {
19     std::string rendererString(reinterpret_cast<const char *>(glGetString(GL_RENDERER)));
20     return (rendererString.find("Adreno") != std::string::npos);
21 }
22 
IsD3D11()23 bool IsD3D11()
24 {
25     std::string rendererString(reinterpret_cast<const char *>(glGetString(GL_RENDERER)));
26     return (rendererString.find("Direct3D11 vs_5_0") != std::string::npos);
27 }
28 
IsD3D11_FL93()29 bool IsD3D11_FL93()
30 {
31     std::string rendererString(reinterpret_cast<const char *>(glGetString(GL_RENDERER)));
32     return (rendererString.find("Direct3D11 vs_4_0_") != std::string::npos);
33 }
34 
IsD3D9()35 bool IsD3D9()
36 {
37     std::string rendererString(reinterpret_cast<const char *>(glGetString(GL_RENDERER)));
38     return (rendererString.find("Direct3D9") != std::string::npos);
39 }
40 
IsD3DSM3()41 bool IsD3DSM3()
42 {
43     return IsD3D9() || IsD3D11_FL93();
44 }
45 
IsDesktopOpenGL()46 bool IsDesktopOpenGL()
47 {
48     return IsOpenGL() && !IsOpenGLES();
49 }
50 
IsOpenGLES()51 bool IsOpenGLES()
52 {
53     std::string rendererString(reinterpret_cast<const char *>(glGetString(GL_RENDERER)));
54     return (rendererString.find("OpenGL ES") != std::string::npos);
55 }
56 
IsOpenGL()57 bool IsOpenGL()
58 {
59     std::string rendererString(reinterpret_cast<const char *>(glGetString(GL_RENDERER)));
60     return (rendererString.find("OpenGL") != std::string::npos);
61 }
62 
IsNULL()63 bool IsNULL()
64 {
65     std::string rendererString(reinterpret_cast<const char *>(glGetString(GL_RENDERER)));
66     return (rendererString.find("NULL") != std::string::npos);
67 }
68 
IsVulkan()69 bool IsVulkan()
70 {
71     const char *renderer = reinterpret_cast<const char *>(glGetString(GL_RENDERER));
72     std::string rendererString(renderer);
73     return (rendererString.find("Vulkan") != std::string::npos);
74 }
75 
IsMetal()76 bool IsMetal()
77 {
78     const char *renderer = reinterpret_cast<const char *>(glGetString(GL_RENDERER));
79     std::string rendererString(renderer);
80     return (rendererString.find("Metal") != std::string::npos);
81 }
82 
IsD3D()83 bool IsD3D()
84 {
85     return IsD3D9() || IsD3D11();
86 }
87 
IsDebug()88 bool IsDebug()
89 {
90 #if !defined(NDEBUG)
91     return true;
92 #else
93     return false;
94 #endif
95 }
96 
IsRelease()97 bool IsRelease()
98 {
99     return !IsDebug();
100 }
101 
EnsureGLExtensionEnabled(const std::string & extName)102 bool EnsureGLExtensionEnabled(const std::string &extName)
103 {
104     if (IsGLExtensionEnabled("GL_ANGLE_request_extension") && IsGLExtensionRequestable(extName))
105     {
106         glRequestExtensionANGLE(extName.c_str());
107     }
108 
109     return IsGLExtensionEnabled(extName);
110 }
111 
IsEGLClientExtensionEnabled(const std::string & extName)112 bool IsEGLClientExtensionEnabled(const std::string &extName)
113 {
114     return CheckExtensionExists(eglQueryString(EGL_NO_DISPLAY, EGL_EXTENSIONS), extName);
115 }
116 
IsEGLDeviceExtensionEnabled(EGLDeviceEXT device,const std::string & extName)117 bool IsEGLDeviceExtensionEnabled(EGLDeviceEXT device, const std::string &extName)
118 {
119     return CheckExtensionExists(eglQueryDeviceStringEXT(device, EGL_EXTENSIONS), extName);
120 }
121 
IsEGLDisplayExtensionEnabled(EGLDisplay display,const std::string & extName)122 bool IsEGLDisplayExtensionEnabled(EGLDisplay display, const std::string &extName)
123 {
124     return CheckExtensionExists(eglQueryString(display, EGL_EXTENSIONS), extName);
125 }
126 
IsGLExtensionEnabled(const std::string & extName)127 bool IsGLExtensionEnabled(const std::string &extName)
128 {
129     return CheckExtensionExists(reinterpret_cast<const char *>(glGetString(GL_EXTENSIONS)),
130                                 extName);
131 }
132 
IsGLExtensionRequestable(const std::string & extName)133 bool IsGLExtensionRequestable(const std::string &extName)
134 {
135     return CheckExtensionExists(
136         reinterpret_cast<const char *>(glGetString(GL_REQUESTABLE_EXTENSIONS_ANGLE)), extName);
137 }
138