blob: 8a459a375b9df53f99a75aade52da8bd9b6842ec [file] [log] [blame]
Lei Zhang6fa3f8a2016-03-31 17:26:31 -04001// Copyright (c) 2015-2016 The Khronos Group Inc.
2//
David Neto9fc86582016-09-01 15:33:59 -04003// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
Lei Zhang6fa3f8a2016-03-31 17:26:31 -04006//
David Neto9fc86582016-09-01 15:33:59 -04007// http://www.apache.org/licenses/LICENSE-2.0
Lei Zhang6fa3f8a2016-03-31 17:26:31 -04008//
David Neto9fc86582016-09-01 15:33:59 -04009// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040014
Dejan Mircevski27030392016-05-11 09:48:52 -040015#include <cassert>
16#include <cstring>
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040017
18#include "spirv-tools/libspirv.h"
19#include "spirv_constant.h"
20
21const char* spvTargetEnvDescription(spv_target_env env) {
22 switch (env) {
23 case SPV_ENV_UNIVERSAL_1_0:
24 return "SPIR-V 1.0";
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040025 case SPV_ENV_VULKAN_1_0:
26 return "SPIR-V 1.0 (under Vulkan 1.0 semantics)";
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040027 case SPV_ENV_UNIVERSAL_1_1:
28 return "SPIR-V 1.1";
David Netoc2967012016-08-05 18:19:30 -040029 case SPV_ENV_OPENCL_2_1:
30 return "SPIR-V 1.0 (under OpenCL 2.1 semantics)";
31 case SPV_ENV_OPENCL_2_2:
32 return "SPIR-V 1.1 (under OpenCL 2.2 semantics)";
33 case SPV_ENV_OPENGL_4_0:
34 return "SPIR-V 1.0 (under OpenCL 4.0 semantics)";
35 case SPV_ENV_OPENGL_4_1:
36 return "SPIR-V 1.0 (under OpenCL 4.1 semantics)";
37 case SPV_ENV_OPENGL_4_2:
38 return "SPIR-V 1.0 (under OpenCL 4.2 semantics)";
39 case SPV_ENV_OPENGL_4_3:
40 return "SPIR-V 1.0 (under OpenCL 4.3 semantics)";
41 case SPV_ENV_OPENGL_4_5:
42 return "SPIR-V 1.0 (under OpenCL 4.5 semantics)";
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040043 }
44 assert(0 && "Unhandled SPIR-V target environment");
45 return "";
46}
47
48uint32_t spvVersionForTargetEnv(spv_target_env env) {
49 switch (env) {
50 case SPV_ENV_UNIVERSAL_1_0:
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040051 case SPV_ENV_VULKAN_1_0:
David Netoc2967012016-08-05 18:19:30 -040052 case SPV_ENV_OPENCL_2_1:
53 case SPV_ENV_OPENGL_4_0:
54 case SPV_ENV_OPENGL_4_1:
55 case SPV_ENV_OPENGL_4_2:
56 case SPV_ENV_OPENGL_4_3:
57 case SPV_ENV_OPENGL_4_5:
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040058 return SPV_SPIRV_VERSION_WORD(1, 0);
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040059 case SPV_ENV_UNIVERSAL_1_1:
David Netoc2967012016-08-05 18:19:30 -040060 case SPV_ENV_OPENCL_2_2:
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040061 return SPV_SPIRV_VERSION_WORD(1, 1);
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040062 }
63 assert(0 && "Unhandled SPIR-V target environment");
64 return SPV_SPIRV_VERSION_WORD(0, 0);
65}
Dejan Mircevski27030392016-05-11 09:48:52 -040066
67bool spvParseTargetEnv(const char* s, spv_target_env* env) {
David Netoc2967012016-08-05 18:19:30 -040068 auto match = [s](const char* b) {
69 return s && (0 == strncmp(s, b, strlen(b)));
70 };
71 if (match("vulkan1.0")) {
Dejan Mircevski27030392016-05-11 09:48:52 -040072 if (env) *env = SPV_ENV_VULKAN_1_0;
73 return true;
David Netoc2967012016-08-05 18:19:30 -040074 } else if (match("spv1.0")) {
Dejan Mircevski27030392016-05-11 09:48:52 -040075 if (env) *env = SPV_ENV_UNIVERSAL_1_0;
76 return true;
David Netoc2967012016-08-05 18:19:30 -040077 } else if (match("spv1.1")) {
Dejan Mircevski27030392016-05-11 09:48:52 -040078 if (env) *env = SPV_ENV_UNIVERSAL_1_1;
79 return true;
David Netoc2967012016-08-05 18:19:30 -040080 } else if (match("opencl2.1")) {
81 if (env) *env = SPV_ENV_OPENCL_2_1;
82 return true;
83 } else if (match("opencl2.2")) {
84 if (env) *env = SPV_ENV_OPENCL_2_2;
85 return true;
86 } else if (match("opengl4.0")) {
87 if (env) *env = SPV_ENV_OPENGL_4_0;
88 return true;
89 } else if (match("opengl4.1")) {
90 if (env) *env = SPV_ENV_OPENGL_4_1;
91 return true;
92 } else if (match("opengl4.2")) {
93 if (env) *env = SPV_ENV_OPENGL_4_2;
94 return true;
95 } else if (match("opengl4.3")) {
96 if (env) *env = SPV_ENV_OPENGL_4_3;
97 return true;
98 } else if (match("opengl4.5")) {
99 if (env) *env = SPV_ENV_OPENGL_4_5;
100 return true;
Dejan Mircevski27030392016-05-11 09:48:52 -0400101 } else {
102 if (env) *env = SPV_ENV_UNIVERSAL_1_0;
103 return false;
104 }
105}