From 08826d60adf0849544ccdd16f8846bdc98c634b7 Mon Sep 17 00:00:00 2001 From: Jelle Raaijmakers Date: Thu, 20 Jan 2022 01:05:40 +0100 Subject: [PATCH] LibGL: Transpose matrix in `glGetDoublev` and `glGetFloatv` We were returning row-major matrices when OpenGL clients are expecting column-major instead. --- Userland/Libraries/LibGL/SoftwareGLContext.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Userland/Libraries/LibGL/SoftwareGLContext.cpp b/Userland/Libraries/LibGL/SoftwareGLContext.cpp index 6bd1b3fc51..8e75476e38 100644 --- a/Userland/Libraries/LibGL/SoftwareGLContext.cpp +++ b/Userland/Libraries/LibGL/SoftwareGLContext.cpp @@ -1941,12 +1941,15 @@ void SoftwareGLContext::get_floating_point(GLenum pname, T* params) { RETURN_WITH_ERROR_IF(m_in_draw_state, GL_INVALID_OPERATION); - // Handle special matrix cases first - auto flatten_and_assign_matrix = [¶ms](const FloatMatrix4x4& matrix) { + // Handle matrix retrieval first + auto flatten_and_assign_matrix = [¶ms](FloatMatrix4x4 const& matrix) { auto elements = matrix.elements(); - for (size_t i = 0; i < 4; ++i) - for (size_t j = 0; j < 4; ++j) - params[i * 4 + j] = static_cast(elements[i][j]); + for (size_t i = 0; i < 4; ++i) { + for (size_t j = 0; j < 4; ++j) { + // Return transposed matrix since OpenGL defines them as column-major + params[i * 4 + j] = static_cast(elements[j][i]); + } + } }; switch (pname) { case GL_MODELVIEW_MATRIX: