From 6e42f401f9ff0152d9db39ae4b6828e9a97dec41 Mon Sep 17 00:00:00 2001 From: Luke Wilde Date: Fri, 13 Dec 2024 19:00:43 +0000 Subject: [PATCH] LibWeb/WebGL2: Implement texImage3D with ArrayBufferView and offset --- .../WebGL/WebGL2RenderingContextBase.idl | 2 +- .../LibWeb/GenerateWebGLRenderingContext.cpp | 21 ++++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/Libraries/LibWeb/WebGL/WebGL2RenderingContextBase.idl b/Libraries/LibWeb/WebGL/WebGL2RenderingContextBase.idl index 21c8d2f107..ed803428f4 100644 --- a/Libraries/LibWeb/WebGL/WebGL2RenderingContextBase.idl +++ b/Libraries/LibWeb/WebGL/WebGL2RenderingContextBase.idl @@ -316,7 +316,7 @@ interface mixin WebGL2RenderingContextBase { [FIXME] undefined texImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, TexImageSource source); undefined texImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, [AllowShared] ArrayBufferView? srcData); - [FIXME] undefined texImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, [AllowShared] ArrayBufferView srcData, unsigned long long srcOffset); + undefined texImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, [AllowShared] ArrayBufferView srcData, unsigned long long srcOffset); [FIXME] undefined texSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLintptr pboOffset); diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateWebGLRenderingContext.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateWebGLRenderingContext.cpp index 4825c4340a..f800790a2a 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateWebGLRenderingContext.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/GenerateWebGLRenderingContext.cpp @@ -595,7 +595,7 @@ public: continue; } - if (function.name == "texImage3D"sv) { + if (function.name == "texImage3D"sv && function.overload_index == 0) { // FIXME: If a WebGLBuffer is bound to the PIXEL_UNPACK_BUFFER target, generates an INVALID_OPERATION error. // FIXME: If srcData is null, a buffer of sufficient size initialized to 0 is passed. // FIXME: If type is specified as FLOAT_32_UNSIGNED_INT_24_8_REV, srcData must be null; otherwise, generates an INVALID_OPERATION error. @@ -614,6 +614,25 @@ public: continue; } + if (function.name == "texImage3D"sv && function.overload_index == 1) { + // FIXME: If a WebGLBuffer is bound to the PIXEL_UNPACK_BUFFER target, generates an INVALID_OPERATION error. + // FIXME: If srcData is null, a buffer of sufficient size initialized to 0 is passed. + // FIXME: If type is specified as FLOAT_32_UNSIGNED_INT_24_8_REV, srcData must be null; otherwise, generates an INVALID_OPERATION error. + // FIXME: If srcData is non-null, the type of srcData must match the type according to the above table; otherwise, generate an INVALID_OPERATION error. + // FIXME: If an attempt is made to call this function with no WebGLTexture bound (see above), generates an INVALID_OPERATION error. + // FIXME: If there's not enough data in srcData starting at srcOffset, generate INVALID_OPERATION. + function_impl_generator.append(R"~~~( + void const* src_data_ptr = nullptr; + if (src_data) { + auto const& viewed_array_buffer = src_data->viewed_array_buffer(); + auto const& byte_buffer = viewed_array_buffer->buffer(); + src_data_ptr = byte_buffer.data() + src_offset; + } + glTexImage3D(target, level, internalformat, width, height, depth, border, format, type, src_data_ptr); +)~~~"); + continue; + } + if (function.name == "texImage2D"sv && function.overload_index == 1) { // FIXME: If this function is called with an ImageData whose data attribute has been neutered, // an INVALID_VALUE error is generated.