On Mon, 9 Jun 2025 17:55:21 GMT, Kevin Rushforth <[email protected]> wrote:
>> PR to replace the use of sun.misc.Unsafe memory access methods in the Marlin
>> rasterizer with FFM.
>>
>> I broke this up into the following commits. The bulk of the work is in the
>> first two:
>>
>> 1. Encapsulate all off-heap access in OffHeapArray -- All of the memory
>> allocation and management was already done in the OffHeapArray class, but
>> the users of OffHeapArray, primarily Renderer and RendererNoAA, called
>> Unsafe methods directly. I encapsulated all of the calls to Unsafe in
>> OffHeapArray. The main impact on calling code is that the base address is no
>> longer accessible or needed. Instead, the `(put|get)(Byte|Int)` methods take
>> only an offset. This commit was straight refactoring with no behavioral
>> changes.
>> 2. Initial FFM implementation -- I changed the memory management and access
>> methods to use FFM. Each OffHeap array uses a shared Arena to manage the
>> single memory segment allocated at construction time. The resize method
>> creates a new Arena and memory segment, copying the data from the old and
>> then closing it
>> 3. Set `used` to 0 in `dispose()` -- While testing and instrumenting the
>> code, I discovered that the Renderer dispose methods resize the edges array
>> back to the default size without clearing the "used" field. The used field
>> will be cleared before the next time it is accessed, but clearing it in
>> dispose allows optimizing resize to not copy any data.
>> 4. Remove '--sun-misc-unsafe-memory-access=allow' from test and app
>> execution, since it is no longer needed. This also enables `-Werror` for the
>> `javafx.graphics` module.
>> 5. ~~Temporary debug prints that will be removed before making this "rfr"~~
>>
>> Additional commits address review comments.
>
> Kevin Rushforth has updated the pull request incrementally with one
> additional commit since the last revision:
>
> Remove unneeded "length" field, using segment,byteSize() instead
> Fix description of resize method.
> Minor whitespace changes
modules/javafx.graphics/src/main/java/com/sun/marlin/MaskMarlinAlphaConsumer.java
line 110:
> 108:
> 109: for (int i = 0; i < _ALPHA_MAP.length; i++) {
> 110: ALPHA_MAP_OFF_HEAP.putByte(i, _ALPHA_MAP[i]);
I guess this is only done once, but following multiple layers of calculation I
think this array defaults to 64K long, in which case a bulk copy would be
better, but it is perhaps out-of-scope for a 1:1 replacement
https://docs.oracle.com/en/java/javase/24/docs/api/java.base/java/lang/foreign/MemorySegment.html#copy(java.lang.Object,int,java.lang.foreign.MemorySegment,java.lang.foreign.ValueLayout,long,int)
-------------
PR Review Comment: https://git.openjdk.org/jfx/pull/1814#discussion_r2136330006