I just want to leave my solution here, since I am sure I am not the last 
person to run into this.

The issue (as others have suggested and initially assumed) is indeed that 
go expects a pointer where there is none. This only leads to errors when 
the GC scans the stack if I interpret my results correctly.

Fortunately recent versions of vulkan.h allow you to override the define 
like this:
// #define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef uint64_t 
object;
// #include <vulkan/vulkan.h>
import "C"

If you are compiling exclusively for 32bit pointer architectures this is 
not necessary, but won't do any harm either (do it for the sake of 
portability).

I brought this up on the vulkan side of things and found out that this 
seems to be the only way to achieve a strong typedef in some C descendants. 
That big benefit imo justifies the small inconvenience of having to 
override this in some garbage collected languages, so I decided to close 
the issue.

On Sunday, December 18, 2016 at 8:13:39 PM UTC+1, Florian Uekermann wrote:
>
> Well, I am pretty sure I was wrong about something. Turning of the garbage 
> collector results in no error. Any smart ideas for debugging this?
>
> On Sunday, December 18, 2016 at 4:20:25 PM UTC+1, Florian Uekermann wrote:
>>
>> I may be misdiagnosing the problem, but I think go is doing a problematic 
>> check of the value of C pointer types pointers.
>>
>> The following runtime error is reproducible, but does not always happen 
>> in a program:
>>
>> runtime: writebarrierptr *0xc420326a90 = 0x12 
>> fatal error: bad pointer in write barrier
>>
>> The stack trace indicates that the offending line is the last one in the 
>> following snippet:
>>
>> var bi C.VkRenderPassBeginInfo
>> bi.sType = C.VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO
>> bi.renderPass = renderpass
>>
>> I checked the address of the .renderPass field and it is indeed 0xc420326a90 
>> and the value
>> of renderpass is 18. As you may have recognized by now, I am using the 
>> vulkan 
>> C bindings.
>> The .renderPass field has type C.VkRenderPass. A quick look at vulkan.h 
>> yields the following:
>>
>> #if defined(__LP64__) || defined(_WIN64) || defined(__x86_64__) || 
>> defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || 
>> defined(__aarch64__) || defined(__powerpc64__)
>>         #define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef struct 
>> object##_T *object;
>> #else
>>         #define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef uint64_t 
>> object;
>> #endif
>> ...
>>
>> VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkRenderPass)
>>
>>
>> So it seems to me that Vulkan uses a pointer type  on 64bit archs to 
>> store a (potentially non-pointer) handle.
>> Given that structs with these handles are very common, the workaround of 
>> allocating the bi variable on the C heap
>> is a lot of unnecessary work and a bit of a performance issue.
>>
>> I am not quite sure what a writebarrier is in this context, so I am not 
>> sure if deactivating this check creates more issue (GC)?
>>
>> Can someone give some insight into what the long-term options are for go 
>> with respect to this?
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to