SPIRV-Tools/source/spirv_target_env.cpp
Andrey Tuganov 95843d7bd0 New spirv-1.3 rules for control barrier
Fixes https://github.com/KhronosGroup/SPIRV-Tools/issues/1427

Adjusting validation to the new rule:
"Before version 1.3, it is only valid to use this instruction with
TessellationControl, GLCompute, or Kernel execution models.
There is no such restriction starting with version 1.3."

Also fixed wrong version numbers in source/spirv_target_env.cpp.
2018-03-27 12:29:50 -04:00

189 lines
6.1 KiB
C++

// Copyright (c) 2015-2016 The Khronos Group Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include <cassert>
#include <cstring>
#include "spirv-tools/libspirv.h"
#include "spirv_constant.h"
const char* spvTargetEnvDescription(spv_target_env env) {
switch (env) {
case SPV_ENV_UNIVERSAL_1_0:
return "SPIR-V 1.0";
case SPV_ENV_VULKAN_1_0:
return "SPIR-V 1.0 (under Vulkan 1.0 semantics)";
case SPV_ENV_UNIVERSAL_1_1:
return "SPIR-V 1.1";
case SPV_ENV_OPENCL_1_2:
return "SPIR-V 1.0 (under OpenCL 1.2 Full Profile semantics)";
case SPV_ENV_OPENCL_EMBEDDED_1_2:
return "SPIR-V 1.0 (under OpenCL 1.2 Embedded Profile semantics)";
case SPV_ENV_OPENCL_2_0:
return "SPIR-V 1.0 (under OpenCL 2.0 Full Profile semantics)";
case SPV_ENV_OPENCL_EMBEDDED_2_0:
return "SPIR-V 1.0 (under OpenCL 2.0 Embedded Profile semantics)";
case SPV_ENV_OPENCL_2_1:
return "SPIR-V 1.0 (under OpenCL 2.1 Full Profile semantics)";
case SPV_ENV_OPENCL_EMBEDDED_2_1:
return "SPIR-V 1.0 (under OpenCL 2.1 Embedded Profile semantics)";
case SPV_ENV_OPENCL_2_2:
return "SPIR-V 1.2 (under OpenCL 2.2 Full Profile semantics)";
case SPV_ENV_OPENCL_EMBEDDED_2_2:
return "SPIR-V 1.2 (under OpenCL 2.2 Embedded Profile semantics)";
case SPV_ENV_OPENGL_4_0:
return "SPIR-V 1.0 (under OpenCL 4.0 semantics)";
case SPV_ENV_OPENGL_4_1:
return "SPIR-V 1.0 (under OpenCL 4.1 semantics)";
case SPV_ENV_OPENGL_4_2:
return "SPIR-V 1.0 (under OpenCL 4.2 semantics)";
case SPV_ENV_OPENGL_4_3:
return "SPIR-V 1.0 (under OpenCL 4.3 semantics)";
case SPV_ENV_OPENGL_4_5:
return "SPIR-V 1.0 (under OpenCL 4.5 semantics)";
case SPV_ENV_UNIVERSAL_1_2:
return "SPIR-V 1.2";
case SPV_ENV_UNIVERSAL_1_3:
return "SPIR-V 1.3";
case SPV_ENV_VULKAN_1_1:
return "SPIR-V 1.3 (under Vulkan 1.1 semantics)";
}
assert(0 && "Unhandled SPIR-V target environment");
return "";
}
uint32_t spvVersionForTargetEnv(spv_target_env env) {
switch (env) {
case SPV_ENV_UNIVERSAL_1_0:
case SPV_ENV_VULKAN_1_0:
case SPV_ENV_OPENCL_1_2:
case SPV_ENV_OPENCL_EMBEDDED_1_2:
case SPV_ENV_OPENCL_2_0:
case SPV_ENV_OPENCL_EMBEDDED_2_0:
case SPV_ENV_OPENCL_2_1:
case SPV_ENV_OPENCL_EMBEDDED_2_1:
case SPV_ENV_OPENGL_4_0:
case SPV_ENV_OPENGL_4_1:
case SPV_ENV_OPENGL_4_2:
case SPV_ENV_OPENGL_4_3:
case SPV_ENV_OPENGL_4_5:
return SPV_SPIRV_VERSION_WORD(1, 0);
case SPV_ENV_UNIVERSAL_1_1:
return SPV_SPIRV_VERSION_WORD(1, 1);
case SPV_ENV_UNIVERSAL_1_2:
case SPV_ENV_OPENCL_2_2:
case SPV_ENV_OPENCL_EMBEDDED_2_2:
return SPV_SPIRV_VERSION_WORD(1, 2);
case SPV_ENV_UNIVERSAL_1_3:
case SPV_ENV_VULKAN_1_1:
return SPV_SPIRV_VERSION_WORD(1, 3);
}
assert(0 && "Unhandled SPIR-V target environment");
return SPV_SPIRV_VERSION_WORD(0, 0);
}
bool spvParseTargetEnv(const char* s, spv_target_env* env) {
auto match = [s](const char* b) {
return s && (0 == strncmp(s, b, strlen(b)));
};
if (match("vulkan1.0")) {
if (env) *env = SPV_ENV_VULKAN_1_0;
return true;
} else if (match("vulkan1.1")) {
if (env) *env = SPV_ENV_VULKAN_1_1;
return true;
} else if (match("spv1.0")) {
if (env) *env = SPV_ENV_UNIVERSAL_1_0;
return true;
} else if (match("spv1.1")) {
if (env) *env = SPV_ENV_UNIVERSAL_1_1;
return true;
} else if (match("spv1.2")) {
if (env) *env = SPV_ENV_UNIVERSAL_1_2;
return true;
} else if (match("spv1.3")) {
if (env) *env = SPV_ENV_UNIVERSAL_1_3;
return true;
} else if (match("opencl1.2embedded")) {
if (env) *env = SPV_ENV_OPENCL_EMBEDDED_1_2;
return true;
} else if (match("opencl1.2")) {
if (env) *env = SPV_ENV_OPENCL_1_2;
return true;
} else if (match("opencl2.0embedded")) {
if (env) *env = SPV_ENV_OPENCL_EMBEDDED_2_0;
return true;
} else if (match("opencl2.0")) {
if (env) *env = SPV_ENV_OPENCL_2_0;
return true;
} else if (match("opencl2.1embedded")) {
if (env) *env = SPV_ENV_OPENCL_EMBEDDED_2_1;
return true;
} else if (match("opencl2.1")) {
if (env) *env = SPV_ENV_OPENCL_2_1;
return true;
} else if (match("opencl2.2embedded")) {
if (env) *env = SPV_ENV_OPENCL_EMBEDDED_2_2;
return true;
} else if (match("opencl2.2")) {
if (env) *env = SPV_ENV_OPENCL_2_2;
return true;
} else if (match("opengl4.0")) {
if (env) *env = SPV_ENV_OPENGL_4_0;
return true;
} else if (match("opengl4.1")) {
if (env) *env = SPV_ENV_OPENGL_4_1;
return true;
} else if (match("opengl4.2")) {
if (env) *env = SPV_ENV_OPENGL_4_2;
return true;
} else if (match("opengl4.3")) {
if (env) *env = SPV_ENV_OPENGL_4_3;
return true;
} else if (match("opengl4.5")) {
if (env) *env = SPV_ENV_OPENGL_4_5;
return true;
} else {
if (env) *env = SPV_ENV_UNIVERSAL_1_0;
return false;
}
}
bool spvIsVulkanEnv(spv_target_env env) {
switch (env) {
case SPV_ENV_UNIVERSAL_1_0:
case SPV_ENV_OPENCL_1_2:
case SPV_ENV_OPENCL_EMBEDDED_1_2:
case SPV_ENV_OPENCL_2_0:
case SPV_ENV_OPENCL_EMBEDDED_2_0:
case SPV_ENV_OPENCL_2_1:
case SPV_ENV_OPENCL_EMBEDDED_2_1:
case SPV_ENV_OPENGL_4_0:
case SPV_ENV_OPENGL_4_1:
case SPV_ENV_OPENGL_4_2:
case SPV_ENV_OPENGL_4_3:
case SPV_ENV_OPENGL_4_5:
case SPV_ENV_UNIVERSAL_1_1:
case SPV_ENV_UNIVERSAL_1_2:
case SPV_ENV_OPENCL_2_2:
case SPV_ENV_OPENCL_EMBEDDED_2_2:
case SPV_ENV_UNIVERSAL_1_3:
return false;
case SPV_ENV_VULKAN_1_0:
case SPV_ENV_VULKAN_1_1:
return true;
}
return false;
}