Correctly unpack row-major matrices when storing to LHS.

This commit is contained in:
Hans-Kristian Arntzen 2019-07-22 12:03:12 +02:00
parent 172185016f
commit 14afb968dd
7 changed files with 32 additions and 21 deletions

View File

@ -45,8 +45,8 @@ void copy_col_major_to_row_major(device SSBOCol& v_29, device SSBORow& v_41)
void copy_row_major_to_col_major(device SSBOCol& v_29, device SSBORow& v_41)
{
v_29.col_major0[0].xy = float2(float2x2(v_41.row_major0[0], v_41.row_major0[1])[0][0], float2x2(v_41.row_major0[0], v_41.row_major0[1])[1][0]));
v_29.col_major0[1].xy = float2(float2x2(v_41.row_major0[0], v_41.row_major0[1])[0][1], float2x2(v_41.row_major0[0], v_41.row_major0[1])[1][1]));
v_29.col_major0[0].xy = float2(float2x2(v_41.row_major0[0].xy, v_41.row_major0[1].xy)[0][0], float2x2(v_41.row_major0[0].xy, v_41.row_major0[1].xy)[1][0]));
v_29.col_major0[1].xy = float2(float2x2(v_41.row_major0[0].xy, v_41.row_major0[1].xy)[0][1], float2x2(v_41.row_major0[0].xy, v_41.row_major0[1].xy)[1][1]));
}
void copy_row_major_to_row_major(device SSBORow& v_41)

View File

@ -45,8 +45,8 @@ void copy_col_major_to_row_major(device SSBOCol& v_29, device SSBORow& v_41)
void copy_row_major_to_col_major(device SSBOCol& v_29, device SSBORow& v_41)
{
v_29.col_major0[0] = float3(v_41.row_major0[0][0], v_41.row_major0[1][0], v_41.row_major0[2][0]));
v_29.col_major0[1] = float3(v_41.row_major0[0][1], v_41.row_major0[1][1], v_41.row_major0[2][1]));
v_29.col_major0[0] = float3(float2x3(v_41.row_major0[0], v_41.row_major0[1], v_41.row_major0[2])[0][0], float2x3(v_41.row_major0[0], v_41.row_major0[1], v_41.row_major0[2])[1][0], float2x3(v_41.row_major0[0], v_41.row_major0[1], v_41.row_major0[2])[2][0]));
v_29.col_major0[1] = float3(float2x3(v_41.row_major0[0], v_41.row_major0[1], v_41.row_major0[2])[0][1], float2x3(v_41.row_major0[0], v_41.row_major0[1], v_41.row_major0[2])[1][1], float2x3(v_41.row_major0[0], v_41.row_major0[1], v_41.row_major0[2])[2][1]));
}
void copy_row_major_to_row_major(device SSBORow& v_41)

View File

@ -45,9 +45,9 @@ void copy_col_major_to_row_major(device SSBOCol& v_29, device SSBORow& v_41)
void copy_row_major_to_col_major(device SSBOCol& v_29, device SSBORow& v_41)
{
v_29.col_major0[0].xy = float2(v_41.row_major0[0][0], v_41.row_major0[1][0]));
v_29.col_major0[1].xy = float2(v_41.row_major0[0][1], v_41.row_major0[1][1]));
v_29.col_major0[2].xy = float2(v_41.row_major0[0][2], v_41.row_major0[1][2]));
v_29.col_major0[0].xy = float2(float3x2(v_41.row_major0[0], v_41.row_major0[1])[0][0], float3x2(v_41.row_major0[0], v_41.row_major0[1])[1][0]));
v_29.col_major0[1].xy = float2(float3x2(v_41.row_major0[0], v_41.row_major0[1])[0][1], float3x2(v_41.row_major0[0], v_41.row_major0[1])[1][1]));
v_29.col_major0[2].xy = float2(float3x2(v_41.row_major0[0], v_41.row_major0[1])[0][2], float3x2(v_41.row_major0[0], v_41.row_major0[1])[1][2]));
}
void copy_row_major_to_row_major(device SSBORow& v_41)
@ -57,7 +57,7 @@ void copy_row_major_to_row_major(device SSBORow& v_41)
void copy_columns(device SSBOCol& v_29, device SSBORow& v_41)
{
v_29.col_major0[1][0].xy = float2(v_41.row_major0[1][0][0], v_41.row_major0[1][1][0]));
v_29.col_major0[1][0].xy = float2(float2(v_41.row_major0[1])[0][0], float2(v_41.row_major0[1])[1][0]));
v_29.col_major0[1] = float2(v_41.row_major0[0][1], v_41.row_major0[1][1]);
v_41.row_major0[0][1] = v_29.col_major0[1].x;
v_41.row_major0[1][1] = v_29.col_major0[1].y;

