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 # ###################################################################### #
187 java-arg {{ {type} {name} }}
188 invoke-arg {{ {name} }}
190 native-arg {{ {carrier} {name}$ }}
191 trampoline-arg {{ {name}$ }}
195 java-arg {{ {type} {name} }}
196 invoke-arg {{ {name} }}
198 native-arg {{ {carrier} {name}$ }}
199 trampoline-arg {{ {name}$ }}
203 java-arg {{ {type} {name} }}
204 invoke-arg {{ {name} }}
206 native-arg {{ {carrier} {name}$ }}
207 trampoline-arg {{ {name}$ }}
210 type uint8_t,char value {
213 layout {{ Memory.BYTE }}
216 type uint16_t value {
219 layout {{ Memory.SHORT }}
222 type uint32_t,int,int32_t value {
225 layout {{ Memory.INT }}
229 type uint64_t,int64_t,size_t value {
232 layout {{ Memory.LONG }}
239 layout {{ Memory.FLOAT }}
245 layout {{ Memory.DOUBLE }}
248 # ###################################################################### #
249 # implied length types
250 type uint64_t-length,size_t-length uint64_t {
252 invoke-arg {{ Memory.length({lengthfor}) }}
255 type uint32_t-length uint32_t {
257 invoke-arg {{ (int)Memory.length({lengthfor}) }}
260 # ###################################################################### #
262 # type uint8_t[],char[] value-array {
263 # type {{ ByteArray }}
264 # layout {{ MemoryLayout.sequenceLayout({len1}, Memory.BYTE) }}
268 #type uint32_t[],int32_t[] value-array {
269 # type {{ IntArray }}
270 # layout {{ MemoryLayout.sequenceLayout({len1}, Memory.INT) }}
274 # type uint64_t[] value-array {
275 # type {{ LongArray }}
276 # layout {{ MemoryLayout.sequenceLayout({len1}, Memory.LONG) }}
280 # calls float[] =-> pointer
281 #type float[] value-array {
282 # # or should it be float[] ?
283 # type {{ FloatArray }}
284 # layout {{ MemoryLayout.sequenceLayout({len1}, Memory.FLOAT) }}
288 # type struct[] inline-array {
289 # type {{ {baseType} }}
290 # layout {{ MemoryLayout.sequenceLayout({len1}, {baseType}.LAYOUT) }}
293 # type float[][] value-array2d {
294 # type {{ FloatArray }}
296 # layout {{ MemoryLayout.sequenceLayout({len1}, MemoryLayout.sequenceLayout({len2}, Memory.FLOAT)) }}
299 # select=len? or what?
302 carrier {{ MemoryAddress }}
303 layout {{ Memory.POINTER }}
304 type {{ MemoryAddress }}
305 sig {{ Ljdk/incubator/foreign/MemoryAddress; }}
307 invoke-arg {{ Memory.address({name}) }}
318 type funcpointer pointer {
319 type {{ NativeSymbol }}
322 # FIXME: clenaup, value-pointer does nothing
323 type value-pointer pointer {
326 type uint8_t* value-pointer {
330 type uint32_t*,int32_t*,int* value-pointer {
334 type uint64_t* value-pointer {
338 type float* value-pointer {
342 type size_t* value-pointer {
346 type pointer-length pointer {
349 type void*-length pointer-length {
351 java-get {{ MemorySegment.ofAddress({native-get}, {length}, this.segment.scope()) }}
354 type uint8_t*-length pointer-length {
358 type uint32_t*-length,int32_t*-length pointer-length {
362 type uint32_t[] pointer-length {
367 type uint64_t*-length pointer-length {
371 type float*-length pointer-length {
375 type float[] pointer-length {
380 # special handling for strings, will fail if it isn't
381 type char* pointer need-frame {
384 invoke-arg {{ (Addressable)frame$.allocateUtf8String({name}) }}
386 trampoline-arg {{ {name}$.getUtf8String(0) }}
388 # this just verifies it's a string type
390 if ($v->{len} =~ m/null-terminated/) {
393 print "Warning: not sure if this is a string: $s->{name} $m->{name}\n";
399 # type XXchar**-length pointer-length accessor=value-alloc {
400 # type {{ String[] }}
402 # java-set {{ {name}$VH.set(segment, Memory.copyStringArray({name}, alloc$)); {set-length} }}
403 # java-get {{ Memory.copyStringArray((MemoryAddress){name}$VH.get(segment), {length}) }}
406 # if ($v->{len} =~ m/(.*),null-terminated/) {
407 # 'set'.ucfirst($1).'({name}.length)';
409 # die Dumper($v, $s);
415 type Xuint32_t** pointer {
416 type {{ HandleArray<IntArray> }}
420 type uint32_t**-length pointer {
421 type {{ HandleArray<IntArray> }}
425 type void** pointer {
429 type void**-length pointer-length {
433 type handle pointer {
434 type {{ {baseType} }}
437 type handle* pointer {
438 type {{ HandleArray<{typei}> }}
439 typei {{ {baseType} }}
441 invoke-arg {{ Memory.address({name}) }}
444 type handle*-length pointer-length {
445 type {{ HandleArray<{baseType}> }}
446 typei {{ {baseType} }}
449 #type struct inline {
450 # type {{ {baseType} }}
451 # layout {{ {baseType}.LAYOUT }}
454 type struct* pointer trampoline-scope {
455 type {{ {baseType} }}
457 trampoline-arg {{ {baseType}.create({name}$, scope$$) }}
460 type struct*-length pointer-length {
461 type {{ {baseType} }}
462 typei {{ {baseType} }}
465 type struct**-length pointer-length {
466 type {{ HandleArray<{baseType}> }}
467 typei {{ {baseType} }}
470 type struct** pointer {
474 type XID,Window,VisualID uint64_t;
476 type Display* handle {
481 type xcb_window_t uint32_t;
482 type xcb_visualid_t uint32_t;
483 type xcb_connection_t* handle {
487 # special types for call overrides
488 type instance handle is-instance {
490 invoke-arg {{ (Addressable)self }}
494 # A pointer type which is always ignored/supressed, e.g. VkAllocationCallbacks *
495 type struct*-ignore,void*-ignore void* {
497 invoke-arg {{ (Addressable)MemoryAddress.NULL }}
501 type void*-return void* {
502 native-result-define {{ MemoryAddress result$; }}
503 native-result-assign {{ result$ = (MemoryAddress) }}
504 java-result-return {{ return result$; }}
507 type funcpointer-return funcpointer need-scope {
508 native-result-define {{ MemoryAddress result$; }}
509 native-result-assign {{ result$ = (MemoryAddress) }}
510 java-result-return {{ return NativeSymbol.ofAddress(pName, result$, scope$); }}
513 type uint32_t-return uint32_t {
514 native-result-define {{ int result$; }}
515 native-result-assign {{ result$ = (int) }}
516 java-result-return {{ return result$; /* uint32_t */ }}
518 trampoline-result-define {{ int result$$; }}
519 trampoline-result-assign {{ result$$ = (int) }}
520 trampoline-result-return {{ return result$$; /* uint32_t */ }}
523 type uint64_t-return,size_t-return uint64_t {
524 native-result-define {{ long result$; }}
525 native-result-assign {{ result$ = (long) }}
526 java-result-return {{ return result$; /* uint64_t */ }}
529 # for handle constructors
530 type handle*-output handle* need-frame need-scope {
532 invoke-arg {{ (Addressable){name} }}
534 java-result {{ {baseType} }}
535 native-init {{ MemorySegment {name} = frame$.allocate(Memory.POINTER); }}
536 java-result-assign {{ {baseType} result$$ = {baseType}.create({name}.get(Memory.POINTER, 0), scope$); }}
537 java-result-return {{ return result$$; }}
540 # for handle constructors of dispatchable types
541 type dispatch*-output handle*-output {
542 java-result-assign {{ {baseType} result$$ = {baseType}.create({name}.get(Memory.POINTER, 0), dispatch, scope$); }}
545 # for query and return types
546 type handle*-length-query handle*-length need-alloc {
548 invoke-arg {{ (Addressable){name}.address() }}
549 query-arg {{ (Addressable)MemoryAddress.NULL }}
551 java-result {{ {type} }}
552 query-init {{ {type} {name} = {typei}.createArray({length}, alloc$); }}
553 java-result-return {{ return {name}; }}
556 type dispatch*-length-query handle*-length-query need-scope {
557 query-init {{ {type} {name} = {typei}.createArray({length}, alloc$, dispatch, scope$); }}
560 type struct*-length-query struct*-length need-alloc {
562 invoke-arg {{ (Addressable){name}.address() }}
563 query-arg {{ (Addressable)MemoryAddress.NULL }}
565 java-result {{ {type} }}
566 query-init {{ {type} {name} = {typei}.createArray({length}, alloc$); }}
567 java-result-return {{ return {name}; }}
570 type void*-length-query void*-length need-alloc {
572 invoke-arg {{ (Addressable){name} }}
573 query-arg {{ (Addressable)MemoryAddress.NULL }}
575 java-result {{ {type} }}
576 query-init {{ {type} {name} = alloc$.allocate({length}); }}
577 java-result-return {{ return {name}; }}
580 type uint32_t*-length-query uint32_t*-length need-alloc {
582 invoke-arg {{ (Addressable){name}.address() }}
583 query-arg {{ (Addressable)MemoryAddress.NULL }}
585 java-result {{ {type} }}
586 query-init {{ {type} {name} = IntArray.createArray({length}, alloc$); }}
587 java-result-return {{ return {name}; }}
590 type uint32_t*-querylen uint32_t* need-frame {
591 type {{ MemorySegment }}
593 invoke-arg {{ (Addressable){name}$ }}
595 native-init {{ {type} {name}$ = alloc$.allocate(Memory.INT, 0); }}
596 query-init {{ long {name} = {name}$.get(Memory.INT, 0); }}
599 type size_t*-querylen uint32_t* need-frame {
600 type {{ MemorySegment }}
602 invoke-arg {{ (Addressable){name}$ }}
604 native-init {{ {type} {name}$ = alloc$.allocate(Memory.LONG, 0); }}
605 query-init {{ long {name} = {name}$.get(Memory.LONG, 0); }}
608 # Or should it just use an insert function?
610 # there's only two like this
611 type handle*-alloc handle* {
613 java-result {{ {type} }}
614 java-result-return {{ return {name}; }}
617 # A couple of very special cases
618 type VkCommandBuffer-alloc handle*-alloc need-scope need-alloc {
620 {type} {name} = {typei}.createArray(
621 (int)VkCommandBufferAllocateInfo.commandBufferCount$VH.get(pAllocateInfo.segment),
628 type VkDescriptorSet-alloc handle*-alloc need-alloc {
630 {type} {name} = {typei}.createArray(
631 (int)VkDescriptorSetAllocateInfo.descriptorSetCount$VH.get(pAllocateInfo.segment),
636 type void**-output void** need-frame need-scope {
637 type {{ MemorySegment }}
640 invoke-arg {{ (Addressable){name} }}
642 native-init {{ MemorySegment {name} = frame$.allocate(Memory.POINTER); }}
644 java-result {{ {type} }}
645 java-result-assign {{ {type} result$$ = MemorySegment.ofAddress({name}.get(Memory.POINTER, 0), {length}, scope$); }}
646 java-result-return {{ return result$$; }}
649 type vkMapMemory-output void**-output {
653 # some tweaks that the auto-discovery code misses/isn't worth adding to
655 vkGetPhysicalDeviceQueueFamilyProperties template=method-query
656 physicalDevice=type:instance
657 pQueueFamilyPropertyCount=type:uint32_t*-querylen
658 pQueueFamilyProperties=type:struct*-length-query;
660 vkAllocateCommandBuffers device=type:instance pCommandBuffers=type:VkCommandBuffer-alloc;
661 vkAllocateDescriptorSets device=type:instance pDescriptorSets=type:VkDescriptorSet-alloc;
663 vkMapMemory device=type:instance ppData=type:vkMapMemory-output;
665 # forces ignoring of lengths, maybe need to do it for all vkCmd
666 #vkCmdSetScissor commandBuffer=type:instance;
667 #vkCmdSetViewport commandBuffer=type:instance;
668 #vkCmdBindDescriptorSets commandBuffer=type:instance;
670 # Don't need userData
671 PFN_vkDebugUtilsMessengerCallbackEXT pUserData=type:void*-ignore;
672 PFN_vkDebugReportCallbackEXT pUserData=type:void*-ignore;
673 PFN_vkDeviceMemoryReportCallbackEXT pUserData=type:void*-ignore;
675 # Mapped to a NativeSymbol via 'funcpointer' type
676 PFN_vkVoidFunction ignore;
678 # Don't need VkAllocationCallbacks, don't need these
679 PFN_vkAllocationFunction ignore;
680 PFN_vkReallocationFunction ignore;
681 PFN_vkFreeFunction ignore;
682 PFN_vkInternalAllocationNotification ignore;
683 PFN_vkInternalFreeNotification ignore;