Commit graph

194 commits

Author SHA1 Message Date
Undefine
f4eef9d174 LibWeb: Implement a bunch of values for WebGL2 getParameter 2025-11-01 16:53:39 -07:00
Undefine
50d66ba74c LibWeb: Implement WebGL getVertexAttribOffset 2025-11-01 16:53:39 -07:00
Undefine
1bc7e9d3f8 LibWeb: Stub out WebGL getUniform
This makes the function return a dummy value instead of undefined
as that fixes a crash while capturing on SpectorJS.
2025-11-01 16:53:39 -07:00
Undefine
a2c659ee6b LibWeb: Implement WebGL getVertexAttrib
This also implements all allowed parameter name values for this
function.
2025-11-01 16:53:39 -07:00
Undefine
2d8b393c76 LibWeb: Implement WebGL getShaderSource 2025-11-01 16:53:39 -07:00
Undefine
932a3328a3 LibWeb: Implement WebGL getParameter(COMPRESSED_TEXTURE_FORMATS) 2025-11-01 16:53:39 -07:00
Undefine
bc3761b40d LibWeb: Stubout WebGL2 getParameter(MAX_CLIENT_WAIT_TIMEOUT_WEBGL)
The spec actually mandates that clientWaitSync actually has a time
limit and this is a way to get it. For now just return infinity as this
is required of SpectorJS to work.
2025-11-01 16:53:39 -07:00
Undefine
78aa3467e9 LibWeb: Define GLintptr as 64-bit
In the IDL file GLintptr is defined as long long which is 64-bit, which
made that definition incorrect.
2025-11-01 16:53:39 -07:00
Undefine
8867f1ae62 LibWeb: Correctly report available WebGL extensions
The correct behaviour is to get values of both GL_EXTENSIONS and
GL_REQUESTABLE_EXTENSIONS_ANGLE.
2025-11-01 16:53:39 -07:00
Jelle Raaijmakers
2f7797f854 LibWeb: Implement WebGL2's getBufferSubData()
This allows copying data from a buffer to an ArrayBufferView's storage.
2025-10-30 16:20:33 -07:00
Jelle Raaijmakers
25d78f7c8e LibWeb: Implement WebGL2's readPixels with a byte offset argument
We pass it in as a `void*` since that's what this API expects when you
have bound the GL_PIXEL_PACK_BUFFER buffer.
2025-10-30 16:20:33 -07:00
Jelle Raaijmakers
7b5940d27d LibWeb: Store and return pixel (un)pack buffer bindings in WebGL2 2025-10-30 16:20:33 -07:00
Zaggy1024
7e20b21879 LibWeb: Bind the default frame/render buffers when resetting context
This fixes the masking and warping effects on pixijs.com.

Co-authored-by: Luke Wilde <luke@ladybird.org>
2025-10-29 22:06:31 -07:00
Luke Wilde
3ca4ff6037 LibWeb/WebGL: Don't attempt to do texture transforms on an empty texture
Skia will not give us a surface if the width or height is zero.
2025-10-28 10:05:56 -07:00
Luke Wilde
d733bf54cc LibWeb/WebGL: Avoid copying canvas surface when uploading it 2025-10-25 12:56:17 +02:00
Luke Wilde
d65f0e4490 LibWeb/WebGL: Calculate the correct pitch for compacted types
It's not correct to multiply the number of components by the number of
bytes, since compact formats such as 4_4_4_4 have 4 components but
_always_ stored in 2 bytes, not 8 if you were to do such a
multiplication.

Fixes textures on Google Maps having large blank stripes.
2025-10-25 12:56:17 +02:00
Luke Wilde
3e7061da40 LibWeb/WebGL: Respect UNPACK_FLIP_Y_WEBGL pixel storage parameter
When this is true, we have to vertically flip TexImageSource provided
images before uploading them.

