blob: 32e76fe3ee241139ecdf4b7506f932634fdea081 [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
29#include <string.h>
30
Lei Zhang6fa3f8a2016-03-31 17:26:31 -040031#include "spirv/GLSL.std.450.h"
32#include "spirv/OpenCL.std.h"
David Netod1bb51d2016-02-17 12:17:04 -050033#include "spirv_definition.h"
34
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010035static const spv_ext_inst_desc_t glslStd450Entries[] = {
Dejan Mircevskie26fdc62016-04-07 14:09:48 -040036#include "glsl.std.450.insts-1-0.inc"
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010037};
38
David Neto21c4ad42015-10-14 17:02:11 -040039static const spv_ext_inst_desc_t openclEntries[] = {
Dejan Mircevskie26fdc62016-04-07 14:09:48 -040040#include "opencl.std.insts-1-0.inc"
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010041};
42
Lei Zhang1a0334e2015-11-02 09:41:20 -050043spv_result_t spvExtInstTableGet(spv_ext_inst_table* pExtInstTable) {
Lei Zhang40056702015-09-11 14:31:27 -040044 if (!pExtInstTable) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010045
46 static const spv_ext_inst_group_t groups[] = {
47 {SPV_EXT_INST_TYPE_GLSL_STD_450,
David Netoba73a7c2016-01-06 13:08:39 -050048 static_cast<uint32_t>(sizeof(glslStd450Entries) /
49 sizeof(spv_ext_inst_desc_t)),
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010050 glslStd450Entries},
David Neto21c4ad42015-10-14 17:02:11 -040051 {SPV_EXT_INST_TYPE_OPENCL_STD,
David Netoba73a7c2016-01-06 13:08:39 -050052 static_cast<uint32_t>(sizeof(openclEntries) /
53 sizeof(spv_ext_inst_desc_t)),
54 openclEntries},
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010055 };
56
57 static const spv_ext_inst_table_t table = {
David Netoba73a7c2016-01-06 13:08:39 -050058 static_cast<uint32_t>(sizeof(groups) / sizeof(spv_ext_inst_group_t)),
59 groups};
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010060
61 *pExtInstTable = &table;
62
63 return SPV_SUCCESS;
64}
65
Lei Zhang1a0334e2015-11-02 09:41:20 -050066spv_ext_inst_type_t spvExtInstImportTypeGet(const char* name) {
David Neto21c4ad42015-10-14 17:02:11 -040067 // The names are specified by the respective extension instruction
68 // specifications.
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010069 if (!strcmp("GLSL.std.450", name)) {
70 return SPV_EXT_INST_TYPE_GLSL_STD_450;
71 }
David Neto21c4ad42015-10-14 17:02:11 -040072 if (!strcmp("OpenCL.std", name)) {
73 return SPV_EXT_INST_TYPE_OPENCL_STD;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010074 }
75 return SPV_EXT_INST_TYPE_NONE;
76}
77
78spv_result_t spvExtInstTableNameLookup(const spv_ext_inst_table table,
79 const spv_ext_inst_type_t type,
Lei Zhang1a0334e2015-11-02 09:41:20 -050080 const char* name,
81 spv_ext_inst_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -040082 if (!table) return SPV_ERROR_INVALID_TABLE;
83 if (!pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010084
85 for (uint32_t groupIndex = 0; groupIndex < table->count; groupIndex++) {
Lei Zhang1a0334e2015-11-02 09:41:20 -050086 auto& group = table->groups[groupIndex];
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010087 if (type == group.type) {
88 for (uint32_t index = 0; index < group.count; index++) {
Lei Zhang1a0334e2015-11-02 09:41:20 -050089 auto& entry = group.entries[index];
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +010090 if (!strcmp(name, entry.name)) {
91 *pEntry = &table->groups[groupIndex].entries[index];
92 return SPV_SUCCESS;
93 }
94 }
95 }
96 }
97
98 return SPV_ERROR_INVALID_LOOKUP;
99}
100
101spv_result_t spvExtInstTableValueLookup(const spv_ext_inst_table table,
102 const spv_ext_inst_type_t type,
103 const uint32_t value,
Lei Zhang1a0334e2015-11-02 09:41:20 -0500104 spv_ext_inst_desc* pEntry) {
Lei Zhang40056702015-09-11 14:31:27 -0400105 if (!table) return SPV_ERROR_INVALID_TABLE;
106 if (!pEntry) return SPV_ERROR_INVALID_POINTER;
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100107
108 for (uint32_t groupIndex = 0; groupIndex < table->count; groupIndex++) {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500109 auto& group = table->groups[groupIndex];
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100110 if (type == group.type) {
111 for (uint32_t index = 0; index < group.count; index++) {
Lei Zhang1a0334e2015-11-02 09:41:20 -0500112 auto& entry = group.entries[index];
Kenneth Benzie (Benie)83e5a292015-05-22 18:26:19 +0100113 if (value == entry.ext_inst) {
114 *pEntry = &table->groups[groupIndex].entries[index];
115 return SPV_SUCCESS;
116 }
117 }
118 }
119 }
120
121 return SPV_ERROR_INVALID_LOOKUP;
122}