blob: ed47f525e5eea326971a755a20a5513eec77c792 [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)";
David Netodbc20492017-03-14 12:43:41 -040043 case SPV_ENV_UNIVERSAL_1_2:
44 return "SPIR-V 1.2";
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040045 }
46 assert(0 && "Unhandled SPIR-V target environment");
47 return "";
48}
49
50uint32_t spvVersionForTargetEnv(spv_target_env env) {
51 switch (env) {
52 case SPV_ENV_UNIVERSAL_1_0:
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040053 case SPV_ENV_VULKAN_1_0:
David Netoc2967012016-08-05 18:19:30 -040054 case SPV_ENV_OPENCL_2_1:
55 case SPV_ENV_OPENGL_4_0:
56 case SPV_ENV_OPENGL_4_1:
57 case SPV_ENV_OPENGL_4_2:
58 case SPV_ENV_OPENGL_4_3:
59 case SPV_ENV_OPENGL_4_5:
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040060 return SPV_SPIRV_VERSION_WORD(1, 0);
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040061 case SPV_ENV_UNIVERSAL_1_1:
62 return SPV_SPIRV_VERSION_WORD(1, 1);
David Netodbc20492017-03-14 12:43:41 -040063 case SPV_ENV_UNIVERSAL_1_2:
64 case SPV_ENV_OPENCL_2_2:
65 return SPV_SPIRV_VERSION_WORD(1, 2);
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040066 }
67 assert(0 && "Unhandled SPIR-V target environment");
68 return SPV_SPIRV_VERSION_WORD(0, 0);
69}
Dejan Mircevski27030392016-05-11 09:48:52 -040070
71bool spvParseTargetEnv(const char* s, spv_target_env* env) {
David Netoc2967012016-08-05 18:19:30 -040072 auto match = [s](const char* b) {
73 return s && (0 == strncmp(s, b, strlen(b)));
74 };
75 if (match("vulkan1.0")) {
Dejan Mircevski27030392016-05-11 09:48:52 -040076 if (env) *env = SPV_ENV_VULKAN_1_0;
77 return true;
David Netoc2967012016-08-05 18:19:30 -040078 } else if (match("spv1.0")) {
Dejan Mircevski27030392016-05-11 09:48:52 -040079 if (env) *env = SPV_ENV_UNIVERSAL_1_0;
80 return true;
David Netoc2967012016-08-05 18:19:30 -040081 } else if (match("spv1.1")) {
Dejan Mircevski27030392016-05-11 09:48:52 -040082 if (env) *env = SPV_ENV_UNIVERSAL_1_1;
83 return true;
David Netodbc20492017-03-14 12:43:41 -040084 } else if (match("spv1.2")) {
85 if (env) *env = SPV_ENV_UNIVERSAL_1_2;
86 return true;
David Netoc2967012016-08-05 18:19:30 -040087 } else if (match("opencl2.1")) {
88 if (env) *env = SPV_ENV_OPENCL_2_1;
89 return true;
90 } else if (match("opencl2.2")) {
91 if (env) *env = SPV_ENV_OPENCL_2_2;
92 return true;
93 } else if (match("opengl4.0")) {
94 if (env) *env = SPV_ENV_OPENGL_4_0;
95 return true;
96 } else if (match("opengl4.1")) {
97 if (env) *env = SPV_ENV_OPENGL_4_1;
98 return true;
99 } else if (match("opengl4.2")) {
100 if (env) *env = SPV_ENV_OPENGL_4_2;
101 return true;
102 } else if (match("opengl4.3")) {
103 if (env) *env = SPV_ENV_OPENGL_4_3;
104 return true;
105 } else if (match("opengl4.5")) {
106 if (env) *env = SPV_ENV_OPENGL_4_5;
107 return true;
Dejan Mircevski27030392016-05-11 09:48:52 -0400108 } else {
109 if (env) *env = SPV_ENV_UNIVERSAL_1_0;
110 return false;
111 }
112}