Correctly unpack row-major matrices when storing to LHS.
This commit is contained in:
parent
172185016f
commit
14afb968dd
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user