1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
#ifndef SLANG_CORE_RENDER_API_UTIL_H
#define SLANG_CORE_RENDER_API_UTIL_H
#include "../../source/core/slang-string.h"
#include "slang-com-helper.h"
namespace Slang
{
enum class RenderApiType
{
Unknown = -1,
Vulkan = 0,
D3D12,
D3D11,
Metal,
CPU,
CUDA,
CountOf,
};
// Use a struct wrapped Enum instead of enum class, cos we want to be able to manipulate as integrals
struct RenderApiFlag
{
enum Enum
{
Vulkan = 1 << int(RenderApiType::Vulkan),
D3D12 = 1 << int(RenderApiType::D3D12),
D3D11 = 1 << int(RenderApiType::D3D11),
Metal = 1 << int(RenderApiType::Metal),
CPU = 1 << int(RenderApiType::CPU),
CUDA = 1 << int(RenderApiType::CUDA),
AllOf = (1 << int(RenderApiType::CountOf)) - 1 ///< All bits set
};
};
typedef uint32_t RenderApiFlags;
struct RenderApiUtil
{
struct Info
{
RenderApiType type; ///< The type
const char* names; ///< Comma separated list of names associated with the type
const char* languageNames; ///< Comma separated list of target language names associated with the type
};
/// Returns true if the API is available.
static bool calcHasApi(RenderApiType type);
/// Returns a combination of RenderApiFlag bits which if set indicates that the API is available.
static int getAvailableApis();
/// Get the name
static UnownedStringSlice getApiName(RenderApiType type);
/// Returns RenderApiType::Unknown if not found
static RenderApiType findApiTypeByName(const Slang::UnownedStringSlice& name);
/// FlagsOut will have flag/flags specified by a name if returns with successful result code.
static Slang::Result findApiFlagsByName(const Slang::UnownedStringSlice& name, RenderApiFlags* flagsOut);
/// Parse api flags string, returning SLANG_OK on success.
/// If first character is + or - the flags will be applied to initialFlags, else initialFlags is ignored.
/// For example "all-dx12" would be all apis, except dx12
/// -vk would be whatever is in initial flags, but not vulkan.
static Slang::Result parseApiFlags(const Slang::UnownedStringSlice& text, RenderApiFlags initialFlags, RenderApiFlags* apiBitsOut);
/// Gets the API type from a string, or returns RenderApiType::Unknown if not found
static RenderApiType findRenderApiType(const Slang::UnownedStringSlice& text);
static RenderApiType findImplicitLanguageRenderApiType(const Slang::UnownedStringSlice& text);
/// Get information about a render API
static const Info& getInfo(RenderApiType type) { return s_infos[int(type)]; }
/// Static information about each render api
static const Info s_infos[int(RenderApiType::CountOf)];
};
} // namespace Slang
#endif // SLANG_RENDER_API_UTIL_H
|