Fixes several graphical glitches on Google Maps.
Fixes globe being upside down on Shopify's homepage.
Likely fixes more websites.
2025-10-25 12:56:17 +02:00
Luke Wilde
008699c129 LibWeb/WebGL: Return null from getUniformLocation if uniform isn't found 2025-10-25 12:56:17 +02:00
Luke Wilde
b8bbebd3ff LibWeb/WebGL: Upload blank image in texImage2D if pixels is null 2025-10-21 23:29:50 +02:00
Luke Wilde
4ebe43af58 LibWeb/WebGL2: Implement most of the transform feedback APIs 2025-10-21 23:29:50 +02:00
Luke Wilde
39d42b7b73 LibWeb/WebGL2: Implement waitSync 2025-10-21 23:29:50 +02:00
Luke Wilde
3005cc30b4 LibWeb/WebGL2: Check if WebGLSync object belongs to the current context 2025-10-21 23:29:50 +02:00
Luke Wilde
3d2874bc4e LibWeb/WebGL2: Implement invalidateSubFramebuffer 2025-10-21 23:29:50 +02:00
Luke Wilde
b949c8ea47 LibWeb/WebGL2: Implement framebufferTextureLayer 2025-10-21 23:29:50 +02:00
Luke Wilde
5c1bf5c3f6 LibWeb/WebGL2: Implement most of the query APIs 2025-10-21 23:29:50 +02:00
Luke Wilde
2b941731a7 LibWeb/WebGL2: Implement compressedTex(Sub)Image3D 2025-10-21 23:29:50 +02:00
Luke Wilde
8dcbe69eb6 LibWeb/WebGL2: Implement drawRangeElements 2025-10-21 23:29:50 +02:00
Luke Wilde
2c13a2a68c LibWeb/WebGL2: Implement vertexAttribI4(u)i(v) 2025-10-21 23:29:50 +02:00
Luke Wilde
35763ffe53 LibWeb/WebGL2: Implement uniform{1,2,3,4}uiv 2025-10-21 23:29:50 +02:00
Luke Wilde
59bea36a59 LibWeb/WebGL2: Implement remaining uniformMatrix methods 2025-10-21 23:29:50 +02:00
Luke Wilde
66a36050bd LibWeb/WebGL: Use surfaceless contexts when making a context current
After we bind the surface to the context for the first time when
allocating the backing image, it internally has a permanent reference
count above 0.

If we switch to a different context and back, the switch back will fail
because the surface has a reference count, which makes ANGLE think
we're trying to use it on a different thread.

However, we can avoid this by using surfaceless contexts, since we
don't use the default framebuffer.

Fixes multiple WebGL contexts on the page freezing.
2025-10-21 09:59:59 +02:00
Luke Wilde
ab3eb9adab LibWeb/WebGL: Replace manual pointer math with Span
This deduplicates a lot of sensitive pointer math by using Span, which
performs this math for us with more safety checks and with type
information.

This also allows us to use the correctly typed Span for typed arrays,
which automatically fixes srcOffset to now offset by the number of
elements instead of bytes. This goes for srcLengthOverride too.

Fixes the Rive animations on Shopify's homepage not appearing.
Fixes some Unity applications such as ArcViewer having missing
graphics.
2025-10-20 16:26:12 +02:00
Luke Wilde
b15f4424f9 LibWeb/WebGL: Implement the EXT_texture_filter_anisotropic extension 2025-10-20 15:33:33 +02:00
Luke Wilde
d08915a0cd LibWeb/WebGL: Implement the WEBGL_compressed_texture_s3tc_srgb extension 2025-10-20 15:33:33 +02:00
Luke Wilde
ddf60ebe9e LibWeb/WebGL2: Implement the EXT_texture_norm16 extension 2025-10-20 15:33:33 +02:00
Luke Wilde
93d3ebfd59 LibWeb/WebGL2: Implement the EXT_render_snorm extension 2025-10-20 15:33:33 +02:00
Aliaksandr Kalenik
20490d146c LibWeb/WebGL: Deduplicate read_and_pixel_convert_texture_image_source()
After we commited code produced by WebGL generator this function ended
up duplicated between WebGL 1 and 2 contexts.
2025-10-02 18:41:02 +02:00
Aliaksandr Kalenik
a6288e12e9 LibWeb/WebGL: Use TexImageSource alias in method signatures 2025-10-02 18:41:02 +02:00
Aliaksandr Kalenik
ffc05a9ca9 LibWeb/WebGL: Define Uint32List exactly like in the spec
Same fix as d54cab60 but applied for Uint32List.
2025-09-30 18:35:32 +02:00
Aliaksandr Kalenik
c75a8fab3b LibWeb/WebGL: Define Int32List exactly like in the spec
Same fix as d54cab60 but applied for Int32List.
2025-09-30 17:57:46 +02:00
Aliaksandr Kalenik
655cd339a7 LibWeb/WebGL: Move Float32List -> Span<float> conversion into helper
This allows to remove lots of duplicated code.
2025-09-30 16:47:16 +02:00
Aliaksandr Kalenik
d54cab60a8 LibWeb/WebGL: Define Float32List exactly like in the spec
Use `Float32Array or sequence<GLfloat>` instead of
`BufferSource or sequence<GLfloat>`. This meaningfully changes behavior
for `Float16Array` and `Float64Array`: they are now converted to
`sequence<GLfloat>` by iterating the typed array, rather than being
treated as a `BufferSource`. As a result, many WebGL calls now work
correctly where we previously crashed in `VERIFY_NOT_REACHED()` due to
the assumption that a `BufferSource` was always a `Float32Array`.

