xref: /aosp_15_r20/external/angle/src/compiler/translator/ExtensionBehavior.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1 //
2 // Copyright 2017 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 // ExtensionBehavior.cpp: Extension name enumeration and data structures for storing extension
7 // behavior.
8 
9 #include "compiler/translator/ExtensionBehavior.h"
10 
11 #include "common/debug.h"
12 
13 #include <string.h>
14 
15 // clang-format off
16 // Extension Name, Min ESSL Version, Max ESSL Version
17 //
18 // Note that OES_EGL_image_external and OES_texture_3D are ESSL 100 only extensions, but one app has
19 // been found that uses them on GLSL 310.  http://issuetracker.google.com/285871779
20 #define LIST_EXTENSIONS(OP)                                      \
21     OP(ANDROID_extension_pack_es31a,                   310, 320) \
22     OP(ANGLE_base_vertex_base_instance_shader_builtin, 300, 320) \
23     OP(ANGLE_clip_cull_distance,                       300, 320) \
24     OP(ANGLE_multi_draw,                               100, 320) \
25     OP(ANGLE_shader_pixel_local_storage,               300, 320) \
26     OP(ANGLE_texture_multisample,                      300, 320) \
27     OP(APPLE_clip_distance,                            100, 320) \
28     OP(ARB_texture_rectangle,                          100, 320) \
29     OP(ARM_shader_framebuffer_fetch,                   100, 320) \
30     OP(ARM_shader_framebuffer_fetch_depth_stencil,     100, 320) \
31     OP(EXT_blend_func_extended,                        100, 320) \
32     OP(EXT_clip_cull_distance,                         300, 320) \
33     OP(EXT_conservative_depth,                         300, 320) \
34     OP(EXT_draw_buffers,                               100, 100) \
35     OP(EXT_frag_depth,                                 100, 100) \
36     OP(EXT_geometry_shader,                            310, 320) \
37     OP(OES_geometry_shader,                            310, 320) \
38     OP(OES_shader_io_blocks,                           310, 320) \
39     OP(EXT_shader_io_blocks,                           310, 320) \
40     OP(EXT_gpu_shader5,                                310, 320) \
41     OP(OES_gpu_shader5,                                310, 320) \
42     OP(EXT_primitive_bounding_box,                     310, 320) \
43     OP(OES_primitive_bounding_box,                     310, 320) \
44     OP(EXT_separate_shader_objects,                    100, 320) \
45     OP(EXT_shader_framebuffer_fetch,                   100, 320) \
46     OP(EXT_shader_framebuffer_fetch_non_coherent,      100, 320) \
47     OP(EXT_shader_non_constant_global_initializers,    100, 320) \
48     OP(EXT_shader_texture_lod,                         100, 100) \
49     OP(EXT_shadow_samplers,                            100, 100) \
50     OP(EXT_tessellation_shader,                        310, 320) \
51     OP(OES_tessellation_shader,                        310, 320) \
52     OP(EXT_texture_buffer,                             310, 320) \
53     OP(EXT_texture_cube_map_array,                     310, 320) \
54     OP(EXT_texture_query_lod,                          300, 320) \
55     OP(EXT_texture_shadow_lod,                         300, 320) \
56     OP(EXT_YUV_target,                                 300, 320) \
57     OP(KHR_blend_equation_advanced,                    100, 320) \
58     OP(NV_EGL_stream_consumer_external,                100, 320) \
59     OP(NV_shader_framebuffer_fetch,                    100, 100) \
60     OP(NV_shader_noperspective_interpolation,          300, 320) \
61     OP(OES_EGL_image_external,                         100, 310) \
62     OP(OES_EGL_image_external_essl3,                   300, 320) \
63     OP(OES_sample_variables,                           300, 320) \
64     OP(OES_shader_multisample_interpolation,           300, 320) \
65     OP(OES_shader_image_atomic,                        310, 320) \
66     OP(OES_standard_derivatives,                       100, 100) \
67     OP(OES_texture_3D,                                 100, 310) \
68     OP(OES_texture_buffer,                             310, 320) \
69     OP(OES_texture_cube_map_array,                     310, 320) \
70     OP(OES_texture_storage_multisample_2d_array,       310, 320) \
71     OP(OVR_multiview,                                  300, 320) \
72     OP(OVR_multiview2,                                 300, 320) \
73     OP(WEBGL_video_texture,                            100, 320)
74 // clang-format on
75 
76 namespace sh
77 {
78 
79 #define RETURN_EXTENSION_NAME_CASE(ext, min_version, max_version) \
80     case TExtension::ext:                                         \
81         return "GL_" #ext;
82 
GetExtensionNameString(TExtension extension)83 const char *GetExtensionNameString(TExtension extension)
84 {
85     switch (extension)
86     {
87         LIST_EXTENSIONS(RETURN_EXTENSION_NAME_CASE)
88         default:
89             UNREACHABLE();
90             return "";
91     }
92 }
93 
94 #define RETURN_EXTENSION_IF_NAME_MATCHES(ext, min_version, max_version) \
95     if (strcmp(extWithoutGLPrefix, #ext) == 0)                          \
96     {                                                                   \
97         return TExtension::ext;                                         \
98     }
99 
GetExtensionByName(const char * extension)100 TExtension GetExtensionByName(const char *extension)
101 {
102     // If first characters of the extension don't equal "GL_", early out.
103     if (strncmp(extension, "GL_", 3) != 0)
104     {
105         return TExtension::UNDEFINED;
106     }
107     const char *extWithoutGLPrefix = extension + 3;
108 
109     LIST_EXTENSIONS(RETURN_EXTENSION_IF_NAME_MATCHES)
110 
111     return TExtension::UNDEFINED;
112 }
113 
114 #define RETURN_VERSION_CHECK(ext, min_version, max_version) \
115     case TExtension::ext:                                   \
116         return (version >= min_version) && (version <= max_version);
117 
CheckExtensionVersion(TExtension extension,int version)118 bool CheckExtensionVersion(TExtension extension, int version)
119 {
120     switch (extension)
121     {
122         LIST_EXTENSIONS(RETURN_VERSION_CHECK)
123         default:
124             UNREACHABLE();
125             return false;
126     }
127 }
128 
GetBehaviorString(TBehavior b)129 const char *GetBehaviorString(TBehavior b)
130 {
131     switch (b)
132     {
133         case EBhRequire:
134             return "require";
135         case EBhEnable:
136             return "enable";
137         case EBhWarn:
138             return "warn";
139         case EBhDisable:
140             return "disable";
141         default:
142             return nullptr;
143     }
144 }
145 
IsExtensionEnabled(const TExtensionBehavior & extBehavior,TExtension extension)146 bool IsExtensionEnabled(const TExtensionBehavior &extBehavior, TExtension extension)
147 {
148     ASSERT(extension != TExtension::UNDEFINED);
149     auto iter = extBehavior.find(extension);
150     return iter != extBehavior.end() &&
151            (iter->second == EBhEnable || iter->second == EBhRequire || iter->second == EBhWarn);
152 }
153 
154 }  // namespace sh
155