1cb93a386Sopenharmony_ci#version 450
2cb93a386Sopenharmony_ci#extension GL_EXT_scalar_block_layout : require
3cb93a386Sopenharmony_cilayout(local_size_x = 1) in;
4cb93a386Sopenharmony_ci
5cb93a386Sopenharmony_ci#define T mat2
6cb93a386Sopenharmony_ci#define PACKING scalar
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_cilayout(set = 0, binding = 0, PACKING) buffer SSBOCol
9cb93a386Sopenharmony_ci{
10cb93a386Sopenharmony_ci	layout(column_major) T col_major0;
11cb93a386Sopenharmony_ci	layout(column_major) T col_major1;
12cb93a386Sopenharmony_ci};
13cb93a386Sopenharmony_ci
14cb93a386Sopenharmony_cilayout(set = 0, binding = 1, PACKING) buffer SSBORow
15cb93a386Sopenharmony_ci{
16cb93a386Sopenharmony_ci	layout(row_major) T row_major0;
17cb93a386Sopenharmony_ci	layout(row_major) T row_major1;
18cb93a386Sopenharmony_ci};
19cb93a386Sopenharmony_ci
20cb93a386Sopenharmony_civoid load_store_to_variable_col_major()
21cb93a386Sopenharmony_ci{
22cb93a386Sopenharmony_ci	// Load to variable.
23cb93a386Sopenharmony_ci	T loaded = col_major0;
24cb93a386Sopenharmony_ci
25cb93a386Sopenharmony_ci	// Store from variable.
26cb93a386Sopenharmony_ci	col_major1 = loaded;
27cb93a386Sopenharmony_ci}
28cb93a386Sopenharmony_ci
29cb93a386Sopenharmony_civoid load_store_to_variable_row_major()
30cb93a386Sopenharmony_ci{
31cb93a386Sopenharmony_ci	// Load to variable.
32cb93a386Sopenharmony_ci	T loaded = row_major0;
33cb93a386Sopenharmony_ci
34cb93a386Sopenharmony_ci	// Store to variable.
35cb93a386Sopenharmony_ci	row_major0 = loaded;
36cb93a386Sopenharmony_ci}
37cb93a386Sopenharmony_ci
38cb93a386Sopenharmony_civoid copy_col_major_to_col_major()
39cb93a386Sopenharmony_ci{
40cb93a386Sopenharmony_ci	// Copy col -> col
41cb93a386Sopenharmony_ci	col_major0 = col_major1;
42cb93a386Sopenharmony_ci}
43cb93a386Sopenharmony_ci
44cb93a386Sopenharmony_civoid copy_row_major_to_col_major()
45cb93a386Sopenharmony_ci{
46cb93a386Sopenharmony_ci	// Copy row -> col
47cb93a386Sopenharmony_ci	col_major0 = row_major0;
48cb93a386Sopenharmony_ci}
49cb93a386Sopenharmony_ci
50cb93a386Sopenharmony_civoid copy_col_major_to_row_major()
51cb93a386Sopenharmony_ci{
52cb93a386Sopenharmony_ci	// Copy col -> row
53cb93a386Sopenharmony_ci	row_major0 = col_major0;
54cb93a386Sopenharmony_ci}
55cb93a386Sopenharmony_ci
56cb93a386Sopenharmony_civoid copy_row_major_to_row_major()
57cb93a386Sopenharmony_ci{
58cb93a386Sopenharmony_ci	// Copy row -> row
59cb93a386Sopenharmony_ci	row_major0 = row_major1;
60cb93a386Sopenharmony_ci}
61cb93a386Sopenharmony_ci
62cb93a386Sopenharmony_civoid copy_columns()
63cb93a386Sopenharmony_ci{
64cb93a386Sopenharmony_ci	// Copy columns/rows.
65cb93a386Sopenharmony_ci	col_major0[1] = row_major0[1];
66cb93a386Sopenharmony_ci	row_major0[1] = col_major0[1];
67cb93a386Sopenharmony_ci}
68cb93a386Sopenharmony_ci
69cb93a386Sopenharmony_civoid copy_elements()
70cb93a386Sopenharmony_ci{
71cb93a386Sopenharmony_ci	// Copy individual elements.
72cb93a386Sopenharmony_ci	col_major0[0][1] = row_major0[0][1];
73cb93a386Sopenharmony_ci	row_major0[0][1] = col_major0[0][1];
74cb93a386Sopenharmony_ci}
75cb93a386Sopenharmony_ci
76cb93a386Sopenharmony_civoid main()
77cb93a386Sopenharmony_ci{
78cb93a386Sopenharmony_ci	load_store_to_variable_col_major();
79cb93a386Sopenharmony_ci	load_store_to_variable_row_major();
80cb93a386Sopenharmony_ci	copy_col_major_to_col_major();
81cb93a386Sopenharmony_ci	copy_col_major_to_row_major();
82cb93a386Sopenharmony_ci	copy_row_major_to_col_major();
83cb93a386Sopenharmony_ci	copy_row_major_to_row_major();
84cb93a386Sopenharmony_ci	copy_columns();
85cb93a386Sopenharmony_ci	copy_elements();
86cb93a386Sopenharmony_ci}
87