#Export to CGO then get a pointer to that function to pass to vulkan

23 messages · Page 1 of 1 (latest)

dapper ocean
#

Is there any way i can export a go function to C then to get a pointer to it?
Like this

func SetupDebugMessenger() {
    dbgMessengerCreateInfo := vk.DebugUtilsMessengerCreateInfoEXT{}
    dbgMessengerCreateInfo.MessageSeverity = vk.DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT | vk.DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT | vk.DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT | vk.DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT
    dbgMessengerCreateInfo.MessageType = vk.DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | vk.DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | vk.DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT
    dbgMessengerCreateInfo.PfnUserCallback = (*[0]byte)(C.VkDebugCallback)

}

//export VkDebugCallback
func VkDebugCallback(severity vk.DebugUtilsMessageSeverityFlagsEXT,
    messageType vk.DebugUtilsMessageTypeFlagsEXT,
    pCallbackData vk.DebugUtilsMessengerCallbackDataEXT,
    userData interface{}) vk.Bool32 {

    switch {
    case severity >= vk.DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT:
        logger.Error("(VALIDATION LAYER): " + pCallbackData.PMessage)
    case severity >= vk.DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT:
        logger.Warning("(VALIDATION LAYER): " + pCallbackData.PMessage)
    case severity >= vk.DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT:
        logger.Info("(VALIDATION LAYER): " + pCallbackData.PMessage)
    }

    return vk.Bool32(vk.FALSE)
}```
#

The error i am getting is

engine\debug.go:15:54: could not determine kind of name for C.VkDebugCallback```
sick marten
#

oh I'm dumb

#

*blind

dapper ocean
#

the type of PfnUserCallback is
vk.PFN_vkDebugUtilsMessengerCallbackEXT

#

which is a pointer

sick marten
#

I'm pretty sure it would work if you did that in C

#

I mean, have an import "C" statement with a C function calling

#

I don't know how you can get the C reference to your Go function from Go directly

#

You could try adding a function header in a C statement too

#

something like:

import "C"
/*
extern VkDebugCallback...
*/
#

I don't think you could pass an interface{} through cgo tho

#

since you would almost always have pointers to pointers issue

dapper ocean
#

ah alright

#

what compiler does cgo use considerng i need vulkan types to include?

sick marten
#

it uses CC

#

so you can configure it to most main C compilers

dapper ocean
#

ok thanks

sick marten
#

there are special cgo directives you can use to add linker flags

twilit field
sick marten
#

or other options for the C compiler (there is a restricted set of options)

#

*actually I think it has to be a gcc compatible compiler, so clang, zig cc or gcc