Commit graph

55909 commits

Author SHA1 Message Date
Aliaksandr Kalenik
b6732b0234 Ladybird+WebContent: Add option to use GPU painter
Adds `--enable-gpu-painting` param to enable painting command executor
that uses LibAccelGfx.
2023-10-29 17:13:23 +01:00
Aliaksandr Kalenik
7d26cbf523 LibWeb: Add painting command executor that uses LibAccelGfx
This change introduces a command executor for RecordingPainter that
utilizes LibAccelGfx.
2023-10-29 17:13:23 +01:00
Aliaksandr Kalenik
95c154d9bd LibAccelGfx+Meta: Introduce OpenGL painting library
This change introduces a new 2D graphics library that uses OpenGL to
perform painting operations. For now, it has extremely limited
functionality and supports only rectangle painting, but we have to
start somewhere.

Since this library is intended to be used by LibWeb, where the
WebContent process does not have an associated window, painting occurs
in an offscreen buffer created using EGL.

For now it is only possible to compile this library on linux.
Offscreen context creation on SerenityOS and MacOS will have to be
implemented separately in the future.

Co-Authored-By: Andreas Kling <awesomekling@gmail.com>
2023-10-29 17:13:23 +01:00
Zaggy1024
56e8f52cb3 LibJIT/LibJS: Remove jump_if_***() in favor of jump_if()
The `jump_if()` function implements all the conditions already in use
and more, so let's avoid encouraging more wrapper functions.
2023-10-29 17:11:04 +01:00
Zaggy1024
288aff01cd LibJIT: Emit all Jcc jump instructions from one function
Since all conditional instructions use a certain number of bits to
encode the condition type (from my observation of `Jcc`, `SETcc` and
`CMOVcc`), let's abuse that to deduplicate some code!

This adds a `Condition` enum that defines the type of condition we are
jumping based on, whose underlying values are the values that must be
encoded to trigger each condition.
2023-10-29 17:11:04 +01:00
Zaggy1024
e717961000 LibJIT: Use test x, x instead of cmp x, 0 in all cases
The `test` instruction will have the same result as `cmp` when
comparing to zero, so let's always emit that code. This has no effect
until the following commit.
2023-10-29 17:11:04 +01:00
Karol Kosek
bf16ddfbb0 LibWeb: Bail parsing transform-origin if the parsed value is null
Passing a value of a type different than number or length-percentage
to transform-origin returned a null pointer, and we didn't take care
of that path before.

This patch fixes a crash caused by an incorrect CSS declaration, such as
`transform-origin: "center"`.

Fixes #21609
2023-10-29 11:22:53 +01:00
Aliaksandr Kalenik
d22aa851cf LibWeb: Float property should be ignored for grid items 2023-10-29 09:43:13 +01:00
Aliaksandr Kalenik
5ef94f0ba8 LibWeb/Painting: Fix translation for FIllRect command
After 4318bcf447 RecordingPainter
is suppoed to write commands in coordinate system of stacking context.

This commit adds missing translation for FillRect command.
2023-10-29 08:48:34 +01:00
Aliaksandr Kalenik
f75186ec8f LibWeb: Add support for grid item's min-height and max-height in GFC 2023-10-29 08:46:51 +01:00
Lucas CHOLLET
e721c74598 LibGfx: Provide an implementation for ImageDecoderPlugin::icc_data() 2023-10-29 07:21:10 +00:00
iliadsh
4f3945024a LibJS/JIT: Add fast path for Add Int32, Int32
This uses the 32-bit registers to perform the addition and bail if the
overflow flag (OF) is set.
2023-10-29 08:02:00 +01:00
Simon Wanner
4b23a7dfb4 LibJS/JIT: Compile the NewClass bytecode instruction 2023-10-29 07:44:11 +01:00
Simon Wanner
f9fbb8cff2 LibJS/Bytecode: Move NewClass impl to CommonImplementations 2023-10-29 07:44:11 +01:00
Simon Wanner
ddce5e03c2 LibJS/JIT: Clear unwind context handler on usage
This clears the handler pointer of the current unwind context
before jumping to it. This is necessary to not loop infinitely
when an exception is thrown from the handler.
In that case control flow should go to the finalizer instead.

This mirrors how unwind_context.handler_called is used in the
Bytecode::Interpreter.

