[Vulkan] Cleanup and update SPIR-V dependencies
This commit is contained in:
parent
2782fc927d
commit
4862075976
|
@ -10,9 +10,6 @@
|
||||||
[submodule "third_party/libav"]
|
[submodule "third_party/libav"]
|
||||||
path = third_party/libav
|
path = third_party/libav
|
||||||
url = https://github.com/xenia-project/libav.git
|
url = https://github.com/xenia-project/libav.git
|
||||||
[submodule "third_party/spirv-tools"]
|
|
||||||
path = third_party/spirv-tools
|
|
||||||
url = https://github.com/xenia-project/SPIRV-Tools.git
|
|
||||||
[submodule "third_party/catch"]
|
[submodule "third_party/catch"]
|
||||||
path = third_party/catch
|
path = third_party/catch
|
||||||
url = https://github.com/catchorg/Catch2.git
|
url = https://github.com/catchorg/Catch2.git
|
||||||
|
@ -25,12 +22,6 @@
|
||||||
[submodule "third_party/premake-export-compile-commands"]
|
[submodule "third_party/premake-export-compile-commands"]
|
||||||
path = third_party/premake-export-compile-commands
|
path = third_party/premake-export-compile-commands
|
||||||
url = https://github.com/xenia-project/premake-export-compile-commands.git
|
url = https://github.com/xenia-project/premake-export-compile-commands.git
|
||||||
[submodule "third_party/spirv-headers"]
|
|
||||||
path = third_party/spirv-headers
|
|
||||||
url = https://github.com/KhronosGroup/SPIRV-Headers.git
|
|
||||||
[submodule "third_party/volk"]
|
|
||||||
path = third_party/volk
|
|
||||||
url = https://github.com/zeux/volk.git
|
|
||||||
[submodule "third_party/discord-rpc"]
|
[submodule "third_party/discord-rpc"]
|
||||||
path = third_party/discord-rpc
|
path = third_party/discord-rpc
|
||||||
url = https://github.com/discordapp/discord-rpc.git
|
url = https://github.com/discordapp/discord-rpc.git
|
||||||
|
@ -64,3 +55,6 @@
|
||||||
[submodule "third_party/DirectXShaderCompiler"]
|
[submodule "third_party/DirectXShaderCompiler"]
|
||||||
path = third_party/DirectXShaderCompiler
|
path = third_party/DirectXShaderCompiler
|
||||||
url = https://github.com/microsoft/DirectXShaderCompiler.git
|
url = https://github.com/microsoft/DirectXShaderCompiler.git
|
||||||
|
[submodule "third_party/glslang"]
|
||||||
|
path = third_party/glslang
|
||||||
|
url = https://github.com/KhronosGroup/glslang.git
|
||||||
|
|
|
@ -225,7 +225,6 @@ solution("xenia")
|
||||||
include("third_party/mspack.lua")
|
include("third_party/mspack.lua")
|
||||||
include("third_party/SDL2.lua")
|
include("third_party/SDL2.lua")
|
||||||
include("third_party/snappy.lua")
|
include("third_party/snappy.lua")
|
||||||
include("third_party/spirv-tools.lua")
|
|
||||||
include("third_party/xxhash.lua")
|
include("third_party/xxhash.lua")
|
||||||
|
|
||||||
include("src/xenia")
|
include("src/xenia")
|
||||||
|
|
|
@ -19,7 +19,6 @@ project("xenia-app")
|
||||||
"libavutil",
|
"libavutil",
|
||||||
"mspack",
|
"mspack",
|
||||||
"snappy",
|
"snappy",
|
||||||
"spirv-tools",
|
|
||||||
"xenia-app-discord",
|
"xenia-app-discord",
|
||||||
"xenia-apu",
|
"xenia-apu",
|
||||||
"xenia-apu-nop",
|
"xenia-apu-nop",
|
||||||
|
|
|
@ -11,16 +11,12 @@ project("xenia-gpu")
|
||||||
"fmt",
|
"fmt",
|
||||||
"glslang-spirv",
|
"glslang-spirv",
|
||||||
"snappy",
|
"snappy",
|
||||||
"spirv-tools",
|
|
||||||
"xenia-base",
|
"xenia-base",
|
||||||
"xenia-ui",
|
"xenia-ui",
|
||||||
"xxhash",
|
"xxhash",
|
||||||
})
|
})
|
||||||
defines({
|
defines({
|
||||||
})
|
})
|
||||||
includedirs({
|
|
||||||
project_root.."/third_party/spirv-tools/external/include",
|
|
||||||
})
|
|
||||||
local_platform_files()
|
local_platform_files()
|
||||||
|
|
||||||
group("src")
|
group("src")
|
||||||
|
@ -32,7 +28,6 @@ project("xenia-gpu-shader-compiler")
|
||||||
"dxbc",
|
"dxbc",
|
||||||
"fmt",
|
"fmt",
|
||||||
"glslang-spirv",
|
"glslang-spirv",
|
||||||
"spirv-tools",
|
|
||||||
"xenia-base",
|
"xenia-base",
|
||||||
"xenia-gpu",
|
"xenia-gpu",
|
||||||
})
|
})
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 2067d1a93e6edc17f2a6b7e3e5138a9bbcd35ef9
|
|
@ -11,27 +11,35 @@ project("glslang-spirv")
|
||||||
includedirs({
|
includedirs({
|
||||||
})
|
})
|
||||||
files({
|
files({
|
||||||
"glslang-spirv/bitutils.h",
|
"glslang/SPIRV/bitutils.h",
|
||||||
"glslang-spirv/disassemble.cpp",
|
-- Disabled temporarily until PR #2417 removing SpvTools.h dependency is
|
||||||
"glslang-spirv/disassemble.h",
|
-- merged.
|
||||||
"glslang-spirv/doc.cpp",
|
-- "glslang/SPIRV/disassemble.cpp",
|
||||||
"glslang-spirv/doc.h",
|
-- "glslang/SPIRV/disassemble.h",
|
||||||
"glslang-spirv/GLSL.ext.AMD.h",
|
"glslang/SPIRV/doc.cpp",
|
||||||
"glslang-spirv/GLSL.ext.EXT.h",
|
"glslang/SPIRV/doc.h",
|
||||||
"glslang-spirv/GLSL.ext.KHR.h",
|
"glslang/SPIRV/GLSL.ext.AMD.h",
|
||||||
"glslang-spirv/GLSL.ext.NV.h",
|
"glslang/SPIRV/GLSL.ext.EXT.h",
|
||||||
"glslang-spirv/GLSL.std.450.h",
|
"glslang/SPIRV/GLSL.ext.KHR.h",
|
||||||
-- Disabled until required.
|
"glslang/SPIRV/GLSL.ext.NV.h",
|
||||||
-- "glslang-spirv/GlslangToSpv.cpp",
|
"glslang/SPIRV/GLSL.std.450.h",
|
||||||
-- "glslang-spirv/GlslangToSpv.h",
|
-- Disabled because GLSL is not used.
|
||||||
"glslang-spirv/hex_float.h",
|
-- "glslang/SPIRV/GlslangToSpv.cpp",
|
||||||
"glslang-spirv/InReadableOrder.cpp",
|
-- "glslang/SPIRV/GlslangToSpv.h",
|
||||||
"glslang-spirv/Logger.cpp",
|
"glslang/SPIRV/hex_float.h",
|
||||||
"glslang-spirv/Logger.h",
|
"glslang/SPIRV/InReadableOrder.cpp",
|
||||||
"glslang-spirv/spirv.hpp",
|
"glslang/SPIRV/Logger.cpp",
|
||||||
"glslang-spirv/SpvBuilder.cpp",
|
"glslang/SPIRV/Logger.h",
|
||||||
"glslang-spirv/SpvBuilder.h",
|
"glslang/SPIRV/NonSemanticDebugPrintf.h",
|
||||||
"glslang-spirv/spvIR.h",
|
"glslang/SPIRV/spirv.hpp",
|
||||||
"glslang-spirv/SPVRemapper.cpp",
|
"glslang/SPIRV/SpvBuilder.cpp",
|
||||||
"glslang-spirv/SPVRemapper.h",
|
"glslang/SPIRV/SpvBuilder.h",
|
||||||
|
"glslang/SPIRV/spvIR.h",
|
||||||
|
-- Disabled because of spirv-tools dependency.
|
||||||
|
-- "glslang/SPIRV/SpvPostProcess.cpp",
|
||||||
|
"glslang/SPIRV/SPVRemapper.cpp",
|
||||||
|
"glslang/SPIRV/SPVRemapper.h",
|
||||||
|
-- Disabled because of spirv-tools dependency.
|
||||||
|
-- "glslang/SPIRV/SpvTools.cpp",
|
||||||
|
-- "glslang/SPIRV/SpvTools.h",
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,110 +0,0 @@
|
||||||
/*
|
|
||||||
** Copyright (c) 2014-2016 The Khronos Group Inc.
|
|
||||||
**
|
|
||||||
** Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
** of this software and/or associated documentation files (the "Materials"),
|
|
||||||
** to deal in the Materials without restriction, including without limitation
|
|
||||||
** the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
||||||
** and/or sell copies of the Materials, and to permit persons to whom the
|
|
||||||
** Materials are furnished to do so, subject to the following conditions:
|
|
||||||
**
|
|
||||||
** The above copyright notice and this permission notice shall be included in
|
|
||||||
** all copies or substantial portions of the Materials.
|
|
||||||
**
|
|
||||||
** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS
|
|
||||||
** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND
|
|
||||||
** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/
|
|
||||||
**
|
|
||||||
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
||||||
** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
** FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS
|
|
||||||
** IN THE MATERIALS.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef GLSLextAMD_H
|
|
||||||
#define GLSLextAMD_H
|
|
||||||
|
|
||||||
enum BuiltIn;
|
|
||||||
enum Capability;
|
|
||||||
enum Decoration;
|
|
||||||
enum Op;
|
|
||||||
|
|
||||||
static const int GLSLextAMDVersion = 100;
|
|
||||||
static const int GLSLextAMDRevision = 6;
|
|
||||||
|
|
||||||
// SPV_AMD_shader_ballot
|
|
||||||
static const char* const E_SPV_AMD_shader_ballot = "SPV_AMD_shader_ballot";
|
|
||||||
|
|
||||||
enum ShaderBallotAMD {
|
|
||||||
ShaderBallotBadAMD = 0, // Don't use
|
|
||||||
|
|
||||||
SwizzleInvocationsAMD = 1,
|
|
||||||
SwizzleInvocationsMaskedAMD = 2,
|
|
||||||
WriteInvocationAMD = 3,
|
|
||||||
MbcntAMD = 4,
|
|
||||||
|
|
||||||
ShaderBallotCountAMD
|
|
||||||
};
|
|
||||||
|
|
||||||
// SPV_AMD_shader_trinary_minmax
|
|
||||||
static const char* const E_SPV_AMD_shader_trinary_minmax = "SPV_AMD_shader_trinary_minmax";
|
|
||||||
|
|
||||||
enum ShaderTrinaryMinMaxAMD {
|
|
||||||
ShaderTrinaryMinMaxBadAMD = 0, // Don't use
|
|
||||||
|
|
||||||
FMin3AMD = 1,
|
|
||||||
UMin3AMD = 2,
|
|
||||||
SMin3AMD = 3,
|
|
||||||
FMax3AMD = 4,
|
|
||||||
UMax3AMD = 5,
|
|
||||||
SMax3AMD = 6,
|
|
||||||
FMid3AMD = 7,
|
|
||||||
UMid3AMD = 8,
|
|
||||||
SMid3AMD = 9,
|
|
||||||
|
|
||||||
ShaderTrinaryMinMaxCountAMD
|
|
||||||
};
|
|
||||||
|
|
||||||
// SPV_AMD_shader_explicit_vertex_parameter
|
|
||||||
static const char* const E_SPV_AMD_shader_explicit_vertex_parameter = "SPV_AMD_shader_explicit_vertex_parameter";
|
|
||||||
|
|
||||||
enum ShaderExplicitVertexParameterAMD {
|
|
||||||
ShaderExplicitVertexParameterBadAMD = 0, // Don't use
|
|
||||||
|
|
||||||
InterpolateAtVertexAMD = 1,
|
|
||||||
|
|
||||||
ShaderExplicitVertexParameterCountAMD
|
|
||||||
};
|
|
||||||
|
|
||||||
// SPV_AMD_gcn_shader
|
|
||||||
static const char* const E_SPV_AMD_gcn_shader = "SPV_AMD_gcn_shader";
|
|
||||||
|
|
||||||
enum GcnShaderAMD {
|
|
||||||
GcnShaderBadAMD = 0, // Don't use
|
|
||||||
|
|
||||||
CubeFaceIndexAMD = 1,
|
|
||||||
CubeFaceCoordAMD = 2,
|
|
||||||
TimeAMD = 3,
|
|
||||||
|
|
||||||
GcnShaderCountAMD
|
|
||||||
};
|
|
||||||
|
|
||||||
// SPV_AMD_gpu_shader_half_float
|
|
||||||
static const char* const E_SPV_AMD_gpu_shader_half_float = "SPV_AMD_gpu_shader_half_float";
|
|
||||||
|
|
||||||
// SPV_AMD_texture_gather_bias_lod
|
|
||||||
static const char* const E_SPV_AMD_texture_gather_bias_lod = "SPV_AMD_texture_gather_bias_lod";
|
|
||||||
|
|
||||||
// SPV_AMD_gpu_shader_int16
|
|
||||||
static const char* const E_SPV_AMD_gpu_shader_int16 = "SPV_AMD_gpu_shader_int16";
|
|
||||||
|
|
||||||
// SPV_AMD_shader_image_load_store_lod
|
|
||||||
static const char* const E_SPV_AMD_shader_image_load_store_lod = "SPV_AMD_shader_image_load_store_lod";
|
|
||||||
|
|
||||||
// SPV_AMD_shader_fragment_mask
|
|
||||||
static const char* const E_SPV_AMD_shader_fragment_mask = "SPV_AMD_shader_fragment_mask";
|
|
||||||
|
|
||||||
#endif // #ifndef GLSLextAMD_H
|
|
|
@ -1,39 +0,0 @@
|
||||||
/*
|
|
||||||
** Copyright (c) 2014-2016 The Khronos Group Inc.
|
|
||||||
**
|
|
||||||
** Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
** of this software and/or associated documentation files (the "Materials"),
|
|
||||||
** to deal in the Materials without restriction, including without limitation
|
|
||||||
** the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
||||||
** and/or sell copies of the Materials, and to permit persons to whom the
|
|
||||||
** Materials are furnished to do so, subject to the following conditions:
|
|
||||||
**
|
|
||||||
** The above copyright notice and this permission notice shall be included in
|
|
||||||
** all copies or substantial portions of the Materials.
|
|
||||||
**
|
|
||||||
** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS
|
|
||||||
** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND
|
|
||||||
** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/
|
|
||||||
**
|
|
||||||
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
||||||
** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
** FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS
|
|
||||||
** IN THE MATERIALS.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef GLSLextEXT_H
|
|
||||||
#define GLSLextEXT_H
|
|
||||||
|
|
||||||
enum BuiltIn;
|
|
||||||
enum Op;
|
|
||||||
enum Capability;
|
|
||||||
|
|
||||||
static const int GLSLextEXTVersion = 100;
|
|
||||||
static const int GLSLextEXTRevision = 1;
|
|
||||||
|
|
||||||
static const char* const E_SPV_EXT_fragment_fully_covered = "SPV_EXT_fragment_fully_covered";
|
|
||||||
|
|
||||||
#endif // #ifndef GLSLextEXT_H
|
|
|
@ -1,48 +0,0 @@
|
||||||
/*
|
|
||||||
** Copyright (c) 2014-2016 The Khronos Group Inc.
|
|
||||||
**
|
|
||||||
** Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
** of this software and/or associated documentation files (the "Materials"),
|
|
||||||
** to deal in the Materials without restriction, including without limitation
|
|
||||||
** the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
||||||
** and/or sell copies of the Materials, and to permit persons to whom the
|
|
||||||
** Materials are furnished to do so, subject to the following conditions:
|
|
||||||
**
|
|
||||||
** The above copyright notice and this permission notice shall be included in
|
|
||||||
** all copies or substantial portions of the Materials.
|
|
||||||
**
|
|
||||||
** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS
|
|
||||||
** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND
|
|
||||||
** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/
|
|
||||||
**
|
|
||||||
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
||||||
** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
** FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS
|
|
||||||
** IN THE MATERIALS.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef GLSLextKHR_H
|
|
||||||
#define GLSLextKHR_H
|
|
||||||
|
|
||||||
enum BuiltIn;
|
|
||||||
enum Op;
|
|
||||||
enum Capability;
|
|
||||||
|
|
||||||
static const int GLSLextKHRVersion = 100;
|
|
||||||
static const int GLSLextKHRRevision = 2;
|
|
||||||
|
|
||||||
static const char* const E_SPV_KHR_shader_ballot = "SPV_KHR_shader_ballot";
|
|
||||||
static const char* const E_SPV_KHR_subgroup_vote = "SPV_KHR_subgroup_vote";
|
|
||||||
static const char* const E_SPV_KHR_device_group = "SPV_KHR_device_group";
|
|
||||||
static const char* const E_SPV_KHR_multiview = "SPV_KHR_multiview";
|
|
||||||
static const char* const E_SPV_KHR_shader_draw_parameters = "SPV_KHR_shader_draw_parameters";
|
|
||||||
static const char* const E_SPV_KHR_16bit_storage = "SPV_KHR_16bit_storage";
|
|
||||||
static const char* const E_SPV_KHR_storage_buffer_storage_class = "SPV_KHR_storage_buffer_storage_class";
|
|
||||||
static const char* const E_SPV_KHR_post_depth_coverage = "SPV_KHR_post_depth_coverage";
|
|
||||||
static const char* const E_SPV_EXT_shader_stencil_export = "SPV_EXT_shader_stencil_export";
|
|
||||||
static const char* const E_SPV_EXT_shader_viewport_index_layer = "SPV_EXT_shader_viewport_index_layer";
|
|
||||||
|
|
||||||
#endif // #ifndef GLSLextKHR_H
|
|
|
@ -1,54 +0,0 @@
|
||||||
/*
|
|
||||||
** Copyright (c) 2014-2017 The Khronos Group Inc.
|
|
||||||
**
|
|
||||||
** Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
** of this software and/or associated documentation files (the "Materials"),
|
|
||||||
** to deal in the Materials without restriction, including without limitation
|
|
||||||
** the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
||||||
** and/or sell copies of the Materials, and to permit persons to whom the
|
|
||||||
** Materials are furnished to do so, subject to the following conditions:
|
|
||||||
**
|
|
||||||
** The above copyright notice and this permission notice shall be included in
|
|
||||||
** all copies or substantial portions of the Materials.
|
|
||||||
**
|
|
||||||
** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS
|
|
||||||
** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND
|
|
||||||
** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/
|
|
||||||
**
|
|
||||||
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
||||||
** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
** FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS
|
|
||||||
** IN THE MATERIALS.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef GLSLextNV_H
|
|
||||||
#define GLSLextNV_H
|
|
||||||
|
|
||||||
enum BuiltIn;
|
|
||||||
enum Decoration;
|
|
||||||
enum Op;
|
|
||||||
enum Capability;
|
|
||||||
|
|
||||||
static const int GLSLextNVVersion = 100;
|
|
||||||
static const int GLSLextNVRevision = 5;
|
|
||||||
|
|
||||||
//SPV_NV_sample_mask_override_coverage
|
|
||||||
const char* const E_SPV_NV_sample_mask_override_coverage = "SPV_NV_sample_mask_override_coverage";
|
|
||||||
|
|
||||||
//SPV_NV_geometry_shader_passthrough
|
|
||||||
const char* const E_SPV_NV_geometry_shader_passthrough = "SPV_NV_geometry_shader_passthrough";
|
|
||||||
|
|
||||||
//SPV_NV_viewport_array2
|
|
||||||
const char* const E_SPV_NV_viewport_array2 = "SPV_NV_viewport_array2";
|
|
||||||
const char* const E_ARB_shader_viewport_layer_array = "SPV_ARB_shader_viewport_layer_array";
|
|
||||||
|
|
||||||
//SPV_NV_stereo_view_rendering
|
|
||||||
const char* const E_SPV_NV_stereo_view_rendering = "SPV_NV_stereo_view_rendering";
|
|
||||||
|
|
||||||
//SPV_NVX_multiview_per_view_attributes
|
|
||||||
const char* const E_SPV_NVX_multiview_per_view_attributes = "SPV_NVX_multiview_per_view_attributes";
|
|
||||||
|
|
||||||
#endif // #ifndef GLSLextNV_H
|
|
|
@ -1,131 +0,0 @@
|
||||||
/*
|
|
||||||
** Copyright (c) 2014-2016 The Khronos Group Inc.
|
|
||||||
**
|
|
||||||
** Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
** of this software and/or associated documentation files (the "Materials"),
|
|
||||||
** to deal in the Materials without restriction, including without limitation
|
|
||||||
** the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
||||||
** and/or sell copies of the Materials, and to permit persons to whom the
|
|
||||||
** Materials are furnished to do so, subject to the following conditions:
|
|
||||||
**
|
|
||||||
** The above copyright notice and this permission notice shall be included in
|
|
||||||
** all copies or substantial portions of the Materials.
|
|
||||||
**
|
|
||||||
** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS
|
|
||||||
** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND
|
|
||||||
** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/
|
|
||||||
**
|
|
||||||
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
||||||
** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
** FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS
|
|
||||||
** IN THE MATERIALS.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef GLSLstd450_H
|
|
||||||
#define GLSLstd450_H
|
|
||||||
|
|
||||||
static const int GLSLstd450Version = 100;
|
|
||||||
static const int GLSLstd450Revision = 1;
|
|
||||||
|
|
||||||
enum GLSLstd450 {
|
|
||||||
GLSLstd450Bad = 0, // Don't use
|
|
||||||
|
|
||||||
GLSLstd450Round = 1,
|
|
||||||
GLSLstd450RoundEven = 2,
|
|
||||||
GLSLstd450Trunc = 3,
|
|
||||||
GLSLstd450FAbs = 4,
|
|
||||||
GLSLstd450SAbs = 5,
|
|
||||||
GLSLstd450FSign = 6,
|
|
||||||
GLSLstd450SSign = 7,
|
|
||||||
GLSLstd450Floor = 8,
|
|
||||||
GLSLstd450Ceil = 9,
|
|
||||||
GLSLstd450Fract = 10,
|
|
||||||
|
|
||||||
GLSLstd450Radians = 11,
|
|
||||||
GLSLstd450Degrees = 12,
|
|
||||||
GLSLstd450Sin = 13,
|
|
||||||
GLSLstd450Cos = 14,
|
|
||||||
GLSLstd450Tan = 15,
|
|
||||||
GLSLstd450Asin = 16,
|
|
||||||
GLSLstd450Acos = 17,
|
|
||||||
GLSLstd450Atan = 18,
|
|
||||||
GLSLstd450Sinh = 19,
|
|
||||||
GLSLstd450Cosh = 20,
|
|
||||||
GLSLstd450Tanh = 21,
|
|
||||||
GLSLstd450Asinh = 22,
|
|
||||||
GLSLstd450Acosh = 23,
|
|
||||||
GLSLstd450Atanh = 24,
|
|
||||||
GLSLstd450Atan2 = 25,
|
|
||||||
|
|
||||||
GLSLstd450Pow = 26,
|
|
||||||
GLSLstd450Exp = 27,
|
|
||||||
GLSLstd450Log = 28,
|
|
||||||
GLSLstd450Exp2 = 29,
|
|
||||||
GLSLstd450Log2 = 30,
|
|
||||||
GLSLstd450Sqrt = 31,
|
|
||||||
GLSLstd450InverseSqrt = 32,
|
|
||||||
|
|
||||||
GLSLstd450Determinant = 33,
|
|
||||||
GLSLstd450MatrixInverse = 34,
|
|
||||||
|
|
||||||
GLSLstd450Modf = 35, // second operand needs an OpVariable to write to
|
|
||||||
GLSLstd450ModfStruct = 36, // no OpVariable operand
|
|
||||||
GLSLstd450FMin = 37,
|
|
||||||
GLSLstd450UMin = 38,
|
|
||||||
GLSLstd450SMin = 39,
|
|
||||||
GLSLstd450FMax = 40,
|
|
||||||
GLSLstd450UMax = 41,
|
|
||||||
GLSLstd450SMax = 42,
|
|
||||||
GLSLstd450FClamp = 43,
|
|
||||||
GLSLstd450UClamp = 44,
|
|
||||||
GLSLstd450SClamp = 45,
|
|
||||||
GLSLstd450FMix = 46,
|
|
||||||
GLSLstd450IMix = 47, // Reserved
|
|
||||||
GLSLstd450Step = 48,
|
|
||||||
GLSLstd450SmoothStep = 49,
|
|
||||||
|
|
||||||
GLSLstd450Fma = 50,
|
|
||||||
GLSLstd450Frexp = 51, // second operand needs an OpVariable to write to
|
|
||||||
GLSLstd450FrexpStruct = 52, // no OpVariable operand
|
|
||||||
GLSLstd450Ldexp = 53,
|
|
||||||
|
|
||||||
GLSLstd450PackSnorm4x8 = 54,
|
|
||||||
GLSLstd450PackUnorm4x8 = 55,
|
|
||||||
GLSLstd450PackSnorm2x16 = 56,
|
|
||||||
GLSLstd450PackUnorm2x16 = 57,
|
|
||||||
GLSLstd450PackHalf2x16 = 58,
|
|
||||||
GLSLstd450PackDouble2x32 = 59,
|
|
||||||
GLSLstd450UnpackSnorm2x16 = 60,
|
|
||||||
GLSLstd450UnpackUnorm2x16 = 61,
|
|
||||||
GLSLstd450UnpackHalf2x16 = 62,
|
|
||||||
GLSLstd450UnpackSnorm4x8 = 63,
|
|
||||||
GLSLstd450UnpackUnorm4x8 = 64,
|
|
||||||
GLSLstd450UnpackDouble2x32 = 65,
|
|
||||||
|
|
||||||
GLSLstd450Length = 66,
|
|
||||||
GLSLstd450Distance = 67,
|
|
||||||
GLSLstd450Cross = 68,
|
|
||||||
GLSLstd450Normalize = 69,
|
|
||||||
GLSLstd450FaceForward = 70,
|
|
||||||
GLSLstd450Reflect = 71,
|
|
||||||
GLSLstd450Refract = 72,
|
|
||||||
|
|
||||||
GLSLstd450FindILsb = 73,
|
|
||||||
GLSLstd450FindSMsb = 74,
|
|
||||||
GLSLstd450FindUMsb = 75,
|
|
||||||
|
|
||||||
GLSLstd450InterpolateAtCentroid = 76,
|
|
||||||
GLSLstd450InterpolateAtSample = 77,
|
|
||||||
GLSLstd450InterpolateAtOffset = 78,
|
|
||||||
|
|
||||||
GLSLstd450NMin = 79,
|
|
||||||
GLSLstd450NMax = 80,
|
|
||||||
GLSLstd450NClamp = 81,
|
|
||||||
|
|
||||||
GLSLstd450Count
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // #ifndef GLSLstd450_H
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,67 +0,0 @@
|
||||||
//
|
|
||||||
// Copyright (C) 2014 LunarG, Inc.
|
|
||||||
//
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions
|
|
||||||
// are met:
|
|
||||||
//
|
|
||||||
// Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following
|
|
||||||
// disclaimer in the documentation and/or other materials provided
|
|
||||||
// with the distribution.
|
|
||||||
//
|
|
||||||
// Neither the name of 3Dlabs Inc. Ltd. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#if _MSC_VER >= 1900
|
|
||||||
#pragma warning(disable : 4464) // relative include path contains '..'
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "../glslang/Include/intermediate.h"
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "Logger.h"
|
|
||||||
|
|
||||||
namespace glslang {
|
|
||||||
|
|
||||||
struct SpvOptions {
|
|
||||||
SpvOptions() : generateDebugInfo(false), disableOptimizer(true),
|
|
||||||
optimizeSize(false) { }
|
|
||||||
bool generateDebugInfo;
|
|
||||||
bool disableOptimizer;
|
|
||||||
bool optimizeSize;
|
|
||||||
};
|
|
||||||
|
|
||||||
void GetSpirvVersion(std::string&);
|
|
||||||
int GetSpirvGeneratorVersion();
|
|
||||||
void GlslangToSpv(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv,
|
|
||||||
SpvOptions* options = nullptr);
|
|
||||||
void GlslangToSpv(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv,
|
|
||||||
spv::SpvBuildLogger* logger, SpvOptions* options = nullptr);
|
|
||||||
void OutputSpvBin(const std::vector<unsigned int>& spirv, const char* baseName);
|
|
||||||
void OutputSpvHex(const std::vector<unsigned int>& spirv, const char* baseName, const char* varName);
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,113 +0,0 @@
|
||||||
//
|
|
||||||
// Copyright (C) 2016 Google, Inc.
|
|
||||||
//
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions
|
|
||||||
// are met:
|
|
||||||
//
|
|
||||||
// Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following
|
|
||||||
// disclaimer in the documentation and/or other materials provided
|
|
||||||
// with the distribution.
|
|
||||||
//
|
|
||||||
// Neither the name of 3Dlabs Inc. Ltd. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// The SPIR-V spec requires code blocks to appear in an order satisfying the
|
|
||||||
// dominator-tree direction (ie, dominator before the dominated). This is,
|
|
||||||
// actually, easy to achieve: any pre-order CFG traversal algorithm will do it.
|
|
||||||
// Because such algorithms visit a block only after traversing some path to it
|
|
||||||
// from the root, they necessarily visit the block's idom first.
|
|
||||||
//
|
|
||||||
// But not every graph-traversal algorithm outputs blocks in an order that
|
|
||||||
// appears logical to human readers. The problem is that unrelated branches may
|
|
||||||
// be interspersed with each other, and merge blocks may come before some of the
|
|
||||||
// branches being merged.
|
|
||||||
//
|
|
||||||
// A good, human-readable order of blocks may be achieved by performing
|
|
||||||
// depth-first search but delaying merge nodes until after all their branches
|
|
||||||
// have been visited. This is implemented below by the inReadableOrder()
|
|
||||||
// function.
|
|
||||||
|
|
||||||
#include "spvIR.h"
|
|
||||||
|
|
||||||
#include <cassert>
|
|
||||||
#include <unordered_set>
|
|
||||||
|
|
||||||
using spv::Block;
|
|
||||||
using spv::Id;
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
// Traverses CFG in a readable order, invoking a pre-set callback on each block.
|
|
||||||
// Use by calling visit() on the root block.
|
|
||||||
class ReadableOrderTraverser {
|
|
||||||
public:
|
|
||||||
explicit ReadableOrderTraverser(std::function<void(Block*)> callback) : callback_(callback) {}
|
|
||||||
// Visits the block if it hasn't been visited already and isn't currently
|
|
||||||
// being delayed. Invokes callback(block), then descends into its
|
|
||||||
// successors. Delays merge-block and continue-block processing until all
|
|
||||||
// the branches have been completed.
|
|
||||||
void visit(Block* block)
|
|
||||||
{
|
|
||||||
assert(block);
|
|
||||||
if (visited_.count(block) || delayed_.count(block))
|
|
||||||
return;
|
|
||||||
callback_(block);
|
|
||||||
visited_.insert(block);
|
|
||||||
Block* mergeBlock = nullptr;
|
|
||||||
Block* continueBlock = nullptr;
|
|
||||||
auto mergeInst = block->getMergeInstruction();
|
|
||||||
if (mergeInst) {
|
|
||||||
Id mergeId = mergeInst->getIdOperand(0);
|
|
||||||
mergeBlock = block->getParent().getParent().getInstruction(mergeId)->getBlock();
|
|
||||||
delayed_.insert(mergeBlock);
|
|
||||||
if (mergeInst->getOpCode() == spv::OpLoopMerge) {
|
|
||||||
Id continueId = mergeInst->getIdOperand(1);
|
|
||||||
continueBlock =
|
|
||||||
block->getParent().getParent().getInstruction(continueId)->getBlock();
|
|
||||||
delayed_.insert(continueBlock);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const auto successors = block->getSuccessors();
|
|
||||||
for (auto it = successors.cbegin(); it != successors.cend(); ++it)
|
|
||||||
visit(*it);
|
|
||||||
if (continueBlock) {
|
|
||||||
delayed_.erase(continueBlock);
|
|
||||||
visit(continueBlock);
|
|
||||||
}
|
|
||||||
if (mergeBlock) {
|
|
||||||
delayed_.erase(mergeBlock);
|
|
||||||
visit(mergeBlock);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::function<void(Block*)> callback_;
|
|
||||||
// Whether a block has already been visited or is being delayed.
|
|
||||||
std::unordered_set<Block *> visited_, delayed_;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
void spv::inReadableOrder(Block* root, std::function<void(Block*)> callback)
|
|
||||||
{
|
|
||||||
ReadableOrderTraverser(callback).visit(root);
|
|
||||||
}
|
|
|
@ -1,387 +0,0 @@
|
||||||
//
|
|
||||||
// Copyright (C) 2002-2005 3Dlabs Inc. Ltd.
|
|
||||||
// Copyright (C) 2012-2013 LunarG, Inc.
|
|
||||||
//
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions
|
|
||||||
// are met:
|
|
||||||
//
|
|
||||||
// Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following
|
|
||||||
// disclaimer in the documentation and/or other materials provided
|
|
||||||
// with the distribution.
|
|
||||||
//
|
|
||||||
// Neither the name of 3Dlabs Inc. Ltd. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef _BASICTYPES_INCLUDED_
|
|
||||||
#define _BASICTYPES_INCLUDED_
|
|
||||||
|
|
||||||
namespace glslang {
|
|
||||||
|
|
||||||
//
|
|
||||||
// Basic type. Arrays, vectors, sampler details, etc., are orthogonal to this.
|
|
||||||
//
|
|
||||||
enum TBasicType {
|
|
||||||
EbtVoid,
|
|
||||||
EbtFloat,
|
|
||||||
EbtDouble,
|
|
||||||
#ifdef AMD_EXTENSIONS
|
|
||||||
EbtFloat16,
|
|
||||||
#endif
|
|
||||||
EbtInt,
|
|
||||||
EbtUint,
|
|
||||||
EbtInt64,
|
|
||||||
EbtUint64,
|
|
||||||
#ifdef AMD_EXTENSIONS
|
|
||||||
EbtInt16,
|
|
||||||
EbtUint16,
|
|
||||||
#endif
|
|
||||||
EbtBool,
|
|
||||||
EbtAtomicUint,
|
|
||||||
EbtSampler,
|
|
||||||
EbtStruct,
|
|
||||||
EbtBlock,
|
|
||||||
|
|
||||||
// HLSL types that live only temporarily.
|
|
||||||
EbtString,
|
|
||||||
|
|
||||||
EbtNumTypes
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// Storage qualifiers. Should align with different kinds of storage or
|
|
||||||
// resource or GLSL storage qualifier. Expansion is deprecated.
|
|
||||||
//
|
|
||||||
// N.B.: You probably DON'T want to add anything here, but rather just add it
|
|
||||||
// to the built-in variables. See the comment above TBuiltInVariable.
|
|
||||||
//
|
|
||||||
// A new built-in variable will normally be an existing qualifier, like 'in', 'out', etc.
|
|
||||||
// DO NOT follow the design pattern of, say EvqInstanceId, etc.
|
|
||||||
//
|
|
||||||
enum TStorageQualifier {
|
|
||||||
EvqTemporary, // For temporaries (within a function), read/write
|
|
||||||
EvqGlobal, // For globals read/write
|
|
||||||
EvqConst, // User-defined constant values, will be semantically constant and constant folded
|
|
||||||
EvqVaryingIn, // pipeline input, read only, also supercategory for all built-ins not included in this enum (see TBuiltInVariable)
|
|
||||||
EvqVaryingOut, // pipeline output, read/write, also supercategory for all built-ins not included in this enum (see TBuiltInVariable)
|
|
||||||
EvqUniform, // read only, shared with app
|
|
||||||
EvqBuffer, // read/write, shared with app
|
|
||||||
EvqShared, // compute shader's read/write 'shared' qualifier
|
|
||||||
|
|
||||||
// parameters
|
|
||||||
EvqIn, // also, for 'in' in the grammar before we know if it's a pipeline input or an 'in' parameter
|
|
||||||
EvqOut, // also, for 'out' in the grammar before we know if it's a pipeline output or an 'out' parameter
|
|
||||||
EvqInOut,
|
|
||||||
EvqConstReadOnly, // input; also other read-only types having neither a constant value nor constant-value semantics
|
|
||||||
|
|
||||||
// built-ins read by vertex shader
|
|
||||||
EvqVertexId,
|
|
||||||
EvqInstanceId,
|
|
||||||
|
|
||||||
// built-ins written by vertex shader
|
|
||||||
EvqPosition,
|
|
||||||
EvqPointSize,
|
|
||||||
EvqClipVertex,
|
|
||||||
|
|
||||||
// built-ins read by fragment shader
|
|
||||||
EvqFace,
|
|
||||||
EvqFragCoord,
|
|
||||||
EvqPointCoord,
|
|
||||||
|
|
||||||
// built-ins written by fragment shader
|
|
||||||
EvqFragColor,
|
|
||||||
EvqFragDepth,
|
|
||||||
|
|
||||||
// end of list
|
|
||||||
EvqLast
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// Subcategories of the TStorageQualifier, simply to give a direct mapping
|
|
||||||
// between built-in variable names and an numerical value (the enum).
|
|
||||||
//
|
|
||||||
// For backward compatibility, there is some redundancy between the
|
|
||||||
// TStorageQualifier and these. Existing members should both be maintained accurately.
|
|
||||||
// However, any new built-in variable (and any existing non-redundant one)
|
|
||||||
// must follow the pattern that the specific built-in is here, and only its
|
|
||||||
// general qualifier is in TStorageQualifier.
|
|
||||||
//
|
|
||||||
// Something like gl_Position, which is sometimes 'in' and sometimes 'out'
|
|
||||||
// shows up as two different built-in variables in a single stage, but
|
|
||||||
// only has a single enum in TBuiltInVariable, so both the
|
|
||||||
// TStorageQualifier and the TBuitinVariable are needed to distinguish
|
|
||||||
// between them.
|
|
||||||
//
|
|
||||||
enum TBuiltInVariable {
|
|
||||||
EbvNone,
|
|
||||||
EbvNumWorkGroups,
|
|
||||||
EbvWorkGroupSize,
|
|
||||||
EbvWorkGroupId,
|
|
||||||
EbvLocalInvocationId,
|
|
||||||
EbvGlobalInvocationId,
|
|
||||||
EbvLocalInvocationIndex,
|
|
||||||
EbvSubGroupSize,
|
|
||||||
EbvSubGroupInvocation,
|
|
||||||
EbvSubGroupEqMask,
|
|
||||||
EbvSubGroupGeMask,
|
|
||||||
EbvSubGroupGtMask,
|
|
||||||
EbvSubGroupLeMask,
|
|
||||||
EbvSubGroupLtMask,
|
|
||||||
EbvVertexId,
|
|
||||||
EbvInstanceId,
|
|
||||||
EbvVertexIndex,
|
|
||||||
EbvInstanceIndex,
|
|
||||||
EbvBaseVertex,
|
|
||||||
EbvBaseInstance,
|
|
||||||
EbvDrawId,
|
|
||||||
EbvPosition,
|
|
||||||
EbvPointSize,
|
|
||||||
EbvClipVertex,
|
|
||||||
EbvClipDistance,
|
|
||||||
EbvCullDistance,
|
|
||||||
EbvNormal,
|
|
||||||
EbvVertex,
|
|
||||||
EbvMultiTexCoord0,
|
|
||||||
EbvMultiTexCoord1,
|
|
||||||
EbvMultiTexCoord2,
|
|
||||||
EbvMultiTexCoord3,
|
|
||||||
EbvMultiTexCoord4,
|
|
||||||
EbvMultiTexCoord5,
|
|
||||||
EbvMultiTexCoord6,
|
|
||||||
EbvMultiTexCoord7,
|
|
||||||
EbvFrontColor,
|
|
||||||
EbvBackColor,
|
|
||||||
EbvFrontSecondaryColor,
|
|
||||||
EbvBackSecondaryColor,
|
|
||||||
EbvTexCoord,
|
|
||||||
EbvFogFragCoord,
|
|
||||||
EbvInvocationId,
|
|
||||||
EbvPrimitiveId,
|
|
||||||
EbvLayer,
|
|
||||||
EbvViewportIndex,
|
|
||||||
EbvPatchVertices,
|
|
||||||
EbvTessLevelOuter,
|
|
||||||
EbvTessLevelInner,
|
|
||||||
EbvBoundingBox,
|
|
||||||
EbvTessCoord,
|
|
||||||
EbvColor,
|
|
||||||
EbvSecondaryColor,
|
|
||||||
EbvFace,
|
|
||||||
EbvFragCoord,
|
|
||||||
EbvPointCoord,
|
|
||||||
EbvFragColor,
|
|
||||||
EbvFragData,
|
|
||||||
EbvFragDepth,
|
|
||||||
EbvFragStencilRef,
|
|
||||||
EbvSampleId,
|
|
||||||
EbvSamplePosition,
|
|
||||||
EbvSampleMask,
|
|
||||||
EbvHelperInvocation,
|
|
||||||
|
|
||||||
#ifdef AMD_EXTENSIONS
|
|
||||||
EbvBaryCoordNoPersp,
|
|
||||||
EbvBaryCoordNoPerspCentroid,
|
|
||||||
EbvBaryCoordNoPerspSample,
|
|
||||||
EbvBaryCoordSmooth,
|
|
||||||
EbvBaryCoordSmoothCentroid,
|
|
||||||
EbvBaryCoordSmoothSample,
|
|
||||||
EbvBaryCoordPullModel,
|
|
||||||
#endif
|
|
||||||
|
|
||||||
EbvViewIndex,
|
|
||||||
EbvDeviceIndex,
|
|
||||||
|
|
||||||
#ifdef NV_EXTENSIONS
|
|
||||||
EbvViewportMaskNV,
|
|
||||||
EbvSecondaryPositionNV,
|
|
||||||
EbvSecondaryViewportMaskNV,
|
|
||||||
EbvPositionPerViewNV,
|
|
||||||
EbvViewportMaskPerViewNV,
|
|
||||||
EbvFragFullyCoveredNV,
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// HLSL built-ins that live only temporarily, until they get remapped
|
|
||||||
// to one of the above.
|
|
||||||
EbvFragDepthGreater,
|
|
||||||
EbvFragDepthLesser,
|
|
||||||
EbvGsOutputStream,
|
|
||||||
EbvOutputPatch,
|
|
||||||
EbvInputPatch,
|
|
||||||
|
|
||||||
// structbuffer types
|
|
||||||
EbvAppendConsume, // no need to differentiate append and consume
|
|
||||||
EbvRWStructuredBuffer,
|
|
||||||
EbvStructuredBuffer,
|
|
||||||
EbvByteAddressBuffer,
|
|
||||||
EbvRWByteAddressBuffer,
|
|
||||||
|
|
||||||
EbvLast
|
|
||||||
};
|
|
||||||
|
|
||||||
// These will show up in error messages
|
|
||||||
__inline const char* GetStorageQualifierString(TStorageQualifier q)
|
|
||||||
{
|
|
||||||
switch (q) {
|
|
||||||
case EvqTemporary: return "temp"; break;
|
|
||||||
case EvqGlobal: return "global"; break;
|
|
||||||
case EvqConst: return "const"; break;
|
|
||||||
case EvqConstReadOnly: return "const (read only)"; break;
|
|
||||||
case EvqVaryingIn: return "in"; break;
|
|
||||||
case EvqVaryingOut: return "out"; break;
|
|
||||||
case EvqUniform: return "uniform"; break;
|
|
||||||
case EvqBuffer: return "buffer"; break;
|
|
||||||
case EvqShared: return "shared"; break;
|
|
||||||
case EvqIn: return "in"; break;
|
|
||||||
case EvqOut: return "out"; break;
|
|
||||||
case EvqInOut: return "inout"; break;
|
|
||||||
case EvqVertexId: return "gl_VertexId"; break;
|
|
||||||
case EvqInstanceId: return "gl_InstanceId"; break;
|
|
||||||
case EvqPosition: return "gl_Position"; break;
|
|
||||||
case EvqPointSize: return "gl_PointSize"; break;
|
|
||||||
case EvqClipVertex: return "gl_ClipVertex"; break;
|
|
||||||
case EvqFace: return "gl_FrontFacing"; break;
|
|
||||||
case EvqFragCoord: return "gl_FragCoord"; break;
|
|
||||||
case EvqPointCoord: return "gl_PointCoord"; break;
|
|
||||||
case EvqFragColor: return "fragColor"; break;
|
|
||||||
case EvqFragDepth: return "gl_FragDepth"; break;
|
|
||||||
default: return "unknown qualifier";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
__inline const char* GetBuiltInVariableString(TBuiltInVariable v)
|
|
||||||
{
|
|
||||||
switch (v) {
|
|
||||||
case EbvNone: return "";
|
|
||||||
case EbvNumWorkGroups: return "NumWorkGroups";
|
|
||||||
case EbvWorkGroupSize: return "WorkGroupSize";
|
|
||||||
case EbvWorkGroupId: return "WorkGroupID";
|
|
||||||
case EbvLocalInvocationId: return "LocalInvocationID";
|
|
||||||
case EbvGlobalInvocationId: return "GlobalInvocationID";
|
|
||||||
case EbvLocalInvocationIndex: return "LocalInvocationIndex";
|
|
||||||
case EbvSubGroupSize: return "SubGroupSize";
|
|
||||||
case EbvSubGroupInvocation: return "SubGroupInvocation";
|
|
||||||
case EbvSubGroupEqMask: return "SubGroupEqMask";
|
|
||||||
case EbvSubGroupGeMask: return "SubGroupGeMask";
|
|
||||||
case EbvSubGroupGtMask: return "SubGroupGtMask";
|
|
||||||
case EbvSubGroupLeMask: return "SubGroupLeMask";
|
|
||||||
case EbvSubGroupLtMask: return "SubGroupLtMask";
|
|
||||||
case EbvVertexId: return "VertexId";
|
|
||||||
case EbvInstanceId: return "InstanceId";
|
|
||||||
case EbvVertexIndex: return "VertexIndex";
|
|
||||||
case EbvInstanceIndex: return "InstanceIndex";
|
|
||||||
case EbvBaseVertex: return "BaseVertex";
|
|
||||||
case EbvBaseInstance: return "BaseInstance";
|
|
||||||
case EbvDrawId: return "DrawId";
|
|
||||||
case EbvPosition: return "Position";
|
|
||||||
case EbvPointSize: return "PointSize";
|
|
||||||
case EbvClipVertex: return "ClipVertex";
|
|
||||||
case EbvClipDistance: return "ClipDistance";
|
|
||||||
case EbvCullDistance: return "CullDistance";
|
|
||||||
case EbvNormal: return "Normal";
|
|
||||||
case EbvVertex: return "Vertex";
|
|
||||||
case EbvMultiTexCoord0: return "MultiTexCoord0";
|
|
||||||
case EbvMultiTexCoord1: return "MultiTexCoord1";
|
|
||||||
case EbvMultiTexCoord2: return "MultiTexCoord2";
|
|
||||||
case EbvMultiTexCoord3: return "MultiTexCoord3";
|
|
||||||
case EbvMultiTexCoord4: return "MultiTexCoord4";
|
|
||||||
case EbvMultiTexCoord5: return "MultiTexCoord5";
|
|
||||||
case EbvMultiTexCoord6: return "MultiTexCoord6";
|
|
||||||
case EbvMultiTexCoord7: return "MultiTexCoord7";
|
|
||||||
case EbvFrontColor: return "FrontColor";
|
|
||||||
case EbvBackColor: return "BackColor";
|
|
||||||
case EbvFrontSecondaryColor: return "FrontSecondaryColor";
|
|
||||||
case EbvBackSecondaryColor: return "BackSecondaryColor";
|
|
||||||
case EbvTexCoord: return "TexCoord";
|
|
||||||
case EbvFogFragCoord: return "FogFragCoord";
|
|
||||||
case EbvInvocationId: return "InvocationID";
|
|
||||||
case EbvPrimitiveId: return "PrimitiveID";
|
|
||||||
case EbvLayer: return "Layer";
|
|
||||||
case EbvViewportIndex: return "ViewportIndex";
|
|
||||||
case EbvPatchVertices: return "PatchVertices";
|
|
||||||
case EbvTessLevelOuter: return "TessLevelOuter";
|
|
||||||
case EbvTessLevelInner: return "TessLevelInner";
|
|
||||||
case EbvBoundingBox: return "BoundingBox";
|
|
||||||
case EbvTessCoord: return "TessCoord";
|
|
||||||
case EbvColor: return "Color";
|
|
||||||
case EbvSecondaryColor: return "SecondaryColor";
|
|
||||||
case EbvFace: return "Face";
|
|
||||||
case EbvFragCoord: return "FragCoord";
|
|
||||||
case EbvPointCoord: return "PointCoord";
|
|
||||||
case EbvFragColor: return "FragColor";
|
|
||||||
case EbvFragData: return "FragData";
|
|
||||||
case EbvFragDepth: return "FragDepth";
|
|
||||||
case EbvFragStencilRef: return "FragStencilRef";
|
|
||||||
case EbvSampleId: return "SampleId";
|
|
||||||
case EbvSamplePosition: return "SamplePosition";
|
|
||||||
case EbvSampleMask: return "SampleMaskIn";
|
|
||||||
case EbvHelperInvocation: return "HelperInvocation";
|
|
||||||
|
|
||||||
#ifdef AMD_EXTENSIONS
|
|
||||||
case EbvBaryCoordNoPersp: return "BaryCoordNoPersp";
|
|
||||||
case EbvBaryCoordNoPerspCentroid: return "BaryCoordNoPerspCentroid";
|
|
||||||
case EbvBaryCoordNoPerspSample: return "BaryCoordNoPerspSample";
|
|
||||||
case EbvBaryCoordSmooth: return "BaryCoordSmooth";
|
|
||||||
case EbvBaryCoordSmoothCentroid: return "BaryCoordSmoothCentroid";
|
|
||||||
case EbvBaryCoordSmoothSample: return "BaryCoordSmoothSample";
|
|
||||||
case EbvBaryCoordPullModel: return "BaryCoordPullModel";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
case EbvViewIndex: return "ViewIndex";
|
|
||||||
case EbvDeviceIndex: return "DeviceIndex";
|
|
||||||
|
|
||||||
#ifdef NV_EXTENSIONS
|
|
||||||
case EbvViewportMaskNV: return "ViewportMaskNV";
|
|
||||||
case EbvSecondaryPositionNV: return "SecondaryPositionNV";
|
|
||||||
case EbvSecondaryViewportMaskNV: return "SecondaryViewportMaskNV";
|
|
||||||
case EbvPositionPerViewNV: return "PositionPerViewNV";
|
|
||||||
case EbvViewportMaskPerViewNV: return "ViewportMaskPerViewNV";
|
|
||||||
case EbvFragFullyCoveredNV: return "FragFullyCoveredNV";
|
|
||||||
#endif
|
|
||||||
default: return "unknown built-in variable";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// In this enum, order matters; users can assume higher precision is a bigger value
|
|
||||||
// and EpqNone is 0.
|
|
||||||
enum TPrecisionQualifier {
|
|
||||||
EpqNone = 0,
|
|
||||||
EpqLow,
|
|
||||||
EpqMedium,
|
|
||||||
EpqHigh
|
|
||||||
};
|
|
||||||
|
|
||||||
__inline const char* GetPrecisionQualifierString(TPrecisionQualifier p)
|
|
||||||
{
|
|
||||||
switch(p) {
|
|
||||||
case EpqNone: return ""; break;
|
|
||||||
case EpqLow: return "lowp"; break;
|
|
||||||
case EpqMedium: return "mediump"; break;
|
|
||||||
case EpqHigh: return "highp"; break;
|
|
||||||
default: return "unknown precision qualifier";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} // end namespace glslang
|
|
||||||
|
|
||||||
#endif // _BASICTYPES_INCLUDED_
|
|
|
@ -1,274 +0,0 @@
|
||||||
//
|
|
||||||
// Copyright (C) 2002-2005 3Dlabs Inc. Ltd.
|
|
||||||
// Copyright (C) 2012-2013 LunarG, Inc.
|
|
||||||
//
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions
|
|
||||||
// are met:
|
|
||||||
//
|
|
||||||
// Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following
|
|
||||||
// disclaimer in the documentation and/or other materials provided
|
|
||||||
// with the distribution.
|
|
||||||
//
|
|
||||||
// Neither the name of 3Dlabs Inc. Ltd. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef _COMMON_INCLUDED_
|
|
||||||
#define _COMMON_INCLUDED_
|
|
||||||
|
|
||||||
#if (defined(_MSC_VER) && _MSC_VER < 1900 /*vs2015*/) || defined MINGW_HAS_SECURE_API
|
|
||||||
#include <basetsd.h>
|
|
||||||
#define snprintf sprintf_s
|
|
||||||
#define safe_vsprintf(buf,max,format,args) vsnprintf_s((buf), (max), (max), (format), (args))
|
|
||||||
#elif defined (solaris)
|
|
||||||
#define safe_vsprintf(buf,max,format,args) vsnprintf((buf), (max), (format), (args))
|
|
||||||
#include <sys/int_types.h>
|
|
||||||
#define UINT_PTR uintptr_t
|
|
||||||
#else
|
|
||||||
#define safe_vsprintf(buf,max,format,args) vsnprintf((buf), (max), (format), (args))
|
|
||||||
#include <stdint.h>
|
|
||||||
#define UINT_PTR uintptr_t
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__ANDROID__) || _MSC_VER < 1700
|
|
||||||
#include <sstream>
|
|
||||||
namespace std {
|
|
||||||
template<typename T>
|
|
||||||
std::string to_string(const T& val) {
|
|
||||||
std::ostringstream os;
|
|
||||||
os << val;
|
|
||||||
return os.str();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(_MSC_VER) && _MSC_VER < 1800
|
|
||||||
inline long long int strtoll (const char* str, char** endptr, int base)
|
|
||||||
{
|
|
||||||
return _strtoi64(str, endptr, base);
|
|
||||||
}
|
|
||||||
inline unsigned long long int strtoull (const char* str, char** endptr, int base)
|
|
||||||
{
|
|
||||||
return _strtoui64(str, endptr, base);
|
|
||||||
}
|
|
||||||
inline long long int atoll (const char* str)
|
|
||||||
{
|
|
||||||
return strtoll(str, NULL, 10);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
|
||||||
#define strdup _strdup
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* windows only pragma */
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
#pragma warning(disable : 4786) // Don't warn about too long identifiers
|
|
||||||
#pragma warning(disable : 4514) // unused inline method
|
|
||||||
#pragma warning(disable : 4201) // nameless union
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <set>
|
|
||||||
#include <unordered_set>
|
|
||||||
#include <vector>
|
|
||||||
#include <map>
|
|
||||||
#include <unordered_map>
|
|
||||||
#include <list>
|
|
||||||
#include <algorithm>
|
|
||||||
#include <string>
|
|
||||||
#include <cstdio>
|
|
||||||
#include <cassert>
|
|
||||||
|
|
||||||
#include "PoolAlloc.h"
|
|
||||||
|
|
||||||
//
|
|
||||||
// Put POOL_ALLOCATOR_NEW_DELETE in base classes to make them use this scheme.
|
|
||||||
//
|
|
||||||
#define POOL_ALLOCATOR_NEW_DELETE(A) \
|
|
||||||
void* operator new(size_t s) { return (A).allocate(s); } \
|
|
||||||
void* operator new(size_t, void *_Where) { return (_Where); } \
|
|
||||||
void operator delete(void*) { } \
|
|
||||||
void operator delete(void *, void *) { } \
|
|
||||||
void* operator new[](size_t s) { return (A).allocate(s); } \
|
|
||||||
void* operator new[](size_t, void *_Where) { return (_Where); } \
|
|
||||||
void operator delete[](void*) { } \
|
|
||||||
void operator delete[](void *, void *) { }
|
|
||||||
|
|
||||||
namespace glslang {
|
|
||||||
|
|
||||||
//
|
|
||||||
// Pool version of string.
|
|
||||||
//
|
|
||||||
typedef pool_allocator<char> TStringAllocator;
|
|
||||||
typedef std::basic_string <char, std::char_traits<char>, TStringAllocator> TString;
|
|
||||||
|
|
||||||
} // end namespace glslang
|
|
||||||
|
|
||||||
// Repackage the std::hash for use by unordered map/set with a TString key.
|
|
||||||
namespace std {
|
|
||||||
|
|
||||||
template<> struct hash<glslang::TString> {
|
|
||||||
std::size_t operator()(const glslang::TString& s) const
|
|
||||||
{
|
|
||||||
const unsigned _FNV_offset_basis = 2166136261U;
|
|
||||||
const unsigned _FNV_prime = 16777619U;
|
|
||||||
unsigned _Val = _FNV_offset_basis;
|
|
||||||
size_t _Count = s.size();
|
|
||||||
const char* _First = s.c_str();
|
|
||||||
for (size_t _Next = 0; _Next < _Count; ++_Next)
|
|
||||||
{
|
|
||||||
_Val ^= (unsigned)_First[_Next];
|
|
||||||
_Val *= _FNV_prime;
|
|
||||||
}
|
|
||||||
|
|
||||||
return _Val;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace glslang {
|
|
||||||
|
|
||||||
inline TString* NewPoolTString(const char* s)
|
|
||||||
{
|
|
||||||
void* memory = GetThreadPoolAllocator().allocate(sizeof(TString));
|
|
||||||
return new(memory) TString(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class T> inline T* NewPoolObject(T*)
|
|
||||||
{
|
|
||||||
return new(GetThreadPoolAllocator().allocate(sizeof(T))) T;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class T> inline T* NewPoolObject(T, int instances)
|
|
||||||
{
|
|
||||||
return new(GetThreadPoolAllocator().allocate(instances * sizeof(T))) T[instances];
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Pool allocator versions of vectors, lists, and maps
|
|
||||||
//
|
|
||||||
template <class T> class TVector : public std::vector<T, pool_allocator<T> > {
|
|
||||||
public:
|
|
||||||
POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())
|
|
||||||
|
|
||||||
typedef typename std::vector<T, pool_allocator<T> >::size_type size_type;
|
|
||||||
TVector() : std::vector<T, pool_allocator<T> >() {}
|
|
||||||
TVector(const pool_allocator<T>& a) : std::vector<T, pool_allocator<T> >(a) {}
|
|
||||||
TVector(size_type i) : std::vector<T, pool_allocator<T> >(i) {}
|
|
||||||
TVector(size_type i, const T& val) : std::vector<T, pool_allocator<T> >(i, val) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class T> class TList : public std::list<T, pool_allocator<T> > {
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class K, class D, class CMP = std::less<K> >
|
|
||||||
class TMap : public std::map<K, D, CMP, pool_allocator<std::pair<K const, D> > > {
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class K, class D, class HASH = std::hash<K>, class PRED = std::equal_to<K> >
|
|
||||||
class TUnorderedMap : public std::unordered_map<K, D, HASH, PRED, pool_allocator<std::pair<K const, D> > > {
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// Persistent string memory. Should only be used for strings that survive
|
|
||||||
// across compiles/links.
|
|
||||||
//
|
|
||||||
typedef std::basic_string<char> TPersistString;
|
|
||||||
|
|
||||||
//
|
|
||||||
// templatized min and max functions.
|
|
||||||
//
|
|
||||||
template <class T> T Min(const T a, const T b) { return a < b ? a : b; }
|
|
||||||
template <class T> T Max(const T a, const T b) { return a > b ? a : b; }
|
|
||||||
|
|
||||||
//
|
|
||||||
// Create a TString object from an integer.
|
|
||||||
//
|
|
||||||
#if defined _MSC_VER || defined MINGW_HAS_SECURE_API
|
|
||||||
inline const TString String(const int i, const int base = 10)
|
|
||||||
{
|
|
||||||
char text[16]; // 32 bit ints are at most 10 digits in base 10
|
|
||||||
_itoa_s(i, text, sizeof(text), base);
|
|
||||||
return text;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
inline const TString String(const int i, const int /*base*/ = 10)
|
|
||||||
{
|
|
||||||
char text[16]; // 32 bit ints are at most 10 digits in base 10
|
|
||||||
|
|
||||||
// we assume base 10 for all cases
|
|
||||||
snprintf(text, sizeof(text), "%d", i);
|
|
||||||
|
|
||||||
return text;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct TSourceLoc {
|
|
||||||
void init() { name = nullptr; string = 0; line = 0; column = 0; }
|
|
||||||
void init(int stringNum) { init(); string = stringNum; }
|
|
||||||
// Returns the name if it exists. Otherwise, returns the string number.
|
|
||||||
std::string getStringNameOrNum(bool quoteStringName = true) const
|
|
||||||
{
|
|
||||||
if (name != nullptr)
|
|
||||||
return quoteStringName ? ("\"" + std::string(name) + "\"") : name;
|
|
||||||
return std::to_string((long long)string);
|
|
||||||
}
|
|
||||||
const char* name; // descriptive name for this string
|
|
||||||
int string;
|
|
||||||
int line;
|
|
||||||
int column;
|
|
||||||
};
|
|
||||||
|
|
||||||
class TPragmaTable : public TMap<TString, TString> {
|
|
||||||
public:
|
|
||||||
POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())
|
|
||||||
};
|
|
||||||
|
|
||||||
const int MaxTokenLength = 1024;
|
|
||||||
|
|
||||||
template <class T> bool IsPow2(T powerOf2)
|
|
||||||
{
|
|
||||||
if (powerOf2 <= 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return (powerOf2 & (powerOf2 - 1)) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Round number up to a multiple of the given powerOf2, which is not
|
|
||||||
// a power, just a number that must be a power of 2.
|
|
||||||
template <class T> void RoundToPow2(T& number, int powerOf2)
|
|
||||||
{
|
|
||||||
assert(IsPow2(powerOf2));
|
|
||||||
number = (number + powerOf2 - 1) & ~(powerOf2 - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class T> bool IsMultipleOfPow2(T number, int powerOf2)
|
|
||||||
{
|
|
||||||
assert(IsPow2(powerOf2));
|
|
||||||
return ! (number & (powerOf2 - 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
} // end namespace glslang
|
|
||||||
|
|
||||||
#endif // _COMMON_INCLUDED_
|
|
|
@ -1,625 +0,0 @@
|
||||||
//
|
|
||||||
// Copyright (C) 2002-2005 3Dlabs Inc. Ltd.
|
|
||||||
// Copyright (C) 2013 LunarG, Inc.
|
|
||||||
//
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions
|
|
||||||
// are met:
|
|
||||||
//
|
|
||||||
// Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following
|
|
||||||
// disclaimer in the documentation and/or other materials provided
|
|
||||||
// with the distribution.
|
|
||||||
//
|
|
||||||
// Neither the name of 3Dlabs Inc. Ltd. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef _CONSTANT_UNION_INCLUDED_
|
|
||||||
#define _CONSTANT_UNION_INCLUDED_
|
|
||||||
|
|
||||||
#include "../Include/Common.h"
|
|
||||||
#include "../Include/BaseTypes.h"
|
|
||||||
|
|
||||||
namespace glslang {
|
|
||||||
|
|
||||||
class TConstUnion {
|
|
||||||
public:
|
|
||||||
POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())
|
|
||||||
|
|
||||||
TConstUnion() : iConst(0), type(EbtInt) { }
|
|
||||||
|
|
||||||
void setIConst(int i)
|
|
||||||
{
|
|
||||||
iConst = i;
|
|
||||||
type = EbtInt;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setUConst(unsigned int u)
|
|
||||||
{
|
|
||||||
uConst = u;
|
|
||||||
type = EbtUint;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setI64Const(long long i64)
|
|
||||||
{
|
|
||||||
i64Const = i64;
|
|
||||||
type = EbtInt64;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setU64Const(unsigned long long u64)
|
|
||||||
{
|
|
||||||
u64Const = u64;
|
|
||||||
type = EbtUint64;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setDConst(double d)
|
|
||||||
{
|
|
||||||
dConst = d;
|
|
||||||
type = EbtDouble;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setBConst(bool b)
|
|
||||||
{
|
|
||||||
bConst = b;
|
|
||||||
type = EbtBool;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setSConst(const TString* s)
|
|
||||||
{
|
|
||||||
sConst = s;
|
|
||||||
type = EbtString;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getIConst() const { return iConst; }
|
|
||||||
unsigned int getUConst() const { return uConst; }
|
|
||||||
long long getI64Const() const { return i64Const; }
|
|
||||||
unsigned long long getU64Const() const { return u64Const; }
|
|
||||||
double getDConst() const { return dConst; }
|
|
||||||
bool getBConst() const { return bConst; }
|
|
||||||
const TString* getSConst() const { return sConst; }
|
|
||||||
|
|
||||||
bool operator==(const int i) const
|
|
||||||
{
|
|
||||||
if (i == iConst)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator==(const unsigned int u) const
|
|
||||||
{
|
|
||||||
if (u == uConst)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator==(const long long i64) const
|
|
||||||
{
|
|
||||||
if (i64 == i64Const)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator==(const unsigned long long u64) const
|
|
||||||
{
|
|
||||||
if (u64 == u64Const)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator==(const double d) const
|
|
||||||
{
|
|
||||||
if (d == dConst)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator==(const bool b) const
|
|
||||||
{
|
|
||||||
if (b == bConst)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator==(const TConstUnion& constant) const
|
|
||||||
{
|
|
||||||
if (constant.type != type)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
switch (type) {
|
|
||||||
case EbtInt:
|
|
||||||
if (constant.iConst == iConst)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
break;
|
|
||||||
case EbtUint:
|
|
||||||
if (constant.uConst == uConst)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
break;
|
|
||||||
case EbtInt64:
|
|
||||||
if (constant.i64Const == i64Const)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
break;
|
|
||||||
case EbtUint64:
|
|
||||||
if (constant.u64Const == u64Const)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
break;
|
|
||||||
case EbtDouble:
|
|
||||||
if (constant.dConst == dConst)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
break;
|
|
||||||
case EbtBool:
|
|
||||||
if (constant.bConst == bConst)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
assert(false && "Default missing");
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator!=(const int i) const
|
|
||||||
{
|
|
||||||
return !operator==(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator!=(const unsigned int u) const
|
|
||||||
{
|
|
||||||
return !operator==(u);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator!=(const long long i) const
|
|
||||||
{
|
|
||||||
return !operator==(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator!=(const unsigned long long u) const
|
|
||||||
{
|
|
||||||
return !operator==(u);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator!=(const float f) const
|
|
||||||
{
|
|
||||||
return !operator==(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator!=(const bool b) const
|
|
||||||
{
|
|
||||||
return !operator==(b);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator!=(const TConstUnion& constant) const
|
|
||||||
{
|
|
||||||
return !operator==(constant);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator>(const TConstUnion& constant) const
|
|
||||||
{
|
|
||||||
assert(type == constant.type);
|
|
||||||
switch (type) {
|
|
||||||
case EbtInt:
|
|
||||||
if (iConst > constant.iConst)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
case EbtUint:
|
|
||||||
if (uConst > constant.uConst)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
case EbtInt64:
|
|
||||||
if (i64Const > constant.i64Const)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
case EbtUint64:
|
|
||||||
if (u64Const > constant.u64Const)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
case EbtDouble:
|
|
||||||
if (dConst > constant.dConst)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
default:
|
|
||||||
assert(false && "Default missing");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator<(const TConstUnion& constant) const
|
|
||||||
{
|
|
||||||
assert(type == constant.type);
|
|
||||||
switch (type) {
|
|
||||||
case EbtInt:
|
|
||||||
if (iConst < constant.iConst)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
case EbtUint:
|
|
||||||
if (uConst < constant.uConst)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
case EbtInt64:
|
|
||||||
if (i64Const < constant.i64Const)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
case EbtUint64:
|
|
||||||
if (u64Const < constant.u64Const)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
case EbtDouble:
|
|
||||||
if (dConst < constant.dConst)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
default:
|
|
||||||
assert(false && "Default missing");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TConstUnion operator+(const TConstUnion& constant) const
|
|
||||||
{
|
|
||||||
TConstUnion returnValue;
|
|
||||||
assert(type == constant.type);
|
|
||||||
switch (type) {
|
|
||||||
case EbtInt: returnValue.setIConst(iConst + constant.iConst); break;
|
|
||||||
case EbtInt64: returnValue.setI64Const(i64Const + constant.i64Const); break;
|
|
||||||
case EbtUint: returnValue.setUConst(uConst + constant.uConst); break;
|
|
||||||
case EbtUint64: returnValue.setU64Const(u64Const + constant.u64Const); break;
|
|
||||||
case EbtDouble: returnValue.setDConst(dConst + constant.dConst); break;
|
|
||||||
default: assert(false && "Default missing");
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
TConstUnion operator-(const TConstUnion& constant) const
|
|
||||||
{
|
|
||||||
TConstUnion returnValue;
|
|
||||||
assert(type == constant.type);
|
|
||||||
switch (type) {
|
|
||||||
case EbtInt: returnValue.setIConst(iConst - constant.iConst); break;
|
|
||||||
case EbtInt64: returnValue.setI64Const(i64Const - constant.i64Const); break;
|
|
||||||
case EbtUint: returnValue.setUConst(uConst - constant.uConst); break;
|
|
||||||
case EbtUint64: returnValue.setU64Const(u64Const - constant.u64Const); break;
|
|
||||||
case EbtDouble: returnValue.setDConst(dConst - constant.dConst); break;
|
|
||||||
default: assert(false && "Default missing");
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
TConstUnion operator*(const TConstUnion& constant) const
|
|
||||||
{
|
|
||||||
TConstUnion returnValue;
|
|
||||||
assert(type == constant.type);
|
|
||||||
switch (type) {
|
|
||||||
case EbtInt: returnValue.setIConst(iConst * constant.iConst); break;
|
|
||||||
case EbtInt64: returnValue.setI64Const(i64Const * constant.i64Const); break;
|
|
||||||
case EbtUint: returnValue.setUConst(uConst * constant.uConst); break;
|
|
||||||
case EbtUint64: returnValue.setU64Const(u64Const * constant.u64Const); break;
|
|
||||||
case EbtDouble: returnValue.setDConst(dConst * constant.dConst); break;
|
|
||||||
default: assert(false && "Default missing");
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
TConstUnion operator%(const TConstUnion& constant) const
|
|
||||||
{
|
|
||||||
TConstUnion returnValue;
|
|
||||||
assert(type == constant.type);
|
|
||||||
switch (type) {
|
|
||||||
case EbtInt: returnValue.setIConst(iConst % constant.iConst); break;
|
|
||||||
case EbtInt64: returnValue.setI64Const(i64Const % constant.i64Const); break;
|
|
||||||
case EbtUint: returnValue.setUConst(uConst % constant.uConst); break;
|
|
||||||
case EbtUint64: returnValue.setU64Const(u64Const % constant.u64Const); break;
|
|
||||||
default: assert(false && "Default missing");
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
TConstUnion operator>>(const TConstUnion& constant) const
|
|
||||||
{
|
|
||||||
TConstUnion returnValue;
|
|
||||||
switch (type) {
|
|
||||||
case EbtInt:
|
|
||||||
switch (constant.type) {
|
|
||||||
case EbtInt: returnValue.setIConst(iConst >> constant.iConst); break;
|
|
||||||
case EbtUint: returnValue.setIConst(iConst >> constant.uConst); break;
|
|
||||||
case EbtInt64: returnValue.setIConst(iConst >> constant.i64Const); break;
|
|
||||||
case EbtUint64: returnValue.setIConst(iConst >> constant.u64Const); break;
|
|
||||||
default: assert(false && "Default missing");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case EbtUint:
|
|
||||||
switch (constant.type) {
|
|
||||||
case EbtInt: returnValue.setUConst(uConst >> constant.iConst); break;
|
|
||||||
case EbtUint: returnValue.setUConst(uConst >> constant.uConst); break;
|
|
||||||
case EbtInt64: returnValue.setUConst(uConst >> constant.i64Const); break;
|
|
||||||
case EbtUint64: returnValue.setUConst(uConst >> constant.u64Const); break;
|
|
||||||
default: assert(false && "Default missing");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case EbtInt64:
|
|
||||||
switch (constant.type) {
|
|
||||||
case EbtInt: returnValue.setI64Const(i64Const >> constant.iConst); break;
|
|
||||||
case EbtUint: returnValue.setI64Const(i64Const >> constant.uConst); break;
|
|
||||||
case EbtInt64: returnValue.setI64Const(i64Const >> constant.i64Const); break;
|
|
||||||
case EbtUint64: returnValue.setI64Const(i64Const >> constant.u64Const); break;
|
|
||||||
default: assert(false && "Default missing");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case EbtUint64:
|
|
||||||
switch (constant.type) {
|
|
||||||
case EbtInt: returnValue.setU64Const(u64Const >> constant.iConst); break;
|
|
||||||
case EbtUint: returnValue.setU64Const(u64Const >> constant.uConst); break;
|
|
||||||
case EbtInt64: returnValue.setU64Const(u64Const >> constant.i64Const); break;
|
|
||||||
case EbtUint64: returnValue.setU64Const(u64Const >> constant.u64Const); break;
|
|
||||||
default: assert(false && "Default missing");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default: assert(false && "Default missing");
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
TConstUnion operator<<(const TConstUnion& constant) const
|
|
||||||
{
|
|
||||||
TConstUnion returnValue;
|
|
||||||
switch (type) {
|
|
||||||
case EbtInt:
|
|
||||||
switch (constant.type) {
|
|
||||||
case EbtInt: returnValue.setIConst(iConst << constant.iConst); break;
|
|
||||||
case EbtUint: returnValue.setIConst(iConst << constant.uConst); break;
|
|
||||||
case EbtInt64: returnValue.setIConst(iConst << constant.i64Const); break;
|
|
||||||
case EbtUint64: returnValue.setIConst(iConst << constant.u64Const); break;
|
|
||||||
default: assert(false && "Default missing");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case EbtUint:
|
|
||||||
switch (constant.type) {
|
|
||||||
case EbtInt: returnValue.setUConst(uConst << constant.iConst); break;
|
|
||||||
case EbtUint: returnValue.setUConst(uConst << constant.uConst); break;
|
|
||||||
case EbtInt64: returnValue.setUConst(uConst << constant.i64Const); break;
|
|
||||||
case EbtUint64: returnValue.setUConst(uConst << constant.u64Const); break;
|
|
||||||
default: assert(false && "Default missing");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case EbtInt64:
|
|
||||||
switch (constant.type) {
|
|
||||||
case EbtInt: returnValue.setI64Const(i64Const << constant.iConst); break;
|
|
||||||
case EbtUint: returnValue.setI64Const(i64Const << constant.uConst); break;
|
|
||||||
case EbtInt64: returnValue.setI64Const(i64Const << constant.i64Const); break;
|
|
||||||
case EbtUint64: returnValue.setI64Const(i64Const << constant.u64Const); break;
|
|
||||||
default: assert(false && "Default missing");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case EbtUint64:
|
|
||||||
switch (constant.type) {
|
|
||||||
case EbtInt: returnValue.setU64Const(u64Const << constant.iConst); break;
|
|
||||||
case EbtUint: returnValue.setU64Const(u64Const << constant.uConst); break;
|
|
||||||
case EbtInt64: returnValue.setU64Const(u64Const << constant.i64Const); break;
|
|
||||||
case EbtUint64: returnValue.setU64Const(u64Const << constant.u64Const); break;
|
|
||||||
default: assert(false && "Default missing");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default: assert(false && "Default missing");
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
TConstUnion operator&(const TConstUnion& constant) const
|
|
||||||
{
|
|
||||||
TConstUnion returnValue;
|
|
||||||
assert(type == constant.type);
|
|
||||||
switch (type) {
|
|
||||||
case EbtInt: returnValue.setIConst(iConst & constant.iConst); break;
|
|
||||||
case EbtUint: returnValue.setUConst(uConst & constant.uConst); break;
|
|
||||||
case EbtInt64: returnValue.setI64Const(i64Const & constant.i64Const); break;
|
|
||||||
case EbtUint64: returnValue.setU64Const(u64Const & constant.u64Const); break;
|
|
||||||
default: assert(false && "Default missing");
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
TConstUnion operator|(const TConstUnion& constant) const
|
|
||||||
{
|
|
||||||
TConstUnion returnValue;
|
|
||||||
assert(type == constant.type);
|
|
||||||
switch (type) {
|
|
||||||
case EbtInt: returnValue.setIConst(iConst | constant.iConst); break;
|
|
||||||
case EbtUint: returnValue.setUConst(uConst | constant.uConst); break;
|
|
||||||
case EbtInt64: returnValue.setI64Const(i64Const | constant.i64Const); break;
|
|
||||||
case EbtUint64: returnValue.setU64Const(u64Const | constant.u64Const); break;
|
|
||||||
default: assert(false && "Default missing");
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
TConstUnion operator^(const TConstUnion& constant) const
|
|
||||||
{
|
|
||||||
TConstUnion returnValue;
|
|
||||||
assert(type == constant.type);
|
|
||||||
switch (type) {
|
|
||||||
case EbtInt: returnValue.setIConst(iConst ^ constant.iConst); break;
|
|
||||||
case EbtUint: returnValue.setUConst(uConst ^ constant.uConst); break;
|
|
||||||
case EbtInt64: returnValue.setI64Const(i64Const ^ constant.i64Const); break;
|
|
||||||
case EbtUint64: returnValue.setU64Const(u64Const ^ constant.u64Const); break;
|
|
||||||
default: assert(false && "Default missing");
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
TConstUnion operator~() const
|
|
||||||
{
|
|
||||||
TConstUnion returnValue;
|
|
||||||
switch (type) {
|
|
||||||
case EbtInt: returnValue.setIConst(~iConst); break;
|
|
||||||
case EbtUint: returnValue.setUConst(~uConst); break;
|
|
||||||
case EbtInt64: returnValue.setI64Const(~i64Const); break;
|
|
||||||
case EbtUint64: returnValue.setU64Const(~u64Const); break;
|
|
||||||
default: assert(false && "Default missing");
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
TConstUnion operator&&(const TConstUnion& constant) const
|
|
||||||
{
|
|
||||||
TConstUnion returnValue;
|
|
||||||
assert(type == constant.type);
|
|
||||||
switch (type) {
|
|
||||||
case EbtBool: returnValue.setBConst(bConst && constant.bConst); break;
|
|
||||||
default: assert(false && "Default missing");
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
TConstUnion operator||(const TConstUnion& constant) const
|
|
||||||
{
|
|
||||||
TConstUnion returnValue;
|
|
||||||
assert(type == constant.type);
|
|
||||||
switch (type) {
|
|
||||||
case EbtBool: returnValue.setBConst(bConst || constant.bConst); break;
|
|
||||||
default: assert(false && "Default missing");
|
|
||||||
}
|
|
||||||
|
|
||||||
return returnValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
TBasicType getType() const { return type; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
union {
|
|
||||||
int iConst; // used for ivec, scalar ints
|
|
||||||
unsigned int uConst; // used for uvec, scalar uints
|
|
||||||
long long i64Const; // used for i64vec, scalar int64s
|
|
||||||
unsigned long long u64Const; // used for u64vec, scalar uint64s
|
|
||||||
bool bConst; // used for bvec, scalar bools
|
|
||||||
double dConst; // used for vec, dvec, mat, dmat, scalar floats and doubles
|
|
||||||
const TString* sConst; // string constant
|
|
||||||
};
|
|
||||||
|
|
||||||
TBasicType type;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Encapsulate having a pointer to an array of TConstUnion,
|
|
||||||
// which only needs to be allocated if its size is going to be
|
|
||||||
// bigger than 0.
|
|
||||||
//
|
|
||||||
// One convenience is being able to use [] to go inside the array, instead
|
|
||||||
// of C++ assuming it as an array of pointers to vectors.
|
|
||||||
//
|
|
||||||
// General usage is that the size is known up front, and it is
|
|
||||||
// created once with the proper size.
|
|
||||||
//
|
|
||||||
class TConstUnionArray {
|
|
||||||
public:
|
|
||||||
POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())
|
|
||||||
|
|
||||||
TConstUnionArray() : unionArray(nullptr) { }
|
|
||||||
virtual ~TConstUnionArray() { }
|
|
||||||
|
|
||||||
explicit TConstUnionArray(int size)
|
|
||||||
{
|
|
||||||
if (size == 0)
|
|
||||||
unionArray = nullptr;
|
|
||||||
else
|
|
||||||
unionArray = new TConstUnionVector(size);
|
|
||||||
}
|
|
||||||
TConstUnionArray(const TConstUnionArray& a) : unionArray(a.unionArray) { }
|
|
||||||
TConstUnionArray(const TConstUnionArray& a, int start, int size)
|
|
||||||
{
|
|
||||||
unionArray = new TConstUnionVector(size);
|
|
||||||
for (int i = 0; i < size; ++i)
|
|
||||||
(*unionArray)[i] = a[start + i];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Use this constructor for a smear operation
|
|
||||||
TConstUnionArray(int size, const TConstUnion& val)
|
|
||||||
{
|
|
||||||
unionArray = new TConstUnionVector(size, val);
|
|
||||||
}
|
|
||||||
|
|
||||||
int size() const { return unionArray ? (int)unionArray->size() : 0; }
|
|
||||||
TConstUnion& operator[](size_t index) { return (*unionArray)[index]; }
|
|
||||||
const TConstUnion& operator[](size_t index) const { return (*unionArray)[index]; }
|
|
||||||
bool operator==(const TConstUnionArray& rhs) const
|
|
||||||
{
|
|
||||||
// this includes the case that both are unallocated
|
|
||||||
if (unionArray == rhs.unionArray)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if (! unionArray || ! rhs.unionArray)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return *unionArray == *rhs.unionArray;
|
|
||||||
}
|
|
||||||
bool operator!=(const TConstUnionArray& rhs) const { return ! operator==(rhs); }
|
|
||||||
|
|
||||||
double dot(const TConstUnionArray& rhs)
|
|
||||||
{
|
|
||||||
assert(rhs.unionArray->size() == unionArray->size());
|
|
||||||
double sum = 0.0;
|
|
||||||
|
|
||||||
for (size_t comp = 0; comp < unionArray->size(); ++comp)
|
|
||||||
sum += (*this)[comp].getDConst() * rhs[comp].getDConst();
|
|
||||||
|
|
||||||
return sum;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool empty() const { return unionArray == nullptr; }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
typedef TVector<TConstUnion> TConstUnionVector;
|
|
||||||
TConstUnionVector* unionArray;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // end namespace glslang
|
|
||||||
|
|
||||||
#endif // _CONSTANT_UNION_INCLUDED_
|
|
|
@ -1,144 +0,0 @@
|
||||||
//
|
|
||||||
// Copyright (C) 2002-2005 3Dlabs Inc. Ltd.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions
|
|
||||||
// are met:
|
|
||||||
//
|
|
||||||
// Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following
|
|
||||||
// disclaimer in the documentation and/or other materials provided
|
|
||||||
// with the distribution.
|
|
||||||
//
|
|
||||||
// Neither the name of 3Dlabs Inc. Ltd. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef _INFOSINK_INCLUDED_
|
|
||||||
#define _INFOSINK_INCLUDED_
|
|
||||||
|
|
||||||
#include "../Include/Common.h"
|
|
||||||
#include <cmath>
|
|
||||||
|
|
||||||
namespace glslang {
|
|
||||||
|
|
||||||
//
|
|
||||||
// TPrefixType is used to centralize how info log messages start.
|
|
||||||
// See below.
|
|
||||||
//
|
|
||||||
enum TPrefixType {
|
|
||||||
EPrefixNone,
|
|
||||||
EPrefixWarning,
|
|
||||||
EPrefixError,
|
|
||||||
EPrefixInternalError,
|
|
||||||
EPrefixUnimplemented,
|
|
||||||
EPrefixNote
|
|
||||||
};
|
|
||||||
|
|
||||||
enum TOutputStream {
|
|
||||||
ENull = 0,
|
|
||||||
EDebugger = 0x01,
|
|
||||||
EStdOut = 0x02,
|
|
||||||
EString = 0x04,
|
|
||||||
};
|
|
||||||
//
|
|
||||||
// Encapsulate info logs for all objects that have them.
|
|
||||||
//
|
|
||||||
// The methods are a general set of tools for getting a variety of
|
|
||||||
// messages and types inserted into the log.
|
|
||||||
//
|
|
||||||
class TInfoSinkBase {
|
|
||||||
public:
|
|
||||||
TInfoSinkBase() : outputStream(4) {}
|
|
||||||
void erase() { sink.erase(); }
|
|
||||||
TInfoSinkBase& operator<<(const TPersistString& t) { append(t); return *this; }
|
|
||||||
TInfoSinkBase& operator<<(char c) { append(1, c); return *this; }
|
|
||||||
TInfoSinkBase& operator<<(const char* s) { append(s); return *this; }
|
|
||||||
TInfoSinkBase& operator<<(int n) { append(String(n)); return *this; }
|
|
||||||
TInfoSinkBase& operator<<(unsigned int n) { append(String(n)); return *this; }
|
|
||||||
TInfoSinkBase& operator<<(float n) { const int size = 40; char buf[size];
|
|
||||||
snprintf(buf, size, (fabs(n) > 1e-8 && fabs(n) < 1e8) || n == 0.0f ? "%f" : "%g", n);
|
|
||||||
append(buf);
|
|
||||||
return *this; }
|
|
||||||
TInfoSinkBase& operator+(const TPersistString& t) { append(t); return *this; }
|
|
||||||
TInfoSinkBase& operator+(const TString& t) { append(t); return *this; }
|
|
||||||
TInfoSinkBase& operator<<(const TString& t) { append(t); return *this; }
|
|
||||||
TInfoSinkBase& operator+(const char* s) { append(s); return *this; }
|
|
||||||
const char* c_str() const { return sink.c_str(); }
|
|
||||||
void prefix(TPrefixType message) {
|
|
||||||
switch(message) {
|
|
||||||
case EPrefixNone: break;
|
|
||||||
case EPrefixWarning: append("WARNING: "); break;
|
|
||||||
case EPrefixError: append("ERROR: "); break;
|
|
||||||
case EPrefixInternalError: append("INTERNAL ERROR: "); break;
|
|
||||||
case EPrefixUnimplemented: append("UNIMPLEMENTED: "); break;
|
|
||||||
case EPrefixNote: append("NOTE: "); break;
|
|
||||||
default: append("UNKNOWN ERROR: "); break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void location(const TSourceLoc& loc) {
|
|
||||||
const int maxSize = 24;
|
|
||||||
char locText[maxSize];
|
|
||||||
snprintf(locText, maxSize, ":%d", loc.line);
|
|
||||||
append(loc.getStringNameOrNum(false).c_str());
|
|
||||||
append(locText);
|
|
||||||
append(": ");
|
|
||||||
}
|
|
||||||
void message(TPrefixType message, const char* s) {
|
|
||||||
prefix(message);
|
|
||||||
append(s);
|
|
||||||
append("\n");
|
|
||||||
}
|
|
||||||
void message(TPrefixType message, const char* s, const TSourceLoc& loc) {
|
|
||||||
prefix(message);
|
|
||||||
location(loc);
|
|
||||||
append(s);
|
|
||||||
append("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
void setOutputStream(int output = 4)
|
|
||||||
{
|
|
||||||
outputStream = output;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void append(const char* s);
|
|
||||||
|
|
||||||
void append(int count, char c);
|
|
||||||
void append(const TPersistString& t);
|
|
||||||
void append(const TString& t);
|
|
||||||
|
|
||||||
void checkMem(size_t growth) { if (sink.capacity() < sink.size() + growth + 2)
|
|
||||||
sink.reserve(sink.capacity() + sink.capacity() / 2); }
|
|
||||||
void appendToStream(const char* s);
|
|
||||||
TPersistString sink;
|
|
||||||
int outputStream;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // end namespace glslang
|
|
||||||
|
|
||||||
class TInfoSink {
|
|
||||||
public:
|
|
||||||
glslang::TInfoSinkBase info;
|
|
||||||
glslang::TInfoSinkBase debug;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // _INFOSINK_INCLUDED_
|
|
|
@ -1,44 +0,0 @@
|
||||||
//
|
|
||||||
// Copyright (C) 2002-2005 3Dlabs Inc. Ltd.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions
|
|
||||||
// are met:
|
|
||||||
//
|
|
||||||
// Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following
|
|
||||||
// disclaimer in the documentation and/or other materials provided
|
|
||||||
// with the distribution.
|
|
||||||
//
|
|
||||||
// Neither the name of 3Dlabs Inc. Ltd. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef __INITIALIZE_GLOBALS_INCLUDED_
|
|
||||||
#define __INITIALIZE_GLOBALS_INCLUDED_
|
|
||||||
|
|
||||||
namespace glslang {
|
|
||||||
|
|
||||||
bool InitializePoolIndex();
|
|
||||||
|
|
||||||
} // end namespace glslang
|
|
||||||
|
|
||||||
#endif // __INITIALIZE_GLOBALS_INCLUDED_
|
|
|
@ -1,317 +0,0 @@
|
||||||
//
|
|
||||||
// Copyright (C) 2002-2005 3Dlabs Inc. Ltd.
|
|
||||||
// Copyright (C) 2012-2013 LunarG, Inc.
|
|
||||||
//
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions
|
|
||||||
// are met:
|
|
||||||
//
|
|
||||||
// Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following
|
|
||||||
// disclaimer in the documentation and/or other materials provided
|
|
||||||
// with the distribution.
|
|
||||||
//
|
|
||||||
// Neither the name of 3Dlabs Inc. Ltd. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef _POOLALLOC_INCLUDED_
|
|
||||||
#define _POOLALLOC_INCLUDED_
|
|
||||||
|
|
||||||
#ifdef _DEBUG
|
|
||||||
# define GUARD_BLOCKS // define to enable guard block sanity checking
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
|
||||||
// This header defines an allocator that can be used to efficiently
|
|
||||||
// allocate a large number of small requests for heap memory, with the
|
|
||||||
// intention that they are not individually deallocated, but rather
|
|
||||||
// collectively deallocated at one time.
|
|
||||||
//
|
|
||||||
// This simultaneously
|
|
||||||
//
|
|
||||||
// * Makes each individual allocation much more efficient; the
|
|
||||||
// typical allocation is trivial.
|
|
||||||
// * Completely avoids the cost of doing individual deallocation.
|
|
||||||
// * Saves the trouble of tracking down and plugging a large class of leaks.
|
|
||||||
//
|
|
||||||
// Individual classes can use this allocator by supplying their own
|
|
||||||
// new and delete methods.
|
|
||||||
//
|
|
||||||
// STL containers can use this allocator by using the pool_allocator
|
|
||||||
// class as the allocator (second) template argument.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <cstddef>
|
|
||||||
#include <cstring>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace glslang {
|
|
||||||
|
|
||||||
// If we are using guard blocks, we must track each individual
|
|
||||||
// allocation. If we aren't using guard blocks, these
|
|
||||||
// never get instantiated, so won't have any impact.
|
|
||||||
//
|
|
||||||
|
|
||||||
class TAllocation {
|
|
||||||
public:
|
|
||||||
TAllocation(size_t size, unsigned char* mem, TAllocation* prev = 0) :
|
|
||||||
size(size), mem(mem), prevAlloc(prev) {
|
|
||||||
// Allocations are bracketed:
|
|
||||||
// [allocationHeader][initialGuardBlock][userData][finalGuardBlock]
|
|
||||||
// This would be cleaner with if (guardBlockSize)..., but that
|
|
||||||
// makes the compiler print warnings about 0 length memsets,
|
|
||||||
// even with the if() protecting them.
|
|
||||||
# ifdef GUARD_BLOCKS
|
|
||||||
memset(preGuard(), guardBlockBeginVal, guardBlockSize);
|
|
||||||
memset(data(), userDataFill, size);
|
|
||||||
memset(postGuard(), guardBlockEndVal, guardBlockSize);
|
|
||||||
# endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void check() const {
|
|
||||||
checkGuardBlock(preGuard(), guardBlockBeginVal, "before");
|
|
||||||
checkGuardBlock(postGuard(), guardBlockEndVal, "after");
|
|
||||||
}
|
|
||||||
|
|
||||||
void checkAllocList() const;
|
|
||||||
|
|
||||||
// Return total size needed to accommodate user buffer of 'size',
|
|
||||||
// plus our tracking data.
|
|
||||||
inline static size_t allocationSize(size_t size) {
|
|
||||||
return size + 2 * guardBlockSize + headerSize();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Offset from surrounding buffer to get to user data buffer.
|
|
||||||
inline static unsigned char* offsetAllocation(unsigned char* m) {
|
|
||||||
return m + guardBlockSize + headerSize();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
void checkGuardBlock(unsigned char* blockMem, unsigned char val, const char* locText) const;
|
|
||||||
|
|
||||||
// Find offsets to pre and post guard blocks, and user data buffer
|
|
||||||
unsigned char* preGuard() const { return mem + headerSize(); }
|
|
||||||
unsigned char* data() const { return preGuard() + guardBlockSize; }
|
|
||||||
unsigned char* postGuard() const { return data() + size; }
|
|
||||||
|
|
||||||
size_t size; // size of the user data area
|
|
||||||
unsigned char* mem; // beginning of our allocation (pts to header)
|
|
||||||
TAllocation* prevAlloc; // prior allocation in the chain
|
|
||||||
|
|
||||||
const static unsigned char guardBlockBeginVal;
|
|
||||||
const static unsigned char guardBlockEndVal;
|
|
||||||
const static unsigned char userDataFill;
|
|
||||||
|
|
||||||
const static size_t guardBlockSize;
|
|
||||||
# ifdef GUARD_BLOCKS
|
|
||||||
inline static size_t headerSize() { return sizeof(TAllocation); }
|
|
||||||
# else
|
|
||||||
inline static size_t headerSize() { return 0; }
|
|
||||||
# endif
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// There are several stacks. One is to track the pushing and popping
|
|
||||||
// of the user, and not yet implemented. The others are simply a
|
|
||||||
// repositories of free pages or used pages.
|
|
||||||
//
|
|
||||||
// Page stacks are linked together with a simple header at the beginning
|
|
||||||
// of each allocation obtained from the underlying OS. Multi-page allocations
|
|
||||||
// are returned to the OS. Individual page allocations are kept for future
|
|
||||||
// re-use.
|
|
||||||
//
|
|
||||||
// The "page size" used is not, nor must it match, the underlying OS
|
|
||||||
// page size. But, having it be about that size or equal to a set of
|
|
||||||
// pages is likely most optimal.
|
|
||||||
//
|
|
||||||
class TPoolAllocator {
|
|
||||||
public:
|
|
||||||
TPoolAllocator(int growthIncrement = 8*1024, int allocationAlignment = 16);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Don't call the destructor just to free up the memory, call pop()
|
|
||||||
//
|
|
||||||
~TPoolAllocator();
|
|
||||||
|
|
||||||
//
|
|
||||||
// Call push() to establish a new place to pop memory too. Does not
|
|
||||||
// have to be called to get things started.
|
|
||||||
//
|
|
||||||
void push();
|
|
||||||
|
|
||||||
//
|
|
||||||
// Call pop() to free all memory allocated since the last call to push(),
|
|
||||||
// or if no last call to push, frees all memory since first allocation.
|
|
||||||
//
|
|
||||||
void pop();
|
|
||||||
|
|
||||||
//
|
|
||||||
// Call popAll() to free all memory allocated.
|
|
||||||
//
|
|
||||||
void popAll();
|
|
||||||
|
|
||||||
//
|
|
||||||
// Call allocate() to actually acquire memory. Returns 0 if no memory
|
|
||||||
// available, otherwise a properly aligned pointer to 'numBytes' of memory.
|
|
||||||
//
|
|
||||||
void* allocate(size_t numBytes);
|
|
||||||
|
|
||||||
//
|
|
||||||
// There is no deallocate. The point of this class is that
|
|
||||||
// deallocation can be skipped by the user of it, as the model
|
|
||||||
// of use is to simultaneously deallocate everything at once
|
|
||||||
// by calling pop(), and to not have to solve memory leak problems.
|
|
||||||
//
|
|
||||||
|
|
||||||
protected:
|
|
||||||
friend struct tHeader;
|
|
||||||
|
|
||||||
struct tHeader {
|
|
||||||
tHeader(tHeader* nextPage, size_t pageCount) :
|
|
||||||
#ifdef GUARD_BLOCKS
|
|
||||||
lastAllocation(0),
|
|
||||||
#endif
|
|
||||||
nextPage(nextPage), pageCount(pageCount) { }
|
|
||||||
|
|
||||||
~tHeader() {
|
|
||||||
#ifdef GUARD_BLOCKS
|
|
||||||
if (lastAllocation)
|
|
||||||
lastAllocation->checkAllocList();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef GUARD_BLOCKS
|
|
||||||
TAllocation* lastAllocation;
|
|
||||||
#endif
|
|
||||||
tHeader* nextPage;
|
|
||||||
size_t pageCount;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct tAllocState {
|
|
||||||
size_t offset;
|
|
||||||
tHeader* page;
|
|
||||||
};
|
|
||||||
typedef std::vector<tAllocState> tAllocStack;
|
|
||||||
|
|
||||||
// Track allocations if and only if we're using guard blocks
|
|
||||||
#ifndef GUARD_BLOCKS
|
|
||||||
void* initializeAllocation(tHeader*, unsigned char* memory, size_t) {
|
|
||||||
#else
|
|
||||||
void* initializeAllocation(tHeader* block, unsigned char* memory, size_t numBytes) {
|
|
||||||
new(memory) TAllocation(numBytes, memory, block->lastAllocation);
|
|
||||||
block->lastAllocation = reinterpret_cast<TAllocation*>(memory);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// This is optimized entirely away if GUARD_BLOCKS is not defined.
|
|
||||||
return TAllocation::offsetAllocation(memory);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t pageSize; // granularity of allocation from the OS
|
|
||||||
size_t alignment; // all returned allocations will be aligned at
|
|
||||||
// this granularity, which will be a power of 2
|
|
||||||
size_t alignmentMask;
|
|
||||||
size_t headerSkip; // amount of memory to skip to make room for the
|
|
||||||
// header (basically, size of header, rounded
|
|
||||||
// up to make it aligned
|
|
||||||
size_t currentPageOffset; // next offset in top of inUseList to allocate from
|
|
||||||
tHeader* freeList; // list of popped memory
|
|
||||||
tHeader* inUseList; // list of all memory currently being used
|
|
||||||
tAllocStack stack; // stack of where to allocate from, to partition pool
|
|
||||||
|
|
||||||
int numCalls; // just an interesting statistic
|
|
||||||
size_t totalBytes; // just an interesting statistic
|
|
||||||
private:
|
|
||||||
TPoolAllocator& operator=(const TPoolAllocator&); // don't allow assignment operator
|
|
||||||
TPoolAllocator(const TPoolAllocator&); // don't allow default copy constructor
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// There could potentially be many pools with pops happening at
|
|
||||||
// different times. But a simple use is to have a global pop
|
|
||||||
// with everyone using the same global allocator.
|
|
||||||
//
|
|
||||||
extern TPoolAllocator& GetThreadPoolAllocator();
|
|
||||||
void SetThreadPoolAllocator(TPoolAllocator* poolAllocator);
|
|
||||||
|
|
||||||
//
|
|
||||||
// This STL compatible allocator is intended to be used as the allocator
|
|
||||||
// parameter to templatized STL containers, like vector and map.
|
|
||||||
//
|
|
||||||
// It will use the pools for allocation, and not
|
|
||||||
// do any deallocation, but will still do destruction.
|
|
||||||
//
|
|
||||||
template<class T>
|
|
||||||
class pool_allocator {
|
|
||||||
public:
|
|
||||||
typedef size_t size_type;
|
|
||||||
typedef ptrdiff_t difference_type;
|
|
||||||
typedef T *pointer;
|
|
||||||
typedef const T *const_pointer;
|
|
||||||
typedef T& reference;
|
|
||||||
typedef const T& const_reference;
|
|
||||||
typedef T value_type;
|
|
||||||
template<class Other>
|
|
||||||
struct rebind {
|
|
||||||
typedef pool_allocator<Other> other;
|
|
||||||
};
|
|
||||||
pointer address(reference x) const { return &x; }
|
|
||||||
const_pointer address(const_reference x) const { return &x; }
|
|
||||||
|
|
||||||
pool_allocator() : allocator(GetThreadPoolAllocator()) { }
|
|
||||||
pool_allocator(TPoolAllocator& a) : allocator(a) { }
|
|
||||||
pool_allocator(const pool_allocator<T>& p) : allocator(p.allocator) { }
|
|
||||||
|
|
||||||
template<class Other>
|
|
||||||
pool_allocator(const pool_allocator<Other>& p) : allocator(p.getAllocator()) { }
|
|
||||||
|
|
||||||
pointer allocate(size_type n) {
|
|
||||||
return reinterpret_cast<pointer>(getAllocator().allocate(n * sizeof(T))); }
|
|
||||||
pointer allocate(size_type n, const void*) {
|
|
||||||
return reinterpret_cast<pointer>(getAllocator().allocate(n * sizeof(T))); }
|
|
||||||
|
|
||||||
void deallocate(void*, size_type) { }
|
|
||||||
void deallocate(pointer, size_type) { }
|
|
||||||
|
|
||||||
pointer _Charalloc(size_t n) {
|
|
||||||
return reinterpret_cast<pointer>(getAllocator().allocate(n)); }
|
|
||||||
|
|
||||||
void construct(pointer p, const T& val) { new ((void *)p) T(val); }
|
|
||||||
void destroy(pointer p) { p->T::~T(); }
|
|
||||||
|
|
||||||
bool operator==(const pool_allocator& rhs) const { return &getAllocator() == &rhs.getAllocator(); }
|
|
||||||
bool operator!=(const pool_allocator& rhs) const { return &getAllocator() != &rhs.getAllocator(); }
|
|
||||||
|
|
||||||
size_type max_size() const { return static_cast<size_type>(-1) / sizeof(T); }
|
|
||||||
size_type max_size(int size) const { return static_cast<size_type>(-1) / size; }
|
|
||||||
|
|
||||||
void setAllocator(TPoolAllocator* a) { allocator = *a; }
|
|
||||||
TPoolAllocator& getAllocator() const { return allocator; }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
pool_allocator& operator=(const pool_allocator&) { return *this; }
|
|
||||||
TPoolAllocator& allocator;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // end namespace glslang
|
|
||||||
|
|
||||||
#endif // _POOLALLOC_INCLUDED_
|
|
|
@ -1,140 +0,0 @@
|
||||||
//
|
|
||||||
// Copyright (C) 2002-2005 3Dlabs Inc. Ltd.
|
|
||||||
// Copyright (C) 2013 LunarG, Inc.
|
|
||||||
//
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions
|
|
||||||
// are met:
|
|
||||||
//
|
|
||||||
// Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following
|
|
||||||
// disclaimer in the documentation and/or other materials provided
|
|
||||||
// with the distribution.
|
|
||||||
//
|
|
||||||
// Neither the name of 3Dlabs Inc. Ltd. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef _RESOURCE_LIMITS_INCLUDED_
|
|
||||||
#define _RESOURCE_LIMITS_INCLUDED_
|
|
||||||
|
|
||||||
struct TLimits {
|
|
||||||
bool nonInductiveForLoops;
|
|
||||||
bool whileLoops;
|
|
||||||
bool doWhileLoops;
|
|
||||||
bool generalUniformIndexing;
|
|
||||||
bool generalAttributeMatrixVectorIndexing;
|
|
||||||
bool generalVaryingIndexing;
|
|
||||||
bool generalSamplerIndexing;
|
|
||||||
bool generalVariableIndexing;
|
|
||||||
bool generalConstantMatrixVectorIndexing;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct TBuiltInResource {
|
|
||||||
int maxLights;
|
|
||||||
int maxClipPlanes;
|
|
||||||
int maxTextureUnits;
|
|
||||||
int maxTextureCoords;
|
|
||||||
int maxVertexAttribs;
|
|
||||||
int maxVertexUniformComponents;
|
|
||||||
int maxVaryingFloats;
|
|
||||||
int maxVertexTextureImageUnits;
|
|
||||||
int maxCombinedTextureImageUnits;
|
|
||||||
int maxTextureImageUnits;
|
|
||||||
int maxFragmentUniformComponents;
|
|
||||||
int maxDrawBuffers;
|
|
||||||
int maxVertexUniformVectors;
|
|
||||||
int maxVaryingVectors;
|
|
||||||
int maxFragmentUniformVectors;
|
|
||||||
int maxVertexOutputVectors;
|
|
||||||
int maxFragmentInputVectors;
|
|
||||||
int minProgramTexelOffset;
|
|
||||||
int maxProgramTexelOffset;
|
|
||||||
int maxClipDistances;
|
|
||||||
int maxComputeWorkGroupCountX;
|
|
||||||
int maxComputeWorkGroupCountY;
|
|
||||||
int maxComputeWorkGroupCountZ;
|
|
||||||
int maxComputeWorkGroupSizeX;
|
|
||||||
int maxComputeWorkGroupSizeY;
|
|
||||||
int maxComputeWorkGroupSizeZ;
|
|
||||||
int maxComputeUniformComponents;
|
|
||||||
int maxComputeTextureImageUnits;
|
|
||||||
int maxComputeImageUniforms;
|
|
||||||
int maxComputeAtomicCounters;
|
|
||||||
int maxComputeAtomicCounterBuffers;
|
|
||||||
int maxVaryingComponents;
|
|
||||||
int maxVertexOutputComponents;
|
|
||||||
int maxGeometryInputComponents;
|
|
||||||
int maxGeometryOutputComponents;
|
|
||||||
int maxFragmentInputComponents;
|
|
||||||
int maxImageUnits;
|
|
||||||
int maxCombinedImageUnitsAndFragmentOutputs;
|
|
||||||
int maxCombinedShaderOutputResources;
|
|
||||||
int maxImageSamples;
|
|
||||||
int maxVertexImageUniforms;
|
|
||||||
int maxTessControlImageUniforms;
|
|
||||||
int maxTessEvaluationImageUniforms;
|
|
||||||
int maxGeometryImageUniforms;
|
|
||||||
int maxFragmentImageUniforms;
|
|
||||||
int maxCombinedImageUniforms;
|
|
||||||
int maxGeometryTextureImageUnits;
|
|
||||||
int maxGeometryOutputVertices;
|
|
||||||
int maxGeometryTotalOutputComponents;
|
|
||||||
int maxGeometryUniformComponents;
|
|
||||||
int maxGeometryVaryingComponents;
|
|
||||||
int maxTessControlInputComponents;
|
|
||||||
int maxTessControlOutputComponents;
|
|
||||||
int maxTessControlTextureImageUnits;
|
|
||||||
int maxTessControlUniformComponents;
|
|
||||||
int maxTessControlTotalOutputComponents;
|
|
||||||
int maxTessEvaluationInputComponents;
|
|
||||||
int maxTessEvaluationOutputComponents;
|
|
||||||
int maxTessEvaluationTextureImageUnits;
|
|
||||||
int maxTessEvaluationUniformComponents;
|
|
||||||
int maxTessPatchComponents;
|
|
||||||
int maxPatchVertices;
|
|
||||||
int maxTessGenLevel;
|
|
||||||
int maxViewports;
|
|
||||||
int maxVertexAtomicCounters;
|
|
||||||
int maxTessControlAtomicCounters;
|
|
||||||
int maxTessEvaluationAtomicCounters;
|
|
||||||
int maxGeometryAtomicCounters;
|
|
||||||
int maxFragmentAtomicCounters;
|
|
||||||
int maxCombinedAtomicCounters;
|
|
||||||
int maxAtomicCounterBindings;
|
|
||||||
int maxVertexAtomicCounterBuffers;
|
|
||||||
int maxTessControlAtomicCounterBuffers;
|
|
||||||
int maxTessEvaluationAtomicCounterBuffers;
|
|
||||||
int maxGeometryAtomicCounterBuffers;
|
|
||||||
int maxFragmentAtomicCounterBuffers;
|
|
||||||
int maxCombinedAtomicCounterBuffers;
|
|
||||||
int maxAtomicCounterBufferSize;
|
|
||||||
int maxTransformFeedbackBuffers;
|
|
||||||
int maxTransformFeedbackInterleavedComponents;
|
|
||||||
int maxCullDistances;
|
|
||||||
int maxCombinedClipAndCullDistances;
|
|
||||||
int maxSamples;
|
|
||||||
|
|
||||||
TLimits limits;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // _RESOURCE_LIMITS_INCLUDED_
|
|
|
@ -1,176 +0,0 @@
|
||||||
//
|
|
||||||
// Copyright (C) 2002-2005 3Dlabs Inc. Ltd.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions
|
|
||||||
// are met:
|
|
||||||
//
|
|
||||||
// Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following
|
|
||||||
// disclaimer in the documentation and/or other materials provided
|
|
||||||
// with the distribution.
|
|
||||||
//
|
|
||||||
// Neither the name of 3Dlabs Inc. Ltd. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef _SHHANDLE_INCLUDED_
|
|
||||||
#define _SHHANDLE_INCLUDED_
|
|
||||||
|
|
||||||
//
|
|
||||||
// Machine independent part of the compiler private objects
|
|
||||||
// sent as ShHandle to the driver.
|
|
||||||
//
|
|
||||||
// This should not be included by driver code.
|
|
||||||
//
|
|
||||||
|
|
||||||
#define SH_EXPORTING
|
|
||||||
#include "../Public/ShaderLang.h"
|
|
||||||
#include "../MachineIndependent/Versions.h"
|
|
||||||
#include "InfoSink.h"
|
|
||||||
|
|
||||||
class TCompiler;
|
|
||||||
class TLinker;
|
|
||||||
class TUniformMap;
|
|
||||||
|
|
||||||
//
|
|
||||||
// The base class used to back handles returned to the driver.
|
|
||||||
//
|
|
||||||
class TShHandleBase {
|
|
||||||
public:
|
|
||||||
TShHandleBase() { pool = new glslang::TPoolAllocator; }
|
|
||||||
virtual ~TShHandleBase() { delete pool; }
|
|
||||||
virtual TCompiler* getAsCompiler() { return 0; }
|
|
||||||
virtual TLinker* getAsLinker() { return 0; }
|
|
||||||
virtual TUniformMap* getAsUniformMap() { return 0; }
|
|
||||||
virtual glslang::TPoolAllocator* getPool() const { return pool; }
|
|
||||||
private:
|
|
||||||
glslang::TPoolAllocator* pool;
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// The base class for the machine dependent linker to derive from
|
|
||||||
// for managing where uniforms live.
|
|
||||||
//
|
|
||||||
class TUniformMap : public TShHandleBase {
|
|
||||||
public:
|
|
||||||
TUniformMap() { }
|
|
||||||
virtual ~TUniformMap() { }
|
|
||||||
virtual TUniformMap* getAsUniformMap() { return this; }
|
|
||||||
virtual int getLocation(const char* name) = 0;
|
|
||||||
virtual TInfoSink& getInfoSink() { return infoSink; }
|
|
||||||
TInfoSink infoSink;
|
|
||||||
};
|
|
||||||
|
|
||||||
class TIntermNode;
|
|
||||||
|
|
||||||
//
|
|
||||||
// The base class for the machine dependent compiler to derive from
|
|
||||||
// for managing object code from the compile.
|
|
||||||
//
|
|
||||||
class TCompiler : public TShHandleBase {
|
|
||||||
public:
|
|
||||||
TCompiler(EShLanguage l, TInfoSink& sink) : infoSink(sink) , language(l), haveValidObjectCode(false) { }
|
|
||||||
virtual ~TCompiler() { }
|
|
||||||
EShLanguage getLanguage() { return language; }
|
|
||||||
virtual TInfoSink& getInfoSink() { return infoSink; }
|
|
||||||
|
|
||||||
virtual bool compile(TIntermNode* root, int version = 0, EProfile profile = ENoProfile) = 0;
|
|
||||||
|
|
||||||
virtual TCompiler* getAsCompiler() { return this; }
|
|
||||||
virtual bool linkable() { return haveValidObjectCode; }
|
|
||||||
|
|
||||||
TInfoSink& infoSink;
|
|
||||||
protected:
|
|
||||||
TCompiler& operator=(TCompiler&);
|
|
||||||
|
|
||||||
EShLanguage language;
|
|
||||||
bool haveValidObjectCode;
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// Link operations are based on a list of compile results...
|
|
||||||
//
|
|
||||||
typedef glslang::TVector<TCompiler*> TCompilerList;
|
|
||||||
typedef glslang::TVector<TShHandleBase*> THandleList;
|
|
||||||
|
|
||||||
//
|
|
||||||
// The base class for the machine dependent linker to derive from
|
|
||||||
// to manage the resulting executable.
|
|
||||||
//
|
|
||||||
|
|
||||||
class TLinker : public TShHandleBase {
|
|
||||||
public:
|
|
||||||
TLinker(EShExecutable e, TInfoSink& iSink) :
|
|
||||||
infoSink(iSink),
|
|
||||||
executable(e),
|
|
||||||
haveReturnableObjectCode(false),
|
|
||||||
appAttributeBindings(0),
|
|
||||||
fixedAttributeBindings(0),
|
|
||||||
excludedAttributes(0),
|
|
||||||
excludedCount(0),
|
|
||||||
uniformBindings(0) { }
|
|
||||||
virtual TLinker* getAsLinker() { return this; }
|
|
||||||
virtual ~TLinker() { }
|
|
||||||
virtual bool link(TCompilerList&, TUniformMap*) = 0;
|
|
||||||
virtual bool link(THandleList&) { return false; }
|
|
||||||
virtual void setAppAttributeBindings(const ShBindingTable* t) { appAttributeBindings = t; }
|
|
||||||
virtual void setFixedAttributeBindings(const ShBindingTable* t) { fixedAttributeBindings = t; }
|
|
||||||
virtual void getAttributeBindings(ShBindingTable const **t) const = 0;
|
|
||||||
virtual void setExcludedAttributes(const int* attributes, int count) { excludedAttributes = attributes; excludedCount = count; }
|
|
||||||
virtual ShBindingTable* getUniformBindings() const { return uniformBindings; }
|
|
||||||
virtual const void* getObjectCode() const { return 0; } // a real compiler would be returning object code here
|
|
||||||
virtual TInfoSink& getInfoSink() { return infoSink; }
|
|
||||||
TInfoSink& infoSink;
|
|
||||||
protected:
|
|
||||||
TLinker& operator=(TLinker&);
|
|
||||||
EShExecutable executable;
|
|
||||||
bool haveReturnableObjectCode; // true when objectCode is acceptable to send to driver
|
|
||||||
|
|
||||||
const ShBindingTable* appAttributeBindings;
|
|
||||||
const ShBindingTable* fixedAttributeBindings;
|
|
||||||
const int* excludedAttributes;
|
|
||||||
int excludedCount;
|
|
||||||
ShBindingTable* uniformBindings; // created by the linker
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// This is the interface between the machine independent code
|
|
||||||
// and the machine dependent code.
|
|
||||||
//
|
|
||||||
// The machine dependent code should derive from the classes
|
|
||||||
// above. Then Construct*() and Delete*() will create and
|
|
||||||
// destroy the machine dependent objects, which contain the
|
|
||||||
// above machine independent information.
|
|
||||||
//
|
|
||||||
TCompiler* ConstructCompiler(EShLanguage, int);
|
|
||||||
|
|
||||||
TShHandleBase* ConstructLinker(EShExecutable, int);
|
|
||||||
TShHandleBase* ConstructBindings();
|
|
||||||
void DeleteLinker(TShHandleBase*);
|
|
||||||
void DeleteBindingList(TShHandleBase* bindingList);
|
|
||||||
|
|
||||||
TUniformMap* ConstructUniformMap();
|
|
||||||
void DeleteCompiler(TCompiler*);
|
|
||||||
|
|
||||||
void DeleteUniformMap(TUniformMap*);
|
|
||||||
|
|
||||||
#endif // _SHHANDLE_INCLUDED_
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,329 +0,0 @@
|
||||||
//
|
|
||||||
// Copyright (C) 2002-2005 3Dlabs Inc. Ltd.
|
|
||||||
// Copyright (C) 2012-2013 LunarG, Inc.
|
|
||||||
//
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions
|
|
||||||
// are met:
|
|
||||||
//
|
|
||||||
// Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following
|
|
||||||
// disclaimer in the documentation and/or other materials provided
|
|
||||||
// with the distribution.
|
|
||||||
//
|
|
||||||
// Neither the name of 3Dlabs Inc. Ltd. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
//
|
|
||||||
|
|
||||||
//
|
|
||||||
// Implement types for tracking GLSL arrays, arrays of arrays, etc.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef _ARRAYS_INCLUDED
|
|
||||||
#define _ARRAYS_INCLUDED
|
|
||||||
|
|
||||||
namespace glslang {
|
|
||||||
|
|
||||||
// This is used to mean there is no size yet (unsized), it is waiting to get a size from somewhere else.
|
|
||||||
const int UnsizedArraySize = 0;
|
|
||||||
|
|
||||||
class TIntermTyped;
|
|
||||||
extern bool SameSpecializationConstants(TIntermTyped*, TIntermTyped*);
|
|
||||||
|
|
||||||
// Specialization constants need both a nominal size and a node that defines
|
|
||||||
// the specialization constant being used. Array types are the same when their
|
|
||||||
// size and specialization constant nodes are the same.
|
|
||||||
struct TArraySize {
|
|
||||||
unsigned int size;
|
|
||||||
TIntermTyped* node; // nullptr means no specialization constant node
|
|
||||||
bool operator==(const TArraySize& rhs) const
|
|
||||||
{
|
|
||||||
if (size != rhs.size)
|
|
||||||
return false;
|
|
||||||
if (node == nullptr || rhs.node == nullptr)
|
|
||||||
return node == rhs.node;
|
|
||||||
|
|
||||||
return SameSpecializationConstants(node, rhs.node);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// TSmallArrayVector is used as the container for the set of sizes in TArraySizes.
|
|
||||||
// It has generic-container semantics, while TArraySizes has array-of-array semantics.
|
|
||||||
// That is, TSmallArrayVector should be more focused on mechanism and TArraySizes on policy.
|
|
||||||
//
|
|
||||||
struct TSmallArrayVector {
|
|
||||||
//
|
|
||||||
// TODO: memory: TSmallArrayVector is intended to be smaller.
|
|
||||||
// Almost all arrays could be handled by two sizes each fitting
|
|
||||||
// in 16 bits, needing a real vector only in the cases where there
|
|
||||||
// are more than 3 sizes or a size needing more than 16 bits.
|
|
||||||
//
|
|
||||||
POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())
|
|
||||||
|
|
||||||
TSmallArrayVector() : sizes(nullptr) { }
|
|
||||||
virtual ~TSmallArrayVector() { dealloc(); }
|
|
||||||
|
|
||||||
// For breaking into two non-shared copies, independently modifiable.
|
|
||||||
TSmallArrayVector& operator=(const TSmallArrayVector& from)
|
|
||||||
{
|
|
||||||
if (from.sizes == nullptr)
|
|
||||||
sizes = nullptr;
|
|
||||||
else {
|
|
||||||
alloc();
|
|
||||||
*sizes = *from.sizes;
|
|
||||||
}
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
int size() const
|
|
||||||
{
|
|
||||||
if (sizes == nullptr)
|
|
||||||
return 0;
|
|
||||||
return (int)sizes->size();
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int frontSize() const
|
|
||||||
{
|
|
||||||
assert(sizes != nullptr && sizes->size() > 0);
|
|
||||||
return sizes->front().size;
|
|
||||||
}
|
|
||||||
|
|
||||||
TIntermTyped* frontNode() const
|
|
||||||
{
|
|
||||||
assert(sizes != nullptr && sizes->size() > 0);
|
|
||||||
return sizes->front().node;
|
|
||||||
}
|
|
||||||
|
|
||||||
void changeFront(unsigned int s)
|
|
||||||
{
|
|
||||||
assert(sizes != nullptr);
|
|
||||||
// this should only happen for implicitly sized arrays, not specialization constants
|
|
||||||
assert(sizes->front().node == nullptr);
|
|
||||||
sizes->front().size = s;
|
|
||||||
}
|
|
||||||
|
|
||||||
void push_back(unsigned int e, TIntermTyped* n)
|
|
||||||
{
|
|
||||||
alloc();
|
|
||||||
TArraySize pair = { e, n };
|
|
||||||
sizes->push_back(pair);
|
|
||||||
}
|
|
||||||
|
|
||||||
void push_front(const TSmallArrayVector& newDims)
|
|
||||||
{
|
|
||||||
alloc();
|
|
||||||
sizes->insert(sizes->begin(), newDims.sizes->begin(), newDims.sizes->end());
|
|
||||||
}
|
|
||||||
|
|
||||||
void pop_front()
|
|
||||||
{
|
|
||||||
assert(sizes != nullptr && sizes->size() > 0);
|
|
||||||
if (sizes->size() == 1)
|
|
||||||
dealloc();
|
|
||||||
else
|
|
||||||
sizes->erase(sizes->begin());
|
|
||||||
}
|
|
||||||
|
|
||||||
// 'this' should currently not be holding anything, and copyNonFront
|
|
||||||
// will make it hold a copy of all but the first element of rhs.
|
|
||||||
// (This would be useful for making a type that is dereferenced by
|
|
||||||
// one dimension.)
|
|
||||||
void copyNonFront(const TSmallArrayVector& rhs)
|
|
||||||
{
|
|
||||||
assert(sizes == nullptr);
|
|
||||||
if (rhs.size() > 1) {
|
|
||||||
alloc();
|
|
||||||
sizes->insert(sizes->begin(), rhs.sizes->begin() + 1, rhs.sizes->end());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int getDimSize(int i) const
|
|
||||||
{
|
|
||||||
assert(sizes != nullptr && (int)sizes->size() > i);
|
|
||||||
return (*sizes)[i].size;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setDimSize(int i, unsigned int size) const
|
|
||||||
{
|
|
||||||
assert(sizes != nullptr && (int)sizes->size() > i);
|
|
||||||
assert((*sizes)[i].node == nullptr);
|
|
||||||
(*sizes)[i].size = size;
|
|
||||||
}
|
|
||||||
|
|
||||||
TIntermTyped* getDimNode(int i) const
|
|
||||||
{
|
|
||||||
assert(sizes != nullptr && (int)sizes->size() > i);
|
|
||||||
return (*sizes)[i].node;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator==(const TSmallArrayVector& rhs) const
|
|
||||||
{
|
|
||||||
if (sizes == nullptr && rhs.sizes == nullptr)
|
|
||||||
return true;
|
|
||||||
if (sizes == nullptr || rhs.sizes == nullptr)
|
|
||||||
return false;
|
|
||||||
return *sizes == *rhs.sizes;
|
|
||||||
}
|
|
||||||
bool operator!=(const TSmallArrayVector& rhs) const { return ! operator==(rhs); }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
TSmallArrayVector(const TSmallArrayVector&);
|
|
||||||
|
|
||||||
void alloc()
|
|
||||||
{
|
|
||||||
if (sizes == nullptr)
|
|
||||||
sizes = new TVector<TArraySize>;
|
|
||||||
}
|
|
||||||
void dealloc()
|
|
||||||
{
|
|
||||||
delete sizes;
|
|
||||||
sizes = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
TVector<TArraySize>* sizes; // will either hold such a pointer, or in the future, hold the two array sizes
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// Represent an array, or array of arrays, to arbitrary depth. This is not
|
|
||||||
// done through a hierarchy of types in a type tree, rather all contiguous arrayness
|
|
||||||
// in the type hierarchy is localized into this single cumulative object.
|
|
||||||
//
|
|
||||||
// The arrayness in TTtype is a pointer, so that it can be non-allocated and zero
|
|
||||||
// for the vast majority of types that are non-array types.
|
|
||||||
//
|
|
||||||
// Order Policy: these are all identical:
|
|
||||||
// - left to right order within a contiguous set of ...[..][..][..]... in the source language
|
|
||||||
// - index order 0, 1, 2, ... within the 'sizes' member below
|
|
||||||
// - outer-most to inner-most
|
|
||||||
//
|
|
||||||
struct TArraySizes {
|
|
||||||
POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())
|
|
||||||
|
|
||||||
TArraySizes() : implicitArraySize(1) { }
|
|
||||||
|
|
||||||
// For breaking into two non-shared copies, independently modifiable.
|
|
||||||
TArraySizes& operator=(const TArraySizes& from)
|
|
||||||
{
|
|
||||||
implicitArraySize = from.implicitArraySize;
|
|
||||||
sizes = from.sizes;
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
// translate from array-of-array semantics to container semantics
|
|
||||||
int getNumDims() const { return sizes.size(); }
|
|
||||||
int getDimSize(int dim) const { return sizes.getDimSize(dim); }
|
|
||||||
TIntermTyped* getDimNode(int dim) const { return sizes.getDimNode(dim); }
|
|
||||||
void setDimSize(int dim, int size) { sizes.setDimSize(dim, size); }
|
|
||||||
int getOuterSize() const { return sizes.frontSize(); }
|
|
||||||
TIntermTyped* getOuterNode() const { return sizes.frontNode(); }
|
|
||||||
int getCumulativeSize() const
|
|
||||||
{
|
|
||||||
int size = 1;
|
|
||||||
for (int d = 0; d < sizes.size(); ++d) {
|
|
||||||
// this only makes sense in paths that have a known array size
|
|
||||||
assert(sizes.getDimSize(d) != UnsizedArraySize);
|
|
||||||
size *= sizes.getDimSize(d);
|
|
||||||
}
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
void addInnerSize() { addInnerSize((unsigned)UnsizedArraySize); }
|
|
||||||
void addInnerSize(int s) { addInnerSize((unsigned)s, nullptr); }
|
|
||||||
void addInnerSize(int s, TIntermTyped* n) { sizes.push_back((unsigned)s, n); }
|
|
||||||
void addInnerSize(TArraySize pair) { sizes.push_back(pair.size, pair.node); }
|
|
||||||
void changeOuterSize(int s) { sizes.changeFront((unsigned)s); }
|
|
||||||
int getImplicitSize() const { return (int)implicitArraySize; }
|
|
||||||
void setImplicitSize(int s) { implicitArraySize = s; }
|
|
||||||
bool isInnerImplicit() const
|
|
||||||
{
|
|
||||||
for (int d = 1; d < sizes.size(); ++d) {
|
|
||||||
if (sizes.getDimSize(d) == (unsigned)UnsizedArraySize)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
bool clearInnerImplicit()
|
|
||||||
{
|
|
||||||
for (int d = 1; d < sizes.size(); ++d) {
|
|
||||||
if (sizes.getDimSize(d) == (unsigned)UnsizedArraySize)
|
|
||||||
setDimSize(d, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
bool isInnerSpecialization() const
|
|
||||||
{
|
|
||||||
for (int d = 1; d < sizes.size(); ++d) {
|
|
||||||
if (sizes.getDimNode(d) != nullptr)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
bool isOuterSpecialization()
|
|
||||||
{
|
|
||||||
return sizes.getDimNode(0) != nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isImplicit() const { return getOuterSize() == UnsizedArraySize || isInnerImplicit(); }
|
|
||||||
void addOuterSizes(const TArraySizes& s) { sizes.push_front(s.sizes); }
|
|
||||||
void dereference() { sizes.pop_front(); }
|
|
||||||
void copyDereferenced(const TArraySizes& rhs)
|
|
||||||
{
|
|
||||||
assert(sizes.size() == 0);
|
|
||||||
if (rhs.sizes.size() > 1)
|
|
||||||
sizes.copyNonFront(rhs.sizes);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool sameInnerArrayness(const TArraySizes& rhs) const
|
|
||||||
{
|
|
||||||
if (sizes.size() != rhs.sizes.size())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
for (int d = 1; d < sizes.size(); ++d) {
|
|
||||||
if (sizes.getDimSize(d) != rhs.sizes.getDimSize(d) ||
|
|
||||||
sizes.getDimNode(d) != rhs.sizes.getDimNode(d))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator==(const TArraySizes& rhs) { return sizes == rhs.sizes; }
|
|
||||||
bool operator!=(const TArraySizes& rhs) { return sizes != rhs.sizes; }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
TSmallArrayVector sizes;
|
|
||||||
|
|
||||||
TArraySizes(const TArraySizes&);
|
|
||||||
|
|
||||||
// for tracking maximum referenced index, before an explicit size is given
|
|
||||||
// applies only to the outer-most dimension
|
|
||||||
int implicitArraySize;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // end namespace glslang
|
|
||||||
|
|
||||||
#endif // _ARRAYS_INCLUDED_
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,6 +0,0 @@
|
||||||
// This header is generated by the make-revision script.
|
|
||||||
// For the version, it uses the latest git tag followed by the number of commits.
|
|
||||||
// For the date, it uses the current date (when then script is run).
|
|
||||||
|
|
||||||
#define GLSLANG_REVISION "Overload400-PrecQual.2000"
|
|
||||||
#define GLSLANG_DATE "12-Apr-2017"
|
|
|
@ -1,13 +0,0 @@
|
||||||
// The file revision.h should be updated to the latest version, somehow, on
|
|
||||||
// check-in, if glslang has changed.
|
|
||||||
//
|
|
||||||
// revision.template is the source for revision.h when using SubWCRev as the
|
|
||||||
// method of updating revision.h. You don't have to do it this way, the
|
|
||||||
// requirement is only that revision.h gets updated.
|
|
||||||
//
|
|
||||||
// revision.h is under source control so that not all consumers of glslang
|
|
||||||
// source have to figure out how to create revision.h just to get a build
|
|
||||||
// going. However, if it is not updated, it can be a version behind.
|
|
||||||
|
|
||||||
#define GLSLANG_REVISION "$WCREV$"
|
|
||||||
#define GLSLANG_DATE "$WCDATE$"
|
|
|
@ -1,68 +0,0 @@
|
||||||
//
|
|
||||||
// Copyright (C) 2016 Google, Inc.
|
|
||||||
//
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions
|
|
||||||
// are met:
|
|
||||||
//
|
|
||||||
// Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following
|
|
||||||
// disclaimer in the documentation and/or other materials provided
|
|
||||||
// with the distribution.
|
|
||||||
//
|
|
||||||
// Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#include "Logger.h"
|
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
#include <iterator>
|
|
||||||
#include <sstream>
|
|
||||||
|
|
||||||
namespace spv {
|
|
||||||
|
|
||||||
void SpvBuildLogger::tbdFunctionality(const std::string& f)
|
|
||||||
{
|
|
||||||
if (std::find(std::begin(tbdFeatures), std::end(tbdFeatures), f) == std::end(tbdFeatures))
|
|
||||||
tbdFeatures.push_back(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SpvBuildLogger::missingFunctionality(const std::string& f)
|
|
||||||
{
|
|
||||||
if (std::find(std::begin(missingFeatures), std::end(missingFeatures), f) == std::end(missingFeatures))
|
|
||||||
missingFeatures.push_back(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string SpvBuildLogger::getAllMessages() const {
|
|
||||||
std::ostringstream messages;
|
|
||||||
for (auto it = tbdFeatures.cbegin(); it != tbdFeatures.cend(); ++it)
|
|
||||||
messages << "TBD functionality: " << *it << "\n";
|
|
||||||
for (auto it = missingFeatures.cbegin(); it != missingFeatures.cend(); ++it)
|
|
||||||
messages << "Missing functionality: " << *it << "\n";
|
|
||||||
for (auto it = warnings.cbegin(); it != warnings.cend(); ++it)
|
|
||||||
messages << "warning: " << *it << "\n";
|
|
||||||
for (auto it = errors.cbegin(); it != errors.cend(); ++it)
|
|
||||||
messages << "error: " << *it << "\n";
|
|
||||||
return messages.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
} // end spv namespace
|
|
|
@ -1,74 +0,0 @@
|
||||||
//
|
|
||||||
// Copyright (C) 2016 Google, Inc.
|
|
||||||
//
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions
|
|
||||||
// are met:
|
|
||||||
//
|
|
||||||
// Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following
|
|
||||||
// disclaimer in the documentation and/or other materials provided
|
|
||||||
// with the distribution.
|
|
||||||
//
|
|
||||||
// Neither the name of Google Inc. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
#ifndef GLSLANG_SPIRV_LOGGER_H
|
|
||||||
#define GLSLANG_SPIRV_LOGGER_H
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace spv {
|
|
||||||
|
|
||||||
// A class for holding all SPIR-V build status messages, including
|
|
||||||
// missing/TBD functionalities, warnings, and errors.
|
|
||||||
class SpvBuildLogger {
|
|
||||||
public:
|
|
||||||
SpvBuildLogger() {}
|
|
||||||
|
|
||||||
// Registers a TBD functionality.
|
|
||||||
void tbdFunctionality(const std::string& f);
|
|
||||||
// Registers a missing functionality.
|
|
||||||
void missingFunctionality(const std::string& f);
|
|
||||||
|
|
||||||
// Logs a warning.
|
|
||||||
void warning(const std::string& w) { warnings.push_back(w); }
|
|
||||||
// Logs an error.
|
|
||||||
void error(const std::string& e) { errors.push_back(e); }
|
|
||||||
|
|
||||||
// Returns all messages accumulated in the order of:
|
|
||||||
// TBD functionalities, missing functionalities, warnings, errors.
|
|
||||||
std::string getAllMessages() const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
SpvBuildLogger(const SpvBuildLogger&);
|
|
||||||
|
|
||||||
std::vector<std::string> tbdFeatures;
|
|
||||||
std::vector<std::string> missingFeatures;
|
|
||||||
std::vector<std::string> warnings;
|
|
||||||
std::vector<std::string> errors;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // end spv namespace
|
|
||||||
|
|
||||||
#endif // GLSLANG_SPIRV_LOGGER_H
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,304 +0,0 @@
|
||||||
//
|
|
||||||
// Copyright (C) 2015 LunarG, Inc.
|
|
||||||
//
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions
|
|
||||||
// are met:
|
|
||||||
//
|
|
||||||
// Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following
|
|
||||||
// disclaimer in the documentation and/or other materials provided
|
|
||||||
// with the distribution.
|
|
||||||
//
|
|
||||||
// Neither the name of 3Dlabs Inc. Ltd. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef SPIRVREMAPPER_H
|
|
||||||
#define SPIRVREMAPPER_H
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
#include <cstdlib>
|
|
||||||
#include <exception>
|
|
||||||
|
|
||||||
namespace spv {
|
|
||||||
|
|
||||||
// MSVC defines __cplusplus as an older value, even when it supports almost all of 11.
|
|
||||||
// We handle that here by making our own symbol.
|
|
||||||
#if __cplusplus >= 201103L || _MSC_VER >= 1700
|
|
||||||
# define use_cpp11 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
class spirvbin_base_t
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
enum Options {
|
|
||||||
NONE = 0,
|
|
||||||
STRIP = (1<<0),
|
|
||||||
MAP_TYPES = (1<<1),
|
|
||||||
MAP_NAMES = (1<<2),
|
|
||||||
MAP_FUNCS = (1<<3),
|
|
||||||
DCE_FUNCS = (1<<4),
|
|
||||||
DCE_VARS = (1<<5),
|
|
||||||
DCE_TYPES = (1<<6),
|
|
||||||
OPT_LOADSTORE = (1<<7),
|
|
||||||
OPT_FWD_LS = (1<<8), // EXPERIMENTAL: PRODUCES INVALID SCHEMA-0 SPIRV
|
|
||||||
MAP_ALL = (MAP_TYPES | MAP_NAMES | MAP_FUNCS),
|
|
||||||
DCE_ALL = (DCE_FUNCS | DCE_VARS | DCE_TYPES),
|
|
||||||
OPT_ALL = (OPT_LOADSTORE),
|
|
||||||
|
|
||||||
ALL_BUT_STRIP = (MAP_ALL | DCE_ALL | OPT_ALL),
|
|
||||||
DO_EVERYTHING = (STRIP | ALL_BUT_STRIP)
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace SPV
|
|
||||||
|
|
||||||
#if !defined (use_cpp11)
|
|
||||||
#include <cstdio>
|
|
||||||
#include <cstdint>
|
|
||||||
|
|
||||||
namespace spv {
|
|
||||||
class spirvbin_t : public spirvbin_base_t
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
spirvbin_t(int /*verbose = 0*/) { }
|
|
||||||
|
|
||||||
void remap(std::vector<std::uint32_t>& /*spv*/, unsigned int /*opts = 0*/)
|
|
||||||
{
|
|
||||||
printf("Tool not compiled for C++11, which is required for SPIR-V remapping.\n");
|
|
||||||
exit(5);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace SPV
|
|
||||||
|
|
||||||
#else // defined (use_cpp11)
|
|
||||||
|
|
||||||
#include <functional>
|
|
||||||
#include <cstdint>
|
|
||||||
#include <unordered_map>
|
|
||||||
#include <unordered_set>
|
|
||||||
#include <map>
|
|
||||||
#include <set>
|
|
||||||
#include <cassert>
|
|
||||||
|
|
||||||
#include "spirv.hpp"
|
|
||||||
#include "spvIR.h"
|
|
||||||
|
|
||||||
namespace spv {
|
|
||||||
|
|
||||||
// class to hold SPIR-V binary data for remapping, DCE, and debug stripping
|
|
||||||
class spirvbin_t : public spirvbin_base_t
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
spirvbin_t(int verbose = 0) : entryPoint(spv::NoResult), largestNewId(0), verbose(verbose), errorLatch(false)
|
|
||||||
{ }
|
|
||||||
|
|
||||||
virtual ~spirvbin_t() { }
|
|
||||||
|
|
||||||
// remap on an existing binary in memory
|
|
||||||
void remap(std::vector<std::uint32_t>& spv, std::uint32_t opts = DO_EVERYTHING);
|
|
||||||
|
|
||||||
// Type for error/log handler functions
|
|
||||||
typedef std::function<void(const std::string&)> errorfn_t;
|
|
||||||
typedef std::function<void(const std::string&)> logfn_t;
|
|
||||||
|
|
||||||
// Register error/log handling functions (can be lambda fn / functor / etc)
|
|
||||||
static void registerErrorHandler(errorfn_t handler) { errorHandler = handler; }
|
|
||||||
static void registerLogHandler(logfn_t handler) { logHandler = handler; }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
// This can be overridden to provide other message behavior if needed
|
|
||||||
virtual void msg(int minVerbosity, int indent, const std::string& txt) const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Local to global, or global to local ID map
|
|
||||||
typedef std::unordered_map<spv::Id, spv::Id> idmap_t;
|
|
||||||
typedef std::unordered_set<spv::Id> idset_t;
|
|
||||||
typedef std::unordered_map<spv::Id, int> blockmap_t;
|
|
||||||
|
|
||||||
void remap(std::uint32_t opts = DO_EVERYTHING);
|
|
||||||
|
|
||||||
// Map of names to IDs
|
|
||||||
typedef std::unordered_map<std::string, spv::Id> namemap_t;
|
|
||||||
|
|
||||||
typedef std::uint32_t spirword_t;
|
|
||||||
|
|
||||||
typedef std::pair<unsigned, unsigned> range_t;
|
|
||||||
typedef std::function<void(spv::Id&)> idfn_t;
|
|
||||||
typedef std::function<bool(spv::Op, unsigned start)> instfn_t;
|
|
||||||
|
|
||||||
// Special Values for ID map:
|
|
||||||
static const spv::Id unmapped; // unchanged from default value
|
|
||||||
static const spv::Id unused; // unused ID
|
|
||||||
static const int header_size; // SPIR header = 5 words
|
|
||||||
|
|
||||||
class id_iterator_t;
|
|
||||||
|
|
||||||
// For mapping type entries between different shaders
|
|
||||||
typedef std::vector<spirword_t> typeentry_t;
|
|
||||||
typedef std::map<spv::Id, typeentry_t> globaltypes_t;
|
|
||||||
|
|
||||||
// A set that preserves position order, and a reverse map
|
|
||||||
typedef std::set<int> posmap_t;
|
|
||||||
typedef std::unordered_map<spv::Id, int> posmap_rev_t;
|
|
||||||
|
|
||||||
// Maps and ID to the size of its base type, if known.
|
|
||||||
typedef std::unordered_map<spv::Id, unsigned> typesize_map_t;
|
|
||||||
|
|
||||||
// handle error
|
|
||||||
void error(const std::string& txt) const { errorLatch = true; errorHandler(txt); }
|
|
||||||
|
|
||||||
bool isConstOp(spv::Op opCode) const;
|
|
||||||
bool isTypeOp(spv::Op opCode) const;
|
|
||||||
bool isStripOp(spv::Op opCode) const;
|
|
||||||
bool isFlowCtrl(spv::Op opCode) const;
|
|
||||||
range_t literalRange(spv::Op opCode) const;
|
|
||||||
range_t typeRange(spv::Op opCode) const;
|
|
||||||
range_t constRange(spv::Op opCode) const;
|
|
||||||
unsigned typeSizeInWords(spv::Id id) const;
|
|
||||||
unsigned idTypeSizeInWords(spv::Id id) const;
|
|
||||||
|
|
||||||
spv::Id& asId(unsigned word) { return spv[word]; }
|
|
||||||
const spv::Id& asId(unsigned word) const { return spv[word]; }
|
|
||||||
spv::Op asOpCode(unsigned word) const { return opOpCode(spv[word]); }
|
|
||||||
std::uint32_t asOpCodeHash(unsigned word);
|
|
||||||
spv::Decoration asDecoration(unsigned word) const { return spv::Decoration(spv[word]); }
|
|
||||||
unsigned asWordCount(unsigned word) const { return opWordCount(spv[word]); }
|
|
||||||
spv::Id asTypeConstId(unsigned word) const { return asId(word + (isTypeOp(asOpCode(word)) ? 1 : 2)); }
|
|
||||||
unsigned idPos(spv::Id id) const;
|
|
||||||
|
|
||||||
static unsigned opWordCount(spirword_t data) { return data >> spv::WordCountShift; }
|
|
||||||
static spv::Op opOpCode(spirword_t data) { return spv::Op(data & spv::OpCodeMask); }
|
|
||||||
|
|
||||||
// Header access & set methods
|
|
||||||
spirword_t magic() const { return spv[0]; } // return magic number
|
|
||||||
spirword_t bound() const { return spv[3]; } // return Id bound from header
|
|
||||||
spirword_t bound(spirword_t b) { return spv[3] = b; };
|
|
||||||
spirword_t genmagic() const { return spv[2]; } // generator magic
|
|
||||||
spirword_t genmagic(spirword_t m) { return spv[2] = m; }
|
|
||||||
spirword_t schemaNum() const { return spv[4]; } // schema number from header
|
|
||||||
|
|
||||||
// Mapping fns: get
|
|
||||||
spv::Id localId(spv::Id id) const { return idMapL[id]; }
|
|
||||||
|
|
||||||
// Mapping fns: set
|
|
||||||
inline spv::Id localId(spv::Id id, spv::Id newId);
|
|
||||||
void countIds(spv::Id id);
|
|
||||||
|
|
||||||
// Return next unused new local ID.
|
|
||||||
// NOTE: boost::dynamic_bitset would be more efficient due to find_next(),
|
|
||||||
// which std::vector<bool> doens't have.
|
|
||||||
inline spv::Id nextUnusedId(spv::Id id);
|
|
||||||
|
|
||||||
void buildLocalMaps();
|
|
||||||
std::string literalString(unsigned word) const; // Return literal as a std::string
|
|
||||||
int literalStringWords(const std::string& str) const { return (int(str.size())+4)/4; }
|
|
||||||
|
|
||||||
bool isNewIdMapped(spv::Id newId) const { return isMapped(newId); }
|
|
||||||
bool isOldIdUnmapped(spv::Id oldId) const { return localId(oldId) == unmapped; }
|
|
||||||
bool isOldIdUnused(spv::Id oldId) const { return localId(oldId) == unused; }
|
|
||||||
bool isOldIdMapped(spv::Id oldId) const { return !isOldIdUnused(oldId) && !isOldIdUnmapped(oldId); }
|
|
||||||
bool isFunction(spv::Id oldId) const { return fnPos.find(oldId) != fnPos.end(); }
|
|
||||||
|
|
||||||
// bool matchType(const globaltypes_t& globalTypes, spv::Id lt, spv::Id gt) const;
|
|
||||||
// spv::Id findType(const globaltypes_t& globalTypes, spv::Id lt) const;
|
|
||||||
std::uint32_t hashType(unsigned typeStart) const;
|
|
||||||
|
|
||||||
spirvbin_t& process(instfn_t, idfn_t, unsigned begin = 0, unsigned end = 0);
|
|
||||||
int processInstruction(unsigned word, instfn_t, idfn_t);
|
|
||||||
|
|
||||||
void validate() const;
|
|
||||||
void mapTypeConst();
|
|
||||||
void mapFnBodies();
|
|
||||||
void optLoadStore();
|
|
||||||
void dceFuncs();
|
|
||||||
void dceVars();
|
|
||||||
void dceTypes();
|
|
||||||
void mapNames();
|
|
||||||
void foldIds(); // fold IDs to smallest space
|
|
||||||
void forwardLoadStores(); // load store forwarding (EXPERIMENTAL)
|
|
||||||
void offsetIds(); // create relative offset IDs
|
|
||||||
|
|
||||||
void applyMap(); // remap per local name map
|
|
||||||
void mapRemainder(); // map any IDs we haven't touched yet
|
|
||||||
void stripDebug(); // strip all debug info
|
|
||||||
void stripDeadRefs(); // strips debug info for now-dead references after DCE
|
|
||||||
void strip(); // remove debug symbols
|
|
||||||
|
|
||||||
std::vector<spirword_t> spv; // SPIR words
|
|
||||||
|
|
||||||
namemap_t nameMap; // ID names from OpName
|
|
||||||
|
|
||||||
// Since we want to also do binary ops, we can't use std::vector<bool>. we could use
|
|
||||||
// boost::dynamic_bitset, but we're trying to avoid a boost dependency.
|
|
||||||
typedef std::uint64_t bits_t;
|
|
||||||
std::vector<bits_t> mapped; // which new IDs have been mapped
|
|
||||||
static const int mBits = sizeof(bits_t) * 4;
|
|
||||||
|
|
||||||
bool isMapped(spv::Id id) const { return id < maxMappedId() && ((mapped[id/mBits] & (1LL<<(id%mBits))) != 0); }
|
|
||||||
void setMapped(spv::Id id) { resizeMapped(id); mapped[id/mBits] |= (1LL<<(id%mBits)); }
|
|
||||||
void resizeMapped(spv::Id id) { if (id >= maxMappedId()) mapped.resize(id/mBits+1, 0); }
|
|
||||||
size_t maxMappedId() const { return mapped.size() * mBits; }
|
|
||||||
|
|
||||||
// Add a strip range for a given instruction starting at 'start'
|
|
||||||
// Note: avoiding brace initializers to please older versions os MSVC.
|
|
||||||
void stripInst(unsigned start) { stripRange.push_back(range_t(start, start + asWordCount(start))); }
|
|
||||||
|
|
||||||
// Function start and end. use unordered_map because we'll have
|
|
||||||
// many fewer functions than IDs.
|
|
||||||
std::unordered_map<spv::Id, range_t> fnPos;
|
|
||||||
|
|
||||||
// Which functions are called, anywhere in the module, with a call count
|
|
||||||
std::unordered_map<spv::Id, int> fnCalls;
|
|
||||||
|
|
||||||
posmap_t typeConstPos; // word positions that define types & consts (ordered)
|
|
||||||
posmap_rev_t idPosR; // reverse map from IDs to positions
|
|
||||||
typesize_map_t idTypeSizeMap; // maps each ID to its type size, if known.
|
|
||||||
|
|
||||||
std::vector<spv::Id> idMapL; // ID {M}ap from {L}ocal to {G}lobal IDs
|
|
||||||
|
|
||||||
spv::Id entryPoint; // module entry point
|
|
||||||
spv::Id largestNewId; // biggest new ID we have mapped anything to
|
|
||||||
|
|
||||||
// Sections of the binary to strip, given as [begin,end)
|
|
||||||
std::vector<range_t> stripRange;
|
|
||||||
|
|
||||||
// processing options:
|
|
||||||
std::uint32_t options;
|
|
||||||
int verbose; // verbosity level
|
|
||||||
|
|
||||||
// Error latch: this is set if the error handler is ever executed. It would be better to
|
|
||||||
// use a try/catch block and throw, but that's not desired for certain environments, so
|
|
||||||
// this is the alternative.
|
|
||||||
mutable bool errorLatch;
|
|
||||||
|
|
||||||
static errorfn_t errorHandler;
|
|
||||||
static logfn_t logHandler;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace SPV
|
|
||||||
|
|
||||||
#endif // defined (use_cpp11)
|
|
||||||
#endif // SPIRVREMAPPER_H
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,641 +0,0 @@
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 LunarG, Inc.
|
|
||||||
// Copyright (C) 2015-2016 Google, Inc.
|
|
||||||
//
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions
|
|
||||||
// are met:
|
|
||||||
//
|
|
||||||
// Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following
|
|
||||||
// disclaimer in the documentation and/or other materials provided
|
|
||||||
// with the distribution.
|
|
||||||
//
|
|
||||||
// Neither the name of 3Dlabs Inc. Ltd. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
//
|
|
||||||
// "Builder" is an interface to fully build SPIR-V IR. Allocate one of
|
|
||||||
// these to build (a thread safe) internal SPIR-V representation (IR),
|
|
||||||
// and then dump it as a binary stream according to the SPIR-V specification.
|
|
||||||
//
|
|
||||||
// A Builder has a 1:1 relationship with a SPIR-V module.
|
|
||||||
//
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
#ifndef SpvBuilder_H
|
|
||||||
#define SpvBuilder_H
|
|
||||||
|
|
||||||
#include "Logger.h"
|
|
||||||
#include "spirv.hpp"
|
|
||||||
#include "spvIR.h"
|
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
#include <map>
|
|
||||||
#include <memory>
|
|
||||||
#include <set>
|
|
||||||
#include <sstream>
|
|
||||||
#include <stack>
|
|
||||||
|
|
||||||
namespace spv {
|
|
||||||
|
|
||||||
class Builder {
|
|
||||||
public:
|
|
||||||
Builder(unsigned int spvVersion, unsigned int userNumber, SpvBuildLogger* logger);
|
|
||||||
virtual ~Builder();
|
|
||||||
|
|
||||||
static const int maxMatrixSize = 4;
|
|
||||||
|
|
||||||
void setSource(spv::SourceLanguage lang, int version)
|
|
||||||
{
|
|
||||||
source = lang;
|
|
||||||
sourceVersion = version;
|
|
||||||
}
|
|
||||||
void setSourceFile(const std::string& file)
|
|
||||||
{
|
|
||||||
Instruction* fileString = new Instruction(getUniqueId(), NoType, OpString);
|
|
||||||
fileString->addStringOperand(file.c_str());
|
|
||||||
sourceFileStringId = fileString->getResultId();
|
|
||||||
strings.push_back(std::unique_ptr<Instruction>(fileString));
|
|
||||||
}
|
|
||||||
void setSourceText(const std::string& text) { sourceText = text; }
|
|
||||||
void addSourceExtension(const char* ext) { sourceExtensions.push_back(ext); }
|
|
||||||
void addModuleProcessed(const std::string& p) { moduleProcesses.push_back(p.c_str()); }
|
|
||||||
void setEmitOpLines() { emitOpLines = true; }
|
|
||||||
void addExtension(const char* ext) { extensions.insert(ext); }
|
|
||||||
Id import(const char*);
|
|
||||||
void setMemoryModel(spv::AddressingModel addr, spv::MemoryModel mem)
|
|
||||||
{
|
|
||||||
addressModel = addr;
|
|
||||||
memoryModel = mem;
|
|
||||||
}
|
|
||||||
|
|
||||||
void addCapability(spv::Capability cap) { capabilities.insert(cap); }
|
|
||||||
|
|
||||||
// To get a new <id> for anything needing a new one.
|
|
||||||
Id getUniqueId() { return ++uniqueId; }
|
|
||||||
|
|
||||||
// To get a set of new <id>s, e.g., for a set of function parameters
|
|
||||||
Id getUniqueIds(int numIds)
|
|
||||||
{
|
|
||||||
Id id = uniqueId + 1;
|
|
||||||
uniqueId += numIds;
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Log the current line, and if different than the last one,
|
|
||||||
// issue a new OpLine, using the current file name.
|
|
||||||
void setLine(int line);
|
|
||||||
// Low-level OpLine. See setLine() for a layered helper.
|
|
||||||
void addLine(Id fileName, int line, int column);
|
|
||||||
|
|
||||||
// For creating new types (will return old type if the requested one was already made).
|
|
||||||
Id makeVoidType();
|
|
||||||
Id makeBoolType();
|
|
||||||
Id makePointer(StorageClass, Id type);
|
|
||||||
Id makeIntegerType(int width, bool hasSign); // generic
|
|
||||||
Id makeIntType(int width) { return makeIntegerType(width, true); }
|
|
||||||
Id makeUintType(int width) { return makeIntegerType(width, false); }
|
|
||||||
Id makeFloatType(int width);
|
|
||||||
Id makeStructType(const std::vector<Id>& members, const char*);
|
|
||||||
Id makeStructResultType(Id type0, Id type1);
|
|
||||||
Id makeVectorType(Id component, int size);
|
|
||||||
Id makeMatrixType(Id component, int cols, int rows);
|
|
||||||
Id makeArrayType(Id element, Id sizeId, int stride); // 0 stride means no stride decoration
|
|
||||||
Id makeRuntimeArray(Id element);
|
|
||||||
Id makeFunctionType(Id returnType, const std::vector<Id>& paramTypes);
|
|
||||||
Id makeImageType(Id sampledType, Dim, bool depth, bool arrayed, bool ms, unsigned sampled, ImageFormat format);
|
|
||||||
Id makeSamplerType();
|
|
||||||
Id makeSampledImageType(Id imageType);
|
|
||||||
|
|
||||||
// For querying about types.
|
|
||||||
Id getTypeId(Id resultId) const { return module.getTypeId(resultId); }
|
|
||||||
Id getDerefTypeId(Id resultId) const;
|
|
||||||
Op getOpCode(Id id) const { return module.getInstruction(id)->getOpCode(); }
|
|
||||||
Op getTypeClass(Id typeId) const { return getOpCode(typeId); }
|
|
||||||
Op getMostBasicTypeClass(Id typeId) const;
|
|
||||||
int getNumComponents(Id resultId) const { return getNumTypeComponents(getTypeId(resultId)); }
|
|
||||||
int getNumTypeConstituents(Id typeId) const;
|
|
||||||
int getNumTypeComponents(Id typeId) const { return getNumTypeConstituents(typeId); }
|
|
||||||
Id getScalarTypeId(Id typeId) const;
|
|
||||||
Id getContainedTypeId(Id typeId) const;
|
|
||||||
Id getContainedTypeId(Id typeId, int) const;
|
|
||||||
StorageClass getTypeStorageClass(Id typeId) const { return module.getStorageClass(typeId); }
|
|
||||||
ImageFormat getImageTypeFormat(Id typeId) const { return (ImageFormat)module.getInstruction(typeId)->getImmediateOperand(6); }
|
|
||||||
|
|
||||||
bool isPointer(Id resultId) const { return isPointerType(getTypeId(resultId)); }
|
|
||||||
bool isScalar(Id resultId) const { return isScalarType(getTypeId(resultId)); }
|
|
||||||
bool isVector(Id resultId) const { return isVectorType(getTypeId(resultId)); }
|
|
||||||
bool isMatrix(Id resultId) const { return isMatrixType(getTypeId(resultId)); }
|
|
||||||
bool isAggregate(Id resultId) const { return isAggregateType(getTypeId(resultId)); }
|
|
||||||
bool isSampledImage(Id resultId) const { return isSampledImageType(getTypeId(resultId)); }
|
|
||||||
|
|
||||||
bool isBoolType(Id typeId) const { return groupedTypes[OpTypeBool].size() > 0 && typeId == groupedTypes[OpTypeBool].back()->getResultId(); }
|
|
||||||
bool isIntType(Id typeId) const { return getTypeClass(typeId) == OpTypeInt && module.getInstruction(typeId)->getImmediateOperand(1) != 0; }
|
|
||||||
bool isUintType(Id typeId) const { return getTypeClass(typeId) == OpTypeInt && module.getInstruction(typeId)->getImmediateOperand(1) == 0; }
|
|
||||||
bool isFloatType(Id typeId) const { return getTypeClass(typeId) == OpTypeFloat; }
|
|
||||||
bool isPointerType(Id typeId) const { return getTypeClass(typeId) == OpTypePointer; }
|
|
||||||
bool isScalarType(Id typeId) const { return getTypeClass(typeId) == OpTypeFloat || getTypeClass(typeId) == OpTypeInt || getTypeClass(typeId) == OpTypeBool; }
|
|
||||||
bool isVectorType(Id typeId) const { return getTypeClass(typeId) == OpTypeVector; }
|
|
||||||
bool isMatrixType(Id typeId) const { return getTypeClass(typeId) == OpTypeMatrix; }
|
|
||||||
bool isStructType(Id typeId) const { return getTypeClass(typeId) == OpTypeStruct; }
|
|
||||||
bool isArrayType(Id typeId) const { return getTypeClass(typeId) == OpTypeArray; }
|
|
||||||
bool isAggregateType(Id typeId) const { return isArrayType(typeId) || isStructType(typeId); }
|
|
||||||
bool isImageType(Id typeId) const { return getTypeClass(typeId) == OpTypeImage; }
|
|
||||||
bool isSamplerType(Id typeId) const { return getTypeClass(typeId) == OpTypeSampler; }
|
|
||||||
bool isSampledImageType(Id typeId) const { return getTypeClass(typeId) == OpTypeSampledImage; }
|
|
||||||
|
|
||||||
bool isConstantOpCode(Op opcode) const;
|
|
||||||
bool isSpecConstantOpCode(Op opcode) const;
|
|
||||||
bool isConstant(Id resultId) const { return isConstantOpCode(getOpCode(resultId)); }
|
|
||||||
bool isConstantScalar(Id resultId) const { return getOpCode(resultId) == OpConstant; }
|
|
||||||
bool isSpecConstant(Id resultId) const { return isSpecConstantOpCode(getOpCode(resultId)); }
|
|
||||||
unsigned int getConstantScalar(Id resultId) const { return module.getInstruction(resultId)->getImmediateOperand(0); }
|
|
||||||
StorageClass getStorageClass(Id resultId) const { return getTypeStorageClass(getTypeId(resultId)); }
|
|
||||||
|
|
||||||
int getScalarTypeWidth(Id typeId) const
|
|
||||||
{
|
|
||||||
Id scalarTypeId = getScalarTypeId(typeId);
|
|
||||||
assert(getTypeClass(scalarTypeId) == OpTypeInt || getTypeClass(scalarTypeId) == OpTypeFloat);
|
|
||||||
return module.getInstruction(scalarTypeId)->getImmediateOperand(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int getTypeNumColumns(Id typeId) const
|
|
||||||
{
|
|
||||||
assert(isMatrixType(typeId));
|
|
||||||
return getNumTypeConstituents(typeId);
|
|
||||||
}
|
|
||||||
int getNumColumns(Id resultId) const { return getTypeNumColumns(getTypeId(resultId)); }
|
|
||||||
int getTypeNumRows(Id typeId) const
|
|
||||||
{
|
|
||||||
assert(isMatrixType(typeId));
|
|
||||||
return getNumTypeComponents(getContainedTypeId(typeId));
|
|
||||||
}
|
|
||||||
int getNumRows(Id resultId) const { return getTypeNumRows(getTypeId(resultId)); }
|
|
||||||
|
|
||||||
Dim getTypeDimensionality(Id typeId) const
|
|
||||||
{
|
|
||||||
assert(isImageType(typeId));
|
|
||||||
return (Dim)module.getInstruction(typeId)->getImmediateOperand(1);
|
|
||||||
}
|
|
||||||
Id getImageType(Id resultId) const
|
|
||||||
{
|
|
||||||
Id typeId = getTypeId(resultId);
|
|
||||||
assert(isImageType(typeId) || isSampledImageType(typeId));
|
|
||||||
return isSampledImageType(typeId) ? module.getInstruction(typeId)->getIdOperand(0) : typeId;
|
|
||||||
}
|
|
||||||
bool isArrayedImageType(Id typeId) const
|
|
||||||
{
|
|
||||||
assert(isImageType(typeId));
|
|
||||||
return module.getInstruction(typeId)->getImmediateOperand(3) != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// For making new constants (will return old constant if the requested one was already made).
|
|
||||||
Id makeBoolConstant(bool b, bool specConstant = false);
|
|
||||||
Id makeIntConstant(int i, bool specConstant = false) { return makeIntConstant(makeIntType(32), (unsigned)i, specConstant); }
|
|
||||||
Id makeUintConstant(unsigned u, bool specConstant = false) { return makeIntConstant(makeUintType(32), u, specConstant); }
|
|
||||||
Id makeInt64Constant(long long i, bool specConstant = false) { return makeInt64Constant(makeIntType(64), (unsigned long long)i, specConstant); }
|
|
||||||
Id makeUint64Constant(unsigned long long u, bool specConstant = false) { return makeInt64Constant(makeUintType(64), u, specConstant); }
|
|
||||||
#ifdef AMD_EXTENSIONS
|
|
||||||
Id makeInt16Constant(short i, bool specConstant = false) { return makeIntConstant(makeIntType(16), (unsigned)((unsigned short)i), specConstant); }
|
|
||||||
Id makeUint16Constant(unsigned short u, bool specConstant = false) { return makeIntConstant(makeUintType(16), (unsigned)u, specConstant); }
|
|
||||||
#endif
|
|
||||||
Id makeFloatConstant(float f, bool specConstant = false);
|
|
||||||
Id makeDoubleConstant(double d, bool specConstant = false);
|
|
||||||
#ifdef AMD_EXTENSIONS
|
|
||||||
Id makeFloat16Constant(float f16, bool specConstant = false);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Turn the array of constants into a proper spv constant of the requested type.
|
|
||||||
Id makeCompositeConstant(Id type, const std::vector<Id>& comps, bool specConst = false);
|
|
||||||
|
|
||||||
// Methods for adding information outside the CFG.
|
|
||||||
Instruction* addEntryPoint(ExecutionModel, Function*, const char* name);
|
|
||||||
void addExecutionMode(Function*, ExecutionMode mode, int value1 = -1, int value2 = -1, int value3 = -1);
|
|
||||||
void addName(Id, const char* name);
|
|
||||||
void addMemberName(Id, int member, const char* name);
|
|
||||||
void addDecoration(Id, Decoration, int num = -1);
|
|
||||||
void addMemberDecoration(Id, unsigned int member, Decoration, int num = -1);
|
|
||||||
|
|
||||||
// At the end of what block do the next create*() instructions go?
|
|
||||||
void setBuildPoint(Block* bp) { buildPoint = bp; }
|
|
||||||
Block* getBuildPoint() const { return buildPoint; }
|
|
||||||
|
|
||||||
// Make the entry-point function. The returned pointer is only valid
|
|
||||||
// for the lifetime of this builder.
|
|
||||||
Function* makeEntryPoint(const char*);
|
|
||||||
|
|
||||||
// Make a shader-style function, and create its entry block if entry is non-zero.
|
|
||||||
// Return the function, pass back the entry.
|
|
||||||
// The returned pointer is only valid for the lifetime of this builder.
|
|
||||||
Function* makeFunctionEntry(Decoration precision, Id returnType, const char* name, const std::vector<Id>& paramTypes,
|
|
||||||
const std::vector<std::vector<Decoration>>& precisions, Block **entry = 0);
|
|
||||||
|
|
||||||
// Create a return. An 'implicit' return is one not appearing in the source
|
|
||||||
// code. In the case of an implicit return, no post-return block is inserted.
|
|
||||||
void makeReturn(bool implicit, Id retVal = 0);
|
|
||||||
|
|
||||||
// Generate all the code needed to finish up a function.
|
|
||||||
void leaveFunction();
|
|
||||||
|
|
||||||
// Create a discard.
|
|
||||||
void makeDiscard();
|
|
||||||
|
|
||||||
// Create a global or function local or IO variable.
|
|
||||||
Id createVariable(StorageClass, Id type, const char* name = 0);
|
|
||||||
|
|
||||||
// Create an intermediate with an undefined value.
|
|
||||||
Id createUndefined(Id type);
|
|
||||||
|
|
||||||
// Store into an Id and return the l-value
|
|
||||||
void createStore(Id rValue, Id lValue);
|
|
||||||
|
|
||||||
// Load from an Id and return it
|
|
||||||
Id createLoad(Id lValue);
|
|
||||||
|
|
||||||
// Create an OpAccessChain instruction
|
|
||||||
Id createAccessChain(StorageClass, Id base, const std::vector<Id>& offsets);
|
|
||||||
|
|
||||||
// Create an OpArrayLength instruction
|
|
||||||
Id createArrayLength(Id base, unsigned int member);
|
|
||||||
|
|
||||||
// Create an OpCompositeExtract instruction
|
|
||||||
Id createCompositeExtract(Id composite, Id typeId, unsigned index);
|
|
||||||
Id createCompositeExtract(Id composite, Id typeId, const std::vector<unsigned>& indexes);
|
|
||||||
Id createCompositeInsert(Id object, Id composite, Id typeId, unsigned index);
|
|
||||||
Id createCompositeInsert(Id object, Id composite, Id typeId, const std::vector<unsigned>& indexes);
|
|
||||||
|
|
||||||
Id createVectorExtractDynamic(Id vector, Id typeId, Id componentIndex);
|
|
||||||
Id createVectorInsertDynamic(Id vector, Id typeId, Id component, Id componentIndex);
|
|
||||||
|
|
||||||
void createNoResultOp(Op);
|
|
||||||
void createNoResultOp(Op, Id operand);
|
|
||||||
void createNoResultOp(Op, const std::vector<Id>& operands);
|
|
||||||
void createControlBarrier(Scope execution, Scope memory, MemorySemanticsMask);
|
|
||||||
void createMemoryBarrier(unsigned executionScope, unsigned memorySemantics);
|
|
||||||
Id createUnaryOp(Op, Id typeId, Id operand);
|
|
||||||
Id createBinOp(Op, Id typeId, Id operand1, Id operand2);
|
|
||||||
Id createTriOp(Op, Id typeId, Id operand1, Id operand2, Id operand3);
|
|
||||||
Id createOp(Op, Id typeId, const std::vector<Id>& operands);
|
|
||||||
Id createFunctionCall(spv::Function*, const std::vector<spv::Id>&);
|
|
||||||
Id createSpecConstantOp(Op, Id typeId, const std::vector<spv::Id>& operands, const std::vector<unsigned>& literals);
|
|
||||||
|
|
||||||
// Take an rvalue (source) and a set of channels to extract from it to
|
|
||||||
// make a new rvalue, which is returned.
|
|
||||||
Id createRvalueSwizzle(Decoration precision, Id typeId, Id source, const std::vector<unsigned>& channels);
|
|
||||||
|
|
||||||
// Take a copy of an lvalue (target) and a source of components, and set the
|
|
||||||
// source components into the lvalue where the 'channels' say to put them.
|
|
||||||
// An updated version of the target is returned.
|
|
||||||
// (No true lvalue or stores are used.)
|
|
||||||
Id createLvalueSwizzle(Id typeId, Id target, Id source, const std::vector<unsigned>& channels);
|
|
||||||
|
|
||||||
// If both the id and precision are valid, the id
|
|
||||||
// gets tagged with the requested precision.
|
|
||||||
// The passed in id is always the returned id, to simplify use patterns.
|
|
||||||
Id setPrecision(Id id, Decoration precision)
|
|
||||||
{
|
|
||||||
if (precision != NoPrecision && id != NoResult)
|
|
||||||
addDecoration(id, precision);
|
|
||||||
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Can smear a scalar to a vector for the following forms:
|
|
||||||
// - promoteScalar(scalar, vector) // smear scalar to width of vector
|
|
||||||
// - promoteScalar(vector, scalar) // smear scalar to width of vector
|
|
||||||
// - promoteScalar(pointer, scalar) // smear scalar to width of what pointer points to
|
|
||||||
// - promoteScalar(scalar, scalar) // do nothing
|
|
||||||
// Other forms are not allowed.
|
|
||||||
//
|
|
||||||
// Generally, the type of 'scalar' does not need to be the same type as the components in 'vector'.
|
|
||||||
// The type of the created vector is a vector of components of the same type as the scalar.
|
|
||||||
//
|
|
||||||
// Note: One of the arguments will change, with the result coming back that way rather than
|
|
||||||
// through the return value.
|
|
||||||
void promoteScalar(Decoration precision, Id& left, Id& right);
|
|
||||||
|
|
||||||
// Make a value by smearing the scalar to fill the type.
|
|
||||||
// vectorType should be the correct type for making a vector of scalarVal.
|
|
||||||
// (No conversions are done.)
|
|
||||||
Id smearScalar(Decoration precision, Id scalarVal, Id vectorType);
|
|
||||||
|
|
||||||
// Create a call to a built-in function.
|
|
||||||
Id createBuiltinCall(Id resultType, Id builtins, int entryPoint, const std::vector<Id>& args);
|
|
||||||
|
|
||||||
// List of parameters used to create a texture operation
|
|
||||||
struct TextureParameters {
|
|
||||||
Id sampler;
|
|
||||||
Id coords;
|
|
||||||
Id bias;
|
|
||||||
Id lod;
|
|
||||||
Id Dref;
|
|
||||||
Id offset;
|
|
||||||
Id offsets;
|
|
||||||
Id gradX;
|
|
||||||
Id gradY;
|
|
||||||
Id sample;
|
|
||||||
Id component;
|
|
||||||
Id texelOut;
|
|
||||||
Id lodClamp;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Select the correct texture operation based on all inputs, and emit the correct instruction
|
|
||||||
Id createTextureCall(Decoration precision, Id resultType, bool sparse, bool fetch, bool proj, bool gather, bool noImplicit, const TextureParameters&);
|
|
||||||
|
|
||||||
// Emit the OpTextureQuery* instruction that was passed in.
|
|
||||||
// Figure out the right return value and type, and return it.
|
|
||||||
Id createTextureQueryCall(Op, const TextureParameters&, bool isUnsignedResult);
|
|
||||||
|
|
||||||
Id createSamplePositionCall(Decoration precision, Id, Id);
|
|
||||||
|
|
||||||
Id createBitFieldExtractCall(Decoration precision, Id, Id, Id, bool isSigned);
|
|
||||||
Id createBitFieldInsertCall(Decoration precision, Id, Id, Id, Id);
|
|
||||||
|
|
||||||
// Reduction comparison for composites: For equal and not-equal resulting in a scalar.
|
|
||||||
Id createCompositeCompare(Decoration precision, Id, Id, bool /* true if for equal, false if for not-equal */);
|
|
||||||
|
|
||||||
// OpCompositeConstruct
|
|
||||||
Id createCompositeConstruct(Id typeId, const std::vector<Id>& constituents);
|
|
||||||
|
|
||||||
// vector or scalar constructor
|
|
||||||
Id createConstructor(Decoration precision, const std::vector<Id>& sources, Id resultTypeId);
|
|
||||||
|
|
||||||
// matrix constructor
|
|
||||||
Id createMatrixConstructor(Decoration precision, const std::vector<Id>& sources, Id constructee);
|
|
||||||
|
|
||||||
// Helper to use for building nested control flow with if-then-else.
|
|
||||||
class If {
|
|
||||||
public:
|
|
||||||
If(Id condition, unsigned int ctrl, Builder& builder);
|
|
||||||
~If() {}
|
|
||||||
|
|
||||||
void makeBeginElse();
|
|
||||||
void makeEndIf();
|
|
||||||
|
|
||||||
private:
|
|
||||||
If(const If&);
|
|
||||||
If& operator=(If&);
|
|
||||||
|
|
||||||
Builder& builder;
|
|
||||||
Id condition;
|
|
||||||
unsigned int control;
|
|
||||||
Function* function;
|
|
||||||
Block* headerBlock;
|
|
||||||
Block* thenBlock;
|
|
||||||
Block* elseBlock;
|
|
||||||
Block* mergeBlock;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Make a switch statement. A switch has 'numSegments' of pieces of code, not containing
|
|
||||||
// any case/default labels, all separated by one or more case/default labels. Each possible
|
|
||||||
// case value v is a jump to the caseValues[v] segment. The defaultSegment is also in this
|
|
||||||
// number space. How to compute the value is given by 'condition', as in switch(condition).
|
|
||||||
//
|
|
||||||
// The SPIR-V Builder will maintain the stack of post-switch merge blocks for nested switches.
|
|
||||||
//
|
|
||||||
// Use a defaultSegment < 0 if there is no default segment (to branch to post switch).
|
|
||||||
//
|
|
||||||
// Returns the right set of basic blocks to start each code segment with, so that the caller's
|
|
||||||
// recursion stack can hold the memory for it.
|
|
||||||
//
|
|
||||||
void makeSwitch(Id condition, unsigned int control, int numSegments, const std::vector<int>& caseValues,
|
|
||||||
const std::vector<int>& valueToSegment, int defaultSegment, std::vector<Block*>& segmentBB); // return argument
|
|
||||||
|
|
||||||
// Add a branch to the innermost switch's merge block.
|
|
||||||
void addSwitchBreak();
|
|
||||||
|
|
||||||
// Move to the next code segment, passing in the return argument in makeSwitch()
|
|
||||||
void nextSwitchSegment(std::vector<Block*>& segmentBB, int segment);
|
|
||||||
|
|
||||||
// Finish off the innermost switch.
|
|
||||||
void endSwitch(std::vector<Block*>& segmentBB);
|
|
||||||
|
|
||||||
struct LoopBlocks {
|
|
||||||
LoopBlocks(Block& head, Block& body, Block& merge, Block& continue_target) :
|
|
||||||
head(head), body(body), merge(merge), continue_target(continue_target) { }
|
|
||||||
Block &head, &body, &merge, &continue_target;
|
|
||||||
private:
|
|
||||||
LoopBlocks();
|
|
||||||
LoopBlocks& operator=(const LoopBlocks&);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Start a new loop and prepare the builder to generate code for it. Until
|
|
||||||
// closeLoop() is called for this loop, createLoopContinue() and
|
|
||||||
// createLoopExit() will target its corresponding blocks.
|
|
||||||
LoopBlocks& makeNewLoop();
|
|
||||||
|
|
||||||
// Create a new block in the function containing the build point. Memory is
|
|
||||||
// owned by the function object.
|
|
||||||
Block& makeNewBlock();
|
|
||||||
|
|
||||||
// Add a branch to the continue_target of the current (innermost) loop.
|
|
||||||
void createLoopContinue();
|
|
||||||
|
|
||||||
// Add an exit (e.g. "break") from the innermost loop that we're currently
|
|
||||||
// in.
|
|
||||||
void createLoopExit();
|
|
||||||
|
|
||||||
// Close the innermost loop that you're in
|
|
||||||
void closeLoop();
|
|
||||||
|
|
||||||
//
|
|
||||||
// Access chain design for an R-Value vs. L-Value:
|
|
||||||
//
|
|
||||||
// There is a single access chain the builder is building at
|
|
||||||
// any particular time. Such a chain can be used to either to a load or
|
|
||||||
// a store, when desired.
|
|
||||||
//
|
|
||||||
// Expressions can be r-values, l-values, or both, or only r-values:
|
|
||||||
// a[b.c].d = .... // l-value
|
|
||||||
// ... = a[b.c].d; // r-value, that also looks like an l-value
|
|
||||||
// ++a[b.c].d; // r-value and l-value
|
|
||||||
// (x + y)[2]; // r-value only, can't possibly be l-value
|
|
||||||
//
|
|
||||||
// Computing an r-value means generating code. Hence,
|
|
||||||
// r-values should only be computed when they are needed, not speculatively.
|
|
||||||
//
|
|
||||||
// Computing an l-value means saving away information for later use in the compiler,
|
|
||||||
// no code is generated until the l-value is later dereferenced. It is okay
|
|
||||||
// to speculatively generate an l-value, just not okay to speculatively dereference it.
|
|
||||||
//
|
|
||||||
// The base of the access chain (the left-most variable or expression
|
|
||||||
// from which everything is based) can be set either as an l-value
|
|
||||||
// or as an r-value. Most efficient would be to set an l-value if one
|
|
||||||
// is available. If an expression was evaluated, the resulting r-value
|
|
||||||
// can be set as the chain base.
|
|
||||||
//
|
|
||||||
// The users of this single access chain can save and restore if they
|
|
||||||
// want to nest or manage multiple chains.
|
|
||||||
//
|
|
||||||
|
|
||||||
struct AccessChain {
|
|
||||||
Id base; // for l-values, pointer to the base object, for r-values, the base object
|
|
||||||
std::vector<Id> indexChain;
|
|
||||||
Id instr; // cache the instruction that generates this access chain
|
|
||||||
std::vector<unsigned> swizzle; // each std::vector element selects the next GLSL component number
|
|
||||||
Id component; // a dynamic component index, can coexist with a swizzle, done after the swizzle, NoResult if not present
|
|
||||||
Id preSwizzleBaseType; // dereferenced type, before swizzle or component is applied; NoType unless a swizzle or component is present
|
|
||||||
bool isRValue; // true if 'base' is an r-value, otherwise, base is an l-value
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// the SPIR-V builder maintains a single active chain that
|
|
||||||
// the following methods operate on
|
|
||||||
//
|
|
||||||
|
|
||||||
// for external save and restore
|
|
||||||
AccessChain getAccessChain() { return accessChain; }
|
|
||||||
void setAccessChain(AccessChain newChain) { accessChain = newChain; }
|
|
||||||
|
|
||||||
// clear accessChain
|
|
||||||
void clearAccessChain();
|
|
||||||
|
|
||||||
// set new base as an l-value base
|
|
||||||
void setAccessChainLValue(Id lValue)
|
|
||||||
{
|
|
||||||
assert(isPointer(lValue));
|
|
||||||
accessChain.base = lValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// set new base value as an r-value
|
|
||||||
void setAccessChainRValue(Id rValue)
|
|
||||||
{
|
|
||||||
accessChain.isRValue = true;
|
|
||||||
accessChain.base = rValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// push offset onto the end of the chain
|
|
||||||
void accessChainPush(Id offset)
|
|
||||||
{
|
|
||||||
accessChain.indexChain.push_back(offset);
|
|
||||||
}
|
|
||||||
|
|
||||||
// push new swizzle onto the end of any existing swizzle, merging into a single swizzle
|
|
||||||
void accessChainPushSwizzle(std::vector<unsigned>& swizzle, Id preSwizzleBaseType);
|
|
||||||
|
|
||||||
// push a dynamic component selection onto the access chain, only applicable with a
|
|
||||||
// non-trivial swizzle or no swizzle
|
|
||||||
void accessChainPushComponent(Id component, Id preSwizzleBaseType)
|
|
||||||
{
|
|
||||||
if (accessChain.swizzle.size() != 1) {
|
|
||||||
accessChain.component = component;
|
|
||||||
if (accessChain.preSwizzleBaseType == NoType)
|
|
||||||
accessChain.preSwizzleBaseType = preSwizzleBaseType;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// use accessChain and swizzle to store value
|
|
||||||
void accessChainStore(Id rvalue);
|
|
||||||
|
|
||||||
// use accessChain and swizzle to load an r-value
|
|
||||||
Id accessChainLoad(Decoration precision, Id ResultType);
|
|
||||||
|
|
||||||
// get the direct pointer for an l-value
|
|
||||||
Id accessChainGetLValue();
|
|
||||||
|
|
||||||
// Get the inferred SPIR-V type of the result of the current access chain,
|
|
||||||
// based on the type of the base and the chain of dereferences.
|
|
||||||
Id accessChainGetInferredType();
|
|
||||||
|
|
||||||
// Remove OpDecorate instructions whose operands are defined in unreachable
|
|
||||||
// blocks.
|
|
||||||
void eliminateDeadDecorations();
|
|
||||||
void dump(std::vector<unsigned int>&) const;
|
|
||||||
|
|
||||||
void createBranch(Block* block);
|
|
||||||
void createConditionalBranch(Id condition, Block* thenBlock, Block* elseBlock);
|
|
||||||
void createLoopMerge(Block* mergeBlock, Block* continueBlock, unsigned int control, unsigned int dependencyLength);
|
|
||||||
void createSelectionMerge(Block* mergeBlock, unsigned int control);
|
|
||||||
|
|
||||||
// Sets to generate opcode for specialization constants.
|
|
||||||
void setToSpecConstCodeGenMode() { generatingOpCodeForSpecConst = true; }
|
|
||||||
// Sets to generate opcode for non-specialization constants (normal mode).
|
|
||||||
void setToNormalCodeGenMode() { generatingOpCodeForSpecConst = false; }
|
|
||||||
// Check if the builder is generating code for spec constants.
|
|
||||||
bool isInSpecConstCodeGenMode() { return generatingOpCodeForSpecConst; }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
Id makeIntConstant(Id typeId, unsigned value, bool specConstant);
|
|
||||||
Id makeInt64Constant(Id typeId, unsigned long long value, bool specConstant);
|
|
||||||
Id findScalarConstant(Op typeClass, Op opcode, Id typeId, unsigned value) const;
|
|
||||||
Id findScalarConstant(Op typeClass, Op opcode, Id typeId, unsigned v1, unsigned v2) const;
|
|
||||||
Id findCompositeConstant(Op typeClass, const std::vector<Id>& comps) const;
|
|
||||||
Id collapseAccessChain();
|
|
||||||
void remapDynamicSwizzle();
|
|
||||||
void transferAccessChainSwizzle(bool dynamic);
|
|
||||||
void simplifyAccessChainSwizzle();
|
|
||||||
void createAndSetNoPredecessorBlock(const char*);
|
|
||||||
void dumpSourceInstructions(std::vector<unsigned int>&) const;
|
|
||||||
void dumpInstructions(std::vector<unsigned int>&, const std::vector<std::unique_ptr<Instruction> >&) const;
|
|
||||||
void dumpModuleProcesses(std::vector<unsigned int>&) const;
|
|
||||||
|
|
||||||
unsigned int spvVersion; // the version of SPIR-V to emit in the header
|
|
||||||
SourceLanguage source;
|
|
||||||
int sourceVersion;
|
|
||||||
spv::Id sourceFileStringId;
|
|
||||||
std::string sourceText;
|
|
||||||
int currentLine;
|
|
||||||
bool emitOpLines;
|
|
||||||
std::set<std::string> extensions;
|
|
||||||
std::vector<const char*> sourceExtensions;
|
|
||||||
std::vector<const char*> moduleProcesses;
|
|
||||||
AddressingModel addressModel;
|
|
||||||
MemoryModel memoryModel;
|
|
||||||
std::set<spv::Capability> capabilities;
|
|
||||||
int builderNumber;
|
|
||||||
Module module;
|
|
||||||
Block* buildPoint;
|
|
||||||
Id uniqueId;
|
|
||||||
Function* entryPointFunction;
|
|
||||||
bool generatingOpCodeForSpecConst;
|
|
||||||
AccessChain accessChain;
|
|
||||||
|
|
||||||
// special blocks of instructions for output
|
|
||||||
std::vector<std::unique_ptr<Instruction> > strings;
|
|
||||||
std::vector<std::unique_ptr<Instruction> > imports;
|
|
||||||
std::vector<std::unique_ptr<Instruction> > entryPoints;
|
|
||||||
std::vector<std::unique_ptr<Instruction> > executionModes;
|
|
||||||
std::vector<std::unique_ptr<Instruction> > names;
|
|
||||||
std::vector<std::unique_ptr<Instruction> > lines;
|
|
||||||
std::vector<std::unique_ptr<Instruction> > decorations;
|
|
||||||
std::vector<std::unique_ptr<Instruction> > constantsTypesGlobals;
|
|
||||||
std::vector<std::unique_ptr<Instruction> > externals;
|
|
||||||
std::vector<std::unique_ptr<Function> > functions;
|
|
||||||
|
|
||||||
// not output, internally used for quick & dirty canonical (unique) creation
|
|
||||||
std::vector<Instruction*> groupedConstants[OpConstant]; // all types appear before OpConstant
|
|
||||||
std::vector<Instruction*> groupedTypes[OpConstant];
|
|
||||||
|
|
||||||
// stack of switches
|
|
||||||
std::stack<Block*> switchMerges;
|
|
||||||
|
|
||||||
// Our loop stack.
|
|
||||||
std::stack<LoopBlocks> loops;
|
|
||||||
|
|
||||||
// The stream for outputting warnings and errors.
|
|
||||||
SpvBuildLogger* logger;
|
|
||||||
}; // end Builder class
|
|
||||||
|
|
||||||
}; // end spv namespace
|
|
||||||
|
|
||||||
#endif // SpvBuilder_H
|
|
|
@ -1,81 +0,0 @@
|
||||||
// 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.
|
|
||||||
|
|
||||||
#ifndef LIBSPIRV_UTIL_BITUTILS_H_
|
|
||||||
#define LIBSPIRV_UTIL_BITUTILS_H_
|
|
||||||
|
|
||||||
#include <cstdint>
|
|
||||||
#include <cstring>
|
|
||||||
|
|
||||||
namespace spvutils {
|
|
||||||
|
|
||||||
// Performs a bitwise copy of source to the destination type Dest.
|
|
||||||
template <typename Dest, typename Src>
|
|
||||||
Dest BitwiseCast(Src source) {
|
|
||||||
Dest dest;
|
|
||||||
static_assert(sizeof(source) == sizeof(dest),
|
|
||||||
"BitwiseCast: Source and destination must have the same size");
|
|
||||||
std::memcpy(&dest, &source, sizeof(dest));
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBits<T, First, Num> returns an integer of type <T> with bits set
|
|
||||||
// for position <First> through <First + Num - 1>, counting from the least
|
|
||||||
// significant bit. In particular when Num == 0, no positions are set to 1.
|
|
||||||
// A static assert will be triggered if First + Num > sizeof(T) * 8, that is,
|
|
||||||
// a bit that will not fit in the underlying type is set.
|
|
||||||
template <typename T, size_t First = 0, size_t Num = 0>
|
|
||||||
struct SetBits {
|
|
||||||
static_assert(First < sizeof(T) * 8,
|
|
||||||
"Tried to set a bit that is shifted too far.");
|
|
||||||
const static T get = (T(1) << First) | SetBits<T, First + 1, Num - 1>::get;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T, size_t Last>
|
|
||||||
struct SetBits<T, Last, 0> {
|
|
||||||
const static T get = T(0);
|
|
||||||
};
|
|
||||||
|
|
||||||
// This is all compile-time so we can put our tests right here.
|
|
||||||
static_assert(SetBits<uint32_t, 0, 0>::get == uint32_t(0x00000000),
|
|
||||||
"SetBits failed");
|
|
||||||
static_assert(SetBits<uint32_t, 0, 1>::get == uint32_t(0x00000001),
|
|
||||||
"SetBits failed");
|
|
||||||
static_assert(SetBits<uint32_t, 31, 1>::get == uint32_t(0x80000000),
|
|
||||||
"SetBits failed");
|
|
||||||
static_assert(SetBits<uint32_t, 1, 2>::get == uint32_t(0x00000006),
|
|
||||||
"SetBits failed");
|
|
||||||
static_assert(SetBits<uint32_t, 30, 2>::get == uint32_t(0xc0000000),
|
|
||||||
"SetBits failed");
|
|
||||||
static_assert(SetBits<uint32_t, 0, 31>::get == uint32_t(0x7FFFFFFF),
|
|
||||||
"SetBits failed");
|
|
||||||
static_assert(SetBits<uint32_t, 0, 32>::get == uint32_t(0xFFFFFFFF),
|
|
||||||
"SetBits failed");
|
|
||||||
static_assert(SetBits<uint32_t, 16, 16>::get == uint32_t(0xFFFF0000),
|
|
||||||
"SetBits failed");
|
|
||||||
|
|
||||||
static_assert(SetBits<uint64_t, 0, 1>::get == uint64_t(0x0000000000000001LL),
|
|
||||||
"SetBits failed");
|
|
||||||
static_assert(SetBits<uint64_t, 63, 1>::get == uint64_t(0x8000000000000000LL),
|
|
||||||
"SetBits failed");
|
|
||||||
static_assert(SetBits<uint64_t, 62, 2>::get == uint64_t(0xc000000000000000LL),
|
|
||||||
"SetBits failed");
|
|
||||||
static_assert(SetBits<uint64_t, 31, 1>::get == uint64_t(0x0000000080000000LL),
|
|
||||||
"SetBits failed");
|
|
||||||
static_assert(SetBits<uint64_t, 16, 16>::get == uint64_t(0x00000000FFFF0000LL),
|
|
||||||
"SetBits failed");
|
|
||||||
|
|
||||||
} // namespace spvutils
|
|
||||||
|
|
||||||
#endif // LIBSPIRV_UTIL_BITUTILS_H_
|
|
|
@ -1,695 +0,0 @@
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 LunarG, Inc.
|
|
||||||
//
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions
|
|
||||||
// are met:
|
|
||||||
//
|
|
||||||
// Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following
|
|
||||||
// disclaimer in the documentation and/or other materials provided
|
|
||||||
// with the distribution.
|
|
||||||
//
|
|
||||||
// Neither the name of 3Dlabs Inc. Ltd. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
//
|
|
||||||
// Disassembler for SPIR-V.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <cstdlib>
|
|
||||||
#include <cstring>
|
|
||||||
#include <cassert>
|
|
||||||
#include <iomanip>
|
|
||||||
#include <stack>
|
|
||||||
#include <sstream>
|
|
||||||
#include <cstring>
|
|
||||||
|
|
||||||
#include "disassemble.h"
|
|
||||||
#include "doc.h"
|
|
||||||
|
|
||||||
namespace spv {
|
|
||||||
extern "C" {
|
|
||||||
// Include C-based headers that don't have a namespace
|
|
||||||
#include "GLSL.std.450.h"
|
|
||||||
#ifdef AMD_EXTENSIONS
|
|
||||||
#include "GLSL.ext.AMD.h"
|
|
||||||
#endif
|
|
||||||
#ifdef NV_EXTENSIONS
|
|
||||||
#include "GLSL.ext.NV.h"
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const char* GlslStd450DebugNames[spv::GLSLstd450Count];
|
|
||||||
|
|
||||||
namespace spv {
|
|
||||||
|
|
||||||
#ifdef AMD_EXTENSIONS
|
|
||||||
static const char* GLSLextAMDGetDebugNames(const char*, unsigned);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef NV_EXTENSIONS
|
|
||||||
static const char* GLSLextNVGetDebugNames(const char*, unsigned);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void Kill(std::ostream& out, const char* message)
|
|
||||||
{
|
|
||||||
out << std::endl << "Disassembly failed: " << message << std::endl;
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// used to identify the extended instruction library imported when printing
|
|
||||||
enum ExtInstSet {
|
|
||||||
GLSL450Inst,
|
|
||||||
#ifdef AMD_EXTENSIONS
|
|
||||||
GLSLextAMDInst,
|
|
||||||
#endif
|
|
||||||
#ifdef NV_EXTENSIONS
|
|
||||||
GLSLextNVInst,
|
|
||||||
#endif
|
|
||||||
OpenCLExtInst,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Container class for a single instance of a SPIR-V stream, with methods for disassembly.
|
|
||||||
class SpirvStream {
|
|
||||||
public:
|
|
||||||
SpirvStream(std::ostream& out, const std::vector<unsigned int>& stream) : out(out), stream(stream), word(0), nextNestedControl(0) { }
|
|
||||||
virtual ~SpirvStream() { }
|
|
||||||
|
|
||||||
void validate();
|
|
||||||
void processInstructions();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
SpirvStream(const SpirvStream&);
|
|
||||||
SpirvStream& operator=(const SpirvStream&);
|
|
||||||
Op getOpCode(int id) const { return idInstruction[id] ? (Op)(stream[idInstruction[id]] & OpCodeMask) : OpNop; }
|
|
||||||
|
|
||||||
// Output methods
|
|
||||||
void outputIndent();
|
|
||||||
void formatId(Id id, std::stringstream&);
|
|
||||||
void outputResultId(Id id);
|
|
||||||
void outputTypeId(Id id);
|
|
||||||
void outputId(Id id);
|
|
||||||
void outputMask(OperandClass operandClass, unsigned mask);
|
|
||||||
void disassembleImmediates(int numOperands);
|
|
||||||
void disassembleIds(int numOperands);
|
|
||||||
int disassembleString();
|
|
||||||
void disassembleInstruction(Id resultId, Id typeId, Op opCode, int numOperands);
|
|
||||||
|
|
||||||
// Data
|
|
||||||
std::ostream& out; // where to write the disassembly
|
|
||||||
const std::vector<unsigned int>& stream; // the actual word stream
|
|
||||||
int size; // the size of the word stream
|
|
||||||
int word; // the next word of the stream to read
|
|
||||||
|
|
||||||
// map each <id> to the instruction that created it
|
|
||||||
Id bound;
|
|
||||||
std::vector<unsigned int> idInstruction; // the word offset into the stream where the instruction for result [id] starts; 0 if not yet seen (forward reference or function parameter)
|
|
||||||
|
|
||||||
std::vector<std::string> idDescriptor; // the best text string known for explaining the <id>
|
|
||||||
|
|
||||||
// schema
|
|
||||||
unsigned int schema;
|
|
||||||
|
|
||||||
// stack of structured-merge points
|
|
||||||
std::stack<Id> nestedControl;
|
|
||||||
Id nextNestedControl; // need a slight delay for when we are nested
|
|
||||||
};
|
|
||||||
|
|
||||||
void SpirvStream::validate()
|
|
||||||
{
|
|
||||||
size = (int)stream.size();
|
|
||||||
if (size < 4)
|
|
||||||
Kill(out, "stream is too short");
|
|
||||||
|
|
||||||
// Magic number
|
|
||||||
if (stream[word++] != MagicNumber) {
|
|
||||||
out << "Bad magic number";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Version
|
|
||||||
out << "// Module Version " << std::hex << stream[word++] << std::endl;
|
|
||||||
|
|
||||||
// Generator's magic number
|
|
||||||
out << "// Generated by (magic number): " << std::hex << stream[word++] << std::dec << std::endl;
|
|
||||||
|
|
||||||
// Result <id> bound
|
|
||||||
bound = stream[word++];
|
|
||||||
idInstruction.resize(bound);
|
|
||||||
idDescriptor.resize(bound);
|
|
||||||
out << "// Id's are bound by " << bound << std::endl;
|
|
||||||
out << std::endl;
|
|
||||||
|
|
||||||
// Reserved schema, must be 0 for now
|
|
||||||
schema = stream[word++];
|
|
||||||
if (schema != 0)
|
|
||||||
Kill(out, "bad schema, must be 0");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Loop over all the instructions, in order, processing each.
|
|
||||||
// Boiler plate for each is handled here directly, the rest is dispatched.
|
|
||||||
void SpirvStream::processInstructions()
|
|
||||||
{
|
|
||||||
// Instructions
|
|
||||||
while (word < size) {
|
|
||||||
int instructionStart = word;
|
|
||||||
|
|
||||||
// Instruction wordCount and opcode
|
|
||||||
unsigned int firstWord = stream[word];
|
|
||||||
unsigned wordCount = firstWord >> WordCountShift;
|
|
||||||
Op opCode = (Op)(firstWord & OpCodeMask);
|
|
||||||
int nextInst = word + wordCount;
|
|
||||||
++word;
|
|
||||||
|
|
||||||
// Presence of full instruction
|
|
||||||
if (nextInst > size)
|
|
||||||
Kill(out, "stream instruction terminated too early");
|
|
||||||
|
|
||||||
// Base for computing number of operands; will be updated as more is learned
|
|
||||||
unsigned numOperands = wordCount - 1;
|
|
||||||
|
|
||||||
// Type <id>
|
|
||||||
Id typeId = 0;
|
|
||||||
if (InstructionDesc[opCode].hasType()) {
|
|
||||||
typeId = stream[word++];
|
|
||||||
--numOperands;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Result <id>
|
|
||||||
Id resultId = 0;
|
|
||||||
if (InstructionDesc[opCode].hasResult()) {
|
|
||||||
resultId = stream[word++];
|
|
||||||
--numOperands;
|
|
||||||
|
|
||||||
// save instruction for future reference
|
|
||||||
idInstruction[resultId] = instructionStart;
|
|
||||||
}
|
|
||||||
|
|
||||||
outputResultId(resultId);
|
|
||||||
outputTypeId(typeId);
|
|
||||||
outputIndent();
|
|
||||||
|
|
||||||
// Hand off the Op and all its operands
|
|
||||||
disassembleInstruction(resultId, typeId, opCode, numOperands);
|
|
||||||
if (word != nextInst) {
|
|
||||||
out << " ERROR, incorrect number of operands consumed. At " << word << " instead of " << nextInst << " instruction start was " << instructionStart;
|
|
||||||
word = nextInst;
|
|
||||||
}
|
|
||||||
out << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void SpirvStream::outputIndent()
|
|
||||||
{
|
|
||||||
for (int i = 0; i < (int)nestedControl.size(); ++i)
|
|
||||||
out << " ";
|
|
||||||
}
|
|
||||||
|
|
||||||
void SpirvStream::formatId(Id id, std::stringstream& idStream)
|
|
||||||
{
|
|
||||||
if (id != 0) {
|
|
||||||
// On instructions with no IDs, this is called with "0", which does not
|
|
||||||
// have to be within ID bounds on null shaders.
|
|
||||||
if (id >= bound)
|
|
||||||
Kill(out, "Bad <id>");
|
|
||||||
|
|
||||||
idStream << id;
|
|
||||||
if (idDescriptor[id].size() > 0)
|
|
||||||
idStream << "(" << idDescriptor[id] << ")";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void SpirvStream::outputResultId(Id id)
|
|
||||||
{
|
|
||||||
const int width = 16;
|
|
||||||
std::stringstream idStream;
|
|
||||||
formatId(id, idStream);
|
|
||||||
out << std::setw(width) << std::right << idStream.str();
|
|
||||||
if (id != 0)
|
|
||||||
out << ":";
|
|
||||||
else
|
|
||||||
out << " ";
|
|
||||||
|
|
||||||
if (nestedControl.size() && id == nestedControl.top())
|
|
||||||
nestedControl.pop();
|
|
||||||
}
|
|
||||||
|
|
||||||
void SpirvStream::outputTypeId(Id id)
|
|
||||||
{
|
|
||||||
const int width = 12;
|
|
||||||
std::stringstream idStream;
|
|
||||||
formatId(id, idStream);
|
|
||||||
out << std::setw(width) << std::right << idStream.str() << " ";
|
|
||||||
}
|
|
||||||
|
|
||||||
void SpirvStream::outputId(Id id)
|
|
||||||
{
|
|
||||||
if (id >= bound)
|
|
||||||
Kill(out, "Bad <id>");
|
|
||||||
|
|
||||||
out << id;
|
|
||||||
if (idDescriptor[id].size() > 0)
|
|
||||||
out << "(" << idDescriptor[id] << ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
void SpirvStream::outputMask(OperandClass operandClass, unsigned mask)
|
|
||||||
{
|
|
||||||
if (mask == 0)
|
|
||||||
out << "None";
|
|
||||||
else {
|
|
||||||
for (int m = 0; m < OperandClassParams[operandClass].ceiling; ++m) {
|
|
||||||
if (mask & (1 << m))
|
|
||||||
out << OperandClassParams[operandClass].getName(m) << " ";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void SpirvStream::disassembleImmediates(int numOperands)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < numOperands; ++i) {
|
|
||||||
out << stream[word++];
|
|
||||||
if (i < numOperands - 1)
|
|
||||||
out << " ";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void SpirvStream::disassembleIds(int numOperands)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < numOperands; ++i) {
|
|
||||||
outputId(stream[word++]);
|
|
||||||
if (i < numOperands - 1)
|
|
||||||
out << " ";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// return the number of operands consumed by the string
|
|
||||||
int SpirvStream::disassembleString()
|
|
||||||
{
|
|
||||||
int startWord = word;
|
|
||||||
|
|
||||||
out << " \"";
|
|
||||||
|
|
||||||
const char* wordString;
|
|
||||||
bool done = false;
|
|
||||||
do {
|
|
||||||
unsigned int content = stream[word];
|
|
||||||
wordString = (const char*)&content;
|
|
||||||
for (int charCount = 0; charCount < 4; ++charCount) {
|
|
||||||
if (*wordString == 0) {
|
|
||||||
done = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
out << *(wordString++);
|
|
||||||
}
|
|
||||||
++word;
|
|
||||||
} while (! done);
|
|
||||||
|
|
||||||
out << "\"";
|
|
||||||
|
|
||||||
return word - startWord;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SpirvStream::disassembleInstruction(Id resultId, Id /*typeId*/, Op opCode, int numOperands)
|
|
||||||
{
|
|
||||||
// Process the opcode
|
|
||||||
|
|
||||||
out << (OpcodeString(opCode) + 2); // leave out the "Op"
|
|
||||||
|
|
||||||
if (opCode == OpLoopMerge || opCode == OpSelectionMerge)
|
|
||||||
nextNestedControl = stream[word];
|
|
||||||
else if (opCode == OpBranchConditional || opCode == OpSwitch) {
|
|
||||||
if (nextNestedControl) {
|
|
||||||
nestedControl.push(nextNestedControl);
|
|
||||||
nextNestedControl = 0;
|
|
||||||
}
|
|
||||||
} else if (opCode == OpExtInstImport) {
|
|
||||||
idDescriptor[resultId] = (const char*)(&stream[word]);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (resultId != 0 && idDescriptor[resultId].size() == 0) {
|
|
||||||
switch (opCode) {
|
|
||||||
case OpTypeInt:
|
|
||||||
idDescriptor[resultId] = "int";
|
|
||||||
break;
|
|
||||||
case OpTypeFloat:
|
|
||||||
idDescriptor[resultId] = "float";
|
|
||||||
break;
|
|
||||||
case OpTypeBool:
|
|
||||||
idDescriptor[resultId] = "bool";
|
|
||||||
break;
|
|
||||||
case OpTypeStruct:
|
|
||||||
idDescriptor[resultId] = "struct";
|
|
||||||
break;
|
|
||||||
case OpTypePointer:
|
|
||||||
idDescriptor[resultId] = "ptr";
|
|
||||||
break;
|
|
||||||
case OpTypeVector:
|
|
||||||
if (idDescriptor[stream[word]].size() > 0)
|
|
||||||
idDescriptor[resultId].append(idDescriptor[stream[word]].begin(), idDescriptor[stream[word]].begin() + 1);
|
|
||||||
idDescriptor[resultId].append("vec");
|
|
||||||
switch (stream[word + 1]) {
|
|
||||||
case 2: idDescriptor[resultId].append("2"); break;
|
|
||||||
case 3: idDescriptor[resultId].append("3"); break;
|
|
||||||
case 4: idDescriptor[resultId].append("4"); break;
|
|
||||||
case 8: idDescriptor[resultId].append("8"); break;
|
|
||||||
case 16: idDescriptor[resultId].append("16"); break;
|
|
||||||
case 32: idDescriptor[resultId].append("32"); break;
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Process the operands. Note, a new context-dependent set could be
|
|
||||||
// swapped in mid-traversal.
|
|
||||||
|
|
||||||
// Handle images specially, so can put out helpful strings.
|
|
||||||
if (opCode == OpTypeImage) {
|
|
||||||
out << " ";
|
|
||||||
disassembleIds(1);
|
|
||||||
out << " " << DimensionString((Dim)stream[word++]);
|
|
||||||
out << (stream[word++] != 0 ? " depth" : "");
|
|
||||||
out << (stream[word++] != 0 ? " array" : "");
|
|
||||||
out << (stream[word++] != 0 ? " multi-sampled" : "");
|
|
||||||
switch (stream[word++]) {
|
|
||||||
case 0: out << " runtime"; break;
|
|
||||||
case 1: out << " sampled"; break;
|
|
||||||
case 2: out << " nonsampled"; break;
|
|
||||||
}
|
|
||||||
out << " format:" << ImageFormatString((ImageFormat)stream[word++]);
|
|
||||||
|
|
||||||
if (numOperands == 8) {
|
|
||||||
out << " " << AccessQualifierString(stream[word++]);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handle all the parameterized operands
|
|
||||||
for (int op = 0; op < InstructionDesc[opCode].operands.getNum() && numOperands > 0; ++op) {
|
|
||||||
out << " ";
|
|
||||||
OperandClass operandClass = InstructionDesc[opCode].operands.getClass(op);
|
|
||||||
switch (operandClass) {
|
|
||||||
case OperandId:
|
|
||||||
case OperandScope:
|
|
||||||
case OperandMemorySemantics:
|
|
||||||
disassembleIds(1);
|
|
||||||
--numOperands;
|
|
||||||
// Get names for printing "(XXX)" for readability, *after* this id
|
|
||||||
if (opCode == OpName)
|
|
||||||
idDescriptor[stream[word - 1]] = (const char*)(&stream[word]);
|
|
||||||
break;
|
|
||||||
case OperandVariableIds:
|
|
||||||
disassembleIds(numOperands);
|
|
||||||
return;
|
|
||||||
case OperandImageOperands:
|
|
||||||
outputMask(OperandImageOperands, stream[word++]);
|
|
||||||
--numOperands;
|
|
||||||
disassembleIds(numOperands);
|
|
||||||
return;
|
|
||||||
case OperandOptionalLiteral:
|
|
||||||
case OperandVariableLiterals:
|
|
||||||
if ((opCode == OpDecorate && stream[word - 1] == DecorationBuiltIn) ||
|
|
||||||
(opCode == OpMemberDecorate && stream[word - 1] == DecorationBuiltIn)) {
|
|
||||||
out << BuiltInString(stream[word++]);
|
|
||||||
--numOperands;
|
|
||||||
++op;
|
|
||||||
}
|
|
||||||
disassembleImmediates(numOperands);
|
|
||||||
return;
|
|
||||||
case OperandVariableIdLiteral:
|
|
||||||
while (numOperands > 0) {
|
|
||||||
out << std::endl;
|
|
||||||
outputResultId(0);
|
|
||||||
outputTypeId(0);
|
|
||||||
outputIndent();
|
|
||||||
out << " Type ";
|
|
||||||
disassembleIds(1);
|
|
||||||
out << ", member ";
|
|
||||||
disassembleImmediates(1);
|
|
||||||
numOperands -= 2;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
case OperandVariableLiteralId:
|
|
||||||
while (numOperands > 0) {
|
|
||||||
out << std::endl;
|
|
||||||
outputResultId(0);
|
|
||||||
outputTypeId(0);
|
|
||||||
outputIndent();
|
|
||||||
out << " case ";
|
|
||||||
disassembleImmediates(1);
|
|
||||||
out << ": ";
|
|
||||||
disassembleIds(1);
|
|
||||||
numOperands -= 2;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
case OperandLiteralNumber:
|
|
||||||
disassembleImmediates(1);
|
|
||||||
--numOperands;
|
|
||||||
if (opCode == OpExtInst) {
|
|
||||||
ExtInstSet extInstSet = GLSL450Inst;
|
|
||||||
const char* name = idDescriptor[stream[word - 2]].c_str();
|
|
||||||
if (0 == memcmp("OpenCL", name, 6)) {
|
|
||||||
extInstSet = OpenCLExtInst;
|
|
||||||
#ifdef AMD_EXTENSIONS
|
|
||||||
} else if (strcmp(spv::E_SPV_AMD_shader_ballot, name) == 0 ||
|
|
||||||
strcmp(spv::E_SPV_AMD_shader_trinary_minmax, name) == 0 ||
|
|
||||||
strcmp(spv::E_SPV_AMD_shader_explicit_vertex_parameter, name) == 0 ||
|
|
||||||
strcmp(spv::E_SPV_AMD_gcn_shader, name) == 0) {
|
|
||||||
extInstSet = GLSLextAMDInst;
|
|
||||||
#endif
|
|
||||||
#ifdef NV_EXTENSIONS
|
|
||||||
}else if (strcmp(spv::E_SPV_NV_sample_mask_override_coverage, name) == 0 ||
|
|
||||||
strcmp(spv::E_SPV_NV_geometry_shader_passthrough, name) == 0 ||
|
|
||||||
strcmp(spv::E_SPV_NV_viewport_array2, name) == 0 ||
|
|
||||||
strcmp(spv::E_SPV_NVX_multiview_per_view_attributes, name) == 0) {
|
|
||||||
extInstSet = GLSLextNVInst;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
unsigned entrypoint = stream[word - 1];
|
|
||||||
if (extInstSet == GLSL450Inst) {
|
|
||||||
if (entrypoint < GLSLstd450Count) {
|
|
||||||
out << "(" << GlslStd450DebugNames[entrypoint] << ")";
|
|
||||||
}
|
|
||||||
#ifdef AMD_EXTENSIONS
|
|
||||||
} else if (extInstSet == GLSLextAMDInst) {
|
|
||||||
out << "(" << GLSLextAMDGetDebugNames(name, entrypoint) << ")";
|
|
||||||
#endif
|
|
||||||
#ifdef NV_EXTENSIONS
|
|
||||||
}
|
|
||||||
else if (extInstSet == GLSLextNVInst) {
|
|
||||||
out << "(" << GLSLextNVGetDebugNames(name, entrypoint) << ")";
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case OperandOptionalLiteralString:
|
|
||||||
case OperandLiteralString:
|
|
||||||
numOperands -= disassembleString();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
assert(operandClass >= OperandSource && operandClass < OperandOpcode);
|
|
||||||
|
|
||||||
if (OperandClassParams[operandClass].bitmask)
|
|
||||||
outputMask(operandClass, stream[word++]);
|
|
||||||
else
|
|
||||||
out << OperandClassParams[operandClass].getName(stream[word++]);
|
|
||||||
--numOperands;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void GLSLstd450GetDebugNames(const char** names)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < GLSLstd450Count; ++i)
|
|
||||||
names[i] = "Unknown";
|
|
||||||
|
|
||||||
names[GLSLstd450Round] = "Round";
|
|
||||||
names[GLSLstd450RoundEven] = "RoundEven";
|
|
||||||
names[GLSLstd450Trunc] = "Trunc";
|
|
||||||
names[GLSLstd450FAbs] = "FAbs";
|
|
||||||
names[GLSLstd450SAbs] = "SAbs";
|
|
||||||
names[GLSLstd450FSign] = "FSign";
|
|
||||||
names[GLSLstd450SSign] = "SSign";
|
|
||||||
names[GLSLstd450Floor] = "Floor";
|
|
||||||
names[GLSLstd450Ceil] = "Ceil";
|
|
||||||
names[GLSLstd450Fract] = "Fract";
|
|
||||||
names[GLSLstd450Radians] = "Radians";
|
|
||||||
names[GLSLstd450Degrees] = "Degrees";
|
|
||||||
names[GLSLstd450Sin] = "Sin";
|
|
||||||
names[GLSLstd450Cos] = "Cos";
|
|
||||||
names[GLSLstd450Tan] = "Tan";
|
|
||||||
names[GLSLstd450Asin] = "Asin";
|
|
||||||
names[GLSLstd450Acos] = "Acos";
|
|
||||||
names[GLSLstd450Atan] = "Atan";
|
|
||||||
names[GLSLstd450Sinh] = "Sinh";
|
|
||||||
names[GLSLstd450Cosh] = "Cosh";
|
|
||||||
names[GLSLstd450Tanh] = "Tanh";
|
|
||||||
names[GLSLstd450Asinh] = "Asinh";
|
|
||||||
names[GLSLstd450Acosh] = "Acosh";
|
|
||||||
names[GLSLstd450Atanh] = "Atanh";
|
|
||||||
names[GLSLstd450Atan2] = "Atan2";
|
|
||||||
names[GLSLstd450Pow] = "Pow";
|
|
||||||
names[GLSLstd450Exp] = "Exp";
|
|
||||||
names[GLSLstd450Log] = "Log";
|
|
||||||
names[GLSLstd450Exp2] = "Exp2";
|
|
||||||
names[GLSLstd450Log2] = "Log2";
|
|
||||||
names[GLSLstd450Sqrt] = "Sqrt";
|
|
||||||
names[GLSLstd450InverseSqrt] = "InverseSqrt";
|
|
||||||
names[GLSLstd450Determinant] = "Determinant";
|
|
||||||
names[GLSLstd450MatrixInverse] = "MatrixInverse";
|
|
||||||
names[GLSLstd450Modf] = "Modf";
|
|
||||||
names[GLSLstd450ModfStruct] = "ModfStruct";
|
|
||||||
names[GLSLstd450FMin] = "FMin";
|
|
||||||
names[GLSLstd450SMin] = "SMin";
|
|
||||||
names[GLSLstd450UMin] = "UMin";
|
|
||||||
names[GLSLstd450FMax] = "FMax";
|
|
||||||
names[GLSLstd450SMax] = "SMax";
|
|
||||||
names[GLSLstd450UMax] = "UMax";
|
|
||||||
names[GLSLstd450FClamp] = "FClamp";
|
|
||||||
names[GLSLstd450SClamp] = "SClamp";
|
|
||||||
names[GLSLstd450UClamp] = "UClamp";
|
|
||||||
names[GLSLstd450FMix] = "FMix";
|
|
||||||
names[GLSLstd450Step] = "Step";
|
|
||||||
names[GLSLstd450SmoothStep] = "SmoothStep";
|
|
||||||
names[GLSLstd450Fma] = "Fma";
|
|
||||||
names[GLSLstd450Frexp] = "Frexp";
|
|
||||||
names[GLSLstd450FrexpStruct] = "FrexpStruct";
|
|
||||||
names[GLSLstd450Ldexp] = "Ldexp";
|
|
||||||
names[GLSLstd450PackSnorm4x8] = "PackSnorm4x8";
|
|
||||||
names[GLSLstd450PackUnorm4x8] = "PackUnorm4x8";
|
|
||||||
names[GLSLstd450PackSnorm2x16] = "PackSnorm2x16";
|
|
||||||
names[GLSLstd450PackUnorm2x16] = "PackUnorm2x16";
|
|
||||||
names[GLSLstd450PackHalf2x16] = "PackHalf2x16";
|
|
||||||
names[GLSLstd450PackDouble2x32] = "PackDouble2x32";
|
|
||||||
names[GLSLstd450UnpackSnorm2x16] = "UnpackSnorm2x16";
|
|
||||||
names[GLSLstd450UnpackUnorm2x16] = "UnpackUnorm2x16";
|
|
||||||
names[GLSLstd450UnpackHalf2x16] = "UnpackHalf2x16";
|
|
||||||
names[GLSLstd450UnpackSnorm4x8] = "UnpackSnorm4x8";
|
|
||||||
names[GLSLstd450UnpackUnorm4x8] = "UnpackUnorm4x8";
|
|
||||||
names[GLSLstd450UnpackDouble2x32] = "UnpackDouble2x32";
|
|
||||||
names[GLSLstd450Length] = "Length";
|
|
||||||
names[GLSLstd450Distance] = "Distance";
|
|
||||||
names[GLSLstd450Cross] = "Cross";
|
|
||||||
names[GLSLstd450Normalize] = "Normalize";
|
|
||||||
names[GLSLstd450FaceForward] = "FaceForward";
|
|
||||||
names[GLSLstd450Reflect] = "Reflect";
|
|
||||||
names[GLSLstd450Refract] = "Refract";
|
|
||||||
names[GLSLstd450FindILsb] = "FindILsb";
|
|
||||||
names[GLSLstd450FindSMsb] = "FindSMsb";
|
|
||||||
names[GLSLstd450FindUMsb] = "FindUMsb";
|
|
||||||
names[GLSLstd450InterpolateAtCentroid] = "InterpolateAtCentroid";
|
|
||||||
names[GLSLstd450InterpolateAtSample] = "InterpolateAtSample";
|
|
||||||
names[GLSLstd450InterpolateAtOffset] = "InterpolateAtOffset";
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef AMD_EXTENSIONS
|
|
||||||
static const char* GLSLextAMDGetDebugNames(const char* name, unsigned entrypoint)
|
|
||||||
{
|
|
||||||
if (strcmp(name, spv::E_SPV_AMD_shader_ballot) == 0) {
|
|
||||||
switch (entrypoint) {
|
|
||||||
case SwizzleInvocationsAMD: return "SwizzleInvocationsAMD";
|
|
||||||
case SwizzleInvocationsMaskedAMD: return "SwizzleInvocationsMaskedAMD";
|
|
||||||
case WriteInvocationAMD: return "WriteInvocationAMD";
|
|
||||||
case MbcntAMD: return "MbcntAMD";
|
|
||||||
default: return "Bad";
|
|
||||||
}
|
|
||||||
} else if (strcmp(name, spv::E_SPV_AMD_shader_trinary_minmax) == 0) {
|
|
||||||
switch (entrypoint) {
|
|
||||||
case FMin3AMD: return "FMin3AMD";
|
|
||||||
case UMin3AMD: return "UMin3AMD";
|
|
||||||
case SMin3AMD: return "SMin3AMD";
|
|
||||||
case FMax3AMD: return "FMax3AMD";
|
|
||||||
case UMax3AMD: return "UMax3AMD";
|
|
||||||
case SMax3AMD: return "SMax3AMD";
|
|
||||||
case FMid3AMD: return "FMid3AMD";
|
|
||||||
case UMid3AMD: return "UMid3AMD";
|
|
||||||
case SMid3AMD: return "SMid3AMD";
|
|
||||||
default: return "Bad";
|
|
||||||
}
|
|
||||||
} else if (strcmp(name, spv::E_SPV_AMD_shader_explicit_vertex_parameter) == 0) {
|
|
||||||
switch (entrypoint) {
|
|
||||||
case InterpolateAtVertexAMD: return "InterpolateAtVertexAMD";
|
|
||||||
default: return "Bad";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (strcmp(name, spv::E_SPV_AMD_gcn_shader) == 0) {
|
|
||||||
switch (entrypoint) {
|
|
||||||
case CubeFaceIndexAMD: return "CubeFaceIndexAMD";
|
|
||||||
case CubeFaceCoordAMD: return "CubeFaceCoordAMD";
|
|
||||||
case TimeAMD: return "TimeAMD";
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return "Bad";
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef NV_EXTENSIONS
|
|
||||||
static const char* GLSLextNVGetDebugNames(const char* name, unsigned entrypoint)
|
|
||||||
{
|
|
||||||
if (strcmp(name, spv::E_SPV_NV_sample_mask_override_coverage) == 0 ||
|
|
||||||
strcmp(name, spv::E_SPV_NV_geometry_shader_passthrough) == 0 ||
|
|
||||||
strcmp(name, spv::E_ARB_shader_viewport_layer_array) == 0 ||
|
|
||||||
strcmp(name, spv::E_SPV_NV_viewport_array2) == 0 ||
|
|
||||||
strcmp(spv::E_SPV_NVX_multiview_per_view_attributes, name) == 0) {
|
|
||||||
switch (entrypoint) {
|
|
||||||
case DecorationOverrideCoverageNV: return "OverrideCoverageNV";
|
|
||||||
case DecorationPassthroughNV: return "PassthroughNV";
|
|
||||||
case CapabilityGeometryShaderPassthroughNV: return "GeometryShaderPassthroughNV";
|
|
||||||
case DecorationViewportRelativeNV: return "ViewportRelativeNV";
|
|
||||||
case BuiltInViewportMaskNV: return "ViewportMaskNV";
|
|
||||||
case CapabilityShaderViewportMaskNV: return "ShaderViewportMaskNV";
|
|
||||||
case DecorationSecondaryViewportRelativeNV: return "SecondaryViewportRelativeNV";
|
|
||||||
case BuiltInSecondaryPositionNV: return "SecondaryPositionNV";
|
|
||||||
case BuiltInSecondaryViewportMaskNV: return "SecondaryViewportMaskNV";
|
|
||||||
case CapabilityShaderStereoViewNV: return "ShaderStereoViewNV";
|
|
||||||
case BuiltInPositionPerViewNV: return "PositionPerViewNV";
|
|
||||||
case BuiltInViewportMaskPerViewNV: return "ViewportMaskPerViewNV";
|
|
||||||
case CapabilityPerViewAttributesNV: return "PerViewAttributesNV";
|
|
||||||
default: return "Bad";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "Bad";
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void Disassemble(std::ostream& out, const std::vector<unsigned int>& stream)
|
|
||||||
{
|
|
||||||
SpirvStream SpirvStream(out, stream);
|
|
||||||
spv::Parameterize();
|
|
||||||
GLSLstd450GetDebugNames(GlslStd450DebugNames);
|
|
||||||
SpirvStream.validate();
|
|
||||||
SpirvStream.processInstructions();
|
|
||||||
}
|
|
||||||
|
|
||||||
}; // end namespace spv
|
|
|
@ -1,52 +0,0 @@
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 LunarG, Inc.
|
|
||||||
//
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions
|
|
||||||
// are met:
|
|
||||||
//
|
|
||||||
// Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following
|
|
||||||
// disclaimer in the documentation and/or other materials provided
|
|
||||||
// with the distribution.
|
|
||||||
//
|
|
||||||
// Neither the name of 3Dlabs Inc. Ltd. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
//
|
|
||||||
// Disassembler for SPIR-V.
|
|
||||||
//
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
#ifndef disassembler_H
|
|
||||||
#define disassembler_H
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace spv {
|
|
||||||
|
|
||||||
void Disassemble(std::ostream& out, const std::vector<unsigned int>&);
|
|
||||||
|
|
||||||
}; // end namespace spv
|
|
||||||
|
|
||||||
#endif // disassembler_H
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,262 +0,0 @@
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 LunarG, Inc.
|
|
||||||
//
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions
|
|
||||||
// are met:
|
|
||||||
//
|
|
||||||
// Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following
|
|
||||||
// disclaimer in the documentation and/or other materials provided
|
|
||||||
// with the distribution.
|
|
||||||
//
|
|
||||||
// Neither the name of 3Dlabs Inc. Ltd. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
//
|
|
||||||
// Parameterize the SPIR-V enumerants.
|
|
||||||
//
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "spirv.hpp"
|
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace spv {
|
|
||||||
|
|
||||||
// Fill in all the parameters
|
|
||||||
void Parameterize();
|
|
||||||
|
|
||||||
// Return the English names of all the enums.
|
|
||||||
const char* SourceString(int);
|
|
||||||
const char* AddressingString(int);
|
|
||||||
const char* MemoryString(int);
|
|
||||||
const char* ExecutionModelString(int);
|
|
||||||
const char* ExecutionModeString(int);
|
|
||||||
const char* StorageClassString(int);
|
|
||||||
const char* DecorationString(int);
|
|
||||||
const char* BuiltInString(int);
|
|
||||||
const char* DimensionString(int);
|
|
||||||
const char* SelectControlString(int);
|
|
||||||
const char* LoopControlString(int);
|
|
||||||
const char* FunctionControlString(int);
|
|
||||||
const char* SamplerAddressingModeString(int);
|
|
||||||
const char* SamplerFilterModeString(int);
|
|
||||||
const char* ImageFormatString(int);
|
|
||||||
const char* ImageChannelOrderString(int);
|
|
||||||
const char* ImageChannelTypeString(int);
|
|
||||||
const char* ImageChannelDataTypeString(int type);
|
|
||||||
const char* ImageOperandsString(int format);
|
|
||||||
const char* ImageOperands(int);
|
|
||||||
const char* FPFastMathString(int);
|
|
||||||
const char* FPRoundingModeString(int);
|
|
||||||
const char* LinkageTypeString(int);
|
|
||||||
const char* FuncParamAttrString(int);
|
|
||||||
const char* AccessQualifierString(int);
|
|
||||||
const char* MemorySemanticsString(int);
|
|
||||||
const char* MemoryAccessString(int);
|
|
||||||
const char* ExecutionScopeString(int);
|
|
||||||
const char* GroupOperationString(int);
|
|
||||||
const char* KernelEnqueueFlagsString(int);
|
|
||||||
const char* KernelProfilingInfoString(int);
|
|
||||||
const char* CapabilityString(int);
|
|
||||||
const char* OpcodeString(int);
|
|
||||||
const char* ScopeString(int mem);
|
|
||||||
|
|
||||||
// For grouping opcodes into subsections
|
|
||||||
enum OpcodeClass {
|
|
||||||
OpClassMisc,
|
|
||||||
OpClassDebug,
|
|
||||||
OpClassAnnotate,
|
|
||||||
OpClassExtension,
|
|
||||||
OpClassMode,
|
|
||||||
OpClassType,
|
|
||||||
OpClassConstant,
|
|
||||||
OpClassMemory,
|
|
||||||
OpClassFunction,
|
|
||||||
OpClassImage,
|
|
||||||
OpClassConvert,
|
|
||||||
OpClassComposite,
|
|
||||||
OpClassArithmetic,
|
|
||||||
OpClassBit,
|
|
||||||
OpClassRelationalLogical,
|
|
||||||
OpClassDerivative,
|
|
||||||
OpClassFlowControl,
|
|
||||||
OpClassAtomic,
|
|
||||||
OpClassPrimitive,
|
|
||||||
OpClassBarrier,
|
|
||||||
OpClassGroup,
|
|
||||||
OpClassDeviceSideEnqueue,
|
|
||||||
OpClassPipe,
|
|
||||||
|
|
||||||
OpClassCount,
|
|
||||||
OpClassMissing // all instructions start out as missing
|
|
||||||
};
|
|
||||||
|
|
||||||
// For parameterizing operands.
|
|
||||||
enum OperandClass {
|
|
||||||
OperandNone,
|
|
||||||
OperandId,
|
|
||||||
OperandVariableIds,
|
|
||||||
OperandOptionalLiteral,
|
|
||||||
OperandOptionalLiteralString,
|
|
||||||
OperandVariableLiterals,
|
|
||||||
OperandVariableIdLiteral,
|
|
||||||
OperandVariableLiteralId,
|
|
||||||
OperandLiteralNumber,
|
|
||||||
OperandLiteralString,
|
|
||||||
OperandSource,
|
|
||||||
OperandExecutionModel,
|
|
||||||
OperandAddressing,
|
|
||||||
OperandMemory,
|
|
||||||
OperandExecutionMode,
|
|
||||||
OperandStorage,
|
|
||||||
OperandDimensionality,
|
|
||||||
OperandSamplerAddressingMode,
|
|
||||||
OperandSamplerFilterMode,
|
|
||||||
OperandSamplerImageFormat,
|
|
||||||
OperandImageChannelOrder,
|
|
||||||
OperandImageChannelDataType,
|
|
||||||
OperandImageOperands,
|
|
||||||
OperandFPFastMath,
|
|
||||||
OperandFPRoundingMode,
|
|
||||||
OperandLinkageType,
|
|
||||||
OperandAccessQualifier,
|
|
||||||
OperandFuncParamAttr,
|
|
||||||
OperandDecoration,
|
|
||||||
OperandBuiltIn,
|
|
||||||
OperandSelect,
|
|
||||||
OperandLoop,
|
|
||||||
OperandFunction,
|
|
||||||
OperandMemorySemantics,
|
|
||||||
OperandMemoryAccess,
|
|
||||||
OperandScope,
|
|
||||||
OperandGroupOperation,
|
|
||||||
OperandKernelEnqueueFlags,
|
|
||||||
OperandKernelProfilingInfo,
|
|
||||||
OperandCapability,
|
|
||||||
|
|
||||||
OperandOpcode,
|
|
||||||
|
|
||||||
OperandCount
|
|
||||||
};
|
|
||||||
|
|
||||||
// Any specific enum can have a set of capabilities that allow it:
|
|
||||||
typedef std::vector<Capability> EnumCaps;
|
|
||||||
|
|
||||||
// Parameterize a set of operands with their OperandClass(es) and descriptions.
|
|
||||||
class OperandParameters {
|
|
||||||
public:
|
|
||||||
OperandParameters() { }
|
|
||||||
void push(OperandClass oc, const char* d, bool opt = false)
|
|
||||||
{
|
|
||||||
opClass.push_back(oc);
|
|
||||||
desc.push_back(d);
|
|
||||||
optional.push_back(opt);
|
|
||||||
}
|
|
||||||
void setOptional();
|
|
||||||
OperandClass getClass(int op) const { return opClass[op]; }
|
|
||||||
const char* getDesc(int op) const { return desc[op]; }
|
|
||||||
bool isOptional(int op) const { return optional[op]; }
|
|
||||||
int getNum() const { return (int)opClass.size(); }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
std::vector<OperandClass> opClass;
|
|
||||||
std::vector<const char*> desc;
|
|
||||||
std::vector<bool> optional;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Parameterize an enumerant
|
|
||||||
class EnumParameters {
|
|
||||||
public:
|
|
||||||
EnumParameters() : desc(0) { }
|
|
||||||
EnumCaps caps;
|
|
||||||
const char* desc;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Parameterize a set of enumerants that form an enum
|
|
||||||
class EnumDefinition : public EnumParameters {
|
|
||||||
public:
|
|
||||||
EnumDefinition() :
|
|
||||||
ceiling(0), bitmask(false), getName(0), enumParams(0), operandParams(0) { }
|
|
||||||
void set(int ceil, const char* (*name)(int), EnumParameters* ep, bool mask = false)
|
|
||||||
{
|
|
||||||
ceiling = ceil;
|
|
||||||
getName = name;
|
|
||||||
bitmask = mask;
|
|
||||||
enumParams = ep;
|
|
||||||
}
|
|
||||||
void setOperands(OperandParameters* op) { operandParams = op; }
|
|
||||||
int ceiling; // ceiling of enumerants
|
|
||||||
bool bitmask; // true if these enumerants combine into a bitmask
|
|
||||||
const char* (*getName)(int); // a function that returns the name for each enumerant value (or shift)
|
|
||||||
EnumParameters* enumParams; // parameters for each individual enumerant
|
|
||||||
OperandParameters* operandParams; // sets of operands
|
|
||||||
};
|
|
||||||
|
|
||||||
// Parameterize an instruction's logical format, including its known set of operands,
|
|
||||||
// per OperandParameters above.
|
|
||||||
class InstructionParameters {
|
|
||||||
public:
|
|
||||||
InstructionParameters() :
|
|
||||||
opDesc("TBD"),
|
|
||||||
opClass(OpClassMissing),
|
|
||||||
typePresent(true), // most normal, only exceptions have to be spelled out
|
|
||||||
resultPresent(true) // most normal, only exceptions have to be spelled out
|
|
||||||
{ }
|
|
||||||
|
|
||||||
void setResultAndType(bool r, bool t)
|
|
||||||
{
|
|
||||||
resultPresent = r;
|
|
||||||
typePresent = t;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool hasResult() const { return resultPresent != 0; }
|
|
||||||
bool hasType() const { return typePresent != 0; }
|
|
||||||
|
|
||||||
const char* opDesc;
|
|
||||||
EnumCaps capabilities;
|
|
||||||
OpcodeClass opClass;
|
|
||||||
OperandParameters operands;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
int typePresent : 1;
|
|
||||||
int resultPresent : 1;
|
|
||||||
};
|
|
||||||
|
|
||||||
const int OpcodeCeiling = 321;
|
|
||||||
|
|
||||||
// The set of objects that hold all the instruction/operand
|
|
||||||
// parameterization information.
|
|
||||||
extern InstructionParameters InstructionDesc[];
|
|
||||||
|
|
||||||
// These hold definitions of the enumerants used for operands
|
|
||||||
extern EnumDefinition OperandClassParams[];
|
|
||||||
|
|
||||||
const char* GetOperandDesc(OperandClass operand);
|
|
||||||
void PrintImmediateRow(int imm, const char* name, const EnumParameters* enumParams, bool caps, bool hex = false);
|
|
||||||
const char* AccessQualifierString(int attr);
|
|
||||||
|
|
||||||
void PrintOperands(const OperandParameters& operands, int reservedOperands);
|
|
||||||
|
|
||||||
}; // end namespace spv
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,407 +0,0 @@
|
||||||
//
|
|
||||||
// Copyright (C) 2014 LunarG, Inc.
|
|
||||||
//
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions
|
|
||||||
// are met:
|
|
||||||
//
|
|
||||||
// Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// Redistributions in binary form must reproduce the above
|
|
||||||
// copyright notice, this list of conditions and the following
|
|
||||||
// disclaimer in the documentation and/or other materials provided
|
|
||||||
// with the distribution.
|
|
||||||
//
|
|
||||||
// Neither the name of 3Dlabs Inc. Ltd. nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived
|
|
||||||
// from this software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
||||||
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
||||||
// COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
|
||||||
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
// POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
// SPIRV-IR
|
|
||||||
//
|
|
||||||
// Simple in-memory representation (IR) of SPIRV. Just for holding
|
|
||||||
// Each function's CFG of blocks. Has this hierarchy:
|
|
||||||
// - Module, which is a list of
|
|
||||||
// - Function, which is a list of
|
|
||||||
// - Block, which is a list of
|
|
||||||
// - Instruction
|
|
||||||
//
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
#ifndef spvIR_H
|
|
||||||
#define spvIR_H
|
|
||||||
|
|
||||||
#include "spirv.hpp"
|
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
#include <cassert>
|
|
||||||
#include <functional>
|
|
||||||
#include <iostream>
|
|
||||||
#include <memory>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace spv {
|
|
||||||
|
|
||||||
class Block;
|
|
||||||
class Function;
|
|
||||||
class Module;
|
|
||||||
|
|
||||||
const Id NoResult = 0;
|
|
||||||
const Id NoType = 0;
|
|
||||||
|
|
||||||
const Decoration NoPrecision = DecorationMax;
|
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
# define POTENTIALLY_UNUSED __attribute__((unused))
|
|
||||||
#else
|
|
||||||
# define POTENTIALLY_UNUSED
|
|
||||||
#endif
|
|
||||||
|
|
||||||
POTENTIALLY_UNUSED
|
|
||||||
const MemorySemanticsMask MemorySemanticsAllMemory =
|
|
||||||
(MemorySemanticsMask)(MemorySemanticsUniformMemoryMask |
|
|
||||||
MemorySemanticsWorkgroupMemoryMask |
|
|
||||||
MemorySemanticsAtomicCounterMemoryMask |
|
|
||||||
MemorySemanticsImageMemoryMask);
|
|
||||||
|
|
||||||
//
|
|
||||||
// SPIR-V IR instruction.
|
|
||||||
//
|
|
||||||
|
|
||||||
class Instruction {
|
|
||||||
public:
|
|
||||||
Instruction(Id resultId, Id typeId, Op opCode) : resultId(resultId), typeId(typeId), opCode(opCode), block(nullptr) { }
|
|
||||||
explicit Instruction(Op opCode) : resultId(NoResult), typeId(NoType), opCode(opCode), block(nullptr) { }
|
|
||||||
virtual ~Instruction() {}
|
|
||||||
void addIdOperand(Id id) { operands.push_back(id); }
|
|
||||||
void addImmediateOperand(unsigned int immediate) { operands.push_back(immediate); }
|
|
||||||
void addStringOperand(const char* str)
|
|
||||||
{
|
|
||||||
unsigned int word;
|
|
||||||
char* wordString = (char*)&word;
|
|
||||||
char* wordPtr = wordString;
|
|
||||||
int charCount = 0;
|
|
||||||
char c;
|
|
||||||
do {
|
|
||||||
c = *(str++);
|
|
||||||
*(wordPtr++) = c;
|
|
||||||
++charCount;
|
|
||||||
if (charCount == 4) {
|
|
||||||
addImmediateOperand(word);
|
|
||||||
wordPtr = wordString;
|
|
||||||
charCount = 0;
|
|
||||||
}
|
|
||||||
} while (c != 0);
|
|
||||||
|
|
||||||
// deal with partial last word
|
|
||||||
if (charCount > 0) {
|
|
||||||
// pad with 0s
|
|
||||||
for (; charCount < 4; ++charCount)
|
|
||||||
*(wordPtr++) = 0;
|
|
||||||
addImmediateOperand(word);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void setBlock(Block* b) { block = b; }
|
|
||||||
Block* getBlock() const { return block; }
|
|
||||||
Op getOpCode() const { return opCode; }
|
|
||||||
int getNumOperands() const { return (int)operands.size(); }
|
|
||||||
Id getResultId() const { return resultId; }
|
|
||||||
Id getTypeId() const { return typeId; }
|
|
||||||
Id getIdOperand(int op) const { return operands[op]; }
|
|
||||||
unsigned int getImmediateOperand(int op) const { return operands[op]; }
|
|
||||||
|
|
||||||
// Write out the binary form.
|
|
||||||
void dump(std::vector<unsigned int>& out) const
|
|
||||||
{
|
|
||||||
// Compute the wordCount
|
|
||||||
unsigned int wordCount = 1;
|
|
||||||
if (typeId)
|
|
||||||
++wordCount;
|
|
||||||
if (resultId)
|
|
||||||
++wordCount;
|
|
||||||
wordCount += (unsigned int)operands.size();
|
|
||||||
|
|
||||||
// Write out the beginning of the instruction
|
|
||||||
out.push_back(((wordCount) << WordCountShift) | opCode);
|
|
||||||
if (typeId)
|
|
||||||
out.push_back(typeId);
|
|
||||||
if (resultId)
|
|
||||||
out.push_back(resultId);
|
|
||||||
|
|
||||||
// Write out the operands
|
|
||||||
for (int op = 0; op < (int)operands.size(); ++op)
|
|
||||||
out.push_back(operands[op]);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
Instruction(const Instruction&);
|
|
||||||
Id resultId;
|
|
||||||
Id typeId;
|
|
||||||
Op opCode;
|
|
||||||
std::vector<Id> operands;
|
|
||||||
Block* block;
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// SPIR-V IR block.
|
|
||||||
//
|
|
||||||
|
|
||||||
class Block {
|
|
||||||
public:
|
|
||||||
Block(Id id, Function& parent);
|
|
||||||
virtual ~Block()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
Id getId() { return instructions.front()->getResultId(); }
|
|
||||||
|
|
||||||
Function& getParent() const { return parent; }
|
|
||||||
void addInstruction(std::unique_ptr<Instruction> inst);
|
|
||||||
void addPredecessor(Block* pred) { predecessors.push_back(pred); pred->successors.push_back(this);}
|
|
||||||
void addLocalVariable(std::unique_ptr<Instruction> inst) { localVariables.push_back(std::move(inst)); }
|
|
||||||
const std::vector<Block*>& getPredecessors() const { return predecessors; }
|
|
||||||
const std::vector<Block*>& getSuccessors() const { return successors; }
|
|
||||||
const std::vector<std::unique_ptr<Instruction> >& getInstructions() const {
|
|
||||||
return instructions;
|
|
||||||
}
|
|
||||||
void setUnreachable() { unreachable = true; }
|
|
||||||
bool isUnreachable() const { return unreachable; }
|
|
||||||
// Returns the block's merge instruction, if one exists (otherwise null).
|
|
||||||
const Instruction* getMergeInstruction() const {
|
|
||||||
if (instructions.size() < 2) return nullptr;
|
|
||||||
const Instruction* nextToLast = (instructions.cend() - 2)->get();
|
|
||||||
switch (nextToLast->getOpCode()) {
|
|
||||||
case OpSelectionMerge:
|
|
||||||
case OpLoopMerge:
|
|
||||||
return nextToLast;
|
|
||||||
default:
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isTerminated() const
|
|
||||||
{
|
|
||||||
switch (instructions.back()->getOpCode()) {
|
|
||||||
case OpBranch:
|
|
||||||
case OpBranchConditional:
|
|
||||||
case OpSwitch:
|
|
||||||
case OpKill:
|
|
||||||
case OpReturn:
|
|
||||||
case OpReturnValue:
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void dump(std::vector<unsigned int>& out) const
|
|
||||||
{
|
|
||||||
instructions[0]->dump(out);
|
|
||||||
for (int i = 0; i < (int)localVariables.size(); ++i)
|
|
||||||
localVariables[i]->dump(out);
|
|
||||||
for (int i = 1; i < (int)instructions.size(); ++i)
|
|
||||||
instructions[i]->dump(out);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
Block(const Block&);
|
|
||||||
Block& operator=(Block&);
|
|
||||||
|
|
||||||
// To enforce keeping parent and ownership in sync:
|
|
||||||
friend Function;
|
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Instruction> > instructions;
|
|
||||||
std::vector<Block*> predecessors, successors;
|
|
||||||
std::vector<std::unique_ptr<Instruction> > localVariables;
|
|
||||||
Function& parent;
|
|
||||||
|
|
||||||
// track whether this block is known to be uncreachable (not necessarily
|
|
||||||
// true for all unreachable blocks, but should be set at least
|
|
||||||
// for the extraneous ones introduced by the builder).
|
|
||||||
bool unreachable;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Traverses the control-flow graph rooted at root in an order suited for
|
|
||||||
// readable code generation. Invokes callback at every node in the traversal
|
|
||||||
// order.
|
|
||||||
void inReadableOrder(Block* root, std::function<void(Block*)> callback);
|
|
||||||
|
|
||||||
//
|
|
||||||
// SPIR-V IR Function.
|
|
||||||
//
|
|
||||||
|
|
||||||
class Function {
|
|
||||||
public:
|
|
||||||
Function(Id id, Id resultType, Id functionType, Id firstParam, Module& parent);
|
|
||||||
virtual ~Function()
|
|
||||||
{
|
|
||||||
for (int i = 0; i < (int)parameterInstructions.size(); ++i)
|
|
||||||
delete parameterInstructions[i];
|
|
||||||
|
|
||||||
for (int i = 0; i < (int)blocks.size(); ++i)
|
|
||||||
delete blocks[i];
|
|
||||||
}
|
|
||||||
Id getId() const { return functionInstruction.getResultId(); }
|
|
||||||
Id getParamId(int p) { return parameterInstructions[p]->getResultId(); }
|
|
||||||
|
|
||||||
void addBlock(Block* block) { blocks.push_back(block); }
|
|
||||||
void removeBlock(Block* block)
|
|
||||||
{
|
|
||||||
auto found = find(blocks.begin(), blocks.end(), block);
|
|
||||||
assert(found != blocks.end());
|
|
||||||
blocks.erase(found);
|
|
||||||
delete block;
|
|
||||||
}
|
|
||||||
|
|
||||||
Module& getParent() const { return parent; }
|
|
||||||
Block* getEntryBlock() const { return blocks.front(); }
|
|
||||||
Block* getLastBlock() const { return blocks.back(); }
|
|
||||||
const std::vector<Block*>& getBlocks() const { return blocks; }
|
|
||||||
void addLocalVariable(std::unique_ptr<Instruction> inst);
|
|
||||||
Id getReturnType() const { return functionInstruction.getTypeId(); }
|
|
||||||
|
|
||||||
void setImplicitThis() { implicitThis = true; }
|
|
||||||
bool hasImplicitThis() const { return implicitThis; }
|
|
||||||
|
|
||||||
void dump(std::vector<unsigned int>& out) const
|
|
||||||
{
|
|
||||||
// OpFunction
|
|
||||||
functionInstruction.dump(out);
|
|
||||||
|
|
||||||
// OpFunctionParameter
|
|
||||||
for (int p = 0; p < (int)parameterInstructions.size(); ++p)
|
|
||||||
parameterInstructions[p]->dump(out);
|
|
||||||
|
|
||||||
// Blocks
|
|
||||||
inReadableOrder(blocks[0], [&out](const Block* b) { b->dump(out); });
|
|
||||||
Instruction end(0, 0, OpFunctionEnd);
|
|
||||||
end.dump(out);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
Function(const Function&);
|
|
||||||
Function& operator=(Function&);
|
|
||||||
|
|
||||||
Module& parent;
|
|
||||||
Instruction functionInstruction;
|
|
||||||
std::vector<Instruction*> parameterInstructions;
|
|
||||||
std::vector<Block*> blocks;
|
|
||||||
bool implicitThis; // true if this is a member function expecting to be passed a 'this' as the first argument
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// SPIR-V IR Module.
|
|
||||||
//
|
|
||||||
|
|
||||||
class Module {
|
|
||||||
public:
|
|
||||||
Module() {}
|
|
||||||
virtual ~Module()
|
|
||||||
{
|
|
||||||
// TODO delete things
|
|
||||||
}
|
|
||||||
|
|
||||||
void addFunction(Function *fun) { functions.push_back(fun); }
|
|
||||||
|
|
||||||
void mapInstruction(Instruction *instruction)
|
|
||||||
{
|
|
||||||
spv::Id resultId = instruction->getResultId();
|
|
||||||
// map the instruction's result id
|
|
||||||
if (resultId >= idToInstruction.size())
|
|
||||||
idToInstruction.resize(resultId + 16);
|
|
||||||
idToInstruction[resultId] = instruction;
|
|
||||||
}
|
|
||||||
|
|
||||||
Instruction* getInstruction(Id id) const { return idToInstruction[id]; }
|
|
||||||
const std::vector<Function*>& getFunctions() const { return functions; }
|
|
||||||
spv::Id getTypeId(Id resultId) const { return idToInstruction[resultId]->getTypeId(); }
|
|
||||||
StorageClass getStorageClass(Id typeId) const
|
|
||||||
{
|
|
||||||
assert(idToInstruction[typeId]->getOpCode() == spv::OpTypePointer);
|
|
||||||
return (StorageClass)idToInstruction[typeId]->getImmediateOperand(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void dump(std::vector<unsigned int>& out) const
|
|
||||||
{
|
|
||||||
for (int f = 0; f < (int)functions.size(); ++f)
|
|
||||||
functions[f]->dump(out);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
Module(const Module&);
|
|
||||||
std::vector<Function*> functions;
|
|
||||||
|
|
||||||
// map from result id to instruction having that result id
|
|
||||||
std::vector<Instruction*> idToInstruction;
|
|
||||||
|
|
||||||
// map from a result id to its type id
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// Implementation (it's here due to circular type definitions).
|
|
||||||
//
|
|
||||||
|
|
||||||
// Add both
|
|
||||||
// - the OpFunction instruction
|
|
||||||
// - all the OpFunctionParameter instructions
|
|
||||||
__inline Function::Function(Id id, Id resultType, Id functionType, Id firstParamId, Module& parent)
|
|
||||||
: parent(parent), functionInstruction(id, resultType, OpFunction), implicitThis(false)
|
|
||||||
{
|
|
||||||
// OpFunction
|
|
||||||
functionInstruction.addImmediateOperand(FunctionControlMaskNone);
|
|
||||||
functionInstruction.addIdOperand(functionType);
|
|
||||||
parent.mapInstruction(&functionInstruction);
|
|
||||||
parent.addFunction(this);
|
|
||||||
|
|
||||||
// OpFunctionParameter
|
|
||||||
Instruction* typeInst = parent.getInstruction(functionType);
|
|
||||||
int numParams = typeInst->getNumOperands() - 1;
|
|
||||||
for (int p = 0; p < numParams; ++p) {
|
|
||||||
Instruction* param = new Instruction(firstParamId + p, typeInst->getIdOperand(p + 1), OpFunctionParameter);
|
|
||||||
parent.mapInstruction(param);
|
|
||||||
parameterInstructions.push_back(param);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
__inline void Function::addLocalVariable(std::unique_ptr<Instruction> inst)
|
|
||||||
{
|
|
||||||
Instruction* raw_instruction = inst.get();
|
|
||||||
blocks[0]->addLocalVariable(std::move(inst));
|
|
||||||
parent.mapInstruction(raw_instruction);
|
|
||||||
}
|
|
||||||
|
|
||||||
__inline Block::Block(Id id, Function& parent) : parent(parent), unreachable(false)
|
|
||||||
{
|
|
||||||
instructions.push_back(std::unique_ptr<Instruction>(new Instruction(id, NoType, OpLabel)));
|
|
||||||
instructions.back()->setBlock(this);
|
|
||||||
parent.getParent().mapInstruction(instructions.back().get());
|
|
||||||
}
|
|
||||||
|
|
||||||
__inline void Block::addInstruction(std::unique_ptr<Instruction> inst)
|
|
||||||
{
|
|
||||||
Instruction* raw_instruction = inst.get();
|
|
||||||
instructions.push_back(std::move(inst));
|
|
||||||
raw_instruction->setBlock(this);
|
|
||||||
if (raw_instruction->getResultId())
|
|
||||||
parent.getParent().mapInstruction(raw_instruction);
|
|
||||||
}
|
|
||||||
|
|
||||||
}; // end spv namespace
|
|
||||||
|
|
||||||
#endif // spvIR_H
|
|
|
@ -1 +0,0 @@
|
||||||
Subproject commit 2bf91d32b2ce17df9ca6c1e62cf478b24e7d2644
|
|
|
@ -1 +0,0 @@
|
||||||
Subproject commit 27a2bbb865ef638afe4260bf214110425a2b904b
|
|
|
@ -1,76 +0,0 @@
|
||||||
group("third_party")
|
|
||||||
project("spirv-tools")
|
|
||||||
uuid("621512da-bb50-40f2-85ba-ae615ff13e68")
|
|
||||||
kind("StaticLib")
|
|
||||||
language("C++")
|
|
||||||
links({
|
|
||||||
})
|
|
||||||
defines({
|
|
||||||
"_LIB",
|
|
||||||
})
|
|
||||||
includedirs({
|
|
||||||
"spirv-headers/include",
|
|
||||||
"spirv-tools/include",
|
|
||||||
"spirv-tools/source",
|
|
||||||
})
|
|
||||||
files({
|
|
||||||
"spirv-tools/include/spirv-tools/libspirv.h",
|
|
||||||
"spirv-tools/source/val/basic_block.cpp",
|
|
||||||
"spirv-tools/source/val/basic_block.h",
|
|
||||||
"spirv-tools/source/val/construct.cpp",
|
|
||||||
"spirv-tools/source/val/construct.h",
|
|
||||||
"spirv-tools/source/val/function.cpp",
|
|
||||||
"spirv-tools/source/val/function.h",
|
|
||||||
"spirv-tools/source/val/validation_state.cpp",
|
|
||||||
"spirv-tools/source/val/validation_state.h",
|
|
||||||
"spirv-tools/source/util/*.cpp",
|
|
||||||
"spirv-tools/source/util/*.h",
|
|
||||||
"spirv-tools/source/val/*.cpp",
|
|
||||||
"spirv-tools/source/val/*.h",
|
|
||||||
"spirv-tools/source/*.inc",
|
|
||||||
"spirv-tools/source/*.cpp",
|
|
||||||
"spirv-tools/source/*.h",
|
|
||||||
"spirv-tools/source/assembly_grammar.cpp",
|
|
||||||
"spirv-tools/source/assembly_grammar.h",
|
|
||||||
"spirv-tools/source/binary.cpp",
|
|
||||||
"spirv-tools/source/binary.h",
|
|
||||||
"spirv-tools/source/diagnostic.cpp",
|
|
||||||
"spirv-tools/source/diagnostic.h",
|
|
||||||
"spirv-tools/source/disassemble.cpp",
|
|
||||||
"spirv-tools/source/ext_inst.cpp",
|
|
||||||
"spirv-tools/source/ext_inst.h",
|
|
||||||
"spirv-tools/source/instruction.h",
|
|
||||||
"spirv-tools/source/macro.h",
|
|
||||||
"spirv-tools/source/opcode.cpp",
|
|
||||||
"spirv-tools/source/opcode.h",
|
|
||||||
"spirv-tools/source/operand.cpp",
|
|
||||||
"spirv-tools/source/operand.h",
|
|
||||||
"spirv-tools/source/print.cpp",
|
|
||||||
"spirv-tools/source/print.h",
|
|
||||||
-- "spirv-tools/source/software_version.cpp",
|
|
||||||
"spirv-tools/source/spirv_constant.h",
|
|
||||||
"spirv-tools/source/spirv_definition.h",
|
|
||||||
"spirv-tools/source/spirv_endian.cpp",
|
|
||||||
"spirv-tools/source/spirv_endian.h",
|
|
||||||
"spirv-tools/source/spirv_target_env.cpp",
|
|
||||||
"spirv-tools/source/spirv_target_env.h",
|
|
||||||
"spirv-tools/source/table.cpp",
|
|
||||||
"spirv-tools/source/table.h",
|
|
||||||
"spirv-tools/source/text.cpp",
|
|
||||||
"spirv-tools/source/text.h",
|
|
||||||
"spirv-tools/source/text_handler.cpp",
|
|
||||||
"spirv-tools/source/text_handler.h",
|
|
||||||
"spirv-tools/source/validate.cpp",
|
|
||||||
"spirv-tools/source/validate.h",
|
|
||||||
"spirv-tools/source/validate_cfg.cpp",
|
|
||||||
"spirv-tools/source/validate_id.cpp",
|
|
||||||
"spirv-tools/source/validate_instruction.cpp",
|
|
||||||
"spirv-tools/source/validate_layout.cpp",
|
|
||||||
"spirv-tools/source/util/bitutils.h",
|
|
||||||
"spirv-tools/source/util/hex_float.h",
|
|
||||||
})
|
|
||||||
filter("platforms:Windows")
|
|
||||||
buildoptions({
|
|
||||||
"/wd4800", -- Forcing value to bool 'true' or 'false'
|
|
||||||
"/wd4996", -- Call to 'std::equal' with parameters that may be unsafe
|
|
||||||
})
|
|
|
@ -1,131 +0,0 @@
|
||||||
/*
|
|
||||||
** Copyright (c) 2014-2016 The Khronos Group Inc.
|
|
||||||
**
|
|
||||||
** Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
** of this software and/or associated documentation files (the "Materials"),
|
|
||||||
** to deal in the Materials without restriction, including without limitation
|
|
||||||
** the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
||||||
** and/or sell copies of the Materials, and to permit persons to whom the
|
|
||||||
** Materials are furnished to do so, subject to the following conditions:
|
|
||||||
**
|
|
||||||
** The above copyright notice and this permission notice shall be included in
|
|
||||||
** all copies or substantial portions of the Materials.
|
|
||||||
**
|
|
||||||
** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS
|
|
||||||
** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND
|
|
||||||
** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/
|
|
||||||
**
|
|
||||||
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
||||||
** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
** FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS
|
|
||||||
** IN THE MATERIALS.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef GLSLstd450_H
|
|
||||||
#define GLSLstd450_H
|
|
||||||
|
|
||||||
static const int GLSLstd450Version = 100;
|
|
||||||
static const int GLSLstd450Revision = 1;
|
|
||||||
|
|
||||||
enum GLSLstd450 {
|
|
||||||
GLSLstd450Bad = 0, // Don't use
|
|
||||||
|
|
||||||
GLSLstd450Round = 1,
|
|
||||||
GLSLstd450RoundEven = 2,
|
|
||||||
GLSLstd450Trunc = 3,
|
|
||||||
GLSLstd450FAbs = 4,
|
|
||||||
GLSLstd450SAbs = 5,
|
|
||||||
GLSLstd450FSign = 6,
|
|
||||||
GLSLstd450SSign = 7,
|
|
||||||
GLSLstd450Floor = 8,
|
|
||||||
GLSLstd450Ceil = 9,
|
|
||||||
GLSLstd450Fract = 10,
|
|
||||||
|
|
||||||
GLSLstd450Radians = 11,
|
|
||||||
GLSLstd450Degrees = 12,
|
|
||||||
GLSLstd450Sin = 13,
|
|
||||||
GLSLstd450Cos = 14,
|
|
||||||
GLSLstd450Tan = 15,
|
|
||||||
GLSLstd450Asin = 16,
|
|
||||||
GLSLstd450Acos = 17,
|
|
||||||
GLSLstd450Atan = 18,
|
|
||||||
GLSLstd450Sinh = 19,
|
|
||||||
GLSLstd450Cosh = 20,
|
|
||||||
GLSLstd450Tanh = 21,
|
|
||||||
GLSLstd450Asinh = 22,
|
|
||||||
GLSLstd450Acosh = 23,
|
|
||||||
GLSLstd450Atanh = 24,
|
|
||||||
GLSLstd450Atan2 = 25,
|
|
||||||
|
|
||||||
GLSLstd450Pow = 26,
|
|
||||||
GLSLstd450Exp = 27,
|
|
||||||
GLSLstd450Log = 28,
|
|
||||||
GLSLstd450Exp2 = 29,
|
|
||||||
GLSLstd450Log2 = 30,
|
|
||||||
GLSLstd450Sqrt = 31,
|
|
||||||
GLSLstd450InverseSqrt = 32,
|
|
||||||
|
|
||||||
GLSLstd450Determinant = 33,
|
|
||||||
GLSLstd450MatrixInverse = 34,
|
|
||||||
|
|
||||||
GLSLstd450Modf = 35, // second operand needs an OpVariable to write to
|
|
||||||
GLSLstd450ModfStruct = 36, // no OpVariable operand
|
|
||||||
GLSLstd450FMin = 37,
|
|
||||||
GLSLstd450UMin = 38,
|
|
||||||
GLSLstd450SMin = 39,
|
|
||||||
GLSLstd450FMax = 40,
|
|
||||||
GLSLstd450UMax = 41,
|
|
||||||
GLSLstd450SMax = 42,
|
|
||||||
GLSLstd450FClamp = 43,
|
|
||||||
GLSLstd450UClamp = 44,
|
|
||||||
GLSLstd450SClamp = 45,
|
|
||||||
GLSLstd450FMix = 46,
|
|
||||||
GLSLstd450IMix = 47, // Reserved
|
|
||||||
GLSLstd450Step = 48,
|
|
||||||
GLSLstd450SmoothStep = 49,
|
|
||||||
|
|
||||||
GLSLstd450Fma = 50,
|
|
||||||
GLSLstd450Frexp = 51, // second operand needs an OpVariable to write to
|
|
||||||
GLSLstd450FrexpStruct = 52, // no OpVariable operand
|
|
||||||
GLSLstd450Ldexp = 53,
|
|
||||||
|
|
||||||
GLSLstd450PackSnorm4x8 = 54,
|
|
||||||
GLSLstd450PackUnorm4x8 = 55,
|
|
||||||
GLSLstd450PackSnorm2x16 = 56,
|
|
||||||
GLSLstd450PackUnorm2x16 = 57,
|
|
||||||
GLSLstd450PackHalf2x16 = 58,
|
|
||||||
GLSLstd450PackDouble2x32 = 59,
|
|
||||||
GLSLstd450UnpackSnorm2x16 = 60,
|
|
||||||
GLSLstd450UnpackUnorm2x16 = 61,
|
|
||||||
GLSLstd450UnpackHalf2x16 = 62,
|
|
||||||
GLSLstd450UnpackSnorm4x8 = 63,
|
|
||||||
GLSLstd450UnpackUnorm4x8 = 64,
|
|
||||||
GLSLstd450UnpackDouble2x32 = 65,
|
|
||||||
|
|
||||||
GLSLstd450Length = 66,
|
|
||||||
GLSLstd450Distance = 67,
|
|
||||||
GLSLstd450Cross = 68,
|
|
||||||
GLSLstd450Normalize = 69,
|
|
||||||
GLSLstd450FaceForward = 70,
|
|
||||||
GLSLstd450Reflect = 71,
|
|
||||||
GLSLstd450Refract = 72,
|
|
||||||
|
|
||||||
GLSLstd450FindILsb = 73,
|
|
||||||
GLSLstd450FindSMsb = 74,
|
|
||||||
GLSLstd450FindUMsb = 75,
|
|
||||||
|
|
||||||
GLSLstd450InterpolateAtCentroid = 76,
|
|
||||||
GLSLstd450InterpolateAtSample = 77,
|
|
||||||
GLSLstd450InterpolateAtOffset = 78,
|
|
||||||
|
|
||||||
GLSLstd450NMin = 79,
|
|
||||||
GLSLstd450NMax = 80,
|
|
||||||
GLSLstd450NClamp = 81,
|
|
||||||
|
|
||||||
GLSLstd450Count
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // #ifndef GLSLstd450_H
|
|
|
@ -1,135 +0,0 @@
|
||||||
/*
|
|
||||||
** Copyright (c) 2014-2016 The Khronos Group Inc.
|
|
||||||
**
|
|
||||||
** Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
** of this software and/or associated documentation files (the "Materials"),
|
|
||||||
** to deal in the Materials without restriction, including without limitation
|
|
||||||
** the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
||||||
** and/or sell copies of the Materials, and to permit persons to whom the
|
|
||||||
** Materials are furnished to do so, subject to the following conditions:
|
|
||||||
**
|
|
||||||
** The above copyright notice and this permission notice shall be included in
|
|
||||||
** all copies or substantial portions of the Materials.
|
|
||||||
**
|
|
||||||
** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS
|
|
||||||
** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND
|
|
||||||
** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/
|
|
||||||
**
|
|
||||||
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
||||||
** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
** FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS
|
|
||||||
** IN THE MATERIALS.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef GLSLstd450_HPP
|
|
||||||
#define GLSLstd450_HPP
|
|
||||||
|
|
||||||
namespace spv {
|
|
||||||
|
|
||||||
constexpr int GLSLstd450Version = 100;
|
|
||||||
constexpr int GLSLstd450Revision = 1;
|
|
||||||
|
|
||||||
enum class GLSLstd450 {
|
|
||||||
kBad = 0, // Don't use
|
|
||||||
|
|
||||||
kRound = 1,
|
|
||||||
kRoundEven = 2,
|
|
||||||
kTrunc = 3,
|
|
||||||
kFAbs = 4,
|
|
||||||
kSAbs = 5,
|
|
||||||
kFSign = 6,
|
|
||||||
kSSign = 7,
|
|
||||||
kFloor = 8,
|
|
||||||
kCeil = 9,
|
|
||||||
kFract = 10,
|
|
||||||
|
|
||||||
kRadians = 11,
|
|
||||||
kDegrees = 12,
|
|
||||||
kSin = 13,
|
|
||||||
kCos = 14,
|
|
||||||
kTan = 15,
|
|
||||||
kAsin = 16,
|
|
||||||
kAcos = 17,
|
|
||||||
kAtan = 18,
|
|
||||||
kSinh = 19,
|
|
||||||
kCosh = 20,
|
|
||||||
kTanh = 21,
|
|
||||||
kAsinh = 22,
|
|
||||||
kAcosh = 23,
|
|
||||||
kAtanh = 24,
|
|
||||||
kAtan2 = 25,
|
|
||||||
|
|
||||||
kPow = 26,
|
|
||||||
kExp = 27,
|
|
||||||
kLog = 28,
|
|
||||||
kExp2 = 29,
|
|
||||||
kLog2 = 30,
|
|
||||||
kSqrt = 31,
|
|
||||||
kInverseSqrt = 32,
|
|
||||||
|
|
||||||
kDeterminant = 33,
|
|
||||||
kMatrixInverse = 34,
|
|
||||||
|
|
||||||
kModf = 35, // second operand needs an OpVariable to write to
|
|
||||||
kModfStruct = 36, // no OpVariable operand
|
|
||||||
kFMin = 37,
|
|
||||||
kUMin = 38,
|
|
||||||
kSMin = 39,
|
|
||||||
kFMax = 40,
|
|
||||||
kUMax = 41,
|
|
||||||
kSMax = 42,
|
|
||||||
kFClamp = 43,
|
|
||||||
kUClamp = 44,
|
|
||||||
kSClamp = 45,
|
|
||||||
kFMix = 46,
|
|
||||||
kIMix = 47, // Reserved
|
|
||||||
kStep = 48,
|
|
||||||
kSmoothStep = 49,
|
|
||||||
|
|
||||||
kFma = 50,
|
|
||||||
kFrexp = 51, // second operand needs an OpVariable to write to
|
|
||||||
kFrexpStruct = 52, // no OpVariable operand
|
|
||||||
kLdexp = 53,
|
|
||||||
|
|
||||||
kPackSnorm4x8 = 54,
|
|
||||||
kPackUnorm4x8 = 55,
|
|
||||||
kPackSnorm2x16 = 56,
|
|
||||||
kPackUnorm2x16 = 57,
|
|
||||||
kPackHalf2x16 = 58,
|
|
||||||
kPackDouble2x32 = 59,
|
|
||||||
kUnpackSnorm2x16 = 60,
|
|
||||||
kUnpackUnorm2x16 = 61,
|
|
||||||
kUnpackHalf2x16 = 62,
|
|
||||||
kUnpackSnorm4x8 = 63,
|
|
||||||
kUnpackUnorm4x8 = 64,
|
|
||||||
kUnpackDouble2x32 = 65,
|
|
||||||
|
|
||||||
kLength = 66,
|
|
||||||
kDistance = 67,
|
|
||||||
kCross = 68,
|
|
||||||
kNormalize = 69,
|
|
||||||
kFaceForward = 70,
|
|
||||||
kReflect = 71,
|
|
||||||
kRefract = 72,
|
|
||||||
|
|
||||||
kFindILsb = 73,
|
|
||||||
kFindSMsb = 74,
|
|
||||||
kFindUMsb = 75,
|
|
||||||
|
|
||||||
kInterpolateAtCentroid = 76,
|
|
||||||
kInterpolateAtSample = 77,
|
|
||||||
kInterpolateAtOffset = 78,
|
|
||||||
|
|
||||||
kNMin = 79,
|
|
||||||
kNMax = 80,
|
|
||||||
kNClamp = 81,
|
|
||||||
|
|
||||||
kCount
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace spv
|
|
||||||
|
|
||||||
#endif // #ifndef GLSLstd450_HPP
|
|
|
@ -1,272 +0,0 @@
|
||||||
/*
|
|
||||||
** Copyright (c) 2015-2016 The Khronos Group Inc.
|
|
||||||
**
|
|
||||||
** Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
** of this software and/or associated documentation files (the "Materials"),
|
|
||||||
** to deal in the Materials without restriction, including without limitation
|
|
||||||
** the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
||||||
** and/or sell copies of the Materials, and to permit persons to whom the
|
|
||||||
** Materials are furnished to do so, subject to the following conditions:
|
|
||||||
**
|
|
||||||
** The above copyright notice and this permission notice shall be included in
|
|
||||||
** all copies or substantial portions of the Materials.
|
|
||||||
**
|
|
||||||
** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS
|
|
||||||
** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND
|
|
||||||
** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/
|
|
||||||
**
|
|
||||||
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
||||||
** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
** FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS
|
|
||||||
** IN THE MATERIALS.
|
|
||||||
*/
|
|
||||||
|
|
||||||
//
|
|
||||||
// Author: Boaz Ouriel, Intel
|
|
||||||
//
|
|
||||||
|
|
||||||
namespace OpenCLLIB {
|
|
||||||
|
|
||||||
enum Entrypoints {
|
|
||||||
|
|
||||||
// math functions
|
|
||||||
Acos = 0,
|
|
||||||
Acosh = 1,
|
|
||||||
Acospi = 2,
|
|
||||||
Asin = 3,
|
|
||||||
Asinh = 4,
|
|
||||||
Asinpi = 5,
|
|
||||||
Atan = 6,
|
|
||||||
Atan2 = 7,
|
|
||||||
Atanh = 8,
|
|
||||||
Atanpi = 9,
|
|
||||||
Atan2pi = 10,
|
|
||||||
Cbrt = 11,
|
|
||||||
Ceil = 12,
|
|
||||||
Copysign = 13,
|
|
||||||
Cos = 14,
|
|
||||||
Cosh = 15,
|
|
||||||
Cospi = 16,
|
|
||||||
Erfc = 17,
|
|
||||||
Erf = 18,
|
|
||||||
Exp = 19,
|
|
||||||
Exp2 = 20,
|
|
||||||
Exp10 = 21,
|
|
||||||
Expm1 = 22,
|
|
||||||
Fabs = 23,
|
|
||||||
Fdim = 24,
|
|
||||||
Floor = 25,
|
|
||||||
Fma = 26,
|
|
||||||
Fmax = 27,
|
|
||||||
Fmin = 28,
|
|
||||||
Fmod = 29,
|
|
||||||
Fract = 30,
|
|
||||||
Frexp = 31,
|
|
||||||
Hypot = 32,
|
|
||||||
Ilogb = 33,
|
|
||||||
Ldexp = 34,
|
|
||||||
Lgamma = 35,
|
|
||||||
Lgamma_r = 36,
|
|
||||||
Log = 37,
|
|
||||||
Log2 = 38,
|
|
||||||
Log10 = 39,
|
|
||||||
Log1p = 40,
|
|
||||||
Logb = 41,
|
|
||||||
Mad = 42,
|
|
||||||
Maxmag = 43,
|
|
||||||
Minmag = 44,
|
|
||||||
Modf = 45,
|
|
||||||
Nan = 46,
|
|
||||||
Nextafter = 47,
|
|
||||||
Pow = 48,
|
|
||||||
Pown = 49,
|
|
||||||
Powr = 50,
|
|
||||||
Remainder = 51,
|
|
||||||
Remquo = 52,
|
|
||||||
Rint = 53,
|
|
||||||
Rootn = 54,
|
|
||||||
Round = 55,
|
|
||||||
Rsqrt = 56,
|
|
||||||
Sin = 57,
|
|
||||||
Sincos = 58,
|
|
||||||
Sinh = 59,
|
|
||||||
Sinpi = 60,
|
|
||||||
Sqrt = 61,
|
|
||||||
Tan = 62,
|
|
||||||
Tanh = 63,
|
|
||||||
Tanpi = 64,
|
|
||||||
Tgamma = 65,
|
|
||||||
Trunc = 66,
|
|
||||||
Half_cos = 67,
|
|
||||||
Half_divide = 68,
|
|
||||||
Half_exp = 69,
|
|
||||||
Half_exp2 = 70,
|
|
||||||
Half_exp10 = 71,
|
|
||||||
Half_log = 72,
|
|
||||||
Half_log2 = 73,
|
|
||||||
Half_log10 = 74,
|
|
||||||
Half_powr = 75,
|
|
||||||
Half_recip = 76,
|
|
||||||
Half_rsqrt = 77,
|
|
||||||
Half_sin = 78,
|
|
||||||
Half_sqrt = 79,
|
|
||||||
Half_tan = 80,
|
|
||||||
Native_cos = 81,
|
|
||||||
Native_divide = 82,
|
|
||||||
Native_exp = 83,
|
|
||||||
Native_exp2 = 84,
|
|
||||||
Native_exp10 = 85,
|
|
||||||
Native_log = 86,
|
|
||||||
Native_log2 = 87,
|
|
||||||
Native_log10 = 88,
|
|
||||||
Native_powr = 89,
|
|
||||||
Native_recip = 90,
|
|
||||||
Native_rsqrt = 91,
|
|
||||||
Native_sin = 92,
|
|
||||||
Native_sqrt = 93,
|
|
||||||
Native_tan = 94,
|
|
||||||
|
|
||||||
// Common
|
|
||||||
FClamp = 95,
|
|
||||||
Degrees = 96,
|
|
||||||
FMax_common = 97,
|
|
||||||
FMin_common = 98,
|
|
||||||
Mix = 99,
|
|
||||||
Radians = 100,
|
|
||||||
Step = 101,
|
|
||||||
Smoothstep = 102,
|
|
||||||
Sign = 103,
|
|
||||||
|
|
||||||
// Geometrics
|
|
||||||
Cross = 104,
|
|
||||||
Distance = 105,
|
|
||||||
Length = 106,
|
|
||||||
Normalize = 107,
|
|
||||||
Fast_distance = 108,
|
|
||||||
Fast_length = 109,
|
|
||||||
Fast_normalize = 110,
|
|
||||||
|
|
||||||
// Images - Deprecated
|
|
||||||
Read_imagef = 111,
|
|
||||||
Read_imagei = 112,
|
|
||||||
Read_imageui = 113,
|
|
||||||
Read_imageh = 114,
|
|
||||||
|
|
||||||
Read_imagef_samplerless = 115,
|
|
||||||
Read_imagei_samplerless = 116,
|
|
||||||
Read_imageui_samplerless = 117,
|
|
||||||
Read_imageh_samplerless = 118,
|
|
||||||
|
|
||||||
Write_imagef = 119,
|
|
||||||
Write_imagei = 120,
|
|
||||||
Write_imageui = 121,
|
|
||||||
Write_imageh = 122,
|
|
||||||
Read_imagef_mipmap_lod = 123,
|
|
||||||
Read_imagei_mipmap_lod = 124,
|
|
||||||
Read_imageui_mipmap_lod = 125,
|
|
||||||
Read_imagef_mipmap_grad = 126,
|
|
||||||
Read_imagei_mipmap_grad = 127,
|
|
||||||
Read_imageui_mipmap_grad = 128,
|
|
||||||
|
|
||||||
// Image write with LOD
|
|
||||||
Write_imagef_mipmap_lod = 129,
|
|
||||||
Write_imagei_mipmap_lod = 130,
|
|
||||||
Write_imageui_mipmap_lod = 131,
|
|
||||||
|
|
||||||
// Images - Deprecated
|
|
||||||
Get_image_width = 132,
|
|
||||||
Get_image_height = 133,
|
|
||||||
Get_image_depth = 134,
|
|
||||||
Get_image_channel_data_type = 135,
|
|
||||||
Get_image_channel_order = 136,
|
|
||||||
Get_image_dim = 137,
|
|
||||||
Get_image_array_size = 138,
|
|
||||||
Get_image_num_samples = 139,
|
|
||||||
Get_image_num_mip_levels = 140,
|
|
||||||
|
|
||||||
// Integers
|
|
||||||
SAbs = 141,
|
|
||||||
SAbs_diff = 142,
|
|
||||||
SAdd_sat = 143,
|
|
||||||
UAdd_sat = 144,
|
|
||||||
SHadd = 145,
|
|
||||||
UHadd = 146,
|
|
||||||
SRhadd = 147,
|
|
||||||
URhadd = 148,
|
|
||||||
SClamp = 149,
|
|
||||||
UClamp = 150,
|
|
||||||
Clz = 151,
|
|
||||||
Ctz = 152,
|
|
||||||
SMad_hi = 153,
|
|
||||||
UMad_sat = 154,
|
|
||||||
SMad_sat = 155,
|
|
||||||
SMax = 156,
|
|
||||||
UMax = 157,
|
|
||||||
SMin = 158,
|
|
||||||
UMin = 159,
|
|
||||||
SMul_hi = 160,
|
|
||||||
Rotate = 161,
|
|
||||||
SSub_sat = 162,
|
|
||||||
USub_sat = 163,
|
|
||||||
U_Upsample = 164,
|
|
||||||
S_Upsample = 165,
|
|
||||||
Popcount = 166,
|
|
||||||
SMad24 = 167,
|
|
||||||
UMad24 = 168,
|
|
||||||
SMul24 = 169,
|
|
||||||
UMul24 = 170,
|
|
||||||
|
|
||||||
// Vector Loads/Stores
|
|
||||||
Vloadn = 171,
|
|
||||||
Vstoren = 172,
|
|
||||||
Vload_half = 173,
|
|
||||||
Vload_halfn = 174,
|
|
||||||
Vstore_half = 175,
|
|
||||||
Vstore_half_r = 176,
|
|
||||||
Vstore_halfn = 177,
|
|
||||||
Vstore_halfn_r = 178,
|
|
||||||
Vloada_halfn = 179,
|
|
||||||
Vstorea_halfn = 180,
|
|
||||||
Vstorea_halfn_r = 181,
|
|
||||||
|
|
||||||
// Vector Misc
|
|
||||||
Shuffle = 182,
|
|
||||||
Shuffle2 = 183,
|
|
||||||
|
|
||||||
//
|
|
||||||
Printf = 184,
|
|
||||||
Prefetch = 185,
|
|
||||||
|
|
||||||
// Relationals
|
|
||||||
Bitselect = 186,
|
|
||||||
Select = 187,
|
|
||||||
|
|
||||||
// pipes
|
|
||||||
Read_pipe = 188,
|
|
||||||
Write_pipe = 189,
|
|
||||||
Reserve_read_pipe = 190,
|
|
||||||
Reserve_write_pipe = 191,
|
|
||||||
Commit_read_pipe = 192,
|
|
||||||
Commit_write_pipe = 193,
|
|
||||||
Is_valid_reserve_id = 194,
|
|
||||||
Work_group_reserve_read_pipe = 195,
|
|
||||||
Work_group_reserve_write_pipe = 196,
|
|
||||||
Work_group_commit_read_pipe = 197,
|
|
||||||
Work_group_commit_write_pipe = 198,
|
|
||||||
Get_pipe_num_packets = 199,
|
|
||||||
Get_pipe_max_packets = 200,
|
|
||||||
|
|
||||||
// more integers
|
|
||||||
UAbs = 201,
|
|
||||||
UAbs_diff = 202,
|
|
||||||
UMul_hi = 203,
|
|
||||||
UMad_hi = 204,
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}; // end namespace OpenCL20
|
|
||||||
|
|
|
@ -1,871 +0,0 @@
|
||||||
/*
|
|
||||||
** Copyright (c) 2014-2016 The Khronos Group Inc.
|
|
||||||
**
|
|
||||||
** Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
** of this software and/or associated documentation files (the "Materials"),
|
|
||||||
** to deal in the Materials without restriction, including without limitation
|
|
||||||
** the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
||||||
** and/or sell copies of the Materials, and to permit persons to whom the
|
|
||||||
** Materials are furnished to do so, subject to the following conditions:
|
|
||||||
**
|
|
||||||
** The above copyright notice and this permission notice shall be included in
|
|
||||||
** all copies or substantial portions of the Materials.
|
|
||||||
**
|
|
||||||
** MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS
|
|
||||||
** STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND
|
|
||||||
** HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/
|
|
||||||
**
|
|
||||||
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
||||||
** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
** FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS
|
|
||||||
** IN THE MATERIALS.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
** This header is automatically generated by the same tool that creates
|
|
||||||
** the Binary Section of the SPIR-V specification.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
** Enumeration tokens for SPIR-V, in various styles:
|
|
||||||
** C, C++, C++11, JSON, Lua, Python
|
|
||||||
**
|
|
||||||
** - C will have tokens with a "Spv" prefix, e.g.: SpvSourceLanguageGLSL
|
|
||||||
** - C++ will have tokens in the "spv" name space, e.g.: spv::SourceLanguageGLSL
|
|
||||||
** - C++11 will use enum classes in the spv namespace, e.g.: spv::SourceLanguage::GLSL
|
|
||||||
** - Lua will use tables, e.g.: spv.SourceLanguage.GLSL
|
|
||||||
** - Python will use dictionaries, e.g.: spv['SourceLanguage']['GLSL']
|
|
||||||
**
|
|
||||||
** Some tokens act like mask values, which can be OR'd together,
|
|
||||||
** while others are mutually exclusive. The mask-like ones have
|
|
||||||
** "Mask" in their name, and a parallel enum that has the shift
|
|
||||||
** amount (1 << x) for each corresponding enumerant.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef spirv_H
|
|
||||||
#define spirv_H
|
|
||||||
|
|
||||||
typedef unsigned int SpvId;
|
|
||||||
|
|
||||||
#define SPV_VERSION 0x10000
|
|
||||||
#define SPV_REVISION 3
|
|
||||||
|
|
||||||
static const unsigned int SpvMagicNumber = 0x07230203;
|
|
||||||
static const unsigned int SpvVersion = 0x00010000;
|
|
||||||
static const unsigned int SpvRevision = 3;
|
|
||||||
static const unsigned int SpvOpCodeMask = 0xffff;
|
|
||||||
static const unsigned int SpvWordCountShift = 16;
|
|
||||||
|
|
||||||
typedef enum SpvSourceLanguage_ {
|
|
||||||
SpvSourceLanguageUnknown = 0,
|
|
||||||
SpvSourceLanguageESSL = 1,
|
|
||||||
SpvSourceLanguageGLSL = 2,
|
|
||||||
SpvSourceLanguageOpenCL_C = 3,
|
|
||||||
SpvSourceLanguageOpenCL_CPP = 4,
|
|
||||||
} SpvSourceLanguage;
|
|
||||||
|
|
||||||
typedef enum SpvExecutionModel_ {
|
|
||||||
SpvExecutionModelVertex = 0,
|
|
||||||
SpvExecutionModelTessellationControl = 1,
|
|
||||||
SpvExecutionModelTessellationEvaluation = 2,
|
|
||||||
SpvExecutionModelGeometry = 3,
|
|
||||||
SpvExecutionModelFragment = 4,
|
|
||||||
SpvExecutionModelGLCompute = 5,
|
|
||||||
SpvExecutionModelKernel = 6,
|
|
||||||
} SpvExecutionModel;
|
|
||||||
|
|
||||||
typedef enum SpvAddressingModel_ {
|
|
||||||
SpvAddressingModelLogical = 0,
|
|
||||||
SpvAddressingModelPhysical32 = 1,
|
|
||||||
SpvAddressingModelPhysical64 = 2,
|
|
||||||
} SpvAddressingModel;
|
|
||||||
|
|
||||||
typedef enum SpvMemoryModel_ {
|
|
||||||
SpvMemoryModelSimple = 0,
|
|
||||||
SpvMemoryModelGLSL450 = 1,
|
|
||||||
SpvMemoryModelOpenCL = 2,
|
|
||||||
} SpvMemoryModel;
|
|
||||||
|
|
||||||
typedef enum SpvExecutionMode_ {
|
|
||||||
SpvExecutionModeInvocations = 0,
|
|
||||||
SpvExecutionModeSpacingEqual = 1,
|
|
||||||
SpvExecutionModeSpacingFractionalEven = 2,
|
|
||||||
SpvExecutionModeSpacingFractionalOdd = 3,
|
|
||||||
SpvExecutionModeVertexOrderCw = 4,
|
|
||||||
SpvExecutionModeVertexOrderCcw = 5,
|
|
||||||
SpvExecutionModePixelCenterInteger = 6,
|
|
||||||
SpvExecutionModeOriginUpperLeft = 7,
|
|
||||||
SpvExecutionModeOriginLowerLeft = 8,
|
|
||||||
SpvExecutionModeEarlyFragmentTests = 9,
|
|
||||||
SpvExecutionModePointMode = 10,
|
|
||||||
SpvExecutionModeXfb = 11,
|
|
||||||
SpvExecutionModeDepthReplacing = 12,
|
|
||||||
SpvExecutionModeDepthGreater = 14,
|
|
||||||
SpvExecutionModeDepthLess = 15,
|
|
||||||
SpvExecutionModeDepthUnchanged = 16,
|
|
||||||
SpvExecutionModeLocalSize = 17,
|
|
||||||
SpvExecutionModeLocalSizeHint = 18,
|
|
||||||
SpvExecutionModeInputPoints = 19,
|
|
||||||
SpvExecutionModeInputLines = 20,
|
|
||||||
SpvExecutionModeInputLinesAdjacency = 21,
|
|
||||||
SpvExecutionModeTriangles = 22,
|
|
||||||
SpvExecutionModeInputTrianglesAdjacency = 23,
|
|
||||||
SpvExecutionModeQuads = 24,
|
|
||||||
SpvExecutionModeIsolines = 25,
|
|
||||||
SpvExecutionModeOutputVertices = 26,
|
|
||||||
SpvExecutionModeOutputPoints = 27,
|
|
||||||
SpvExecutionModeOutputLineStrip = 28,
|
|
||||||
SpvExecutionModeOutputTriangleStrip = 29,
|
|
||||||
SpvExecutionModeVecTypeHint = 30,
|
|
||||||
SpvExecutionModeContractionOff = 31,
|
|
||||||
} SpvExecutionMode;
|
|
||||||
|
|
||||||
typedef enum SpvStorageClass_ {
|
|
||||||
SpvStorageClassUniformConstant = 0,
|
|
||||||
SpvStorageClassInput = 1,
|
|
||||||
SpvStorageClassUniform = 2,
|
|
||||||
SpvStorageClassOutput = 3,
|
|
||||||
SpvStorageClassWorkgroup = 4,
|
|
||||||
SpvStorageClassCrossWorkgroup = 5,
|
|
||||||
SpvStorageClassPrivate = 6,
|
|
||||||
SpvStorageClassFunction = 7,
|
|
||||||
SpvStorageClassGeneric = 8,
|
|
||||||
SpvStorageClassPushConstant = 9,
|
|
||||||
SpvStorageClassAtomicCounter = 10,
|
|
||||||
SpvStorageClassImage = 11,
|
|
||||||
} SpvStorageClass;
|
|
||||||
|
|
||||||
typedef enum SpvDim_ {
|
|
||||||
SpvDim1D = 0,
|
|
||||||
SpvDim2D = 1,
|
|
||||||
SpvDim3D = 2,
|
|
||||||
SpvDimCube = 3,
|
|
||||||
SpvDimRect = 4,
|
|
||||||
SpvDimBuffer = 5,
|
|
||||||
SpvDimSubpassData = 6,
|
|
||||||
} SpvDim;
|
|
||||||
|
|
||||||
typedef enum SpvSamplerAddressingMode_ {
|
|
||||||
SpvSamplerAddressingModeNone = 0,
|
|
||||||
SpvSamplerAddressingModeClampToEdge = 1,
|
|
||||||
SpvSamplerAddressingModeClamp = 2,
|
|
||||||
SpvSamplerAddressingModeRepeat = 3,
|
|
||||||
SpvSamplerAddressingModeRepeatMirrored = 4,
|
|
||||||
} SpvSamplerAddressingMode;
|
|
||||||
|
|
||||||
typedef enum SpvSamplerFilterMode_ {
|
|
||||||
SpvSamplerFilterModeNearest = 0,
|
|
||||||
SpvSamplerFilterModeLinear = 1,
|
|
||||||
} SpvSamplerFilterMode;
|
|
||||||
|
|
||||||
typedef enum SpvImageFormat_ {
|
|
||||||
SpvImageFormatUnknown = 0,
|
|
||||||
SpvImageFormatRgba32f = 1,
|
|
||||||
SpvImageFormatRgba16f = 2,
|
|
||||||
SpvImageFormatR32f = 3,
|
|
||||||
SpvImageFormatRgba8 = 4,
|
|
||||||
SpvImageFormatRgba8Snorm = 5,
|
|
||||||
SpvImageFormatRg32f = 6,
|
|
||||||
SpvImageFormatRg16f = 7,
|
|
||||||
SpvImageFormatR11fG11fB10f = 8,
|
|
||||||
SpvImageFormatR16f = 9,
|
|
||||||
SpvImageFormatRgba16 = 10,
|
|
||||||
SpvImageFormatRgb10A2 = 11,
|
|
||||||
SpvImageFormatRg16 = 12,
|
|
||||||
SpvImageFormatRg8 = 13,
|
|
||||||
SpvImageFormatR16 = 14,
|
|
||||||
SpvImageFormatR8 = 15,
|
|
||||||
SpvImageFormatRgba16Snorm = 16,
|
|
||||||
SpvImageFormatRg16Snorm = 17,
|
|
||||||
SpvImageFormatRg8Snorm = 18,
|
|
||||||
SpvImageFormatR16Snorm = 19,
|
|
||||||
SpvImageFormatR8Snorm = 20,
|
|
||||||
SpvImageFormatRgba32i = 21,
|
|
||||||
SpvImageFormatRgba16i = 22,
|
|
||||||
SpvImageFormatRgba8i = 23,
|
|
||||||
SpvImageFormatR32i = 24,
|
|
||||||
SpvImageFormatRg32i = 25,
|
|
||||||
SpvImageFormatRg16i = 26,
|
|
||||||
SpvImageFormatRg8i = 27,
|
|
||||||
SpvImageFormatR16i = 28,
|
|
||||||
SpvImageFormatR8i = 29,
|
|
||||||
SpvImageFormatRgba32ui = 30,
|
|
||||||
SpvImageFormatRgba16ui = 31,
|
|
||||||
SpvImageFormatRgba8ui = 32,
|
|
||||||
SpvImageFormatR32ui = 33,
|
|
||||||
SpvImageFormatRgb10a2ui = 34,
|
|
||||||
SpvImageFormatRg32ui = 35,
|
|
||||||
SpvImageFormatRg16ui = 36,
|
|
||||||
SpvImageFormatRg8ui = 37,
|
|
||||||
SpvImageFormatR16ui = 38,
|
|
||||||
SpvImageFormatR8ui = 39,
|
|
||||||
} SpvImageFormat;
|
|
||||||
|
|
||||||
typedef enum SpvImageChannelOrder_ {
|
|
||||||
SpvImageChannelOrderR = 0,
|
|
||||||
SpvImageChannelOrderA = 1,
|
|
||||||
SpvImageChannelOrderRG = 2,
|
|
||||||
SpvImageChannelOrderRA = 3,
|
|
||||||
SpvImageChannelOrderRGB = 4,
|
|
||||||
SpvImageChannelOrderRGBA = 5,
|
|
||||||
SpvImageChannelOrderBGRA = 6,
|
|
||||||
SpvImageChannelOrderARGB = 7,
|
|
||||||
SpvImageChannelOrderIntensity = 8,
|
|
||||||
SpvImageChannelOrderLuminance = 9,
|
|
||||||
SpvImageChannelOrderRx = 10,
|
|
||||||
SpvImageChannelOrderRGx = 11,
|
|
||||||
SpvImageChannelOrderRGBx = 12,
|
|
||||||
SpvImageChannelOrderDepth = 13,
|
|
||||||
SpvImageChannelOrderDepthStencil = 14,
|
|
||||||
SpvImageChannelOrdersRGB = 15,
|
|
||||||
SpvImageChannelOrdersRGBx = 16,
|
|
||||||
SpvImageChannelOrdersRGBA = 17,
|
|
||||||
SpvImageChannelOrdersBGRA = 18,
|
|
||||||
} SpvImageChannelOrder;
|
|
||||||
|
|
||||||
typedef enum SpvImageChannelDataType_ {
|
|
||||||
SpvImageChannelDataTypeSnormInt8 = 0,
|
|
||||||
SpvImageChannelDataTypeSnormInt16 = 1,
|
|
||||||
SpvImageChannelDataTypeUnormInt8 = 2,
|
|
||||||
SpvImageChannelDataTypeUnormInt16 = 3,
|
|
||||||
SpvImageChannelDataTypeUnormShort565 = 4,
|
|
||||||
SpvImageChannelDataTypeUnormShort555 = 5,
|
|
||||||
SpvImageChannelDataTypeUnormInt101010 = 6,
|
|
||||||
SpvImageChannelDataTypeSignedInt8 = 7,
|
|
||||||
SpvImageChannelDataTypeSignedInt16 = 8,
|
|
||||||
SpvImageChannelDataTypeSignedInt32 = 9,
|
|
||||||
SpvImageChannelDataTypeUnsignedInt8 = 10,
|
|
||||||
SpvImageChannelDataTypeUnsignedInt16 = 11,
|
|
||||||
SpvImageChannelDataTypeUnsignedInt32 = 12,
|
|
||||||
SpvImageChannelDataTypeHalfFloat = 13,
|
|
||||||
SpvImageChannelDataTypeFloat = 14,
|
|
||||||
SpvImageChannelDataTypeUnormInt24 = 15,
|
|
||||||
SpvImageChannelDataTypeUnormInt101010_2 = 16,
|
|
||||||
} SpvImageChannelDataType;
|
|
||||||
|
|
||||||
typedef enum SpvImageOperandsShift_ {
|
|
||||||
SpvImageOperandsBiasShift = 0,
|
|
||||||
SpvImageOperandsLodShift = 1,
|
|
||||||
SpvImageOperandsGradShift = 2,
|
|
||||||
SpvImageOperandsConstOffsetShift = 3,
|
|
||||||
SpvImageOperandsOffsetShift = 4,
|
|
||||||
SpvImageOperandsConstOffsetsShift = 5,
|
|
||||||
SpvImageOperandsSampleShift = 6,
|
|
||||||
SpvImageOperandsMinLodShift = 7,
|
|
||||||
} SpvImageOperandsShift;
|
|
||||||
|
|
||||||
typedef enum SpvImageOperandsMask_ {
|
|
||||||
SpvImageOperandsMaskNone = 0,
|
|
||||||
SpvImageOperandsBiasMask = 0x00000001,
|
|
||||||
SpvImageOperandsLodMask = 0x00000002,
|
|
||||||
SpvImageOperandsGradMask = 0x00000004,
|
|
||||||
SpvImageOperandsConstOffsetMask = 0x00000008,
|
|
||||||
SpvImageOperandsOffsetMask = 0x00000010,
|
|
||||||
SpvImageOperandsConstOffsetsMask = 0x00000020,
|
|
||||||
SpvImageOperandsSampleMask = 0x00000040,
|
|
||||||
SpvImageOperandsMinLodMask = 0x00000080,
|
|
||||||
} SpvImageOperandsMask;
|
|
||||||
|
|
||||||
typedef enum SpvFPFastMathModeShift_ {
|
|
||||||
SpvFPFastMathModeNotNaNShift = 0,
|
|
||||||
SpvFPFastMathModeNotInfShift = 1,
|
|
||||||
SpvFPFastMathModeNSZShift = 2,
|
|
||||||
SpvFPFastMathModeAllowRecipShift = 3,
|
|
||||||
SpvFPFastMathModeFastShift = 4,
|
|
||||||
} SpvFPFastMathModeShift;
|
|
||||||
|
|
||||||
typedef enum SpvFPFastMathModeMask_ {
|
|
||||||
SpvFPFastMathModeMaskNone = 0,
|
|
||||||
SpvFPFastMathModeNotNaNMask = 0x00000001,
|
|
||||||
SpvFPFastMathModeNotInfMask = 0x00000002,
|
|
||||||
SpvFPFastMathModeNSZMask = 0x00000004,
|
|
||||||
SpvFPFastMathModeAllowRecipMask = 0x00000008,
|
|
||||||
SpvFPFastMathModeFastMask = 0x00000010,
|
|
||||||
} SpvFPFastMathModeMask;
|
|
||||||
|
|
||||||
typedef enum SpvFPRoundingMode_ {
|
|
||||||
SpvFPRoundingModeRTE = 0,
|
|
||||||
SpvFPRoundingModeRTZ = 1,
|
|
||||||
SpvFPRoundingModeRTP = 2,
|
|
||||||
SpvFPRoundingModeRTN = 3,
|
|
||||||
} SpvFPRoundingMode;
|
|
||||||
|
|
||||||
typedef enum SpvLinkageType_ {
|
|
||||||
SpvLinkageTypeExport = 0,
|
|
||||||
SpvLinkageTypeImport = 1,
|
|
||||||
} SpvLinkageType;
|
|
||||||
|
|
||||||
typedef enum SpvAccessQualifier_ {
|
|
||||||
SpvAccessQualifierReadOnly = 0,
|
|
||||||
SpvAccessQualifierWriteOnly = 1,
|
|
||||||
SpvAccessQualifierReadWrite = 2,
|
|
||||||
} SpvAccessQualifier;
|
|
||||||
|
|
||||||
typedef enum SpvFunctionParameterAttribute_ {
|
|
||||||
SpvFunctionParameterAttributeZext = 0,
|
|
||||||
SpvFunctionParameterAttributeSext = 1,
|
|
||||||
SpvFunctionParameterAttributeByVal = 2,
|
|
||||||
SpvFunctionParameterAttributeSret = 3,
|
|
||||||
SpvFunctionParameterAttributeNoAlias = 4,
|
|
||||||
SpvFunctionParameterAttributeNoCapture = 5,
|
|
||||||
SpvFunctionParameterAttributeNoWrite = 6,
|
|
||||||
SpvFunctionParameterAttributeNoReadWrite = 7,
|
|
||||||
} SpvFunctionParameterAttribute;
|
|
||||||
|
|
||||||
typedef enum SpvDecoration_ {
|
|
||||||
SpvDecorationRelaxedPrecision = 0,
|
|
||||||
SpvDecorationSpecId = 1,
|
|
||||||
SpvDecorationBlock = 2,
|
|
||||||
SpvDecorationBufferBlock = 3,
|
|
||||||
SpvDecorationRowMajor = 4,
|
|
||||||
SpvDecorationColMajor = 5,
|
|
||||||
SpvDecorationArrayStride = 6,
|
|
||||||
SpvDecorationMatrixStride = 7,
|
|
||||||
SpvDecorationGLSLShared = 8,
|
|
||||||
SpvDecorationGLSLPacked = 9,
|
|
||||||
SpvDecorationCPacked = 10,
|
|
||||||
SpvDecorationBuiltIn = 11,
|
|
||||||
SpvDecorationNoPerspective = 13,
|
|
||||||
SpvDecorationFlat = 14,
|
|
||||||
SpvDecorationPatch = 15,
|
|
||||||
SpvDecorationCentroid = 16,
|
|
||||||
SpvDecorationSample = 17,
|
|
||||||
SpvDecorationInvariant = 18,
|
|
||||||
SpvDecorationRestrict = 19,
|
|
||||||
SpvDecorationAliased = 20,
|
|
||||||
SpvDecorationVolatile = 21,
|
|
||||||
SpvDecorationConstant = 22,
|
|
||||||
SpvDecorationCoherent = 23,
|
|
||||||
SpvDecorationNonWritable = 24,
|
|
||||||
SpvDecorationNonReadable = 25,
|
|
||||||
SpvDecorationUniform = 26,
|
|
||||||
SpvDecorationSaturatedConversion = 28,
|
|
||||||
SpvDecorationStream = 29,
|
|
||||||
SpvDecorationLocation = 30,
|
|
||||||
SpvDecorationComponent = 31,
|
|
||||||
SpvDecorationIndex = 32,
|
|
||||||
SpvDecorationBinding = 33,
|
|
||||||
SpvDecorationDescriptorSet = 34,
|
|
||||||
SpvDecorationOffset = 35,
|
|
||||||
SpvDecorationXfbBuffer = 36,
|
|
||||||
SpvDecorationXfbStride = 37,
|
|
||||||
SpvDecorationFuncParamAttr = 38,
|
|
||||||
SpvDecorationFPRoundingMode = 39,
|
|
||||||
SpvDecorationFPFastMathMode = 40,
|
|
||||||
SpvDecorationLinkageAttributes = 41,
|
|
||||||
SpvDecorationNoContraction = 42,
|
|
||||||
SpvDecorationInputAttachmentIndex = 43,
|
|
||||||
SpvDecorationAlignment = 44,
|
|
||||||
} SpvDecoration;
|
|
||||||
|
|
||||||
typedef enum SpvBuiltIn_ {
|
|
||||||
SpvBuiltInPosition = 0,
|
|
||||||
SpvBuiltInPointSize = 1,
|
|
||||||
SpvBuiltInClipDistance = 3,
|
|
||||||
SpvBuiltInCullDistance = 4,
|
|
||||||
SpvBuiltInVertexId = 5,
|
|
||||||
SpvBuiltInInstanceId = 6,
|
|
||||||
SpvBuiltInPrimitiveId = 7,
|
|
||||||
SpvBuiltInInvocationId = 8,
|
|
||||||
SpvBuiltInLayer = 9,
|
|
||||||
SpvBuiltInViewportIndex = 10,
|
|
||||||
SpvBuiltInTessLevelOuter = 11,
|
|
||||||
SpvBuiltInTessLevelInner = 12,
|
|
||||||
SpvBuiltInTessCoord = 13,
|
|
||||||
SpvBuiltInPatchVertices = 14,
|
|
||||||
SpvBuiltInFragCoord = 15,
|
|
||||||
SpvBuiltInPointCoord = 16,
|
|
||||||
SpvBuiltInFrontFacing = 17,
|
|
||||||
SpvBuiltInSampleId = 18,
|
|
||||||
SpvBuiltInSamplePosition = 19,
|
|
||||||
SpvBuiltInSampleMask = 20,
|
|
||||||
SpvBuiltInFragDepth = 22,
|
|
||||||
SpvBuiltInHelperInvocation = 23,
|
|
||||||
SpvBuiltInNumWorkgroups = 24,
|
|
||||||
SpvBuiltInWorkgroupSize = 25,
|
|
||||||
SpvBuiltInWorkgroupId = 26,
|
|
||||||
SpvBuiltInLocalInvocationId = 27,
|
|
||||||
SpvBuiltInGlobalInvocationId = 28,
|
|
||||||
SpvBuiltInLocalInvocationIndex = 29,
|
|
||||||
SpvBuiltInWorkDim = 30,
|
|
||||||
SpvBuiltInGlobalSize = 31,
|
|
||||||
SpvBuiltInEnqueuedWorkgroupSize = 32,
|
|
||||||
SpvBuiltInGlobalOffset = 33,
|
|
||||||
SpvBuiltInGlobalLinearId = 34,
|
|
||||||
SpvBuiltInSubgroupSize = 36,
|
|
||||||
SpvBuiltInSubgroupMaxSize = 37,
|
|
||||||
SpvBuiltInNumSubgroups = 38,
|
|
||||||
SpvBuiltInNumEnqueuedSubgroups = 39,
|
|
||||||
SpvBuiltInSubgroupId = 40,
|
|
||||||
SpvBuiltInSubgroupLocalInvocationId = 41,
|
|
||||||
SpvBuiltInVertexIndex = 42,
|
|
||||||
SpvBuiltInInstanceIndex = 43,
|
|
||||||
} SpvBuiltIn;
|
|
||||||
|
|
||||||
typedef enum SpvSelectionControlShift_ {
|
|
||||||
SpvSelectionControlFlattenShift = 0,
|
|
||||||
SpvSelectionControlDontFlattenShift = 1,
|
|
||||||
} SpvSelectionControlShift;
|
|
||||||
|
|
||||||
typedef enum SpvSelectionControlMask_ {
|
|
||||||
SpvSelectionControlMaskNone = 0,
|
|
||||||
SpvSelectionControlFlattenMask = 0x00000001,
|
|
||||||
SpvSelectionControlDontFlattenMask = 0x00000002,
|
|
||||||
} SpvSelectionControlMask;
|
|
||||||
|
|
||||||
typedef enum SpvLoopControlShift_ {
|
|
||||||
SpvLoopControlUnrollShift = 0,
|
|
||||||
SpvLoopControlDontUnrollShift = 1,
|
|
||||||
} SpvLoopControlShift;
|
|
||||||
|
|
||||||
typedef enum SpvLoopControlMask_ {
|
|
||||||
SpvLoopControlMaskNone = 0,
|
|
||||||
SpvLoopControlUnrollMask = 0x00000001,
|
|
||||||
SpvLoopControlDontUnrollMask = 0x00000002,
|
|
||||||
} SpvLoopControlMask;
|
|
||||||
|
|
||||||
typedef enum SpvFunctionControlShift_ {
|
|
||||||
SpvFunctionControlInlineShift = 0,
|
|
||||||
SpvFunctionControlDontInlineShift = 1,
|
|
||||||
SpvFunctionControlPureShift = 2,
|
|
||||||
SpvFunctionControlConstShift = 3,
|
|
||||||
} SpvFunctionControlShift;
|
|
||||||
|
|
||||||
typedef enum SpvFunctionControlMask_ {
|
|
||||||
SpvFunctionControlMaskNone = 0,
|
|
||||||
SpvFunctionControlInlineMask = 0x00000001,
|
|
||||||
SpvFunctionControlDontInlineMask = 0x00000002,
|
|
||||||
SpvFunctionControlPureMask = 0x00000004,
|
|
||||||
SpvFunctionControlConstMask = 0x00000008,
|
|
||||||
} SpvFunctionControlMask;
|
|
||||||
|
|
||||||
typedef enum SpvMemorySemanticsShift_ {
|
|
||||||
SpvMemorySemanticsAcquireShift = 1,
|
|
||||||
SpvMemorySemanticsReleaseShift = 2,
|
|
||||||
SpvMemorySemanticsAcquireReleaseShift = 3,
|
|
||||||
SpvMemorySemanticsSequentiallyConsistentShift = 4,
|
|
||||||
SpvMemorySemanticsUniformMemoryShift = 6,
|
|
||||||
SpvMemorySemanticsSubgroupMemoryShift = 7,
|
|
||||||
SpvMemorySemanticsWorkgroupMemoryShift = 8,
|
|
||||||
SpvMemorySemanticsCrossWorkgroupMemoryShift = 9,
|
|
||||||
SpvMemorySemanticsAtomicCounterMemoryShift = 10,
|
|
||||||
SpvMemorySemanticsImageMemoryShift = 11,
|
|
||||||
} SpvMemorySemanticsShift;
|
|
||||||
|
|
||||||
typedef enum SpvMemorySemanticsMask_ {
|
|
||||||
SpvMemorySemanticsMaskNone = 0,
|
|
||||||
SpvMemorySemanticsAcquireMask = 0x00000002,
|
|
||||||
SpvMemorySemanticsReleaseMask = 0x00000004,
|
|
||||||
SpvMemorySemanticsAcquireReleaseMask = 0x00000008,
|
|
||||||
SpvMemorySemanticsSequentiallyConsistentMask = 0x00000010,
|
|
||||||
SpvMemorySemanticsUniformMemoryMask = 0x00000040,
|
|
||||||
SpvMemorySemanticsSubgroupMemoryMask = 0x00000080,
|
|
||||||
SpvMemorySemanticsWorkgroupMemoryMask = 0x00000100,
|
|
||||||
SpvMemorySemanticsCrossWorkgroupMemoryMask = 0x00000200,
|
|
||||||
SpvMemorySemanticsAtomicCounterMemoryMask = 0x00000400,
|
|
||||||
SpvMemorySemanticsImageMemoryMask = 0x00000800,
|
|
||||||
} SpvMemorySemanticsMask;
|
|
||||||
|
|
||||||
typedef enum SpvMemoryAccessShift_ {
|
|
||||||
SpvMemoryAccessVolatileShift = 0,
|
|
||||||
SpvMemoryAccessAlignedShift = 1,
|
|
||||||
SpvMemoryAccessNontemporalShift = 2,
|
|
||||||
} SpvMemoryAccessShift;
|
|
||||||
|
|
||||||
typedef enum SpvMemoryAccessMask_ {
|
|
||||||
SpvMemoryAccessMaskNone = 0,
|
|
||||||
SpvMemoryAccessVolatileMask = 0x00000001,
|
|
||||||
SpvMemoryAccessAlignedMask = 0x00000002,
|
|
||||||
SpvMemoryAccessNontemporalMask = 0x00000004,
|
|
||||||
} SpvMemoryAccessMask;
|
|
||||||
|
|
||||||
typedef enum SpvScope_ {
|
|
||||||
SpvScopeCrossDevice = 0,
|
|
||||||
SpvScopeDevice = 1,
|
|
||||||
SpvScopeWorkgroup = 2,
|
|
||||||
SpvScopeSubgroup = 3,
|
|
||||||
SpvScopeInvocation = 4,
|
|
||||||
} SpvScope;
|
|
||||||
|
|
||||||
typedef enum SpvGroupOperation_ {
|
|
||||||
SpvGroupOperationReduce = 0,
|
|
||||||
SpvGroupOperationInclusiveScan = 1,
|
|
||||||
SpvGroupOperationExclusiveScan = 2,
|
|
||||||
} SpvGroupOperation;
|
|
||||||
|
|
||||||
typedef enum SpvKernelEnqueueFlags_ {
|
|
||||||
SpvKernelEnqueueFlagsNoWait = 0,
|
|
||||||
SpvKernelEnqueueFlagsWaitKernel = 1,
|
|
||||||
SpvKernelEnqueueFlagsWaitWorkGroup = 2,
|
|
||||||
} SpvKernelEnqueueFlags;
|
|
||||||
|
|
||||||
typedef enum SpvKernelProfilingInfoShift_ {
|
|
||||||
SpvKernelProfilingInfoCmdExecTimeShift = 0,
|
|
||||||
} SpvKernelProfilingInfoShift;
|
|
||||||
|
|
||||||
typedef enum SpvKernelProfilingInfoMask_ {
|
|
||||||
SpvKernelProfilingInfoMaskNone = 0,
|
|
||||||
SpvKernelProfilingInfoCmdExecTimeMask = 0x00000001,
|
|
||||||
} SpvKernelProfilingInfoMask;
|
|
||||||
|
|
||||||
typedef enum SpvCapability_ {
|
|
||||||
SpvCapabilityMatrix = 0,
|
|
||||||
SpvCapabilityShader = 1,
|
|
||||||
SpvCapabilityGeometry = 2,
|
|
||||||
SpvCapabilityTessellation = 3,
|
|
||||||
SpvCapabilityAddresses = 4,
|
|
||||||
SpvCapabilityLinkage = 5,
|
|
||||||
SpvCapabilityKernel = 6,
|
|
||||||
SpvCapabilityVector16 = 7,
|
|
||||||
SpvCapabilityFloat16Buffer = 8,
|
|
||||||
SpvCapabilityFloat16 = 9,
|
|
||||||
SpvCapabilityFloat64 = 10,
|
|
||||||
SpvCapabilityInt64 = 11,
|
|
||||||
SpvCapabilityInt64Atomics = 12,
|
|
||||||
SpvCapabilityImageBasic = 13,
|
|
||||||
SpvCapabilityImageReadWrite = 14,
|
|
||||||
SpvCapabilityImageMipmap = 15,
|
|
||||||
SpvCapabilityPipes = 17,
|
|
||||||
SpvCapabilityGroups = 18,
|
|
||||||
SpvCapabilityDeviceEnqueue = 19,
|
|
||||||
SpvCapabilityLiteralSampler = 20,
|
|
||||||
SpvCapabilityAtomicStorage = 21,
|
|
||||||
SpvCapabilityInt16 = 22,
|
|
||||||
SpvCapabilityTessellationPointSize = 23,
|
|
||||||
SpvCapabilityGeometryPointSize = 24,
|
|
||||||
SpvCapabilityImageGatherExtended = 25,
|
|
||||||
SpvCapabilityStorageImageMultisample = 27,
|
|
||||||
SpvCapabilityUniformBufferArrayDynamicIndexing = 28,
|
|
||||||
SpvCapabilitySampledImageArrayDynamicIndexing = 29,
|
|
||||||
SpvCapabilityStorageBufferArrayDynamicIndexing = 30,
|
|
||||||
SpvCapabilityStorageImageArrayDynamicIndexing = 31,
|
|
||||||
SpvCapabilityClipDistance = 32,
|
|
||||||
SpvCapabilityCullDistance = 33,
|
|
||||||
SpvCapabilityImageCubeArray = 34,
|
|
||||||
SpvCapabilitySampleRateShading = 35,
|
|
||||||
SpvCapabilityImageRect = 36,
|
|
||||||
SpvCapabilitySampledRect = 37,
|
|
||||||
SpvCapabilityGenericPointer = 38,
|
|
||||||
SpvCapabilityInt8 = 39,
|
|
||||||
SpvCapabilityInputAttachment = 40,
|
|
||||||
SpvCapabilitySparseResidency = 41,
|
|
||||||
SpvCapabilityMinLod = 42,
|
|
||||||
SpvCapabilitySampled1D = 43,
|
|
||||||
SpvCapabilityImage1D = 44,
|
|
||||||
SpvCapabilitySampledCubeArray = 45,
|
|
||||||
SpvCapabilitySampledBuffer = 46,
|
|
||||||
SpvCapabilityImageBuffer = 47,
|
|
||||||
SpvCapabilityImageMSArray = 48,
|
|
||||||
SpvCapabilityStorageImageExtendedFormats = 49,
|
|
||||||
SpvCapabilityImageQuery = 50,
|
|
||||||
SpvCapabilityDerivativeControl = 51,
|
|
||||||
SpvCapabilityInterpolationFunction = 52,
|
|
||||||
SpvCapabilityTransformFeedback = 53,
|
|
||||||
SpvCapabilityGeometryStreams = 54,
|
|
||||||
SpvCapabilityStorageImageReadWithoutFormat = 55,
|
|
||||||
SpvCapabilityStorageImageWriteWithoutFormat = 56,
|
|
||||||
SpvCapabilityMultiViewport = 57,
|
|
||||||
} SpvCapability;
|
|
||||||
|
|
||||||
typedef enum SpvOp_ {
|
|
||||||
SpvOpNop = 0,
|
|
||||||
SpvOpUndef = 1,
|
|
||||||
SpvOpSourceContinued = 2,
|
|
||||||
SpvOpSource = 3,
|
|
||||||
SpvOpSourceExtension = 4,
|
|
||||||
SpvOpName = 5,
|
|
||||||
SpvOpMemberName = 6,
|
|
||||||
SpvOpString = 7,
|
|
||||||
SpvOpLine = 8,
|
|
||||||
SpvOpExtension = 10,
|
|
||||||
SpvOpExtInstImport = 11,
|
|
||||||
SpvOpExtInst = 12,
|
|
||||||
SpvOpMemoryModel = 14,
|
|
||||||
SpvOpEntryPoint = 15,
|
|
||||||
SpvOpExecutionMode = 16,
|
|
||||||
SpvOpCapability = 17,
|
|
||||||
SpvOpTypeVoid = 19,
|
|
||||||
SpvOpTypeBool = 20,
|
|
||||||
SpvOpTypeInt = 21,
|
|
||||||
SpvOpTypeFloat = 22,
|
|
||||||
SpvOpTypeVector = 23,
|
|
||||||
SpvOpTypeMatrix = 24,
|
|
||||||
SpvOpTypeImage = 25,
|
|
||||||
SpvOpTypeSampler = 26,
|
|
||||||
SpvOpTypeSampledImage = 27,
|
|
||||||
SpvOpTypeArray = 28,
|
|
||||||
SpvOpTypeRuntimeArray = 29,
|
|
||||||
SpvOpTypeStruct = 30,
|
|
||||||
SpvOpTypeOpaque = 31,
|
|
||||||
SpvOpTypePointer = 32,
|
|
||||||
SpvOpTypeFunction = 33,
|
|
||||||
SpvOpTypeEvent = 34,
|
|
||||||
SpvOpTypeDeviceEvent = 35,
|
|
||||||
SpvOpTypeReserveId = 36,
|
|
||||||
SpvOpTypeQueue = 37,
|
|
||||||
SpvOpTypePipe = 38,
|
|
||||||
SpvOpTypeForwardPointer = 39,
|
|
||||||
SpvOpConstantTrue = 41,
|
|
||||||
SpvOpConstantFalse = 42,
|
|
||||||
SpvOpConstant = 43,
|
|
||||||
SpvOpConstantComposite = 44,
|
|
||||||
SpvOpConstantSampler = 45,
|
|
||||||
SpvOpConstantNull = 46,
|
|
||||||
SpvOpSpecConstantTrue = 48,
|
|
||||||
SpvOpSpecConstantFalse = 49,
|
|
||||||
SpvOpSpecConstant = 50,
|
|
||||||
SpvOpSpecConstantComposite = 51,
|
|
||||||
SpvOpSpecConstantOp = 52,
|
|
||||||
SpvOpFunction = 54,
|
|
||||||
SpvOpFunctionParameter = 55,
|
|
||||||
SpvOpFunctionEnd = 56,
|
|
||||||
SpvOpFunctionCall = 57,
|
|
||||||
SpvOpVariable = 59,
|
|
||||||
SpvOpImageTexelPointer = 60,
|
|
||||||
SpvOpLoad = 61,
|
|
||||||
SpvOpStore = 62,
|
|
||||||
SpvOpCopyMemory = 63,
|
|
||||||
SpvOpCopyMemorySized = 64,
|
|
||||||
SpvOpAccessChain = 65,
|
|
||||||
SpvOpInBoundsAccessChain = 66,
|
|
||||||
SpvOpPtrAccessChain = 67,
|
|
||||||
SpvOpArrayLength = 68,
|
|
||||||
SpvOpGenericPtrMemSemantics = 69,
|
|
||||||
SpvOpInBoundsPtrAccessChain = 70,
|
|
||||||
SpvOpDecorate = 71,
|
|
||||||
SpvOpMemberDecorate = 72,
|
|
||||||
SpvOpDecorationGroup = 73,
|
|
||||||
SpvOpGroupDecorate = 74,
|
|
||||||
SpvOpGroupMemberDecorate = 75,
|
|
||||||
SpvOpVectorExtractDynamic = 77,
|
|
||||||
SpvOpVectorInsertDynamic = 78,
|
|
||||||
SpvOpVectorShuffle = 79,
|
|
||||||
SpvOpCompositeConstruct = 80,
|
|
||||||
SpvOpCompositeExtract = 81,
|
|
||||||
SpvOpCompositeInsert = 82,
|
|
||||||
SpvOpCopyObject = 83,
|
|
||||||
SpvOpTranspose = 84,
|
|
||||||
SpvOpSampledImage = 86,
|
|
||||||
SpvOpImageSampleImplicitLod = 87,
|
|
||||||
SpvOpImageSampleExplicitLod = 88,
|
|
||||||
SpvOpImageSampleDrefImplicitLod = 89,
|
|
||||||
SpvOpImageSampleDrefExplicitLod = 90,
|
|
||||||
SpvOpImageSampleProjImplicitLod = 91,
|
|
||||||
SpvOpImageSampleProjExplicitLod = 92,
|
|
||||||
SpvOpImageSampleProjDrefImplicitLod = 93,
|
|
||||||
SpvOpImageSampleProjDrefExplicitLod = 94,
|
|
||||||
SpvOpImageFetch = 95,
|
|
||||||
SpvOpImageGather = 96,
|
|
||||||
SpvOpImageDrefGather = 97,
|
|
||||||
SpvOpImageRead = 98,
|
|
||||||
SpvOpImageWrite = 99,
|
|
||||||
SpvOpImage = 100,
|
|
||||||
SpvOpImageQueryFormat = 101,
|
|
||||||
SpvOpImageQueryOrder = 102,
|
|
||||||
SpvOpImageQuerySizeLod = 103,
|
|
||||||
SpvOpImageQuerySize = 104,
|
|
||||||
SpvOpImageQueryLod = 105,
|
|
||||||
SpvOpImageQueryLevels = 106,
|
|
||||||
SpvOpImageQuerySamples = 107,
|
|
||||||
SpvOpConvertFToU = 109,
|
|
||||||
SpvOpConvertFToS = 110,
|
|
||||||
SpvOpConvertSToF = 111,
|
|
||||||
SpvOpConvertUToF = 112,
|
|
||||||
SpvOpUConvert = 113,
|
|
||||||
SpvOpSConvert = 114,
|
|
||||||
SpvOpFConvert = 115,
|
|
||||||
SpvOpQuantizeToF16 = 116,
|
|
||||||
SpvOpConvertPtrToU = 117,
|
|
||||||
SpvOpSatConvertSToU = 118,
|
|
||||||
SpvOpSatConvertUToS = 119,
|
|
||||||
SpvOpConvertUToPtr = 120,
|
|
||||||
SpvOpPtrCastToGeneric = 121,
|
|
||||||
SpvOpGenericCastToPtr = 122,
|
|
||||||
SpvOpGenericCastToPtrExplicit = 123,
|
|
||||||
SpvOpBitcast = 124,
|
|
||||||
SpvOpSNegate = 126,
|
|
||||||
SpvOpFNegate = 127,
|
|
||||||
SpvOpIAdd = 128,
|
|
||||||
SpvOpFAdd = 129,
|
|
||||||
SpvOpISub = 130,
|
|
||||||
SpvOpFSub = 131,
|
|
||||||
SpvOpIMul = 132,
|
|
||||||
SpvOpFMul = 133,
|
|
||||||
SpvOpUDiv = 134,
|
|
||||||
SpvOpSDiv = 135,
|
|
||||||
SpvOpFDiv = 136,
|
|
||||||
SpvOpUMod = 137,
|
|
||||||
SpvOpSRem = 138,
|
|
||||||
SpvOpSMod = 139,
|
|
||||||
SpvOpFRem = 140,
|
|
||||||
SpvOpFMod = 141,
|
|
||||||
SpvOpVectorTimesScalar = 142,
|
|
||||||
SpvOpMatrixTimesScalar = 143,
|
|
||||||
SpvOpVectorTimesMatrix = 144,
|
|
||||||
SpvOpMatrixTimesVector = 145,
|
|
||||||
SpvOpMatrixTimesMatrix = 146,
|
|
||||||
SpvOpOuterProduct = 147,
|
|
||||||
SpvOpDot = 148,
|
|
||||||
SpvOpIAddCarry = 149,
|
|
||||||
SpvOpISubBorrow = 150,
|
|
||||||
SpvOpUMulExtended = 151,
|
|
||||||
SpvOpSMulExtended = 152,
|
|
||||||
SpvOpAny = 154,
|
|
||||||
SpvOpAll = 155,
|
|
||||||
SpvOpIsNan = 156,
|
|
||||||
SpvOpIsInf = 157,
|
|
||||||
SpvOpIsFinite = 158,
|
|
||||||
SpvOpIsNormal = 159,
|
|
||||||
SpvOpSignBitSet = 160,
|
|
||||||
SpvOpLessOrGreater = 161,
|
|
||||||
SpvOpOrdered = 162,
|
|
||||||
SpvOpUnordered = 163,
|
|
||||||
SpvOpLogicalEqual = 164,
|
|
||||||
SpvOpLogicalNotEqual = 165,
|
|
||||||
SpvOpLogicalOr = 166,
|
|
||||||
SpvOpLogicalAnd = 167,
|
|
||||||
SpvOpLogicalNot = 168,
|
|
||||||
SpvOpSelect = 169,
|
|
||||||
SpvOpIEqual = 170,
|
|
||||||
SpvOpINotEqual = 171,
|
|
||||||
SpvOpUGreaterThan = 172,
|
|
||||||
SpvOpSGreaterThan = 173,
|
|
||||||
SpvOpUGreaterThanEqual = 174,
|
|
||||||
SpvOpSGreaterThanEqual = 175,
|
|
||||||
SpvOpULessThan = 176,
|
|
||||||
SpvOpSLessThan = 177,
|
|
||||||
SpvOpULessThanEqual = 178,
|
|
||||||
SpvOpSLessThanEqual = 179,
|
|
||||||
SpvOpFOrdEqual = 180,
|
|
||||||
SpvOpFUnordEqual = 181,
|
|
||||||
SpvOpFOrdNotEqual = 182,
|
|
||||||
SpvOpFUnordNotEqual = 183,
|
|
||||||
SpvOpFOrdLessThan = 184,
|
|
||||||
SpvOpFUnordLessThan = 185,
|
|
||||||
SpvOpFOrdGreaterThan = 186,
|
|
||||||
SpvOpFUnordGreaterThan = 187,
|
|
||||||
SpvOpFOrdLessThanEqual = 188,
|
|
||||||
SpvOpFUnordLessThanEqual = 189,
|
|
||||||
SpvOpFOrdGreaterThanEqual = 190,
|
|
||||||
SpvOpFUnordGreaterThanEqual = 191,
|
|
||||||
SpvOpShiftRightLogical = 194,
|
|
||||||
SpvOpShiftRightArithmetic = 195,
|
|
||||||
SpvOpShiftLeftLogical = 196,
|
|
||||||
SpvOpBitwiseOr = 197,
|
|
||||||
SpvOpBitwiseXor = 198,
|
|
||||||
SpvOpBitwiseAnd = 199,
|
|
||||||
SpvOpNot = 200,
|
|
||||||
SpvOpBitFieldInsert = 201,
|
|
||||||
SpvOpBitFieldSExtract = 202,
|
|
||||||
SpvOpBitFieldUExtract = 203,
|
|
||||||
SpvOpBitReverse = 204,
|
|
||||||
SpvOpBitCount = 205,
|
|
||||||
SpvOpDPdx = 207,
|
|
||||||
SpvOpDPdy = 208,
|
|
||||||
SpvOpFwidth = 209,
|
|
||||||
SpvOpDPdxFine = 210,
|
|
||||||
SpvOpDPdyFine = 211,
|
|
||||||
SpvOpFwidthFine = 212,
|
|
||||||
SpvOpDPdxCoarse = 213,
|
|
||||||
SpvOpDPdyCoarse = 214,
|
|
||||||
SpvOpFwidthCoarse = 215,
|
|
||||||
SpvOpEmitVertex = 218,
|
|
||||||
SpvOpEndPrimitive = 219,
|
|
||||||
SpvOpEmitStreamVertex = 220,
|
|
||||||
SpvOpEndStreamPrimitive = 221,
|
|
||||||
SpvOpControlBarrier = 224,
|
|
||||||
SpvOpMemoryBarrier = 225,
|
|
||||||
SpvOpAtomicLoad = 227,
|
|
||||||
SpvOpAtomicStore = 228,
|
|
||||||
SpvOpAtomicExchange = 229,
|
|
||||||
SpvOpAtomicCompareExchange = 230,
|
|
||||||
SpvOpAtomicCompareExchangeWeak = 231,
|
|
||||||
SpvOpAtomicIIncrement = 232,
|
|
||||||
SpvOpAtomicIDecrement = 233,
|
|
||||||
SpvOpAtomicIAdd = 234,
|
|
||||||
SpvOpAtomicISub = 235,
|
|
||||||
SpvOpAtomicSMin = 236,
|
|
||||||
SpvOpAtomicUMin = 237,
|
|
||||||
SpvOpAtomicSMax = 238,
|
|
||||||
SpvOpAtomicUMax = 239,
|
|
||||||
SpvOpAtomicAnd = 240,
|
|
||||||
SpvOpAtomicOr = 241,
|
|
||||||
SpvOpAtomicXor = 242,
|
|
||||||
SpvOpPhi = 245,
|
|
||||||
SpvOpLoopMerge = 246,
|
|
||||||
SpvOpSelectionMerge = 247,
|
|
||||||
SpvOpLabel = 248,
|
|
||||||
SpvOpBranch = 249,
|
|
||||||
SpvOpBranchConditional = 250,
|
|
||||||
SpvOpSwitch = 251,
|
|
||||||
SpvOpKill = 252,
|
|
||||||
SpvOpReturn = 253,
|
|
||||||
SpvOpReturnValue = 254,
|
|
||||||
SpvOpUnreachable = 255,
|
|
||||||
SpvOpLifetimeStart = 256,
|
|
||||||
SpvOpLifetimeStop = 257,
|
|
||||||
SpvOpGroupAsyncCopy = 259,
|
|
||||||
SpvOpGroupWaitEvents = 260,
|
|
||||||
SpvOpGroupAll = 261,
|
|
||||||
SpvOpGroupAny = 262,
|
|
||||||
SpvOpGroupBroadcast = 263,
|
|
||||||
SpvOpGroupIAdd = 264,
|
|
||||||
SpvOpGroupFAdd = 265,
|
|
||||||
SpvOpGroupFMin = 266,
|
|
||||||
SpvOpGroupUMin = 267,
|
|
||||||
SpvOpGroupSMin = 268,
|
|
||||||
SpvOpGroupFMax = 269,
|
|
||||||
SpvOpGroupUMax = 270,
|
|
||||||
SpvOpGroupSMax = 271,
|
|
||||||
SpvOpReadPipe = 274,
|
|
||||||
SpvOpWritePipe = 275,
|
|
||||||
SpvOpReservedReadPipe = 276,
|
|
||||||
SpvOpReservedWritePipe = 277,
|
|
||||||
SpvOpReserveReadPipePackets = 278,
|
|
||||||
SpvOpReserveWritePipePackets = 279,
|
|
||||||
SpvOpCommitReadPipe = 280,
|
|
||||||
SpvOpCommitWritePipe = 281,
|
|
||||||
SpvOpIsValidReserveId = 282,
|
|
||||||
SpvOpGetNumPipePackets = 283,
|
|
||||||
SpvOpGetMaxPipePackets = 284,
|
|
||||||
SpvOpGroupReserveReadPipePackets = 285,
|
|
||||||
SpvOpGroupReserveWritePipePackets = 286,
|
|
||||||
SpvOpGroupCommitReadPipe = 287,
|
|
||||||
SpvOpGroupCommitWritePipe = 288,
|
|
||||||
SpvOpEnqueueMarker = 291,
|
|
||||||
SpvOpEnqueueKernel = 292,
|
|
||||||
SpvOpGetKernelNDrangeSubGroupCount = 293,
|
|
||||||
SpvOpGetKernelNDrangeMaxSubGroupSize = 294,
|
|
||||||
SpvOpGetKernelWorkGroupSize = 295,
|
|
||||||
SpvOpGetKernelPreferredWorkGroupSizeMultiple = 296,
|
|
||||||
SpvOpRetainEvent = 297,
|
|
||||||
SpvOpReleaseEvent = 298,
|
|
||||||
SpvOpCreateUserEvent = 299,
|
|
||||||
SpvOpIsValidEvent = 300,
|
|
||||||
SpvOpSetUserEventStatus = 301,
|
|
||||||
SpvOpCaptureEventProfilingInfo = 302,
|
|
||||||
SpvOpGetDefaultQueue = 303,
|
|
||||||
SpvOpBuildNDRange = 304,
|
|
||||||
SpvOpImageSparseSampleImplicitLod = 305,
|
|
||||||
SpvOpImageSparseSampleExplicitLod = 306,
|
|
||||||
SpvOpImageSparseSampleDrefImplicitLod = 307,
|
|
||||||
SpvOpImageSparseSampleDrefExplicitLod = 308,
|
|
||||||
SpvOpImageSparseSampleProjImplicitLod = 309,
|
|
||||||
SpvOpImageSparseSampleProjExplicitLod = 310,
|
|
||||||
SpvOpImageSparseSampleProjDrefImplicitLod = 311,
|
|
||||||
SpvOpImageSparseSampleProjDrefExplicitLod = 312,
|
|
||||||
SpvOpImageSparseFetch = 313,
|
|
||||||
SpvOpImageSparseGather = 314,
|
|
||||||
SpvOpImageSparseDrefGather = 315,
|
|
||||||
SpvOpImageSparseTexelsResident = 316,
|
|
||||||
SpvOpNoLine = 317,
|
|
||||||
SpvOpAtomicFlagTestAndSet = 318,
|
|
||||||
SpvOpAtomicFlagClear = 319,
|
|
||||||
SpvOpImageSparseRead = 320,
|
|
||||||
} SpvOp;
|
|
||||||
|
|
||||||
#endif // #ifndef spirv_H
|
|
||||||
|
|
|
@ -1,880 +0,0 @@
|
||||||
// Copyright (c) 2014-2016 The Khronos Group Inc.
|
|
||||||
//
|
|
||||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
// of this software and/or associated documentation files (the "Materials"),
|
|
||||||
// to deal in the Materials without restriction, including without limitation
|
|
||||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
||||||
// and/or sell copies of the Materials, and to permit persons to whom the
|
|
||||||
// Materials are furnished to do so, subject to the following conditions:
|
|
||||||
//
|
|
||||||
// The above copyright notice and this permission notice shall be included in
|
|
||||||
// all copies or substantial portions of the Materials.
|
|
||||||
//
|
|
||||||
// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS KHRONOS
|
|
||||||
// STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS SPECIFICATIONS AND
|
|
||||||
// HEADER INFORMATION ARE LOCATED AT https://www.khronos.org/registry/
|
|
||||||
//
|
|
||||||
// THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
|
||||||
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
// FROM,OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE USE OR OTHER DEALINGS
|
|
||||||
// IN THE MATERIALS.
|
|
||||||
|
|
||||||
// This header is automatically generated by the same tool that creates
|
|
||||||
// the Binary Section of the SPIR-V specification.
|
|
||||||
|
|
||||||
// Enumeration tokens for SPIR-V, in various styles:
|
|
||||||
// C, C++, C++11, JSON, Lua, Python
|
|
||||||
//
|
|
||||||
// - C will have tokens with a "Spv" prefix, e.g.: SpvSourceLanguageGLSL
|
|
||||||
// - C++ will have tokens in the "spv" name space, e.g.: spv::SourceLanguageGLSL
|
|
||||||
// - C++11 will use enum classes in the spv namespace, e.g.: spv::SourceLanguage::GLSL
|
|
||||||
// - Lua will use tables, e.g.: spv.SourceLanguage.GLSL
|
|
||||||
// - Python will use dictionaries, e.g.: spv['SourceLanguage']['GLSL']
|
|
||||||
//
|
|
||||||
// Some tokens act like mask values, which can be OR'd together,
|
|
||||||
// while others are mutually exclusive. The mask-like ones have
|
|
||||||
// "Mask" in their name, and a parallel enum that has the shift
|
|
||||||
// amount (1 << x) for each corresponding enumerant.
|
|
||||||
|
|
||||||
#ifndef spirv_HPP
|
|
||||||
#define spirv_HPP
|
|
||||||
|
|
||||||
namespace spv {
|
|
||||||
|
|
||||||
typedef unsigned int Id;
|
|
||||||
|
|
||||||
#define SPV_VERSION 0x10000
|
|
||||||
#define SPV_REVISION 3
|
|
||||||
|
|
||||||
static const unsigned int MagicNumber = 0x07230203;
|
|
||||||
static const unsigned int Version = 0x00010000;
|
|
||||||
static const unsigned int Revision = 3;
|
|
||||||
static const unsigned int OpCodeMask = 0xffff;
|
|
||||||
static const unsigned int WordCountShift = 16;
|
|
||||||
|
|
||||||
enum class SourceLanguage : unsigned {
|
|
||||||
Unknown = 0,
|
|
||||||
ESSL = 1,
|
|
||||||
GLSL = 2,
|
|
||||||
OpenCL_C = 3,
|
|
||||||
OpenCL_CPP = 4,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class ExecutionModel : unsigned {
|
|
||||||
Vertex = 0,
|
|
||||||
TessellationControl = 1,
|
|
||||||
TessellationEvaluation = 2,
|
|
||||||
Geometry = 3,
|
|
||||||
Fragment = 4,
|
|
||||||
GLCompute = 5,
|
|
||||||
Kernel = 6,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class AddressingModel : unsigned {
|
|
||||||
Logical = 0,
|
|
||||||
Physical32 = 1,
|
|
||||||
Physical64 = 2,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class MemoryModel : unsigned {
|
|
||||||
Simple = 0,
|
|
||||||
GLSL450 = 1,
|
|
||||||
OpenCL = 2,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class ExecutionMode : unsigned {
|
|
||||||
Invocations = 0,
|
|
||||||
SpacingEqual = 1,
|
|
||||||
SpacingFractionalEven = 2,
|
|
||||||
SpacingFractionalOdd = 3,
|
|
||||||
VertexOrderCw = 4,
|
|
||||||
VertexOrderCcw = 5,
|
|
||||||
PixelCenterInteger = 6,
|
|
||||||
OriginUpperLeft = 7,
|
|
||||||
OriginLowerLeft = 8,
|
|
||||||
EarlyFragmentTests = 9,
|
|
||||||
PointMode = 10,
|
|
||||||
Xfb = 11,
|
|
||||||
DepthReplacing = 12,
|
|
||||||
DepthGreater = 14,
|
|
||||||
DepthLess = 15,
|
|
||||||
DepthUnchanged = 16,
|
|
||||||
LocalSize = 17,
|
|
||||||
LocalSizeHint = 18,
|
|
||||||
InputPoints = 19,
|
|
||||||
InputLines = 20,
|
|
||||||
InputLinesAdjacency = 21,
|
|
||||||
Triangles = 22,
|
|
||||||
InputTrianglesAdjacency = 23,
|
|
||||||
Quads = 24,
|
|
||||||
Isolines = 25,
|
|
||||||
OutputVertices = 26,
|
|
||||||
OutputPoints = 27,
|
|
||||||
OutputLineStrip = 28,
|
|
||||||
OutputTriangleStrip = 29,
|
|
||||||
VecTypeHint = 30,
|
|
||||||
ContractionOff = 31,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class StorageClass : unsigned {
|
|
||||||
UniformConstant = 0,
|
|
||||||
Input = 1,
|
|
||||||
Uniform = 2,
|
|
||||||
Output = 3,
|
|
||||||
Workgroup = 4,
|
|
||||||
CrossWorkgroup = 5,
|
|
||||||
Private = 6,
|
|
||||||
Function = 7,
|
|
||||||
Generic = 8,
|
|
||||||
PushConstant = 9,
|
|
||||||
AtomicCounter = 10,
|
|
||||||
Image = 11,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class Dim : unsigned {
|
|
||||||
Dim1D = 0,
|
|
||||||
Dim2D = 1,
|
|
||||||
Dim3D = 2,
|
|
||||||
Cube = 3,
|
|
||||||
Rect = 4,
|
|
||||||
Buffer = 5,
|
|
||||||
SubpassData = 6,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class SamplerAddressingMode : unsigned {
|
|
||||||
None = 0,
|
|
||||||
ClampToEdge = 1,
|
|
||||||
Clamp = 2,
|
|
||||||
Repeat = 3,
|
|
||||||
RepeatMirrored = 4,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class SamplerFilterMode : unsigned {
|
|
||||||
Nearest = 0,
|
|
||||||
Linear = 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class ImageFormat : unsigned {
|
|
||||||
Unknown = 0,
|
|
||||||
Rgba32f = 1,
|
|
||||||
Rgba16f = 2,
|
|
||||||
R32f = 3,
|
|
||||||
Rgba8 = 4,
|
|
||||||
Rgba8Snorm = 5,
|
|
||||||
Rg32f = 6,
|
|
||||||
Rg16f = 7,
|
|
||||||
R11fG11fB10f = 8,
|
|
||||||
R16f = 9,
|
|
||||||
Rgba16 = 10,
|
|
||||||
Rgb10A2 = 11,
|
|
||||||
Rg16 = 12,
|
|
||||||
Rg8 = 13,
|
|
||||||
R16 = 14,
|
|
||||||
R8 = 15,
|
|
||||||
Rgba16Snorm = 16,
|
|
||||||
Rg16Snorm = 17,
|
|
||||||
Rg8Snorm = 18,
|
|
||||||
R16Snorm = 19,
|
|
||||||
R8Snorm = 20,
|
|
||||||
Rgba32i = 21,
|
|
||||||
Rgba16i = 22,
|
|
||||||
Rgba8i = 23,
|
|
||||||
R32i = 24,
|
|
||||||
Rg32i = 25,
|
|
||||||
Rg16i = 26,
|
|
||||||
Rg8i = 27,
|
|
||||||
R16i = 28,
|
|
||||||
R8i = 29,
|
|
||||||
Rgba32ui = 30,
|
|
||||||
Rgba16ui = 31,
|
|
||||||
Rgba8ui = 32,
|
|
||||||
R32ui = 33,
|
|
||||||
Rgb10a2ui = 34,
|
|
||||||
Rg32ui = 35,
|
|
||||||
Rg16ui = 36,
|
|
||||||
Rg8ui = 37,
|
|
||||||
R16ui = 38,
|
|
||||||
R8ui = 39,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class ImageChannelOrder : unsigned {
|
|
||||||
R = 0,
|
|
||||||
A = 1,
|
|
||||||
RG = 2,
|
|
||||||
RA = 3,
|
|
||||||
RGB = 4,
|
|
||||||
RGBA = 5,
|
|
||||||
BGRA = 6,
|
|
||||||
ARGB = 7,
|
|
||||||
Intensity = 8,
|
|
||||||
Luminance = 9,
|
|
||||||
Rx = 10,
|
|
||||||
RGx = 11,
|
|
||||||
RGBx = 12,
|
|
||||||
Depth = 13,
|
|
||||||
DepthStencil = 14,
|
|
||||||
sRGB = 15,
|
|
||||||
sRGBx = 16,
|
|
||||||
sRGBA = 17,
|
|
||||||
sBGRA = 18,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class ImageChannelDataType : unsigned {
|
|
||||||
SnormInt8 = 0,
|
|
||||||
SnormInt16 = 1,
|
|
||||||
UnormInt8 = 2,
|
|
||||||
UnormInt16 = 3,
|
|
||||||
UnormShort565 = 4,
|
|
||||||
UnormShort555 = 5,
|
|
||||||
UnormInt101010 = 6,
|
|
||||||
SignedInt8 = 7,
|
|
||||||
SignedInt16 = 8,
|
|
||||||
SignedInt32 = 9,
|
|
||||||
UnsignedInt8 = 10,
|
|
||||||
UnsignedInt16 = 11,
|
|
||||||
UnsignedInt32 = 12,
|
|
||||||
HalfFloat = 13,
|
|
||||||
Float = 14,
|
|
||||||
UnormInt24 = 15,
|
|
||||||
UnormInt101010_2 = 16,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class ImageOperandsShift : unsigned {
|
|
||||||
Bias = 0,
|
|
||||||
Lod = 1,
|
|
||||||
Grad = 2,
|
|
||||||
ConstOffset = 3,
|
|
||||||
Offset = 4,
|
|
||||||
ConstOffsets = 5,
|
|
||||||
Sample = 6,
|
|
||||||
MinLod = 7,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class ImageOperandsMask : unsigned {
|
|
||||||
MaskNone = 0,
|
|
||||||
Bias = 0x00000001,
|
|
||||||
Lod = 0x00000002,
|
|
||||||
Grad = 0x00000004,
|
|
||||||
ConstOffset = 0x00000008,
|
|
||||||
Offset = 0x00000010,
|
|
||||||
ConstOffsets = 0x00000020,
|
|
||||||
Sample = 0x00000040,
|
|
||||||
MinLod = 0x00000080,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class FPFastMathModeShift : unsigned {
|
|
||||||
NotNaN = 0,
|
|
||||||
NotInf = 1,
|
|
||||||
NSZ = 2,
|
|
||||||
AllowRecip = 3,
|
|
||||||
Fast = 4,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class FPFastMathModeMask : unsigned {
|
|
||||||
MaskNone = 0,
|
|
||||||
NotNaN = 0x00000001,
|
|
||||||
NotInf = 0x00000002,
|
|
||||||
NSZ = 0x00000004,
|
|
||||||
AllowRecip = 0x00000008,
|
|
||||||
Fast = 0x00000010,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class FPRoundingMode : unsigned {
|
|
||||||
RTE = 0,
|
|
||||||
RTZ = 1,
|
|
||||||
RTP = 2,
|
|
||||||
RTN = 3,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class LinkageType : unsigned {
|
|
||||||
Export = 0,
|
|
||||||
Import = 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class AccessQualifier : unsigned {
|
|
||||||
ReadOnly = 0,
|
|
||||||
WriteOnly = 1,
|
|
||||||
ReadWrite = 2,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class FunctionParameterAttribute : unsigned {
|
|
||||||
Zext = 0,
|
|
||||||
Sext = 1,
|
|
||||||
ByVal = 2,
|
|
||||||
Sret = 3,
|
|
||||||
NoAlias = 4,
|
|
||||||
NoCapture = 5,
|
|
||||||
NoWrite = 6,
|
|
||||||
NoReadWrite = 7,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class Decoration : unsigned {
|
|
||||||
RelaxedPrecision = 0,
|
|
||||||
SpecId = 1,
|
|
||||||
Block = 2,
|
|
||||||
BufferBlock = 3,
|
|
||||||
RowMajor = 4,
|
|
||||||
ColMajor = 5,
|
|
||||||
ArrayStride = 6,
|
|
||||||
MatrixStride = 7,
|
|
||||||
GLSLShared = 8,
|
|
||||||
GLSLPacked = 9,
|
|
||||||
CPacked = 10,
|
|
||||||
BuiltIn = 11,
|
|
||||||
NoPerspective = 13,
|
|
||||||
Flat = 14,
|
|
||||||
Patch = 15,
|
|
||||||
Centroid = 16,
|
|
||||||
Sample = 17,
|
|
||||||
Invariant = 18,
|
|
||||||
Restrict = 19,
|
|
||||||
Aliased = 20,
|
|
||||||
Volatile = 21,
|
|
||||||
Constant = 22,
|
|
||||||
Coherent = 23,
|
|
||||||
NonWritable = 24,
|
|
||||||
NonReadable = 25,
|
|
||||||
Uniform = 26,
|
|
||||||
SaturatedConversion = 28,
|
|
||||||
Stream = 29,
|
|
||||||
Location = 30,
|
|
||||||
Component = 31,
|
|
||||||
Index = 32,
|
|
||||||
Binding = 33,
|
|
||||||
DescriptorSet = 34,
|
|
||||||
Offset = 35,
|
|
||||||
XfbBuffer = 36,
|
|
||||||
XfbStride = 37,
|
|
||||||
FuncParamAttr = 38,
|
|
||||||
FPRoundingMode = 39,
|
|
||||||
FPFastMathMode = 40,
|
|
||||||
LinkageAttributes = 41,
|
|
||||||
NoContraction = 42,
|
|
||||||
InputAttachmentIndex = 43,
|
|
||||||
Alignment = 44,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class BuiltIn : unsigned {
|
|
||||||
Position = 0,
|
|
||||||
PointSize = 1,
|
|
||||||
ClipDistance = 3,
|
|
||||||
CullDistance = 4,
|
|
||||||
VertexId = 5,
|
|
||||||
InstanceId = 6,
|
|
||||||
PrimitiveId = 7,
|
|
||||||
InvocationId = 8,
|
|
||||||
Layer = 9,
|
|
||||||
ViewportIndex = 10,
|
|
||||||
TessLevelOuter = 11,
|
|
||||||
TessLevelInner = 12,
|
|
||||||
TessCoord = 13,
|
|
||||||
PatchVertices = 14,
|
|
||||||
FragCoord = 15,
|
|
||||||
PointCoord = 16,
|
|
||||||
FrontFacing = 17,
|
|
||||||
SampleId = 18,
|
|
||||||
SamplePosition = 19,
|
|
||||||
SampleMask = 20,
|
|
||||||
FragDepth = 22,
|
|
||||||
HelperInvocation = 23,
|
|
||||||
NumWorkgroups = 24,
|
|
||||||
WorkgroupSize = 25,
|
|
||||||
WorkgroupId = 26,
|
|
||||||
LocalInvocationId = 27,
|
|
||||||
GlobalInvocationId = 28,
|
|
||||||
LocalInvocationIndex = 29,
|
|
||||||
WorkDim = 30,
|
|
||||||
GlobalSize = 31,
|
|
||||||
EnqueuedWorkgroupSize = 32,
|
|
||||||
GlobalOffset = 33,
|
|
||||||
GlobalLinearId = 34,
|
|
||||||
SubgroupSize = 36,
|
|
||||||
SubgroupMaxSize = 37,
|
|
||||||
NumSubgroups = 38,
|
|
||||||
NumEnqueuedSubgroups = 39,
|
|
||||||
SubgroupId = 40,
|
|
||||||
SubgroupLocalInvocationId = 41,
|
|
||||||
VertexIndex = 42,
|
|
||||||
InstanceIndex = 43,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class SelectionControlShift : unsigned {
|
|
||||||
Flatten = 0,
|
|
||||||
DontFlatten = 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class SelectionControlMask : unsigned {
|
|
||||||
MaskNone = 0,
|
|
||||||
Flatten = 0x00000001,
|
|
||||||
DontFlatten = 0x00000002,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class LoopControlShift : unsigned {
|
|
||||||
Unroll = 0,
|
|
||||||
DontUnroll = 1,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class LoopControlMask : unsigned {
|
|
||||||
MaskNone = 0,
|
|
||||||
Unroll = 0x00000001,
|
|
||||||
DontUnroll = 0x00000002,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class FunctionControlShift : unsigned {
|
|
||||||
Inline = 0,
|
|
||||||
DontInline = 1,
|
|
||||||
Pure = 2,
|
|
||||||
Const = 3,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class FunctionControlMask : unsigned {
|
|
||||||
MaskNone = 0,
|
|
||||||
Inline = 0x00000001,
|
|
||||||
DontInline = 0x00000002,
|
|
||||||
Pure = 0x00000004,
|
|
||||||
Const = 0x00000008,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class MemorySemanticsShift : unsigned {
|
|
||||||
Acquire = 1,
|
|
||||||
Release = 2,
|
|
||||||
AcquireRelease = 3,
|
|
||||||
SequentiallyConsistent = 4,
|
|
||||||
UniformMemory = 6,
|
|
||||||
SubgroupMemory = 7,
|
|
||||||
WorkgroupMemory = 8,
|
|
||||||
CrossWorkgroupMemory = 9,
|
|
||||||
AtomicCounterMemory = 10,
|
|
||||||
ImageMemory = 11,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class MemorySemanticsMask : unsigned {
|
|
||||||
MaskNone = 0,
|
|
||||||
Acquire = 0x00000002,
|
|
||||||
Release = 0x00000004,
|
|
||||||
AcquireRelease = 0x00000008,
|
|
||||||
SequentiallyConsistent = 0x00000010,
|
|
||||||
UniformMemory = 0x00000040,
|
|
||||||
SubgroupMemory = 0x00000080,
|
|
||||||
WorkgroupMemory = 0x00000100,
|
|
||||||
CrossWorkgroupMemory = 0x00000200,
|
|
||||||
AtomicCounterMemory = 0x00000400,
|
|
||||||
ImageMemory = 0x00000800,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class MemoryAccessShift : unsigned {
|
|
||||||
Volatile = 0,
|
|
||||||
Aligned = 1,
|
|
||||||
Nontemporal = 2,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class MemoryAccessMask : unsigned {
|
|
||||||
MaskNone = 0,
|
|
||||||
Volatile = 0x00000001,
|
|
||||||
Aligned = 0x00000002,
|
|
||||||
Nontemporal = 0x00000004,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class Scope : unsigned {
|
|
||||||
CrossDevice = 0,
|
|
||||||
Device = 1,
|
|
||||||
Workgroup = 2,
|
|
||||||
Subgroup = 3,
|
|
||||||
Invocation = 4,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class GroupOperation : unsigned {
|
|
||||||
Reduce = 0,
|
|
||||||
InclusiveScan = 1,
|
|
||||||
ExclusiveScan = 2,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class KernelEnqueueFlags : unsigned {
|
|
||||||
NoWait = 0,
|
|
||||||
WaitKernel = 1,
|
|
||||||
WaitWorkGroup = 2,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class KernelProfilingInfoShift : unsigned {
|
|
||||||
CmdExecTime = 0,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class KernelProfilingInfoMask : unsigned {
|
|
||||||
MaskNone = 0,
|
|
||||||
CmdExecTime = 0x00000001,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class Capability : unsigned {
|
|
||||||
Matrix = 0,
|
|
||||||
Shader = 1,
|
|
||||||
Geometry = 2,
|
|
||||||
Tessellation = 3,
|
|
||||||
Addresses = 4,
|
|
||||||
Linkage = 5,
|
|
||||||
Kernel = 6,
|
|
||||||
Vector16 = 7,
|
|
||||||
Float16Buffer = 8,
|
|
||||||
Float16 = 9,
|
|
||||||
Float64 = 10,
|
|
||||||
Int64 = 11,
|
|
||||||
Int64Atomics = 12,
|
|
||||||
ImageBasic = 13,
|
|
||||||
ImageReadWrite = 14,
|
|
||||||
ImageMipmap = 15,
|
|
||||||
Pipes = 17,
|
|
||||||
Groups = 18,
|
|
||||||
DeviceEnqueue = 19,
|
|
||||||
LiteralSampler = 20,
|
|
||||||
AtomicStorage = 21,
|
|
||||||
Int16 = 22,
|
|
||||||
TessellationPointSize = 23,
|
|
||||||
GeometryPointSize = 24,
|
|
||||||
ImageGatherExtended = 25,
|
|
||||||
StorageImageMultisample = 27,
|
|
||||||
UniformBufferArrayDynamicIndexing = 28,
|
|
||||||
SampledImageArrayDynamicIndexing = 29,
|
|
||||||
StorageBufferArrayDynamicIndexing = 30,
|
|
||||||
StorageImageArrayDynamicIndexing = 31,
|
|
||||||
ClipDistance = 32,
|
|
||||||
CullDistance = 33,
|
|
||||||
ImageCubeArray = 34,
|
|
||||||
SampleRateShading = 35,
|
|
||||||
ImageRect = 36,
|
|
||||||
SampledRect = 37,
|
|
||||||
GenericPointer = 38,
|
|
||||||
Int8 = 39,
|
|
||||||
InputAttachment = 40,
|
|
||||||
SparseResidency = 41,
|
|
||||||
MinLod = 42,
|
|
||||||
Sampled1D = 43,
|
|
||||||
Image1D = 44,
|
|
||||||
SampledCubeArray = 45,
|
|
||||||
SampledBuffer = 46,
|
|
||||||
ImageBuffer = 47,
|
|
||||||
ImageMSArray = 48,
|
|
||||||
StorageImageExtendedFormats = 49,
|
|
||||||
ImageQuery = 50,
|
|
||||||
DerivativeControl = 51,
|
|
||||||
InterpolationFunction = 52,
|
|
||||||
TransformFeedback = 53,
|
|
||||||
GeometryStreams = 54,
|
|
||||||
StorageImageReadWithoutFormat = 55,
|
|
||||||
StorageImageWriteWithoutFormat = 56,
|
|
||||||
MultiViewport = 57,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class Op : unsigned {
|
|
||||||
OpNop = 0,
|
|
||||||
OpUndef = 1,
|
|
||||||
OpSourceContinued = 2,
|
|
||||||
OpSource = 3,
|
|
||||||
OpSourceExtension = 4,
|
|
||||||
OpName = 5,
|
|
||||||
OpMemberName = 6,
|
|
||||||
OpString = 7,
|
|
||||||
OpLine = 8,
|
|
||||||
OpExtension = 10,
|
|
||||||
OpExtInstImport = 11,
|
|
||||||
OpExtInst = 12,
|
|
||||||
OpMemoryModel = 14,
|
|
||||||
OpEntryPoint = 15,
|
|
||||||
OpExecutionMode = 16,
|
|
||||||
OpCapability = 17,
|
|
||||||
OpTypeVoid = 19,
|
|
||||||
OpTypeBool = 20,
|
|
||||||
OpTypeInt = 21,
|
|
||||||
OpTypeFloat = 22,
|
|
||||||
OpTypeVector = 23,
|
|
||||||
OpTypeMatrix = 24,
|
|
||||||
OpTypeImage = 25,
|
|
||||||
OpTypeSampler = 26,
|
|
||||||
OpTypeSampledImage = 27,
|
|
||||||
OpTypeArray = 28,
|
|
||||||
OpTypeRuntimeArray = 29,
|
|
||||||
OpTypeStruct = 30,
|
|
||||||
OpTypeOpaque = 31,
|
|
||||||
OpTypePointer = 32,
|
|
||||||
OpTypeFunction = 33,
|
|
||||||
OpTypeEvent = 34,
|
|
||||||
OpTypeDeviceEvent = 35,
|
|
||||||
OpTypeReserveId = 36,
|
|
||||||
OpTypeQueue = 37,
|
|
||||||
OpTypePipe = 38,
|
|
||||||
OpTypeForwardPointer = 39,
|
|
||||||
OpConstantTrue = 41,
|
|
||||||
OpConstantFalse = 42,
|
|
||||||
OpConstant = 43,
|
|
||||||
OpConstantComposite = 44,
|
|
||||||
OpConstantSampler = 45,
|
|
||||||
OpConstantNull = 46,
|
|
||||||
OpSpecConstantTrue = 48,
|
|
||||||
OpSpecConstantFalse = 49,
|
|
||||||
OpSpecConstant = 50,
|
|
||||||
OpSpecConstantComposite = 51,
|
|
||||||
OpSpecConstantOp = 52,
|
|
||||||
OpFunction = 54,
|
|
||||||
OpFunctionParameter = 55,
|
|
||||||
OpFunctionEnd = 56,
|
|
||||||
OpFunctionCall = 57,
|
|
||||||
OpVariable = 59,
|
|
||||||
OpImageTexelPointer = 60,
|
|
||||||
OpLoad = 61,
|
|
||||||
OpStore = 62,
|
|
||||||
OpCopyMemory = 63,
|
|
||||||
OpCopyMemorySized = 64,
|
|
||||||
OpAccessChain = 65,
|
|
||||||
OpInBoundsAccessChain = 66,
|
|
||||||
OpPtrAccessChain = 67,
|
|
||||||
OpArrayLength = 68,
|
|
||||||
OpGenericPtrMemSemantics = 69,
|
|
||||||
OpInBoundsPtrAccessChain = 70,
|
|
||||||
OpDecorate = 71,
|
|
||||||
OpMemberDecorate = 72,
|
|
||||||
OpDecorationGroup = 73,
|
|
||||||
OpGroupDecorate = 74,
|
|
||||||
OpGroupMemberDecorate = 75,
|
|
||||||
OpVectorExtractDynamic = 77,
|
|
||||||
OpVectorInsertDynamic = 78,
|
|
||||||
OpVectorShuffle = 79,
|
|
||||||
OpCompositeConstruct = 80,
|
|
||||||
OpCompositeExtract = 81,
|
|
||||||
OpCompositeInsert = 82,
|
|
||||||
OpCopyObject = 83,
|
|
||||||
OpTranspose = 84,
|
|
||||||
OpSampledImage = 86,
|
|
||||||
OpImageSampleImplicitLod = 87,
|
|
||||||
OpImageSampleExplicitLod = 88,
|
|
||||||
OpImageSampleDrefImplicitLod = 89,
|
|
||||||
OpImageSampleDrefExplicitLod = 90,
|
|
||||||
OpImageSampleProjImplicitLod = 91,
|
|
||||||
OpImageSampleProjExplicitLod = 92,
|
|
||||||
OpImageSampleProjDrefImplicitLod = 93,
|
|
||||||
OpImageSampleProjDrefExplicitLod = 94,
|
|
||||||
OpImageFetch = 95,
|
|
||||||
OpImageGather = 96,
|
|
||||||
OpImageDrefGather = 97,
|
|
||||||
OpImageRead = 98,
|
|
||||||
OpImageWrite = 99,
|
|
||||||
OpImage = 100,
|
|
||||||
OpImageQueryFormat = 101,
|
|
||||||
OpImageQueryOrder = 102,
|
|
||||||
OpImageQuerySizeLod = 103,
|
|
||||||
OpImageQuerySize = 104,
|
|
||||||
OpImageQueryLod = 105,
|
|
||||||
OpImageQueryLevels = 106,
|
|
||||||
OpImageQuerySamples = 107,
|
|
||||||
OpConvertFToU = 109,
|
|
||||||
OpConvertFToS = 110,
|
|
||||||
OpConvertSToF = 111,
|
|
||||||
OpConvertUToF = 112,
|
|
||||||
OpUConvert = 113,
|
|
||||||
OpSConvert = 114,
|
|
||||||
OpFConvert = 115,
|
|
||||||
OpQuantizeToF16 = 116,
|
|
||||||
OpConvertPtrToU = 117,
|
|
||||||
OpSatConvertSToU = 118,
|
|
||||||
OpSatConvertUToS = 119,
|
|
||||||
OpConvertUToPtr = 120,
|
|
||||||
OpPtrCastToGeneric = 121,
|
|
||||||
OpGenericCastToPtr = 122,
|
|
||||||
OpGenericCastToPtrExplicit = 123,
|
|
||||||
OpBitcast = 124,
|
|
||||||
OpSNegate = 126,
|
|
||||||
OpFNegate = 127,
|
|
||||||
OpIAdd = 128,
|
|
||||||
OpFAdd = 129,
|
|
||||||
OpISub = 130,
|
|
||||||
OpFSub = 131,
|
|
||||||
OpIMul = 132,
|
|
||||||
OpFMul = 133,
|
|
||||||
OpUDiv = 134,
|
|
||||||
OpSDiv = 135,
|
|
||||||
OpFDiv = 136,
|
|
||||||
OpUMod = 137,
|
|
||||||
OpSRem = 138,
|
|
||||||
OpSMod = 139,
|
|
||||||
OpFRem = 140,
|
|
||||||
OpFMod = 141,
|
|
||||||
OpVectorTimesScalar = 142,
|
|
||||||
OpMatrixTimesScalar = 143,
|
|
||||||
OpVectorTimesMatrix = 144,
|
|
||||||
OpMatrixTimesVector = 145,
|
|
||||||
OpMatrixTimesMatrix = 146,
|
|
||||||
OpOuterProduct = 147,
|
|
||||||
OpDot = 148,
|
|
||||||
OpIAddCarry = 149,
|
|
||||||
OpISubBorrow = 150,
|
|
||||||
OpUMulExtended = 151,
|
|
||||||
OpSMulExtended = 152,
|
|
||||||
OpAny = 154,
|
|
||||||
OpAll = 155,
|
|
||||||
OpIsNan = 156,
|
|
||||||
OpIsInf = 157,
|
|
||||||
OpIsFinite = 158,
|
|
||||||
OpIsNormal = 159,
|
|
||||||
OpSignBitSet = 160,
|
|
||||||
OpLessOrGreater = 161,
|
|
||||||
OpOrdered = 162,
|
|
||||||
OpUnordered = 163,
|
|
||||||
OpLogicalEqual = 164,
|
|
||||||
OpLogicalNotEqual = 165,
|
|
||||||
OpLogicalOr = 166,
|
|
||||||
OpLogicalAnd = 167,
|
|
||||||
OpLogicalNot = 168,
|
|
||||||
OpSelect = 169,
|
|
||||||
OpIEqual = 170,
|
|
||||||
OpINotEqual = 171,
|
|
||||||
OpUGreaterThan = 172,
|
|
||||||
OpSGreaterThan = 173,
|
|
||||||
OpUGreaterThanEqual = 174,
|
|
||||||
OpSGreaterThanEqual = 175,
|
|
||||||
OpULessThan = 176,
|
|
||||||
OpSLessThan = 177,
|
|
||||||
OpULessThanEqual = 178,
|
|
||||||
OpSLessThanEqual = 179,
|
|
||||||
OpFOrdEqual = 180,
|
|
||||||
OpFUnordEqual = 181,
|
|
||||||
OpFOrdNotEqual = 182,
|
|
||||||
OpFUnordNotEqual = 183,
|
|
||||||
OpFOrdLessThan = 184,
|
|
||||||
OpFUnordLessThan = 185,
|
|
||||||
OpFOrdGreaterThan = 186,
|
|
||||||
OpFUnordGreaterThan = 187,
|
|
||||||
OpFOrdLessThanEqual = 188,
|
|
||||||
OpFUnordLessThanEqual = 189,
|
|
||||||
OpFOrdGreaterThanEqual = 190,
|
|
||||||
OpFUnordGreaterThanEqual = 191,
|
|
||||||
OpShiftRightLogical = 194,
|
|
||||||
OpShiftRightArithmetic = 195,
|
|
||||||
OpShiftLeftLogical = 196,
|
|
||||||
OpBitwiseOr = 197,
|
|
||||||
OpBitwiseXor = 198,
|
|
||||||
OpBitwiseAnd = 199,
|
|
||||||
OpNot = 200,
|
|
||||||
OpBitFieldInsert = 201,
|
|
||||||
OpBitFieldSExtract = 202,
|
|
||||||
OpBitFieldUExtract = 203,
|
|
||||||
OpBitReverse = 204,
|
|
||||||
OpBitCount = 205,
|
|
||||||
OpDPdx = 207,
|
|
||||||
OpDPdy = 208,
|
|
||||||
OpFwidth = 209,
|
|
||||||
OpDPdxFine = 210,
|
|
||||||
OpDPdyFine = 211,
|
|
||||||
OpFwidthFine = 212,
|
|
||||||
OpDPdxCoarse = 213,
|
|
||||||
OpDPdyCoarse = 214,
|
|
||||||
OpFwidthCoarse = 215,
|
|
||||||
OpEmitVertex = 218,
|
|
||||||
OpEndPrimitive = 219,
|
|
||||||
OpEmitStreamVertex = 220,
|
|
||||||
OpEndStreamPrimitive = 221,
|
|
||||||
OpControlBarrier = 224,
|
|
||||||
OpMemoryBarrier = 225,
|
|
||||||
OpAtomicLoad = 227,
|
|
||||||
OpAtomicStore = 228,
|
|
||||||
OpAtomicExchange = 229,
|
|
||||||
OpAtomicCompareExchange = 230,
|
|
||||||
OpAtomicCompareExchangeWeak = 231,
|
|
||||||
OpAtomicIIncrement = 232,
|
|
||||||
OpAtomicIDecrement = 233,
|
|
||||||
OpAtomicIAdd = 234,
|
|
||||||
OpAtomicISub = 235,
|
|
||||||
OpAtomicSMin = 236,
|
|
||||||
OpAtomicUMin = 237,
|
|
||||||
OpAtomicSMax = 238,
|
|
||||||
OpAtomicUMax = 239,
|
|
||||||
OpAtomicAnd = 240,
|
|
||||||
OpAtomicOr = 241,
|
|
||||||
OpAtomicXor = 242,
|
|
||||||
OpPhi = 245,
|
|
||||||
OpLoopMerge = 246,
|
|
||||||
OpSelectionMerge = 247,
|
|
||||||
OpLabel = 248,
|
|
||||||
OpBranch = 249,
|
|
||||||
OpBranchConditional = 250,
|
|
||||||
OpSwitch = 251,
|
|
||||||
OpKill = 252,
|
|
||||||
OpReturn = 253,
|
|
||||||
OpReturnValue = 254,
|
|
||||||
OpUnreachable = 255,
|
|
||||||
OpLifetimeStart = 256,
|
|
||||||
OpLifetimeStop = 257,
|
|
||||||
OpGroupAsyncCopy = 259,
|
|
||||||
OpGroupWaitEvents = 260,
|
|
||||||
OpGroupAll = 261,
|
|
||||||
OpGroupAny = 262,
|
|
||||||
OpGroupBroadcast = 263,
|
|
||||||
OpGroupIAdd = 264,
|
|
||||||
OpGroupFAdd = 265,
|
|
||||||
OpGroupFMin = 266,
|
|
||||||
OpGroupUMin = 267,
|
|
||||||
OpGroupSMin = 268,
|
|
||||||
OpGroupFMax = 269,
|
|
||||||
OpGroupUMax = 270,
|
|
||||||
OpGroupSMax = 271,
|
|
||||||
OpReadPipe = 274,
|
|
||||||
OpWritePipe = 275,
|
|
||||||
OpReservedReadPipe = 276,
|
|
||||||
OpReservedWritePipe = 277,
|
|
||||||
OpReserveReadPipePackets = 278,
|
|
||||||
OpReserveWritePipePackets = 279,
|
|
||||||
OpCommitReadPipe = 280,
|
|
||||||
OpCommitWritePipe = 281,
|
|
||||||
OpIsValidReserveId = 282,
|
|
||||||
OpGetNumPipePackets = 283,
|
|
||||||
OpGetMaxPipePackets = 284,
|
|
||||||
OpGroupReserveReadPipePackets = 285,
|
|
||||||
OpGroupReserveWritePipePackets = 286,
|
|
||||||
OpGroupCommitReadPipe = 287,
|
|
||||||
OpGroupCommitWritePipe = 288,
|
|
||||||
OpEnqueueMarker = 291,
|
|
||||||
OpEnqueueKernel = 292,
|
|
||||||
OpGetKernelNDrangeSubGroupCount = 293,
|
|
||||||
OpGetKernelNDrangeMaxSubGroupSize = 294,
|
|
||||||
OpGetKernelWorkGroupSize = 295,
|
|
||||||
OpGetKernelPreferredWorkGroupSizeMultiple = 296,
|
|
||||||
OpRetainEvent = 297,
|
|
||||||
OpReleaseEvent = 298,
|
|
||||||
OpCreateUserEvent = 299,
|
|
||||||
OpIsValidEvent = 300,
|
|
||||||
OpSetUserEventStatus = 301,
|
|
||||||
OpCaptureEventProfilingInfo = 302,
|
|
||||||
OpGetDefaultQueue = 303,
|
|
||||||
OpBuildNDRange = 304,
|
|
||||||
OpImageSparseSampleImplicitLod = 305,
|
|
||||||
OpImageSparseSampleExplicitLod = 306,
|
|
||||||
OpImageSparseSampleDrefImplicitLod = 307,
|
|
||||||
OpImageSparseSampleDrefExplicitLod = 308,
|
|
||||||
OpImageSparseSampleProjImplicitLod = 309,
|
|
||||||
OpImageSparseSampleProjExplicitLod = 310,
|
|
||||||
OpImageSparseSampleProjDrefImplicitLod = 311,
|
|
||||||
OpImageSparseSampleProjDrefExplicitLod = 312,
|
|
||||||
OpImageSparseFetch = 313,
|
|
||||||
OpImageSparseGather = 314,
|
|
||||||
OpImageSparseDrefGather = 315,
|
|
||||||
OpImageSparseTexelsResident = 316,
|
|
||||||
OpNoLine = 317,
|
|
||||||
OpAtomicFlagTestAndSet = 318,
|
|
||||||
OpAtomicFlagClear = 319,
|
|
||||||
OpImageSparseRead = 320,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Overload operator| for mask bit combining
|
|
||||||
|
|
||||||
inline ImageOperandsMask operator|(ImageOperandsMask a, ImageOperandsMask b) { return ImageOperandsMask(unsigned(a) | unsigned(b)); }
|
|
||||||
inline FPFastMathModeMask operator|(FPFastMathModeMask a, FPFastMathModeMask b) { return FPFastMathModeMask(unsigned(a) | unsigned(b)); }
|
|
||||||
inline SelectionControlMask operator|(SelectionControlMask a, SelectionControlMask b) { return SelectionControlMask(unsigned(a) | unsigned(b)); }
|
|
||||||
inline LoopControlMask operator|(LoopControlMask a, LoopControlMask b) { return LoopControlMask(unsigned(a) | unsigned(b)); }
|
|
||||||
inline FunctionControlMask operator|(FunctionControlMask a, FunctionControlMask b) { return FunctionControlMask(unsigned(a) | unsigned(b)); }
|
|
||||||
inline MemorySemanticsMask operator|(MemorySemanticsMask a, MemorySemanticsMask b) { return MemorySemanticsMask(unsigned(a) | unsigned(b)); }
|
|
||||||
inline MemoryAccessMask operator|(MemoryAccessMask a, MemoryAccessMask b) { return MemoryAccessMask(unsigned(a) | unsigned(b)); }
|
|
||||||
inline KernelProfilingInfoMask operator|(KernelProfilingInfoMask a, KernelProfilingInfoMask b) { return KernelProfilingInfoMask(unsigned(a) | unsigned(b)); }
|
|
||||||
|
|
||||||
} // end namespace spv
|
|
||||||
|
|
||||||
#endif // #ifndef spirv_HPP
|
|
||||||
|
|
Loading…
Reference in New Issue