vkk icon indicating copy to clipboard operation
vkk copied to clipboard

SIGSEGV in createDevice when using queuePriorities

Open joscha-alisch opened this issue 5 years ago • 6 comments

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)
}

joscha-alisch avatar Nov 17 '19 09:11 joscha-alisch

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

elect86 avatar Nov 17 '19 10:11 elect86

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 :)

joscha-alisch avatar Nov 18 '19 14:11 joscha-alisch

Pushed, tmp branch

relevant:

  • everything on jvm side till the native api call
  • added some extensions functions on the MemoryStack to malloc/calloc primitives (default to size 1) and various buffers and plain pointers (also with nice build dsl, eg: stack.IntAdr(size) { init(it) } or stack.IntBuffer(size) { init(it) }
  • kool introduces now inline class primitive pointers, you can see them here for example. They implements accordingly get/set operators 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

elect86 avatar Nov 27 '19 11:11 elect86

vk10 is complete (always tmp branch)

elect86 avatar Nov 30 '19 16:11 elect86

Hi @elect86 , sorry didn't have a chance to take a look yet. Will hopefully get to it on the weekend!

joscha-alisch avatar Dec 02 '19 13:12 joscha-alisch

Hi @joscha-alisch, news?

elect86 avatar Mar 16 '20 10:03 elect86