`try { throw 1 } catch (e) { throw 2 } finally {}` now runs
without looping infinitely in the catch block.
2023-10-29 07:44:11 +01:00
Simon Wanner
224f92f6e4 LibJS/JIT: Compile the CreateVariable bytecode instruction 2023-10-29 07:44:11 +01:00
Simon Wanner
54f1f7a51b LibJS/Bytecode: Move CreateVariable impl to CommonImplementations 2023-10-29 07:44:11 +01:00
Simon Wanner
1d3062de9e LibJS/JIT: Compile the ConcatString bytecode instruction 2023-10-29 07:44:11 +01:00
Ali Mohammad Pur
cafe60d713 AK: Disable assertion output colors on windows 2023-10-29 07:40:35 +01:00
implicitfield
4b60a99573 Shell: Remove '#' from the list of acceptable bareword characters
This stops the shell from always interpreting '#' as the start of a
comment in non-Posix mode.
2023-10-29 01:35:40 +03:30
Fabian Meyer
4afd782477 LibJIT: Fix Assembler::add(reg, reg) and sub(reg, reg) encoding 2023-10-28 23:13:22 +02:00
Evgeniy Baskov
9258e253ca LibJS/JIT: Fix crash in CallWithArgumentArray 2023-10-28 22:33:45 +02:00
Andreas Kling
40ecf7689b LibJS/JIT: Run clang-format on Compiler.cpp 2023-10-28 21:02:13 +02:00
Simon Wanner
2cbc9d6970 LibJS/JIT: Consolidate exception handling code
Instead of emitting the lengthy exception checking/handling routine,
we only emit code for checking the presence of an exception and jump
to a common exception handler.

This code size optimization saves 2.08MiB on Kraken/ai-astar.js
2023-10-28 20:44:49 +02:00
Simon Wanner
202a08ecc2 LibJS+LibJIT: Replace make_label() with default constructed label 2023-10-28 20:44:49 +02:00
Simon Wanner
ff265d1900 LibJIT: Support jumps to already linked labels 2023-10-28 20:44:49 +02:00
Idan Horowitz
b2d8d0c270 LibJS: Compile the CallWithArgumentArray bytecode instruction 2023-10-28 20:27:16 +02:00
Idan Horowitz
2b65a80ecb LibJS: Compile the NewBigInt bytecode instruction 2023-10-28 20:27:16 +02:00
Idan Horowitz
d200361620 LibJS: Remove useless indirection in compile_new_{function, regexp}
The cxx_new_* functions have the exact same signature as the underlying
function they redirect to, so there's no need for them. Removing them
saves us a couple of opcodes.
2023-10-28 20:27:16 +02:00
Andreas Kling
9c0c672839 LibJS/JIT: Store the VM register array base in RBX
This allows us to use the displacement-less MOV encoding when accessing
register $0 (the accumulator).

This reduces code size by 158 KiB on Kraken/ai-astar.js :^)
2023-10-28 20:26:35 +02:00
Andreas Kling
32d3a47058 LibJIT: Generate MOV ModR/M without displacement when possible
For non-extended register bases and 0x0 offset, we can emit a ModR/M
byte without displacement.
2023-10-28 20:26:35 +02:00
Nico Weber
4cc24548f6 LibPDF: Call dbgln() for unimplemented flex upcodes 2023-10-28 13:28:05 -04:00
Nico Weber
e484fae8e1 LibPDF: Don't do special subr processing for type 2 CFFs
This is a subset of #21484: Type 2 CFFs never use the special subrs,
so stop doing them for type 2 at least for now.

Fixes an assert in 0000064.pdf in 0000.zip in the pdfa dataset
(a stack underflow because a subr is supposed to push a bunch of
stuff, but instead it ran one of the built-in routines instead of
the subr from the font file).

As discussed in #21484, this isn't right for type 1 CFFs either,
but just removing the code there regresses Tests/LibPDF/type1.pdf.
A slightly more involved thing is needed there; I added a FIXME
for that here.
2023-10-28 13:28:05 -04:00
Tim Ledbetter
5c0c55d2c0 LibPDF: Ensure xref stream field widths are within expected range
Previously, an xref stream with a field with larger than 8 would
result in an undefined shift occurring. We now ensure that each field
width is a number and is less than or equal to 8.
2023-10-28 13:17:09 -04:00
Sam Atkins
596773f12f LibWeb: Stop forward-declaring NavigationParams twice 2023-10-28 13:15:51 -04:00
MacDue
3659149888 LibWeb: Fix stroke-opacity for stroked paths that use PaintStyles
Ref test included :)
2023-10-28 19:06:12 +02:00
Timothy Flynn
8dc25dffc2 LibWebView: Protect URL highlighting against partially-typed URLs
The current helpers assume that a valid URL is a full URL (i.e. contains
the "://" separator between the scheme and domain). This isn't true, as
"file:" alone is parsed as a valid URL.

