Explorar o código

LibWeb/WebGL2: Implement uniformMatrix{2,3,4}fv

Luke Wilde hai 7 meses
pai
achega
bd1cc239df

+ 3 - 3
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:

+ 34 - 8
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<Vector<float>>()) {
-        auto& data = value.get<Vector<float>>();
-        glUniformMatrix@number_of_matrix_elements@fv(location->handle(), data.size() / matrix_size, transpose, data.data());
+    float const* raw_data = nullptr;
+    u64 count = 0;
+    if (@array_argument_name@.has<Vector<float>>()) {
+        auto& vector_data = @array_argument_name@.get<Vector<float>>();
+        raw_data = vector_data.data();
+        count = vector_data.size() / matrix_size;
+    } else {
+        auto& typed_array_base = static_cast<JS::TypedArrayBase&>(*@array_argument_name@.get<GC::Root<WebIDL::BufferSource>>()->raw_object());
+        auto& float32_array = verify_cast<JS::Float32Array>(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;
+    }
+
+    if (src_offset + src_length <= count) {
+        set_error(GL_INVALID_VALUE);
         return;
     }
+)~~~");
+            }
 
-    auto& typed_array_base = static_cast<JS::TypedArrayBase&>(*value.get<GC::Root<WebIDL::BufferSource>>()->raw_object());
-    auto& float32_array = verify_cast<JS::Float32Array>(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);
+            function_impl_generator.append(R"~~~(
+    glUniformMatrix@number_of_matrix_elements@fv(location->handle(), count, transpose, raw_data);
 )~~~");
             continue;
         }