Deal with composite constants in variable initializer.

This commit is contained in:
Hans-Kristian Arntzen 2018-07-05 15:29:49 +02:00
parent dcddd5326e
commit 2bf57d6dff
6 changed files with 27 additions and 8 deletions

View File

@ -35,8 +35,8 @@ void spvArrayCopyConstant(thread T (&dst)[N], constant T (&src)[N])
fragment main0_out main0(main0_in in [[stage_in]])
{
float4 foobar[4] = _76;
float4 baz[4] = _76;
float4 foobar[4] = {float4(0.0), float4(1.0), float4(8.0), float4(5.0)};
float4 baz[4] = {float4(0.0), float4(1.0), float4(8.0), float4(5.0)};
main0_out out = {};
out.FragColor = _46[in.index];
if (in.index < 10)

View File

@ -35,8 +35,8 @@ void spvArrayCopyConstant(thread T (&dst)[N], constant T (&src)[N])
fragment main0_out main0(main0_in in [[stage_in]])
{
float4 foobar[4] = _76;
float4 baz[4] = _76;
float4 foobar[4] = {float4(0.0), float4(1.0), float4(8.0), float4(5.0)};
float4 baz[4] = {float4(0.0), float4(1.0), float4(8.0), float4(5.0)};
main0_out out = {};
out.FragColor = _46[in.index];
if (in.index < 10)

View File

@ -8296,6 +8296,11 @@ string CompilerGLSL::argument_decl(const SPIRFunction::Parameter &arg)
return join(direction, to_qualifiers_glsl(arg.id), variable_decl(type, to_name(arg.id), arg.id));
}
string CompilerGLSL::to_initializer_expression(const SPIRVariable &var)
{
return to_expression(var.initializer);
}
string CompilerGLSL::variable_decl(const SPIRVariable &variable)
{
// Ignore the pointer type since GLSL doesn't have pointers.
@ -8313,7 +8318,7 @@ string CompilerGLSL::variable_decl(const SPIRVariable &variable)
{
uint32_t expr = variable.initializer;
if (ids[expr].get_type() != TypeUndef)
res += join(" = ", to_expression(variable.initializer));
res += join(" = ", to_initializer_expression(variable));
}
return res;
}

View File

@ -463,6 +463,7 @@ protected:
virtual bool skip_argument(uint32_t id) const;
virtual void emit_array_copy(const std::string &lhs, uint32_t rhs_id);
virtual void emit_block_hints(const SPIRBlock &block);
virtual std::string to_initializer_expression(const SPIRVariable &var);
bool buffer_is_packing_standard(const SPIRType &type, BufferPackingStandard packing, uint32_t start_offset = 0,
uint32_t end_offset = std::numeric_limits<uint32_t>::max());

View File

@ -4222,7 +4222,7 @@ CompilerMSL::MemberSorter::MemberSorter(SPIRType &t, Meta &m, SortAspect sa)
meta.members.resize(max(type.member_types.size(), meta.members.size()));
}
void CompilerMSL::remap_constexpr_sampler(uint32_t id, const spirv_cross::MSLConstexprSampler &sampler)
void CompilerMSL::remap_constexpr_sampler(uint32_t id, const MSLConstexprSampler &sampler)
{
auto &type = get<SPIRType>(get<SPIRVariable>(id).basetype);
if (type.basetype != SPIRType::SampledImage && type.basetype != SPIRType::Sampler)
@ -4233,10 +4233,22 @@ void CompilerMSL::remap_constexpr_sampler(uint32_t id, const spirv_cross::MSLCon
}
// MSL always declares builtins with their SPIR-V type.
void CompilerMSL::bitcast_from_builtin_load(uint32_t, std::string &, const spirv_cross::SPIRType &)
void CompilerMSL::bitcast_from_builtin_load(uint32_t, std::string &, const SPIRType &)
{
}
void CompilerMSL::bitcast_to_builtin_store(uint32_t, std::string &, const spirv_cross::SPIRType &)
void CompilerMSL::bitcast_to_builtin_store(uint32_t, std::string &, const SPIRType &)
{
}
std::string CompilerMSL::to_initializer_expression(const SPIRVariable &var)
{
// We risk getting an array initializer here with MSL. If we have an array.
// FIXME: We cannot handle non-constant arrays being initialized.
// We will need to inject spvArrayCopy here somehow ...
auto &type = get<SPIRType>(var.basetype);
if (ids[var.initializer].get_type() == TypeConstant && (!type.array.empty() || type.basetype == SPIRType::Struct))
return constant_expression(get<SPIRConstant>(var.initializer));
else
return CompilerGLSL::to_initializer_expression(var);
}

View File

@ -293,6 +293,7 @@ protected:
uint32_t coord, uint32_t coord_components, uint32_t dref, uint32_t grad_x,
uint32_t grad_y, uint32_t lod, uint32_t coffset, uint32_t offset, uint32_t bias,
uint32_t comp, uint32_t sample, bool *p_forward) override;
std::string to_initializer_expression(const SPIRVariable &var) override;
std::string unpack_expression_type(std::string expr_str, const SPIRType &type) override;
std::string bitcast_glsl_op(const SPIRType &result_type, const SPIRType &argument_type) override;
bool skip_argument(uint32_t id) const override;