Some compat fixes for MSL and Half.
This commit is contained in:
Родитель
547278da12
Коммит
d9da2db442
|
@ -2592,16 +2592,16 @@ string CompilerGLSL::convert_half_to_string(const SPIRConstant &c, uint32_t col,
|
||||||
{
|
{
|
||||||
// There is no uintBitsToFloat for 16-bit, so have to rely on legacy fallback here.
|
// There is no uintBitsToFloat for 16-bit, so have to rely on legacy fallback here.
|
||||||
if (float_value == numeric_limits<float>::infinity())
|
if (float_value == numeric_limits<float>::infinity())
|
||||||
res = "(1.0hf / 0.0hf)";
|
res = join("(1.0", backend.half_literal_suffix, " / 0.0", backend.half_literal_suffix, ")");
|
||||||
else if (float_value == -numeric_limits<float>::infinity())
|
else if (float_value == -numeric_limits<float>::infinity())
|
||||||
res = "(-1.0hf / 0.0hf)";
|
res = join("(-1.0", backend.half_literal_suffix, " / 0.0", backend.half_literal_suffix, ")");
|
||||||
else if (std::isnan(float_value))
|
else if (std::isnan(float_value))
|
||||||
res = "(0.0hf / 0.0hf)";
|
res = join("(0.0", backend.half_literal_suffix, " / 0.0", backend.half_literal_suffix, ")");
|
||||||
else
|
else
|
||||||
SPIRV_CROSS_THROW("Cannot represent non-finite floating point constant.");
|
SPIRV_CROSS_THROW("Cannot represent non-finite floating point constant.");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
res = convert_to_string(float_value) + "hf";
|
res = convert_to_string(float_value) + backend.half_literal_suffix;
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
|
@ -319,6 +319,7 @@ protected:
|
||||||
bool long_long_literal_suffix = false;
|
bool long_long_literal_suffix = false;
|
||||||
const char *basic_int_type = "int";
|
const char *basic_int_type = "int";
|
||||||
const char *basic_uint_type = "uint";
|
const char *basic_uint_type = "uint";
|
||||||
|
const char *half_literal_suffix = "hf";
|
||||||
bool swizzle_is_function = false;
|
bool swizzle_is_function = false;
|
||||||
bool shared_is_implied = false;
|
bool shared_is_implied = false;
|
||||||
bool flexible_member_array_supported = true;
|
bool flexible_member_array_supported = true;
|
||||||
|
|
|
@ -25,7 +25,12 @@ using namespace spv;
|
||||||
using namespace spirv_cross;
|
using namespace spirv_cross;
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
static const uint32_t k_unknown_location = ~0;
|
static const uint32_t k_unknown_location = ~0u;
|
||||||
|
|
||||||
|
static bool type_is_floating_point(const SPIRType &type)
|
||||||
|
{
|
||||||
|
return type.basetype == SPIRType::Half || type.basetype == SPIRType::Float || type.basetype == SPIRType::Double;
|
||||||
|
}
|
||||||
|
|
||||||
CompilerMSL::CompilerMSL(vector<uint32_t> spirv_, vector<MSLVertexAttr> *p_vtx_attrs,
|
CompilerMSL::CompilerMSL(vector<uint32_t> spirv_, vector<MSLVertexAttr> *p_vtx_attrs,
|
||||||
vector<MSLResourceBinding> *p_res_bindings)
|
vector<MSLResourceBinding> *p_res_bindings)
|
||||||
|
@ -114,6 +119,7 @@ string CompilerMSL::compile()
|
||||||
CompilerGLSL::options.es = false;
|
CompilerGLSL::options.es = false;
|
||||||
CompilerGLSL::options.version = 450;
|
CompilerGLSL::options.version = 450;
|
||||||
backend.float_literal_suffix = false;
|
backend.float_literal_suffix = false;
|
||||||
|
backend.half_literal_suffix = "h";
|
||||||
backend.uint32_t_literal_suffix = true;
|
backend.uint32_t_literal_suffix = true;
|
||||||
backend.basic_int_type = "int";
|
backend.basic_int_type = "int";
|
||||||
backend.basic_uint_type = "uint";
|
backend.basic_uint_type = "uint";
|
||||||
|
@ -597,7 +603,7 @@ uint32_t CompilerMSL::add_interface_block(StorageClass storage)
|
||||||
else if (type.basetype == SPIRType::Boolean || type.basetype == SPIRType::Char ||
|
else if (type.basetype == SPIRType::Boolean || type.basetype == SPIRType::Char ||
|
||||||
type.basetype == SPIRType::Int || type.basetype == SPIRType::UInt ||
|
type.basetype == SPIRType::Int || type.basetype == SPIRType::UInt ||
|
||||||
type.basetype == SPIRType::Int64 || type.basetype == SPIRType::UInt64 ||
|
type.basetype == SPIRType::Int64 || type.basetype == SPIRType::UInt64 ||
|
||||||
type.basetype == SPIRType::Float || type.basetype == SPIRType::Double ||
|
type_is_floating_point(type) ||
|
||||||
type.basetype == SPIRType::Boolean)
|
type.basetype == SPIRType::Boolean)
|
||||||
{
|
{
|
||||||
bool is_builtin = is_builtin_variable(*p_var);
|
bool is_builtin = is_builtin_variable(*p_var);
|
||||||
|
@ -1472,6 +1478,12 @@ void CompilerMSL::emit_instruction(const Instruction &instruction)
|
||||||
UFOP(dfdy);
|
UFOP(dfdy);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case OpFwidth:
|
||||||
|
case OpFwidthCoarse:
|
||||||
|
case OpFwidthFine:
|
||||||
|
UFOP(fwidth);
|
||||||
|
break;
|
||||||
|
|
||||||
// Bitfield
|
// Bitfield
|
||||||
case OpBitFieldInsert:
|
case OpBitFieldInsert:
|
||||||
QFOP(insert_bits);
|
QFOP(insert_bits);
|
||||||
|
@ -2257,7 +2269,7 @@ string CompilerMSL::to_function_args(uint32_t img, const SPIRType &imgtype, bool
|
||||||
bool forward = should_forward(coord);
|
bool forward = should_forward(coord);
|
||||||
auto coord_expr = to_enclosed_expression(coord);
|
auto coord_expr = to_enclosed_expression(coord);
|
||||||
auto &coord_type = expression_type(coord);
|
auto &coord_type = expression_type(coord);
|
||||||
bool coord_is_fp = (coord_type.basetype == SPIRType::Float) || (coord_type.basetype == SPIRType::Double);
|
bool coord_is_fp = type_is_floating_point(coord_type);
|
||||||
bool is_cube_fetch = false;
|
bool is_cube_fetch = false;
|
||||||
|
|
||||||
string tex_coords = coord_expr;
|
string tex_coords = coord_expr;
|
||||||
|
@ -3311,8 +3323,11 @@ string CompilerMSL::type_to_glsl(const SPIRType &type, uint32_t id)
|
||||||
case SPIRType::UInt64:
|
case SPIRType::UInt64:
|
||||||
type_name = "size_t";
|
type_name = "size_t";
|
||||||
break;
|
break;
|
||||||
|
case SPIRType::Half:
|
||||||
|
type_name = "half";
|
||||||
|
break;
|
||||||
case SPIRType::Float:
|
case SPIRType::Float:
|
||||||
type_name = (type.width == 16 ? "half" : "float");
|
type_name = "float";
|
||||||
break;
|
break;
|
||||||
case SPIRType::Double:
|
case SPIRType::Double:
|
||||||
type_name = "double"; // Currently unsupported
|
type_name = "double"; // Currently unsupported
|
||||||
|
@ -3449,7 +3464,9 @@ string CompilerMSL::bitcast_glsl_op(const SPIRType &out_type, const SPIRType &in
|
||||||
(out_type.basetype == SPIRType::Int64 && in_type.basetype == SPIRType::Double) ||
|
(out_type.basetype == SPIRType::Int64 && in_type.basetype == SPIRType::Double) ||
|
||||||
(out_type.basetype == SPIRType::UInt64 && in_type.basetype == SPIRType::Double) ||
|
(out_type.basetype == SPIRType::UInt64 && in_type.basetype == SPIRType::Double) ||
|
||||||
(out_type.basetype == SPIRType::Double && in_type.basetype == SPIRType::Int64) ||
|
(out_type.basetype == SPIRType::Double && in_type.basetype == SPIRType::Int64) ||
|
||||||
(out_type.basetype == SPIRType::Double && in_type.basetype == SPIRType::UInt64))
|
(out_type.basetype == SPIRType::Double && in_type.basetype == SPIRType::UInt64) ||
|
||||||
|
(out_type.basetype == SPIRType::Half && in_type.basetype == SPIRType::UInt) ||
|
||||||
|
(out_type.basetype == SPIRType::UInt && in_type.basetype == SPIRType::Half))
|
||||||
return "as_type<" + type_to_glsl(out_type) + ">";
|
return "as_type<" + type_to_glsl(out_type) + ">";
|
||||||
|
|
||||||
return "";
|
return "";
|
||||||
|
|
Загрузка…
Ссылка в новой задаче