From bd1cc239df9b1af90cee542e6ab6bbebc69ec358 Mon Sep 17 00:00:00 2001 From: Luke Wilde Date: Fri, 13 Dec 2024 14:06:04 +0000 Subject: [PATCH] LibWeb/WebGL2: Implement uniformMatrix{2,3,4}fv --- .../WebGL/WebGL2RenderingContextOverloads.idl | 6 +-- .../LibWeb/GenerateWebGLRenderingContext.cpp | 44 +++++++++++++++---- 2 files changed, 38 insertions(+), 12 deletions(-) diff --git a/Libraries/LibWeb/WebGL/WebGL2RenderingContextOverloads.idl b/Libraries/LibWeb/WebGL/WebGL2RenderingContextOverloads.idl index 3ed7b1b6b0f..4c48f0766b1 100644 --- a/Libraries/LibWeb/WebGL/WebGL2RenderingContextOverloads.idl +++ b/Libraries/LibWeb/WebGL/WebGL2RenderingContextOverloads.idl @@ -53,9 +53,9 @@ interface mixin WebGL2RenderingContextOverloads { undefined uniform3iv(WebGLUniformLocation? location, Int32List v, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0); undefined uniform4iv(WebGLUniformLocation? location, Int32List v, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0); - [FIXME] undefined uniformMatrix2fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0); - [FIXME] undefined uniformMatrix3fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0); - [FIXME] undefined uniformMatrix4fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0); + undefined uniformMatrix2fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0); + undefined uniformMatrix3fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0); + undefined uniformMatrix4fv(WebGLUniformLocation? location, GLboolean transpose, Float32List data, optional unsigned long long srcOffset = 0, optional GLuint srcLength = 0); // Reading back pixels // WebGL1: diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateWebGLRenderingContext.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateWebGLRenderingContext.cpp index 0b30b804454..da21c582955 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateWebGLRenderingContext.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateWebGLRenderingContext.cpp @@ -687,19 +687,45 @@ public: if (function.name.starts_with("uniformMatrix"sv)) { auto number_of_matrix_elements = function.name.substring_view(13, 1); function_impl_generator.set("number_of_matrix_elements", number_of_matrix_elements); + + if (webgl_version == 1) { + function_impl_generator.set("array_argument_name", "value"); + } else { + function_impl_generator.set("array_argument_name", "data"); + } + function_impl_generator.append(R"~~~( auto matrix_size = @number_of_matrix_elements@ * @number_of_matrix_elements@; - if (value.has>()) { - auto& data = value.get>(); - glUniformMatrix@number_of_matrix_elements@fv(location->handle(), data.size() / matrix_size, transpose, data.data()); - return; + float const* raw_data = nullptr; + u64 count = 0; + if (@array_argument_name@.has>()) { + auto& vector_data = @array_argument_name@.get>(); + raw_data = vector_data.data(); + count = vector_data.size() / matrix_size; + } else { + auto& typed_array_base = static_cast(*@array_argument_name@.get>()->raw_object()); + auto& float32_array = verify_cast(typed_array_base); + raw_data = float32_array.data().data(); + count = float32_array.array_length().length() / matrix_size; + } +)~~~"); + + if (webgl_version == 2) { + function_impl_generator.append(R"~~~( + raw_data += src_offset; + if (src_length == 0) { + count -= src_offset; } - auto& typed_array_base = static_cast(*value.get>()->raw_object()); - auto& float32_array = verify_cast(typed_array_base); - float const* data = float32_array.data().data(); - auto count = float32_array.array_length().length() / matrix_size; - glUniformMatrix@number_of_matrix_elements@fv(location->handle(), count, transpose, data); + if (src_offset + src_length <= count) { + set_error(GL_INVALID_VALUE); + return; + } +)~~~"); + } + + function_impl_generator.append(R"~~~( + glUniformMatrix@number_of_matrix_elements@fv(location->handle(), count, transpose, raw_data); )~~~"); continue; }