vkk
vkk copied to clipboard
SIGSEGV in createDevice when using queuePriorities
Hi Folks,
I believe there is a bug with the priorities float buffer allocation in vk.DeviceQueueCreateInfo.
When doing the following the creation of a logical device fails with a SIGSEGV:
val queue = vk.DeviceQueueCreateInfo {
queueFamilyIndex = graphics
queuePriority = 1.0f
}
Results in
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x0000000122816a51, pid=88962, tid=0x0000000000000307
#
# JRE version: Java(TM) SE Runtime Environment (8.0_171-b11) (build 1.8.0_171-b11)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.171-b11 mixed mode bsd-amd64 compressed oops)
# Problematic frame:
# C [libMoltenVK.dylib+0x56a51]
However, when I push the float buffer myself, everything works fine:
val queue = vk.DeviceQueueCreateInfo {
queueFamilyIndex = graphics
queuePriorities = stack.floats(1.0f)
}
Hi joscha,
yeah, I also experienced lately those crashes. I wasnt getting any before.
I'm not sure exactly where the problem lies, however I'm going with another better approach: we keep everything on jvm until we have to interface the vulkan api natively. At that point we push all the jvm resources to the native memory-stack,
You can see it in action here.
I got the idea from playing with Swift, they implement a very similar concept with c strings: you are given a valid pointer to the underlaying char array which is assured to be valid for the whole closure/lambda. Everything is on Swift side until you have to interface c.
I'm using that same project as lab, but once finished I'll port all the work back to vk², hopefully in a few days
If you have any feedback, I'm here
ps: I'm also testing type safety for a couple of flag masks, let's see how that plays out
but once finished I'll port all the work back to vk²
Sounds good, looking forward to it 👍
I might push some PRs your way afterwards if it's fine. I've noticed some of the "convenience" functions missing where you don't have to deal with buffers yourself. But I'll wait until you've done that refactoring, it would probably be double the work otherwise :)
Pushed, tmp branch
relevant:
- everything on jvm side till the native api call
- added some extensions functions on the
MemoryStackto malloc/calloc primitives (default to size 1) and various buffers and plain pointers (also with nice build dsl, eg:stack.IntAdr(size) { init(it) }orstack.IntBuffer(size) { init(it) } - kool introduces now inline class primitive pointers, you can see them here for example. They implements accordingly
get/setoperators with the right offset based on the type of the pointer
I'm eager to gather feedbacks, I'll send you an invite for the PRs
vk10 is complete (always tmp branch)
Hi @elect86 , sorry didn't have a chance to take a look yet. Will hopefully get to it on the weekend!
Hi @joscha-alisch, news?