View File

@ -47,10 +47,10 @@ void copy_col_major_to_row_major(device SSBOCol& v_29, device SSBORow& v_41)
void copy_row_major_to_col_major(device SSBOCol& v_29, device SSBORow& v_41)
{
v_29.col_major0[0].xy = float2(v_41.row_major0[0][0], v_41.row_major0[1][0]));
v_29.col_major0[1].xy = float2(v_41.row_major0[0][1], v_41.row_major0[1][1]));
v_29.col_major0[2].xy = float2(v_41.row_major0[0][2], v_41.row_major0[1][2]));
v_29.col_major0[3].xy = float2(v_41.row_major0[0][3], v_41.row_major0[1][3]));
v_29.col_major0[0].xy = float2(float4x2(v_41.row_major0[0], v_41.row_major0[1])[0][0], float4x2(v_41.row_major0[0], v_41.row_major0[1])[1][0]));
v_29.col_major0[1].xy = float2(float4x2(v_41.row_major0[0], v_41.row_major0[1])[0][1], float4x2(v_41.row_major0[0], v_41.row_major0[1])[1][1]));
v_29.col_major0[2].xy = float2(float4x2(v_41.row_major0[0], v_41.row_major0[1])[0][2], float4x2(v_41.row_major0[0], v_41.row_major0[1])[1][2]));
v_29.col_major0[3].xy = float2(float4x2(v_41.row_major0[0], v_41.row_major0[1])[0][3], float4x2(v_41.row_major0[0], v_41.row_major0[1])[1][3]));
}
void copy_row_major_to_row_major(device SSBORow& v_41)
@ -60,7 +60,7 @@ void copy_row_major_to_row_major(device SSBORow& v_41)
void copy_columns(device SSBOCol& v_29, device SSBORow& v_41)
{
v_29.col_major0[1][0].xy = float2(v_41.row_major0[1][0][0], v_41.row_major0[1][1][0]));
v_29.col_major0[1][0].xy = float2(float2(v_41.row_major0[1])[0][0], float2(v_41.row_major0[1])[1][0]));
v_29.col_major0[1] = float2(v_41.row_major0[0][1], v_41.row_major0[1][1]);
v_41.row_major0[0][1] = v_29.col_major0[1].x;
v_41.row_major0[1][1] = v_29.col_major0[1].y;

View File

