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