# Reading mat4 components from UBOs should respect row/column_major layouts. [require] GLSL >= 1.30 GL_ARB_uniform_buffer_object [vertex shader passthrough] [fragment shader] #extension GL_ARB_uniform_buffer_object: require out vec4 outcolor; uniform Block { uint test_variant; layout(row_major) mat4 m_row_major; layout(column_major) mat4 m_col_major; }; vec4 extract_by_index(mat4 m) { return vec4(m[0][0], m[3][0], m[0][3], m[1][2]); } vec4 extract_swizzle(mat4 m) { return vec4(m[0].x, m[3].x, m[0].w, m[1].z); } void main() { /* These variants should result in the same color */ if (test_variant == 0u) outcolor = extract_by_index(m_col_major); else if (test_variant == 1u) outcolor = extract_swizzle(m_col_major); else if (test_variant == 2u) outcolor = extract_by_index(m_row_major); else if (test_variant == 3u) outcolor = extract_swizzle(m_row_major); /* These variants should result in the same color (col sum) */ else if (test_variant == 100u) outcolor = vec4(1, 1, 1, 1) * m_col_major; else if (test_variant == 101u) outcolor = vec4(1, 1, 1, 1) * m_row_major; /* These variants should result in the same color (row sum) */ else if (test_variant == 200u) outcolor = m_col_major * vec4(1, 1, 1, 1); else if (test_variant == 201u) outcolor = m_row_major * vec4(1, 1, 1, 1); } [test] # Matrix: # 0.01 0.05 0.09 0.13 # 0.02 0.06 0.10 0.14 # 0.03 0.07 0.11 0.15 # 0.04 0.08 0.12 0.16 # shader_runner "uniform" command always expects data in column-major format, # but will use the layout specified in the uniform block to upload matrix data # to the GPU, so both lines look similar, but result in different buffer # contents. uniform mat4 m_row_major 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.10 0.11 0.12 0.13 0.14 0.15 0.16 uniform mat4 m_col_major 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.10 0.11 0.12 0.13 0.14 0.15 0.16 clear color 0.0 0.0 0.0 0.0 clear uniform uint test_variant 0 draw rect -1 -1 2 2 probe all rgba 0.01 0.13 0.04 0.07 clear uniform uint test_variant 1 draw rect -1 -1 2 2 probe all rgba 0.01 0.13 0.04 0.07 clear uniform uint test_variant 2 draw rect -1 -1 2 2 probe all rgba 0.01 0.13 0.04 0.07 clear uniform uint test_variant 3 draw rect -1 -1 2 2 probe all rgba 0.01 0.13 0.04 0.07 clear uniform uint test_variant 100 draw rect -1 -1 2 2 probe all rgba 0.1 0.26 0.42 0.58 clear uniform uint test_variant 101 draw rect -1 -1 2 2 probe all rgba 0.1 0.26 0.42 0.58 clear uniform uint test_variant 200 draw rect -1 -1 2 2 probe all rgba 0.28 0.32 0.36 0.40 clear uniform uint test_variant 201 draw rect -1 -1 2 2 probe all rgba 0.28 0.32 0.36 0.40