diff --git a/Libraries/LibWeb/WebGL/WebGLRenderingContextOverloads.idl b/Libraries/LibWeb/WebGL/WebGLRenderingContextOverloads.idl index 3ef8713be01..2e442530c37 100644 --- a/Libraries/LibWeb/WebGL/WebGLRenderingContextOverloads.idl +++ b/Libraries/LibWeb/WebGL/WebGLRenderingContextOverloads.idl @@ -15,7 +15,7 @@ interface mixin WebGLRenderingContextOverloads { [FIXME] undefined readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, [AllowShared] ArrayBufferView? pixels); - [FIXME] undefined texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, [AllowShared] ArrayBufferView? pixels); + undefined texImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, [AllowShared] ArrayBufferView? pixels); [FIXME] undefined texImage2D(GLenum target, GLint level, GLint internalformat, GLenum format, GLenum type, TexImageSource source); // May throw DOMException [FIXME] undefined texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, [AllowShared] ArrayBufferView? pixels); diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp index d1e8c521f5a..7557613f92b 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp @@ -747,11 +747,26 @@ static void generate_to_cpp(SourceGenerator& generator, ParameterType& parameter } else if (parameter.type->name() == "ArrayBufferView") { scoped_generator.append(R"~~~( - if (!@js_name@@js_suffix@.is_object() || !(is(@js_name@@js_suffix@.as_object()) || is(@js_name@@js_suffix@.as_object()))) - return vm.throw_completion(JS::ErrorType::NotAnObjectOfType, "@parameter.type.name@"); - - auto @cpp_name@ = GC::make_root(realm.create(@js_name@@js_suffix@.as_object())); + GC::Root @cpp_name@; )~~~"); + if (parameter.type->is_nullable()) { + scoped_generator.append(R"~~~( + if (!@js_name@@js_suffix@.is_null() && !@js_name@@js_suffix@.is_undefined()) { +)~~~"); + } + + scoped_generator.append(R"~~~( + if (!@js_name@@js_suffix@.is_object() || !(is(@js_name@@js_suffix@.as_object()) || is(@js_name@@js_suffix@.as_object()))) + return vm.throw_completion(JS::ErrorType::NotAnObjectOfType, "@parameter.type.name@"); + + @cpp_name@ = GC::make_root(realm.create(@js_name@@js_suffix@.as_object())); +)~~~"); + + if (parameter.type->is_nullable()) { + scoped_generator.append(R"~~~( + } +)~~~"); + } if (optional) { scoped_generator.append(R"~~~( } diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateWebGLRenderingContext.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateWebGLRenderingContext.cpp index a18acb6635a..c34a772930d 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateWebGLRenderingContext.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateWebGLRenderingContext.cpp @@ -263,6 +263,19 @@ public: continue; } + if (function.name == "texImage2D"sv && function.overload_index == 0) { + function_impl_generator.append(R"~~~( + void const* pixels_ptr = nullptr; + if (pixels) { + auto const& viewed_array_buffer = pixels->viewed_array_buffer(); + auto const& byte_buffer = viewed_array_buffer->buffer(); + pixels_ptr = byte_buffer.data(); + } + glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels_ptr); +)~~~"); + continue; + } + if (function.name == "getShaderParameter"sv) { function_impl_generator.append(R"~~~( GLint result = 0;