@ -49,10 +49,10 @@ void copy_col_major_to_row_major(device SSBOCol& v_29, device SSBORow& v_41)
void copy_row_major_to_col_major(device SSBOCol& v_29, device SSBORow& v_41)
{
v_29.col_major0[0] = float3(v_41.row_major0[0][0], v_41.row_major0[1][0], v_41.row_major0[2][0]));
v_29.col_major0[1] = float3(v_41.row_major0[0][1], v_41.row_major0[1][1], v_41.row_major0[2][1]));
v_29.col_major0[2] = float3(v_41.row_major0[0][2], v_41.row_major0[1][2], v_41.row_major0[2][2]));
v_29.col_major0[3] = float3(v_41.row_major0[0][3], v_41.row_major0[1][3], v_41.row_major0[2][3]));
v_29.col_major0[0] = float3(float4x3(v_41.row_major0[0], v_41.row_major0[1], v_41.row_major0[2])[0][0], float4x3(v_41.row_major0[0], v_41.row_major0[1], v_41.row_major0[2])[1][0], float4x3(v_41.row_major0[0], v_41.row_major0[1], v_41.row_major0[2])[2][0]));
v_29.col_major0[1] = float3(float4x3(v_41.row_major0[0], v_41.row_major0[1], v_41.row_major0[2])[0][1], float4x3(v_41.row_major0[0], v_41.row_major0[1], v_41.row_major0[2])[1][1], float4x3(v_41.row_major0[0], v_41.row_major0[1], v_41.row_major0[2])[2][1]));
v_29.col_major0[2] = float3(float4x3(v_41.row_major0[0], v_41.row_major0[1], v_41.row_major0[2])[0][2], float4x3(v_41.row_major0[0], v_41.row_major0[1], v_41.row_major0[2])[1][2], float4x3(v_41.row_major0[0], v_41.row_major0[1], v_41.row_major0[2])[2][2]));
v_29.col_major0[3] = float3(float4x3(v_41.row_major0[0], v_41.row_major0[1], v_41.row_major0[2])[0][3], float4x3(v_41.row_major0[0], v_41.row_major0[1], v_41.row_major0[2])[1][3], float4x3(v_41.row_major0[0], v_41.row_major0[1], v_41.row_major0[2])[2][3]));
}
void copy_row_major_to_row_major(device SSBORow& v_41)

View File

@ -2841,7 +2841,9 @@ void CompilerMSL::emit_store_statement(uint32_t lhs_expression, uint32_t rhs_exp
string rhs_row = type_to_glsl_constructor(vector_type) + "(";
for (uint32_t j = 0; j < vector_type.vecsize; j++)
{
rhs_row += join(to_enclosed_pointer_expression(rhs_expression), "[", j, "][", i, "]");
// Need to explicitly unpack expression since we've mucked with transpose state.
auto unpacked_expr = unpack_expression_explicit(rhs_expression, true);
rhs_row += join(unpacked_expr, "[", j, "][", i, "]");
if (j + 1 < vector_type.vecsize)
rhs_row += ", ";
}
@ -2857,7 +2859,7 @@ void CompilerMSL::emit_store_statement(uint32_t lhs_expression, uint32_t rhs_exp
for (uint32_t i = 0; i < type.columns; i++)
{
statement(enclose_expression(to_dereferenced_expression(lhs_expression)),
"[", i, "]", store_swiz, " = ", to_enclosed_pointer_expression(rhs_expression), "[", i, "];");
"[", i, "]", store_swiz, " = ", to_enclosed_unpacked_expression(rhs_expression), "[", i, "];");
}
}
}
@ -2909,14 +2911,19 @@ void CompilerMSL::emit_store_statement(uint32_t lhs_expression, uint32_t rhs_exp
}
}
string CompilerMSL::unpack_expression_explicit(uint32_t id, bool row_major)
{
return unpack_expression_type(to_expression(id), expression_type(id),
get_extended_decoration(id, SPIRVCrossDecorationPhysicalTypeID),
has_extended_decoration(id, SPIRVCrossDecorationPhysicalTypePacked), row_major);
}
// Converts the format of the current expression from packed to unpacked,
// by wrapping the expression in a constructor of the appropriate type.
// Also, handle special physical ID remapping scenarios, similar to emit_store_statement().
string CompilerMSL::unpack_expression_type(string expr_str, const SPIRType &type, uint32_t physical_type_id,
bool packed, bool row_major)
{
(void)packed;
const SPIRType *physical_type = nullptr;
if (physical_type_id)
physical_type = &get<SPIRType>(physical_type_id);

View File

@ -439,6 +439,10 @@ protected:
uint32_t comp, uint32_t sample, uint32_t minlod, 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, uint32_t physical_type_id, bool is_packed, bool row_major) override;
// Special purpose unpack which overrides transpose state, used internally only for matrix packing.
std::string unpack_expression_explicit(uint32_t id, bool row_major);
std::string bitcast_glsl_op(const SPIRType &result_type, const SPIRType &argument_type) override;
bool skip_argument(uint32_t id) const override;
std::string to_member_reference(uint32_t base, const SPIRType &type, uint32_t index, bool ptr_chain) override;