From 77ddea8ec13dcea7c335a6825eafa9b4c88e005f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=80=D0=B0=D0=BD=D0=B8=D0=BC=D0=B8=D1=80=20=D0=9A?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D1=9F=D0=B8=D1=9B?= Date: Sat, 26 Oct 2019 08:03:21 -0700 Subject: [PATCH] Updated spirv-cross. --- 3rdparty/spirv-cross/spirv_cfg.cpp | 2 +- 3rdparty/spirv-cross/spirv_msl.cpp | 38 ++++++++++++++++++++++-------- 3rdparty/spirv-cross/spirv_msl.hpp | 1 + 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/3rdparty/spirv-cross/spirv_cfg.cpp b/3rdparty/spirv-cross/spirv_cfg.cpp index f1418994a..463c7562e 100644 --- a/3rdparty/spirv-cross/spirv_cfg.cpp +++ b/3rdparty/spirv-cross/spirv_cfg.cpp @@ -61,7 +61,7 @@ void CFG::build_immediate_dominators() if (immediate_dominators[block]) { assert(immediate_dominators[edge]); - immediate_dominators[block] = find_common_dominator(block, edge); + immediate_dominators[block] = find_common_dominator(immediate_dominators[block], edge); } else immediate_dominators[block] = edge; diff --git a/3rdparty/spirv-cross/spirv_msl.cpp b/3rdparty/spirv-cross/spirv_msl.cpp index d7cb1385b..6839a2ba6 100644 --- a/3rdparty/spirv-cross/spirv_msl.cpp +++ b/3rdparty/spirv-cross/spirv_msl.cpp @@ -6596,6 +6596,14 @@ string CompilerMSL::to_function_args(VariableID img, const SPIRType &imgtype, bo else if (sampling_type_needs_f32_conversion(coord_type)) tex_coords = convert_to_f32(tex_coords, 1); + if (msl_options.texture_1D_as_2D) + { + if (is_fetch) + tex_coords = "uint2(" + tex_coords + ", 0)"; + else + tex_coords = "float2(" + tex_coords + ", 0.5)"; + } + alt_coord_component = 1; break; @@ -6787,14 +6795,14 @@ string CompilerMSL::to_function_args(VariableID img, const SPIRType &imgtype, bo // LOD Options // Metal does not support LOD for 1D textures. - if (bias && imgtype.image.dim != Dim1D) + if (bias && (imgtype.image.dim != Dim1D || msl_options.texture_1D_as_2D)) { forward = forward && should_forward(bias); farg_str += ", bias(" + to_expression(bias) + ")"; } // Metal does not support LOD for 1D textures. - if (lod && imgtype.image.dim != Dim1D) + if (lod && (imgtype.image.dim != Dim1D || msl_options.texture_1D_as_2D)) { forward = forward && should_forward(lod); if (is_fetch) @@ -6806,8 +6814,8 @@ string CompilerMSL::to_function_args(VariableID img, const SPIRType &imgtype, bo farg_str += ", level(" + to_expression(lod) + ")"; } } - else if (is_fetch && !lod && imgtype.image.dim != Dim1D && imgtype.image.dim != DimBuffer && !imgtype.image.ms && - imgtype.image.sampled != 2) + else if (is_fetch && !lod && (imgtype.image.dim != Dim1D || msl_options.texture_1D_as_2D) && + imgtype.image.dim != DimBuffer && !imgtype.image.ms && imgtype.image.sampled != 2) { // Lod argument is optional in OpImageFetch, but we require a LOD value, pick 0 as the default. // Check for sampled type as well, because is_fetch is also used for OpImageRead in MSL. @@ -6815,7 +6823,7 @@ string CompilerMSL::to_function_args(VariableID img, const SPIRType &imgtype, bo } // Metal does not support LOD for 1D textures. - if ((grad_x || grad_y) && imgtype.image.dim != Dim1D) + if ((grad_x || grad_y) && (imgtype.image.dim != Dim1D || msl_options.texture_1D_as_2D)) { forward = forward && should_forward(grad_x); forward = forward && should_forward(grad_y); @@ -9547,8 +9555,13 @@ string CompilerMSL::image_type_glsl(const SPIRType &type, uint32_t id) switch (img_type.dim) { case Dim1D: - img_type_name += "depth1d_unsupported_by_metal"; - break; + if (!msl_options.texture_1D_as_2D) + { + // Use a native Metal 1D texture + img_type_name += "depth1d_unsupported_by_metal"; + break; + } + // else fall through and use 2D case Dim2D: if (img_type.ms && img_type.arrayed) { @@ -9578,9 +9591,6 @@ string CompilerMSL::image_type_glsl(const SPIRType &type, uint32_t id) { switch (img_type.dim) { - case Dim1D: - img_type_name += (img_type.arrayed ? "texture1d_array" : "texture1d"); - break; case DimBuffer: if (img_type.ms || img_type.arrayed) SPIRV_CROSS_THROW("Cannot use texel buffers with multisampling or array layers."); @@ -9594,6 +9604,14 @@ string CompilerMSL::image_type_glsl(const SPIRType &type, uint32_t id) else img_type_name += "texture2d"; break; + case Dim1D: + if (!msl_options.texture_1D_as_2D) + { + // Use a native Metal 1D texture + img_type_name += (img_type.arrayed ? "texture1d_array" : "texture1d"); + break; + } + // else fall through and use 2D case Dim2D: case DimSubpassData: if (img_type.ms && img_type.arrayed) diff --git a/3rdparty/spirv-cross/spirv_msl.hpp b/3rdparty/spirv-cross/spirv_msl.hpp index d16b593a6..139cc9f50 100644 --- a/3rdparty/spirv-cross/spirv_msl.hpp +++ b/3rdparty/spirv-cross/spirv_msl.hpp @@ -274,6 +274,7 @@ public: bool multiview = false; bool view_index_from_device_index = false; bool dispatch_base = false; + bool texture_1D_as_2D = false; // Enable use of MSL 2.0 indirect argument buffers. // MSL 2.0 must also be enabled.