Layering JavaFX onto an external rendering context
Tom Schindl
tom.schindl at bestsolution.at
Sun Mar 7 17:12:17 UTC 2021
Hi,
If I got you right you now changed your idea to render JavaFX into an
PixelBuffer and integrate that into a scene renderer with Vulkan, ... .
This exactly how the integration into SWT and Swing is done, the
internal API for that is found in "com.sun.javafx.embed". Before we
implemented DriftFX we integrated a JavaFX-Scene into our application
exactly this way.
For that purpose we hacked FXCanvas and published the changed code at
our customers github account [1]. You see there at [2] how one fills the
buffer from an offscreen scene.
My gut feeling is that getting a "com.sun.javafx.embed"-API is much more
likely than an DriftFX-Like-API but that just my personal opinion.
Anyways our/my focus still is DriftFX and I/we are quite confident that
what we have today in DriftFX is a good API where we today support
JavaFX-8 to JavaFX-15 (I haven't tested 16 but I have not seen any
changes going into it that would require us to change our code)
Tom
[1]
https://github.com/eclipsesource/FXCanvas/blob/master/FXCanvas/src/javafx/embed/swt/FXCanvas.java
[2]
https://github.com/eclipsesource/FXCanvas/blob/master/FXCanvas/src/javafx/embed/swt/FXCanvas.java#L631
Am 07.03.21 um 16:35 schrieb Mark Raynsford:
> On 2021-03-07T12:22:11 +0000
> Neil C Smith <neil at codelerity.com> wrote:
>
>> Hi,
>>
>> A few comments from my perspective here, mainly coming from
>> frustration at the number of times I've had to tell clients or users
>> that JavaFX isn't a viable option for them ..
>>
>> On Sat, 6 Mar 2021 at 12:22, Mark Raynsford <org.openjdk at io7m.com> wrote:
>>> there is a
>>> combinatorial explosion of possibilities with regards to which
>>> rendering API the _user_ might be using, and which rendering API
>>> JavaFX might be using (if any!).
>>
>> I agree that's a difficult one, but also surely not an insurmountable
>> one?! There are precedents around Java APIs that provide querying and
>> access to optional support on a platform by platform basis...
>
> I think it's insurmountable due to the complexity of the semantics of
> the thing (the GPU) that's being abstracted over. The basic primitive
> that would be required is "transfer this image to this other image".
> You'd need to expose that operation in way that would work for every
> possible pair of rendering APIs, including getting all of the
> synchronization right that lower level APIs like Vulkan and DX12
> require. The complexity of handling that would need to be pushed onto
> each person trying to use the API. JavaFX would effectively need to
> know when it was safe to use an image that was being transferred in,
> without actually being able to know where the image was coming from or
> who to talk to about it. The only methods it _could_ use would involve
> CPU-side fences, which would then have performance implications.
>
> To clarify a bit: Let's say we lived in an ideal world and JavaFX had a
> Vulkan backend, and contained code that was willing to cooperate with
> the user's Vulkan-based rendering code. The user could tell JavaFX
> "here's the image to use for this node, but don't use it until this
> semaphore becomes available". This is generally highly efficient as a
> semaphore (in Vulkan terms) is a GPU-side primitive that just controls
> parallelism across different queue instances on the GPU, with no
> CPU-side interaction at all.
>
> We have no way to get to that ideal world whilst JavaFX and the user's
> code have no common API over which to communicate. Everything would
> have to go via CPU-based abstractions.
>
>>> Traditional stateful APIs like
>>> OpenGL make it far too easy for external code to screw up the
>>> rendering context anyway, so exposing JavaFX's own context would
>>> be a bad idea.
>>
>> I remain of the view that this shouldn't really be that concerning?!
>> It's a bug in the library if it does so.
>
> It's definitely concerning. Have you worked with OpenGL much? If you're
> *lucky* you'll get a crash, because at least then you'll see the
> exact location where the mistake occured. What you'll typically get
> instead is corrupted rendering, a black screen, or just bad performance
> as the driver desperately tries to make sense of what you asked it to
> do, usually in completely unrelated parts of the rendering process. It's
> the prime reason I jumped ship to Vulkan the second it came out. :)
>
>>> JavaFX _does_ have a software renderer. What if we could have JavaFX
>>> work with entirely software rendering into an offscreen BufferedImage?
>>
>> Why BufferedImage? What about a reuse / extension / parallel of
>> PixelBuffer?
>
> Yes indeed. I said BufferedImage just because I assumed that would be
> more familiar. I'd not personally care where the output went as long as
> I could get the raw bytes out of it in order to upload to the GPU.
>
More information about the openjfx-dev
mailing list