1 # -*- Mode:text; tab-width:4; electric-indent-mode: nil; indent-line-function:insert-tab; -*-
3 # things to check; vkCmdSetFragmentShadingRateKHR
5 # types for function calls
10 static final MethodHandle {name}$FH = Memory.downcall("{name}",
11 {function-descriptor});
13 * success: {successcodes}
14 * errors: {errorcodes}
16 public {static}{java-result} {rename}(
18 {native-result-define}
21 {native-result-assign}{name}$FH.invokeExact({invoke-arg});
26 } catch (Throwable t) {
27 throw new RuntimeException(t);
36 /* method-query:invoke */
37 static final MethodHandle {name}$FH = Memory.downcall("{name}",
38 {function-descriptor});
40 * success: {successcodes}
41 * errors: {errorcodes}
43 public {static}{java-result} {rename}(
45 {native-result-define}
48 {native-result-assign}{name}$FH.invokeExact({query-arg});
51 {native-result-assign}{name}$FH.invokeExact({invoke-arg});
55 } catch (Throwable t) {
56 throw new RuntimeException(t);
63 code method-extension {
65 final NativeSymbol {name}$NS;
68 /* method-extension:invoke */
69 final static MethodHandle {name}$DH = Memory.downcall(
70 {function-descriptor});
72 * success: {successcodes}
73 * errors: {errorcodes}
75 public {static}{java-result} {rename}(
77 {native-result-define}
80 {native-result-assign}{name}$DH.invokeExact(dispatch.{name}$NS, {invoke-arg});
85 } catch (Throwable t) {
86 throw new RuntimeException(t);
93 code method-extension-query {
95 final NativeSymbol {name}$NS;
98 /* method-extension:invoke */
99 final static MethodHandle {name}$DH = Memory.downcall(
100 {function-descriptor});
102 * success: {successcodes}
103 * errors: {errorcodes}
105 public {static}{java-result} {rename}(
107 {native-result-define}
110 {native-result-assign}{name}$DH.invokeExact(dispatch.{name}$NS, {query-arg});
113 {native-result-assign}{name}$DH.invokeExact(dispatch.{name}$NS, {invoke-arg});
117 } catch (Throwable t) {
118 throw new RuntimeException(t);
125 # ###################################################################### #
127 # common parts for funcpointer
130 public {java-result} call({java-arg});
132 public final static FunctionDescriptor DESCRIPTOR =
133 {function-descriptor};
136 public static FunctionPointer<{rename}> upcall({rename} target$, ResourceScope scope$) {
137 interface Trampoline {
138 {native-result} call({native-arg});
140 Trampoline trampoline = ({native-arg}) -> {
142 try {trampoline-scope} {
143 {trampoline-result-define}
144 {trampoline-result-assign}target$.call({trampoline-arg});
145 {trampoline-result-return}
146 } catch (Throwable t) {
147 throw new RuntimeException(t);
150 return new FunctionPointer<>(
152 MethodHandles.lookup(),
155 "{trampoline-signature}",
165 code funcpointer-readwrite insert=funcpointer:common,funcpointer:upcall,funcpointer:downcall {
169 import jdk.incubator.foreign.*;
170 import java.lang.invoke.*;
171 import au.notzed.nativez.*;
174 public interface {name} {
184 # ###################################################################### #
188 # java-arg java parameter type and and name
189 # invoke-arg native value for invokeExact argument
190 # native-arg native parameter type and name
191 # trampoline-arg java value for upcall invocation
192 # layout MemoryLayout
193 # sig JNI signature string
195 # parameterisation values
197 # carrier native (jdk.foriegn) type
198 # length array length
201 java-arg {{ {type} {name} }}
202 invoke-arg {{ {name} }}
204 native-arg {{ {carrier} {name}$ }}
205 trampoline-arg {{ {name}$ }}
209 java-arg {{ {type} {name} }}
210 invoke-arg {{ {name} }}
212 native-arg {{ {carrier} {name}$ }}
213 trampoline-arg {{ {name}$ }}
217 java-arg {{ {type} {name} }}
218 invoke-arg {{ {name} }}
220 native-arg {{ {carrier} {name}$ }}
221 trampoline-arg {{ {name}$ }}
224 type uint8_t,char value {
227 layout {{ Memory.BYTE }}
230 type uint16_t value {
233 layout {{ Memory.SHORT }}
236 type uint32_t,int,int32_t value {
239 layout {{ Memory.INT }}
243 type uint64_t,int64_t,size_t value {
246 layout {{ Memory.LONG }}
253 layout {{ Memory.FLOAT }}
259 layout {{ Memory.DOUBLE }}
262 # ###################################################################### #
263 # implied length types
264 type uint64_t-implied,size_t-implied uint64_t {
266 invoke-arg {{ Memory.length({lengthfor}) }}
269 type uint32_t-implied uint32_t {
271 invoke-arg {{ (int)Memory.length({lengthfor}) }}
274 # ###################################################################### #
276 # type uint8_t[],char[] value-array {
277 # type {{ ByteArray }}
278 # layout {{ MemoryLayout.sequenceLayout({len1}, Memory.BYTE) }}
282 #type uint32_t[],int32_t[] value-array {
283 # type {{ IntArray }}
284 # layout {{ MemoryLayout.sequenceLayout({len1}, Memory.INT) }}
288 # type uint64_t[] value-array {
289 # type {{ LongArray }}
290 # layout {{ MemoryLayout.sequenceLayout({len1}, Memory.LONG) }}
294 # calls float[] =-> pointer
295 #type float[] value-array {
296 # # or should it be float[] ?
297 # type {{ FloatArray }}
298 # layout {{ MemoryLayout.sequenceLayout({len1}, Memory.FLOAT) }}
302 # type struct[] inline-array {
303 # type {{ {baseType} }}
304 # layout {{ MemoryLayout.sequenceLayout({len1}, {baseType}.LAYOUT) }}
307 # type float[][] value-array2d {
308 # type {{ FloatArray }}
310 # layout {{ MemoryLayout.sequenceLayout({len1}, MemoryLayout.sequenceLayout({len2}, Memory.FLOAT)) }}
313 # select=len? or what?
316 carrier {{ MemoryAddress }}
317 layout {{ Memory.POINTER }}
318 type {{ MemoryAddress }}
319 sig {{ Ljdk/incubator/foreign/MemoryAddress; }}
321 invoke-arg {{ Memory.address({name}) }}
332 type funcpointer pointer {
333 type {{ NativeSymbol }}
336 # FIXME: clenaup, value-pointer does nothing
337 type value-pointer pointer {
340 type uint8_t* value-pointer {
344 type uint32_t*,int32_t*,int* value-pointer {
348 type uint64_t* value-pointer {
352 type float* value-pointer {
356 type size_t* value-pointer {
360 type pointer-length pointer {
363 type void*-length pointer-length {
367 type uint8_t*-length pointer-length {
371 type uint32_t*-length,int32_t*-length pointer-length {
375 type uint32_t[] pointer-length {
380 type uint64_t*-length pointer-length {
384 type float*-length pointer-length {
388 type float[] pointer-length {
393 # special handling for strings, will fail if it isn't
394 type char* pointer need-frame {
397 invoke-arg {{ (Addressable)frame$.allocateUtf8String({name}) }}
399 trampoline-arg {{ {name}$.getUtf8String(0) }}
401 # this just verifies it's a string type
403 if ($v->{len} =~ m/null-terminated/) {
406 print "Warning: not sure if this is a string: $s->{name} $m->{name}\n";
412 # type XXchar**-length pointer-length accessor=value-alloc {
413 # type {{ String[] }}
415 # java-set {{ {name}$VH.set(segment, Memory.copyStringArray({name}, alloc$)); {set-length} }}
416 # java-get {{ Memory.copyStringArray((MemoryAddress){name}$VH.get(segment), {length}) }}
419 # if ($v->{len} =~ m/(.*),null-terminated/) {
420 # 'set'.ucfirst($1).'({name}.length)';
422 # die Dumper($v, $s);
428 type Xuint32_t** pointer {
429 type {{ HandleArray<IntArray> }}
433 type uint32_t**-length pointer {
434 type {{ HandleArray<IntArray> }}
438 type void** pointer {
442 type void**-length pointer-length {
446 type handle pointer {
447 type {{ {baseType} }}
450 type handle* pointer {
451 type {{ HandleArray<{typei}> }}
452 typei {{ {baseType} }}
454 invoke-arg {{ Memory.address({name}) }}
457 type handle*-length pointer-length {
458 type {{ HandleArray<{baseType}> }}
459 typei {{ {baseType} }}
462 #type struct inline {
463 # type {{ {baseType} }}
464 # layout {{ {baseType}.LAYOUT }}
467 type struct* pointer trampoline-scope {
468 type {{ {baseType} }}
470 trampoline-arg {{ {baseType}.create({name}$, scope$$) }}
473 type struct*-length pointer-length {
474 type {{ {baseType} }}
475 typei {{ {baseType} }}
478 type struct**-length pointer-length {
479 type {{ HandleArray<{baseType}> }}
480 typei {{ {baseType} }}
483 type struct** pointer {
487 type XID,Window,VisualID uint64_t;
489 type Display* handle {
494 type xcb_window_t uint32_t;
495 type xcb_visualid_t uint32_t;
496 type xcb_connection_t* handle {
500 # special types for call overrides
501 type instance handle is-instance {
503 invoke-arg {{ (Addressable)self }}
507 # A pointer type which is always ignored/supressed, e.g. VkAllocationCallbacks *
508 type struct*-ignore,void*-ignore void* {
510 invoke-arg {{ (Addressable)MemoryAddress.NULL }}
514 type void*-return void* {
515 native-result-define {{ MemoryAddress result$; }}
516 native-result-assign {{ result$ = (MemoryAddress) }}
517 java-result-return {{ return result$; }}
520 type funcpointer-return funcpointer need-scope {
521 native-result-define {{ MemoryAddress result$; }}
522 native-result-assign {{ result$ = (MemoryAddress) }}
523 java-result-return {{ return NativeSymbol.ofAddress(pName, result$, scope$); }}
526 type uint32_t-return uint32_t {
527 native-result-define {{ int result$; }}
528 native-result-assign {{ result$ = (int) }}
529 java-result-return {{ return result$; /* uint32_t */ }}
531 trampoline-result-define {{ int result$$; }}
532 trampoline-result-assign {{ result$$ = (int) }}
533 trampoline-result-return {{ return result$$; /* uint32_t */ }}
536 type uint64_t-return,size_t-return uint64_t {
537 native-result-define {{ long result$; }}
538 native-result-assign {{ result$ = (long) }}
539 java-result-return {{ return result$; /* uint64_t */ }}
542 # for handle constructors
543 type handle*-output handle* need-frame need-scope {
545 invoke-arg {{ (Addressable){name} }}
547 java-result {{ {baseType} }}
548 native-init {{ MemorySegment {name} = frame$.allocate(Memory.POINTER); }}
549 java-result-assign {{ {baseType} result$$ = {baseType}.create({name}.get(Memory.POINTER, 0), scope$); }}
550 java-result-return {{ return result$$; }}
553 # for handle constructors of dispatchable types
554 type dispatch*-output handle*-output {
555 java-result-assign {{ {baseType} result$$ = {baseType}.create({name}.get(Memory.POINTER, 0), dispatch, scope$); }}
558 # for query and return types
559 type handle*-length-query handle*-length need-alloc {
561 invoke-arg {{ (Addressable){name}.address() }}
562 query-arg {{ (Addressable)MemoryAddress.NULL }}
564 java-result {{ {type} }}
565 query-init {{ {type} {name} = {typei}.createArray({length}, alloc$); }}
566 java-result-return {{ return {name}; }}
569 type dispatch*-length-query handle*-length-query need-scope {
570 query-init {{ {type} {name} = {typei}.createArray({length}, alloc$, dispatch, scope$); }}
573 type struct*-length-query struct*-length need-alloc {
575 invoke-arg {{ (Addressable){name}.address() }}
576 query-arg {{ (Addressable)MemoryAddress.NULL }}
578 java-result {{ {type} }}
579 query-init {{ {type} {name} = {typei}.createArray({length}, alloc$); }}
580 java-result-return {{ return {name}; }}
583 type void*-length-query void*-length need-alloc {
585 invoke-arg {{ (Addressable){name} }}
586 query-arg {{ (Addressable)MemoryAddress.NULL }}
588 java-result {{ {type} }}
589 query-init {{ {type} {name} = alloc$.allocate({length}); }}
590 java-result-return {{ return {name}; }}
593 type uint32_t*-length-query uint32_t*-length need-alloc {
595 invoke-arg {{ (Addressable){name}.address() }}
596 query-arg {{ (Addressable)MemoryAddress.NULL }}
598 java-result {{ {type} }}
599 query-init {{ {type} {name} = IntArray.createArray({length}, alloc$); }}
600 java-result-return {{ return {name}; }}
603 type uint32_t*-querylen uint32_t* need-frame {
604 type {{ MemorySegment }}
606 invoke-arg {{ (Addressable){name}$ }}
608 native-init {{ {type} {name}$ = alloc$.allocate(Memory.INT, 0); }}
609 query-init {{ long {name} = {name}$.get(Memory.INT, 0); }}
612 type size_t*-querylen uint32_t* need-frame {
613 type {{ MemorySegment }}
615 invoke-arg {{ (Addressable){name}$ }}
617 native-init {{ {type} {name}$ = alloc$.allocate(Memory.LONG, 0); }}
618 query-init {{ long {name} = {name}$.get(Memory.LONG, 0); }}
621 # Or should it just use an insert function?
623 # there's only two like this
624 type handle*-alloc handle* {
626 java-result {{ {type} }}
627 java-result-return {{ return {name}; }}
630 # A couple of very special cases
631 type VkCommandBuffer-alloc handle*-alloc need-scope need-alloc {
633 {type} {name} = {typei}.createArray(
634 (int)VkCommandBufferAllocateInfo.commandBufferCount$VH.get(pAllocateInfo.segment),
641 type VkDescriptorSet-alloc handle*-alloc need-alloc {
643 {type} {name} = {typei}.createArray(
644 (int)VkDescriptorSetAllocateInfo.descriptorSetCount$VH.get(pAllocateInfo.segment),
649 type void**-output void** need-frame need-scope {
650 type {{ MemorySegment }}
653 invoke-arg {{ (Addressable){name} }}
655 native-init {{ MemorySegment {name} = frame$.allocate(Memory.POINTER); }}
657 java-result {{ {type} }}
658 java-result-assign {{ {type} result$$ = MemorySegment.ofAddress({name}.get(Memory.POINTER, 0), {length}, scope$); }}
659 java-result-return {{ return result$$; }}
662 type vkMapMemory-output void**-output {
666 # some tweaks that the auto-discovery code misses/isn't worth adding to
668 vkAllocateCommandBuffers device=type:instance pCommandBuffers=type:VkCommandBuffer-alloc;
669 vkAllocateDescriptorSets device=type:instance pDescriptorSets=type:VkDescriptorSet-alloc;
671 vkMapMemory device=type:instance ppData=type:vkMapMemory-output;
673 # Don't need userData
674 PFN_vkDebugUtilsMessengerCallbackEXT pUserData=type:void*-ignore;
675 PFN_vkDebugReportCallbackEXT pUserData=type:void*-ignore;
676 PFN_vkDeviceMemoryReportCallbackEXT pUserData=type:void*-ignore;
678 # Mapped to a NativeSymbol via 'funcpointer' type
679 PFN_vkVoidFunction ignore;
681 # Don't need VkAllocationCallbacks, don't need these
682 PFN_vkAllocationFunction ignore;
683 PFN_vkReallocationFunction ignore;
684 PFN_vkFreeFunction ignore;
685 PFN_vkInternalAllocationNotification ignore;
686 PFN_vkInternalFreeNotification ignore;