#version 310 es
layout(local_size_x = 1) in;

layout(std140, binding = 1) uniform UBO
{
	int index0;
	int index1;
};

layout(binding = 0, std430) buffer SSBO
{
	layout(column_major) mat4 mcol;
	layout(row_major) mat4 mrow;

	layout(column_major) mat2 mcol2x2;
	layout(row_major) mat2 mrow2x2;

	layout(column_major) mat2x3 mcol2x3;
	layout(row_major) mat2x3 mrow2x3;

	layout(column_major) mat3x2 mcol3x2;
	layout(row_major) mat3x2 mrow3x2;
};

void col_to_row()
{
	// Load column-major, store row-major.
	mrow = mcol;
	mrow2x2 = mcol2x2;
	mrow2x3 = mcol2x3;
	mrow3x2 = mcol3x2;
}

void row_to_col()
{
	// Load row-major, store column-major.
	mcol = mrow;
	mcol2x2 = mrow2x2;
	mcol2x3 = mrow2x3;
	mcol3x2 = mrow3x2;
}

void write_dynamic_index_row()
{
	mrow[index0][index1] = 1.0;
	mrow2x2[index0][index1] = 2.0;
	mrow2x3[index0][index1] = 3.0;
	mrow3x2[index0][index1] = 4.0;

	mrow[index0] = vec4(1.0);
	mrow2x2[index0] = vec2(2.0);
	mrow2x3[index0] = vec3(3.0);
	mrow3x2[index0] = vec2(4.0);
}

void write_dynamic_index_col()
{
	mcol[index0][index1] = 1.0;
	mcol2x2[index0][index1] = 2.0;
	mcol2x3[index0][index1] = 3.0;
	mcol3x2[index0][index1] = 4.0;

	mcol[index0] = vec4(1.0);
	mcol2x2[index0] = vec2(2.0);
	mcol2x3[index0] = vec3(3.0);
	mcol3x2[index0] = vec2(4.0);
}

void read_dynamic_index_row()
{
	float a0 = mrow[index0][index1];
	float a1 = mrow2x2[index0][index1];
	float a2 = mrow2x3[index0][index1];
	float a3 = mrow3x2[index0][index1];

	vec4 v0 = mrow[index0];
	vec2 v1 = mrow2x2[index0];
	vec3 v2 = mrow2x3[index0];
	vec2 v3 = mrow3x2[index0];
}

void read_dynamic_index_col()
{
	float a0 = mcol[index0][index1];
	float a1 = mcol2x2[index0][index1];
	float a2 = mcol2x3[index0][index1];
	float a3 = mcol3x2[index0][index1];

	vec4 v0 = mcol[index0];
	vec2 v1 = mcol2x2[index0];
	vec3 v2 = mcol2x3[index0];
	vec2 v3 = mcol3x2[index0];
}

void main()
{
	row_to_col();
	col_to_row();
	write_dynamic_index_row();
	write_dynamic_index_col();
	read_dynamic_index_row();
	read_dynamic_index_col();
}

