blob: b69454443d8c4e27419002766bca16ebfc2d1a99 [file] [log] [blame]
Dejan Mircevskib6fe02f2016-01-07 13:44:22 -05001// Copyright (c) 2015-2016 The Khronos Group Inc.
Lei Zhang2a0b7732015-11-11 13:57:43 -05002//
3// Permission is hereby granted, free of charge, to any person obtaining a
4// copy of this software and/or associated documentation files (the
5// "Materials"), to deal in the Materials without restriction, including
6// without limitation the rights to use, copy, modify, merge, publish,
7// distribute, sublicense, and/or sell copies of the Materials, and to
8// permit persons to whom the Materials are furnished to do so, subject to
9// the following conditions:
10//
11// The above copyright notice and this permission notice shall be included
12// in all copies or substantial portions of the Materials.
13//
14// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS
15// KHRONOS STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS
16// SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT
17// https://www.khronos.org/registry/
18//
19// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
22// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
23// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
26
Lei Zhang7a222e42015-11-11 12:40:25 -050027#include "ext_inst.h"
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010028
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040029#include <cassert>
30#include <cstring>
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010031
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040032#include "spirv/GLSL.std.450.h"
33#include "spirv/OpenCL.std.h"
David Netod1bb51d2016-02-17 12:17:04 -050034#include "spirv_definition.h"
35
Lei Zhangca1bf942016-04-27 16:47:13 -040036#include "macro.h"
37
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040038static const spv_ext_inst_desc_t glslStd450Entries_1_0[] = {
Dejan Mircevskie26fdc62016-04-07 14:09:48 -040039#include "glsl.std.450.insts-1-0.inc"
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010040};
41
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040042static const spv_ext_inst_desc_t openclEntries_1_0[] = {
Dejan Mircevskie26fdc62016-04-07 14:09:48 -040043#include "opencl.std.insts-1-0.inc"
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010044};
45
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040046spv_result_t spvExtInstTableGet(spv_ext_inst_table* pExtInstTable,
47 spv_target_env env) {
Lei Zhang40056702015-09-11 14:31:27 -040048 if (!pExtInstTable) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010049
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040050 static const spv_ext_inst_group_t groups_1_0[] = {
Lei Zhangca1bf942016-04-27 16:47:13 -040051 {SPV_EXT_INST_TYPE_GLSL_STD_450, ARRAY_SIZE(glslStd450Entries_1_0),
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040052 glslStd450Entries_1_0},
Lei Zhangca1bf942016-04-27 16:47:13 -040053 {SPV_EXT_INST_TYPE_OPENCL_STD, ARRAY_SIZE(openclEntries_1_0),
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040054 openclEntries_1_0},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010055 };
56
Lei Zhangca1bf942016-04-27 16:47:13 -040057 static const spv_ext_inst_table_t table_1_0 = {ARRAY_SIZE(groups_1_0),
58 groups_1_0};
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010059
Dejan Mircevskicb3c49e2016-04-07 14:41:34 -040060 switch (env) {
61 // The extended instruction sets are all version 1.0 so far.
62 case SPV_ENV_UNIVERSAL_1_0:
63 case SPV_ENV_VULKAN_1_0:
64 case SPV_ENV_UNIVERSAL_1_1:
65 *pExtInstTable = &table_1_0;
66 return SPV_SUCCESS;
67 default:
68 assert(0 && "Unknown spv_target_env in spvExtInstTableGet()");
69 return SPV_ERROR_INVALID_TABLE;
70 }
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010071}
72
Lei Zhang1a0334e2015-11-02 09:41:20 -050073spv_ext_inst_type_t spvExtInstImportTypeGet(const char* name) {
David Neto21c4ad42015-10-14 17:02:11 -040074 // The names are specified by the respective extension instruction
75 // specifications.
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010076 if (!strcmp("GLSL.std.450", name)) {
77 return SPV_EXT_INST_TYPE_GLSL_STD_450;
78 }
David Neto21c4ad42015-10-14 17:02:11 -040079 if (!strcmp("OpenCL.std", name)) {
80 return SPV_EXT_INST_TYPE_OPENCL_STD;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010081 }
82 return SPV_EXT_INST_TYPE_NONE;
83}
84
85spv_result_t spvExtInstTableNameLookup(const spv_ext_inst_table table,
86 const spv_ext_inst_type_t type,
Lei Zhang1a0334e2015-11-02 09:41:20 -050087 const char* name,
88 spv_ext_inst_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -040089 if (!table) return SPV_ERROR_INVALID_TABLE;
90 if (!pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010091
92 for (uint32_t groupIndex = 0; groupIndex < table->count; groupIndex++) {
Lei Zhangca1bf942016-04-27 16:47:13 -040093 const auto& group = table->groups[groupIndex];
94 if (type != group.type) continue;
95 for (uint32_t index = 0; index < group.count; index++) {
96 const auto& entry = group.entries[index];
97 if (!strcmp(name, entry.name)) {
98 *pEntry = &entry;
99 return SPV_SUCCESS;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100100 }
101 }
102 }
103
104 return SPV_ERROR_INVALID_LOOKUP;
105}
106
107spv_result_t spvExtInstTableValueLookup(const spv_ext_inst_table table,
108 const spv_ext_inst_type_t type,
109 const uint32_t value,
Lei Zhang1a0334e2015-11-02 09:41:20 -0500110 spv_ext_inst_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -0400111 if (!table) return SPV_ERROR_INVALID_TABLE;
112 if (!pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100113
114 for (uint32_t groupIndex = 0; groupIndex < table->count; groupIndex++) {
Lei Zhangca1bf942016-04-27 16:47:13 -0400115 const auto& group = table->groups[groupIndex];
116 if (type != group.type) continue;
117 for (uint32_t index = 0; index < group.count; index++) {
118 const auto& entry = group.entries[index];
119 if (value == entry.ext_inst) {
120 *pEntry = &entry;
121 return SPV_SUCCESS;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100122 }
123 }
124 }
125
126 return SPV_ERROR_INVALID_LOOKUP;
127}