diff options
author | Kenneth Benzie (Benie) <k.benzie@codeplay.com> | 2015-05-22 18:26:19 +0100 |
---|---|---|
committer | Kenneth Benzie (Benie) <k.benzie@codeplay.com> | 2015-05-22 18:26:19 +0100 |
commit | 83e5a29b06e8e5b379b8fbc261d909457179c995 (patch) | |
tree | dd8dde701a2905938dbaccd3235c83ce5ce33d14 /source/ext_inst.cpp | |
download | spirv-tools-83e5a29b06e8e5b379b8fbc261d909457179c995.tar.gz |
Code drop of the Codeplay spirv-tools source.
This commit contains the source for the SPIRV static library, spirv-as,
spirv-dis, and spirv-val tools.
Diffstat (limited to 'source/ext_inst.cpp')
-rw-r--r-- | source/ext_inst.cpp | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/source/ext_inst.cpp b/source/ext_inst.cpp new file mode 100644 index 00000000..04e1bba9 --- /dev/null +++ b/source/ext_inst.cpp @@ -0,0 +1,113 @@ +#include <libspirv/libspirv.h> + +#include <string.h> + +static const spv_ext_inst_desc_t glslStd450Entries[] = { + { + "round", GLSL_STD_450::Round, {SPV_OPERAND_TYPE_ID}, + }, + // TODO: Add remaining GLSL.std.450 instructions +}; + +static const spv_ext_inst_desc_t openclStd12Entries[] = { + {"placeholder", 0, {}}, + // TODO: Add remaining OpenCL.std.12 instructions +}; + +static const spv_ext_inst_desc_t openclStd20Entries[] = { + {"placeholder", 0, {}}, + // TODO: Add remaining OpenCL.std.20 instructions +}; + +static const spv_ext_inst_desc_t openclStd21Entries[] = { + {"placeholder", 0, {}}, + // TODO: Add remaining OpenCL.std.21 instructions +}; + +spv_result_t spvExtInstTableGet(spv_ext_inst_table *pExtInstTable) { + spvCheck(!pExtInstTable, return SPV_ERROR_INVALID_POINTER); + + static const spv_ext_inst_group_t groups[] = { + {SPV_EXT_INST_TYPE_GLSL_STD_450, + sizeof(glslStd450Entries) / sizeof(spv_ext_inst_desc_t), + glslStd450Entries}, + {SPV_EXT_INST_TYPE_OPENCL_STD_12, + sizeof(openclStd12Entries) / sizeof(spv_ext_inst_desc_t), + openclStd12Entries}, + {SPV_EXT_INST_TYPE_OPENCL_STD_20, + sizeof(openclStd20Entries) / sizeof(spv_ext_inst_desc_t), + openclStd20Entries}, + {SPV_EXT_INST_TYPE_OPENCL_STD_21, + sizeof(openclStd21Entries) / sizeof(spv_ext_inst_desc_t), + openclStd21Entries}, + }; + + static const spv_ext_inst_table_t table = { + sizeof(groups) / sizeof(spv_ext_inst_group_t), groups}; + + *pExtInstTable = &table; + + return SPV_SUCCESS; +} + +spv_ext_inst_type_t spvExtInstImportTypeGet(const char *name) { + if (!strcmp("GLSL.std.450", name)) { + return SPV_EXT_INST_TYPE_GLSL_STD_450; + } + if (!strcmp("OpenCL.std.12", name)) { + return SPV_EXT_INST_TYPE_OPENCL_STD_12; + } + if (!strcmp("OpenCL.std.20", name)) { + return SPV_EXT_INST_TYPE_OPENCL_STD_20; + } + if (!strcmp("OpenCL.std.21", name)) { + return SPV_EXT_INST_TYPE_OPENCL_STD_21; + } + return SPV_EXT_INST_TYPE_NONE; +} + +spv_result_t spvExtInstTableNameLookup(const spv_ext_inst_table table, + const spv_ext_inst_type_t type, + const char *name, + spv_ext_inst_desc *pEntry) { + spvCheck(!table, return SPV_ERROR_INVALID_TABLE); + spvCheck(!pEntry, return SPV_ERROR_INVALID_POINTER); + + for (uint32_t groupIndex = 0; groupIndex < table->count; groupIndex++) { + auto &group = table->groups[groupIndex]; + if (type == group.type) { + for (uint32_t index = 0; index < group.count; index++) { + auto &entry = group.entries[index]; + if (!strcmp(name, entry.name)) { + *pEntry = &table->groups[groupIndex].entries[index]; + return SPV_SUCCESS; + } + } + } + } + + return SPV_ERROR_INVALID_LOOKUP; +} + +spv_result_t spvExtInstTableValueLookup(const spv_ext_inst_table table, + const spv_ext_inst_type_t type, + const uint32_t value, + spv_ext_inst_desc *pEntry) { + spvCheck(!table, return SPV_ERROR_INVALID_TABLE); + spvCheck(!pEntry, return SPV_ERROR_INVALID_POINTER); + + for (uint32_t groupIndex = 0; groupIndex < table->count; groupIndex++) { + auto &group = table->groups[groupIndex]; + if (type == group.type) { + for (uint32_t index = 0; index < group.count; index++) { + auto &entry = group.entries[index]; + if (value == entry.ext_inst) { + *pEntry = &table->groups[groupIndex].entries[index]; + return SPV_SUCCESS; + } + } + } + } + + return SPV_ERROR_INVALID_LOOKUP; +} |