Fixes https://github.com/LadybirdBrowser/ladybird/issues/5962
2025-09-30 16:47:16 +02:00
Erik Kurzinger
0189553bed LibWeb/WebGL: Avoid freeing GL objects belonging to other contexts
The free_surface_resources() function in OpenGLContext.cpp is
responsible for freeing all GL and EGL objects tied to the lifetime of
the painting surface. It is called when the associated canvas is resized
or destroyed. However, if there are multiple WebGL canvases and another
canvas's context is current when the function is called, it will
unintentionally free GL objects belonging to that other context.

To fix this, we call eglMakeCurrent at the start of
free_surface_resources(). This ensures that we will be deleting the
intended objects.

Note that m_impl->surface could be EGL_NO_SURFACE if
free_surface_resources() is called before the painting surface has been
created, but that should be fine. EGL_KHR_surfaceless_context support is
ubiquitous at this point.
2025-08-30 15:49:11 +02:00
ayeteadoe
3df8e00d91 LibWeb: Enable EXPLICIT_SYMBOL_EXPORT 2025-08-23 16:04:36 -06:00
Erik Kurzinger
ce03b8b3b1 LibGfx+LibWeb: Only compile dma-buf-related code on Linux
Shareable Vulkan image allocation on Linux relies on the dma-buf
interface, which is a Linux-specific thing. Therefore, we should only be
compiling it (and any code that uses it) on Linux. This change adds
preprocessor guards to do that. Enabling similar functionality on other
operating systems will need to leverage analogous interfaces on those
platforms, e.g. win32 handles on Windows.

All Vulkan image code will now be guarded by the USE_VULKAN_IMAGES
preprocessor definition, currently enabled on Linux if Vulkan is
available. Additionally, we shuffle around some code in
OpenGLContext.cpp to simplify the preprocessor conditionals.
2025-08-21 14:42:41 +02:00
Aliaksandr Kalenik
d04e3c9bce LibWeb/WebGL: Use auto when possible in OpenGLContext.cpp 2025-08-19 20:45:18 +02:00
Erik Kurzinger
8fd1df4f8b LibGfx: Enable WebGL on Linux
This enabled WebGL on Linux. It uses ANGLE's OpenGL backend running atop
EGL_PLATFORM_SURFACELESS_MESA. Eventually we should probably switch to
the Vulkan backend but that doesn't seem to be enabled in the vcpkg
angle package. Anyway, switching later should be trivial.

The painting surface is allocated through Vulkan and then imported into
EGL as a dma-buf. The DRM format modifier mechanism, along with Vulkan
initializing the image with VK_IMAGE_LAYOUT_GENERAL, should ensure
surface compatibility across the two APIs.

For now, we will synchronize rendering and presentation using glFinish,
although this is admittedly suboptimal. Really we should grab an
EGLSync, export that to an fd, import it into Skia and have it wait for
it before reading from the image. That can be implemented in a future
change, though.
2025-08-19 00:30:22 +02:00
Erik Kurzinger
80693274a7 LibGfx: Fail WebGL context creation if no EGLConfig is found 2025-08-19 00:30:22 +02:00
Erik Kurzinger
72a7051877 LibGfx: Request correct EGLConfig surface type for WebGL
We currently look for an EGLConfig that supports window surfaces, but we
actually use a pbuffer surface.
2025-08-19 00:30:22 +02:00
Erik Kurzinger
df09472d4d LibGfx: Free WebGL painting surface resources on resize
If a WebGL canvas is resized through the set_size function, we will
re-create the painting surface. However, this currently leaks all of the
associated EGL/OpenGL objects. This change introduces the
free_surface_resources function which will free all resources associated
with the painting surface. It will be called before allocating a new
surface and during context destruction. It keeps track of the OpenGL
texture for the color buffer in m_impl instead of just storing it on the
stack.
2025-08-19 00:30:22 +02:00