1 | // |
---|---|
2 | // Copyright (c) 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(OVR_multiview2) \ |
33 | OP(ANGLE_multi_draw) |
34 | |
35 | namespace sh |
36 | { |
37 | |
38 | #define RETURN_EXTENSION_NAME_CASE(ext) \ |
39 | case TExtension::ext: \ |
40 | return "GL_" #ext; |
41 | |
42 | const char *GetExtensionNameString(TExtension extension) |
43 | { |
44 | switch (extension) |
45 | { |
46 | LIST_EXTENSIONS(RETURN_EXTENSION_NAME_CASE) |
47 | default: |
48 | UNREACHABLE(); |
49 | return ""; |
50 | } |
51 | } |
52 | |
53 | #define RETURN_EXTENSION_IF_NAME_MATCHES(ext) \ |
54 | if (strcmp(extWithoutGLPrefix, #ext) == 0) \ |
55 | { \ |
56 | return TExtension::ext; \ |
57 | } |
58 | |
59 | TExtension GetExtensionByName(const char *extension) |
60 | { |
61 | // If first characters of the extension don't equal "GL_", early out. |
62 | if (strncmp(extension, "GL_", 3) != 0) |
63 | { |
64 | return TExtension::UNDEFINED; |
65 | } |
66 | const char *extWithoutGLPrefix = extension + 3; |
67 | |
68 | LIST_EXTENSIONS(RETURN_EXTENSION_IF_NAME_MATCHES) |
69 | |
70 | return TExtension::UNDEFINED; |
71 | } |
72 | |
73 | const char *GetBehaviorString(TBehavior b) |
74 | { |
75 | switch (b) |
76 | { |
77 | case EBhRequire: |
78 | return "require"; |
79 | case EBhEnable: |
80 | return "enable"; |
81 | case EBhWarn: |
82 | return "warn"; |
83 | case EBhDisable: |
84 | return "disable"; |
85 | default: |
86 | return nullptr; |
87 | } |
88 | } |
89 | |
90 | bool IsExtensionEnabled(const TExtensionBehavior &extBehavior, TExtension extension) |
91 | { |
92 | ASSERT(extension != TExtension::UNDEFINED); |
93 | auto iter = extBehavior.find(extension); |
94 | return iter != extBehavior.end() && |
95 | (iter->second == EBhEnable || iter->second == EBhRequire || iter->second == EBhWarn); |
96 | } |
97 | |
98 | } // namespace sh |
99 |