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
35namespace sh
36{
37
38#define RETURN_EXTENSION_NAME_CASE(ext) \
39 case TExtension::ext: \
40 return "GL_" #ext;
41
42const 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
59TExtension 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
73const 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
90bool 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