We must also avoid simply searching for the parsed public suffix in the
original URL string. For example, "com" is a public suffix. If we search
for that in the URL "com.com", we will think the public suffix starts at
index 0.
2023-10-28 19:03:19 +02:00
Sönke Holz
194bf5a677 Kernel/riscv64: Add RISC-V Processor class 2023-10-28 10:36:06 -06:00
Sönke Holz
24e64cac7e Kernel/riscv64: Add register state related headers 2023-10-28 10:36:06 -06:00
Sönke Holz
978cc1c197 Kernel/riscv64: Add a header for reading/writing RISC-V CSRs 2023-10-28 10:36:06 -06:00
Andreas Kling
87baf140f2 LibJS/JIT: Use PUSH imm when pushing null unwind context pointer(s)
Small code size optimization, saves 252 bytes on Kraken/ai-astar.js :^)
2023-10-28 18:20:07 +02:00
Andreas Kling
bbde64e0b6 LibJIT: Emit 8-bit PUSH imm when possible 2023-10-28 18:20:07 +02:00
Andreas Kling
fff82c5ffe LibJS/JIT: Only preserve VM& when making native call to C++
Instead of pushing and popping every single caller-saved registers,
we can optimize code size (and speed!) by only pushing the one register
we actually care about: RDI (since it holds our VM&).

This means that native calls may clobber every other caller-saved
register, so this is something that you have to be aware of when
emitting native calls in the JIT.

This reduces code size on Kraken/ai-astar.js by 553 KiB and makes
execution time ~6% faster as well! :^)
2023-10-28 18:20:07 +02:00
Andreas Kling
926786e8d1 LibJS+LibJIT: Let users of JIT::Assembler handle caller-saved registers
Instead of JIT::Assembler making the decision for everyone and forcing
out every caller-saved register in the ABI onto the stack, we now leave
that decision to users of JIT::Assembler.
2023-10-28 18:20:07 +02:00
Andreas Kling
9afd12a8ba LibJS/JIT: Consolidate exits from the jitted code
Instead of emitting the "restore callee-saved registers and return"
sequence again and again, just emit it once at the end of the generated
code, and have everyone jump to it.

This is a code size optimization that saves 207KiB on Kraken/ai-astar.js
2023-10-28 18:20:07 +02:00
Idan Horowitz
0768bf2623 LibJS: Execute the finalizer when returning from a try block in the JIT
This fixes 1 of the 2 remaining failing test-js tests.
2023-10-28 17:11:47 +02:00
Idan Horowitz
78cac671b6 LibJS: Pass the expression string to cxx_call as a stack argument
This restores the bytecode interpreter's original call exception
throwing behaviour to the JIT.
This also fixes 8 of the 10 failing test-js tests when running with the
JIT enabled.
2023-10-28 14:44:45 +02:00
Idan Horowitz
863314ff10 LibJIT: Support passing stack arguments to native_call()s
The x86-64 SystemV ABI specifies that additional arguments after the
first 6 register-passed ones should be passed on the stack.
2023-10-28 14:44:45 +02:00
Andreas Kling
e63423554f LibJIT: Keep the stack pointer aligned for making native calls
Instead of adjusting the stack pointer before/after making native calls,
just make sure we come out of enter() with the stack pointer aligned
for making calls.

This is strictly a code size reduction. :^)
2023-10-28 09:10:38 +02:00
Idan Horowitz
538a570852 LibJIT+LibJS: Consolidate sized immediate assembler operands
This replaces the existing sized immediate operands with a unified
immediate operand that leaves the size handling to the assembler,
instead of the user.

This has 2 benefits:
1. The user doesn't need to know which specific operand size the
instruction expects when using it
2. The assembler automatically chooses the minimal operand size that
fits the given value, resulting in smaller code size without any
additional effort from the user. While the change is small, it still
has a noticeable effect on performance (since it increases the I$ hit
rate), resulting in 5% speedup on kraken a-star.
2023-10-28 07:04:14 +02:00