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 #define LIST_EXTENSIONS(OP)                         \
16     OP(ANGLE_base_vertex_base_instance)             \
17     OP(ANGLE_multi_draw)                            \
18     OP(ANGLE_texture_multisample)                   \
19     OP(APPLE_clip_distance)                         \
20     OP(ARB_texture_rectangle)                       \
21     OP(ARM_shader_framebuffer_fetch)                \
22     OP(EXT_blend_func_extended)                     \
23     OP(EXT_clip_cull_distance)                      \
24     OP(EXT_draw_buffers)                            \
25     OP(EXT_frag_depth)                              \
26     OP(EXT_geometry_shader)                         \
27     OP(OES_shader_io_blocks)                        \
28     OP(EXT_shader_io_blocks)                        \
29     OP(EXT_gpu_shader5)                             \
30     OP(EXT_shader_framebuffer_fetch)                \
31     OP(EXT_shader_framebuffer_fetch_non_coherent)   \
32     OP(EXT_shader_non_constant_global_initializers) \
33     OP(EXT_shader_texture_lod)                      \
34     OP(EXT_shadow_samplers)                         \
35     OP(EXT_tessellation_shader)                     \
36     OP(EXT_texture_buffer)                          \
37     OP(EXT_texture_cube_map_array)                  \
38     OP(EXT_YUV_target)                              \
39     OP(NV_EGL_stream_consumer_external)             \
40     OP(NV_shader_framebuffer_fetch)                 \
41     OP(NV_shader_noperspective_interpolation)       \
42     OP(OES_EGL_image_external)                      \
43     OP(OES_EGL_image_external_essl3)                \
44     OP(OES_sample_variables)                        \
45     OP(OES_shader_multisample_interpolation)        \
46     OP(OES_shader_image_atomic)                     \
47     OP(OES_standard_derivatives)                    \
48     OP(OES_texture_3D)                              \
49     OP(OES_texture_buffer)                          \
50     OP(OES_texture_cube_map_array)                  \
51     OP(OES_texture_storage_multisample_2d_array)    \
52     OP(OVR_multiview)                               \
53     OP(OVR_multiview2)                              \
54     OP(WEBGL_video_texture)
55 
56 namespace sh
57 {
58 
59 #define RETURN_EXTENSION_NAME_CASE(ext) \
60     case TExtension::ext:               \
61         return "GL_" #ext;
62 
GetExtensionNameString(TExtension extension)63 const char *GetExtensionNameString(TExtension extension)
64 {
65     switch (extension)
66     {
67         LIST_EXTENSIONS(RETURN_EXTENSION_NAME_CASE)
68         default:
69             UNREACHABLE();
70             return "";
71     }
72 }
73 
74 #define RETURN_EXTENSION_IF_NAME_MATCHES(ext)  \
75     if (strcmp(extWithoutGLPrefix, #ext) == 0) \
76     {                                          \
77         return TExtension::ext;                \
78     }
79 
GetExtensionByName(const char * extension)80 TExtension GetExtensionByName(const char *extension)
81 {
82     // If first characters of the extension don't equal "GL_", early out.
83     if (strncmp(extension, "GL_", 3) != 0)
84     {
85         return TExtension::UNDEFINED;
86     }
87     const char *extWithoutGLPrefix = extension + 3;
88 
89     LIST_EXTENSIONS(RETURN_EXTENSION_IF_NAME_MATCHES)
90 
91     return TExtension::UNDEFINED;
92 }
93 
GetBehaviorString(TBehavior b)94 const char *GetBehaviorString(TBehavior b)
95 {
96     switch (b)
97     {
98         case EBhRequire:
99             return "require";
100         case EBhEnable:
101             return "enable";
102         case EBhWarn:
103             return "warn";
104         case EBhDisable:
105             return "disable";
106         default:
107             return nullptr;
108     }
109 }
110 
IsExtensionEnabled(const TExtensionBehavior & extBehavior,TExtension extension)111 bool IsExtensionEnabled(const TExtensionBehavior &extBehavior, TExtension extension)
112 {
113     ASSERT(extension != TExtension::UNDEFINED);
114     auto iter = extBehavior.find(extension);
115     return iter != extBehavior.end() &&
116            (iter->second == EBhEnable || iter->second == EBhRequire || iter->second == EBhWarn);
117 }
118 
119 }  // namespace sh
120