diff --git a/Libraries/LibWeb/WebGL/WebGL2RenderingContextBase.idl b/Libraries/LibWeb/WebGL/WebGL2RenderingContextBase.idl index ce4f485b7c..e1caf7c44f 100644 --- a/Libraries/LibWeb/WebGL/WebGL2RenderingContextBase.idl +++ b/Libraries/LibWeb/WebGL/WebGL2RenderingContextBase.idl @@ -14,8 +14,7 @@ #import #import -// FIXME: BufferSource should be a Uint32Array -typedef (BufferSource or sequence) Uint32List; +typedef (Uint32Array or sequence) Uint32List; // https://registry.khronos.org/webgl/specs/latest/2.0/#3.7 interface mixin WebGL2RenderingContextBase { diff --git a/Libraries/LibWeb/WebGL/WebGL2RenderingContextImpl.cpp b/Libraries/LibWeb/WebGL/WebGL2RenderingContextImpl.cpp index dc4be94a7b..4efa9f462d 100644 --- a/Libraries/LibWeb/WebGL/WebGL2RenderingContextImpl.cpp +++ b/Libraries/LibWeb/WebGL/WebGL2RenderingContextImpl.cpp @@ -484,36 +484,22 @@ void WebGL2RenderingContextImpl::clear_bufferiv(WebIDL::UnsignedLong buffer, Web needs_to_present(); } -void WebGL2RenderingContextImpl::clear_bufferuiv(WebIDL::UnsignedLong buffer, WebIDL::Long drawbuffer, Variant, Vector> values, WebIDL::UnsignedLongLong src_offset) +void WebGL2RenderingContextImpl::clear_bufferuiv(WebIDL::UnsignedLong buffer, WebIDL::Long drawbuffer, Uint32List values, WebIDL::UnsignedLongLong src_offset) { m_context->make_current(); m_context->notify_content_will_change(); - u32 const* data = nullptr; - size_t count = 0; - if (values.has>()) { - auto& vector = values.get>(); - data = vector.data(); - count = vector.size(); - } else if (values.has>()) { - auto& typed_array_base = static_cast(*values.get>()->raw_object()); - auto& typed_array = as(typed_array_base); - data = typed_array.data().data(); - count = typed_array.array_length().length(); - } else { - VERIFY_NOT_REACHED(); - } - + auto span = span_from_uint32_list(values); switch (buffer) { case GL_COLOR: - if (src_offset + 4 > count) { + if (src_offset + 4 > span.size()) { set_error(GL_INVALID_VALUE); return; } break; case GL_DEPTH: case GL_STENCIL: - if (src_offset + 1 > count) { + if (src_offset + 1 > span.size()) { set_error(GL_INVALID_VALUE); return; } @@ -524,8 +510,8 @@ void WebGL2RenderingContextImpl::clear_bufferuiv(WebIDL::UnsignedLong buffer, We return; } - data += src_offset; - glClearBufferuiv(buffer, drawbuffer, data); + span = span.slice(src_offset); + glClearBufferuiv(buffer, drawbuffer, span.data()); needs_to_present(); } diff --git a/Libraries/LibWeb/WebGL/WebGL2RenderingContextImpl.h b/Libraries/LibWeb/WebGL/WebGL2RenderingContextImpl.h index d03c590893..9836e8c796 100644 --- a/Libraries/LibWeb/WebGL/WebGL2RenderingContextImpl.h +++ b/Libraries/LibWeb/WebGL/WebGL2RenderingContextImpl.h @@ -50,7 +50,7 @@ public: void draw_buffers(Vector buffers); void clear_bufferfv(WebIDL::UnsignedLong buffer, WebIDL::Long drawbuffer, Float32List values, WebIDL::UnsignedLongLong src_offset); void clear_bufferiv(WebIDL::UnsignedLong buffer, WebIDL::Long drawbuffer, Int32List values, WebIDL::UnsignedLongLong src_offset); - void clear_bufferuiv(WebIDL::UnsignedLong buffer, WebIDL::Long drawbuffer, Variant, Vector> values, WebIDL::UnsignedLongLong src_offset); + void clear_bufferuiv(WebIDL::UnsignedLong buffer, WebIDL::Long drawbuffer, Uint32List values, WebIDL::UnsignedLongLong src_offset); void clear_bufferfi(WebIDL::UnsignedLong buffer, WebIDL::Long drawbuffer, float depth, WebIDL::Long stencil); GC::Root create_sampler(); void delete_sampler(GC::Root sampler); diff --git a/Libraries/LibWeb/WebGL/WebGLRenderingContextBase.h b/Libraries/LibWeb/WebGL/WebGLRenderingContextBase.h index 8066f46bd6..6f393bc0f7 100644 --- a/Libraries/LibWeb/WebGL/WebGLRenderingContextBase.h +++ b/Libraries/LibWeb/WebGL/WebGLRenderingContextBase.h @@ -21,6 +21,7 @@ class WebGLRenderingContextBase { public: using Float32List = Variant, Vector>; using Int32List = Variant, Vector>; + using Uint32List = Variant, Vector>; virtual GC::Cell const* gc_cell() const = 0; virtual void visit_edges(JS::Cell::Visitor&) = 0; @@ -39,6 +40,13 @@ public: return int32_list.get>(); return int32_list.get>()->data(); } + + static Span span_from_uint32_list(Uint32List& int32_list) + { + if (int32_list.has>()) + return int32_list.get>(); + return int32_list.get>()->data(); + } }; } diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp index 82d0ed3a23..6128ed53e0 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp @@ -183,6 +183,7 @@ static bool is_javascript_builtin(Type const& type) "Float64Array"sv, "Int32Array"sv, "Uint8Array"sv, + "Uint32Array"sv, "Uint8ClampedArray"sv, };