From 181e2d9b0d317f36cf3580fc669169e4c88293f2 Mon Sep 17 00:00:00 2001 From: Paul-Andre Henegar Date: Mon, 28 Jul 2025 02:15:35 -0400 Subject: [PATCH 001/228] Print accumulated errors before printing assert --- src/gb/gb.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/gb/gb.h b/src/gb/gb.h index ffc40b8ca..70d2fdcc7 100644 --- a/src/gb/gb.h +++ b/src/gb/gb.h @@ -2509,7 +2509,13 @@ extern "C" { #pragma warning(disable:4127) // Conditional expression is constant #endif +gb_internal void print_all_errors(void); +gb_internal bool any_errors(void); +gb_internal bool any_warnings(void); void gb_assert_handler(char const *prefix, char const *condition, char const *file, i32 line, char const *msg, ...) { + if (any_errors() || any_warnings()) { + print_all_errors(); + } gb_printf_err("%s(%d): %s: ", file, line, prefix); if (condition) gb_printf_err( "`%s` ", condition); From 9a26ad00841b9a6581133febfff1f062f81971c8 Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Mon, 8 Sep 2025 09:00:41 -0500 Subject: [PATCH 002/228] [vendor:stb_truetype] amend PackFontRanges types --- vendor/stb/truetype/stb_truetype.odin | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/vendor/stb/truetype/stb_truetype.odin b/vendor/stb/truetype/stb_truetype.odin index f1dcdf2a2..07379f0fa 100644 --- a/vendor/stb/truetype/stb_truetype.odin +++ b/vendor/stb/truetype/stb_truetype.odin @@ -108,9 +108,9 @@ packedchar :: struct { pack_range :: struct { font_size: f32, first_unicode_codepoint_in_range: c.int, - array_of_unicode_codepoints: [^]rune, + array_of_unicode_codepoints: [^]rune, // optional num_chars: c.int, - chardata_for_range: ^packedchar, + chardata_for_range: [^]packedchar, // output _, _: u8, // used internally to store oversample info } @@ -154,7 +154,7 @@ foreign stbtt { // and pass that result as 'font_size': // ..., 20 , ... // font max minus min y is 20 pixels tall // ..., POINT_SIZE(20), ... // 'M' is 20 pixels tall - PackFontRange :: proc(spc: ^pack_context, fontdata: [^]byte, font_index: c.int, font_size: f32, first_unicode_char_in_range, num_chars_in_range: c.int, chardata_for_range: ^packedchar) -> c.int --- + PackFontRange :: proc(spc: ^pack_context, fontdata: [^]byte, font_index: c.int, font_size: f32, first_unicode_char_in_range, num_chars_in_range: c.int, chardata_for_range: [^]packedchar) -> c.int --- // Creates character bitmaps from multiple ranges of characters stored in // ranges. This will usually create a better-packed bitmap than multiple @@ -200,9 +200,9 @@ foreign stbtt { // then call RenderIntoRects repeatedly. This may result in a // better packing than calling PackFontRanges multiple times // (or it may not). - PackFontRangesGatherRects :: proc(spc: ^pack_context, info: ^fontinfo, ranges: ^pack_range, num_ranges: c.int, rects: [^]stbrp.Rect) -> c.int --- + PackFontRangesGatherRects :: proc(spc: ^pack_context, info: ^fontinfo, ranges: [^]pack_range, num_ranges: c.int, rects: [^]stbrp.Rect) -> c.int --- PackFontRangesPackRects :: proc(spc: ^pack_context, rects: [^]stbrp.Rect, num_rects: c.int) --- - PackFontRangesRenderIntoRects :: proc(spc: ^pack_context, info: ^fontinfo, ranges: ^pack_range, num_ranges: c.int, rects: [^]stbrp.Rect) -> c.int --- + PackFontRangesRenderIntoRects :: proc(spc: ^pack_context, info: ^fontinfo, ranges: [^]pack_range, num_ranges: c.int, rects: [^]stbrp.Rect) -> c.int --- } ////////////////////////////////////////////////////////////////////////////// From 8e25123445c7ce248fbfcdfc5295495ab9828248 Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Mon, 8 Sep 2025 14:59:56 -0500 Subject: [PATCH 003/228] [vendor:stb/truetype] use b32 in packing API --- vendor/stb/truetype/stb_truetype.odin | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/vendor/stb/truetype/stb_truetype.odin b/vendor/stb/truetype/stb_truetype.odin index 07379f0fa..ca8b92a93 100644 --- a/vendor/stb/truetype/stb_truetype.odin +++ b/vendor/stb/truetype/stb_truetype.odin @@ -108,9 +108,9 @@ packedchar :: struct { pack_range :: struct { font_size: f32, first_unicode_codepoint_in_range: c.int, - array_of_unicode_codepoints: [^]rune, // optional + array_of_unicode_codepoints: [^]rune, num_chars: c.int, - chardata_for_range: [^]packedchar, // output + chardata_for_range: [^]packedchar, _, _: u8, // used internally to store oversample info } @@ -137,7 +137,7 @@ foreign stbtt { // bilinear filtering). // // Returns 0 on failure, 1 on success. - PackBegin :: proc(spc: ^pack_context, pixels: [^]byte, width, height, stride_in_bytes, padding: c.int, alloc_context: rawptr) -> c.int --- + PackBegin :: proc(spc: ^pack_context, pixels: [^]byte, width, height, stride_in_bytes, padding: c.int, alloc_context: rawptr) -> b32 --- // Cleans up the packing context and frees all memory. PackEnd :: proc(spc: ^pack_context) --- @@ -154,13 +154,17 @@ foreign stbtt { // and pass that result as 'font_size': // ..., 20 , ... // font max minus min y is 20 pixels tall // ..., POINT_SIZE(20), ... // 'M' is 20 pixels tall - PackFontRange :: proc(spc: ^pack_context, fontdata: [^]byte, font_index: c.int, font_size: f32, first_unicode_char_in_range, num_chars_in_range: c.int, chardata_for_range: [^]packedchar) -> c.int --- + // + // Returns 0 on failure, 1 on success. + PackFontRange :: proc(spc: ^pack_context, fontdata: [^]byte, font_index: c.int, font_size: f32, first_unicode_char_in_range, num_chars_in_range: c.int, chardata_for_range: [^]packedchar) -> b32 --- // Creates character bitmaps from multiple ranges of characters stored in // ranges. This will usually create a better-packed bitmap than multiple // calls to stbtt_PackFontRange. Note that you can call this multiple // times within a single PackBegin/PackEnd. - PackFontRanges :: proc(spc: ^pack_context, fontdata: [^]byte, font_index: c.int, ranges: [^]pack_range, num_ranges: c.int) -> c.int --- + // + // Returns 0 on failure, 1 on success. + PackFontRanges :: proc(spc: ^pack_context, fontdata: [^]byte, font_index: c.int, ranges: [^]pack_range, num_ranges: c.int) -> b32 --- // Oversampling a font increases the quality by allowing higher-quality subpixel // positioning, and is especially valuable at smaller text sizes. @@ -200,9 +204,13 @@ foreign stbtt { // then call RenderIntoRects repeatedly. This may result in a // better packing than calling PackFontRanges multiple times // (or it may not). + // + // Returns the number of rects which were not skipped. + // PackSetSkipMissingCodepoints controls this behavior. PackFontRangesGatherRects :: proc(spc: ^pack_context, info: ^fontinfo, ranges: [^]pack_range, num_ranges: c.int, rects: [^]stbrp.Rect) -> c.int --- PackFontRangesPackRects :: proc(spc: ^pack_context, rects: [^]stbrp.Rect, num_rects: c.int) --- - PackFontRangesRenderIntoRects :: proc(spc: ^pack_context, info: ^fontinfo, ranges: [^]pack_range, num_ranges: c.int, rects: [^]stbrp.Rect) -> c.int --- + // Returns 0 on failure, 1 on success. + PackFontRangesRenderIntoRects :: proc(spc: ^pack_context, info: ^fontinfo, ranges: [^]pack_range, num_ranges: c.int, rects: [^]stbrp.Rect) -> b32 --- } ////////////////////////////////////////////////////////////////////////////// From eaca4a5923dec068063f2894e50f570eda77ee11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tar=C4=B1k=20B=2E?= Date: Tue, 17 Mar 2026 00:55:46 +0100 Subject: [PATCH 004/228] Improve bit_set support in the flags package --- core/flags/doc.odin | 22 +++++--- core/flags/example/example.odin | 10 ++++ core/flags/internal_rtti.odin | 75 +++++++++++++++++++++++++-- tests/core/flags/test_core_flags.odin | 63 ++++++++++++++++++++-- 4 files changed, 155 insertions(+), 15 deletions(-) diff --git a/core/flags/doc.odin b/core/flags/doc.odin index 183b86f41..6146f53e8 100644 --- a/core/flags/doc.odin +++ b/core/flags/doc.odin @@ -11,13 +11,21 @@ Command-Line Syntax: Arguments are treated differently depending on how they're formatted. The format is similar to the Odin binary's way of handling compiler flags. - type handling - ------------ ------------------------ - depends on struct layout - - set a bool true - - set flag to option - - set flag to option, alternative syntax - -:= set map[key] to value + type handling + ------------ ------------------------ + depends on struct layout + - set a bool true + - set flag to option + - set flag to option, alternative syntax + - set bit_set flag to one or more options + - set bit_set flag to one or more options, alternative syntax + -:= set map[key] to value + +Underscores (`_`) in a flag will be replaced with dashes (`-`). + +Bit sets may be set with a strictly comma-separated list of options. + +Bit sets may also be set with a binary string of 0's and 1's, and will be parsed from left to right, from least significant bit to most significant bit. Underscores are allowed and will be ignored. However, starting with an underscore is disallowed. Unhandled Arguments: diff --git a/core/flags/example/example.odin b/core/flags/example/example.odin index 6ace3d852..204fca8e9 100644 --- a/core/flags/example/example.odin +++ b/core/flags/example/example.odin @@ -20,6 +20,14 @@ Optimization_Level :: enum { Ludicrous_Speed, } +Vet_Flag :: enum { + Unused, + Unused_Variables, + Unused_Imports, + Shadowing, + Using_Stmt, +} + // It's simple but powerful. my_custom_type_setter :: proc( data: rawptr, @@ -83,6 +91,8 @@ main :: proc() { schedule: datetime.DateTime `usage:"Launch tasks at this time."`, opt: Optimization_Level `usage:"Optimization level."`, + vet_flags: bit_set[Vet_Flag] `usage:"Vet flags. Example usage: + -vet-flags:Unused,Shadowing"`, todo: [dynamic]string `usage:"Todo items."`, accuracy: Fixed_Point1_1 `args:"required" usage:"Lenience in FLOP calculations."`, diff --git a/core/flags/internal_rtti.odin b/core/flags/internal_rtti.odin index 1d86f4bce..925210442 100644 --- a/core/flags/internal_rtti.odin +++ b/core/flags/internal_rtti.odin @@ -110,7 +110,7 @@ parse_and_set_pointer_by_base_type :: proc(ptr: rawptr, str: string, type_info: case f32be: (^f32be)(ptr)^ = cast(f32be) value case f64be: (^f64be)(ptr)^ = cast(f64be) value } - + case runtime.Type_Info_Complex: value := strconv.parse_complex128(str) or_return switch type_info.id { @@ -118,7 +118,7 @@ parse_and_set_pointer_by_base_type :: proc(ptr: rawptr, str: string, type_info: case complex64: (^complex64) (ptr)^ = (complex64)(value) case complex128: (^complex128)(ptr)^ = value } - + case runtime.Type_Info_Quaternion: value := strconv.parse_quaternion256(str) or_return switch type_info.id { @@ -157,10 +157,11 @@ parse_and_set_pointer_by_base_type :: proc(ptr: rawptr, str: string, type_info: value: u128 // NOTE: `upper` is inclusive, i.e: `0..=31` - max_bit_index := u128(1 + specific_type_info.upper - specific_type_info.lower) + underscores := u128(strings.count(str, "_")) + bit_index_limit := u128(1 + specific_type_info.upper - specific_type_info.lower) + underscores bit_index := u128(0) #no_bounds_check for string_index in 0.. 0 + args := [?]string { + "-a:Option_A,Option_D", + } + result := flags.parse(&r, args[:]) + testing.expect_value(t, result, nil) + testing.expect_value(t, r.a, bit_set[E2]{E2.Option_A, E2.Option_D}) + } + { + args := [?]string { "-a:Option_Non_Existent" } + result := flags.parse(&r, args[:]) + err, ok := result.(flags.Parse_Error) + testing.expectf(t, ok, "unexpected result: %v", result) + if ok { + testing.expect_value(t, err.reason, flags.Parse_Error_Reason.Bad_Value) + } + } + { + // Value names list must be strictly comma-separated. + args := [?]string { "-a:Option_A, Option_B" } + result := flags.parse(&r, args[:]) + err, ok := result.(flags.Parse_Error) + testing.expectf(t, ok, "unexpected result: %v", result) + if ok { + testing.expect_value(t, err.reason, flags.Parse_Error_Reason.Bad_Value) + } + } + { + // Value names list must not end with a comma. + args := [?]string { "-a:Option_A,Option_B," } + result := flags.parse(&r, args[:]) + err, ok := result.(flags.Parse_Error) + testing.expectf(t, ok, "unexpected result: %v", result) + if ok { + testing.expect_value(t, err.reason, flags.Parse_Error_Reason.Bad_Value) + } + } } @(test) @@ -1288,13 +1347,11 @@ test_distinct_types :: proc(t: ^testing.T) { unmodified_i: I, } s: S - { args := [?]string {"-base-i:1"} result := flags.parse(&s, args[:]) testing.expect_value(t, result, nil) } - { args := [?]string {"-unmodified-i:1"} result := flags.parse(&s, args[:]) From 84a4dcbe168c7c5836c03cf8a58d7955d924b641 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tar=C4=B1k=20B=2E?= Date: Tue, 17 Mar 2026 01:10:35 +0100 Subject: [PATCH 005/228] Fix Grammar --- core/flags/doc.odin | 2 +- core/flags/internal_rtti.odin | 2 +- flags | Bin 0 -> 3558632 bytes 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100755 flags diff --git a/core/flags/doc.odin b/core/flags/doc.odin index 6146f53e8..e17cff21b 100644 --- a/core/flags/doc.odin +++ b/core/flags/doc.odin @@ -25,7 +25,7 @@ Underscores (`_`) in a flag will be replaced with dashes (`-`). Bit sets may be set with a strictly comma-separated list of options. -Bit sets may also be set with a binary string of 0's and 1's, and will be parsed from left to right, from least significant bit to most significant bit. Underscores are allowed and will be ignored. However, starting with an underscore is disallowed. +Bit sets may also be set with a binary string of 0s and 1s, and will be parsed from left to right, from least significant bit to most significant bit. Underscores are allowed and will be ignored. However, starting with an underscore is disallowed. Unhandled Arguments: diff --git a/core/flags/internal_rtti.odin b/core/flags/internal_rtti.odin index 925210442..954f3958c 100644 --- a/core/flags/internal_rtti.odin +++ b/core/flags/internal_rtti.odin @@ -152,7 +152,7 @@ parse_and_set_pointer_by_base_type :: proc(ptr: rawptr, str: string, type_info: } case runtime.Type_Info_Bit_Set: - // Parse a string of 1's and 0's, from left to right, + // Parse a string of 1s and 0s, from left to right, // least significant bit to most significant bit. value: u128 diff --git a/flags b/flags new file mode 100755 index 0000000000000000000000000000000000000000..edbc1c7e96f97627173a58d2aa5795e6e7df7706 GIT binary patch literal 3558632 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

JU`Nf!x*6qOyUR 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 g{uRH`719+esh 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 OZ-JNyv*F-Nc@M*L z|1W?lDDZ?q=Rr_X0k?oa^D5wyX$o{}7G#4XsEPu6v3Cz-k76feycu-B257l3C|QE{ zNr9S1puIkz`4v#B8MH?Tv{w~cP=j_2fXhs%IiP|WBnCQq`bEMiP&2g!z7GMsWg4`e z7#u9ng0~scB!SG+?Ex3Y@P-`IYkf$w9K0b9+VlpqK}9&oTTn63Ox??XU!b}GI=Rz5 z1>CNL2T3=i{rSR%0dhSuw5AhB)O4^T-g=+`0=XXm+#*0e@3!#`sPzOokOW*I;%Lu; z!XGRTiX%{1f!4o*9Nf(TInxYUQ9#;K;6@x}EzTZjJq>MvLhtJWrDRCe2R#z%I3(0z zr;LEY5*&S?*=4y2yAi3CUk3))r#OPvOD*trIcTW`-joDdMgp=OGCm95 z9|T%~4-!H)9ai{*#K4M>Y=liDfPDzsr2>jijEMx$#0IiUbXsgVYl@ zp#W=`foDxj4ZbXoyC z4*_yGJo3Tb?wq0muBJdsV88}|t1@t13~Jqigh1{?ax+*tNDQn9;b!#62ZbD{ZUUF? zI3piCXbwHV71VqNS=iYFKA`|qmcVLeaK#Rdb#Pq@I!*U4u9vZ-BLeyy2pf@KP8Y)5uET(G2d_L!%kCnjhjUaFBslt;0H=$mW8U zpMhKj5(6uO*#+rMwy1#p13O9rGHDb6D$Ws+1zK$ZG6Kni;O1y4%j;y&wk{vgog95a(I7X${EvLZCs+~Gosf71H(Xm(z*RKT(G%bt3_30c z6mFfM;Uaj?1iV=f+>Zwp;2`_{kFvpk1n<9yq9n1!9AG=a4!Gy2u<7FyIa` zs8|MB2MQRlfsox?AT8jM0jvlTFc$EWC%}#e4`+dLDEQP6f4uIR$+4HOO0#Py#10P=6dG1n#P%xe(k52Z@0dL0t%oItx%%0`Er0 z6LsLLq9AoJWLF-fpWdPZ>hOcY4YU*#7I$DVXxxGO+o0WBU{6A32EgkL;ma98M?iCglXw=1nG9C~3xE(~yNq{O- z&^Q6eQ%LRuufc;I7LDdUuyT+XSP|5HpqK*pF?F!)H%1P}13D&3$X-Mc|^il80πOK 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 )ztx@hioU^#szc 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�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 Yd%=SV4QN~j0Cs7%N&o-= literal 0 HcmV?d00001 From a8c17c36b99f965d8f08e8826ca88ecaf1133424 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tar=C4=B1k=20B=2E?= Date: Tue, 17 Mar 2026 01:31:45 +0100 Subject: [PATCH 006/228] Fix continue to outer loop instead of inner loop --- core/flags/internal_rtti.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/flags/internal_rtti.odin b/core/flags/internal_rtti.odin index 954f3958c..8a79f75a8 100644 --- a/core/flags/internal_rtti.odin +++ b/core/flags/internal_rtti.odin @@ -494,14 +494,14 @@ parse_and_set_pointer_by_type :: proc(ptr: rawptr, str: string, type_info: ^runt valid_names := enum_type_info.names underlying_values := enum_type_info.values - #no_bounds_check for name in names { + #no_bounds_check outer_loop: for name in names { found: bool #no_bounds_check for valid_name, index in valid_names { if name == valid_name { shift := u128(underlying_values[index]) - u128(specific_type_info.lower) value |= u128(1 << shift) found = true - continue + continue outer_loop } } if !found { From bccb9668e333c600c9ba206f7245474f32a70af2 Mon Sep 17 00:00:00 2001 From: mtarik34b <131314797+mtarik34b@users.noreply.github.com> Date: Tue, 17 Mar 2026 02:27:44 +0100 Subject: [PATCH 007/228] Delete binary file --- flags | Bin 3558632 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 flags diff --git a/flags b/flags deleted file mode 100755 index edbc1c7e96f97627173a58d2aa5795e6e7df7706..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3558632 zcmb<-^>JfjWMqH=CI&kO5HCQ;0W1U|85mx;n1T5q!hykpfses~L4iS@fsKKIfrWvA z0jACY%7W1X%pe^M3^1Al!esyngY*S}7z_*y0n88+V6+TW9gGIK2_yufLHa;!2!`l` zxxj!AA_}7!1R#8nK2{JD%4ZOO>Vwj$TXjLQ3@{p5AK1PN5P60RxnOlLdd6R{ECY;2 z)&~lk6K9RU>QCG)LZNr?g1HPCk`NlEkBNZ+9Huv*`ffn=!RQYlk1#MWz-U-_f?NT@ z1<>#;fQBcGR)AUqqtW$Efa;q7)d!p{{1$Xy^iKxxt4FO-3)f#Cp1 z45lB%7GYoj=MRwle^K2HD?e!@O8q~d*r%fY;d``*I7ki143Hj>8jz{R|x9YjKG8;xPX$ z4)KYM3=D$E5e{YV!lC{i4tx1=#ET9N_1QSgFUFx>6o)tm4tx1<`0FALdw1h7pCLXz zJvTouzPKc@s3bm~p`awAC^a!9zBsicIWaFeHK({Fu_P5PoRV6Sn4AIUCYF>Gfs_`P zBqnDUXI3E;f@RWEONx^-Qd0^NixP7&G-c*xq!wjDR4}9!rKU2ZrS`uGSl$l?YSyCCFn^?h+mX=dmoWYQrnwy(nhHy_-er6ur zAh6>y^N{RGE=mP?v$!NBzqACa(V2M+MX8B7Ir+&9nZ=1EC6%bArKA>@6y>7{!u_A0 zlbKw}kPFcsAD@$%lnf2=+{Da0sC|{0sW~YO#U&}JMMZGKQwvKIb3g%;npeh<3^5=# zHMckw5k_F&6sMLz;sz35#hK}Oi8*jnU`oJYh8i1?SO$exazQ0ST6s|>QgoN37DI!a zAu%bxsDvRWGbtBT*_eS?$q<&ikEfG!ypf)v2?LC2j9?n+nKG#O2YI@C`hl_@69Y2? z6BsgrNe~+(0>ThBGh79TkB&j=SfDyV<}orbGgvY)z?wG6nki?-*0ZR!WiG%7~upk2ig9MT|sD6ftDU@~E29h|)ZkV_Mk~pl* z1d_8r66XX7K(PaoI2Tk5M0p^IbAtq+H~>kU2Py`lB9O$PO;eCCLjsaGv}p|%&p;CA z2a7<60wi%zTLL1=z)*oCj$Gb1Ac-T_V;xB1!Z1S^7#JoXiG$inFsT_x;-WA?1_p)& zNaA8h;wzBE#gW7}Ac;#LiSIxXhc($j(g%>lr9c8ud;&=v)`tN}T|g3-1qnd$4J2_n zs2GTPfFv#t5`f|tNaD!trVmKsN>H^R>IagzGDrZ1A0pDfDohO2UPlsFLlPfl4zCdS z%rE!LqxlVoM>p%v^F|CFtp`e&{$KEDKEiPr?9u!_d>H`dSAqDTqVS~y zm|q0qgNneH24H>`hz~0IUMhh3NgzI`$a^UO=0}0}prY<21DGEK;)9B~mmmIt{Obkc zgNnA755RmU5Fb>ey}SVCTY>nXqU_}XFy9Eo2Nhv2H-PzCAU>$*dbt41R|4@tMb^s+ zV7?TH4=So&Hh}p;AU>#wdRYMGbAkAvqUmJz z=j8)1{}6}|s%l?e`1}7qC_Ndz_3XSD=h6Adqxs2)fDl*11BNF(jvr6R&tdp4ntaxX z;Y*qxzkCZQ4KaY!A4YH|>}Ysh#Nc5IB1?pKfRuoeBj2IY7g+o0$pT4O2|Ns9n z*5n&T42-ddG3*1Wf8B*}!zX@07nK8__yxeEpo_{6{_vA&{CWrZryS&;eL&%0!$Zam zj20(KbUyJ5_<&W4F4&{Xz^`%e6My6(Y$}6Z8zPza!lTC!<{Fg;4E%Er zs4&_vl(6jpWvatFKw0fDL_-?C-U0sEU}^p-aGTX$D?#k$4?h65Z#q~-3EK`(E<3yf zl=lw5X4}ESz`y`C2<)pHAe(Q1Y`);p?W1zR{z9-TER5+El?fOQIhMGZjqX}o9yY41D;mi6fLQBm+{{=vXMAMRywhzv+@ z4qQ;=wE)PW3al_oEe=CP*bpKx6%btwKN&h)RQO9pz`_t^HVphz4}e6wTvYf~7(JSg zSRf_f*9`pJX-H`lo$t~7Cc>xFM}@<3Gekwkqq9Us0pwu~ki!K)!OhVf zq9V~05CgDmL=S<+pjqVXb(hk+rDU*3g*!K3jFXsE-dlSc()JV&RGia=+G ziU`O>5+J)2Ji1#{CNMx^S_9-54WDin6|nJ8(?vYGLsS$zx=U0fJUT;EDm*&3sDL7~ z(?_MG(?z8K5D!fVq03~t@PysRn zT7Wo!IIz;h1LQabkTX0$LEr$&F%qEi$)(#xMF$iH1|SjR(82o9f4ffvFY3=EL?tpG)g0LUFOpsL5A<41>!iaN-C4UlsT zKwbpd0g7d?=Rsv5h~v-&QrGRH;sEll0H|<>mF)%~-)eNYsFZ^YhZL5bH7YTkB`Q## zb^54y*f5lUBB=uGdIyl}K`B!PR{DZVXGoAiBk3Fm0|Q!l*8B#NK0)pm0o6Yc_sfIa zuK;pCxC#P?u0fZJiaaO;;VD$4yG8{ZY8oK-Ds;H0q=VcGPNe~zH7Y)xB`UB4>Z4)- zbuT1Q8Gzi&(e0xm0;<_SajgIfZH*U}T;R$G(jN3^e6s?aR%$>QwFDGYE-DrvM>u$N zwx}!s%k`*$(-WwAhqO6Lg+Q_G0B!|9L`rx;A{HKvM?l6M2H9ls!atCi!K3r|3wM7I z4XxJT)!RXj=7S2Lw4~wD?T`VAFawX~7n~(RuNgpQfjA;13NICy7{GjR9*h9VM0j*N zfD#terV;Za3PoB{{xV@0sPy*jXRHqJu00b-KBgW zVGoby7mOfdJzma+Y7F4tj$h^L5|GY-ZUUvU1UY3*xu;*>Ffnrt5M)-qZU zdw5v8sARyJ(mo&~!J#eyN~9j3f{X){!Xe=g33?%T&|7>11-*|72S}TMM>op}S?T8jFp6o9gRPG=3M4N?M1Y$2dB#z!T;R=AaA656A1zSI8w-$sIJ#?8L_q$L07ZuesAL9} zI^`hGfXlH2kUcS-H6Sm5Yse5#0pz3N04;kUWu*nkCs@iJka@5Q?Gvc1oB-;tcy!vR zfJ#De4aos25d=`GT2L7*aTx48k8T^47aUw5uS3hP<~JG${hcA8#tA&7fT|0SuO(27 zL)69spqdI=bAv3=I1H{R5H`Kz#8RG1AnXIR`3bvM09!#>c6(u;qOVeRFR zmn;nX5nY6*PzjC~)*uORd)e^`3&RVUPiXCBNPPtgA>2*A78TGq1Ssag>3svJ;OqqF z>>3qtwP*nfbPiBz#M+0L0?q$h!1Z5ekIEDV28K>ZLEzIl1)Q5;?ITdxRRL;u6+k-| z0pOk$s1is372_Ztnh+?hLu&0#AC-Vk7nKlD{pIjN;1vtQem_uPfrhtUTzmuzEcF*G z4Eqy65}?6{7dxO59547l63HM5&;Ztp`A`Xq7hj*VFzl}aNr1*2UbI0a3|`y;Ni>2a zz+JZ7M=T8c!J&Qm5evhMbsxZ?jhen*uz(6P9~A?TS1rI@!w?l0s3&Sv0zmDr4=j)l zYeaX6iVLXn2bX05-Jm{mH>eNL?E=!@qH+VQaF5CZ76yjSEh<+))D)EqV9_3x6JWYU z1++xNqj!(W0dUOKsAw2|+XY(o^n&;G|No$p5M0t)bk~3iXdjgTP;uko((MDX+eJmg z<2WP*fWjZtiUBngKw_YT05Zm-dy5KKtb2+INDNY}3ixyeaCBOL>;)yC7aQ3i4G&Or zLjhzAxQ1xn15On1wgkV&@dFx?!y*P)6>CI0O`O65zH4q;9*%z`(E*G+p4h z6Xc#3ZJ!`DoCGLILW8bG#ihGM#Q~I3!L1$zkKQTJ0GR?EAb_^Zx}p4T2p^gb3qUC^ z0px8^c@GK-kN~DAv}kuxNdUF-J4;kb_BVsl2WUvvr`JU#;r|8H^Z=?$@aMmQ>z|)} z#=@|F63F?W5!M%d_hDH`1(fbLfFwY}ZZArq5*#nMK@#8`aPdA1!;3v{|AU4k;O&QC zkH$9)tdI;~0g6TkP{*J%M8yY`0Rli7KLV5iBv>ICAOXY?fO0arLsWb~X)^#Ei`_md z9-zG80BXm8tJ@4vDFVtnKAkNpKOlMG4T$Pd0p&W6PDn-pr7cLt*#gcgFWf+l+|CwA ze(Bw#asrx93}E@>>2pXv0r#yOx@$ld`=~^K-2%!d;1-wxC~<(Y7$|Xo>;UHlSl$6; z#qKST{LwuHQlfUxfmqr3z@sxl!lyF=DbIimdT|%53)H0Ub^zxYa5ih+1I}((^9)!) zcMDhnsKnOr>23ihb5LL_AmtfTPl9ik!v@)~$_QUcUU(Ez0%NPdLW zPMuT0E`avkL8-F>6sQHD#G3JfA6(3Uh7CboSWwr{qw_duP!Xh%^1-oy$0(Uk@D3#N zalBX#l0am>AGbjgHYzXr!L`1N3WtZKi%J6jRLFRhOodW2MKZ_? za6Z+%!@}@FV0G0!^R1XoQ-@@#6XeSgm*W zHVeax9WOy`7 z0VsEZJjDYFU;$78AOZ3jc<>o9Bn2sUz^zV5fd=w8csvf&x&U!NRRyTX1-AgZp+nf< zAu;ecC1ex^RAhsjHX$zEAu2qe&{pv1jsXq*?}0W`q1Auq7I4GVqjL_pFakwD1!&fy z1mxBNkTWwt&II?nBakD&;tM!TxmPfj@^-nXaC!K z=7Or`LQ;+51>`8W_8F{)6RL+3Ne^^%4%r3{hz%T2)u28y%st@X1XZJ!Ct$@z3Mh#n zY2OJdJsfv{i;p;nz3fnv*ir1YK-2hQ!Y{BZ*`TV~;HqCUfD-`35s0}+(0r&zIH4QUf{59ub0F?sZ zc8vh2v;dE_f|D+|r=`*5q7v@e`Ovph(1m~7i5EGb20~{DXc)vrB?44OM}TZf@Mt^& z3dh6H@kmf=6#%&ixzy?e_ujzs4?d8oN(GQ!NC<)^!63!h6i5x<*#m7QLqd^GC2a|fACP=&H}LiYe4P>wQhS|R6JfVm~%iT!ay3p zW40Qg90RGIL2)SXq8BuHiI_R;2B%+8rwBSuI>Dpy4XB_1wWlRqIzaQB>L71prXXS$3}j);Fy3}Uo#kOKic6q^9@ zQvxUuGC+Y40ZJh|7eE7{0F2Pl*sY#2(FK|u%}uL4hAAg3r$+v`QO3nPO^^O20h@cFR}c;gLZh5*Pk36Qz4 z31t=)kP{?8P5_4oWY`^UeF8`WbZQCQNCu5EHrJ>)z?;WB@GhkbsQn`cs&59xdWaI2le1VZm<9)H&7u0Dvm&HPf&6LB`T01kOJhzHE_-V z4H-bR`haHCL1S~B*Pup}fJQ^X{RA)p=7Q&5TtEW~;86uI_W`I=ejL2L;st2UKPZ)f zLqXuhL@N#kkf%LBnHJoq0(;uSqwxsHi-%$J?U1ZdqaxwbaRM}R1WH00AjcYjbX$O; z4qQTmIxrxkzyrJB0u3C8;5-eUF9N3$aJB;l0jTB%HNQa}7*J4v%27~Ifb8~w7Cs#< zD*d2#;4w1}2A8f76?IU`02>1~Py%usfN=l?j0ea)hz>4jV*)6261rMcCNP5QuY8a@9UQt!RPsU5g7B9I$eYj-v~!9| z0VAky+@n$fqPu&bd~i8F1tQoP0&35+sDReBfxJu0A>cj(xn;?D@J z##~esKy{b_h_BhAq5!1@pfo7GfaF0HErFohG{$89Z z)@1;dXbzxmG$d)dsBrA(02KkCy)L`dm|!zn5AXc{4{{K=X%8NBO7J-Nkj10hgu|md zgo6WA-Gc&ZXBj97Z{}xYc=_Ys|NmVsD)}}HB^scN4DMuu%S~`)4W7lU0Hp;;>V2^; zU6%nAZlG`mwWS#u7|_f2#y6mp1uBp5r@s~8q~M|gN`DJTOMeYutvxCoAiBFp1;U4> zKd>My{ee;_DE)y_EGSQd(jzFZgVG}?{l$aQ7i2jNIQ@bA1xiokq(e~J0;Ow6Bu-HQ zrCm_^;{dr5G`0guQO6-&2Uz+8MF%YXf!WqA;1(bv{eeY0A*s@%c@MZ<$iR;${ei9P z-U7BBl>R_Y0;NAt+5shVaIw}68T5pYn;wVEkU^aOz^4wHR6vOWshVYyrEwt3_o78v{c}i%J|L0|Tgth44TL4wQjF1)NVe#7t1m2DzlG z2cme23PjZw6|l|SdsIL+`gBhL+vw9hM+Ib~Pv;z!0%D`awZ5JqdUbtQc#XZD7F#mxPKWK3zC}V5@HCI3x092HM zYPRDoDhpT{z$=77>OpK+MgX&|TU1uCGBDKU!eu*KRAxYRPJo#P8ubH-HNRrm0V?`E zIxl)$e&Er0(C~mq^DhSvey4*T+$|~~^`Nv5ra?m@AU)hIDj-*Z#6k4S(*OVezh(eA zwgYZ_iwcPC0jd>P8DMka{4K8pK{E+0;5_Eh-2)C^aDSu)T;Q$ z9iX%UlvaS!pdn_EKG4`S$PEopH-N;bWfmwxK=y;YYyk>_?iLjXP-J(usDSJPR}dia z-YqI1cR-@H>Jlhwp&&8CTfBzwp&*rCV~_onOF@qu{0ey-@)7m z>Z_ug1|IS2ftm(VfMi-N%rr@mAjlM0>IJc1-T|$z?S_V#HDoFPT4?jPJOSkcsE;9u<%=pn@M{JjgnbwIE|bMUV&MFAvS1plSn>F1A3YEn2|yd!WJ> zG|vap4W7<84w?T$tu{at8!tq&Atfxxt?=wK7t(5CeYuK{fdOPCs6+*oejrsKAA%}7 zq*you@(Xy}hwTc;FFlanaCZyXPhBh=9W5%?LE{gwkcPJ8K*lxf0ZYN+iNED4IMfkQ z0xFqc>sK+7cH_uSpjI)GZ*RbT+YQeCJ@A1j?7mG$_zW7v{||uDFgO4RdlodX3#wW- zfMauy3WVOG0ul##_E@Yg!^_-XpaS|e1JuLtBBJFoSQpe@^s;&*4iAIcLr5Ne2>0-; zi;%PiQUHoWkcW{^N0uRIX02Q0PJt`nE{%s##T(SXq z1i}Z^bYLqWW`m*;N33i@(q;nKxqz? z7D3Si3QSOe4eBC5I;=>3_zv;|=(Lv?`rxty(tZUcVUTu^U%=WJk9%kyJKmzA0&_#} z6fpaRCl@nAcMq7|*`uNWa(ZWriUf%6hSJQ?%-#v18}@*c5CeY;Xwx0Yp`i9PD8UH8 z4DX(z0!|PYA??J=4-8LwG`|A15Kn+y1XAb0c>p$L`*r9@B& zfD8kL0BGP0$?tzaeh05F4L%ErKac{D4WR4_(g;p&$lY>K9s~IenxtQFi8C_1Y-R`N z2vDVfDA;pA`-P6TsBl0%b*x2&9mG7=qQVBELDqm`2A<3zJDvDja&ffEKuvcf$Fndq zFzf_ZansH~91l_eG8LNmYN2y9{4LTrOa%4K&`kslQ@n72ng~*WWTF+^#FNl+8XP{| zu<{3%cBX)fIZ%xL0PWfW6#>UvR6fAiy*(-*aZt7eiM@En4QilI0SkiiI7kpw?0`ZJ zR5pM@sRI&v4SOJgSmJ4T02FW_CH(V1+m{RvK(;T{mneeF04J$#Na%ys8A1bhDrk(q zzRN|WUWKs(5)t4k3LGOSg&8QWkPEXHaM$lq0rjOkdV5qrVxYo|)dEtOf%qT?gIonQ z{dkMY6J`bm&>#*dAVFRMxf@jcL)$a_EoYgql{PLa1xRrt2#@U*r$Djo1DYd(G_4wJ zIIN)M41Y@_XnenW3baDl0&aVODhfzMwSYUR@GRF2sgFGV9|XA?>^7(nDD8vX2&$rP zFoOmVTU0JEL#ikc?a_&|it5m11TV*e7zfGna4$m}l|&VXC!qEo0MVc}6`0!8G%-L499A!_068Ai!~oHtCI*<^q5>8N4d~$U%nW7*h8KnLx(qKR zJ|dUxpbQ2&$qLk$21OVs#6iRB2^fXEJjjFKLf#9Uvtbz(mT^I|0I(9i2j-IADJmfL zi*y!n2@hg-_JC6}sNe-z3<@MLjaI^g#6gZBE7~hSA=BBS0y;AblyV{T78S7g@fMW~ znEN2nZUU;oL1j3o1_#N#a0j)uzhW)&K$D)JT};S*Fbz=H=z$_%?=&d#F~cUp0~R(Z zFuQxFsDRinyqUpa17dgfs3bt09s#1eTU5X_TG%x20V}KJp9(6qz?)@xH!xa3%A%6e z*F4wft*_*9SUr5AvT*5fTI3Q%8w^iazzP>z8#X?q~Olg=I$ zkb6MB2lehi@{pngVn4|42B^CVpmYM14uI02v0jim11KM~l?TKZfcj$sXgM>eMC)x) z0kJ{zOCF#e2UtPx78Q_(A)`tv2SCvdDfmDmz#bs?c!135o}vP>4_sY?_?;~(3?RCD z50u`b0y;DbR8;){l~W-5Ac@iklyN~P8Gte_NbW^nlrE^F@*SiOWC5u4=F$A%KPV7h zK!QutQo@K<#6YN5JBs5SenoqxmNT|CECqCsaWD=CeVvguDrv-Dyz) z&Fp}RTnN2I1uPD#oKU?P3Gyar#1rIA&~W^VD-pU3ueCrPgjlr&>aZy)V2AbYQ30hX z$W+1&Zbn!vGrrXP2bx2N79rg&D##H5YGJ`50y0n30+~GO-UFq#fG3r9fd>);eIY$` zhz`h5X%}Qb--e;Y3*ojF@BlEVX$Km32U!BiSg@JW7RaP%_a4YhY4;W|A2N0E#zz-4 zJpdZ%$S5RNz0P@oQhOGk)GJ!pCw z@6@=!aR<;85yOj!XaE0uK|(4T=>%&*Qd7TWF}RNcT?PT!<%X2&`ayLXcs?q8KPcBh zw=G$K1}a@t+`4>J+&X+z#5#Ob$~PEToZz2!(D1;wgNz+6D&nO~uR$yI#B412r-Awt z;$1E(;wqpOj!dt?TaY~?)9*;0=`E^>_yG1Oo2#gW9X$(hatlYYKRp8&sHs5&~!>`Iw7JJ;N~< zl{yBGZcfnZg#yrC!vgSZlnq0vJt$Fv_wIt1KuRD*z-~|kfS1-@+Y1i`&{jwrj%a8< zv&01CJn)`r@U9XpmL6vWyMloMv8fbnB`B4E*Uo{eE3n;={p-jrKTyYFCwSYc$w80{ zz(!T2Qmx1n+U`Juf_7{1+Ag$^-+m#1Bo zYyH5>kU(qTIzfwAI(AfJij(f9^DmDO3J!qHg*ItK*o9MBOW zE-K)IJ~%+7AZT)`vqj|%C@*wF7Lay1faWt^BZ(Yy;9vyRG9bmC-3}I>-2o1s%`X~2 z27qU8K+@pdpF%W9v z6v%QH=+-+>@&Z){ph^r>I_%N_Iqa4zs3wE!_VDQT3;;D$KothaEuaJlYRf@r$TAu5 z#`UR?hRW1~3gCtcf6G#6agFJ{ZfLOs_GSs_#1+tr!*0;22;Cs=aTgUxR_}FD$#{{W z%ftXqd8okz^AtD%gVJs{s4VR+QHj`P3-X8{*dw6TrI6j>kV9QSH9W{Gkfw|78wQ5g z0iaYUfjy?d+i^iF3L$&rK*s|dcTuqb1v)fpk=jl^Di$wh`{RuPaF%lcoieHmfL3aQQZv%|JRZ$&z)LMb$L^?r7946gbbRP=Q8Dj!QBmpg zQ85QK62MCj9Xfne>_NLUn_rZa2)t$hDQG^>)%=37JnS`SxrVt7Lx~t@hKFHi(w$re zP%h*EWqX0wVxWN{hMnoCqOdrqft(EkTGXT>u(KEx)W4OufSC4 z0CERpDJ5u;3@C6SKq(HqrVG52EdkUZo52Jcl-mRCxNTACU;?jSX$K2WQK9Y3W&|W?ZXQOdq&U-n0T=A78Q^M4Hc{mpo0)#JT``s z5Kv|Y$$4};2!L`Jn9b}c;n9468I<9{y}`yk;9enUQ6IP|W5ZA)3G#%){#?+)lnr-s z8TOfil7jUdX3zlwy^uwQp#5`<3=A)pZutKn5DJ|G-Ut^0LaMm9`J%BP+18Q-<1UN>^cWs@GuC- zTcFbYC8%?R*IA&YKp->0J(cb~kj_Q-7H|&+;;bk_&H^>UK}LY$0#t-U=q)NB@m={K zXNjXbOA|bH1}?_1hZd-m0h##$TAe}YE#PG#5N92>ClFfT6&mnm6nmh{DYmG9#CKJJ zoYi2D7Fv_Q6$Bn<;j3jK&e9>|EYOe`$Y-Fn4WQ71(2$KDyDC7=dTEF1EKs2WS@4IN zQrQ?v;*j!+1jtly1r1*o2pLr_F$1OF2ymSU6;S~djSirk4_;{p&SBjJ0x#bE0{5gq z!!pr_U&G}ZDwr8c!27^KDnWU+#0kk}0hrAVdsIM~8zo0GGC-C-KwJho>jdH#&~O^a zT>&1=FPKWqAZL7lI22QxxcG&fmE_gChXvI2_t88CYG;G{&z-P+?Ry}5V4(eJkUJoS@EjFT0qnxRZ3@^Q zpuJ+CmK3OC4Qg3|=l>ZP7(6>4IPwcJ_;yA}xON5zxbSZ~@Pf$|G{pp7gbv!X1w94< z6t$3+6{LXda$xRo0rfT@++z;R44@(iq6E^4dND%+G}{JI(B-32-{Aq;^9M;(j$xo0 z>j$*P0yiBXYtSK^W75I>8Bpz201A50Kq#optpL?uppj6Rb3i??3Q&0uUd*2XO34LX zE-LAu))dGsppXp!ZCr`~ZLR{1zk({N7fg^U4K(fv3KGz`Cuq$OShz>!1ZWsjfC)5$ z39c)Tx2UWDm7<_B=y(fwuo9G___tjEwQoWGd663cuF~d%OaQgp!AT2NrGcz%sDM>z zAReqr1GAB;H1Lp8Bc!ecr4y7YtpZY|Ie?NkxJt{I3aipU3-w`D+NG6{Dh)J{1#%`R z{6O|JR3KGp=~$~Y2h=Lf0d#WF4S1DS0jiHcCZShppw-l%2m!681{Gxx8akQ<>R7#y zvw{@TIE?^}Re_9vj9u+ffzVsP8wDU$+HFfnX$bNbC^Fzx8cs7In+jkfevo<}ltw|~ zkV3lMl7O>7nHuCQ(E4wX&mi;`@IqTimF9x(ELfF>(^;UoK9HG^MGt#W=1(Ec`d~r8 zS)hs@WCYd*0Jut9Yk?M8uqq9wvj{f;A_+MQRMCT+1xmS~(1Os=1^~E96GL+rq)G!- z@~A15jiDq3mTtjkK!Mhmg0f%p9&ptUFQ{!mc|QYGe-wCdo`B9xm#BftQSkl*@R<#e zG+Q9>LL79QLgNuosT1uO2d&sZvY=`JQn5jJtPGHf4a5WIRjB<9dsIMK99pq~WWf~z zcugP37m!1|TEK3kV#QXmA6&5&fO0;#V#}KduGqe#h8nD5gSd;C0aCGnG7LPtKvfq= z7r0^rF<_w#_6J-RRIx#1V^k_YwF<}(Q0-;`>Re*fZrfNG7__xhb0lCtrbBhY7MF#4vfL5`BYBvz=+4<0sU(k`mvolh`wKGxzwm0=cB52*f z6!4A;PY@^GtVLx%I6|Nu z1PxGWT5bwToEo5#G~hC*a{yJ9^jZeW%6}~cWmUcAfU+tY_CU;n4o~v8bVHk@IP))P zm<8k+aQgr>?GJVqq@4gMR%V)D6f4l)C&b~f!5vUT0W_2ZYAArRF@%QfNCI_615I>6 zJ*jRV(4lvr1Hzyc9;ivs0^SD)OH{B{0VIGS0sf*%0MaS|g?3jDSUsd+0LzxJ{d}N~ zCTM^M;vUEuO`tRa@@dBfSktQ$viBKOjYF(~O))~ox5W78Q4pmhKi6kPV=QL8+)m;~wyg6zG&7*m=WZpkM?k zft7%uhj*b zBm*)L#0JTNX0kzz_7<>39tU55%>-Hcx)Ed($e*AVN(tE4ARUl_))uhYufZiO$V`|h zh|RCTTUwyY@R`33GM$&kpL8&dUxT-xK$jtnKjt96#)&k3(F33OBMyG@;MeL=0eRsQ zf84=O{DLjudBTQ0;J9EY(fkA|G(b~_X&(G_2RwFyGBN`LLxYFmi8K%XyaRA8pcDd1 zP~d$X(Cvw!d1z2;5p;PRhz8BQf@siWE{F#8zCrW`(6%y7$m}PG4=VUTG-#t5hz2#B zKs2cJ1EN9Aeh>|6c7SM5lL177>U|Im?yUDh_nUw=Yk=YzG%pS+tUwC_L6Hq&gXYM= zG^8?ydluB910|YWX$%Yuj^LT?7msE^N=I;g)(IK;1LYzRA6pdw8a2z<2U^SrZm#e8 z1v=L#M8#z%XvzywAymAuT=D-usJ(6hvK7<~>;@e#)(tu@5pocLi%NxGZwn8|S3a62 zKsg#x9khV^>Y!8t;e*Fip@N+*pwo^ZsS@Nm@OlAo^67L@N$~AF=*f5xRA+T^>;xY| zvSm4_R+<9cF#wu3gOARFni2^fjE7!Ka07K_VD17r8C(Z~0s!O)km;U`2SDxv4cPAb z4XXXXYjc+`0~roEPZy*TBn`^;pvnl8T|ku-NF2=X?g3X?AbGIK(4Yp%Lox#+1ApsN zP>h1gR}c+4jRutbK+3^=OYjNF;Gp02ALIy7h`;!>2;>MC6^RB5ZD^L{Z-JaC3W-cm zM@j(293&$^7aBN%=K2|4tb`gQ&``nX39X1qLSY&~U0BSCF3|R%ouEq}pk}y&Lj*kI z3AOzH0gwMD(LD_+8G0b~aW~`)DNsWlGT1W(+?smf%>_DC{RpU1fS!L3KI$7ZnF2jn z9Xgi+Izh>!J4A&8)P+pw^ihccrIF?r$t8y1!Df->7lkF6FlJGSG>lmW9gP-geoYuug#VdtkF5pdok2$)VuW=|EiA2t4S_42u_*?z#-Gb3v&JY6SRD zP!ko8ZZ`{$?lSN`a1BsoAPx4uIO3_x-~l>;pGC!kxdYUN_2>jsufYcxNPrII5dn2` zIY8seod-IP8D826p4$XPKKK9wSp5lV(Su@10(2&i3TPM|dT0%33cTY2Xkr&M_6~BO zMpp=E1{iiwGpLpY|Nmd^1+TUQoyG#1(<5X)IOjp9#dd+~rQR0sjwfv9 zZ+P+l|I1jC%m>v7AoqisAiF@9sDRuL;$SmB0A&7O(9j3y3IU?R2UJ{w%m+=l!NUi{ z!Djx4=l}n|oJ*4Vpf(T4d{FCg7Z0eg>4h8}h0Xj4AoFcWG9S{0gY0tO1zLdw3Lj9j z1)KQ>AoK5nhlX*+Zvkrhft0k6`D?iOpxlGa{0qk4|wwbjxlHk2)uTs1ah`1_^5CR zkK+d+LBZ(J4VroJ0i9;=qT&G#1jCaapaX0$GSK;_|Np-RuM~iusncDf0yWsBv45PvISI7b@lhrIoEv|xkZJ?42d=diqFnzE^paENZQ05KrgcN6<-CVxiK^)+LMo{c`_JG?h zpoS%+czeh%$mrAQ2p(qL2`a8%e0%l(|H~+7NkfA9ppp?(8iR^8koh3mqZ7q^P||rZ z4P^c=Xig=;d~gG$6H+6C%!d?jDCUC-xff<2^JkH6KB!~_xgS)lfy@WdXzmAx&oxj< zZ$-NKppp?}KB!m&nGd4T%m)>6FUmmX--4DjB!myBm;{**D%L>egJ?AKL5184F_8IH zM3@iC!$|1|R5F6h2Ni1|^FcH=^S6O&5-CuE?)Fguox%$)$sh~VI*+}${_X$&m%l-2 zvD-xjRJ?=EK5X6tJ~|R!o{2O<1Tc!UfbJ4V$!PGx?k-Z1769rEfHD_)kp?@|24lGd zwjwR#1*bl!NCOpE-8G;C`amrx&_TlByykiQ03=Kpe7haMhZ{o9vjbfS6#?55;voQD z%?dgqY0dNh{~GiG!xWO0(eV6F|=Q00j|95)woO(B(OhNk>pbfHN@K z_!g+E49du$t|w$)1!&bPNaV#mU0nu`#v>pXgO4r;&vryWD-X!w0+3-!7ZryW2X8V# znvkFgOil3aG;n_IhA3>XU?`~rI}+K=5IJ<`Lh?Oi;U{P)2%K-bA(NCK=YsMrs&hdi zFZ4mqh4iaH>r}e8fSXz`X59P#|79>}_yFdV3MK~rR`Am2ZqSAa(Bg`z;Nb`UmP627 z6M^2-DP(0}*a_-xzTlV!>FFdiSm;7~I;G$Pcd+XLUFrPd%2c=>MDHjJW*4aQ1&TJ0 zZV&MFPZA#84&eJJ1i-EUB@_ijrwi2I)!0=Gau0Y^wgPN6_(&~qb~? zsm(7N__qmx>LN&i1ZiS{0v24LKxgq@d{6*o4Dg~M7b4nxV8)cb?89J@WrG%kYNDuiaAI=gIft+%m&LXpaoZ; zYpy`a9K0q4aZDjBd-$kiyf~x<9*%_O4%m7akH$Bkfeldq2YkPmL1&1H4Jg7K!1tX& z@;tbC5f5(Wb@`~ocY~CG&f*4Nj0Saf=N{;=ksxG{0Tg?n5rEDqDl(vzFg+^LpcLH+ z8BhWR6nGaxcMDh>Xmk%U?+qGzf(_(>RrKyrX#*9_oi!>7hTnEIftI6)^?{1R6cBUZ`^sdREeGGyrj zDDu(PUqYrSYg7WjDF9N|cZR6sfWx)hMI{GR9wvZ89#QgxhUCCwe~=l<9u?5oTxW|) z3?rxmyc^PN^k{xz#NTcLZ8my<2KzIv!J3T)-5@)wk@mq;P>N5uZ?GOei&w|W)9S2eOi9hPVXV3^Ss1=EH)Eiih z6-ug>98f5MTnb9n8qGg4pcP|@ zl*jP{kU34;5m;3JnIi&8T38{AC?-xUGcs$}?W7ib^Zi@Xkye?aZ4 z-X6$aCeUpGpdCISRUXX;!MEE4cr;fOFqVQZ+XM$2xXQEe=oa$m6ggqN3CMB7(mqiJ5@`Jc_E*{GyP*HLLksWWi+-G)h40K&@L;Kt6yjjNxyYgcN6>mTd+o z$wq*38OVc>Tvp%!S`M@Wtg;8J-4oij0ZnUz0tGYy1Il#}8nW37RBC||At>X)+8dCw zEnoO6K~`6QGBQ{iv{@K5*8<9*Q1^q|W6DYxeyyYMOT1p1$>-ls#a2y9qIqm?T z*L6r#m*FL7h7p!eyBt8vGp>WQLettY2POuP`$6SCNGpg9>Z*a+pldcj&a;F}i1YV? z6MZ*?2MP^PmkqQ65=6uEzc1)CC6N9SXHY8?XPU*=k%6RHB@s|&K^>)pZTo}NchI7y z0#?+>c^p3osj8rZnyAV_;Q-FepxO&oCW3N2$OE8K5P9#{Ur;Fs-cWw49aIW}YQ1jg zJ_krL<=@7_(RmDHD5TDXSq7>tRy*cgxm8hV>YmgvDJy&)CWCt{8p?MJ$DIn89 z5dxdN2C-iz{R17b0FnX~23Hy(`;6`_;6nGsUeJL7jYmLLAoRTB z<~J7b`!FCE3xme8!F!272T6mj6X^sUBi>n~qS5K1qVghY6FURwS~bvhAfPCf@aR1D zV(Aa?UI+`&dF&v=LBTf&>Q}x-P&f|m`c;yRfng^oHN4mWZ4C_i`ju&j)UW(%pdtfO zwSmeYP zfoe!-%A&M>ZG)NxF8DzwD1d5e_+AX?5zW-AUk~wsGRr{Kudbj{5L~}jHGs-&EcNSl z77xPptK$yPgb8TE5;BSF(|HJ^c9j4hnM7pmnnFVD8h->l9SN!c;paV*T))m*O{jha zrGrk;Wec4pDhiOhynR#*KzDM3x~||GDI`F>Rd7qO6S6$0vqc4bkuY>JuKBZcJM|9&_WQ8thnglY~0Ms@DnF;9)A;ug)?IlqA1~kqA zYN0}C$U;a^kqc_ufs0(on8R!2F$a*`3wKe_ic(N319Bk&Y+?XCF@i_8K}SzAFfc&J z2_TEjKn*F-$OlGL>mL9A|0SsN2kOp&XPPBI1IXYkg*M|2J23!qR6cldhv7+t@t~%;st3js^Xs92wDhqUg1!#N-Jo*BTXNPVV6&sLI;M;#ZK#LC z(5L}j`vT5BTfnx$7IT2EkN4 ze;85}gL6K}d+6>5iN{6@|JkQ{Q->Hb14Dg0D(5)!PT~r_^V?atJmV3Dj zJ3(U+kaaR!1i&+;pnf}O$`^Tmw}(e3J1M`t022lz}B57>D+py~q@{sNsoDl(w)Nu;Zbx?NOcz-2Kg z>46vBD1ee2sN)AJ@v)6hHtzu+{sh}-P$~rKqhA2|6xL4$PdW>LOLs;F2J|?Fbdg(B zK#PvSr8~G;0zEGYw51JX6e!(7!Z8wb5(Mn1CD3t9FET-mVQ8NdWB|yKFH$aoCYK>g zm_bzyX#5hiUa|QgcsLj|f}G*e{6e%u3N!{Eq9V{;0`hr{io%PZd;b4_3EI~W3XJ9# zDJ9|H@jsd77ilFvFlJ_nBaB(d-?EGWI+7^U{Gyn@WjYeKjK2kx5@CwV`CCkw7#LnU zLsubkfMc))e1#2Y9s;z~8Z_<(3P8}x3JBlg#gucPsI5^^==M>O0i|K^CRW%G350e4 zZ>a^1z=D!CMCTM05dTH#K?a7GkHEv9py&miCjyz0GJx6-8ukMnf()Wxl>Y_gOX%zd z=;T>Ylz_GrfN99wQb!B;ng`GpT2KU)fH#MNFN+72dkP>IfTo~8BbuNt(Tm5RB_Jjs z13(L3aU}*4M)N=!o(+_#KuelI86G^Y7sCt6@GdH_a0Lz0fx;C;BZn)5Z}GzBEHqr< zVG0_w1Em-U4GB|l*Q9$3bO-ws@JVDlGeHw3G6z7bNqtmsCT|k@8XzA@f_wxDP>_#6 zrNfIZ9$ki)>foVj>`@15GJ&EFM8DYc8xnOO4k+xw1zhJ8_!4f=JXc4H%6U-BYY&)W z;BNsns389D?g5V(qL283>H<(X3{nWnVh|eA0^0>XDe?&eq=|(V4v-;jkfor&2aOxT zhO|KqGmw$sHW%7HAW)+YRP;j|b;$R*)Nt!EyksGij6gXKWH`7y2OW+EDnFoCu7GEz zp(cYu94QU?s8qa==0;9Hple_?K{IsSkVzTPY*m6sx5W#V)2QhNv@8U?Hl!PrVq8=* zKnwlAM;~QC63XYjcoPa}0R@g#+R#-=NGSt!PD(MCF7(I{q@v4i2Y9FsS{OplPlGf9 zKua<^K}R`3+8Urs%0cVRK@()))55^J>%n)afd>6RMGtbMzYsYE@-OJ7%g#d}Jr1Di z05uMw6O4@Dl{}DWg|z_=dO*uv1CMS8NVzKuDtBvC0t~-_8wW2A=l=f>KCueq+{2*I z1K-AI01E8y*BKdX82DR2o9IB68$e2O@R?~E9^gysAQu3E5)P=X0Gh4_|y0^6nnI@A`#w}yBRR;Q(c-2p1bKxqtAol1Cg zdw{3Y6nwfpAnR}-6I^#dT~AR^Ve!8ZlsRGd9fM2=@HqI4#iN_Y$fG;Nh{K~ZfWxDc z1AMtBI2c}<|Ns9Vn%rGf43IbUfeyn$3ci+{|NjyCKt>}6k^m%-Ky8}iE-D3(-~k;O z1RnbZF|1uwD)@V+fqV)opFsu`fX*)i2MKH`14uLjbc8J^c3~j_UWW$0TQk9@6Li-g zBosK%Lg5KK6n++fLIJeDAOv)mG-#I${y+!>-)w`HUM6QFrx*D7GNAi9nHd;dI(t;s zfIQO)IrIs%&K8oMq5J4Mr$DxGbVBBNL8)K^XkA2S3%IE4Zh>g;hAIcmoq&vkE)fHj zfuINi#XqPl1R1{otbLCP=xkz8n+bdjFz8eQuy~J312cH?wg$xQhA4Zn?*yck0y)vQ z1#-e~Cp5P}2lzo526pUR^9#ljQBXiY5~D}+3-OYgmuq<$7+kuc9)_NB1-d>7RNR6* z1}aKH#V^RkpgI9u9CuCupSlam=%6!#J-R&vJixb(_JGe52G`$Ur%r+LIefYuAZuX+ zUQGM<|Nl!fUQme!+0qKP<~ZbxUvT*f+H43~3IYze9*F0<1w9TvV)p2~=yC9;J*W%; zo%IQF1o)ud?h1|Ytk9>|HuozPh!&J+AC zi@>c>kT!6&2-?pHijn3I9H6b}Eug#%N>WfA2x$SZG-%r}R%r#WbQ&Y5<%`8|2e9-d z?9!&7LKCdO3Dg*V2bw*{k#b(X1xbP~y<%oy=mMR`WQ!bNW}qwxO6X|m-(#1s;>xE- zSG3rA^lniBX?an&4ZJf8biVju{%tK_K~N(h0F=y;Y=2peWMf)4Lt1BxiWS68P+DXt z5lQQYh@>4nz=0$Si9*~iVv=S3620L;HONIE17F5xCjEg-{Q1S7cxY93anKsKB}oZ`_9 z-rx&5FC6X|VNf~+iFojX8v-C^!yXkv?)lvC@3h?PC9xp)fV8|gyaf?9a3evt)1k)} zWVv7uIBbvxBS0tEgFFB_g$3?7HBdqYiGWN5tKdK3!4KZ%2j+oRM?zwnkb9rb@!D&* z$b2Qpy&wZ$2&1_dBnYw%Vr~!QGihKe6=Q2~wNf{S&~Isotmiy)B~um9^XypDw# z4zd(vIHUtn2wu0S##Nwt$bfdC_y1 zk>NE1$ju&Gan=O!& z>p)Ed@Dvl|03XnrD-gG{1-!o>G!6(lF$vVbfNb!eg0jKCqeUegWE$vRA81g5k~+AE z>xL!59u?54Q&4z87W+aL-+}@o02IIwNzk%uQ0>9N3M=3t&4?1vN%tWt5ulUB|ABX6 zgII?=nh!X5w0`s8cRlXW`Q4-W_{-U0242Sq=G-U8Xe587W2 z3kt{(QW$6m2_yvSV}sT>zfk+D1G>No6m$&yEmJ^6Oz$2Q&=Ksg?ukkwC{@5RCiswL z3s@2|03{*NYA?fYy9_~z?Rx@9G3czlUdTEwP!e(gB_WV1kLH7rBU?d9h_MuWQ#7Ot z2HMtU;MpzY*O1-1SobugG?ZW;PpSCLuf!1R&R?6_|S>w0}`Ob1@3Brk6{G0RzM1lLrxZl zbVnd;SZ@uqq7Bs3XaF5W&EQbrjE?dJ)Y>KL~7vvt;KnA|maG?GuXh;jS+ysfd*!)X} zV6g@o(E@o5yp<6B3`X#|bL4UGIg3ZPh^0rjk0l2vb%AV$ z1qXPj43v{W5!{V>=p!gNK*MUN!2uF^vE(PjBcO~AO9LSG%UIAZ*L#1#;~LPT2;f#i zw_$+#G@#gpIf1kxH}DQeP)PtDZR=Tw!yQ+_xA%dp1|<$qA^`asQqLhOBFJzX_QiC& zYC(a!`>hUWixi|4D$n47Jb&xa&7uN|9s|%A73eTw1`q?ZqLKmB^#%=|D1c5w*QgBw z4cBpi1~3dzodBBZ=mc+WuTcSy@=8Ef0=s~$1?@nG1TN^h2=MYU=m3Di>vXs8B!$i79liwY0ONdlnB z0}0SDFl3?yRMLRgh<5G)pGXF(3_$DjLES${5{F#8+u5R`12PqUpAh8OpXL{!40_-J zD^E1+=pRs$0qF*9l?500U~Q07KtbC}!rp*l5wv^`)FOhOgBt~EN4Tg!o!JAv=h&kg z-Huq89gtK6y@ws`U=olWpI(C_5)@j8K>-5xVYf$uNAp2Ok4_KpVU!>-&}lLJEswx+ zt)MCa?mN&?)rgb>N`0Wb4w?o7c?m*8PY?x9K{bLb?1r5a=b!*m4Nh-xF%Jc(c@(^l6UH81hQ{G z0+j2)*Dyr9kX#OmF{p3Ai^Aen6z)1>Hh!Dt~ zpe?waAu8Z8YsgM_P>xJ^fyj|a`|Ch$9#9bkihNLG2Q=UTYO6pJ(iBMY>x4{ZfZEsK z@o&(*#h}aq-7W*l;GjkmD7HXZ1C(6B`eFNSK=T9Oo)~m140J{V6n&s%4QhLV%mujv z+!h0kGlI>Z0^aNavKMqc4yb4Zx8*u}z!%0GYf;$_YHfLRdniEe0zkU@1~mH#au8^4 z6J!B6e}OCp84TK_32Hk*vLdLRwksQy6+i=Wpf%hekr#SNpi%uE@a!YVOOR&V6!0Z7 zpdbRZzB*b|>LKku5XHdX@&k0`HmI!$_AlzqGcV3OW@iB9aab!1)cgPyXJEQ>59GFt z?k$j=0i9b^KpDdD0BEhysTTEJ50q$j<%1j!3WgW95G7*Zv*^Gf z1D-PgMe$*{7$bNf94rRPu#jMZE`sQUHVC`-fY0m%Sp{+`IH^NYB&fuK)J_jT(?f+Y zyFq~l%88(+0!aQvAjqrm(j2n=0Th48RT?NLzy$-WMTERh0CXEDD5|U>w-!RrUFUCk z2@cp6$cdYs;N?3#;A;y(sR>l|fhuO?s}Qe)nr@(VX)oqRf_fgHB|F_NDivKU94rs` zx19h-B?AM4jzD=aC?$i+8PG~BiJP#MSfIx8F$YG**P$SJFb}lv2NGDITH< z+(wcCG7zK@WDrP!M`xV?D1tzSc6hLYTmWK%It!pUgvW;!D3U-MWkED((hQW@Kq`>q z1NnBim!S9nALGRv0f`UrWkV4SHXM5Jz6R(Tb&x@@QYbJDsYkpT)H z4-nx1@(!->0ktN;VFJ2k6vO}}DbOvW(6JRz>*7VjbdcjpR2(4T;{h@dq!AQ8AO#+s zb>MY=Am?;=upx&JXh#avCnYi<2~ezi9Cwfa*#+Ytb6{h9&2SuYO$bZ^WEebzA(vm4 z27z>dy#i`bf&v9SbdfiVeF23o=#1(Y>%%}E0542(QL#Y2U6>bYE9jQd*X79Zqyaa+ z6Lg0QcrXj87xW!uIJg&N6a_N81a!*;xU~#D0T*`hA*dMu_EYZ^@bM`xf+jJ6Hk^UP zk#0r-RW{8Qpa!f8=<+d*Zb)b}zbG!{hldSlui9(S#x>A=D&^4OddL({cMtfIl}--O zs0gSeLEPe(2TG3JEzm^?(Cg7ax8#B18dSf4XwVn{n1-y}+EolI&R%?~VrQ^nC{YE4 zJ-A8(HI=7=Pc{|q9Ox2mP`(|oTa!#7|I0QjKNf7{}Qwc6cogu zWDN>;P^}9pWxD?1XiMTU0K9 zs?W|A@EQ_Oa{!X=r+^E1Q1t<-TR_2o1F8-*S^(mM)pbLnxqAx4*zPSV5aoNo+Cg3d zEo=eVegLd}kID`(y+vgM8v{e<6qPk#ZjZ_WFx{dugAIHY`gG7HY*79ODSx592GlHo z93Ks8V1RC814)AD7g>8ilkufO$68dty1*4M$j{(j5XjTe%CrDv1*qKuJ;cZ-*+T>5 zVNlTv&T&W^`V}}}S2tIOg0fu;_%;TR-5DTLj<={JurV;e28uvzSVaP6Teqly)baP; z19!7}Al=OF9`NBwpyCXy3jON92$0dBA$brDx)~izZ&3k>L;V1{j&4^eD9`XhOHPo; zi*FI20P0ZzaX^(TxU}rKAgLAg!? zq^Y|_1tbZ|QxYJ4=N1(XFb%ns7vur(O`D(tW57Fa_NaUS(_6ro_wIsQ_u?F+%wT<4 z_7AilYmZ6=DBZv+0wqu~WdNBBI_UvKclLl)fZ`F98eZFiQW1y+avMl5C@he5yvTvr zfF*UkW_Zbf%~mW*LFErD+ko>ycZG&WcYy)OHi+#IcR>#u>DUJ4<)nqyxetSQBLrG(%2NLAD5V@{ba^wqWrfC>TMmeNnptG(U9wMd>mS z-J)^>>|`j7SV#cw)k7B&fGQ}^9Txm8pxZ=2r6u%;(&iT&{4K@Ypu!Fmkx+G_{H>OP z5V0xHYz6BsdnkaC&IMM`CD;u70v-bVnmyo~z(GxDkl`R_J^;ID3pfy8%!>s%^B~B0 zP(cA|e60Y0GR^ngtH<_ ziwPhxXde{J1}y>tIl6Zh3*;tjNLrZ!KK%#eHn6JBV;-o>QlNLZclM|>fJ_9<$be|j z@-i^J1$@UlG}k7uGBBVP93YVwdqW@v2Z#d-JW!tylrJ+tCP4R2fC~=DJ&4dfB(PN| zojoc6V1+Fz5v(Amw}4{=YNZ1!1H(R0cLg*Z0aCXMR78Mg9Y8WKn6`n6h8`6V2V^y* zLhe!V0GkLooq7c$e+y`i8RR5Lpg<=UyJ6krDJlkF^(`tEAR1I;f$1$^KGY=&pwQK9 zQ4s)1VJosgjt8~YSs55!a9snrYmW*@6Q}~y0BP#(foKNZ>;qEV*`flPhyrz!K}WZO z>d7CV6||i_Dj&e~6qOfXx<%yyi0sI9Spu320@0v+1g5vBfW<+RLkLTuYd|YNR#iL% z4d7w33Na;^0Wu2I*$2_xdsGs@^cEGcIB2m4!e~%0e+tMyuu;MYkR`%kOCZg*Zb&N* zD%GLuQ?Qk`pnkFi%$vPaR6y((b5bD%5QqaR z1wf5#aDfv7HXL#WC@8UjBtQxbz)pn}^`N#qtXu|lY|zW)NO-xt)f-YSgH(Z1xCY1+ z&`seih;ms0BnB;)!EEam6_7gq-j`_QGRR(#hrz0_l*JJGP5C`OI(6AFI6n=oFf;%Bwx4^*!E0-bTQ_wY2piUQ9 zVT;NOW{h(A0y9#%`~YM>tXu}kyvW)BD*t*^Kpc-w@MQ%(DmTE!^?*l&L51=q5FgaQ z1a&50OSHPd!@yHiK)1Gn0{H}3(H;mNw95x}&3lUqXl)~?RtC>mL9#HsRR?NBg5*KP z6G;9=#RZUy_JB2k()D;2y0a6F59>Me!l?pHo zUDXIWkqyM}-U3-6iC!WX7k~;YNQn$uDhaX(WFS(B8~|2Q!uoPHMu`j#0#q+2fPAmn zq5@v~0P!+Pi42klc^M@CqV+taLk*>SPfAMc+3_js|f+abEyVV|&2cFF>nu zLHF;0%m)oVfoSU%6;OVJHn{m)wtE{4)EPnpb1%!LET$az~Z3c zNT|c069*_IJ81FJ3(h;Zid#s@4ssE!M29S|X;EPSTe1gAZ&3k@A8!FKG6Ij9fFlGk z^~%J+@Ir7RE_)EgI%vre$TOfDu|RbOCKD47CT!St&aYq5U)_y7MdzyA9F|K%-k z+&x zB&dA`$`IhR2)azR8*&dBXg4)_3mS9@8K`^(-OC4x#|dC}?ok2rySISvEQ407pw&^R zEohL)i)v3uNe$wFvJCjtO3-QhAWi@{Jbb{NZt$FykBSG#I>?eK$Py}0J^^J?s5PJ^ z5%5+sNFBV@43c?qW)-L`gxm=VvH^T41Zd?1h~oe%nnl2g02Y0qvp~8-R4hOZ0Pw}1 zozO)vpz#H;XSaYC#XxO$fF?4?+9>dZ14_9Jk_Q!1Ao&*$PJ!IAM+GbhyBeh%a$N{0 z*?|^rfy!m@f-2C66Ue?!=rSl!^$6xq0UyE$3VhHi7Epo%t(^er2kS#Gmv3hw%4Otr zRY>LX4zQ9E)|U%0%4Kj6bfb6~G>rzTia^s~&@u<5Tn5R5ybO|m@%AL7Tn6pw134MI zt_i;55V@rcmH{mg0VTsu$VrnR9UxD_q8#K|5Fg}O(7LZ<%9lb8w0}@%R7#E*BN^juw@3jNr?8K$KMrIG@2wV^&c3LURJhN^GSuXvG!C zS>P2{ptbrS=YlSZ0@0v62XYUNb~b3f??v@BPyyDW0x}$9#g9hA9f++Y_D^R3b>B|3UJT>Bxs-nEI&mB(m;o;o@h}4^;$qFYX?Xkv?K&n zEpr$m)GEf5-Gyu^x1-uauHrNEfVPx? zEcNN01D>|^>6`;@jeri42esQlW4oXhx=Uw^iVWEDJL z0a!J3B`-(a z?J3}qJO$FQWoEeuUHlI+%3=vI^AN2bWdH zAuWC|8+1e=$lI1J;MPBXvotrj#0NPD6hI(NpwI)g*=-m~%RvqVvEdE`FINUR5advB z;~2b75z&YRx4c0M0zlRfZjmD`<>^rYx5&#c=)i&qIiz*MOVm zph;$^YamT`Tut^}D6RqR8F=yXJlr)l3?;Uppa%IK6!ef@GIG8Kuk=xP!3sWT67RU|Fc2pQAHmXyH#h3+2kjtf{)0xwku%?5(Kx(9L>BDCoW%4ML{$e^%BoUsZL zdGY!TD5kJkg~;%rhB>G>2DRcr{)Nz6AUh$D?>>b1cRFY=5>&W@n!%t(`HMENC6Icr zp+c7tTEz0V#DEv5Z z2fQ5sR5u2I1|~qNJem)JH&;i1>PEg&@X}Aneczykq7EM2;vU`Q93I{E0_eM1ra&k7 zeN-Iyx9x#;H6D0$1_*d`dT@B`{L_3?vdMJMK95e0eH^!Q8FqngNZ5IY19Yt)DCK+Z zEd1}qTEl&Z^TkCwkQ1Tn@<4aXfm@nA;B6V8HXFDl-#G=cXQZ2Vtj9|Ih_R9H=YN+XLwrfKT{@ zaiFJ8TY%CQ59HKo3(&H01JJT@1*B7_r@+&a0w^tkmN|kujIgwHDfiHS-(|(dsA=gb zwzSl019B1~ErFa1%8{Th708cZx)X8?3y2TyEbTPAtN>n zB?Ma_pv7Jwiy$jppzEwa(`%r>0~L>`ePWaq-Jm5=FVc_efX?-X)PBteKrL5LEeVQ9 z@PHF^k^#hidGQBiD+zMl3T~7nAYAMYugZyQ&6uA9r7pOM@KyMrss~h}fHE(rA&A~m z1+Rqzl~^E;g61p0G-MkCWVcA~ZsdxNU`T?N)__71v^)=#W+61zgQG!36iP^fR{p(^ zJq8L%P{4tkxzK4an!&zK)puLUCf|~aZslkWGrY73$y|e)SmC0q5^I2%c?zU+2(H9ICV(sk1q}K;H>d{=3Tw!O5u|4hD#*a%$6HiDJ$6vq z1Xna1yB2~fao9XJNbbe&LplsEL5U93RRP%q%G_XQbWZ^nov1b!z^~K-j}3rk*g^3E znqddiTU5Z}pc!^hiw~3)z)Mm=O+V0Zz>Drfpw!$0E{#!*Mzl;o^JE}TfxG{pd331J zU~$kqI>KmBwqFPG6sU;}vII1A@Inn_36=~?Sf83&qwH$2d=2W&U!R0w%S28I&QnH!)jWX(Td_d!6;+yF^}90-Z8DJme{pjZc$ zmt8F?An9)xR2U(9%s|TqLE}`=E$g6y4m6q%DFpYZfcf29AcF(jF1&cP72;A*h=9@p z#KnOL9?gdsJvsxySH^(Ex;$B+r9nhX= zP~0+<Bn?0o921?PA^Rd+y5@intMKTaqXP0SID;2RcyvYxxbkni?a~R!?C(JL zG)h5NB7g%Fw0oNwHVp+jSqO5u9b`%ivc402R?CEwfdO)fw!Su`UItf#uptiUEF@^a z1eB0LLm04H0?f8<0nb|U_fFtqV1RoQvJnriq4PL&6Re#_cZnSbxYz}CJ36O8rXoSB z2tj<%);s7d+OZau>!3{6d7}A6`3_Leo8RRi=&E0kI?zRPpfm^FZsgEq;nL;6=+foE zfx{?Ic6+#sQpBMN5RSdkX5M0S3^lE@o3aHEj`5&@8+W~fPAn2$C zP?rPLxB}7O5rg9`;NcQTzJ{uX3>74>j zAmBTs!S_cyoCH^WtS>{r3j$gov*^(F7kJnXG!q6&Q~Z#P6eaGUPzDt?Aj?38LYwxG z$x`TX7NC8JObnnr!2nVQmV=!_(HT(S(dm%^GX`|o11JPMDjN2H3nqrr3eb2b$a44y zV;aa5NLe!lT5362cytGWkBB2mqn1{cfi9v5c?o~g%{fo zL56!kf}mm^6atWnA2McC@fjdF zSb+o@zXBCRpivSK4W1Z2-l75;E`k+EAU4Ppa8m+ur~_yy4730q+;#`89RL-VP)-D> z5CWOk<)V_-(V}u6GzaXWk`5|CKsydVB?#yqa8Lb1v=scZ4`C7 zsAP0a0T($AU0c9KkV_Y|Na}(XQC*NCs|!+sIdnk^G?y+&0q4>ME%3Ua1z;DXK~~+ zZ0NuVXe14k;y^S=3uw>}lyYEvNPdM3pn%r_fcCzFlNfyT4OAh#IFSij6$XoD$eA-; zkn=}7dQ?D{E_F=-CkarzgHi}6ia-el6h)u}1WE^>1m)5-1(LwJ=71Ai7bN|G(g8R< zc5P7sB~MT~03}zKt|cnqL3ds0l4iyZb+7wh#Gr+2F2~a`>$$B&&&w$N)FO&HH|E1qo(8$$mc%z)Z zbvNV`UvRa^-?A3M19t%UTVbOvpkYgJu?MR5VeW&iC$xl&>On?bKt2ZrKiKka)b0Yl z@l435%i|T0ZV<>mSbG}G2Au)`3MXj01vLH$9d!Za5r}1wTZ|Q82iIsI_3T_!%u6KT zV-?8VIu{jlP((qT9RfPexzZ)PR)0Ltgqql z=oV1{i93MGMDT(Jq|;xZ=fNm|>M8;7IL93DI7g{4M8wiXMFYA`xx^AQd@cbxmw^K` zNu%)MU^+8sgD2B#d5~hza6Kbvy##nNhr@#zbUF&?X0q3dAkv+n0sH179-!eal>LmL z)z^g2g8{D`0d3y}n+7@|1mqsb5j0@;fKGQX0F76HCxts9*I^6c=hyeNMFxXsBa6wM00l8M;g)eA_8SI*OaQ!0za<_mB*h7$`k1Zh41-b&>qmxDD z1!&OGqwxsXP|*1~pbio!yktPz^uediYk+hZfDY`p0G+q*07^ZOz7VL@(G5A4Lk8>u zkb}VYmx52!bpVAIXo(J}8i5pldsHAr;uh!vpef*@v$IEK4ycrc>{0`7H7*B5gaJ4x zp?CSDg1qbjs=&ZTb|YHpkopuhjR-l21T;PZ7C-KyQh^kt8}H>ZK$_^FQ6LrD3>)v>xv<3Grg06(#+cVGSpB#iWTQUFkAVmqp(pq_fFteF7N*JOr9YG=bR@ZgO!mML&bvWw2Alj+0!L_EKr$JJDSJSsfKO^$ zjLQ_SNeG`q_tO6;faVs^A>TeK9-u-2l8AQ|fI=~R+W-HrjX}xO15_}9Z|u+j6(0r& zm7o$6R3`g^52R;Nd7-ogk={_schJH?(DVdoI-;`&d}BDMSVpNVJE14GfEJp7E6pBo zrP)0NqP%;H3Pkx9l>kuBu(Joe-Vju3ftD|JPEoOe3WKM?K)c^Td{8q4M0Y~=F?#I0 z^e8Jaej?i~56u(&Ehl+E^N66b5k2!2R6rB#`~vX(ssf)e$J5K}{2oRp?WK zkc~erkljF_MF!x~atnB=;4aXSa4)LngBn^8zhO8yc?x*RCCs7VSq;z<0kA2AW;@{9 zF~AcYL5VsH&3jZp%i9riJL{k`()hdpp3uNC(Xq=4lzz9*!|w%*90lR$qBrY1e`p2_ked98GeJ@B>RKs|9?<20L>VH4(|h{K(IQbjYS|n1Gwqd(E=VB zhY#Wl86NP^hR(IZG&Dk{9T-l{vgV%zZUOSQ=z?<2@fPrKIykX`b_9Upx%mZndJ|+j zD1CrwkU@+L4B(-1NL?w&1-%y3aVN-)FOmg8r5t4T|5ytPXwfA2tRRqf(9s#7FoLk5 zZh;+nZgHYS&I9T|P%`JA1UabP;sk$7H|Q*rd~jL^PYSkxiw8*df;Hl%Kz1U5rcptz zC%hhVEAsReXddH5`f`*Qf;z^*iJt-Cn3C|<0iZ|$%|3vF3pr>&(|1TgBMAx`P^%6a zG#&zwpaCg^22I|}KMV{EFG1&r!VCqaLr_eE1L;3_fDXh&wg)u+0Ge1l&HxH>Bpc;G zHiAx=fY=Bsjll~W)(Jyw25~^`Hn0J`JtCmk@zA^g>Rf|{VnJ~OUYXau2Qo(7y#+j> zvug(|s9vOOVq$ph4Rb5#)COdSfks1+oTCVG4pIQP^Fy2gQU(oxT##2m1z1A`6GKTb zhzIg5a!NtA0JPEp$pTe03!d>oEC4BkTA+Ze9W)UD)()zeKy&%vGz=PP2d!Gzr4BMq zgn@wp5qzNG?HBu@X&R&*G=T*!wR(HNnH3y%psEaXTnBg{0y6Id>VAXgfx5SV=Yc@M z4w>@n0cSN(5Q4^$!D*DV5rBF|y9_|ap(X-QH|NDJXyOHF z2gM0E5RnoAsF@6k8_>`jC?kPJV?c=j%m*#+0|hoTP(hIoS{Dq8d{Cp70W^sN5_sX# z2}uDUcY#s>$VnjEKu!Qf9Y_(#7Eo+}Yyl-H7pc>$aPSiz2l-ci!s0zH`m zQt5*xqaov_u$i?z;DgRV)`BOVpeuD8ci4dTn_lw#{^3O{s7nB9W`T=XNbRx{BJJ`0 zBg{dd!6=Z!5NmgSgK`Kg-C!@&K;3tEw17H{@Mr;b*ms$N{Dg>QP|*hJDZlv41xZdI z?V#WW=>+)zqzM#oAVttrkc%8ppf>F;GmxQzpr*tfXsQGWgTfgSyHlW9e2NNW^tnX^ zJnG!N2f_!9yMkjC5)jA%6$6S#G6D(|fAB&OTR^#}L_kBSMkN6nL?tR2yR1N7;X*3A zd{hcvT;l`<4){(f*nNVa&R_vFKr#>k;-XTq%Nk?^=oYjW=fGJAbj?pUG_CX^f&#SQ z8x+%^*;G)7gZa=sm#|XqMN9{x)BqiM1#g!4!hMIeec_^ld;p#k$VEtH2OHEs0ZPc2@Rotit%Usro1g+O69-)n3oh-qfNv3ibY*z) z*#nB&7v4nJ1D@>aY=JIA-vgx~SA2qdgqs6)l8=4m6zuN>Gp~jy=#5bRpYdAvYpk>IZoTGj>2p z5HxJX@Is&k)MkK`Phc;xVBU@jnl1s^13HNpRA@u!Eszs>K}-8!Q##=8@2=gT20y4a z0WF;XP1?Nho`u{u0w2}~?#J@WgKAy|&?;6?*9=sMf{WZv9~BqSAT@ZHGypVa9ntNg z;sP33i~waw@DQd4C})Ekx1Cc|K#g5c(+1S|1+6<}0NvMxSX2tCxWI$i7TqADyFn*N zcY}uNyK7WDUevq=uW{i3O`b3^FdPQueb8*a0OX241<1c`-QEKq=;AZQ zEC2t$JOT;~&}rRR9E(r$7Xb!_m+hd*d@LG4foA}!%Q`v0qt!m02VVqF{Qv)D80Z=b z7Zn%KB3#IP2Y<^?P|*&W6Yu~p+JasN=L4E9asY>dgh%s%Pae%LSc(iG9+vjfnXf5E=6(OB@&{&zEN4F;jtkMKG=Rik0fqjE}Mgd%7 zg6`d1JRLMO3Yu&I9WU^4c!1J(K&OvN3@CjkfJ);GQ2H(aRlMLideB+RAUi?v6$45+1)%ZN z43JwAK%EZoyl*EYlY{CsQ052i*aj6vAisiWq!}3Sy~h=xoDI?l2`I#<2Pk)fayDd_ z`yN7DL_pInJ3(U%pqvewuzXQC4Ls=rD(t}bWmbUP8StV?f(d+CrWDvUkdg_q(b|Tg zBpu{6oK6ByrGi=?Ag!PSE5I~#9TKP&f?C+1I0-Zq`{LeI9fp@P!BGyLmIL31>EP4t z!2xdjf)hWu?YnC=s1XM`E%?Q&fB*i20v&vqdqTI5N(?9wRDjnzfo6mtLsH;W067vH zlmfv6A)rg)KrRHGk^`ba{T>kA2{}(2)SG~)gRG%{QQ!ei7tjC$IS{(J1hN(sb_{xe zfCuA6P=N*-?tt10S}+W<7es?v2_Pwu5(wWx0(P($XaED0oFL*oDque7GzzG@z-1<= z-3R7_3bF1MNH@O|biXI)9CT3L+*uuaeyUiD?LP33whHtTJ<#nDJ6k?V%)Yg*Lk=th ziZDnnx9~vBnrWUWsfUZgXMQwK@V77{o7DZ#`ko;7oM6y+dMR8z{314xdTC_!A&PaJ zH~QHUz&5KP%fRR6G*6TSy@Z50q;vpZ*axa0Ko{H1%&`KB;cw%`1e82 zNCh=h85tN}iXkb3o^=K?hJQPnx_9722eA}Mod^GZG=-p*BcK=p#RT{&J&}l2MI%T?pM0d!5A7^v4P_K1lAl1rNRfDaO8052cm-}Yml#Qj``od)-F8FqpCUoUhXGJ)5a zfQl+2O99X@4aj0hmv#@hHUQ-%u=sJvk(A&r0i?-+QVM_uQ(oMdsKfB`F*xE}R00|* zG#U6?z$2yIE-C?_;t-SoK!ve{M>n{H0Nt1iDIp+*!%L422{df|rt@gc)e0GP5`Rf zU#K{PCg)y*uQCF)+mPa`zD$`*L-OyH4fodUeiUIi+Z7tcZXi(ap*bM4Gw15|`f+sIw zhoXQ=O(q5g$i+gSv1+_Qg14sv>MFd@09gc@N`qDJ$6HiD{S2@Np)FAf56c#Cr-Q$@ z5fo3|C7^b64QOr}A`bEks7doeYbs>+3)HRwn*iF-4>K8RngYl)kOKbRC1C$U5B&ih z*a_k{L%L1yCFV(ZBMVduf~*IR{Sj`qpd2RvZnmiRfGjfG58B*9QuCFkbNBU+)OseGA$u^I8k87ObXw ziV9c{Hnrdwg!CN1VG43f_Y}y+eAprHko%QDlTgqM3~GdcGBAh+xdbEysyQHh23VE{ z6=R@+4kA1STwlCMu?O`%p}`Jang@yykk3G^OV|=V5c{PocvX~-3eM~TY39HtD)zwl zSAoSrTX>*h3h4vwLfLl;YNo$f+6{^UXi9=Q2i)}qoplLL5s*Ebpk(A1pcsA&BCTm~dj22k8UYZcH85VWiVwF*G_8&v7S z5-+GC2D71w7n~J93ix}gz*zyh)fBYn2V_k19u?3W2|V#;KzqQDoD3;xK>a0X&lyxc zFfuT}I!@qP7PKu0WE5xt0GNjCZw0vwRKtQ@1K%bH5_yr*1v%0NRJ(ztL385ka~+9Q9w=7en>xT%-o{Q)oP(SOI(#zzyZU9w;pk8DFsQm}+hgN`kj0K>+W5o*w8%Q1l1vxA~f!VO*AD{^x)Dn3a z4m~>$nwX$cpkxNhlAtsQGXlhZnGd}Y5t67N)dSLERcQ54!Vhwe0jS;N@nT{>X#Ft6 z&)^ZA9%$8q;|jbIl?;&Y5uLJ4a-J=ngVE@ZSbfytg{VX;F-`JqT&OxqX1-E2FQ^CptX;nu~Sgb8#JT| z8gl|Iq3@icA_K~Ipm|d;4L$6y8#=-by3(%`y!6i#x~LY^Cx@IBSSrx%qT+*GW`G(@ z5GR022k-_Hjn`tJwQvkOlb~e=RFnafkt;wNEI>{LH`NtD<%kBT83A%CEE9vq_&_xh zXgCoxY6s?nju;1JJJ9xbM0p4v0OBfWVOQw_>gE#R^KE(aFS ziEkh~K`X65Vbu+}HV`!63);62*;cY2MFrv#!G=AM;}J`oLGgjpQFvQ2;0DI=Dv+aG zR2)DB7^po0>2QO#bNZ-&8np(XL?VGcM&QKFz_3#q)D%kl2x{KCsDL*tf*bVE<_g3h zEcJ#pWMw;l?^DnedpCGWtVG2D6#JkQCID(cf+`r#&Xb-8AF_CLi|~7O*YI@iA8mo0djieHATKxU zQ2~WBLuo0foCS%%%h_a58ma&p35j#Wx?D0^HsCQ9ctHzp-gvZtch7-Nv}Ayk2+*OT z`fkv^IUg19fDp)T;Q384H84Pwaf3FIIQP?`a?5uoORHn5`{kOY!@kqWZ`lsg?fx&stI zEgoR&9&1(odJ zCF{^LCAuMtKVIC418>8#0u_Of!dt-O;3H-aZCGs&Ro{8hV z3OK!&fLjr0DGU+wpvDWx=a71F4|vEK6h&ZhB9giPbS zECrQr5X)e7G{|635&$=nprrta{kjn}1`jTcV6_$MR3oHKfqf-DfUfg`)_OIdt9?P0W@icbhFtKPVg*n; z23FUBRY1;G1=YlmEDJqK0eZtzXNwAGS)9iX4x3p)YiG}A1cfn3A#6Ew5~v0Rm%WhA z2*~e+4xls*$?-z4$xm=bfHkPQAq{F!vH**NHq}ET6SV#Yl=5Dr#4<9xEQIt4WI%;G z#6V8aAT204H~%Pro_xaJ0zP4(c@H>CBbK&Gg3gNvHSr)fMS}7HBvC?F-+-3ULX!`q zEP)J8gA*#OCEX3VS`1_x}T$Z~izzYr@CgR6KU&EKL48cQ_>wE&tS z1A6drE$}3T0H^^2iV{c#fXJTsQa`9*1|?TeR6sj+NZV~7S0lVQQwwe`g3=s#=`6?+ zkLHR9M)2BK8wUQCPH0I4-en1v?)HfA_jtDjKk@9s-~w1Bn3W_+G6fsNjYiVc`L?2eQK}!lUsB*oiOsK~(^H z7=hb|IKn6d)Jg^&oZbyvsRP=B6oEZZd{iP{?1D6)!PbFd8|*(aLj*SP6#_cu9Mrz* zt^r+&TcY9t2@$_Sf+3PEfj>lEGk_qdg(A=$q9OxoJZXS}6_lx7oJ$4oDFFK=jbGjc zG{5o&)JOo8FAkvc#RpWr1b})45s=PAXNgJ%q!s3)0^SLe0cuNwI~ft6#uvCr(YXaY zN&#wwfrAHhcsZmI#si8U_@#&71&-j{2+z*YVM1`Sb^s-7kb&sQ8dQmcGAF2>h1Itp zPl3fj?Q>A{figR!)S}&BOr6>cCk5VbwvY8F(yfQub?kp!{qMZOiJcmbC^&5*km z5iXEt0S(!L3MeD1cIlO!AJOk3M1GNex~;z4Q>t4iI5-(P&69AIY>wN6)={9 zhf%N};nxE$>bjtnBXsXC=nN0YURBU0RfdviP!xdOgtX;#^Ieb&YE&XXJ6wFA%{oLg z3^LFTId;>dn-dh#U|)B#sJy5+0Zx_R$boscp`wDJ#1Cu?)W8}QaPb1N_n2b^11S2z z5dpew2^956h8{lz?q`6^esc_AHmHP!ogoXKnt#Dm5(tt2byk{R@bS0!!V6~5#69R5 zN+$j$klWy@4nT`=(3t>m!53ouEkdADJB-$R1)MFi-kQ)prag^+;9PWY@L(hfZ2T~kc2i@=6~Vh$2&uz)b| zfP~fyrlX)WjPMBTJP0z{0hD$jO(}@wpt>Kz#~zn!P{R9VBsBYjVhyz#0UbX8YRG{% zSAwNM#XF)Jfe3-B5m=!)1#%fRXyP6m->8ceAO$FI4x|8$==M?Zff~OB+DM(E0?LFh zw1goAD8vGf2QO-S%jL7>4kP`d!of$Z&8MPYC}lwgU%<^%h+(Ly1>XU|kR!A1XM$p(1$-ul z2Xv?fJl2KqjRMp+3ZT{#Xp9V0(}38ZQ8X|cwD<@-bZ^-LUct%VD+FG&T>@GG1ZsqX zmN|fY09y6{x)Nq*H7KLGfL0WO3WDwm4v+2v1yIHUbqAnbJJ7%xsQ3oaFP>+Dbo77^ zjsdBIjIK?Ao}k+UUf|i$qQVavMcf0X7$Cqea9Yc#G1H2hB0PSPX8eLXteJ7Y)iE zpj;2i8!#~t`{ngNp#DBc3KXrNR0Gat;4?#D`Q*jIivRyXo6pe_EpiC~I`A(RR!l$! z+or(J*@R3dLRLS4M!p%-bQoTOFG|B-?0^i7h8YSPfCB|GXhIN_Te zHlV5koRUF1`at74prn9Y6o3@)_r3;Y{BG#_Cg^GvP)8Ef0*8+$f=67y-4#&iKoUJ7 zA%gnjptdihl?iD%g5n!2jyYF{GH(MOYx|iG%EjQK2Auv7&lgH@nol^~76`=D?jqPzjsz95f4dg-V`N09QyKLzAc zj8qFLZ$OrUQVys+4=Vw{O)A)Q80dB$u!Et;Mk9|Q!OI&^+xW%vJmSh5Q1~E~H>7p0 z;pGje&;80O0HPVxoB+?0fsShdwOl}> zW2pDHgH9|3wPzGS{Z}1G$EOptsiYHRdS{6Ws3EHZs$D!lwTlDDgBGCn4ESi%&MD9f zNFdt`J6lwIKnL$0=xTn!$lrdK1JnoWc2Utm98n4xAq7`bAQRB@EBMrRP+bph1?+)r zLIiDL0P#U%?x01XpmYkUIC4NsQ9weVb)uk~MqYU4fN}w7J+zC84k#EwwqOP$yvPD= zsRb2TupOlkdJFhyP*9NmOaLX778Q^&UEnDuevnf@dpf{0WQqxNjYwCE3P`G>Mdd%V z+yd!=3|d0&`)Jq$R>1(7Vp2f34z=k8-slJ#4g?#6y5SMh^h$v`3cSasvqc5Gi?4YP zm_~GgV?dXZcY{{tG*<|~hQJ`BW8ia@K(1v#3?GBG0D`j&Xw@5RQw(VJ4alFCEh->+ z$nY^vmxGohfC?$t{xb-@1-xMoGJL!$9uk}&!(f#hnBCn1zH0;~2HHUg8a@WK(ObZQ z4+%(cYE}THa8TfO^?(Dk!-EBsa}+=+4H2j~t3Jpsxhasd+dzwvz~Q_Fyju3>3OA4o=W!0Ikvohi7LG_~rnZq(^sw0H{?1%5<<01nsecu|X{s7#p;| z3e4_>oMs1Vrh?Rh#&$vKKnWS7=EaA}+DJEZ^*}dmwLqFbol{i6*NAlXfZO$;FbB8y zL3jPaqV9ML_*M_FWuWEEF!Amdh~q6G^8C$4pdlR49a^Ap0PWWW(VzqlrlC8lx@}Ip z(4DBw0KOsaGUP;FP&$WB@qxMv@G2QR#RqPagCfZT>F6C$dj{lKa9b2~;5OI_oOgqO zs$H5TrWI&Q6m=AX8=VksJ{f6Dl6cCE0zW;ZUOflptXSjsFev?RR^L$Q{NyObXXjS z1|7!;qCrzIAR4sr9z=td$b)Ebs}yPD8Ayy;W+8F{sCWSlCqquv1BE}h@!z`#vKYH} z3wT4%E^t+AdFJ1LehpAh(?>-IoU1?;fC0#1pjHly289SXq&lalfW+Z-AavDm_ZFxy zwEY9M>%}ce@MIYz>QX?}3eKtk)Kmev71DIUJu8A)#X|-TU)ZJTFuVpg4{_RouT=%g z(V!+0I0Hed8>HJRAp^#d-;FP=PZUfm)NawiW7%G;pj7r@|Tz;5#g#trajEv>zIj zZJ=VHuE)zA;2B8dN~8tka?najP-ubKuyeGKY7o#`+uCSoqUwQ`>Y&648>GUVUVzjZ zC6SO?17rZKh5)m{OC7*2b5W^yJsC8r1FIXTRbPNMZ*_vVan*o^@Jm!8Ky}2U2pxvk z!k`wBLU#!?=3lG@on!#5IAHSwpe^vAwLPGAduNZz8Bo}CLT05v%?|L0cjp%HjCFSl zL>hGPEl626WS$w+T>%e>cW!|k$KE*wa=!^^lPfcL5J?AAMK?oQOR$Q*R0z~n0=1`L zA|<(?A_3$O&;T-M>pObu3(^>B0UxIUDg%)lL!j&cI(`Eb!O$#+GE)GOdvQ7mJOKvs z^kI+V2MXR6F?cjvAetop&=F0LyLrP%%RhZ-4-6r&kwwa?gmwwuv6oXy~qv#wZZp*$K^pq7TDy@V=tOP z;-Is+LE#KrFx3G$6JrHqi7+S;f$~16SOe{K0A&EsUI!2j8uS6t&3nMdVZc0BQUaRn zhD@h+Ln9g~24STbI3_{&JAn>LztGX5@*Xno1fm!~cTY_L54d)3fu;p$QUMKvF*7h6 zb6{tD;RZS`q45YfkRk0OP;ee|fZUf0it!i0%8^x8c0vSTUqc6IT z{r~@R6<8xtA@gFFFayKOO0WiqO)l_UfyfQ$VF_{xG^QYJ$sTZH^~K-&|Np<#0UL&9 zJ1kVEKsy*r9^FA4p!^7GcY-P%$k7s8AgAnUB6R5!o%T5M|A=wG6s26fu9B8-#R6l?ksUWo;;Hj`474RHJb43ATsT?S$ zfVtg}IdD*sSb=n{6~v$}Xqyvyxn4($N;@RkgD3{jX`YaCmOPN=#O5CYIj9HREC<;F zY9)JE9`xY%0k0kcdG>V*NCK4l!82YVARefEbAhKzNJPVuE2#VfsfJB~K@Nw2oSWg< z?ZM#-Ds5O)UVK>%o&Z3~VfamjT;&ZaU_h=yHtE)y|NmdEEwAg4lT z2XL7OZq9c@F71YUNDcO?fwK?PFL3vKLn`lw`pVhyAU z5^JDir@>JMp1>>sHN7%GkrjawSs?XYEh^y7L}w4U1JTi<;tz=|5QQVMJ{Lh?73qnI83*3zXWh`(8 z1JBDtdNhd0a`1pgmIWxXKuu*>WF6lR3Mv;B2T=TgBtU~M9&ipgi-A@PAR;RO6j|Wm z7Ymfg0%`7QQ33UdKsgmOm(bCoA`Xcx5QQVMT){5rQGs~_q!B4+frKfIEJ$!n0b79_ zS+iD<8d`w%|W1b+n~6EWjs*V3d9GM0iY!T3b06$ z07Vk0^9G9~rG1b{QUJvZNCFf|;PnAu4m6SsJP?rtKFA$>E~NxYB!Sd-wLtE1?1U_R z?r2eY&IoSYgD4!4v|umD1+dlLE#NiNNRb5c8l{m0363e?dn=J6>FY95BMFyDx0i$J ze^yY938{f$B``^Ay+KDey(sX7%pHKbuHZH(=-L(d+yUg=cyNE+vITsk2Y)ZPX$cxv z0yR28jXe+zS||e2#g8~97}C%H)e)d{f!-!2aViTmWC35044%r`9uDdvLcEVwFM-k` zqymREL?Fk6fObAoe_AUJS`C3h5Y~$Vvq1~`z+nR!kOmD_yj%(1p#cgMP}PSk+VD+; z?Xm;ShV1m#VR#8TBolPZ704(=n+cX}aWr${LCu^z@Pc+o?7{;Ny9SsA;N{pJ93G$( z@)^K~Hy?aq3_5>8i4?OS&2Ufzf!feMpsl+PKsU6_-1qP3a?|Nk$S zgDVPX`2=cYw5WjQ0YN=95Do94fp2sJg%ZegY^f14Z3jC`XAgAx4l->A>Y;&V;J~>9 zGGKwS^%f-eLNio{;pG$XDnv-SM~zy@`czOK0yd`yp0WUq$b(V{XvhvsW3GY+4Pb&M zOOIcd$702z~GhIZ%HO)J=pgdI#A87Drk+2l6{;xa!4g z14f3IyBHW45G_#bi52cI6>#6X#4#C|GE~Il0k_8R6Gz$Vx@=w|9|aHq-vPq z*s_VtX+*)#FYmzM(fmdOw3?CQ6ThH~iohp+0q8_12e|eGi-Mbz3Jn#E45eNW1^nSB z)A;oc@=pez-CAM-5q+_L=fD3RpfewMR6LqrFqiOw`mQV>Hft&8YX;EXfFl}*H!ylM zAJI4r<$+e;pw3r;M*=#1R5&_AR75}rnn-{gsPKtj&__iB>>z_~7Znjui%9}(vB4*P z0UywP2_Y&9pdKEmv-^o(5K{Pj;umaz^kzUk69({L3TP;+`Gs4FDfoP9k>(d3C0a0M zT8TW2nNcDFWkP4WK!-Pgyi}tC-X;a!oDOmVq`UNqUjR~yfn8bwc4-0Ffff5eBl8|J zJ-+|z2K(vQizgbOaqJou1+apG7bX9|=LWfg7L;>3hB6udHbmo_N7 z_qwP=ys!pO9QmklfNkmqJGDdws!>WDpT2)BFM!aWc&> zU=b(N42?L@T6j>z*{Fb04fOhn?hqA@Py7N=ps*48#4q3l;yDR?;uo9)J_G6#zu*+` z5H~n2figchErEt6z)=k(w8D7`} z$)}*hutB9UXiFTZqGMoSfcqLWRPiDLY8f~#QGE@v+5^+qWvY06jc0Yit}JLu&v@}L z2FZ`0RPbW|FR&lMnHEQYhN!?UN`Q?mgEA5LN)M=~TvR+>w1JKGQBi>S1{9&Ncm!F5 z#Yan22>1wk^$P6n4-1gBphG4Zc4b3-r1643Mu*|G6e#b4hPY)sx@}ZmoCcjx(s%@v zNkLf`Orw_1pebO`csFPm33OT%D6Tr8ao0HoGV<8D1v&!)DTG0dEKq^gJw*j{z8R>3 z1xI=37Vt@NflAb}RZf*WIdATz1mTOc#5pws0*ig_pOUVG4Z&5IY_ z;3001KM!}eKwS*=7<>u`GREi8S?J->85q#~BLuo9h`;3~$O7omtS{E^f;PQDLjiQ( z3UuTZ*Ys|83uL-?Cw$A1=7~~OP}v0?vgrnoMSuozK!FOTLCe&bKpn6i6-dB9-GB(rm zz{6Jspkj3kNCdpa8fh#aG;pwju|xnge+fQd3$%g^9QCjvlNQLD&}PWKNBBT~24o-~ z6k6RqI3gIDqCtBzU<3K`kZ~6f#ZW2(N`PP!wm?mQ=y=ij{oj9&#v|b10!19;klq)I zxFG}fkaeMulSo1JYk)`d0q}-w56}n&XuYT5w_S#yj#a~2NEiixMkqiMpb?4)IH&ob z0Z1Uhqq!o3u@ro7U;?N}jPU6WQStEX7V_*a;_&RQ67cPIlJM>JQt<5#((vgF)bQ!_ zRPgC^l%0CzPz_dvEIc0xM3pavOeP8^)aA^WqJLq_j=%-Ey|V?fVYzz`n11034SY~{9jpng2sA>s zbIP*deRH=w?g1YIHjN9ko(Ytm96WZ;5M0)IRX1lUSf-v0Nv3R~qsD=V!f9Zc3A{)$ zn+lga^U>j)1(tb)tVc?B|Ag%ECYuvUX35Sz=ZEsiZjrjyNO%A*g4H|Rv z3!_`L=5up_Wn!TFguo&Cj4AYiypRqzSSAVC9-f1$?Tf-+^MGYKk?nzBoCI>gG-RKm z9A38(Iqg)|y0@?uJy!vnc1Zv!45m67uuSH!Qv=Jm@*~M`&9zeaC$nA?Eb|yy&&LI> z*Vg`$*8z<_3eZiSkGeQSO^S!;9nbe${Z{+ z1$z4pI2P73>azrke6R$|fG!h&r+D~PS)j1qjcnSchqtVaa(CE*^&}z3DSRUjNDn)* ze2x`XwcM)nW}r&Q36CS&^K4<}>JR+yAx9R1&R~XzTT-pu zozRH88DP`?Bd3sgg@5JL_FHFxWxgP%kj_M3S>E2u1z?#3WIeHaXHUO9S*!vqlY^YD z)9#5(=X(SA+F{)|J5BhIE`Fe@iHG=)f-s1BGY@vJ05@zAEW6 z{8tY)Ef_R8Ey4$C6F{0c@OC7m$_16^pmkRK+YDa3{`BwvOCr=ZK-VnrZ~O3KJ4nw1 z@WeP?^V47p9YC6zK$=z))`YCb52UA@upan|3XnyTAWcrtIc}7i64m$MC2s*7FCxGE z|Nl~muqE9FFZ4M6|9|-$I?oIW!8HCO3=A)xKVf44Rr{beIy|T$A@i9(>cBqml@3av zJ3Lo|^+KfJDp8&FnO}ebtP6BU%!@bT|Np-%C9LZczW~EN2T&_$7f6RQSVs$Z6&u8j z&cwK}4y2bItd|5gdVq9Y6j1Jf#k+Cek;)y$jNhQ&~v}i4j$l01GU!~ z85q*|k3h~VV|Y>an1}%1DE9yVODnJ?M0iH9MFn(98)%Uy=sMpM&|`2vg9fQUJ3$ap z5(zT*5qRbRuel)af=56gdp;oN*n04TZw3Oba0mDOK@3Q|F@cQj1{(_r6HsH<01|m^ zk3jx)Q856y0z6P=k;Z?-fr;To4p;_~g5U`X;w*lR6X3xzi_iQ~C&6PfpuuRci$I&I z!PY|=J>c!u`@kt~)$9NNUowN;0Wk+|EW{RA;Q>jf0v;?NH^Hp{^?$)ufCg>ARzMk$ zvv46^bq86ofRm^M^NC-;12ov$174X4HX1Y@4K^CefJp5FW%U7oQ%mF?`||2my~3`hZ3_A>jk< zAc30yAQ$m#+yKXd#%KPh+r*5Ofo@s=4Pxv9=jK14pep46^;RK=f09IW68gWfIR)l9oUPJdAkvit`-9?PNY zWI++}A`qnd6j(JR;eh6~Aj21skb$|?gMXjFF3^nQPVf=6Kbimke>sT=ef--PI*%D% zg6KL7(iKC5E)V|wP}{)8a5qSw3K9DFw?k|L>k0+wddCI|2?BmghFS*BOL8D>+lkQD z4Y3QX=_S+u|1X<}(B#n#wF{h5Hi5Kx6Q|Aa(oV3RI*=Z5;`Bgb46Mx^r0oHC4x2z| zbQ{2|5(ep6Lzw} z!21Fqe#TKOg3L}=`v3ps0q_Q8h+5Fl2dKFK8Z&^5!GT7zL9=V{6K{weM+W!nLG}D3 zQAUQB(MXoy&Tc3fpo`)E|Ch={=tIc>As}6E!PCVMFX6NeB?HKUv~43o8*&DC@&Did zmyJYdLd^ghLE5~C(*{eGwIDrWMCbvXDSq$(hX?=u50H!iE*9)S+OH#xCE^MdsCNGC z2f!s5STiF?^DH7XcQf#x@JNQ*3oas#{rmU-Wjv8uJ0W(0HTHrusu7_Pl%@F3LA(mi z^T8mUptG1^<4?G}3egD*U>T6Mt&EWAU)0I~l8)e&0%!vY_&yGgPL7?R+QD%LxDx6D z6&%H+nqYVms@)r;-Go%_$PVBHneYiZgH5y-;0`ziD#SJurCq?IyMV)k|C9&+Immi) zWM?!n{{R0v4>XI8-whasz+K`1GC>E{Fo8EDra-13;3M^r%KAmn1;n@^(tW|rZ!&y3 zc~n4C%p9OoKLtQzsuG}SNd?dZrG^LS&iZa2(24D!%kH~NKrJKCu?3x=BS$(xmvn&l z4uCG?@Bp8Y02<+Fu2FG-FZtl{IDX(mfinZB0qo$@%>$l<1n=YrUvCfI*`(oWc;JQq z&VTQ5(RJ=t6BEih? z+6FG+z{L1k55Z$$d=1{Q2vP|OI1t@n37WNPc*xk{!Tg%(wKQlr1mbSk$}ErvU-E*_ z*94uQX9IX z_ds*V6zC)!#A0M;fjj|@6wo9rsPJN7U^v#I0=f{00i2ZuK)1AkJOHY{K}Rfrb~S>e zUqsyoIiv@C&H^ZIDQHbH_VcR6vF`>;Y2@{4IUZl|T@4!BbF>J}}5I&;%FAB@P`Q z!Igl=A)OT~_e@l853&k4_F)l!LNz z0EqAa`2doXx2S+a40bF!Xrm@H0V@*d@L+}6*igaBP?`#ICdhxF@B<|>^reiT1z_O0Jy3?~-lGEPszZ)v0J#FR z)C=qi@S>z$ZJi#K|pNp47*_W*Ayo&#CqV+eBysO<-`+VG@@wwHiM zrw90;JCF!?5(%R9m;*DzYlfGTKt{vnX1dXnA4DlA6u}43gNy)iz~?7|k`~Cppz#E- zgF!pPVZqtkqXH5KB|Xp(z>D_lpdc(!v48}j11L^F3P4T;De&m5695%CAVa}HiY>b_ zLz|H3+06i{gaOSj?*wNzmgyiX!Iw`#7X38XaOlCa+jh|QjBb!EpgR~raRI*T0D2=2 zdPZM|Bcp2|+1v%n=-|6jx~4&F)&NBaMn+GfAftl@Pe5UPtVKm06x5g*9i#%3(LvHL z3c;b?qXH5HWpvQM2H@`yd$|#CtIp?ED_^QI0&h$tFBBPF1s0W?qo@(YBbxG z3Zae`m3~lb3v?_P1L$aN{?>IMKKMwS<_G^l1t0h*cJOha9H6ByC3c`%Q3BKe;{XqD zeD>hqbIPOnAOq+|(B^lH9*Unp?bHfTqXxX&r@*6=V*{f{;}MV(4}%;5IW>m?{T@a< zO9`RTzYG-ppxdW?dO?SLUe(ZHcn#j9g40Btiv^)3?gp6%x&#SiqQ#45@BvexQw3qG zxMA)Ftq6sm@9WU)h7K2%za=7FE-L?Q zEcvH_D=Pk}2SB1-E-HUj7!QNm$DsBFMtqfk&Ihgm-T4B(vkAO@+3|d?TI-HvU#DJVi(+x7$5_G*nFX;Xy z(BeN0kU<5Ym`(t-@)JOgLcS(yEi(hdPCig$ZrKD-V)s!2uP`-eu;GY>reFS+ZJ22-3s>#hg#Ci%P(Yv`s5o@E zsMt5usMs@<2!q__;9(8Am~bjMAWPIiLg3^FUhN7wx9&K21(gTr;ztjd=et3%2)Y6m zbaIRbDA_^Ob{fIbBRG&i4Pa1V4c*KQZGuC2881(PFJ%E6g)gL`>y^Q4egr^asQ}6= z(BLUyhps9H9qTIaLjM^fxYGq*z$^h;ncRF3d;=$FTYd)UoZ(V?h^sid92h%XRM=Y% zfDRh&a#3N|VJr~_-;=|x!&D;hS`=z9l!C5dhOcQ(L%J^tRM3L@V-leFg?1u4K}oF> zbQK=>&>e8D@Ad&5?gQ%NfiEBGgq}U#2|0%mRQrL8P|&s(P)Pw=_XIr*7IeEP$QJPJ zq8c9Ekc$U6e3CshKo$#t+YR7_ZIE8V9(D$Xosyu0^%k74Kuf$kA>}Hl_5yYDzz2eM zLsoObIszbZ4{L}z{$5c~IS%T7f(j(?qF``q7^KLv^ML2U2P|IQChT6_HSFL^2f)<> z=x#}n+dH94utCdlKzwN5{Dt3kHU=Ap5~kNJptPm|N;(D}-2vcpjzOiS2k5YS$mNBg zBm_Ql0hFaQLFov#9kmm*@39-aApxR? zB3`Us0ovQ(16sD}qY}{JqT=6BqvFp{A`WsPxJ(Z)Jn7N=i@}56|CC232l&b`aAd&F z0|12xs7ST|jVU;QN@x$zNJ0R}0B{is-sk54s;nS^1X~>l4J1&P3zUh$0p$a|kqX4I zJOM3|_*-6qn~Xjxpy&gwX8-#iG?d>0J^>Vz?2sF+^Enw9b_#=H-@gY`41mfy(9Lye z-7FrUxyU9428Oi8Jt`oY;RgRCQ0cmX(c(mjRoV`Q2Wi$VU>QiM3l>*O+re-HRUB3t z>z7Kt{0q8UW;;YzXNwBRc`t8)<~w0_+=18u*Tdg(3go?RWWR!n1(1J1jzLnm5L)_q zfI2{+BmwfQf@kvqMsS*kB=^N24}#u}9xhC2-K=3~$f5YO60r2?kJp|M7#g5d!|iGH__N=@TSkWmL8a&2NX zJn-!hBfslG(DfFLFG1QlPp~pDFoI4p1w|#Oi3bXJSRnyogS=+}>zYC~EfhL*PXR~0 z2Y90m`0gEW-owatpc*RTMTK$!}9KM#mW>-+^eQXk|i((>2) z4p4ky&0pP+`~aT+-^p+z&GG~!6Mz$mM_P9eIFo@h+`)q!AZc(b2Q00LBz+?dSsI>% zOBG(qg0dKrHK4J1XzpWVVqgHRKmesas0;3ZtN>?qxEcH{w}{P#8%fKC*V`fC0^WEL zkk;+v!355WSiMpL-Y7w2Zmflx46fk=(z;zdn4lhf0QMj_UtrCaZ(&|Q4j53Fxe%K> z8NqgkKpJV_+?m$x5&*UzWX>?mr1!OPWYR52nH1D~N9r#%zXA78I6#%50H`vQ09A(I zlpq1B@4;0nSOVNK&H&}?1W>y!0^FK~v`avD8-r?uP7uS|MJ1v(1e80$n;Kd_N>P&=%ML+F1(dWkKv}>5 zlm(#8L&znJ;5s7&w1=@o#Q`*70_wqoI-{@_BDiG>I$Io6L}NXL3)~FubWzDT=Ax1g z?uerH2|>+I4G&8fl?eXcV<1zyT~rFdhp-x6^7#G{7Z`4e5r^>bB&4z zY|8|s43+P4QIS^x^_0@V3QN2}$-n|+G^jhp2+FtM%kDBj9)|QoAZ@ZYphgY&^0ZTp zkjenugL43NCOjGr8FYw%Gc$^Vz)g1-l?X_C0K@<_TVcF_msO&Kgi0 zf)APnHxWTm3h8ZwO0G^&j}Oud1f5{mT%%$EpCohxc>!E38hA9n0EeUjXq3PJJtTj_ zz0lBr6p|XpSU3z`*S%%{MVkc!|8#KGSCWm-SmcoT4>A@UL7Grw!69R@4Tlu zqJfAi3*@xpqGIv74bqi1@Mt~~aTuvT3~thO)~IlRQa!k&mjLAiuwTJdfB+~FfX`-v zgg3ai28w)WIDq2=+}BS4c`ktqd^xxc1LWjdM8X3(Fahi;(2mTXpv0K)`Yfm#!ORI6 z;G9q!3JPNI);+M*;2l$lqw3Iyw00SQQqD;(P%Q{bj?gM80%S308xJ_v0$$Gt`9}bp zoIve-kjapFngR#N!OWogrxTO{z@s-P)e&T{4D1QeIGM(a)2FmSo3B8D2yXv&)~L(? z1>^!yhFt-&c?HO(1t2?TfW&@)0`~*R^DjVN2Q9q=mj<9dDwqKp_+@}-v~*Fq!QXrq zS{lrN8*~F?&d?$0gr<(nY&mxI$TutgLEJ8Xnw#BvSve z(G493JA728ZeYChpvy;Ps^O)M5S3{SKS8>t7jbmCs7&i{QJLQ5qB5n+M`gOg2^&}e z0~&4$Q8}>#G{A=K4mfTXl?Nc(9zasr4OlU717zz381KSMW$1h=MDbzJ{5Z&akO3HQ zz=Kac_EGTwWi0SP&fu+6;QL-YKqFWNpz;?KNT3n`H1Z7_iaFMzvLDnj_vrS}@HqI0 z#iN@=(4*T&5IltqId={+fC9>M0iXeDP|*(>BL_)>2QMI9{9W1iav63)4mE~|yeMe~ z4Ld+Kl7q&^A?5!RaEBgbKPVA(xTw@O)Tq=m@V6v^2V=lz7NTDB@j{xFodFbk(AHEp zXcJv0bQgF5DB);;E|~J@JoVz>LN?G@uks*2Yk&sK6n5o<+y#n(7fT?LVy}f@zBWAI z(Rc)uhz`TW7{P@XbdB$6ZuXz@gL|qLT80X9pugw~tCnCulOh(?ul$l;I*k zK`#Lcr2_DH75Jb65 zWcFY@0b*YOIphM!4L>}(S-?UIz~ibd&7j=V?W3{-q+$c8lzHHxc*=v>MdgQw<^>PM z6QF|hLwP(%dI89Q2OgFuO2K2t2SBR9rPB`&OOX?$LLfCKKx%$Ktp?9gfKC1Z&cTXc zn}2}Rfp)Hg%hL}p6aN4IZ+PG^WPGjpjR(lDkb?t20Sk@}1yCZE03||jwITotb_$*Pa~Z&EkzVYX2g(Het&pjt5>OJWQBm0S3a(%_RKav`IKUOW zfh(v2D=4i(xM0^ikR<42fETe4$yg-G&u~cxh$Q%I1&G^s{eVjl0baAo@(KfZARgou9~F+S5EcC{7ZtsZ5EcCn5H08d@+L-m&8L$^1vw4Xs7OHO?$o>MFfhD42~JWjDi$3sDrOBeDrS&zJJ2Me2md}76*I$=9-0S15eqpH z(M84Lq-@qq1N0NiM^#2~Tnv_GyAzO7<~K3?OfVC$d6REWlHvpk-}f zFLr{WCjza%9qJhF7#8f&_$C6hh_%y4MFUhur{ZPxrk0CX}8C}2PhbOqQQmLQHpN&d@O3=E*{6D}$aFFMw-F+leI zfKJzC0FC>C7$7S^MtdAT(D1Yfyp11p8t>~Gh?_t0M;-VKI;;kC(*W#9<<1rrsFoSX zT0CJ|1Y5u-)Pe?OLE9*itk{68UJ?{O8vA#EqDSFrF2g?XWYB^r(Afk~8@hYIe)Z@M z1RnB&_oodpn;xj3$h#RMz{%Bb-`r|IUuu>ogY0eKLSmq`~y{G zpkV?=P;COg6#?B{hJ>_%j_d+C26UPiDCvTm^cvlw?3`kPeThxeTxE8uow>{$(hE zs{z#rFf~3PH4-2mNH?-fAV`J*l6bpIKnGGo&ZY&8uY=US$P{G)-`pMmifzy-wxCW1 znC^5@k=TC;l>JOWho<;3Ffi-{t?qi!RtjqB_<(9RP`{#hZc7&DxkTWhCN`4 zfxiWGh$g7{ieeGS37`f$*bmS|{^FV$14EaKia)f?51PjX9TE@f27sd+RH862Fo48x z$$_F9>>21KlOTPd?gZo-s~+geO~^s=ppFW-0n^!|0=A>OM+L06yA!Ou6LvfrTo|-s z6V$B$cW=63x*(Uzf;uc9SAl{PB=6D%xiQ$Kt4HM`Xx(?$6qQS0dXCCv1_p+%IVx8e z7#JM7)~H+s3vW@m2B!C@TnEt|dsIM~%B5qA3Lhf_gG0v}6<*Mq&^aog%THZ8=BRLk zma}(EQQ-p9Jt~}Fx&^#L4z!LLwAunxfP)un!LB3d>;d1mq~ls*0-mS$*KsRxfU?|6 zqM)o)=zPAvPFjf)R4l#3=Cv0n`GU;@4>CaF|FsDy)WM?KJ>WHHpy~dfps8N)fyAJ` z^lR{PN3a@DQ3a~U*_j}*t>ao^4zX(sv6qdN+XMkr{Hh{EG*ytPHO$KxGt2H>^ig!UIY=AQ4d0 z5zQc|&Sk8u4A8U+>a~DwKPmv}0*yL?(kdvSVwC`eA~>aiC)SUTsL^C4?N)x zAI#~7Il2L?1awLdsE$PlgZk}LKBoKr-6mHsDPUApi~G-ji6KrN{t0p)+tNh}(mW$U2e=ik-? zt`YdRO#zoE;9hS4hb#ZK11_Bm@MVIh_!$_$85*<{60}MKM0evWq0^AgXX>m`dD88p z@}$#8<&Q`5K~O#T0n~DR0jk4xfX1&ZPw>w>(EQVqf8IeA#)gNC3MW=DmMVhu>_}u_ zV1PkdZH5dxAAMA~ZyyXpndfu2Vr85q`J2Sa&R^1gdh+fbUr^QmGnTQyQhG641*FG$XZY$16cy9SwUGH6osHRflv1o zaL)4q-HHWTg3;LnK1dsM_zmdD15h#m9is$FF7BXs>x5o>(`^JQzre>hLyw^con6$? zqoNK{)%=4Ay0W8G6qKVtU4M_}9}2J&Y{B<|f-1-TVNXE~Y)}hM3)H~A7r+Fr)s`_b zFc^N@)d&*vN(EJ%d%!DNyP#p!Jq27=g1iGV29&iyl`Kd-hz(lr2+HQ5C95Dd=+uGB zpZ@;`EwzN6B-cF!vN;1Z1pz9&d%$}EK>h`-ss}k5oPDiZz-#lN2Sf6=ghRs`WE*5y zy9In856C58vECLHkmG$A4}i=9RXh9bK@AvCO5NoRYQS(aFfcgo1UdCZeTLasLcT_V8BjnK#4!+A$XY9?V<0DmfgA%e6EYFh0^U~fvIo3Y4ic0EgVjZ)0?GB@Mj>cS9~!3C zU_T(j6jIi?ebPw!Z@CJJWN0=% z2H6Y3=+S)OAE>AS%?a@Fw+DiifQAe~7hODnZS(;rJZQBKVuRuuOoJ*hB&P*~k{@Ud zEHtPDzz%d#NjTQR0!p+=FF|DkC@?^}vBd+Z?;3$*VhEav`_e#Oc2S9dnwbA`88pe_ zGcf?k#4t1ybD$;$KuxTA9ZtxB9!SQ8qZua)HO>QST*Ye+Xjn7AHr|x@60*Pn$%1H* z1w4o>y$4)cxu`fmEiib^uz}GEveT$U5*qm`OrU83&{8n)dYItX{)DWwK(Z24tL;Q8 zMLeNaT0pJTeeM66pdSp73`_?30m;B0DUet+fEuWcoS+0iGdjl^K;;+M2++u+#6D2* z1{%Up*p&t{43Qr}Uo0of3K++)BXn;Hb zTJP)Fd0-c4Z8Kyo;bU-S03W*xZP<18sGx2?f}Rl44HJiKF#;9Tkj*(Q;9Wc*CxNye zc{CmY)%_yPjeY|3OvhY z*ae=8*x&&QEARpn(9%*^uL{0E7jk7QyxkoOYS~19LKqL!KbAk*r(6Hz_1Hkc7XEY3$r9h3U=rM&Hel7XqV)JJ1BlS zy8Nx673Z%(yZ=D;F~ST3#fSyC3CjUC7h+^2C^duT*B!xQ0x$N0^BQQ~b9ajh*g^jf zc>F&J3IULdKxqLa`Z^TZSOW}W!KDV0v1w3a4dDL7ZY%>Rf}6ptXMdN5vu<~va52;>1sod@ZafEth> z{&C2$p{wCA+Gdcw(2h^@9`KZ3JZwTr668aW55V&y z&^@{@y}*;4B`N{k5almezx)TEyxk3|?4Wy0KznFGwK;6IoawbY$R`;d{OchddXVEm z=@4WENTCNarZ|Sx=l_8Yo`ueHf(D$BV-8f<`E(*Dh&)h&U zi%LF7X#%KQhPp7}n2U-(c=9#^WNZMal>=&ygJMm<12nzh4jN5|O)nH6I12nNpj3wt zaNuv*18T{F=lKOZbV1R}-vS!Wda1$)9<2aPZ1{D#sQ4Xt!44i!2hBM6f%Zszzv;p6 z3GO)tz@7M#4ZOM(wBi}G%#MG%i;B;|7yJ;7`#}ruIuCka)d-rR0xjF=bOGNp>~Zjg zJXlw<3+R4h9GXC$0r?ud#TGn0?*KZt9IUY$v>6_UZJ@g#K?`lVq3icyYtBGpd%jQ~)^69MYz zLyu8~ZHYlz|Je8j)N%%umf%_MgpLy(E-HE86a!8Muo?{7n1>FFbV0UcLwAjJwLmtH zfxXoYI<309M5Vx?t41XcG|Z3>s@@>&@h#xv#$2F#qe0!!GH~kvvUR$nMI{|{7+ClL z(0~qjZ!qWzSaT5)Ud2LD~Ko#G3{lkre3%181 z6;$?vkDdUDdRRLOz#_#PY6`g8055R|sQ^_Z4xkHxz=>fWI30jChwcP-i)TfE(gA4Y zV7H5k2WSBn#6_^+?}BhCN!8{4po9bo1z0-+++6N%0goHO#6V5ymq-8o{|~BYwm|ym zu$*z(4>D{C9+T;WY`O(CEWph?(DjO-^x1d>R2UwHI~_UCQsRMaAj?7d54vIpbZeIY ze3H%Os)nAl2lON>GSR(FiIrpc|<{dCH?3azF!kmp&*5Bd+WNx9vb9%b=*ShBWD5DYYIPW}uENXhI2; zLJdGA7)T4KE`x45gqL8DM0*$%jNqM1MD1|{r!$7$UH zS=mK-8qM}*V1QZ8#Xko==pqgiOhFP%eI19CJwPsDF@ToW1|2ObjG&Z_quK%OBgR?H zKJ#K=cnO*&dI_4dfms16PC#~m8fXe0yV5}md(zUZQFd(cfM z9*oxDG%D|QJfJ^7`UYq@zKUfSLIv^8N9aF%e z-vMd;;Ho>ps}{Pqfaf$o<1nE14?J5YdV;bgS~35|gOp+(+BN}YUr-E+Xzp-a~ka8n&rR)Um!{y*v1aOj^$=OdraD9}{jC6`Vi{%sfex1D(L z@H42-4%_WbsK!Kfp#-$4R6>FaVT0;Zz~1!j_K@(=JmqS5(xdf~55MOrup5Iojx&Kq zB%w~UBgu&@=8DwPDtBbhSVXYCHn+J7}ozKgfYFhaiRur9cHVXssEDhK@jik}k-(;88tD z8wosGI2%;CgGUQF{6LjEWTGD2Oae`?>u8r$fID)?^?3Ba&tCCEES_DqM`695kfT=szT9@HLCv>@B#fnm=o zG<)=+_IMDq2i%K++5-xAWP2Pi>{*Rw&v9@D0e9J8MF942dz}m_KtO2>v^)dZ63n6X zHE5P3K`jBFod!;XI0Ef8I3a`jZs0xSksynMEJbm^N$6NONCMPFQb3MD35;X{>P_xs z2aWA41Lt4xdQ9-)6wp)x9}7p$TMc`_B`5=IEFA1g=pq+TItCSQu+j-J91f~aKn+xo z>Mlq{(h;H}4$8P7Aqwgi7Zq_2XvM-W&*0Jc26UAysD1@a7`k+vfDST(Y=X={PEi3J zjRYDQgp5({0gq9FoSpz)fDKvG(AA;>T6EgcqB0$n;(A+DAj`I)4O-6w zxwEViGN98$42z@;d zC}c3!^MFP|pzC=+v}3wgzJTlpi$R-vAisldR0H`PbfX$b9%etdQ0hk5 z4;pL*SqO1Ir1uKqL)52hSq3}V>;sLX!x0qQd- z-oO9 zgGP>_d{CPSWHTf}phH%m<`PsMJZFp)q2TdQ&J!hukOT$hg4W%G>d07^Ig0{kXsAep!ql=AR(*ktgDlem#U5yx7MO-C)52!~@;b01pb!8xe4)8Q6lwuz9T><0*fK3p zi4I<-1*){MFVn(jCGyHJ&>3LRWm@2bvB(}0M4**nAS>a^wD1{-yzUFsv_v*A5NaT3 z-51C}ZR8{hYOQ%3X8_p@P6(i}2L*7c2AZqa*acb|gj7s``cDEc?t`-!XgmhK6pb2bn4Fs(uKs6AkN&vMyKxrM+@_>$hGoY`} zx&U9FC7=vhp9MZIq5xzDXha_rrr<)lc@KD~2R;k~UY`{JY9xcK=$ZoF+}{zR;ttXY z66$~mfd^o~YfgT^rNqiSrB_b>$BWF8jpYi741tHvapd(-&}s~}PzqFafT958U-+@ppe~{UxQhtd&4ap73TzL& ziwLT!K=y!YUQp%$^P#7KABP-K1~$ES3i!mh7eDeLT|@;)7ZH5w9Au#s$RW@b63viv z4^X>^pvn=}Lj$p)T}049ArR#+?wkYl55Xs`CxBLaRDiaxS3uj9B}}hfAc+&SL<*Dy zK+Xo!;KRI`q5Vpv=}nL=C^p`J_6b1}pgy4hES5ph#evZ$WMpJufbJGfnqD2L4T6Y7ezXfUsfw|gE;Ic6DfDfps18t808KKSPk$o}+l%}Cm5TJurAy)T7 z`Wmp^iBF9ok(B@{+B`thE8tqGvjuvaHuP5Qi_bvkF}!$w2(&{Hyq6PHE`rYG2el4C zv+H1M4Zx}r&w^BemPO&{dx4@B;&mK*VJ%NUkNqhX1I0rCXzCOkCeXkIuVjQCK?_)xz`?Q5%?%B z35Z3xph-3>7nMBzsi0D210&>^ZT?bM!vhU_z>`~`HNt!)YM{hY051DLmmGj9H>iU^ zkpx<>4?2jOuggV+54vxo!$pO^%SDABe1KREXzI+$MI{$v59}05-jak3j7awIlsbYG zvM_>`f)A{OIfI!~_<^X#s;ulB3+Rw0a8ZHBwEIY=fx3T?-Wxawp|u() zOe-J)E-Do-bwS-)sP$=(^G_PzfP0kSBYiqSCxCZ??gauLDh4{50aWxVfC_wEmHV+4 z70?pd%2b9SS4|E=LH9P>i7yy(%UUcYy zX6V4leu@f61k{`Z)qfojyC8?Bft-C9l&8S9HtqnG$DjlWE3mylMJePQB2d-_H4;FU zf$o_Bv0pT4BiRBHA=;L0|Nj4npT`;-CdP5u^8z`%n6BFPCI!7Aa|Aq~n$pbY%l6{g4sQg?x>SLDnLTG+YM z88le~p4@s-1TKcboe`F!Kc3|>fQmWrK_(WUL=7%XBtT*XAP;(Im#7rHcy|m^z!rec z^8w#HQ1R0FKV*Fuv<(PxA!J9q4MV9Z%vByR321I_0d;XXoG8Q(0MILrC2qn6mvm%ywVU<>awVSZgYb9 zn*-GPK=_*jLrv^N>trqcu;IaKkI8@!|*G^_!x>Oc&zd^fZS25WAB z4yA^yPjE!G1C~=91i-mh8>AmJnFkB&gcnU ziURMh0k^^+4mAW_L(brVewv5n321+XzXdcq2Fi5-9v5G3f}Ahy!S4!PU=9vr(6Y2n zP@sT$)C&&}PuU;i8Td9v*meFleal+aop%pj8-12>{|1L@5ew z_*H;b(}V6FWB?bQJ}M3`{E%G*KM@`?mXOwyH@~Uy>EuxXl?LEdq_6`OLHE+ZPM<`a zst6e;fcC^gRKN$Of%`p>({(}N1KD)YdZ5(eHG>cMvODmWGmv@RH7Xh)M}v<&^62$Z zv3RlO9%!Hyw4tXHa({&XYfJELb&xA5z{4QOT0tA#7(i$28oV$(1%=-L7{0<=I2yr``cbU7q=hcGxJf%-s@t*zLXc7Sa0=tNrD0SX4t(hkr}A9%$c zNCjfF0k*UQG}{Mikb`PWP*)VB3Vpyq5Olc|XteKzt`4Xyg^V~8v9tqZH+X3W$W+ke z8KioAfI1{00y3TxRA56kg{{yBS%O&F0d^vMR03oa$iW~{$kGmw2&ngrxwJzJ&165Y z$IQ0EwFRRPEtSk$}(k5e9pEG9q>M%eNXkYZ4*VJ`mw z4H_daGnt_au@k)f102q{>)@VlE3&L<`#u;LHVG7J|>t*ZH6{i5{7-B_gnZ#atqygl3^V)I#tQ5xf?HGX!Yz z5FC@B=`B!5gAR-Xxdb$(2$29c@*%4!Kus#h5)sghJE$!LzTe0IRCR*wf{*`!L$DLN zm7p7P#1d$h7&K0LyhY^>$Y@Y`+dBo!e(@t3GX4i$A_9_!E)fAa1bVJR^B(XVAnN!Z z$Oqu|S0`l43UvGrzC;8xYxv^kF31pI=LwI4Kfn{wpusUvx&{w9cTWM|7!NAPA$-V! zT9CIuF#;NhlRN=yfU&+@401VWvKka%pm{zp4XHU`Wj|=&pMpo{aS#6WKRv!b15JT< zUI2xdf(PRd5B~MnJU}OMLhFmp7RXMjZph8`ATuEDfXa76TN=i(iqe)2pfwJHfXP znw@V|ApRuSY#^=*$80mKLbI?2YM}$D z;KUcOprI#7*$>VTNL9E6D0hHrPKX4k?*>}W0?Oy$3Ldn|6IO+TN0`A^If3mWy9zfA zfmGoJkSRQBSK(rtsZfPah798nUxjO6tHLz~V->y!l#0MrxDB}cf%fRZRXD8ng+wrH zVi8mcfEp8E(QatfPF&rrPJZ32?$HRThv4@o!tVQYQTf;5qVk_d0sTCf<~JFj@j%er zE&3VYkkJd+5#6AnbnrRg5uo7@@RdRV{NV?{hX{Kdb5U^zUxol4+JFfgfCf82M}sne z28|3rBOV$rs$d8E8i0l?G$8sx)`O01c5kRrac3w2Uq2-Qx;@hZc7h8l#ENdvfGkqq z9&t3c1$bS7j|vC)EMJc<7ZrDi*&PrTqet_R4AA`rpk=Y3W*hiwB*+;OptY5dt~TWS z4^ZI%=ELtq?13+z1)X{f@nDMz=-^{eX#iTm0V)lSwWyeb_ke*`tU~rY@wWtmPF{v? zC`7Lzy;)#4NixfTN6K*0@6J#Us*4+AA0{;G>0?LC5MrZHGA( z)QttPK}&T(&IYkTM-GG8=q-u>kQ4dAqYWT^FRbK2HuZpyRe^_7^Fbz16oRgn0UsEa z05TG^@)vAmH>~mm&CY`FoC1}Rpwme~jdt(|DEMri2vD~~6Wj;~tr7+`g~6+ayZ5Mo z`JkP3%nS_2TU1y;p$sZKtbto@Bs_R&0sd@ z2m#Qb0&@#^MKrQFD5zmJg4i!_Lyw<>B)KV&BdWW5R6x#w`U1>^32B}HwedkI4HN+& zBS4);50B;-EG06ai7@aK?+cC+TLcGme0nA5ZZ?qXK-W})7LBIyAAuZr&G5oGgpJ`d ze-tP`L(=u@V36S;)u2P3m>3v7^9!_q&jChNrUO$3@*?O!vnxPKK7m$WgT*_ifCHcdlBYiL3$lTRFCk|s9|n00wiXkT zXJL5~d}8$R78TG5&fwJ73q9|-w+Aftf>Q*1vUrOMSYEb z86ZK3`spC%u@;qSPbJ^&p`3F3NmdT@Z)AT^+(vv-OL$W)LJ$VAYp zbdYhNSxJy_FN(w%KoiyOphh}KA!xN9NFiu%07xOIdkIq5HAMw%B&g^Fl|7w3Dxh=7 zKs`jzB6-jmDiur&44`q_N+t$|jwvctpnL*4WQmCZbb(3;BBViuI5Z+COfMkUf}80d&wV$gD0%w8D}tXybrq=R=>~Dc}=OeLDrg z2ibx)wsNR~=2}WrD!>5)4hWEHc#@?~2sP{h`;CFWH3d{mgO)LZTz&lD2GGg(-B=Hy zN2-WfU+OY5Fz{>euDY+y@R`4^1$^{*8h_HkG=2@fi9g~X z*!dAm(7Xs?2)3wzR(Lk-fu#HrO|WM{a%mp?bq73lg3>$#14Dy{;fXX4{ya!&1(F91 zG=pLax?=}?uAvMBuN2A$e2i2)^Aknx_)FT_AC77K9m0nz~I2UW|UAxy`e;ImT?3xld< z7Zr<7`~oaT9iHbheBzI6Q33f2>>m&VR1$#91FdHVhb$2F#rxHyR+haVp4-p#DG9jq<|({)1a*u$!sDM=!ak z6nx^3WH}3RGib~Tl%>Er2og3b2Pkp#W|bN`QCb`e;MW zfd)BT0m;b9 zK>-1BnE;Z@X2V?ef=Lt<;ai~XFmR6qGzs4e*?9e;cp_-J86*O#QlR+;bQS@~Mvvpi zz`42?vI6qOH_$G>ZdeHe8X^U)834`dg67gXT2vs54xn?g(A&qs0SXCOXg%Ms2doe> zc}Ja633}fcC>S(AEldN@*e~oRq8iX;-X$sypjBYtH7MYv&=#Ol8$84dzXBez&J=oz z707F#x)l^Apd10}z`@v{IZzlI!VWfV%F#X|3Nop zIe^0lq!?7xRDe@7$SP2+0WumC!(bY;It618>M$stbwHa|PJuHv*sCro5>T&#Znb1Q z?xA@MQhk6f_X8ak4|Y~BXkNP4MA#2@S@xTBdNJrz*AASchGAZHtboNdexN}fKTV+LGQJQ{2` zGGSeksi1Xi;H!batHvNVUzSQhd;(qZh;(PW;eiI|9h&?lTA-kGz~y4-${Dcv{2-MU zT|O%O4G$SRdQ{ef8b3(Yl{Q!&-6X?H;A_Fa7JBfzUIRD2IY8B}!6$wJ$VoHcXaxn} zCw@U6l>l&Q5&;h2fKU7aJ}MEP_yv2whaZ508kE|=TA&PwR96ewMVLxE;1Zr3pZEnC zVRytK-Tw%ib^xD&C;`e33ZNdj254&l_=-yb_$n6g@RI^4KY-?jK)qbhxD_Y`f`;&* z`2n;A477C-G;0Ij6o6c49Eaq4aN%LJF&aL z>qSCTz_->3fF^_>cie$jWfg#02B1U_Sw_|YIp(JeLO~KDXfC+7Mx|h1CdhlekcD`l zg%=s1CfQYa2JoFR0^o>;WGZM;30k*>W>SI&*rY5plM+BCb)%S+08TTYVgkFHA|NJZ zqnQ)|GRaXMTrsnDBzh<0c|f8rN}@bMT2 z4U13wf{_xR_yq$6KJg2B!txj>PaWo$cL43b1|>vLxuyWBZ!qr{hNde6P$mPfhyzzY z;DbslKsgMQ+(DVL0Hi&`^Z3Dnr$r2&-Hg87o*baLbnwVo1it`i2TbP!enAGGP6vtO z4xpwS17tAAaVKb1(+kIWpkW8_ZU9h!9=UIT7)(%+C?`(bpE~vmsO#pOuoKLrd0LX9-q$P>{pdCBlo0epFAQ>8b`yL1A z^2JW@iN7wOleNJFXv2T=5skyp^}Nk*B0vQpa=dkeXW2m~l!DJ)=mdpfrw?eW1?cEg z@ba`y7tkTy9^eQPfVl{?hYhsy25|$_B#^s6t>+geV0S?`mcUkpg6#pX@U!;-*Um3; zS1~exrl-N@X)${UcyxLQpx);TzJC$*GGFi*XE#_3yekCc^5ZTl;H6*CYO4VG(l1c` zBw%>JqZxej*CFtZ%x=&!L}n-OEx#I|ST+Df2zd1w=s-DWO7rRUQBimy0V+*EIUS@# z0W`=0zUB`+zw6WKqp|>$l2?Gz^afCB+5rmR1E8BjTvX11+_M2>{*Epm5HCb!1!#5b z0g##>Al1;Db2~#+9(4Gq+y{*agK{wF!ol<4;h+Z|-Im~5*Q4{N$K_`r&+IU~4?MbY-@nxjwl|Oie2p7!GksJRbh)UU>u^yy4+_!?T_8qhhzjVY zz4IQOf`^gTA42jkD1;S2A*=xkGXqfQfiKX7R^Z@t3%=L56VyoWgjArQ%myC624Bw# z-YS#;+H33cy`aO_K&?BlWf34#JwW9Ic>kdUQr{zv znSlYk0rW)}D=1fj&)a}+%y8e}Xyu~f&OZ$@4I}{?$&Z5ZxIiO0EDE5Zc#usBAZ~|? zia6XJ4kUY$K=ufO8j4a3Lpe8e@ZU(h#Ks6+| zRfE)2J=UVq4i@VKEtvx?ZiCjmkQm`_0WW?7HPjhFS?;)tN&;9p=;nA(uxo(ArUD!i z;O;4;r=JT74sc<3pBWS!E-D(}W97|tv`gH<$I6@Q=z@lNLDxa*c=ES^YEh`TAAidw zMg|5bFO$Cobm|S1m&f0-4K()P0~+RmIY9xd6Y@b$04)l85d(FCLW6}av_W6O3Ch$N z|3M)P@)F2zU{gS42doSQ9hDF9PBF|ZNM-lp6&uJ?(6m$lTVMze!0sB*1tujb6}x^s z&t(Ab#C&o552y-qQHj_Ang#$(6GgxVU|Q~hLbka^C4v*WMS;KNG*l>q5$s~n*hcJL zZP4wKybxN@M}@epVK>Or341`E7KC~QoEebZ zNhR04hTc#L@iK*8O`8C^zSJ=Ubb%>ot2Ss!EGP^>9h90tmUp$NfGqauglg-AYU_Y% z>*xVH8Z;0O*47DGs@(z6=G&?6(`oG5A?4b^;m~0RY7I0V0fl|EV+`m5%fp}%Do_}M zoDH%L6c?Z_0JzwKWbsL$EDl<<^FsIk-~XV%1t|apJ}8hu`{E!YN;=vl{NOY0K*LKq zx+M~?jX;V(rh0(OambA)uVt`_LgRoDWIV_{ps)umcLNnuAU5cDK~N=f407R7Dv}vY zpjr~TrLE;P1E?zp>0luH36v3${4^WnCs0f2MdUw-pFj#ghJyUmV8el!vIT8S#}-PU ztnS%-fDzqPT~JlW3^f&`2xe-R3kM_g=y@Imn+jOAwgGt$m>I6#e zpan{xy|awqStQVfZ3V|#R6w!Kc&tT54U{a8wWxrO=LXFxfo?DWCtc8D1z1uC9k2sq zqb~~s7xmqcAOpD-9AWT{Jp3*4&^c>Rv>*p5sK!O|{3=k83V}S&_7@VQAO#=;K|u;h zCZNL(p(l35^G^W{Nr8v<#h_w(NMhQrd7++TeA&Xpz_7u<3UXK?|1^+3*yw+Ksora+ zhCLA9m$1GpVgd&eC@>g7c7p-|RCa?r{nCbs0d(RA$Q72*whUx|xxULsr5-lGtPC1X z07nSKIWVj0_*(@*HEa+h9zfv?+KUM?4VGF;{6Ts_c0xu?Z5T?xSCoKk2RGz9AuGaP zZUV>a9`JFy|6wTse0L^DGswZ91$(b~K4Y$eUI=g(`#^4f^!GdB_Q_8 zgMa@2Z`cENDg%EjXeb6$hJn^ngXRuFBXgikGlZ%HSZ*psNso{u3`wz&aW)(9${y(T zR@%@*`ao+lz)e(8MgXN;m|FgpHfR+MPL`dZ5xMRja8(Fut`~qR))FyL69;lY3G{wE z7nKCi*-nrSPA8=P2E{QbX~J?8mv&3J$tFnAg&paYt)1sn1t_AgNID}jP7;R`7ELB|6? z56;_Q02+>f4tRKAGe`p|9>E5Imh8O{2O9()NQT_S)nLN`YhGZFN94(AusN0>2c7>6 zau8@dv>R>?Y;hZZ%VVq!ThNvEh|c(Lkmo=x<`>OSv%qUwp=knURtXoZVfDJgqj3-T z4wD6KjIb&9l0=x-J+dLYlEC*93m|7alxB*lnfM+AX zTc{O4LvRuf9VIH_9U&@W9>))X*GP1Nl4mE63P|<`$T$v|srlj2Y@-5?!Y~i;u5pk#-GUy?hnT?Dyg(hn z22Eu{=DR@$$MC3lTzrUf769n@1{akdkOq&7%8%D`x?EJ2fiHUincjSY(W8?^1(bl0 zY)&N6Wpl3A2_rmMR6IcE9&x* zk7F(>_ZdM#KR|<@A7Bf{%t1mN_$Dx*uJ{0t5|Bv@T`r(p0ZQUNDjlHA!hty_(}8PF zCPd{2M2mJHY?7{$18G9X@Fa9D=N$L|EX7k0)!l{|0m$tGnw9ZUxnKjGi^1y^NPG}6 z7XvN>z|%bkz(czSx?EK5gV$CxAF+UJhd`N+0gY9GhORY0#RF`;QH_cN_@+TWhmH@R zYY#y;J%T)9(FMAIwi~n_r*n%6Xh^67a$^Z-Xc9D>(cz*}4_i?HJ|v65hM`myq!qNJ z#6_h5bUqY#=oviM3U*iH5s(|e=d*z)m%-C^(5V6okM05v(11JYRhOU*77?Hg76C6L z&x6i|Z~;%agJwj!VXIWYGtvp5k`Fwas{o#T?F5ayqc5ni2Q8=ot@(f9^B&a1KpaB> zo-yU{VEhQ$w+r1v+FZeb=(9miCxI&K^icuN@q$}HNK+b)AoIbU8lKmG|9APQ_=8fe zfCYSL9o(Y>-{A&|3Cv^uoInPEhPU6SBk z2%yDH%p4w_9H8^c7+-V3qlTy$Nt+Pxn&E|op*DlZj7ac$0TBPi|Ns9Z5%bUB8ik{? zL`9_AM@0lw+i-v?C528O6&b^CyFiHo9274E47C|Ri@%y{R3!4CJ+~5e&_wPLjlV%JwP+x`vqR)GVDrtk;||TJev070wV)_ zy%2Q1odZ-kLMGi2E&`Q;5-%#dKr02oQ`t2t3NNZatA9bpg6Drdn%_u(Tn|201bpm| z07$>Ui_IWqph@Z%Gdo!rJerS4fWrf#-Uf7d5V*z!7YUFF)po{C7Zsl78WkRRRmbbm zZKKj%qQdjS1k_&z83MV43UNLO-2EWCKrT@LC4NwMhyfgwJ3(bJXkCs(=eZYt2H+4C z>2^^OX+2QN4yxadXdK?(0ScfEpa7BtwVSV>2L%u)A{Zd<1qOe9q;6)9%MO>r8@j|H$8ZDp@MGj9` ze8Tj8TsMjG{zE;stosR5wiBi`^huQ1XPY_rUOvM+Yo4>OccX;8cZ_A28Iv`1k++2GI5} ziNnzNvrz##g##S9;945AJ_MBbz#G#PxuTkc9*D#yf_3JHv%Qn7eD@h zrs0lg90uLzfCvvn`f^bb`0$?rWV*nM-ym&JC%S;Hii50=LCLS6rXbR?7atXc&O;v< z1wER7KxQ-{%{ox#T?-mX11Cy_7Y89GYk;aapAfKh=}~r364@Q0Zl33WsDLpZi0dp6vN>4Scve0suFm?0ZN6SAcKT2*gvrF!eZXf zU-0O_ntxtMfTvC2=^tVqqWp%&8@T-LX0SW~8`XyR4HWmFfZ}+;`0M}w4i^>aE*BMP z&~5jiQh8^?%Up(C;8L0CG$W{(1V;x_djp&QP~C%(UT2`ngI6m+>KhkOeFIG`4xKJ4 zHlU+6kGrUtfCoa3yQqLSV>Z{Qn56Lcf=*59c2P0ubWu?O#iIjg&5+>%NKEoiIRHv= z;1#;^4K*tA4B)u*INV&LqQC^Jte9ShzGmq5QBi3=$hZTvuBiE^0>95eSfvJQ6_oIQ zo&c)PnqPpb0EyR+!L^u4^8pao1XT5Fz#60)FXR6I|9{*Ce84GqeUJlaBMw75BT|nC z6!IR2L80ydS`_ob{onuppC`P&2uTmH@Pfu0w7!}QOEieE2d6K{dD}0(fKoVUm8Rjh zT?L>zBKYp#|KP=zFDz|AYq*}nB&N0Ih5^;1@_y zao`uoQ3>D|C{an^*W3bL-pH@H27C+(zvdF~p~L)|bHFFa@oPd>mhx*t*7Wdeg4S|_ z9P$D*b!5X(D&=wfz=^j-3?9uE4E*4IEFQ-X9C%yA&;dG47c}y57^(aPwMRe)0!AR( zBe3v*=bstpnLsHKRAGbGzkrMY`xNHGh&wQ^+u5La-5w;-`TWIoYZ`m~8Ynh855j!j z3HRv)=zai?P8$`FnH?0@c#5a4uYj8nRMIbTgB5qL6W7kHIw?GGjfi~}fL|*u2f_w%!7Ztj;y1NH_ zDmZAh07wbQ98hlqRN+;C22~0=eN=KllP%4l(_CRW-4hgw&;=*EVb;7j$HE5c&d4H3 z9tBB)?kst+5iD84yMqN3o6swcK+8iwi-QC}XFNleZh#^Tv~CFEyBd`UP+TQ|{pF(K zu+=odNQZi;6)v2>Ym*fL7RnPnh)pc>%oc6I@h73n6%Y#^3So+Kw3cFeNo8F#;}5szf}*EUb?}38yl5fpF#5A zqX+__@_Z=rzd`cg@Hd3YzXJt7TtDNhT!x)s^97;u=TPL?K=R-K`N#yZe;tavAV?l` zQRs_{Q29O-c?pm_$dfNNg5^t#K+(woYUuBh2FZc#o(ho*L&zzB0&(B^>Y#=O8K1ZVu0G&}oJN3Lc#v;1OMrum@NNXsJG^b>RT= z_kmZr47)(}?u(RzpbIUaXWWBTgRWhj2c8-#;o1P&M*=G64}&Ut51;N3l?b2i7|3n;=U;9vg<A5Q0bdF0(;30x z(<$)c(I-|0(7ZXM*nn;==>+X4?DSCqkEJx!sN_S6W*deQE^sPqfHx$8Rd$1Q3WA&k<~JV%Z_)v8cdP&< zA_K&vH8|J}JZ5@){|T;pV3XDwpaKoN?o`3U@{|X^&neiJQ?TQq$r;Rsw0FRFf;*^2wwINF4n;PF7VAF5uk(~0CFR^J?Ze`(;ski z*1n-e#h#&r4-`b;GmjlW8^^m`RO}(=X@Jj91r76n%3F|j*fQoC6$8jvnLQ}UgO@dR zx~MpSb%J`>Aa8;lq5vueH9$GQ0OV?L)Pee1=+1&(%gLd`&fk6#T;_mUc-<^VU%Ubz z_S9XY;$Zk~7id)I#nj7xAziu(NHY;8UVHiPfA9bcns_QmJ&OnEY*bK;YJj2%R`p4M z+y^(=8ixtWAQM2HNHmkVLEJIi7W$T zqz5Rlz)PniKyFC@6@TDKIp_(3ptJztgGX9=R6rgA*&zX1vk6Moph5*)kRERV?+^lY zU5>S=fF|)6Ko@^EzcYl~BgF6g$%FAbNE@Vlg`V%%dCjBwoxna&GVtK{xdt*0QV>CI zw1gK-ojs6t6#Nb{$d)Eh-USs<&;kflCV>ke4$wgeAl{442dtoj5Y#~`K>{GxYk)YA zW|WVLfek~6CCK*{piMO$5VwQMPEftj1?6^50s9Un+bQVLcmx#khe6?)0n#l13QzEW z19-2I2B<^^7k1E#g+W0Hp}XF?AwlZV835Xe0zNDkq7ynd z$lL?&q`+z&h@1~-0XD?79^F9_9-0?DIz7PaU%>Ls6$+3f1gez^Ugt9GeDFG#VHbGx z_}nf=2B?3aHiJ4bph^#atxC>N;fsfOI*hVm@K;>WK8_?=U zP&N<%B~Wm934m%9@Ci(yLLO9O+A#39#Dm*O(4&~T9XUKeN05UKhyjUrLS{?BvCg6b z+71a?`vamusTD+n(j4E!1pgFtBnqyQ9G zpzcQjh)4ht0U*KwL>PcNGX^i}^guxXzMI=eMS@?$Ma6($!$-w|Un4{%fL|j042 zLn>=fiUQ|zxO|9;2Dq{UwZFhsi3X^v0rL6_qX(>@I~zc;fx5p1oJu;uy-(2S47`d0 zC2#PsGI&$H04Sq^f(le(KxzwU^$+R{!^-cyXF=oqE-K*Rdj{lE+7J|i1u%6}!Rl&M z6u`s$Fwy$6;98;a2*^o?L4E+2?Hn)CL_n*hKs_(e8S|j>6KTs#Cv<57^e$Zw#)IIJ z6p~d`KnrwXOZY%ZqG1pC+8{`l02K}3axenK3II(UHPop1gOC09fjSNp43Lf$XeJ1h zh9TWB$j-Y$4i9kA0Cq8C6$Chtx;?;^aR8`J0PPlJ00kQ;Zb3;ORDL0x35p%CGeP%M zfXXS5K*Ju$wH4q>4&*ooP>};J?Lp^onK#s^m@||}fr0{jd>zoy!28D%l6Ro?urDX!jj> zb9vciP%;3Yc>tPL1+9RAwERGWC*80O4&Za*0~9DH)UM^_Cn6;g(b%ir$D{{wM9WU z1cA!Qh+{1(_dyk&N9Q5P&bJHjG!7~;JwSz}6sWUPvK3TPfOZDLu6S$S10HCCBs?32 z5+_g$1%Rp@P{{?V_CU337sLWkT>|2QoC=cefCcdvtnhvh*Je)oeQC7`SW_cp99gG^V0 z2QHwNgND^#T$~QN;Q@R#8n~wfX&yi>3WRC{X$!DY<}LkBEB6-6)^}1bibD#2=ml;9cd=VCn`nEkHYB;eibj z=q}Xo02ObHA3Zuf6hLENpacZY6>xQEiO5AI0W|lW@S^u8Xzm+)++2uC1}Jrde1Vp5 zKtTZR?LpjBAmGs*AmPznrT|J2AiF#?|3L~32~d!Ok{ns#0d7yj=K~@09iT1?D0P6s zMFF;+Ljq|O5z=-9Rg|E?NRU${Ji0l-`-YJO0wF;JZi<2XPZBRaeS=POpwIVdfC?|< z{vm9p6I_ERcz`oEq>)sjgK!rpbwfqPK=~QmSA%pKU#NlZw1K8?cEjNrWnMJ z-2n=Q-(D~rgOqm=vEvS)feUb7M#1B_19(OkJX?g%{dk=23Ch&qX)TEP;QlC5kP#Dx z>%RW~|9T0;6EG)%jet28G%bbdzRnsI@GfHT0+S!$_9JMC*YSe|-k@$9Xl>JR7jUZ# z+KKB1Nq76Gd;rzD;Dt!w4%-b-7(W1=PYD{m0&R2ywHHCdB;YLF2`x7|Vdcdha6=Q+ z!-kv~0xFe2cb9@nDR7Aj+S&$f*+Tk1Eh?bpt{{0(I|X_I38)|fSp-VxkOB#ExH~8- zfXW)sxD3Prd%)L~g3c!ao4Q2>vXKsQQ9Q_<6Tsq-%hti+&;q_+{aA}iK4^{})KNi zZOwbJ?j)#00F~6>{m0#qC;~+SBr+f=2ozbMNC7z)B;Ex{QRs2j0TYI`VZc!acUCv_ zW*X2%jj-E>K>NbL`^iFH`+{-;D5F5rD+@)ozJ#1L2;F^R-J$}H*-7BxSpF9D-~!)W z0t>DP^xy)m;|5<&{i6N^B)Gtv+Y?|8rfP6Ox)`8j45^$TyU#!|4{8y@#y$C4+CVwE z8=Ab~*ED!ac!2Kzf>rNOni=AKP%Z#BhheoiGc`?)^#KYQA0o->1_3XccC19q&6==Zri?x8~6T6{)>Fxm+$Kb|AcMCYnf`Ss%afS_i zfNkh@05@SAKt&*^r2rZZ3jif-kV;U(_5jBeq;CSgV;HmZN@<`*IlS%e3UV1Z@F=qo zvOxmWb3qJyb%MtrA^RXfGT@6mKsnV1G=vV0U8L^kFHo@sUbOiA2q+(dMl>Mnl0bv* z-Jp|H>QX?xGU((jbdw0E90B{R6Bg|~;6fH!&M-im{^02ec!>q6a-o~kn;|2Yu*_G& z4Jy+>?bKrov9Cef4Z(F1Rl*50Kjz^9UhNKE_6}-?cGjqXr_8|3MezD#2hdoHhT*qe zphnvZ%{`#d@By8)1?r50!W1^_2I{jWgZixCDboYXK%oPY2VLC?YGpY<3K{TuU7&t2 za$8aep#a*q1b49&piSZs6$g**A_I^A$2>ZVpoiOZm#7$k#-A-fEne`{J$U&pct%CT zqf-#n#4_;c420fh*ck{qi^l^rL65vX$^$$j+XdLPKsRW(412(f8 zd<&g}2iR;#`Q59lDb1n34oPT1}&=xRmu`9aaNt3pE}DNrT)2 z?q5LfKLmAkK?O8e40PZ*sQJ`61>73|sRd6~v>qtY1?3WGtE%}0BY(?t7SQQEAm@Rr zgyt7a{4G(e3=A(Pf|eY2L-xcq>;T=A%us3$s`@Gh5O7kCTlmj$2%kEwhvxQSaL z3ThTWjNAhb{TH8EKzp5`L;6tbq4wMW9UKi>ssOSl<6SPp&IKTQ%s_=>&jQd45}LMd zut&gW0YT=^n}0#t3m^kdfD90LpUbez7G!`o)S=*1gmlX!s8IK)Lm zCMd)~f#w6T3)J>2@W7TXVnM9}Pe0Z-fT>wHum) zI$_OSNUIv;F_7Out#NQ0uNktR6Sh{9za<|$jM@V(h(M}A!Qjz70c0OI>3e`~XgKAe zdB}s`2RtYWZZ~$fKn4y$bNnD(phhyNO$FX#3^oE(G9v}20a|c^N+J(%UIP_J0lPrw zZtesv*M|fws7a>rVlT9<0d9+c>vd>_58iWiLQe9WSf@{{R2- zFi2fD^prJFJqBtkLFzGxVUUsvG{Fc><&b4UAge*cRG<_GD)>O7KY|Vd{DKS^Md70e zP_!eP20rcu~3ws7L_syg{CfU+sLc@LhAgRJ%hc?aB82e&)}JbFu11YR_AFo0HR z_=E002F<&IPu)xdtse#zz96$86L_G)2D+-H6Lea7Cuj*5Y+fAH8URHacnw7YC=$SP zec*coGCP|p%HrvWOOK=B7(+M>(A0Nzm# zN(Bo*ses`_F2gQR0r;YQCMXqv*2#8**S8(?Xnx57DLSA1A>ABbjc1V#x+278N^sf zi3HOFYSMtR1;|=(cIk#S?;wkAK-p9i+R}s0Q9;JHU+C-wFRn2M1swYd!UO?KnG$V-70vjMTMOaR4>^6|IfexZ-|2P zh66lrWKVuTHTPVfI+DaRDQki zfSL+Eo)o-)7<3IG$Y}7qHpFODJ)i;rlm|erhRj>Q=1L$#{LlgbTsFW901)qm_D*mC zzz-?_KmwrB6TD;uQl9vzfaa~itLrklTvYgBA>Iv%fG$`BK)5hj@DdtOx`(WP21N?^ zd`j@tDR{vN_+kYC@H7@EeqaZ_!q$=?6%CM52{x7tr8_G)JUR_PfeETzKp_VXl}^yy zGPFAf>jA@up`nc-X2=F1P(4%uO0pFmodw_nen2Lrb)HM>EC4S72XQ^RE5K5q!T`}K z1TT6iQ7L#K51uxIrc01|g24eA?*rF<*ye{JH8MC~L0bi(pandTpaNwq@NVk>k8Vbf zZcpg26==g5C}jkAbc6g39p(kED}t>Y10C26I-UQ;gI(aL_D8LvLDQ>9?HTa;Vo;F? z*{BZM7TOsCT7?E4>jRqw8l(gddx1;^wR^xD-H{JP?goX)aTgWvp7~=gD&Y*EWaR-W z(je=eKt-AdsDT3-QcBFHCTo#3lNJAG6%j=89)qpW1(1+N-) zQBn5*olgJ?OaqVR3J2JL3x5l!3<3qefk*Rk8Bo#9@j~?|XpYZC#UQP@LW-d@4x+2u z0W?+!jwJ(+Zchgf(4GKj%i0>M1T;)_kkJD)T-9Bp0x}ZZ*fj8HJ|^?R?-E3KoYWAim2mp1k)opze5uVA1C;Q<1K3b= zgkkY|_aNM>AV-5@z~RLS&`|=Q(E-rFq5>?UL5mN;gSI6q;Kmv(l1?pwMN)Hx0c_L) zk&aYeoIDH)Fi;BNc#(S$y0shO2c(p=5Y-PhDlb6p13L_yl1jm&+y)-q4&b{=4Lr0R zAv*&=%?$o+2hy58H$f@9r_k!;* zC7|z!Kc$v!lScN0Jek!bo*=C1W<7a9e)QM$PcOp!2MS6 z@|z2w`WM`31}|}h-Cq!*@&cp|oXviKt9j7)_;CkNT>#5y0pOKKKi~_QxI6@Pg6BKHsm1|XXd@NasCf}IIo%D?#Ow$@l>?kbz;j~;;8Gqs z4l4#q4+b9Hpe_n1$|2JL-~b1A(G5U1YJjFLLGfVV!N1;10o)Y?->d;5U}*#FJp+&K z0EHKx3t<_s+k?Xcbf8M72M7541dGGq@C64H*768kCO}G2{uW3Z9TZO8=<^*&?f{>b z^#W8=gHO`>0iK;&jOOK`A5!{!HaKuCfD0(?->507rpK}AS&JRm9X zR*4UXC!pPzY@-ieWB}Ss-2&tyJWtsoyk20+034q;7U7Zp$=s2+bQ7PcxX2bEK=kNdjHVh?ppm73_ zDZZU2JpZ2nnPY)u4rp|CCwQ`$XDP@WP_r6(r2Wf4&{|CJE}H^Sass=r8`9C+ z0enEtixdGi22e5r_xs=r3ZSJ#0mu&^8IZjSp8pSkXaks&KxthA9QGVYPSOT>4eTUM zu#>>GG^hvP4c?{HtOq)N z4@!k7sS-9=2Omd(&8I+@AHkLtL5ea&DwXJRQ6VLjg8Q-XaWnk=Sq8@)0nk(m>cqZi zeG5sYAPy*dK{~Urfe&c*0uQ%?_oqWsDWv~U0jjgW8&$x|FbZC*_yJn44$4r?H7Xgf z_7Z=K38)>_4HEA>=+S%-JY@_zGcLp9KX~F6bS9xRe>*o+8E6f|(T0zp#g(9Xj{~%* zLtz)_mZ2AFbN>F{0WKb3J0dyKx*5_yZ8Y#{9N^v!p@$+u?T}EXpn`$-BHj~ zK9~Vo3;CA!v0sc;_&v?Fnw>S?mBEA_KJ%?j8?N(Na0< z@Bba3<&@~M;HZoS$%-IsgX;yADKBh6vY=UQs9qGmz}*5lbYlQZe0&D1~lRgl?59EUaz9C1GMV}Dh$^Ij*cpjCTWBR!J5FK zh#dW(tG7VSB~aU-(?!K%2WZ&_*gRP*zA zNW75$49SS#5hM-JJzprf4qV_gzhD9#8wQGIQ2t{nk$bHN;=roRmcZ<=X@EC9bG)ek1aTkKGtCtlkn=4;H!p!VeYmKI zcDbmCLYCd5^e@1zLvUJ#^e-Uo2dMvH=F4N4&j}7F{N_u5+rOYwNWlTrZKLwy8Z;m| zKs`VXScz5wzTpXc=^N;@Cvb2`fL3cE_kZF0D~Je>{Ez72!A^vG!TaH1Q4Ct*gJ@4d z!vk^_k;V&tsQKW9Y8FW8LExB+iWx&1Z?8SJHUpu_=g z$U`<RF7pHVaq0n& z=AR7wQx7VfP+_!TD9Hp>6X1#{;Drh3I3>tjKd3zeib+VftweiU#DIcTf<5kA?>^tX)(LYQcdEPCFK$`%GL^ z)EjD4)Io6r4pB&-F5>X(!%$;Ern*#?FxQ7Q_Tmy=6 zXfB7Gl>zFkfD00d7iLh4!1JILNC_L#ya2_%NAnBz5KH&{930FL|A2-~!TvFLk@gl8aIonPC=Hss z^JqQ*-o_{Z>QI3!F#NX56I98%OavudPYK=2RV3j20HKyMjG%71}g9idJ6ChG9F`K1RaV5vK6%Z zwF}aO?r>4z1GUUR2T*{k`&|=2F5yw>a#7*q7hvQU@D$(|2vpz~h=h#sLN5p8*Njmq z0EKJvB=aQDL%yrANrsHn1Y2@d!A?FvjDFPoMu^gM!%w zc2#F{MTRKB^0x8K3{V%fvjlWMXN?MULb4M)omHa(J7WU0;jbHX6-MV2736(Kpbka@ zNPq7h@Rke1Z;&=yYd3QGduxdre|s2U_C0g$brKBh!h3wT(d12h=`JzBu<+b(c2 z*xU#5k&g;$#VUObu#au6u4q-T1Mf)fW;p>$N1zQkpuQSpfdgn+ z2)YrVwLTz~knJ+i8>^9xfb3d=t(NjpDF9UhE#TcBuUTI{{|6hW4)EyR0#2`x)VdrT zx1f$(;}KA9Ks`?Z)G-6ag#+Z+dw)>lApkV(6#)vA1W-{3K0gFJ z?Fz8Rd%)ZIK*0&w$G1fVWK+i!mFXa9NM(RpT^fKR6x1sOrHtb(Dxi!88WaP?6^IR5 zj0HM-&;z<#4m2FGfsujX#rKz>a^U!j_s>Bz#Qz{opv_#MbPhWG5nSvlfbtw@Pz#pl z&UQl*m4-(zY$y!WiidHadCmf<*ae@<1#T%Qkd)^@wu0Ou&;{9*0~$^SxdxPnV0q3S z>>3{x0nm^%jywk%rvv3V&_EjKa7WMp8R*;%P@V?ub_baU-E0lrz|O$mG6B5g60+(5 zRQ7|i9B8Bs6wMf|DG4S92Jphj7x|MQp~C@+R`3|famWHfSe65g=|C1?LBv6O3_Q@g)C@nu;F0fZ((6%V1T+CG&BfuH;5*}-7saKxCNCM z=IfeJKm>lw5>34Eqp1jxCd`~#8#Ehhjeb>ZK3;Kgsy+7qP1 zF2IAUpatllEISpg#SY$&T>vt*0#xLI!-GILy=HiM=r6cj0$prNLT-nj#|&OifN~fQ zXm}XpJZSS0*6IcIbikuB;6tN4UMzS5Djq=H3GiL#ut6*y6_0L*43Fjm|3LYZ!=w3y zD1STX#z>HU&~nP737;T?SS%{AQL2U-6-7jw9o%z_0PT2DgdAN9?n8hUVuCx`3Jo@q!g{gf^%z0onrv8MA;I1f`(i z)A$CI8bBFa!Ux=Y2dx1BmEPb5jo_t?(33O3ldIjJCPp{7FERyu<_|a?K?QI(VAP*8w{YcH$7g+gY5;id%HtG&9e}dj7}Go6v%QXkhczl)>lS|GcbVm zuUmj_Hv{dj0PR%h>{0Om(^FIe!1NZC2r#`zB>_Ztw?M?Zq3XJ)K;*l(K;%2Os5pp& zlE)Mk4-nlw1xYVWPEj!c@jF{oEI{fydsGZS^zjxI4bT7;0|UeH78MmJ6RDHH z-x3Zk8G2Me?gnLgusPjRRKVtUPEip6nFHEE0HVA1K=|ETR3t!r(7H94p`8yrIyrV# ze1Tre3)*W5vKzE~j6R6f&`?k zdkUD_IYmVQ?6DrOM>-**&>aHcpatbH=sF!Skda`)ZisRZ@SO*s=_8OCjYmLn1fB!| z*^6nD3`kWcL@T*Afz3d&2@)O9f$1I<4v-a~d<`0#Zcz~cahqRA^S66+ffhMKMY>sz z3Va4-ZqN(`EMmYB(!B)|(V)G@tPBjuwXxyFslz?xqg9yLO z$(2ldd3k|{AN(G4S-lGEMcW;64kGH5~poT~TC`4F5lcc?n@(EN%fYiL$A_ESQ zH&{XhB!)9YUVt1*sNij|88B~yE=xp|IX%#_22vSxK{8j%fqkGo zN;^s!7#R3nkAW6B8-V=V*`s0sqPzE~fcf29znuPz`X6AMDLLSiA`m!|BZ% zRPZL)45&9jB|r93bqb{V>=yDk_=p*_EI|Y0rOp-=1rXi62TE^I0gHnsZ&9LnCusH# zId&yL+1&rU7O3L8g2me)F`VAMKm~7u&47Blt3~CY7z0B`i^_Qx28NacCCcDi$Uz(( z#u8}+hl#%hob8{1O2dZ)+6N4vkOAE}2%@|9sDSz1TU0ne{NpVuKS1+rpb{0*KIjEy z0?f;I6e0)O`RQ`*DeS83mk3nKMeY}SXJ_efs^)cu)jhDw8L3Jr^UmpPZ z7IYXSi0uM$_h~ihFxi( zG!7b}0hM%bxWIngfF))@VmSS{h6;WJn*sGB2_@YOkY_++m>?R|ssYnmRKVh(Rt-x0 zVw7|ppah+I3S82yz~XI?7*205p@O%;W_b%)t^&ATgZ5G=mDk1U3U2Oax210Fci> z4IB^+YT$tBEh-Tp8q~l+^)c3x&I9D*J3?R|Pr>42kQh!MPoRR2!Dc{x{F>qA{Tlq` zoB_yhpnf!n1~q2D^cEEh5Dn^2qxyLUsGLJ@)MG628rSHa|adt3^oJm zXA;T)36LK_XF`K$P+uQRZ&3k@gZla?e#a;SI6&S`JO(ZUTCjK5^l=3hd<-@N>SGcj`Uc34psjQu8nl%TOm9&Ei-ShfQT&b((I-IOt~dgY z=n^d628rSHb^#T<4K@Sn?U%fjpoqp81!&j<9`|72Zvl<{BUkj0A+8=sh2PnuvH|3K z&=N-w4H^ys(_2(_h%hkhN(LnXSiLU749?RzSo{nU!|CS?D)<>}2Gq}>^#!<_Y70Q_ z2W`~{(V%t;nBJnY0z@BgQJH}fySr9{QZ{I@B65=)q~?VxFW9>&SiB1o!|B}wDtH%c z2GqNVo=ZHWJ{JOaRzMsb#uBcVpli$sR%Q(#--C8Eg6Qr&Dque7fE^J3c#BE}YN%`i zg$jB{1*GN$KMy!mBCv!CNDODFgis+=z-B;0m%>;rq-0gJam zVmQ5RLj`Yx&47CQHN#8uVo=h?UC0T5ya$?>0MVef3YgxaA_1a7Z50&n?%D-Py`YP> zkPA5uke?kmz}eXXi=RPaIQ?uw1wVt$fcp8RYY~1Qe-MU@JNy9Apau(=-l78LgBmQL z)zF|s3~8|J1Nj)eSbrhR!0^J49qeNREItN_;qH;>E$=^a~B=!O*C_r07Ks2a51E#mA+yK#__6%y!9K{wiCqO}C%mxk`4J<(e z62loZDpUv>uopf(GL2DMqh^cEG+l6deG4yupOfP4&^)<#bLD?mPW zWCiqZQ~OaOTjH1h(YL1PqPdW*^o5Dglm zfO#6)UITfy1LVn=NB{qW$_gx=lwe_C!0Aa5DtHoX2Go7a}kS9T74Eh(AWda(@1gc0rF(Q18`h} zj`%|#Uj&Ka^dt)vJP9@f>dBX-IV8ul1;}%tIvhlU>Toc5NPhQ#zGP)ws2 z@fx5&$YuoRYS8I*=z#zd!x;#FK)a+UoJa$k0SyFVVp;&?Nl@+t(V&_fOm9(<0MVeD z9Oh}HnC1X^vh5x?rhhPF&YyzBaC-6!6+8(x1M10_-C4xMbe#Zb-642xUVsg>&I*>l ze+WS;_75N$RI!8UEh=DfP{j_~1cj*BZ-QbSy&?WWh=JinDWui<0ZV{@#Bc`48!7|{ z*bHcZkWqnyybP+qK{TiW2h&?rZh&Y|1&$g7_dr2_-Z?t~3WB14;1=u)EI|Mg!x;om zs1O8TGoV56vH)C;LmM=pc@vNY;6>IgDhEJp(8^{Z1_r}#yA(l7?QbT6mR7Z>fRBaf z?NM0(@;PXKE?6y;58i0iqXIfQ6twtLsMHd)Nq)y)g@lW?2l@&q|M{WSqJu09b zexP+zGeCUM`~%nxdsI5W^cIx{Fg-=30!+846o6<@B?zXsK*T|nAZiNX{|em$3~B>_ z78HTk7=Thpz#ni5*@Gp8fW&a75YWa?&@wcTVdSn30-FI%A)s9k5YM%!Yyd?v=qz23 zr$C4Of@n||T!?`IwyHG(BnDkb4rW`os3Zt6F!1+^fmgNmz)b@H~^#( z)awP&&3jZlKq18sJCA_SY^MQ87ic^jM1!g%Fug^^0z`wVB#>!{!buPm?&vvF0~GEz zeu2Y%4VG{RiQx?Q6`-)8uu1}(0S$N1>DGwm7kX0@5?DPd0wC{!DkTsNs+7R=78MB) z4XTu2-bSvJK;Ha#9b73b!QxGj7*204pn^BSWA=R&Yl)R-KYy7PlM_m5Dlt#!1NZC8z34~@1O>P7$^|XtKJi!K=}0?90*ge z1OiA5XCO?VLLh+6fCd7-1{Wx3Kn21Ekmo>sM-UC_JA&ygDmy^*@fMX8Fi#_;ZIIXt z(W~IJ-GjxGATgYt?4W`t!Dc```I_OSL?Wok1sgg5Z*2iLr$C3ZbV64;g3f;d)u5o2 zDA1*VH^A%`6)+8&$_IJ5d5_8hK?Vj!=()H2EriO%2_Rjdekh0r^+Un*7L^$w8q^Pk z1t6rEj@MbsFK&`PJ6_7$u6A@&92WU?TXk|JmOq%zofI=P-!jG_yoo|6ml66mk z#7}n*SQlt;!T@9ns9gY}LG1!Cy+y?WM1$G|h!FSbL|H?u0Sf0+pTOZ9gC(3nVmQM& zf(qdbHUk>Y$OG(1A;7@!;@dfJ_27fWn;0^alj+Nulk8Ds->THxRR4SQ5RfYziF zZp0dZd4<0*8eJq_|T8ML)(uH&Dp@e+7yBo zuo=*h!M`X*0OT!DWe%c2l{uK+q9OsJL6teGcd-^_93bxsK)fr0#k(LeoZc0nf_K4Y zK)s7EwZnRPANWE2_ZF2OAR1JagXt|0KBy`O9q5H#mGd(&ywE-lPVGEcJP8uR=}8VM zcoJ*|)RUOyHKP2w0P+l|z6Q~t`Wj4cQMm!4LG?AvbC3j#wfs5(@~qtpZ~|t*;#rUw zPR}w>!Lwj9pq|ASqo7<4?z@9L2kN_nXi$v|rnjhoj%EYT`@%epRDP`hc{1`SI7a_4 zVNRBS#Bh4@2WW7S!j28t45%kx#sz}PFZ@jse$)w)86Z!B#)d&Os740UTU5Z}pc)zG zX-G_Kfr={7@HFz+ZwDw4LY{$R`U{po0EyuYgb!2*1h5&~ zEh-ft8dN>QJdG6786Z#Q9|p(t8!Vm#iQ)9*3o3XLYzEYmFH8JMj_C-H=Q>+d0zfpV zdIr;5RKVh(>KW!~NKBi6Vj8{6xp;Q{ zH8F?=)x=*U^Acrf>~{0b~8TkLF;A^4XT^L^cIyLAR1IRgO1_^)y-f}V{|iK@G&sF_%aRb z-!oYJ3lhWW-xE~uFW3y6{za;$LH+?%(;ymDO@rwzDmOqhsG3IcC-!c}36N)}KLC67 z2o}$R#Bh4{02Mq7HUsKeVzTrGkmo?vG>8UO(_ngw$_@|>>NvwZjg+NVfIPWrFE~r@ z!Qx4f7*0=u4yXmS4=9?Q1O*h-lP|Y>63)^d-8e@MW`H~js{ z0N~WU%L$aF(I-|qKmoGw9yr#wUlq+V?%55F^)*;L2@=EU$rV)aB-jkNCvh*H4gh%q)N=;WpsE>6 zZ&8WhV_?_?x(^h-&->j)aFi{<;v0|{PTwq`f^WcPzlVCHTo_xvY2Fj?g znJ^CrP$|G54mukI_3%l}IpC22(CJ**&I#e))}rzjI^6(1n5+2(Gk<#<2gGo&NH@#T z58z`-Ugm>^(L)ze<|}|gud_u(14M(i&4cMJ5I$(zJS`#}e1BRAM3K%u<& z7C0&OU6;2F_y%kS+&Ady6j2KN04Mk!l?xzWfZ8Y^8q`Js z(_2(-fM`$~1r~Kk1@{S1lre7umjWeNJP8uR>B#~rcoJ*|)RUk&KJ14YhozkfAWwp(3qUler30q7sLTM-pq38I(@1Hj1LVo$o55)(0gER= zVmLh+Lj_NQ&479mciM@df=ysE;5Ok-I|ZQN0=1n$G^p(arnjh6fM`(L2^Nfyv=ahK zJ0KzCDkB3FtOZxVX(t3ru!6*J25SHnJPS4h>RDpaP5{Vrpf(kV2DPcc^cIx}5Dgmc z0QnG9Wgw*;50EFjH-giS4;D{?#Bh4jg9@Gmn*sGC?zH1V1)IQTz-_{vb__tl1sXsB z(VzhoFug^^0z`ubP+-9bNjpiPw1Y8~0SZ==OW?HQfF)Q#VmO12(MMVNcg9cGh10f3(2%x*XkTVbmC=m1^&36kd zfdCT283-m+2n4Vh&_Dq1@dXD1(plXEgW&@Yq=E7SM1zJ^!1NXsFdsCm0=hE=l%*hP zp%@elpxafDgW&}a1H%iA3*fY1fF&3}VmO0AhYG;}HUlFVSV%|>7eL+ywP-*zs6_*& zx2W6z(Z^d1Q4)_!(>l7C%FVGY~EB0Fb{x4G9npYDj?TEh-Tp8q|0}{jOpFg1ew-n}Euo+PQfEr4WS@{-~7oeq<$vrAB z#2`loe_&)_0I%W%j|o7Qa^40lP0tp4NDkDmOqhsM1AvA8k$S36Q6^9S3{* z4i-;?#Bh501{FLFHUsKudG;ja zoG8!+4fL7>B!<(o7pUM_uo+O#B6rguH3{MbK=7gq(4K5i{C10c0u8Os0C^NNu>qn% zRVkR>q5>8NRi&^1fR;d@22}^h!#5U#yKHB$#4bn-r-x5a!NXuPpdNmC`uG3;_=flj zKt2NX#6dKu&IHq2R4TX`7xp2XxU1D4|g_lLrc5Xy7#LQF%$+ia-aDS3z?jAR06m z0;ad9cz|foTnMVySAe{Z-dMH(dHwAnu-CU>@j6Hhr`JK(rcmm2uo+OVzh-FIqwnQT5SQ!`H)19 zwSVw~i-F48Bot7S7DIC0DJ%71s9~j@&H7GrZd3w z78S5K=qz6pk7M)?Zh-upUkdi~94vkYiQ)7!=;k3xQ#;rUEPh6>whw^(1=@uUqCuzk zg6SwF8yj z-7U~L>K2t5AlDynQJKJnXz_#Cuogd z0vo_F2f8p1z2OcL!|5f+wQ-ci9M}w)mqb+wH~Kuf>l8qzu7FoO2(a;k8i1NTDxj@C z$S1I9fP4!&<{w0ZDt|D&MFlJls{CQ`3#tG1fhvED^$MW){=5?$I4M}-8zhD^aKLxz zQ5fG~GoXQk+^a!P)ZkuCXO9X4$djN-A4G#HeK5U6g#$!`Dt*urYEWKAO4L6%85myh zO$R6H7%ZLyiQ)7l_-a84Jqb1g>Ph5E9^y&FfY<|0NX7mFM1v}JFug?u%m-EMFwa3^ z^avmtzb{vVDU6a45z0psNiX^8BkBZT=p0L*g*owKcF*ZK{TlM45qiJWN@O79h_VV z_L2z}FM-5xddYwaUILo|^U^svs#PNqAm4&^FMw!JGXYF*Q2~pCnhA(l1`UoK2NgQ# z9cT|we6NADN_DUV4oD1V;6SePq^!^Zn*j|R&>f7B1Dqg-X}|c~_Wys!!3~TSCrZ>X zB*PkDlKd^;Bbi@;?s&rJb|RWru$ssK6i%SV2Z#nWKEU)A6$=mzn!ksI8&XZA0Sc#< z3E-MY1xq-A#Bhca=(3pyBj#2`dA`OYF07kV2t*3iQm8Eh+*aUx6m-K{RNh z9!zghkpR)4iF%lC!Bx{v^!?NvAdhQjgL97z7LS9(aC%&V3b_Yt2GrxAIs}qHT2L;F z0*$1704)*)9k36gL6ZSsdW*^r5Dl6P0404;`vUCGT^B&P0sYv@7aR->FXlm7oFZ5} z3lhWWSfM*;v5p!+{0zGF7;=ct7L^Sk&w=IyKs0Dh08DRD z*#V+Ka{{QI2DPO@9VF0D0BF=~1<2D{DPT{7Zlgu-Re;2BdKz@mFr}Ubn*sGSz63o1 z|aowfbL(A7*79!ZjYuk za=~Um{RL0LQz=!``2c>TGa{C861H%g@NHhKlmVg3@;S4Cyoh+1Q zZLk^8fWnu$Va?13?9ed*5Dgj=0MlDkUVv!Om;lVvy^tanR7u?cc~Z6woVw3o@gztL zrzb%d%Tww}uo+NK;;WnvfII;j;Rn&65q>beMdbvD295B;JO^oQVIA<;0rITDa&Xc= zg2l5SF`S+~08TEDkRx}5A8ZEPvxpIJ(ADyw7zU+q&|$GV7%*4Nh%z%U>;$iv@e_iq zm;tE*k61v1UsN)0jT(`(CP>=To8>CWw0HQ&aDwy7)0u~2Vswe?~ z(LcBW@_TFu*zYY^{0GuXI_#JEp)bB4J{rvwQUu+)$c@9*`f@n}B3#PZIoB+|F zN*2YlyPkn!8-4s{2gt{#LG4Qyl^RfYC?8bIfHv=S`>535@N0-l1!Y;-MWw<6=F2;v zfhMG3IY=~Pv?+02SFi%)SL0u%@!Ay9J)*5{uA3WQ_x zv=};FR7%hTp#*0j6i^xn1+YNCjAcY61un!ox2QCLJO-+pK{Tjt2Gd(qIzTk2ZU*@Z zoCHC68zX5~fczK~4EAFVx*v0J`Z0r2KW4!Eh;P0(0ptfz#S5ZA6)%|HqLRUe-W5`q z1olA+x(`xt`XGT)A0!}rfav)^X853;IiyR00zfVYb<{yLsG|<1x2QybXi!HT7E4Ig ziw7ub+^hco?{ra#LHAe;PLD-U>ahrz$6kV62U=PRYHjvHM%Q;4fG&bqzz9CY543WN zk$=ho70@2AmdBuEhLmL?fq|IrGyr)P)Nu#VppHA3-lAdwqCp*ZSRg=J|L;M0611QV zIZtYU0>x-HIJQI310@7!paf7FC;_lQA#i{n$Sa`EJBS8#-of-16$uax8a7Au;%|@_ zK`jepFLHpq=syeWMIUr8f;tu|;*iN8P&w5-MFqs|3{ml*)QcW4FXAh9z_n}V7L^a6 zBmo*X2hpH$b1=O{i`f&J)$?nf7#(Fi^_0_1J- z`fe^N4!He@NT(M-egKV+gJ{tBIGEm|asxykZ&5jc;_-!HKbqk5 zqXDIUG{EggL?liC`2jQz4x&NLK`^~VWd?`_jf1234f}~s9Uu=L1sz}IqN0QDK^>eP z)S%RZ8ZZwc_hKNWDQ49IzQYGJ_6_nFXzUwIZ&9fL(V($!m`9PSmJE=`-V}qY78P`l zso?aO0;L{PfO!m5ingeL+LNHd29%=_1(^(`w#dM2Ndo~retA&)oPohH+%YWJqwx)R zV@2l{6>xX4bB_wRkKDOO1w25|-2xSFQ33Bq=-s0NTG46v4N~vj`0?kzNB17Eniso4 zhun4^f3Z0P(z^gJl>}Xo1D?NZQ31Ew!M7=a8n(TAR6wf~48QI21l6E@V3VMVdV9cf zAdiE)IWT_nL2#)K?&mdEWC)kqftul9Zg-CgSZQ~NN(H|F6Tg6$0KY(x0>40%fk$_c zgGXne1HWLT0l#3N0>7ZA0KXt3=su<17N|uoDj8iZDxl?;9WE;6pd)%ga}b8#c6opt z_whT(n?5QTT`nr+`~r;p0-gf=0)Yzr0+9wD-JalL7_>ftUvrKMXo?xMR{=B$2|70q zG*Jawwgxh?Xtm}1~>0iQk4-J$}X;OTTxaqvmrq5_($-S6=wm%*d6MnwR; zzs#r8MMYtsKDYuYQIXiS6139{v_`(uM}^0?^WzKt|9}2>`>61Ebl0c|cyyPjNceQS zs3?Gf2V}8Fr;Cb*NAeu7*}GOTF)(;`-h6TEAIMu68bB@wX$bI1?g4A?>GV<2*tHsD zry3|Y7Gc*1@+nAP1hPJZU7*9Tc1nQsWntF`p1N+==XX!d`=0zh_dGlA z`D)(t;rF@i(|OxR^Rh3$&t>1v%buEtJ^6hO@rNG(#SUm#8bpHzGeI;c3C%m8Oy|+N1#CVf>*<2iWD6vlHXZ@x;%LV> z$N0mbIEUoj9&lcU`VeFT$Y&svK{VLJ}NGt)wvH-Eb$;1F;GpGpwa_C`D>6exUFaJCm-@rm2l0|x;*>H*q zBqeWAfuzhmD&QQ^-2xHshN|nH0+H|D0+C0GJy2MK3NKJtg9fv~EB<@;sDMgD!*9Dl zVf$k4=Rg0CwWzd%h8jRo2DYoa2WnQ23V04 zQ0`FyDF7J+GN8eRLjl^wDUk#Tf=q#p%7fT13;sjan}IkWL*3oSg)Jn-q{ zK(Z9HZeb@VvAt;d4Jws-R6tn;ykY?y{Vk9HVZ7j>c@Y$};DxiG9waDux?5DhYfQU) zR3PF#;6MNcJ=pK?;DdC{N?2b`fwcxe!4I_nsGMhDV6d?&(dmLRl}Z%5dcdNF2P{tTPdm`? zQ-OcdK^4Y^hl~m*Rxp;TzGixD168u29;#$M|1=~eOs|<`i0?$Ap0FKbhUm+m? zQUD48kO2)g99Gb)n@W>Gf-uuTWjD6)1?6DR<^zoAHh|MB48DB_;!jYKl>xH^Y#^w>DgdW`Q2AA{>m|tXpesyYxPh~Pk4grp=qdmeVih18 zAkOVk0k8H2O%#CAHd0`K+B%;94}ii2RK&q70~Ps@q7Rh(cfA5x0}i8pur*sCwGsAJpn)WB?Uv3?R3IQUFFezlf5~ zL6tE^6uYQIfCCF0PP^WM+zt-?&!0i@>jSEQT~rbpY&hV-UJtSk5>%kl9E*t_NG84m znFv}(_hKQ`L=R9AAJAaK5d$l6L_j8jJpf9pps_G$0HBM#6auApXpF#p3s2ObeNV6= z5FAe~pcWG(+`vu(r3gfeOJf)4IP{&M`vYH?fHSm@iUcS{D1cIg2FOtmZ}zBw+JT^g z2ec#;W&8QKNdt;J&>Ri8 zp$JV6UcD|1u=D_Gb%JaKwH-mOfzUnR)+ngB1Qq!pd9W+Hr>H>IkVDe%i%sIJ3^oiU zbs(34!V%Qo69A^qSOP_UI4coJV3z# z4o=Xv3Q#I){sAf%J(_`*gK=TTyIt0~FAbF3* zBOu!j!y@a&TF_a%oyT7+b%*qZV09>%1~unBpj{yeP;UcNCK`U*r3q^8HopetCs6CX zw+Gzd12t+iKqs|=RCzQX)Bp(>fG(32Ewun;5d)B~zzr@5&u&4_?m`aF?n(jQZbu2< zZchcDP7rpK@aU`*@aP1G6sYgh4K=)b3beHfZQXY7L20daK^nK9k_=pc!+VIZ9wW4n z0!1$a0|O{V7#Ki%c-uiC#orXg3+)hf`luLy(lJOCEFD`QrDF?Fm>PgO4hkftW3YK>y)95i1T`T+ zWiY4(+SLMX#)8r@I2*x6I6Ak0dr6=Y1r+6=!V;7YI$BivA?X-IG4QvDg950x1yUn} z_w%@bs(==#Zs^DbC}qQvX9X;IR)FdsP>X=S7u4nhc@oxREdiMUO8VV)o}C9g4?bY= z>Na8b>aJnu02NmSpy-44Y`SYejgS(Rf)_$!;PRU3^-NHz1t9Z$Qx!qQU_xIRrqCaq#G7xd1B;p%KprD%e29V;3YLfWimF?SOGX zr7bAE9R`hEfs$PJ6mb8EpnBN&lSktlaHAdG`HMTxx>G(HI#Rz-2th*cT_AL1p{#7Y7|dbPJ@`>xR;upyCQz#wURC z1}OMod1L-lP$Ym<^g_Fnoj#zl56Xd-@fApUqXHCD1)#i}f^hK^7`hd4n6GiW3S zR4{t}evxXBM22%Z8N+9fB0L)wqcZ!|z!!95Xg9ggF zEnbND|Njp@7O=xbMZC*JMO=l^qxp!&VUNZ);IQZn0S%~?sDK>P-L{ z4esz}ym)2@D%y^}SZ52OLG7n*FyR1hoMnJCMtF1{^k_b);L+`n;nDnpgTEEDzwtHL zIgB6$VDrG$4Y(>30IBZ;rMI2)3!_`L=5up-XrAD2*~GxW01M`wTO&Wm>5BL2cxav| z@rH{oyjv~&V@0YSNHha3x}H&=C0OKxCD;^DvlA|}^;flZ7nOuA zP`r6`xu|%6M*ClOql!1wsCYm|+CZ|e3&37T>t;v;4Wg$tqsj(>WxGLZVm#2K%)wF~ z-3*}M^gx%D1j&M{UvRPk4_Z2aV-Vze9~C^Y1#Ry&zX1=1a(HxtvQ8(cDbZO28uRyo zq%LR&wG&*Pf=broE-DV7qU)H8iai6UC2auWff$fc;NB1wjTf%qzyP-<=}2Pyz(0_`KsnW;`2`z)`#aG60wC2OYr9#F3Vg|B`2PSD z$Q9s})}m6!2yTRf{L2Wk3)I~OC8Pup2W%O*fzf#olw%7#c9u@x@IjGvcDEu`KSf(FY=Ek46nXkA1k_F3X zAj`CTl$d>MU56Z4CYA}w)s?mGEo?>4RlqVaY)CRw9Sv9}^Vg|?Wu%a0xaL|Z{F7O) z36`m6Mbe|9c+9gOZVL>2;9nbe z${egm4%t7#iYuQUUD09-meEGmGg($bI?Tq>9V}yktcSaBXQ(H z2QHITD|aU};%)|5rU=;uor%7(yuFtTz%o(HNFf@#clPw#lf^2)G9QtB$|TGBC3?ey zYOstiBa)uGcP=b3xM^GimH}NR4tD|5-d81khX3lpGSy5B3@;}_2c$tcq6;+O03P$_ z-`4^i{D+hmFME)bLGu(u;eIrQ$w&&j89>L#f%1Mbnkri)Rp2rmD&GyIL5(Cv28NfS zNb2|n7(i2PU~AFUy#-xF37Z`U)e%s0(A6D9QU~`f=;9Z!sW4mTBdJ32EdO?>sW5fr zNb2BzMYl2tNfAD;Y9Xn^=T#;ob@U>b0v-5c0F{_vPoleT6OuZ7p6xKF^9GsY7y{2S0kUdjm>k&;$T?odmpDs3MxSGyY;mfOdWoQzE%QN-5H=3GB||4GjudeIDVl)4cSD(u9sAR}ae*rQn%7kSoD{ z0gZYbYf%B|X9SG{M1TgzK~1YJh#+Xh2Bg@d^Pxv)p@2tcAcw~;xN)6={M&x)11&4r z1zJb4GmMpi!4b6Eo8g7glRy8vTflPyoh>S$6InpX5KKeM4X7U&Uz&mDok3%@;Gzgu z8wEU~0P~Xvw7DPPv2#=5l4m|ToU=g9@p?!JAKdc&!lNvGeK0 z`{KP*PQ3xke1z9!Ad?>6vNp=y0jW*bBFj8mn7R4`|9enfR^kG;V_xB3Iko-PSsp)in!IQ~LVa3kJowFY~+WU^a*4Vcx0%%1+x4A zk^@1bKoFmTSfJz#DiR<`9XgNF*#jPa0m*>|kf6zg;Uzx{IH_YaUcobEu!La%O&As) zsQp0D5-CW;S$LrI1O4HmNc}+mmWlA_xA54B(ia2`kihjI_XUk#LKbI3N(yjV1`R7U z>;aG4Lpp!_+Ysf-b)={uta>GqYG|niGCi#shw-ngVbKGQW{_H(N&{d@p=k%C7&OcY zqA}bJi7V)sL1zziC=D_Y4v(v3XoUrf76p%;PcLn}z3S-dt)SeJ2?;<2kDdI<+up9+ z8}kX28(TpGK_D4O2tpkLDy~0+k`-u&Er0k)e!YYIQx5RYKBxehO_K(vO^_-?Q4Dnl zSR^4~wFQ)v;Q1KlrI(-*4=uPr4)Eyq00$k&NRMt0 z0Z`u?JQfJ;qk;ww!NCYpj4c?$z_K9i*kmohvLFMo$wH$5WCy4`Sb)@jeGMMh>4D6h z5Zya(d?Nu`rPEmhngR!{RR`TR3=#nqQy>~V`_%cs<2VBY3j@Rc4A3N+2Ll7cE;9xO zhMg)5pbG8*GXsO;PLTWy?dy=CHw_O~kSNHJ3?O4b`w& zFff4gQmEXN$@k6cHZKd>M*}Kxd1}6BH4V&K8viC?XP_Eh=|VL}Wm# z?^zfa_#unq3_zWV11t;-Y5aLTDj;X2@fVzA0IfC!iSldosDNqB9+eFsU79T_3t*~0 zfEiHLAW@KNFs<36G6AZ(0jwym2kafV*&tDnYA~(Yqf!7>od8q)0?dG#4H5;Z2Gg27 zDgjW{4q!!jJ>Xz~n+*~LsRq-UJt_uJ)e11xpdf;)28n`HgK5nk6#=MfP&9+X1QdL5 z)gV!jYA~(Yqw;~70o*MEB?7SO8(>SI?goj1RD)^Iv6CRx8ocvnYe51S#MNw3*#M;% zKOmVvp^@1D5(6#i1JTD1IQTh(`#1$)Zi`9=NGT}4A8%1f zfU%qRfW=w(dqX%G82B|QJr$gsTDNDlmf*Oa2^idPw8X zp8}5RH2!=@ET-}2w}2xkjlX`5iU3$~{S*}j2%|^k0~1JleTxd{mh?3K{5jzG0h_khJg3vof> zpeZ1b`2P$18X#>NbHLIdV?olOR0NU+tqKRnmgW?QwV+hR1WAJ+Ye9t$%z2P#>;VTo z$Q)46ft&~OI>;HI%WFV116cnO$OR+4dsIN;AZLNZLCykQJc8sbkTl3RkTl3yAZd`Z zz}9I(Vj5h0fQ@ZY0a=IaEJ$*KBm|H-poj!H3ltF`=YX!?0MVdT$RHYg(0}h96_7Z{ zSs-zcvq0iV&H_n;i~~u7oCT5wISXu^<`i(c133$9oo0&)$U0yA1GOZ%mF1U zkh4I^0^|(P_%VnE)kPp0+{EeK0~uHD-2xt02005Pj^r$`HVw!iGRSz4G{{+C>oli; za{5Q4vIvOI4HD0;z-T{^>smk50VBs3nUG47T7wZNCaD_*#gdK$e{&}Y>ggBs3PS^ zP#Od|1JsoP(V!j*hz55?diQ`Qra{gEiG!R45=U|tSewQaaEAuuERZzFSzzmsA`w(d zf$CF`b;!;FN45r{pn&B>P#Od|12oqPqCx#R5DjXXf@b+a;vi>%#6iviiT}RJHEmxSC{{r2lQjN+2T`>IfV6-ogSsKJ z${;PE+6bft)JVb9k^s^I8~y>&AT6MJ3#0|qQo+4KpN?DbCYvLF|g3XpPe zo(APzaD9myUaX+72X$+}GnEA(<>0)g(W3&Xi_w&W699Pfs2j9uP6Lu9kz;@rlrBLg zCV+;u59i4Ih;a{2C!D2lzE&R4#zD1%R|UfV3Hav?+kZ z1o$;YR6s%>Ktc~dS_SwucvL`s1BnQLL>_<)6G-EKe-I=DR`h^hgST!XC=4tZ5TYMI z3Ln7qe&E+&Q2~j3fM^AAK=?!&f6+yeH2$IwJZb!|5Ath*1YJ~!wpWY{dwEp&H4cKT zWCvL;335;xe?5yz8h?I_ia;8Fz6glvqw*n*Ki@^=K^lL(R2qN1U>bithez{~jKh%m z?amsNC!nZ!(e0x0q|-&^Pp6B@kK-;XpwkB#x?NO$bh@Z~Xs%KDP|rUNvRAnNwCfL85m#!9LHT$e*FE!$svzmy60BD;Jf!{FA^QC>88-QMqU3qH+f+P=cwwp+@CC6Lh6l2{?lt z=<-o{-tbVKf7``_kJucxF&dt9_;!qu-}O{ih{~OYNA~>NE`fan&IwTKnL1olZa37Z z+-`tcRm#6%zm<#1Z73Iq&CD>HeL?0xZRQ8t%!AeDPY0i|f#Lub=$se3LR4-eISQWi zFLXIDcetqBYN%1Uh32SRxE+P$40fru|6$^go-XCxp23zj| z$kCOCBb=x|Z_*X5$}ufs*rZO5D(@=eP@GZV9CS0VoVX z3uGBUN^gL+q&$F@;QTEg!7~mnDmy?X+<>If>kTz3*I}hpi5x^1xFPGJas$MB0rU5Z z*K0r(*LAdt>smvN%C(QMFjE9+xdGFHX28pg|NsAYxu{%IVFyovxu~3gC}#$-tX)(d zKyRKZ!EcNr)EJz#*zpb*m17{Ip+0rt098^)yIfR`TDhnkgBHTzO6s_ki^@@`KnWix z^gyRkFuYt0N@dM8DktDo6zj`g_;euLTu|+Eq@hOT2rLMpwa*clk=$@2U;Bf~uM_Z! zhv~Hqq(Fch2C6jLOxLVD|;{~papB%tkWkH$Bk=`&C%CIKqc6hMhr z1C;3uK&jfoq2oh`i;6p_?*;4cfj0|)(lN+e;F(ES$1ws_BErs~@BtNhAu0x4E-LPz zBOD??hdF=`ZmJ6crsgW|FidWLH!WSY$fG?xcjT@E@50W_=ungD@pwK?XZ zQqKU&a|Iwz6@WTR2_Bu#d^+O_AE2@& z0aWf}fNTf#;z3J9L1lnLM~zB7bc>uv;}KABfC2|{UWx~Jy{(7}$WCY((OCo9zQdvd zotJR{MLeXA1WmXdKLm|D9%$rU1WhYKx1fi5bn~cyT*3j>tN_vsU62clbrYz@V;;RV zDhe;SzJp>Av@x(77Nnr)2>?YD;z$H=VJiSK+5xmDvKxF9Rv-sRAi$$DPyoDC7t~$` zrym=be?n9QKnWGJl(@SDw1C(~<;6^pg`gC|FYmwrIWMO94P?7qCuor|WZ`j*iUcHW zsDsjpMwg3skp=lyiV0U%<0l$g{hM!?C+cz_r^+#JAf^!nZp} zfj|6!BflWC=W%DyHXa6_&Op${MG2QqN0CnWzD1AbBLT2eE=oWoS>os)~5#br$L=h&`xov+e!sN0{=lh+4&IXgUkFEAg!PV0Z1#D2KS#J z)`F@nP@nySF32E|p&%b0`~i0FC5U@3G(P&z%)roi2;>!zv?_?p3i3l|2)JkerBe{% z0p#`MGr&azDD8KG4ua_{0qyLCP7i~VnFT17gWD7ih`bG*cZLnZfle6#C6)q^-$7Xi zyeT08BoqPJECbr$0IgiX+eH)jdj&z$Ki$yXN)g>G9i1*JA>BSIA)P)dDuxHZ5!d(= z;Oe0Oa%iY1Bwb2hzbTq2B->fV9!G`qu_NWC>v#ft7~h}=2d8$ zjP+$T_|yR(P+E3TDF7AP68k&8=Q8Xw2DLo3K`l?v0ede3w}4un&@AB49ikGF)+qvR z8yA301?{_isR>%WdK?tOpkYCe<^xQic1Zy=C6utfY{^qhitRqY}{RqXKe;2dHHXb`J-VdqB2QE z0JZ{DK)a|oq#bAR03A*aT1*d376mV_K`U+0;iRBsd3XY(egKu9NLw*Lt4g|kKpS{` zKqnHqs018$QE>sMyyGq^plX-_Bml}oAZHtZ8XpGm!3jA~UJ~dIQE>rz#-bC%=yXxB z05|I+4ud=*0ZO-^HE9fBk3jYufukR^!+IyEEPWBQ2^8EeDhlAmNG>XRX^k~1dJH%C zCxP}cfiH$KN!!8jAkErEMUQ_PTu?r32g3~{LD-Hb{!-zWpoGG|-9<&O(?!MQr6eN* z1H{lf5JTZg`CI0Kla!B&1f-J!8mj==09R2`5B3Mx`H+NL1BwTJ@bV4N8p#)vHiF#m zqoR3>FTWb7M4|KSw@OSyB@HaeU z1cw9D>p-wsFs~t}U(k)3J9QDx`n>_cEm+P1Z)(OJ ziSYUZ(%q`<0C zu>hZ}0~$S3*ar&H{}()(k9eRoHys!}8sC5xk%5{w(5+^jU|YZ^P(VvQ@a7*2P}>Q- z5fRc3L~PN7wElX)`y#<@QD|dF*5mlW6Oe{13$#fCUJeXu`Mu@^rETzB5{L`pXn3?9 zC{YKsM!;RW7mWNZ74U5Y8lX8a{+1=6odBRigFx+3h(-p`1|Tq#+mQo_4L-^ODlUQS zEJ@HFagYSRA*ic)@R5QC=d~AKK$8TZGsZxB*-G_6&e#J!_U8q7eR}6XkQ2d2zU=^~ zY}np*j+YmqJvR#v@ctimkJbYo{2m8A4*p;U%^QKHX+WDH!E~pOio*Uq-*XutIo1+X zUcnOg&uI})&vc<~M72Z$dfK+DI#&12YsG@Tr;=YxC?O;0mD zzW;_mx0dP26+gy5)_oNz}wuwC+L6_gRBq*xfCf)M zr$T{(Wgj?1qCg=6I&0)b9ymlmLk!*EK?TqTHAe7YLIKDW@J2*13vWeUs|zYoBS3!0 z05ugVIz+&EtHR^pOO8#9h6lbKV)Wp51&<_Eyxs@yz2$b@}Ncqd5<5g-vIIicnku3@R|cC--1IIY$do21Rl=N09gS(cnxw^ z&5J3ZX=8Bq2Oo%rXkS71yCV9N;PD{^kL(H#)_tH;d0(6aC64R^oFF5?gZB#H6^92O z3ZjJ_xM~KEBr14xdxAS73LeH>9-SVjGSG1+V=oSmP7j!g;AHO!?yx9$7<&nLbb5f@ z1T&8l6muXM36D+`2~PnJV^F$)+X6n<1KeM#kk|(*xnHn@d;m(`EGjS?CBVCFVc`wh zK-pOW>ac>!9$3{4jweLuI(UFg2KO_-$D6TmIIV33|@d1MS}{1Zg7zd@dj94 z03r|RJA+FUkT=1B1D2P7$b(B5km;ay1T=&kK#Ofb#~*rti#gCJD7PbcsLH{E+YzOJ z;{l}+2an^RSyIp-mB(S^^Y1!qRBnJ$%>z()f(IoYfa)IbEXfCt<_GqmXnp}o%r87T zKYDat@VNZIqw^qWy!D@h2fx$7eW3o9hjxhySpM=W!;>D(V3|`MoF@*0I)g7j4tN1F z=ZD8m(HgJ%ot5VEJeWZT|A2e}>KuSnd;q!NgU7*Fa-cp9csjv@-}RJ-;R%nOJD)z0 z$#sv|@4>$woGm|~XpqL#@LJGNc(><;DcCj0qiaCSPc^;)txfsLd(yMZy?DBJV*gfK+x^|82$mN1N%n; zqw6IyAYVZ^q9vvXj&zCl>l{#`0cU{%h=&`NfIJKtxPe*mx)MnhXan+#D6lF}GaGd2 zFlZPr3`q&7vHZduLy0jcJ#gR%x&%9OJ}CfNi#8sC_`kCTGSYbhl3tG= zh|tPs@BlCLc2R*QyG|FC1E3~Ei5RFNIRLWzgyAKR?;k-qXUA(Mer}M^4v+~iKrM4n z3kf_?0?O&&(cTZB(d!5N&GSLkBg_s4kZCVGx>>+>UjX$2F2GxLvLH$D80-ZPOAiUy zATArorVHR`gN*)yrIk=X#FAvuo$v_3+@qtiykqZ>44RHGvB;?%$Y|3M~kfJWdrUhMt@=Yonm&=448>)zg86Qt`={x}1On(g2`#u2*xeICC;IUvIl?$Mv-~=ezH-Jpt0m_a)K&8|Nkh&Kj z9S=Zy?;*}d09TKoQ*3){R3r?)?E-b|U)U}9^BXN)zJcp5C|2NPu1gNj^B4sKg1H^KWGhT#(xu66B3Sj7{ zlHC3uAoZXb;}<4i1)%r@jYGaroyy3tA9Rh~i|(n64E)?E{Uzwwse$2v&f}oyHFz=Y zjV3tUz?)vcD+*u@AaFYXG0?kQK?*V))Eo7oy^j#-DUKjbB4nC>ON$C+0H0#;r7d z(MzBBBQAg9k2&;-UqCcGR*T^if8-&M1s?o5hoI(u;*U89vgZWC0t;wZfvXR2x&t>f zz$|df2AuZ5Z7lF?7x;V+0Z^a{cyxY$A@^L90jU)WI%o7TcqAD)J~D8pN6=UbMpBFb zW$Xk{#tr}#mT0qzumKW~6eK?!cToXV6bv4{J}L&F!+|wkgn^3DZg5I30UeqMKC_|( zG}Zz>_7B=&u<-bP%VP&ag!>O(kb3_0;N>A69-tls=wxj0AUUL~1v<(i15_S_f(E=D zLmfjvhopnfN&?M{D1iDY;P5d3IUAOjYE(Qxy&G@~+X0l=!FkofqjL}VOf1k?B&ZDr zs`|i--;fUyJl+C6+6Xcx)B@h41!9Av3%W`ZwBG>aZqOYBAUVkSY|BAR&=ONnhZ1zG z8mPhs-JAiEcySjrV%Z5w$=#4+qaC{TfDig}>1t8g$-uzi($%A~3rtT@*$t-WsO({2 zVCb5ovX_B@!J%u7%09607Vy-JOBbYbK0JV2O`Kq%;1#}}A=){|j7L~~$|A8`|OUD|ONg#VW zmZ*Ss_PKQI0q+}f>DU53kJNi@X`nr|pgJ7X z9s*V29-VfeNfpRJe$kFGj8hxpo>pH zhn{!(s6=$QsDwAvsDv|s&gp`7Uckp!g8Tv2jw7YPPWJ{4=`k>X8@Qn4j^aB|x!DcQ zU^Sp~UO`t|fk%luAzKQKtDxiSKv@&KR2(w12+F0P)!^v4^jM3^b66OH(gBDKQU@MA!je5fn^Hi12ar0@ zu00S9SsH>Z!-7?EPWGV8 z3_73*l$qPWxpR$5Dnp++T*fxmSfcs2yGBiW@3avGsa*Bq6fpi*j%$}f<8U29Z+gADB2q5`_L8&s(M z1@o7v`~%Z#RQ`jM_khoOcj(%p!pO+L(AA>C#0W0q zgl1ZhjUJwz4iX@TI(9mUfZXQT;UL`Qq9X6u;Q(IBrQq06APCA!4vrn5rml~Qg=19QUB~3{DGOTU5YlqiYX1setMqP|^XVXHZh=>H()LP*j0ZS{EeofyebB zNwUL5g|E8>oKQPK&CYJkhWJ2{0*fJj5C;}R z0s|I99MBlzgT@d)EQSQA8AHhBb!Uyr1yFek9xA#4Dn-HLui)__aA)#`hqj9fm<#Sr zJ^)YPB9AY6fJ$Q6;0m~D1|m9HR9?IXpZyFP>;%s=fC$hCIjFn_uebu=X(I5V0@N!7 zja{Ob|2LQz7(mGzbXEdr(FkbE7HIeyeDebQJ`LFY8qghJpnb%k!G6${PoQx@(6Bm~ zhMqju*`sm-+=^-eZxaOV?peXaz+m`o7ih2Wi`x@HoyZo*ogJW4%0S&0P~``@PZ7#K z)}k^U#5~rbG7Us~H2)9*uSD#CoLs$vk-t@f30%T}Zi485DD&x_qXM$2YYuqJBq%Fv zWCFF=wy1#4z5$h5o5B1gDqFzx8kMaeLwZ!UF@aicTU54#gl|n(mh25tPONa0?7K#DPYq;>Oh8r)Pd{*@j+ID_#l^n_#lUY_#k(J_+axoAkGKn zFpzgTAie{YfgsO<%0RH^JNBr61ET{HIG{2R6j&XQu=DAJ1SKeOfIZQSE>QUh-sk?pe+DQm!qPP~op<-BfaY95 zZIKR8;sd2k@bc7M8b5Lwc7l56jyqUD%d2{OR6r_TL@0yPNj^CCA!49h1lp*Glu|*` zG)}3xkhBR(9~~_!IS?Kw^>nnTWTT|i6tG)~PN{j&lnT~{C8dH42c<-iU7(Z*vKqt( zxdg-qISj;yrBtwa1DH}l{(z=bkkg?l736AYN(DLC5t33tZl!%nh2Bm8YUzMBjX`cW z0H@r2;6w|m%)yD)5p=H}!;2|X@g&{m;ffOkkueQ$R!{?$YCHpED3|n8^9zC@&_~tgPaac z!XQ^elQ77^&?F3UD_xQ>D7}D^FlZwqMiK^fS)fT6Gy?qM;v~FDn8Ty_*bh(=&H$xU zL@BHVDuqF#ua2NMv+LJ}<~;dHd9 z*g$xoWYy84VvSM?n}FR)bSZ2HO~PPpSduWva8MEj*#%0nAge)qkV`;(ki$THSP}-C zH-JePz2JJjYDuwkxNf^?Q0HtkE5(cSw!7mL?!s_5;(W3$q10`Wl{|_k%gQRJk zgjFGl7L;&0T2xdZJW#UgXi-r{Ny0KGhBPEV zy??0<_9N>9u<%nC<%j(n?Op! zAZZ#WVbHqUt`-$g!s%#H;Xz5l+$c#HG#o`jLxK;Qgu&XdBw>)@pd<=Q!XT?be2_~( zNf_iX5FeI=!R8HM5(fDLnuI}4hbCc=tD#94N!ai}=Rrgh0wm|rdFn-vC^-FsZt($iK_SAB`$dq_ zFG!lk>GvyWKoy>TLEHDcT2w%3s-r~(bQUb4A^ZlED?vw-fJSpbhq8l4UqE+nU>|k( z1{(V8o}vQQh9&)i3P8Z^Z{anM&3ZvKuEnk(A*s4 z-n=u-ptOy+OcZp=QiBbL9&|kmf6F9R1_n^~2Xy*BvWbvY#h`ogkjw>50YdKM3TX$K zI|Xv66VebKSR3Oh56u(c<(HuCza1?q_Zd(c(I763lm9uCND3N+{j)`lhdgA4~HZ;)M}y(H-O0>RHpCX2bbyKt&-h6DiGlw@cbT9nGTYsaiU%Z zNyeb0)X}1{6v6`~w2l^)B@7GiO4ML&SQ0hJa8RNJ*#%0}Age)q zkV`;(ki$THSfU1-H-L#6Y=*0G0WmvL3XsAJlfShL+PMY9J9%ZD0cv5dkG%kcc&8 zVG3x*gApXg0jn#z_dt&n+yXtrZwmM@JW#s?)U*d>G>{#j(jR0FXfz&VH*^gQr>7L^|$ z8k$f+VGMGGOXnKM)JMk>a6<<)?F~+#9b3RtF`zjL(2!5Z9LPjX#~kp)4Jh40rZ##Y z^Ew?Z;HeFVjy>RcAJ9w)cxqz`cv=Y58v)G{fno|2(x7+&(Xcfr{4JmbGU&5bs^yU4 z33MhRD2_mrBH&^N&#V<}#_MGnNbeLC&@=}qq(M_0AU}g<-8_ziBOAJy_OQV()hSu2XZ5< zkcZ9%c7v|{fwer?;M0B3mIo;Pb+xE~dapDsq+L|XV7*2cl~P!f+eM`WRyKncS`*vY z4pAw0=?(#{yMQ!LT;P*?Au1)HbPFkuLsUvZ9B^9i3Q;KoaUdlz$bbPWhFw$&z-6$D zN(s0Cc2Ow>m%c74W#FRMMWvi(V0!+}e9(2dQzu#9VfRJg>Ms49p9OQ32X4lIGH4`c#WfF@8CXaZG*CQvnK0#&C= z0tKHS3pyLxBO8)XZ9sch!2+Q3VZeh$kop{yU?q?m6RSY`M?o7vUicM*k}CKJgck5n zL4ys4F8`E64UZT>X_Ud^_(9O&4-LN*Fz2|2Q>~LMG(XSkLCkxATe+@0j+HY zEp&k{)9IR{0&1OsR_j1k>1+YF-aw5<@IsZYCE!&$poMFoWjb9g;Km>L*3T*6g*u=W z+MsAhq(3o4`V)2O?twHaJ3)IK;T1R3o!wi&qcL4Q;I%m*CqmL2R8Nrz2>^p{QerBWT5;m}7^d z5NL6@V@IVRxCUTkU~udR6abYqpoXVoha*2IBZ3;At{s_tt{sWIt{s&;t{sKkjvbj? zjvbMlt{ssazMX;!KTfoyRGZ_s=I zswh7o3x}w@_~gN_<)ZQdMER(^0PV;)stwwa5qIhnf5bu10yxC_H+<(SA)jOdJ}>}$ z-W+T#I_QX#PRQzgaLj@W&?zdQ)xn_k%b>9dP-g(tbOtr)L0u3~lODAA3`B$X{Cikl z^WgWn20DbT6WXS>ZUHZygfviHRK!;>mRf?A^+|w&y#vzB28A}rye=rWa|-yjPMB;b zXjLa@;N~#MV$d>9kcFTX>!9N&z&mjiJS-urclmo^*Oq|PfdUzPV6g+p$^uZs-bE$9 zp++U&0Cv8n9*AcNJ0Mj7l>0$W;p*~H$!~aRz`yMzcoR&9@L_oz9+oF+%RzhBz{?xKhtU{-!WwemT>!|p5unwK0idP9-CD7jI&f_4TfDShC@nHN1T5*}s8KMF{9?=?h@Ew5LFH6C$1ea@& znCSvJ5@#$Sujd4xX9e2J2eKJ_loM#_J?PqRko|afgSuWq zlpmcnDl0&#VFPIKJNRh910bsofGphsTE)Bp6h13JN$m&7-Jqr3;AjAE00D`B#^%8y z;4KUw)j#&biaGF3&IRaV-7YE%Kn7j_*?Gca2g4=z#qa421{`vpL^-9p4bJ83gRR6c-(x?NNrfRBU((IC!#8&J^(Q~AOp zJ4EG$4aiM!WuPVFA3*8l1t>*;&A$QK`0)XhEM7qD1UUw>q|&2P5V5}-yuY`z1hmBz zyw4Qs?jPWC9TYt9aDp&EXH0_&7#9`j@@A01AlKXg?GFQ4h}aeU10;@IY3yV;c~j~i zD5w}u90r}A=F#{DR4{>?C?G2pK#ql+v;sLk&A!VAe$O&wje189c*_&0Oam2}pxgv< zC!}aS?xF(P%LiZWon=og1x~7~o_AY6{!%FJ&;{n-OxQ& z88!^1ejpu?ZLpv`rvYjtfg%T#CM!T`5?rZefYuv>g*(ApR=`6iE-D%DWa-g(1e6-U z8^^#0kQIR1I3OJ_g4q}tY#8`kW`XiTbB#)YHUE6jiAmrCibOzL)(Wg4SI|R5UV}GJ z6@Yf-gCeltb<*nuG)IC{4QPB0#3+yjE&1(+`3>Yg@X!vZD@d%fK{cq0O2JNfkQ*V5 zBo~zmP=Hi`5;)}WF2f(W4EsQHBD>ZyGcfD~9fIq)6SM*I#esB4Yh1wN_<;uPdNO9fo54j#Tf4WrJ$xR z=$tQ*i@`^2g6>%Xall7yDu6-&+Un>A?R@Pn0o|Gg-j^Dp5&_zX3aSo3twm7bhS;yy zqXMc6KuvVed?_gUK`kUu(;c+64OH@g_MU-?mt!p|+d(vRP#)CS1nqzW?F9o35%kUh zZ_|Vg%HNv}8k7fbjp_kQbU~UYpnW=wmG2r{H`e~pcBJD zyMg9`rj_P^cb$PcRUjKdBk~Ku%J!%%0@F)WK!?D(bgu!=JApz8(j11gZ9#D<0UC}6 ztvUv682~Mr2MxzVwwG;D0qr;f^df=)iD9;6e+RLC21NH7ec>~-)2E{JYqJB^shqNJk zYg7tA?TCaIb|A%|BlH|PjyZII4@5}-#S+LY@X!=U9-Co^{!8N<&`>(~h=xv3lMZxF z!*NK{78Gxg15;tO#&H*w9H?kE!!Z|?ED(_iA~HZkI*3RE5vd>|1w;WCqY|zVCN%&{1gFd8#%n#x=;grx&` zO2i7FVod=yb5SA#3QG=9Sc2lE%LQ~QE2yUd^59`mC8hzY>p(RI_$X-!j~#!S>~8%9 z72K9CDiY8$3rn@o#i8esS$Z_qs8}#)@ScULEKvs~6b?{w2U!RWn0f}}o&&`09W1p6 zRly}G*doaJ1t5!1#ZfH!fBlmY?961MEduXFJMN+aIg$X*03WrTc@o@e17~zbaQy~8 z{|9{EBgp-rsAlx&g!Fg8?gpLr+F66tj`?xSMddrgPSEZTP;2d{NAoWRNTmWhR_}R9 z2q;iq>`VbAJ#ZNhQZp4&6*c^1=x|YaR;mb518!5m)j)g?IbQEs7wAp{MjKGvcDSfK z?{ZOjt^zvf`8)dgbC~V*P9GKMQN-QgF%NKY5~2d$X3qgWgrXBPK;8-7?+-c%33NCj zBw<+|^x*da9~h(oN?IDQbID31LCs}|=5CNt{OdtyV93XUDkRXZX;4Q3a$Y*3y@qwe zKgi?Ys>1`+_XY(!sBaDmZBQWu=7V zuM>RYTn*^NIq)bB==2cLDdpytPfNzfzC8aF#NU)bXLlX$Z$~nf=Wfu zSvrt*2!9J`&>Pen0iUM_zF7xc6-R)oYw*!QAO=W3gU7xFKOm>WgN85yKtnSgFSay; zPS6PfO+13ntc3=;MTd)uc|(ngIYWsTwCDq`x&S#0#J4~@g3F`Z0X%NM0Cc*LCZuu5 zuQ>(Wp#mLaRscH2ECJGw05@F0Bc2?f86>cgosd&YJUWd)w_+vmYxt-XfUX$?6|A5; z9>MKS(5_8T0oxhqz%LkSz%Ll6z%S@2z%K|I=mj-ok?I(v^CUpqz&k+!4GK0$WmUoo zJ_;WcZXAeUc`?0H6LfH%#No6F!5+mQiIzu>A zTsnO?K>Z31(7+l8==u*14v$XI!IvO+Lx%Fe<9QxX_krjm0nwn*Yvl1lMEb=zTcfi^ z1zej2fVv^DN)d9rD73o(jy6ruk^|^rrQpO2I$W*w0RQ|0{M&x)JMbfyVHbEMzoR|q zU=tUW0H1CK&u$LS?f?$Y?g9bN?g|OtZU+TWZv`CvomkFx0p+g(kLC&vMrf0ZzXfzY z4Je5Q_;h=4fO=ULpbkqX$Nuv_av4CwI0BGESV5PtfZC=KyQ~-)7&=2#R3IJ4Pcfiu z20f7qbh(NO*fj8U;Glzupr&d-Ox+0@^@J8qJHR?Ybt`1FxCT_!g1cu19?i!zJpP{q zwei6{E%^9;56ZZ{;|_4CbRTq4T{rmb6_9E0+xx)hZ-PvLoGn=ZN=X&4b~7k1f!ZUW zd0kL=A;JxM2u&v>JA#6&0@Mxx_eBbJfo(h+0`fFy90__60w|ym<6u9)qvDVvr$ihS z9^hjhp#x&jlhHsa2+>|ZZGX~VfAbsg*fH#EuQbn<`?sOJF1 zJowyPSYckHqT$ocqXKdQ2dIYtJ~0>UEU1e*L7A_!1T@_Pt`GsBCa4 z3c8t~+egLX#p)y$P&$F#X9zkk4&+yu-JoMRJ3&1V&~dX+d%?XNkOX+%3EV${^l-qJ zcp$6F@ue4R<~s^_fDW7PHEF%|vNOgm9{v^@v0k=}Ixd&Hy zcJLW1R>xeA1qV&WVeom`w6vcYtNr10v!4a4{numYd-R%o!s?6wxHHI0 z4`ifIP@Rj_Ek~kZK>`{cBF{Z!q)+VW!yN7yP29R&*r$oL`n{6ggQ z6`;;8xP}McU|^%-u`l2!r2G9sJ_Xj#M6O>U=PiQ=^Fd=InEEHc^xsb=OaBF!{`utT z{{Yh;Po92(Uoih;(ckz6G&KcEa}uC}QvuX9(*TvD2H-v%s4e9H8ft}1Xn}g(-H@YH zL0uW}QI7$jVieS4R)Nirftyg^3zI+{x6U3F$gCIiu+q*g;H^}kJ{fr21$qk|XdDJK zi~+I?OoPV`KwAyLV-GGW954FAK)oe!2@B3!pkXM`A*Y}g3wY84d>3AT2mktCpwVJT zVGo()2lduKy))2qSCBYThZ)kL1RbgX>OQ}S3I?qcg3a4b0WaPHg-it~j0!qjRPsSX z-39RTOu_d=Y9M#Cc)CD}8jpYi_Asbk0{4Evb0`U*umWF;SK!fU1PVg%H5n10+ZT{^ zAbka6G>KpjA>Uky-DgA4`*J!r5AwBHC6;h?+TJURmlVfn47O z@k9rNLcT8qd^|I_+X}wxqyiS-pg9@Xyp0&7JMMuL?~s`o@R9Z4mW4%^i;5U{5+)zy zO-N9HPt`Pl@eRL$7Tk78`14kR)XzQzEE&s4K^G!Hw^9{5@S9Q?Z-_aFtgFxkHnY{ zZvPT)U;DxBKx$vpuD%0x5wX>I$3aCB=<;1~dyrs#6#y&m^<%+tD}gaSi@&~v4OhQ- zAA_kMGXD)Kj|4#F5jdNGXAWSOn1TxzP#ObY>(UJxg#gc{b%O_cU}IsR^)R3d@j$I} z@ZF*n;H>SUl5osLB_2Fp2x-2960!rRWbpu>>{|f7)ugvZB>{5VR_D1Fmf%w@eN-em zTvX!W4)I$&DS*c;BGOKj4!#LH^Mk z9{$+}YVUv}=|%V#a${(4mIv*hDe(_z3873r}clX@KjT?hw$V9jF=t9fb|5%_?9k8$mS`sPzr94&}aUIT@OH8iei9~z)w1f_RK`T(us z0bkDvnqLA1EYejXpymX49t50Hz!S&dg>x35J`kku30X&p=!Q@w#efqFa^T2)f@A~* z8YdN`@gm6lGN^q3nypsR03|ob)$^c!19Z;0y9L~32lXcdPy-8`qXIy!HgJa+`CKQ0O8z^r=vs*p`$UWfAJ`teo z76Hp{0pPp*3ig5SCj(DPy?FEi5q9~YW?unlMyUd}z#B9j3#zd}nGIwCsCNy@Y#=ts zu^>6nf?ZIm0ohpr>f?jE_t>)>s4EN_j~(LS2U@KK3BN_}N5fBr)bs}qI*-n4FH+vo zKlGscTRqZQ>Nq`1$Ad)UB0^p*KMFq5cA2jv@qCw+o$68cC=V~#$ zD0KSspI-xX?HOos8q(TZu)QHF1|S`v!7&gGDoa5$sQ3cWpkfPLfP#nw5D~yHz|Jq= zFTgJluD~x4Z@@2*?!YgQAHXkAp1`jOS?9&Cxkd$I(h~5n8o%Zo=u)u|l>*RuF^EZ^ znjivP_=C>10XZ7Ha_vPwG}1IWAbtRi?15#wp|?|a?*ZSk1uA<%qn2F|WuW2~#03?% zppXEKEJ8*ar+}*&sA-tZ98gR_Cgc#~^|1A@ps`=@9&N}H2hiL`XN`)6O9$w-adS{a zfT|miCoDi5kgq`;@a{&9E*}+hP?Z6`@InH#91VPU04Q)lj)c?=TfjjBsumzuSsiy# z0j&iFt&T`%0FV1Y7quyY#(2RE2+*KII!H%Ghl@%&WUK+y!aNLe0@(C!2k=GN5Vj|W zNAp2O571@pkP9V!KozS6sK(`R>2iU%5i+t4awB*|6{=IfO z75vI&*abewm{k(Ab__hW10IP7Etl$sTp{MsdC`M^y*~$ZQy+L}7(A2%nJjp5OCL05 z3~Nt;R>2))1Pyf04Y)}Np3)F-=qdqet%1#JbV81m10`oj+S&uoOrVV;^TBfz z(6MUR&TouuAxH}$!8;T@K&>B8PKLIAP`5&Wnp5DNYXRUGn+HiE#A^iY!s~`O*#n&H zpnKVwy+He@VS6%SK}inWZIS>bIeSpH05AR503|sCpKeg^ryIIl4s^@(#fOf&LCcYR zEie1>`(O5fY>fb~i7SAoK~o-Z8mtEy4&JMn0SahPVdl{dy3h#fEN#ewx(pA*MgrJ= zA6NnfovsB+px`NdZ~+T31)M+=KnXMfTLMiH10_)KFeEsYg6Bf^Ko|X?Bv9A{3|Iwd zg(YaOLdJ_?9Y`{T*yf{>;lb>|0ZymjrAXZ&Dxl0>59(WjVz2|gdj=eB$n!U#(gc(~ zp_?o~r4%?-nu7`o=-q~}9x14s2?{e0pY9kHa6tf`OHqInSfII_&OP8_$)__$r2=GX zL5Gh@J}B>i_c}p(tgsD2;M&%w7Zih?*Z8-c^y!pQ@#zH3i-P9XUK{{jB@5o_0*>U) z5EbY!DQMdQ$kmYcE{FxnORz;;pg;xPLkjA1T7Vo2b|*NwNPv=y0;mWDg$c-2h#eW8 z-CUmCK^&glMFPIvP7=P|K?)$ZfG>qg0JXru3pcIFfIBc19q`>3AjhNJ#|h)((FLte1eX^+D$waQ(0n4OZU@IZ z)~g_ER2&Sy?E(e&3p-6vA_1=`uTc>ImD}K92LpZqMt%WL0e*o%1%81@1Ac)-2Y!Lf z08sS{Dqi_Dmw+P?bZ>G2=*sB?P~95K~Zfd=a2Fzf@_0BLXb`lvV{yl#Q;`a9@A zF?d_Q1t=|o3Z{-0=rxd_c!VTJ?gEQhfx`qPI1qjUsUYAdDGWb>oY2vt0k9STmVo$xJ(sI`12cv~l^Bt7n;0$$Az z9@d6?Apj9A9*AfOhmLoH7u$nRQ9x=BKvE=ZKFKi*bnz*ujQ~oL#APvXTL)U%9*69} z1Xm!Ci#Ry7>AU{Ss#$mSSAWcEg!f(j#6pZ`` zo>&Gi6$P)TlmL}4;AZD>$ch4}=fO8?;>vjfg$euul?D8okU9X=AO^U+9I{1vpk)WnVM~e!`b&%8x@-O_n1W@dQiUeX~-=jN51zf;_k`ZR}p_|*IJD9_x zyI8=b+gZY;J6Oi2J6ge`J6Z#@wV?o1Yh-|8JjJCGRNr-$fOai|>j%*K+T$)N;9cSS z;G+b%OWk7VC?_JuL7{`F20@;RK0Lt#l0QM-!&%-S#V@GZ1II7OFi^39Tz_zTb_a8K zb{7lyb~{V>b_Xl?c1LS~y#%UA5ck+GrYK&*9(N01LzSR55O|FR zMnwW$?*!h`0X{_rTp8A=7(fq~09A)bB@Otj3DCBU4j+|xkaxg4gO0hV_%n3)sQ7_I zzyS`fs6k=vhbT`RJU|1euu6^v>NaqZ0lR3JGL)Q(F4`7Q!nl)0#cGk|#D`Uadd zz;j!mW{(Fr%u!l#zn}pRP8s0J27E~|BxO`Uid&@d-)7MId><7KP;LY~N zfvgdd0ObJ0xme(ZBpje*1-?ccn#o`_;xQK$cd&aw^#p?lXxA(U)WM(y`oEwBg#gG* zaIW&`a8YrGxDRu^ZQ~ozg~6Z@0q04fgA^5_gu@aXgacVIxm9$+1yojstAbU-;L|$?+;4^*Vxegb zUb$rsTC4@ClR=5n0>lBeWkDPV8-^0lnmTij#v|~k0rv+jK%;Sx?mMI@@DfzpQsx;@ zI|USMpb8A+83^42KK=~q8F1x<@C=9x^Nf!T*fa7V_k+Yi?pFYDKm`YgqXG4dJhEq? zTQiY%q=Nm?42d*&%8~&cJ`IX)_&$3s@L_w9=-b`%QU{07OCdsIM90*&)QY@Pzne;qw4>>#%x4TC`P637LIVaXA6 zzc45U!K)g<##wrBz(y;;6Frbkkf1;XOM?a_pyLPKJt|-!&?r}Diwbxs7IX+T$kuKK zP*Mgmg->;kOrw(xA=_I0HhBMJfbTp=C`A*h0gTppzXu z`29ia^*F$x4E7T!?7=pIb33$*L6i?5DJ$_I!V;>w3q zDT3t##5g*X51i)UEJa-T01bB73S?r-2NFC(S^1!20rm`WB?Rf+*;K z@H(J8PdNe25HD1KhRzS&_>3az_E z1yq57${DaKQ0|9}N|uo32B=>#$^h_~D9C6mWdKMROBrDBJC|V>xQzh1F&PvR0iasj z0n~5G02N6QNS*?<77l@`GEjXC5(j&Se?3?XRJnqxH?T$Bkm(`Nd=5z5v)jV6+X21{ zoU#<}WlThhHv@SEv|w5u8i&NkFL>qx-0J{0Vhcc(Yy~{hz-O*?3L^Mhppgn|%>;44 z&TQ=rb1jP+#m4`b>4t(l>fek~cB*@#~;|IVqQQ$ESjTaH1>(Zh3uY=CpptkuHsODRE zbb_vg2M-H_#>zXvTVp}p+0lt%>;a{Qpsfs7M$xv21iLI>Ox5da;F0g?l| zLcxZiRM?|iL`h+-)MM%hl)Xmb#;P=B_Upe20LW>&YBly5uP!|m`J`3K@1YWFPq9On?17_a~!AlyToz4;j z)Ps)Q08b`co+xGCzz98X19T2YH)zfjyc?Orqgw!UsKE#K2gs3R+3&f}x@C&4$wYNm2;DwCEzyCH2rJw>T>unK3 z+Hr;k29M(hI*`@;Fo&zjfvI^d;c@%`vJSWmY^M->|4js_F@!Rn0v@v}0j;g80gb2l zfTo5(LxzwY5uhQ%Zt!6O&}mCCVC5O@?2`l8cSZo}J=)s`I-}!74E^i_hvyo0y7>NHQg{pm{!Uqd);XTH^vL zNI;$V9Um9CUR(Q1UJKNIiSXzJostAThP@Xg3!V-E&HX`Epn!JlgQoa*zW)(DJS<`WuXABh+5hoRF2g=^1_p**pc7ShDuIv0H3Fq^ z3sA8KI`zF9yp#mgDB6i|4Cqj0lHBoA@6UfoprCoZ4B>T9FnYjZ%mEx@y`VlZxR-+x z65ttp@RTUHRSH}7MP!)d>izlungMpqGU)uv#y1h5(H795lAt;c(hP>CH#3m4!A*Ve zV6{eCXNyW0SoIVY4=~-M0=`eZ8%l!~c%?NzU_**v{uXx@&<$eHNp}r!B)6!52B$#l z;y^uF5Dgl40@2`YvBx1pLExx84jJ&#{F}?*0pBSL?V%wBOp6MreGlq1K{`l15PoM5 zcq9wdsREna+X7t_2yp>uLJo9%FxaNQy$9|9_ij-Eb&NfFA^r9jOXh=WR`8V>0-$j%uq1rY58BD;gs%9(*kQc~JOB%_ z0MxewTY!9ESnn3_XeY=rPzC!!d;!=pXzW2HyJ4%HupD!h*8G48CC&mtu?yLY3_6i$ zN7+P2jRO&d(?I?Qt@88e?SXchDDpvkaMX07MhP>hT&`)@A8E*=I323NzAFS>Og zxyvlA`2h=xAG*N@dc)EkD2Ek*;~7+HfQkuFkpezmG{OTZA%Uh@!RNX|jyI=H`uU~> z%68!Rz;Gt$TxZbq2e?Zt;ej=%A%oG-pzdsejMnx-no*zt2jw16fIGwM;`9rED2g~+v%cWff|P3Wt-rhK6u9gILUNE z^BxW-f#U{G9^3?4r_y)?R9YeJj|I)ggNClaZ933k7Hm}^Vzw9Dbc5Orb}4A77N{l# zPm_WBs|KK+DR`Do0JK;ET$FTffy|$DP5~bV4hm*)j_-ubTzGUlYj|{f8+ddFTcmXt zJ2-SzJGpc@JG*pwySQ`(ySj8myLCmoLyJ2|I~X#p(lJK`bQdk?LZE%1!@4`BsO$yP zJt}*^bc@Pv&{^OedsKEYFfgQb5-1&-A*BOs)}a*C5?+w+%mBJ!2Hft3cKSIz8jpa2 zDjGb@Cg5QWnE>LS1X-wvkOozn7Ep(S=R}ao8c?Ghy670xwg44HyBfd=p++UZ@EfRH z0BL#gBmgui3)({54Qg0}5A6aiT?3o_qD=*qtYTCwK;aHvhXp?T6FkrdUhfHVH>ivS zmlWM0pi|p@R6No^ci@5s#XLJ7_;yO9xprRoe*rX7V*y(C46+w=#CE_7bCBgQ&!U~b z()b2abAeZp!xkJt>pMSC4h3Ij-~g)X+(3n3XO9Y~=t*mSPysGopn=KZ(Rc)8&|y#= zZUD-^4$u$-6>6ZG44fyAw}9&(aN0f&NrSMO3|8oYq69hfK7D{Ea*=DY95qOB=?4k6ZZ41RAP)EpWhdk! z^0ej$9AMAFT5q0U(?GfWcndf;fZ`oC466aEmq1wqA_!W}g|r_@0kmAY7j%Oo$VTvT zJMieZg-16h>?$C{!LE>M5i*Sit0s@Pfb#{|^xi38_KT-hEDRo<$H2K5bORWuvgkbI z!T1T}6_8sxVf7OvkvBu`iP8rT;Mg#fh=9Tulqn(C7eGAq(jIhFI%xAdsKS9vmVy_e zLC(h%fE+x6)Nnisx=0N?y8Dz9(m((gc>*AxN`OX;7%zY?(SS8ZAk7wVB1>z2Ab}Lb zB^iixgqj$@k=_f@2`b{j$%@R#&sTv)ep>Sb1ti<~Ta=;Ab3Zh9@wb3-B9hynD=fju z40LrY==xT0_J@>hAQys~AgF!-HCjLc4wmVLOwCd&LC;nO6(ykD+zq-A3>14F%?AWL zcD8(!n0;$qha9ymGEznao&!qY$s+}x1&YiRXcGidK!EZIs3wO69;m=t0S!D58`RM$ zKn^)jMcxhS_ki!t?d*Zn`xKS{SxTU!3JxpKPF!e!Nq8W2aY(TUGSv#oFyO`qXf=tz zzEz+$1gJX$YD2tKLWv%=y_5-LS2DKj`D{DaGI^bbzqz$N`#0$=NkoDd%D&Sob;9eNG+2#PM$G}%|f!F$h z=dnAtKxU{rr@*@+;I2t0q_82a{Q&A$fGQPGk<~E=ydeqHemDniFHBJZEeQeLPk08* zZ&5i7Z9klXwjaR7YA2*C0t!n|9SX{-Amc!56hJiA_5(-)R%U`42%w;Xv>y~e?FX>4 zCL!7n5NS{y?*Xk1!C4+!P=HEsQ2POMd@Ot7}O_*Z>WG&0HBf?lBB?G2~fD8 zwor4zK39h^8ip|iH2N(hvp5vdqF zp9*eif>VkEsHF)CK+v)aNQB_({=v#t@R(!^biXe6G}0Exs*z?3SnTn)fT9c(1Bm5d z;Pw7scfeY_u#^BgX{Zx&6AdUiK+0)oKM`6^gX7T!wA&2SGeX)T1E~!`XU!(O5IYWv zCg_|6_{^*fP>z5c6ay+7K*gI+CulCJLc*i7KmdGtQYWYp1qw~@JPY_FD)1UU@U$9u z)18fc^kw7&w>h!gPG_W`DP<7$xUHsDz+ju+0LCQ$Pc@N5q1d=+>O9egM*_|g{0 z?jL9~Q4!Sb^ni_-IY|7^1z+I=Ud`^|0lHNKQpkbq_ko_6E#cGc0N&i7014v#2LEyy z_JOXy-UV8Gx>FQ1MpeQHD#f884(`J!AT>A;=k9_g$U*1sf=2&f&1=xWQa9+ZT#)_X z<}uQGL-2f9H)tZP(?tb5_w@tZ&;w74SvzX*gI3jn2DhQ-L*Z4g?Wh5o{Xz{da4`$M z5RwCwLBL~w0xyi0fkBTnK|BEuZBV!mSCJf2?l08q#M2ult*7IT?9(apw;@2^F+YG0a5Vc z<)Z)p!7CC#om=ouQ?NflTmIlDY=Q0_245KY)1wnSXc*z44K1e;$+ZCPNboRmH#l`W zz={zMSTO=S*B?=g)Pedf;-F$g_wVojAU_y@k^;0^>IUzq7W7~|S4m{-m;0Z~uq)tyF2g>sRZjOo zK>`j4Pzr&Ju|a|a6srXuy(R@O&MpKgLezHx(CY*gV7}6T`APz#a0Fdqwi9es_#cR` zz&8j%w+lmtA&`7EX%;B`fIJV2KyY+H?S>aZP!}?90dK&5p#yawxPbsoD`@MjK(#2S zeE=xf48|3Gw3&FdKT2B*=N-(;GqF1lKmOgoK%XKsV>@6b9uA@n4|y1KQ!#4caT$ z4X#8%6=pZ6R_V6)U_9=jdF(~N3{U|E&Ys}2dX!sK*5s?DbK}c(Dt*UoQjHBmi$9g+z!PC@Y}b`a z;Qc%Be2E#HYe0nzI5A z18)=r;D{f+NC% z*+avl(*t}RTm*cXIw#18f@2N_u*xAsC8FC!B?MFgM0A1~pi3kw4ujUyf$ug2X8;XQ z;G%S!!3{9*h#+_j7nHj@!AGisE{X(gUiT?9Oy`kY7Osnh!XnLEERhT~vHP-U;XgGa%jp6&K)^JX#!J)HR^N07zN! z`YU?SgVPGQ5VY`s2ffM^NYKNMXnwyv(NJH)f=vv$oX#|IlU~mxbgnrwGc?x1!xO+2Rj1;130Ze0GV?GwB7#(yjnq3 z3aVPbN-uz%{sR_oKR|xC;n5igj?M?*q7-Sq$D{F$1``8A#|6liaq!ky=x#I6MfH$f zMN`1LwLz7p1n5R}&=5IDPmhW?hzlB%2Ms`h#*9H@@-Q}N0|K~{w@2j%BLjl~v^L~# zX=7ku00mWx3Ij;LbqiP?DqRBJ_W-J#yFygTK?_nriY!DpV8bThjx0zFRGD*t3}`$8 z^1@*xBbyH}f@DFeUQY)N6N1!%T38;(4}dAC7SNsx{%r@+`120%ho4O2w_rG!#$Vr} z@&M%SZiu^ff*PQZ+bcU;R02RU&3nK!EPL~}9ASe@$yb2v0!?FpiXjwscMEuiAJlgT zxys|<0~Sz>DtIy;099MC;=TgZq3x_u@z|#g3eL_Fm4IC~v#bVCeKwiFtAS z)9?SFWzXP~+YlvF0H`_H?V}O{8px>tSp^D4XMO<|0e;OEmIWZEL)`(gpI-wa#;?%> z_HY`1$w8311SEByod-M*K45VIsRfCr@fVzUm&X74AczqPV(@F6NaHWMC;(>{UgQ9= z)A+4KT3BMh<->7^=fP~K13<1r4hREiKtQjzdhz5V#Ean413cUdE_?^O7eQ$s)K&nc z0dy}qK)ndcs>|0slho1Eerd0Oey)Vgwa# z8TuiDXoEYtvJByi@rbuf+J!tp>Ff8BwO78QMHb_C}Z*uo&t z@+-y@{M&jU(u^lS#T}@S^MICYpuz{_23Vd0vB_|3?^c9kL3K3024tEPmt*V9i12P?JjO19**fz+q z5E{Ee{J*bV7# z@e8nUfbs)qtQ`~(5E`Xg0oJb>~an2#CoFeTu*Q_xBsP+`&yn_hqfJ18_?uKfoKc5uuLU}Fe!o^EH2 z3b+A$0n|MC0iCUY-nw}FfP=mZc#{kCipFjq&}I)X0csg{`lvwLsogFrH$V-~2jJ07 zz9!V22=pk9Go$*>r-|kbs(Apv>6`>KY;)FbJL|1P>X5JJ#S$L*Vf! z3s6tP05lbcJSPa+n+?iSpl&{B&H^+u1PXLeOBOssbR4pp0aT(NZ&3mDut7|aF`!iD z(R|<^C=@`eeA)TivmE{K7qrqBWGi^?0X7W<9o;(K0$xA}HmnyiKmTIU zhyVXUD=hYar9kB~D49W&K&FUZ{5JtziVHf41irWsGKJL%ahwPE^dHb_D)2HH2T(&F zJXe8fJ!q5*WVTN)2cJ-}^T7XH2GC8v6)&RRK`aK{cmNw>^5_jwDR?1(urEZV0Jmjm-h>7^ z!bb3^gy0qjgX4}5V2eQmGY4P8EY1MA3p#QZqLT1px-mSQK|`m|Wun-82~L0DaRBhZ z6~a#NumfluF5<;b=y@67`N#-#Z*)Uqup1VG5H6-&pivPA(3~77<-Pd&6f|z@qv8Ro z*FjMLT15+@Ni-++3Cx^sh{c5U!wyf|{|A)bdrMRTUZ@)(g;xN&4-ttH)Vc$o=?8Kt zC}}}66}Za<8DH1|W;Y%ICt}EYX$w$alF0risG|o85(AK)9u;*^sR~-Z38I_#sDQes zh<;`ts0ab|VnI3tKuSQT1Ayqx78P(~sT)c+LkeWDSo05t8V^v%5ESI#T+rPER^27S z)iFhd9jw0x+-0?B0drwJQ}Cn*sH^MIcm(9B!>{Kd`kP<@kg+)Xn^5;V@I&_M^0zRs zL+e#gWdib=NArOLAisdw$02n%D40RH8B~XZ+1(IvP+bgGM?z22kO_Ptal}q{SWh$d z38Wh)0g76Zdzv6O!5YD!#y+l|CP*FCdYT}^7{M`*Js{9~npKY>UL>!l39@ZKya;P6 zgB*Y!*XTXX>5m{@B(J9lvSC2H2y0=39Dwdc^q%IHhoB}Us5I|}%te9{EJjZgWD;So z^ngcq=-AT~0+qDTK@xBtMq)#zU$h}3C>TAs$>4+z=^8^+YMy|35VhNRcsZz@dml8y z1KtAwYUhHwpK1JMC)4=fAH>?D`*s1T0}3ilc7o$X8)6}-BkqCP3xyVZpaKar1Om#3 z5NA>D0VX65Aa_LxdjQ<)>}~OD#R&v8U0Lo?5@_^$qL<~T>rI4*SggpT6 zi4yPtSPiBJK=DN_4>T-AcmUL_1|=a7P1pnA-YEeOfYl&8@S5S}s~_O55wuK}ez4!rEFTx56Q0D@(59-YX>w`Am1r-s8aw^0ip>9 zEV%ax4OryfC^R3w+z;tpLW2-CU|r${3OP{Q1~$eH%G(~zFBw5yA27SS2b^7y#@)fK z8?YSI@YgHQS~uYH`8#V=PJrf9pqmVEdqUtPP9875{R2;R27hw5%yub}K_)r0kL6BsGM`r+dtwe%HHxp#v1!(X9vUmr&RmNhM z0b?G+i>-zX3@R)(uvjYr&l4sbb4UT550Qa9ABLC@>~>KBPtNTCrN$=Rsu?=pc*cBaj7u2>l56b%sE)7C5J&yA%}ZpgtA@hyfZC0VU-7;Dr1GnrdEv zW)ok)gCq&$fde3CzwiJp4uLLVvjT~LHw8hbM4MlNGtL80hZUTKAAqv^3s7i0IOd{q zpAmeqE5`;#@Pr&_Sg0E^Wc0cpY80qQIPL;o#f|Pfl*DLw06ZU#bl)SE^`*_n1w8gO zFy?{UO$;yg8h}m)1Fu2_EjMXCZsD>34ZpCl`2b57186x8=vFHgM$jJZ*Wi)?y59i2G6Iqx zyE#FD72pA0^96FZhcamCPABMKc#vw);#H7K3Ou?UBtQv_0~FR^10eahw?@Tdmm+Aj zf;?z>O@svK#$NE@Cg7Edpp`X^kHCw`Acxa~2Z|gZhqr?)fEo*4lnFK#a&l#Fjfw@5 zv5a72!E2;J>t7omf=vWPKWMlUyoLuvfP&}coqzxTdw>^QK-S}c$}ngW2OTg2nvewB z1}+~tK;v?-%-2=LQ38WBwT?F_HJ@7SS&=c1oLyayf4#!+n>=`^@ z(P`6ofZ$9j0E%F6!$QJwM*=7S z1@1C~3taGtQ5vsjfg%iSD`Y4P!F2$w-2f|vNIQTgT|n!!Ee?Bt&u@aczY|==f+~h? zke5MKFQ{wSFDRl0H{KB01*Zt0*MRqnt^9GlV`UVhhuk;fMa)&h;O%-1nl|*@L@0k zoh9IV9l$5%I)JoTfJzU@viDxlBB@;;m>@L-s1VV3(Y6>`T!GhHp%qpT_jkI0ZbSgx z-`)+5ZP5PbZcu9ya-%PJ#e5BD)EcxX8?^EY+BOIPl~4gMQovkr1g4@Zy@``K#TG^L1+C# zRz3Qt1b})#;NSt5bAe!nc?`S2r?0%*2+HI&DjqMUC_sDy(FRgw4pIfGv|gM5se+zE z0X7Wjh|*5T!4tj43lJK*D;RuI;wcZ!LmvG8 z;KPSO{a?_iJ%omA-t&ML4Ly)UD>|X`e%)Ij+l#uVK*T}UOMrX{N-NLLDgGCmy3#i2P6(a!_y$|g6crfc>rBd;m$4KEz+P-dXO|sH8cq| z9szqAQuaUt8`K#D4M>2j1hpAGIys=>&j@OGfbR$bi-Xz?-O$aq%#Ps0J3u4-ApKyv z6S|kGdk=U|7374tTPl#00G@pY^?O0ep~eY#FhkdeGoFCkZtbW5T~1MA(Xa=S4objl z;1l*of)ddI<~)XdPM|W*ZUZR2L6Qt8&Op9+`3#yuK-&R8hJx*cHCrGPb08;xYBi7^ zP%Q%DgO$Ua(+Qb11Brub9gsRuZ3N19&D7l%hf96DSEo^DhH*lN-2A0!_s*H!*-> z2;{GqhkpP6k38RuV?O)%K?XliZ_-EQ1*ob3B^+=s47dTZgVaV11wgEzlYhusqnD9`Gpyp!^TEv3m>nLu!GIn zqVfYYu-rLCa zfFQd0cmk;L4%$Tj;^6(i|GOZ5vtfmo&+|d^V<4}AoC-Qh7OZWL3V0BbAF`*4zeN

JU`Nf!x*6qOyUR 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 g{uRH`719+esh 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 OZ-JNyv*F-Nc@M*L z|1W?lDDZ?q=Rr_X0k?oa^D5wyX$o{}7G#4XsEPu6v3Cz-k76feycu-B257l3C|QE{ zNr9S1puIkz`4v#B8MH?Tv{w~cP=j_2fXhs%IiP|WBnCQq`bEMiP&2g!z7GMsWg4`e z7#u9ng0~scB!SG+?Ex3Y@P-`IYkf$w9K0b9+VlpqK}9&oTTn63Ox??XU!b}GI=Rz5 z1>CNL2T3=i{rSR%0dhSuw5AhB)O4^T-g=+`0=XXm+#*0e@3!#`sPzOokOW*I;%Lu; z!XGRTiX%{1f!4o*9Nf(TInxYUQ9#;K;6@x}EzTZjJq>MvLhtJWrDRCe2R#z%I3(0z zr;LEY5*&S?*=4y2yAi3CUk3))r#OPvOD*trIcTW`-joDdMgp=OGCm95 z9|T%~4-!H)9ai{*#K4M>Y=liDfPDzsr2>jijEMx$#0IiUbXsgVYl@ zp#W=`foDxj4ZbXoyC z4*_yGJo3Tb?wq0muBJdsV88}|t1@t13~Jqigh1{?ax+*tNDQn9;b!#62ZbD{ZUUF? zI3piCXbwHV71VqNS=iYFKA`|qmcVLeaK#Rdb#Pq@I!*U4u9vZ-BLeyy2pf@KP8Y)5uET(G2d_L!%kCnjhjUaFBslt;0H=$mW8U zpMhKj5(6uO*#+rMwy1#p13O9rGHDb6D$Ws+1zK$ZG6Kni;O1y4%j;y&wk{vgog95a(I7X${EvLZCs+~Gosf71H(Xm(z*RKT(G%bt3_30c z6mFfM;Uaj?1iV=f+>Zwp;2`_{kFvpk1n<9yq9n1!9AG=a4!Gy2u<7FyIa` zs8|MB2MQRlfsox?AT8jM0jvlTFc$EWC%}#e4`+dLDEQP6f4uIR$+4HOO0#Py#10P=6dG1n#P%xe(k52Z@0dL0t%oItx%%0`Er0 z6LsLLq9AoJWLF-fpWdPZ>hOcY4YU*#7I$DVXxxGO+o0WBU{6A32EgkL;ma98M?iCglXw=1nG9C~3xE(~yNq{O- z&^Q6eQ%LRuufc;I7LDdUuyT+XSP|5HpqK*pF?F!)H%1P}13D&3$X-Mc|^il80πOK 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 )ztx@hioU^#szc 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�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 Yd%=SV4QN~j0Cs7%N&o-= From 4a921152d0bf3ea839be1641ad80180e0b5113e9 Mon Sep 17 00:00:00 2001 From: Ihor Antonov Date: Sun, 22 Mar 2026 07:37:18 -0700 Subject: [PATCH 008/228] doc: use punctuation to disambiguate buifio.reader_read_slice doc --- core/bufio/reader.odin | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/core/bufio/reader.odin b/core/bufio/reader.odin index e361612d2..f949bbd85 100644 --- a/core/bufio/reader.odin +++ b/core/bufio/reader.odin @@ -355,16 +355,15 @@ _reader_proc :: proc(stream_data: rawptr, mode: io.Stream_Mode, p: []byte, offse // -// reader_read_slice reads until the first occurrence of delim from the reader -// It returns a slice pointing at the bytes in the buffer -// The bytes stop being valid at the next read -// If reader_read_slice encounters an error before finding a delimiter -// reader_read_slice fails with error .Buffer_Full if the buffer fills without a delim -// Because the data returned from reader_read_slice will be overwritten on the -// next IO operation, reader_read_bytes or reader_read_string is usually preferred -// -// reader_read_slice returns err != nil if and only if line does not end in delim +// reader_read_slice reads until the first occurrence of delim in the input, +// returning a slice pointing at the bytes in the internal buffer. +// The returned slice is only valid until the next read call. +// If the buffer fills without finding delim, it returns .Buffer_Full. +// If the underlying reader returns an error before finding delim, that error is returned. +// Because the returned data will be overwritten by the next I/O operation, +// reader_read_bytes or reader_read_string is usually preferred. // +// reader_read_slice returns err != nil if and only if line does not end in delim. reader_read_slice :: proc(b: ^Reader, delim: byte) -> (line: []byte, err: io.Error) { s := 0 for { From 7ffbe52995ed3c0e842c5b848d32adc47e03233d Mon Sep 17 00:00:00 2001 From: Carlyle Date: Tue, 24 Mar 2026 16:35:03 -0700 Subject: [PATCH 009/228] renamed DEFAULT_PAGE_SIZE to PAGE_SIZE --- core/mem/virtual/arena.odin | 4 ++-- core/mem/virtual/virtual.odin | 7 ++++--- core/mem/virtual/virtual_linux.odin | 4 ++-- core/mem/virtual/virtual_posix.odin | 4 ++-- core/mem/virtual/virtual_windows.odin | 4 ++-- 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/core/mem/virtual/arena.odin b/core/mem/virtual/arena.odin index bcf3ee702..ebf5a7db8 100644 --- a/core/mem/virtual/arena.odin +++ b/core/mem/virtual/arena.odin @@ -126,11 +126,11 @@ arena_alloc_unguarded :: proc(arena: ^Arena, size: uint, alignment: uint, loc := if err == .Out_Of_Memory { if arena.minimum_block_size == 0 { arena.minimum_block_size = DEFAULT_ARENA_GROWING_MINIMUM_BLOCK_SIZE - arena.minimum_block_size = mem.align_forward_uint(arena.minimum_block_size, DEFAULT_PAGE_SIZE) + arena.minimum_block_size = mem.align_forward_uint(arena.minimum_block_size, PAGE_SIZE) } if arena.default_commit_size == 0 { arena.default_commit_size = min(DEFAULT_ARENA_GROWING_COMMIT_SIZE, arena.minimum_block_size) - arena.default_commit_size = mem.align_forward_uint(arena.default_commit_size, DEFAULT_PAGE_SIZE) + arena.default_commit_size = mem.align_forward_uint(arena.default_commit_size, PAGE_SIZE) } if arena.default_commit_size != 0 { diff --git a/core/mem/virtual/virtual.odin b/core/mem/virtual/virtual.odin index d37c61267..c0fc6b95a 100644 --- a/core/mem/virtual/virtual.odin +++ b/core/mem/virtual/virtual.odin @@ -6,7 +6,8 @@ import "base:intrinsics" import "base:runtime" _ :: runtime -DEFAULT_PAGE_SIZE := uint(4096) +// On platforms where we were able to retrieve a configurable size, we use that value instead. +PAGE_SIZE := uint(4096) @(init, private) platform_memory_init :: proc "contextless" () { @@ -79,7 +80,7 @@ align_formula :: #force_inline proc "contextless" (size, align: uint) -> uint { @(require_results, no_sanitize_address) memory_block_alloc :: proc(committed, reserved: uint, alignment: uint = 0, flags: Memory_Block_Flags = {}) -> (block: ^Memory_Block, err: Allocator_Error) { - page_size := DEFAULT_PAGE_SIZE + page_size := PAGE_SIZE assert(mem.is_power_of_two(uintptr(page_size))) committed := committed @@ -144,7 +145,7 @@ alloc_from_memory_block :: proc(block: ^Memory_Block, min_size, alignment: uint, // TODO(bill): determine a better heuristic for this behaviour extra_size := max(size, block.committed>>1) platform_total_commit := base_offset + block.used + extra_size - platform_total_commit = align_formula(platform_total_commit, DEFAULT_PAGE_SIZE) + platform_total_commit = align_formula(platform_total_commit, PAGE_SIZE) platform_total_commit = min(max(platform_total_commit, default_commit_size), pmblock.reserved) assert(pmblock.committed <= pmblock.reserved) diff --git a/core/mem/virtual/virtual_linux.odin b/core/mem/virtual/virtual_linux.odin index 144a8dc59..9f1715e41 100644 --- a/core/mem/virtual/virtual_linux.odin +++ b/core/mem/virtual/virtual_linux.odin @@ -44,9 +44,9 @@ _protect :: proc "contextless" (data: rawptr, size: uint, flags: Protect_Flags) } _platform_memory_init :: proc "contextless" () { - DEFAULT_PAGE_SIZE = 4096 + PAGE_SIZE = 4096 // is power of two - assert_contextless(DEFAULT_PAGE_SIZE != 0 && (DEFAULT_PAGE_SIZE & (DEFAULT_PAGE_SIZE-1)) == 0) + assert_contextless(PAGE_SIZE != 0 && (PAGE_SIZE & (PAGE_SIZE-1)) == 0) } _map_file :: proc "contextless" (fd: uintptr, size: i64, flags: Map_File_Flags) -> (data: []byte, error: Map_File_Error) { diff --git a/core/mem/virtual/virtual_posix.odin b/core/mem/virtual/virtual_posix.odin index 6f257c385..36f2e015f 100644 --- a/core/mem/virtual/virtual_posix.odin +++ b/core/mem/virtual/virtual_posix.odin @@ -31,10 +31,10 @@ _protect :: proc "contextless" (data: rawptr, size: uint, flags: Protect_Flags) _platform_memory_init :: proc "contextless" () { // NOTE: `posix.PAGESIZE` due to legacy reasons could be wrong so we use `sysconf`. size := posix.sysconf(._PAGESIZE) - DEFAULT_PAGE_SIZE = uint(max(size, posix.PAGESIZE)) + PAGE_SIZE = uint(max(size, posix.PAGESIZE)) // is power of two - assert_contextless(DEFAULT_PAGE_SIZE != 0 && (DEFAULT_PAGE_SIZE & (DEFAULT_PAGE_SIZE-1)) == 0) + assert_contextless(PAGE_SIZE != 0 && (PAGE_SIZE & (PAGE_SIZE-1)) == 0) } _map_file :: proc "contextless" (fd: uintptr, size: i64, flags: Map_File_Flags) -> (data: []byte, error: Map_File_Error) { diff --git a/core/mem/virtual/virtual_windows.odin b/core/mem/virtual/virtual_windows.odin index 0866ebfa1..b4445aa7d 100644 --- a/core/mem/virtual/virtual_windows.odin +++ b/core/mem/virtual/virtual_windows.odin @@ -151,10 +151,10 @@ _protect :: proc "contextless" (data: rawptr, size: uint, flags: Protect_Flags) _platform_memory_init :: proc "contextless" () { sys_info: SYSTEM_INFO GetSystemInfo(&sys_info) - DEFAULT_PAGE_SIZE = max(DEFAULT_PAGE_SIZE, uint(sys_info.dwPageSize)) + PAGE_SIZE = max(PAGE_SIZE, uint(sys_info.dwPageSize)) // is power of two - assert_contextless(DEFAULT_PAGE_SIZE != 0 && (DEFAULT_PAGE_SIZE & (DEFAULT_PAGE_SIZE-1)) == 0) + assert_contextless(PAGE_SIZE != 0 && (PAGE_SIZE & (PAGE_SIZE-1)) == 0) } From b169c048feb851ce42a684dc74adbf23ede746b2 Mon Sep 17 00:00:00 2001 From: Carlyle Date: Tue, 24 Mar 2026 17:57:48 -0700 Subject: [PATCH 010/228] made PAGE_SIZE more consistent --- core/crypto/argon2id/argon2id.odin | 2 +- core/mem/alloc.odin | 7 +++---- core/mem/mem_posix.odin | 13 +++++++++++++ core/mem/mem_windows.odin | 14 ++++++++++++++ core/mem/virtual/arena.odin | 4 ++-- core/mem/virtual/virtual.odin | 12 ++---------- core/mem/virtual/virtual_linux.odin | 6 ------ core/mem/virtual/virtual_other.odin | 4 ---- core/mem/virtual/virtual_posix.odin | 9 --------- core/mem/virtual/virtual_windows.odin | 12 ------------ 10 files changed, 35 insertions(+), 48 deletions(-) create mode 100644 core/mem/mem_posix.odin create mode 100644 core/mem/mem_windows.odin diff --git a/core/crypto/argon2id/argon2id.odin b/core/crypto/argon2id/argon2id.odin index 3bff5a3a9..e2f5e487b 100644 --- a/core/crypto/argon2id/argon2id.odin +++ b/core/crypto/argon2id/argon2id.odin @@ -143,7 +143,7 @@ derive :: proc( m_ := 4 * u64(p) * (m / u64(4 * p)) b := mem.alloc_bytes_non_zeroed( int(m_) * BLOCK_SIZE_BYTES, - alignment = mem.DEFAULT_PAGE_SIZE, + alignment = mem.PAGE_SIZE, allocator = allocator, ) or_return defer delete(b, allocator) diff --git a/core/mem/alloc.odin b/core/mem/alloc.odin index 48cc39245..282c8d0b4 100644 --- a/core/mem/alloc.odin +++ b/core/mem/alloc.odin @@ -255,11 +255,10 @@ alignment is not specified explicitly. DEFAULT_ALIGNMENT :: 2*align_of(rawptr) /* -Default page size. - -This value is the default page size for the current platform. +On platforms where we were able to query a configurable size, we use that value instead. +See `query_page_size_init()` */ -DEFAULT_PAGE_SIZE :: +PAGE_SIZE: int = 64 * 1024 when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 else 16 * 1024 when ODIN_OS == .Darwin && ODIN_ARCH == .arm64 else 4 * 1024 diff --git a/core/mem/mem_posix.odin b/core/mem/mem_posix.odin new file mode 100644 index 000000000..c4af5c48a --- /dev/null +++ b/core/mem/mem_posix.odin @@ -0,0 +1,13 @@ +#+build linux, darwin, netbsd, freebsd, openbsd +package mem + +import "core:sys/posix" + +@(init, private, no_sanitize_address) +query_page_size_init :: proc "contextless" () { + size := posix.sysconf(._PAGESIZE) + PAGE_SIZE = int(max(size, 4096)) + + // is power of two + assert_contextless(PAGE_SIZE != 0 && (PAGE_SIZE & (PAGE_SIZE-1)) == 0) +} \ No newline at end of file diff --git a/core/mem/mem_windows.odin b/core/mem/mem_windows.odin new file mode 100644 index 000000000..d7e55eb09 --- /dev/null +++ b/core/mem/mem_windows.odin @@ -0,0 +1,14 @@ +#+build windows +package mem + +import "core:sys/windows" + +@(init, private, no_sanitize_address) +query_page_size_init :: proc "contextless" () { + sys_info: windows.SYSTEM_INFO + windows.GetSystemInfo(&sys_info) + PAGE_SIZE = max(PAGE_SIZE, int(sys_info.dwPageSize)) + + // is power of two + assert_contextless(PAGE_SIZE != 0 && (PAGE_SIZE & (PAGE_SIZE-1)) == 0) +} \ No newline at end of file diff --git a/core/mem/virtual/arena.odin b/core/mem/virtual/arena.odin index ebf5a7db8..e6c9fa26a 100644 --- a/core/mem/virtual/arena.odin +++ b/core/mem/virtual/arena.odin @@ -126,11 +126,11 @@ arena_alloc_unguarded :: proc(arena: ^Arena, size: uint, alignment: uint, loc := if err == .Out_Of_Memory { if arena.minimum_block_size == 0 { arena.minimum_block_size = DEFAULT_ARENA_GROWING_MINIMUM_BLOCK_SIZE - arena.minimum_block_size = mem.align_forward_uint(arena.minimum_block_size, PAGE_SIZE) + arena.minimum_block_size = mem.align_forward_uint(arena.minimum_block_size, uint(mem.PAGE_SIZE)) } if arena.default_commit_size == 0 { arena.default_commit_size = min(DEFAULT_ARENA_GROWING_COMMIT_SIZE, arena.minimum_block_size) - arena.default_commit_size = mem.align_forward_uint(arena.default_commit_size, PAGE_SIZE) + arena.default_commit_size = mem.align_forward_uint(arena.default_commit_size, uint(mem.PAGE_SIZE)) } if arena.default_commit_size != 0 { diff --git a/core/mem/virtual/virtual.odin b/core/mem/virtual/virtual.odin index c0fc6b95a..3135a31fb 100644 --- a/core/mem/virtual/virtual.odin +++ b/core/mem/virtual/virtual.odin @@ -6,14 +6,6 @@ import "base:intrinsics" import "base:runtime" _ :: runtime -// On platforms where we were able to retrieve a configurable size, we use that value instead. -PAGE_SIZE := uint(4096) - -@(init, private) -platform_memory_init :: proc "contextless" () { - _platform_memory_init() -} - Allocator_Error :: mem.Allocator_Error @(require_results, no_sanitize_address) @@ -80,7 +72,7 @@ align_formula :: #force_inline proc "contextless" (size, align: uint) -> uint { @(require_results, no_sanitize_address) memory_block_alloc :: proc(committed, reserved: uint, alignment: uint = 0, flags: Memory_Block_Flags = {}) -> (block: ^Memory_Block, err: Allocator_Error) { - page_size := PAGE_SIZE + page_size := uint(mem.PAGE_SIZE) assert(mem.is_power_of_two(uintptr(page_size))) committed := committed @@ -145,7 +137,7 @@ alloc_from_memory_block :: proc(block: ^Memory_Block, min_size, alignment: uint, // TODO(bill): determine a better heuristic for this behaviour extra_size := max(size, block.committed>>1) platform_total_commit := base_offset + block.used + extra_size - platform_total_commit = align_formula(platform_total_commit, PAGE_SIZE) + platform_total_commit = align_formula(platform_total_commit, uint(mem.PAGE_SIZE)) platform_total_commit = min(max(platform_total_commit, default_commit_size), pmblock.reserved) assert(pmblock.committed <= pmblock.reserved) diff --git a/core/mem/virtual/virtual_linux.odin b/core/mem/virtual/virtual_linux.odin index 9f1715e41..db7b63d5d 100644 --- a/core/mem/virtual/virtual_linux.odin +++ b/core/mem/virtual/virtual_linux.odin @@ -43,12 +43,6 @@ _protect :: proc "contextless" (data: rawptr, size: uint, flags: Protect_Flags) return errno == .NONE } -_platform_memory_init :: proc "contextless" () { - PAGE_SIZE = 4096 - // is power of two - assert_contextless(PAGE_SIZE != 0 && (PAGE_SIZE & (PAGE_SIZE-1)) == 0) -} - _map_file :: proc "contextless" (fd: uintptr, size: i64, flags: Map_File_Flags) -> (data: []byte, error: Map_File_Error) { prot: linux.Mem_Protection if .Read in flags { diff --git a/core/mem/virtual/virtual_other.odin b/core/mem/virtual/virtual_other.odin index 8a2e1a61d..ac11c99a6 100644 --- a/core/mem/virtual/virtual_other.odin +++ b/core/mem/virtual/virtual_other.odin @@ -25,10 +25,6 @@ _protect :: proc "contextless" (data: rawptr, size: uint, flags: Protect_Flags) return false } -_platform_memory_init :: proc "contextless" () { - -} - _map_file :: proc "contextless" (f: any, size: i64, flags: Map_File_Flags) -> (data: []byte, error: Map_File_Error) { return nil, .Map_Failure } diff --git a/core/mem/virtual/virtual_posix.odin b/core/mem/virtual/virtual_posix.odin index 36f2e015f..623a2b911 100644 --- a/core/mem/virtual/virtual_posix.odin +++ b/core/mem/virtual/virtual_posix.odin @@ -28,15 +28,6 @@ _protect :: proc "contextless" (data: rawptr, size: uint, flags: Protect_Flags) return posix.mprotect(data, size, transmute(posix.Prot_Flags)flags) == .OK } -_platform_memory_init :: proc "contextless" () { - // NOTE: `posix.PAGESIZE` due to legacy reasons could be wrong so we use `sysconf`. - size := posix.sysconf(._PAGESIZE) - PAGE_SIZE = uint(max(size, posix.PAGESIZE)) - - // is power of two - assert_contextless(PAGE_SIZE != 0 && (PAGE_SIZE & (PAGE_SIZE-1)) == 0) -} - _map_file :: proc "contextless" (fd: uintptr, size: i64, flags: Map_File_Flags) -> (data: []byte, error: Map_File_Error) { #assert(i32(posix.Prot_Flag_Bits.READ) == i32(Map_File_Flag.Read)) #assert(i32(posix.Prot_Flag_Bits.WRITE) == i32(Map_File_Flag.Write)) diff --git a/core/mem/virtual/virtual_windows.odin b/core/mem/virtual/virtual_windows.odin index b4445aa7d..696ba6be9 100644 --- a/core/mem/virtual/virtual_windows.odin +++ b/core/mem/virtual/virtual_windows.odin @@ -146,18 +146,6 @@ _protect :: proc "contextless" (data: rawptr, size: uint, flags: Protect_Flags) return bool(ok) } - -@(no_sanitize_address) -_platform_memory_init :: proc "contextless" () { - sys_info: SYSTEM_INFO - GetSystemInfo(&sys_info) - PAGE_SIZE = max(PAGE_SIZE, uint(sys_info.dwPageSize)) - - // is power of two - assert_contextless(PAGE_SIZE != 0 && (PAGE_SIZE & (PAGE_SIZE-1)) == 0) -} - - @(no_sanitize_address) _map_file :: proc "contextless" (fd: uintptr, size: i64, flags: Map_File_Flags) -> (data: []byte, error: Map_File_Error) { page_flags: u32 From df7af333d4276b0c18a68bb936e8ad95c4a38079 Mon Sep 17 00:00:00 2001 From: Carlyle Date: Tue, 24 Mar 2026 22:28:32 -0700 Subject: [PATCH 011/228] fixed default page size on posix --- core/mem/mem_posix.odin | 2 +- core/mem/mem_windows.odin | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/core/mem/mem_posix.odin b/core/mem/mem_posix.odin index c4af5c48a..f652e6a25 100644 --- a/core/mem/mem_posix.odin +++ b/core/mem/mem_posix.odin @@ -6,7 +6,7 @@ import "core:sys/posix" @(init, private, no_sanitize_address) query_page_size_init :: proc "contextless" () { size := posix.sysconf(._PAGESIZE) - PAGE_SIZE = int(max(size, 4096)) + PAGE_SIZE = max(PAGE_SIZE, int(size)) // is power of two assert_contextless(PAGE_SIZE != 0 && (PAGE_SIZE & (PAGE_SIZE-1)) == 0) diff --git a/core/mem/mem_windows.odin b/core/mem/mem_windows.odin index d7e55eb09..09f14d5d0 100644 --- a/core/mem/mem_windows.odin +++ b/core/mem/mem_windows.odin @@ -5,10 +5,12 @@ import "core:sys/windows" @(init, private, no_sanitize_address) query_page_size_init :: proc "contextless" () { - sys_info: windows.SYSTEM_INFO - windows.GetSystemInfo(&sys_info) - PAGE_SIZE = max(PAGE_SIZE, int(sys_info.dwPageSize)) - + info: windows.SYSTEM_INFO + windows.GetSystemInfo(&info) + + size := info.dwPageSize + PAGE_SIZE = max(PAGE_SIZE, int(size)) + // is power of two assert_contextless(PAGE_SIZE != 0 && (PAGE_SIZE & (PAGE_SIZE-1)) == 0) } \ No newline at end of file From 2da0fc187165303852b51b4b19751417c1a92acb Mon Sep 17 00:00:00 2001 From: Peter0x44 Date: Sat, 4 Apr 2026 04:42:10 +0100 Subject: [PATCH 012/228] Add missing rlgl bindings for raylib 5.5 --- vendor/raylib/rlgl/rlgl.odin | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/vendor/raylib/rlgl/rlgl.odin b/vendor/raylib/rlgl/rlgl.odin index 14a7cf5b0..a08479680 100644 --- a/vendor/raylib/rlgl/rlgl.odin +++ b/vendor/raylib/rlgl/rlgl.odin @@ -431,17 +431,19 @@ foreign lib { EnableTextureCubemap :: proc(id: c.uint) --- // Enable texture cubemap DisableTextureCubemap :: proc() --- // Disable texture cubemap TextureParameters :: proc(id: c.uint, param: c.int, value: c.int) --- // Set texture parameters (filter, wrap) - CubemapParameters :: proc(id: i32, param: c.int, value: c.int) --- // Set cubemap parameters (filter, wrap) + CubemapParameters :: proc(id: c.uint, param: c.int, value: c.int) --- // Set cubemap parameters (filter, wrap) // Shader state EnableShader :: proc(id: c.uint) --- // Enable shader program DisableShader :: proc() --- // Disable shader program // Framebuffer state - EnableFramebuffer :: proc(id: c.uint) --- // Enable render texture (fbo) - DisableFramebuffer :: proc() --- // Disable render texture (fbo), return to default framebuffer - ActiveDrawBuffers :: proc(count: c.int) --- // Activate multiple draw color buffers - BlitFramebuffer :: proc(srcX, srcY, srcWidth, srcHeight, dstX, dstY, dstWidth, dstHeight, bufferMask: c.int) --- // Blit active framebuffer to main framebuffer + EnableFramebuffer :: proc(id: c.uint) --- // Enable render texture (fbo) + DisableFramebuffer :: proc() --- // Disable render texture (fbo), return to default framebuffer + GetActiveFramebuffer :: proc() -> c.uint --- // Get the currently active render texture (fbo), 0 for default framebuffer + ActiveDrawBuffers :: proc(count: c.int) --- // Activate multiple draw color buffers + BlitFramebuffer :: proc(srcX, srcY, srcWidth, srcHeight: c.int, dstX, dstY, dstWidth, dstHeight: c.int, bufferMask: c.int) --- // Blit active framebuffer to main framebuffer + BindFramebuffer :: proc(target, framebuffer: c.uint) --- // Bind framebuffer (FBO) // General render state EnableColorBlend :: proc() --- // Enable color blending @@ -452,12 +454,13 @@ foreign lib { DisableDepthMask :: proc() --- // Disable depth write EnableBackfaceCulling :: proc() --- // Enable backface culling DisableBackfaceCulling :: proc() --- // Disable backface culling + ColorMask :: proc(r, g, b, a: bool) --- // Color mask control SetCullFace :: proc(mode: CullMode) --- // Set face culling mode EnableScissorTest :: proc() --- // Enable scissor test DisableScissorTest :: proc() --- // Disable scissor test Scissor :: proc(x, y, width, height: c.int) --- // Scissor test EnableWireMode :: proc() --- // Enable wire mode - EnablePointMode :: proc() --- // Enable point mode + EnablePointMode :: proc() --- // Enable point mode DisableWireMode :: proc() --- // Disable wire and point modes SetLineWidth :: proc(width: f32) --- // Set the line drawing width GetLineWidth :: proc() -> f32 --- // Get the line drawing width @@ -503,7 +506,7 @@ foreign lib { DrawRenderBatch :: proc(batch: ^RenderBatch) --- // Draw render batch data (Update->Draw->Reset) SetRenderBatchActive :: proc(batch: ^RenderBatch) --- // Set the active render batch for rlgl (NULL for default internal) DrawRenderBatchActive :: proc() --- // Update and draw internal render batch - CheckRenderBatchLimit :: proc(vCount: c.int) -> c.int --- // Check internal buffer overflow for a given number of vertex + CheckRenderBatchLimit :: proc(vCount: c.int) -> bool --- // Check internal buffer overflow for a given number of vertex SetTexture :: proc(id: c.uint) --- // Set current texture for render batch and check buffers limits @@ -528,7 +531,7 @@ foreign lib { // Textures management LoadTexture :: proc(data: rawptr, width, height: c.int, format: c.int, mipmapCount: c.int) -> c.uint --- // Load texture in GPU LoadTextureDepth :: proc(width, height: c.int, useRenderBuffer: bool) -> c.uint --- // Load depth texture/renderbuffer (to be attached to fbo) - LoadTextureCubemap :: proc(data: rawptr, size: c.int, format: c.int) -> c.uint --- // Load texture cubemap + LoadTextureCubemap :: proc(data: rawptr, size: c.int, format: c.int, mipmapCount: c.int) -> c.uint --- // Load texture cubemap UpdateTexture :: proc(id: c.uint, offsetX, offsetY: c.int, width, height: c.int, format: c.int, data: rawptr) --- // Update GPU texture with new data GetGlTextureFormats :: proc(format: c.int, glInternalFormat, glFormat, glType: ^c.uint) --- // Get OpenGL internal formats GetPixelFormatName :: proc(format: c.uint) -> cstring --- // Get name string for pixel format @@ -552,6 +555,7 @@ foreign lib { GetLocationAttrib :: proc(shaderId: c.uint, attribName: cstring) -> c.int --- // Get shader location attribute SetUniform :: proc(locIndex: c.int, value: rawptr, uniformType: c.int, count: c.int) --- // Set shader value uniform SetUniformMatrix :: proc(locIndex: c.int, mat: Matrix) --- // Set shader value matrix + SetUniformMatrices :: proc(locIndex: c.int, matrices: [^]Matrix, count: c.int) --- // Set shader value matrices SetUniformSampler :: proc(locIndex: c.int, textureId: c.uint) --- // Set shader value sampler SetShader :: proc(id: c.uint, locs: [^]c.int) --- // Set shader currently active (id and locations) From 066ab478c6a213a479d19f46d365ca0d0c8e2066 Mon Sep 17 00:00:00 2001 From: Mohit Sethi <29519295+GloriousPtr@users.noreply.github.com> Date: Wed, 22 Apr 2026 20:09:18 +0100 Subject: [PATCH 013/228] Add IDevice10 interface to vendor/d3d12 --- vendor/directx/d3d12/d3d12.odin | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/vendor/directx/d3d12/d3d12.odin b/vendor/directx/d3d12/d3d12.odin index d17591f6a..43c23d129 100644 --- a/vendor/directx/d3d12/d3d12.odin +++ b/vendor/directx/d3d12/d3d12.odin @@ -4051,6 +4051,19 @@ IDevice9_VTable :: struct { CreateCommandQueue1: proc "system" (this: ^IDevice9, pDesc: ^COMMAND_QUEUE_DESC, CreatorID: ^IID, riid: ^IID, ppCommandQueue: ^rawptr) -> HRESULT, } +IDevice10_UUID_STRING :: "517F8718-AA66-49F9-B02B-A7AB89C06031" +IDevice10_UUID := &IID{0x517F8718, 0xAA66, 0x49F9, {0xB0, 0x2B, 0xA7, 0xAB, 0x89, 0xC0, 0x60, 0x31}} +IDevice10 :: struct #raw_union { + #subtype id3d12device9: IDevice9, + using id3d12device10_vtable: ^IDevice10_VTable, +} +IDevice10_VTable :: struct { + using id3d12device9_vtable: IDevice9_VTable, + CreateCommittedResource3: proc "system" (this: ^IDevice10, pHeapProperties: ^HEAP_PROPERTIES, HeapFlags: HEAP_FLAGS, pDesc: ^RESOURCE_DESC1, InitialLayout: BARRIER_LAYOUT, pOptimizedClearValue: ^CLEAR_VALUE, pProtectedSession: ^IProtectedResourceSession, NumCastableFormats: u32, pCastableFormats: [^]dxgi.FORMAT, riidResource: ^IID, ppvResource: ^rawptr) -> HRESULT, + CreatePlacedResource2: proc "system" (this: ^IDevice10, pHeap: ^IHeap, HeapOffset: u64, pDesc: ^RESOURCE_DESC1, InitialLayout: BARRIER_LAYOUT, pOptimizedClearValue: ^CLEAR_VALUE, NumCastableFormats: u32, pCastableFormats: [^]dxgi.FORMAT, riid: ^IID, ppvResource: ^rawptr) -> HRESULT, + CreateReservedResource2: proc "system" (this: ^IDevice10, pDesc: ^RESOURCE_DESC, InitialLayout: BARRIER_LAYOUT, pOptimizedClearValue: ^CLEAR_VALUE, pProtectedSession: ^IProtectedResourceSession, NumCastableFormats: u32, pCastableFormats: [^]dxgi.FORMAT , riid: ^IID, ppvResource: ^rawptr) -> HRESULT, +} + ITools_UUID_STRING :: "7071e1f0-e84b-4b33-974f-12fa49de65c5" ITools_UUID := &IID{0x7071e1f0, 0xe84b, 0x4b33, {0x97, 0x4f, 0x12, 0xfa, 0x49, 0xde, 0x65, 0xc5}} From d1915fa6f5683776638c7a987ec159296a9c3320 Mon Sep 17 00:00:00 2001 From: Ignacy Koper Date: Tue, 28 Apr 2026 16:08:38 +0200 Subject: [PATCH 014/228] removed Haiku from compiler targets, and tests Signed-off-by: Ignacy Koper --- build_odin.sh | 5 - check_all.bat | 2 - check_all.sh | 2 - src/build_settings.cpp | 65 -------- src/check_builtin.cpp | 1 - src/checker.cpp | 1 - src/gb/gb.h | 48 +----- src/linker.cpp | 3 +- src/llvm_backend.cpp | 4 +- src/path.cpp | 2 +- src/threading.cpp | 171 ---------------------- tests/core/odin/test_file_tags.odin | 3 +- tests/core/sys/posix/posix.odin | 34 +---- tests/core/sys/posix/structs.odin | 2 +- tests/core/sys/posix/structs/structs.c | 8 - tests/core/sys/posix/structs/structs.odin | 8 +- 16 files changed, 17 insertions(+), 342 deletions(-) diff --git a/build_odin.sh b/build_odin.sh index ee891e41e..3a4c84019 100755 --- a/build_odin.sh +++ b/build_odin.sh @@ -117,11 +117,6 @@ OpenBSD) LDFLAGS="$LDFLAGS -lstdc++ -L/usr/local/lib -liconv" LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs)" ;; -Haiku) - CXXFLAGS="$CXXFLAGS -D_GNU_SOURCE $($LLVM_CONFIG --cxxflags --ldflags) -I/system/develop/headers/private/shared -I/system/develop/headers/private/kernel" - LDFLAGS="$LDFLAGS -lstdc++ -liconv" - LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs)" - ;; *) error "Platform \"$OS_NAME\" unsupported" ;; diff --git a/check_all.bat b/check_all.bat index b3cd27545..aaf612d65 100644 --- a/check_all.bat +++ b/check_all.bat @@ -51,8 +51,6 @@ if "%1" == "freestanding" ( if "%1" == "rare" ( echo Checking freebsd_i386 odin check examples\all -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -target:freebsd_i386 - echo Checking haiku_amd64 - odin check examples\all -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -target:haiku_amd64 ) if "%1" == "wasm" ( diff --git a/check_all.sh b/check_all.sh index b3e3e2221..eee08790e 100755 --- a/check_all.sh +++ b/check_all.sh @@ -21,8 +21,6 @@ freestanding) rare) echo Checking freebsd_i386 odin check examples/all -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -target:freebsd_i386 - echo Checking haiku_amd64 - odin check examples/all -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -target:haiku_amd64 ;; wasm) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index bcedd8fb9..4130d4939 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -20,7 +20,6 @@ enum TargetOsKind : u16 { TargetOs_freebsd, TargetOs_openbsd, TargetOs_netbsd, - TargetOs_haiku, TargetOs_wasi, TargetOs_js, @@ -39,7 +38,6 @@ gb_global String target_os_names[TargetOs_COUNT] = { str_lit("freebsd"), str_lit("openbsd"), str_lit("netbsd"), - str_lit("haiku"), str_lit("wasi"), str_lit("js"), @@ -774,12 +772,6 @@ gb_global TargetMetrics target_netbsd_arm64 = { str_lit("aarch64-unknown-netbsd-elf"), }; -gb_global TargetMetrics target_haiku_amd64 = { - TargetOs_haiku, - TargetArch_amd64, - 8, 8, AMD64_MAX_ALIGNMENT, 32, - str_lit("x86_64-unknown-haiku"), -}; gb_global TargetMetrics target_freestanding_wasm32 = { TargetOs_freestanding, @@ -906,7 +898,6 @@ gb_global NamedTargetMetrics named_targets[] = { { str_lit("netbsd_arm64"), &target_netbsd_arm64 }, { str_lit("openbsd_amd64"), &target_openbsd_amd64 }, - { str_lit("haiku_amd64"), &target_haiku_amd64 }, { str_lit("freestanding_wasm32"), &target_freestanding_wasm32 }, { str_lit("wasi_wasm32"), &target_wasi_wasm32 }, @@ -1168,58 +1159,6 @@ gb_internal String internal_odin_root_dir(void) { return path; } -#elif defined(GB_SYSTEM_HAIKU) - -#include - -gb_internal String path_to_fullpath(gbAllocator a, String s, bool *ok_); - -gb_internal String internal_odin_root_dir(void) { - String path = global_module_path; - isize len, i; - u8 *text; - - if (global_module_path_set) { - return global_module_path; - } - - TEMPORARY_ALLOCATOR_GUARD(); - auto path_buf = array_make(temporary_allocator(), 300); - - len = 0; - for (;;) { - u32 sz = path_buf.count; - int res = find_path(B_APP_IMAGE_SYMBOL, B_FIND_PATH_IMAGE_PATH, nullptr, &path_buf[0], sz); - if(res == B_OK) { - len = sz; - break; - } else { - array_resize(&path_buf, sz + 1); - } - } - - mutex_lock(&string_buffer_mutex); - defer (mutex_unlock(&string_buffer_mutex)); - - text = permanent_alloc_array(len + 1); - gb_memmove(text, &path_buf[0], len); - - path = path_to_fullpath(heap_allocator(), make_string(text, len), nullptr); - - for (i = path.len-1; i >= 0; i--) { - u8 c = path[i]; - if (c == '/' || c == '\\') { - break; - } - path.len--; - } - - global_module_path = path; - global_module_path_set = true; - - return path; -} - #elif defined(GB_SYSTEM_OSX) #include @@ -1825,8 +1764,6 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta #else metrics = &target_netbsd_amd64; #endif - #elif defined(GB_SYSTEM_HAIKU) - metrics = &target_haiku_amd64; #elif defined(GB_CPU_ARM) metrics = &target_linux_arm64; #elif defined(GB_CPU_RISCV) @@ -2593,7 +2530,6 @@ gb_internal bool init_build_paths(String init_filename) { case TargetOs_freebsd: case TargetOs_openbsd: case TargetOs_netbsd: - case TargetOs_haiku: gb_printf_err("-no-crt on Unix systems requires either -default-to-nil-allocator or -default-to-panic-allocator to also be present, because the default allocator requires CRT\n"); no_crt_checks_failed = true; } @@ -2606,7 +2542,6 @@ gb_internal bool init_build_paths(String init_filename) { case TargetOs_freebsd: case TargetOs_openbsd: case TargetOs_netbsd: - case TargetOs_haiku: gb_printf_err("-no-crt on Unix systems requires the -no-thread-local flag to also be present, because the TLS is inaccessible without CRT\n"); no_crt_checks_failed = true; } diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index 91aecdc41..4cbdbefa6 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -6598,7 +6598,6 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As switch (build_context.metrics.os) { case TargetOs_darwin: case TargetOs_linux: - case TargetOs_haiku: switch (build_context.metrics.arch) { case TargetArch_i386: case TargetArch_amd64: diff --git a/src/checker.cpp b/src/checker.cpp index 968a46215..7d9aaf24f 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -1171,7 +1171,6 @@ gb_internal void init_universal(void) { {"Darwin", TargetOs_darwin}, {"Linux", TargetOs_linux}, {"FreeBSD", TargetOs_freebsd}, - {"Haiku", TargetOs_haiku}, {"OpenBSD", TargetOs_openbsd}, {"NetBSD", TargetOs_netbsd}, {"WASI", TargetOs_wasi}, diff --git a/src/gb/gb.h b/src/gb/gb.h index 3c88ce6ed..3413d1367 100644 --- a/src/gb/gb.h +++ b/src/gb/gb.h @@ -87,10 +87,6 @@ extern "C" { #ifndef GB_SYSTEM_NETBSD #define GB_SYSTEM_NETBSD 1 #endif - #elif defined(__HAIKU__) || defined(__haiku__) - #ifndef GB_SYSTEM_HAIKU - #define GB_SYSTEM_HAIKU 1 - #endif #else #error This UNIX operating system is not supported #endif @@ -219,7 +215,7 @@ extern "C" { #endif #include // NOTE(bill): malloc on linux #include - #if !defined(GB_SYSTEM_OSX) && !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(__HAIKU__) + #if !defined(GB_SYSTEM_OSX) && !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) #include #endif #include @@ -267,13 +263,6 @@ extern "C" { #define lseek64 lseek #endif -#if defined(GB_SYSTEM_HAIKU) - #include - #include - #include - #define lseek64 lseek -#endif - #if defined(GB_SYSTEM_UNIX) #include #endif @@ -847,13 +836,6 @@ typedef struct gbAffinity { isize thread_count; isize threads_per_core; } gbAffinity; -#elif defined(GB_SYSTEM_HAIKU) -typedef struct gbAffinity { - b32 is_accurate; - isize core_count; - isize thread_count; - isize threads_per_core; -} gbAffinity; #else #error TODO(bill): Unknown system #endif @@ -3042,8 +3024,6 @@ gb_inline u32 gb_thread_current_id(void) { __asm__("mov %%fs:0x10,%0" : "=r"(thread_id)); #elif defined(GB_SYSTEM_LINUX) thread_id = gettid(); -#elif defined(GB_SYSTEM_HAIKU) - thread_id = find_thread(NULL); #elif defined(GB_SYSTEM_FREEBSD) thread_id = pthread_getthreadid_np(); #elif defined(GB_SYSTEM_NETBSD) @@ -3256,9 +3236,6 @@ b32 gb_affinity_set(gbAffinity *a, isize core, isize thread_index) { //info.affinity_tag = cast(integer_t)index; //result = thread_policy_set(thread, THREAD_AFFINITY_POLICY, cast(thread_policy_t)&info, THREAD_AFFINITY_POLICY_COUNT); -#if !defined(GB_SYSTEM_HAIKU) - result = pthread_setaffinity_np(thread, sizeof(cpuset_t), &mn); -#endif return result == 0; } @@ -3339,29 +3316,6 @@ isize gb_affinity_thread_count_for_core(gbAffinity *a, isize core) { return a->threads_per_core; } -#elif defined(GB_SYSTEM_HAIKU) -#include - -void gb_affinity_init(gbAffinity *a) { - a->core_count = sysconf(_SC_NPROCESSORS_ONLN); - a->threads_per_core = 1; - a->is_accurate = a->core_count > 0; - a->core_count = a->is_accurate ? a->core_count : 1; - a->thread_count = a->core_count; -} - -void gb_affinity_destroy(gbAffinity *a) { - gb_unused(a); -} - -b32 gb_affinity_set(gbAffinity *a, isize core, isize thread_index) { - return true; -} - -isize gb_affinity_thread_count_for_core(gbAffinity *a, isize core) { - GB_ASSERT(0 <= core && core < a->core_count); - return a->threads_per_core; -} #else #error TODO(bill): Unknown system #endif diff --git a/src/linker.cpp b/src/linker.cpp index 46fa36f5a..50bb4e524 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -791,11 +791,10 @@ try_cross_linking:; // Do not disable PIE, let the linker choose. (most likely you want it enabled) } else if (build_context.build_mode != BuildMode_DynamicLibrary) { if (build_context.metrics.os != TargetOs_openbsd - && build_context.metrics.os != TargetOs_haiku && build_context.metrics.arch != TargetArch_riscv64 && !is_android ) { - // OpenBSD and Haiku default to PIE executable. do not pass -no-pie for it. + // OpenBSD defaults to PIE executable, do not pass -no-pie for it. link_settings = gb_string_appendc(link_settings, "-no-pie "); } } diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 70b87f43a..49af4ec39 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -3156,8 +3156,8 @@ gb_internal bool lb_generate_code(lbGenerator *gen) { switch (build_context.reloc_mode) { case RelocMode_Default: - if (build_context.metrics.os == TargetOs_openbsd || build_context.metrics.os == TargetOs_haiku) { - // Always use PIC for OpenBSD and Haiku: they default to PIE + if (build_context.metrics.os == TargetOs_openbsd) { + // Always use PIC for OpenBSD: it defaults to PIE reloc_mode = LLVMRelocPIC; } diff --git a/src/path.cpp b/src/path.cpp index 2b97a04df..786ea3b9c 100644 --- a/src/path.cpp +++ b/src/path.cpp @@ -400,7 +400,7 @@ gb_internal ReadDirectoryError read_directory(String path, Array *fi) return ReadDirectory_None; } -#elif defined(GB_SYSTEM_LINUX) || defined(GB_SYSTEM_OSX) || defined(GB_SYSTEM_FREEBSD) || defined(GB_SYSTEM_OPENBSD) || defined(GB_SYSTEM_NETBSD) || defined(GB_SYSTEM_HAIKU) +#elif defined(GB_SYSTEM_LINUX) || defined(GB_SYSTEM_OSX) || defined(GB_SYSTEM_FREEBSD) || defined(GB_SYSTEM_OPENBSD) || defined(GB_SYSTEM_NETBSD) #include diff --git a/src/threading.cpp b/src/threading.cpp index 5dff13d2e..bc92ad3f2 100644 --- a/src/threading.cpp +++ b/src/threading.cpp @@ -549,8 +549,6 @@ gb_internal u32 thread_current_id(void) { __asm__("mov %%fs:0x10,%0" : "=r"(thread_id)); #elif defined(GB_SYSTEM_LINUX) thread_id = gettid(); -#elif defined(GB_SYSTEM_HAIKU) - thread_id = find_thread(NULL); #elif defined(GB_SYSTEM_FREEBSD) thread_id = pthread_getthreadid_np(); #elif defined(GB_SYSTEM_NETBSD) @@ -1027,175 +1025,6 @@ gb_internal void futex_wait(Futex *f, Footex val) { } while (f->load() == val); } -#elif defined(GB_SYSTEM_HAIKU) - -// Futex implementation taken from https://tavianator.com/2023/futex.html - -#include -#include - -struct _Spinlock { - std::atomic_flag state; - - void init() { - state.clear(); - } - - void lock() { - while (state.test_and_set(std::memory_order_acquire)) { - #if defined(GB_CPU_X86) - _mm_pause(); - #else - (void)0; // spin... - #endif - } - } - - void unlock() { - state.clear(std::memory_order_release); - } -}; - -struct Futex_Waitq; - -struct Futex_Waiter { - _Spinlock lock; - pthread_t thread; - Futex *futex; - Futex_Waitq *waitq; - Futex_Waiter *prev, *next; -}; - -struct Futex_Waitq { - _Spinlock lock; - Futex_Waiter list; - - void init() { - auto head = &list; - head->prev = head->next = head; - } -}; - -// FIXME: This approach may scale badly in the future, -// possible solution - hash map (leads to deadlocks now). - -Futex_Waitq g_waitq = { - .lock = ATOMIC_FLAG_INIT, - .list = { - .prev = &g_waitq.list, - .next = &g_waitq.list, - }, -}; - -Futex_Waitq *get_waitq(Futex *f) { - // Future hash map method... - return &g_waitq; -} - -void futex_signal(Futex *f) { - auto waitq = get_waitq(f); - - waitq->lock.lock(); - - auto head = &waitq->list; - for (auto waiter = head->next; waiter != head; waiter = waiter->next) { - if (waiter->futex != f) { - continue; - } - waitq->lock.unlock(); - pthread_kill(waiter->thread, SIGCONT); - return; - } - - waitq->lock.unlock(); -} - -void futex_broadcast(Futex *f) { - auto waitq = get_waitq(f); - - waitq->lock.lock(); - - auto head = &waitq->list; - for (auto waiter = head->next; waiter != head; waiter = waiter->next) { - if (waiter->futex != f) { - continue; - } - if (waiter->next == head) { - waitq->lock.unlock(); - pthread_kill(waiter->thread, SIGCONT); - return; - } else { - pthread_kill(waiter->thread, SIGCONT); - } - } - - waitq->lock.unlock(); -} - -void futex_wait(Futex *f, Footex val) { - Futex_Waiter waiter; - waiter.thread = pthread_self(); - waiter.futex = f; - - auto waitq = get_waitq(f); - while (waitq->lock.state.test_and_set(std::memory_order_acquire)) { - if (f->load(std::memory_order_relaxed) != val) { - return; - } - #if defined(GB_CPU_X86) - _mm_pause(); - #else - (void)0; // spin... - #endif - } - - waiter.waitq = waitq; - waiter.lock.init(); - waiter.lock.lock(); - - auto head = &waitq->list; - waiter.prev = head->prev; - waiter.next = head; - waiter.prev->next = &waiter; - waiter.next->prev = &waiter; - - waiter.prev->next = &waiter; - waiter.next->prev = &waiter; - - sigset_t old_mask, mask; - sigemptyset(&mask); - sigaddset(&mask, SIGCONT); - pthread_sigmask(SIG_BLOCK, &mask, &old_mask); - - if (f->load(std::memory_order_relaxed) == val) { - waiter.lock.unlock(); - waitq->lock.unlock(); - - int sig; - sigwait(&mask, &sig); - - waitq->lock.lock(); - waiter.lock.lock(); - - while (waitq != waiter.waitq) { - auto req = waiter.waitq; - waiter.lock.unlock(); - waitq->lock.unlock(); - waitq = req; - waitq->lock.lock(); - waiter.lock.lock(); - } - } - - waiter.prev->next = waiter.next; - waiter.next->prev = waiter.prev; - - pthread_sigmask(SIG_SETMASK, &old_mask, NULL); - - waiter.lock.unlock(); - waitq->lock.unlock(); -} - #endif #if defined(GB_SYSTEM_WINDOWS) diff --git a/tests/core/odin/test_file_tags.odin b/tests/core/odin/test_file_tags.odin index 99a995be5..8c70a4827 100644 --- a/tests/core/odin/test_file_tags.odin +++ b/tests/core/odin/test_file_tags.odin @@ -34,7 +34,7 @@ package main }, }, {// [2] src = ` -#+build linux, darwin, freebsd, openbsd, netbsd, haiku +#+build linux, darwin, freebsd, openbsd, netbsd #+build arm32, arm64 package main `, @@ -45,7 +45,6 @@ package main {os = {.FreeBSD}, arch = runtime.ALL_ODIN_ARCH_TYPES}, {os = {.OpenBSD}, arch = runtime.ALL_ODIN_ARCH_TYPES}, {os = {.NetBSD}, arch = runtime.ALL_ODIN_ARCH_TYPES}, - {os = {.Haiku}, arch = runtime.ALL_ODIN_ARCH_TYPES}, parser.BUILD_KIND_NEWLINE_MARKER, {os = runtime.ALL_ODIN_OS_TYPES, arch = {.arm32}}, {os = runtime.ALL_ODIN_OS_TYPES, arch = {.arm64}}, diff --git a/tests/core/sys/posix/posix.odin b/tests/core/sys/posix/posix.odin index 7a7cbd392..9b864af39 100644 --- a/tests/core/sys/posix/posix.odin +++ b/tests/core/sys/posix/posix.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, freebsd, openbsd, netbsd, haiku +#+build linux, darwin, freebsd, openbsd, netbsd package tests_core_posix import "core:log" @@ -65,17 +65,8 @@ test_dirent :: proc(t: ^testing.T) { for entry in entries { defer posix.free(entry) - when ODIN_OS == .Haiku { - stat: posix.stat_t - posix.stat(cstring(raw_data(entry.d_name[:])), &stat) - - if !posix.S_ISREG(stat.st_mode) { - continue - } - } else { - if entry.d_type != .REG { - continue - } + if entry.d_type != .REG { + continue } name := string(cstring(raw_data(entry.d_name[:]))) @@ -95,17 +86,8 @@ test_dirent :: proc(t: ^testing.T) { break } - when ODIN_OS == .Haiku { - stat: posix.stat_t - posix.stat(cstring(raw_data(entry.d_name[:])), &stat) - - if !posix.S_ISREG(stat.st_mode) { - continue - } - } else { - if entry.d_type != .REG { - continue - } + if entry.d_type != .REG { + continue } name := string(cstring(raw_data(entry.d_name[:]))) @@ -165,8 +147,8 @@ test_libgen :: proc(t: ^testing.T) { { "///", "/", "/" }, { "/usr/", "/", "usr" }, { "/usr/lib", "/usr", "lib" }, - { "//usr//lib//", "//usr" + ("/" when ODIN_OS == .Haiku else ""), "lib" }, - { "/home//dwc//test", "/home//dwc" + ("/" when ODIN_OS == .Haiku else ""), "test" }, + { "//usr//lib//", "//usr", "lib" }, + { "/home//dwc//test", "/home//dwc", "test" }, } for test in tests { @@ -259,4 +241,4 @@ open_permissions :: proc(t: ^testing.T) { stat: posix.stat_t res := posix.fstat(fd, &stat) testing.expectf(t, res == .OK, "failed to stat: %v", posix.strerror()) -} \ No newline at end of file +} diff --git a/tests/core/sys/posix/structs.odin b/tests/core/sys/posix/structs.odin index 66b7cb0e1..a0e8fea99 100644 --- a/tests/core/sys/posix/structs.odin +++ b/tests/core/sys/posix/structs.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, freebsd, openbsd, netbsd, haiku +#+build linux, darwin, freebsd, openbsd, netbsd package tests_core_posix import "core:log" diff --git a/tests/core/sys/posix/structs/structs.c b/tests/core/sys/posix/structs/structs.c index 6bb7df29e..fc8e1eb44 100644 --- a/tests/core/sys/posix/structs/structs.c +++ b/tests/core/sys/posix/structs/structs.c @@ -12,9 +12,7 @@ #include #include -#ifndef __HAIKU__ #include -#endif #include #include @@ -31,9 +29,7 @@ #include #include -#ifndef __HAIKU__ #include -#endif #include @@ -78,9 +74,7 @@ int main(int argc, char *argv[]) printf("passwd %zu %zu\n", sizeof(struct passwd), _Alignof(struct passwd)); -#ifndef __HAIKU__ printf("shmid_ds %zu %zu\n", sizeof(struct shmid_ds), _Alignof(struct shmid_ds)); -#endif printf("ipc_perm %zu %zu\n", sizeof(struct ipc_perm), _Alignof(struct ipc_perm)); printf("msqid_ds %zu %zu\n", sizeof(struct msqid_ds), _Alignof(struct msqid_ds)); @@ -114,9 +108,7 @@ int main(int argc, char *argv[]) printf("utimbuf %zu %zu\n", sizeof(struct utimbuf), _Alignof(struct utimbuf)); -#ifndef __HAIKU__ printf("wordexp_t %zu %zu\n", sizeof(wordexp_t), _Alignof(wordexp_t)); -#endif printf("time_t %zu %zu\n", sizeof(time_t), _Alignof(time_t)); printf("timespec %zu %zu\n", sizeof(struct timespec), _Alignof(struct timespec)); diff --git a/tests/core/sys/posix/structs/structs.odin b/tests/core/sys/posix/structs/structs.odin index 64833c437..43afc0048 100644 --- a/tests/core/sys/posix/structs/structs.odin +++ b/tests/core/sys/posix/structs/structs.odin @@ -45,9 +45,7 @@ main :: proc() { fmt.println("passwd", size_of(posix.passwd), align_of(posix.passwd)) - when ODIN_OS != .Haiku { - fmt.println("shmid_ds", size_of(posix.shmid_ds), align_of(posix.shmid_ds)) - } + fmt.println("shmid_ds", size_of(posix.shmid_ds), align_of(posix.shmid_ds)) fmt.println("ipc_perm", size_of(posix.ipc_perm), align_of(posix.ipc_perm)) fmt.println("msqid_ds", size_of(posix.msqid_ds), align_of(posix.msqid_ds)) @@ -81,9 +79,7 @@ main :: proc() { fmt.println("utimbuf", size_of(posix.utimbuf), align_of(posix.utimbuf)) - when ODIN_OS != .Haiku { - fmt.println("wordexp_t", size_of(posix.wordexp_t), align_of(posix.wordexp_t)) - } + fmt.println("wordexp_t", size_of(posix.wordexp_t), align_of(posix.wordexp_t)) fmt.println("time_t", size_of(posix.time_t), align_of(posix.time_t)) fmt.println("timespec", size_of(posix.timespec), align_of(posix.timespec)) From 748e1ecd3ffa8d9032134e2fe8e74285ffa0141c Mon Sep 17 00:00:00 2001 From: Ignacy Koper Date: Tue, 28 Apr 2026 16:27:17 +0200 Subject: [PATCH 015/228] removed Haiku from vendor:directx/dxc package Signed-off-by: Ignacy Koper --- vendor/directx/dxc/dxcdef_haiku.odin | 37 ---------------------------- 1 file changed, 37 deletions(-) delete mode 100644 vendor/directx/dxc/dxcdef_haiku.odin diff --git a/vendor/directx/dxc/dxcdef_haiku.odin b/vendor/directx/dxc/dxcdef_haiku.odin deleted file mode 100644 index 44df94177..000000000 --- a/vendor/directx/dxc/dxcdef_haiku.odin +++ /dev/null @@ -1,37 +0,0 @@ -#+build haiku -package directx_dxc -import "core:c" - -FILETIME :: struct { - dwLowDateTime: DWORD, - dwHighDateTime: DWORD, -} - -GUID :: struct { - Data1: DWORD, - Data2: WORD, - Data3: WORD, - Data4: [8]BYTE, -} - -BYTE :: distinct u8 -WORD :: u16 -DWORD :: u32 -BOOL :: distinct b32 -SIZE_T :: uint -ULONG :: c.ulong -CLSID :: GUID -IID :: GUID -LONG :: distinct c.long -HRESULT :: distinct LONG -wstring :: [^]c.wchar_t -BSTR :: wstring - -IUnknown :: struct { - using _iunknown_vtable: ^IUnknown_VTable, -} -IUnknown_VTable :: struct { - QueryInterface: proc "c" (this: ^IUnknown, riid: ^IID, ppvObject: ^rawptr) -> HRESULT, - AddRef: proc "c" (this: ^IUnknown) -> ULONG, - Release: proc "c" (this: ^IUnknown) -> ULONG, -} From 183a4c2d7ff0ae9c5d6de92f613555e434d1a100 Mon Sep 17 00:00:00 2001 From: Ignacy Koper Date: Tue, 28 Apr 2026 16:17:40 +0200 Subject: [PATCH 016/228] removed Haiku from base:runtime package Signed-off-by: Ignacy Koper --- base/runtime/core.odin | 2 -- base/runtime/entry_unix.odin | 2 +- base/runtime/heap_allocator_unix.odin | 2 +- base/runtime/os_specific_haiku.odin | 33 --------------------------- 4 files changed, 2 insertions(+), 37 deletions(-) delete mode 100644 base/runtime/os_specific_haiku.odin diff --git a/base/runtime/core.odin b/base/runtime/core.odin index d51cb28c3..995bc550e 100644 --- a/base/runtime/core.odin +++ b/base/runtime/core.odin @@ -512,7 +512,6 @@ Raw_Quaternion256_Vector_Scalar :: struct {vector: [3]f64, scalar: f64} FreeBSD, OpenBSD, NetBSD, - Haiku, WASI, JS, Orca, @@ -580,7 +579,6 @@ ALL_ODIN_OS_TYPES :: Odin_OS_Types{ .FreeBSD, .OpenBSD, .NetBSD, - .Haiku, .WASI, .JS, .Orca, diff --git a/base/runtime/entry_unix.odin b/base/runtime/entry_unix.odin index e2223d5d6..f63ff3793 100644 --- a/base/runtime/entry_unix.odin +++ b/base/runtime/entry_unix.odin @@ -1,5 +1,5 @@ #+private -#+build linux, darwin, freebsd, openbsd, netbsd, haiku +#+build linux, darwin, freebsd, openbsd, netbsd #+no-instrumentation package runtime diff --git a/base/runtime/heap_allocator_unix.odin b/base/runtime/heap_allocator_unix.odin index f6e7ce39e..bd5dc81b6 100644 --- a/base/runtime/heap_allocator_unix.odin +++ b/base/runtime/heap_allocator_unix.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, freebsd, openbsd, netbsd, haiku +#+build linux, darwin, freebsd, openbsd, netbsd #+private package runtime diff --git a/base/runtime/os_specific_haiku.odin b/base/runtime/os_specific_haiku.odin deleted file mode 100644 index 7e53539a1..000000000 --- a/base/runtime/os_specific_haiku.odin +++ /dev/null @@ -1,33 +0,0 @@ -#+build haiku -#+private -package runtime - -foreign import libc "system:c" - -_HAS_RAND_BYTES :: true - -foreign libc { - @(link_name="write") - _unix_write :: proc(fd: i32, buf: rawptr, size: int) -> int --- - - _errnop :: proc() -> ^i32 --- - - arc4random_buf :: proc(buf: [^]byte, nbytes: uint) --- -} - -_stderr_write :: proc "contextless" (data: []byte) -> (int, _OS_Errno) { - ret := _unix_write(2, raw_data(data), len(data)) - if ret < len(data) { - err := _errnop() - return int(ret), _OS_Errno(err^ if err != nil else 0) - } - return int(ret), 0 -} - -_rand_bytes :: proc "contextless" (dst: []byte) { - arc4random_buf(raw_data(dst), len(dst)) -} - -_exit :: proc "contextless" (code: int) -> ! { - trap() -} \ No newline at end of file From 22e23d354a726eaffa9f270523f87655254dc724 Mon Sep 17 00:00:00 2001 From: Ignacy Koper Date: Tue, 28 Apr 2026 16:34:52 +0200 Subject: [PATCH 017/228] removed Haiku from core:c/libc package Signed-off-by: Ignacy Koper --- core/c/libc/errno.odin | 19 ------------------- core/c/libc/locale.odin | 2 +- core/c/libc/signal.odin | 2 +- core/c/libc/stdio.odin | 30 ------------------------------ core/c/libc/stdlib.odin | 16 ---------------- core/c/libc/time.odin | 4 ++-- core/c/libc/wctype.odin | 4 ---- 7 files changed, 4 insertions(+), 73 deletions(-) diff --git a/core/c/libc/errno.odin b/core/c/libc/errno.odin index 138d70a80..1f6df52f7 100644 --- a/core/c/libc/errno.odin +++ b/core/c/libc/errno.odin @@ -80,25 +80,6 @@ when ODIN_OS == .Darwin { ERANGE :: 34 } -when ODIN_OS == .Haiku { - @(private="file") - @(default_calling_convention="c") - foreign libc { - @(link_name="_errnop") - _get_errno :: proc() -> ^int --- - } - - _HAIKU_USE_POSITIVE_POSIX_ERRORS :: #config(HAIKU_USE_POSITIVE_POSIX_ERRORS, false) - _POSIX_ERROR_FACTOR :: -1 when _HAIKU_USE_POSITIVE_POSIX_ERRORS else 1 - - @(private="file") _GENERAL_ERROR_BASE :: min(int) - @(private="file") _POSIX_ERROR_BASE :: _GENERAL_ERROR_BASE + 0x7000 - - EDOM :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 16) - EILSEQ :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 38) - ERANGE :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 17) -} - when ODIN_OS == .JS { _ :: libc _get_errno :: proc "c" () -> ^int { diff --git a/core/c/libc/locale.odin b/core/c/libc/locale.odin index 3216e0f90..59cbc6c6d 100644 --- a/core/c/libc/locale.odin +++ b/core/c/libc/locale.odin @@ -110,7 +110,7 @@ when ODIN_OS == .Windows { } } -when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Haiku || ODIN_OS == .Windows { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Windows { LC_ALL :: 0 LC_COLLATE :: 1 diff --git a/core/c/libc/signal.odin b/core/c/libc/signal.odin index cddf06916..cfe9768c9 100644 --- a/core/c/libc/signal.odin +++ b/core/c/libc/signal.odin @@ -34,7 +34,7 @@ when ODIN_OS == .Windows { SIGTERM :: 15 } -when ODIN_OS == .Linux || ODIN_OS == .FreeBSD || ODIN_OS == .Haiku || ODIN_OS == .OpenBSD || ODIN_OS == .NetBSD || ODIN_OS == .Darwin { +when ODIN_OS == .Linux || ODIN_OS == .FreeBSD || ODIN_OS == .OpenBSD || ODIN_OS == .NetBSD || ODIN_OS == .Darwin { SIG_ERR :: rawptr(~uintptr(0)) SIG_DFL :: rawptr(uintptr(0)) SIG_IGN :: rawptr(uintptr(1)) diff --git a/core/c/libc/stdio.odin b/core/c/libc/stdio.odin index db5b202e7..ffdb06f67 100644 --- a/core/c/libc/stdio.odin +++ b/core/c/libc/stdio.odin @@ -200,36 +200,6 @@ when ODIN_OS == .Darwin { } } -when ODIN_OS == .Haiku { - fpos_t :: distinct i64 - - _IOFBF :: 0 - _IOLBF :: 1 - _IONBF :: 2 - - BUFSIZ :: 8192 - - EOF :: int(-1) - - FOPEN_MAX :: 128 - - FILENAME_MAX :: 256 - - L_tmpnam :: 512 - - SEEK_SET :: 0 - SEEK_CUR :: 1 - SEEK_END :: 2 - - TMP_MAX :: 32768 - - foreign libc { - stderr: ^FILE - stdin: ^FILE - stdout: ^FILE - } -} - when ODIN_OS == .NetBSD { @(private) LRENAME :: "__posix_rename" @(private) LFGETPOS :: "__fgetpos50" diff --git a/core/c/libc/stdlib.odin b/core/c/libc/stdlib.odin index ca906a5f0..f63f40cd0 100644 --- a/core/c/libc/stdlib.odin +++ b/core/c/libc/stdlib.odin @@ -42,22 +42,6 @@ when ODIN_OS == .Linux { } } -when ODIN_OS == .Haiku { - RAND_MAX :: 0x7fffffff - - // GLIBC and MUSL only - @(private="file") - @(default_calling_convention="c") - foreign libc { - __ctype_get_mb_cur_max :: proc() -> ushort --- - } - - MB_CUR_MAX :: #force_inline proc() -> size_t { - return size_t(__ctype_get_mb_cur_max()) - } -} - - when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .OpenBSD { RAND_MAX :: 0x7fffffff diff --git a/core/c/libc/time.odin b/core/c/libc/time.odin index 6106923f5..d431a84d7 100644 --- a/core/c/libc/time.odin +++ b/core/c/libc/time.odin @@ -45,7 +45,7 @@ when ODIN_OS == .Windows { } } -when ODIN_OS == .Linux || ODIN_OS == .FreeBSD || ODIN_OS == .Darwin || ODIN_OS == .OpenBSD || ODIN_OS == .NetBSD || ODIN_OS == .Haiku || ODIN_OS == .JS { +when ODIN_OS == .Linux || ODIN_OS == .FreeBSD || ODIN_OS == .Darwin || ODIN_OS == .OpenBSD || ODIN_OS == .NetBSD || ODIN_OS == .JS { @(default_calling_convention="c") foreign libc { // 7.27.2 Time manipulation functions @@ -95,7 +95,7 @@ when ODIN_OS == .Linux || ODIN_OS == .FreeBSD || ODIN_OS == .Darwin || ODIN_OS = time_t :: distinct i64 - when ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .Haiku { + when ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD { clock_t :: distinct int32_t } else { clock_t :: distinct long diff --git a/core/c/libc/wctype.odin b/core/c/libc/wctype.odin index 6526a14e2..7d39e75c0 100644 --- a/core/c/libc/wctype.odin +++ b/core/c/libc/wctype.odin @@ -30,10 +30,6 @@ when ODIN_OS == .Windows { wctrans_t :: distinct int wctype_t :: distinct ulong -} else when ODIN_OS == .Haiku { - wctrans_t :: distinct i32 - wctype_t :: distinct i32 - } @(default_calling_convention="c") From c01e85ca67776fd18aabb6b3beae0f8c69b40f79 Mon Sep 17 00:00:00 2001 From: Ignacy Koper Date: Tue, 28 Apr 2026 16:48:32 +0200 Subject: [PATCH 018/228] removed core:sys/haiku package also removes Haiku from core:sys/info, core:os/old, core:path/filepath, core:dynlib, core:time, core:testing, and core:terminal (minor changes) Signed-off-by: Ignacy Koper --- core/dynlib/lb_haiku.odin | 23 -- core/os/old/dir_unix.odin | 2 +- core/os/old/os_haiku.odin | 544 ------------------------- core/os/old/stat_unix.odin | 2 +- core/path/filepath/path_unix.odin | 4 +- core/sys/haiku/errno.odin | 302 -------------- core/sys/haiku/find_directory.odin | 171 -------- core/sys/haiku/os.odin | 498 ---------------------- core/sys/haiku/types.odin | 56 --- core/sys/info/cpu_other.odin | 2 +- core/sys/info/platform_other.odin | 14 - core/terminal/terminal_posix.odin | 2 +- core/testing/signal_handler_libc.odin | 2 +- core/testing/signal_handler_other.odin | 1 - core/testing/signal_handler_posix.odin | 2 +- core/time/time_other.odin | 1 - core/time/time_unix.odin | 2 +- 17 files changed, 9 insertions(+), 1619 deletions(-) delete mode 100644 core/dynlib/lb_haiku.odin delete mode 100644 core/os/old/os_haiku.odin delete mode 100644 core/sys/haiku/errno.odin delete mode 100644 core/sys/haiku/find_directory.odin delete mode 100644 core/sys/haiku/os.odin delete mode 100644 core/sys/haiku/types.odin delete mode 100644 core/sys/info/platform_other.odin diff --git a/core/dynlib/lb_haiku.odin b/core/dynlib/lb_haiku.odin deleted file mode 100644 index 79e05505a..000000000 --- a/core/dynlib/lb_haiku.odin +++ /dev/null @@ -1,23 +0,0 @@ -#+build haiku -#+private -package dynlib - -import "base:runtime" - -_LIBRARY_FILE_EXTENSION :: "" - -_load_library :: proc(path: string, global_symbols: bool, allocator: runtime.Allocator) -> (Library, bool) { - return nil, false -} - -_unload_library :: proc(library: Library) -> bool { - return false -} - -_symbol_address :: proc(library: Library, symbol: string, allocator: runtime.Allocator) -> (ptr: rawptr, found: bool) { - return nil, false -} - -_last_error :: proc() -> string { - return "" -} diff --git a/core/os/old/dir_unix.odin b/core/os/old/dir_unix.odin index 95cc887d6..78115cbb9 100644 --- a/core/os/old/dir_unix.odin +++ b/core/os/old/dir_unix.odin @@ -1,4 +1,4 @@ -#+build darwin, linux, netbsd, freebsd, openbsd, haiku +#+build darwin, linux, netbsd, freebsd, openbsd package os_old import "core:strings" diff --git a/core/os/old/os_haiku.odin b/core/os/old/os_haiku.odin deleted file mode 100644 index a85f2d5c1..000000000 --- a/core/os/old/os_haiku.odin +++ /dev/null @@ -1,544 +0,0 @@ -package os_old - -foreign import lib "system:c" - -import "base:runtime" -import "core:c" -import "core:c/libc" -import "core:strings" -import "core:sys/haiku" -import "core:sys/posix" - -Handle :: i32 -Pid :: i32 -File_Time :: i64 -_Platform_Error :: haiku.Errno - -MAX_PATH :: haiku.PATH_MAX - -ENOSYS :: _Platform_Error(haiku.Errno.ENOSYS) - -INVALID_HANDLE :: ~Handle(0) - -stdin: Handle = 0 -stdout: Handle = 1 -stderr: Handle = 2 - -pid_t :: haiku.pid_t -off_t :: haiku.off_t -dev_t :: haiku.dev_t -ino_t :: haiku.ino_t -mode_t :: haiku.mode_t -nlink_t :: haiku.nlink_t -uid_t :: haiku.uid_t -gid_t :: haiku.gid_t -blksize_t :: haiku.blksize_t -blkcnt_t :: haiku.blkcnt_t -time_t :: haiku.time_t - - -Unix_File_Time :: struct { - seconds: time_t, - nanoseconds: c.long, -} - -OS_Stat :: struct { - device_id: dev_t, // device ID that this file resides on - serial: ino_t, // this file's serial inode ID - mode: mode_t, // file mode (rwx for user, group, etc) - nlink: nlink_t, // number of hard links to this file - uid: uid_t, // user ID of the file's owner - gid: gid_t, // group ID of the file's group - size: off_t, // file size, in bytes - rdev: dev_t, // device type (not used) - block_size: blksize_t, // optimal blocksize for I/O - - last_access: Unix_File_Time, // time of last access - modified: Unix_File_Time, // time of last data modification - status_change: Unix_File_Time, // time of last file status change - birthtime: Unix_File_Time, // time of file creation - - type: u32, // attribute/index type - - blocks: blkcnt_t, // blocks allocated for file -} - -/* file access modes for open() */ -O_RDONLY :: 0x0000 /* read only */ -O_WRONLY :: 0x0001 /* write only */ -O_RDWR :: 0x0002 /* read and write */ -O_ACCMODE :: 0x0003 /* mask to get the access modes above */ -O_RWMASK :: O_ACCMODE - -/* flags for open() */ -O_EXCL :: 0x0100 /* exclusive creat */ -O_CREATE :: 0x0200 /* create and open file */ -O_TRUNC :: 0x0400 /* open with truncation */ -O_NOCTTY :: 0x1000 /* don't make tty the controlling tty */ -O_NOTRAVERSE :: 0x2000 /* do not traverse leaf link */ - -// File type -S_IFMT :: 0o170000 // Type of file mask -S_IFIFO :: 0o010000 // Named pipe (fifo) -S_IFCHR :: 0o020000 // Character special -S_IFDIR :: 0o040000 // Directory -S_IFBLK :: 0o060000 // Block special -S_IFREG :: 0o100000 // Regular -S_IFLNK :: 0o120000 // Symbolic link -S_IFSOCK :: 0o140000 // Socket -S_ISVTX :: 0o001000 // Save swapped text even after use - -// File mode - // Read, write, execute/search by owner -S_IRWXU :: 0o0700 // RWX mask for owner -S_IRUSR :: 0o0400 // R for owner -S_IWUSR :: 0o0200 // W for owner -S_IXUSR :: 0o0100 // X for owner - - // Read, write, execute/search by group -S_IRWXG :: 0o0070 // RWX mask for group -S_IRGRP :: 0o0040 // R for group -S_IWGRP :: 0o0020 // W for group -S_IXGRP :: 0o0010 // X for group - - // Read, write, execute/search by others -S_IRWXO :: 0o0007 // RWX mask for other -S_IROTH :: 0o0004 // R for other -S_IWOTH :: 0o0002 // W for other -S_IXOTH :: 0o0001 // X for other - -S_ISUID :: 0o4000 // Set user id on execution -S_ISGID :: 0o2000 // Set group id on execution -S_ISTXT :: 0o1000 // Sticky bit - -S_ISLNK :: #force_inline proc(m: u32) -> bool { return (m & S_IFMT) == S_IFLNK } -S_ISREG :: #force_inline proc(m: u32) -> bool { return (m & S_IFMT) == S_IFREG } -S_ISDIR :: #force_inline proc(m: u32) -> bool { return (m & S_IFMT) == S_IFDIR } -S_ISCHR :: #force_inline proc(m: u32) -> bool { return (m & S_IFMT) == S_IFCHR } -S_ISBLK :: #force_inline proc(m: u32) -> bool { return (m & S_IFMT) == S_IFBLK } -S_ISFIFO :: #force_inline proc(m: u32) -> bool { return (m & S_IFMT) == S_IFIFO } -S_ISSOCK :: #force_inline proc(m: u32) -> bool { return (m & S_IFMT) == S_IFSOCK } - -__error :: libc.errno -_unix_open :: posix.open - -foreign lib { - @(link_name="fork") _unix_fork :: proc() -> pid_t --- - @(link_name="getthrid") _unix_getthrid :: proc() -> int --- - - @(link_name="close") _unix_close :: proc(fd: Handle) -> c.int --- - @(link_name="read") _unix_read :: proc(fd: Handle, buf: rawptr, size: c.size_t) -> c.ssize_t --- - @(link_name="pread") _unix_pread :: proc(fd: Handle, buf: rawptr, size: c.size_t, offset: i64) -> c.ssize_t --- - @(link_name="write") _unix_write :: proc(fd: Handle, buf: rawptr, size: c.size_t) -> c.ssize_t --- - @(link_name="pwrite") _unix_pwrite :: proc(fd: Handle, buf: rawptr, size: c.size_t, offset: i64) -> c.ssize_t --- - @(link_name="lseek") _unix_seek :: proc(fd: Handle, offset: off_t, whence: c.int) -> off_t --- - @(link_name="stat") _unix_stat :: proc(path: cstring, sb: ^OS_Stat) -> c.int --- - @(link_name="fstat") _unix_fstat :: proc(fd: Handle, sb: ^OS_Stat) -> c.int --- - @(link_name="lstat") _unix_lstat :: proc(path: cstring, sb: ^OS_Stat) -> c.int --- - @(link_name="readlink") _unix_readlink :: proc(path: cstring, buf: ^byte, bufsiz: c.size_t) -> c.ssize_t --- - @(link_name="access") _unix_access :: proc(path: cstring, mask: c.int) -> c.int --- - @(link_name="getcwd") _unix_getcwd :: proc(buf: cstring, len: c.size_t) -> cstring --- - @(link_name="chdir") _unix_chdir :: proc(path: cstring) -> c.int --- - @(link_name="rename") _unix_rename :: proc(old, new: cstring) -> c.int --- - @(link_name="unlink") _unix_unlink :: proc(path: cstring) -> c.int --- - @(link_name="rmdir") _unix_rmdir :: proc(path: cstring) -> c.int --- - @(link_name="mkdir") _unix_mkdir :: proc(path: cstring, mode: mode_t) -> c.int --- - @(link_name="fsync") _unix_fsync :: proc(fd: Handle) -> c.int --- - - @(link_name="getpagesize") _unix_getpagesize :: proc() -> c.int --- - @(link_name="sysconf") _sysconf :: proc(name: c.int) -> c.long --- - @(link_name="fdopendir") _unix_fdopendir :: proc(fd: Handle) -> Dir --- - @(link_name="closedir") _unix_closedir :: proc(dirp: Dir) -> c.int --- - @(link_name="rewinddir") _unix_rewinddir :: proc(dirp: Dir) --- - @(link_name="readdir_r") _unix_readdir_r :: proc(dirp: Dir, entry: ^Dirent, result: ^^Dirent) -> c.int --- - @(link_name="dup") _unix_dup :: proc(fd: Handle) -> Handle --- - - @(link_name="malloc") _unix_malloc :: proc(size: c.size_t) -> rawptr --- - @(link_name="calloc") _unix_calloc :: proc(num, size: c.size_t) -> rawptr --- - @(link_name="free") _unix_free :: proc(ptr: rawptr) --- - @(link_name="realloc") _unix_realloc :: proc(ptr: rawptr, size: c.size_t) -> rawptr --- - - @(link_name="getenv") _unix_getenv :: proc(cstring) -> cstring --- - @(link_name="realpath") _unix_realpath :: proc(path: cstring, resolved_path: [^]byte = nil) -> cstring --- - - @(link_name="exit") _unix_exit :: proc(status: c.int) -> ! --- - - @(link_name="dlopen") _unix_dlopen :: proc(filename: cstring, flags: c.int) -> rawptr --- - @(link_name="dlsym") _unix_dlsym :: proc(handle: rawptr, symbol: cstring) -> rawptr --- - @(link_name="dlclose") _unix_dlclose :: proc(handle: rawptr) -> c.int --- - @(link_name="dlerror") _unix_dlerror :: proc() -> cstring --- -} - -MAXNAMLEN :: haiku.NAME_MAX - -Dirent :: struct { - dev: dev_t, - pdef: dev_t, - ino: ino_t, - pino: ino_t, - reclen: u16, - name: [MAXNAMLEN + 1]byte, // name -} - -Dir :: distinct rawptr // DIR* - -@(require_results) -is_path_separator :: proc(r: rune) -> bool { - return r == '/' -} - -@(require_results, no_instrumentation) -get_last_error :: proc "contextless" () -> Error { - return Platform_Error(__error()^) -} - -@(require_results) -fork :: proc() -> (Pid, Error) { - pid := _unix_fork() - if pid == -1 { - return Pid(-1), get_last_error() - } - return Pid(pid), nil -} - -@(require_results) -open :: proc(path: string, flags: int = O_RDONLY, mode: int = 0) -> (Handle, Error) { - runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD() - cstr := strings.clone_to_cstring(path, context.temp_allocator) - handle := cast(Handle)_unix_open(cstr, transmute(posix.O_Flags)i32(flags), transmute(posix.mode_t)i32(mode)) - if handle == -1 { - return INVALID_HANDLE, get_last_error() - } - return handle, nil -} - -close :: proc(fd: Handle) -> Error { - result := _unix_close(fd) - if result == -1 { - return get_last_error() - } - return nil -} - -flush :: proc(fd: Handle) -> Error { - result := _unix_fsync(fd) - if result == -1 { - return get_last_error() - } - return nil -} - -// In practice a read/write call would probably never read/write these big buffers all at once, -// which is why the number of bytes is returned and why there are procs that will call this in a -// loop for you. -// We set a max of 1GB to keep alignment and to be safe. -@(private) -MAX_RW :: 1 << 30 - -read :: proc(fd: Handle, data: []byte) -> (int, Error) { - to_read := min(c.size_t(len(data)), MAX_RW) - bytes_read := _unix_read(fd, &data[0], to_read) - if bytes_read == -1 { - return -1, get_last_error() - } - return int(bytes_read), nil -} - -write :: proc(fd: Handle, data: []byte) -> (int, Error) { - if len(data) == 0 { - return 0, nil - } - - to_write := min(c.size_t(len(data)), MAX_RW) - bytes_written := _unix_write(fd, &data[0], to_write) - if bytes_written == -1 { - return -1, get_last_error() - } - return int(bytes_written), nil -} - -read_at :: proc(fd: Handle, data: []byte, offset: i64) -> (n: int, err: Error) { - if len(data) == 0 { - return 0, nil - } - - to_read := min(uint(len(data)), MAX_RW) - - bytes_read := _unix_pread(fd, raw_data(data), to_read, offset) - if bytes_read < 0 { - return -1, get_last_error() - } - return bytes_read, nil -} - -write_at :: proc(fd: Handle, data: []byte, offset: i64) -> (n: int, err: Error) { - if len(data) == 0 { - return 0, nil - } - - to_write := min(uint(len(data)), MAX_RW) - - bytes_written := _unix_pwrite(fd, raw_data(data), to_write, offset) - if bytes_written < 0 { - return -1, get_last_error() - } - return bytes_written, nil -} - -seek :: proc(fd: Handle, offset: i64, whence: int) -> (i64, Error) { - switch whence { - case SEEK_SET, SEEK_CUR, SEEK_END: - break - case: - return 0, .Invalid_Whence - } - res := _unix_seek(fd, offset, c.int(whence)) - if res == -1 { - errno := get_last_error() - switch errno { - case .BAD_VALUE: - return 0, .Invalid_Offset - } - return 0, errno - } - return res, nil -} - -@(require_results) -file_size :: proc(fd: Handle) -> (i64, Error) { - s, err := _fstat(fd) - if err != nil { - return -1, err - } - return s.size, nil -} - -// "Argv" arguments converted to Odin strings -args := _alloc_command_line_arguments() - -@(private, require_results) -_alloc_command_line_arguments :: proc "contextless" () -> []string { - context = runtime.default_context() - res := make([]string, len(runtime.args__)) - for arg, i in runtime.args__ { - res[i] = string(arg) - } - return res -} - -@(private, fini) -_delete_command_line_arguments :: proc "contextless" () { - context = runtime.default_context() - delete(args) -} - -@(private, require_results, no_sanitize_memory) -_stat :: proc(path: string) -> (OS_Stat, Error) { - runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD() - cstr := strings.clone_to_cstring(path, context.temp_allocator) - - // deliberately uninitialized - s: OS_Stat = --- - res := _unix_stat(cstr, &s) - if res == -1 { - return s, get_last_error() - } - return s, nil -} - -@(private, require_results, no_sanitize_memory) -_lstat :: proc(path: string) -> (OS_Stat, Error) { - runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD() - cstr := strings.clone_to_cstring(path, context.temp_allocator) - - // deliberately uninitialized - s: OS_Stat = --- - res := _unix_lstat(cstr, &s) - if res == -1 { - return s, get_last_error() - } - return s, nil -} - -@(private, require_results, no_sanitize_memory) -_fstat :: proc(fd: Handle) -> (OS_Stat, Error) { - // deliberately uninitialized - s: OS_Stat = --- - res := _unix_fstat(fd, &s) - if res == -1 { - return s, get_last_error() - } - return s, nil -} - -@(private) -_fdopendir :: proc(fd: Handle) -> (Dir, Error) { - dirp := _unix_fdopendir(fd) - if dirp == cast(Dir)nil { - return nil, get_last_error() - } - return dirp, nil -} - -@(private) -_closedir :: proc(dirp: Dir) -> Error { - rc := _unix_closedir(dirp) - if rc != 0 { - return get_last_error() - } - return nil -} - -@(private) -_rewinddir :: proc(dirp: Dir) { - _unix_rewinddir(dirp) -} - -@(private, require_results) -_readdir :: proc(dirp: Dir) -> (entry: Dirent, err: Error, end_of_stream: bool) { - result: ^Dirent - rc := _unix_readdir_r(dirp, &entry, &result) - - if rc != 0 { - err = get_last_error() - return - } - - if result == nil { - end_of_stream = true - return - } - - return -} - -@(private, require_results) -_readlink :: proc(path: string) -> (string, Error) { - runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = context.temp_allocator == context.allocator) - path_cstr := strings.clone_to_cstring(path, context.temp_allocator) - - bufsz : uint = MAX_PATH - buf := make([]byte, MAX_PATH) - for { - rc := _unix_readlink(path_cstr, &(buf[0]), bufsz) - if rc == -1 { - delete(buf) - return "", get_last_error() - } else if rc == int(bufsz) { - bufsz += MAX_PATH - delete(buf) - buf = make([]byte, bufsz) - } else { - return strings.string_from_ptr(&buf[0], rc), nil - } - } -} - -@(require_results) -absolute_path_from_handle :: proc(fd: Handle) -> (string, Error) { - return "", Error(ENOSYS) -} - -@(require_results) -absolute_path_from_relative :: proc(rel: string, allocator := context.allocator) -> (path: string, err: Error) { - rel := rel - if rel == "" { - rel = "." - } - - runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = context.temp_allocator == context.allocator) - rel_cstr := strings.clone_to_cstring(rel, context.temp_allocator) - - path_ptr := _unix_realpath(rel_cstr, nil) - if path_ptr == nil { - return "", get_last_error() - } - defer _unix_free(rawptr(path_ptr)) - - path_cstr := cstring(path_ptr) - return strings.clone(string(path_cstr), allocator) -} - -access :: proc(path: string, mask: int) -> (bool, Error) { - runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD() - cstr := strings.clone_to_cstring(path, context.temp_allocator) - res := _unix_access(cstr, c.int(mask)) - if res == -1 { - return false, get_last_error() - } - return true, nil -} - -@(require_results) -lookup_env_alloc :: proc(key: string, allocator := context.allocator) -> (value: string, found: bool) { - runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = context.temp_allocator == allocator) - path_str := strings.clone_to_cstring(key, context.temp_allocator) - // NOTE(tetra): Lifetime of 'cstr' is unclear, but _unix_free(cstr) segfaults. - cstr := _unix_getenv(path_str) - if cstr == nil { - return "", false - } - return strings.clone(string(cstr), allocator), true -} - -@(require_results) -lookup_env_buffer :: proc(buf: []u8, key: string) -> (value: string, err: Error) { - if len(key) + 1 > len(buf) { - return "", .Buffer_Full - } else { - copy(buf, key) - buf[len(key)] = 0 - } - - if value = string(_unix_getenv(cstring(raw_data(buf)))); value == "" { - return "", .Env_Var_Not_Found - } else { - if len(value) > len(buf) { - return "", .Buffer_Full - } else { - copy(buf, value) - return string(buf[:len(value)]), nil - } - } -} -lookup_env :: proc{lookup_env_alloc, lookup_env_buffer} - -@(require_results) -get_env_alloc :: proc(key: string, allocator := context.allocator) -> (value: string) { - value, _ = lookup_env(key, allocator) - return -} - -@(require_results) -get_env_buf :: proc(buf: []u8, key: string) -> (value: string) { - value, _ = lookup_env(buf, key) - return -} -get_env :: proc{get_env_alloc, get_env_buf} - - -@(private, require_results) -_processor_core_count :: proc() -> int { - info: haiku.system_info - haiku.get_system_info(&info) - return int(info.cpu_count) -} - -exit :: proc "contextless" (code: int) -> ! { - runtime._cleanup_runtime_contextless() - _unix_exit(i32(code)) -} - -@(require_results) -current_thread_id :: proc "contextless" () -> int { - return int(haiku.find_thread(nil)) -} - -@(private, require_results) -_dup :: proc(fd: Handle) -> (Handle, Error) { - dup := _unix_dup(fd) - if dup == -1 { - return INVALID_HANDLE, get_last_error() - } - return dup, nil -} diff --git a/core/os/old/stat_unix.odin b/core/os/old/stat_unix.odin index 0f7be62e2..d7f49e12b 100644 --- a/core/os/old/stat_unix.odin +++ b/core/os/old/stat_unix.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, freebsd, openbsd, netbsd, haiku +#+build linux, darwin, freebsd, openbsd, netbsd package os_old import "core:time" diff --git a/core/path/filepath/path_unix.odin b/core/path/filepath/path_unix.odin index 2e1b1419e..3079c31f9 100644 --- a/core/path/filepath/path_unix.odin +++ b/core/path/filepath/path_unix.odin @@ -1,6 +1,6 @@ -#+build linux, darwin, freebsd, openbsd, netbsd, haiku +#+build linux, darwin, freebsd, openbsd, netbsd package filepath SEPARATOR :: '/' SEPARATOR_STRING :: `/` -LIST_SEPARATOR :: ':' \ No newline at end of file +LIST_SEPARATOR :: ':' diff --git a/core/sys/haiku/errno.odin b/core/sys/haiku/errno.odin deleted file mode 100644 index ef5a360bd..000000000 --- a/core/sys/haiku/errno.odin +++ /dev/null @@ -1,302 +0,0 @@ -#+build haiku -package sys_haiku - -import "core:sys/posix" - -foreign import libroot "system:c" - -USE_POSITIVE_POSIX_ERRORS :: posix._HAIKU_USE_POSITIVE_POSIX_ERRORS -POSIX_ERROR_FACTOR :: posix._POSIX_ERROR_FACTOR - -// Error baselines -GENERAL_ERROR_BASE :: min(i32) -OS_ERROR_BASE :: GENERAL_ERROR_BASE + 0x1000 -APP_ERROR_BASE :: GENERAL_ERROR_BASE + 0x2000 -INTERFACE_ERROR_BASE :: GENERAL_ERROR_BASE + 0x3000 -MEDIA_ERROR_BASE :: GENERAL_ERROR_BASE + 0x4000 -TRANSLATION_ERROR_BASE :: GENERAL_ERROR_BASE + 0x4800 -MIDI_ERROR_BASE :: GENERAL_ERROR_BASE + 0x5000 -STORAGE_ERROR_BASE :: GENERAL_ERROR_BASE + 0x6000 -POSIX_ERROR_BASE :: GENERAL_ERROR_BASE + 0x7000 -MAIL_ERROR_BASE :: GENERAL_ERROR_BASE + 0x8000 -PRINT_ERROR_BASE :: GENERAL_ERROR_BASE + 0x9000 -DEVICE_ERROR_BASE :: GENERAL_ERROR_BASE + 0xA000 - -// Developer-defined errors start at (ERRORS_END+1) -ERRORS_END :: GENERAL_ERROR_BASE + 0xFFFF - -Errno :: enum i32 { - // General Errors - NO_MEMORY = GENERAL_ERROR_BASE + 0, - IO_ERROR = GENERAL_ERROR_BASE + 1, - PERMISSION_DENIED = GENERAL_ERROR_BASE + 2, - BAD_INDEX = GENERAL_ERROR_BASE + 3, - BAD_TYPE = GENERAL_ERROR_BASE + 4, - BAD_VALUE = GENERAL_ERROR_BASE + 5, - MISMATCHED_VALUES = GENERAL_ERROR_BASE + 6, - NAME_NOT_FOUND = GENERAL_ERROR_BASE + 7, - NAME_IN_USE = GENERAL_ERROR_BASE + 8, - TIMED_OUT = GENERAL_ERROR_BASE + 9, - INTERRUPTED = GENERAL_ERROR_BASE + 10, - WOULD_BLOCK = GENERAL_ERROR_BASE + 11, - CANCELED = GENERAL_ERROR_BASE + 12, - NO_INIT = GENERAL_ERROR_BASE + 13, - NOT_INITIALIZED = GENERAL_ERROR_BASE + 13, - BUSY = GENERAL_ERROR_BASE + 14, - NOT_ALLOWED = GENERAL_ERROR_BASE + 15, - BAD_DATA = GENERAL_ERROR_BASE + 16, - DONT_DO_THAT = GENERAL_ERROR_BASE + 17, - - ERROR = -1, - OK = 0, - NO_ERROR = 0, - - // Kernel Kit Errors - BAD_SEM_ID = OS_ERROR_BASE + 0, - NO_MORE_SEMS = OS_ERROR_BASE + 1, - BAD_THREAD_ID = OS_ERROR_BASE + 0x100, - NO_MORE_THREADS = OS_ERROR_BASE + 0x101, - BAD_THREAD_STATE = OS_ERROR_BASE + 0x102, - BAD_TEAM_ID = OS_ERROR_BASE + 0x103, - NO_MORE_TEAMS = OS_ERROR_BASE + 0x104, - BAD_PORT_ID = OS_ERROR_BASE + 0x200, - NO_MORE_PORTS = OS_ERROR_BASE + 0x201, - BAD_IMAGE_ID = OS_ERROR_BASE + 0x300, - BAD_ADDRESS = OS_ERROR_BASE + 0x301, - NOT_AN_EXECUTABLE = OS_ERROR_BASE + 0x302, - MISSING_LIBRARY = OS_ERROR_BASE + 0x303, - MISSING_SYMBOL = OS_ERROR_BASE + 0x304, - UNKNOWN_EXECUTABLE = OS_ERROR_BASE + 0x305, - LEGACY_EXECUTABLE = OS_ERROR_BASE + 0x306, - - DEBUGGER_ALREADY_INSTALLED = OS_ERROR_BASE + 0x400, - - // Application Kit Errors - BAD_REPLY = APP_ERROR_BASE + 0, - DUPLICATE_REPLY = APP_ERROR_BASE + 1, - MESSAGE_TO_SELF = APP_ERROR_BASE + 2, - BAD_HANDLER = APP_ERROR_BASE + 3, - ALREADY_RUNNING = APP_ERROR_BASE + 4, - LAUNCH_FAILED = APP_ERROR_BASE + 5, - AMBIGUOUS_APP_LAUNCH = APP_ERROR_BASE + 6, - UNKNOWN_MIME_TYPE = APP_ERROR_BASE + 7, - BAD_SCRIPT_SYNTAX = APP_ERROR_BASE + 8, - LAUNCH_FAILED_NO_RESOLVE_LINK = APP_ERROR_BASE + 9, - LAUNCH_FAILED_EXECUTABLE = APP_ERROR_BASE + 10, - LAUNCH_FAILED_APP_NOT_FOUND = APP_ERROR_BASE + 11, - LAUNCH_FAILED_APP_IN_TRASH = APP_ERROR_BASE + 12, - LAUNCH_FAILED_NO_PREFERRED_APP = APP_ERROR_BASE + 13, - LAUNCH_FAILED_FILES_APP_NOT_FOUND = APP_ERROR_BASE + 14, - BAD_MIME_SNIFFER_RULE = APP_ERROR_BASE + 15, - NOT_A_MESSAGE = APP_ERROR_BASE + 16, - SHUTDOWN_CANCELLED = APP_ERROR_BASE + 17, - SHUTTING_DOWN = APP_ERROR_BASE + 18, - - // Storage Kit/File System Errors - FILE_ERROR = STORAGE_ERROR_BASE + 0, - // 1 was B_FILE_NOT_FOUND (deprecated) - FILE_EXISTS = STORAGE_ERROR_BASE + 2, - ENTRY_NOT_FOUND = STORAGE_ERROR_BASE + 3, - NAME_TOO_LONG = STORAGE_ERROR_BASE + 4, - NOT_A_DIRECTORY = STORAGE_ERROR_BASE + 5, - DIRECTORY_NOT_EMPTY = STORAGE_ERROR_BASE + 6, - DEVICE_FULL = STORAGE_ERROR_BASE + 7, - READ_ONLY_DEVICE = STORAGE_ERROR_BASE + 8, - IS_A_DIRECTORY = STORAGE_ERROR_BASE + 9, - NO_MORE_FDS = STORAGE_ERROR_BASE + 10, - CROSS_DEVICE_LINK = STORAGE_ERROR_BASE + 11, - LINK_LIMIT = STORAGE_ERROR_BASE + 12, - BUSTED_PIPE = STORAGE_ERROR_BASE + 13, - UNSUPPORTED = STORAGE_ERROR_BASE + 14, - PARTITION_TOO_SMALL = STORAGE_ERROR_BASE + 15, - PARTIAL_READ = STORAGE_ERROR_BASE + 16, - PARTIAL_WRITE = STORAGE_ERROR_BASE + 17, - - EIO = posix.EIO, - EACCES = posix.EACCES, - EINVAL = posix.EINVAL, - ETIMEDOUT = posix.ETIMEDOUT, - EINTR = posix.EINTR, - EAGAIN = posix.EAGAIN, - EWOULDBLOCK = posix.EWOULDBLOCK, - EBUSY = posix.EBUSY, - EPERM = posix.EPERM, - EFAULT = posix.EFAULT, - ENOEXEC = posix.ENOEXEC, - EBADF = posix.EBADF, - EEXIST = posix.EEXIST, - ENOENT = posix.ENOENT, - ENAMETOOLONG = posix.ENAMETOOLONG, - ENOTDIR = posix.ENOTDIR, - ENOTEMPTY = posix.ENOTEMPTY, - ENOSPC = posix.ENOSPC, - EROFS = posix.EROFS, - EISDIR = posix.EISDIR, - EMFILE = posix.EMFILE, - EXDEV = posix.EXDEV, - ELOOP = posix.ELOOP, - EPIPE = posix.EPIPE, - ENOMEM = posix.ENOMEM, - E2BIG = posix.E2BIG, - ECHILD = posix.ECHILD, - EDEADLK = posix.EDEADLK, - EFBIG = posix.EFBIG, - EMLINK = posix.EMLINK, - ENFILE = posix.ENFILE, - ENODEV = posix.ENODEV, - ENOLCK = posix.ENOLCK, - ENOSYS = posix.ENOSYS, - ENOTTY = posix.ENOTTY, - ENXIO = posix.ENXIO, - ESPIPE = posix.ESPIPE, - ESRCH = posix.ESRCH, - EDOM = posix.EDOM, - ERANGE = posix.ERANGE, - EPROTOTYPE = posix.EPROTOTYPE, - EPROTONOSUPPORT = posix.EPROTONOSUPPORT, - EAFNOSUPPORT = posix.EAFNOSUPPORT, - EADDRINUSE = posix.EADDRINUSE, - EADDRNOTAVAIL = posix.EADDRNOTAVAIL, - ENETDOWN = posix.ENETDOWN, - ENETUNREACH = posix.ENETUNREACH, - ENETRESET = posix.ENETRESET, - ECONNABORTED = posix.ECONNABORTED, - ECONNRESET = posix.ECONNRESET, - EISCONN = posix.EISCONN, - ENOTCONN = posix.ENOTCONN, - ECONNREFUSED = posix.ECONNREFUSED, - EHOSTUNREACH = posix.EHOSTUNREACH, - ENOPROTOOPT = posix.ENOPROTOOPT, - ENOBUFS = posix.ENOBUFS, - EINPROGRESS = posix.EINPROGRESS, - EALREADY = posix.EALREADY, - EILSEQ = posix.EILSEQ, - ENOMSG = posix.ENOMSG, - ESTALE = posix.ESTALE, - EOVERFLOW = posix.EOVERFLOW, - EMSGSIZE = posix.EMSGSIZE, - EOPNOTSUPP = posix.EOPNOTSUPP, - ENOTSOCK = posix.ENOTSOCK, - EBADMSG = posix.EBADMSG, - ECANCELED = posix.ECANCELED, - EDESTADDRREQ = posix.EDESTADDRREQ, - EDQUOT = posix.EDQUOT, - EIDRM = posix.EIDRM, - EMULTIHOP = posix.EMULTIHOP, - ENODATA = posix.ENODATA, - ENOLINK = posix.ENOLINK, - ENOSR = posix.ENOSR, - ENOSTR = posix.ENOSTR, - ENOTSUP = posix.ENOTSUP, - EPROTO = posix.EPROTO, - ETIME = posix.ETIME, - ETXTBSY = posix.ETXTBSY, - ENOTRECOVERABLE = posix.ENOTRECOVERABLE, - EOWNERDEAD = posix.EOWNERDEAD, - - // New error codes that can be mapped to POSIX errors - TOO_MANY_ARGS = POSIX_ERROR_FACTOR * E2BIG, - FILE_TOO_LARGE = POSIX_ERROR_FACTOR * EFBIG, - DEVICE_NOT_FOUND = POSIX_ERROR_FACTOR * ENODEV, - RESULT_NOT_REPRESENTABLE = POSIX_ERROR_FACTOR * ERANGE, - BUFFER_OVERFLOW = POSIX_ERROR_FACTOR * EOVERFLOW, - NOT_SUPPORTED = POSIX_ERROR_FACTOR * EOPNOTSUPP, - - // Media Kit Errors - STREAM_NOT_FOUND = MEDIA_ERROR_BASE + 0, - SERVER_NOT_FOUND = MEDIA_ERROR_BASE + 1, - RESOURCE_NOT_FOUND = MEDIA_ERROR_BASE + 2, - RESOURCE_UNAVAILABLE = MEDIA_ERROR_BASE + 3, - BAD_SUBSCRIBER = MEDIA_ERROR_BASE + 4, - SUBSCRIBER_NOT_ENTERED = MEDIA_ERROR_BASE + 5, - BUFFER_NOT_AVAILABLE = MEDIA_ERROR_BASE + 6, - LAST_BUFFER_ERROR = MEDIA_ERROR_BASE + 7, - MEDIA_SYSTEM_FAILURE = MEDIA_ERROR_BASE + 100, - MEDIA_BAD_NODE = MEDIA_ERROR_BASE + 101, - MEDIA_NODE_BUSY = MEDIA_ERROR_BASE + 102, - MEDIA_BAD_FORMAT = MEDIA_ERROR_BASE + 103, - MEDIA_BAD_BUFFER = MEDIA_ERROR_BASE + 104, - MEDIA_TOO_MANY_NODES = MEDIA_ERROR_BASE + 105, - MEDIA_TOO_MANY_BUFFERS = MEDIA_ERROR_BASE + 106, - MEDIA_NODE_ALREADY_EXISTS = MEDIA_ERROR_BASE + 107, - MEDIA_BUFFER_ALREADY_EXISTS = MEDIA_ERROR_BASE + 108, - MEDIA_CANNOT_SEEK = MEDIA_ERROR_BASE + 109, - MEDIA_CANNOT_CHANGE_RUN_MODE = MEDIA_ERROR_BASE + 110, - MEDIA_APP_ALREADY_REGISTERED = MEDIA_ERROR_BASE + 111, - MEDIA_APP_NOT_REGISTERED = MEDIA_ERROR_BASE + 112, - MEDIA_CANNOT_RECLAIM_BUFFERS = MEDIA_ERROR_BASE + 113, - MEDIA_BUFFERS_NOT_RECLAIMED = MEDIA_ERROR_BASE + 114, - MEDIA_TIME_SOURCE_STOPPED = MEDIA_ERROR_BASE + 115, - MEDIA_TIME_SOURCE_BUSY = MEDIA_ERROR_BASE + 116, - MEDIA_BAD_SOURCE = MEDIA_ERROR_BASE + 117, - MEDIA_BAD_DESTINATION = MEDIA_ERROR_BASE + 118, - MEDIA_ALREADY_CONNECTED = MEDIA_ERROR_BASE + 119, - MEDIA_NOT_CONNECTED = MEDIA_ERROR_BASE + 120, - MEDIA_BAD_CLIP_FORMAT = MEDIA_ERROR_BASE + 121, - MEDIA_ADDON_FAILED = MEDIA_ERROR_BASE + 122, - MEDIA_ADDON_DISABLED = MEDIA_ERROR_BASE + 123, - MEDIA_CHANGE_IN_PROGRESS = MEDIA_ERROR_BASE + 124, - MEDIA_STALE_CHANGE_COUNT = MEDIA_ERROR_BASE + 125, - MEDIA_ADDON_RESTRICTED = MEDIA_ERROR_BASE + 126, - MEDIA_NO_HANDLER = MEDIA_ERROR_BASE + 127, - MEDIA_DUPLICATE_FORMAT = MEDIA_ERROR_BASE + 128, - MEDIA_REALTIME_DISABLED = MEDIA_ERROR_BASE + 129, - MEDIA_REALTIME_UNAVAILABLE = MEDIA_ERROR_BASE + 130, - - // Mail Kit Errors - MAIL_NO_DAEMON = MAIL_ERROR_BASE + 0, - MAIL_UNKNOWN_USER = MAIL_ERROR_BASE + 1, - MAIL_WRONG_PASSWORD = MAIL_ERROR_BASE + 2, - MAIL_UNKNOWN_HOST = MAIL_ERROR_BASE + 3, - MAIL_ACCESS_ERROR = MAIL_ERROR_BASE + 4, - MAIL_UNKNOWN_FIELD = MAIL_ERROR_BASE + 5, - MAIL_NO_RECIPIENT = MAIL_ERROR_BASE + 6, - MAIL_INVALID_MAIL = MAIL_ERROR_BASE + 7, - - // Printing Errors - NO_PRINT_SERVER = PRINT_ERROR_BASE + 0, - - // Device Kit Errors - DEV_INVALID_IOCTL = DEVICE_ERROR_BASE + 0, - DEV_NO_MEMORY = DEVICE_ERROR_BASE + 1, - DEV_BAD_DRIVE_NUM = DEVICE_ERROR_BASE + 2, - DEV_NO_MEDIA = DEVICE_ERROR_BASE + 3, - DEV_UNREADABLE = DEVICE_ERROR_BASE + 4, - DEV_FORMAT_ERROR = DEVICE_ERROR_BASE + 5, - DEV_TIMEOUT = DEVICE_ERROR_BASE + 6, - DEV_RECALIBRATE_ERROR = DEVICE_ERROR_BASE + 7, - DEV_SEEK_ERROR = DEVICE_ERROR_BASE + 8, - DEV_ID_ERROR = DEVICE_ERROR_BASE + 9, - DEV_READ_ERROR = DEVICE_ERROR_BASE + 10, - DEV_WRITE_ERROR = DEVICE_ERROR_BASE + 11, - DEV_NOT_READY = DEVICE_ERROR_BASE + 12, - DEV_MEDIA_CHANGED = DEVICE_ERROR_BASE + 13, - DEV_MEDIA_CHANGE_REQUESTED = DEVICE_ERROR_BASE + 14, - DEV_RESOURCE_CONFLICT = DEVICE_ERROR_BASE + 15, - DEV_CONFIGURATION_ERROR = DEVICE_ERROR_BASE + 16, - DEV_DISABLED_BY_USER = DEVICE_ERROR_BASE + 17, - DEV_DOOR_OPEN = DEVICE_ERROR_BASE + 18, - DEV_INVALID_PIPE = DEVICE_ERROR_BASE + 19, - DEV_CRC_ERROR = DEVICE_ERROR_BASE + 20, - DEV_STALLED = DEVICE_ERROR_BASE + 21, - DEV_BAD_PID = DEVICE_ERROR_BASE + 22, - DEV_UNEXPECTED_PID = DEVICE_ERROR_BASE + 23, - DEV_DATA_OVERRUN = DEVICE_ERROR_BASE + 24, - DEV_DATA_UNDERRUN = DEVICE_ERROR_BASE + 25, - DEV_FIFO_OVERRUN = DEVICE_ERROR_BASE + 26, - DEV_FIFO_UNDERRUN = DEVICE_ERROR_BASE + 27, - DEV_PENDING = DEVICE_ERROR_BASE + 28, - DEV_MULTIPLE_ERRORS = DEVICE_ERROR_BASE + 29, - DEV_TOO_LATE = DEVICE_ERROR_BASE + 30, - - // Translation Kit Errors - TRANSLATION_BASE_ERROR = TRANSLATION_ERROR_BASE + 0, - NO_TRANSLATOR = TRANSLATION_ERROR_BASE + 1, - ILLEGAL_DATA = TRANSLATION_ERROR_BASE + 2, -} - -@(default_calling_convention="c") -foreign libroot { - _to_positive_error :: proc(error: i32) -> i32 --- - _to_negative_error :: proc(error: i32) -> i32 --- -} diff --git a/core/sys/haiku/find_directory.odin b/core/sys/haiku/find_directory.odin deleted file mode 100644 index c700bd53b..000000000 --- a/core/sys/haiku/find_directory.odin +++ /dev/null @@ -1,171 +0,0 @@ -#+build haiku -package sys_haiku - -import "base:intrinsics" - -foreign import libroot "system:c" - -directory_which :: enum i32 { - // Per volume directories - DESKTOP_DIRECTORY = 0, - TRASH_DIRECTORY, - - // System directories - SYSTEM_DIRECTORY = 1000, - SYSTEM_ADDONS_DIRECTORY = 1002, - SYSTEM_BOOT_DIRECTORY, - SYSTEM_FONTS_DIRECTORY, - SYSTEM_LIB_DIRECTORY, - SYSTEM_SERVERS_DIRECTORY, - SYSTEM_APPS_DIRECTORY, - SYSTEM_BIN_DIRECTORY, - SYSTEM_DOCUMENTATION_DIRECTORY = 1010, - SYSTEM_PREFERENCES_DIRECTORY, - SYSTEM_TRANSLATORS_DIRECTORY, - SYSTEM_MEDIA_NODES_DIRECTORY, - SYSTEM_SOUNDS_DIRECTORY, - SYSTEM_DATA_DIRECTORY, - SYSTEM_DEVELOP_DIRECTORY, - SYSTEM_PACKAGES_DIRECTORY, - SYSTEM_HEADERS_DIRECTORY, - SYSTEM_ETC_DIRECTORY = 2008, - SYSTEM_SETTINGS_DIRECTORY = 2010, - SYSTEM_LOG_DIRECTORY = 2012, - SYSTEM_SPOOL_DIRECTORY, - SYSTEM_TEMP_DIRECTORY, - SYSTEM_VAR_DIRECTORY, - SYSTEM_CACHE_DIRECTORY = 2020, - SYSTEM_NONPACKAGED_DIRECTORY = 2023, - SYSTEM_NONPACKAGED_ADDONS_DIRECTORY, - SYSTEM_NONPACKAGED_TRANSLATORS_DIRECTORY, - SYSTEM_NONPACKAGED_MEDIA_NODES_DIRECTORY, - SYSTEM_NONPACKAGED_BIN_DIRECTORY, - SYSTEM_NONPACKAGED_DATA_DIRECTORY, - SYSTEM_NONPACKAGED_FONTS_DIRECTORY, - SYSTEM_NONPACKAGED_SOUNDS_DIRECTORY, - SYSTEM_NONPACKAGED_DOCUMENTATION_DIRECTORY, - SYSTEM_NONPACKAGED_LIB_DIRECTORY, - SYSTEM_NONPACKAGED_HEADERS_DIRECTORY, - SYSTEM_NONPACKAGED_DEVELOP_DIRECTORY, - - // User directories. These are interpreted in the context of the user making the find_directory call. - USER_DIRECTORY = 3000, - USER_CONFIG_DIRECTORY, - USER_ADDONS_DIRECTORY, - USER_BOOT_DIRECTORY, - USER_FONTS_DIRECTORY, - USER_LIB_DIRECTORY, - USER_SETTINGS_DIRECTORY, - USER_DESKBAR_DIRECTORY, - USER_PRINTERS_DIRECTORY, - USER_TRANSLATORS_DIRECTORY, - USER_MEDIA_NODES_DIRECTORY, - USER_SOUNDS_DIRECTORY, - USER_DATA_DIRECTORY, - USER_CACHE_DIRECTORY, - USER_PACKAGES_DIRECTORY, - USER_HEADERS_DIRECTORY, - USER_NONPACKAGED_DIRECTORY, - USER_NONPACKAGED_ADDONS_DIRECTORY, - USER_NONPACKAGED_TRANSLATORS_DIRECTORY, - USER_NONPACKAGED_MEDIA_NODES_DIRECTORY, - USER_NONPACKAGED_BIN_DIRECTORY, - USER_NONPACKAGED_DATA_DIRECTORY, - USER_NONPACKAGED_FONTS_DIRECTORY, - USER_NONPACKAGED_SOUNDS_DIRECTORY, - USER_NONPACKAGED_DOCUMENTATION_DIRECTORY, - USER_NONPACKAGED_LIB_DIRECTORY, - USER_NONPACKAGED_HEADERS_DIRECTORY, - USER_NONPACKAGED_DEVELOP_DIRECTORY, - USER_DEVELOP_DIRECTORY, - USER_DOCUMENTATION_DIRECTORY, - USER_SERVERS_DIRECTORY, - USER_APPS_DIRECTORY, - USER_BIN_DIRECTORY, - USER_PREFERENCES_DIRECTORY, - USER_ETC_DIRECTORY, - USER_LOG_DIRECTORY, - USER_SPOOL_DIRECTORY, - USER_VAR_DIRECTORY, - - // Global directories - APPS_DIRECTORY = 4000, - PREFERENCES_DIRECTORY, - UTILITIES_DIRECTORY, - PACKAGE_LINKS_DIRECTORY, - - // Obsolete: Legacy BeOS definition to be phased out - BEOS_DIRECTORY = 1000, - BEOS_SYSTEM_DIRECTORY, - BEOS_ADDONS_DIRECTORY, - BEOS_BOOT_DIRECTORY, - BEOS_FONTS_DIRECTORY, - BEOS_LIB_DIRECTORY, - BEOS_SERVERS_DIRECTORY, - BEOS_APPS_DIRECTORY, - BEOS_BIN_DIRECTORY, - BEOS_ETC_DIRECTORY, - BEOS_DOCUMENTATION_DIRECTORY, - BEOS_PREFERENCES_DIRECTORY, - BEOS_TRANSLATORS_DIRECTORY, - BEOS_MEDIA_NODES_DIRECTORY, - BEOS_SOUNDS_DIRECTORY, -} - -find_path_flag :: enum u32 { - CREATE_DIRECTORY = intrinsics.constant_log2(0x0001), - CREATE_PARENT_DIRECTORY = intrinsics.constant_log2(0x0002), - EXISTING_ONLY = intrinsics.constant_log2(0x0004), - - // find_paths() only - SYSTEM_ONLY = intrinsics.constant_log2(0x0010), - USER_ONLY = intrinsics.constant_log2(0x0020), -} -find_path_flags :: distinct bit_set[find_path_flag; u32] - -path_base_directory :: enum i32 { - INSTALLATION_LOCATION_DIRECTORY, - ADD_ONS_DIRECTORY, - APPS_DIRECTORY, - BIN_DIRECTORY, - BOOT_DIRECTORY, - CACHE_DIRECTORY, - DATA_DIRECTORY, - DEVELOP_DIRECTORY, - DEVELOP_LIB_DIRECTORY, - DOCUMENTATION_DIRECTORY, - ETC_DIRECTORY, - FONTS_DIRECTORY, - HEADERS_DIRECTORY, - LIB_DIRECTORY, - LOG_DIRECTORY, - MEDIA_NODES_DIRECTORY, - PACKAGES_DIRECTORY, - PREFERENCES_DIRECTORY, - SERVERS_DIRECTORY, - SETTINGS_DIRECTORY, - SOUNDS_DIRECTORY, - SPOOL_DIRECTORY, - TRANSLATORS_DIRECTORY, - VAR_DIRECTORY, - - // find_path() only - IMAGE_PATH = 1000, - PACKAGE_PATH, -} - -// value that can be used instead of a pointer to a symbol in the program image -APP_IMAGE_SYMBOL :: rawptr(addr_t(0)) -// pointer to a symbol in the callers image (same as B_CURRENT_IMAGE_SYMBOL) -current_image_symbol :: proc "contextless" () -> rawptr { return rawptr(current_image_symbol) } - -@(default_calling_convention="c") -foreign libroot { - find_directory :: proc(which: directory_which, volume: dev_t, createIt: bool, pathString: [^]byte, length: i32) -> status_t --- - find_path :: proc(codePointer: rawptr, baseDirectory: path_base_directory, subPath: cstring, pathBuffer: [^]byte, bufferSize: uint) -> status_t --- - find_path_etc :: proc(codePointer: rawptr, dependency: cstring, architecture: cstring, baseDirectory: path_base_directory, subPath: cstring, flags: find_path_flags, pathBuffer: [^]byte, bufferSize: uint) -> status_t --- - find_path_for_path :: proc(path: cstring, baseDirectory: path_base_directory, subPath: cstring, pathBuffer: [^]byte, bufferSize: uint) -> status_t --- - find_path_for_path_etc :: proc(path: cstring, dependency: cstring, architecture: cstring, baseDirectory: path_base_directory, subPath: cstring, flags: find_path_flags, pathBuffer: [^]byte, bufferSize: uint) -> status_t --- - find_paths :: proc(baseDirectory: path_base_directory, subPath: cstring, _paths: ^[^][^]byte, _pathCount: ^uint) -> status_t --- - find_paths_etc :: proc(architecture: cstring, baseDirectory: path_base_directory, subPath: cstring, flags: find_path_flags, _paths: ^[^][^]byte, _pathCount: ^uint) -> status_t --- -} diff --git a/core/sys/haiku/os.odin b/core/sys/haiku/os.odin deleted file mode 100644 index 3edee88b5..000000000 --- a/core/sys/haiku/os.odin +++ /dev/null @@ -1,498 +0,0 @@ -#+build haiku -package sys_haiku - -import "base:intrinsics" -import "core:sys/posix" - -foreign import libroot "system:c" - -PATH_MAX :: 1024 -NAME_MAX :: 256 -MAXPATHLEN :: PATH_MAX - -FILE_NAME_LENGTH :: NAME_MAX -PATH_NAME_LENGTH :: MAXPATHLEN -OS_NAME_LENGTH :: 32 - -// Areas - -area_info :: struct { - area: area_id, - name: [OS_NAME_LENGTH]byte, - size: uint, - lock: u32, - protection: u32, - team: team_id, - ram_size: u32, - copy_count: u32, - in_count: u32, - out_count: u32, - address: rawptr, -} - -area_locking :: enum u32 { - NO_LOCK = 0, - LAZY_LOCK = 1, - FULL_LOCK = 2, - CONTIGUOUS = 3, - LOMEM = 4, // CONTIGUOUS, < 16 MB physical address - _32_BIT_FULL_LOCK = 5, // FULL_LOCK, < 4 GB physical addresses - _32_BIT_CONTIGUOUS = 6, // CONTIGUOUS, < 4 GB physical address -} - -// for create_area() and clone_area() -address_spec :: enum u32 { - ANY_ADDRESS = 0, - EXACT_ADDRESS = 1, - BASE_ADDRESS = 2, - CLONE_ADDRESS = 3, - ANY_KERNEL_ADDRESS = 4, - // ANY_KERNEL_BLOCK_ADDRESS = 5, - RANDOMIZED_ANY_ADDRESS = 6, - RANDOMIZED_BASE_ADDRESS = 7, -} - -area_protection_flag :: enum u32 { - READ_AREA = 0, - WRITE_AREA = 1, - EXECUTE_AREA = 2, - // "stack" protection is not available on most platforms - it's used - // to only commit memory as needed, and have guard pages at the - // bottom of the stack. - STACK_AREA = 3, - CLONEABLE_AREA = 8, -} -area_protection_flags :: distinct bit_set[area_protection_flag; u32] - -@(default_calling_convention="c") -foreign libroot { - create_area :: proc(name: cstring, startAddress: ^rawptr, addressSpec: address_spec, size: uint, lock: area_locking, protection: area_protection_flags) -> area_id --- - clone_area :: proc(name: cstring, destAddress: ^rawptr, addressSpec: address_spec, protection: area_protection_flags, source: area_id) -> area_id --- - find_area :: proc(name: cstring) -> area_id --- - area_for :: proc(address: rawptr) -> area_id --- - delete_area :: proc(id: area_id) -> status_t --- - resize_area :: proc(id: area_id, newSize: uint) -> status_t --- - set_area_protection :: proc(id: area_id, newProtection: area_protection_flags) -> status_t --- - _get_area_info :: proc(id: area_id, areaInfo: ^area_info, size: uint) -> status_t --- - _get_next_area_info :: proc(team: team_id, cookie: ^int, areaInfo: ^area_info, size: uint) -> status_t --- -} - -// Ports - -port_info :: struct { - port: port_id, - team: team_id, - name: [OS_NAME_LENGTH]byte, - capacity: i32, // queue depth - queue_count: i32, // # msgs waiting to be read - total_count: i32, // total # msgs read so far -} - -port_flag :: enum u32 { - USE_USER_MEMCPY = intrinsics.constant_log2(0x80000000), - // read the message, but don't remove it; kernel-only; memory must be locked - PEEK_PORT_MESSAGE = intrinsics.constant_log2(0x100), -} -port_flags :: distinct bit_set[port_flag; u32] - -@(default_calling_convention="c") -foreign libroot { - create_port :: proc(capacity: i32, name: cstring) -> port_id --- - find_port :: proc(name: cstring) -> port_id --- - read_port :: proc(port: port_id, code: ^i32, buffer: rawptr, bufferSize: uint) -> int --- - read_port_etc :: proc(port: port_id, code: ^i32, buffer: rawptr, bufferSize: uint, flags: port_flags, timeout: bigtime_t) -> int --- - write_port :: proc(port: port_id, code: i32, buffer: rawptr, bufferSize: uint) -> status_t --- - write_port_etc :: proc(port: port_id, code: i32, buffer: rawptr, bufferSize: uint, flags: port_flags, timeout: bigtime_t) -> status_t --- - close_port :: proc(port: port_id) -> status_t --- - delete_port :: proc(port: port_id) -> status_t --- - port_buffer_size :: proc(port: port_id) -> int --- - port_buffer_size_etc :: proc(port: port_id, flags: port_flags, timeout: bigtime_t) -> int --- - port_count :: proc(port: port_id) -> int --- - set_port_owner :: proc(port: port_id, team: team_id) -> status_t --- - _get_port_info :: proc(port: port_id, portInfo: ^port_info, portInfoSize: uint) -> status_t --- - _get_next_port_info :: proc(team: team_id, cookie: ^i32, portInfo: ^port_info, portInfoSize: uint) -> status_t --- -} - -// Semaphores - -sem_info :: struct { - sem: sem_id, - team: team_id, - name: [OS_NAME_LENGTH]byte, - count: i32, - latest_holder: thread_id, -} - -semaphore_flag :: enum u32 { - CAN_INTERRUPT = intrinsics.constant_log2(0x01), // acquisition of the semaphore can be interrupted (system use only) - CHECK_PERMISSION = intrinsics.constant_log2(0x04), // ownership will be checked (system use only) - KILL_CAN_INTERRUPT = intrinsics.constant_log2(0x20), // acquisition of the semaphore can be interrupted by SIGKILL[THR], even if not CAN_INTERRUPT (system use only) - - // release_sem_etc() only flags - DO_NOT_RESCHEDULE = intrinsics.constant_log2(0x02), // thread is not rescheduled - RELEASE_ALL = intrinsics.constant_log2(0x08), // all waiting threads will be woken up, count will be zeroed - RELEASE_IF_WAITING_ONLY = intrinsics.constant_log2(0x10), // release count only if there are any threads waiting -} -semaphore_flags :: distinct bit_set[semaphore_flag; u32] - -@(default_calling_convention="c") -foreign libroot { - create_sem :: proc(count: i32, name: cstring) -> sem_id --- - delete_sem :: proc(id: sem_id) -> status_t --- - acquire_sem :: proc(id: sem_id) -> status_t --- - acquire_sem_etc :: proc(id: sem_id, count: i32, flags: semaphore_flags, timeout: bigtime_t) -> status_t --- - release_sem :: proc(id: sem_id) -> status_t --- - release_sem_etc :: proc(id: sem_id, count: i32, flags: semaphore_flags) -> status_t --- - switch_sem :: proc(semToBeReleased: sem_id) -> status_t --- - switch_sem_etc :: proc(semToBeReleased: sem_id, id: sem_id, count: i32, flags: semaphore_flags, timeout: bigtime_t) -> status_t --- - get_sem_count :: proc(id: sem_id, threadCount: ^i32) -> status_t --- - set_sem_owner :: proc(id: sem_id, team: team_id) -> status_t --- - _get_sem_info :: proc(id: sem_id, info: ^sem_info, infoSize: uint) -> status_t --- - _get_next_sem_info :: proc(team: team_id, cookie: ^i32, info: ^sem_info, infoSize: uint) -> status_t --- -} - -// Teams - -team_info :: struct { - team: team_id, - thread_count: i32, - image_count: i32, - area_count: i32, - debugger_nub_thread: thread_id, - debugger_nub_port: port_id, - argc: i32, - args: [64]byte, - uid: uid_t, - gid: gid_t, - - // Haiku R1 extensions - real_uid: uid_t, - real_gid: gid_t, - group_id: pid_t, - session_id: pid_t, - parent: team_id, - name: [OS_NAME_LENGTH]byte, - start_time: bigtime_t, -} - -CURRENT_TEAM :: 0 -SYSTEM_TEAM :: 1 - -team_usage_info :: struct { - user_time: bigtime_t, - kernel_time: bigtime_t, -} - -team_usage_who :: enum i32 { - // compatible to sys/resource.h RUSAGE_SELF and RUSAGE_CHILDREN - SELF = 0, - CHILDREN = -1, -} - -@(default_calling_convention="c") -foreign libroot { - // see also: send_signal() - kill_team :: proc(team: team_id) -> status_t --- - _get_team_info :: proc(id: team_id, info: ^team_info, size: uint) -> status_t --- - _get_next_team_info :: proc(cookie: ^i32, info: ^team_info, size: uint) -> status_t --- - _get_team_usage_info :: proc(id: team_id, who: team_usage_who, info: ^team_usage_info, size: uint) -> status_t --- -} - -// Threads - -thread_state :: enum i32 { - RUNNING = 1, - READY, - RECEIVING, - ASLEEP, - SUSPENDED, - WAITING, -} - -thread_info :: struct { - thread: thread_id, - team: team_id, - name: [OS_NAME_LENGTH]byte, - state: thread_state, - priority: thread_priority, - sem: sem_id, - user_time: bigtime_t, - kernel_time: bigtime_t, - stack_base: rawptr, - stack_end: rawptr, -} - -thread_priority :: enum i32 { - IDLE_PRIORITY = 0, - LOWEST_ACTIVE_PRIORITY = 1, - LOW_PRIORITY = 5, - NORMAL_PRIORITY = 10, - DISPLAY_PRIORITY = 15, - URGENT_DISPLAY_PRIORITY = 20, - REAL_TIME_DISPLAY_PRIORITY = 100, - URGENT_PRIORITY = 110, - REAL_TIME_PRIORITY = 120, -} - -FIRST_REAL_TIME_PRIORITY :: thread_priority.REAL_TIME_PRIORITY - -// time base for snooze_*(), compatible with the clockid_t constants defined in -SYSTEM_TIMEBASE :: 0 - -thread_func :: #type proc "c" (rawptr) -> status_t - -@(default_calling_convention="c") -foreign libroot { - spawn_thread :: proc(thread_func, name: cstring, priority: thread_priority, data: rawptr) -> thread_id --- - kill_thread :: proc(thread: thread_id) -> status_t --- - resume_thread :: proc(thread: thread_id) -> status_t --- - suspend_thread :: proc(thread: thread_id) -> status_t --- - rename_thread :: proc(thread: thread_id, newName: cstring) -> status_t --- - set_thread_priority :: proc(thread: thread_id, newPriority: thread_priority) -> status_t --- - exit_thread :: proc(status: status_t) --- - wait_for_thread :: proc(thread: thread_id, returnValue: ^status_t) -> status_t --- - // FIXME: Find and define those flags. - wait_for_thread_etc :: proc(id: thread_id, flags: u32, timeout: bigtime_t, _returnCode: ^status_t) -> status_t --- - on_exit_thread :: proc(callback: proc "c" (rawptr), data: rawptr) -> status_t --- - find_thread :: proc(name: cstring) -> thread_id --- - send_data :: proc(thread: thread_id, code: i32, buffer: rawptr, bufferSize: uint) -> status_t --- - receive_data :: proc(sender: ^thread_id, buffer: rawptr, bufferSize: uint) -> i32 --- - has_data :: proc(thread: thread_id) -> bool --- - snooze :: proc(amount: bigtime_t) -> status_t --- - // FIXME: Find and define those flags. - snooze_etc :: proc(amount: bigtime_t, timeBase: i32, flags: u32) -> status_t --- - snooze_until :: proc(time: bigtime_t, timeBase: i32) -> status_t --- - _get_thread_info :: proc(id: thread_id, info: ^thread_info, size: uint) -> status_t --- - _get_next_thread_info :: proc(team: team_id, cookie: ^i32, info: ^thread_info, size: uint) -> status_t --- - // bridge to the pthread API - get_pthread_thread_id :: proc(thread: pthread_t) -> thread_id --- -} - -// Time - -@(default_calling_convention="c") -foreign libroot { - real_time_clock :: proc() -> uint --- - set_real_time_clock :: proc(secsSinceJan1st1970: uint) --- - real_time_clock_usecs :: proc() -> bigtime_t --- - // time since booting in microseconds - system_time :: proc() -> bigtime_t --- - // time since booting in nanoseconds - system_time_nsecs :: proc() -> nanotime_t --- -} - -// Alarm - -alarm_mode :: enum u32 { - ONE_SHOT_ABSOLUTE_ALARM = 1, - ONE_SHOT_RELATIVE_ALARM, - PERIODIC_ALARM, // "when" specifies the period -} - -@(default_calling_convention="c") -foreign libroot { - set_alarm :: proc(_when: bigtime_t, mode: alarm_mode) -> bigtime_t --- -} - -// Debugger - -@(default_calling_convention="c") -foreign libroot { - debugger :: proc(message: cstring) --- - /* - calling this function with a non-zero value will cause your thread - to receive signals for any exceptional conditions that occur (i.e. - you'll get SIGSEGV for data access exceptions, SIGFPE for floating - point errors, SIGILL for illegal instructions, etc). - - to re-enable the default debugger pass a zero. - */ - disable_debugger :: proc(state: i32) -> i32 --- -} - -// System information - -cpu_info :: struct { - active_time: bigtime_t, - enabled: bool, - current_frequency: u64, -} - -system_info :: struct { - boot_time: bigtime_t, // time of boot (usecs since 1/1/1970) - - cpu_count: u32, // number of cpus - - max_pages: u64, // total # of accessible pages - used_pages: u64, // # of accessible pages in use - cached_pages: u64, - block_cache_pages: u64, - ignored_pages: u64, // # of ignored/inaccessible pages - - needed_memory: u64, - free_memory: u64, - - max_swap_pages: u64, - free_swap_pages: u64, - - page_faults: u32, // # of page faults - - max_sems: u32, - used_sems: u32, - - max_ports: u32, - used_ports: u32, - - max_threads: u32, - used_threads: u32, - - max_teams: u32, - used_teams: u32, - - kernel_name: [FILE_NAME_LENGTH]byte, - kernel_build_date: [OS_NAME_LENGTH]byte, - kernel_build_time: [OS_NAME_LENGTH]byte, - - kernel_version: i64, - abi: u32, // the system API -} - -topology_level_type :: enum i32 { - UNKNOWN, - ROOT, - SMT, - CORE, - PACKAGE, -} - -cpu_platform :: enum i32 { - UNKNOWN, - x86, - x86_64, - PPC, - PPC_64, - M68K, - ARM, - ARM_64, - ALPHA, - MIPS, - SH, - SPARC, - RISC_V, -} - -cpu_vendor :: enum i32 { - UNKNOWN, - AMD, - CYRIX, - IDT, - INTEL, - NATIONAL_SEMICONDUCTOR, - RISE, - TRANSMETA, - VIA, - IBM, - MOTOROLA, - NEC, - HYGON, - SUN, - FUJITSU, -} - -cpu_topology_node_info :: struct { - id: u32, - type: topology_level_type, - level: u32, - - data: struct #raw_union { - _root: struct { - platform: cpu_platform, - }, - _package: struct { - vendor: cpu_vendor, - cache_line_size: u32, - }, - _core: struct { - model: u32, - default_frequency: u64, - }, - }, -} - -when ODIN_ARCH == .amd64 || ODIN_ARCH == .i386 { - cpuid_info :: struct #raw_union { - eax_0: struct { - max_eax: u32, - vendor_id: [12]byte, - }, - - eax_1: struct { - using _: bit_field u32 { - stepping: u32 | 4, - model: u32 | 4, - family: u32 | 4, - type: u32 | 2, - reserved_0: u32 | 2, - extended_model: u32 | 4, - extended_family: u32 | 8, - reserved_1: u32 | 4, - }, - - using _: bit_field u32 { - brand_index: u32 | 8, - clflush: u32 | 8, - logical_cpus: u32 | 8, - apic_id: u32 | 8, - }, - - features: u32, - extended_features: u32, - }, - - eax_2: struct { - call_num: u8, - cache_descriptors: [15]u8, - }, - - eax_3: struct { - reserved: [2]u32, - serial_number_high: u32, - serial_number_low: u32, - }, - - as_chars: [16]byte, - - regs: struct { - eax: u32, - ebx: u32, - edx: u32, - ecx: u32, - }, - } -} - -@(default_calling_convention="c") -foreign libroot { - get_system_info :: proc(info: ^system_info) -> status_t --- - _get_cpu_info_etc :: proc(firstCPU: u32, cpuCount: u32, info: ^cpu_info, size: uint) -> status_t --- - get_cpu_topology_info :: proc(topologyInfos: [^]cpu_topology_node_info, topologyInfoCount: ^u32) -> status_t --- - - when ODIN_ARCH == .amd64 || ODIN_ARCH == .i386 { - get_cpuid :: proc(info: ^cpuid_info, eaxRegister: u32, cpuNum: u32) -> status_t --- - } - - is_computer_on :: proc() -> i32 --- - is_computer_on_fire :: proc() -> f64 --- -} - -// POSIX signals - -@(default_calling_convention="c") -foreign libroot { - /* - Wait for queued signals. - - [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigtimedwait.html ]] - */ - sigtimedwait :: proc(set: ^posix.sigset_t, info: ^posix.siginfo_t, timeout: ^posix.timespec) -> posix.result --- -} diff --git a/core/sys/haiku/types.odin b/core/sys/haiku/types.odin deleted file mode 100644 index f15ffb00d..000000000 --- a/core/sys/haiku/types.odin +++ /dev/null @@ -1,56 +0,0 @@ -#+build haiku -package sys_haiku - -status_t :: Errno -bigtime_t :: i64 -nanotime_t :: i64 -type_code :: u32 -perform_code :: u32 - -phys_addr_t :: uintptr -phys_size_t :: phys_addr_t -generic_addr_t :: uintptr -generic_size_t :: generic_addr_t - -area_id :: i32 -port_id :: i32 -sem_id :: i32 -team_id :: i32 -thread_id :: i32 - -blkcnt_t :: i64 -blksize_t :: i32 -fsblkcnt_t :: i64 -fsfilcnt_t :: i64 -off_t :: i64 -ino_t :: i64 -cnt_t :: i32 -dev_t :: i32 -pid_t :: i32 -id_t :: i32 - -uid_t :: u32 -gid_t :: u32 -mode_t :: u32 -umode_t :: u32 -nlink_t :: i32 - -caddr_t :: [^]byte - -addr_t :: phys_addr_t -key_t :: i32 - -clockid_t :: i32 - -time_t :: int -timespec :: struct { - tv_sec: time_t, - tv_nsec: int, -} - -sig_atomic_t :: i32 -sigset_t :: u64 - -image_id :: i32 - -pthread_t :: rawptr diff --git a/core/sys/info/cpu_other.odin b/core/sys/info/cpu_other.odin index 252664a24..53e901275 100644 --- a/core/sys/info/cpu_other.odin +++ b/core/sys/info/cpu_other.odin @@ -1,4 +1,4 @@ -#+build openbsd, freebsd, netbsd, haiku +#+build openbsd, freebsd, netbsd package sysinfo @(private) diff --git a/core/sys/info/platform_other.odin b/core/sys/info/platform_other.odin deleted file mode 100644 index 01ec886fd..000000000 --- a/core/sys/info/platform_other.odin +++ /dev/null @@ -1,14 +0,0 @@ -#+build haiku -package sysinfo - -import "base:runtime" - -@(private) -_ram_stats :: proc "contextless" () -> (total_ram, free_ram, total_swap, free_swap: i64, ok: bool) { - return -} - -@(private) -_os_version :: proc(allocator: runtime.Allocator, loc := #caller_location) -> (res: OS_Version, ok: bool) { - return {}, false -} diff --git a/core/terminal/terminal_posix.odin b/core/terminal/terminal_posix.odin index 83e64c6d8..62a79797b 100644 --- a/core/terminal/terminal_posix.odin +++ b/core/terminal/terminal_posix.odin @@ -1,5 +1,5 @@ #+private -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package terminal import "base:runtime" diff --git a/core/testing/signal_handler_libc.odin b/core/testing/signal_handler_libc.odin index fb19a0115..16a33810a 100644 --- a/core/testing/signal_handler_libc.odin +++ b/core/testing/signal_handler_libc.odin @@ -1,5 +1,5 @@ #+private -#+build linux, darwin, freebsd, openbsd, netbsd, haiku +#+build linux, darwin, freebsd, openbsd, netbsd package testing /* diff --git a/core/testing/signal_handler_other.odin b/core/testing/signal_handler_other.odin index b0d5f00fb..243271b60 100644 --- a/core/testing/signal_handler_other.odin +++ b/core/testing/signal_handler_other.odin @@ -5,7 +5,6 @@ #+build !freebsd #+build !openbsd #+build !netbsd -#+build !haiku package testing /* diff --git a/core/testing/signal_handler_posix.odin b/core/testing/signal_handler_posix.odin index 0efba27dc..1bfcc875b 100644 --- a/core/testing/signal_handler_posix.odin +++ b/core/testing/signal_handler_posix.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd #+private package testing diff --git a/core/time/time_other.odin b/core/time/time_other.odin index 6eb0db88c..7f57df452 100644 --- a/core/time/time_other.odin +++ b/core/time/time_other.odin @@ -8,7 +8,6 @@ #+build !wasi #+build !windows #+build !orca -#+build !haiku package time _IS_SUPPORTED :: false diff --git a/core/time/time_unix.odin b/core/time/time_unix.odin index c384d6d07..61c4e91d3 100644 --- a/core/time/time_unix.odin +++ b/core/time/time_unix.odin @@ -1,5 +1,5 @@ #+private -#+build darwin, freebsd, openbsd, netbsd, haiku +#+build darwin, freebsd, openbsd, netbsd package time import "core:sys/posix" From b5cb4b96fcdb97c0f22c91e89f868e1836a4efa0 Mon Sep 17 00:00:00 2001 From: Ignacy Koper Date: Tue, 28 Apr 2026 17:23:12 +0200 Subject: [PATCH 019/228] removed Haiku from core:sys/posix package Signed-off-by: Ignacy Koper --- core/sys/posix/arpa_inet.odin | 4 +- core/sys/posix/dirent.odin | 13 +-- core/sys/posix/errno.odin | 90 +-------------- core/sys/posix/fcntl.odin | 68 +----------- core/sys/posix/fnmatch.odin | 4 +- core/sys/posix/glob.odin | 6 +- core/sys/posix/grp.odin | 4 +- core/sys/posix/langinfo.odin | 6 +- core/sys/posix/libgen.odin | 2 +- core/sys/posix/locale.odin | 2 +- core/sys/posix/monetary.odin | 2 +- core/sys/posix/netdb.odin | 21 +--- core/sys/posix/netinet_in.odin | 60 +++------- core/sys/posix/poll.odin | 44 +++----- core/sys/posix/posix_other.odin | 1 - core/sys/posix/posix_unix.odin | 2 +- core/sys/posix/pthread.odin | 52 +-------- core/sys/posix/pwd.odin | 14 +-- core/sys/posix/sched.odin | 9 +- core/sys/posix/signal.odin | 148 +------------------------ core/sys/posix/signal_libc.odin | 2 +- core/sys/posix/spawn.odin | 2 +- core/sys/posix/stdio_libc.odin | 2 +- core/sys/posix/stdlib.odin | 2 +- core/sys/posix/stdlib_libc.odin | 2 +- core/sys/posix/string.odin | 2 +- core/sys/posix/string_libc.odin | 2 +- core/sys/posix/sys_ipc.odin | 25 +---- core/sys/posix/sys_msg.odin | 20 +--- core/sys/posix/sys_resource.odin | 48 +++----- core/sys/posix/sys_select.odin | 16 +-- core/sys/posix/sys_sem.odin | 28 +---- core/sys/posix/sys_socket.odin | 57 ++-------- core/sys/posix/sys_stat.odin | 32 +----- core/sys/posix/sys_time.odin | 13 +-- core/sys/posix/sys_times.odin | 4 +- core/sys/posix/sys_uio.odin | 4 +- core/sys/posix/sys_un.odin | 10 +- core/sys/posix/sys_utsname.odin | 6 +- core/sys/posix/sys_wait.odin | 53 +-------- core/sys/posix/termios.odin | 185 +++---------------------------- core/sys/posix/time.odin | 13 +-- core/sys/posix/unistd.odin | 172 +--------------------------- core/sys/posix/unistd_libc.odin | 2 +- core/sys/posix/utime.odin | 4 +- 45 files changed, 121 insertions(+), 1137 deletions(-) diff --git a/core/sys/posix/arpa_inet.odin b/core/sys/posix/arpa_inet.odin index 70b12678c..566c75155 100644 --- a/core/sys/posix/arpa_inet.odin +++ b/core/sys/posix/arpa_inet.odin @@ -1,12 +1,10 @@ -#+build darwin, linux, freebsd, openbsd, netbsd, haiku +#+build darwin, linux, freebsd, openbsd, netbsd package posix import "core:c" when ODIN_OS == .Darwin { foreign import lib "system:System" -} else when ODIN_OS == .Haiku { - foreign import lib "system:network" } else { foreign import lib "system:c" } diff --git a/core/sys/posix/dirent.odin b/core/sys/posix/dirent.odin index cf15dada4..f6cef70ce 100644 --- a/core/sys/posix/dirent.odin +++ b/core/sys/posix/dirent.odin @@ -1,4 +1,4 @@ -#+build darwin, linux, freebsd, openbsd, netbsd, haiku +#+build darwin, linux, freebsd, openbsd, netbsd package posix import "core:c" @@ -227,15 +227,4 @@ when ODIN_OS == .Darwin { d_name: [256]c.char `fmt:"s,0"`, /* [PSX] entry name */ } -} else when ODIN_OS == .Haiku { - - dirent :: struct { - d_dev: dev_t, /* device */ - d_pdev: dev_t, /* parent device (only for queries) */ - d_ino: ino_t, /* inode number */ - d_pino: ino_t, /* parent inode (only for queries) */ - d_reclen: c.ushort, /* length of this record, not the name */ - d_name: [0]c.char `fmt:"s,0"`, /* name of the entry (null byte terminated) */ - } - } diff --git a/core/sys/posix/errno.odin b/core/sys/posix/errno.odin index bb4e9e045..ba77e8aaf 100644 --- a/core/sys/posix/errno.odin +++ b/core/sys/posix/errno.odin @@ -1,4 +1,4 @@ -#+build windows, darwin, linux, freebsd, openbsd, netbsd, haiku +#+build windows, darwin, linux, freebsd, openbsd, netbsd package posix import "core:c" @@ -536,92 +536,4 @@ when ODIN_OS == .Darwin { ETXTBSY :: 139 EWOULDBLOCK :: 140 EXDEV :: 18 -} else when ODIN_OS == .Haiku { - _HAIKU_USE_POSITIVE_POSIX_ERRORS :: libc._HAIKU_USE_POSITIVE_POSIX_ERRORS - _POSIX_ERROR_FACTOR :: libc._POSIX_ERROR_FACTOR - - _GENERAL_ERROR_BASE :: min(c.int) - _OS_ERROR_BASE :: _GENERAL_ERROR_BASE + 0x1000 - _STORAGE_ERROR_BASE :: _GENERAL_ERROR_BASE + 0x6000 - _POSIX_ERROR_BASE :: _GENERAL_ERROR_BASE + 0x7000 - - EIO :: _POSIX_ERROR_FACTOR * (_GENERAL_ERROR_BASE + 1) // B_IO_ERROR - EACCES :: _POSIX_ERROR_FACTOR * (_GENERAL_ERROR_BASE + 2) // B_PERMISSION_DENIED - EINVAL :: _POSIX_ERROR_FACTOR * (_GENERAL_ERROR_BASE + 5) // B_BAD_VALUE - ETIMEDOUT :: _POSIX_ERROR_FACTOR * (_GENERAL_ERROR_BASE + 9) // B_TIMED_OUT - EINTR :: _POSIX_ERROR_FACTOR * (_GENERAL_ERROR_BASE + 10) // B_INTERRUPTED - EAGAIN :: _POSIX_ERROR_FACTOR * (_GENERAL_ERROR_BASE + 11) // B_WOULD_BLOCK /* SysV compatibility */ - EWOULDBLOCK :: _POSIX_ERROR_FACTOR * (_GENERAL_ERROR_BASE + 11) // B_WOULD_BLOCK /* BSD compatibility */ - EBUSY :: _POSIX_ERROR_FACTOR * (_GENERAL_ERROR_BASE + 14) // B_BUSY - EPERM :: _POSIX_ERROR_FACTOR * (_GENERAL_ERROR_BASE + 15) // B_NOT_ALLOWED - EFAULT :: _POSIX_ERROR_FACTOR * (_OS_ERROR_BASE + 0x301) // B_BAD_ADDRESS - ENOEXEC :: _POSIX_ERROR_FACTOR * (_OS_ERROR_BASE + 0x302) // B_NOT_AN_EXECUTABLE - EBADF :: _POSIX_ERROR_FACTOR * (_STORAGE_ERROR_BASE + 0) // B_FILE_ERROR - EEXIST :: _POSIX_ERROR_FACTOR * (_STORAGE_ERROR_BASE + 2) // B_FILE_EXISTS - ENOENT :: _POSIX_ERROR_FACTOR * (_STORAGE_ERROR_BASE + 3) // B_ENTRY_NOT_FOUND - ENAMETOOLONG :: _POSIX_ERROR_FACTOR * (_STORAGE_ERROR_BASE + 4) // B_NAME_TOO_LONG - ENOTDIR :: _POSIX_ERROR_FACTOR * (_STORAGE_ERROR_BASE + 5) // B_NOT_A_DIRECTORY - ENOTEMPTY :: _POSIX_ERROR_FACTOR * (_STORAGE_ERROR_BASE + 6) // B_DIRECTORY_NOT_EMPTY - ENOSPC :: _POSIX_ERROR_FACTOR * (_STORAGE_ERROR_BASE + 7) // B_DEVICE_FULL - EROFS :: _POSIX_ERROR_FACTOR * (_STORAGE_ERROR_BASE + 8) // B_READ_ONLY_DEVICE - EISDIR :: _POSIX_ERROR_FACTOR * (_STORAGE_ERROR_BASE + 9) // B_IS_A_DIRECTORY - EMFILE :: _POSIX_ERROR_FACTOR * (_STORAGE_ERROR_BASE + 10) // B_NO_MORE_FDS - EXDEV :: _POSIX_ERROR_FACTOR * (_STORAGE_ERROR_BASE + 11) // B_CROSS_DEVICE_LINK - ELOOP :: _POSIX_ERROR_FACTOR * (_STORAGE_ERROR_BASE + 12) // B_LINK_LIMIT - EPIPE :: _POSIX_ERROR_FACTOR * (_STORAGE_ERROR_BASE + 13) // B_BUSTED_PIPE - ENOMEM :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 0) when _HAIKU_USE_POSITIVE_POSIX_ERRORS else (_GENERAL_ERROR_BASE + 0) // B_NO_MEMORY - E2BIG :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 1) - ECHILD :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 2) - EDEADLK :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 3) - EFBIG :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 4) - EMLINK :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 5) - ENFILE :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 6) - ENODEV :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 7) - ENOLCK :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 8) - ENOSYS :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 9) - ENOTTY :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 10) - ENXIO :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 11) - ESPIPE :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 12) - ESRCH :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 13) - EPROTOTYPE :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 18) - EPROTONOSUPPORT :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 19) - EAFNOSUPPORT :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 21) - EADDRINUSE :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 22) - EADDRNOTAVAIL :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 23) - ENETDOWN :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 24) - ENETUNREACH :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 25) - ENETRESET :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 26) - ECONNABORTED :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 27) - ECONNRESET :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 28) - EISCONN :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 29) - ENOTCONN :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 30) - ECONNREFUSED :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 32) - EHOSTUNREACH :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 33) - ENOPROTOOPT :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 34) - ENOBUFS :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 35) - EINPROGRESS :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 36) - EALREADY :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 37) - ENOMSG :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 39) - ESTALE :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 40) - EOVERFLOW :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 41) - EMSGSIZE :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 42) - EOPNOTSUPP :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 43) - ENOTSOCK :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 44) - EBADMSG :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 46) - ECANCELED :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 47) - EDESTADDRREQ :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 48) - EDQUOT :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 49) - EIDRM :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 50) - EMULTIHOP :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 51) - ENODATA :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 52) - ENOLINK :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 53) - ENOSR :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 54) - ENOSTR :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 55) - ENOTSUP :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 56) - EPROTO :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 57) - ETIME :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 58) - ETXTBSY :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 59) - ENOTRECOVERABLE :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 61) - EOWNERDEAD :: _POSIX_ERROR_FACTOR * (_POSIX_ERROR_BASE + 62) } - diff --git a/core/sys/posix/fcntl.odin b/core/sys/posix/fcntl.odin index 52d97f528..05a084a8e 100644 --- a/core/sys/posix/fcntl.odin +++ b/core/sys/posix/fcntl.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, openbsd, freebsd, netbsd, haiku +#+build linux, darwin, openbsd, freebsd, netbsd package posix import "core:c" @@ -409,72 +409,6 @@ when ODIN_OS == .Darwin { l_whence: c.short, /* [PSX] flag (Whence) of starting offset */ } -} else when ODIN_OS == .Haiku { - - off_t :: distinct c.int64_t - pid_t :: distinct c.int32_t - - /* commands that can be passed to fcntl() */ - F_DUPFD :: 0x0001 /* duplicate fd */ - F_GETFD :: 0x0002 /* get fd flags */ - F_SETFD :: 0x0004 /* set fd flags */ - F_GETFL :: 0x0008 /* get file status flags and access mode */ - F_SETFL :: 0x0010 /* set file status flags */ - F_GETLK :: 0x0020 /* get locking information */ - F_SETLK :: 0x0080 /* set locking information */ - F_SETLKW :: 0x0100 /* as above, but waits if blocked */ - F_DUPFD_CLOEXEC :: 0x0200 /* duplicate fd with close on exec set */ - F_GETOWN :: -1 // NOTE: Not supported. - F_SETOWN :: -1 // NOTE: Not supported. - - /* advisory locking types */ - F_RDLCK :: 0x0040 /* read or shared lock */ - F_UNLCK :: 0x0200 /* unlock */ - F_WRLCK :: 0x0400 /* write or exclusive lock */ - - /* file descriptor flags for fcntl() */ - FD_CLOEXEC :: 1 - - O_CLOEXEC :: 0x00000040 - O_CREAT :: 0x0200 - O_DIRECTORY :: 0x00200000 - O_EXCL :: 0x0100 - O_NOCTTY :: 0x1000 - O_NOFOLLOW :: 0x00080000 - O_TRUNC :: 0x0400 - - _O_TTY_INIT :: 0 - O_TTY_INIT :: O_Flags{} // NOTE: not defined in the headers - - O_APPEND :: 0x0800 - O_DSYNC :: 0x040000 - O_NONBLOCK :: 0x0080 - O_SYNC :: 0x010000 - O_RSYNC :: 0x020000 - - O_EXEC :: 0x04000000 // NOTE: not defined in the headers - O_RDONLY :: 0 - O_RDWR :: 0x0002 - O_WRONLY :: 0x0001 - - _O_SEARCH :: 0 - O_SEARCH :: O_Flags{} // NOTE: not defined in the headers - - AT_FDCWD: FD: -100 - - AT_EACCESS :: 0x08 - AT_SYMLINK_NOFOLLOW :: 0x01 - AT_SYMLINK_FOLLOW :: 0x02 - AT_REMOVEDIR :: 0x04 - - flock :: struct { - l_type: Lock_Type, /* [PSX] type of lock */ - l_whence: c.short, /* [PSX] flag (Whence) of starting offset */ - l_start: off_t, /* [PSX] relative offset in bytes */ - l_len: off_t, /* [PSX] size; if 0 then until EOF */ - l_pid: pid_t, /* [PSX] process ID of the process holding the lock */ - } - } else when ODIN_OS == .Linux { off_t :: distinct c.int64_t diff --git a/core/sys/posix/fnmatch.odin b/core/sys/posix/fnmatch.odin index efe179324..ff0cfa6ea 100644 --- a/core/sys/posix/fnmatch.odin +++ b/core/sys/posix/fnmatch.odin @@ -1,4 +1,4 @@ -#+build darwin, linux, openbsd, freebsd, netbsd, haiku +#+build darwin, linux, openbsd, freebsd, netbsd package posix import "core:c" @@ -46,7 +46,7 @@ FNM_Flag_Bits :: enum c.int { } FNM_Flags :: bit_set[FNM_Flag_Bits; c.int] -when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Haiku { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD { FNM_NOMATCH :: 1 diff --git a/core/sys/posix/glob.odin b/core/sys/posix/glob.odin index 530481587..88e0cffc7 100644 --- a/core/sys/posix/glob.odin +++ b/core/sys/posix/glob.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix import "core:c" @@ -109,7 +109,7 @@ when ODIN_OS == .Darwin { GLOB_NOMATCH :: -3 GLOB_NOSPACE :: -1 -} else when ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .Haiku { +} else when ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD { glob_t :: struct { gl_pathc: c.size_t, /* [PSX] count of paths matched by pattern */ @@ -134,7 +134,7 @@ when ODIN_OS == .Darwin { GLOB_ERR :: 0x0004 GLOB_MARK :: 0x0008 GLOB_NOCHECK :: 0x0010 - GLOB_NOESCAPE :: 0x2000 when ODIN_OS == .FreeBSD || ODIN_OS == .Haiku else 0x0100 + GLOB_NOESCAPE :: 0x2000 when ODIN_OS == .FreeBSD else 0x0100 GLOB_NOSORT :: 0x0020 GLOB_ABORTED :: -2 diff --git a/core/sys/posix/grp.odin b/core/sys/posix/grp.odin index 8e8e69fc2..0b3d70fec 100644 --- a/core/sys/posix/grp.odin +++ b/core/sys/posix/grp.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix import "core:c" @@ -115,7 +115,7 @@ foreign lib { getgrnam_r :: proc(name: cstring, grp: ^group, buffer: [^]byte, bufsize: c.size_t, result: ^^group) -> Errno --- } -when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Haiku || ODIN_OS == .Linux { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux { gid_t :: distinct c.uint32_t diff --git a/core/sys/posix/langinfo.odin b/core/sys/posix/langinfo.odin index 195de650d..bd4afbacb 100644 --- a/core/sys/posix/langinfo.odin +++ b/core/sys/posix/langinfo.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix import "core:c" @@ -143,7 +143,7 @@ nl_item :: enum nl_item_t { CRNCYSTR = CRNCYSTR, } -when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .Haiku { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD { // NOTE: declared with `_t` so we can enumerate the real `nl_info`. nl_item_t :: distinct c.int @@ -210,7 +210,7 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .Haiku { YESEXPR :: 52 NOEXPR :: 53 - CRNCYSTR :: 54 when ODIN_OS == .Haiku else 56 + CRNCYSTR :: 56 } else when ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD { diff --git a/core/sys/posix/libgen.odin b/core/sys/posix/libgen.odin index aa2effd72..5c7fa1536 100644 --- a/core/sys/posix/libgen.odin +++ b/core/sys/posix/libgen.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix when ODIN_OS == .Darwin { diff --git a/core/sys/posix/locale.odin b/core/sys/posix/locale.odin index bbe10e803..5b8d7c216 100644 --- a/core/sys/posix/locale.odin +++ b/core/sys/posix/locale.odin @@ -1,4 +1,4 @@ -#+build windows, linux, darwin, netbsd, openbsd, freebsd, haiku +#+build windows, linux, darwin, netbsd, openbsd, freebsd package posix import "core:c/libc" diff --git a/core/sys/posix/monetary.odin b/core/sys/posix/monetary.odin index 2e4105881..556defa0f 100644 --- a/core/sys/posix/monetary.odin +++ b/core/sys/posix/monetary.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix import "core:c" diff --git a/core/sys/posix/netdb.odin b/core/sys/posix/netdb.odin index f2f83875f..4fe233711 100644 --- a/core/sys/posix/netdb.odin +++ b/core/sys/posix/netdb.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix import "core:c" @@ -319,7 +319,7 @@ Info_Errno :: enum c.int { OVERFLOW = EAI_OVERFLOW, } -when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux || ODIN_OS == .Haiku { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux { hostent :: struct { h_name: cstring, /* [PSX] official name of host */ @@ -444,23 +444,6 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS NI_NUMERICSCOPE :: 0x100 NI_DGRAM :: 16 - } else when ODIN_OS == .Haiku { - - AI_PASSIVE :: 0x001 - AI_CANONNAME :: 0x002 - AI_NUMERICHOST :: 0x004 - AI_NUMERICSERV :: 0x008 - AI_V4MAPPED :: 0x800 - AI_ALL :: 0x100 - AI_ADDRCONFIG :: 0x400 - - NI_NOFQDN :: 0x01 - NI_NUMERICHOST :: 0x02 - NI_NAMEREQD :: 0x04 - NI_NUMERICSERV :: 0x08 - NI_DGRAM :: 0x10 - NI_NUMERICSCOPE :: 0x40 - } when ODIN_OS == .OpenBSD { diff --git a/core/sys/posix/netinet_in.odin b/core/sys/posix/netinet_in.odin index 4b74b87f0..9295f9913 100644 --- a/core/sys/posix/netinet_in.odin +++ b/core/sys/posix/netinet_in.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix import "core:c" @@ -31,31 +31,20 @@ Protocol :: enum c.int { UDP = IPPROTO_UDP, } -when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux || ODIN_OS == .Haiku { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux { in_addr :: struct { s_addr: in_addr_t, /* [PSX] big endian address */ } - when ODIN_OS == .Haiku { - in6_addr :: struct #packed { - using _: struct #raw_union { - s6_addr: [16]c.uint8_t, /* [PSX] big endian address */ - __u6_addr16: [8]c.uint16_t, - __u6_addr32: [4]c.uint32_t, - }, - } - } else { - in6_addr :: struct { - using _: struct #raw_union { - s6_addr: [16]c.uint8_t, /* [PSX] big endian address */ - __u6_addr16: [8]c.uint16_t, - __u6_addr32: [4]c.uint32_t, - }, - } + in6_addr :: struct { + using _: struct #raw_union { + s6_addr: [16]c.uint8_t, /* [PSX] big endian address */ + __u6_addr16: [8]c.uint16_t, + __u6_addr32: [4]c.uint32_t, + }, } - when ODIN_OS == .Linux { sockaddr_in :: struct { @@ -88,13 +77,8 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS } else { - when ODIN_OS == .Haiku { - @(private) - _SIN_ZEROSIZE :: 24 - } else { - @(private) - _SIN_ZEROSIZE :: 8 - } + @(private) + _SIN_ZEROSIZE :: 8 sockaddr_in :: struct { sin_len: c.uint8_t, @@ -118,23 +102,13 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS ipv6mr_interface: c.uint, /* [PSX] interface index */ } - when ODIN_OS == .Haiku { - IPV6_JOIN_GROUP :: 28 - IPV6_LEAVE_GROUP :: 29 - IPV6_MULTICAST_HOPS :: 25 - IPV6_MULTICAST_IF :: 24 - IPV6_MULTICAST_LOOP :: 26 - IPV6_UNICAST_HOPS :: 27 - IPV6_V6ONLY :: 30 - } else { - IPV6_JOIN_GROUP :: 12 - IPV6_LEAVE_GROUP :: 13 - IPV6_MULTICAST_HOPS :: 10 - IPV6_MULTICAST_IF :: 9 - IPV6_MULTICAST_LOOP :: 11 - IPV6_UNICAST_HOPS :: 4 - IPV6_V6ONLY :: 27 - } + IPV6_JOIN_GROUP :: 12 + IPV6_LEAVE_GROUP :: 13 + IPV6_MULTICAST_HOPS :: 10 + IPV6_MULTICAST_IF :: 9 + IPV6_MULTICAST_LOOP :: 11 + IPV6_UNICAST_HOPS :: 4 + IPV6_V6ONLY :: 27 } diff --git a/core/sys/posix/poll.odin b/core/sys/posix/poll.odin index bb400c5a9..5a2628096 100644 --- a/core/sys/posix/poll.odin +++ b/core/sys/posix/poll.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix import "base:intrinsics" @@ -25,7 +25,7 @@ foreign lib { poll :: proc(fds: [^]pollfd, nfds: nfds_t, timeout: c.int) -> c.int --- } -when ODIN_OS == .Haiku || ODIN_OS == .Linux { +when ODIN_OS == .Linux { nfds_t :: c.ulong } else { nfds_t :: c.uint @@ -57,7 +57,7 @@ Poll_Event_Bits :: enum c.short { } Poll_Event :: bit_set[Poll_Event_Bits; c.short] -when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Haiku { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD { pollfd :: struct { fd: FD, /* [PSX] the following descriptor being polled */ @@ -65,35 +65,17 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS revents: Poll_Event, /* [PSX] the output event flags */ } - when ODIN_OS == .Haiku { + POLLIN :: 0x0001 + POLLRDNORM :: 0x0040 + POLLRDBAND :: 0x0080 + POLLPRI :: 0x0002 + POLLOUT :: 0x0004 + POLLWRNORM :: POLLOUT + POLLWRBAND :: 0x0100 - POLLIN :: 0x0001 /* any readable data available */ - POLLOUT :: 0x0002 /* file descriptor is writeable */ - POLLRDNORM :: POLLIN - POLLWRNORM :: POLLOUT - POLLRDBAND :: 0x0008 /* priority readable data */ - POLLWRBAND :: 0x0010 /* priority data can be written */ - POLLPRI :: 0x0020 /* high priority readable data */ - - POLLERR :: 0x0004 /* errors pending */ - POLLHUP :: 0x0080 /* disconnected */ - POLLNVAL :: 0x1000 /* invalid file descriptor */ - - } else { - - POLLIN :: 0x0001 - POLLRDNORM :: 0x0040 - POLLRDBAND :: 0x0080 - POLLPRI :: 0x0002 - POLLOUT :: 0x0004 - POLLWRNORM :: POLLOUT - POLLWRBAND :: 0x0100 - - POLLERR :: 0x0008 - POLLHUP :: 0x0010 - POLLNVAL :: 0x0020 - - } + POLLERR :: 0x0008 + POLLHUP :: 0x0010 + POLLNVAL :: 0x0020 } else when ODIN_OS == .Linux { diff --git a/core/sys/posix/posix_other.odin b/core/sys/posix/posix_other.odin index 88542c56b..5ffedc953 100644 --- a/core/sys/posix/posix_other.odin +++ b/core/sys/posix/posix_other.odin @@ -3,7 +3,6 @@ #+build !netbsd #+build !openbsd #+build !freebsd -#+build !haiku package posix _IS_SUPPORTED :: false diff --git a/core/sys/posix/posix_unix.odin b/core/sys/posix/posix_unix.odin index 51580a655..1aa251099 100644 --- a/core/sys/posix/posix_unix.odin +++ b/core/sys/posix/posix_unix.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix _IS_SUPPORTED :: true diff --git a/core/sys/posix/pthread.odin b/core/sys/posix/pthread.odin index e480b761c..84073c26f 100644 --- a/core/sys/posix/pthread.odin +++ b/core/sys/posix/pthread.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix import "core:c" @@ -554,56 +554,6 @@ when ODIN_OS == .Darwin { sched_priority: c.int, /* [PSX] process or thread execution scheduling priority */ } -} else when ODIN_OS == .Haiku { - - PTHREAD_CANCEL_ASYNCHRONOUS :: 2 - PTHREAD_CANCEL_DEFERRED :: 0 - - PTHREAD_CANCEL_DISABLE :: 1 - PTHREAD_CANCEL_ENABLE :: 0 - - PTHREAD_CANCELED :: rawptr(uintptr(1)) - - PTHREAD_CREATE_DETACHED :: 0x1 - PTHREAD_CREATE_JOINABLE :: 0 - - PTHREAD_EXPLICIT_SCHED :: 0 - PTHREAD_INHERIT_SCHED :: 0x4 - - PTHREAD_PRIO_INHERIT :: 1 - PTHREAD_PRIO_NONE :: 0 - PTHREAD_PRIO_PROTECT :: 2 - - PTHREAD_PROCESS_SHARED :: 1 - PTHREAD_PROCESS_PRIVATE :: 0 - - PTHREAD_SCOPE_PROCESS :: 0 - PTHREAD_SCOPE_SYSTEM :: 0x2 - - pthread_t :: distinct rawptr - pthread_attr_t :: distinct rawptr - pthread_key_t :: distinct c.int - - pthread_mutex_t :: struct { - flags: u32, - lock: i32, - unused: i32, - owner: i32, - owner_count: i32, - } - - pthread_cond_t :: struct { - flags: u32, - unused: i32, - mutex: ^pthread_mutex_t, - waiter_count: i32, - lock: i32, - } - - sched_param :: struct { - sched_priority: c.int, /* [PSX] process or thread execution scheduling priority */ - } - } else when ODIN_OS == .Linux { PTHREAD_CANCEL_DEFERRED :: 0 diff --git a/core/sys/posix/pwd.odin b/core/sys/posix/pwd.odin index c3ee3c0f6..5069aeb9f 100644 --- a/core/sys/posix/pwd.odin +++ b/core/sys/posix/pwd.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix import "core:c" @@ -176,16 +176,4 @@ when ODIN_OS == .Darwin || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD { pw_shell: cstring, /* Shell program. */ } -} else when ODIN_OS == .Haiku { - - passwd :: struct { - pw_name: cstring, /* [PSX] user name */ - pw_passwd: cstring, /* encrypted password */ - pw_uid: uid_t, /* [PSX] user uid */ - pw_gid: gid_t, /* [PSX] user gid */ - pw_dir: cstring, /* Home directory. */ - pw_shell: cstring, /* Shell program. */ - pw_gecos: cstring, /* Real name. */ - } - } diff --git a/core/sys/posix/sched.odin b/core/sys/posix/sched.odin index cc509ba8e..a8b509cc6 100644 --- a/core/sys/posix/sched.odin +++ b/core/sys/posix/sched.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix import "core:c" @@ -101,11 +101,4 @@ when ODIN_OS == .Darwin { SCHED_FIFO :: 1 SCHED_RR :: 2 -} else when ODIN_OS == .Haiku { - - SCHED_FIFO :: 1 - SCHED_RR :: 2 - // SCHED_SPORADIC :: 3 NOTE: not a thing on freebsd, netbsd and probably others, leaving it out - SCHED_OTHER :: 4 - } diff --git a/core/sys/posix/signal.odin b/core/sys/posix/signal.odin index 69b405c5d..603c50d71 100644 --- a/core/sys/posix/signal.odin +++ b/core/sys/posix/signal.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix import "base:intrinsics" @@ -1186,150 +1186,4 @@ when ODIN_OS == .Darwin { SI_MESGQ :: -3 SI_ASYNCIO :: -4 -} else when ODIN_OS == .Haiku { - - // Request that signal be held - SIG_HOLD :: rawptr(uintptr(3)) - - uid_t :: distinct c.uint32_t - sigset_t :: distinct u64 - - SIGHUP :: 1 // hangup -- tty is gone! - //SIGINT :: 2 // interrupt - SIGQUIT :: 3 // `quit' special character typed in tty - //SIGILL :: 4 // illegal instruction - SIGCHLD :: 5 // child process exited - //SIGABRT :: 6 // abort() called, dont' catch - SIGPIPE :: 7 // write to a pipe w/no readers - //SIGFPE :: 8 // floating point exception - SIGKILL :: 9 // kill a team (not catchable) - SIGSTOP :: 10 // suspend a thread (not catchable) - //SIGSEGV :: 11 // segmentation violation (read: invalid pointer) - SIGCONT :: 12 // continue execution if suspended - SIGTSTP :: 13 // `stop' special character typed in tty - SIGALRM :: 14 // an alarm has gone off (see alarm()) - //SIGTERM :: 15 // termination requested - SIGTTIN :: 16 // read of tty from bg process - SIGTTOU :: 17 // write to tty from bg process - SIGUSR1 :: 18 // app defined signal 1 - SIGUSR2 :: 19 // app defined signal 2 - SIGWINCH :: 20 // tty window size changed - SIGKILLTHR :: 21 // be specific: kill just the thread, not team - SIGTRAP :: 22 // Trace/breakpoint trap - SIGPOLL :: 23 // Pollable event - SIGPROF :: 24 // Profiling timer expired - SIGSYS :: 25 // Bad system call - SIGURG :: 26 // High bandwidth data is available at socket - SIGVTALRM :: 27 // Virtual timer expired - SIGXCPU :: 28 // CPU time limit exceeded - SIGXFSZ :: 29 // File size limit exceeded - SIGBUS :: 30 // access to undefined portion of a memory object - - // NOTE: this is actually defined as `sigaction`, but due to the function with the same name - // `_t` has been added. - - sigaction_t :: struct { - using _: struct #raw_union { - sa_handler: proc "c" (Signal), /* [PSX] signal-catching function or one of the SIG_IGN or SIG_DFL */ - sa_sigaction: proc "c" (Signal, ^siginfo_t, rawptr), /* [PSX] signal-catching function */ - }, - sa_mask: sigset_t, /* [PSX] set of signals to be blocked during execution of the signal handling function */ - sa_flags: SA_Flags, /* [PSX] special flags */ - sa_userdata: rawptr, /* will be passed to the signal handler, BeOS extension */ - } - - SIG_BLOCK :: 1 - SIG_UNBLOCK :: 2 - SIG_SETMASK :: 3 - - SA_NOCLDSTOP :: 0x01 - SA_NOCLDWAIT :: 0x02 - SA_RESETHAND :: 0x04 - SA_NODEFER :: 0x08 - SA_RESTART :: 0x10 - SA_ONSTACK :: 0x20 - SA_SIGINFO :: 0x40 - - SS_ONSTACK :: 1 - SS_DISABLE :: 2 - - MINSIGSTKSZ :: 8192 - SIGSTKSZ :: 16384 - - stack_t :: struct { - ss_sp: rawptr, /* [PSX] stack base or pointer */ - ss_size: c.size_t, /* [PSX] stack size */ - ss_flags: SS_Flags, /* [PSX] flags */ - } - - siginfo_t :: struct { - si_signo: Signal, /* [PSX] signal number */ - si_code: struct #raw_union { /* [PSX] specific more detailed codes per signal */ - ill: ILL_Code, - fpe: FPE_Code, - segv: SEGV_Code, - bus: BUS_Code, - trap: TRAP_Code, - chld: CLD_Code, - poll: POLL_Code, - any: Any_Code, - }, - si_errno: Errno, /* [PSX] errno value associated with this signal */ - si_pid: pid_t, /* sending process ID */ - si_uid: uid_t, /* real user ID of sending process */ - si_addr: rawptr, /* address of faulting instruction */ - si_status: c.int, /* exit value or signal */ - si_band: c.long, /* band event for SIGPOLL */ - si_value: sigval, /* signal value */ - } - - /* any signal */ - SI_USER :: 0 /* signal sent by user */ - SI_QUEUE :: 1 /* signal sent by sigqueue() */ - SI_TIMER :: 2 /* signal sent on timer_settime() timeout */ - SI_ASYNCIO :: 3 /* signal sent on asynchronous I/O completion */ - SI_MESGQ :: 4 /* signal sent on arrival of message on empty message queue */ - /* SIGILL */ - ILL_ILLOPC :: 10 /* illegal opcode */ - ILL_ILLOPN :: 11 /* illegal operand */ - ILL_ILLADR :: 12 /* illegal addressing mode */ - ILL_ILLTRP :: 13 /* illegal trap */ - ILL_PRVOPC :: 14 /* privileged opcode */ - ILL_PRVREG :: 15 /* privileged register */ - ILL_COPROC :: 16 /* coprocessor error */ - ILL_BADSTK :: 17 /* internal stack error */ - /* SIGFPE */ - FPE_INTDIV :: 20 /* integer division by zero */ - FPE_INTOVF :: 21 /* integer overflow */ - FPE_FLTDIV :: 22 /* floating-point division by zero */ - FPE_FLTOVF :: 23 /* floating-point overflow */ - FPE_FLTUND :: 24 /* floating-point underflow */ - FPE_FLTRES :: 25 /* floating-point inexact result */ - FPE_FLTINV :: 26 /* invalid floating-point operation */ - FPE_FLTSUB :: 27 /* subscript out of range */ - /* SIGSEGV */ - SEGV_MAPERR :: 30 /* address not mapped to object */ - SEGV_ACCERR :: 31 /* invalid permissions for mapped object */ - /* SIGBUS */ - BUS_ADRALN :: 40 /* invalid address alignment */ - BUS_ADRERR :: 41 /* nonexistent physical address */ - BUS_OBJERR :: 42 /* object-specific hardware error */ - /* SIGTRAP */ - TRAP_BRKPT :: 50 /* process breakpoint */ - TRAP_TRACE :: 51 /* process trace trap. */ - /* SIGCHLD */ - CLD_EXITED :: 60 /* child exited */ - CLD_KILLED :: 61 /* child terminated abnormally without core dump */ - CLD_DUMPED :: 62 /* child terminated abnormally with core dump */ - CLD_TRAPPED :: 63 /* traced child trapped */ - CLD_STOPPED :: 64 /* child stopped */ - CLD_CONTINUED :: 65 /* stopped child continued */ - /* SIGPOLL */ - POLL_IN :: 70 /* input available */ - POLL_OUT :: 71 /* output available */ - POLL_MSG :: 72 /* input message available */ - POLL_ERR :: 73 /* I/O error */ - POLL_PRI :: 74 /* high priority input available */ - POLL_HUP :: 75 /* device disconnected */ - } diff --git a/core/sys/posix/signal_libc.odin b/core/sys/posix/signal_libc.odin index ba0fbf084..f6a24b762 100644 --- a/core/sys/posix/signal_libc.odin +++ b/core/sys/posix/signal_libc.odin @@ -1,4 +1,4 @@ -#+build linux, windows, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, windows, darwin, netbsd, openbsd, freebsd package posix import "base:intrinsics" diff --git a/core/sys/posix/spawn.odin b/core/sys/posix/spawn.odin index 4eacb3b4b..a884b69f3 100644 --- a/core/sys/posix/spawn.odin +++ b/core/sys/posix/spawn.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, openbsd, freebsd, netbsd, haiku +#+build linux, darwin, openbsd, freebsd, netbsd package posix when ODIN_OS == .Darwin { diff --git a/core/sys/posix/stdio_libc.odin b/core/sys/posix/stdio_libc.odin index 8ccdcc37a..a6921ab7d 100644 --- a/core/sys/posix/stdio_libc.odin +++ b/core/sys/posix/stdio_libc.odin @@ -1,4 +1,4 @@ -#+build linux, windows, linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, windows, linux, darwin, netbsd, openbsd, freebsd package posix import "core:c" diff --git a/core/sys/posix/stdlib.odin b/core/sys/posix/stdlib.odin index 0a6e5403c..c8d5bec60 100644 --- a/core/sys/posix/stdlib.odin +++ b/core/sys/posix/stdlib.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix import "base:intrinsics" diff --git a/core/sys/posix/stdlib_libc.odin b/core/sys/posix/stdlib_libc.odin index 966dc1d32..749d39f27 100644 --- a/core/sys/posix/stdlib_libc.odin +++ b/core/sys/posix/stdlib_libc.odin @@ -1,4 +1,4 @@ -#+build linux, windows, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, windows, darwin, netbsd, openbsd, freebsd package posix import "base:intrinsics" diff --git a/core/sys/posix/string.odin b/core/sys/posix/string.odin index 3d0c5b7a2..d427b2620 100644 --- a/core/sys/posix/string.odin +++ b/core/sys/posix/string.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix import "core:c" diff --git a/core/sys/posix/string_libc.odin b/core/sys/posix/string_libc.odin index d689847ee..a95ce9370 100644 --- a/core/sys/posix/string_libc.odin +++ b/core/sys/posix/string_libc.odin @@ -1,4 +1,4 @@ -#+build linux, windows, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, windows, darwin, netbsd, openbsd, freebsd package posix when ODIN_OS == .Windows { diff --git a/core/sys/posix/sys_ipc.odin b/core/sys/posix/sys_ipc.odin index 5814c7211..1c6b2c8de 100644 --- a/core/sys/posix/sys_ipc.odin +++ b/core/sys/posix/sys_ipc.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix import "core:c" @@ -111,27 +111,4 @@ when ODIN_OS == .Darwin { IPC_SET :: 1 IPC_STAT :: 2 -} else when ODIN_OS == .Haiku { - - key_t :: distinct c.int32_t - - ipc_perm :: struct { - key: key_t, - uid: uid_t, /* [PSX] owner's user ID */ - gid: gid_t, /* [PSX] owner's group ID */ - cuid: uid_t, /* [PSX] creator's user ID */ - cgid: gid_t, /* [PSX] creator's group ID */ - mode: mode_t, /* [PSX] read/write perms */ - } - - IPC_CREAT :: 0o01000 - IPC_EXCL :: 0o02000 - IPC_NOWAIT :: 0o04000 - - IPC_PRIVATE :: key_t(0) - - IPC_RMID :: 0 - IPC_SET :: 1 - IPC_STAT :: 2 - } diff --git a/core/sys/posix/sys_msg.odin b/core/sys/posix/sys_msg.odin index 87d5089ea..6f9f0a84f 100644 --- a/core/sys/posix/sys_msg.odin +++ b/core/sys/posix/sys_msg.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix import "core:c" @@ -171,22 +171,4 @@ when ODIN_OS == .Darwin { __unused: [2]c.ulong, } -} else when ODIN_OS == .Haiku { - - msgqnum_t :: distinct c.uint32_t - msglen_t :: distinct c.uint32_t - - MSG_NOERROR :: 0o10000 - - msqid_ds :: struct { - msg_perm: ipc_perm, /* [PSX] operation permission structure */ - msg_qnum: msgqnum_t, /* [PSX] number of messages currently on queue */ - msg_qbytes: msglen_t, /* [PSX] maximum number of bytes allowed on queue */ - msg_lspid: pid_t, /* [PSX] process ID of last msgsnd() */ - msg_lrpid: pid_t, /* [PSX] process ID of last msgrcv() */ - msg_stime: time_t, /* [PSX] time of last msgsnd() */ - msg_rtime: time_t, /* [PSX] time of last msgrcv() */ - msg_ctime: time_t, /* [PSX] time of last change */ - } - } diff --git a/core/sys/posix/sys_resource.odin b/core/sys/posix/sys_resource.odin index a748c2bba..28a562955 100644 --- a/core/sys/posix/sys_resource.odin +++ b/core/sys/posix/sys_resource.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix import "core:c" @@ -96,21 +96,15 @@ when ODIN_OS == .NetBSD { @(private) LGETRUSAGE :: "getrusage" } -when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux || ODIN_OS == .Haiku { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux { PRIO_PROCESS :: 0 PRIO_PGRP :: 1 PRIO_USER :: 2 - when ODIN_OS == .Haiku { - rlim_t :: distinct c.ulong - } else { - rlim_t :: distinct c.uint64_t - } + rlim_t :: distinct c.uint64_t - when ODIN_OS == .Haiku { - RLIM_INFINITY :: rlim_t(0xFFFFFFFF) - } else when ODIN_OS == .Linux { + when ODIN_OS == .Linux { RLIM_INFINITY :: ~rlim_t(0) } else { RLIM_INFINITY :: (rlim_t(1) << 63) - 1 @@ -151,29 +145,19 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS ru_nivcsw: c.long, /* involuntary " */ } - when ODIN_OS == .Haiku { - RLIMIT_CORE :: 0 - RLIMIT_CPU :: 1 - RLIMIT_DATA :: 2 - RLIMIT_FSIZE :: 3 - RLIMIT_NOFILE :: 4 - RLIMIT_STACK :: 5 - RLIMIT_AS :: 6 - } else { - RLIMIT_CORE :: 4 - RLIMIT_CPU :: 0 - RLIMIT_DATA :: 2 - RLIMIT_FSIZE :: 1 - RLIMIT_NOFILE :: 7 when ODIN_OS == .Linux else 8 - RLIMIT_STACK :: 3 + RLIMIT_CORE :: 4 + RLIMIT_CPU :: 0 + RLIMIT_DATA :: 2 + RLIMIT_FSIZE :: 1 + RLIMIT_NOFILE :: 7 when ODIN_OS == .Linux else 8 + RLIMIT_STACK :: 3 - when ODIN_OS == .Linux { - RLIMIT_AS :: 9 - } else when ODIN_OS == .Darwin || ODIN_OS == .OpenBSD { - RLIMIT_AS :: 5 - } else { - RLIMIT_AS :: 10 - } + when ODIN_OS == .Linux { + RLIMIT_AS :: 9 + } else when ODIN_OS == .Darwin || ODIN_OS == .OpenBSD { + RLIMIT_AS :: 5 + } else { + RLIMIT_AS :: 10 } } diff --git a/core/sys/posix/sys_select.odin b/core/sys/posix/sys_select.odin index 117dee625..c9dfbe194 100644 --- a/core/sys/posix/sys_select.odin +++ b/core/sys/posix/sys_select.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix import "base:intrinsics" @@ -56,9 +56,9 @@ when ODIN_OS == .NetBSD { LSELECT :: "select" } -when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux || ODIN_OS == .Haiku { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux { - suseconds_t :: distinct (c.int32_t when ODIN_OS == .Darwin || ODIN_OS == .NetBSD || ODIN_OS == .Haiku else c.long) + suseconds_t :: distinct (c.int32_t when ODIN_OS == .Darwin || ODIN_OS == .NetBSD else c.long) timeval :: struct { tv_sec: time_t, /* [PSX] seconds */ @@ -75,14 +75,8 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS @(private) ALIGN :: align_of(c.long) when ODIN_OS == .FreeBSD || ODIN_OS == .Linux else align_of(c.int32_t) - when ODIN_OS == .Haiku { - fd_set :: struct #align(ALIGN) { - fds_bits: [(FD_SETSIZE + (__NFDBITS - 1)) / __NFDBITS]c.int32_t, - } - } else { - fd_set :: struct #align(ALIGN) { - fds_bits: [(FD_SETSIZE / __NFDBITS) when (FD_SETSIZE % __NFDBITS) == 0 else (FD_SETSIZE / __NFDBITS) + 1]c.int32_t, - } + fd_set :: struct #align(ALIGN) { + fds_bits: [(FD_SETSIZE / __NFDBITS) when (FD_SETSIZE % __NFDBITS) == 0 else (FD_SETSIZE / __NFDBITS) + 1]c.int32_t, } @(private) diff --git a/core/sys/posix/sys_sem.odin b/core/sys/posix/sys_sem.odin index 012c0bbdb..423af75eb 100644 --- a/core/sys/posix/sys_sem.odin +++ b/core/sys/posix/sys_sem.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix import "core:c" @@ -168,30 +168,4 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS sem_flg: c.short, /* [PSX] operation flags */ } -} else when ODIN_OS == .Haiku { - - SEM_UNDO :: 10 // undo the operation on exit - - // Commands for `semctl'. - GETPID :: 3 - GETVAL :: 4 - GETALL :: 5 - GETNCNT :: 6 - GETZCNT :: 7 - SETVAL :: 8 - SETALL :: 9 - - semid_ds :: struct { - sem_perm: ipc_perm, // [PSX] operation permission structure - sem_nsems: c.ushort, // [PSX] number of semaphores in set - sem_otime: time_t, // [PSX] last semop() - sem_ctime: time_t, // [PSX] last time changed by semctl() - } - - sembuf :: struct { - sem_num: c.ushort, /* [PSX] semaphore number */ - sem_op: c.short, /* [PSX] semaphore operation */ - sem_flg: c.short, /* [PSX] operation flags */ - } - } diff --git a/core/sys/posix/sys_socket.odin b/core/sys/posix/sys_socket.odin index 812451219..8bc04fa90 100644 --- a/core/sys/posix/sys_socket.odin +++ b/core/sys/posix/sys_socket.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix import "core:c" @@ -328,17 +328,12 @@ when ODIN_OS == .NetBSD { @(private) LSOCKET :: "socket" } -when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux || ODIN_OS == .Haiku { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux { socklen_t :: distinct c.uint - when ODIN_OS == .Haiku { - @(private) - _SA_DATASIZE :: 30 - } else { - @(private) - _SA_DATASIZE :: 14 - } + @(private) + _SA_DATASIZE :: 14 when ODIN_OS == .Linux { _sa_family_t :: distinct c.ushort @@ -363,11 +358,6 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS _SS_PAD1SIZE :: 6 @(private) _SS_PAD2SIZE :: 240 - } else when ODIN_OS == .Haiku { - @(private) - _SS_PAD1SIZE :: 6 - @(private) - _SS_PAD2SIZE :: 112 } else when ODIN_OS == .Linux { @(private) _SS_SIZE :: 128 @@ -499,26 +489,6 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS SO_RCVTIMEO :: 66 SO_SNDTIMEO :: 67 - } else when ODIN_OS == .Haiku { - SOL_SOCKET :: -1 - - SO_ACCEPTCONN :: 0x00000001 - SO_BROADCAST :: 0x00000002 - SO_DEBUG :: 0x00000004 - SO_DONTROUTE :: 0x00000008 - SO_ERROR :: 0x40000007 - SO_KEEPALIVE :: 0x00000010 - SO_OOBINLINE :: 0x00000020 - SO_RCVBUF :: 0x40000004 - SO_RCVLOWAT :: 0x40000005 - SO_REUSEADDR :: 0x00000040 - SO_SNDBUF :: 0x40000001 - SO_SNDLOWAT :: 0x40000002 - SO_TYPE :: 0x40000008 - - SO_LINGER :: 0x00000200 - SO_RCVTIMEO :: 0x40000006 - SO_SNDTIMEO :: 0x40000003 } else { SOL_SOCKET :: 0xffff @@ -556,11 +526,7 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS } // The maximum backlog queue length for listen(). - when ODIN_OS == .Haiku { - SOMAXCONN :: 32 - } else { - SOMAXCONN :: 128 - } + SOMAXCONN :: 128 when ODIN_OS == .Linux { MSG_CTRUNC :: 0x008 @@ -586,18 +552,11 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS MSG_NOSIGNAL :: 0x00020000 } else when ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD { MSG_NOSIGNAL :: 0x0400 - } else when ODIN_OS == .Haiku { - MSG_NOSIGNAL :: 0x800 } } - when ODIN_OS == .Haiku { - AF_INET :: 1 - AF_UNIX :: 9 - } else { - AF_INET :: 2 - AF_UNIX :: 1 - } + AF_INET :: 2 + AF_UNIX :: 1 when ODIN_OS == .Darwin { AF_INET6 :: 30 @@ -607,8 +566,6 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS AF_INET6 :: 24 } else when ODIN_OS == .Linux { AF_INET6 :: 10 - } else when ODIN_OS == .Haiku { - AF_INET6 :: 5 } SHUT_RD :: 0 diff --git a/core/sys/posix/sys_stat.odin b/core/sys/posix/sys_stat.odin index df0bf2b49..c11c83c42 100644 --- a/core/sys/posix/sys_stat.odin +++ b/core/sys/posix/sys_stat.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix import "core:c" @@ -428,36 +428,6 @@ when ODIN_OS == .Darwin { UTIME_NOW :: -2 UTIME_OMIT :: -1 -} else when ODIN_OS == .Haiku { - - dev_t :: distinct c.int32_t - nlink_t :: distinct c.int32_t - _mode_t :: distinct c.uint32_t - blkcnt_t :: distinct c.int64_t - blksize_t :: distinct c.int32_t - ino_t :: distinct c.int64_t - - stat_t :: struct { - st_dev: dev_t, /* [PSX] ID of device containing file */ - st_ino: ino_t, /* [PSX] file serial number */ - st_mode: mode_t, /* [PSX] mode of file */ - st_nlink: nlink_t, /* [PSX] number of hard links */ - st_uid: uid_t, /* [PSX] user ID of the file */ - st_gid: gid_t, /* [PSX] group ID of the file */ - st_size: off_t, /* [PSX] file size, in bytes */ - st_rdev: dev_t, /* [PSX] device ID */ - st_blksize: blksize_t, /* [PSX] optimal blocksize for I/O */ - st_atim: timespec, /* [PSX] time of last access */ - st_mtim: timespec, /* [PSX] time of last data modification */ - st_ctim: timespec, /* [PSX] time of last status change */ - st_crtim: timespec, /* [PSX] time of last status change */ - st_type: c.uint32_t, - st_blocks: blkcnt_t, /* [PSX] blocks allocated for file */ - } - - UTIME_NOW :: 1000000000 - UTIME_OMIT :: 1000000001 - } else when ODIN_OS == .Linux { dev_t :: distinct u64 diff --git a/core/sys/posix/sys_time.odin b/core/sys/posix/sys_time.odin index 058166759..64cc3d2be 100644 --- a/core/sys/posix/sys_time.odin +++ b/core/sys/posix/sys_time.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix import "core:c" @@ -78,15 +78,4 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS ITIMER_VIRTUAL :: 1 ITIMER_PROF :: 2 -} else when ODIN_OS == .Haiku { - - itimerval :: struct { - it_interval: timeval, /* [PSX] timer interval */ - it_value: timeval, /* [PSX] current value */ - } - - ITIMER_REAL :: 1 - ITIMER_VIRTUAL :: 2 - ITIMER_PROF :: 3 - } diff --git a/core/sys/posix/sys_times.odin b/core/sys/posix/sys_times.odin index 636d3e153..16b9e75f0 100644 --- a/core/sys/posix/sys_times.odin +++ b/core/sys/posix/sys_times.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix when ODIN_OS == .Darwin { @@ -25,7 +25,7 @@ when ODIN_OS == .NetBSD { @(private) LTIMES :: "times" } -when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux || ODIN_OS == .Haiku { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux { tms :: struct { tms_utime: clock_t, /* [PSX] user CPU time */ diff --git a/core/sys/posix/sys_uio.odin b/core/sys/posix/sys_uio.odin index b4411851b..030b99a88 100644 --- a/core/sys/posix/sys_uio.odin +++ b/core/sys/posix/sys_uio.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix import "core:c" @@ -31,7 +31,7 @@ foreign libc { writev :: proc(fildes: FD, iov: [^]iovec, iovcnt: c.int) -> c.ssize_t --- } -when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux || ODIN_OS == .Haiku { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux { iovec :: struct { iov_base: rawptr, /* [PSX] base address of I/O memory region */ diff --git a/core/sys/posix/sys_un.odin b/core/sys/posix/sys_un.odin index 167bf3ce1..ca5c4ee31 100644 --- a/core/sys/posix/sys_un.odin +++ b/core/sys/posix/sys_un.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix import "core:c" @@ -20,12 +20,4 @@ when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS sun_path: [108]c.char, /* [PSX] socket pathname */ } -} else when ODIN_OS == .Haiku { - - sockaddr_un :: struct { - sun_len: c.uint8_t, - sun_family: sa_family_t, /* [PSX] address family */ - sun_path: [126]c.char, /* [PSX] socket pathname */ - } - } diff --git a/core/sys/posix/sys_utsname.odin b/core/sys/posix/sys_utsname.odin index 61f88b584..f29230c62 100644 --- a/core/sys/posix/sys_utsname.odin +++ b/core/sys/posix/sys_utsname.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix import "core:c" @@ -38,10 +38,10 @@ foreign lib { uname :: proc(uname: ^utsname) -> c.int --- } -when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Haiku { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD { @(private) - _SYS_NAMELEN :: 32 when ODIN_OS == .Haiku else 256 + _SYS_NAMELEN :: 256 utsname :: struct { sysname: [_SYS_NAMELEN]c.char `fmt:"s,0"`, /* [PSX] name of OS */ diff --git a/core/sys/posix/sys_wait.odin b/core/sys/posix/sys_wait.odin index e12fcd212..751a184a0 100644 --- a/core/sys/posix/sys_wait.odin +++ b/core/sys/posix/sys_wait.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix import "core:c" @@ -443,55 +443,4 @@ when ODIN_OS == .Darwin { return x == 0xffff } -} else when ODIN_OS == .Haiku { - - id_t :: distinct c.int32_t - - WCONTINUED :: 0x04 - WNOHANG :: 0x01 - WUNTRACED :: 0x02 - - WEXITED :: 0x08 - WNOWAIT :: 0x20 - WSTOPPED :: 0x10 - - _P_ALL :: 0 - _P_PID :: 1 - _P_PGID :: 2 - - @(private) - _WIFEXITED :: #force_inline proc "contextless" (x: c.int) -> bool { - return (x & ~(c.int)(0xff)) == 0 - } - - @(private) - _WEXITSTATUS :: #force_inline proc "contextless" (x: c.int) -> c.int { - return x & 0xff - } - - @(private) - _WIFSIGNALED :: #force_inline proc "contextless" (x: c.int) -> bool { - return ((x >> 8) & 0xff) != 0 - } - - @(private) - _WTERMSIG :: #force_inline proc "contextless" (x: c.int) -> Signal { - return Signal((x >> 8) & 0xff) - } - - @(private) - _WIFSTOPPED :: #force_inline proc "contextless" (x: c.int) -> bool { - return ((x >> 16) & 0xff) != 0 - } - - @(private) - _WSTOPSIG :: #force_inline proc "contextless" (x: c.int) -> Signal { - return Signal((x >> 16) & 0xff) - } - - @(private) - _WIFCONTINUED :: #force_inline proc "contextless" (x: c.int) -> bool { - return (x & 0x20000) != 0 - } - } diff --git a/core/sys/posix/termios.odin b/core/sys/posix/termios.odin index b385b7097..c63cfa797 100644 --- a/core/sys/posix/termios.odin +++ b/core/sys/posix/termios.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix import "core:c" @@ -138,31 +138,19 @@ CLocal_Flag_Bits :: enum tcflag_t { } CLocal_Flags :: bit_set[CLocal_Flag_Bits; tcflag_t] -when ODIN_OS == .Haiku { - CControl_Flag_Bits :: enum tcflag_t { - // CS7 = log2(CS7), /* 7 bits (default) */ - CS8 = log2(CS8), /* 8 bits */ - CSTOPB = log2(CSTOPB), /* send 2 stop bits */ - CREAD = log2(CREAD), /* enable receiver */ - PARENB = log2(PARENB), /* parity enable */ - PARODD = log2(PARODD), /* odd parity, else even */ - HUPCL = log2(HUPCL), /* hang up on last close */ - CLOCAL = log2(CLOCAL), /* ignore modem status lines */ - } -} else { - CControl_Flag_Bits :: enum tcflag_t { - // CS5 = log2(CS5), /* 5 bits (pseudo) (default) */ - CS6 = log2(CS6), /* 6 bits */ - CS7 = log2(CS7), /* 7 bits */ - CS8 = log2(CS8), /* 8 bits */ - CSTOPB = log2(CSTOPB), /* send 2 stop bits */ - CREAD = log2(CREAD), /* enable receiver */ - PARENB = log2(PARENB), /* parity enable */ - PARODD = log2(PARODD), /* odd parity, else even */ - HUPCL = log2(HUPCL), /* hang up on last close */ - CLOCAL = log2(CLOCAL), /* ignore modem status lines */ - } +CControl_Flag_Bits :: enum tcflag_t { + // CS5 = log2(CS5), /* 5 bits (pseudo) (default) */ + CS6 = log2(CS6), /* 6 bits */ + CS7 = log2(CS7), /* 7 bits */ + CS8 = log2(CS8), /* 8 bits */ + CSTOPB = log2(CSTOPB), /* send 2 stop bits */ + CREAD = log2(CREAD), /* enable receiver */ + PARENB = log2(PARENB), /* parity enable */ + PARODD = log2(PARODD), /* odd parity, else even */ + HUPCL = log2(HUPCL), /* hang up on last close */ + CLOCAL = log2(CLOCAL), /* ignore modem status lines */ } + CControl_Flags :: bit_set[CControl_Flag_Bits; tcflag_t] // character size mask @@ -610,151 +598,4 @@ when ODIN_OS == .Darwin { TCOOFF :: 0 TCOON :: 1 -} else when ODIN_OS == .Haiku { - - cc_t :: distinct c.uchar - _speed_t :: distinct c.uint32_t - tcflag_t :: distinct c.uint16_t - - // Same as speed_t, but 16-bit. - CSpeed :: enum tcflag_t { - B0 = B0, - B50 = B50, - B75 = B75, - B110 = B110, - B134 = B134, - B150 = B150, - B200 = B200, - B300 = B300, - B600 = B600, - B1200 = B1200, - B1800 = B1800, - B2400 = B2400, - B4800 = B4800, - B9600 = B9600, - B19200 = B19200, - B38400 = B38400, - } - - termios :: struct { - c_iflag: CInput_Flags, /* [XBD] input flags */ - c_ispeed: CSpeed, /* input speed */ - c_oflag: COutput_Flags, /* [XBD] output flags */ - c_ospeed: CSpeed, /* output speed */ - c_cflag: CControl_Flags, /* [XBD] control flags */ - c_ispeed_high: tcflag_t, /* high word of input baudrate */ - c_lflag: CLocal_Flags, /* [XBD] local flag */ - c_ospeed_high: tcflag_t, /* high word of output baudrate */ - c_line: c.char, - _padding: c.uchar, - _padding2: c.uchar, - c_cc: [NCCS]cc_t, - } - - NCCS :: 11 - - VINTR :: 0 - VQUIT :: 1 - VERASE :: 2 - VKILL :: 3 - VEOF :: 4 - VEOL :: 5 - VMIN :: 4 - VTIME :: 5 - VEOL2 :: 6 - VSWTCH :: 7 - VSTART :: 8 - VSTOP :: 9 - VSUSP :: 10 - - IGNBRK :: 0x01 /* ignore break condition */ - BRKINT :: 0x02 /* break sends interrupt */ - IGNPAR :: 0x04 /* ignore characters with parity errors */ - PARMRK :: 0x08 /* mark parity errors */ - INPCK :: 0x10 /* enable input parity checking */ - ISTRIP :: 0x20 /* strip high bit from characters */ - INLCR :: 0x40 /* maps newline to CR on input */ - IGNCR :: 0x80 /* ignore carriage returns */ - ICRNL :: 0x100 /* map CR to newline on input */ - IXON :: 0x400 /* enable input SW flow control */ - IXANY :: 0x800 /* any character will restart input */ - IXOFF :: 0x1000 /* enable output SW flow control */ - - OPOST :: 0x01 /* enable postprocessing of output */ - ONLCR :: 0x04 /* map NL to CR-NL on output */ - OCRNL :: 0x08 /* map CR to NL on output */ - ONOCR :: 0x10 /* no CR output when at column 0 */ - ONLRET :: 0x20 /* newline performs CR function */ - OFILL :: 0x40 /* use fill characters for delays */ - OFDEL :: 0x80 /* Fills are DEL, otherwise NUL */ - _NLDLY :: 0x100 /* Newline delays: */ - NL0 :: 0x000 - NL1 :: 0x100 - _CRDLY :: 0x600 /* Carriage return delays: */ - CR0 :: 0x000 - CR1 :: 0x200 - CR2 :: 0x400 - CR3 :: 0x600 - _TABDLY :: 0x1800 /* Tab delays: */ - TAB0 :: 0x0000 - TAB1 :: 0x0800 - TAB3 :: 0x1800 - _BSDLY :: 0x2000 /* Backspace delays: */ - BS0 :: 0x0000 - BS1 :: 0x2000 - _VTDLY :: 0x4000 /* Vertical tab delays: */ - VT0 :: 0x0000 - VT1 :: 0x4000 - _FFDLY :: 0x8000 /* Form feed delays: */ - FF0 :: 0x0000 - FF1 :: 0x8000 - - B0 :: 0x00 /* hang up */ - B50 :: 0x01 /* 50 baud */ - B75 :: 0x02 - B110 :: 0x03 - B134 :: 0x04 - B150 :: 0x05 - B200 :: 0x06 - B300 :: 0x07 - B600 :: 0x08 - B1200 :: 0x09 - B1800 :: 0x0A - B2400 :: 0x0B - B4800 :: 0x0C - B9600 :: 0x0D - B19200 :: 0x0E - B38400 :: 0x0F - - _CSIZE :: 0x20 /* character size */ - //CS5 :: 0x00 /* only 7 and 8 bits supported */ - //CS6 :: 0x00 /* Note, it was not very wise to set all of these */ - //CS7 :: 0x00 /* to zero, but there is not much we can do about it*/ - CS8 :: 0x20 - CSTOPB :: 0x40 /* send 2 stop bits, not 1 */ - CREAD :: 0x80 /* enable receiver */ - PARENB :: 0x100 /* parity enable */ - PARODD :: 0x200 /* odd parity, else even */ - HUPCL :: 0x400 /* hangs up on last close */ - CLOCAL :: 0x800 /* indicates local line */ - - ISIG :: 0x01 /* enable signals */ - ICANON :: 0x02 /* Canonical input */ - ECHO :: 0x08 /* Enable echo */ - ECHOE :: 0x10 /* Echo erase as bs-sp-bs */ - ECHOK :: 0x20 /* Echo nl after kill */ - ECHONL :: 0x40 /* Echo nl */ - NOFLSH :: 0x80 /* Disable flush after int or quit */ - TOSTOP :: 0x100 /* stop bg processes that write to tty */ - IEXTEN :: 0x200 /* implementation defined extensions */ - - TCIFLUSH :: 1 - TCOFLUSH :: 2 - TCIOFLUSH :: 3 - - TCIOFF :: 0x04 - TCION :: 0x08 - TCOOFF :: 0x01 - TCOON :: 0x02 - } diff --git a/core/sys/posix/time.odin b/core/sys/posix/time.odin index 7d55cf15b..c571d6ee8 100644 --- a/core/sys/posix/time.odin +++ b/core/sys/posix/time.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix import "core:c" @@ -230,17 +230,6 @@ when ODIN_OS == .Darwin { getdate_err: Errno = .ENOSYS // NOTE: looks like it's not a thing on OpenBSD. -} else when ODIN_OS == .Haiku { - - clockid_t :: distinct c.int32_t - - CLOCK_MONOTONIC :: 0 - CLOCK_PROCESS_CPUTIME_ID :: -2 - CLOCK_REALTIME :: -1 - CLOCK_THREAD_CPUTIME_ID :: -3 - - getdate_err: Errno = .ENOSYS // NOTE: looks like it's not a thing on Haiku. - } else when ODIN_OS == .Linux { clockid_t :: distinct c.int diff --git a/core/sys/posix/unistd.odin b/core/sys/posix/unistd.odin index b05f1e4fa..29376046c 100644 --- a/core/sys/posix/unistd.odin +++ b/core/sys/posix/unistd.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix import "core:c" @@ -2032,174 +2032,4 @@ when ODIN_OS == .Darwin { // NOTE: Not implemented. _POSIX_VDISABLE :: 0 -} else when ODIN_OS == .Haiku { - - _F_OK :: 0 - X_OK :: 1 - W_OK :: 2 - R_OK :: 4 - - F_LOCK :: 1 - F_TEST :: 3 - F_TLOCK :: 2 - F_ULOCK :: 0 - - _CS_PATH :: 1 - _CS_POSIX_V6_WIDTH_RESTRICTED_ENVS :: 0 // Undefined. - _CS_POSIX_V6_ILP32_OFF32_CFLAGS :: 0 // Undefined. - _CS_POSIX_V6_ILP32_OFF32_LDFLAGS :: 0 // Undefined. - _CS_POSIX_V6_ILP32_OFF32_LIBS :: 0 // Undefined. - _CS_POSIX_V6_ILP32_OFFBIG_CFLAGS :: 0 // Undefined. - _CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS :: 0 // Undefined. - _CS_POSIX_V6_ILP32_OFFBIG_LIBS :: 0 // Undefined. - _CS_POSIX_V6_LP64_OFF64_CFLAGS :: 0 // Undefined. - _CS_POSIX_V6_LP64_OFF64_LDFLAGS :: 0 // Undefined. - _CS_POSIX_V6_LP64_OFF64_LIBS :: 0 // Undefined. - _CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS :: 0 // Undefined. - _CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS :: 0 // Undefined. - _CS_POSIX_V6_LPBIG_OFFBIG_LIBS :: 0 // Undefined. - - _SC_ASYNCHRONOUS_IO :: 0 // Undefined. - _SC_RAW_SOCKETS :: 0 // Undefined. - _SC_SS_REPL_MAX :: 0 // Undefined. - _SC_TRACE_EVENT_NAME_MAX :: 0 // Undefined. - _SC_TRACE_NAME_MAX :: 0 // Undefined. - _SC_TRACE_SYS_MAX :: 0 // Undefined. - _SC_TRACE_USER_EVENT_MAX :: 0 // Undefined. - - _PC_CHOWN_RESTRICTED :: 1 - _PC_MAX_CANON :: 2 - _PC_MAX_INPUT :: 3 - _PC_NAME_MAX :: 4 - _PC_NO_TRUNC :: 5 - _PC_PATH_MAX :: 6 - _PC_PIPE_BUF :: 7 - _PC_VDISABLE :: 8 - _PC_LINK_MAX :: 25 - _PC_SYNC_IO :: 26 - _PC_ASYNC_IO :: 27 - _PC_PRIO_IO :: 28 - _PC_FILESIZEBITS :: 30 - _PC_REC_INCR_XFER_SIZE :: 31 - _PC_REC_MAX_XFER_SIZE :: 32 - _PC_REC_MIN_XFER_SIZE :: 33 - _PC_REC_XFER_ALIGN :: 34 - _PC_ALLOC_SIZE_MIN :: 35 - _PC_SYMLINK_MAX :: 36 - _PC_2_SYMLINKS :: 37 - - _SC_ARG_MAX :: 15 - _SC_CHILD_MAX :: 16 - _SC_CLK_TCK :: 17 - _SC_JOB_CONTROL :: 18 - _SC_NGROUPS_MAX :: 19 - _SC_OPEN_MAX :: 20 - _SC_SAVED_IDS :: 21 - _SC_STREAM_MAX :: 22 - _SC_TZNAME_MAX :: 23 - _SC_VERSION :: 24 - _SC_GETGR_R_SIZE_MAX :: 25 - _SC_GETPW_R_SIZE_MAX :: 26 - _SC_PAGE_SIZE :: 27 - _SC_PAGESIZE :: _SC_PAGE_SIZE - _SC_SEM_NSEMS_MAX :: 28 - _SC_SEM_VALUE_MAX :: 29 - _SC_SEMAPHORES :: 30 - _SC_THREADS :: 31 - _SC_IOV_MAX :: 32 - _SC_NPROCESSORS_CONF :: 34 - _SC_NPROCESSORS_ONLN :: 35 - _SC_ATEXIT_MAX :: 37 - _SC_MAPPED_FILES :: 45 - _SC_THREAD_PROCESS_SHARED :: 46 - _SC_THREAD_STACK_MIN :: 47 - _SC_THREAD_ATTR_STACKADDR :: 48 - _SC_THREAD_ATTR_STACKSIZE :: 49 - _SC_THREAD_PRIORITY_SCHEDULING :: 50 - _SC_REALTIME_SIGNALS :: 51 - _SC_MEMORY_PROTECTION :: 52 - _SC_SIGQUEUE_MAX :: 53 - _SC_RTSIG_MAX :: 54 - _SC_MONOTONIC_CLOCK :: 55 - _SC_DELAYTIMER_MAX :: 56 - _SC_TIMER_MAX :: 57 - _SC_TIMERS :: 58 - _SC_CPUTIME :: 59 - _SC_THREAD_CPUTIME :: 60 - _SC_HOST_NAME_MAX :: 61 - _SC_REGEXP :: 62 - _SC_SYMLOOP_MAX :: 63 - _SC_SHELL :: 64 - _SC_TTY_NAME_MAX :: 65 - _SC_ADVISORY_INFO :: 66 - _SC_BARRIERS :: 67 - _SC_CLOCK_SELECTION :: 68 - _SC_FSYNC :: 69 - _SC_IPV6 :: 70 - _SC_MEMLOCK :: 71 - _SC_MEMLOCK_RANGE :: 72 - _SC_MESSAGE_PASSING :: 73 - _SC_PRIORITIZED_IO :: 74 - _SC_PRIORITY_SCHEDULING :: 75 - _SC_READER_WRITER_LOCKS :: 76 - _SC_SHARED_MEMORY_OBJECTS :: 77 - _SC_SPAWN :: 78 - _SC_SPIN_LOCKS :: 79 - _SC_SPORADIC_SERVER :: 80 - _SC_SYNCHRONIZED_IO :: 81 - _SC_THREAD_PRIO_INHERIT :: 82 - _SC_THREAD_PRIO_PROTECT :: 83 - _SC_THREAD_SAFE_FUNCTIONS :: 86 - _SC_THREAD_SPORADIC_SERVER :: 87 - _SC_TIMEOUTS :: 88 - _SC_TRACE :: 89 - _SC_TRACE_EVENT_FILTER :: 90 - _SC_TRACE_INHERIT :: 91 - _SC_TRACE_LOG :: 92 - _SC_TYPED_MEMORY_OBJECTS :: 93 - _SC_V6_ILP32_OFF32 :: 94 - _SC_V6_ILP32_OFFBIG :: 95 - _SC_V6_LP64_OFF64 :: 96 - _SC_V6_LPBIG_OFFBIG :: 97 - _SC_2_C_BIND :: 102 - _SC_2_C_DEV :: 103 - _SC_2_CHAR_TERM :: 104 - _SC_2_FORT_DEV :: 105 - _SC_2_FORT_RUN :: 106 - _SC_2_LOCALEDEF :: 107 - _SC_2_PBS :: 108 - _SC_2_PBS_ACCOUNTING :: 109 - _SC_2_PBS_CHECKPOINT :: 110 - _SC_2_PBS_LOCATE :: 111 - _SC_2_PBS_MESSAGE :: 112 - _SC_2_PBS_TRACK :: 113 - _SC_2_SW_DEV :: 114 - _SC_2_UPE :: 115 - _SC_2_VERSION :: 116 - _SC_XOPEN_CRYPT :: 117 - _SC_XOPEN_ENH_I18N :: 118 - _SC_XOPEN_REALTIME :: 119 - _SC_XOPEN_REALTIME_THREADS :: 120 - _SC_XOPEN_SHM :: 121 - _SC_XOPEN_STREAMS :: 122 - _SC_XOPEN_UNIX :: 123 - _SC_XOPEN_VERSION :: 125 - _SC_AIO_LISTIO_MAX :: 126 - _SC_AIO_MAX :: 127 - _SC_AIO_PRIO_DELTA_MAX :: 128 - _SC_BC_BASE_MAX :: 129 - _SC_BC_DIM_MAX :: 130 - _SC_BC_SCALE_MAX :: 131 - _SC_BC_STRING_MAX :: 132 - _SC_COLL_WEIGHTS_MAX :: 133 - _SC_EXPR_NEST_MAX :: 134 - _SC_LINE_MAX :: 135 - _SC_LOGIN_NAME_MAX :: 136 - _SC_MQ_OPEN_MAX :: 137 - _SC_MQ_PRIO_MAX :: 138 - _SC_THREAD_DESTRUCTOR_ITERATIONS :: 139 - _SC_THREAD_KEYS_MAX :: 140 - _SC_THREAD_THREADS_MAX :: 141 - _SC_RE_DUP_MAX :: 142 - } diff --git a/core/sys/posix/unistd_libc.odin b/core/sys/posix/unistd_libc.odin index 85d019f21..b8e0a7df9 100644 --- a/core/sys/posix/unistd_libc.odin +++ b/core/sys/posix/unistd_libc.odin @@ -1,4 +1,4 @@ -#+build linux, windows, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, windows, darwin, netbsd, openbsd, freebsd package posix import "core:c" diff --git a/core/sys/posix/utime.odin b/core/sys/posix/utime.odin index fca0dee59..0adc3263e 100644 --- a/core/sys/posix/utime.odin +++ b/core/sys/posix/utime.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd, haiku +#+build linux, darwin, netbsd, openbsd, freebsd package posix when ODIN_OS == .Darwin { @@ -25,7 +25,7 @@ when ODIN_OS == .NetBSD { @(private) LUTIME :: "utime" } -when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux || ODIN_OS == .Haiku { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Linux { utimbuf :: struct { actime: time_t, /* [PSX] access time (seconds since epoch) */ From f327bcab927b60dac831d6cdbe263ff2b3a4ef6f Mon Sep 17 00:00:00 2001 From: Ignacy Koper Date: Tue, 28 Apr 2026 18:06:48 +0200 Subject: [PATCH 020/228] removed Haiku from core:sync, and core:thread Signed-off-by: Ignacy Koper --- core/sync/futex_haiku.odin | 164 -------------------------------- core/sync/primitives_haiku.odin | 8 -- core/thread/thread_unix.odin | 6 +- 3 files changed, 3 insertions(+), 175 deletions(-) delete mode 100644 core/sync/futex_haiku.odin delete mode 100644 core/sync/primitives_haiku.odin diff --git a/core/sync/futex_haiku.odin b/core/sync/futex_haiku.odin deleted file mode 100644 index 52321644a..000000000 --- a/core/sync/futex_haiku.odin +++ /dev/null @@ -1,164 +0,0 @@ -#+private -package sync - -import "core:sys/haiku" -import "core:sys/posix" -import "core:time" - -@(private="file") -Wait_Node :: struct { - thread: posix.pthread_t, - futex: ^Futex, - prev, next: ^Wait_Node, -} -@(private="file") -atomic_flag :: distinct bool -@(private="file") -Wait_Queue :: struct { - lock: atomic_flag, - list: Wait_Node, -} -@(private="file") -waitq_lock :: proc "contextless" (waitq: ^Wait_Queue) { - for cast(bool)atomic_exchange_explicit(&waitq.lock, atomic_flag(true), .Acquire) { - cpu_relax() // spin... - } -} -@(private="file") -waitq_unlock :: proc "contextless" (waitq: ^Wait_Queue) { - atomic_store_explicit(&waitq.lock, atomic_flag(false), .Release) -} - -// FIXME: This approach may scale badly in the future, -// possible solution - hash map (leads to deadlocks now). -@(private="file") -g_waitq: Wait_Queue - -@(init, private="file") -g_waitq_init :: proc() { - g_waitq = { - list = { - prev = &g_waitq.list, - next = &g_waitq.list, - }, - } -} - -@(private="file") -get_waitq :: #force_inline proc "contextless" (f: ^Futex) -> ^Wait_Queue { - _ = f - return &g_waitq -} - -_futex_wait :: proc "contextless" (f: ^Futex, expect: u32) -> (ok: bool) { - waitq := get_waitq(f) - waitq_lock(waitq) - defer waitq_unlock(waitq) - - head := &waitq.list - waiter := Wait_Node{ - thread = posix.pthread_self(), - futex = f, - prev = head, - next = head.next, - } - - waiter.prev.next = &waiter - waiter.next.prev = &waiter - - old_mask, mask: posix.sigset_t - posix.sigemptyset(&mask) - posix.sigaddset(&mask, .SIGCONT) - posix.pthread_sigmask(.BLOCK, &mask, &old_mask) - - if u32(atomic_load_explicit(f, .Acquire)) == expect { - waitq_unlock(waitq) - defer waitq_lock(waitq) - - sig: posix.Signal - errno := posix.sigwait(&mask, &sig) - ok = errno == nil - } - - waiter.prev.next = waiter.next - waiter.next.prev = waiter.prev - - _ = posix.pthread_sigmask(.SETMASK, &old_mask, nil) - - // FIXME: Add error handling! - return -} - -_futex_wait_with_timeout :: proc "contextless" (f: ^Futex, expect: u32, duration: time.Duration) -> (ok: bool) { - if duration <= 0 { - return false - } - waitq := get_waitq(f) - waitq_lock(waitq) - defer waitq_unlock(waitq) - - head := &waitq.list - waiter := Wait_Node{ - thread = posix.pthread_self(), - futex = f, - prev = head, - next = head.next, - } - - waiter.prev.next = &waiter - waiter.next.prev = &waiter - - old_mask, mask: posix.sigset_t - posix.sigemptyset(&mask) - posix.sigaddset(&mask, .SIGCONT) - posix.pthread_sigmask(.BLOCK, &mask, &old_mask) - - if u32(atomic_load_explicit(f, .Acquire)) == expect { - waitq_unlock(waitq) - defer waitq_lock(waitq) - - info: posix.siginfo_t - ts := posix.timespec{ - tv_sec = posix.time_t(i64(duration / 1e9)), - tv_nsec = i64(duration % 1e9), - } - haiku.sigtimedwait(&mask, &info, &ts) - errno := posix.errno() - ok = errno == .EAGAIN || errno == nil - } - - waiter.prev.next = waiter.next - waiter.next.prev = waiter.prev - - posix.pthread_sigmask(.SETMASK, &old_mask, nil) - - // FIXME: Add error handling! - return -} - -_futex_signal :: proc "contextless" (f: ^Futex) { - waitq := get_waitq(f) - waitq_lock(waitq) - defer waitq_unlock(waitq) - - head := &waitq.list - for waiter := head.next; waiter != head; waiter = waiter.next { - if waiter.futex == f { - posix.pthread_kill(waiter.thread, .SIGCONT) - break - } - } -} - -_futex_broadcast :: proc "contextless" (f: ^Futex) { - waitq := get_waitq(f) - waitq_lock(waitq) - defer waitq_unlock(waitq) - - head := &waitq.list - for waiter := head.next; waiter != head; waiter = waiter.next { - if waiter.futex == f { - posix.pthread_kill(waiter.thread, .SIGCONT) - } - } -} diff --git a/core/sync/primitives_haiku.odin b/core/sync/primitives_haiku.odin deleted file mode 100644 index 69d005206..000000000 --- a/core/sync/primitives_haiku.odin +++ /dev/null @@ -1,8 +0,0 @@ -#+private -package sync - -import "core:sys/haiku" - -_current_thread_id :: proc "contextless" () -> int { - return int(haiku.find_thread(nil)) -} diff --git a/core/thread/thread_unix.odin b/core/thread/thread_unix.odin index af2a4a3c1..02e628df5 100644 --- a/core/thread/thread_unix.odin +++ b/core/thread/thread_unix.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, freebsd, openbsd, netbsd, haiku +#+build linux, darwin, freebsd, openbsd, netbsd #+private package thread @@ -83,7 +83,7 @@ _create :: proc(procedure: Thread_Proc, priority: Thread_Priority) -> ^Thread { // NOTE(tetra, 2019-11-01): These only fail if their argument is invalid. res = posix.pthread_attr_setdetachstate(&attrs, .CREATE_JOINABLE) assert(res == nil) - when ODIN_OS != .Haiku && ODIN_OS != .NetBSD { + when ODIN_OS != .NetBSD { res = posix.pthread_attr_setinheritsched(&attrs, .EXPLICIT_SCHED) assert(res == nil) } @@ -96,7 +96,7 @@ _create :: proc(procedure: Thread_Proc, priority: Thread_Priority) -> ^Thread { // Set thread priority. policy: posix.Sched_Policy - when ODIN_OS != .Haiku && ODIN_OS != .NetBSD { + when ODIN_OS != .NetBSD { res = posix.pthread_attr_getschedpolicy(&attrs, &policy) assert(res == nil) } From 34b198019f3a7f58071a45c3f16fd7adf91adac9 Mon Sep 17 00:00:00 2001 From: Krzesimir Nowak Date: Sun, 3 May 2026 15:47:16 +0200 Subject: [PATCH 021/228] Better error reporting for unary decrement/increment operators There was a missing routing for those operators in parse_stmt function. --- core/odin/parser/parser.odin | 2 +- src/parser.cpp | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin index b58635080..36cb751b3 100644 --- a/core/odin/parser/parser.odin +++ b/core/odin/parser/parser.odin @@ -1390,7 +1390,7 @@ parse_stmt :: proc(p: ^Parser) -> ^ast.Stmt { .Pointer, .Asm, // Inline assembly // Unary Expressions - .Add, .Sub, .Xor, .Not, .And: + .Add, .Sub, .Xor, .Not, .And, .Increment, .Decrement: s := parse_simple_stmt(p, {Stmt_Allow_Flag.Label}) expect_semicolon(p, s) diff --git a/src/parser.cpp b/src/parser.cpp index 8fe33d2b8..17ab5ccf1 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -5393,7 +5393,10 @@ gb_internal Ast *parse_stmt(AstFile *f) { case Token_Xor: case Token_Not: case Token_And: - case Token_Mul: // Used for error handling when people do C-like things + // Used for error handling when people do C-like things + case Token_Mul: + case Token_Increment: + case Token_Decrement: s = parse_simple_stmt(f, StmtAllowFlag_Label); expect_semicolon(f); return s; From e3504c94adf4edeabea3883e0e110bb4a9e7e690 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Sat, 28 Mar 2026 11:47:06 +0900 Subject: [PATCH 022/228] core/crypto: Get rid of `set` (only used by legacy) --- core/crypto/crypto.odin | 12 ------------ core/crypto/legacy/md5/md5.odin | 3 ++- core/crypto/legacy/sha1/sha1.odin | 3 ++- tests/benchmark/crypto/benchmark_ecc.odin | 3 ++- 4 files changed, 6 insertions(+), 15 deletions(-) diff --git a/core/crypto/crypto.odin b/core/crypto/crypto.odin index aa5a67b8f..3218b8670 100644 --- a/core/crypto/crypto.odin +++ b/core/crypto/crypto.odin @@ -85,18 +85,6 @@ zero_explicit :: proc "contextless" (data: rawptr, len: int) -> rawptr { return data } -/* -Set each byte of a memory range to a specific value. - -This procedure copies value specified by the `value` parameter into each of the -`len` bytes of a memory range, located at address `data`. - -This procedure returns the pointer to `data`. -*/ -set :: proc "contextless" (data: rawptr, value: byte, len: int) -> rawptr { - return runtime.memset(data, i32(value), len) -} - // rand_bytes fills the dst buffer with cryptographic entropy taken from // the system entropy source. This routine will block if the system entropy // source is not ready yet. All system entropy source failures are treated diff --git a/core/crypto/legacy/md5/md5.odin b/core/crypto/legacy/md5/md5.odin index 4bbc5d32a..ddc795b7d 100644 --- a/core/crypto/legacy/md5/md5.odin +++ b/core/crypto/legacy/md5/md5.odin @@ -18,6 +18,7 @@ package md5 zhibog, dotbmp: Initial implementation. */ +import "base:intrinsics" import "core:crypto" import "core:encoding/endian" import "core:math/bits" @@ -100,7 +101,7 @@ final :: proc(ctx: ^Context, hash: []byte, finalize_clone: bool = false) { i += 1 } transform(ctx, ctx.data[:]) - crypto.set(&ctx.data, 0, 56) + intrinsics.mem_zero(&ctx.data, 56) } ctx.bitlen += u64(ctx.datalen * 8) diff --git a/core/crypto/legacy/sha1/sha1.odin b/core/crypto/legacy/sha1/sha1.odin index 892f893a6..bf3ad9602 100644 --- a/core/crypto/legacy/sha1/sha1.odin +++ b/core/crypto/legacy/sha1/sha1.odin @@ -19,6 +19,7 @@ package sha1 zhibog, dotbmp: Initial implementation. */ +import "base:intrinsics" import "core:crypto" import "core:encoding/endian" import "core:math/bits" @@ -107,7 +108,7 @@ final :: proc(ctx: ^Context, hash: []byte, finalize_clone: bool = false) { i += 1 } transform(ctx, ctx.data[:]) - crypto.set(&ctx.data, 0, 56) + intrinsics.mem_zero(&ctx.data, 56) } ctx.bitlen += u64(ctx.datalen * 8) diff --git a/tests/benchmark/crypto/benchmark_ecc.odin b/tests/benchmark/crypto/benchmark_ecc.odin index c1809c6ba..95db33ab3 100644 --- a/tests/benchmark/crypto/benchmark_ecc.odin +++ b/tests/benchmark/crypto/benchmark_ecc.odin @@ -2,6 +2,7 @@ package benchmark_core_crypto import "base:runtime" import "core:encoding/hex" +import "core:mem" import "core:log" import "core:testing" import "core:text/table" @@ -161,7 +162,7 @@ bench_ed25519 :: proc() -> (sk, sig, verif: time.Duration) { @(private="file") bench_ecdsa :: proc(curve: ecdsa.Curve, hash: hash.Algorithm) -> (sk, sig, verif: time.Duration) { priv_bytes := make([]byte, ecdsa.PRIVATE_KEY_SIZES[curve], context.temp_allocator) - crypto.set(raw_data(priv_bytes), 0x69, len(priv_bytes)) + mem.set(raw_data(priv_bytes), 0x69, len(priv_bytes)) priv_key: ecdsa.Private_Key start := time.tick_now() for _ in 0 ..< DSA_ITERS { From a3d7300e5539779be0e5e29c35b4395af5f8a5b1 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Fri, 1 May 2026 23:48:54 +0900 Subject: [PATCH 023/228] core/crypto/ecdh,ecdsa: Add `require_results` annotations --- core/crypto/ecdh/ecdh.odin | 8 ++++++++ core/crypto/ecdsa/ecdsa.odin | 5 +++++ core/crypto/noise/protocol.odin | 13 ++++++++++--- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/core/crypto/ecdh/ecdh.odin b/core/crypto/ecdh/ecdh.odin index f5106d152..d31a69aa8 100644 --- a/core/crypto/ecdh/ecdh.odin +++ b/core/crypto/ecdh/ecdh.odin @@ -106,6 +106,7 @@ Public_Key :: struct { // private_key_generate uses the system entropy source to generate a new // Private_Key. This will only fail if and only if (⟺) the system entropy source is // missing or broken. +@(require_results) private_key_generate :: proc(priv_key: ^Private_Key, curve: Curve) -> bool { private_key_clear(priv_key) @@ -143,6 +144,7 @@ private_key_generate :: proc(priv_key: ^Private_Key, curve: Curve) -> bool { // private_key_set_bytes decodes a byte-encoded private key, and returns // true if and only if (⟺) the operation was successful. +@(require_results) private_key_set_bytes :: proc(priv_key: ^Private_Key, curve: Curve, b: []byte) -> bool { private_key_clear(priv_key) @@ -281,6 +283,7 @@ private_key_bytes :: proc(priv_key: ^Private_Key, dst: []byte) { // private_key_equal returns true if and only if (⟺) the private keys are equal, // in constant time. +@(require_results) private_key_equal :: proc(p, q: ^Private_Key) -> bool { if p._curve != q._curve { return false @@ -311,6 +314,7 @@ private_key_clear :: proc "contextless" (priv_key: ^Private_Key) { // public_key_set_bytes decodes a byte-encoded public key, and returns // true if and only if (⟺) the operation was successful. +@(require_results) public_key_set_bytes :: proc(pub_key: ^Public_Key, curve: Curve, b: []byte) -> bool { public_key_clear(pub_key) @@ -411,6 +415,7 @@ public_key_bytes :: proc(pub_key: ^Public_Key, dst: []byte) { // public_key_equal returns true if and only if (⟺) the public keys are equal, // in constant time. +@(require_results) public_key_equal :: proc(p, q: ^Public_Key) -> bool { if p._curve != q._curve { return false @@ -479,11 +484,13 @@ ecdh :: proc(priv_key: ^Private_Key, pub_key: ^Public_Key, dst: []byte) -> bool } // curve returns the Curve used by a Private_Key or Public_Key instance. +@(require_results) curve :: proc(k: ^$T) -> Curve where(T == Private_Key || T == Public_Key) { return k._curve } // key_size returns the key size of a Private_Key or Public_Key in bytes. +@(require_results) key_size :: proc(k: ^$T) -> int where(T == Private_Key || T == Public_Key) { when T == Private_Key { return PRIVATE_KEY_SIZES[k._curve] @@ -494,6 +501,7 @@ key_size :: proc(k: ^$T) -> int where(T == Private_Key || T == Public_Key) { // shared_secret_size returns the shared secret size of a key exchange // in bytes. +@(require_results) shared_secret_size :: proc(k: ^$T) -> int where(T == Private_Key || T == Public_Key) { return SHARED_SECRET_SIZES[k._curve] } diff --git a/core/crypto/ecdsa/ecdsa.odin b/core/crypto/ecdsa/ecdsa.odin index 350bab3ec..8bb1748cf 100644 --- a/core/crypto/ecdsa/ecdsa.odin +++ b/core/crypto/ecdsa/ecdsa.odin @@ -81,6 +81,7 @@ Public_Key :: struct { // private_key_generate uses the system entropy source to generate a new // Private_Key. This will only fail if and only if (⟺) the system entropy source is // missing or broken. +@(require_results) private_key_generate :: proc(priv_key: ^Private_Key, curve: Curve) -> bool { private_key_clear(priv_key) @@ -112,6 +113,7 @@ private_key_generate :: proc(priv_key: ^Private_Key, curve: Curve) -> bool { // private_key_set_bytes decodes a byte-encoded private key, and returns // true if and only if (⟺) the operation was successful. +@(require_results) private_key_set_bytes :: proc(priv_key: ^Private_Key, curve: Curve, b: []byte) -> bool { private_key_clear(priv_key) @@ -222,6 +224,7 @@ private_key_set :: proc(priv_key, src: ^Private_Key) { // private_key_equal returns true if and only if (⟺) the private keys are equal, // in constant time. +@(require_results) private_key_equal :: proc(p, q: ^Private_Key) -> bool { if p._curve != q._curve { return false @@ -246,6 +249,7 @@ private_key_clear :: proc "contextless" (priv_key: ^Private_Key) { // public_key_set_bytes decodes a byte-encoded public key, and returns // true if and only if (⟺) the operation was successful. +@(require_results) public_key_set_bytes :: proc(pub_key: ^Public_Key, curve: Curve, b: []byte) -> bool { public_key_clear(pub_key) @@ -334,6 +338,7 @@ public_key_bytes :: proc(pub_key: ^Public_Key, dst: []byte) { // public_key_equal returns true if and only if (⟺) the public keys are equal, // in constant time. +@(require_results) public_key_equal :: proc(p, q: ^Public_Key) -> bool { if p._curve != q._curve { return false diff --git a/core/crypto/noise/protocol.odin b/core/crypto/noise/protocol.odin index 883376a42..29482bd36 100644 --- a/core/crypto/noise/protocol.odin +++ b/core/crypto/noise/protocol.odin @@ -58,7 +58,9 @@ generate_keypair :: proc(protocol: ^Protocol, private_key: ^ecdh.Private_Key) { case: panic("crypto/noise: unsupported DH curve in protocol") } - ecdh.private_key_generate(private_key, protocol.dh) + if !ecdh.private_key_generate(private_key, protocol.dh) { + panic("crypto/noise: entropy source unavailable") + } } // Performs a Diffie-Hellman calculation between the private key in key_pair @@ -837,7 +839,9 @@ handshakestate_read_message :: proc(self: ^Handshake_State, message, dst: []byte panic("crypto/noise: re was not empty when processing token 'e' during ReadMessage") } - ecdh.public_key_set_bytes(&self.re, protocol.dh, re) + if !ecdh.public_key_set_bytes(&self.re, protocol.dh, re) { + return nil, .Invalid_Handshake_Message + } symmetricstate_mix_hash(&self.symmetric_state, re) if self.message_pattern.is_psk { symmetricstate_mix_key(&self.symmetric_state, re) @@ -864,7 +868,10 @@ handshakestate_read_message :: proc(self: ^Handshake_State, message, dst: []byte panic("crypto/noise: rs was not empty when processing token 's' during ReadMessage") } - ecdh.public_key_set_bytes(&self.rs, protocol.dh, rs) + if !ecdh.public_key_set_bytes(&self.rs, protocol.dh, rs) { + self.status = .Handshake_Failed + return nil, .Invalid_Handshake_Message + } msg = msg[rs_len:] case .ee: From 8f1067f29094b3427eed66993b3cf65a8ee612fa Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Sat, 2 May 2026 14:47:57 +0900 Subject: [PATCH 024/228] tests/core/crypto/wycheproof: Break up into separate files --- tests/core/crypto/wycheproof/aead.odin | 514 +++++++++ tests/core/crypto/wycheproof/ecc.odin | 427 ++++++++ tests/core/crypto/wycheproof/kdf.odin | 238 +++++ tests/core/crypto/wycheproof/mac.odin | 156 +++ tests/core/crypto/wycheproof/main.odin | 1328 ------------------------ 5 files changed, 1335 insertions(+), 1328 deletions(-) create mode 100644 tests/core/crypto/wycheproof/aead.odin create mode 100644 tests/core/crypto/wycheproof/ecc.odin create mode 100644 tests/core/crypto/wycheproof/kdf.odin create mode 100644 tests/core/crypto/wycheproof/mac.odin diff --git a/tests/core/crypto/wycheproof/aead.odin b/tests/core/crypto/wycheproof/aead.odin new file mode 100644 index 000000000..6c2b61d72 --- /dev/null +++ b/tests/core/crypto/wycheproof/aead.odin @@ -0,0 +1,514 @@ +package test_wycheproof + +import "core:encoding/hex" +import "core:log" +import "core:mem" +import "core:os" +import "core:slice" +import "core:testing" + +import chacha_simd128 "core:crypto/_chacha20/simd128" +import chacha_simd256 "core:crypto/_chacha20/simd256" +import "core:crypto/aegis" +import "core:crypto/aes" +import "core:crypto/chacha20" +import "core:crypto/chacha20poly1305" + +import "../common" + +supported_aegis_impls :: proc() -> [dynamic]aes.Implementation { + impls := make([dynamic]aes.Implementation, 0, 2, context.temp_allocator) + append(&impls, aes.Implementation.Portable) + if aegis.is_hardware_accelerated() { + append(&impls, aes.Implementation.Hardware) + } + + return impls +} + +@(test) +test_aead_aegis :: proc(t: ^testing.T) { + arena: mem.Arena + arena_backing := make([]byte, ARENA_SIZE) + defer delete(arena_backing) + mem.arena_init(&arena, arena_backing) + context.allocator = mem.arena_allocator(&arena) + + files := []string { + "aegis128L_test.json", + "aegis256_test.json", + } + + log.debug("aead/aegis: starting") + + for f in files { + mem.free_all() // Probably don't need this, but be safe. + + fn, _ := os.join_path([]string{BASE_PATH, f}, context.allocator) + + test_vectors: Test_Vectors(Aead_Test_Group) + if !testing.expectf(t, load(&test_vectors, fn), "Unable to load {}", f) { + continue + } + + for impl in supported_aegis_impls() { + testing.expectf(t, test_aead_aegis_impl(&test_vectors, impl), "impl {} failed", impl) + } + } +} + +test_aead_aegis_impl :: proc( + test_vectors: ^Test_Vectors(Aead_Test_Group), + impl: aes.Implementation, +) -> bool { + log.debug("aead/aegis/%v: starting", impl) + + num_ran, num_passed, num_failed, num_skipped: int + for &test_group in test_vectors.test_groups { + for &test_vector in test_group.tests { + num_ran += 1 + + if comment := test_vector.comment; comment != "" { + log.debugf( + "aead/aegis/%v/%d: %s: %+v", + impl, + test_vector.tc_id, + comment, + test_vector.flags, + ) + } else { + log.debugf("aead/aegis/%v/%d: %+v", + impl, + test_vector.tc_id, + test_vector.flags, + ) + } + + key := common.hexbytes_decode(test_vector.key) + iv := common.hexbytes_decode(test_vector.iv) + aad := common.hexbytes_decode(test_vector.aad) + msg := common.hexbytes_decode(test_vector.msg) + ct := common.hexbytes_decode(test_vector.ct) + tag := common.hexbytes_decode(test_vector.tag) + + if len(iv) == 0 { + log.infof( + "aead/aegis/%v/%d: skipped, invalid IVs panic", + impl, + test_vector.tc_id, + ) + num_skipped += 1 + continue + } + + ctx: aegis.Context + aegis.init(&ctx, key, impl) + + if result_is_valid(test_vector.result) { + ct_ := make([]byte, len(ct)) + tag_ := make([]byte, len(tag)) + aegis.seal(&ctx, ct_, tag_, iv, aad, msg) + + ok := common.hexbytes_compare(test_vector.ct, ct_) + if !result_check(test_vector.result, ok) { + x := transmute(string)(hex.encode(ct_)) + log.errorf( + "aead/aegis/%v/%d: ciphertext: expected %s actual %s", + impl, + test_vector.tc_id, + test_vector.ct, + x, + ) + num_failed += 1 + continue + } + + ok = common.hexbytes_compare(test_vector.tag, tag_) + if !result_check(test_vector.result, ok) { + x := transmute(string)(hex.encode(tag_)) + log.errorf( + "aead/aegis/%v/%d: tag: expected %s actual %s", + impl, + test_vector.tc_id, + test_vector.tag, + x, + ) + num_failed += 1 + continue + } + } + + msg_ := make([]byte, len(msg)) + ok := aegis.open(&ctx, msg_, iv, aad, ct, tag) + if !result_check(test_vector.result, ok) { + log.errorf("aead/aegis/%v/%d: decrypt failed", impl, test_vector.tc_id) + num_failed += 1 + continue + } + + if ok && !common.hexbytes_compare(test_vector.msg, msg_) { + x := transmute(string)(hex.encode(msg_)) + log.errorf( + "aead/aegis/%v/%d: decrypt msg: expected %s actual %s", + impl, + test_vector.tc_id, + test_vector.msg, + x, + ) + num_failed += 1 + continue + } + + num_passed += 1 + } + } + + assert(num_ran == test_vectors.number_of_tests) + assert(num_passed + num_failed + num_skipped == num_ran) + + log.infof( + "aead/aegis: ran %d, passed %d, failed %d, skipped %d", + num_ran, + num_passed, + num_failed, + num_skipped, + ) + + return num_failed == 0 +} + +supported_aes_impls :: proc() -> [dynamic]aes.Implementation { + impls := make([dynamic]aes.Implementation, 0, 2) + append(&impls, aes.Implementation.Portable) + if aes.is_hardware_accelerated() { + append(&impls, aes.Implementation.Hardware) + } + + return impls +} + +@(test) +test_aead_aes_gcm :: proc(t: ^testing.T) { + arena: mem.Arena + arena_backing := make([]byte, ARENA_SIZE) + defer delete(arena_backing) + mem.arena_init(&arena, arena_backing) + context.allocator = mem.arena_allocator(&arena) + + fn, _ := os.join_path([]string{BASE_PATH, "aes_gcm_test.json"}, context.allocator) + + log.debug("aead/aes-gcm: starting") + + test_vectors: Test_Vectors(Aead_Test_Group) + if !testing.expectf(t, load(&test_vectors, fn), "Unable to load {}", fn) { + return + } + + for impl in supported_aes_impls() { + testing.expectf(t, test_aead_aes_gcm_impl(&test_vectors, impl), "impl {} failed", impl) + } +} + +test_aead_aes_gcm_impl :: proc( + test_vectors: ^Test_Vectors(Aead_Test_Group), + impl: aes.Implementation, +) -> bool { + log.debug("aead/aes-gcm/%v: starting", impl) + + num_ran, num_passed, num_failed, num_skipped: int + for &test_group in test_vectors.test_groups { + for &test_vector in test_group.tests { + num_ran += 1 + + if comment := test_vector.comment; comment != "" { + log.debugf( + "aead/aes-gcm/%v/%d: %s: %+v", + impl, + test_vector.tc_id, + comment, + test_vector.flags, + ) + } else { + log.debugf("aead/aes-gcm/%v/%d: %+v", + impl, + test_vector.tc_id, + test_vector.flags, + ) + } + + key := common.hexbytes_decode(test_vector.key) + iv := common.hexbytes_decode(test_vector.iv) + aad := common.hexbytes_decode(test_vector.aad) + msg := common.hexbytes_decode(test_vector.msg) + ct := common.hexbytes_decode(test_vector.ct) + tag := common.hexbytes_decode(test_vector.tag) + + if len(iv) == 0 { + log.infof( + "aead/aes-gcm/%v/%d: skipped, invalid IVs panic", + impl, + test_vector.tc_id, + ) + num_skipped += 1 + continue + } + + ctx: aes.Context_GCM + aes.init_gcm(&ctx, key, impl) + + if result_is_valid(test_vector.result) { + ct_ := make([]byte, len(ct)) + tag_ := make([]byte, len(tag)) + aes.seal_gcm(&ctx, ct_, tag_, iv, aad, msg) + + ok := common.hexbytes_compare(test_vector.ct, ct_) + if !result_check(test_vector.result, ok) { + x := transmute(string)(hex.encode(ct_)) + log.errorf( + "aead/aes-gcm/%v/%d: ciphertext: expected %s actual %s", + impl, + test_vector.tc_id, + test_vector.ct, + x, + ) + num_failed += 1 + continue + } + + ok = common.hexbytes_compare(test_vector.tag, tag_) + if !result_check(test_vector.result, ok) { + x := transmute(string)(hex.encode(tag_)) + log.errorf( + "aead/aes-gcm/%v/%d: tag: expected %s actual %s", + impl, + test_vector.tc_id, + test_vector.tag, + x, + ) + num_failed += 1 + continue + } + } + + msg_ := make([]byte, len(msg)) + ok := aes.open_gcm(&ctx, msg_, iv, aad, ct, tag) + if !result_check(test_vector.result, ok) { + log.errorf("aead/aes-gcm/%v/%d: decrypt failed", impl, test_vector.tc_id) + num_failed += 1 + continue + } + + if ok && !common.hexbytes_compare(test_vector.msg, msg_) { + x := transmute(string)(hex.encode(msg_)) + log.errorf( + "aead/aes-gcm/%v/%d: decrypt msg: expected %s actual %s", + impl, + test_vector.tc_id, + test_vector.msg, + x, + ) + num_failed += 1 + continue + } + + num_passed += 1 + } + } + + assert(num_ran == test_vectors.number_of_tests) + assert(num_passed + num_failed + num_skipped == num_ran) + + log.infof( + "aead/aes-gcm: ran %d, passed %d, failed %d, skipped %d", + num_ran, + num_passed, + num_failed, + num_skipped, + ) + + return num_failed == 0 +} + +supported_chacha_impls :: proc() -> [dynamic]chacha20.Implementation { + impls := make([dynamic]chacha20.Implementation, 0, 3) + append(&impls, chacha20.Implementation.Portable) + if chacha_simd128.is_performant() { + append(&impls, chacha20.Implementation.Simd128) + } + if chacha_simd256.is_performant() { + append(&impls, chacha20.Implementation.Simd256) + } + + return impls +} + +@(test) +test_aead_chacha20_poly1305 :: proc(t: ^testing.T) { + arena: mem.Arena + arena_backing := make([]byte, ARENA_SIZE) + defer delete(arena_backing) + mem.arena_init(&arena, arena_backing) + context.allocator = mem.arena_allocator(&arena) + + files := []string { + "chacha20_poly1305_test.json", + "xchacha20_poly1305_test.json", + } + + log.debug("aead/(x)chacha20poly1305: starting") + + for f, i in files { + mem.free_all() // Probably don't need this, but be safe. + + fn, _ := os.join_path([]string{BASE_PATH, f}, context.allocator) + + test_vectors: Test_Vectors(Aead_Test_Group) + if !testing.expectf(t, load(&test_vectors, fn), "Unable to load {}", f) { + continue + } + + for impl in supported_chacha_impls() { + testing.expectf(t, test_aead_chacha20_poly1305_impl(&test_vectors, i == 1, impl), "impl {} failed", impl) + } + } +} + +test_aead_chacha20_poly1305_impl :: proc( + test_vectors: ^Test_Vectors(Aead_Test_Group), + is_xchacha: bool, + impl: chacha20.Implementation, +) -> bool { + FLAG_INVALID_NONCE_SIZE :: "InvalidNonceSize" + + alg_str := is_xchacha ? "xchacha20poly1305" : "chacha20poly1305" + + num_ran, num_passed, num_failed, num_skipped: int + for &test_group in test_vectors.test_groups { + for &test_vector in test_group.tests { + num_ran += 1 + + if comment := test_vector.comment; comment != "" { + log.debugf( + "aead/%s/%v/%d: %s: %+v", + alg_str, + impl, + test_vector.tc_id, + comment, + test_vector.flags, + ) + } else { + log.debugf("aead/%s/%v/%d: %+v", + alg_str, + impl, + test_vector.tc_id, + test_vector.flags, + ) + } + + key := common.hexbytes_decode(test_vector.key) + iv := common.hexbytes_decode(test_vector.iv) + aad := common.hexbytes_decode(test_vector.aad) + msg := common.hexbytes_decode(test_vector.msg) + ct := common.hexbytes_decode(test_vector.ct) + tag := common.hexbytes_decode(test_vector.tag) + + if slice.contains(test_vector.flags, FLAG_INVALID_NONCE_SIZE) { + log.infof( + "aead/%s/%v/%d: skipped, invalid nonces panic", + alg_str, + impl, + test_vector.tc_id, + ) + num_skipped += 1 + continue + } + + ctx: chacha20poly1305.Context + switch is_xchacha { + case true: + chacha20poly1305.init_xchacha(&ctx, key, impl) + case false: + chacha20poly1305.init(&ctx, key, impl) + } + + if result_is_valid(test_vector.result) { + ct_ := make([]byte, len(ct)) + tag_ := make([]byte, len(tag)) + chacha20poly1305.seal(&ctx, ct_, tag_, iv, aad, msg) + + ok := common.hexbytes_compare(test_vector.ct, ct_) + if !result_check(test_vector.result, ok) { + x := transmute(string)(hex.encode(ct_)) + log.errorf( + "aead/%s/%v/%d: ciphertext: expected %s actual %s", + alg_str, + impl, + test_vector.tc_id, + test_vector.ct, + x, + ) + num_failed += 1 + continue + } + + ok = common.hexbytes_compare(test_vector.tag, tag_) + if !result_check(test_vector.result, ok) { + x := transmute(string)(hex.encode(tag_)) + log.errorf( + "aead/%s/%v/%d: tag: expected %s actual %s", + alg_str, + impl, + test_vector.tc_id, + test_vector.tag, + x, + ) + num_failed += 1 + continue + } + } + + msg_ := make([]byte, len(msg)) + ok := chacha20poly1305.open(&ctx, msg_, iv, aad, ct, tag) + if !result_check(test_vector.result, ok) { + log.errorf("aead/%s/%v/%d: decrypt failed", + alg_str, + impl, + test_vector.tc_id, + ) + num_failed += 1 + continue + } + + if ok && !common.hexbytes_compare(test_vector.msg, msg_) { + x := transmute(string)(hex.encode(msg_)) + log.errorf( + "aead/%s/%v/%d: decrypt msg: expected %s actual %s", + alg_str, + impl, + test_vector.tc_id, + test_vector.msg, + x, + ) + num_failed += 1 + continue + } + + num_passed += 1 + } + } + + assert(num_ran == test_vectors.number_of_tests) + assert(num_passed + num_failed + num_skipped == num_ran) + + log.infof( + "aead/%s/%v: ran %d, passed %d, failed %d, skipped %d", + alg_str, + impl, + num_ran, + num_passed, + num_failed, + num_skipped, + ) + + return num_failed == 0 +} diff --git a/tests/core/crypto/wycheproof/ecc.odin b/tests/core/crypto/wycheproof/ecc.odin new file mode 100644 index 000000000..53b63cc08 --- /dev/null +++ b/tests/core/crypto/wycheproof/ecc.odin @@ -0,0 +1,427 @@ +package test_wycheproof + +import "core:encoding/hex" +import "core:log" +import "core:mem" +import "core:os" +import "core:slice" +import "core:strings" +import "core:testing" + +import "core:crypto/hash" +import "core:crypto/ecdh" +import "core:crypto/ecdsa" +import "core:crypto/ed25519" + +import "../common" + +@(test) +test_eddsa_ed25519 :: proc(t: ^testing.T) { + arena: mem.Arena + arena_backing := make([]byte, ARENA_SIZE) + defer delete(arena_backing) + mem.arena_init(&arena, arena_backing) + context.allocator = mem.arena_allocator(&arena) + + fn, _ := os.join_path([]string{BASE_PATH, "ed25519_test.json"}, context.allocator) + + log.debug("eddsa/ed25519: starting") + + test_vectors: Test_Vectors(Eddsa_Test_Group) + if !testing.expectf(t, load(&test_vectors, fn), "Unable to load {}", fn) { + return + } + + num_ran, num_passed, num_failed, num_skipped: int + for &test_group, i in test_vectors.test_groups { + mem.free_all() // Probably don't need this, but be safe. + pk_bytes := common.hexbytes_decode(test_group.public_key.pk) + + pk: ed25519.Public_Key + pk_ok := ed25519.public_key_set_bytes(&pk, pk_bytes) + if !testing.expectf(t, pk_ok, "eddsa/ed25519/%d: invalid public key: %s", i, test_group.public_key.pk) { + num_failed += len(test_group.tests) + continue + } + + for &test_vector in test_group.tests { + num_ran += 1 + + if comment := test_vector.comment; comment != "" { + log.debugf( + "eddsa/ed25519/%d: %s: %+v", + test_vector.tc_id, + comment, + test_vector.flags, + ) + } else { + log.debugf("eddsa/ed25519/%d: %+v", test_vector.tc_id, test_vector.flags) + } + + msg := common.hexbytes_decode(test_vector.msg) + sig := common.hexbytes_decode(test_vector.sig) + + verify_ok := ed25519.verify(&pk, msg, sig) + if !testing.expectf( + t, + result_check(test_vector.result, verify_ok), + "eddsa/ed25519/%d: verify failed: expected %s actual %v", + test_vector.tc_id, + test_vector.result, + verify_ok, + ) { + num_failed += 1 + continue + } + num_passed += 1 + } + } + + assert(num_ran == test_vectors.number_of_tests) + assert(num_passed + num_failed + num_skipped == num_ran) + + log.infof( + "eddsa/ed25519: ran %d, passed %d, failed %d, skipped %d", + num_ran, + num_passed, + num_failed, + num_skipped, + ) +} + +@(test) +test_ecdsa :: proc(t: ^testing.T) { + arena: mem.Arena + arena_backing := make([]byte, ARENA_SIZE) + defer delete(arena_backing) + mem.arena_init(&arena, arena_backing) + context.allocator = mem.arena_allocator(&arena) + + log.debug("ecdsa: starting") + + files := []string { + "ecdsa_secp256r1_sha256_test.json", + "ecdsa_secp256r1_sha512_test.json", + "ecdsa_secp384r1_sha384_test.json", + } + + for f in files { + mem.free_all() // Probably don't need this, but be safe. + + fn, _ := os.join_path([]string{BASE_PATH, f}, context.allocator) + + test_vectors: Test_Vectors(Ecdsa_Test_Group) + if !testing.expectf(t, load(&test_vectors, fn), "Unable to load {}", f) { + continue + } + + testing.expectf(t, test_ecdsa_impl(t, &test_vectors), "ecdsa failed") + } +} + +test_ecdsa_impl :: proc(t: ^testing.T, test_vectors: ^Test_Vectors(Ecdsa_Test_Group)) -> bool { + curve_str := test_vectors.test_groups[0].public_key.curve + hash_str := test_vectors.test_groups[0].sha + + curve_alg: ecdsa.Curve + switch curve_str { + case "secp256r1": + curve_alg = .SECP256R1 + case "secp384r1": + curve_alg = .SECP384R1 + case: + log.errorf("ecdsa: unsupported curve: %s", curve_str) + } + + hash_alg: hash.Algorithm + switch hash_str { + case "SHA-256": + hash_alg = .SHA256 + case "SHA-384": + hash_alg = .SHA384 + case "SHA-512": + hash_alg = .SHA512 + case: + log.errorf("ecdsa: unsupported hash: %s", hash_str) + } + + log.debugf("ecdsa/%s/%s: starting", curve_str, hash_str) + + num_ran, num_passed, num_failed, num_skipped: int + for &test_group, i in test_vectors.test_groups { + pk_bytes := common.hexbytes_decode(test_group.public_key.uncompressed) + + pk: ecdsa.Public_Key + pk_ok := ecdsa.public_key_set_bytes(&pk, curve_alg, pk_bytes) + if !testing.expectf(t, pk_ok, "ecdsa/%s/%s/%d: invalid public key: %s", curve_str, hash_str, i, test_group.public_key.uncompressed) { + num_failed += len(test_group.tests) + continue + } + + for &test_vector in test_group.tests { + num_ran += 1 + + if comment := test_vector.comment; comment != "" { + log.debugf( + "ecda/%s/%s/%d: %s: %+v", + curve_str, + hash_str, + test_vector.tc_id, + comment, + test_vector.flags, + ) + } else { + log.debugf("ecdsa/%s/%s/%d: %+v", curve_str, hash_str, test_vector.tc_id, test_vector.flags) + } + + msg := common.hexbytes_decode(test_vector.msg) + sig := common.hexbytes_decode(test_vector.sig) + + verify_ok := ecdsa.verify_asn1(&pk, hash_alg, msg, sig) + if !testing.expectf( + t, + result_check(test_vector.result, verify_ok), + "ecdsa/%s/%s/%d: verify failed: expected %s actual %v", + curve_str, + hash_str, + test_vector.tc_id, + test_vector.result, + verify_ok, + ) { + num_failed += 1 + continue + } + + num_passed += 1 + } + } + + assert(num_ran == test_vectors.number_of_tests) + assert(num_passed + num_failed + num_skipped == num_ran) + + log.infof( + "ecdsa/%s/%s: ran %d, passed %d, failed %d, skipped %d", + curve_str, + hash_str, + num_ran, + num_passed, + num_failed, + num_skipped, + ) + + return num_failed == 0 +} + +@(test) +test_ecdh :: proc(t: ^testing.T) { + arena: mem.Arena + arena_backing := make([]byte, ARENA_SIZE) + defer delete(arena_backing) + mem.arena_init(&arena, arena_backing) + context.allocator = mem.arena_allocator(&arena) + + PREFIX_TEST_ECDH :: "ecdh_" + SUFFIX_TEST_ECPOINT :: "_ecpoint" + + files := []string { + "ecdh_secp256r1_ecpoint_test.json", + "ecdh_secp384r1_ecpoint_test.json", + "x25519_test.json", + "x448_test.json", + } + + log.debug("ecdh: starting") + + for f in files { + mem.free_all() // Probably don't need this, but be safe. + + fn, _ := os.join_path([]string{BASE_PATH, f}, context.allocator) + + test_vectors: Test_Vectors(Ecdh_Test_Group) + if !testing.expectf(t, load(&test_vectors, fn), "Unable to load {}", f) { + continue + } + + alg_str := strings.trim_suffix(f, SUFFIX_TEST_JSON) + alg_str = strings.trim_suffix(alg_str, SUFFIX_TEST_ECPOINT) + alg_str = strings.trim_prefix(alg_str, PREFIX_TEST_ECDH) + testing.expectf(t, test_ecdh_impl(&test_vectors, alg_str), "alg {} failed", alg_str) + } +} + +test_ecdh_impl :: proc( + test_vectors: ^Test_Vectors(Ecdh_Test_Group), + alg_str: string, +) -> bool { + ALG_P256 :: "secp256r1" + ALG_P384 :: "secp384r1" + ALG_X25519 :: "x25519" + ALG_X448 :: "x448" + + // XDH exceptions + FLAG_PUBLIC_KEY_TOO_LONG :: "PublicKeyTooLong" + FLAG_ZERO_SHARED_SECRET :: "ZeroSharedSecret" + + // ECDH exceptions + FLAG_COMPRESSED_POINT :: "CompressedPoint" + FLAG_INVALID_CURVE :: "InvalidCurveAttack" + FLAG_INVALID_ENCODING :: "InvalidEncoding" + + log.debugf("ecdh/%s: starting", alg_str) + + num_ran, num_passed, num_failed, num_skipped: int + for &test_group in test_vectors.test_groups { + for &test_vector in test_group.tests { + num_ran += 1 + + if comment := test_vector.comment; comment != "" { + log.debugf("ecdh/%s/%d: %s: %+v", alg_str, test_vector.tc_id, comment, test_vector.flags) + } else { + log.debugf("ecdh/%s/%d: %+v", alg_str, test_vector.tc_id, test_vector.flags) + } + + raw_pub := common.hexbytes_decode(test_vector.public) + raw_priv := common.hexbytes_decode(test_vector.private) + + curve: ecdh.Curve + priv_key: ecdh.Private_Key + pub_key: ecdh.Public_Key + + is_nist, is_xdh: bool + switch alg_str { + case ALG_P256: + curve = .SECP256R1 + // Ugh, ASN.1 :( + l := len(raw_priv) + if l == 33 { + if raw_priv[0] == 0 { + raw_priv = raw_priv[1:] + } + } else if l < 32 { + // left-pad.odin + tmp := make([]byte, 32) + copy(tmp[32-l:], raw_priv) + raw_priv = tmp + } + is_nist = true + case ALG_P384: + curve = .SECP384R1 + // Ugh, ASN.1 :( + l := len(raw_priv) + if l == 49 { + if raw_priv[0] == 0 { + raw_priv = raw_priv[1:] + } + } else if l < 48 { + // left-pad.odin + tmp := make([]byte, 48) + copy(tmp[48-l:], raw_priv) + raw_priv = tmp + } + is_nist = true + case ALG_X25519: + curve = .X25519 + is_xdh = true + case ALG_X448: + curve = .X448 + is_xdh = true + case: + log.errorf("ecdh: unsupported algorithm: %s", alg_str) + return false + } + + if ok := ecdh.private_key_set_bytes(&priv_key, curve, raw_priv); !ok { + log.errorf( + "ecdh/%s/%d: failed to deserialize private_key: %s %d %x", + alg_str, + test_vector.tc_id, + test_vector.private, + len(raw_priv), + raw_priv, + ) + num_failed += 1 + continue + } + + if ok := ecdh.public_key_set_bytes(&pub_key, curve, raw_pub); !ok { + if is_nist { + if slice.contains(test_vector.flags, FLAG_COMPRESSED_POINT) { + num_passed += 1 + continue + } + if slice.contains(test_vector.flags, FLAG_INVALID_CURVE) { + num_passed += 1 + continue + } + if slice.contains(test_vector.flags, FLAG_INVALID_ENCODING) { + num_passed += 1 + continue + } + } + if slice.contains(test_vector.flags, FLAG_PUBLIC_KEY_TOO_LONG) { + num_passed += 1 + continue + } + + log.errorf( + "ecdh/%s/%d: failed to deserialize public_key: %s", + alg_str, + test_vector.tc_id, + test_vector.public, + ) + num_failed += 1 + continue + } + + shared := make([]byte, ecdh.SHARED_SECRET_SIZES[curve]) + + ok := ecdh.ecdh(&priv_key, &pub_key, shared) + if !ok { + if is_xdh && slice.contains(test_vector.flags, FLAG_ZERO_SHARED_SECRET) { + num_passed += 1 + continue + } + // unused: x := transmute(string)(hex.encode(shared)) + log.errorf( + "ecdh/%s/%d: ecdh failed", + alg_str, + test_vector.tc_id, + ) + num_failed += 1 + continue + } + + ok = common.hexbytes_compare(test_vector.shared, shared) + // "acceptable" results are fine from here because we have + // checked for the all-zero shared secret XDH case already. + if !result_check(test_vector.result, ok, false) { + x := transmute(string)(hex.encode(shared)) + log.errorf( + "ecdh/%s/%d: shared: expected %s actual %s", + alg_str, + test_vector.tc_id, + test_vector.shared, + x, + ) + num_failed += 1 + continue + } + + num_passed += 1 + } + } + + assert(num_ran == test_vectors.number_of_tests) + assert(num_passed + num_failed + num_skipped == num_ran) + + log.infof( + "ecdh/%s: ran %d, passed %d, failed %d, skipped %d", + alg_str, + num_ran, + num_passed, + num_failed, + num_skipped, + ) + + return num_failed == 0 +} diff --git a/tests/core/crypto/wycheproof/kdf.odin b/tests/core/crypto/wycheproof/kdf.odin new file mode 100644 index 000000000..5b5ea1f2d --- /dev/null +++ b/tests/core/crypto/wycheproof/kdf.odin @@ -0,0 +1,238 @@ +package test_wycheproof + +import "core:encoding/hex" +import "core:log" +import "core:mem" +import "core:os" +import "core:slice" +import "core:strings" +import "core:testing" + +import "core:crypto/hkdf" +import "core:crypto/pbkdf2" + +import "../common" + +@(test) +test_hkdf :: proc(t: ^testing.T) { + arena: mem.Arena + arena_backing := make([]byte, ARENA_SIZE) + defer delete(arena_backing) + mem.arena_init(&arena, arena_backing) + context.allocator = mem.arena_allocator(&arena) + + log.debug("hkdf: starting") + + files := []string { + "hkdf_sha1_test.json", + "hkdf_sha256_test.json", + "hkdf_sha384_test.json", + "hkdf_sha512_test.json", + } + + for f in files { + mem.free_all() // Probably don't need this, but be safe. + + fn, _ := os.join_path([]string{BASE_PATH, f}, context.allocator) + + test_vectors: Test_Vectors(Hkdf_Test_Group) + if !testing.expectf(t, load(&test_vectors, fn), "Unable to load {}", f) { + continue + } + + testing.expectf(t, test_hkdf_impl(&test_vectors), "hkdf failed") + } +} + +test_hkdf_impl :: proc(test_vectors: ^Test_Vectors(Hkdf_Test_Group)) -> bool { + PREFIX_HKDF :: "HKDF-" + FLAG_SIZE_TOO_LARGE :: "SizeTooLarge" + + alg_str := strings.trim_prefix(test_vectors.algorithm, PREFIX_HKDF) + alg, ok := hash_name_to_algorithm(alg_str) + if !ok { + return false + } + alg_str = strings.to_lower(alg_str) + + log.debugf("hkdf/%s: starting", alg_str) + + num_ran, num_passed, num_failed, num_skipped: int + for &test_group in test_vectors.test_groups { + for &test_vector in test_group.tests { + num_ran += 1 + + if comment := test_vector.comment; comment != "" { + log.debugf( + "hkdf/%s/%d: %s: %+v", + alg_str, + test_vector.tc_id, + comment, + test_vector.flags, + ) + } else { + log.debugf("hkdf/%s/%d: %+v", alg_str, test_vector.tc_id, test_vector.flags) + } + + ikm := common.hexbytes_decode(test_vector.ikm) + salt := common.hexbytes_decode(test_vector.salt) + info := common.hexbytes_decode(test_vector.info) + + if slice.contains(test_vector.flags, FLAG_SIZE_TOO_LARGE) { + log.infof( + "hkdf/%s/%d: skipped, oversized outputs panic", + alg_str, + test_vector.tc_id, + ) + num_skipped += 1 + continue + } + + okm_ := make([]byte, test_vector.size) + hkdf.extract_and_expand(alg, salt, ikm, info, okm_) + + ok = common.hexbytes_compare(test_vector.okm, okm_) + if !result_check(test_vector.result, ok) { + x := transmute(string)(hex.encode(okm_)) + log.errorf( + "hkdf/%s/%d: shared: expected %s actual %s", + alg_str, + test_vector.tc_id, + test_vector.okm, + x, + ) + num_failed += 1 + continue + } + + num_passed += 1 + } + } + + assert(num_ran == test_vectors.number_of_tests) + assert(num_passed + num_failed + num_skipped == num_ran) + + log.infof( + "hkdf/%s: ran %d, passed %d, failed %d, skipped %d", + alg_str, + num_ran, + num_passed, + num_failed, + num_skipped, + ) + + return num_failed == 0 +} + +@(test) +test_pbkdf2 :: proc(t: ^testing.T) { + arena: mem.Arena + arena_backing := make([]byte, ARENA_SIZE) + defer delete(arena_backing) + mem.arena_init(&arena, arena_backing) + context.allocator = mem.arena_allocator(&arena) + + log.debug("pbkdf2: starting") + + files := []string { + "pbkdf2_hmacsha1_test.json", + "pbkdf2_hmacsha224_test.json", + "pbkdf2_hmacsha256_test.json", + "pbkdf2_hmacsha384_test.json", + "pbkdf2_hmacsha512_test.json", + } + + for f in files { + mem.free_all() // Probably don't need this, but be safe. + + fn, _ := os.join_path([]string{BASE_PATH, f}, context.allocator) + + test_vectors: Test_Vectors(Pbkdf_Test_Group) + if !testing.expectf(t, load(&test_vectors, fn), "Unable to load {}", f) { + continue + } + + testing.expectf(t, test_pbkdf2_impl(&test_vectors), "pbkdf2 failed") + } +} + +test_pbkdf2_impl :: proc( + test_vectors: ^Test_Vectors(Pbkdf_Test_Group), +) -> bool { + PREFIX_PBKDF_HMAC :: "PBKDF2-HMAC" + FLAG_LARGE_ITERATION_COUNT :: "LargeIterationCount" + + alg_str := strings.trim_prefix(test_vectors.algorithm, PREFIX_PBKDF_HMAC) + alg, ok := hash_name_to_algorithm(alg_str) + if !ok { + return false + } + alg_str = strings.to_lower(alg_str) + + log.debugf("pbkdf2/hmac-%s: starting", alg_str) + + num_ran, num_passed, num_failed, num_skipped: int + for &test_group in test_vectors.test_groups { + for &test_vector in test_group.tests { + num_ran += 1 + + if comment := test_vector.comment; comment != "" { + log.debugf( + "pbkdf2/hmac-%s/%d: %s: %+v", + alg_str, + test_vector.tc_id, + comment, + test_vector.flags, + ) + } else { + log.debugf("pbkdf2/hmac-%s/%d: %+v", alg_str, test_vector.tc_id, test_vector.flags) + } + + if slice.contains(test_vector.flags, FLAG_LARGE_ITERATION_COUNT) { + log.infof( + "pbkdf2/hmac-%s/%d: skipped, takes fucking forever", + alg_str, + test_vector.tc_id, + ) + num_skipped += 1 + continue + } + + password := common.hexbytes_decode(test_vector.password) + salt := common.hexbytes_decode(test_vector.salt) + + dk_ := make([]byte, test_vector.dk_len) + pbkdf2.derive(alg, password, salt, test_vector.iteration_count, dk_) + + ok = common.hexbytes_compare(test_vector.dk, dk_) + if !result_check(test_vector.result, ok) { + x := transmute(string)(hex.encode(dk_)) + log.errorf( + "pbkdf2/hmac-%s/%d: shared: expected %s actual %s", + alg_str, + test_vector.tc_id, + test_vector.dk, + x, + ) + num_failed += 1 + continue + } + + num_passed += 1 + } + } + + assert(num_ran == test_vectors.number_of_tests) + assert(num_passed + num_failed + num_skipped == num_ran) + + log.infof( + "pbkdf2/%s: ran %d, passed %d, failed %d, skipped %d", + alg_str, + num_ran, + num_passed, + num_failed, + num_skipped, + ) + + return num_failed == 0 +} diff --git a/tests/core/crypto/wycheproof/mac.odin b/tests/core/crypto/wycheproof/mac.odin new file mode 100644 index 000000000..35dcc1fde --- /dev/null +++ b/tests/core/crypto/wycheproof/mac.odin @@ -0,0 +1,156 @@ +package test_wycheproof + +import "core:encoding/hex" + +import "core:log" +import "core:mem" +import "core:os" +import "core:testing" + +import "core:crypto/hmac" +import "core:crypto/kmac" +import "core:crypto/siphash" + +import "../common" + +@(test) +test_mac :: proc(t: ^testing.T) { + arena: mem.Arena + arena_backing := make([]byte, ARENA_SIZE) + defer delete(arena_backing) + mem.arena_init(&arena, arena_backing) + context.allocator = mem.arena_allocator(&arena) + + log.debug("mac: starting") + + files := []string { + "hmac_sha1_test.json", + "hmac_sha224_test.json", + "hmac_sha256_test.json", + "hmac_sha3_224_test.json", + "hmac_sha3_256_test.json", + "hmac_sha3_384_test.json", + "hmac_sha3_512_test.json", + "hmac_sha384_test.json", + // "hmac_sha512_224_test.json", + "hmac_sha512_256_test.json", + "hmac_sha512_test.json", + "hmac_sm3_test.json", + "kmac128_no_customization_test.json", + "kmac256_no_customization_test.json", + "siphash_1_3_test.json", + "siphash_2_4_test.json", + "siphash_4_8_test.json", + } + + for f in files { + mem.free_all() // Probably don't need this, but be safe. + + fn, _ := os.join_path([]string{BASE_PATH, f}, context.allocator) + + test_vectors: Test_Vectors(Mac_Test_Group) + if !testing.expectf(t, load(&test_vectors, fn), "Unable to load {}", f) { + continue + } + + testing.expectf(t, test_mac_impl(&test_vectors), "hkdf failed") + } +} + +test_mac_impl :: proc(test_vectors: ^Test_Vectors(Mac_Test_Group)) -> bool { + PREFIX_HMAC :: "HMAC" + PREFIX_KMAC :: "KMAC" + + mac_alg, hmac_alg, alg_str, ok := mac_algorithm(test_vectors.algorithm) + if !ok { + log.errorf("mac: unsupported algorith: %s", test_vectors.algorithm) + return false + } + + log.debugf("%s: starting", alg_str) + + num_ran, num_passed, num_failed, num_skipped: int + for &test_group in test_vectors.test_groups { + for &test_vector in test_group.tests { + num_ran += 1 + + if comment := test_vector.comment; comment != "" { + log.debugf( + "%s/%d: %s: %+v", + alg_str, + test_vector.tc_id, + comment, + test_vector.flags, + ) + } else { + log.debugf("%s/%d: %+v", alg_str, test_vector.tc_id, test_vector.flags) + } + + key := common.hexbytes_decode(test_vector.key) + msg := common.hexbytes_decode(test_vector.msg) + + tag_ := make([]byte, len(test_vector.tag) / 2) + + #partial switch mac_alg { + case .HMAC: + ctx: hmac.Context + hmac.init(&ctx, hmac_alg, key) + hmac.update(&ctx, msg) + if l := hmac.tag_size(&ctx); l == len(tag_) { + hmac.final(&ctx, tag_) + } else { + // Our hmac package does not support truncation. + tmp := make([]byte, l) + hmac.final(&ctx, tmp) + copy(tag_, tmp) + } + case .KMAC128, .KMAC256: + ctx: kmac.Context + #partial switch mac_alg { + case .KMAC128: + kmac.init_128(&ctx, key, nil) + case .KMAC256: + kmac.init_256(&ctx, key, nil) + } + kmac.update(&ctx, msg) + kmac.final(&ctx, tag_) + case .SIPHASH_1_3: + siphash.sum_1_3(msg, key, tag_) + case .SIPHASH_2_4: + siphash.sum_2_4(msg, key, tag_) + case .SIPHASH_4_8: + siphash.sum_4_8(msg, key, tag_) + } + + ok = common.hexbytes_compare(test_vector.tag, tag_) + if !result_check(test_vector.result, ok) { + x := transmute(string)(hex.encode(tag_)) + log.errorf( + "%s/%d: tag: expected %s actual %s", + alg_str, + test_vector.tc_id, + test_vector.tag, + x, + ) + num_failed += 1 + continue + } + + num_passed += 1 + } + } + + assert(num_ran == test_vectors.number_of_tests) + assert(num_passed + num_failed + num_skipped == num_ran) + + log.infof( + "%s: ran %d, passed %d, failed %d, skipped %d", + alg_str, + num_ran, + num_passed, + num_failed, + num_skipped, + ) + + return num_failed == 0 +} diff --git a/tests/core/crypto/wycheproof/main.odin b/tests/core/crypto/wycheproof/main.odin index dc8ab9237..dfdc78267 100644 --- a/tests/core/crypto/wycheproof/main.odin +++ b/tests/core/crypto/wycheproof/main.odin @@ -1,32 +1,8 @@ package test_wycheproof -import "core:encoding/hex" import "core:log" -import "core:mem" -import "core:os" -import "core:slice" -import "core:strings" import "core:testing" -import chacha_simd128 "core:crypto/_chacha20/simd128" -import chacha_simd256 "core:crypto/_chacha20/simd256" -import "core:crypto/aegis" -import "core:crypto/aes" -import "core:crypto/chacha20" -import "core:crypto/chacha20poly1305" -import "core:crypto/ecdh" -import "core:crypto/ecdsa" -import "core:crypto/ed25519" -import "core:crypto/hash" -import "core:crypto/hkdf" -import "core:crypto/hmac" -import "core:crypto/kmac" -import "core:crypto/pbkdf2" -import "core:crypto/siphash" -import "core:crypto/deoxysii" - -import "../common" - // Covered: // - crypto/aegis // - aegis128L_test.json @@ -96,1307 +72,3 @@ SUFFIX_TEST_JSON :: "_test.json" print_test_vector_path :: proc(t: ^testing.T) { log.infof("wycheproof path: %s", BASE_PATH) } - -supported_aegis_impls :: proc() -> [dynamic]aes.Implementation { - impls := make([dynamic]aes.Implementation, 0, 2, context.temp_allocator) - append(&impls, aes.Implementation.Portable) - if aegis.is_hardware_accelerated() { - append(&impls, aes.Implementation.Hardware) - } - - return impls -} - -@(test) -test_aead_aegis :: proc(t: ^testing.T) { - arena: mem.Arena - arena_backing := make([]byte, ARENA_SIZE) - defer delete(arena_backing) - mem.arena_init(&arena, arena_backing) - context.allocator = mem.arena_allocator(&arena) - - files := []string { - "aegis128L_test.json", - "aegis256_test.json", - } - - log.debug("aead/aegis: starting") - - for f in files { - mem.free_all() // Probably don't need this, but be safe. - - fn, _ := os.join_path([]string{BASE_PATH, f}, context.allocator) - - test_vectors: Test_Vectors(Aead_Test_Group) - load_ok := load(&test_vectors, fn) - testing.expectf(t, load_ok, "Unable to load {}", f) - if !load_ok { - continue - } - - for impl in supported_aegis_impls() { - testing.expectf(t, test_aead_aegis_impl(&test_vectors, impl), "impl {} failed", impl) - } - } -} - -test_aead_aegis_impl :: proc( - test_vectors: ^Test_Vectors(Aead_Test_Group), - impl: aes.Implementation, -) -> bool { - log.debug("aead/aegis/%v: starting", impl) - - num_ran, num_passed, num_failed, num_skipped: int - for &test_group in test_vectors.test_groups { - for &test_vector in test_group.tests { - num_ran += 1 - - if comment := test_vector.comment; comment != "" { - log.debugf( - "aead/aegis/%v/%d: %s: %+v", - impl, - test_vector.tc_id, - comment, - test_vector.flags, - ) - } else { - log.debugf("aead/aegis/%v/%d: %+v", - impl, - test_vector.tc_id, - test_vector.flags, - ) - } - - key := common.hexbytes_decode(test_vector.key) - iv := common.hexbytes_decode(test_vector.iv) - aad := common.hexbytes_decode(test_vector.aad) - msg := common.hexbytes_decode(test_vector.msg) - ct := common.hexbytes_decode(test_vector.ct) - tag := common.hexbytes_decode(test_vector.tag) - - if len(iv) == 0 { - log.infof( - "aead/aegis/%v/%d: skipped, invalid IVs panic", - impl, - test_vector.tc_id, - ) - num_skipped += 1 - continue - } - - ctx: aegis.Context - aegis.init(&ctx, key, impl) - - if result_is_valid(test_vector.result) { - ct_ := make([]byte, len(ct)) - tag_ := make([]byte, len(tag)) - aegis.seal(&ctx, ct_, tag_, iv, aad, msg) - - ok := common.hexbytes_compare(test_vector.ct, ct_) - if !result_check(test_vector.result, ok) { - x := transmute(string)(hex.encode(ct_)) - log.errorf( - "aead/aegis/%v/%d: ciphertext: expected %s actual %s", - impl, - test_vector.tc_id, - test_vector.ct, - x, - ) - num_failed += 1 - continue - } - - ok = common.hexbytes_compare(test_vector.tag, tag_) - if !result_check(test_vector.result, ok) { - x := transmute(string)(hex.encode(tag_)) - log.errorf( - "aead/aegis/%v/%d: tag: expected %s actual %s", - impl, - test_vector.tc_id, - test_vector.tag, - x, - ) - num_failed += 1 - continue - } - } - - msg_ := make([]byte, len(msg)) - ok := aegis.open(&ctx, msg_, iv, aad, ct, tag) - if !result_check(test_vector.result, ok) { - log.errorf("aead/aegis/%v/%d: decrypt failed", impl, test_vector.tc_id) - num_failed += 1 - continue - } - - if ok && !common.hexbytes_compare(test_vector.msg, msg_) { - x := transmute(string)(hex.encode(msg_)) - log.errorf( - "aead/aegis/%v/%d: decrypt msg: expected %s actual %s", - impl, - test_vector.tc_id, - test_vector.msg, - x, - ) - num_failed += 1 - continue - } - - num_passed += 1 - } - } - - assert(num_ran == test_vectors.number_of_tests) - assert(num_passed + num_failed + num_skipped == num_ran) - - log.infof( - "aead/aegis: ran %d, passed %d, failed %d, skipped %d", - num_ran, - num_passed, - num_failed, - num_skipped, - ) - - return num_failed == 0 -} - -supported_aes_impls :: proc() -> [dynamic]aes.Implementation { - impls := make([dynamic]aes.Implementation, 0, 2) - append(&impls, aes.Implementation.Portable) - if aes.is_hardware_accelerated() { - append(&impls, aes.Implementation.Hardware) - } - - return impls -} - -@(test) -test_aead_aes_gcm :: proc(t: ^testing.T) { - arena: mem.Arena - arena_backing := make([]byte, ARENA_SIZE) - defer delete(arena_backing) - mem.arena_init(&arena, arena_backing) - context.allocator = mem.arena_allocator(&arena) - - fn, _ := os.join_path([]string{BASE_PATH, "aes_gcm_test.json"}, context.allocator) - - log.debug("aead/aes-gcm: starting") - - test_vectors: Test_Vectors(Aead_Test_Group) - assert(load(&test_vectors, fn)) - - for impl in supported_aes_impls() { - testing.expectf(t, test_aead_aes_gcm_impl(&test_vectors, impl), "impl {} failed", impl) - } -} - -test_aead_aes_gcm_impl :: proc( - test_vectors: ^Test_Vectors(Aead_Test_Group), - impl: aes.Implementation, -) -> bool { - log.debug("aead/aes-gcm/%v: starting", impl) - - num_ran, num_passed, num_failed, num_skipped: int - for &test_group in test_vectors.test_groups { - for &test_vector in test_group.tests { - num_ran += 1 - - if comment := test_vector.comment; comment != "" { - log.debugf( - "aead/aes-gcm/%v/%d: %s: %+v", - impl, - test_vector.tc_id, - comment, - test_vector.flags, - ) - } else { - log.debugf("aead/aes-gcm/%v/%d: %+v", - impl, - test_vector.tc_id, - test_vector.flags, - ) - } - - key := common.hexbytes_decode(test_vector.key) - iv := common.hexbytes_decode(test_vector.iv) - aad := common.hexbytes_decode(test_vector.aad) - msg := common.hexbytes_decode(test_vector.msg) - ct := common.hexbytes_decode(test_vector.ct) - tag := common.hexbytes_decode(test_vector.tag) - - if len(iv) == 0 { - log.infof( - "aead/aes-gcm/%v/%d: skipped, invalid IVs panic", - impl, - test_vector.tc_id, - ) - num_skipped += 1 - continue - } - - ctx: aes.Context_GCM - aes.init_gcm(&ctx, key, impl) - - if result_is_valid(test_vector.result) { - ct_ := make([]byte, len(ct)) - tag_ := make([]byte, len(tag)) - aes.seal_gcm(&ctx, ct_, tag_, iv, aad, msg) - - ok := common.hexbytes_compare(test_vector.ct, ct_) - if !result_check(test_vector.result, ok) { - x := transmute(string)(hex.encode(ct_)) - log.errorf( - "aead/aes-gcm/%v/%d: ciphertext: expected %s actual %s", - impl, - test_vector.tc_id, - test_vector.ct, - x, - ) - num_failed += 1 - continue - } - - ok = common.hexbytes_compare(test_vector.tag, tag_) - if !result_check(test_vector.result, ok) { - x := transmute(string)(hex.encode(tag_)) - log.errorf( - "aead/aes-gcm/%v/%d: tag: expected %s actual %s", - impl, - test_vector.tc_id, - test_vector.tag, - x, - ) - num_failed += 1 - continue - } - } - - msg_ := make([]byte, len(msg)) - ok := aes.open_gcm(&ctx, msg_, iv, aad, ct, tag) - if !result_check(test_vector.result, ok) { - log.errorf("aead/aes-gcm/%v/%d: decrypt failed", impl, test_vector.tc_id) - num_failed += 1 - continue - } - - if ok && !common.hexbytes_compare(test_vector.msg, msg_) { - x := transmute(string)(hex.encode(msg_)) - log.errorf( - "aead/aes-gcm/%v/%d: decrypt msg: expected %s actual %s", - impl, - test_vector.tc_id, - test_vector.msg, - x, - ) - num_failed += 1 - continue - } - - num_passed += 1 - } - } - - assert(num_ran == test_vectors.number_of_tests) - assert(num_passed + num_failed + num_skipped == num_ran) - - log.infof( - "aead/aes-gcm: ran %d, passed %d, failed %d, skipped %d", - num_ran, - num_passed, - num_failed, - num_skipped, - ) - - return num_failed == 0 -} - -supported_chacha_impls :: proc() -> [dynamic]chacha20.Implementation { - impls := make([dynamic]chacha20.Implementation, 0, 3) - append(&impls, chacha20.Implementation.Portable) - if chacha_simd128.is_performant() { - append(&impls, chacha20.Implementation.Simd128) - } - if chacha_simd256.is_performant() { - append(&impls, chacha20.Implementation.Simd256) - } - - return impls -} - -@(test) -test_aead_chacha20_poly1305 :: proc(t: ^testing.T) { - arena: mem.Arena - arena_backing := make([]byte, ARENA_SIZE) - defer delete(arena_backing) - mem.arena_init(&arena, arena_backing) - context.allocator = mem.arena_allocator(&arena) - - files := []string { - "chacha20_poly1305_test.json", - "xchacha20_poly1305_test.json", - } - - log.debug("aead/(x)chacha20poly1305: starting") - - for f, i in files { - mem.free_all() // Probably don't need this, but be safe. - - fn, _ := os.join_path([]string{BASE_PATH, f}, context.allocator) - - test_vectors: Test_Vectors(Aead_Test_Group) - load_ok := load(&test_vectors, fn) - testing.expectf(t, load_ok, "Unable to load {}", f) - if !load_ok { - continue - } - - for impl in supported_chacha_impls() { - testing.expectf(t, test_aead_chacha20_poly1305_impl(&test_vectors, i == 1, impl), "impl {} failed", impl) - } - } -} - -test_aead_chacha20_poly1305_impl :: proc( - test_vectors: ^Test_Vectors(Aead_Test_Group), - is_xchacha: bool, - impl: chacha20.Implementation, -) -> bool { - FLAG_INVALID_NONCE_SIZE :: "InvalidNonceSize" - - alg_str := is_xchacha ? "xchacha20poly1305" : "chacha20poly1305" - - num_ran, num_passed, num_failed, num_skipped: int - for &test_group in test_vectors.test_groups { - for &test_vector in test_group.tests { - num_ran += 1 - - if comment := test_vector.comment; comment != "" { - log.debugf( - "aead/%s/%v/%d: %s: %+v", - alg_str, - impl, - test_vector.tc_id, - comment, - test_vector.flags, - ) - } else { - log.debugf("aead/%s/%v/%d: %+v", - alg_str, - impl, - test_vector.tc_id, - test_vector.flags, - ) - } - - key := common.hexbytes_decode(test_vector.key) - iv := common.hexbytes_decode(test_vector.iv) - aad := common.hexbytes_decode(test_vector.aad) - msg := common.hexbytes_decode(test_vector.msg) - ct := common.hexbytes_decode(test_vector.ct) - tag := common.hexbytes_decode(test_vector.tag) - - if slice.contains(test_vector.flags, FLAG_INVALID_NONCE_SIZE) { - log.infof( - "aead/%s/%v/%d: skipped, invalid nonces panic", - alg_str, - impl, - test_vector.tc_id, - ) - num_skipped += 1 - continue - } - - ctx: chacha20poly1305.Context - switch is_xchacha { - case true: - chacha20poly1305.init_xchacha(&ctx, key, impl) - case false: - chacha20poly1305.init(&ctx, key, impl) - } - - if result_is_valid(test_vector.result) { - ct_ := make([]byte, len(ct)) - tag_ := make([]byte, len(tag)) - chacha20poly1305.seal(&ctx, ct_, tag_, iv, aad, msg) - - ok := common.hexbytes_compare(test_vector.ct, ct_) - if !result_check(test_vector.result, ok) { - x := transmute(string)(hex.encode(ct_)) - log.errorf( - "aead/%s/%v/%d: ciphertext: expected %s actual %s", - alg_str, - impl, - test_vector.tc_id, - test_vector.ct, - x, - ) - num_failed += 1 - continue - } - - ok = common.hexbytes_compare(test_vector.tag, tag_) - if !result_check(test_vector.result, ok) { - x := transmute(string)(hex.encode(tag_)) - log.errorf( - "aead/%s/%v/%d: tag: expected %s actual %s", - alg_str, - impl, - test_vector.tc_id, - test_vector.tag, - x, - ) - num_failed += 1 - continue - } - } - - msg_ := make([]byte, len(msg)) - ok := chacha20poly1305.open(&ctx, msg_, iv, aad, ct, tag) - if !result_check(test_vector.result, ok) { - log.errorf("aead/%s/%v/%d: decrypt failed", - alg_str, - impl, - test_vector.tc_id, - ) - num_failed += 1 - continue - } - - if ok && !common.hexbytes_compare(test_vector.msg, msg_) { - x := transmute(string)(hex.encode(msg_)) - log.errorf( - "aead/%s/%v/%d: decrypt msg: expected %s actual %s", - alg_str, - impl, - test_vector.tc_id, - test_vector.msg, - x, - ) - num_failed += 1 - continue - } - - num_passed += 1 - } - } - - assert(num_ran == test_vectors.number_of_tests) - assert(num_passed + num_failed + num_skipped == num_ran) - - log.infof( - "aead/%s/%v: ran %d, passed %d, failed %d, skipped %d", - alg_str, - impl, - num_ran, - num_passed, - num_failed, - num_skipped, - ) - - return num_failed == 0 -} - -@(test) -test_aead_deoxysii :: proc(t: ^testing.T) { - ctx: deoxysii.Context - - key: [deoxysii.KEY_SIZE]byte - iv: [deoxysii.IV_SIZE]byte - tag: [deoxysii.TAG_SIZE]byte - buf: [4096]byte - - deoxysii.init(&ctx, key[:]) - deoxysii.seal(&ctx, buf[:], tag[:], iv[:], nil, buf[:]) - assert(deoxysii.open(&ctx, buf[:], iv[:], nil, buf[:], tag[:])) -} - -@(test) -test_eddsa_ed25519 :: proc(t: ^testing.T) { - arena: mem.Arena - arena_backing := make([]byte, ARENA_SIZE) - defer delete(arena_backing) - mem.arena_init(&arena, arena_backing) - context.allocator = mem.arena_allocator(&arena) - - fn_, _ := os.join_path([]string{BASE_PATH, "ed25519_test.json"}, context.allocator) - - log.debug("eddsa/ed25519: starting") - - test_vectors: Test_Vectors(Eddsa_Test_Group) - assert(load(&test_vectors, fn_)) - - num_ran, num_passed, num_failed, num_skipped: int - for &test_group, i in test_vectors.test_groups { - mem.free_all() // Probably don't need this, but be safe. - pk_bytes := common.hexbytes_decode(test_group.public_key.pk) - - pk: ed25519.Public_Key - pk_ok := ed25519.public_key_set_bytes(&pk, pk_bytes) - testing.expectf(t, pk_ok, "eddsa/ed25519/%d: invalid public key: %s", i, test_group.public_key.pk) - if !pk_ok { - num_failed += len(test_group.tests) - continue - } - - for &test_vector in test_group.tests { - num_ran += 1 - - if comment := test_vector.comment; comment != "" { - log.debugf( - "eddsa/ed25519/%d: %s: %+v", - test_vector.tc_id, - comment, - test_vector.flags, - ) - } else { - log.debugf("eddsa/ed25519/%d: %+v", test_vector.tc_id, test_vector.flags) - } - - msg := common.hexbytes_decode(test_vector.msg) - sig := common.hexbytes_decode(test_vector.sig) - - verify_ok := ed25519.verify(&pk, msg, sig) - result_ok := result_check(test_vector.result, verify_ok) - testing.expectf( - t, - result_ok, - "eddsa/ed25519/%d: verify failed: expected %s actual %v", - test_vector.tc_id, - test_vector.result, - verify_ok, - ) - if !result_ok { - num_failed += 1 - continue - } - num_passed += 1 - } - } - - assert(num_ran == test_vectors.number_of_tests) - assert(num_passed + num_failed + num_skipped == num_ran) - - log.infof( - "eddsa/ed25519: ran %d, passed %d, failed %d, skipped %d", - num_ran, - num_passed, - num_failed, - num_skipped, - ) -} - -@(test) -test_ecdsa :: proc(t: ^testing.T) { - arena: mem.Arena - arena_backing := make([]byte, ARENA_SIZE) - defer delete(arena_backing) - mem.arena_init(&arena, arena_backing) - context.allocator = mem.arena_allocator(&arena) - - log.debug("ecdsa: starting") - - files := []string { - "ecdsa_secp256r1_sha256_test.json", - "ecdsa_secp256r1_sha512_test.json", - "ecdsa_secp384r1_sha384_test.json", - } - - for f in files { - mem.free_all() // Probably don't need this, but be safe. - - fn, _ := os.join_path([]string{BASE_PATH, f}, context.allocator) - - test_vectors: Test_Vectors(Ecdsa_Test_Group) - load_ok := load(&test_vectors, fn) - testing.expectf(t, load_ok, "Unable to load {}", f) - if !load_ok { - continue - } - - testing.expectf(t, test_ecdsa_impl(t, &test_vectors), "ecdsa failed") - } -} - -test_ecdsa_impl :: proc(t: ^testing.T, test_vectors: ^Test_Vectors(Ecdsa_Test_Group)) -> bool { - curve_str := test_vectors.test_groups[0].public_key.curve - hash_str := test_vectors.test_groups[0].sha - - curve_alg: ecdsa.Curve - switch curve_str { - case "secp256r1": - curve_alg = .SECP256R1 - case "secp384r1": - curve_alg = .SECP384R1 - case: - log.errorf("ecdsa: unsupported curve: %s", curve_str) - } - - hash_alg: hash.Algorithm - switch hash_str { - case "SHA-256": - hash_alg = .SHA256 - case "SHA-384": - hash_alg = .SHA384 - case "SHA-512": - hash_alg = .SHA512 - case: - log.errorf("ecdsa: unsupported hash: %s", hash_str) - } - - log.debugf("ecdsa/%s/%s: starting", curve_str, hash_str) - - num_ran, num_passed, num_failed, num_skipped: int - for &test_group, i in test_vectors.test_groups { - pk_bytes := common.hexbytes_decode(test_group.public_key.uncompressed) - - pk: ecdsa.Public_Key - pk_ok := ecdsa.public_key_set_bytes(&pk, curve_alg, pk_bytes) - testing.expectf(t, pk_ok, "ecdsa/%s/%s/%d: invalid public key: %s", curve_str, hash_str, i, test_group.public_key.uncompressed) - if !pk_ok { - num_failed += len(test_group.tests) - continue - } - - for &test_vector in test_group.tests { - num_ran += 1 - - if comment := test_vector.comment; comment != "" { - log.debugf( - "ecda/%s/%s/%d: %s: %+v", - curve_str, - hash_str, - test_vector.tc_id, - comment, - test_vector.flags, - ) - } else { - log.debugf("ecdsa/%s/%s/%d: %+v", curve_str, hash_str, test_vector.tc_id, test_vector.flags) - } - - msg := common.hexbytes_decode(test_vector.msg) - sig := common.hexbytes_decode(test_vector.sig) - - verify_ok := ecdsa.verify_asn1(&pk, hash_alg, msg, sig) - result_ok := result_check(test_vector.result, verify_ok) - testing.expectf( - t, - result_ok, - "ecdsa/%s/%s/%d: verify failed: expected %s actual %v", - curve_str, - hash_str, - test_vector.tc_id, - test_vector.result, - verify_ok, - ) - if !result_ok { - num_failed += 1 - continue - } - - num_passed += 1 - } - } - - assert(num_ran == test_vectors.number_of_tests) - assert(num_passed + num_failed + num_skipped == num_ran) - - log.infof( - "ecdsa/%s/%s: ran %d, passed %d, failed %d, skipped %d", - curve_str, - hash_str, - num_ran, - num_passed, - num_failed, - num_skipped, - ) - - return num_failed == 0 -} - -@(test) -test_hkdf :: proc(t: ^testing.T) { - arena: mem.Arena - arena_backing := make([]byte, ARENA_SIZE) - defer delete(arena_backing) - mem.arena_init(&arena, arena_backing) - context.allocator = mem.arena_allocator(&arena) - - log.debug("hkdf: starting") - - files := []string { - "hkdf_sha1_test.json", - "hkdf_sha256_test.json", - "hkdf_sha384_test.json", - "hkdf_sha512_test.json", - } - - for f in files { - mem.free_all() // Probably don't need this, but be safe. - - fn, _ := os.join_path([]string{BASE_PATH, f}, context.allocator) - - test_vectors: Test_Vectors(Hkdf_Test_Group) - load_ok := load(&test_vectors, fn) - testing.expectf(t, load_ok, "Unable to load {}", f) - if !load_ok { - continue - } - - testing.expectf(t, test_hkdf_impl(&test_vectors), "hkdf failed") - } -} - -test_hkdf_impl :: proc(test_vectors: ^Test_Vectors(Hkdf_Test_Group)) -> bool { - PREFIX_HKDF :: "HKDF-" - FLAG_SIZE_TOO_LARGE :: "SizeTooLarge" - - alg_str := strings.trim_prefix(test_vectors.algorithm, PREFIX_HKDF) - alg, ok := hash_name_to_algorithm(alg_str) - if !ok { - return false - } - alg_str = strings.to_lower(alg_str) - - log.debugf("hkdf/%s: starting", alg_str) - - num_ran, num_passed, num_failed, num_skipped: int - for &test_group in test_vectors.test_groups { - for &test_vector in test_group.tests { - num_ran += 1 - - if comment := test_vector.comment; comment != "" { - log.debugf( - "hkdf/%s/%d: %s: %+v", - alg_str, - test_vector.tc_id, - comment, - test_vector.flags, - ) - } else { - log.debugf("hkdf/%s/%d: %+v", alg_str, test_vector.tc_id, test_vector.flags) - } - - ikm := common.hexbytes_decode(test_vector.ikm) - salt := common.hexbytes_decode(test_vector.salt) - info := common.hexbytes_decode(test_vector.info) - - if slice.contains(test_vector.flags, FLAG_SIZE_TOO_LARGE) { - log.infof( - "hkdf/%s/%d: skipped, oversized outputs panic", - alg_str, - test_vector.tc_id, - ) - num_skipped += 1 - continue - } - - okm_ := make([]byte, test_vector.size) - hkdf.extract_and_expand(alg, salt, ikm, info, okm_) - - ok = common.hexbytes_compare(test_vector.okm, okm_) - if !result_check(test_vector.result, ok) { - x := transmute(string)(hex.encode(okm_)) - log.errorf( - "hkdf/%s/%d: shared: expected %s actual %s", - alg_str, - test_vector.tc_id, - test_vector.okm, - x, - ) - num_failed += 1 - continue - } - - num_passed += 1 - } - } - - assert(num_ran == test_vectors.number_of_tests) - assert(num_passed + num_failed + num_skipped == num_ran) - - log.infof( - "hkdf/%s: ran %d, passed %d, failed %d, skipped %d", - alg_str, - num_ran, - num_passed, - num_failed, - num_skipped, - ) - - return num_failed == 0 -} - -@(test) -test_mac :: proc(t: ^testing.T) { - arena: mem.Arena - arena_backing := make([]byte, ARENA_SIZE) - defer delete(arena_backing) - mem.arena_init(&arena, arena_backing) - context.allocator = mem.arena_allocator(&arena) - - log.debug("mac: starting") - - files := []string { - "hmac_sha1_test.json", - "hmac_sha224_test.json", - "hmac_sha256_test.json", - "hmac_sha3_224_test.json", - "hmac_sha3_256_test.json", - "hmac_sha3_384_test.json", - "hmac_sha3_512_test.json", - "hmac_sha384_test.json", - // "hmac_sha512_224_test.json", - "hmac_sha512_256_test.json", - "hmac_sha512_test.json", - "hmac_sm3_test.json", - "kmac128_no_customization_test.json", - "kmac256_no_customization_test.json", - "siphash_1_3_test.json", - "siphash_2_4_test.json", - "siphash_4_8_test.json", - } - - for f in files { - mem.free_all() // Probably don't need this, but be safe. - - fn, _ := os.join_path([]string{BASE_PATH, f}, context.allocator) - - test_vectors: Test_Vectors(Mac_Test_Group) - load_ok := load(&test_vectors, fn) - testing.expectf(t, load_ok, "Unable to load {}", f) - if !load_ok { - continue - } - - testing.expectf(t, test_mac_impl(&test_vectors), "hkdf failed") - } -} - -test_mac_impl :: proc(test_vectors: ^Test_Vectors(Mac_Test_Group)) -> bool { - PREFIX_HMAC :: "HMAC" - PREFIX_KMAC :: "KMAC" - - mac_alg, hmac_alg, alg_str, ok := mac_algorithm(test_vectors.algorithm) - if !ok { - log.errorf("mac: unsupported algorith: %s", test_vectors.algorithm) - return false - } - - log.debugf("%s: starting", alg_str) - - num_ran, num_passed, num_failed, num_skipped: int - for &test_group in test_vectors.test_groups { - for &test_vector in test_group.tests { - num_ran += 1 - - if comment := test_vector.comment; comment != "" { - log.debugf( - "%s/%d: %s: %+v", - alg_str, - test_vector.tc_id, - comment, - test_vector.flags, - ) - } else { - log.debugf("%s/%d: %+v", alg_str, test_vector.tc_id, test_vector.flags) - } - - key := common.hexbytes_decode(test_vector.key) - msg := common.hexbytes_decode(test_vector.msg) - - tag_ := make([]byte, len(test_vector.tag) / 2) - - #partial switch mac_alg { - case .HMAC: - ctx: hmac.Context - hmac.init(&ctx, hmac_alg, key) - hmac.update(&ctx, msg) - if l := hmac.tag_size(&ctx); l == len(tag_) { - hmac.final(&ctx, tag_) - } else { - // Our hmac package does not support truncation. - tmp := make([]byte, l) - hmac.final(&ctx, tmp) - copy(tag_, tmp) - } - case .KMAC128, .KMAC256: - ctx: kmac.Context - #partial switch mac_alg { - case .KMAC128: - kmac.init_128(&ctx, key, nil) - case .KMAC256: - kmac.init_256(&ctx, key, nil) - } - kmac.update(&ctx, msg) - kmac.final(&ctx, tag_) - case .SIPHASH_1_3: - siphash.sum_1_3(msg, key, tag_) - case .SIPHASH_2_4: - siphash.sum_2_4(msg, key, tag_) - case .SIPHASH_4_8: - siphash.sum_4_8(msg, key, tag_) - } - - ok = common.hexbytes_compare(test_vector.tag, tag_) - if !result_check(test_vector.result, ok) { - x := transmute(string)(hex.encode(tag_)) - log.errorf( - "%s/%d: tag: expected %s actual %s", - alg_str, - test_vector.tc_id, - test_vector.tag, - x, - ) - num_failed += 1 - continue - } - - num_passed += 1 - } - } - - assert(num_ran == test_vectors.number_of_tests) - assert(num_passed + num_failed + num_skipped == num_ran) - - log.infof( - "%s: ran %d, passed %d, failed %d, skipped %d", - alg_str, - num_ran, - num_passed, - num_failed, - num_skipped, - ) - - return num_failed == 0 -} - -@(test) -test_pbkdf2 :: proc(t: ^testing.T) { - arena: mem.Arena - arena_backing := make([]byte, ARENA_SIZE) - defer delete(arena_backing) - mem.arena_init(&arena, arena_backing) - context.allocator = mem.arena_allocator(&arena) - - log.debug("pbkdf2: starting") - - files := []string { - "pbkdf2_hmacsha1_test.json", - "pbkdf2_hmacsha224_test.json", - "pbkdf2_hmacsha256_test.json", - "pbkdf2_hmacsha384_test.json", - "pbkdf2_hmacsha512_test.json", - } - - for f in files { - mem.free_all() // Probably don't need this, but be safe. - - fn, _ := os.join_path([]string{BASE_PATH, f}, context.allocator) - - test_vectors: Test_Vectors(Pbkdf_Test_Group) - load_ok := load(&test_vectors, fn) - testing.expectf(t, load_ok, "Unable to load {}", f) - if !load_ok { - continue - } - - testing.expectf(t, test_pbkdf2_impl(&test_vectors), "pbkdf2 failed") - } -} - -test_pbkdf2_impl :: proc( - test_vectors: ^Test_Vectors(Pbkdf_Test_Group), -) -> bool { - PREFIX_PBKDF_HMAC :: "PBKDF2-HMAC" - FLAG_LARGE_ITERATION_COUNT :: "LargeIterationCount" - - alg_str := strings.trim_prefix(test_vectors.algorithm, PREFIX_PBKDF_HMAC) - alg, ok := hash_name_to_algorithm(alg_str) - if !ok { - return false - } - alg_str = strings.to_lower(alg_str) - - log.debugf("pbkdf2/hmac-%s: starting", alg_str) - - num_ran, num_passed, num_failed, num_skipped: int - for &test_group in test_vectors.test_groups { - for &test_vector in test_group.tests { - num_ran += 1 - - if comment := test_vector.comment; comment != "" { - log.debugf( - "pbkdf2/hmac-%s/%d: %s: %+v", - alg_str, - test_vector.tc_id, - comment, - test_vector.flags, - ) - } else { - log.debugf("pbkdf2/hmac-%s/%d: %+v", alg_str, test_vector.tc_id, test_vector.flags) - } - - if slice.contains(test_vector.flags, FLAG_LARGE_ITERATION_COUNT) { - log.infof( - "pbkdf2/hmac-%s/%d: skipped, takes fucking forever", - alg_str, - test_vector.tc_id, - ) - num_skipped += 1 - continue - } - - password := common.hexbytes_decode(test_vector.password) - salt := common.hexbytes_decode(test_vector.salt) - - dk_ := make([]byte, test_vector.dk_len) - pbkdf2.derive(alg, password, salt, test_vector.iteration_count, dk_) - - ok = common.hexbytes_compare(test_vector.dk, dk_) - if !result_check(test_vector.result, ok) { - x := transmute(string)(hex.encode(dk_)) - log.errorf( - "pbkdf2/hmac-%s/%d: shared: expected %s actual %s", - alg_str, - test_vector.tc_id, - test_vector.dk, - x, - ) - num_failed += 1 - continue - } - - num_passed += 1 - } - } - - assert(num_ran == test_vectors.number_of_tests) - assert(num_passed + num_failed + num_skipped == num_ran) - - log.infof( - "pbkdf2/%s: ran %d, passed %d, failed %d, skipped %d", - alg_str, - num_ran, - num_passed, - num_failed, - num_skipped, - ) - - return num_failed == 0 -} - -@(test) -test_ecdh :: proc(t: ^testing.T) { - arena: mem.Arena - arena_backing := make([]byte, ARENA_SIZE) - defer delete(arena_backing) - mem.arena_init(&arena, arena_backing) - context.allocator = mem.arena_allocator(&arena) - - PREFIX_TEST_ECDH :: "ecdh_" - SUFFIX_TEST_ECPOINT :: "_ecpoint" - - files := []string { - "ecdh_secp256r1_ecpoint_test.json", - "ecdh_secp384r1_ecpoint_test.json", - "x25519_test.json", - "x448_test.json", - } - - log.debug("ecdh: starting") - - for f in files { - mem.free_all() // Probably don't need this, but be safe. - - fn, _ := os.join_path([]string{BASE_PATH, f}, context.allocator) - - test_vectors: Test_Vectors(Ecdh_Test_Group) - load_ok := load(&test_vectors, fn) - testing.expectf(t, load_ok, "Unable to load {}", f) - if !load_ok { - continue - } - - alg_str := strings.trim_suffix(f, SUFFIX_TEST_JSON) - alg_str = strings.trim_suffix(alg_str, SUFFIX_TEST_ECPOINT) - alg_str = strings.trim_prefix(alg_str, PREFIX_TEST_ECDH) - testing.expectf(t, test_ecdh_impl(&test_vectors, alg_str), "alg {} failed", alg_str) - } -} - -test_ecdh_impl :: proc( - test_vectors: ^Test_Vectors(Ecdh_Test_Group), - alg_str: string, -) -> bool { - ALG_P256 :: "secp256r1" - ALG_P384 :: "secp384r1" - ALG_X25519 :: "x25519" - ALG_X448 :: "x448" - - // XDH exceptions - FLAG_PUBLIC_KEY_TOO_LONG :: "PublicKeyTooLong" - FLAG_ZERO_SHARED_SECRET :: "ZeroSharedSecret" - - // ECDH exceptions - FLAG_COMPRESSED_POINT :: "CompressedPoint" - FLAG_INVALID_CURVE :: "InvalidCurveAttack" - FLAG_INVALID_ENCODING :: "InvalidEncoding" - - log.debugf("ecdh/%s: starting", alg_str) - - num_ran, num_passed, num_failed, num_skipped: int - for &test_group in test_vectors.test_groups { - for &test_vector in test_group.tests { - num_ran += 1 - - if comment := test_vector.comment; comment != "" { - log.debugf("ecdh/%s/%d: %s: %+v", alg_str, test_vector.tc_id, comment, test_vector.flags) - } else { - log.debugf("ecdh/%s/%d: %+v", alg_str, test_vector.tc_id, test_vector.flags) - } - - raw_pub := common.hexbytes_decode(test_vector.public) - raw_priv := common.hexbytes_decode(test_vector.private) - - curve: ecdh.Curve - priv_key: ecdh.Private_Key - pub_key: ecdh.Public_Key - - is_nist, is_xdh: bool - switch alg_str { - case ALG_P256: - curve = .SECP256R1 - // Ugh, ASN.1 :( - l := len(raw_priv) - if l == 33 { - if raw_priv[0] == 0 { - raw_priv = raw_priv[1:] - } - } else if l < 32 { - // left-pad.odin - tmp := make([]byte, 32) - copy(tmp[32-l:], raw_priv) - raw_priv = tmp - } - is_nist = true - case ALG_P384: - curve = .SECP384R1 - // Ugh, ASN.1 :( - l := len(raw_priv) - if l == 49 { - if raw_priv[0] == 0 { - raw_priv = raw_priv[1:] - } - } else if l < 48 { - // left-pad.odin - tmp := make([]byte, 48) - copy(tmp[48-l:], raw_priv) - raw_priv = tmp - } - is_nist = true - case ALG_X25519: - curve = .X25519 - is_xdh = true - case ALG_X448: - curve = .X448 - is_xdh = true - case: - log.errorf("ecdh: unsupported algorithm: %s", alg_str) - return false - } - - if ok := ecdh.private_key_set_bytes(&priv_key, curve, raw_priv); !ok { - log.errorf( - "ecdh/%s/%d: failed to deserialize private_key: %s %d %x", - alg_str, - test_vector.tc_id, - test_vector.private, - len(raw_priv), - raw_priv, - ) - num_failed += 1 - continue - } - - if ok := ecdh.public_key_set_bytes(&pub_key, curve, raw_pub); !ok { - if is_nist { - if slice.contains(test_vector.flags, FLAG_COMPRESSED_POINT) { - num_passed += 1 - continue - } - if slice.contains(test_vector.flags, FLAG_INVALID_CURVE) { - num_passed += 1 - continue - } - if slice.contains(test_vector.flags, FLAG_INVALID_ENCODING) { - num_passed += 1 - continue - } - } - if slice.contains(test_vector.flags, FLAG_PUBLIC_KEY_TOO_LONG) { - num_passed += 1 - continue - } - - log.errorf( - "ecdh/%s/%d: failed to deserialize public_key: %s", - alg_str, - test_vector.tc_id, - test_vector.public, - ) - num_failed += 1 - continue - } - - shared := make([]byte, ecdh.SHARED_SECRET_SIZES[curve]) - - ok := ecdh.ecdh(&priv_key, &pub_key, shared) - if !ok { - if is_xdh && slice.contains(test_vector.flags, FLAG_ZERO_SHARED_SECRET) { - num_passed += 1 - continue - } - // unused: x := transmute(string)(hex.encode(shared)) - log.errorf( - "ecdh/%s/%d: ecdh failed", - alg_str, - test_vector.tc_id, - ) - num_failed += 1 - continue - } - - ok = common.hexbytes_compare(test_vector.shared, shared) - // "acceptable" results are fine from here because we have - // checked for the all-zero shared secret XDH case already. - if !result_check(test_vector.result, ok, false) { - x := transmute(string)(hex.encode(shared)) - log.errorf( - "ecdh/%s/%d: shared: expected %s actual %s", - alg_str, - test_vector.tc_id, - test_vector.shared, - x, - ) - num_failed += 1 - continue - } - - num_passed += 1 - } - } - - assert(num_ran == test_vectors.number_of_tests) - assert(num_passed + num_failed + num_skipped == num_ran) - - log.infof( - "ecdh/%s: ran %d, passed %d, failed %d, skipped %d", - alg_str, - num_ran, - num_passed, - num_failed, - num_skipped, - ) - - return num_failed == 0 -} From d2c29c025ef3ba17b704cd4eb293b5192e77af03 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Wed, 1 Apr 2026 04:21:36 +0900 Subject: [PATCH 025/228] core/crypto/mlkem: Initial import --- core/crypto/_mlkem/cbd.odin | 52 +++ core/crypto/_mlkem/constants.odin | 53 +++ core/crypto/_mlkem/k_pke.odin | 349 +++++++++++++++++ core/crypto/_mlkem/kem_internal.odin | 195 ++++++++++ core/crypto/_mlkem/ntt.odin | 75 ++++ core/crypto/_mlkem/poly.odin | 241 ++++++++++++ core/crypto/_mlkem/polyvec.odin | 224 +++++++++++ core/crypto/_mlkem/reduce.odin | 19 + core/crypto/_mlkem/symmetric_shake.odin | 61 +++ core/crypto/_subtle/subtle.odin | 39 ++ core/crypto/mlkem/api.odin | 268 +++++++++++++ core/crypto/mlkem/doc.odin | 7 + examples/all/all_js.odin | 1 + examples/all/all_main.odin | 1 + tests/benchmark/crypto/benchmark_pqc.odin | 84 ++++ tests/core/crypto/test_core_crypto_pqc.odin | 72 ++++ tests/core/crypto/wycheproof/main.odin | 10 + tests/core/crypto/wycheproof/pqc.odin | 401 ++++++++++++++++++++ tests/core/crypto/wycheproof/schemas.odin | 25 ++ 19 files changed, 2177 insertions(+) create mode 100644 core/crypto/_mlkem/cbd.odin create mode 100644 core/crypto/_mlkem/constants.odin create mode 100644 core/crypto/_mlkem/k_pke.odin create mode 100644 core/crypto/_mlkem/kem_internal.odin create mode 100644 core/crypto/_mlkem/ntt.odin create mode 100644 core/crypto/_mlkem/poly.odin create mode 100644 core/crypto/_mlkem/polyvec.odin create mode 100644 core/crypto/_mlkem/reduce.odin create mode 100644 core/crypto/_mlkem/symmetric_shake.odin create mode 100644 core/crypto/mlkem/api.odin create mode 100644 core/crypto/mlkem/doc.odin create mode 100644 tests/benchmark/crypto/benchmark_pqc.odin create mode 100644 tests/core/crypto/test_core_crypto_pqc.odin create mode 100644 tests/core/crypto/wycheproof/pqc.odin diff --git a/core/crypto/_mlkem/cbd.odin b/core/crypto/_mlkem/cbd.odin new file mode 100644 index 000000000..301551ff5 --- /dev/null +++ b/core/crypto/_mlkem/cbd.odin @@ -0,0 +1,52 @@ +#+private +package _mlkem + +import "core:encoding/endian" + +unchecked_get_u24le :: #force_inline proc "contextless" (b: []byte) -> u32 #no_bounds_check { + r := u32(b[0]) + r |= u32(b[1]) << 8 + r |= u32(b[2]) << 16 + return r +} + +cbd3 :: proc "contextless" (r: ^Poly, buf: ^[3*N/4]byte) #no_bounds_check { + for i in 0..>1) & 0x00249249 + d += (t>>2) & 0x00249249 + + for j in uint(0)..<4 { + a := i16((d >> (6*j+0)) & 0x7) + b := i16((d >> (6*j+3)) & 0x7) + r.coeffs[4*i+int(j)] = a - b + } + } +} + +cbd2 :: proc "contextless" (r: ^Poly, buf: ^[2*N/4]byte) #no_bounds_check { + for i in 0..>1) & 0x55555555 + + for j in uint(0)..<8 { + a := i16((d >> (4*j+0)) & 0x3) + b := i16((d >> (4*j+2)) & 0x3) + r.coeffs[8*i+int(j)] = a - b + } + } +} + +poly_cbd_eta1_512 :: proc "contextless" (r: ^Poly, buf: ^[ETA1_512*N/4]byte) { + cbd3(r, buf) +} + +poly_cbd_eta1 :: proc "contextless" (r: ^Poly, buf: ^[ETA1*N/4]byte) { + cbd2(r, buf) +} + +poly_cbd_eta2 :: proc "contextless" (r: ^Poly, buf: ^[ETA2*N/4]byte) { + cbd2(r, buf) +} diff --git a/core/crypto/_mlkem/constants.odin b/core/crypto/_mlkem/constants.odin new file mode 100644 index 000000000..7195d8b61 --- /dev/null +++ b/core/crypto/_mlkem/constants.odin @@ -0,0 +1,53 @@ +package _mlkem + +K_512 :: 2 +K_768 :: 3 +K_1024 :: 4 +K_MAX :: K_1024 + +N :: 256 +Q :: 3329 + +ETA1_512 :: 3 +ETA1 :: 2 +ETA2 :: 2 + +POLYBYTES :: 384 +SYMBYTES :: 32 + +POLYCOMPRESSEDBYTES_512 :: 128 +POLYCOMPRESSEDBYTES_768 :: 128 +POLYCOMPRESSEDBYTES_1024 :: 160 + +POLYVECBYTES_512 :: K_512 * POLYBYTES +POLYVECBYTES_768 :: K_768 * POLYBYTES +POLYVECBYTES_1024 :: K_1024 * POLYBYTES + +POLYVECCOMPRESSEDBYTES_512 :: K_512 * 320 +POLYVECCOMPRESSEDBYTES_768 :: K_768 * 320 +POLYVECCOMPRESSEDBYTES_1024 :: K_1024 * 352 + +INDCPA_MSGBYTES :: SYMBYTES +INDCPA_PUBLICKEYBYTES_512 :: POLYVECBYTES_512 + SYMBYTES +INDCPA_SECRETKEYBYTES_512 :: POLYVECBYTES_512 +INDCPA_PUBLICKEYBYTES_768 :: POLYVECBYTES_768 + SYMBYTES +INDCPA_SECRETKEYBYTES_768 :: POLYVECBYTES_768 +INDCPA_PUBLICKEYBYTES_1024 :: POLYVECBYTES_1024 + SYMBYTES +INDCPA_SECRETKEYBYTES_1024 :: POLYVECBYTES_1024 +INDCPA_PUBLICKEYBYTES_MAX :: INDCPA_PUBLICKEYBYTES_1024 +INDCPA_BYTES_512 :: POLYVECCOMPRESSEDBYTES_512 + POLYCOMPRESSEDBYTES_512 +INDCPA_BYTES_768 :: POLYVECCOMPRESSEDBYTES_768 + POLYCOMPRESSEDBYTES_768 +INDCPA_BYTES_1024 :: POLYVECCOMPRESSEDBYTES_1024 + POLYCOMPRESSEDBYTES_1024 + +ENCAPSKEYBYTES_512 :: INDCPA_PUBLICKEYBYTES_512 +ENCAPSKEYBYTES_768 :: INDCPA_PUBLICKEYBYTES_768 +ENCAPSKEYBYTES_1024 :: INDCPA_PUBLICKEYBYTES_1024 + +DECAPSKEYBYTES_512 :: INDCPA_SECRETKEYBYTES_512 + INDCPA_PUBLICKEYBYTES_512 + 2 * SYMBYTES +DECAPSKEYBYTES_768 :: INDCPA_SECRETKEYBYTES_768 + INDCPA_PUBLICKEYBYTES_768 + 2 * SYMBYTES +DECAPSKEYBYTES_1024 :: INDCPA_SECRETKEYBYTES_1024 + INDCPA_PUBLICKEYBYTES_1024 + 2 * SYMBYTES + +CIPHERTEXTBYTES_512 :: INDCPA_BYTES_512 +CIPHERTEXTBYTES_768 :: INDCPA_BYTES_768 +CIPHERTEXTBYTES_1024 :: INDCPA_BYTES_1024 +CIPHERTEXTBYTES_MAX :: INDCPA_BYTES_1024 diff --git a/core/crypto/_mlkem/k_pke.odin b/core/crypto/_mlkem/k_pke.odin new file mode 100644 index 000000000..d8b87ad7a --- /dev/null +++ b/core/crypto/_mlkem/k_pke.odin @@ -0,0 +1,349 @@ +#+private +package _mlkem + +import "core:crypto" +import "core:crypto/shake" + +@(require_results) +pack_pk :: proc "contextless" (r: []byte, pk: ^Polyvec, seed: []byte, k: int) -> bool { + pk_len := polyvec_byte_size(k) + switch { + case pk_len == 0: + return false + case len(seed) != SYMBYTES || len(r) != pk_len + SYMBYTES: + return false + } + + polyvec_tobytes(r[:pk_len], pk, k) + copy(r[pk_len:], seed) + + return true +} + +@(require_results) +unpack_pk :: proc "contextless" (pk: ^Polyvec, seed, packedpk: []byte) -> bool { + pk_len := len(packedpk) - SYMBYTES + k: int + switch { + case pk_len == POLYVECBYTES_512: + k = K_512 + case pk_len == POLYVECBYTES_768: + k = K_768 + case pk_len == POLYVECBYTES_1024: + k = K_1024 + case len(packedpk) - pk_len != SYMBYTES: + return false + case len(seed) != SYMBYTES: + return false + } + if k == 0 { + return false + } + + ok := polyvec_frombytes(pk, packedpk[:pk_len], k) + copy(seed, packedpk[pk_len:]) + + return ok +} + +@(require_results) +pack_sk :: proc "contextless" (r: []byte, sk: ^Polyvec, k: int) -> bool { + r_len := len(r) + if r_len == 0 || r_len != polyvec_byte_size(k) { + return false + } + + polyvec_tobytes(r, sk, k) + + return true +} + +@(require_results) +unpack_sk :: proc "contextless" (sk: ^Polyvec, packedsk: []byte) -> bool { + k: int + switch len(packedsk) { + case POLYVECBYTES_512: + k = K_512 + case POLYVECBYTES_768: + k = K_768 + case POLYVECBYTES_1024: + k = K_1024 + case: + return false + } + if k == 0 { + return false + } + + return polyvec_frombytes(sk, packedsk, k) +} + +@(require_results) +pack_ciphertext :: proc "contextless" (r: []byte, b: ^Polyvec, v: ^Poly, k: int) -> bool { + b_len := polyvec_compressed_byte_size(k) + if len(r) != b_len + poly_compressed_bytes(k) { + return false + } + + polyvec_compress(r[:b_len], b, k) + poly_compress(r[b_len:], v) + + return true +} + +@(require_results) +unpack_ciphertext :: proc "contextless" (b: ^Polyvec, v: ^Poly, c: []byte) -> int { + b_len: int + k: int + switch len(c) { + case INDCPA_BYTES_512: + b_len = POLYVECCOMPRESSEDBYTES_512 + k = K_512 + case INDCPA_BYTES_768: + b_len = POLYVECCOMPRESSEDBYTES_768 + k = K_768 + case INDCPA_BYTES_1024: + b_len = POLYVECCOMPRESSEDBYTES_1024 + k = K_1024 + case: + return 0 + } + + polyvec_decompress(b, c[:b_len], k) + poly_decompress(v, c[b_len:]) + + return k +} + +@(require_results) +rej_uniform :: proc "contextless" (r: []i16, buf: []byte) -> int { + r_len, b_len := len(r), len(buf) + + ctr, pos: int + for ctr < r_len && pos + 3 <= b_len { + val0 := (u16(buf[pos+0] >> 0) | (u16(buf[pos+1]) << 8)) & 0xFFF + val1 := (u16(buf[pos+1] >> 4) | (u16(buf[pos+2]) << 4)) & 0xFFF + pos += 3 + + if val0 < Q { + r[ctr] = i16(val0) + ctr += 1 + } + if(ctr < r_len && val1 < Q) { + r[ctr] = i16(val1) + ctr += 1 + } + } + + return ctr +} + +gen_matrix :: proc(a: []Polyvec, seed: []byte, transposed: bool, k: int) { + GEN_MATRIX_NBLOCKS :: ((12*N/8*(1 << 12)/Q + XOF_BLOCKBYTES)/XOF_BLOCKBYTES) + + buf: [GEN_MATRIX_NBLOCKS*XOF_BLOCKBYTES]byte = --- + ctx: shake.Context = --- + ctr: int + + defer shake.reset(&ctx) + defer crypto.zero_explicit(&buf, size_of(buf)) + + for i in 0.. bool { + ensure(len(m) == INDCPA_MSGBYTES, "crypto/mlkem: invalid K-PKE m") + ensure(len(r) == SYMBYTES, "crypto/mlkem: invalid K-PKE r") + + k := ek.k + + at_: [K_MAX]Polyvec = --- + sp, ep, b: Polyvec = ---, ---, --- + kay, epp, v: Poly = ---, ---, --- + defer crypto.zero_explicit(&at_, size_of(Polyvec) * k) + defer polyvec_clear(&sp, &ep, &b) + defer poly_clear(&kay, &epp, &v) + + poly_frommsg(&kay, m) + + at := at_[:k] + + gen_matrix(at, ek.p[:], true, k) + + n := byte(0) + for i in 0.. bool { + if len(plaintext) != INDCPA_MSGBYTES { + return false + } + + k := dk.k + + b: Polyvec = --- + v, mp: Poly = ---, --- + defer poly_clear(&v, &mp) + + if unpack_ciphertext(&b, &v, c) != k { + return false + } + + polyvec_ntt(&b, k) + polyvec_basemul_acc_montgomery(&mp, &dk.pv, &b, k) + poly_invntt_tomont(&mp) + + poly_sub(&mp, &v, &mp) + poly_reduce(&mp) + + poly_tomsg(plaintext, &mp) + + return true +} diff --git a/core/crypto/_mlkem/kem_internal.odin b/core/crypto/_mlkem/kem_internal.odin new file mode 100644 index 000000000..b50aa4b58 --- /dev/null +++ b/core/crypto/_mlkem/kem_internal.odin @@ -0,0 +1,195 @@ +package _mlkem + +import "core:crypto" +import subtle "core:crypto/_subtle" + +// This implementation is derived from the PQ-CRYSTALS reference +// implementation [[ https://github.com/pq-crystals/kyber ]], +// primarily for licensing reasons. Arguably mlkem-native is +// a more "up to date" codebase, but the changes to the +// ref code is minor and they slapped an attribution-required +// license on something that was originally CC-0/Apache 2.0. + +// "Private Key" +Decapsulation_Key :: struct { + pke_dk: K_PKE_Decryption_Key, + ek: Encapsulation_Key, + seed: [SYMBYTES*2]byte, // (d, z) +} + +// "Public Key" +Encapsulation_Key :: struct { + pke_ek: K_PKE_Encryption_Key, + raw_bytes: [INDCPA_PUBLICKEYBYTES_MAX]byte, + h: [SYMBYTES]byte, +} + +decapsulation_key_expanded_bytes :: proc( + dk: ^Decapsulation_Key, + dst: []byte, +) { + sk := &dk.pke_dk + pv_len := polyvec_byte_size(sk.k) + ek_len := pv_len + SYMBYTES + + ek_bytes := dk.ek.raw_bytes[:ek_len] + + dst := dst + _ = pack_sk(dst[:pv_len], &sk.pv, sk.k) + + dst = dst[pv_len:] + copy(dst, ek_bytes) + dst = dst[ek_len:] + hash_h(dst[:SYMBYTES], ek_bytes) + dst = dst[SYMBYTES:] + copy(dst, dk.seed[SYMBYTES:]) +} + +@(require_results) +encapsulation_key_set_bytes :: proc( + ek: ^Encapsulation_Key, + k: int, + b: []byte, +) -> bool { + k_len: int + switch k { + case K_512: + k_len = ENCAPSKEYBYTES_512 + case K_768: + k_len = ENCAPSKEYBYTES_768 + case K_1024: + k_len = ENCAPSKEYBYTES_1024 + case: + return false + } + if len(b) != k_len { + return false + } + + pke_ek := &ek.pke_ek + ok := unpack_pk(&pke_ek.pv, pke_ek.p[:], b) + pke_ek.k = k + copy(ek.raw_bytes[:k_len], b) + hash_h(ek.h[:], b) + + // FIPS 203 unlike Kyber requires canonical encoding of + // encapsulation keys (Section 7,2), which is checked in + // unpack_pk. + + if !ok { + crypto.zero_explicit(ek, size_of(Encapsulation_Key)) + } + + return ok +} + +encapsulation_key_set_decaps :: proc(ek: ^Encapsulation_Key, dk: ^Decapsulation_Key) { + dk_ek := &dk.ek.pke_ek + ensure(dk_ek.k == K_512 || dk_ek.k == K_768 || dk_ek.k == K_1024, "crypto/mlkem: invalid decaps k") + + k_pke_encryption_key_set(&ek.pke_ek, dk_ek) + copy(ek.raw_bytes[:], dk.ek.raw_bytes[:]) + copy(ek.h[:], dk.ek.h[:]) +} + +// NIST's version of this also returns an encapsulation key, but our +// internal representation includes it as part of the decapsulation key +// in a more traditional "keypair" approach. +kem_keygen_internal :: proc( + dk: ^Decapsulation_Key, + seed: []byte, // (d, z) + k: int, +) { + ensure(len(seed) == 2 * SYMBYTES, "crypto/mlkem: invalid seed") + + dk_ek := &dk.ek + d, z := seed[:SYMBYTES], seed[SYMBYTES:] + + k_pke_keygen(&dk_ek.pke_ek, &dk.pke_dk, d, k) + + ek_len := polyvec_byte_size(k) + SYMBYTES + ek_bytes := dk_ek.raw_bytes[:ek_len] + ensure( + pack_pk(ek_bytes, &dk_ek.pke_ek.pv, dk_ek.pke_ek.p[:], k), + "crypto/mlkem: failed to pack K-PKE ek", + ) + hash_h(dk_ek.h[:], ek_bytes) + copy(dk.seed[:SYMBYTES], d) + copy(dk.seed[SYMBYTES:], z) +} + +// The `_internal` "de-randomized" versions of ML-KEM.Encaps and +// ML-KEM.Decaps are only ever to be called by the actual non-interal +// implementation or test cases. + +kem_encaps_internal :: proc( + shared_secret: []byte, + ciphertext: []byte, + ek: ^Encapsulation_Key, + randomness: []byte, +) { + ensure(len(shared_secret) == SYMBYTES, "crypto/mlkem: invalid K") + ensure(len(randomness) == SYMBYTES, "crypto/mlkem: invalid m") + ensure( + len(ciphertext) == ct_len_for_k(ek.pke_ek.k), + "crypto/mlkem: invalid ciphertext length", + ) + + buf: [2*SYMBYTES]byte = --- + defer crypto.zero_explicit(&buf, size_of(buf)) + + hash_g(buf[:], randomness, ek.h[:]) + + // Can't fail, ciphertext length is valid. + _ = k_pke_encrypt(ciphertext, &ek.pke_ek, randomness, buf[SYMBYTES:]) + + copy(shared_secret, buf[:SYMBYTES]) +} + +kem_decaps_internal :: proc( + shared_secret: []byte, + dk: ^Decapsulation_Key, + ciphertext: []byte, +) { + ct_len := ct_len_for_k(dk.pke_dk.k) + ensure( + len(ciphertext) == ct_len, + "crypto/mlkem: invalid ciphertext length", + ) + + m_: [SYMBYTES]byte + defer crypto.zero_explicit(&m_, size_of(m_)) + + // Can't fail, ciphertext length is valid. + _ = k_pke_decrypt(m_[:], &dk.pke_dk, ciphertext) + + buf: [2*SYMBYTES]byte = --- + defer crypto.zero_explicit(&buf, size_of(buf)) + + ek := &dk.ek + hash_g(buf[:], m_[:], ek.h[:]) + + rkprf(shared_secret, dk.seed[SYMBYTES:], ciphertext) + + ct_buf: [CIPHERTEXTBYTES_MAX]byte = --- + defer crypto.zero_explicit(&ct_buf, size_of(ct_buf)) + ct_ := ct_buf[:ct_len] + _ = k_pke_encrypt(ct_, &ek.pke_ek, m_[:], buf[SYMBYTES:]) + + ok := crypto.compare_constant_time(ciphertext, ct_) + subtle.cmov_bytes(shared_secret, buf[:SYMBYTES], ok) +} + +@(private="file") +ct_len_for_k :: proc(k: int) -> int { + switch k { + case K_512: + return CIPHERTEXTBYTES_512 + case K_768: + return CIPHERTEXTBYTES_768 + case K_1024: + return CIPHERTEXTBYTES_1024 + case: + panic("crypto/mlkem: invalid k for ciphertext length") + } +} diff --git a/core/crypto/_mlkem/ntt.odin b/core/crypto/_mlkem/ntt.odin new file mode 100644 index 000000000..c99c73487 --- /dev/null +++ b/core/crypto/_mlkem/ntt.odin @@ -0,0 +1,75 @@ +#+private +package _mlkem + +@(rodata) +ZETAS := [128]i16 { + -1044, -758, -359, -1517, 1493, 1422, 287, 202, + -171, 622, 1577, 182, 962, -1202, -1474, 1468, + 573, -1325, 264, 383, -829, 1458, -1602, -130, + -681, 1017, 732, 608, -1542, 411, -205, -1571, + 1223, 652, -552, 1015, -1293, 1491, -282, -1544, + 516, -8, -320, -666, -1618, -1162, 126, 1469, + -853, -90, -271, 830, 107, -1421, -247, -951, + -398, 961, -1508, -725, 448, -1065, 677, -1275, + -1103, 430, 555, 843, -1251, 871, 1550, 105, + 422, 587, 177, -235, -291, -460, 1574, 1653, + -246, 778, 1159, -147, -777, 1483, -602, 1119, + -1590, 644, -872, 349, 418, 329, -156, -75, + 817, 1097, 603, 610, 1322, -1285, -1465, 384, + -1215, -136, 1218, -1335, -874, 220, -1187, -1659, + -1185, -1530, -1278, 794, -1510, -854, -870, 478, + -108, -308, 996, 991, 958, -1460, 1522, 1628, +} + +@(require_results) +fqmul :: #force_inline proc "contextless" (a, b: i16) -> i16 { + return montgomery_reduce(i32(a) * i32(b)) +} + +ntt :: proc "contextless" (r: ^[N]i16) #no_bounds_check { + j, k := 0, 1 + for l := 128; l >= 2; l >>= 1 { + for start := 0; start < N; start = j + l { + zeta := ZETAS[k] + k += 1 + for j = start; j < start + l; j += 1 { + t := fqmul(zeta, r[j+l]) + r[j+l] = r[j] - t + r[j] = r[j] + t + } + } + } +} + +invntt :: proc "contextless" (r: ^[N]i16) #no_bounds_check { + F : i16 : 1441 // mont^2/128 + + j, k := 0, 127 + for l := 2; l <= 128; l <<= 1 { + for start := 0; start < 256; start = j+l { + zeta := ZETAS[k] + k -= 1 + for j = start; j < start + l; j += 1 { + t := r[j] + r[j] = barrett_reduce(t + r[j+l]) + r[j+l] = r[j+l] - t + r[j+l] = fqmul(zeta, r[j+l]) + } + } + } + + for v, i in r { + r[i] = fqmul(v, F) + } +} + +@(require_results) +base_case_multiply :: proc "contextless" (a_0, a_1, b_0, b_1, zeta: i16) -> (i16, i16) { + r_0 := fqmul(a_1, b_1) + r_0 = fqmul(r_0, zeta) + r_0 += fqmul(a_0, b_0) + r_1 := fqmul(a_0, b_1) + r_1 += fqmul(a_1, b_0) + + return r_0, r_1 +} diff --git a/core/crypto/_mlkem/poly.odin b/core/crypto/_mlkem/poly.odin new file mode 100644 index 000000000..4a79e9770 --- /dev/null +++ b/core/crypto/_mlkem/poly.odin @@ -0,0 +1,241 @@ +#+private +package _mlkem + +import "core:crypto" +import subtle "core:crypto/_subtle" + +// Elements of R_q = Z_q[X]/(X^n + 1). Represents polynomial +// coeffs[0] + X*coeffs[1] + X^2*coeffs[2] + ... + X^{n-1}*coeffs[n-1] +Poly :: struct { + coeffs: [N]i16, +} + +poly_compress :: proc "contextless" (r: []byte, a: ^Poly) #no_bounds_check { + t: [8]byte = --- + defer crypto.zero_explicit(&t, size_of(t)) + + r := r + switch len(r) { + case POLYCOMPRESSEDBYTES_768: // Also covers _512 + for i in 0..> 15) & Q + // t[j] = ((((uint16_t)u << 4) + Q/2)/Q) & 15 + d0 := u32(u) << 4 + d0 += 1665 + d0 *= 80635 + d0 >>= 28 + t[j] = byte(d0) & 0xf + } + + r[0] = t[0] | (t[1] << 4) + r[1] = t[2] | (t[3] << 4) + r[2] = t[4] | (t[5] << 4) + r[3] = t[6] | (t[7] << 4) + r = r[4:] + } + case POLYCOMPRESSEDBYTES_1024: + for i in 0..> 15) & Q + // t[j] = ((((uint16_t)u << 5) + Q/2)/Q) & 31 + d0 := u32(u) << 5 + d0 += 1664 + d0 *= 40318 + d0 >>= 27 + t[j] = byte(d0) & 0x1f + } + + r[0] = (t[0] >> 0) | (t[1] << 5) + r[1] = (t[1] >> 3) | (t[2] << 2) | (t[3] << 7) + r[2] = (t[3] >> 1) | (t[4] << 4) + r[3] = (t[4] >> 4) | (t[5] << 1) | (t[6] << 6) + r[4] = (t[6] >> 2) | (t[7] << 3) + r = r[5:] + } + case: + panic_contextless("crypto/mlkem: invalid POLYCOMPRESSEDBYTES") + } +} + +poly_decompress :: proc "contextless" (r: ^Poly, a: []byte) { + a := a + switch len(a) { + case POLYCOMPRESSEDBYTES_768: // Also covers _512 + for i in 0..> 4) + r.coeffs[2*i+1] = i16(((u16(a[0] >> 4) * Q) + 8) >> 4) + a = a[1:] + } + case POLYCOMPRESSEDBYTES_1024: + t: [8]byte = --- + defer crypto.zero_explicit(&t, size_of(t)) + + for i in 0..> 0) + t[1] = (a[0] >> 5) | (a[1] << 3) + t[2] = (a[1] >> 2) + t[3] = (a[1] >> 7) | (a[2] << 1) + t[4] = (a[2] >> 4) | (a[3] << 4) + t[5] = (a[3] >> 1) + t[6] = (a[3] >> 6) | (a[4] << 2) + t[7] = (a[4] >> 3) + a = a[5:] + + for j in 0..<8 { + r.coeffs[8*i+j] = i16((u32(t[j] & 31) * Q + 16) >> 5) + } + } + case: + panic_contextless("crypto/mlkem: invalid POLYCOMPRESSEDBYTES") + } +} + +poly_tobytes :: proc "contextless" (r: []byte, a: ^Poly) #no_bounds_check { + ensure_contextless(len(r) >= POLYBYTES) + + for i in 0..> 15) & Q) + t1 := u16(a.coeffs[2*i+1]) + t1 += u16((i16(t1) >> 15) & Q) + r[3*i+0] = byte(t0 >> 0) + r[3*i+1] = byte(t0 >> 8) | byte(t1 << 4) + r[3*i+2] = byte(t1 >> 4) + } +} + +@(require_results) +poly_frombytes :: proc "contextless" (r: ^Poly, a: []byte) -> bool #no_bounds_check { + ensure_contextless(len(a) >= POLYBYTES) + + ok := true + for i in 0..> 0) | (u16(a[3*i+1]) << 8)) & 0xFFF) + r.coeffs[2*i+1] = i16(((u16(a[3*i+1]) >> 4) | (u16(a[3*i+2]) << 4)) & 0xFFF) + ok &= r.coeffs[2*i] < Q && r.coeffs[2*i+1] < Q + } + + return ok +} + +poly_frommsg :: proc "contextless" (r: ^Poly, msg: []byte) #no_bounds_check { + #assert(INDCPA_MSGBYTES == N/8) + ensure_contextless(len(msg) == INDCPA_MSGBYTES) + + for i in 0..> uint(j))&1) + } + } +} + +poly_tomsg :: proc "contextless" (msg: []byte, a: ^Poly) #no_bounds_check { + ensure_contextless(len(msg) == INDCPA_MSGBYTES) + + for i in 0..> 15) & Q + // t = (((t << 1) + Q/2)/Q) & 1 + t <<= 1 + t += 1665 + t *= 80635 + t >>= 28 + t &= 1 + msg[i] |= byte(t << j) + } + } +} + +poly_getnoise_eta1_512 :: proc(r: ^Poly, seed: []byte, iv: byte) { + buf: [ETA1_512*N/4]byte = --- + defer crypto.zero_explicit(&buf, size_of(buf)) + + prf(buf[:], seed, iv) + poly_cbd_eta1_512(r, &buf) +} + +poly_getnoise_eta1 :: proc(r: ^Poly, seed: []byte, iv: byte) { + buf: [ETA1*N/4]byte = --- + defer crypto.zero_explicit(&buf, size_of(buf)) + + prf(buf[:], seed, iv) + poly_cbd_eta1(r, &buf) +} + +poly_getnoise_eta2 :: proc(r: ^Poly, seed: []byte, iv: byte) { + buf: [ETA2*N/4]byte = --- + defer crypto.zero_explicit(&buf, size_of(buf)) + + prf(buf[:], seed, iv) + poly_cbd_eta2(r, &buf) +} + +poly_ntt :: proc "contextless" (r: ^Poly) { + ntt(&r.coeffs) + poly_reduce(r) +} + +poly_invntt_tomont :: proc "contextless" (r: ^Poly) { + invntt(&r.coeffs) +} + +poly_basemul_montgomery :: proc "contextless" (r, a, b: ^Poly) #no_bounds_check { + for i in 0.. int { + switch k { + case K_512: + return POLYCOMPRESSEDBYTES_512 + case K_768: + return POLYCOMPRESSEDBYTES_768 + case K_1024: + return POLYCOMPRESSEDBYTES_1024 + case: + panic_contextless("crypto/mlkem: invalid k") + } +} diff --git a/core/crypto/_mlkem/polyvec.odin b/core/crypto/_mlkem/polyvec.odin new file mode 100644 index 000000000..387acade8 --- /dev/null +++ b/core/crypto/_mlkem/polyvec.odin @@ -0,0 +1,224 @@ +#+private +package _mlkem + +import "core:crypto" + +Polyvec :: struct { + vec: [K_MAX]Poly, +} + +polyvec_compress :: proc "contextless" (r: []byte, a: ^Polyvec, kay: int) #no_bounds_check { + d0: u64 + + r := r + switch len(r) { + case POLYVECCOMPRESSEDBYTES_512, POLYVECCOMPRESSEDBYTES_768: + ensure_contextless(kay == K_512 || kay == K_768) + + t: [4]u16 = --- + defer crypto.zero_explicit(&t, size_of(t)) + + for i in 0..> 15) & Q) + // t[k] = ((((uint32_t)t[k] << 10) + Q/2)/Q) & 0x3ff + d0 = u64(t[k]) + d0 <<= 10 + d0 += 1665 + d0 *= 1290167 + d0 >>= 32 + t[k] = u16(d0 & 0x3ff) + } + + r[0] = byte(t[0] >> 0) + r[1] = byte((t[0] >> 8) | (t[1] << 2)) + r[2] = byte((t[1] >> 6) | (t[2] << 4)) + r[3] = byte((t[2] >> 4) | (t[3] << 6)) + r[4] = byte(t[3] >> 2) + r = r[5:] + } + } + case POLYVECCOMPRESSEDBYTES_1024: + ensure_contextless(kay == K_1024) + + t: [8]u16 = --- + defer crypto.zero_explicit(&t, size_of(t)) + + for i in 0..> 15) & Q) + // t[k] = ((((uint32_t)t[k] << 11) + Q/2)/Q) & 0x7ff + d0 = u64(t[k]) + d0 <<= 11 + d0 += 1664 + d0 *= 645084 + d0 >>= 31 + t[k] = u16(d0 & 0x7ff) + } + + r[0] = byte(t[0] >> 0) + r[1] = byte((t[0] >> 8) | (t[1] << 3)) + r[2] = byte((t[1] >> 5) | (t[2] << 6)) + r[3] = byte(t[2] >> 2) + r[4] = byte((t[2] >> 10) | (t[3] << 1)) + r[5] = byte((t[3] >> 7) | (t[4] << 4)) + r[6] = byte((t[4] >> 4) | (t[5] << 7)) + r[7] = byte(t[5] >> 1) + r[8] = byte((t[5] >> 9) | (t[6] << 2)) + r[9] = byte((t[6] >> 6) | (t[7] << 5)) + r[10] = byte(t[7] >> 3) + r = r[11:] + } + } + case: + panic_contextless("crypto/mlkem: invalid POLYVECCOMPRESSEDBYTES") + } +} + +polyvec_decompress :: proc "contextless" (r: ^Polyvec, a: []byte, kay: int) #no_bounds_check { + a := a + switch len(a) { + case POLYVECCOMPRESSEDBYTES_512, POLYVECCOMPRESSEDBYTES_768: + ensure_contextless(kay == K_512 || kay == K_768) + + t: [4]u16 = --- + defer crypto.zero_explicit(&t, size_of(t)) + + for i in 0..> 0) | (u16(a[1]) << 8) + t[1] = u16(a[1] >> 2) | (u16(a[2]) << 6) + t[2] = u16(a[2] >> 4) | (u16(a[3]) << 4) + t[3] = u16(a[3] >> 6) | (u16(a[4]) << 2) + a = a[5:] + + for k in 0..<4 { + r.vec[i].coeffs[4*j+k] = i16((u32(t[k] & 0x3FF) * Q + 512) >> 10) + } + } + } + case POLYVECCOMPRESSEDBYTES_1024: + t: [8]u16 = --- + defer crypto.zero_explicit(&t, size_of(t)) + + for i in 0..> 0) | (u16(a[1]) << 8) + t[1] = u16(a[1] >> 3) | (u16(a[2]) << 5) + t[2] = u16(a[2] >> 6) | (u16(a[3]) << 2) | (u16(a[4]) << 10) + t[3] = u16(a[4] >> 1) | (u16(a[5]) << 7) + t[4] = u16(a[5] >> 4) | (u16(a[6]) << 4) + t[5] = u16(a[6] >> 7) | (u16(a[7]) << 1) | (u16(a[8]) << 9) + t[6] = u16(a[8] >> 2) | (u16(a[9]) << 6) + t[7] = u16(a[9] >> 5) | (u16(a[10]) << 3) + a = a[11:] + + for k in 0..<8 { + r.vec[i].coeffs[8*j+k] = i16((u32(t[k] & 0x7FF) * Q + 1024) >> 11) + } + } + } + case: + panic_contextless("crypto/mlkem: invalid POLYVECCOMPRESSEDBYTES") + } +} + +polyvec_tobytes :: proc "contextless" (r: []byte, a: ^Polyvec, k: int) #no_bounds_check { + ensure_contextless(len(r) == k * POLYBYTES, "crypto/mlkem: invalid buffer") + + r := r + for i in 0.. bool #no_bounds_check { + switch k { + case K_512, K_768, K_1024: + case: + panic_contextless("crypto/mlkem: invalid POLYVECBYTES") + } + ensure_contextless(len(a) == k * POLYBYTES, "crypto/mlkem: invalid buffer") + + a := a + ok := true + for i in 0.. int { + switch k { + case K_512, K_768, K_1024: + return k * POLYBYTES + case: + return 0 + } +} + +@(require_results) +polyvec_compressed_byte_size :: #force_inline proc "contextless" (k: int) -> int { + switch k { + case K_512: + return POLYVECCOMPRESSEDBYTES_512 + case K_768: + return POLYVECCOMPRESSEDBYTES_768 + case K_1024: + return POLYVECCOMPRESSEDBYTES_1024 + case: + return 0 + } +} + +polyvec_ntt :: proc "contextless" (r: ^Polyvec, k: int) { + for i in 0.. i16 { + QINV :: -3327 // q^-1 mod 2^16 + + t := i16(a) * QINV + return i16((a - i32(t) * Q) >> 16) +} + +@(require_results) +barrett_reduce :: #force_inline proc "contextless" (a: i16) -> i16 { + V : i16 : ((1<<26) + Q / 2) / Q + + t := i16((i32(V)*i32(a) + (1<<25)) >> 26) + t *= Q + return a - t +} diff --git a/core/crypto/_mlkem/symmetric_shake.odin b/core/crypto/_mlkem/symmetric_shake.odin new file mode 100644 index 000000000..bf851f6f6 --- /dev/null +++ b/core/crypto/_mlkem/symmetric_shake.odin @@ -0,0 +1,61 @@ +#+private +package _mlkem + +import "core:crypto" +import "core:crypto/_sha3" +import "core:crypto/sha3" +import "core:crypto/shake" + +XOF_BLOCKBYTES :: _sha3.RATE_128 +#assert(XOF_BLOCKBYTES % 3 == 0) + +prf :: proc(out, key: []byte, iv: byte) { + ctx: shake.Context = --- + defer shake.reset(&ctx) + + shake.init_256(&ctx) + shake.write(&ctx, key) + shake.write(&ctx, []byte{iv}) + shake.read(&ctx, out) +} + +rkprf :: proc(out, key, input: []byte) { + ctx: shake.Context = --- + defer shake.reset(&ctx) + + shake.init_256(&ctx) + shake.write(&ctx, key) + shake.write(&ctx, input) + shake.read(&ctx, out) +} + +xof_absorb :: proc(ctx: ^shake.Context, seed: []byte, x, y: byte) { + shake.init_128(ctx) + + extseed: [SYMBYTES+2]byte = --- + defer crypto.zero_explicit(&extseed, size_of(extseed)) + + copy(extseed[:], seed) + extseed[SYMBYTES+0] = x + extseed[SYMBYTES+1] = y + + shake.write(ctx, extseed[:]) +} + +hash_h :: proc(dst, src: []byte) { + ctx: sha3.Context = --- + + sha3.init_256(&ctx) + sha3.update(&ctx, src) + sha3.final(&ctx, dst) +} + +hash_g :: proc(dst: []byte, srcs: ..[]byte) { + ctx: sha3.Context = --- + + sha3.init_512(&ctx) + for src in srcs { + sha3.update(&ctx, src) + } + sha3.final(&ctx, dst) +} diff --git a/core/crypto/_subtle/subtle.odin b/core/crypto/_subtle/subtle.odin index 454066e4a..01c84cf2a 100644 --- a/core/crypto/_subtle/subtle.odin +++ b/core/crypto/_subtle/subtle.odin @@ -3,6 +3,7 @@ Various useful bit operations in constant time. */ package _subtle +import "core:crypto/_fiat" import "core:math/bits" // byte_eq returns 1 if and only if (⟺) a == b, 0 otherwise. @@ -40,3 +41,41 @@ u64_is_non_zero :: proc "contextless" (a: u64) -> u64 { is_zero := u64_is_zero(a) return (~is_zero) & 1 } + +@(optimization_mode="none") +cmov_bytes :: proc "contextless" (dst, src: []byte, ctrl: int) { + s_len := len(src) + ensure_contextless(s_len == len(dst), "crypto: cmov length mismatch") + + c := -(byte)(ctrl) + for i in 0.. i16 { + c := -(u16)(ctrl) + return a ~ i16(c & u16(a ~ b)) +} + +@(optimization_mode="none") +csel_u16 :: proc "contextless" (a, b: u16, ctrl: int) -> u16 { + c := -(u16)(ctrl) + return a ~ (c & (a ~ b)) +} + +csel_u32 :: proc "contextless" (a, b: u32, ctrl: int) -> u32 { + return _fiat.cmovznz_u32(_fiat.u1(ctrl), a, b) +} + +csel_u64 :: proc "contextless" (a, b: u64, ctrl: int) -> u64 { + return _fiat.cmovznz_u64(_fiat.u1(ctrl), a, b) +} + +csel :: proc { + csel_i16, + csel_u16, + csel_u32, + csel_u64, +} diff --git a/core/crypto/mlkem/api.odin b/core/crypto/mlkem/api.odin new file mode 100644 index 000000000..9c8fd6a2b --- /dev/null +++ b/core/crypto/mlkem/api.odin @@ -0,0 +1,268 @@ +package mlkem + +import "core:crypto" +import "core:crypto/_mlkem" + +// Parameters are the supported ML-KEM parameter sets. +Parameters :: enum { + Invalid, + ML_KEM_512, + ML_KEM_768, + ML_KEM_1024, +} + +// DECAPSULATION_KEY_SEED_SIZE is the size of a Decapsulation key in bytes. +DECAPSULATION_KEY_SEED_SIZE :: 64 // (d, z) in NIST terms. + +// DECAPSULATION_KEY_EXPANDED_SIZES are the per-parameter sizes of the +// decapsulation key in bytes. +DECAPSULATION_KEY_EXPANDED_SIZES := [Parameters]int { + .Invalid = 0, + .ML_KEM_512 = _mlkem.DECAPSKEYBYTES_512, // 1632-bytes + .ML_KEM_768 = _mlkem.DECAPSKEYBYTES_768, // 2400-bytes + .ML_KEM_1024 = _mlkem.DECAPSKEYBYTES_1024, // 3168-bytes +} + +// ENCAPSULATION_KEY_SIZES are the per-parameter sizes of the encapsulation +// key in bytes. +ENCAPSULATION_KEY_SIZES := [Parameters]int { + .Invalid = 0, + .ML_KEM_512 = _mlkem.ENCAPSKEYBYTES_512, // 800-bytes + .ML_KEM_768 = _mlkem.ENCAPSKEYBYTES_768, // 1184-bytes + .ML_KEM_1024 = _mlkem.ENCAPSKEYBYTES_1024, // 1568-bytes +} + +// CIPHERTEXT_SIZES are the per-parameter set sizes of the ciphertext +// in bytes. +CIPHERTEXT_SIZES := [Parameters]int { + .Invalid = 0, + .ML_KEM_512 = _mlkem.CIPHERTEXTBYTES_512, // 768-bytes + .ML_KEM_768 = _mlkem.CIPHERTEXTBYTES_768, // 1088-bytes + .ML_KEM_1024 = _mlkem.CIPHERTEXTBYTES_1024, // 1568-bytes +} + +// SHARED_SECRET_SIZE is the size of the final shared secret in bytes. +SHARED_SECRET_SIZE :: 32 + +// Decapsulation_Key is a ML-KEM decapsulation (aka "private") key. +// This implementation opts to include the encapsulation (aka "public") +// key as well for cases where the decapsulation key is reused (eg: HPKE +// with X-Wing). +Decapsulation_Key :: _mlkem.Decapsulation_Key + +// Encapsulation_Key is a ML-KEM encapsulation (aka "public") key. +Encapsulation_Key :: _mlkem.Encapsulation_Key + +// decapsulation_key_generate uses the system entropy source to generate +// a decapsulation key. This will only fail if and only if (⟺) the system +// entropy source is missing or broken. +@(require_results) +decapsulation_key_generate :: proc(dk: ^Decapsulation_Key, params: Parameters) -> bool { + decapsulation_key_clear(dk) + + if !crypto.HAS_RAND_BYTES { + return false + } + + k := params_to_k(params) + if k == 0 { + panic("crypto/mlkem: invalid parameter set") + } + + seed: [DECAPSULATION_KEY_SEED_SIZE]byte = --- + defer crypto.zero_explicit(&seed, size_of(seed)) + + crypto.rand_bytes(seed[:]) + _mlkem.kem_keygen_internal(dk, seed[:], k) + + return true +} + +// decapsulation_key_set_bytes decodes a byte-encoded decapsulation key +// in (d, z) "seed" format, and returns true if and only if (⟺) the +// operation was successful. +@(require_results) +decapsulation_key_set_bytes :: proc(dk: ^Decapsulation_Key, params: Parameters, seed: []byte) -> bool { + k := params_to_k(params) + if k == 0 { + return false + } + if len(seed) != DECAPSULATION_KEY_SEED_SIZE { + return false + } + + _mlkem.kem_keygen_internal(dk, seed, k) + + return true +} + +// decapsulation_key_bytes sets dst to byte-encoding of dk in the (d, z) +// "seed" format. +decapsulation_key_bytes :: proc(dk: ^Decapsulation_Key, dst: []byte) { + ensure(dk.pke_dk.k != 0, "crypto/mlkem: uninitialized Decapsulation_Key") + ensure(len(dst) == DECAPSULATION_KEY_SEED_SIZE, "crypto/mlkem: invalid destination size") + + copy(dst, dk.seed[:]) +} + +// decapsulation_key_expanded_bytes sets dst to the byte-encoding of dk. +// in the expanded FIPS 203 format. This primarily exists for export +// purposes. +decapsulation_key_expanded_bytes :: proc(dk: ^Decapsulation_Key, dst: []byte) { + dk_len: int + switch dk.pke_dk.k { + case _mlkem.K_512: + dk_len = DECAPSULATION_KEY_EXPANDED_SIZES[.ML_KEM_512] + case _mlkem.K_768: + dk_len = DECAPSULATION_KEY_EXPANDED_SIZES[.ML_KEM_768] + case _mlkem.K_1024: + dk_len = DECAPSULATION_KEY_EXPANDED_SIZES[.ML_KEM_1024] + case: + panic("crypto/mlkem: uninitialized Decapsulation_Key") + } + ensure(len(dst) == dk_len, "crypto/mlkem: invalid destination size") + + _mlkem.decapsulation_key_expanded_bytes(dk, dst) +} + +// decapsulation_key_encaps_bytes sets dst to the byte-encoding of the +// encasulation key corresponding to dk. +decapsulation_key_encaps_bytes :: proc(dk: ^Decapsulation_Key, dst: []byte) { + encapsulation_key_bytes(&dk.ek, dst) +} + +// decapsulation_key_clear clears dk to the uninitialized state. +decapsulation_key_clear :: proc(dk: ^Decapsulation_Key) { + crypto.zero_explicit(dk, size_of(Decapsulation_Key)) +} + +// encapsulation_key_set_bytes decodes a byte-encoded encapsulation key, +// and returns true if and only if (⟺) the operation was successful. +@(require_results) +encapsulation_key_set_bytes :: proc(ek: ^Encapsulation_Key, params: Parameters, b: []byte) -> bool { + k := params_to_k(params) + if k == 0 { + return false + } + if len(b) != ENCAPSULATION_KEY_SIZES[params] { + return false + } + + return _mlkem.encapsulation_key_set_bytes(ek, k, b) +} + +// encapsulation_key_set_decaps sets ek to the encapsulation key corresponding +// to dk. +encapsulation_key_set_decaps :: proc(ek: ^Encapsulation_Key, dk: ^Decapsulation_Key) { + ensure(dk.pke_dk.k != 0, "crypto/mlkem: uninitialized Decapsulation_Key") + _mlkem.encapsulation_key_set_decaps(ek, dk) +} + +// encapsulation_key_encaps_bytes sets dst to the byte-encoding of ek. +encapsulation_key_bytes :: proc(ek: ^Encapsulation_Key, dst: []byte) { + ensure(ek.pke_ek.k != 0, "crypto/mlkem: uninitialized Encapsulation_Key") + + k_len: int + switch ek.pke_ek.k { + case _mlkem.K_512: + k_len = ENCAPSULATION_KEY_SIZES[.ML_KEM_512] + case _mlkem.K_768: + k_len = ENCAPSULATION_KEY_SIZES[.ML_KEM_768] + case _mlkem.K_1024: + k_len = ENCAPSULATION_KEY_SIZES[.ML_KEM_1024] + case: + panic("crypto/mlkem: invalid destination size") + } + + copy(dst, ek.raw_bytes[:k_len]) +} + +// encapsulation_key_clear clears ek to the uninitialized state. +encapsulation_key_clear :: proc(ek: ^Encapsulation_Key) { + crypto.zero_explicit(ek, size_of(Encapsulation_Key)) +} + +// encaps_raw_ek_bytes uses the byte encoded encapsulation key to generate +// a shared secret and an associated ciphertext. This routine will fail +// if the system entropy source is unavailable, or of the encapsulation key +// is invalid. +@(require_results) +encaps_ek_raw_bytes :: proc(params: Parameters, raw_ek, shared_secret, ciphertext: []byte) -> bool { + ek: Encapsulation_Key = --- + if !encapsulation_key_set_bytes(&ek, params, raw_ek) { + return false + } + defer encapsulation_key_clear(&ek) + + return encaps_ek(&ek, shared_secret, ciphertext) +} + +// encaps_ek uses the encapsulation key to generate a shared secret and an +// associated ciphertext. This routine will fail if the system entropy source +// is unavailable. +@(require_results) +encaps_ek :: proc(ek: ^Encapsulation_Key, shared_secret, ciphertext: []byte) -> bool { + ensure(len(shared_secret) == SHARED_SECRET_SIZE, "crypto/mlkem: invalid shared_seret size") + + if !crypto.HAS_RAND_BYTES { + return false + } + + m: [_mlkem.SYMBYTES]byte = --- + defer crypto.zero_explicit(&m, size_of(m)) + + crypto.rand_bytes(m[:]) + _mlkem.kem_encaps_internal(shared_secret, ciphertext, ek, m[:]) + + return true +} + +encaps :: proc { + encaps_ek, + encaps_ek_raw_bytes, +} + +// decaps uses the decapsulation key to generate a shared secret from a +// ciphertext. Due to ML-KEM's implicit rejection mechanism, this function +// will only return false if and only if (⟺) the lengths of the inputs +// are invalid or the decapsulation key is uninitialized. +// +// This routine returning true does not guarantee that the shared secret +// matches that generated by the peer. +@(require_results) +decaps :: proc(dk: ^Decapsulation_Key, ciphertext, shared_secret: []byte) -> bool { + ensure(len(shared_secret) == SHARED_SECRET_SIZE, "crypto/mlkem: invalid shared_seret size") + + ct_len: int + switch dk.pke_dk.k { + case _mlkem.K_512: + ct_len = CIPHERTEXT_SIZES[.ML_KEM_512] + case _mlkem.K_768: + ct_len = CIPHERTEXT_SIZES[.ML_KEM_768] + case _mlkem.K_1024: + ct_len = CIPHERTEXT_SIZES[.ML_KEM_1024] + case: + return false + } + if len(ciphertext) != ct_len { + return false + } + + _mlkem.kem_decaps_internal(shared_secret, dk, ciphertext) + + return true +} + +@(private="file") +params_to_k :: #force_inline proc "contextless" (params: Parameters) -> int { + #partial switch params { + case .ML_KEM_512: + return _mlkem.K_512 + case .ML_KEM_768: + return _mlkem.K_768 + case .ML_KEM_1024: + return _mlkem.K_1024 + } + + return 0 +} diff --git a/core/crypto/mlkem/doc.odin b/core/crypto/mlkem/doc.odin new file mode 100644 index 000000000..ec32def25 --- /dev/null +++ b/core/crypto/mlkem/doc.odin @@ -0,0 +1,7 @@ +/* +ML-KEM Module-Lattice-Based Key-Encapsulation Mechanism. + +See: +- [[ https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.203.pdf ]] +*/ +package mlkem diff --git a/examples/all/all_js.odin b/examples/all/all_js.odin index 74cdb5fd3..f557cecdb 100644 --- a/examples/all/all_js.odin +++ b/examples/all/all_js.odin @@ -43,6 +43,7 @@ package all @(require) import "core:crypto/legacy/keccak" @(require) import "core:crypto/legacy/md5" @(require) import "core:crypto/legacy/sha1" +@(require) import "core:crypto/mlkem" @(require) import cnoise "core:crypto/noise" @(require) import "core:crypto/pbkdf2" @(require) import "core:crypto/poly1305" diff --git a/examples/all/all_main.odin b/examples/all/all_main.odin index 973ee423e..5565d225d 100644 --- a/examples/all/all_main.odin +++ b/examples/all/all_main.odin @@ -48,6 +48,7 @@ package all @(require) import "core:crypto/legacy/keccak" @(require) import "core:crypto/legacy/md5" @(require) import "core:crypto/legacy/sha1" +@(require) import "core:crypto/mlkem" @(require) import cnoise "core:crypto/noise" @(require) import "core:crypto/pbkdf2" @(require) import "core:crypto/poly1305" diff --git a/tests/benchmark/crypto/benchmark_pqc.odin b/tests/benchmark/crypto/benchmark_pqc.odin new file mode 100644 index 000000000..314594ca5 --- /dev/null +++ b/tests/benchmark/crypto/benchmark_pqc.odin @@ -0,0 +1,84 @@ +package benchmark_core_crypto + +import "core:log" +import "core:testing" +import "core:text/table" +import "core:time" + +import "core:crypto" +import "core:crypto/mlkem" + +@(private = "file") +MLKEM_ITERS :: 50000 + +@(test) +benchmark_crypto_mlkem :: proc(t: ^testing.T) { + if !crypto.HAS_RAND_BYTES { + log.warnf("ML-KEM benchmarks skipped, no system entropy source") + } + + tbl: table.Table + table.init(&tbl) + defer table.destroy(&tbl) + + table.caption(&tbl, "ML-KEM") + table.aligned_header_of_values(&tbl, .Right, "Parameters", "Keygen", "Encaps", "Decaps") + + append_tbl := proc(tbl: ^table.Table, algo_name: string, keygen, encaps, decaps: time.Duration) { + table.aligned_row_of_values( + tbl, + .Right, + algo_name, + table.format(tbl, "%8M", keygen), + table.format(tbl, "%8M", encaps), + table.format(tbl, "%8M", decaps), + ) + } + + for params in mlkem.Parameters { + if params == .Invalid { + continue + } + param_name := MLKEM_PARAMS_NAMES[params] + + decaps_key: mlkem.Decapsulation_Key + start := time.tick_now() + for _ in 0 ..< MLKEM_ITERS { + _ = mlkem.decapsulation_key_generate(&decaps_key, params) + } + keygen := time.tick_since(start) / MLKEM_ITERS + + encaps_key := make([]byte, mlkem.ENCAPSULATION_KEY_SIZES[params]) + defer delete(encaps_key) + ciphertext := make([]byte, mlkem.CIPHERTEXT_SIZES[params]) + defer delete(ciphertext) + + mlkem.decapsulation_key_encaps_bytes(&decaps_key, encaps_key) + + bob_shared: [mlkem.SHARED_SECRET_SIZE]byte + start = time.tick_now() + for _ in 0 ..< MLKEM_ITERS { + _ = mlkem.encaps(params, encaps_key, bob_shared[:], ciphertext) + } + encaps := time.tick_since(start) / MLKEM_ITERS + + alice_shared: [mlkem.SHARED_SECRET_SIZE]byte + start = time.tick_now() + for _ in 0 ..< MLKEM_ITERS { + _ = mlkem.decaps(&decaps_key, ciphertext, alice_shared[:]) + } + decaps := time.tick_since(start) / MLKEM_ITERS + + append_tbl(&tbl, param_name, keygen, encaps, decaps) + } + + log_table(&tbl) +} + +@(private="file") +MLKEM_PARAMS_NAMES := [mlkem.Parameters]string { + .Invalid = "invalid", + .ML_KEM_512 = "ML-KEM-512", + .ML_KEM_768 = "ML-KEM-768", + .ML_KEM_1024 = "ML-KEM-1024", +} diff --git a/tests/core/crypto/test_core_crypto_pqc.odin b/tests/core/crypto/test_core_crypto_pqc.odin new file mode 100644 index 000000000..8359053e4 --- /dev/null +++ b/tests/core/crypto/test_core_crypto_pqc.odin @@ -0,0 +1,72 @@ +package test_core_crypto + +import "core:bytes" +import "core:log" +import "core:testing" + +import "core:crypto" +import "core:crypto/mlkem" + +@(test) +test_mlkem :: proc(t: ^testing.T) { + if !crypto.HAS_RAND_BYTES { + log.info("rand_bytes not supported - skipping") + return + } + + // Test vectors are huge, and are covered by the wycheproof corpus, + // so just test a full key exchange with all supported parameter + // sets. + for params in mlkem.Parameters { + if params == .Invalid { + continue + } + + // Alice + decaps_key: mlkem.Decapsulation_Key + if !testing.expectf( + t, + mlkem.decapsulation_key_generate(&decaps_key, params), + "%v: decapsulation_key_generate", + params, + ) { + continue + } + defer mlkem.decapsulation_key_clear(&decaps_key) + + ek_bytes := make([]byte, mlkem.ENCAPSULATION_KEY_SIZES[params]) + defer delete(ek_bytes) + mlkem.decapsulation_key_encaps_bytes(&decaps_key, ek_bytes) + + // Bob + bob_shared_secret: [mlkem.SHARED_SECRET_SIZE]byte + ciphertext := make([]byte, mlkem.CIPHERTEXT_SIZES[params]) + defer delete(ciphertext) + if !testing.expectf( + t, + mlkem.encaps(params, ek_bytes, bob_shared_secret[:], ciphertext), + "%v: encaps", + params, + ) { + continue + } + + // Alice + alice_shared_secret: [mlkem.SHARED_SECRET_SIZE]byte + if !testing.expectf( + t, + mlkem.decaps(&decaps_key, ciphertext, alice_shared_secret[:]), + "%v: decaps", + params, + ) { + continue + } + + testing.expectf( + t, + bytes.equal(alice_shared_secret[:], bob_shared_secret[:]), + "%v: shared secret mismatch", + params, + ) + } +} diff --git a/tests/core/crypto/wycheproof/main.odin b/tests/core/crypto/wycheproof/main.odin index dfdc78267..654ac2a38 100644 --- a/tests/core/crypto/wycheproof/main.odin +++ b/tests/core/crypto/wycheproof/main.odin @@ -35,6 +35,16 @@ import "core:testing" // - crypto/kmac // - kmac128_no_customization_test.json // - kmac256_no_customization_test.json +// - crypto/mlkem +// - mlkem_512_keygen_seed_test.json +// - mlkem_512_encaps_test.json +// - mlkem_512_test.json +// - mlkem_768_keygen_seed_test.json +// - mlkem_768_encaps_test.json +// - mlkem_768_test.json +// - mlkem_1024_keygen_seed_test.json +// - mlkem_1024_encaps_test.json +// - mlkem_1024_test.json // - crypto/pbkdf2 // - pbkdf2_hmacsha1_test.json // - pbkdf2_hmacsha224_test.json diff --git a/tests/core/crypto/wycheproof/pqc.odin b/tests/core/crypto/wycheproof/pqc.odin new file mode 100644 index 000000000..210d7be1d --- /dev/null +++ b/tests/core/crypto/wycheproof/pqc.odin @@ -0,0 +1,401 @@ +package test_wycheproof + +import "core:encoding/hex" +import "core:log" +import "core:mem" +import "core:os" +import "core:testing" + +import "core:crypto/_mlkem" +import "core:crypto/mlkem" + +import "../common" + +@(test) +test_mlkem :: proc(t: ^testing.T) { + arena: mem.Arena + arena_backing := make([]byte, ARENA_SIZE) + defer delete(arena_backing) + mem.arena_init(&arena, arena_backing) + context.allocator = mem.arena_allocator(&arena) + + log.debug("mlkem: starting") + + files_keygen := []string { + "mlkem_512_keygen_seed_test.json", + "mlkem_768_keygen_seed_test.json", + "mlkem_1024_keygen_seed_test.json", + } + for f in files_keygen { + mem.free_all() + + fn, _ := os.join_path([]string{BASE_PATH, f}, context.allocator) + + test_vectors: Test_Vectors(Kem_Test_Group) + load_ok := load(&test_vectors, fn) + if !testing.expectf(t, load_ok, "Unable to load {}", f) { + continue + } + + testing.expectf(t, test_mlkem_keygen(t, &test_vectors), "ML-KEM KeyGen failed") + } + + files_encaps := []string { + "mlkem_512_encaps_test.json", + "mlkem_768_encaps_test.json", + "mlkem_1024_encaps_test.json", + } + for f in files_encaps { + mem.free_all() + + fn, _ := os.join_path([]string{BASE_PATH, f}, context.allocator) + + test_vectors: Test_Vectors(Kem_Test_Group) + load_ok := load(&test_vectors, fn) + if !testing.expectf(t, load_ok, "Unable to load {}", f) { + continue + } + + testing.expectf(t, test_mlkem_encaps(t, &test_vectors), "ML-KEM Encaps failed") + } + + files_decaps := []string { + "mlkem_512_test.json", + "mlkem_768_test.json", + "mlkem_1024_test.json", + } + for f in files_decaps { + mem.free_all() + + fn, _ := os.join_path([]string{BASE_PATH, f}, context.allocator) + + test_vectors: Test_Vectors(Kem_Test_Group) + load_ok := load(&test_vectors, fn) + if !testing.expectf(t, load_ok, "Unable to load {}", f) { + continue + } + + testing.expectf(t, test_mlkem_decaps(t, &test_vectors), "ML-KEM Decaps failed") + } +} + +test_mlkem_keygen :: proc(t: ^testing.T, test_vectors: ^Test_Vectors(Kem_Test_Group)) -> bool { + params_str := test_vectors.test_groups[0].parameter_set + params := parameter_set_to_params(params_str) + if params == .Invalid { + return false + } + + log.debugf("%s: KeyGen starting", params_str) + + num_ran, num_passed, num_failed, num_skipped: int + for &test_group, tg_id in test_vectors.test_groups { + for &test_vector in test_group.tests { + num_ran += 1 + + seed := common.hexbytes_decode(test_vector.seed) + + dk: mlkem.Decapsulation_Key + if !testing.expectf( + t, + mlkem.decapsulation_key_set_bytes(&dk, params, seed), + "%s/KeyGen/%d/%d: failed to set decapsulation key from seed", + params_str, + tg_id, + test_vector.tc_id, + test_vector.seed, + ) { + num_failed *= 1 + continue + } + + ek_bytes := make([]byte, mlkem.ENCAPSULATION_KEY_SIZES[params]) + mlkem.decapsulation_key_encaps_bytes(&dk, ek_bytes) + + ok := common.hexbytes_compare(test_vector.ek, ek_bytes) + if !result_check(test_vector.result, ok) { + x := transmute(string)(hex.encode(ek_bytes)) + log.errorf( + "%s/KeyGen/%d/%d: ek: expected %s actual %s", + params_str, + tg_id, + test_vector.tc_id, + test_vector.ek, + x, + ) + num_failed += 1 + continue + } + + dk_bytes := make([]byte, mlkem.DECAPSULATION_KEY_EXPANDED_SIZES[params]) + mlkem.decapsulation_key_expanded_bytes(&dk, dk_bytes) + + ok = common.hexbytes_compare(test_vector.dk, dk_bytes) + if !result_check(test_vector.result, ok) { + x := transmute(string)(hex.encode(dk_bytes)) + log.errorf( + "%s/KeyGen/%d/%d: dk: expected %s actual %s", + tg_id, + params_str, + test_vector.tc_id, + test_vector.dk, + x, + ) + num_failed += 1 + continue + } + + seed_bytes: [mlkem.DECAPSULATION_KEY_SEED_SIZE]byte + mlkem.decapsulation_key_bytes(&dk, seed_bytes[:]) + + ok = common.hexbytes_compare(test_vector.seed, seed_bytes[:]) + if !result_check(test_vector.result, ok) { + x := transmute(string)(hex.encode(seed_bytes[:])) + log.errorf( + "%s/KeyGen/%d/%d: seed: expected %s actual %s", + tg_id, + params_str, + test_vector.tc_id, + test_vector.seed, + x, + ) + num_failed += 1 + continue + } + + num_passed += 1 + } + } + + assert(num_ran == test_vectors.number_of_tests) + assert(num_passed + num_failed + num_skipped == num_ran) + + log.infof( + "%s/KeyGen: ran %d, passed %d, failed %d, skipped %d", + params_str, + num_ran, + num_passed, + num_failed, + num_skipped, + ) + + return num_failed == 0 +} + +test_mlkem_encaps :: proc(t: ^testing.T, test_vectors: ^Test_Vectors(Kem_Test_Group)) -> bool { + params_str := test_vectors.test_groups[0].parameter_set + params := parameter_set_to_params(params_str) + if params == .Invalid { + return false + } + + log.debugf("%s: Encaps starting", params_str) + + num_ran, num_passed, num_failed, num_skipped: int + for &test_group, tg_id in test_vectors.test_groups { + for &test_vector in test_group.tests { + num_ran += 1 + + ek: mlkem.Encapsulation_Key + ok := mlkem.encapsulation_key_set_bytes( + &ek, + params, + common.hexbytes_decode(test_vector.ek), + ) + + // The current corpus can only fail if the encapsulation key + // is malformed in some way. + if !result_check(test_vector.result, ok) { + log.errorf( + "%s/Encaps/%d/%d: unexpected set encapsulation key from bytes: %s (%v != %v)", + params_str, + tg_id, + test_vector.tc_id, + test_vector.ek, + test_vector.result, + ok, + ) + num_failed += 1 + continue + } + if !ok { + num_passed += 1 + continue + } + + shared_secret: [mlkem.SHARED_SECRET_SIZE]byte + ciphertext := make([]byte, mlkem.CIPHERTEXT_SIZES[params]) + + _mlkem.kem_encaps_internal( + shared_secret[:], + ciphertext, + &ek, + common.hexbytes_decode(test_vector.m), + ) + + ok = common.hexbytes_compare(test_vector.c, ciphertext) + if !ok { + x := transmute(string)(hex.encode(ciphertext)) + log.errorf( + "%s/Encaps/%d/%d: ciphertext: expected: %s actual: %s", + params_str, + tg_id, + test_vector.tc_id, + test_vector.c, + x, + ) + num_failed += 1 + continue + } + + ok = common.hexbytes_compare(test_vector.k, shared_secret[:]) + if !ok { + x := transmute(string)(hex.encode(shared_secret[:])) + log.errorf( + "%s/Encaps/%d/%d: shared_secret: expected: %s actual: %s", + params_str, + tg_id, + test_vector.tc_id, + test_vector.k, + x, + ) + num_failed += 1 + continue + } + + num_passed += 1 + } + } + + assert(num_ran == test_vectors.number_of_tests) + assert(num_passed + num_failed + num_skipped == num_ran) + + log.infof( + "%s/Encaps: ran %d, passed %d, failed %d, skipped %d", + params_str, + num_ran, + num_passed, + num_failed, + num_skipped, + ) + + return num_failed == 0 +} + +test_mlkem_decaps :: proc(t: ^testing.T, test_vectors: ^Test_Vectors(Kem_Test_Group)) -> bool { + params_str := test_vectors.test_groups[0].parameter_set + params := parameter_set_to_params(params_str) + if params == .Invalid { + return false + } + + log.debugf("%s: Decaps starting", params_str) + + num_ran, num_passed, num_failed, num_skipped: int + for &test_group, tg_id in test_vectors.test_groups { + for &test_vector in test_group.tests { + num_ran += 1 + + // We do not have an API for decaps with raw seed. + seed := common.hexbytes_decode(test_vector.seed) + switch len(seed) { + case mlkem.DECAPSULATION_KEY_SEED_SIZE: + case: + if testing.expectf( + t, + result_is_invalid(test_vector.result), + "%s/Decaps/%d/%d: test vector expects success with invalid seed", + params_str, + tg_id, + test_vector.tc_id, + ) { + num_passed += 1 + } else { + num_failed += 1 + } + continue + } + + dk: mlkem.Decapsulation_Key + if !testing.expectf( + t, + mlkem.decapsulation_key_set_bytes(&dk, params, seed), + "%s/Decaps/%d/%d: failed to set decapsulation key from seed", + params_str, + tg_id, + test_vector.tc_id, + test_vector.seed, + ) { + num_failed *= 1 + continue + } + + shared_secret: [mlkem.SHARED_SECRET_SIZE]byte + + ok := mlkem.decaps( + &dk, + common.hexbytes_decode(test_vector.c), + shared_secret[:], + ) + if !result_check(test_vector.result, ok) { + log.errorf( + "%s/Decaps/%d/%d: unexpected decapsulation failure", + params_str, + tg_id, + test_vector.tc_id, + ) + num_failed += 1 + continue + } + if !ok { + num_passed += 1 + continue + } + + ok = common.hexbytes_compare(test_vector.k, shared_secret[:]) + if !ok { + x := transmute(string)(hex.encode(shared_secret[:])) + log.errorf( + "%s/Decaps/%d/%d: shared_secret: expected: %s actual: %s", + params_str, + tg_id, + test_vector.tc_id, + test_vector.k, + x, + ) + num_failed += 1 + continue + } + + num_passed += 1 + } + } + + assert(num_ran == test_vectors.number_of_tests) + assert(num_passed + num_failed + num_skipped == num_ran) + + log.infof( + "%s/Decaps: ran %d, passed %d, failed %d, skipped %d", + params_str, + num_ran, + num_passed, + num_failed, + num_skipped, + ) + + return num_failed == 0 +} + +@(require_results, private="file") +parameter_set_to_params :: proc(s: string) -> mlkem.Parameters { + switch s { + case "ML-KEM-512": + return .ML_KEM_512 + case "ML-KEM-768": + return .ML_KEM_768 + case "ML-KEM-1024": + return .ML_KEM_1024 + case: + return .Invalid + } +} diff --git a/tests/core/crypto/wycheproof/schemas.odin b/tests/core/crypto/wycheproof/schemas.odin index 645f0f085..d801207a0 100644 --- a/tests/core/crypto/wycheproof/schemas.odin +++ b/tests/core/crypto/wycheproof/schemas.odin @@ -64,6 +64,11 @@ Test_Vectors_Note :: struct { links: []string `json:"links"`, } +Test_Group_Source :: struct { + name: string `json:"name"`, + version: string `json:"version"`, +} + Aead_Test_Group :: struct { iv_size: int `json:"ivSize"`, key_size: int `json:"keySize"`, @@ -198,3 +203,23 @@ Pbkdf_Test_Vector :: struct { result: Result `json:"result"`, flags: []string `json:"flags"`, } + +Kem_Test_Group :: struct { + type: string `json:"type"`, + source: Test_Group_Source `json:"source"`, + parameter_set: string `json:"parameterSet"`, + tests: []Kem_Test_Vector `json:"tests"`, +} + +Kem_Test_Vector :: struct { + tc_id: int `json:"tcId"`, + flags: []string `json:"flags"`, + comment: string `json:"comment"`, + seed: common.Hex_Bytes `json:"seed"`, + m: common.Hex_Bytes `json:"m"`, + ek: common.Hex_Bytes `json:"ek"`, + dk: common.Hex_Bytes `json:"dk"`, + c: common.Hex_Bytes `json:"c"`, + k: common.Hex_Bytes `json:"K"`, + result: Result `json:"result"`, +} From f8410b1b6d62d59c0ab842353a40153f0a420532 Mon Sep 17 00:00:00 2001 From: David Bader <65665893+BunterSchatten@users.noreply.github.com> Date: Wed, 6 May 2026 17:09:03 +0200 Subject: [PATCH 026/228] Add /src as safe directory for nightly linux arm workflow --- .github/workflows/nightly.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index cdf1e0be2..ff6253d1c 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -101,6 +101,7 @@ jobs: musl-dev llvm20-dev clang20 git mold lz4 \ libxml2-static llvm20-static zlib-static zstd-static \ make && + git config --global --add safe.directory /src && ./ci/build_linux_static.sh ' - name: Odin run From 450e6917b2fc87dc2d719aad4b94e4b3583a1614 Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Wed, 6 May 2026 20:57:19 +0200 Subject: [PATCH 027/228] use context.assertion_failure_proc in tracking allocator bad free callback --- core/mem/tracking_allocator.odin | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/mem/tracking_allocator.odin b/core/mem/tracking_allocator.odin index 01080075e..d6462faf1 100644 --- a/core/mem/tracking_allocator.odin +++ b/core/mem/tracking_allocator.odin @@ -130,11 +130,11 @@ the tracking allocator to the old behavior, where the bad_free_array was used. */ @(no_sanitize_address) tracking_allocator_bad_free_callback_panic :: proc(t: ^Tracking_Allocator, memory: rawptr, location: runtime.Source_Code_Location) { - runtime.print_caller_location(location) - runtime.print_string(" Tracking allocator error: Bad free of pointer ") - runtime.print_uintptr(uintptr(memory)) - runtime.print_string("\n") - runtime.trap() + buf: [256]byte + offset := 0 + _ = runtime.write_string(&offset, buf[:], "Tracking allocator error: Bad free of pointer ") + _ = runtime.write_u64(&offset, buf[:], u64(uintptr(memory))) + panic(string(buf[:offset]), loc = location) } /* From f8c7225047db7ecb5a1a3d4a9fddf610c3175ce5 Mon Sep 17 00:00:00 2001 From: Gaia <83567777+mothfuzz@users.noreply.github.com> Date: Wed, 6 May 2026 23:26:11 -0500 Subject: [PATCH 028/228] Fix naming for wgpuTextureGetDepthOrArrayLayers in wgpu.js Fix wgpuTextureDepthOrArrayLayers -> wgpuTextureGetDepthOrArrayLayers to match definition in wgpu.odin --- vendor/wgpu/wgpu.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/wgpu/wgpu.js b/vendor/wgpu/wgpu.js index d916de26d..671b4a258 100644 --- a/vendor/wgpu/wgpu.js +++ b/vendor/wgpu/wgpu.js @@ -3308,7 +3308,7 @@ class WebGPUInterface { * @param {number} textureIdx * @returns {number} */ - wgpuTextureDepthOrArrayLayers: (textureIdx) => { + wgpuTextureGetDepthOrArrayLayers: (textureIdx) => { const texture = this.textures.get(textureIdx); return texture.depthOrArrayLayers; }, From e9cf5fdc3a860a247fe95d9beb520a1e40998e5b Mon Sep 17 00:00:00 2001 From: Deserted999 Date: Fri, 8 May 2026 15:01:11 +0300 Subject: [PATCH 029/228] Add DefSubclassProc binding --- core/sys/windows/comctl32.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/core/sys/windows/comctl32.odin b/core/sys/windows/comctl32.odin index 28fab53be..fee8d76c5 100644 --- a/core/sys/windows/comctl32.odin +++ b/core/sys/windows/comctl32.odin @@ -8,6 +8,7 @@ foreign Comctl32 { InitCommonControlsEx :: proc(picce: ^INITCOMMONCONTROLSEX) -> BOOL --- LoadIconWithScaleDown :: proc(hinst: HINSTANCE, pszName: PCWSTR, cx: c_int, cy: c_int, phico: ^HICON) -> HRESULT --- SetWindowSubclass :: proc(hwnd: HWND, pfnSubclass: SUBCLASSPROC, uIdSubclass: UINT_PTR, dwRefData: DWORD_PTR) --- + DefSubclassProc :: proc(hwnd: HWND, msg: UINT, wparam: WPARAM, lparam: LPARAM) -> LRESULT --- } ICC_LISTVIEW_CLASSES :: 0x00000001 From 95cd01e32d87446a51e5798c0f17a85f807ff505 Mon Sep 17 00:00:00 2001 From: Deserted999 Date: Fri, 8 May 2026 16:02:19 +0300 Subject: [PATCH 030/228] fix alignment --- core/sys/windows/comctl32.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sys/windows/comctl32.odin b/core/sys/windows/comctl32.odin index fee8d76c5..678c91531 100644 --- a/core/sys/windows/comctl32.odin +++ b/core/sys/windows/comctl32.odin @@ -8,7 +8,7 @@ foreign Comctl32 { InitCommonControlsEx :: proc(picce: ^INITCOMMONCONTROLSEX) -> BOOL --- LoadIconWithScaleDown :: proc(hinst: HINSTANCE, pszName: PCWSTR, cx: c_int, cy: c_int, phico: ^HICON) -> HRESULT --- SetWindowSubclass :: proc(hwnd: HWND, pfnSubclass: SUBCLASSPROC, uIdSubclass: UINT_PTR, dwRefData: DWORD_PTR) --- - DefSubclassProc :: proc(hwnd: HWND, msg: UINT, wparam: WPARAM, lparam: LPARAM) -> LRESULT --- + DefSubclassProc :: proc(hwnd: HWND, msg: UINT, wparam: WPARAM, lparam: LPARAM) -> LRESULT --- } ICC_LISTVIEW_CLASSES :: 0x00000001 From daa6bb1aee91bea4c081827634efa6d83315d34d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 8 May 2026 14:34:44 +0100 Subject: [PATCH 031/228] Fix `check_multi_expr_with_type_hint` to use `return` rather than `break` --- src/check_expr.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index b81052590..676cdbe9f 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -1140,6 +1140,11 @@ gb_internal void check_assignment(CheckerContext *c, Operand *operand, Type *typ return; } + if (operand->mode == Addressing_Type && is_type_typeid(type)) { + add_type_info_type(c, operand->type); + add_type_and_value(c, operand->expr, Addressing_Value, type, exact_value_typeid(operand->type)); + return; + } if (is_type_untyped(operand->type)) { Type *target_type = type; @@ -9122,9 +9127,11 @@ gb_internal bool check_is_operand_compound_lit_constant(CheckerContext *c, Opera if (is_type_any(field_type)) { return false; } - if (field_type != nullptr && is_type_typeid(field_type) && o->mode == Addressing_Type) { - add_type_info_type(c, o->type); - return true; + if (field_type != nullptr && is_type_typeid(field_type)) { + if (o->mode == Addressing_Type) { + add_type_info_type(c, o->type); + return true; + } } Ast *expr = unparen_expr(o->expr); @@ -10584,6 +10591,7 @@ gb_internal ExprKind check_compound_literal(CheckerContext *c, Operand *o, Ast * } + i64 max = 0; Type *bet = base_type(elem_type); @@ -12483,7 +12491,7 @@ gb_internal void check_multi_expr_with_type_hint(CheckerContext *c, Operand *o, case Addressing_Type: if (type_hint != nullptr && is_type_typeid(type_hint)) { add_type_info_type(c, o->type); - break; + return; } error_operand_not_expression(o); break; From d005ba677cde88481b305f7a23f83fcc3ff5a15c Mon Sep 17 00:00:00 2001 From: Kay Date: Sat, 9 May 2026 04:08:27 -0500 Subject: [PATCH 032/228] retrigger checks From ebd50de56c19bfadd14313999897ec69373f4049 Mon Sep 17 00:00:00 2001 From: Abderrahim Indjaren Date: Sat, 9 May 2026 23:07:50 +0100 Subject: [PATCH 033/228] fix: no more deferred_return in generic parapoly type name fix: segfault on accessing empty tags array in docs writer --- src/check_type.cpp | 4 +++- src/docs_writer.cpp | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/check_type.cpp b/src/check_type.cpp index a0a4bc1f2..f84644ea1 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -2476,7 +2476,9 @@ gb_internal Type *check_get_results(CheckerContext *ctx, Scope *scope, Ast *_res param_value = handle_parameter_value(ctx, nullptr, &type, default_value, false); } else { if (ctx->allow_polymorphic_types && ast_references_poly_params(ctx->scope, field->type)) { - type = alloc_type_generic(ctx->scope, 0, string_interner_insert(str_lit("$deferred_return")), nullptr); + gbString name = expr_to_string(field->type); + type = alloc_type_generic(ctx->scope, 0, string_interner_insert(make_string_c(name)), nullptr); + gb_string_free(name); } else { type = check_type(ctx, field->type); } diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index a9f3a3e15..e0b0a05c1 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -670,8 +670,10 @@ gb_internal OdinDocTypeIndex odin_doc_type(OdinDocWriter *w, Type *type, bool ca auto tags = array_make(heap_allocator(), type->Struct.fields.count); defer (array_free(&tags)); - for_array(i, type->Struct.fields) { - tags[i] = odin_doc_write_string(w, type->Struct.tags[i]); + if (type->Struct.tags != nullptr) { + for_array(i, type->Struct.fields) { + tags[i] = odin_doc_write_string(w, type->Struct.tags[i]); + } } doc_type.tags = odin_write_slice(w, tags.data, tags.count); From 87d58b9fb77de00c7221049f3e4edcb6902b5536 Mon Sep 17 00:00:00 2001 From: Brad Lewis <22850972+BradLewis@users.noreply.github.com> Date: Sun, 10 May 2026 16:17:39 +1000 Subject: [PATCH 034/228] Handle invalid utf8 when parsing json --- core/encoding/json/parser.odin | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/encoding/json/parser.odin b/core/encoding/json/parser.odin index cd6518955..58a47d308 100644 --- a/core/encoding/json/parser.odin +++ b/core/encoding/json/parser.odin @@ -474,7 +474,10 @@ unquote_string :: proc(token: Token, spec: Specification, allocator := context.a i += width buf, buf_width := utf8.encode_rune(r) - assert(buf_width <= width) + // If we have an invalid utf8 character, width can be smaller than the width of RUNE_ERROR + if r != utf8.RUNE_ERROR { + assert(buf_width <= width) + } copy(b[w:], buf[:buf_width]) w += buf_width } From 7954e3bdbe98c812e816a9a7a5c42628a38c5260 Mon Sep 17 00:00:00 2001 From: Abderrahim Indjaren Date: Sun, 10 May 2026 15:48:32 +0100 Subject: [PATCH 035/228] add: cap dynamic array is now handled in write_expr_to_string --- src/check_expr.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index b81052590..fa93f0a57 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -12914,6 +12914,15 @@ gb_internal gbString write_expr_to_string(gbString str, Ast *node, bool shorthan str = write_expr_to_string(str, at->elem, shorthand); case_end; + case_ast_node(at, FixedCapacityDynamicArrayType, node); + if (at->tag) { + str = write_expr_to_string(str, at->tag, false); + } + str = gb_string_appendc(str, "[dynamic; "); + str = write_expr_to_string(str, at->capacity, false); + str = gb_string_append_rune(str, ']'); + str = write_expr_to_string(str, at->elem, shorthand); + case_end; case_ast_node(at, DynamicArrayType, node); if (at->tag) { str = write_expr_to_string(str, at->tag, false); From d2fafbb2513ca6d9872d6d9e249b36f762a85463 Mon Sep 17 00:00:00 2001 From: Nicolas Maier <20108526+MaierN@users.noreply.github.com> Date: Sun, 10 May 2026 17:20:22 +0200 Subject: [PATCH 036/228] fix: handle allocator errors in os.read_entire_file_from_file --- core/os/file_util.odin | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/os/file_util.odin b/core/os/file_util.odin index 854977b01..94e1a5841 100644 --- a/core/os/file_util.odin +++ b/core/os/file_util.odin @@ -216,18 +216,18 @@ read_entire_file_from_file :: proc(f: ^File, allocator: runtime.Allocator, loc : return } else { buffer: [1024]u8 - out_buffer := make([dynamic]u8, 0, 0, allocator, loc) - total := 0 + out_buffer := make([dynamic]u8, 0, 0, allocator, loc) or_return for { n: int n, err = read(f, buffer[:]) - total += n - append_elems(&out_buffer, ..buffer[:n], loc=loc) or_return + if _, aerr := append_elems(&out_buffer, ..buffer[:n], loc=loc); aerr != nil { + return out_buffer[:], aerr + } if err != nil { if err == .EOF || err == .Broken_Pipe { err = nil } - data = out_buffer[:total] + data = out_buffer[:] return } } From 539ea7a003cd8b507e9da73cb352827f73699dce Mon Sep 17 00:00:00 2001 From: JoltedJon <14169426+JoltedJon@users.noreply.github.com> Date: Sun, 10 May 2026 17:41:19 -0400 Subject: [PATCH 037/228] =?UTF-8?q?Add=20unicode=20mapping=20between=20'?= =?UTF-8?q?=E1=BA=9E'=20<->=20'=C3=9F'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/unicode/tables.odin | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/unicode/tables.odin b/core/unicode/tables.odin index c0b3fe434..abbf9189b 100644 --- a/core/unicode/tables.odin +++ b/core/unicode/tables.odin @@ -540,6 +540,7 @@ to_upper_ranges := [?]i32{ @(rodata) to_upper_singlets := [?]i32{ + 0x00df, 8115, 0x00ff, 621, 0x0101, 499, 0x0103, 499, @@ -1204,6 +1205,7 @@ to_lower_singlets := [?]i32{ 0x1e90, 501, 0x1e92, 501, 0x1e94, 501, + 0x1e9e, -7115, 0x1ea0, 501, 0x1ea2, 501, 0x1ea4, 501, From 65ff188c1ca9d50265221ed792937359b40ce0ac Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 11 May 2026 11:16:27 +0100 Subject: [PATCH 038/228] Add optimization edge case for square mat * mat --- src/llvm_backend_expr.cpp | 119 +++++++++++++++++++++++++++++++++-- src/llvm_backend_utility.cpp | 9 +++ 2 files changed, 122 insertions(+), 6 deletions(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 22530831b..598ab6d21 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -976,15 +976,122 @@ gb_internal lbValue lb_emit_matrix_mul(lbProcedure *p, lbValue lhs, lbValue rhs, unsigned outer_columns = cast(unsigned)yt->Matrix.column_count; if (!xt->Matrix.is_row_major && lb_is_matrix_simdable(xt)) { + + // if (LLVMIsALoadInst(lhs.value) && LLVMIsALoadInst(rhs.value)) { + // auto do_u32 = [](lbProcedure *p, u32 val) -> LLVMValueRef { + // return LLVMConstInt(lb_type(p->module, t_u32), val, false); + // }; + + // LLVMValueRef llvm_stride = do_u32(p, inner); + // LLVMValueRef llvm_false = LLVMConstInt(lb_type(p->module, t_llvm_bool), false, false); + + // LLVMValueRef lhs_args[] = {LLVMGetOperand(lhs.value, 0), llvm_stride, llvm_false, do_u32(p, outer_rows), do_u32(p, inner)}; + // LLVMValueRef rhs_args[] = {LLVMGetOperand(rhs.value, 0), llvm_stride, llvm_false, do_u32(p, inner), do_u32(p, outer_columns)}; + // LLVMTypeRef types[] = {lb_type(p->module, elem)}; + + // LLVMValueRef lhs_loaded = lb_call_intrinsic(p, "llvm.matrix.column.major.load", lhs_args, gb_count_of(lhs_args), types, gb_count_of(types)); + // LLVMValueRef rhs_loaded = lb_call_intrinsic(p, "llvm.matrix.column.major.load", rhs_args, gb_count_of(rhs_args), types, gb_count_of(types)); + + // LLVMValueRef mul_args[] = {lhs_loaded, rhs_loaded, do_u32(p, outer_rows), do_u32(p, inner), do_u32(p, outer_columns)}; + // LLVMValueRef lhs_mul_rhs = lb_call_intrinsic(p, "llvm.matrix.multiply", mul_args, gb_count_of(mul_args), types, gb_count_of(types)); + + // lbAddr res = lb_add_local_generated(p, type, false); + + // LLVMValueRef store_args[] = {res.addr.value, lhs_mul_rhs, llvm_stride, llvm_false, do_u32(p, inner), do_u32(p, outer_columns)}; + // lb_call_intrinsic(p, "llvm.matrix.column.major.store", store_args, gb_count_of(store_args), types, gb_count_of(types)); + + // return lb_addr_load(p, res); + // } + + + unsigned x_stride = cast(unsigned)matrix_type_stride_in_elems(xt); unsigned y_stride = cast(unsigned)matrix_type_stride_in_elems(yt); - auto x_rows = slice_make(permanent_allocator(), outer_rows); - auto y_columns = slice_make(permanent_allocator(), outer_columns); - LLVMValueRef x_vector = lb_matrix_to_vector(p, lhs); LLVMValueRef y_vector = lb_matrix_to_vector(p, rhs); + if (outer_rows == outer_columns && outer_rows == inner && (inner & 1) == 0) { + // square matrix calculation + unsigned N = outer_columns; + + auto x_columns = slice_make(permanent_allocator(), N); + auto y_columns = slice_make(permanent_allocator(), N); + + for (unsigned i = 0; i < N; i++) { + LLVMValueRef mask = llvm_mask_iota(p->module, x_stride*i, inner); + LLVMValueRef column = llvm_basic_shuffle(p, x_vector, mask); + x_columns[i] = column; + } + + for (unsigned i = 0; i < N; i++) { + LLVMValueRef mask = llvm_mask_iota(p->module, y_stride*i, inner); + LLVMValueRef column = llvm_basic_shuffle(p, y_vector, mask); + y_columns[i] = column; + } + + + auto z_columns = slice_make(permanent_allocator(), N); + + auto mask_elems = slice_make(permanent_allocator(), N); + auto temp_muls = slice_make(permanent_allocator(), N); + + for (unsigned i = 0; i < N; i++) { + for (unsigned j = 0; j < N; j++) { + LLVMValueRef mask = llvm_mask_same(p->module, j, N); + mask_elems[j] = llvm_basic_shuffle(p, y_columns[i], mask); + } + for (unsigned j = 0; j < N; j++) { + if (is_type_float(elem)) { + temp_muls[j] = LLVMBuildFMul(p->builder, mask_elems[j], x_columns[j], ""); + // LLVMSetFastMathFlags(temp_muls[j], LLVMFastMathAll); + } else { + temp_muls[j] = LLVMBuildMul(p->builder, mask_elems[j], x_columns[j], ""); + } + } + unsigned k = N; + while (k > 1) { + unsigned half = k/2; + for (unsigned j = 0; j < half; j++) { + if (is_type_float(elem)) { + temp_muls[j] = LLVMBuildFAdd(p->builder, temp_muls[2*j + 0], temp_muls[2*j + 1], ""); + // LLVMSetFastMathFlags(temp_muls[j], LLVMFastMathAll); + } else { + temp_muls[j] = LLVMBuildAdd(p->builder, temp_muls[2*j + 0], temp_muls[2*j + 1], ""); + } + } + + if ((k&1) != 0) { + temp_muls[half] = temp_muls[k-1]; + } + k = (k+1)/2; + } + + z_columns[i] = temp_muls[0]; + } + + auto do_u32 = [](lbProcedure *p, u32 val) -> LLVMValueRef { + return LLVMConstInt(lb_type(p->module, t_u32), val, false); + }; + + lbAddr res = lb_add_local_generated(p, type, false); + LLVMValueRef dest_ptr = res.addr.value; + + LLVMTypeRef dest_ptr_type = LLVMPointerType(LLVMTypeOf(z_columns[0]), 0); + dest_ptr = LLVMBuildPointerCast(p->builder, dest_ptr, dest_ptr_type, ""); + for (unsigned i = 0; i < N; i++) { + LLVMValueRef indices[] = {do_u32(p, i)}; + LLVMValueRef dst = LLVMBuildInBoundsGEP2(p->builder, LLVMTypeOf(z_columns[0]), dest_ptr, indices, 1, ""); + LLVMBuildStore(p->builder, z_columns[i], dst); + } + + return lb_addr_load(p, res); + } + + + auto x_rows = slice_make(permanent_allocator(), outer_rows); + auto y_columns = slice_make(permanent_allocator(), outer_columns); + auto mask_elems = slice_make(permanent_allocator(), inner); for (unsigned i = 0; i < outer_rows; i++) { for (unsigned j = 0; j < inner; j++) { @@ -1004,7 +1111,7 @@ gb_internal lbValue lb_emit_matrix_mul(lbProcedure *p, lbValue lhs, lbValue rhs, y_columns[i] = column; } - lbAddr res = lb_add_local_generated(p, type, true); + lbAddr res = lb_add_local_generated(p, type, false); for_array(i, x_rows) { LLVMValueRef x_row = x_rows[i]; for_array(j, y_columns) { @@ -1018,7 +1125,7 @@ gb_internal lbValue lb_emit_matrix_mul(lbProcedure *p, lbValue lhs, lbValue rhs, } if (!xt->Matrix.is_row_major) { - lbAddr res = lb_add_local_generated(p, type, true); + lbAddr res = lb_add_local_generated(p, type, false); auto inners = slice_make(permanent_allocator(), inner); @@ -1042,7 +1149,7 @@ gb_internal lbValue lb_emit_matrix_mul(lbProcedure *p, lbValue lhs, lbValue rhs, return lb_addr_load(p, res); } else { - lbAddr res = lb_add_local_generated(p, type, true); + lbAddr res = lb_add_local_generated(p, type, false); auto inners = slice_make(permanent_allocator(), inner); diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index a04f91fbd..d101d28c2 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -2048,6 +2048,15 @@ gb_internal LLVMValueRef llvm_mask_zero(lbModule *m, unsigned count) { return LLVMConstNull(LLVMVectorType(lb_type(m, t_u32), count)); } +gb_internal LLVMValueRef llvm_mask_same(lbModule *m, unsigned value, unsigned count) { + auto iota = slice_make(temporary_allocator(), count); + for (unsigned i = 0; i < count; i++) { + iota[i] = lb_const_int(m, t_u32, value).value; + } + return LLVMConstVector(iota.data, count); +} + + #define LLVM_VECTOR_DUMMY_VALUE(type) LLVMGetUndef((type)) // #define LLVM_VECTOR_DUMMY_VALUE(type) LLVMConstNull((type)) From b0ee0bb63538a6d43e16bafad98bf97bdbd8e89a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 11 May 2026 11:55:07 +0100 Subject: [PATCH 039/228] Add `@(fast_math={...})` + `intrinsics.Fast_Math_Flags` --- base/intrinsics/intrinsics.odin | 1 + base/runtime/core.odin | 17 +++++++++ src/build_settings.cpp | 1 + src/check_decl.cpp | 2 ++ src/checker.cpp | 61 ++++++++++++++++++++++++++++++--- src/checker.hpp | 2 ++ src/entity.cpp | 3 ++ src/llvm_backend_opt.cpp | 52 ++++++++++++++++++++++++++++ src/types.cpp | 28 +++++++++++++++ 9 files changed, 163 insertions(+), 4 deletions(-) diff --git a/base/intrinsics/intrinsics.odin b/base/intrinsics/intrinsics.odin index dd3b1d38e..e89036932 100644 --- a/base/intrinsics/intrinsics.odin +++ b/base/intrinsics/intrinsics.odin @@ -4,6 +4,7 @@ package intrinsics import "base:runtime" + // Package-Related is_package_imported :: proc(package_name: string) -> bool --- diff --git a/base/runtime/core.odin b/base/runtime/core.odin index d77c41dc8..c1ba7aa3e 100644 --- a/base/runtime/core.odin +++ b/base/runtime/core.odin @@ -23,6 +23,23 @@ package runtime import "base:intrinsics" +/* +Fast_Math_Flag :: enum u8 { + Allow_Reassoc = 0, + No_NaNs = 1, + No_Infs = 2, + No_Signed_Zeros = 3, + Allow_Reciprocal = 4, + Allow_Contract = 5, + Approx_Func = 6, +} +*/ +Fast_Math_Flag :: intrinsics.Fast_Math_Flag + +// Fast_Math_Flags :: distinct bit_set[Fast_Math_Flag; u32] +Fast_Math_Flags :: intrinsics.Fast_Math_Flags + + // NOTE(bill): This must match the compiler's Calling_Convention :: enum u8 { Invalid = 0, diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 699304a18..8f8a259d3 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -455,6 +455,7 @@ enum IntegerDivisionByZeroKind : u8 { IntegerDivisionByZero_AllBits, }; + // This stores the information for the specify architecture of this build struct BuildContext { // Constants diff --git a/src/check_decl.cpp b/src/check_decl.cpp index 7bf1cd9bf..f571c7401 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -1480,6 +1480,8 @@ gb_internal void check_proc_decl(CheckerContext *ctx, Entity *e, DeclInfo *d) { e->Procedure.no_sanitize_memory = ac.no_sanitize_memory; e->Procedure.no_sanitize_thread = ac.no_sanitize_thread; + e->Procedure.fast_math_flags = ac.fast_math_flags; + e->deprecated_message = ac.deprecated_message; e->warning_message = ac.warning_message; ac.link_name = handle_link_name(ctx, e->token, ac.link_name, ac.link_prefix, ac.link_suffix); diff --git a/src/checker.cpp b/src/checker.cpp index 7d9aaf24f..1b668eff5 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -1042,14 +1042,14 @@ struct GlobalEnumValue { i64 value; }; -gb_internal Slice add_global_enum_type(String const &type_name, GlobalEnumValue *values, isize value_count, Type **enum_type_ = nullptr) { +gb_internal Slice add_global_enum_type(String const &type_name, GlobalEnumValue *values, isize value_count, Type **enum_type_ = nullptr, Type *backing_type = nullptr) { Scope *scope = create_scope(nullptr, builtin_pkg->scope); Entity *entity = alloc_entity_type_name(scope, make_token_ident(type_name), nullptr, EntityState_Resolved); Type *enum_type = alloc_type_enum(); Type *named_type = alloc_type_named(type_name, enum_type, entity); set_base_type(named_type, enum_type); - enum_type->Enum.base_type = t_int; + enum_type->Enum.base_type = backing_type ? backing_type : t_int; enum_type->Enum.scope = scope; entity->type = named_type; @@ -1250,6 +1250,41 @@ gb_internal void init_universal(void) { add_global_enum_constant(fields, "ODIN_ERROR_POS_STYLE", build_context.ODIN_ERROR_POS_STYLE); } + { + GlobalEnumValue values[OdinFastMath_COUNT] = {}; + for (unsigned i = 0; i < OdinFastMath_COUNT; i++) { + values[i] = {OdinFastMathFlag_strings[i], i}; + } + + auto fields = add_global_enum_type(str_lit("Fast_Math_Flag"), values, gb_count_of(values), &t_fast_math_flag, t_u8); + + GB_ASSERT(t_fast_math_flag->kind == Type_Named); + scope_insert(intrinsics_pkg->scope, t_fast_math_flag->Named.type_name); + + Type *bs = alloc_type_bit_set(); + bs->BitSet.elem = t_fast_math_flag; + bs->BitSet.underlying = t_u32; + bs->BitSet.lower = 0; + bs->BitSet.upper = OdinFastMath_COUNT-1; + bs->BitSet.node = nullptr; + + + { + String type_name = str_lit("Fast_Math_Flags"); + + Scope *scope = create_scope(nullptr, builtin_pkg->scope); + Entity *entity = alloc_entity_type_name(scope, make_token_ident(type_name), nullptr, EntityState_Resolved); + + Type *named_type = alloc_type_named(type_name, bs, entity); + set_base_type(named_type, bs); + entity->type = named_type; + + t_fast_math_flags = named_type; + + scope_insert(intrinsics_pkg->scope, entity); + } + } + { GlobalEnumValue values[OdinAtomicMemoryOrder_COUNT] = { {OdinAtomicMemoryOrder_strings[OdinAtomicMemoryOrder_relaxed], OdinAtomicMemoryOrder_relaxed}, @@ -3554,11 +3589,17 @@ gb_internal void init_preload(Checker *c) { init_core_objc_c(c); } -gb_internal ExactValue check_decl_attribute_value(CheckerContext *c, Ast *value) { +gb_internal void check_expr_with_type_hint(CheckerContext *c, Operand *o, Ast *e, Type *t); + +gb_internal ExactValue check_decl_attribute_value(CheckerContext *c, Ast *value, Type *type_hint = nullptr) { ExactValue ev = {}; if (value != nullptr) { Operand op = {}; - check_expr(c, &op, value); + if (type_hint != nullptr) { + check_expr_with_type_hint(c, &op, value, type_hint); + } else { + check_expr(c, &op, value); + } if (op.mode) { if (op.mode == Addressing_Constant) { ev = op.value; @@ -4126,6 +4167,18 @@ gb_internal DECL_ATTRIBUTE_PROC(proc_decl_attribute) { } ac->no_sanitize_thread = true; return true; + } else if (name == "fast_math") { + if (value == nullptr) { + error(elem, "Expected a constant bit_set of type 'intrinsics.Fast_Math_Flags' for '%.*s'", LIT(name)); + } else { + ExactValue ev = check_decl_attribute_value(c, value, t_fast_math_flags); + if (ev.kind != ExactValue_Integer) { + error(elem, "Expected a constant bit_set of type 'intrinsics.Fast_Math_Flags' for '%.*s'", LIT(name)); + } else { + ac->fast_math_flags = exact_value_to_u64(ev); + } + } + return true; } return false; } diff --git a/src/checker.hpp b/src/checker.hpp index 5e295dc84..cd2e580d8 100644 --- a/src/checker.hpp +++ b/src/checker.hpp @@ -163,6 +163,8 @@ struct AttributeContext { String require_target_feature; // required by the target micro-architecture String enable_target_feature; // will be enabled for the procedure only + u64 fast_math_flags; + bool raddbg_type_view; String raddbg_type_view_string; }; diff --git a/src/entity.cpp b/src/entity.cpp index 7bb6e88ca..1879e9d05 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -256,6 +256,9 @@ struct Entity { struct GenProcsData *gen_procs; BlockingMutex gen_procs_mutex; ProcedureOptimizationMode optimization_mode; + + u64 fast_math_flags; + bool is_foreign : 1; bool is_export : 1; bool generated_from_polymorphic : 1; diff --git a/src/llvm_backend_opt.cpp b/src/llvm_backend_opt.cpp index cb7fe1c75..47ea90703 100644 --- a/src/llvm_backend_opt.cpp +++ b/src/llvm_backend_opt.cpp @@ -270,6 +270,55 @@ gb_internal void lb_populate_module_pass_manager(LLVMTargetMachineRef target_mac optimization of Odin programs **************************************************************************/ +gb_internal void lb_run_fast_float_math_pass(lbProcedure *p) { + Entity *e = p->entity; + if (e == nullptr) { + return; + } + GB_ASSERT(e->kind == Entity_Procedure); + + + u64 fast_math_flags = e->Procedure.fast_math_flags; + LLVMFastMathFlags llvm_flags = 0; + if (fast_math_flags & OdinFastMath_Allow_Reassoc) llvm_flags |= LLVMFastMathAllowReassoc; + if (fast_math_flags & OdinFastMath_No_NaNs) llvm_flags |= LLVMFastMathNoNaNs; + if (fast_math_flags & OdinFastMath_No_Infs) llvm_flags |= LLVMFastMathNoInfs; + if (fast_math_flags & OdinFastMath_No_Signed_Zeros) llvm_flags |= LLVMFastMathNoSignedZeros; + if (fast_math_flags & OdinFastMath_Allow_Reciprocal) llvm_flags |= LLVMFastMathAllowReciprocal; + if (fast_math_flags & OdinFastMath_Allow_Contract) llvm_flags |= LLVMFastMathAllowContract; + if (fast_math_flags & OdinFastMath_Approx_Func) llvm_flags |= LLVMFastMathApproxFunc; + + if (llvm_flags == 0) { + return; + } + + for (LLVMBasicBlockRef block = LLVMGetFirstBasicBlock(p->value); + block != nullptr; + block = LLVMGetNextBasicBlock(block)) { + for (LLVMValueRef instr = LLVMGetFirstInstruction(block); + instr != nullptr; + instr = LLVMGetNextInstruction(instr)) { + switch (LLVMGetInstructionOpcode(instr)) { + case LLVMFNeg: + case LLVMFAdd: + case LLVMFSub: + case LLVMFMul: + case LLVMFDiv: + case LLVMFRem: + case LLVMFPToUI: + case LLVMFPToSI: + case LLVMUIToFP: + case LLVMSIToFP: + case LLVMFPTrunc: + case LLVMFPExt: + case LLVMFCmp: + LLVMSetFastMathFlags(instr, llvm_flags); + break; + } + } + } +} + gb_internal void lb_run_remove_dead_instruction_pass(lbProcedure *p) { unsigned debug_declare_id = LLVMLookupIntrinsicID("llvm.dbg.declare", 16); GB_ASSERT(debug_declare_id != 0); @@ -475,6 +524,9 @@ gb_internal void lb_run_function_pass_manager(LLVMPassManagerRef fpm, lbProcedur if (p == nullptr) { return; } + + lb_run_fast_float_math_pass(p); + // NOTE(bill): LLVMAddDCEPass doesn't seem to be exported in the official DLL's for LLVM // which means we cannot rely upon it // This is also useful for read the .ll for debug purposes because a lot of instructions diff --git a/src/types.cpp b/src/types.cpp index f7975838d..f87d62297 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -805,6 +805,34 @@ gb_global Type *t_atomic_memory_order = nullptr; +enum OdinFastMathFlag : u8 { + OdinFastMath_Allow_Reassoc = 0, + OdinFastMath_No_NaNs = 1, + OdinFastMath_No_Infs = 2, + OdinFastMath_No_Signed_Zeros = 3, + OdinFastMath_Allow_Reciprocal = 4, + OdinFastMath_Allow_Contract = 5, + OdinFastMath_Approx_Func = 6, + + OdinFastMath_COUNT, +}; + +char const *OdinFastMathFlag_strings[OdinFastMath_COUNT] = { + "Allow_Reassoc", + "No_NaNs", + "No_Infs", + "No_Signed_Zeros", + "Allow_Reciprocal", + "Allow_Contract", + "Approx_Func", +}; + +gb_global Type *t_fast_math_flag = nullptr; // named enum +gb_global Type *t_fast_math_flags = nullptr; // named bit_set + + + + gb_global RecursiveMutex g_type_mutex; struct TypePath; From 58e4e6be240c7f588fdec8bcbb3c68fb1b31eab2 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 11 May 2026 13:14:02 +0100 Subject: [PATCH 040/228] Improve `matrix * vector` code generation --- src/llvm_backend_expr.cpp | 88 ++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 52 deletions(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 598ab6d21..7f45b89dd 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -697,7 +697,7 @@ gb_internal bool lb_is_matrix_simdable(Type *t) { // it's not aligned well enough to use the vector instructions return false; } - if ((mt->Matrix.row_count & 1) ^ (mt->Matrix.column_count & 1)) { + if ((mt->Matrix.row_count & 1) && (mt->Matrix.column_count & 1)) { return false; } if (mt->Matrix.is_row_major) { @@ -976,35 +976,6 @@ gb_internal lbValue lb_emit_matrix_mul(lbProcedure *p, lbValue lhs, lbValue rhs, unsigned outer_columns = cast(unsigned)yt->Matrix.column_count; if (!xt->Matrix.is_row_major && lb_is_matrix_simdable(xt)) { - - // if (LLVMIsALoadInst(lhs.value) && LLVMIsALoadInst(rhs.value)) { - // auto do_u32 = [](lbProcedure *p, u32 val) -> LLVMValueRef { - // return LLVMConstInt(lb_type(p->module, t_u32), val, false); - // }; - - // LLVMValueRef llvm_stride = do_u32(p, inner); - // LLVMValueRef llvm_false = LLVMConstInt(lb_type(p->module, t_llvm_bool), false, false); - - // LLVMValueRef lhs_args[] = {LLVMGetOperand(lhs.value, 0), llvm_stride, llvm_false, do_u32(p, outer_rows), do_u32(p, inner)}; - // LLVMValueRef rhs_args[] = {LLVMGetOperand(rhs.value, 0), llvm_stride, llvm_false, do_u32(p, inner), do_u32(p, outer_columns)}; - // LLVMTypeRef types[] = {lb_type(p->module, elem)}; - - // LLVMValueRef lhs_loaded = lb_call_intrinsic(p, "llvm.matrix.column.major.load", lhs_args, gb_count_of(lhs_args), types, gb_count_of(types)); - // LLVMValueRef rhs_loaded = lb_call_intrinsic(p, "llvm.matrix.column.major.load", rhs_args, gb_count_of(rhs_args), types, gb_count_of(types)); - - // LLVMValueRef mul_args[] = {lhs_loaded, rhs_loaded, do_u32(p, outer_rows), do_u32(p, inner), do_u32(p, outer_columns)}; - // LLVMValueRef lhs_mul_rhs = lb_call_intrinsic(p, "llvm.matrix.multiply", mul_args, gb_count_of(mul_args), types, gb_count_of(types)); - - // lbAddr res = lb_add_local_generated(p, type, false); - - // LLVMValueRef store_args[] = {res.addr.value, lhs_mul_rhs, llvm_stride, llvm_false, do_u32(p, inner), do_u32(p, outer_columns)}; - // lb_call_intrinsic(p, "llvm.matrix.column.major.store", store_args, gb_count_of(store_args), types, gb_count_of(types)); - - // return lb_addr_load(p, res); - // } - - - unsigned x_stride = cast(unsigned)matrix_type_stride_in_elems(xt); unsigned y_stride = cast(unsigned)matrix_type_stride_in_elems(yt); @@ -1042,23 +1013,13 @@ gb_internal lbValue lb_emit_matrix_mul(lbProcedure *p, lbValue lhs, lbValue rhs, mask_elems[j] = llvm_basic_shuffle(p, y_columns[i], mask); } for (unsigned j = 0; j < N; j++) { - if (is_type_float(elem)) { - temp_muls[j] = LLVMBuildFMul(p->builder, mask_elems[j], x_columns[j], ""); - // LLVMSetFastMathFlags(temp_muls[j], LLVMFastMathAll); - } else { - temp_muls[j] = LLVMBuildMul(p->builder, mask_elems[j], x_columns[j], ""); - } + temp_muls[j] = llvm_vector_mul(p, mask_elems[j], x_columns[j]); } unsigned k = N; while (k > 1) { unsigned half = k/2; for (unsigned j = 0; j < half; j++) { - if (is_type_float(elem)) { - temp_muls[j] = LLVMBuildFAdd(p->builder, temp_muls[2*j + 0], temp_muls[2*j + 1], ""); - // LLVMSetFastMathFlags(temp_muls[j], LLVMFastMathAll); - } else { - temp_muls[j] = LLVMBuildAdd(p->builder, temp_muls[2*j + 0], temp_muls[2*j + 1], ""); - } + temp_muls[j] = llvm_vector_add(p, temp_muls[2*j + 0], temp_muls[2*j + 1]); } if ((k&1) != 0) { @@ -1207,23 +1168,46 @@ gb_internal lbValue lb_emit_matrix_mul_vector(lbProcedure *p, lbValue lhs, lbVal m_columns[column_index] = column; } - for (unsigned row_index = 0; row_index < column_count; row_index++) { - LLVMValueRef value = LLVMBuildExtractValue(p->builder, rhs.value, row_index, ""); - LLVMValueRef row = llvm_vector_broadcast(p, value, row_count); - v_rows[row_index] = row; + if (LLVMIsALoadInst(rhs.value)) { + LLVMValueRef rhs_ptr = LLVMGetOperand(rhs.value, 0); + LLVMTypeRef vector_type = LLVMVectorType(lb_type(p->module, elem), cast(unsigned)vector_count); + LLVMValueRef rhs_vector = LLVMBuildLoad2(p->builder, vector_type, rhs_ptr, ""); + LLVMSetAlignment(rhs_vector, cast(unsigned)type_align_of(type)); + + for (unsigned i = 0; i < column_count; i++) { + LLVMValueRef mask = llvm_mask_same(p->module, i, row_count); + v_rows[i] = llvm_basic_shuffle(p, rhs_vector, mask); + } + } else { + for (unsigned row_index = 0; row_index < column_count; row_index++) { + LLVMValueRef value = LLVMBuildExtractValue(p->builder, rhs.value, row_index, ""); + LLVMValueRef row = llvm_vector_broadcast(p, value, row_count); + v_rows[row_index] = row; + } + } + + auto temps = slice_make(permanent_allocator(), column_count); + for (unsigned i = 0; i < column_count; i++) { + temps[i] = llvm_vector_mul(p, m_columns[i], v_rows[i]); } GB_ASSERT(column_count > 0); - LLVMValueRef vector = nullptr; - for (i64 i = 0; i < column_count; i++) { - if (i == 0) { - vector = llvm_vector_mul(p, m_columns[i], v_rows[i]); - } else { - vector = llvm_vector_mul_add(p, m_columns[i], v_rows[i], vector); + unsigned k = column_count; + while (k > 1) { + unsigned half = k/2; + for (unsigned j = 0; j < half; j++) { + temps[j] = llvm_vector_add(p, temps[2*j + 0], temps[2*j + 1]); } + + if ((k&1) != 0) { + temps[half] = temps[k-1]; + } + k = (k+1)/2; } + LLVMValueRef vector = temps[0]; + return lb_matrix_cast_vector_to_type(p, vector, type); } From b752ff4bdbda17d7f7e48b002e2aedd51b11f2f5 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 11 May 2026 13:28:54 +0100 Subject: [PATCH 041/228] Add a minor optimization for `row_major * row_major` --- src/llvm_backend_expr.cpp | 270 +++++++++++++++++++++-------------- src/llvm_backend_utility.cpp | 24 ++++ 2 files changed, 184 insertions(+), 110 deletions(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 7f45b89dd..ba2bea7cd 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -672,7 +672,7 @@ gb_internal lbValue lb_emit_arith_array(lbProcedure *p, TokenKind op, lbValue lh } } -gb_internal bool lb_is_matrix_simdable(Type *t) { +gb_internal bool lb_is_matrix_simdable(Type *t, bool ignore_layout=false) { Type *mt = base_type(t); GB_ASSERT(mt->kind == Type_Matrix); @@ -701,8 +701,10 @@ gb_internal bool lb_is_matrix_simdable(Type *t) { return false; } if (mt->Matrix.is_row_major) { - // TODO(bill): make #row_major matrices work with SIMD - return false; + if (!ignore_layout) { + // TODO(bill): make #row_major matrices work with SIMD + return false; + } } if (elem->kind == Type_Basic) { @@ -959,6 +961,10 @@ gb_internal lbValue lb_emit_outer_product(lbProcedure *p, lbValue a, lbValue b, gb_internal lbValue lb_emit_matrix_mul(lbProcedure *p, lbValue lhs, lbValue rhs, Type *type) { // TODO(bill): Handle edge case for f16 types on x86(-64) platforms + auto const do_u32 = [](lbProcedure *p, u32 val) -> LLVMValueRef { + return LLVMConstInt(lb_type(p->module, t_u32), val, false); + }; + Type *xt = base_type(lhs.type); Type *yt = base_type(rhs.type); @@ -975,114 +981,179 @@ gb_internal lbValue lb_emit_matrix_mul(lbProcedure *p, lbValue lhs, lbValue rhs, unsigned inner = cast(unsigned)xt->Matrix.column_count; unsigned outer_columns = cast(unsigned)yt->Matrix.column_count; - if (!xt->Matrix.is_row_major && lb_is_matrix_simdable(xt)) { - unsigned x_stride = cast(unsigned)matrix_type_stride_in_elems(xt); - unsigned y_stride = cast(unsigned)matrix_type_stride_in_elems(yt); + if (lb_is_matrix_simdable(xt, true)) { + if (!xt->Matrix.is_row_major) { // #column_major + unsigned x_stride = cast(unsigned)matrix_type_stride_in_elems(xt); + unsigned y_stride = cast(unsigned)matrix_type_stride_in_elems(yt); - LLVMValueRef x_vector = lb_matrix_to_vector(p, lhs); - LLVMValueRef y_vector = lb_matrix_to_vector(p, rhs); + LLVMValueRef x_vector = lb_matrix_to_vector(p, lhs); + LLVMValueRef y_vector = lb_matrix_to_vector(p, rhs); - if (outer_rows == outer_columns && outer_rows == inner && (inner & 1) == 0) { - // square matrix calculation - unsigned N = outer_columns; + if (outer_rows == outer_columns && outer_rows == inner && (inner & 1) == 0) { + // square matrix calculation + unsigned N = outer_columns; - auto x_columns = slice_make(permanent_allocator(), N); - auto y_columns = slice_make(permanent_allocator(), N); + auto x_columns = slice_make(permanent_allocator(), N); + auto y_columns = slice_make(permanent_allocator(), N); - for (unsigned i = 0; i < N; i++) { - LLVMValueRef mask = llvm_mask_iota(p->module, x_stride*i, inner); - LLVMValueRef column = llvm_basic_shuffle(p, x_vector, mask); - x_columns[i] = column; + for (unsigned i = 0; i < N; i++) { + LLVMValueRef mask = llvm_mask_iota(p->module, x_stride*i, N); + LLVMValueRef column = llvm_basic_shuffle(p, x_vector, mask); + x_columns[i] = column; + } + + for (unsigned i = 0; i < N; i++) { + LLVMValueRef mask = llvm_mask_iota(p->module, y_stride*i, N); + LLVMValueRef column = llvm_basic_shuffle(p, y_vector, mask); + y_columns[i] = column; + } + + + auto z_columns = slice_make(permanent_allocator(), N); + auto mask_elems = slice_make(permanent_allocator(), N); + + for (unsigned i = 0; i < N; i++) { + for (unsigned j = 0; j < N; j++) { + LLVMValueRef mask = llvm_mask_same(p->module, j, N); + mask_elems[j] = llvm_basic_shuffle(p, y_columns[i], mask); + } + z_columns[i] = llvm_vector_mul_pairwise_reduce_add(p, mask_elems, x_columns); + } + + lbAddr res = lb_add_local_generated(p, type, false); + LLVMValueRef dest_ptr = res.addr.value; + + LLVMTypeRef dest_ptr_type = LLVMPointerType(LLVMTypeOf(z_columns[0]), 0); + dest_ptr = LLVMBuildPointerCast(p->builder, dest_ptr, dest_ptr_type, ""); + for (unsigned i = 0; i < N; i++) { + LLVMValueRef indices[] = {do_u32(p, i)}; + LLVMValueRef dst = LLVMBuildInBoundsGEP2(p->builder, LLVMTypeOf(z_columns[0]), dest_ptr, indices, 1, ""); + LLVMBuildStore(p->builder, z_columns[i], dst); + } + + return lb_addr_load(p, res); } - for (unsigned i = 0; i < N; i++) { + + auto x_rows = slice_make(permanent_allocator(), outer_rows); + auto y_columns = slice_make(permanent_allocator(), outer_columns); + + auto mask_elems = slice_make(permanent_allocator(), inner); + for (unsigned i = 0; i < outer_rows; i++) { + for (unsigned j = 0; j < inner; j++) { + unsigned offset = x_stride*j + i; + mask_elems[j] = do_u32(p, offset); + } + + // transpose mask + LLVMValueRef mask = LLVMConstVector(mask_elems.data, inner); + LLVMValueRef row = llvm_basic_shuffle(p, x_vector, mask); + x_rows[i] = row; + } + + for (unsigned i = 0; i < outer_columns; i++) { LLVMValueRef mask = llvm_mask_iota(p->module, y_stride*i, inner); LLVMValueRef column = llvm_basic_shuffle(p, y_vector, mask); y_columns[i] = column; } - - auto z_columns = slice_make(permanent_allocator(), N); - - auto mask_elems = slice_make(permanent_allocator(), N); - auto temp_muls = slice_make(permanent_allocator(), N); - - for (unsigned i = 0; i < N; i++) { - for (unsigned j = 0; j < N; j++) { - LLVMValueRef mask = llvm_mask_same(p->module, j, N); - mask_elems[j] = llvm_basic_shuffle(p, y_columns[i], mask); + lbAddr res = lb_add_local_generated(p, type, false); + for_array(i, x_rows) { + LLVMValueRef x_row = x_rows[i]; + for_array(j, y_columns) { + LLVMValueRef y_column = y_columns[j]; + LLVMValueRef elem = llvm_vector_dot(p, x_row, y_column); + lbValue dst = lb_emit_matrix_epi(p, res.addr, i, j); + LLVMBuildStore(p->builder, elem, dst.value); } - for (unsigned j = 0; j < N; j++) { - temp_muls[j] = llvm_vector_mul(p, mask_elems[j], x_columns[j]); + } + return lb_addr_load(p, res); + } else { // #row_major + unsigned x_stride = cast(unsigned)matrix_type_stride_in_elems(xt); + unsigned y_stride = cast(unsigned)matrix_type_stride_in_elems(yt); + + LLVMValueRef x_vector = lb_matrix_to_vector(p, lhs); + LLVMValueRef y_vector = lb_matrix_to_vector(p, rhs); + + if (outer_rows == outer_columns && outer_rows == inner && (inner & 1) == 0) { + // square matrix calculation + unsigned N = outer_columns; + + auto x_rows = slice_make(permanent_allocator(), N); + auto y_rows = slice_make(permanent_allocator(), N); + + for (unsigned i = 0; i < N; i++) { + LLVMValueRef mask = llvm_mask_iota(p->module, x_stride*i, N); + LLVMValueRef column = llvm_basic_shuffle(p, x_vector, mask); + x_rows[i] = column; } - unsigned k = N; - while (k > 1) { - unsigned half = k/2; - for (unsigned j = 0; j < half; j++) { - temp_muls[j] = llvm_vector_add(p, temp_muls[2*j + 0], temp_muls[2*j + 1]); + + for (unsigned i = 0; i < N; i++) { + LLVMValueRef mask = llvm_mask_iota(p->module, y_stride*i, N); + LLVMValueRef column = llvm_basic_shuffle(p, y_vector, mask); + y_rows[i] = column; + } + + + auto z_rows = slice_make(permanent_allocator(), N); + auto mask_elems = slice_make(permanent_allocator(), N); + + for (unsigned i = 0; i < N; i++) { + for (unsigned j = 0; j < N; j++) { + LLVMValueRef mask = llvm_mask_same(p->module, j, N); + mask_elems[j] = llvm_basic_shuffle(p, x_rows[i], mask); } - - if ((k&1) != 0) { - temp_muls[half] = temp_muls[k-1]; - } - k = (k+1)/2; + z_rows[i] = llvm_vector_mul_pairwise_reduce_add(p, mask_elems, y_rows); } - z_columns[i] = temp_muls[0]; + lbAddr res = lb_add_local_generated(p, type, false); + LLVMValueRef dest_ptr = res.addr.value; + + LLVMTypeRef dest_ptr_type = LLVMPointerType(LLVMTypeOf(z_rows[0]), 0); + dest_ptr = LLVMBuildPointerCast(p->builder, dest_ptr, dest_ptr_type, ""); + for (unsigned i = 0; i < N; i++) { + LLVMValueRef indices[] = {do_u32(p, i)}; + LLVMValueRef dst = LLVMBuildInBoundsGEP2(p->builder, LLVMTypeOf(z_rows[0]), dest_ptr, indices, 1, ""); + LLVMBuildStore(p->builder, z_rows[i], dst); + } + + return lb_addr_load(p, res); } - auto do_u32 = [](lbProcedure *p, u32 val) -> LLVMValueRef { - return LLVMConstInt(lb_type(p->module, t_u32), val, false); - }; + auto x_rows = slice_make(permanent_allocator(), outer_rows); + auto y_columns = slice_make(permanent_allocator(), outer_columns); + + for (unsigned i = 0; i < outer_rows; i++) { + LLVMValueRef mask = llvm_mask_iota(p->module, x_stride*i, inner); + LLVMValueRef row = llvm_basic_shuffle(p, x_vector, mask); + x_rows[i] = row; + } + + auto mask_elems = slice_make(permanent_allocator(), inner); + for (unsigned i = 0; i < outer_columns; i++) { + for (unsigned j = 0; j < inner; j++) { + unsigned offset = x_stride*j + i; + mask_elems[j] = do_u32(p, offset); + } + + // transpose mask + LLVMValueRef mask = LLVMConstVector(mask_elems.data, inner); + LLVMValueRef column = llvm_basic_shuffle(p, y_vector, mask); + y_columns[i] = column; + } lbAddr res = lb_add_local_generated(p, type, false); - LLVMValueRef dest_ptr = res.addr.value; - - LLVMTypeRef dest_ptr_type = LLVMPointerType(LLVMTypeOf(z_columns[0]), 0); - dest_ptr = LLVMBuildPointerCast(p->builder, dest_ptr, dest_ptr_type, ""); - for (unsigned i = 0; i < N; i++) { - LLVMValueRef indices[] = {do_u32(p, i)}; - LLVMValueRef dst = LLVMBuildInBoundsGEP2(p->builder, LLVMTypeOf(z_columns[0]), dest_ptr, indices, 1, ""); - LLVMBuildStore(p->builder, z_columns[i], dst); + for_array(i, x_rows) { + LLVMValueRef x_row = x_rows[i]; + for_array(j, y_columns) { + LLVMValueRef y_column = y_columns[j]; + LLVMValueRef elem = llvm_vector_dot(p, x_row, y_column); + lbValue dst = lb_emit_matrix_epi(p, res.addr, i, j); + LLVMBuildStore(p->builder, elem, dst.value); + } } - return lb_addr_load(p, res); } - - - auto x_rows = slice_make(permanent_allocator(), outer_rows); - auto y_columns = slice_make(permanent_allocator(), outer_columns); - - auto mask_elems = slice_make(permanent_allocator(), inner); - for (unsigned i = 0; i < outer_rows; i++) { - for (unsigned j = 0; j < inner; j++) { - unsigned offset = x_stride*j + i; - mask_elems[j] = lb_const_int(p->module, t_u32, offset).value; - } - - // transpose mask - LLVMValueRef mask = LLVMConstVector(mask_elems.data, inner); - LLVMValueRef row = llvm_basic_shuffle(p, x_vector, mask); - x_rows[i] = row; - } - - for (unsigned i = 0; i < outer_columns; i++) { - LLVMValueRef mask = llvm_mask_iota(p->module, y_stride*i, inner); - LLVMValueRef column = llvm_basic_shuffle(p, y_vector, mask); - y_columns[i] = column; - } - - lbAddr res = lb_add_local_generated(p, type, false); - for_array(i, x_rows) { - LLVMValueRef x_row = x_rows[i]; - for_array(j, y_columns) { - LLVMValueRef y_column = y_columns[j]; - LLVMValueRef elem = llvm_vector_dot(p, x_row, y_column); - lbValue dst = lb_emit_matrix_epi(p, res.addr, i, j); - LLVMBuildStore(p->builder, elem, dst.value); - } - } - return lb_addr_load(p, res); } if (!xt->Matrix.is_row_major) { @@ -1186,28 +1257,7 @@ gb_internal lbValue lb_emit_matrix_mul_vector(lbProcedure *p, lbValue lhs, lbVal } } - auto temps = slice_make(permanent_allocator(), column_count); - for (unsigned i = 0; i < column_count; i++) { - temps[i] = llvm_vector_mul(p, m_columns[i], v_rows[i]); - } - - GB_ASSERT(column_count > 0); - - unsigned k = column_count; - while (k > 1) { - unsigned half = k/2; - for (unsigned j = 0; j < half; j++) { - temps[j] = llvm_vector_add(p, temps[2*j + 0], temps[2*j + 1]); - } - - if ((k&1) != 0) { - temps[half] = temps[k-1]; - } - k = (k+1)/2; - } - - LLVMValueRef vector = temps[0]; - + LLVMValueRef vector = llvm_vector_mul_pairwise_reduce_add(p, m_columns, v_rows); return lb_matrix_cast_vector_to_type(p, vector, type); } diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index d101d28c2..25481b2ed 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -2230,6 +2230,30 @@ gb_internal LLVMValueRef llvm_vector_mul(lbProcedure *p, LLVMValueRef a, LLVMVal return LLVMBuildFMul(p->builder, a, b, ""); } +gb_internal LLVMValueRef llvm_vector_mul_pairwise_reduce_add(lbProcedure *p, Slice const &a, Slice const &b) { + GB_ASSERT(a.count == b.count); + + auto temps = slice_make(temporary_allocator(), a.count); + for (unsigned i = 0; i < a.count; i++) { + temps[i] = llvm_vector_mul(p, a[i], b[i]); + } + + unsigned k = cast(unsigned)a.count; + while (k > 1) { + unsigned half = k/2; + for (unsigned j = 0; j < half; j++) { + temps[j] = llvm_vector_add(p, temps[2*j + 0], temps[2*j + 1]); + } + + if ((k&1) != 0) { + temps[half] = temps[k-1]; + } + k = (k+1)/2; + } + + return temps[0]; +} + gb_internal LLVMValueRef llvm_vector_dot(lbProcedure *p, LLVMValueRef a, LLVMValueRef b) { return llvm_vector_reduce_add(p, llvm_vector_mul(p, a, b)); From 7d0dba1b821aa38ff55d604555208a7b57a002a1 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 11 May 2026 13:41:30 +0100 Subject: [PATCH 042/228] Improve code generation for `intrinsics.transpose` --- src/llvm_backend_expr.cpp | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index ba2bea7cd..968d27a4e 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -822,35 +822,32 @@ gb_internal lbValue lb_emit_matrix_transpose(lbProcedure *p, lbValue m, Type *ty GB_PANIC("TODO: transpose with changing layout"); } - if (lb_is_matrix_simdable(mt) && lb_is_matrix_simdable(type)) { + if (lb_is_matrix_simdable(mt, true) && lb_is_matrix_simdable(type, true)) { + auto const do_u32 = [](lbProcedure *p, u32 val) -> LLVMValueRef { + return LLVMConstInt(lb_type(p->module, t_u32), val, false); + }; + unsigned stride = cast(unsigned)matrix_type_stride_in_elems(mt); unsigned row_count = cast(unsigned)mt->Matrix.row_count; unsigned column_count = cast(unsigned)mt->Matrix.column_count; - - auto rows = slice_make(permanent_allocator(), row_count); - auto mask_elems = slice_make(permanent_allocator(), column_count); + unsigned other_stride = (row_count*column_count)/stride; LLVMValueRef vector = lb_matrix_to_vector(p, m); + auto mask_elems = slice_make(permanent_allocator(), row_count * column_count); for (unsigned i = 0; i < row_count; i++) { for (unsigned j = 0; j < column_count; j++) { - unsigned offset = stride*j + i; - mask_elems[j] = lb_const_int(p->module, t_u32, offset).value; + mask_elems[other_stride*i + j] = do_u32(p, stride*j + i); } - - // transpose mask - LLVMValueRef mask = LLVMConstVector(mask_elems.data, column_count); - LLVMValueRef row = llvm_basic_shuffle(p, vector, mask); - rows[i] = row; } + LLVMValueRef mask = LLVMConstVector(mask_elems.data, cast(unsigned)mask_elems.count); + LLVMValueRef transposed_vector = llvm_basic_shuffle(p, vector, mask); + lbAddr res = lb_add_local_generated(p, type, false); - lbAddr res = lb_add_local_generated(p, type, true); - for_array(i, rows) { - LLVMValueRef row = rows[i]; - lbValue dst_row_ptr = lb_emit_matrix_epi(p, res.addr, 0, i); - LLVMValueRef ptr = dst_row_ptr.value; - ptr = LLVMBuildPointerCast(p->builder, ptr, LLVMPointerType(LLVMTypeOf(row), 0), ""); - LLVMBuildStore(p->builder, row, ptr); - } + LLVMValueRef res_ptr = res.addr.value; + res_ptr = LLVMBuildPointerCast(p->builder, res_ptr, LLVMPointerType(LLVMTypeOf(transposed_vector), 0), ""); + + LLVMValueRef store = LLVMBuildStore(p->builder, transposed_vector, res_ptr); + LLVMSetAlignment(store, cast(unsigned)type_align_of(type)); return lb_addr_load(p, res); } From 86a6f69793988ed8967c7cd91fdaf67e6821ef37 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 11 May 2026 14:01:50 +0100 Subject: [PATCH 043/228] General clean up --- src/llvm_backend_expr.cpp | 58 +++++++++--------------------------- src/llvm_backend_utility.cpp | 1 + 2 files changed, 15 insertions(+), 44 deletions(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 968d27a4e..53e0d32de 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -866,8 +866,10 @@ gb_internal lbValue lb_emit_matrix_transpose(lbProcedure *p, lbValue m, Type *ty return lb_addr_load(p, res); } -gb_internal lbValue lb_matrix_cast_vector_to_type(lbProcedure *p, LLVMValueRef vector, Type *type) { - lbAddr res = lb_add_local_generated(p, type, true); +gb_internal lbAddr llvm_add_local_generated_from_vector(lbProcedure *p, Type *type, LLVMValueRef vector) { + GB_ASSERT(LLVMGetTypeKind(LLVMTypeOf(vector)) == LLVMVectorTypeKind); + + lbAddr res = lb_add_local_generated(p, type, false); LLVMValueRef res_ptr = res.addr.value; unsigned alignment = cast(unsigned)gb_max(type_align_of(type), lb_alignof(LLVMTypeOf(vector))); LLVMSetAlignment(res_ptr, alignment); @@ -875,9 +877,16 @@ gb_internal lbValue lb_matrix_cast_vector_to_type(lbProcedure *p, LLVMValueRef v res_ptr = LLVMBuildPointerCast(p->builder, res_ptr, LLVMPointerType(LLVMTypeOf(vector), 0), ""); LLVMBuildStore(p->builder, vector, res_ptr); + return res; +} + +gb_internal lbValue lb_matrix_cast_vector_to_type(lbProcedure *p, LLVMValueRef vector, Type *type) { + lbAddr res = llvm_add_local_generated_from_vector(p, type, vector); return lb_addr_load(p, res); } + + gb_internal lbValue lb_emit_matrix_flatten(lbProcedure *p, lbValue m, Type *type) { if (is_type_array(m.type)) { // no-op @@ -895,31 +904,6 @@ gb_internal lbValue lb_emit_matrix_flatten(lbProcedure *p, lbValue m, Type *type lbValue n = lb_const_int(p->module, t_int, type_size_of(type)); lb_mem_copy_non_overlapping(p, res.addr, m_ptr, n); - // i64 row_count = mt->Matrix.row_count; - // i64 column_count = mt->Matrix.column_count; - // TEMPORARY_ALLOCATOR_GUARD(); - - // auto srcs = array_make(temporary_allocator(), 0, row_count*column_count); - // auto dsts = array_make(temporary_allocator(), 0, row_count*column_count); - - // for (i64 j = 0; j < column_count; j++) { - // for (i64 i = 0; i < row_count; i++) { - // lbValue src = lb_emit_matrix_ev(p, m, i, j); - // array_add(&srcs, src); - // } - // } - - // for (i64 j = 0; j < column_count; j++) { - // for (i64 i = 0; i < row_count; i++) { - // lbValue dst = lb_emit_array_epi(p, res.addr, i + j*row_count); - // array_add(&dsts, dst); - // } - // } - - // GB_ASSERT(srcs.count == dsts.count); - // for_array(i, srcs) { - // lb_emit_store(p, dsts[i], srcs[i]); - // } return lb_addr_load(p, res); } @@ -1328,27 +1312,13 @@ gb_internal lbValue lb_emit_vector_mul_matrix(lbProcedure *p, lbValue lhs, lbVal GB_ASSERT(row_count > 0); - LLVMValueRef vector = nullptr; - for (i64 i = 0; i < row_count; i++) { - if (i == 0) { - vector = llvm_vector_mul(p, v_rows[i], m_columns[i]); - } else { - vector = llvm_vector_mul_add(p, v_rows[i], m_columns[i], vector); - } - } - - lbAddr res = lb_add_local_generated(p, type, true); - LLVMValueRef res_ptr = res.addr.value; - unsigned alignment = cast(unsigned)gb_max(type_align_of(type), lb_alignof(LLVMTypeOf(vector))); - LLVMSetAlignment(res_ptr, alignment); - - res_ptr = LLVMBuildPointerCast(p->builder, res_ptr, LLVMPointerType(LLVMTypeOf(vector), 0), ""); - LLVMBuildStore(p->builder, vector, res_ptr); + LLVMValueRef vector = llvm_vector_mul_pairwise_reduce_add(p, v_rows, m_columns); + lbAddr res = llvm_add_local_generated_from_vector(p, type, vector); return lb_addr_load(p, res); } - lbAddr res = lb_add_local_generated(p, type, true); + lbAddr res = lb_add_local_generated(p, type, false); Type *vector_elem_type = base_array_type(rhs.type); diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index 25481b2ed..bb3b4dadb 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -2293,6 +2293,7 @@ gb_internal LLVMValueRef llvm_vector_mul_add(lbProcedure *p, LLVMValueRef a, LLV } } + gb_internal LLVMValueRef llvm_get_inline_asm(LLVMTypeRef func_type, String const &str, String const &clobbers, bool has_side_effects=true, bool is_align_stack=false, LLVMInlineAsmDialect dialect=LLVMInlineAsmDialectATT) { return LLVMGetInlineAsm(func_type, cast(char *)str.text, cast(size_t)str.len, From 724ce14677b46473a6c5718371da1cffe4dab2ab Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 11 May 2026 15:44:12 +0100 Subject: [PATCH 044/228] More improvements to linalg functions --- core/math/linalg/extended.odin | 80 +++++++++++++++++----------------- core/math/linalg/general.odin | 13 +++--- 2 files changed, 46 insertions(+), 47 deletions(-) diff --git a/core/math/linalg/extended.odin b/core/math/linalg/extended.odin index 0470054c3..9e00a76d2 100644 --- a/core/math/linalg/extended.odin +++ b/core/math/linalg/extended.odin @@ -7,7 +7,7 @@ import "core:math" @(require_results) to_radians :: proc "contextless" (degrees: $T) -> (out: T) where IS_NUMERIC(ELEM_TYPE(T)) { when IS_ARRAY(T) { - for i in 0.. (out: T) where IS_NUMERIC(ELEM @(require_results) to_degrees :: proc "contextless" (radians: $T) -> (out: T) where IS_NUMERIC(ELEM_TYPE(T)) { when IS_ARRAY(T) { - for i in 0.. (out: T) where IS_NUMERIC(ELEM @(require_results) min_double :: proc "contextless" (a, b: $T) -> (out: T) where IS_NUMERIC(ELEM_TYPE(T)) { when IS_ARRAY(T) { - for i in 0.. (out: ELEM_TYPE(T)) where IS_NUMERIC out = builtin.min(a[0], a[1]) } else { out = builtin.min(a[0], a[1]) - for i in 2.. (out: T) where IS_NUMERIC(ELEM_TYPE(T)) { when IS_ARRAY(T) { - for i in 0.. (out: ELEM_TYPE(T)) where IS_NUMERIC out = builtin.max(a[0], a[1], a[2]) }else { out = builtin.max(a[0], a[1]) - for i in 2.. (out: T) where IS_NUMERIC(ELEM_TYPE(T)) { when IS_ARRAY(T) { - for i in 0.. (out: T) where IS_NUMERIC(ELEM_TYPE(T)) { @(require_results) sign :: proc "contextless" (a: $T) -> (out: T) where IS_NUMERIC(ELEM_TYPE(T)) { when IS_ARRAY(T) { - for i in 0.. (out: T) where IS_NUMERIC(ELEM_TYPE(T)) { @(require_results) clamp :: proc "contextless" (x, a, b: $T) -> (out: T) where IS_NUMERIC(ELEM_TYPE(T)) { when IS_ARRAY(T) { - for i in 0.. T where IS_FLOAT(ELEM_TYPE(T)) { @(require_results) lerp :: proc "contextless" (a, b, t: $T) -> (out: T) where IS_FLOAT(ELEM_TYPE(T)) { when IS_ARRAY(T) { - for i in 0.. (out: T) where IS_FLOAT(ELEM_TYPE(T) @(require_results) mix :: proc "contextless" (a, b, t: $T) -> (out: T) where IS_FLOAT(ELEM_TYPE(T)) { when IS_ARRAY(T) { - for i in 0.. T where IS_FLOAT(ELEM_TYPE(T)) { @(require_results) step :: proc "contextless" (e, x: $T) -> (out: T) where IS_FLOAT(ELEM_TYPE(T)) { when IS_ARRAY(T) { - for i in 0.. T where IS_FLOAT(ELEM_TYPE @(require_results) sqrt :: proc "contextless" (x: $T) -> (out: T) where IS_FLOAT(ELEM_TYPE(T)) { when IS_ARRAY(T) { - for i in 0.. (out: T) where IS_FLOAT(ELEM_TYPE(T)) { @(require_results) inverse_sqrt :: proc "contextless" (x: $T) -> (out: T) where IS_FLOAT(ELEM_TYPE(T)) { when IS_ARRAY(T) { - for i in 0.. (out: T) where IS_FLOAT(ELEM_TYPE( @(require_results) cos :: proc "contextless" (x: $T) -> (out: T) where IS_FLOAT(ELEM_TYPE(T)) { when IS_ARRAY(T) { - for i in 0.. (out: T) where IS_FLOAT(ELEM_TYPE(T)) { @(require_results) sin :: proc "contextless" (x: $T) -> (out: T) where IS_FLOAT(ELEM_TYPE(T)) { when IS_ARRAY(T) { - for i in 0.. (out: T) where IS_FLOAT(ELEM_TYPE(T)) { @(require_results) tan :: proc "contextless" (x: $T) -> (out: T) where IS_FLOAT(ELEM_TYPE(T)) { when IS_ARRAY(T) { - for i in 0.. (out: T) where IS_FLOAT(ELEM_TYPE(T)) { @(require_results) acos :: proc "contextless" (x: $T) -> (out: T) where IS_FLOAT(ELEM_TYPE(T)) { when IS_ARRAY(T) { - for i in 0.. (out: T) where IS_FLOAT(ELEM_TYPE(T)) { @(require_results) asin :: proc "contextless" (x: $T) -> (out: T) where IS_FLOAT(ELEM_TYPE(T)) { when IS_ARRAY(T) { - for i in 0.. (out: T) where IS_FLOAT(ELEM_TYPE(T)) { @(require_results) atan :: proc "contextless" (x: $T) -> (out: T) where IS_FLOAT(ELEM_TYPE(T)) { when IS_ARRAY(T) { - for i in 0.. (out: T) where IS_FLOAT(ELEM_TYPE(T)) { @(require_results) atan2 :: proc "contextless" (y, x: $T) -> (out: T) where IS_FLOAT(ELEM_TYPE(T)) { when IS_ARRAY(T) { - for i in 0.. (out: T) where IS_FLOAT(ELEM_TYPE(T)) @(require_results) ln :: proc "contextless" (x: $T) -> (out: T) where IS_FLOAT(ELEM_TYPE(T)) { when IS_ARRAY(T) { - for i in 0.. (out: T) where IS_FLOAT(ELEM_TYPE(T)) { log2 :: proc "contextless" (x: $T) -> (out: T) where IS_FLOAT(ELEM_TYPE(T)) { INVLN2 :: 1.4426950408889634073599246810018921374266459541529859341354494069 when IS_ARRAY(T) { - for i in 0.. (out: T) where IS_FLOAT(ELEM_TYPE(T)) { log10 :: proc "contextless" (x: $T) -> (out: T) where IS_FLOAT(ELEM_TYPE(T)) { INVLN10 :: 0.4342944819032518276511289189166050822943970058036665661144537831 when IS_ARRAY(T) { - for i in 0.. (out: T) where IS_FLOAT(ELEM_TYPE(T)) { @(require_results) log :: proc "contextless" (x, b: $T) -> (out: T) where IS_FLOAT(ELEM_TYPE(T)) { when IS_ARRAY(T) { - for i in 0.. (out: T) where IS_FLOAT(ELEM_TYPE(T)) { @(require_results) exp :: proc "contextless" (x: $T) -> (out: T) where IS_FLOAT(ELEM_TYPE(T)) { when IS_ARRAY(T) { - for i in 0.. (out: T) where IS_FLOAT(ELEM_TYPE(T)) { @(require_results) exp2 :: proc "contextless" (x: $T) -> (out: T) where IS_FLOAT(ELEM_TYPE(T)) { when IS_ARRAY(T) { - for i in 0.. (out: T) where IS_FLOAT(ELEM_TYPE(T)) { @(require_results) exp10 :: proc "contextless" (x: $T) -> (out: T) where IS_FLOAT(ELEM_TYPE(T)) { when IS_ARRAY(T) { - for i in 0.. (out: T) where IS_FLOAT(ELEM_TYPE(T)) { @(require_results) pow :: proc "contextless" (x, e: $T) -> (out: T) where IS_FLOAT(ELEM_TYPE(T)) { when IS_ARRAY(T) { - for i in 0.. (out: T) where IS_FLOAT(ELEM_TYPE(T)) { @(require_results) round :: proc "contextless" (x: $T) -> (out: T) where IS_FLOAT(ELEM_TYPE(T)) { when IS_ARRAY(T) { - for i in 0.. bool where IS_FLOAT(T) { @(require_results) is_nan_array :: proc "contextless" (x: $A/[$N]$T) -> (out: [N]bool) where IS_FLOAT(T) { - for i in 0.. bool where IS_FLOAT(T) { @(require_results) is_inf_array :: proc "contextless" (x: $A/[$N]$T) -> (out: [N]bool) where IS_FLOAT(T) { - for i in 0.. math.Float_Class where IS_FLOAT @(require_results) classify_array :: proc "contextless" (x: $A/[$N]$T) -> (out: [N]math.Float_Class) where IS_FLOAT(T) { - for i in 0.. (out: [N]bool) where IS_ARRAY(A), IS_FLOAT(ELEM_TYPE(A)) { - for i in 0.. (out: [N]bool) where IS_ARRAY(A), IS_FLOAT(ELEM_TYPE(A)) { - for i in 0.. (out: [N]bool) where IS_ARRAY(A), IS_FLOAT(ELEM_TYPE(A)) { - for i in 0.. y[i] } return } @(require_results) greater_than_equal_array :: proc "contextless" (x, y: $A/[$N]$T) -> (out: [N]bool) where IS_ARRAY(A), IS_FLOAT(ELEM_TYPE(A)) { - for i in 0..= y[i] } return } @(require_results) equal_array :: proc "contextless" (x, y: $A/[$N]$T) -> (out: [N]bool) where IS_ARRAY(A), IS_FLOAT(ELEM_TYPE(A)) { - for i in 0.. (out: [N]bool) where IS_ARRAY(A), IS_FLOAT(ELEM_TYPE(A)) { - for i in 0.. (out: bool) { @(require_results) not :: proc "contextless" (x: $A/[$N]bool) -> (out: A) { for e, i in x { - out[i] = !e + #no_bounds_check out[i] = !e } return } diff --git a/core/math/linalg/general.odin b/core/math/linalg/general.odin index 6a7ba3937..7013de244 100644 --- a/core/math/linalg/general.odin +++ b/core/math/linalg/general.odin @@ -46,18 +46,17 @@ scalar_dot :: proc "contextless" (a, b: $T) -> T where IS_FLOAT(T), !IS_ARRAY(T) @(require_results) vector_dot :: proc "contextless" (a, b: $T/[$N]$E) -> (c: E) where IS_NUMERIC(E) #no_bounds_check { - ab := a * b when N == 1 { - return ab.x + return a.x*b.x } else when N == 2 { - return ab.x + ab.y + return a.x*b.x + a.y*b.y } else when N == 3 { - return ab.x + ab.y + ab.z + return a.x*b.x + a.y*b.y + a.z*b.z } else when N == 4 { - return ab.x + ab.y + ab.z + ab.w + return a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w } else { - for elem in ab { - c += elem + #unroll for _, i in a { + c += a[i]*b[i] } return c } From b603e7400fee0e5d501d2f53a657f1d6365899ba Mon Sep 17 00:00:00 2001 From: Sylphrena Date: Mon, 11 May 2026 21:53:57 +0200 Subject: [PATCH 045/228] Fix `make_aligned` and `new_aligned` to be builtin --- base/runtime/core_builtin.odin | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 92225303a..2b6b4511b 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -513,7 +513,7 @@ new :: proc($T: typeid, allocator := context.allocator, loc := #caller_location) t = (^T)(raw_data(mem_alloc_bytes(size_of(T), align_of(T), allocator, loc) or_return)) return } -@(require_results) +@(builtin, require_results) new_aligned :: proc($T: typeid, alignment: int, allocator := context.allocator, loc := #caller_location) -> (t: ^T, err: Allocator_Error) { t = (^T)(raw_data(mem_alloc_bytes(size_of(T), alignment, allocator, loc) or_return)) return @@ -530,7 +530,7 @@ new_clone :: proc(data: $T, allocator := context.allocator, loc := #caller_locat DEFAULT_DYNAMIC_ARRAY_CAPACITY :: 8 -@(require_results) +@(builtin, require_results) make_aligned :: proc($T: typeid/[]$E, #any_int len: int, alignment: int, allocator := context.allocator, loc := #caller_location) -> (res: T, err: Allocator_Error) #optional_allocator_error { err = _make_aligned_type_erased(&res, size_of(E), len, alignment, allocator, loc) return @@ -694,7 +694,7 @@ shrink_map :: proc(m: ^$T/map[$K]$V, loc := #caller_location) -> (did_shrink: bo // The delete_key built-in procedure deletes the element with the specified key (m[key]) from the map. // If m is nil, or there is no such element, this procedure is a no-op // It is safe to use `delete_key` while iterating a map. -// But if you iterate across a map and insert a new key, it could resize which means you are not iterating across all of the elements. +// But if you iterate across a map and insert a new key, it could resize which means you are not iterating across all of the elements. @builtin delete_key :: proc(m: ^$T/map[$K]$V, key: K) -> (deleted_key: K, deleted_value: V) { if m != nil { From 3b909eab0386560e350459763b3910ce30cd4a6e Mon Sep 17 00:00:00 2001 From: "Alexander Cusaac (MightyChubz)" Date: Mon, 11 May 2026 20:52:52 -0400 Subject: [PATCH 046/228] fix: Add missing parameter to TranslateCoordinates This adds the missing child_return parameter to TranslateCoordinates to fix random segfaults occurring when calling it. This function in the man pages for X11 list a child_return parameter, so I added it as part of the signature. After running 20 tests calling to this function, all passed without failing, compared to before where it crashed roughly ~60% of the time on my system. --- vendor/x11/xlib/xlib_procs.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/vendor/x11/xlib/xlib_procs.odin b/vendor/x11/xlib/xlib_procs.odin index 3ab4acd17..0c03f883f 100644 --- a/vendor/x11/xlib/xlib_procs.odin +++ b/vendor/x11/xlib/xlib_procs.odin @@ -295,6 +295,7 @@ foreign xlib { src_y: i32, dst_x: ^i32, dst_y: ^i32, + dst_child: ^Window, ) -> b32 --- QueryPointer :: proc( display: ^Display, From 202a4f19caea073a15ab75e0aa58cf2dca560c2b Mon Sep 17 00:00:00 2001 From: "Alexander Cusaac (MightyChubz)" Date: Mon, 11 May 2026 20:55:33 -0400 Subject: [PATCH 047/228] refactor: Change return type for IconifyWindow This one is a little tricky. While the docs show that XIconifyWIndow returns a Status type, hinting at the Status enum we have, it is not *treated* like a Status type. This function, so far in my experience, is the only one to return non-zero when successful, and zero when a failure occurrs (BadValue or BadWindow). Because of this, the type should actually be a b32 to act as a boolean. Zero (false) for failure, non-zero (true) for true. --- vendor/x11/xlib/xlib_procs.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/x11/xlib/xlib_procs.odin b/vendor/x11/xlib/xlib_procs.odin index 0c03f883f..528bcaa72 100644 --- a/vendor/x11/xlib/xlib_procs.odin +++ b/vendor/x11/xlib/xlib_procs.odin @@ -1302,7 +1302,7 @@ foreign xlib { dipslay: ^Display, window: Window, screen_no: i32, - ) -> Status --- + ) -> b32 --- WithdrawWindow :: proc( dipslay: ^Display, window: Window, From 8ac7819bf578408a3087689a603a5cce8413b7e2 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 12 May 2026 10:44:01 +0100 Subject: [PATCH 048/228] zero allocation --- src/llvm_backend_expr.cpp | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 53e0d32de..d9510d47d 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -1214,10 +1214,10 @@ gb_internal lbValue lb_emit_matrix_mul_vector(lbProcedure *p, lbValue lhs, lbVal LLVMValueRef matrix_vector = lb_matrix_to_vector(p, lhs); - for (unsigned column_index = 0; column_index < column_count; column_index++) { - LLVMValueRef mask = llvm_mask_iota(p->module, stride*column_index, row_count); + for (unsigned i = 0; i < column_count; i++) { + LLVMValueRef mask = llvm_mask_iota(p->module, stride*i, row_count); LLVMValueRef column = llvm_basic_shuffle(p, matrix_vector, mask); - m_columns[column_index] = column; + m_columns[i] = column; } if (LLVMIsALoadInst(rhs.value)) { @@ -1310,15 +1310,13 @@ gb_internal lbValue lb_emit_vector_mul_matrix(lbProcedure *p, lbValue lhs, lbVal v_rows[column_index] = row; } - GB_ASSERT(row_count > 0); - LLVMValueRef vector = llvm_vector_mul_pairwise_reduce_add(p, v_rows, m_columns); lbAddr res = llvm_add_local_generated_from_vector(p, type, vector); return lb_addr_load(p, res); } - lbAddr res = lb_add_local_generated(p, type, false); + lbAddr res = lb_add_local_generated(p, type, true); Type *vector_elem_type = base_array_type(rhs.type); @@ -4010,7 +4008,7 @@ gb_internal lbValue lb_emit_comp_against_nil(lbProcedure *p, TokenKind op_kind, } } break; - + case Type_SoaPointer: { // NOTE(bill): An SoaPointer is essentially just a pointer for nil comparison @@ -4715,7 +4713,7 @@ gb_internal lbValue lb_build_expr_internal(lbProcedure *p, Ast *expr) { case_ast_node(ie, IndexExpr, expr); return lb_addr_load(p, lb_build_addr(p, expr)); case_end; - + case_ast_node(ie, MatrixIndexExpr, expr); return lb_addr_load(p, lb_build_addr(p, expr)); case_end; @@ -6742,7 +6740,7 @@ gb_internal lbAddr lb_build_addr_internal(lbProcedure *p, Ast *expr) { case_ast_node(ac, AutoCast, expr); return lb_build_addr(p, ac->expr); case_end; - + case_ast_node(te, TernaryIfExpr, expr); LLVMValueRef incoming_values[2] = {}; LLVMBasicBlockRef incoming_blocks[2] = {}; @@ -6779,12 +6777,12 @@ gb_internal lbAddr lb_build_addr_internal(lbProcedure *p, Ast *expr) { return lb_addr(res); case_end; - + case_ast_node(oe, OrElseExpr, expr); lbValue ptr = lb_address_from_load_or_generate_local(p, lb_build_expr(p, expr)); return lb_addr(ptr); case_end; - + case_ast_node(oe, OrReturnExpr, expr); lbValue ptr = lb_address_from_load_or_generate_local(p, lb_build_expr(p, expr)); return lb_addr(ptr); @@ -6850,3 +6848,10 @@ gb_internal lbAddr lb_build_addr_internal(lbProcedure *p, Ast *expr) { return {}; } +st_strings[expr->kind]), + token_pos_to_string(token_pos)); + + + return {}; +} + From cd073bc797ebdc8bcc5afc6a3be7adf647458ade Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 12 May 2026 10:48:04 +0100 Subject: [PATCH 049/228] Remove bad merge issue --- src/llvm_backend_expr.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index d9510d47d..882c25232 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -6848,10 +6848,3 @@ gb_internal lbAddr lb_build_addr_internal(lbProcedure *p, Ast *expr) { return {}; } -st_strings[expr->kind]), - token_pos_to_string(token_pos)); - - - return {}; -} - From e0781c0e40d6212ef6af5c936afb581562affb19 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 12 May 2026 17:19:49 +0100 Subject: [PATCH 050/228] Just change the type when transposing #row_major to `#column_major` `matrix` types --- src/llvm_backend_expr.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 882c25232..fd148e5c5 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -819,6 +819,13 @@ gb_internal lbValue lb_emit_matrix_transpose(lbProcedure *p, lbValue m, Type *ty Type *rt = base_type(type); if (rt->kind == Type_Matrix && rt->Matrix.is_row_major != mt->Matrix.is_row_major) { + if (rt->Matrix.row_count == mt->Matrix.column_count && + rt->Matrix.column_count == mt->Matrix.row_count) { + lbValue res = m; + res.type = type; + return res; + } + GB_PANIC("TODO: transpose with changing layout"); } From bb9cddabac9f0e2f3113ce9f97c999898e3dc7f7 Mon Sep 17 00:00:00 2001 From: jason Date: Tue, 12 May 2026 18:24:08 -0400 Subject: [PATCH 051/228] linux.Stat -> linux.Statx This provides access to os.Stat.creation_time for Linux. Added a cast to string_interner.cpp for 32-bit compiles. --- core/os/dir_linux.odin | 4 ++-- core/os/file_linux.odin | 6 ++---- core/os/process_linux.odin | 8 ++++---- core/os/stat_linux.odin | 13 ++++++------- src/string_interner.cpp | 4 ++-- 5 files changed, 16 insertions(+), 19 deletions(-) diff --git a/core/os/dir_linux.odin b/core/os/dir_linux.odin index 1ca2ef9b4..b8b69eb7d 100644 --- a/core/os/dir_linux.odin +++ b/core/os/dir_linux.odin @@ -97,8 +97,8 @@ _read_directory_iterator_init :: proc(it: ^Read_Directory_Iterator, f: ^File) { return } - stat: linux.Stat - errno := linux.fstat(linux.Fd(fd(f)), &stat) + stat: linux.Statx + errno := linux.statx(linux.Fd(fd(f)), "", {.EMPTY_PATH}, {.MODE}, &stat) if errno != .NONE { read_directory_iterator_set_error(it, name(f), _get_platform_error(errno)) return diff --git a/core/os/file_linux.odin b/core/os/file_linux.odin index d4223ba5d..a92dbad73 100644 --- a/core/os/file_linux.odin +++ b/core/os/file_linux.odin @@ -279,10 +279,8 @@ _write_at :: proc(f: ^File_Impl, p: []byte, offset: i64) -> (nt: i64, err: Error @(no_sanitize_memory) _file_size :: proc(f: ^File_Impl) -> (n: i64, err: Error) { - // TODO: Identify 0-sized "pseudo" files and return No_Size. This would - // eliminate the need for the _read_entire_pseudo_file procs. - s: linux.Stat = --- - errno := linux.fstat(f.fd, &s) + s: linux.Statx = --- + errno := linux.statx(f.fd, "", {.EMPTY_PATH}, {.SIZE, .MODE}, &s) if errno != .NONE { return 0, _get_platform_error(errno) } diff --git a/core/os/process_linux.odin b/core/os/process_linux.odin index 5e6eff335..1cfc48ca6 100644 --- a/core/os/process_linux.odin +++ b/core/os/process_linux.odin @@ -129,8 +129,8 @@ _process_info_by_pid :: proc(pid: int, selection: Process_Info_Fields, allocator defer linux.close(proc_fd) username_if: if .Username in selection { - s: linux.Stat - if errno = linux.fstat(proc_fd, &s); errno != .NONE { + s: linux.Statx + if errno = linux.statx(proc_fd, "", {.EMPTY_PATH}, {.UID}, &s); errno != .NONE { err = _get_platform_error(errno) break username_if } @@ -438,8 +438,8 @@ _process_start :: proc(desc: Process_Desc) -> (process: Process, err: Error) { strings.write_string(&exe_builder, executable_name) exe_path = strings.to_cstring(&exe_builder) or_return - stat := linux.Stat{} - if linux.stat(exe_path, &stat) == .NONE && .IFREG in stat.mode && .IXUSR in stat.mode { + stat: linux.Statx + if linux.statx(linux.AT_FDCWD, exe_path, {}, {.MODE}, &stat) == .NONE && .IFREG in stat.mode && .IXUSR in stat.mode { found = true break } diff --git a/core/os/stat_linux.odin b/core/os/stat_linux.odin index 082279e8d..3abddc275 100644 --- a/core/os/stat_linux.odin +++ b/core/os/stat_linux.odin @@ -11,8 +11,8 @@ _fstat :: proc(f: ^File, allocator: runtime.Allocator) -> (File_Info, Error) { } _fstat_internal :: proc(fd: linux.Fd, allocator: runtime.Allocator) -> (fi: File_Info, err: Error) { - s: linux.Stat - errno := linux.fstat(fd, &s) + s: linux.Statx + errno := linux.statx(fd, "", {.EMPTY_PATH}, {.TYPE, .MODE, .ATIME, .MTIME, .CTIME, .INO, .SIZE}, &s) if errno != .NONE { return {}, _get_platform_error(errno) } @@ -28,7 +28,6 @@ _fstat_internal :: proc(fd: linux.Fd, allocator: runtime.Allocator) -> (fi: File } mode := transmute(Permissions)(0o7777 & transmute(u32)s.mode) - // TODO: As of Linux 4.11, the new statx syscall can retrieve creation_time fi = File_Info { fullpath = _get_full_path(fd, allocator) or_return, name = "", @@ -36,9 +35,9 @@ _fstat_internal :: proc(fd: linux.Fd, allocator: runtime.Allocator) -> (fi: File size = i64(s.size), mode = mode, type = type, - modification_time = time.Time {i64(s.mtime.time_sec) * i64(time.Second) + i64(s.mtime.time_nsec)}, - access_time = time.Time {i64(s.atime.time_sec) * i64(time.Second) + i64(s.atime.time_nsec)}, - creation_time = time.Time{i64(s.ctime.time_sec) * i64(time.Second) + i64(s.ctime.time_nsec)}, // regular stat does not provide this + modification_time = time.Time {i64(s.mtime.sec) * i64(time.Second) + i64(s.mtime.nsec)}, + access_time = time.Time {i64(s.atime.sec) * i64(time.Second) + i64(s.atime.nsec)}, + creation_time = time.Time {i64(s.btime.sec) * i64(time.Second) + i64(s.btime.nsec)}, } fi.creation_time = fi.modification_time _, fi.name = split_path(fi.fullpath) @@ -76,4 +75,4 @@ _same_file :: proc(fi1, fi2: File_Info) -> bool { _is_reserved_name :: proc(path: string) -> bool { return false -} \ No newline at end of file +} diff --git a/src/string_interner.cpp b/src/string_interner.cpp index 660dbc61d..916263fa3 100644 --- a/src/string_interner.cpp +++ b/src/string_interner.cpp @@ -81,7 +81,7 @@ gb_internal String string_interner_load(InternedString interned) { u8 *base = cast(u8 *)interner + interned.value; u32 str_len = *cast(u32 *)base; u8 *text = base + 4; - String str = { text, str_len }; + String str = { text, cast(isize)str_len }; return str; } @@ -228,4 +228,4 @@ gb_internal void *string_interner_thread_local_arena_alloc(StringInternerThreadL u8 *return_head = tl_arena->data + new_head; tl_arena->cursor = cursor; return return_head; -} \ No newline at end of file +} From 57b63263b3d31be45508c8a202fac94900c5c028 Mon Sep 17 00:00:00 2001 From: jason Date: Tue, 12 May 2026 18:53:39 -0400 Subject: [PATCH 052/228] get .MODE and .TYPE right --- core/os/dir_linux.odin | 2 +- core/os/file_linux.odin | 2 +- core/os/process_linux.odin | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/os/dir_linux.odin b/core/os/dir_linux.odin index b8b69eb7d..e0e658c26 100644 --- a/core/os/dir_linux.odin +++ b/core/os/dir_linux.odin @@ -98,7 +98,7 @@ _read_directory_iterator_init :: proc(it: ^Read_Directory_Iterator, f: ^File) { } stat: linux.Statx - errno := linux.statx(linux.Fd(fd(f)), "", {.EMPTY_PATH}, {.MODE}, &stat) + errno := linux.statx(linux.Fd(fd(f)), "", {.EMPTY_PATH}, {.TYPE}, &stat) if errno != .NONE { read_directory_iterator_set_error(it, name(f), _get_platform_error(errno)) return diff --git a/core/os/file_linux.odin b/core/os/file_linux.odin index a92dbad73..6b9540235 100644 --- a/core/os/file_linux.odin +++ b/core/os/file_linux.odin @@ -280,7 +280,7 @@ _write_at :: proc(f: ^File_Impl, p: []byte, offset: i64) -> (nt: i64, err: Error @(no_sanitize_memory) _file_size :: proc(f: ^File_Impl) -> (n: i64, err: Error) { s: linux.Statx = --- - errno := linux.statx(f.fd, "", {.EMPTY_PATH}, {.SIZE, .MODE}, &s) + errno := linux.statx(f.fd, "", {.EMPTY_PATH}, {.SIZE, .TYPE}, &s) if errno != .NONE { return 0, _get_platform_error(errno) } diff --git a/core/os/process_linux.odin b/core/os/process_linux.odin index 1cfc48ca6..2224222e1 100644 --- a/core/os/process_linux.odin +++ b/core/os/process_linux.odin @@ -439,7 +439,7 @@ _process_start :: proc(desc: Process_Desc) -> (process: Process, err: Error) { exe_path = strings.to_cstring(&exe_builder) or_return stat: linux.Statx - if linux.statx(linux.AT_FDCWD, exe_path, {}, {.MODE}, &stat) == .NONE && .IFREG in stat.mode && .IXUSR in stat.mode { + if linux.statx(linux.AT_FDCWD, exe_path, {}, {.TYPE, .MODE}, &stat) == .NONE && .IFREG in stat.mode && .IXUSR in stat.mode { found = true break } From 4de05d4b49751f45e77926b5aea6486b34bc8e88 Mon Sep 17 00:00:00 2001 From: ddenizozgur Date: Wed, 13 May 2026 04:08:05 +0300 Subject: [PATCH 053/228] vendor/x11: fix missing only_if_exists parameter in XInternAtoms --- vendor/x11/xlib/xlib_procs.odin | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/vendor/x11/xlib/xlib_procs.odin b/vendor/x11/xlib/xlib_procs.odin index 528bcaa72..80c9c5258 100644 --- a/vendor/x11/xlib/xlib_procs.odin +++ b/vendor/x11/xlib/xlib_procs.odin @@ -316,9 +316,10 @@ foreign xlib { ) -> Atom --- InternAtoms :: proc( display: ^Display, - names: [^]cstring, - count: i32, - atoms: [^]Atom, + names: [^]cstring, + count: i32, + only_if_exists: b32, + atoms_return: [^]Atom ) -> Status --- GetAtomName :: proc( display: ^Display, @@ -657,12 +658,12 @@ foreign xlib { SetGraphicsExposures :: proc(display: ^Display, gc: GC, exp: b32) --- // Graphics functions ClearArea :: proc( - display: ^Display, - window: Window, - x: i32, - y: i32, - width: u32, - height: u32, + display: ^Display, + window: Window, + x: i32, + y: i32, + width: u32, + height: u32, exp: b32, ) --- ClearWindow :: proc( From 844f813ab68ee3104e639b0e8197dd386ec373b7 Mon Sep 17 00:00:00 2001 From: "Alexander Cusaac (MightyChubz)" Date: Wed, 13 May 2026 00:51:31 -0400 Subject: [PATCH 054/228] refactor: Add returns to all window mapping/unmapping functions These do return a `b32` value on return, true for success and false for failure. They should be here since these can fail. --- vendor/x11/xlib/xlib_procs.odin | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/vendor/x11/xlib/xlib_procs.odin b/vendor/x11/xlib/xlib_procs.odin index 528bcaa72..12d12c4ef 100644 --- a/vendor/x11/xlib/xlib_procs.odin +++ b/vendor/x11/xlib/xlib_procs.odin @@ -181,11 +181,11 @@ foreign xlib { DestroyWindow :: proc(display: ^Display, window: Window) --- DestroySubwindows :: proc(display: ^Display, window: Window) --- // Windows: mapping/unmapping - MapWindow :: proc(display: ^Display, window: Window) --- - MapRaised :: proc(display: ^Display, window: Window) --- - MapSubwindows :: proc(display: ^Display, window: Window) --- - UnmapWindow :: proc(display: ^Display, window: Window) --- - UnmapSubwindows :: proc(display: ^Display, window: Window) --- + MapWindow :: proc(display: ^Display, window: Window) -> b32 --- + MapRaised :: proc(display: ^Display, window: Window) -> b32 --- + MapSubwindows :: proc(display: ^Display, window: Window) -> b32 --- + UnmapWindow :: proc(display: ^Display, window: Window) -> b32 --- + UnmapSubwindows :: proc(display: ^Display, window: Window) -> b32 --- // Windows: configuring ConfigureWindow :: proc( display: ^Display, From a1a201b4ffe21920bdbfcb46003fc44d78c2eecc Mon Sep 17 00:00:00 2001 From: "Alexander Cusaac (MightyChubz)" Date: Wed, 13 May 2026 00:51:40 -0400 Subject: [PATCH 055/228] typo oops --- vendor/x11/xlib/xlib_procs.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/x11/xlib/xlib_procs.odin b/vendor/x11/xlib/xlib_procs.odin index 12d12c4ef..19087fccb 100644 --- a/vendor/x11/xlib/xlib_procs.odin +++ b/vendor/x11/xlib/xlib_procs.odin @@ -1367,7 +1367,7 @@ foreign xlib { display: ^Display, window: Window, ) -> ^XWMHints --- - // Setting and reading MW_NORMAL_HINTS property + // Setting and reading WM_NORMAL_HINTS property AllocSizeHints :: proc() -> ^XSizeHints --- SetWMNormalHints :: proc( display: ^Display, From e294f3f1e16119c2d28fd92d4c2189b7f2997431 Mon Sep 17 00:00:00 2001 From: "Alexander Cusaac (MightyChubz)" Date: Wed, 13 May 2026 02:11:58 -0400 Subject: [PATCH 056/228] feat: Add atom constants for XA_CARDINAL and XA_INTEGER XA_CARDINAL is used in particular for frame extents. --- vendor/x11/xlib/xlib_const.odin | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vendor/x11/xlib/xlib_const.odin b/vendor/x11/xlib/xlib_const.odin index 6a57a516f..cb4037e45 100644 --- a/vendor/x11/xlib/xlib_const.odin +++ b/vendor/x11/xlib/xlib_const.odin @@ -110,6 +110,8 @@ PropModePrepend :: 1 PropModeAppend :: 2 XA_ATOM :: Atom(4) +XA_CARDINAL :: Atom(6) +XA_INTEGER :: Atom(19) XA_WM_CLASS :: Atom(67) XA_WM_CLIENT_MACHINE :: Atom(36) XA_WM_COMMAND :: Atom(34) From 53dd8075b1618710ec052abb287d9fa416f16a89 Mon Sep 17 00:00:00 2001 From: "Alexander Cusaac (MightyChubz)" Date: Wed, 13 May 2026 02:13:15 -0400 Subject: [PATCH 057/228] refactor: Clean signature for GetWindowProperty --- vendor/x11/xlib/xlib_procs.odin | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/vendor/x11/xlib/xlib_procs.odin b/vendor/x11/xlib/xlib_procs.odin index 19087fccb..ad4a2b6e9 100644 --- a/vendor/x11/xlib/xlib_procs.odin +++ b/vendor/x11/xlib/xlib_procs.odin @@ -339,10 +339,10 @@ foreign xlib { long_len: int, delete: b32, req_type: Atom, - act_type: [^]Atom, - act_format: [^]i32, - nitems: [^]uint, - bytes_after: [^]uint, + act_type: ^Atom, + act_format: ^i32, + nitems: ^uint, + bytes_after: ^uint, props: ^rawptr, ) -> i32 --- ListProperties :: proc( From 310d27ff19df7c97eae9305223284c99be44171a Mon Sep 17 00:00:00 2001 From: "Alexander Cusaac (MightyChubz)" Date: Wed, 13 May 2026 02:13:46 -0400 Subject: [PATCH 058/228] fix: Change discard from bool to b32 in Sync --- vendor/x11/xlib/xlib_procs.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/x11/xlib/xlib_procs.odin b/vendor/x11/xlib/xlib_procs.odin index ad4a2b6e9..30bf54921 100644 --- a/vendor/x11/xlib/xlib_procs.odin +++ b/vendor/x11/xlib/xlib_procs.odin @@ -1027,7 +1027,7 @@ foreign xlib { // Events SelectInput :: proc(display: ^Display, window: Window, mask: EventMask) --- Flush :: proc(display: ^Display) -> i32 --- - Sync :: proc(display: ^Display, discard: bool) -> i32 --- + Sync :: proc(display: ^Display, discard: b32) -> i32 --- EventsQueued :: proc(display: ^Display, mode: EventQueueMode) -> i32 --- Pending :: proc(display: ^Display) -> i32 --- NextEvent :: proc(display: ^Display, event: ^XEvent) --- From 7c2588b1016f6ae6bc8add25f7bf93c7cb84fc9c Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 13 May 2026 14:05:20 +0100 Subject: [PATCH 059/228] Fix formatting to keep `-vet` happy --- vendor/x11/xlib/xlib_procs.odin | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/vendor/x11/xlib/xlib_procs.odin b/vendor/x11/xlib/xlib_procs.odin index 80c9c5258..8d1c2cc94 100644 --- a/vendor/x11/xlib/xlib_procs.odin +++ b/vendor/x11/xlib/xlib_procs.odin @@ -315,11 +315,11 @@ foreign xlib { existing: b32, ) -> Atom --- InternAtoms :: proc( - display: ^Display, - names: [^]cstring, - count: i32, + display: ^Display, + names: [^]cstring, + count: i32, only_if_exists: b32, - atoms_return: [^]Atom + atoms_return: [^]Atom, ) -> Status --- GetAtomName :: proc( display: ^Display, From 6888cca9822d98cab1781f4137d6cf7c1da3041c Mon Sep 17 00:00:00 2001 From: "Alexander Cusaac (MightyChubz)" Date: Wed, 13 May 2026 18:07:57 -0400 Subject: [PATCH 060/228] refactor: Change bit_set type for SizeHints to int This doesn't really change actual behavior, but to stay accurate to the internal logic of X11, this would be a regular long for the flags, not an unsigned long. --- vendor/x11/xlib/xlib_const.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/x11/xlib/xlib_const.odin b/vendor/x11/xlib/xlib_const.odin index cb4037e45..9163d1830 100644 --- a/vendor/x11/xlib/xlib_const.odin +++ b/vendor/x11/xlib/xlib_const.odin @@ -713,7 +713,7 @@ AllHints :: WMHints{ .WindowGroupHint, } -SizeHints :: bit_set[SizeHintsBits; uint] +SizeHints :: bit_set[SizeHintsBits; int] SizeHintsBits :: enum { USPosition = 0, USSize = 1, From 765776d136162c27a359127f626edcb17d8d84b9 Mon Sep 17 00:00:00 2001 From: Spooky309 Date: Sat, 16 May 2026 10:56:17 +0100 Subject: [PATCH 061/228] Honour no-thread-local for variables declared at procedure scope --- src/check_stmt.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index d6987a332..617002281 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -2260,7 +2260,9 @@ gb_internal void check_value_decl_stmt(CheckerContext *ctx, Ast *node, u32 mod_f error(e->token, "'thread_local' variables cannot be declared within a defer statement"); } } - e->Variable.thread_local_model = ac.thread_local_model; + if (!build_context.no_thread_local) { + e->Variable.thread_local_model = ac.thread_local_model; + } } if (ac.is_static && ac.thread_local_model != "") { From e6d10b02e593af1d2b98acd475d8cfb7cc004b87 Mon Sep 17 00:00:00 2001 From: dogue Date: Sat, 16 May 2026 14:07:41 -0400 Subject: [PATCH 062/228] [core:io/utils]: fix undeclared name in read_slice (typo) Fixes a typo where `read_slice` tries to pass a `w` argument to `read_ptr` instead of `r`. --- core/io/util.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/io/util.odin b/core/io/util.odin index c6ad8f525..35297c121 100644 --- a/core/io/util.odin +++ b/core/io/util.odin @@ -10,7 +10,7 @@ read_ptr :: proc(r: Reader, p: rawptr, byte_size: int, n_read: ^int = nil) -> (n read_slice :: proc(r: Reader, slice: $S/[]$T, n_read: ^int = nil) -> (n: int, err: Error) { size := len(slice)*size_of(T) - return read_ptr(w, raw_data(slice), size, n_read) + return read_ptr(r, raw_data(slice), size, n_read) } write_ptr :: proc(w: Writer, p: rawptr, byte_size: int, n_written: ^int = nil) -> (n: int, err: Error) { From d8bbdf5ae651a465393ec5a593a857d3a72f4179 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 17 May 2026 12:54:22 +0100 Subject: [PATCH 063/228] Add EBNF for Odin --- odin.ebnf | 466 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 466 insertions(+) create mode 100644 odin.ebnf diff --git a/odin.ebnf b/odin.ebnf new file mode 100644 index 000000000..0b0932b86 --- /dev/null +++ b/odin.ebnf @@ -0,0 +1,466 @@ +/* The Odin Programming Language Expressed as in EBNF */ + +/* +EBNF representation of itself: + +Production = name "=" [ Expression ] "." ; +Expression = Alternative { "|" Alternative } ; +Alternative = Term { Term } ; +Term = name | token [ "…" token ] | Group | Option | Repetition ; +Group = "(" Expression ")" ; +Option = "[" Expression "]" ; +Repetition = "{" Expression "}" ; +*/ + + +/* Tokens for Lexical Grammar */ + +IDENT = ( LETTER | "_" ) { LETTER | DIGIT | "_" } ; +LETTER = "a".."z" | "A".."Z" | "_" | UNICODE_LETTER ; + +INT_LIT = DECIMAL_LIT | BINARY_LIT | OCTAL_LIT | DOZENAL_LIT | HEX_LIT ; +DECIMAL_LIT = DIGIT { [ "_" ] DIGIT } ; +BINARY_LIT = "0b" BIN_DIGIT { [ "_" ] BIN_DIGIT } ; +OCTAL_LIT = "0o" OCT_DIGIT { [ "_" ] OCT_DIGIT } ; +DOZENAL_LIT = "0z" DOZ_DIGIT { [ "_" ] DOZ_DIGIT } ; +HEX_LIT = "0x" HEX_DIGIT { [ "_" ] HEX_DIGIT } ; + +FLOAT_LIT = DIGIT { DIGIT } "." DIGIT { DIGIT } [ EXPONENT ] + | DIGIT { DIGIT } EXPONENT + | "0h" HEX_DIGIT { [ "_" HEX_DIGIT ]} ; + +EXPONENT = ( "e" | "E" ) [ "+" | "-" ] DIGIT { DIGIT } ; + +IMAGINARY_LIT = ( INT_LIT | FLOAT_LIT ) ( "i" | "j" | "k" ) ; + +RUNE_LIT = "'" ( CHAR | ESCAPE_SEQ ) "'" ; + +STRING_LIT = '"' { CHAR | ESCAPE_SEQ } '"' ; +RAW_STRING_LIT = "`" { ANY_CHAR } "`" ; + +ESCAPE_SEQ = "\" ( "a" | "b" | "e" | "f" | "n" | "r" | "t" | "v" + | "\\" | '"' | "'" + | OCT_DIGIT OCT_DIGIT OCT_DIGIT + | "x" HEX_DIGIT HEX_DIGIT + | "u" HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT + | "U" HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT + HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT ) ; + +DIGIT = "0".."9" ; +BIN_DIGIT = "0" | "1" ; +OCT_DIGIT = "0".."7" ; +DOZ_DIGIT = "0".."9" | "a"| "b" | "A" | "B" ; +HEX_DIGIT = "0".."9" | "a".."f" | "A".."F" ; + +COMMENT = "//" { ANY_CHAR } NEWLINE + | "/*" { ANY_CHAR | COMMENT } "*/" /* nestable */ + | "#!" { ANY_CHAR } NEWLINE ; + +/* Odin uses automatic semicolon insertion similar to Go/Python: + a newline acts as ";" after certain tokens such as IDENT, + literals, ")", "]", "}", "^", "---", "break", "continue", + "fallthrough", "return", "or_return", "or_break", "or_continue". + + During parsing, ";" will be ignored with matching brackets in expressions similar to Python: + "(" ")" + "[" "]" + "{" "}" +*/ + + + +/* Syntax Grammar */ + +/* NOTE: Any directive such as "#partial" can also be written with any number of whitespace after the "#" + This grammar is simplified to represent minimize the need for "#" "partial" +*/ + + +File = { FileTag } PackageDecl ";" { TopLevelStmt } ; +FileTag = "#+" IDENT [ TagValue ] NEWLINE ; /* #+build, #+private, #+feature, … */ +TagValue = { ANY_CHAR } ; +PackageDecl = "package" IDENT ; + +TopLevelStmt = ImportDecl ";" + | ForeignImportDecl ";" + | ForeignBlock ";" + | WhenStmt + | Decl ";" ; + + +ImportDecl = { Attribute } "import" [ IDENT ] STRING_LIT ; + +ForeignImportDecl = { Attribute } "foreign" "import" [ IDENT ] ( STRING_LIT | "{" ForeignImportPathList "}" ) ; + +ForeignImportPathList = Expr { "," Expr } [ "," ] ; + + +Decl = { Attribute } ValueDecl ; + +ValueDecl = IdentList ":" Type + | IdentList ":" [ Type ] "=" ExprList + | IdentList ":" [ Type ] ":" ExprList ; + +IdentList = IDENT { "," IDENT } ; +ExprList = Expr { "," Expr } ; + +Stmt = EmptyStmt + | Decl ";" + | ExprStmt ";" + | AssignStmt ";" + | BlockStmt + | IfStmt + | WhenStmt + | ForStmt + | SwitchStmt + | TypeSwitchStmt + | DeferStmt + | ReturnStmt ";" + | BranchStmt ";" + | UsingStmt ";" + | Attribute Stmt + | Label Stmt + | ForeignBlock + | DirectiveStmt ; + + +EmptyStmt = ";" ; + + +BlockStmt = [ Label ] "{" StmtList "}" ; +StmtList = { Stmt } ; +Label = IDENT ":" ; + + + +ExprStmt = Expr ; + +AssignStmt = ExprList AssignOp ExprList ; + +AssignOp = "=" | "+=" | "-=" | "*=" | "/=" | "%=" | "%%=" + | "|=" | "~=" | "&=" | "&~=" + | "<<=" | ">>=" | "&&=" | "||=" ; + + + +IfStmt = "if" [ SimpleStmt ";" ] Expr StmtBody + { "else" "if" [ SimpleStmt ";" ] Expr StmtBody } + [ "else" StmtBody ] ; + +WhenStmt = "when" Expr StmtBody + { "else" "when" Expr StmtBody } + [ "else" StmtBody ] ; + +ForStmt = [ Label ] [ ForDirectivePrefix ] + "for" [ ForHead ] StmtBody ; + +ForDirectivePrefix = "#reverse" + | "#unroll" [ CallBody ] ; + +ForHead = RangeClause + | ForCondition + | ForCClause ; + +ForCondition = Expr ; + +ForCClause = [ SimpleStmt ] ";" [ Expr ] ";" [ SimpleStmt ] ; + +RangeClause = [ [ SimpleStmt ] ";" ] [ [ "&" ] IDENT { "," [ "&" ] IDENT } "in" ] RangeExpr ; + +RangeExpr = Expr + | Expr "..<" Expr + | Expr "..=" Expr ; + +SwitchStmt = [ Label ] [ "#partial" ] "switch" [ SimpleStmt ";" ] [ Expr ] + "{" { CaseClause } "}" ; + +CaseClause = "case" [ ExprList ] ":" StmtList ; + +TypeSwitchStmt = [ Label ] [ "#partial" ] "switch" IDENT "in" Expr + "{" { TypeCaseClause } "}" ; + +TypeCaseClause = "case" [ TypeList ] ":" StmtList ; + +TypeList = Type { "," Type } ; + + + +BranchStmt = "break" [ IDENT ] + | "continue" [ IDENT ] + | "fallthrough" ; + +DeferStmt = "defer" ( Stmt | ( "{" StmtList "}" ) ) ; + +ReturnStmt = [ ReturnStmtDirectivePrefix ] "return" [ ExprList ] ; +ReturnStmtDirectivePrefix = "#force_inline" | "#force_no_inline" | "#must_tail" ; + + +UsingStmt = "using" ( IdentList | Expr ) ; + + +SimpleStmt = ExprStmt | AssignStmt | ValueDecl ; + + +StmtBody = "{" StmtList "}" + | "do" Stmt ; /* must be on the same line as the initial token of the statement */ + + +/* Binary Expressions */ + +Expr = OrElseExpr ; + +OrElseExpr = TernaryExpr { "or_else" TernaryExpr } ; + +TernaryExpr = RangeExprLvl + | RangeExprLvl "?" RangeExprLvl ":" TernaryExpr + | RangeExprLvl "if" RangeExprLvl "else" TernaryExpr + | RangeExprLvl "when" RangeExprLvl "else" TernaryExpr ; + +RangeExprLvl = LogicalOrExpr [ "..<" | "..=" ] LogicalOrExpr ; + +LogicalOrExpr = LogicalAndExpr { "||" LogicalAndExpr } ; +LogicalAndExpr = ComparisonExpr { "&&" ComparisonExpr } ; + +ComparisonExpr = AddExpr { CompareOp AddExpr } ; +CompareOp = "==" | "!=" | "<" | "<=" | ">" | ">=" ; + +AddExpr = MulExpr { AddOp MulExpr } ; +AddOp = "+" | "-" | "|" | "~" | "in" | "not_in" ; + +MulExpr = UnaryExpr { MulOp UnaryExpr } ; +MulOp = "*" | "/" | "%" | "%%" | "&" | "&~" | "<<" | ">>" ; + +/* Unary Expression */ + +UnaryExpr = PostfixExpr + | UnaryOp UnaryExpr + | "cast" "(" Type ")" UnaryExpr + | "transmute" "(" Type ")" UnaryExpr + | "auto_cast" UnaryExpr + | "." IDENT /* implicit selector */; + +UnaryOp = "+" | "-" | "~" | "&" | "!" ; + + + +PostfixExpr = Operand { PostfixOp } ; + +PostfixOp = CallBody /* call */ + | "->" IDENT CallBody /* selector call */ + | "." IDENT /* field selector */ + | "." "?" /* inferred type assertion */ + | "." "(" Type ")" /* type assertion */ + | "[" Expr "]" /* index */ + | "[" [ Expr ] ":" [ Expr ] "]" /* slice */ + | "[" Expr "," Expr "]" /* matrix index */ + | "^" /* pointer deref */ + | PostfixOrOp ; + +CallBody = "(" [ ArgList ] ")" ; + + +PostfixOrOp = "or_return" + | "or_break" [ IDENT ] + | "or_continue" [ IDENT ] ; + +ArgList = Arg { "," Arg } [ "," ] ; +Arg = [ IDENT "=" ] Expr + | ".." Expr ; /* spread */ + + +Operand = IDENT + | "---" /* unintialized expression */ + | "context" + | "typeid" + | Literal + | "(" Expr ")" + | ProcLiteral + | ProcGroup + | [ "#partial" ] CompoundLiteral + | DirectiveExpr + | Type ; + +DirectiveExpr = "#" IDENT ; /* Used as the catch all */ + + +Literal = INT_LIT + | FLOAT_LIT + | IMAGINARY_LIT + | RUNE_LIT + | STRING_LIT + | RAW_STRING_LIT ; + + + +CompoundLiteral = [ Type ] "{" [ ElementList ] "}" ; + +ElementList = Element { "," Element } [ "," ] ; + +Element = Expr [ "=" Expr ] + | ( Expr "..<" Expr | Expr "..=" Expr ) "=" Expr ; + +Type = TypeName + | TypeLit + | "(" Type ")" + | "distinct" Type + | "typeid" + | "#type" Type ; + +TypeName = IDENT + | QualifiedIdent + | PolyType ; + +QualifiedIdent = IDENT "." IDENT ; + +PolyType = "$" IDENT [ "/" Type ] ; + +TypeLit = PointerType + | MultiPointerType + | ArrayType + | SliceType + | DynArrayType + | FixedCapDynArrayType + | MapType + | StructType + | UnionType + | EnumType + | BitSetType + | BitFieldType + | ProcType + | MatrixType + | SimdType + | SOAType ; + + +PointerType = "^" Type ; +MultiPointerType = "[^]" Type ; + + + +ArrayType = "[" Expr "]" Type /* fixed-length or enumerated array */ + | "[" "?" "]" Type /* infer-length array */ + | "[" EnumType "]" Type ; /* enumerated array */ + +SliceType = "[" "]" Type ; + +DynArrayType = "[" "dynamic" "]" Type ; + +FixedCapDynArrayType = "[" "dynamic" ";" Expr "]" Type ; /* [dynamic; N]T */ + +MapType = "map" "[" Type "]" Type ; + + +StructType = "struct" + [ "(" PolyParamList ")" ] + [ StructDirectives ] + [ WhereClause ] + "{" [ FieldList ] "}" ; + +StructDirectives = { "#packed" + | "#raw_union" + | "#align" "(" Expr ")" + | "#min_field_align" "(" Expr ")" + | "#max_field_align" "(" Expr ")" + | "#simple" + | "#all_or_none" } ; + +FieldList = Field { "," Field } [ "," ] ; + +Field = FieldNameList ":" Type [ FieldTag ] ; + +FieldNameList = FieldName { "," FieldName } ; +FieldName = [ "using" | "#subtype" ] IDENT ; + +FieldTag = STRING_LIT | RAW_STRING_LIT ; + +UnionType = "union" + [ "(" PolyParamList ")" ] + [ UnionDirectives ] + [ WhereClause ] + "{" [ TypeList ] "}" ; + +UnionDirectives = { "#no_nil" + | "#shared_nil" + | "#align" "(" Expr ")" } ; + + +EnumType = "enum" [ Type ] "{" [ EnumFieldList ] "}" ; + +EnumFieldList = EnumField { "," EnumField } [ "," ] ; +EnumField = IDENT [ "=" Expr ] ; + + +BitSetType = "bit_set" "[" ( Type | RangeExpr ) [ ";" Type ] "]" ; + +BitFieldType = "bit_field" Type "{" [ BitFieldList ] "}" ; + +BitFieldList = BitFieldField { "," BitFieldField } [ "," ] ; +BitFieldField = IDENT ":" Type "|" Expr ; + + +ProcType = "proc" [ CallingConvention ] "(" [ ProcParamList ] ")" + [ "->" ProcResults ] ; + +ProcLiteral = ProcType [ WhereClause ] ( ProcBody | "---" ) ; /* --- = no body / foreign */ +ProcGroup = "proc" "{" ProcGroupList "}" ; /* procedure group */ + + +ProcBody = "{" { Stmt } "}" +ProcGroupList = Expr { "," Expr } [ "," ] ; + +CallingConvention = STRING_LIT ; /* "odin", "c", "std", "contextless", "fast", "none", etc. */ + +ProcParamList = ProcParam { "," ProcParam } [ "," ] ; + +ProcParam = [ ParamPrefix ] PolyIdentList ":" [ ParamModifier ] ProcParamType [ "=" Expr ] ; + +ProcParamType = Type + | "typeid" "/" ProcParamType ; + +PolyIdent = [ "$" ] IDENT ; +PolyIdentList = PolyIdent { "," PolyIdent } ; + +ParamPrefix = "using" + | "#no_alias" + | "#any_int" + | "#by_ptr" + | "#c_vararg" + | "#no_broadcast" ; + +ParamModifier = ".." ; /* variadic */ + +ProcResults = Type + | "(" [ FieldList ] ")" ; + +MatrixType = [ "#row_major" | "#column_major" ] "matrix" "[" Expr "," Expr "]" Type ; + + +SimdType = "#simd" "[" Expr "]" Type ; + + +SOAType = "#soa" ( ArrayType | SliceType | DynArrayType | FixedCapDynArrayType ) ; + + +PolyParamList = PolyParam { "," PolyParam } ; +PolyParam = PolyIdent ":" Type ; + +WhereClause = "where" ConstraintExpr { "," ConstraintExpr } ; +ConstraintExpr = Expr ; + + +Attribute = "@" "(" AttrElemList ")" + | "@" IDENT ; /* shorthand: @private */ + +AttrElemList = AttrElem { "," AttrElem } [ "," ] ; +AttrElem = IDENT [ "=" Expr ] ; + +ForeignBlock = { Attribute } "foreign" [ IDENT ] "{" { ForeignDecl ";" } "}" ; + +ForeignDecl = { Attribute } ValueDecl ; + + +DirectiveStmt = "#assert" "(" Expr [ "," STRING_LIT ] ")" + | "#panic" "(" STRING_LIT ")" + | "#force_inline" CallBody + | "#force_no_inline" CallBody + | "#must_tail" CallBody ; \ No newline at end of file From 97482f53f47d98e2d0f8fc132fdead6ff2cab432 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 17 May 2026 13:18:48 +0100 Subject: [PATCH 064/228] Minor rearrange --- odin.ebnf | 53 ++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/odin.ebnf b/odin.ebnf index 0b0932b86..4efa54b1e 100644 --- a/odin.ebnf +++ b/odin.ebnf @@ -75,6 +75,7 @@ COMMENT = "//" { ANY_CHAR } NEWLINE This grammar is simplified to represent minimize the need for "#" "partial" */ +/* Source File Structure */ File = { FileTag } PackageDecl ";" { TopLevelStmt } ; FileTag = "#+" IDENT [ TagValue ] NEWLINE ; /* #+build, #+private, #+feature, … */ @@ -88,12 +89,15 @@ TopLevelStmt = ImportDecl ";" | Decl ";" ; +/* Import Declarations */ + ImportDecl = { Attribute } "import" [ IDENT ] STRING_LIT ; ForeignImportDecl = { Attribute } "foreign" "import" [ IDENT ] ( STRING_LIT | "{" ForeignImportPathList "}" ) ; ForeignImportPathList = Expr { "," Expr } [ "," ] ; +/* Value Declarations */ Decl = { Attribute } ValueDecl ; @@ -104,6 +108,15 @@ ValueDecl = IdentList ":" Type IdentList = IDENT { "," IDENT } ; ExprList = Expr { "," Expr } ; +/* Foreign Block Declaration */ + +ForeignBlock = { Attribute } "foreign" [ IDENT ] "{" { ForeignDecl ";" } "}" ; + +ForeignDecl = { Attribute } ValueDecl ; + + +/* Statements */ + Stmt = EmptyStmt | Decl ";" | ExprStmt ";" @@ -126,12 +139,21 @@ Stmt = EmptyStmt EmptyStmt = ";" ; +/* Directive Statements */ + +DirectiveStmt = "#assert" "(" Expr [ "," STRING_LIT ] ")" + | "#panic" "(" STRING_LIT ")" + | "#force_inline" CallBody + | "#force_no_inline" CallBody + | "#must_tail" CallBody ; + +/* Block Statement */ BlockStmt = [ Label ] "{" StmtList "}" ; StmtList = { Stmt } ; Label = IDENT ":" ; - +/* Assignment Statements */ ExprStmt = Expr ; @@ -141,7 +163,7 @@ AssignOp = "=" | "+=" | "-=" | "*=" | "/=" | "%=" | "%%=" | "|=" | "~=" | "&=" | "&~=" | "<<=" | ">>=" | "&&=" | "||=" ; - +/* Control Flow */ IfStmt = "if" [ SimpleStmt ";" ] Expr StmtBody { "else" "if" [ SimpleStmt ";" ] Expr StmtBody } @@ -184,6 +206,7 @@ TypeCaseClause = "case" [ TypeList ] ":" StmtList ; TypeList = Type { "," Type } ; +/* Branch & Defer */ BranchStmt = "break" [ IDENT ] | "continue" [ IDENT ] @@ -194,18 +217,24 @@ DeferStmt = "defer" ( Stmt | ( "{" StmtList "}" ) ) ; ReturnStmt = [ ReturnStmtDirectivePrefix ] "return" [ ExprList ] ; ReturnStmtDirectivePrefix = "#force_inline" | "#force_no_inline" | "#must_tail" ; +/* Using Statement */ UsingStmt = "using" ( IdentList | Expr ) ; +/* Simple Statement (used in control flow init) */ SimpleStmt = ExprStmt | AssignStmt | ValueDecl ; +/* Body for Control Flow */ StmtBody = "{" StmtList "}" | "do" Stmt ; /* must be on the same line as the initial token of the statement */ +/* Expressions */ -/* Binary Expressions */ +/* Binary Expressions + Operator Precedence (low -> high) +*/ Expr = OrElseExpr ; @@ -242,6 +271,7 @@ UnaryExpr = PostfixExpr UnaryOp = "+" | "-" | "~" | "&" | "!" ; +/* Postfix / Operand Expressions */ PostfixExpr = Operand { PostfixOp } ; @@ -283,6 +313,8 @@ Operand = IDENT DirectiveExpr = "#" IDENT ; /* Used as the catch all */ +/* Literals */ + Literal = INT_LIT | FLOAT_LIT | IMAGINARY_LIT @@ -299,6 +331,8 @@ ElementList = Element { "," Element } [ "," ] ; Element = Expr [ "=" Expr ] | ( Expr "..<" Expr | Expr "..=" Expr ) "=" Expr ; +/* Types */ + Type = TypeName | TypeLit | "(" Type ")" @@ -452,15 +486,4 @@ Attribute = "@" "(" AttrElemList ")" | "@" IDENT ; /* shorthand: @private */ AttrElemList = AttrElem { "," AttrElem } [ "," ] ; -AttrElem = IDENT [ "=" Expr ] ; - -ForeignBlock = { Attribute } "foreign" [ IDENT ] "{" { ForeignDecl ";" } "}" ; - -ForeignDecl = { Attribute } ValueDecl ; - - -DirectiveStmt = "#assert" "(" Expr [ "," STRING_LIT ] ")" - | "#panic" "(" STRING_LIT ")" - | "#force_inline" CallBody - | "#force_no_inline" CallBody - | "#must_tail" CallBody ; \ No newline at end of file +AttrElem = IDENT [ "=" Expr ] ; \ No newline at end of file From d37284ce55e1cb16800fbc313b1b1c9bbd5689ca Mon Sep 17 00:00:00 2001 From: Abderrahim Indjaren Date: Sun, 17 May 2026 18:49:49 +0100 Subject: [PATCH 065/228] fix: nil keeps its type instead of taking expected type --- src/check_expr.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index e5b5623fe..abd429f4d 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -6674,6 +6674,8 @@ gb_internal CallArgumentError check_call_arguments_internal(CheckerContext *c, A if (!context_allocator_error) { ordered_operands[i].mode = Addressing_Value; ordered_operands[i].type = e->type; + if (e->Variable.param_value.kind == ParameterValue_Nil) + ordered_operands[i].type = t_untyped_nil; ordered_operands[i].expr = e->Variable.param_value.original_ast_expr; dummy_argument_count += 1; From d02c5e1a21c8e7a720549bfcb77dd41e2839317c Mon Sep 17 00:00:00 2001 From: Abderrahim Indjaren Date: Mon, 18 May 2026 03:15:55 +0100 Subject: [PATCH 066/228] add: check duplicates in type switches --- src/check_expr.cpp | 41 ++++++++++++++++++++++++++++++++++++++++- src/check_stmt.cpp | 1 + 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index e5b5623fe..51b7bb76b 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -9412,7 +9412,6 @@ gb_internal void add_constant_switch_case(CheckerContext *ctx, SeenMap *seen, Op multi_map_insert(seen, key, tap); } - gb_internal void add_to_seen_map(CheckerContext *ctx, SeenMap *seen, TokenKind upper_op, Operand const &x, Operand const &lhs, Operand const &rhs) { if (is_type_enum(x.type)) { // TODO(bill): Fix this logic so it's fast!!! @@ -9441,10 +9440,50 @@ gb_internal void add_to_seen_map(CheckerContext *ctx, SeenMap *seen, TokenKind u } } } + gb_internal void add_to_seen_map(CheckerContext *ctx, SeenMap *seen, Operand const &x) { add_constant_switch_case(ctx, seen, x); } +gb_internal void add_type_switch_case(CheckerContext *ctx, SeenMap *seen, Operand operand) { + if (operand.mode != Addressing_Type) { + return ; + } + + uintptr key = type_hash_canonical_type(operand.type); + GB_ASSERT(key != 0); + + isize count = multi_map_count(seen, key); + if (count) { + TEMPORARY_ALLOCATOR_GUARD(); + TypeAndToken *taps = temporary_alloc_array(count); + + multi_map_get_all(seen, key, taps); + for (isize i = 0; i < count; i++) { + TypeAndToken tap = taps[i]; + if (!are_types_identical(tap.type, operand.type)) { + continue; + } + + TokenPos pos = tap.token.pos; + gbString expr_str = expr_to_string(operand.expr); + error(operand.expr, + "Duplicate case '%s'\n" + "\tprevious case at %s", + expr_str, + token_pos_to_string(pos)); + gb_string_free(expr_str); + } + } + + TypeAndToken tap = { operand.type, ast_token(operand.expr) }; + multi_map_insert(seen, key, tap); +} + +gb_internal void add_type_to_seen_map(CheckerContext *ctx, SeenMap *seen, Operand const &x) { + add_type_switch_case(ctx, seen, x); +} + gb_internal ExprKind check_basic_directive_expr(CheckerContext *c, Operand *o, Ast *node, Type *type_hint) { ast_node(bd, BasicDirective, node); diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index d6987a332..04e9e9428 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -1296,6 +1296,7 @@ gb_internal void check_switch_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags } t = default_type(t); add_type_info_type(ctx, t); + add_type_to_seen_map(ctx, &seen, y); } else { convert_to_typed(ctx, &y, x.type); if (y.mode == Addressing_Invalid) { From 37aaf4519c07cbcc1dbfb4a3ffd022b5641ba758 Mon Sep 17 00:00:00 2001 From: BadWolfuu Date: Mon, 18 May 2026 14:01:31 +0200 Subject: [PATCH 067/228] adding missing documentation to strconv.parse_int and strconv.parse_uint parse_int and parse_uint where missing documentation for the optional parameter `n: ^int` to store the length of the parsed substring --- core/strconv/strconv.odin | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/strconv/strconv.odin b/core/strconv/strconv.odin index 48a75d972..f52e7d133 100644 --- a/core/strconv/strconv.odin +++ b/core/strconv/strconv.odin @@ -342,6 +342,7 @@ Parses a signed integer value from the input string, using the specified base or - base: The base of the number system to use for parsing (default: 0) - If base is 0, it will be inferred based on the prefix in the input string (e.g. '0x' for hexadecimal) - If base is not 0, it will be used for parsing regardless of any prefix in the input string +- n: An optional pointer to an int to store the length of the parsed substring (default: nil) Example: @@ -385,6 +386,7 @@ Parses an unsigned integer value from the input string, using the specified base - base: The base of the number system to use for parsing (default: 0, inferred) - If base is 0, it will be inferred based on the prefix in the input string (e.g. '0x' for hexadecimal) - If base is not 0, it will be used for parsing regardless of any prefix in the input string +- n: An optional pointer to an int to store the length of the parsed substring (default: nil) Example: From 1e1f37fcef92d57f4c0f296854f5bef8fee9a717 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 18 May 2026 14:33:35 +0100 Subject: [PATCH 068/228] `n` -> `num_appended` for `append` return values --- base/runtime/core_builtin.odin | 42 +++++++++++++++++----------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 2b6b4511b..7a2ce90b8 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -708,7 +708,7 @@ delete_key :: proc(m: ^$T/map[$K]$V, key: K) -> (deleted_key: K, deleted_value: return } -_append_elem :: #force_no_inline proc(array: ^Raw_Dynamic_Array, size_of_elem, align_of_elem: int, arg_ptr: rawptr, should_zero: bool, loc := #caller_location) -> (n: int, err: Allocator_Error) #optional_allocator_error { +_append_elem :: #force_no_inline proc(array: ^Raw_Dynamic_Array, size_of_elem, align_of_elem: int, arg_ptr: rawptr, should_zero: bool, loc := #caller_location) -> (num_appended: int, err: Allocator_Error) #optional_allocator_error { if array == nil { return } @@ -726,14 +726,14 @@ _append_elem :: #force_no_inline proc(array: ^Raw_Dynamic_Array, size_of_elem, a data = data[array.len*size_of_elem:] intrinsics.mem_copy_non_overlapping(data, arg_ptr, size_of_elem) array.len += 1 - n = 1 + num_appended = 1 } return } // `append_elem` appends an element to the end of a dynamic array. @builtin -append_elem :: proc(array: ^$T/[dynamic]$E, #no_broadcast arg: E, loc := #caller_location) -> (n: int, err: Allocator_Error) #optional_allocator_error { +append_elem :: proc(array: ^$T/[dynamic]$E, #no_broadcast arg: E, loc := #caller_location) -> (num_appended: int, err: Allocator_Error) #optional_allocator_error { when size_of(E) == 0 { (^Raw_Dynamic_Array)(array).len += 1 return 1, nil @@ -747,7 +747,7 @@ append_elem :: proc(array: ^$T/[dynamic]$E, #no_broadcast arg: E, loc := #caller // // Note: Prefer using the procedure group `non_zero_append @builtin -non_zero_append_elem :: proc(array: ^$T/[dynamic]$E, #no_broadcast arg: E, loc := #caller_location) -> (n: int, err: Allocator_Error) #optional_allocator_error { +non_zero_append_elem :: proc(array: ^$T/[dynamic]$E, #no_broadcast arg: E, loc := #caller_location) -> (num_appended: int, err: Allocator_Error) #optional_allocator_error { when size_of(E) == 0 { (^Raw_Dynamic_Array)(array).len += 1 return 1, nil @@ -757,7 +757,7 @@ non_zero_append_elem :: proc(array: ^$T/[dynamic]$E, #no_broadcast arg: E, loc : } } -_append_elems :: #force_no_inline proc(array: ^Raw_Dynamic_Array, size_of_elem, align_of_elem: int, should_zero: bool, loc := #caller_location, args: rawptr, arg_len: int) -> (n: int, err: Allocator_Error) #optional_allocator_error { +_append_elems :: #force_no_inline proc(array: ^Raw_Dynamic_Array, size_of_elem, align_of_elem: int, should_zero: bool, loc := #caller_location, args: rawptr, arg_len: int) -> (num_appended: int, err: Allocator_Error) #optional_allocator_error { if array == nil { return 0, nil } @@ -788,7 +788,7 @@ _append_elems :: #force_no_inline proc(array: ^Raw_Dynamic_Array, size_of_elem, // // Note: Prefer using the procedure group `append`. @builtin -append_elems :: proc(array: ^$T/[dynamic]$E, #no_broadcast args: ..E, loc := #caller_location) -> (n: int, err: Allocator_Error) #optional_allocator_error { +append_elems :: proc(array: ^$T/[dynamic]$E, #no_broadcast args: ..E, loc := #caller_location) -> (num_appended: int, err: Allocator_Error) #optional_allocator_error { when size_of(E) == 0 { a := (^Raw_Dynamic_Array)(array) a.len += len(args) @@ -802,7 +802,7 @@ append_elems :: proc(array: ^$T/[dynamic]$E, #no_broadcast args: ..E, loc := #ca // // Note: Prefer using the procedure group `non_zero_append @builtin -non_zero_append_elems :: proc(array: ^$T/[dynamic]$E, #no_broadcast args: ..E, loc := #caller_location) -> (n: int, err: Allocator_Error) #optional_allocator_error { +non_zero_append_elems :: proc(array: ^$T/[dynamic]$E, #no_broadcast args: ..E, loc := #caller_location) -> (num_appended: int, err: Allocator_Error) #optional_allocator_error { when size_of(E) == 0 { a := (^Raw_Dynamic_Array)(array) a.len += len(args) @@ -813,7 +813,7 @@ non_zero_append_elems :: proc(array: ^$T/[dynamic]$E, #no_broadcast args: ..E, l } // The append_string built-in procedure appends a string to the end of a [dynamic]u8 like type -_append_elem_string :: proc(array: ^$T/[dynamic]$E/u8, arg: $A/string, should_zero: bool, loc := #caller_location) -> (n: int, err: Allocator_Error) #optional_allocator_error { +_append_elem_string :: proc(array: ^$T/[dynamic]$E/u8, arg: $A/string, should_zero: bool, loc := #caller_location) -> (num_appended: int, err: Allocator_Error) #optional_allocator_error { return _append_elems((^Raw_Dynamic_Array)(array), 1, 1, should_zero, loc, raw_data(arg), len(arg)) } @@ -821,14 +821,14 @@ _append_elem_string :: proc(array: ^$T/[dynamic]$E/u8, arg: $A/string, should_ze // // Note: Prefer using the procedure group `append`. @builtin -append_elem_string :: proc(array: ^$T/[dynamic]$E/u8, arg: $A/string, loc := #caller_location) -> (n: int, err: Allocator_Error) #optional_allocator_error { +append_elem_string :: proc(array: ^$T/[dynamic]$E/u8, arg: $A/string, loc := #caller_location) -> (num_appended: int, err: Allocator_Error) #optional_allocator_error { return _append_elem_string(array, arg, true, loc) } // `non_zero_append_elem_string` appends a string to the end of a dynamic array of bytes, without zeroing any reserved memory // // Note: Prefer using the procedure group `non_zero_append`. @builtin -non_zero_append_elem_string :: proc(array: ^$T/[dynamic]$E/u8, arg: $A/string, loc := #caller_location) -> (n: int, err: Allocator_Error) #optional_allocator_error { +non_zero_append_elem_string :: proc(array: ^$T/[dynamic]$E/u8, arg: $A/string, loc := #caller_location) -> (num_appended: int, err: Allocator_Error) #optional_allocator_error { return _append_elem_string(array, arg, false, loc) } @@ -836,7 +836,7 @@ non_zero_append_elem_string :: proc(array: ^$T/[dynamic]$E/u8, arg: $A/string, l // // Note: Prefer using the procedure group `non_zero_append`. @builtin -non_zero_append_elem_fixed_capacity_string :: proc "contextless" (array: ^$T/[dynamic; $N]$E/u8, arg: $A/string) -> (n: int) { +non_zero_append_elem_fixed_capacity_string :: proc "contextless" (array: ^$T/[dynamic; $N]$E/u8, arg: $A/string) -> (num_appended: int) { return append_fixed_capacity_elem(array, transmute([]byte)arg) } @@ -846,11 +846,11 @@ non_zero_append_elem_fixed_capacity_string :: proc "contextless" (array: ^$T/[dy // // Note: Prefer using the procedure group `append`. @builtin -append_string :: proc(array: ^$T/[dynamic]$E/u8, args: ..string, loc := #caller_location) -> (n: int, err: Allocator_Error) #optional_allocator_error { +append_string :: proc(array: ^$T/[dynamic]$E/u8, args: ..string, loc := #caller_location) -> (num_appended: int, err: Allocator_Error) #optional_allocator_error { n_arg: int for arg in args { n_arg, err = append(array, ..transmute([]E)(arg), loc=loc) - n += n_arg + num_appended += n_arg if err != nil { return } @@ -861,7 +861,7 @@ append_string :: proc(array: ^$T/[dynamic]$E/u8, args: ..string, loc := #caller_ // `append_fixed_capacity_elem` appends an element to the end of a fixed capacity dynamic array. Returns 0 on failure @builtin -append_fixed_capacity_elem :: proc "contextless" (array: ^$T/[dynamic; $N]$E, #no_broadcast arg: E) -> (n: int) { +append_fixed_capacity_elem :: proc "contextless" (array: ^$T/[dynamic; $N]$E, #no_broadcast arg: E) -> (num_appended: int) { Raw :: Raw_Fixed_Capacity_Dynamic_Array(N, E) if (^Raw)(array).len >= N { @@ -878,29 +878,29 @@ append_fixed_capacity_elem :: proc "contextless" (array: ^$T/[dynamic; $N]$E, #n // `append_fixed_capacity_elem` appends an element to the end of a fixed capacity dynamic array. Returns 0 on failure @builtin -append_fixed_capacity_elems :: proc "contextless" (array: ^$T/[dynamic; $N]$E, #no_broadcast args: ..E) -> (n: int) { +append_fixed_capacity_elems :: proc "contextless" (array: ^$T/[dynamic; $N]$E, #no_broadcast args: ..E) -> (num_appended: int) { Raw :: Raw_Fixed_Capacity_Dynamic_Array(N, E) raw := (^Raw)(array) - n = min(N - len(array), len(args)) + num_appended = min(N - len(array), len(args)) #no_bounds_check when size_of(E) != 0 { - intrinsics.mem_copy(&raw.data[raw.len], raw_data(args), n*size_of(E)) + intrinsics.mem_copy(&raw.data[raw.len], raw_data(args), num_appended*size_of(E)) } - raw.len += n - return n + raw.len += num_appended + return num_appended } // The append_fixed_capacity_string built-in procedure appends multiple strings to the end of a [dynamic]u8 like type // // Note: Prefer using the procedure group `append`. @builtin -append_fixed_capacity_string :: proc "contextless" (array: ^$T/[dynamic; $N]$E/u8, args: ..string) -> (n: int) { +append_fixed_capacity_string :: proc "contextless" (array: ^$T/[dynamic; $N]$E/u8, args: ..string) -> (num_appended: int) { n_arg: int for arg in args { n_arg = append_fixed_capacity_elems(array, ..transmute([]E)(arg)) - n += n_arg + num_appended += n_arg if n_arg < len(arg) { return } From b57db64c8e6749ded1a3db31768d2532b4ba7d55 Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Mon, 18 May 2026 19:34:53 +0200 Subject: [PATCH 069/228] linalg: gram schmidt in any order --- core/math/linalg/specific.odin | 69 +++++++++++++--------------------- 1 file changed, 27 insertions(+), 42 deletions(-) diff --git a/core/math/linalg/specific.odin b/core/math/linalg/specific.odin index e90af23ed..e6778ca93 100644 --- a/core/math/linalg/specific.odin +++ b/core/math/linalg/specific.odin @@ -2768,52 +2768,16 @@ matrix2_orthonormalize :: proc{ @(require_results) -matrix3_orthonormalize_f16 :: proc "contextless" (m: Matrix3f16) -> (r: Matrix3f16) #no_bounds_check { - r = m - r[0] = normalize(m[0]) - - d0 := dot(r[0], r[1]) - r[1] -= r[0] * d0 - r[1] = normalize(r[1]) - - d1 := dot(r[1], r[2]) - d0 = dot(r[0], r[2]) - r[2] -= r[0]*d0 + r[1]*d1 - r[2] = normalize(r[2]) - - return +matrix3_orthonormalize_f16 :: proc "contextless" (m: Matrix3f16) -> Matrix3f16 #no_bounds_check { + return matrix3_gram_schmidt(m, 0, 1, 2) } @(require_results) -matrix3_orthonormalize_f32 :: proc "contextless" (m: Matrix3f32) -> (r: Matrix3f32) #no_bounds_check { - r = m - r[0] = normalize(m[0]) - - d0 := dot(r[0], r[1]) - r[1] -= r[0] * d0 - r[1] = normalize(r[1]) - - d1 := dot(r[1], r[2]) - d0 = dot(r[0], r[2]) - r[2] -= r[0]*d0 + r[1]*d1 - r[2] = normalize(r[2]) - - return +matrix3_orthonormalize_f32 :: proc "contextless" (m: Matrix3f32) -> Matrix3f32 #no_bounds_check { + return matrix3_gram_schmidt(m, 0, 1, 2) } @(require_results) -matrix3_orthonormalize_f64 :: proc "contextless" (m: Matrix3f64) -> (r: Matrix3f64) #no_bounds_check { - r = m - r[0] = normalize(m[0]) - - d0 := dot(r[0], r[1]) - r[1] -= r[0] * d0 - r[1] = normalize(r[1]) - - d1 := dot(r[1], r[2]) - d0 = dot(r[0], r[2]) - r[2] -= r[0]*d0 + r[1]*d1 - r[2] = normalize(r[2]) - - return +matrix3_orthonormalize_f64 :: proc "contextless" (m: Matrix3f64) -> Matrix3f64 #no_bounds_check { + return matrix3_gram_schmidt(m, 0, 1, 2) } matrix3_orthonormalize :: proc{ matrix3_orthonormalize_f16, @@ -2822,6 +2786,27 @@ matrix3_orthonormalize :: proc{ } +@(require_results) +matrix3_gram_schmidt :: proc "contextless" (m: matrix[3, 3]$E, $A, $B, $C: int) -> (r: matrix[3, 3]E) + where A != B, A != C, B != C #no_bounds_check +{ + r = m + r[A] = normalize(m[A]) + + d0 := dot(r[A], r[B]) + r[B] -= r[A] * d0 + r[B] = normalize(r[B]) + + d1 := dot(r[B], r[C]) + d0 = dot(r[A], r[C]) + r[C] -= r[A]*d0 + r[B]*d1 + r[C] = normalize(r[C]) + + return +} + + + @(require_results) vector3_orthonormalize_f16 :: proc "contextless" (x, y: Vector3f16) -> (z: Vector3f16) { return normalize(x - y * dot(y, x)) From 6a206d9bcea62431474cf1c6ada7a2eb15324e55 Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Mon, 18 May 2026 20:05:30 +0200 Subject: [PATCH 070/228] tabs... --- core/math/linalg/specific.odin | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/core/math/linalg/specific.odin b/core/math/linalg/specific.odin index e6778ca93..eea4155ca 100644 --- a/core/math/linalg/specific.odin +++ b/core/math/linalg/specific.odin @@ -2790,19 +2790,19 @@ matrix3_orthonormalize :: proc{ matrix3_gram_schmidt :: proc "contextless" (m: matrix[3, 3]$E, $A, $B, $C: int) -> (r: matrix[3, 3]E) where A != B, A != C, B != C #no_bounds_check { - r = m - r[A] = normalize(m[A]) + r = m + r[A] = normalize(m[A]) - d0 := dot(r[A], r[B]) - r[B] -= r[A] * d0 - r[B] = normalize(r[B]) + d0 := dot(r[A], r[B]) + r[B] -= r[A] * d0 + r[B] = normalize(r[B]) - d1 := dot(r[B], r[C]) - d0 = dot(r[A], r[C]) - r[C] -= r[A]*d0 + r[B]*d1 - r[C] = normalize(r[C]) + d1 := dot(r[B], r[C]) + d0 = dot(r[A], r[C]) + r[C] -= r[A]*d0 + r[B]*d1 + r[C] = normalize(r[C]) - return + return } From 675389aeabb148508d2deb069d551466611b64f9 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Sat, 16 May 2026 17:02:51 +0900 Subject: [PATCH 071/228] core/crypto/ecdsa: Minor additions and cleanups --- core/crypto/ecdsa/ecdsa.odin | 27 ++++++++++++++++++++++++--- core/crypto/ecdsa/ecdsa_sign.odin | 8 ++++---- core/crypto/ecdsa/ecdsa_verify.odin | 8 ++++---- tests/core/crypto/wycheproof/ecc.odin | 2 +- 4 files changed, 33 insertions(+), 12 deletions(-) diff --git a/core/crypto/ecdsa/ecdsa.odin b/core/crypto/ecdsa/ecdsa.odin index 8bb1748cf..e63539fb1 100644 --- a/core/crypto/ecdsa/ecdsa.odin +++ b/core/crypto/ecdsa/ecdsa.odin @@ -2,7 +2,6 @@ package ecdsa import "core:crypto" import secec "core:crypto/_weierstrass" -import "core:mem" import "core:reflect" // Curve the curve identifier associated with a given Private_Key @@ -196,6 +195,12 @@ private_key_bytes :: proc(priv_key: ^Private_Key, dst: []byte) { } } +// private_key_public_bytes sets dst to the byte-encoding of the public +// key corresponding to priv_key. +private_key_public_bytes :: proc(priv_key: ^Private_Key, dst: []byte) { + public_key_bytes(&priv_key._pub_key, dst) +} + // private_key_set sets priv_key to src. private_key_set :: proc(priv_key, src: ^Private_Key) { if src == nil || src._curve == .Invalid { @@ -244,7 +249,7 @@ private_key_equal :: proc(p, q: ^Private_Key) -> bool { // private_key_clear clears priv_key to the uninitialized state. private_key_clear :: proc "contextless" (priv_key: ^Private_Key) { - mem.zero_explicit(priv_key, size_of(Private_Key)) + crypto.zero_explicit(priv_key, size_of(Private_Key)) } // public_key_set_bytes decodes a byte-encoded public key, and returns @@ -358,5 +363,21 @@ public_key_equal :: proc(p, q: ^Public_Key) -> bool { // public_key_clear clears pub_key to the uninitialized state. public_key_clear :: proc "contextless" (pub_key: ^Public_Key) { - mem.zero_explicit(pub_key, size_of(Public_Key)) + crypto.zero_explicit(pub_key, size_of(Public_Key)) +} + +// curve returns the Curve used by a Private_Key or Public_Key instance. +@(require_results) +curve :: proc(k: ^$T) -> Curve where (T == Private_Key || T == Public_Key) { + return k._curve +} + +// key_size returns the key size of a Private_Key or Public_Key in bytes. +@(require_results) +key_size :: proc(k: ^$T) -> int where (T == Private_Key || T == Public_Key) { + when T == Private_Key { + return PRIVATE_KEY_SIZES[k._curve] + } else { + return PUBLIC_KEY_SIZES[k._curve] + } } diff --git a/core/crypto/ecdsa/ecdsa_sign.odin b/core/crypto/ecdsa/ecdsa_sign.odin index c6fec56dc..a594bc601 100644 --- a/core/crypto/ecdsa/ecdsa_sign.odin +++ b/core/crypto/ecdsa/ecdsa_sign.odin @@ -13,8 +13,8 @@ import secec "core:crypto/_weierstrass" // The signature format is ASN1. `SEQUECE `{ r INTEGER, s INTEGER }`. @(require_results) sign_asn1 :: proc(priv_key: ^Private_Key, hash_algo: hash.Algorithm, msg: []byte, allocator: runtime.Allocator, deterministic := !crypto.HAS_RAND_BYTES) -> ([]byte, bool) { - ensure(hash_algo != .Invalid, "crypto/edsa: invalid hash algorithm") - ensure(priv_key._curve != .Invalid, "crypto/edsa: invalid curve") + ensure(hash_algo != .Invalid, "crypto/ecdsa: invalid hash algorithm") + ensure(priv_key._curve != .Invalid, "crypto/ecdsa: invalid curve") if !deterministic && !crypto.HAS_RAND_BYTES { return nil, false @@ -49,8 +49,8 @@ sign_asn1 :: proc(priv_key: ^Private_Key, hash_algo: hash.Algorithm, msg: []byte // The signature format is `r | s`. @(require_results) sign_raw :: proc(priv_key: ^Private_Key, hash_algo: hash.Algorithm, msg, sig: []byte, deterministic := !crypto.HAS_RAND_BYTES) -> bool { - ensure(hash_algo != .Invalid, "crypto/edsa: invalid hash algorithm") - ensure(priv_key._curve != .Invalid, "crypto/edsa: invalid curve") + ensure(hash_algo != .Invalid, "crypto/ecdsa: invalid hash algorithm") + ensure(priv_key._curve != .Invalid, "crypto/ecdsa: invalid curve") ensure(len(sig) == RAW_SIGNATURE_SIZES[priv_key._curve], "crypto/ecdsa: invalid destination size") if !deterministic && !crypto.HAS_RAND_BYTES { diff --git a/core/crypto/ecdsa/ecdsa_verify.odin b/core/crypto/ecdsa/ecdsa_verify.odin index bd973a8df..ddc1df9e6 100644 --- a/core/crypto/ecdsa/ecdsa_verify.odin +++ b/core/crypto/ecdsa/ecdsa_verify.odin @@ -10,8 +10,8 @@ import secec "core:crypto/_weierstrass" // The signature format is `r | s`. @(require_results) verify_raw :: proc(pub_key: ^Public_Key, hash_algo: hash.Algorithm, msg, sig: []byte) -> bool { - ensure(hash_algo != .Invalid, "crypto/edsa: invalid hash algorithm") - ensure(pub_key._curve != .Invalid, "crypto/edsa: invalid curve") + ensure(hash_algo != .Invalid, "crypto/ecdsa: invalid hash algorithm") + ensure(pub_key._curve != .Invalid, "crypto/ecdsa: invalid curve") if len(sig) != RAW_SIGNATURE_SIZES[pub_key._curve] { return false @@ -40,8 +40,8 @@ verify_raw :: proc(pub_key: ^Public_Key, hash_algo: hash.Algorithm, msg, sig: [] // The signature format is ASN.1 `SEQUENCE { r INTEGER, s INTEGER }`. @(require_results) verify_asn1 :: proc(pub_key: ^Public_Key, hash_algo: hash.Algorithm, msg, sig: []byte) -> bool { - ensure(hash_algo != .Invalid, "crypto/edsa: invalid hash algorithm") - ensure(pub_key._curve != .Invalid, "crypto/edsa: invalid curve") + ensure(hash_algo != .Invalid, "crypto/ecdsa: invalid hash algorithm") + ensure(pub_key._curve != .Invalid, "crypto/ecdsa: invalid curve") r_bytes, s_bytes, ok := parse_asn1_sig(sig) if !ok { diff --git a/tests/core/crypto/wycheproof/ecc.odin b/tests/core/crypto/wycheproof/ecc.odin index 53b63cc08..839f152bb 100644 --- a/tests/core/crypto/wycheproof/ecc.odin +++ b/tests/core/crypto/wycheproof/ecc.odin @@ -163,7 +163,7 @@ test_ecdsa_impl :: proc(t: ^testing.T, test_vectors: ^Test_Vectors(Ecdsa_Test_Gr if comment := test_vector.comment; comment != "" { log.debugf( - "ecda/%s/%s/%d: %s: %+v", + "ecdsa/%s/%s/%d: %s: %+v", curve_str, hash_str, test_vector.tc_id, From c3e7a9026b73aac4ee66ddaebc969ec5aefde2a2 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Mon, 18 May 2026 14:35:55 +0900 Subject: [PATCH 072/228] core/crypto/ed25519: Add `private_key_public_bytes` --- core/crypto/ed25519/ed25519.odin | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/crypto/ed25519/ed25519.odin b/core/crypto/ed25519/ed25519.odin index 164e9805b..9f2d2b330 100644 --- a/core/crypto/ed25519/ed25519.odin +++ b/core/crypto/ed25519/ed25519.odin @@ -120,6 +120,12 @@ private_key_bytes :: proc(priv_key: ^Private_Key, dst: []byte) { copy(dst, priv_key._b[:]) } +// private_key_public_bytes sets dst to the byte-encoding of the public +// key corresponding to priv_key. +private_key_public_bytes :: proc(priv_key: ^Private_Key, dst: []byte) { + public_key_bytes(&priv_key._pub_key, dst) +} + // private_key_clear clears priv_key to the uninitialized state. private_key_clear :: proc "contextless" (priv_key: ^Private_Key) { crypto.zero_explicit(priv_key, size_of(Private_Key)) From 104da7d54b32c8aaa9bec05716ca156852b092f6 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Mon, 18 May 2026 14:29:04 +0900 Subject: [PATCH 073/228] core/crypto/ecdh: Add `private_key_public_bytes` --- core/crypto/ecdh/ecdh.odin | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/core/crypto/ecdh/ecdh.odin b/core/crypto/ecdh/ecdh.odin index d31a69aa8..3da3e0e41 100644 --- a/core/crypto/ecdh/ecdh.odin +++ b/core/crypto/ecdh/ecdh.odin @@ -281,6 +281,12 @@ private_key_bytes :: proc(priv_key: ^Private_Key, dst: []byte) { } } +// private_key_public_bytes sets dst to the byte-encoding of the public +// key corresponding to priv_key. +private_key_public_bytes :: proc(priv_key: ^Private_Key, dst: []byte) { + public_key_bytes(&priv_key._pub_key, dst) +} + // private_key_equal returns true if and only if (⟺) the private keys are equal, // in constant time. @(require_results) @@ -485,13 +491,13 @@ ecdh :: proc(priv_key: ^Private_Key, pub_key: ^Public_Key, dst: []byte) -> bool // curve returns the Curve used by a Private_Key or Public_Key instance. @(require_results) -curve :: proc(k: ^$T) -> Curve where(T == Private_Key || T == Public_Key) { +curve :: proc(k: ^$T) -> Curve where (T == Private_Key || T == Public_Key) { return k._curve } // key_size returns the key size of a Private_Key or Public_Key in bytes. @(require_results) -key_size :: proc(k: ^$T) -> int where(T == Private_Key || T == Public_Key) { +key_size :: proc(k: ^$T) -> int where (T == Private_Key || T == Public_Key) { when T == Private_Key { return PRIVATE_KEY_SIZES[k._curve] } else { @@ -502,6 +508,6 @@ key_size :: proc(k: ^$T) -> int where(T == Private_Key || T == Public_Key) { // shared_secret_size returns the shared secret size of a key exchange // in bytes. @(require_results) -shared_secret_size :: proc(k: ^$T) -> int where(T == Private_Key || T == Public_Key) { +shared_secret_size :: proc(k: ^$T) -> int where (T == Private_Key || T == Public_Key) { return SHARED_SECRET_SIZES[k._curve] } From d5903be4e5c54af97e19e7c5d1a9e80483206ffd Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Mon, 18 May 2026 14:32:17 +0900 Subject: [PATCH 074/228] core/crypto/noise: Stop cheating and reaching into "opaque" structs --- core/crypto/noise/protocol.odin | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/crypto/noise/protocol.odin b/core/crypto/noise/protocol.odin index 29482bd36..7327e638b 100644 --- a/core/crypto/noise/protocol.odin +++ b/core/crypto/noise/protocol.odin @@ -554,7 +554,7 @@ handshakestate_initialize :: proc( if initiator { if slice.contains(message_pattern.pre_messages, Pre_Token.ini_s) { - ecdh.public_key_bytes(&s._pub_key, dst) + ecdh.private_key_public_bytes(s, dst) symmetricstate_mix_hash(symmetric_state, dst) } if slice.contains(message_pattern.pre_messages, Pre_Token.res_s) { @@ -567,7 +567,7 @@ handshakestate_initialize :: proc( symmetricstate_mix_hash(symmetric_state, dst) } if slice.contains(message_pattern.pre_messages, Pre_Token.res_s) { - ecdh.public_key_bytes(&s._pub_key, dst) + ecdh.private_key_public_bytes(s, dst) symmetricstate_mix_hash(symmetric_state, dst) } } @@ -665,7 +665,7 @@ handshakestate_write_message :: proc(self: ^Handshake_State, payload, dst: []byt generate_keypair(protocol, &self.e) } e_public := dh_buf[:d_len] - ecdh.public_key_bytes(&self.e._pub_key, e_public) + ecdh.private_key_public_bytes(&self.e, e_public) n := append(&pattern_buf, ..e_public) ensure(n == d_len, "crypto/noise: truncated append `e`") @@ -676,7 +676,7 @@ handshakestate_write_message :: proc(self: ^Handshake_State, payload, dst: []byt case .s: s_public := dh_buf[:d_len] - ecdh.public_key_bytes(&self.s._pub_key, s_public) + ecdh.private_key_public_bytes(&self.s, s_public) tmp: [MAX_DH_SIZE+TAG_SIZE]byte = --- dh_buf := tmp[:d_len+TAG_SIZE] From 0c1c0372c7cc899d07347b1cb7b6b4378e14188f Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Sat, 16 May 2026 06:49:21 +0900 Subject: [PATCH 075/228] core/crypto/mlkem: Minor cleanups --- core/crypto/_mlkem/poly.odin | 6 +++--- core/crypto/_mlkem/polyvec.odin | 4 ++-- core/crypto/mlkem/api.odin | 36 +++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/core/crypto/_mlkem/poly.odin b/core/crypto/_mlkem/poly.odin index 4a79e9770..1982f9102 100644 --- a/core/crypto/_mlkem/poly.odin +++ b/core/crypto/_mlkem/poly.odin @@ -58,7 +58,7 @@ poly_compress :: proc "contextless" (r: []byte, a: ^Poly) #no_bounds_check { r = r[5:] } case: - panic_contextless("crypto/mlkem: invalid POLYCOMPRESSEDBYTES") + unreachable() } } @@ -91,7 +91,7 @@ poly_decompress :: proc "contextless" (r: ^Poly, a: []byte) { } } case: - panic_contextless("crypto/mlkem: invalid POLYCOMPRESSEDBYTES") + unreachable() } } @@ -236,6 +236,6 @@ poly_compressed_bytes :: #force_inline proc "contextless" (k: int) -> int { case K_1024: return POLYCOMPRESSEDBYTES_1024 case: - panic_contextless("crypto/mlkem: invalid k") + unreachable() } } diff --git a/core/crypto/_mlkem/polyvec.odin b/core/crypto/_mlkem/polyvec.odin index 387acade8..2b971d2df 100644 --- a/core/crypto/_mlkem/polyvec.odin +++ b/core/crypto/_mlkem/polyvec.odin @@ -75,7 +75,7 @@ polyvec_compress :: proc "contextless" (r: []byte, a: ^Polyvec, kay: int) #no_bo } } case: - panic_contextless("crypto/mlkem: invalid POLYVECCOMPRESSEDBYTES") + unreachable() } } @@ -123,7 +123,7 @@ polyvec_decompress :: proc "contextless" (r: ^Polyvec, a: []byte, kay: int) #no_ } } case: - panic_contextless("crypto/mlkem: invalid POLYVECCOMPRESSEDBYTES") + unreachable() } } diff --git a/core/crypto/mlkem/api.odin b/core/crypto/mlkem/api.odin index 9c8fd6a2b..3e3956ba8 100644 --- a/core/crypto/mlkem/api.odin +++ b/core/crypto/mlkem/api.odin @@ -253,6 +253,28 @@ decaps :: proc(dk: ^Decapsulation_Key, ciphertext, shared_secret: []byte) -> boo return true } +// params returns the Parameters used by a Decapsulation_Key or +// Encapsulation_Key instance. +@(require_results) +params :: proc(k: ^$T) -> Parameters where (T == Encapsulation_Key || T == Decapsulation_Key) { + when T == Encapsulation_Key { + return k_to_params(k.pke_ek.k) + } else { + return k_to_params(k.pke_dk.k) + } +} + +// key_size returns the key size of a Decapsulation_Key or Encapsulation_Key +// in bytes. +@(require_results) +key_size :: proc(k: ^$T) -> int where (T == Encapsulation_Key || T == Decapsulation_Key) { + when T == Encapsulation_Key { + return ENCAPSULATION_KEY_SIZES[k.pke_ek.k] + } else { + return DECAPSULATION_KEY_SEED_SIZE + } +} + @(private="file") params_to_k :: #force_inline proc "contextless" (params: Parameters) -> int { #partial switch params { @@ -266,3 +288,17 @@ params_to_k :: #force_inline proc "contextless" (params: Parameters) -> int { return 0 } + +@(private="file") +k_to_params :: #force_inline proc "contextless" (k: int) -> Parameters { + switch k { + case _mlkem.K_512: + return .ML_KEM_512 + case _mlkem.K_768: + return .ML_KEM_768 + case _mlkem.K_1024: + return .ML_KEM_1024 + } + + return .Invalid +} From ccc17780b48e70c290d298da1fb429a5423ed466 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Mon, 11 May 2026 17:17:52 +0900 Subject: [PATCH 076/228] core/crypto/mldsa: Initial import --- core/crypto/_mldsa/constants.odin | 72 +++ core/crypto/_mldsa/dsa_internal.odin | 394 ++++++++++++++ core/crypto/_mldsa/ntt.odin | 75 +++ core/crypto/_mldsa/packing.odin | 208 ++++++++ core/crypto/_mldsa/poly.odin | 564 ++++++++++++++++++++ core/crypto/_mldsa/polyvec.odin | 209 ++++++++ core/crypto/_mldsa/reduce.odin | 35 ++ core/crypto/_mldsa/rounding.odin | 56 ++ core/crypto/_mldsa/symmetric_shake.odin | 39 ++ core/crypto/mldsa/api.odin | 290 ++++++++++ core/crypto/mldsa/doc.odin | 7 + examples/all/all_js.odin | 1 + examples/all/all_main.odin | 1 + tests/benchmark/crypto/benchmark_ecc.odin | 18 +- tests/benchmark/crypto/benchmark_pqc.odin | 92 ++++ tests/core/crypto/test_core_crypto_pqc.odin | 87 +++ tests/core/crypto/wycheproof/pqc.odin | 375 ++++++++++++- tests/core/crypto/wycheproof/schemas.odin | 25 +- 18 files changed, 2527 insertions(+), 21 deletions(-) create mode 100644 core/crypto/_mldsa/constants.odin create mode 100644 core/crypto/_mldsa/dsa_internal.odin create mode 100644 core/crypto/_mldsa/ntt.odin create mode 100644 core/crypto/_mldsa/packing.odin create mode 100644 core/crypto/_mldsa/poly.odin create mode 100644 core/crypto/_mldsa/polyvec.odin create mode 100644 core/crypto/_mldsa/reduce.odin create mode 100644 core/crypto/_mldsa/rounding.odin create mode 100644 core/crypto/_mldsa/symmetric_shake.odin create mode 100644 core/crypto/mldsa/api.odin create mode 100644 core/crypto/mldsa/doc.odin diff --git a/core/crypto/_mldsa/constants.odin b/core/crypto/_mldsa/constants.odin new file mode 100644 index 000000000..6a9b6e096 --- /dev/null +++ b/core/crypto/_mldsa/constants.odin @@ -0,0 +1,72 @@ +#+private +package _mldsa + +CRHBYTES :: 64 +TRBYTES :: 64 + +N :: 256 +Q :: 8380417 +D :: 13 + +K_MAX :: 8 +L_MAX :: 7 + +POLYZ_PACKEDBYTES_MAX :: 640 + +POLYT1_PACKEDBYTES :: 320 +POLYT0_PACKEDBYTES :: 416 + +POLYVECT1_PACKEDBYTES_MAX :: K_MAX * POLYT1_PACKEDBYTES +POLYW1_PACKEDBYTES_MAX :: 192 + +CTILDBYTES_MAX :: 64 + +@(require_results) +polyeta_packedbytes :: #force_inline proc "contextless" (params: ^Params) -> int { + POLYETA_PACKEDBYTES_2 :: 96 + POLYETA_PACKEDBYTES_4 :: 128 + + switch params.eta { + case 2: + return POLYETA_PACKEDBYTES_2 + case 4: + return POLYETA_PACKEDBYTES_4 + case: + unreachable() + } +} + +@(require_results) +polyz_packedbytes :: #force_inline proc "contextless" (params: ^Params) -> int { + POLYZ_PACKEDBYTES_GAMMA1_17 :: 576 + POLYZ_PACKEDBYTES_GAMMA1_19 :: 640 + + switch params.gamma1 { + case 1 << 17: + return POLYZ_PACKEDBYTES_GAMMA1_17 + case 1 << 19: + return POLYZ_PACKEDBYTES_GAMMA1_19 + case: + unreachable() + } +} + +@(require_results) +polyw1_packedbytes :: #force_inline proc "contextless" (params: ^Params) -> int { + POLYW1_PACKEDBYTES_GAMMA2_95232 :: 192 + POLYW1_PACKEDBYTES_GAMMA2_261888 :: 128 + + switch params.gamma2 { + case (Q-1)/88: + return POLYW1_PACKEDBYTES_GAMMA2_95232 + case (Q-1)/32: + return POLYW1_PACKEDBYTES_GAMMA2_261888 + case: + unreachable() + } +} + +@(require_results) +polyvech_packedbytes :: #force_inline proc "contextless" (params: ^Params) -> int { + return params.omega + params.k +} diff --git a/core/crypto/_mldsa/dsa_internal.odin b/core/crypto/_mldsa/dsa_internal.odin new file mode 100644 index 000000000..bfb6b7508 --- /dev/null +++ b/core/crypto/_mldsa/dsa_internal.odin @@ -0,0 +1,394 @@ +package _mldsa + +import "core:crypto" +import "core:crypto/shake" + +// This implementation is derived from the PQ-CRYSTALS reference +// implementation [[ https://github.com/pq-crystals/dilithium ]], +// primarily for licensing reasons. Arguably mldsa-native is +// a more "up to date" codebase, but the changes to the +// ref code is minor and they slapped an attribution-required +// license on something that was originally CC-0/Apache 2.0. + +SEEDBYTES :: 32 +RNDBYTES :: 32 +CTXBYTES_MAX :: 255 + +Params :: struct { + k: int, + l: int, + eta: i32, + tau: int, + beta: i32, + gamma1: i32, + gamma2: i32, + omega: int, + ctild_bytes: int, +} + +@(rodata) +Params_44 := Params{ + k = 4, + l = 4, + eta = 2, + tau = 39, + beta = 78, + gamma1 = 1 << 17, + gamma2 = (Q-1)/88, + omega = 80, + ctild_bytes = 32, +} + +@(rodata) +Params_65 := Params{ + k = 6, + l = 5, + eta = 4, + tau = 49, + beta = 196, + gamma1 = 1 << 19, + gamma2 = (Q-1)/32, + omega = 55, + ctild_bytes = 48, +} + +@(rodata) +Params_87 := Params{ + k = 8, + l = 7, + eta = 2, + tau = 60, + beta = 120, + gamma1 = 1 << 19, + gamma2 = (Q-1)/32, + omega = 75, + ctild_bytes = 64, +} + +Private_Key :: struct { + params: ^Params, + + rho: [SEEDBYTES]byte, + tr: [TRBYTES]byte, + key: [SEEDBYTES]byte, + t0: Polyvec_K, + s1: Polyvec_L, + s2: Polyvec_K, + + pub_key: Public_Key, + seed: [SEEDBYTES]byte, +} + +Public_Key :: struct { + params: ^Params, + + t1: Polyvec_K, + rho: [SEEDBYTES]byte, + mu: [TRBYTES]byte, +} + +@(private) +Signature :: struct { + params: ^Params, + + c: [CTILDBYTES_MAX]byte, + z: Polyvec_L, + h: Polyvec_K, +} + +dsa_keygen_internal :: proc( + priv_key: ^Private_Key, + seed: []byte, + params: ^Params, +) { + ensure(len(seed) == SEEDBYTES, "crypto/mldsa: invalid seed") + + pub_key := &priv_key.pub_key + pub_key.params = params + priv_key.params = params + + copy(priv_key.seed[:], seed) + + seedbuf: [2*SEEDBYTES + CRHBYTES]byte = --- + mat_: [K_MAX]Polyvec_L = --- + defer crypto.zero_explicit(&seedbuf, size_of(seedbuf)) + defer crypto.zero_explicit(&mat_, size_of(mat_)) + + // Expand randomness for rho, rhoprime and key + copy(seedbuf[:], seed) + seedbuf[SEEDBYTES] = byte(params.k) + seedbuf[SEEDBYTES+1] = byte(params.l) + shake256(seedbuf[:], seedbuf[:SEEDBYTES+2]) + copy(priv_key.rho[:], seedbuf[:SEEDBYTES]) + rhoprime := seedbuf[SEEDBYTES:SEEDBYTES+CRHBYTES] + copy(priv_key.key[:], seedbuf[SEEDBYTES+CRHBYTES:]) + + // Expand matrix + mat := mat_[:params.k] + polyvec_matrix_expand(mat, priv_key.rho[:], params) + + // Sample short vectors s1 and s2 + polyvec_l_uniform_eta(&priv_key.s1, rhoprime, 0, params) + polyvec_k_uniform_eta(&priv_key.s2, rhoprime, u16(params.l), params) + + // Matrix-vector multiplication + s1hat: Polyvec_L = --- + defer crypto.zero_explicit(&s1hat, size_of(Polyvec_L)) + polyvec_copy(&s1hat, &priv_key.s1, params) + polyvec_l_ntt(&s1hat, params) + polyvec_matrix_pointwise_montgomery(&pub_key.t1, mat, &s1hat, params) + polyvec_k_reduce(&pub_key.t1, params) + polyvec_k_invntt_tomont(&pub_key.t1, params) + + // Add error vector s2 + polyvec_k_add(&pub_key.t1, &pub_key.t1, &priv_key.s2, params) + + // Extract t1 and write public key + pk_bytes_: [SEEDBYTES+POLYVECT1_PACKEDBYTES_MAX]byte = --- + pk_bytes := pk_bytes_[:public_key_size(params)] + polyvec_k_caddq(&pub_key.t1, params) + polyvec_k_power2round(&pub_key.t1, &priv_key.t0, &pub_key.t1, params) + copy(pub_key.rho[:], priv_key.rho[:]) + _ = pack_pk(pk_bytes, pub_key) + + // Compute H(rho, t1) and write secret key + shake256(pub_key.mu[:], pk_bytes) + copy(priv_key.tr[:], pub_key.mu[:]) +} + +dsa_sign_internal :: proc( + sig_bytes: []byte, + m: []byte, + ctx: []byte, + rnd: []byte, + priv_key: ^Private_Key, + external_mu: []byte = nil +) -> bool { + params := priv_key.params + switch params { + case &Params_44, &Params_65, &Params_87: + case: + return false + } + if len(sig_bytes) != signature_size(params) { + return false + } + ensure(len(ctx) <= CTXBYTES_MAX, "crypto/mlkem: invalid contxt size") + ensure(len(rnd) == RNDBYTES, "crypto/mlkem: invalid rnd size") + + mu, rhoprime: [CRHBYTES]byte = ---, --- + mat_: [K_MAX]Polyvec_L + w1_bytes_: [SEEDBYTES+POLYVECT1_PACKEDBYTES_MAX]byte = --- + s1, y: Polyvec_L = ---, --- + t0, s2, w1, w0: Polyvec_K = ---, ---, ---, --- + cp: Poly + + polyvec_copy(&s1, &priv_key.s1, params) + polyvec_copy(&s2, &priv_key.s2, params) + polyvec_copy(&t0, &priv_key.t0, params) + + defer crypto.zero_explicit(&mu, size_of(mu)) + defer crypto.zero_explicit(&rhoprime, size_of(rhoprime)) + defer crypto.zero_explicit(&mat_, size_of(mat_)) + defer crypto.zero_explicit(&w1_bytes_, size_of(w1_bytes_)) + defer polyvec_clear([]^Polyvec_L{&s1, &y}) + defer polyvec_clear([]^Polyvec_K{&t0, &s2, &w1, &w0}) + defer crypto.zero_explicit(&cp, size_of(cp)) + + sig: Signature = --- + sig.params = params + h := &sig.h + z := &sig.z + c := sig.c[:params.ctild_bytes] + + w1_bytes := w1_bytes_[:params.k*polyw1_packedbytes(params)] + + // Compute mu = CRH(tr, pre, msg) + if len(external_mu) == 0 { + // The FIPS publication handles the shake prefix + // in the public sign operation, but doing it + // here makes more sense. + ctx_buf: [2]byte + shake_ctx: shake.Context = --- + defer shake.reset(&shake_ctx) + + ctx_len := len(ctx) + + shake.init_256(&shake_ctx) + shake.write(&shake_ctx, priv_key.tr[:]) + if ctx_len > 0 { + ctx_buf[1] = byte(ctx_len) + } + shake.write(&shake_ctx, ctx_buf[:]) + if ctx_len > 0 { + shake.write(&shake_ctx, ctx) + } + shake.write(&shake_ctx, m) + shake.read(&shake_ctx, mu[:]) + } else { + ensure(len(external_mu) == CRHBYTES, "crypto/mlkem: invalid external mu") + copy(mu[:], external_mu) + } + + // Compute rhoprime = CRH(key, rnd, mu) + shake256(rhoprime[:], priv_key.key[:], rnd, mu[:]) + + // Expand matrix and transform vectors + mat := mat_[:params.k] + polyvec_matrix_expand(mat, priv_key.rho[:], params) + polyvec_l_ntt(&s1, params) + polyvec_k_ntt(&s2, params) + polyvec_k_ntt(&t0, params) + + // Rejection-sampling loop + iv: u32 // ref uses u16, but ML-DSA-87 will reuse the IV at p = ~2^{-23400} + for { + // Sample intermediate vector y + polyvec_l_uniform_gamma1(&y, rhoprime[:], iv, params) + iv += 1 + + // Matrix-vector multiplication + polyvec_copy(z, &y, params) + polyvec_l_ntt(z, params) + polyvec_matrix_pointwise_montgomery(&w1, mat, z, params) + polyvec_k_reduce(&w1, params) + polyvec_k_invntt_tomont(&w1, params) + + // Decompose w and call the random oracle + polyvec_k_caddq(&w1, params) + polyvec_k_decompose(&w1, &w0, &w1, params) + polyvec_k_pack_w1(w1_bytes, &w1, params) + + shake256(c, mu[:], w1_bytes) + poly_challenge(&cp, c, params) + poly_ntt(&cp) + + // Compute z, reject if it reveals secret + polyvec_l_pointwise_poly_montgomery(z, &cp, &s1, params) + polyvec_l_invntt_tomont(z, params) + polyvec_l_add(z, z, &y, params) + polyvec_l_reduce(z, params) + if polyvec_l_chknorm(z, params.gamma1 - params.beta, params) { + continue + } + + // Check that subtracting cs2 does not change high bits of w + // and low bits do not reveal secret information + polyvec_k_pointwise_poly_montgomery(h, &cp, &s2, params) + polyvec_k_invntt_tomont(h, params) + polyvec_k_sub(&w0, &w0, h, params) + polyvec_k_reduce(&w0, params) + if polyvec_k_chknorm(&w0, params.gamma2 - params.beta, params) { + continue + } + + // Compute hints for w1 + polyvec_k_pointwise_poly_montgomery(h, &cp, &t0, params) + polyvec_k_invntt_tomont(h, params) + polyvec_k_reduce(h, params) + if polyvec_k_chknorm(h, params.gamma2, params) { + continue + } + + polyvec_k_add(&w0, &w0, h, params) + n := polyvec_k_make_hint(h, &w0, &w1, params) + if n <= uint(params.omega) { + break + } + } + + // Write signature + return pack_sig(sig_bytes, &sig) +} + +dsa_verify_internal :: proc( + sig_bytes: []byte, + m: []byte, + ctx: []byte, + pub_key: ^Public_Key, +) -> bool { + ensure(len(ctx) <= CTXBYTES_MAX, "crypto/mlkem: invalid contxt size") + + params := pub_key.params + switch params { + case &Params_44, &Params_65, &Params_87: + case: + return false + } + + sig: Signature = --- + if !unpack_sig(&sig, sig_bytes, params) { + return false + } + if polyvec_l_chknorm(&sig.z, params.gamma1 - params.beta, params) { + return false + } + c := sig.c[:params.ctild_bytes] + z := &sig.z + h := &sig.h + + t1: Polyvec_K = --- + polyvec_copy(&t1, &pub_key.t1, params) + rho := pub_key.rho[:] + + // Compute CRH(H(rho, t1), pre, msg) + mu: [CRHBYTES]byte + { + // The FIPS publication handles the shake prefix + // in the public sign operation, but doing it + // here makes more sense. + ctx_buf: [2]byte + shake_ctx: shake.Context = --- + defer shake.reset(&shake_ctx) + + ctx_len := len(ctx) + + shake.init_256(&shake_ctx) + shake.write(&shake_ctx, pub_key.mu[:]) + if ctx_len > 0 { + ctx_buf[1] = byte(ctx_len) + } + shake.write(&shake_ctx, ctx_buf[:]) + if ctx_len > 0 { + shake.write(&shake_ctx, ctx) + } + shake.write(&shake_ctx, m) + shake.read(&shake_ctx, mu[:]) + } + + // Matrix-vector multiplication; compute Az - c2^dt1 + mat_: [K_MAX]Polyvec_L + w1: Polyvec_K = --- + cp: Poly = --- + mat := mat_[:params.l] + + poly_challenge(&cp, c, params) + polyvec_matrix_expand(mat, rho, params) + + polyvec_l_ntt(z, params) + polyvec_matrix_pointwise_montgomery(&w1, mat, z, params) + + poly_ntt(&cp) + polyvec_k_shiftl(&t1, params) + polyvec_k_ntt(&t1, params) + polyvec_k_pointwise_poly_montgomery(&t1, &cp, &t1, params) + + polyvec_k_sub(&w1, &w1, &t1, params) + polyvec_k_reduce(&w1, params) + polyvec_k_invntt_tomont(&w1, params) + + // Reconstruct w1 + buf_: [K_MAX*POLYW1_PACKEDBYTES_MAX]byte = --- + buf := buf_[:params.k*polyw1_packedbytes(params)] + polyvec_k_caddq(&w1, params) + polyvec_k_use_hint(&w1, &w1, h, params) + polyvec_k_pack_w1(buf, &w1, params) + + // Call random oracle and verify challenge + c2_: [CTILDBYTES_MAX]byte + c2 := c2_[:params.ctild_bytes] + shake256(c2, mu[:], buf) + + // Note/perf: Can be vartime + return crypto.compare_constant_time(c, c2) == 1 +} diff --git a/core/crypto/_mldsa/ntt.odin b/core/crypto/_mldsa/ntt.odin new file mode 100644 index 000000000..c36f88327 --- /dev/null +++ b/core/crypto/_mldsa/ntt.odin @@ -0,0 +1,75 @@ +#+private +package _mldsa + +@(rodata) +ZETAS := [N]i32 { + 0, 25847, -2608894, -518909, 237124, -777960, -876248, 466468, + 1826347, 2353451, -359251, -2091905, 3119733, -2884855, 3111497, 2680103, + 2725464, 1024112, -1079900, 3585928, -549488, -1119584, 2619752, -2108549, + -2118186, -3859737, -1399561, -3277672, 1757237, -19422, 4010497, 280005, + 2706023, 95776, 3077325, 3530437, -1661693, -3592148, -2537516, 3915439, + -3861115, -3043716, 3574422, -2867647, 3539968, -300467, 2348700, -539299, + -1699267, -1643818, 3505694, -3821735, 3507263, -2140649, -1600420, 3699596, + 811944, 531354, 954230, 3881043, 3900724, -2556880, 2071892, -2797779, + -3930395, -1528703, -3677745, -3041255, -1452451, 3475950, 2176455, -1585221, + -1257611, 1939314, -4083598, -1000202, -3190144, -3157330, -3632928, 126922, + 3412210, -983419, 2147896, 2715295, -2967645, -3693493, -411027, -2477047, + -671102, -1228525, -22981, -1308169, -381987, 1349076, 1852771, -1430430, + -3343383, 264944, 508951, 3097992, 44288, -1100098, 904516, 3958618, + -3724342, -8578, 1653064, -3249728, 2389356, -210977, 759969, -1316856, + 189548, -3553272, 3159746, -1851402, -2409325, -177440, 1315589, 1341330, + 1285669, -1584928, -812732, -1439742, -3019102, -3881060, -3628969, 3839961, + 2091667, 3407706, 2316500, 3817976, -3342478, 2244091, -2446433, -3562462, + 266997, 2434439, -1235728, 3513181, -3520352, -3759364, -1197226, -3193378, + 900702, 1859098, 909542, 819034, 495491, -1613174, -43260, -522500, + -655327, -3122442, 2031748, 3207046, -3556995, -525098, -768622, -3595838, + 342297, 286988, -2437823, 4108315, 3437287, -3342277, 1735879, 203044, + 2842341, 2691481, -2590150, 1265009, 4055324, 1247620, 2486353, 1595974, + -3767016, 1250494, 2635921, -3548272, -2994039, 1869119, 1903435, -1050970, + -1333058, 1237275, -3318210, -1430225, -451100, 1312455, 3306115, -1962642, + -1279661, 1917081, -2546312, -1374803, 1500165, 777191, 2235880, 3406031, + -542412, -2831860, -1671176, -1846953, -2584293, -3724270, 594136, -3776993, + -2013608, 2432395, 2454455, -164721, 1957272, 3369112, 185531, -1207385, + -3183426, 162844, 1616392, 3014001, 810149, 1652634, -3694233, -1799107, + -3038916, 3523897, 3866901, 269760, 2213111, -975884, 1717735, 472078, + -426683, 1723600, -1803090, 1910376, -1667432, -1104333, -260646, -3833893, + -2939036, -2235985, -420899, -2286327, 183443, -976891, 1612842, -3545687, + -554416, 3919660, -48306, -1362209, 3937738, 1400424, -846154, 1976782, +} + +ntt :: proc "contextless" (a: ^[N]i32) #no_bounds_check { + j, k := 0, 1 + for l := 128; l > 0; l >>= 1 { + for start := 0; start < N; start = j + l { + zeta := ZETAS[k] + k += 1 + for j = start; j < start + l; j += 1 { + t := montgomery_reduce(i64(zeta) * i64(a[j + l])) + a[j + l] = a[j] - t + a[j] = a[j] + t + } + } + } +} + +invntt_tomont :: proc "contextless" (a: ^[N]i32) #no_bounds_check { + F :: 41978 // mont^2/256 + + j, k := 0, 255 + for l := 1; l < N; l <<= 1 { + for start := 0; start < N; start = j + l { + zeta := -ZETAS[k] + k -= 1 + for j = start; j < start + l; j += 1 { + t := a[j] + a[j] = t + a[j + l] + a[j + l] = t - a[j + l] + a[j + l] = montgomery_reduce(i64(zeta) * i64(a[j + l])) + } + } + } + + for i in 0.. bool { + if len(pk_bytes) != public_key_size(pub_key.params) { + return false + } + + seed_bytes, t1_bytes := pk_bytes[:SEEDBYTES], pk_bytes[SEEDBYTES:] + + copy(seed_bytes, pub_key.rho[:]) + + for i in 0.. bool { + if len(pk_bytes) != public_key_size(params) { + return false + } + + seed_bytes, t1_bytes := pk_bytes[:SEEDBYTES], pk_bytes[SEEDBYTES:] + + pub_key.params = params + + copy(pub_key.rho[:], seed_bytes) + + for i in 0.. bool { + params := priv_key.params + if len(sk_bytes) != private_key_size(params) { + return false + } + + sk_bytes := sk_bytes + polyeta_len := polyeta_packedbytes(params) + + copy(sk_bytes, priv_key.rho[:]) + sk_bytes = sk_bytes[SEEDBYTES:] + + copy(sk_bytes, priv_key.key[:]) + sk_bytes = sk_bytes[SEEDBYTES:] + + copy(sk_bytes, priv_key.tr[:]) + sk_bytes = sk_bytes[TRBYTES:] + + for i in 0.. bool { + if len(sig_bytes) != signature_size(sig.params) { + return false + } + + sig_bytes := sig_bytes + polyz_len := polyz_packedbytes(sig.params) + + copy(sig_bytes, sig.c[:sig.params.ctild_bytes]) + sig_bytes = sig_bytes[sig.params.ctild_bytes:] + + for i in 0.. bool { + if len(sig_bytes) != signature_size(params) { + return false + } + + intrinsics.mem_zero(sig, size_of(Signature)) + + sig_bytes := sig_bytes + polyz_len := polyz_packedbytes(params) + omega := params.omega + + copy(sig.c[:], sig_bytes[:params.ctild_bytes]) + sig_bytes = sig_bytes[params.ctild_bytes:] + + for i in 0.. byte(omega) { + return false + } + + for j := k; j < int(sig_bytes[omega + i]); j += 1 { + // Coefficients are ordered for strong unforgeability + if j > k && sig_bytes[j] <= sig_bytes[j-1] { + return false + } + sig.h.vec[i].coeffs[sig_bytes[j]] = 1 + } + + k = int(sig_bytes[omega + i]) + } + + // Extra indices are zero for strong unforgeability + for j := k; j < omega; j += 1 { + if sig_bytes[j] != 0 { + return false + } + } + + sig.params = params + + return true +} + +@(private,require_results) +public_key_size :: #force_inline proc "contextless" (params: ^Params) -> int { + return SEEDBYTES + params.k * POLYT1_PACKEDBYTES +} + +@(private,require_results) +private_key_size :: #force_inline proc "contextless" (params: ^Params) -> int { + return 2*SEEDBYTES + TRBYTES + (params.l + params.k) * polyeta_packedbytes(params) + params.k * POLYT0_PACKEDBYTES +} + +@(private,require_results) +signature_size :: #force_inline proc "contextless" (params: ^Params) -> int { + return params.ctild_bytes + params.l * polyz_packedbytes(params) + polyvech_packedbytes(params) +} diff --git a/core/crypto/_mldsa/poly.odin b/core/crypto/_mldsa/poly.odin new file mode 100644 index 000000000..985a807d2 --- /dev/null +++ b/core/crypto/_mldsa/poly.odin @@ -0,0 +1,564 @@ +#+private +package _mldsa + +import "base:intrinsics" +import "core:crypto" +import "core:crypto/shake" + +Poly :: struct { + coeffs: [N]i32, +} + +poly_reduce :: proc "contextless" (a: ^Poly) { + for v, i in a.coeffs { + a.coeffs[i] = reduce32(v) + } +} + +poly_caddq :: proc "contextless" (a: ^Poly) { + for v, i in a.coeffs { + a.coeffs[i] = caddq(v) + } +} + +poly_add :: proc "contextless" (c, a, b: ^Poly) #no_bounds_check { + for i in 0.. uint #no_bounds_check { + s: uint + + for i in 0.. bool #no_bounds_check { + // It is ok to leak which coefficient violates the bound since + // the probability for each coefficient is independent of secret + // data but we must not leak the sign of the centralized + // representative. + for i in 0..> 31 + t = a.coeffs[i] - (t & 2 * a.coeffs[i]) + + if t >= bound { + return true + } + } + + return false +} + +unchecked_get_u24le :: #force_inline proc "contextless" (b: []byte) -> u32 #no_bounds_check { + r := u32(b[0]) + r |= u32(b[1]) << 8 + r |= u32(b[2]) << 16 + return r +} + +rej_uniform :: proc "contextless" (a: []i32, buf: []byte) -> int #no_bounds_check { + ctr, pos: int + + a_len, b_len := len(a), len(buf) + for ctr < a_len && pos + 3 <= b_len { + t := unchecked_get_u24le(buf[pos:]) + t &= 0x7FFFFF + pos += 3 + + if t < Q { + a[ctr] = i32(t) + ctr += 1 + } + } + + return ctr +} + +poly_uniform :: proc(a: ^Poly, seed: []byte, iv: u16) #no_bounds_check { + // Note/yawning: The dilithium reference code does something + // inexplicably more complicated, but this is identical in + // behavior, and simpler. + #assert(STREAM128_BLOCKBYTES % 3 == 0) + POLY_UNIFORM_NBLOCKS :: ((768 + STREAM128_BLOCKBYTES - 1)/STREAM128_BLOCKBYTES) + + buf: [POLY_UNIFORM_NBLOCKS*STREAM128_BLOCKBYTES]byte = --- + defer crypto.zero_explicit(&buf, size_of(buf)) + + ctx: shake.Context = --- + defer shake.reset(&ctx) + stream128_init(&ctx, seed, iv) + + shake.read(&ctx, buf[:]) + ctr := rej_uniform(a.coeffs[:], buf[:]) + + b := buf[:STREAM128_BLOCKBYTES] + for ctr < N { + shake.read(&ctx, b) + ctr += rej_uniform(a.coeffs[ctr:], b) + } +} + +rej_eta :: proc "contextless" (a: []i32, buf: []byte, params: ^Params) -> int { + ctr, pos: int + a_len, b_len := len(a), len(buf) + switch params.eta { + case 2: + for ctr < a_len && pos < b_len { + t0 := u32(buf[pos] & 0x0F) + t1 := u32(buf[pos] >> 4) + pos += 1 + + if t0 < 15 { + t0 = t0 - (205 * t0 >> 10) * 5 + a[ctr] = i32(2 - t0) + ctr += 1 + } + if t1 < 15 && ctr < a_len { + t1 = t1 - (205 * t1 >> 10) * 5 + a[ctr] = i32(2 - t1) + ctr += 1 + } + } + case 4: + for ctr < a_len && pos < b_len { + t0 := u32(buf[pos] & 0x0F) + t1 := u32(buf[pos] >> 4) + pos += 1 + + if t0 < 9 { + a[ctr] = i32(4 - t0) + ctr += 1 + } + if t1 < 9 && ctr < a_len { + a[ctr] = i32(4 - t1) + ctr += 1 + } + } + case: + unreachable() + } + + return ctr +} + +poly_uniform_eta :: proc(a: ^Poly, seed: []byte, iv: u16, params: ^Params) { + POLY_UNIFORM_ETA2_NBLOCKS :: ((136 + STREAM256_BLOCKBYTES - 1)/STREAM256_BLOCKBYTES) + POLY_UNIFORM_ETA4_NBLOCKS :: ((227 + STREAM256_BLOCKBYTES - 1)/STREAM256_BLOCKBYTES) + + buf_: [POLY_UNIFORM_ETA4_NBLOCKS*STREAM256_BLOCKBYTES]byte = --- + buf: []byte + switch params.eta { + case 2: + buf = buf_[:POLY_UNIFORM_ETA2_NBLOCKS*STREAM256_BLOCKBYTES] + case 4: + buf = buf_[:POLY_UNIFORM_ETA4_NBLOCKS*STREAM256_BLOCKBYTES] + case: + unreachable() + } + defer crypto.zero_explicit(&buf_, size_of(buf_)) + + ctx: shake.Context = --- + defer shake.reset(&ctx) + stream256_init(&ctx, seed, iv) + + shake.read(&ctx, buf) + ctr := rej_eta(a.coeffs[:], buf, params) + + b := buf[:STREAM256_BLOCKBYTES] + for ctr < N { + shake.read(&ctx, b) + ctr += rej_eta(a.coeffs[ctr:], b, params) + } +} + +poly_uniform_gamma1 :: proc(a: ^Poly, seed: []byte, iv: u16, params: ^Params) { + POLY_UNIFORM_GAMMA1_NBLOCKS_MAX :: ((POLYZ_PACKEDBYTES_MAX + STREAM256_BLOCKBYTES - 1)/STREAM256_BLOCKBYTES) + + n_blocks := (polyz_packedbytes(params) + STREAM256_BLOCKBYTES - 1)/STREAM256_BLOCKBYTES + + buf_: [POLY_UNIFORM_GAMMA1_NBLOCKS_MAX*STREAM256_BLOCKBYTES]byte = --- + buf := buf_[:n_blocks*STREAM256_BLOCKBYTES] + defer crypto.zero_explicit(&buf_, size_of(buf_)) + + ctx: shake.Context = --- + defer shake.reset(&ctx) + stream256_init(&ctx, seed, iv) + + shake.read(&ctx, buf) + polyz_unpack(a, buf, params) +} + +poly_challenge :: proc(c: ^Poly, seed: []byte, params: ^Params) #no_bounds_check { + buf: [STREAM256_BLOCKBYTES]byte = --- + defer crypto.zero_explicit(&buf, size_of(buf)) + + ctx: shake.Context = --- + defer shake.reset(&ctx) + + shake.init_256(&ctx) + shake.write(&ctx, seed) + shake.read(&ctx, buf[:]) + + signs: u64 + for i in uint(0)..<8 { + signs |= u64(buf[i]) << (8*i) + } + pos := 8 + + b: int + intrinsics.mem_zero(c, size_of(Poly)) + for i := N - params.tau; i < N; i+= 1 { + for { + if pos >= STREAM256_BLOCKBYTES { + shake.read(&ctx, buf[:]) + pos = 0 + } + + b = int(buf[pos]) + pos += 1 + if b <= i { + break + } + } + + c.coeffs[i] = c.coeffs[b] + c.coeffs[b] = i32(1 - 2 * (signs & 1)) + signs >>= 1 + } +} + +polyeta_pack :: proc "contextless" (r: []byte, a: ^Poly, params: ^Params) #no_bounds_check { + t: [8]byte = --- + defer crypto.zero_explicit(&t, size_of(t)) + + eta := params.eta + switch eta { + case 2: + for i in 0..> 0) | (t[1] << 3) | (t[2] << 6) + r[3*i+1] = (t[2] >> 2) | (t[3] << 1) | (t[4] << 4) | (t[5] << 7) + r[3*i+2] = (t[5] >> 1) | (t[6] << 2) | (t[7] << 5) + } + case 4: + for i in 0..> 0) & 7) + r.coeffs[8*i+1] = i32((a[3*i+0] >> 3) & 7) + r.coeffs[8*i+2] = i32(((a[3*i+0] >> 6) | (a[3*i+1] << 2)) & 7) + r.coeffs[8*i+3] = i32((a[3*i+1] >> 1) & 7) + r.coeffs[8*i+4] = i32((a[3*i+1] >> 4) & 7) + r.coeffs[8*i+5] = i32(((a[3*i+1] >> 7) | (a[3*i+2] << 1)) & 7) + r.coeffs[8*i+6] = i32((a[3*i+2] >> 2) & 7) + r.coeffs[8*i+7] = i32((a[3*i+2] >> 5) & 7) + + r.coeffs[8*i+0] = eta - r.coeffs[8*i+0] + r.coeffs[8*i+1] = eta - r.coeffs[8*i+1] + r.coeffs[8*i+2] = eta - r.coeffs[8*i+2] + r.coeffs[8*i+3] = eta - r.coeffs[8*i+3] + r.coeffs[8*i+4] = eta - r.coeffs[8*i+4] + r.coeffs[8*i+5] = eta - r.coeffs[8*i+5] + r.coeffs[8*i+6] = eta - r.coeffs[8*i+6] + r.coeffs[8*i+7] = eta - r.coeffs[8*i+7] + } + case 4: + for i in 0..> 4) + r.coeffs[2*i+0] = eta - r.coeffs[2*i+0] + r.coeffs[2*i+1] = eta - r.coeffs[2*i+1] + } + case: + unreachable() + } +} + +polyt1_pack :: proc "contextless" (r: []byte, a: ^Poly) #no_bounds_check { + for i in 0..> 0) + r[5*i+1] = byte((a.coeffs[4*i+0] >> 8) | (a.coeffs[4*i+1] << 2)) + r[5*i+2] = byte((a.coeffs[4*i+1] >> 6) | (a.coeffs[4*i+2] << 4)) + r[5*i+3] = byte((a.coeffs[4*i+2] >> 4) | (a.coeffs[4*i+3] << 6)) + r[5*i+4] = byte(a.coeffs[4*i+3] >> 2) + } +} + +polyt1_unpack :: proc "contextless" (r: ^Poly, a: []byte) #no_bounds_check { + for i in 0..> 0) | (u32(a[5*i+1]) << 8)) & 0x3FF) + r.coeffs[4*i+1] = i32((u32(a[5*i+1] >> 2) | (u32(a[5*i+2]) << 6)) & 0x3FF) + r.coeffs[4*i+2] = i32((u32(a[5*i+2] >> 4) | (u32(a[5*i+3]) << 4)) & 0x3FF) + r.coeffs[4*i+3] = i32((u32(a[5*i+3] >> 6) | (u32(a[5*i+4]) << 2)) & 0x3FF) + } +} + +polyt0_pack :: proc "contextless" (r: []byte, a: ^Poly) #no_bounds_check { + t: [8]byte = --- + defer crypto.zero_explicit(&t, size_of(t)) + + for i in 0..> 8 + r[13*i+ 1] |= t[1] << 5 + r[13*i+ 2] = t[1] >> 3 + r[13*i+ 3] = t[1] >> 11 + r[13*i+ 3] |= t[2] << 2 + r[13*i+ 4] = t[2] >> 6 + r[13*i+ 4] |= t[3] << 7 + r[13*i+ 5] = t[3] >> 1 + r[13*i+ 6] = t[3] >> 9 + r[13*i+ 6] |= t[4] << 4 + r[13*i+ 7] = t[4] >> 4 + r[13*i+ 8] = t[4] >> 12 + r[13*i+ 8] |= t[5] << 1 + r[13*i+ 9] = t[5] >> 7 + r[13*i+ 9] |= t[6] << 6 + r[13*i+10] = t[6] >> 2 + r[13*i+11] = t[6] >> 10 + r[13*i+11] |= t[7] << 3 + r[13*i+12] = t[7] >> 5 + } +} + +polyt0_unpack :: proc "contextless" (r: ^Poly, a: []byte) #no_bounds_check { + for i in 0..> 5) + r.coeffs[8*i+1] |= i32(u32(a[13*i+2]) << 3) + r.coeffs[8*i+1] |= i32(u32(a[13*i+3]) << 11) + r.coeffs[8*i+1] &= 0x1FFF + + r.coeffs[8*i+2] = i32(a[13*i+3] >> 2) + r.coeffs[8*i+2] |= i32(u32(a[13*i+4]) << 6) + r.coeffs[8*i+2] &= 0x1FFF + + r.coeffs[8*i+3] = i32(a[13*i+4] >> 7) + r.coeffs[8*i+3] |= i32(u32(a[13*i+5]) << 1) + r.coeffs[8*i+3] |= i32(u32(a[13*i+6]) << 9) + r.coeffs[8*i+3] &= 0x1FFF + + r.coeffs[8*i+4] = i32(a[13*i+6] >> 4) + r.coeffs[8*i+4] |= i32(u32(a[13*i+7]) << 4) + r.coeffs[8*i+4] |= i32(u32(a[13*i+8]) << 12) + r.coeffs[8*i+4] &= 0x1FFF + + r.coeffs[8*i+5] = i32(a[13*i+8] >> 1) + r.coeffs[8*i+5] |= i32(u32(a[13*i+9]) << 7) + r.coeffs[8*i+5] &= 0x1FFF + + r.coeffs[8*i+6] = i32(a[13*i+9] >> 6) + r.coeffs[8*i+6] |= i32(u32(a[13*i+10]) << 2) + r.coeffs[8*i+6] |= i32(u32(a[13*i+11]) << 10) + r.coeffs[8*i+6] &= 0x1FFF + + r.coeffs[8*i+7] = i32(a[13*i+11] >> 3) + r.coeffs[8*i+7] |= i32(u32(a[13*i+12]) << 5) + r.coeffs[8*i+7] &= 0x1FFF + + r.coeffs[8*i+0] = (1 << (D-1)) - r.coeffs[8*i+0] + r.coeffs[8*i+1] = (1 << (D-1)) - r.coeffs[8*i+1] + r.coeffs[8*i+2] = (1 << (D-1)) - r.coeffs[8*i+2] + r.coeffs[8*i+3] = (1 << (D-1)) - r.coeffs[8*i+3] + r.coeffs[8*i+4] = (1 << (D-1)) - r.coeffs[8*i+4] + r.coeffs[8*i+5] = (1 << (D-1)) - r.coeffs[8*i+5] + r.coeffs[8*i+6] = (1 << (D-1)) - r.coeffs[8*i+6] + r.coeffs[8*i+7] = (1 << (D-1)) - r.coeffs[8*i+7] + } +} + +polyz_pack :: proc "contextless" (r: []byte, a: ^Poly, params: ^Params) #no_bounds_check { + t: [4]u32 = --- + defer crypto.zero_explicit(&t, size_of(t)) + + gamma1 := params.gamma1 + switch gamma1 { + case 1 << 17: + for i in 0..> 8) + r[9*i+2] = byte(t[0] >> 16) + r[9*i+2] |= byte(t[1] << 2) + r[9*i+3] = byte(t[1] >> 6) + r[9*i+4] = byte(t[1] >> 14) + r[9*i+4] |= byte(t[2] << 4) + r[9*i+5] = byte(t[2] >> 4) + r[9*i+6] = byte(t[2] >> 12) + r[9*i+6] |= byte(t[3] << 6) + r[9*i+7] = byte(t[3] >> 2) + r[9*i+8] = byte(t[3] >> 10) + } + case 1 << 19: + for i in 0..> 8) + r[5*i+2] = byte(t[0] >> 16) + r[5*i+2] |= byte(t[1] << 4) + r[5*i+3] = byte(t[1] >> 4) + r[5*i+4] = byte(t[1] >> 12) + } + case: + unreachable() + } +} + +polyz_unpack :: proc "contextless" (r: ^Poly, a: []byte, params: ^Params) #no_bounds_check { + gamma1 := params.gamma1 + switch gamma1 { + case 1 << 17: + for i in 0..> 2) + r.coeffs[4*i+1] |= i32(u32(a[9*i+3]) << 6) + r.coeffs[4*i+1] |= i32(u32(a[9*i+4]) << 14) + r.coeffs[4*i+1] &= 0x3FFFF + + r.coeffs[4*i+2] = i32(a[9*i+4] >> 4) + r.coeffs[4*i+2] |= i32(u32(a[9*i+5]) << 4) + r.coeffs[4*i+2] |= i32(u32(a[9*i+6]) << 12) + r.coeffs[4*i+2] &= 0x3FFFF + + r.coeffs[4*i+3] = i32(a[9*i+6] >> 6) + r.coeffs[4*i+3] |= i32(u32(a[9*i+7]) << 2) + r.coeffs[4*i+3] |= i32(u32(a[9*i+8]) << 10) + r.coeffs[4*i+3] &= 0x3FFFF + + r.coeffs[4*i+0] = gamma1 - r.coeffs[4*i+0] + r.coeffs[4*i+1] = gamma1 - r.coeffs[4*i+1] + r.coeffs[4*i+2] = gamma1 - r.coeffs[4*i+2] + r.coeffs[4*i+3] = gamma1 - r.coeffs[4*i+3] + } + case 1 << 19: + for i in 0..> 4) + r.coeffs[2*i+1] |= i32(u32(a[5*i+3]) << 4) + r.coeffs[2*i+1] |= i32(u32(a[5*i+4]) << 12) + /* r.coeffs[2*i+1] &= 0xFFFFF */ /* No effect, since we're anyway at 20 bits */ + + r.coeffs[2*i+0] = gamma1 - r.coeffs[2*i+0] + r.coeffs[2*i+1] = gamma1 - r.coeffs[2*i+1] + } + case: + unreachable() + } +} + +polyw1_pack :: proc "contextless" (r: []byte, a: ^Poly, params: ^Params) #no_bounds_check { + switch params.gamma2 { + case (Q-1)/88: + for i in 0..> 2) + r[3*i+1] |= byte(a.coeffs[4*i+2] << 4) + r[3*i+2] = byte(a.coeffs[4*i+2] >> 4) + r[3*i+2] |= byte(a.coeffs[4*i+3] << 2) + } + case (Q-1)/32: + for i in 0.. bool #no_bounds_check { + for i in 0.. bool #no_bounds_check { + for i in 0.. uint #no_bounds_check { + s: uint + + for i in 0.. i32 { + QINV :: 58728449 // q^(-1) mod 2^32 + + t := i32(i64(i32(a)) * QINV) + t = i32((a - i64(t) * Q) >> 32) + return t +} + +@(require_results) +reduce32 :: #force_inline proc "contextless" (a: i32) -> i32 { + t := (a + (1 << 22)) >> 23 + t = a - t * Q + return t +} + +@(require_results) +caddq :: #force_inline proc "contextless" (a: i32) -> i32 { + a := a + a += (a >> 31) & Q + return a +} + +// @(require_results) +// freeze :: #force_inline proc "contextless" (a: i32) -> i32 { +// a := a +// a = reduce32(a) +// a = caddq(a) +// return a +// } diff --git a/core/crypto/_mldsa/rounding.odin b/core/crypto/_mldsa/rounding.odin new file mode 100644 index 000000000..a879d6159 --- /dev/null +++ b/core/crypto/_mldsa/rounding.odin @@ -0,0 +1,56 @@ +#+private +package _mldsa + +power2round :: proc "contextless" (a: i32) -> (i32, i32) { + a1 := (a + (1 << (D-1)) - 1) >> D + a0 := a - (a1 << D) + return a0, a1 +} + +decompose :: proc "contextless" (a: i32, gamma2: i32) -> (i32, i32) { + a1 := (a + 127) >> 7 + switch gamma2 { + case (Q - 1)/32: + a1 = (a1 * 1025 + (1 << 21)) >> 22 + a1 &= 15 + case (Q - 1)/88: + a1 = (a1 * 11275 + (1 << 23)) >> 24 + a1 ~= ((43 - a1) >> 31) & a1 + } + + a0 := a - a1 * 2 * gamma2 + a0 -= (((Q - 1)/2 - a0) >> 31) & Q + return a0, a1 +} + +make_hint :: proc "contextless" (a0, a1: i32, gamma2: i32) -> uint { + if (a0 > gamma2 || a0 < -gamma2 || (a0 == -gamma2 && a1 != 0)) { + return 1 + } + return 0 +} + +use_hint :: proc "contextless" (a: i32, hint: uint, gamma2: i32) -> i32 { + a0, a1 := decompose(a, gamma2) + if hint == 0 { + return a1 + } + + switch gamma2 { + case (Q - 1)/32: + if (a0 > 0) { + return (a1 + 1) & 15 + } else { + return (a1 -1) & 15 + } + case (Q - 1)/88: + if (a0 > 0) { + return (a1 == 43) ? 0 : a1 + 1 + } else { + return (a1 == 0) ? 43 : a1 - 1 + } + } + + unreachable() +} + diff --git a/core/crypto/_mldsa/symmetric_shake.odin b/core/crypto/_mldsa/symmetric_shake.odin new file mode 100644 index 000000000..5c0aa99d6 --- /dev/null +++ b/core/crypto/_mldsa/symmetric_shake.odin @@ -0,0 +1,39 @@ +#+private +package _mldsa + +import "core:crypto/_sha3" +import "core:crypto/shake" + +STREAM128_BLOCKBYTES :: _sha3.RATE_128 +STREAM256_BLOCKBYTES :: _sha3.RATE_256 + +stream128_init :: proc(ctx: ^shake.Context, seed: []byte, iv: u16) { + t: [2]byte = --- + t[0] = byte(iv) + t[1] = byte(iv >> 8) + + shake.init_128(ctx) + shake.write(ctx, seed) + shake.write(ctx, t[:]) +} + +stream256_init :: proc(ctx: ^shake.Context, seed: []byte, iv: u16) { + t: [2]byte = --- + t[0] = byte(iv) + t[1] = byte(iv >> 8) + + shake.init_256(ctx) + shake.write(ctx, seed) + shake.write(ctx, t[:]) +} + +shake256 :: proc(dst: []byte, srcs: ..[]byte) { + ctx: shake.Context = --- + defer shake.reset(&ctx) + + shake.init_256(&ctx) + for src in srcs { + shake.write(&ctx, src) + } + shake.read(&ctx, dst) +} diff --git a/core/crypto/mldsa/api.odin b/core/crypto/mldsa/api.odin new file mode 100644 index 000000000..ce4f9cffd --- /dev/null +++ b/core/crypto/mldsa/api.odin @@ -0,0 +1,290 @@ +package mldsa + +import "core:crypto" +import "core:crypto/_mldsa" + +// Parameters are the supported ML-DSA parameter sets. +Parameters :: enum { + Invalid, + ML_DSA_44, + ML_DSA_65, + ML_DSA_87, +} + +// PRIVATE_KEY_SEED_SIZE is the size of a private key in bytes. +PRIVATE_KEY_SEED_SIZE :: _mldsa.SEEDBYTES // 32-bytes + +// MAX_CTX_SIZE is the maximum size of the signature context +// (domain separation tag) in bytes. +MAX_CTX_SIZE :: _mldsa.CTXBYTES_MAX // 255-bytes + +// PUBLIC_KEY_SIZES are the per-parameter sizes of a public +// key in bytes. +PUBLIC_KEY_SIZES := [Parameters]int { + .Invalid = 0, + .ML_DSA_44 = 1312, + .ML_DSA_65 = 1952, + .ML_DSA_87 = 2592, +} + +// SIGNATURE_SIZES are the per-parameter sizes of a signature +// in byte. +SIGNATURE_SIZES := [Parameters]int { + .Invalid = 0, + .ML_DSA_44 = 2420, + .ML_DSA_65 = 3309, + .ML_DSA_87 = 4627, +} + +@(private="file") +_PARAMS_TO_INTERNAL := [Parameters]^_mldsa.Params { + .Invalid = nil, + .ML_DSA_44 = &_mldsa.Params_44, + .ML_DSA_65 = &_mldsa.Params_65, + .ML_DSA_87 = &_mldsa.Params_87, +} + +// Private_Key is a ML-DSA private key. +Private_Key :: _mldsa.Private_Key + +// Public_Key is a ML-DSA public key. +Public_Key :: _mldsa.Public_Key + +// private_key_generate uses the system entropy source to generate a new +// Private_Key. This will only fail if and only if (⟺) the system entropy +// source is missing or broken. +@(require_results) +private_key_generate :: proc(priv_key: ^Private_Key, params: Parameters) -> bool { + private_key_clear(priv_key) + + if !crypto.HAS_RAND_BYTES { + return false + } + + params_ := _PARAMS_TO_INTERNAL[params] + if params_ == nil { + return false + } + + seed: [PRIVATE_KEY_SEED_SIZE]byte = --- + defer crypto.zero_explicit(&seed, size_of(seed)) + + crypto.rand_bytes(seed[:]) + + _mldsa.dsa_keygen_internal(priv_key, seed[:], params_) + + return true +} + +// private_key_set_bytes decodes a byte-encoded private key in "seed" format, +// and returns true if and only if (⟺) the operation was successful. +@(require_results) +private_key_set_bytes :: proc(priv_key: ^Private_Key, params: Parameters, b: []byte) -> bool { + private_key_clear(priv_key) + + params_ := _PARAMS_TO_INTERNAL[params] + if params_ == nil { + return false + } + if len(b) != PRIVATE_KEY_SEED_SIZE { + return false + } + + _mldsa.dsa_keygen_internal(priv_key, b, params_) + + return true +} + +// private_key_bytes sets dst to byte-encoding of priv_key in the "seed" +// format. +private_key_bytes :: proc(priv_key: ^Private_Key, dst: []byte) { + ensure(priv_key.params != nil, "crypto/mldsa: uninitialized private key") + ensure(len(dst) == PRIVATE_KEY_SEED_SIZE, "crypto/mldsa: invalid destination size") + + copy(dst, priv_key.seed[:]) +} + +// private_key_public_bytes sets dst to the byte-encoding of the public +// key corresponding to priv_key. +private_key_public_bytes :: proc(priv_key: ^Private_Key, dst: []byte) { + public_key_bytes(&priv_key.pub_key, dst) +} + +// private_key_set sets priv_key to src. +private_key_set :: proc(priv_key, src: ^Private_Key) { + if src == nil || internal_to_params(src.params) == .Invalid { + private_key_clear(priv_key) + return + } + + _mldsa.set_sk(priv_key, src) +} + +// private_key_equal returns true if and only if (⟺) the private keys are +// equal, in constant time. +@(require_results) +private_key_equal :: proc(p, q: ^Private_Key) -> bool { + if p.params != q.params { + return false + } + if p.params == nil { + return true + } + + // Just compare the seed that was passed to dsa_keygen_internal, + // since the process is completely deterministic. + return crypto.compare_constant_time(p.seed[:], q.seed[:]) == 1 +} + +// private_key_clear clears priv_key to the uninitialized state. +private_key_clear :: proc "contextless" (priv_key: ^Private_Key) { + _mldsa.clear_sk(priv_key) +} + +// public_key_set_bytes decodes a byte-encoded public key, and returns +// true if and only if (⟺) the operation was successful. +@(require_results) +public_key_set_bytes :: proc(pub_key: ^Public_Key, params: Parameters, b: []byte) -> bool { + params_ := _PARAMS_TO_INTERNAL[params] + if params_ == nil { + return false + } + + return _mldsa.unpack_pk(pub_key, b, params_) +} + +// public_key_set sets pub_key to src. +public_key_set :: proc(pub_key, src: ^Public_Key) { + if src == nil || internal_to_params(src.params) == .Invalid { + public_key_clear(pub_key) + return + } + + _mldsa.set_pk(pub_key, src) +} + +// public_key_set_priv sets pub_key to the public component of priv_key. +public_key_set_priv :: proc(pub_key: ^Public_Key, priv_key: ^Private_Key) { + ensure(priv_key.params != nil, "crypto/mldsa: uninitialized private key") + public_key_set(pub_key, &priv_key.pub_key) +} + +// public_key_bytes sets dst to byte-encoding of pub_key. +public_key_bytes :: proc(pub_key: ^Public_Key, dst: []byte) { + ensure(pub_key.params != nil, "crypto/mldsa: uninitialized public key") + params := internal_to_params(pub_key.params) + ensure(len(dst) == PUBLIC_KEY_SIZES[params], "crypto/mldsa: invalid destination size") + + _ = _mldsa.pack_pk(dst, pub_key) +} + +// public_key_equal returns true if and only if (⟺) the public keys are equal, +// in constant time. +@(require_results) +public_key_equal :: proc(p, q: ^Public_Key) -> bool { + if p.params != q.params { + return false + } + if p.params == nil { + return true + } + + // Comparing the pre-computed hash should be enough, but pack + // both public keys and do the comparisons. + PUBLIC_KEY_SIZE_MAX :: 2592 + + l := PUBLIC_KEY_SIZES[internal_to_params(p.params)] + p_buf_, q_buf_: [PUBLIC_KEY_SIZE_MAX]byte = ---, --- + p_buf, q_buf := p_buf_[:l], q_buf_[:l] + + _ = _mldsa.pack_pk(p_buf, p) + _ = _mldsa.pack_pk(q_buf, q) + + return crypto.compare_constant_time(p_buf, q_buf) == 1 +} + +// public_key_clear clears pub_key to the uninitialized state. +public_key_clear :: proc "contextless" (pub_key: ^Public_Key) { + _mldsa.clear_pk(pub_key) +} + +// sign writes the signature by priv_key over (ctx, msg) to sig and +// returns true if and only if (⟺) the signing succeeded. +// +// ctx is an optional domain separation tag and may be omitted (nil). +@(require_results) +sign :: proc(priv_key: ^Private_Key, ctx, msg, sig: []byte, deterministic := !crypto.HAS_RAND_BYTES) -> bool { + params := internal_to_params(priv_key.params) + ensure(params != .Invalid, "crypto/mldsa: invalid private key") + ensure(len(sig) == SIGNATURE_SIZES[params], "crypto/mldsa: invalid destination size") + + if !deterministic && !crypto.HAS_RAND_BYTES { + return false + } + if len(ctx) > MAX_CTX_SIZE { + return false + } + + rnd: [_mldsa.RNDBYTES]byte + defer crypto.zero_explicit(&rnd, size_of(rnd)) + + if !deterministic { + crypto.rand_bytes(rnd[:]) + } + + return _mldsa.dsa_sign_internal(sig, msg, ctx, rnd[:], priv_key) +} + +// verify returns true if and only if (⟺) sig is a valid signature by pub_key +// over (ctx, msg). +@(require_results) +verify :: proc(pub_key: ^Public_Key, ctx, msg, sig: []byte) -> bool { + params := internal_to_params(pub_key.params) + ensure(params != .Invalid, "crypto/mldsa: invalid public key") + + if len(sig) != SIGNATURE_SIZES[params] { + return false + } + if len(ctx) > MAX_CTX_SIZE { + return false + } + + return _mldsa.dsa_verify_internal(sig, msg, ctx, pub_key) +} + +// params returns the Parameters used by a Private_Key or Public_Key +// instance. +@(require_results) +params :: proc(k: ^$T) -> Parameters where (T == Private_Key || T == Public_Key) { + return internal_to_params(k.params) +} + +// key_size returns the key size of a Private_Key or Public_Key in bytes. +@(require_results) +key_size :: proc(k: ^$T) -> int where (T == Private_Key || T == Public_Key) { + when T == Private_Key { + return PRIVATE_KEY_SEED_SIZE + } else { + return PUBLIC_KEY_SIZES[internal_to_params(k.params)] + } +} + +// signature_size returns the key size of a signature in bytes. +@(require_results) +signature_size :: proc(k: ^$T) -> int where (T == Private_Key || T == Public_Key) { + return SIGNATURE_SIZES[internal_to_params(k.params)] +} + +@(private="file",require_results) +internal_to_params :: proc "contextless" (params: ^_mldsa.Params) -> Parameters { + switch params { + case &_mldsa.Params_44: + return .ML_DSA_44 + case &_mldsa.Params_65: + return .ML_DSA_65 + case &_mldsa.Params_87: + return .ML_DSA_87 + case: + return .Invalid + } +} diff --git a/core/crypto/mldsa/doc.odin b/core/crypto/mldsa/doc.odin new file mode 100644 index 000000000..4801c070e --- /dev/null +++ b/core/crypto/mldsa/doc.odin @@ -0,0 +1,7 @@ +/* +Module-Lattice-Based Digital Signature Algorithm. + +See: +- [[ https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.204.pdf ]] +*/ +package mldsa diff --git a/examples/all/all_js.odin b/examples/all/all_js.odin index f557cecdb..becc8f522 100644 --- a/examples/all/all_js.odin +++ b/examples/all/all_js.odin @@ -43,6 +43,7 @@ package all @(require) import "core:crypto/legacy/keccak" @(require) import "core:crypto/legacy/md5" @(require) import "core:crypto/legacy/sha1" +@(require) import "core:crypto/mldsa" @(require) import "core:crypto/mlkem" @(require) import cnoise "core:crypto/noise" @(require) import "core:crypto/pbkdf2" diff --git a/examples/all/all_main.odin b/examples/all/all_main.odin index 5565d225d..a35781338 100644 --- a/examples/all/all_main.odin +++ b/examples/all/all_main.odin @@ -48,6 +48,7 @@ package all @(require) import "core:crypto/legacy/keccak" @(require) import "core:crypto/legacy/md5" @(require) import "core:crypto/legacy/sha1" +@(require) import "core:crypto/mldsa" @(require) import "core:crypto/mlkem" @(require) import cnoise "core:crypto/noise" @(require) import "core:crypto/pbkdf2" diff --git a/tests/benchmark/crypto/benchmark_ecc.odin b/tests/benchmark/crypto/benchmark_ecc.odin index 95db33ab3..6315cedd9 100644 --- a/tests/benchmark/crypto/benchmark_ecc.odin +++ b/tests/benchmark/crypto/benchmark_ecc.odin @@ -18,8 +18,8 @@ import "core:crypto/hash" ECDH_ITERS :: 10000 @(private = "file") DSA_ITERS :: 10000 -@(private = "file") -MSG : string : "Got a job for you, 621." +@(private) +SIG_MSG : string : "Got a job for you, 621." @(test) benchmark_crypto_ecc :: proc(t: ^testing.T) { @@ -126,8 +126,8 @@ bench_dsa :: proc() { @(private = "file") bench_ed25519 :: proc() -> (sk, sig, verif: time.Duration) { - priv_str := "cafebabecafebabecafebabecafebabecafebabecafebabecafebabecafebabe" - priv_bytes, _ := hex.decode(transmute([]byte)(priv_str), context.temp_allocator) + SEED : string : "cafebabecafebabecafebabecafebabecafebabecafebabecafebabecafebabe" + priv_bytes, _ := hex.decode(transmute([]byte)(SEED), context.temp_allocator) priv_key: ed25519.Private_Key start := time.tick_now() for _ in 0 ..< DSA_ITERS { @@ -136,13 +136,11 @@ bench_ed25519 :: proc() -> (sk, sig, verif: time.Duration) { } sk = time.tick_since(start) / DSA_ITERS - pub_bytes := priv_key._pub_key._b[:] // "I know what I am doing" pub_key: ed25519.Public_Key - ok := ed25519.public_key_set_bytes(&pub_key, pub_bytes[:]) - assert(ok, "public key should deserialize") + ed25519.public_key_set_priv(&pub_key, &priv_key) sig_bytes: [ed25519.SIGNATURE_SIZE]byte - msg_bytes := transmute([]byte)(MSG) + msg_bytes := transmute([]byte)(SIG_MSG) start = time.tick_now() for _ in 0 ..< DSA_ITERS { ed25519.sign(&priv_key, msg_bytes, sig_bytes[:]) @@ -151,7 +149,7 @@ bench_ed25519 :: proc() -> (sk, sig, verif: time.Duration) { start = time.tick_now() for _ in 0 ..< DSA_ITERS { - ok = ed25519.verify(&pub_key, msg_bytes, sig_bytes[:]) + ok := ed25519.verify(&pub_key, msg_bytes, sig_bytes[:]) assert(ok, "signature should validate") } verif = time.tick_since(start) / DSA_ITERS @@ -175,7 +173,7 @@ bench_ecdsa :: proc(curve: ecdsa.Curve, hash: hash.Algorithm) -> (sk, sig, verif ecdsa.public_key_set_priv(&pub_key, &priv_key) sig_bytes := make([]byte, ecdsa.RAW_SIGNATURE_SIZES[curve], context.temp_allocator) - msg_bytes := transmute([]byte)(MSG) + msg_bytes := transmute([]byte)(SIG_MSG) start = time.tick_now() for _ in 0 ..< DSA_ITERS { ok := ecdsa.sign_raw(&priv_key, hash, msg_bytes, sig_bytes, true) diff --git a/tests/benchmark/crypto/benchmark_pqc.odin b/tests/benchmark/crypto/benchmark_pqc.odin index 314594ca5..20b2827fb 100644 --- a/tests/benchmark/crypto/benchmark_pqc.odin +++ b/tests/benchmark/crypto/benchmark_pqc.odin @@ -6,15 +6,19 @@ import "core:text/table" import "core:time" import "core:crypto" +import "core:crypto/mldsa" import "core:crypto/mlkem" @(private = "file") MLKEM_ITERS :: 50000 +@(private = "file") +MLDSA_ITERS :: 10000 @(test) benchmark_crypto_mlkem :: proc(t: ^testing.T) { if !crypto.HAS_RAND_BYTES { log.warnf("ML-KEM benchmarks skipped, no system entropy source") + return } tbl: table.Table @@ -75,6 +79,86 @@ benchmark_crypto_mlkem :: proc(t: ^testing.T) { log_table(&tbl) } +@(test) +bench_mldsa :: proc(t: ^testing.T) { + if !crypto.HAS_RAND_BYTES { + log.warnf("ML-DSA benchmarks skipped, no system entropy source") + return + } + + tbl: table.Table + table.init(&tbl) + defer table.destroy(&tbl) + + table.caption(&tbl, "ML-DSA") + table.aligned_header_of_values(&tbl, .Right, "Parameters", "Op", "Time") + + append_tbl := proc(tbl: ^table.Table, algo_name, op: string, t: time.Duration) { + table.aligned_row_of_values( + tbl, + .Right, + algo_name, + op, + table.format(tbl, "%8M", t), + ) + } + + do_bench := proc(params: mldsa.Parameters) -> (sk, sig, verif: time.Duration) { + // The time taken is highly seed dependent due to rejection + // sampling using SHAKE, so we hit up the system entropy source + // and crank up the iteration count. + priv_key: mldsa.Private_Key + start := time.tick_now() + for _ in 0 ..< MLDSA_ITERS*2 { + ok := mldsa.private_key_generate(&priv_key, params) + assert(ok, "private key should generate") + } + sk = time.tick_since(start) / (MLDSA_ITERS*2) + + pub_key: mldsa.Public_Key + mldsa.public_key_set_priv(&pub_key, &priv_key) + + msg_bytes := transmute([]byte)(SIG_MSG) + sig_bytes := make([]byte, mldsa.SIGNATURE_SIZES[params]) + defer delete(sig_bytes) + + // FIPS defaults to hedged mode with non-deterministic signatures. + start = time.tick_now() + for _ in 0 ..< MLDSA_ITERS { + ok := mldsa.sign(&priv_key, nil, msg_bytes, sig_bytes) + assert(ok, "signature should succeed") + } + sig = time.tick_since(start) / MLDSA_ITERS + + start = time.tick_now() + for _ in 0 ..< MLDSA_ITERS { + ok := mldsa.verify(&pub_key, nil, msg_bytes, sig_bytes) + assert(ok, "signature should validate") + } + verif = time.tick_since(start) / MLDSA_ITERS + + return + } + + for params in mldsa.Parameters { + if params == .Invalid { + continue + } + param_name := MLDSA_PARAMS_NAMES[params] + + sig, sk, verif := do_bench(params) + append_tbl(&tbl, param_name, "private_key_generate", sk) + append_tbl(&tbl, param_name, "sign", sig) + append_tbl(&tbl, param_name, "verify", verif) + + if params != .ML_DSA_87 { + table.row(&tbl) + } + } + + log_table(&tbl) +} + @(private="file") MLKEM_PARAMS_NAMES := [mlkem.Parameters]string { .Invalid = "invalid", @@ -82,3 +166,11 @@ MLKEM_PARAMS_NAMES := [mlkem.Parameters]string { .ML_KEM_768 = "ML-KEM-768", .ML_KEM_1024 = "ML-KEM-1024", } + +@(private="file") +MLDSA_PARAMS_NAMES := [mldsa.Parameters]string { + .Invalid = "invalid", + .ML_DSA_44 = "ML-DSA-44", + .ML_DSA_65 = "ML-DSA-65", + .ML_DSA_87 = "ML-DSA-87", +} diff --git a/tests/core/crypto/test_core_crypto_pqc.odin b/tests/core/crypto/test_core_crypto_pqc.odin index 8359053e4..f00e47b5a 100644 --- a/tests/core/crypto/test_core_crypto_pqc.odin +++ b/tests/core/crypto/test_core_crypto_pqc.odin @@ -1,10 +1,12 @@ package test_core_crypto import "core:bytes" +import "core:fmt" import "core:log" import "core:testing" import "core:crypto" +import "core:crypto/mldsa" import "core:crypto/mlkem" @(test) @@ -70,3 +72,88 @@ test_mlkem :: proc(t: ^testing.T) { ) } } + +@(test) +test_mldsa :: proc(t: ^testing.T) { + TEST_MSG : string : "ML-DSA test message" + msg_bytes := transmute([]byte)(TEST_MSG) + + // Test vectors are huge, and are covered by the wycheproof corpus, + // so do some casual tests. + for params in mldsa.Parameters { + if params == .Invalid { + continue + } + + seed: [mldsa.PRIVATE_KEY_SEED_SIZE]byte + fmt.bprintf(seed[:], "odin test - %v", params) + + priv_key: mldsa.Private_Key + if !testing.expectf( + t, + mldsa.private_key_set_bytes(&priv_key, params, seed[:]), + "%v: private_key_set_bytes", + params, + ) { + continue + } + + sig_det_bytes := make([]byte, mldsa.SIGNATURE_SIZES[params]) + defer delete(sig_det_bytes) + + if !testing.expectf( + t, + mldsa.sign(&priv_key, nil, msg_bytes, sig_det_bytes, true), + "%v: sign (deterministic)", + params, + ) { + continue + } + + pub_key: mldsa.Public_Key + mldsa.public_key_set_priv(&pub_key, &priv_key) + + if !testing.expectf( + t, + mldsa.verify(&pub_key, nil, msg_bytes, sig_det_bytes), + "%v: verify (deterministic)", + params, + ) { + continue + } + + if !crypto.HAS_RAND_BYTES { + continue + } + + sig_hedged_bytes := make([]byte, mldsa.SIGNATURE_SIZES[params]) + defer delete(sig_hedged_bytes) + + if !testing.expectf( + t, + mldsa.sign(&priv_key, nil, msg_bytes, sig_hedged_bytes), + "%v: sign (hedged)", + params, + ) { + continue + } + + if !testing.expectf( + t, + mldsa.verify(&pub_key, nil, msg_bytes, sig_hedged_bytes), + "%v: verify (hedged)", + params, + ) { + continue + } + + // False positive rate of 1/(2^256), assuming a functional + // entropy source. + testing.expectf( + t, + !bytes.equal(sig_det_bytes, sig_hedged_bytes), + "%v: deterministic sig should not equal hedged", + params, + ) + } +} diff --git a/tests/core/crypto/wycheproof/pqc.odin b/tests/core/crypto/wycheproof/pqc.odin index 210d7be1d..d485f621f 100644 --- a/tests/core/crypto/wycheproof/pqc.odin +++ b/tests/core/crypto/wycheproof/pqc.odin @@ -4,11 +4,15 @@ import "core:encoding/hex" import "core:log" import "core:mem" import "core:os" +import "core:slice" import "core:testing" import "core:crypto/_mlkem" import "core:crypto/mlkem" +import "core:crypto/_mldsa" +import "core:crypto/mldsa" + import "../common" @(test) @@ -81,7 +85,7 @@ test_mlkem :: proc(t: ^testing.T) { test_mlkem_keygen :: proc(t: ^testing.T, test_vectors: ^Test_Vectors(Kem_Test_Group)) -> bool { params_str := test_vectors.test_groups[0].parameter_set - params := parameter_set_to_params(params_str) + params := mlkem_parameter_set_to_params(params_str) if params == .Invalid { return false } @@ -93,19 +97,32 @@ test_mlkem_keygen :: proc(t: ^testing.T, test_vectors: ^Test_Vectors(Kem_Test_Gr for &test_vector in test_group.tests { num_ran += 1 + if comment := test_vector.comment; comment != "" { + log.debugf( + "%s/KeyGen/%d/%d: %s: %+v", + params_str, + tg_id, + test_vector.tc_id, + comment, + test_vector.flags, + ) + } else { + log.debugf("%s/KeyGen/%d/%d: %+v", params_str, tg_id, test_vector.tc_id, test_vector.flags) + } + seed := common.hexbytes_decode(test_vector.seed) dk: mlkem.Decapsulation_Key if !testing.expectf( t, mlkem.decapsulation_key_set_bytes(&dk, params, seed), - "%s/KeyGen/%d/%d: failed to set decapsulation key from seed", + "%s/KeyGen/%d/%d: failed to set decapsulation key from seed: %s", params_str, tg_id, test_vector.tc_id, test_vector.seed, ) { - num_failed *= 1 + num_failed += 1 continue } @@ -184,7 +201,7 @@ test_mlkem_keygen :: proc(t: ^testing.T, test_vectors: ^Test_Vectors(Kem_Test_Gr test_mlkem_encaps :: proc(t: ^testing.T, test_vectors: ^Test_Vectors(Kem_Test_Group)) -> bool { params_str := test_vectors.test_groups[0].parameter_set - params := parameter_set_to_params(params_str) + params := mlkem_parameter_set_to_params(params_str) if params == .Invalid { return false } @@ -196,6 +213,19 @@ test_mlkem_encaps :: proc(t: ^testing.T, test_vectors: ^Test_Vectors(Kem_Test_Gr for &test_vector in test_group.tests { num_ran += 1 + if comment := test_vector.comment; comment != "" { + log.debugf( + "%s/Encaps/%d/%d: %s: %+v", + params_str, + tg_id, + test_vector.tc_id, + comment, + test_vector.flags, + ) + } else { + log.debugf("%s/Encaps/%d/%d: %+v", params_str, tg_id, test_vector.tc_id, test_vector.flags) + } + ek: mlkem.Encapsulation_Key ok := mlkem.encapsulation_key_set_bytes( &ek, @@ -284,7 +314,7 @@ test_mlkem_encaps :: proc(t: ^testing.T, test_vectors: ^Test_Vectors(Kem_Test_Gr test_mlkem_decaps :: proc(t: ^testing.T, test_vectors: ^Test_Vectors(Kem_Test_Group)) -> bool { params_str := test_vectors.test_groups[0].parameter_set - params := parameter_set_to_params(params_str) + params := mlkem_parameter_set_to_params(params_str) if params == .Invalid { return false } @@ -296,6 +326,19 @@ test_mlkem_decaps :: proc(t: ^testing.T, test_vectors: ^Test_Vectors(Kem_Test_Gr for &test_vector in test_group.tests { num_ran += 1 + if comment := test_vector.comment; comment != "" { + log.debugf( + "%s/Decaps/%d/%d: %s: %+v", + params_str, + tg_id, + test_vector.tc_id, + comment, + test_vector.flags, + ) + } else { + log.debugf("%s/Decaps/%d/%d: %+v", params_str, tg_id, test_vector.tc_id, test_vector.flags) + } + // We do not have an API for decaps with raw seed. seed := common.hexbytes_decode(test_vector.seed) switch len(seed) { @@ -386,8 +429,8 @@ test_mlkem_decaps :: proc(t: ^testing.T, test_vectors: ^Test_Vectors(Kem_Test_Gr return num_failed == 0 } -@(require_results, private="file") -parameter_set_to_params :: proc(s: string) -> mlkem.Parameters { +@(require_results,private="file") +mlkem_parameter_set_to_params :: proc(s: string) -> mlkem.Parameters { switch s { case "ML-KEM-512": return .ML_KEM_512 @@ -399,3 +442,321 @@ parameter_set_to_params :: proc(s: string) -> mlkem.Parameters { return .Invalid } } + +@(test) +test_mldsa :: proc(t: ^testing.T) { + arena: mem.Arena + arena_backing := make([]byte, ARENA_SIZE) + defer delete(arena_backing) + mem.arena_init(&arena, arena_backing) + context.allocator = mem.arena_allocator(&arena) + + log.debug("mldsa: starting") + + files_sign := []string { + "mldsa_44_sign_seed_test.json", + "mldsa_65_sign_seed_test.json", + "mldsa_87_sign_seed_test.json", + } + for f in files_sign { + mem.free_all() + + fn, _ := os.join_path([]string{BASE_PATH, f}, context.allocator) + + test_vectors: Test_Vectors(Mldsa_Test_Group) + load_ok := load(&test_vectors, fn) + if !testing.expectf(t, load_ok, "Unable to load {}", f) { + continue + } + + testing.expectf(t, test_mldsa_sign(t, &test_vectors), "ML-DSA Sign failed") + } + + files_verify := []string { + "mldsa_44_verify_test.json", + "mldsa_65_verify_test.json", + "mldsa_87_verify_test.json", + } + for f in files_verify { + mem.free_all() + + fn, _ := os.join_path([]string{BASE_PATH, f}, context.allocator) + + test_vectors: Test_Vectors(Mldsa_Test_Group) + load_ok := load(&test_vectors, fn) + if !testing.expectf(t, load_ok, "Unable to load {}", f) { + continue + } + + testing.expectf(t, test_mldsa_verify(t, &test_vectors), "ML-DSA Verify failed") + } +} + +test_mldsa_sign :: proc(t: ^testing.T, test_vectors: ^Test_Vectors(Mldsa_Test_Group)) -> bool { + FLAG_INTERNAL :: "Internal" + + dummy_rnd: [_mldsa.RNDBYTES]byte + + params_str := test_vectors.algorithm + params := mldsa_parameter_set_to_params(params_str) + if params == .Invalid { + return false + } + + log.debugf("%s: Sign starting", params_str) + + num_ran, num_passed, num_failed, num_skipped: int + for &test_group, tg_id in test_vectors.test_groups { + seed := common.hexbytes_decode(test_group.private_seed) + priv_key: mldsa.Private_Key + + tg_len := len(test_group.tests) + if !testing.expectf( + t, + mldsa.private_key_set_bytes(&priv_key, params, seed), + "%s/Sign/%d: failed to set private key from seed: %s", + params_str, + tg_id, + test_group.private_seed, + ) { + num_ran += tg_len + num_failed += tg_len + continue + } + + pub_bytes := make([]byte, mldsa.PUBLIC_KEY_SIZES[params]) + mldsa.private_key_public_bytes(&priv_key, pub_bytes) + + ok := common.hexbytes_compare(test_group.public_key, pub_bytes) + if !ok { + x := transmute(string)(hex.encode(pub_bytes[:])) + log.errorf( + "%s/Sign/%d: public key: expected: %s actual: %s", + params_str, + tg_id, + test_group.public_key, + x, + ) + num_ran += tg_len + num_failed += tg_len + continue + } + + pub_key: mldsa.Public_Key + if !testing.expectf( + t, + mldsa.public_key_set_bytes(&pub_key, params, pub_bytes), + "%s/Sign/%d: failed to set public key", + params_str, + tg_id, + ) { + num_ran += tg_len + num_failed += tg_len + continue + } + + sig := make([]byte, mldsa.SIGNATURE_SIZES[params]) + for &test_vector in test_group.tests { + num_ran += 1 + + if comment := test_vector.comment; comment != "" { + log.debugf( + "%s/Sign/%d/%d: %s: %+v", + params_str, + tg_id, + test_vector.tc_id, + comment, + test_vector.flags, + ) + } else { + log.debugf("%s/Sign/%d/%d: %+v", params_str, tg_id, test_vector.tc_id, test_vector.flags) + } + + ctx := common.hexbytes_decode(test_vector.ctx) + msg := common.hexbytes_decode(test_vector.msg) + + is_external_mu := slice.contains(test_vector.flags, FLAG_INTERNAL) + switch is_external_mu { + case false: + ok = mldsa.sign( + &priv_key, + ctx, + msg, + sig, + true, + ) + case true: + ok = _mldsa.dsa_sign_internal( + sig, + msg, + ctx, + dummy_rnd[:], + &priv_key, + common.hexbytes_decode(test_vector.mu), + ) + } + if !result_check(test_vector.result, ok) { + log.errorf( + "%s/Sign/%d/%d: unexpected sign result: %v", + params_str, + tg_id, + test_vector.tc_id, + ok, + ) + num_failed += 1 + continue + } + if result_is_invalid(test_vector.result) { + num_passed += 1 + continue + } + + ok = common.hexbytes_compare(test_vector.sig, sig) + if !ok { + x := transmute(string)(hex.encode(sig)) + log.errorf( + "%s/Sign/%d/%d: sign: expected: %s actual: %s", + params_str, + tg_id, + test_vector.tc_id, + test_vector.sig, + x, + ) + num_failed += 1 + continue + } + + // Might as well verify as well if we have the ctx/msg. + if !is_external_mu { + if !testing.expectf( + t, + mldsa.verify(&pub_key, ctx, msg, sig), + "%s/Sign/%d/%d: verify failed", + params_str, + tg_id, + test_vector.tc_id, + ) { + num_failed += 1 + continue + } + } + + num_passed += 1 + } + } + + assert(num_ran == test_vectors.number_of_tests) + assert(num_passed + num_failed + num_skipped == num_ran) + + log.infof( + "%s/Sign: ran %d, passed %d, failed %d, skipped %d", + params_str, + num_ran, + num_passed, + num_failed, + num_skipped, + ) + + return num_failed == 0 +} + +test_mldsa_verify:: proc(t: ^testing.T, test_vectors: ^Test_Vectors(Mldsa_Test_Group)) -> bool { + params_str := test_vectors.algorithm + params := mldsa_parameter_set_to_params(params_str) + if params == .Invalid { + return false + } + + log.debugf("%s: Verify starting", params_str) + + num_ran, num_passed, num_failed, num_skipped: int + for &test_group, tg_id in test_vectors.test_groups { + tg_len := len(test_group.tests) + + pub_key_bytes := common.hexbytes_decode(test_group.public_key) + pub_key: mldsa.Public_Key + + expected := len(pub_key_bytes) == mldsa.PUBLIC_KEY_SIZES[params] + ok := mldsa.public_key_set_bytes(&pub_key, params, pub_key_bytes) + if !testing.expectf( + t, + ok == expected, + "%s/Verify/%d: failed to set public key", + params_str, + tg_id, + ) { + num_ran += tg_len + num_failed += tg_len + continue + } + if expected == false { + num_ran += tg_len + num_passed += tg_len + continue + } + + for &test_vector in test_group.tests { + if comment := test_vector.comment; comment != "" { + log.debugf( + "%s/Verify/%d/%d: %s: %+v", + params_str, + tg_id, + test_vector.tc_id, + comment, + test_vector.flags, + ) + } else { + log.debugf("%s/Verify/%d/%d: %+v", params_str, tg_id, test_vector.tc_id, test_vector.flags) + } + + num_ran += 1 + + ctx := common.hexbytes_decode(test_vector.ctx) + msg := common.hexbytes_decode(test_vector.msg) + sig := common.hexbytes_decode(test_vector.sig) + + ok = mldsa.verify(&pub_key, ctx, msg, sig) + if !result_check(test_vector.result, ok) { + log.errorf( + "%s/Verify/%d/%d: unexpected verify result: %v", + params_str, + tg_id, + test_vector.tc_id, + ok, + ) + num_failed += 1 + continue + } + + num_passed += 1 + } + } + + assert(num_ran == test_vectors.number_of_tests) + assert(num_passed + num_failed + num_skipped == num_ran) + + log.infof( + "%s/Verify: ran %d, passed %d, failed %d, skipped %d", + params_str, + num_ran, + num_passed, + num_failed, + num_skipped, + ) + + return num_failed == 0 +} + +@(require_results,private="file") +mldsa_parameter_set_to_params :: proc(s: string) -> mldsa.Parameters { + switch s { + case "ML-DSA-44": + return .ML_DSA_44 + case "ML-DSA-65": + return .ML_DSA_65 + case "ML-DSA-87": + return .ML_DSA_87 + case: + return .Invalid + } +} diff --git a/tests/core/crypto/wycheproof/schemas.odin b/tests/core/crypto/wycheproof/schemas.odin index d801207a0..36fc22d10 100644 --- a/tests/core/crypto/wycheproof/schemas.odin +++ b/tests/core/crypto/wycheproof/schemas.odin @@ -29,10 +29,6 @@ result_is_invalid :: proc(r: Result) -> bool { return r == "invalid" } - -// The type namings are not following Odin convention, to better match -// the schema, though the fields do. - load :: proc(tvs: ^$T/Test_Vectors, fn: string) -> bool { raw_json, err := os.read_entire_file_from_path(fn, context.allocator) if err != os.ERROR_NONE { @@ -223,3 +219,24 @@ Kem_Test_Vector :: struct { k: common.Hex_Bytes `json:"K"`, result: Result `json:"result"`, } + +Mldsa_Test_Group :: struct { + type: string `json:"type"`, + private_seed: common.Hex_Bytes `json:"privateSeed"`, + private_key_pkcs8: common.Hex_Bytes `json:"privateKeyPkcs8"`, + public_key: common.Hex_Bytes `json:"publicKey"`, + public_key_der: common.Hex_Bytes `json:"publicKeyDer"`, + source: Test_Group_Source `json:"source"`, + tests: []Mldsa_Test_Vector `json:"tests"`, +} + +Mldsa_Test_Vector :: struct { + tc_id: int `json:"tcId"`, + comment: string `json:"comment"`, + msg: common.Hex_Bytes `json:"msg"`, + ctx: common.Hex_Bytes `json:"ctx"`, + mu: common.Hex_Bytes `json:"mu"`, + sig: common.Hex_Bytes `json:"sig"`, + result: Result `json:"result"`, + flags: []string `json:"flags"`, +} From f370632888a7d7ccdd58a47fc1333e11cc9e0073 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 19 May 2026 14:47:06 +0100 Subject: [PATCH 077/228] Add suggestion when trying to index a `#simd` array --- src/check_expr.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 793f6f4c9..7500af7c1 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -11733,6 +11733,8 @@ gb_internal ExprKind check_index_expr(CheckerContext *c, Operand *o, Ast *node, } if (!valid) { + ERROR_BLOCK(); + gbString str = expr_to_string(o->expr); gbString type_str = type_to_string(o->type); defer (gb_string_free(str)); @@ -11742,6 +11744,10 @@ gb_internal ExprKind check_index_expr(CheckerContext *c, Operand *o, Ast *node, } else { error(o->expr, "Cannot index '%s' of type '%s'", str, type_str); } + if (is_type_simd_vector(o->type)) { + error_line("\tSuggestion: Use 'simd.extract' or 'simd.replace' instead depending on the situation\n"); + } + o->mode = Addressing_Invalid; o->expr = node; return kind; From 0a87628a76f74dc1a982b340d0d8a8b9e7247662 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 19 May 2026 14:52:46 +0100 Subject: [PATCH 078/228] Add suggestion when trying to use `<<` and `>>` with `#simd` --- src/check_expr.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 7500af7c1..ee9dd054d 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -3323,9 +3323,16 @@ gb_internal void check_shift(CheckerContext *c, Operand *x, Operand *y, Ast *nod return; } } else if (!is_type_unsigned(y->type)) { + ERROR_BLOCK(); + gbString y_str = expr_to_string(y->expr); error(y->expr, "Shift amount '%s' must be an unsigned integer", y_str); gb_string_free(y_str); + if (is_type_simd_vector(x->type)) { + char const *s = be->op.kind == Token_Shl ? "shl" : "shr"; + error_line("\tSuggestion: Use 'simd.%s' or 'simd.%s_masked'\n", s, s); + } + x->mode = Addressing_Invalid; return; } From cfef365c9f8a5287f6b867bbf7412d121cb5d1cb Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 19 May 2026 14:53:50 +0100 Subject: [PATCH 079/228] Add another suggestion of `#simd` shifting --- src/check_expr.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index ee9dd054d..bb7a181df 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -3319,6 +3319,10 @@ gb_internal void check_shift(CheckerContext *c, Operand *x, Operand *y, Ast *nod if (y_is_untyped) { convert_to_typed(c, y, t_untyped_integer); if (y->mode == Addressing_Invalid) { + if (is_type_simd_vector(x->type)) { + char const *s = be->op.kind == Token_Shl ? "shl" : "shr"; + error_line("\tSuggestion: Use 'simd.%s' or 'simd.%s_masked'\n", s, s); + } x->mode = Addressing_Invalid; return; } From 42d3f78baed1530b959cd16aedda74c96d438114 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 19 May 2026 14:54:39 +0100 Subject: [PATCH 080/228] Improve `simd.sign_bit` code generation --- core/simd/simd.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/simd/simd.odin b/core/simd/simd.odin index 40a25abc5..8420a1b99 100644 --- a/core/simd/simd.odin +++ b/core/simd/simd.odin @@ -2791,7 +2791,7 @@ sign_bit :: #force_inline proc "contextless" (v: $T/#simd[$LANES]$E) -> (res: ty val := to_bits(v) mask := type_of(val)(1<<(BITS-1)) masked := bit_and(val, mask) - return to_bits(shr(to_bits_signed(masked), BITS-1)) + return to_bits(shr_masked(to_bits_signed(masked), BITS-1)) } /* From 2094cd4768e4b6c19e4dfb674cecf89505ef3d3d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 19 May 2026 15:27:34 +0100 Subject: [PATCH 081/228] Add suggestion for ternary if with simd --- src/check_builtin.cpp | 8 ++++---- src/check_expr.cpp | 4 ++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index 4cbdbefa6..0a7943a4d 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -1403,9 +1403,9 @@ gb_internal bool check_builtin_simd_operation(CheckerContext *c, Operand *operan return false; } Type *elem = base_array_type(x.type); - if (!is_type_boolean(elem)) { + if (!is_type_boolean(elem) && !is_type_integer(elem)) { gbString xs = type_to_string(x.type); - error(x.expr, "'%.*s' expected a #simd type with a boolean element, got '%s'", LIT(builtin_name), xs); + error(x.expr, "'%.*s' expected a #simd type with a boolean or an integer element, got '%s'", LIT(builtin_name), xs); gb_string_free(xs); return false; } @@ -1572,8 +1572,8 @@ gb_internal bool check_builtin_simd_operation(CheckerContext *c, Operand *operan Operand x = {}; Operand y = {}; - check_expr(c, &x, ce->args[1]); if (x.mode == Addressing_Invalid) return false; - check_expr_with_type_hint(c, &y, ce->args[2], x.type); if (y.mode == Addressing_Invalid) return false; + check_expr_with_type_hint(c, &x, ce->args[1], type_hint); if (x.mode == Addressing_Invalid) return false; + check_expr_with_type_hint(c, &y, ce->args[2], x.type); if (y.mode == Addressing_Invalid) return false; convert_to_typed(c, &y, x.type); if (y.mode == Addressing_Invalid) return false; if (!is_type_simd_vector(x.type)) { error(x.expr, "'%.*s' expected a simd vector type", LIT(builtin_name)); diff --git a/src/check_expr.cpp b/src/check_expr.cpp index bb7a181df..ed2115a30 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -9681,7 +9681,11 @@ gb_internal ExprKind check_ternary_if_expr(CheckerContext *c, Operand *o, Ast *n node->viral_state_flags |= te->cond->viral_state_flags; if (cond.mode != Addressing_Invalid && !is_type_boolean(cond.type)) { + ERROR_BLOCK(); error(te->cond, "Non-boolean condition in ternary if expression"); + if (is_type_simd_vector(cond.type)) { + error_line("\tSuggestion: Use 'simd.select' a ternary-like operation is required\n"); + } } Operand x = {Addressing_Invalid}; From a3240373ac0b2ba5749155d37e6420111f9c2946 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 19 May 2026 15:33:45 +0100 Subject: [PATCH 082/228] Allow `simd.(reduce_any|reduce_all)` to work with #simd integers --- src/llvm_backend_proc.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index abe3d6b5a..2840cfd3e 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -1789,6 +1789,12 @@ gb_internal lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAn LLVMValueRef args[1] = { arg0.value }; res.value = lb_call_intrinsic(p, name, args, gb_count_of(args), types, gb_count_of(types)); + res.type = base_array_type(arg0.type); + + if (!is_type_boolean(res.type)) { + res = lb_emit_conv(p, res, tv.type); + } + return res; } From f231ef0596ae3bd810f3d89ad22f98e2e820fd39 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 19 May 2026 15:44:31 +0100 Subject: [PATCH 083/228] Support `simd.byte_swap` --- core/simd/simd.odin | 6 ++++++ src/check_builtin.cpp | 9 ++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/core/simd/simd.odin b/core/simd/simd.odin index 8420a1b99..11dc8129d 100644 --- a/core/simd/simd.odin +++ b/core/simd/simd.odin @@ -2585,6 +2585,12 @@ Reverse the bit pattern of a SIMD vector. */ reverse_bits :: intrinsics.reverse_bits +/* +Swap the bytes of the elements of a SIMD vector. +*/ +byte_swap :: intrinsics.byte_swap + + /* **Operation** diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index 0a7943a4d..1a6b97b49 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -5610,7 +5610,14 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As return false; } - if (!is_type_integer_like(x.type) && !is_type_float(x.type)) { + if (is_type_simd_vector(x.type)) { + Type *elem = base_array_type(x.type); + if (!is_type_integer_like(elem)) { + gbString xts = type_to_string(x.type); + error(x.expr, "#simd values passed to '%.*s' must have an element of an integer-like type (integer, boolean, enum, bit_set), got %s", LIT(builtin_name), xts); + gb_string_free(xts); + } + } else if (!is_type_integer_like(x.type) && !is_type_float(x.type)) { gbString xts = type_to_string(x.type); error(x.expr, "Values passed to '%.*s' must be an integer-like type (integer, boolean, enum, bit_set) or float, got %s", LIT(builtin_name), xts); gb_string_free(xts); From c66de5ee3cbfb357ac2db1b3b10170a9209d0e6a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 19 May 2026 18:32:05 +0100 Subject: [PATCH 084/228] Improve vector to integer transmute LLVM IR --- src/llvm_backend_utility.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index bb3b4dadb..a92e8610e 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -287,8 +287,12 @@ gb_internal lbValue lb_emit_transmute(lbProcedure *p, lbValue value, Type *t) { } bool is_simd_vector_bitcastable = false; - if (is_type_simd_vector(src) && is_type_simd_vector(dst)) { - if (!is_type_internally_pointer_like(src->SimdVector.elem) && !is_type_internally_pointer_like(dst->SimdVector.elem)) { + if (is_type_simd_vector(src)) { + if (is_type_simd_vector(dst)) { + if (!is_type_internally_pointer_like(src->SimdVector.elem) && !is_type_internally_pointer_like(dst->SimdVector.elem)) { + is_simd_vector_bitcastable = true; + } + } else if (is_type_integer(dst) && is_type_endian_platform(dst)) { is_simd_vector_bitcastable = true; } } From a91725f305285d5dd9bd62b60e6e64142362f1a0 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 19 May 2026 21:32:09 +0100 Subject: [PATCH 085/228] Add `simd.interleave` + `simd.deinterleave` --- base/intrinsics/intrinsics.odin | 7 ++- core/simd/simd.odin | 3 ++ src/check_builtin.cpp | 84 +++++++++++++++++++++++++++++++++ src/checker_builtin_procs.hpp | 6 +++ src/llvm_backend_proc.cpp | 51 +++++++++++++++++++- 5 files changed, 148 insertions(+), 3 deletions(-) diff --git a/base/intrinsics/intrinsics.odin b/base/intrinsics/intrinsics.odin index e89036932..635b31193 100644 --- a/base/intrinsics/intrinsics.odin +++ b/base/intrinsics/intrinsics.odin @@ -367,8 +367,11 @@ simd_odd_even :: proc(a, b: #simd[N]T) -> #simd[N]T --- // Returns the sums of N consecutive lanes simd_sums_of_n :: proc(a: #simd[LANES]T, $N: uint) -> #simd[LANES/N]T where is_power_of_two(N) --- -simd_pairwise_add :: proc(a, b: #simd[LANES]T) -> #simd[LANES/N]T --- -simd_pairwise_sub :: proc(a, b: #simd[LANES]T) -> #simd[LANES/N]T --- +simd_pairwise_add :: proc(a, b: #simd[LANES]T) -> #simd[LANES]T where LANES % 2 == 0 --- +simd_pairwise_sub :: proc(a, b: #simd[LANES]T) -> #simd[LANES]T where LANES % 2 == 0 --- + +simd_interleave :: proc(a, ..#simd[LANES/N]T) -> #simd[LANES]T where N >= 1 --- +simd_deinterleave :: proc(a: #simd[LANES]T, $N: uint) -> (#simd[LANES/N]T, #simd[LANES/N]T, ..., #simd[LANES/N]T) where N >= 1, LANES % N == 0 --- // Checks if the current target supports the given target features. diff --git a/core/simd/simd.odin b/core/simd/simd.odin index 11dc8129d..7313babcd 100644 --- a/core/simd/simd.odin +++ b/core/simd/simd.odin @@ -2886,3 +2886,6 @@ abs_diff :: #force_inline proc "contextless" (a, b: $T/#simd[$LANES]$E) -> T whe pairwise_add :: intrinsics.simd_pairwise_add pairwise_sub :: intrinsics.simd_pairwise_add + +interleave :: intrinsics.simd_interleave +deinterleave :: intrinsics.simd_deinterleave \ No newline at end of file diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index 1a6b97b49..584264f10 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -1868,6 +1868,90 @@ gb_internal bool check_builtin_simd_operation(CheckerContext *c, Operand *operan return true; } + case BuiltinProc_simd_interleave: + { + Operand x = {}; + check_expr(c, &x, ce->args[0]); if (x.mode == Addressing_Invalid) return false; + + if (!is_type_simd_vector(x.type)) { + error(x.expr, "'%.*s' expected a simd vector type", LIT(builtin_name)); + return false; + } + + for (isize i = 1; i < ce->args.count; i++) { + Operand y = {}; + check_expr_with_type_hint(c, &y, ce->args[i], x.type); if (y.mode == Addressing_Invalid) return false; + if (!is_type_simd_vector(y.type)) { + error(y.expr, "'%.*s' expected a simd vector type", LIT(builtin_name)); + return false; + } + if (!are_types_identical(x.type, y.type)) { + gbString a = type_to_string(x.type); + gbString b = type_to_string(y.type); + error(y.expr, "'%.*s' all argument types must match, expected %s, got %s", LIT(builtin_name), a, b); + gb_string_free(b); + gb_string_free(a); + return false; + } + } + + Type *elem = base_array_type(x.type); + i64 base_count = get_array_type_count(x.type); + i64 count = base_count * cast(i64)ce->args.count; + + i64 max_count = 64; + if (count > max_count) { + error(ce->proc, "'%.*s' exceeds the maximum #simd count %lld, got %lld", cast(long long)max_count, cast(long long)count); + return false; + } + + operand->type = alloc_type_simd_vector(count, elem); + operand->mode = Addressing_Value; + return true; + } + + case BuiltinProc_simd_deinterleave: + { + Operand x = {}; + check_expr(c, &x, ce->args[0]); if (x.mode == Addressing_Invalid) return false; + if (!is_type_simd_vector(x.type)) { + error(x.expr, "'%.*s' expected a simd vector type", LIT(builtin_name)); + return false; + } + + Type *elem = base_array_type(x.type); + i64 max_count = get_array_type_count(x.type); + + Operand n = {}; + check_expr(c, &n, ce->args[1]); if (n.mode == Addressing_Invalid) return false; + if (n.mode != Addressing_Constant) { + error(n.expr, "'%.*s' expected a constant integer divisible by the count of the #simd vector", LIT(builtin_name)); + return false; + } + if (n.value.kind != ExactValue_Integer) { + error(n.expr, "'%.*s' expected a constant integer divisible by the count of the #simd vector", LIT(builtin_name)); + return false; + } + i64 divisor = exact_value_to_i64(n.value); + if (divisor < 1 || divisor > max_count || (max_count % divisor != 0)) { + error(n.expr, "'%.*s' expected a constant integer divisible by the count of the #simd vector , got %lld, which must have been divisible by %lld", LIT(builtin_name), cast(long long)divisor, cast(long long)max_count); + return false; + } + + Type *base_vector = alloc_type_simd_vector(max_count / divisor, elem); + + Type **field_types = temporary_alloc_array(cast(isize)divisor); + for (i64 i = 0; i < divisor; i++) { + field_types[i] = base_vector; + } + + operand->type = alloc_type_tuple_from_field_types(field_types, divisor, false, false); + operand->mode = Addressing_Value; + return true; + } + break; + + case BuiltinProc_simd_x86__MM_SHUFFLE: { Operand x[4] = {}; diff --git a/src/checker_builtin_procs.hpp b/src/checker_builtin_procs.hpp index 8baa92e58..049d29a2a 100644 --- a/src/checker_builtin_procs.hpp +++ b/src/checker_builtin_procs.hpp @@ -235,6 +235,9 @@ BuiltinProc__simd_begin, BuiltinProc_simd_indices, + BuiltinProc_simd_interleave, + BuiltinProc_simd_deinterleave, + // Platform specific SIMD intrinsics BuiltinProc_simd_x86__MM_SHUFFLE, @@ -641,6 +644,9 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = { {STR_LIT("simd_indices"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("simd_interleave"), 1, true, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("simd_deinterleave"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics}, + {STR_LIT("simd_x86__MM_SHUFFLE"), 4, false, Expr_Expr, BuiltinProcPkg_intrinsics}, {STR_LIT(""), 0, false, Expr_Stmt, BuiltinProcPkg_intrinsics}, diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 2840cfd3e..bed7ad6ac 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -1445,7 +1445,7 @@ gb_internal lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAn Type *elem = type->SimdVector.elem; i64 count = type->SimdVector.count; - LLVMValueRef *scalars = gb_alloc_array(temporary_allocator(), LLVMValueRef, count); + LLVMValueRef *scalars = temporary_alloc_array(count); for (i64 i = 0; i < count; i++) { scalars[i] = lb_const_value(m, elem, exact_value_i64(i)).value; } @@ -1453,6 +1453,55 @@ gb_internal lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAn res.value = LLVMConstVector(scalars, cast(unsigned)count); return res; } + + case BuiltinProc_simd_interleave: + { + int n = cast(int)ce->args.count; + + if (n == 1) { + lbValue arg = lb_build_expr(p, ce->args[0]); + res.value = arg.value; + return res; + } + + Type *vector_type = type_of_expr(ce->args[0]); + + LLVMValueRef *args = temporary_alloc_array(n); + for (int i = 0; i < n; i++) { + lbValue arg = lb_build_expr(p, ce->args[i]); + arg = lb_emit_conv(p, arg, vector_type); + args[i] = arg.value; + } + + gbString name = gb_string_make(heap_allocator(), ""); + name = gb_string_append_fmt(name, "llvm.vector.interleave%d", n); + defer (gb_string_free(name)); + + LLVMTypeRef types[1] = {lb_type(m, tv.type)}; + res.value = lb_call_intrinsic(p, name, args, n, types, gb_count_of(types)); + return res; + } + + case BuiltinProc_simd_deinterleave: + { + lbValue arg0 = lb_build_expr(p, ce->args[0]); + LLVMTypeRef types[1] = {lb_type(m, arg0.type)}; + + GB_ASSERT(ce->args[1]->tav.value.kind == ExactValue_Integer); + int n = cast(int)exact_value_to_i64(ce->args[1]->tav.value); + + if (n == 1) { + res.value = arg0.value; + return res; + } + + gbString name = gb_string_make(heap_allocator(), ""); + name = gb_string_append_fmt(name, "llvm.vector.deinterleave%d", n); + defer (gb_string_free(name)); + + res.value = lb_call_intrinsic(p, name, &arg0.value, 1, types, gb_count_of(types)); + return res; + } } lbValue arg0 = {}; if (ce->args.count > 0) arg0 = lb_build_expr(p, ce->args[0]); From b924da10a0b59fb07fa2c8db182fcbe924e1d527 Mon Sep 17 00:00:00 2001 From: Krzesimir Nowak Date: Mon, 18 May 2026 11:55:59 +0200 Subject: [PATCH 086/228] Be more thorough in detecting generic procedure types --- core/odin/parser/parser.odin | 69 ++++++++++++++++++++++------- src/parser.cpp | 86 +++++++++++++++++++++++++++++------- 2 files changed, 123 insertions(+), 32 deletions(-) diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin index 36cb751b3..c170e06cf 100644 --- a/core/odin/parser/parser.odin +++ b/core/odin/parser/parser.odin @@ -2199,6 +2199,57 @@ parse_proc_tags :: proc(p: ^Parser) -> (tags: ast.Proc_Tags) { return } +is_expr_generic :: proc(expr : ^ast.Expr) -> bool { + is_generic := false + if expr != nil { + #partial switch e in expr.derived_expr { + case ^ast.Typeid_Type: + is_generic = e.specialization != nil + case ^ast.Poly_Type: + is_generic = true + case ^ast.Proc_Type: + is_generic = e.generic + case ^ast.Pointer_Type: + is_generic = is_expr_generic(e.elem) + case ^ast.Multi_Pointer_Type: + is_generic = is_expr_generic(e.elem) + case ^ast.Array_Type: + is_generic = is_expr_generic(e.len) || is_expr_generic(e.elem) + case ^ast.Dynamic_Array_Type: + is_generic = is_expr_generic(e.elem) + case ^ast.Fixed_Capacity_Dynamic_Array_Type: + is_generic = is_expr_generic(e.capacity) || is_expr_generic(e.elem) + case ^ast.Bit_Set_Type: + is_generic = is_expr_generic(e.elem) + case ^ast.Map_Type: + is_generic = is_expr_generic(e.key) || is_expr_generic(e.value) + case ^ast.Matrix_Type: + is_generic = is_expr_generic(e.row_count) || is_expr_generic(e.column_count) || is_expr_generic(e.elem) + } + } + return is_generic +} + +is_field_list_generic :: proc(field_list : ^ast.Field_List, check_names : bool) -> bool { + is_generic := false + loop: for param in field_list.list { + if is_expr_generic(param.type) { + is_generic = true + break loop + } + if !check_names || param.type == nil { + continue + } + for name in param.names { + if _, ok := name.derived.(^ast.Poly_Type); ok { + is_generic = true + break loop + } + } + } + return is_generic +} + parse_proc_type :: proc(p: ^Parser, tok: tokenizer.Token) -> ^ast.Proc_Type { cc: ast.Proc_Calling_Convention if p.curr_tok.kind == .String { @@ -2220,21 +2271,9 @@ parse_proc_type :: proc(p: ^Parser, tok: tokenizer.Token) -> ^ast.Proc_Type { expect_closing_parentheses_of_field_list(p) results, diverging := parse_results(p) - is_generic := false - - loop: for param in params.list { - if param.type != nil { - if _, ok := param.type.derived.(^ast.Poly_Type); ok { - is_generic = true - break loop - } - for name in param.names { - if _, ok := name.derived.(^ast.Poly_Type); ok { - is_generic = true - break loop - } - } - } + is_generic := is_field_list_generic(params, true) + if !is_generic && results != nil { + is_generic = is_field_list_generic(results, false) } end := end_pos(p.prev_tok) diff --git a/src/parser.cpp b/src/parser.cpp index 17ab5ccf1..6dac8914f 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -4106,6 +4106,71 @@ gb_internal ProcCallingConvention string_to_calling_convention(String const &s) return ProcCC_Invalid; } +gb_internal bool is_ast_generic(Ast *a) { + bool is_generic = false; + if (a != nullptr) { + switch (a->kind) { + case Ast_TypeidType: + is_generic = a->TypeidType.specialization != nullptr; + break; + case Ast_PolyType: + is_generic = true; + break; + case Ast_ProcType: + is_generic = a->ProcType.generic; + break; + case Ast_PointerType: + is_generic = is_ast_generic(a->PointerType.type); + break; + case Ast_MultiPointerType: + is_generic = is_ast_generic(a->MultiPointerType.type); + break; + case Ast_ArrayType: + is_generic = is_ast_generic(a->ArrayType.elem) || is_ast_generic(a->ArrayType.count); + break; + case Ast_DynamicArrayType: + is_generic = is_ast_generic(a->DynamicArrayType.elem); + break; + case Ast_FixedCapacityDynamicArrayType: + is_generic = is_ast_generic(a->FixedCapacityDynamicArrayType.elem) || is_ast_generic(a->FixedCapacityDynamicArrayType.capacity); + break; + case Ast_BitSetType: + is_generic = is_ast_generic(a->BitSetType.elem); + break; + case Ast_MapType: + is_generic = is_ast_generic(a->MapType.key) || is_ast_generic(a->MapType.value); + break; + case Ast_MatrixType: + is_generic = is_ast_generic(a->MatrixType.row_count) || is_ast_generic(a->MatrixType.column_count) || is_ast_generic(a->MatrixType.elem); + break; + } + } + return is_generic; +} + +gb_internal bool is_field_list_generic(AstFieldList *field_list, bool check_names) { + bool is_generic = false; + + for (Ast *param : field_list->list) { + ast_node(field, Field, param); + if (is_ast_generic(field->type)) { + is_generic = true; + goto end; + } + if (!check_names || field->type == nullptr) { + continue; + } + for (Ast *name : field->names) { + if (name->kind == Ast_PolyType) { + is_generic = true; + goto end; + } + } + } +end: + return is_generic; +} + gb_internal Ast *parse_proc_type(AstFile *f, Token proc_token) { Ast *params = nullptr; Ast *results = nullptr; @@ -4141,24 +4206,11 @@ gb_internal Ast *parse_proc_type(AstFile *f, Token proc_token) { results = parse_results(f, &diverging); u64 tags = 0; - bool is_generic = false; - - for (Ast *param : params->FieldList.list) { - ast_node(field, Field, param); - if (field->type != nullptr) { - if (field->type->kind == Ast_PolyType) { - is_generic = true; - goto end; - } - for (Ast *name : field->names) { - if (name->kind == Ast_PolyType) { - is_generic = true; - goto end; - } - } - } + bool is_generic = is_field_list_generic(¶ms->FieldList, true); + if (!is_generic && (results != nullptr)) { + is_generic = is_field_list_generic(&results->FieldList, false); } -end: + return ast_proc_type(f, proc_token, params, results, tags, cc, is_generic, diverging); } From ae4b94fbd0b74a1a232fdd81a222a86565c100dc Mon Sep 17 00:00:00 2001 From: kalsprite Date: Wed, 20 May 2026 16:57:05 -0700 Subject: [PATCH 087/228] fix overloaded call --- src/llvm_backend_proc.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index bed7ad6ac..4e9d269ad 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -2096,16 +2096,17 @@ gb_internal lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAn src_parts[i] = LLVMBuildShuffleVector(p->builder, src, LLVMGetUndef(LLVMTypeOf(src)), extract_mask, ""); } - // Call appropriate ARM64 tbl intrinsic + // Call appropriate ARM64 tbl intrinsic (overloaded on result type) + LLVMTypeRef overload_types[1] = { LLVMTypeOf(indices) }; if (count == 32) { LLVMValueRef args[3] = { src_parts[0], src_parts[1], indices }; - res.value = lb_call_intrinsic(p, intrinsic_name, args, 3, nullptr, 0); + res.value = lb_call_intrinsic(p, intrinsic_name, args, 3, overload_types, 1); } else if (count == 48) { LLVMValueRef args[4] = { src_parts[0], src_parts[1], src_parts[2], indices }; - res.value = lb_call_intrinsic(p, intrinsic_name, args, 4, nullptr, 0); + res.value = lb_call_intrinsic(p, intrinsic_name, args, 4, overload_types, 1); } else if (count == 64) { LLVMValueRef args[5] = { src_parts[0], src_parts[1], src_parts[2], src_parts[3], indices }; - res.value = lb_call_intrinsic(p, intrinsic_name, args, 5, nullptr, 0); + res.value = lb_call_intrinsic(p, intrinsic_name, args, 5, overload_types, 1); } } else if (build_context.metrics.arch == TargetArch_arm32 && count > 8) { // ARM32 VTBL2/VTBL3/VTBL4: Split src into multiple 8-byte vectors @@ -2138,7 +2139,13 @@ gb_internal lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAn } else { // Single runtime swizzle case (x86, WebAssembly, ARM single-table) LLVMValueRef args[2] = { src, indices }; - res.value = lb_call_intrinsic(p, intrinsic_name, args, gb_count_of(args), nullptr, 0); + if (build_context.metrics.arch == TargetArch_arm64) { + // ARM64 tbl1 is overloaded on result type; others are fixed + LLVMTypeRef overload_types[1] = { LLVMTypeOf(indices) }; + res.value = lb_call_intrinsic(p, intrinsic_name, args, gb_count_of(args), overload_types, 1); + } else { + res.value = lb_call_intrinsic(p, intrinsic_name, args, gb_count_of(args), nullptr, 0); + } } return res; } else { From 98d6e0c26a2ba01f23f38a30d381dd8da81764fd Mon Sep 17 00:00:00 2001 From: kalsprite Date: Wed, 20 May 2026 17:55:29 -0700 Subject: [PATCH 088/228] ARM chunking logic, improved docs --- core/simd/simd.odin | 68 ++++++++++++++---------- src/llvm_backend_proc.cpp | 109 ++++++++++++++++++++------------------ 2 files changed, 98 insertions(+), 79 deletions(-) diff --git a/core/simd/simd.odin b/core/simd/simd.odin index 7313babcd..1631c4d23 100644 --- a/core/simd/simd.odin +++ b/core/simd/simd.odin @@ -2441,40 +2441,55 @@ Graphically, the operation looks as follows. The `t` and `f` represent the select :: intrinsics.simd_select /* -Runtime Equivalent to Shuffle. +Hardware-level dynamic swizzle / table lookup. -Performs element-wise table lookups using runtime indices. -Each element in the indices vector selects an element from the table vector. -The indices are automatically masked to prevent out-of-bounds access. - -This operation is hardware-accelerated on most platforms when using 8-bit -integer vectors. For other element types or unsupported vector sizes, it -falls back to software emulation. +For each output lane `i`, picks an element from `table` using `indices[i]` +as the source position. Maps directly onto hardware table-lookup instructions +where available (`tbl` on ARM, `pshufb` on x86, `swizzle` on WASM). This is +the runtime counterpart of `simd.shuffle`. Inputs: -- `table`: The lookup table vector (should be power-of-2 size for correct masking). -- `indices`: The indices vector (automatically masked to valid range). +- `table`: a `#simd[N]T` lookup table, where `T` is an integer type and + `N` is a power of two (enforced by `#simd`). +- `indices`: a `#simd[N]T` of source positions. Must have the exact same + type as `table`. Returns: -- A vector where `result[i] = table[indices[i] & (table_size-1)]`. +- A `#simd[N]T`. For `indices[i]` in `[0, N-1]`, `result[i] = table[indices[i]]` + on ARM, on WebAssembly (16-byte), and on the scalar emulation fallback. + On x86 vectors larger than 16 bytes, the operation is lane-local; see Notes. -Operation: +Operation (in-range indices, non-lane-local platforms): - for i in 0 ..< len(indices) { - masked_index := indices[i] & (len(table) - 1) - result[i] = table[masked_index] + for i in 0 ..< N { + result[i] = table[indices[i]] // indices[i] assumed to be in [0, N-1] } - return result + +Notes: +- **Out-of-range indices** (`indices[i] >= N`) are platform-defined: + most hardware paths return 0; the scalar fallback wraps via + `indices[i] & (N-1)`. Mask explicitly if you need portable behavior. +- **x86 wide vectors are lane-local.** `vpshufb` treats a 256-bit AVX2 + register as two independent 128-bit lanes; `pshufb.b.512` treats a + 512-bit AVX-512 register as four. An index in lane `k` can only address + table entries in that same lane. AVX2 Example: Lane 0 is [0..15], Lane 1 + is [16..31]. Accessing `indices[20] = 5` yields `table[21]`, not `table[5]`. + ARM `tbl` and the emulation fallback are cross-lane across the full table. +- **Hardware acceleration is conditional.** It requires 8-bit integer + elements, a vector size supported by the target, and the relevant + target features enabled (`ssse3` / `avx2` / `avx512f`+`avx512bw` on x86, + `neon` on ARM). Otherwise this falls back to scalar emulation. Non-byte + element types always use the scalar fallback. Implementation: - | Platform | Lane Size | Implementation | - |-------------|-------------------------------------------|---------------------| - | x86-64 | pshufb (16B), vpshufb (32B), AVX512 (64B) | Single vector | - | ARM64 | tbl1 (16B), tbl2 (32B), tbl4 (64B) | Automatic splitting | - | ARM32 | vtbl1 (8B), vtbl2 (16B), vtbl4 (32B) | Automatic splitting | - | WebAssembly | i8x16.swizzle (16B), Emulation (>16B) | Mixed | - | Other | Emulation | Software | + | Platform | Hardware path (8-bit elements) | Notes | + |-------------|-------------------------------------------------|-------------------------------| + | x86-64 | pshufb (16B), vpshufb (32B), pshufb.b.512 (64B) | 32 / 64 B are lane-local | + | ARM64 | tbl1 (16B), tbl2 (32B), tbl4 (64B) | >16 B: split into 16-B chunks | + | ARM32 | vtbl1 (8B), vtbl2 (16B), vtbl4 (32B) | >8 B: split into 8-B chunks | + | WebAssembly | i8x16.swizzle (16B) | Other sizes: emulated | + | Other | Scalar emulation | | Example: @@ -2482,12 +2497,11 @@ Example: import "core:fmt" runtime_swizzle_example :: proc() { - table := simd.u8x16{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} + table := simd.u8x16{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} indices := simd.u8x16{15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14} - result := simd.runtime_swizzle(table, indices) - fmt.println(result) // Expected: {15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14} + result := simd.runtime_swizzle(table, indices) + fmt.println(result) // {15, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14} } - */ runtime_swizzle :: intrinsics.simd_runtime_swizzle diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 4e9d269ad..63ca868ec 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -2078,64 +2078,69 @@ gb_internal lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAn lb_add_attribute_to_proc_with_string(p->module, p->value, str_lit("target-features"), str_lit("+neon")); } - // Handle ARM's multi-swizzle intrinsics by splitting the src vector - if (build_context.metrics.arch == TargetArch_arm64 && count > 16) { - // ARM64 TBL2/TBL3/TBL4: Split src into multiple 16-byte vectors - int num_tables = cast(int)(count / 16); - GB_ASSERT_MSG(count % 16 == 0, "ARM64 src size must be multiple of 16 bytes, got %lld bytes", count); - GB_ASSERT_MSG(num_tables <= 4, "ARM64 NEON supports maximum 4 tables (tbl4), got %d tables for %lld-byte vector", num_tables, count); - - LLVMValueRef src_parts[4]; // Max 4 tables for tbl4 + // Handle ARM's multi-swizzle intrinsics by splitting the src vector. + // tbl[N]/vtbl[N] only produce <16 x i8>/<8 x i8>, so we issue one call + // per output chunk and concat the results. + if ((build_context.metrics.arch == TargetArch_arm64 && count > 16) || + (build_context.metrics.arch == TargetArch_arm32 && count > 8)) { + bool is_arm64 = build_context.metrics.arch == TargetArch_arm64; + i64 lane = is_arm64 ? 16 : 8; + int num_tables = cast(int)(count / lane); + GB_ASSERT_MSG(count % lane == 0, "ARM src size must be multiple of %lld bytes, got %lld bytes", lane, count); + GB_ASSERT_MSG(num_tables <= 4, "ARM NEON supports maximum 4 tables, got %d tables for %lld-byte vector", num_tables, count); + + LLVMTypeRef i32_type = LLVMInt32TypeInContext(p->module->ctx); + LLVMTypeRef i8_type = LLVMInt8TypeInContext(p->module->ctx); + LLVMTypeRef vN_type = LLVMVectorType(i8_type, cast(unsigned)lane); + + // Split src/indices into N lane-sized chunks + LLVMValueRef src_parts[4]; + LLVMValueRef idx_parts[4]; for (int i = 0; i < num_tables; i++) { - // Extract 16-byte slice from the larger src - LLVMValueRef indices_for_extract[16]; - for (int j = 0; j < 16; j++) { - indices_for_extract[j] = LLVMConstInt(LLVMInt32TypeInContext(p->module->ctx), i * 16 + j, false); + LLVMValueRef mask[16]; + for (int j = 0; j < lane; j++) { + mask[j] = LLVMConstInt(i32_type, cast(unsigned)(i * lane + j), false); } - LLVMValueRef extract_mask = LLVMConstVector(indices_for_extract, 16); - src_parts[i] = LLVMBuildShuffleVector(p->builder, src, LLVMGetUndef(LLVMTypeOf(src)), extract_mask, ""); + LLVMValueRef shuffle_mask = LLVMConstVector(mask, cast(unsigned)lane); + src_parts[i] = LLVMBuildShuffleVector(p->builder, src, LLVMGetUndef(LLVMTypeOf(src)), shuffle_mask, ""); + idx_parts[i] = LLVMBuildShuffleVector(p->builder, indices, LLVMGetUndef(LLVMTypeOf(indices)), shuffle_mask, ""); } - - // Call appropriate ARM64 tbl intrinsic (overloaded on result type) - LLVMTypeRef overload_types[1] = { LLVMTypeOf(indices) }; - if (count == 32) { - LLVMValueRef args[3] = { src_parts[0], src_parts[1], indices }; - res.value = lb_call_intrinsic(p, intrinsic_name, args, 3, overload_types, 1); - } else if (count == 48) { - LLVMValueRef args[4] = { src_parts[0], src_parts[1], src_parts[2], indices }; - res.value = lb_call_intrinsic(p, intrinsic_name, args, 4, overload_types, 1); - } else if (count == 64) { - LLVMValueRef args[5] = { src_parts[0], src_parts[1], src_parts[2], src_parts[3], indices }; - res.value = lb_call_intrinsic(p, intrinsic_name, args, 5, overload_types, 1); + + // One tbl/vtbl call per output chunk; same N tables, different indices. + // ARM64 tbl[N] is overloaded on result type; ARM32 vtbl[N] has fixed <8 x i8>. + LLVMTypeRef overload_types[1] = { vN_type }; + LLVMTypeRef *overloads_arg = is_arm64 ? overload_types : nullptr; + unsigned overloads_count = is_arm64 ? 1 : 0; + LLVMValueRef out_parts[4]; + for (int c = 0; c < num_tables; c++) { + LLVMValueRef args[5]; + for (int i = 0; i < num_tables; i++) args[i] = src_parts[i]; + args[num_tables] = idx_parts[c]; + out_parts[c] = lb_call_intrinsic(p, intrinsic_name, args, num_tables + 1, overloads_arg, overloads_count); } - } else if (build_context.metrics.arch == TargetArch_arm32 && count > 8) { - // ARM32 VTBL2/VTBL3/VTBL4: Split src into multiple 8-byte vectors - int num_tables = cast(int)count / 8; - GB_ASSERT_MSG(count % 8 == 0, "ARM32 src size must be multiple of 8 bytes, got %lld bytes", count); - GB_ASSERT_MSG(num_tables <= 4, "ARM32 NEON supports maximum 4 tables (vtbl4), got %d tables for %lld-byte vector", num_tables, count); - - LLVMValueRef src_parts[4]; // Max 4 tables for vtbl4 - for (int i = 0; i < num_tables; i++) { - // Extract 8-byte slice from the larger src - LLVMValueRef indices_for_extract[8]; - for (int j = 0; j < 8; j++) { - indices_for_extract[j] = LLVMConstInt(LLVMInt32TypeInContext(p->module->ctx), i * 8 + j, false); + + // Concat out_parts[0..num_tables) into by pair-wise + // shufflevector. shufflevector requires equal-sized operands, so we + // pad the right-hand chunk to acc_size with undef on each step. + LLVMValueRef acc = out_parts[0]; + i64 acc_size = lane; + for (int c = 1; c < num_tables; c++) { + LLVMValueRef rhs = out_parts[c]; + if (acc_size > lane) { + LLVMValueRef pad[64]; + for (i64 k = 0; k < acc_size; k++) { + pad[k] = (k < lane) ? LLVMConstInt(i32_type, cast(unsigned)k, false) : LLVMGetUndef(i32_type); + } + rhs = LLVMBuildShuffleVector(p->builder, rhs, LLVMGetUndef(LLVMTypeOf(rhs)), LLVMConstVector(pad, cast(unsigned)acc_size), ""); } - LLVMValueRef extract_mask = LLVMConstVector(indices_for_extract, 8); - src_parts[i] = LLVMBuildShuffleVector(p->builder, src, LLVMGetUndef(LLVMTypeOf(src)), extract_mask, ""); - } - - // Call appropriate ARM32 vtbl intrinsic - if (count == 16) { - LLVMValueRef args[3] = { src_parts[0], src_parts[1], indices }; - res.value = lb_call_intrinsic(p, intrinsic_name, args, 3, nullptr, 0); - } else if (count == 24) { - LLVMValueRef args[4] = { src_parts[0], src_parts[1], src_parts[2], indices }; - res.value = lb_call_intrinsic(p, intrinsic_name, args, 4, nullptr, 0); - } else if (count == 32) { - LLVMValueRef args[5] = { src_parts[0], src_parts[1], src_parts[2], src_parts[3], indices }; - res.value = lb_call_intrinsic(p, intrinsic_name, args, 5, nullptr, 0); + i64 new_size = acc_size + lane; + LLVMValueRef concat[64]; + for (i64 k = 0; k < acc_size; k++) concat[k] = LLVMConstInt(i32_type, cast(unsigned)k, false); + for (i64 k = 0; k < lane; k++) concat[acc_size + k] = LLVMConstInt(i32_type, cast(unsigned)(acc_size+k), false); + acc = LLVMBuildShuffleVector(p->builder, acc, rhs, LLVMConstVector(concat, cast(unsigned)new_size), ""); + acc_size = new_size; } + res.value = acc; } else { // Single runtime swizzle case (x86, WebAssembly, ARM single-table) LLVMValueRef args[2] = { src, indices }; From 45a79f96f0cb5c1a070f02627e734075f7abab8b Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Thu, 21 May 2026 11:48:25 -0400 Subject: [PATCH 089/228] [encoding/json] add support for unmarshalling fixed capacity dynamic arrays --- core/encoding/json/unmarshal.odin | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/core/encoding/json/unmarshal.odin b/core/encoding/json/unmarshal.odin index 4058393c8..d3cb083d1 100644 --- a/core/encoding/json/unmarshal.odin +++ b/core/encoding/json/unmarshal.odin @@ -808,6 +808,16 @@ unmarshal_array :: proc(p: ^Parser, v: any) -> (err: Unmarshal_Error) { raw.allocator = p.allocator return assign_array(p, raw.data, t.elem, length) + + case reflect.Type_Info_Fixed_Capacity_Dynamic_Array: + if int(length) > t.capacity { + return UNSUPPORTED_TYPE + } + base_ptr := cast(uintptr)v.data + len_ptr := base_ptr + t.len_offset + len_val := cast(^int)len_ptr + len_val^ = int(length) + return assign_array(p, rawptr(base_ptr), t.elem, length) case reflect.Type_Info_Array: // NOTE(bill): Allow lengths which are less than the dst array From c30bb3afe7e0acfe1881d0151f7e64391fe071fe Mon Sep 17 00:00:00 2001 From: Be Dangerous Date: Fri, 22 May 2026 12:37:42 -0500 Subject: [PATCH 090/228] narrow race condition fix during polymorphic specialization --- src/check_type.cpp | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/check_type.cpp b/src/check_type.cpp index f84644ea1..a891f6d2e 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -1491,6 +1491,22 @@ gb_internal void check_bit_set_type(CheckerContext *c, Type *type, Type *named_t } +// If `specialization` is a polymorphic-record specialization that has been published into +// its originating record's `gen_types` cache, return that cache's `GenTypesData`. Its +// `RecursiveMutex` guards concurrent `find_polymorphic_record_entity` reads, so the +// in-place finalization below must hold it. Returns nullptr otherwise. +gb_internal GenTypesData *gen_types_data_of_specialization(Type *specialization) { + if (specialization != nullptr && + specialization->kind == Type_Named && + specialization->Named.type_name != nullptr) { + Type *orig = specialization->Named.type_name->TypeName.original_type_for_parapoly; + if (orig != nullptr && orig->kind == Type_Named) { + return orig->Named.gen_types_data; + } + } + return nullptr; +} + gb_internal bool check_type_specialization_to(CheckerContext *ctx, Type *specialization, Type *type, bool compound, bool modify_type) { if (type == nullptr || type == t_invalid) { @@ -1559,8 +1575,14 @@ gb_internal bool check_type_specialization_to(CheckerContext *ctx, Type *special } if (modify_type) { - // NOTE(bill): This is needed in order to change the actual type but still have the types defined within it + // NOTE(bill): This is needed in order to change the actual type but still have the types defined within it. + // `specialization` may already be published in a polymorphic record's gen_types cache; + // finalize it under that record's (recursive) gen_types mutex so a concurrent + // find_polymorphic_record_entity on another thread cannot observe a torn Type. + GenTypesData *gen_types = gen_types_data_of_specialization(specialization); + if (gen_types != nullptr) mutex_lock(&gen_types->mutex); gb_memmove(specialization, type, gb_size_of(Type)); + if (gen_types != nullptr) mutex_unlock(&gen_types->mutex); } return true; @@ -1606,8 +1628,12 @@ gb_internal bool check_type_specialization_to(CheckerContext *ctx, Type *special } if (modify_type) { - // NOTE(bill): This is needed in order to change the actual type but still have the types defined within it + // NOTE(bill): This is needed in order to change the actual type but still have the types defined within it. + // See the struct branch above: finalize under the originating record's gen_types mutex. + GenTypesData *gen_types = gen_types_data_of_specialization(specialization); + if (gen_types != nullptr) mutex_lock(&gen_types->mutex); gb_memmove(specialization, type, gb_size_of(Type)); + if (gen_types != nullptr) mutex_unlock(&gen_types->mutex); } return true; From 52e7e44930c8d7ed442907d9f8d2930a22eefbc3 Mon Sep 17 00:00:00 2001 From: reavencode Date: Sun, 24 May 2026 10:50:26 +0200 Subject: [PATCH 091/228] vendor/wgpu: Fix some incrrect proc signatures --- vendor/wgpu/wgpu_native.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vendor/wgpu/wgpu_native.odin b/vendor/wgpu/wgpu_native.odin index b1658d714..0fbd6338c 100644 --- a/vendor/wgpu/wgpu_native.odin +++ b/vendor/wgpu/wgpu_native.odin @@ -27,9 +27,9 @@ foreign libwgpu { DeviceGetNativeMetalCommandQueue :: proc(device: Device) -> rawptr --- DeviceGetNativeMetalTexture :: proc(device: Device) -> rawptr --- - RenderPassEncoderSetImmediates :: proc(encoder: RenderPassEncoder, stages: ShaderStageFlags, offset: u32, sizeBytes: u32, data: rawptr) --- + RenderPassEncoderSetImmediates :: proc(encoder: RenderPassEncoder, offset: u32, sizeBytes: u32, data: rawptr) --- ComputePassEncoderSetImmediates :: proc(encoder: ComputePassEncoder, offset: u32, sizeBytes: u32, data: rawptr) --- - RenderBundleEncoderSetImmediates :: proc(encoder: RenderBundleEncoder, stages: ShaderStageFlags, offset: u32, sizeBytes: u32, data: rawptr) --- + RenderBundleEncoderSetImmediates :: proc(encoder: RenderBundleEncoder, offset: u32, sizeBytes: u32, data: rawptr) --- RenderPassEncoderMultiDrawIndirect :: proc(encoder: RenderPassEncoder, buffer: Buffer, offset: u64, count: u32) --- RenderPassEncoderMultiDrawIndexedIndirect :: proc(encoder: RenderPassEncoder, buffer: Buffer, offset: u64, count: u32) --- From de0643e886ebb278a82c54df2fb4d8e9cc0b3e34 Mon Sep 17 00:00:00 2001 From: Ignacy Koper Date: Sun, 24 May 2026 10:55:22 +0200 Subject: [PATCH 092/228] added missing LDFLAGS for OpenBSD Signed-off-by: Ignacy Koper --- build_odin.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_odin.sh b/build_odin.sh index 3a4c84019..65e74120a 100755 --- a/build_odin.sh +++ b/build_odin.sh @@ -114,7 +114,7 @@ Linux) ;; OpenBSD) CXXFLAGS="$CXXFLAGS -I/usr/local/include $($LLVM_CONFIG --cxxflags --ldflags)" - LDFLAGS="$LDFLAGS -lstdc++ -L/usr/local/lib -liconv" + LDFLAGS="$LDFLAGS -lstdc++ -L/usr/local/lib -Wl,-rpath,$($LLVM_CONFIG --libdir) -liconv" LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs)" ;; *) From fb8a9d083984da9eca76054f62f35d1c60265fa5 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 25 May 2026 10:28:15 +0100 Subject: [PATCH 093/228] Support `**` as `expand_values` operator: `**x` == `expand_values(x)` --- core/odin/parser/parser.odin | 3 +- core/odin/tokenizer/token.odin | 2 + core/odin/tokenizer/tokenizer.odin | 3 ++ src/check_builtin.cpp | 2 +- src/check_expr.cpp | 37 ++++++++++++++ src/llvm_backend_expr.cpp | 6 +++ src/llvm_backend_proc.cpp | 82 ++++++++++++++++-------------- src/parser.cpp | 1 + src/tokenizer.cpp | 4 ++ 9 files changed, 99 insertions(+), 41 deletions(-) diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin index c170e06cf..0fc8872bb 100644 --- a/core/odin/parser/parser.odin +++ b/core/odin/parser/parser.odin @@ -3553,7 +3553,8 @@ parse_unary_expr :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { case .Add, .Sub, .Not, .Xor, - .And: + .And, + .Mul_Mul: op := advance_token(p) expr := parse_unary_expr(p, lhs) diff --git a/core/odin/tokenizer/token.odin b/core/odin/tokenizer/token.odin index 48d08f127..406c8eaf2 100644 --- a/core/odin/tokenizer/token.odin +++ b/core/odin/tokenizer/token.odin @@ -67,6 +67,8 @@ Token_Kind :: enum u32 { Cmp_And, // && Cmp_Or, // || + Cmp_MulMul, // ** + B_Assign_Op_Begin, Add_Eq, // += Sub_Eq, // -= diff --git a/core/odin/tokenizer/tokenizer.odin b/core/odin/tokenizer/tokenizer.odin index f4d50b36c..df9d5b01d 100644 --- a/core/odin/tokenizer/tokenizer.odin +++ b/core/odin/tokenizer/tokenizer.odin @@ -679,6 +679,9 @@ scan :: proc(t: ^Tokenizer) -> Token { if t.ch == '=' { advance_rune(t) kind = .Mul_Eq + } else if t.ch == '*' { + advance_rune(t) + kind = .Mul_Mul } case '=': kind = .Eq diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index 584264f10..00b22e84b 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -1173,7 +1173,7 @@ gb_internal bool check_builtin_simd_operation(CheckerContext *c, Operand *operan // masked_load (ptr: rawptr, values: #simd[N]T, mask: #simd[N]int_or_bool) -> #simd[N]T // masked_store(ptr: rawptr, values: #simd[N]T, mask: #simd[N]int_or_bool) - // masked_expand_load (ptr: rawptr, values: #simd[N]T, mask: #simd[N]int_or_bool) -> #simd[N]T + // masked_expand_load (ptr: rawptr, values: #simd[N]T, mask: #simd[N]int_or_bool) -> #simd[N]T // masked_compress_store(ptr: rawptr, values: #simd[N]T, mask: #simd[N]int_or_bool) Operand ptr = {}; diff --git a/src/check_expr.cpp b/src/check_expr.cpp index ed2115a30..e60218099 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -2946,6 +2946,43 @@ gb_internal void check_unary_expr(CheckerContext *c, Operand *o, Token op, Ast * return; } + + case Token_MulMul: { // 'expand_values' operator + if (!o->type) { + return; + } + + Type *type = base_type(o->type); + if (!is_type_struct(type) && !is_type_array(type)) { + gbString type_str = type_to_string(o->type); + error(node, "Expected a struct or array type to 'expand_values', got '%s'", type_str); + gb_string_free(type_str); + return; + } + + Type *tuple = alloc_type_tuple(); + + if (is_type_struct(type)) { + isize variable_count = type->Struct.fields.count; + tuple->Tuple.variables = permanent_slice_make(variable_count); + // NOTE(bill): don't copy the entities, this should be good enough + gb_memmove_array(tuple->Tuple.variables.data, type->Struct.fields.data, variable_count); + } else if (is_type_array(type)) { + isize variable_count = cast(isize)type->Array.count; + tuple->Tuple.variables = permanent_slice_make(variable_count); + for (isize i = 0; i < variable_count; i++) { + tuple->Tuple.variables[i] = alloc_entity_array_elem(nullptr, blank_token, type->Array.elem, cast(i32)i); + } + } + o->type = tuple; + o->mode = Addressing_Value; + + if (tuple->Tuple.variables.count == 1) { + o->type = tuple->Tuple.variables[0]->type; + } + + return; + } } if (!check_unary_op(c, o, op)) { diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index fd148e5c5..472e78b44 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -1,5 +1,6 @@ gb_internal lbValue lb_emit_arith_matrix(lbProcedure *p, TokenKind op, lbValue lhs, lbValue rhs, Type *type, bool component_wise); gb_internal lbValue lb_build_slice_expr_value(lbProcedure *p, Ast *expr); +gb_internal lbValue lb_expand_values(lbProcedure *p, lbValue val, Type *type); gb_internal LLVMValueRef lb_const_low_bits_mask(LLVMTypeRef type, u64 bit_count) { GB_ASSERT(bit_count <= 64); @@ -4664,6 +4665,11 @@ gb_internal lbValue lb_build_expr_internal(lbProcedure *p, Ast *expr) { switch (ue->op.kind) { case Token_And: return lb_build_unary_and(p, expr); + case Token_MulMul: + { + lbValue val = lb_build_expr(p, ue->expr); + return lb_expand_values(p, val, type); + } default: { lbValue v = lb_build_expr(p, ue->expr); diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 63ca868ec..a88833df2 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -1321,6 +1321,48 @@ gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array c return result; } +gb_internal lbValue lb_expand_values(lbProcedure *p, lbValue val, Type *type) { + Type *t = base_type(val.type); + + if (!is_type_tuple(type)) { + if (t->kind == Type_Struct) { + GB_ASSERT(t->Struct.fields.count == 1); + return lb_emit_struct_ev(p, val, 0); + } else if (t->kind == Type_Array) { + GB_ASSERT(t->Array.count == 1); + return lb_emit_struct_ev(p, val, 0); + } else { + GB_PANIC("Unknown type of expand_values"); + } + + } + + GB_ASSERT(is_type_tuple(type)); + // NOTE(bill): Doesn't need to be zero because it will be initialized in the loops + lbValue tuple = lb_addr_get_ptr(p, lb_add_local_generated(p, type, false)); + if (t->kind == Type_Struct) { + for_array(src_index, t->Struct.fields) { + Entity *field = t->Struct.fields[src_index]; + i32 field_index = field->Variable.field_index; + lbValue f = lb_emit_struct_ev(p, val, field_index); + lbValue ep = lb_emit_struct_ep(p, tuple, cast(i32)src_index); + lb_emit_store(p, ep, f); + } + } else if (is_type_array_like(t)) { + // TODO(bill): Clean-up this code + lbValue ap = lb_address_from_load_or_generate_local(p, val); + i32 n = cast(i32)get_array_type_count(t); + for (i32 i = 0; i < n; i++) { + lbValue f = lb_emit_load(p, lb_emit_array_epi(p, ap, i)); + lbValue ep = lb_emit_struct_ep(p, tuple, i); + lb_emit_store(p, ep, f); + } + } else { + GB_PANIC("Unknown type of expand_values"); + } + return lb_emit_load(p, tuple); +} + gb_internal LLVMValueRef llvm_splat_int(i64 count, LLVMTypeRef type, i64 value, bool is_signed=false) { LLVMValueRef v = LLVMConstInt(type, value, is_signed); LLVMValueRef *values = gb_alloc_array(temporary_allocator(), LLVMValueRef, count); @@ -3051,45 +3093,7 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu case BuiltinProc_expand_values: { lbValue val = lb_build_expr(p, ce->args[0]); - Type *t = base_type(val.type); - - if (!is_type_tuple(tv.type)) { - if (t->kind == Type_Struct) { - GB_ASSERT(t->Struct.fields.count == 1); - return lb_emit_struct_ev(p, val, 0); - } else if (t->kind == Type_Array) { - GB_ASSERT(t->Array.count == 1); - return lb_emit_struct_ev(p, val, 0); - } else { - GB_PANIC("Unknown type of expand_values"); - } - - } - - GB_ASSERT(is_type_tuple(tv.type)); - // NOTE(bill): Doesn't need to be zero because it will be initialized in the loops - lbValue tuple = lb_addr_get_ptr(p, lb_add_local_generated(p, tv.type, false)); - if (t->kind == Type_Struct) { - for_array(src_index, t->Struct.fields) { - Entity *field = t->Struct.fields[src_index]; - i32 field_index = field->Variable.field_index; - lbValue f = lb_emit_struct_ev(p, val, field_index); - lbValue ep = lb_emit_struct_ep(p, tuple, cast(i32)src_index); - lb_emit_store(p, ep, f); - } - } else if (is_type_array_like(t)) { - // TODO(bill): Clean-up this code - lbValue ap = lb_address_from_load_or_generate_local(p, val); - i32 n = cast(i32)get_array_type_count(t); - for (i32 i = 0; i < n; i++) { - lbValue f = lb_emit_load(p, lb_emit_array_epi(p, ap, i)); - lbValue ep = lb_emit_struct_ep(p, tuple, i); - lb_emit_store(p, ep, f); - } - } else { - GB_PANIC("Unknown type of expand_values"); - } - return lb_emit_load(p, tuple); + return lb_expand_values(p, val, tv.type); } case BuiltinProc_compress_values: { diff --git a/src/parser.cpp b/src/parser.cpp index 6dac8914f..01c4165b5 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -3525,6 +3525,7 @@ gb_internal Ast *parse_unary_expr(AstFile *f, bool lhs) { case Token_Xor: case Token_And: case Token_Not: + case Token_MulMul: // 'expand_values' operator case Token_Mul: // Used for error handling when people do C-like things { Token token = advance_token(f); diff --git a/src/tokenizer.cpp b/src/tokenizer.cpp index 2bdd15a60..f505b142e 100644 --- a/src/tokenizer.cpp +++ b/src/tokenizer.cpp @@ -35,6 +35,7 @@ TOKEN_KIND(Token__OperatorBegin, ""), \ TOKEN_KIND(Token_Shr, ">>"), \ TOKEN_KIND(Token_CmpAnd, "&&"), \ TOKEN_KIND(Token_CmpOr, "||"), \ + TOKEN_KIND(Token_MulMul, "**"), \ \ TOKEN_KIND(Token__AssignOpBegin, ""), \ TOKEN_KIND(Token_AddEq, "+="), \ @@ -879,6 +880,9 @@ gb_internal void tokenizer_get_token(Tokenizer *t, Token *token, int repeat=0) { if (t->curr_rune == '=') { advance_to_next_rune(t); token->kind = Token_MulEq; + } else if (t->curr_rune == '*') { + advance_to_next_rune(t); + token->kind = Token_MulMul; } break; case '=': From d762a8247fab8b999b2e9b5eca6d2400f4148874 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 25 May 2026 11:12:49 +0100 Subject: [PATCH 094/228] Fix look up table --- core/odin/tokenizer/token.odin | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/odin/tokenizer/token.odin b/core/odin/tokenizer/token.odin index 406c8eaf2..e5718ab13 100644 --- a/core/odin/tokenizer/token.odin +++ b/core/odin/tokenizer/token.odin @@ -67,7 +67,7 @@ Token_Kind :: enum u32 { Cmp_And, // && Cmp_Or, // || - Cmp_MulMul, // ** + MulMul, // ** B_Assign_Op_Begin, Add_Eq, // += @@ -204,6 +204,8 @@ tokens := [Token_Kind.COUNT]string { "&&", "||", + "**", + "", "+=", "-=", From b0b5d6ad7406bcd36da79f4bd343bd6c13da679a Mon Sep 17 00:00:00 2001 From: Adrian Hodos Date: Mon, 25 May 2026 13:57:55 +0300 Subject: [PATCH 095/228] Link against libstdc++exp for backtrace support --- core/debug/trace/trace_cpp.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/debug/trace/trace_cpp.odin b/core/debug/trace/trace_cpp.odin index 1a96ee112..4828b207e 100644 --- a/core/debug/trace/trace_cpp.odin +++ b/core/debug/trace/trace_cpp.odin @@ -8,7 +8,7 @@ import "core:strings" import "core:c" // NOTE: Relies on C++23 which adds and becomes ABI and that can be used -foreign import stdcpplibbacktrace "system:stdc++_libbacktrace" +foreign import stdcpplibbacktrace "system:stdc++exp" foreign import libdl "system:dl" @@ -191,4 +191,4 @@ _resolve :: proc(ctx: ^Context, frame: Frame, allocator: runtime.Allocator) -> F ) return btc.frame -} \ No newline at end of file +} From 5c485d26eeece94e11c91c0d28c1994cbe4a9498 Mon Sep 17 00:00:00 2001 From: mohamed6000 Date: Mon, 25 May 2026 16:21:00 +0100 Subject: [PATCH 096/228] Fixed the upper bound of Decimal in round_shortest --- core/strconv/generic_float.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/strconv/generic_float.odin b/core/strconv/generic_float.odin index 163148156..902a4317c 100644 --- a/core/strconv/generic_float.odin +++ b/core/strconv/generic_float.odin @@ -281,7 +281,7 @@ round_shortest :: proc(d: ^decimal.Decimal, mant: u64, exp: int, flt: ^Float_Inf } upper_: decimal.Decimal; upper := &upper_ - decimal.assign(upper, 2*mant - 1) + decimal.assign(upper, 2*mant + 1) decimal.shift(upper, exp - int(flt.mantbits) - 1) mantlo: u64 From 82a18797b4f54b5ece243c8aa28c649911243a29 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Mon, 25 May 2026 23:01:27 +0900 Subject: [PATCH 097/228] core/encoding/base64: Misc fixes and improvements - Add error checking to `decode` - Add `encode_into_buf`/`decode_into_buf` --- core/encoding/base64/base64.odin | 319 +++++++++++++++++-------- core/encoding/cbor/tags.odin | 46 +++- tests/core/encoding/base64/base64.odin | 32 ++- 3 files changed, 285 insertions(+), 112 deletions(-) diff --git a/core/encoding/base64/base64.odin b/core/encoding/base64/base64.odin index 1488e2201..e97652cd4 100644 --- a/core/encoding/base64/base64.odin +++ b/core/encoding/base64/base64.odin @@ -9,10 +9,11 @@ truncate it from the encoded output. */ package encoding_base64 +import "base:intrinsics" import "base:runtime" import "core:io" -import "core:strings" +@(rodata) ENC_TABLE := [64]byte { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', @@ -25,6 +26,7 @@ ENC_TABLE := [64]byte { } // Encoding table for Base64url variant +@(rodata) ENC_URL_TABLE := [64]byte { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', @@ -38,77 +40,89 @@ ENC_URL_TABLE := [64]byte { PADDING :: '=' -DEC_TABLE := [256]u8 { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 62, 0, 0, 0, 63, +@(rodata) +DEC_TABLE := [256]i8 { + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 2, 3, 4, 5, 6, + 60, 61, -1, -1, -1, -1, -1, -1, + -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 0, 0, 0, 0, 0, - 0, 26, 27, 28, 29, 30, 31, 32, + 23, 24, 25, -1, -1, -1, -1, -1, + -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + 49, 50, 51, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, } // Decoding table for Base64url variant -DEC_URL_TABLE := [256]u8 { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 62, 0, 0, +@(rodata) +DEC_URL_TABLE := [256]i8 { + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 62, -1, -1, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 2, 3, 4, 5, 6, + 60, 61, -1, -1, -1, -1, -1, -1, + -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 0, 0, 0, 0, 63, - 0, 26, 27, 28, 29, 30, 31, 32, + 23, 24, 25, -1, -1, -1, -1, 63, + -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + 49, 50, 51, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, } +Error :: union #shared_nil { + runtime.Allocator_Error, + io.Error, + Decode_Error, +} + +Decode_Error :: enum { + None, + Invalid_Character, +} encode :: proc(data: []byte, ENC_TBL := ENC_TABLE, allocator := context.allocator) -> (encoded: string, err: runtime.Allocator_Error) #optional_allocator_error { out_length := encoded_len(data) @@ -116,23 +130,47 @@ encode :: proc(data: []byte, ENC_TBL := ENC_TABLE, allocator := context.allocato return } - out := strings.builder_make(0, out_length, allocator) or_return - ioerr := encode_into(strings.to_stream(&out), data, ENC_TBL) + out := make([]byte, out_length, allocator) or_return + _, ioerr := encode_impl(out, data, ENC_TBL) + assert(ioerr == nil, "encode should not IO error") + assert(len(out) == out_length, "buffer resized, `encoded_len` was wrong") - assert(ioerr == nil, "string builder should not IO error") - assert(strings.builder_cap(out) == out_length, "buffer resized, `encoded_len` was wrong") + encoded = transmute(string)(out) - return strings.to_string(out), nil + return +} + +encode_into_buf :: proc(dst, data: []byte, ENC_TBL := ENC_TABLE) -> (encoded: []byte, err: Error) { + out_length := encoded_len(data) + if out_length == 0 { + return + } + + return encode_impl(dst, data, ENC_TBL) } encode_into :: proc(w: io.Writer, data: []byte, ENC_TBL := ENC_TABLE) -> io.Error { + _, err := encode_impl(w, data, ENC_TBL) + return err +} + +@(private) +encode_impl :: proc(dst: $T, data: []byte, ENC_TBL := ENC_TABLE) -> ([]byte, io.Error) where T == io.Writer || T == []byte { length := len(data) - if length == 0 { - return nil + when T == []byte { + out_length := encoded_len(data) + if len(dst) < out_length { + return nil, io.Error.Short_Buffer + } + buf := dst + } else { + if length == 0 { + return nil, nil + } + buf: [4]byte } c0, c1, c2, block: int - out: [4]byte for i := 0; i < length; i += 3 { #no_bounds_check { c0, c1, c2 = int(data[i]), -1, -1 @@ -141,15 +179,27 @@ encode_into :: proc(w: io.Writer, data: []byte, ENC_TBL := ENC_TABLE) -> io.Erro if i + 2 < length { c2 = int(data[i + 2]) } block = (c0 << 16) | (max(c1, 0) << 8) | max(c2, 0) - - out[0] = ENC_TBL[block >> 18 & 63] - out[1] = ENC_TBL[block >> 12 & 63] - out[2] = c1 == -1 ? PADDING : ENC_TBL[block >> 6 & 63] - out[3] = c2 == -1 ? PADDING : ENC_TBL[block & 63] + + buf[0] = ENC_TBL[block >> 18 & 63] + buf[1] = ENC_TBL[block >> 12 & 63] + buf[2] = c1 == -1 ? PADDING : ENC_TBL[block >> 6 & 63] + buf[3] = c2 == -1 ? PADDING : ENC_TBL[block & 63] + when T == []byte { + buf = buf[4:] + } + } + when T == io.Writer { + if _, err := io.write_full(dst, buf[:]); err != nil { + return nil, err + } } - io.write_full(w, out[:]) or_return } - return nil + + when T == io.Writer { + return nil, nil + } else { + return dst[:out_length], nil + } } encoded_len :: proc(data: []byte) -> int { @@ -161,65 +211,140 @@ encoded_len :: proc(data: []byte) -> int { return ((4 * length / 3) + 3) &~ 3 } -decode :: proc(data: string, DEC_TBL := DEC_TABLE, allocator := context.allocator) -> (decoded: []byte, err: runtime.Allocator_Error) #optional_allocator_error { +decode :: proc(data: string, DEC_TBL := DEC_TABLE, dst: []byte = nil, allocator := context.allocator) -> (decoded: []byte, err: Error) { out_length := decoded_len(data) + if out_length == 0 { + return nil, nil + } - out := strings.builder_make(0, out_length, allocator) or_return - ioerr := decode_into(strings.to_stream(&out), data, DEC_TBL) + buf: []byte + if buf, err = make([]byte, out_length, allocator); err != nil { + return + } - assert(ioerr == nil, "string builder should not IO error") - assert(strings.builder_cap(out) == out_length, "buffer resized, `decoded_len` was wrong") + decoded, err = decode_impl(buf, data, DEC_TBL) + if err != nil { + delete(buf, allocator) + } + assert(err != nil || len(decoded) == out_length, "buffer unexpectedly resized, `decoded_len` was wrong") - return out.buf[:], nil + return } -decode_into :: proc(w: io.Writer, data: string, DEC_TBL := DEC_TABLE) -> io.Error { +decode_into_buf :: proc(dst: []byte, data: string, DEC_TBL := DEC_TABLE) -> (decoded: []byte, err: Error) { + out_length := decoded_len(data) + if out_length == 0 { + return + } + + return decode_impl(dst, data, DEC_TBL) +} + +decode_into :: proc(w: io.Writer, data: string, DEC_TBL := DEC_TABLE) -> Error { + _, err := decode_impl(w, data, DEC_TBL) + return err +} + +@(private) +decode_impl :: proc(dst: $T, data: string, DEC_TBL := DEC_TABLE) -> ([]byte, Error) where T == io.Writer || T == []byte { length := decoded_len(data) - if length == 0 { - return nil + when T == []byte { + if len(dst) < length { + return nil, io.Error.Short_Buffer + } + off: int + } else { + if length == 0 { + return nil, nil + } + buf: [3]byte } c0, c1, c2, c3: int + d0, d1, d2, d3: i8 b0, b1, b2: int - buf: [3]byte i, j: int for ; j + 3 <= length; i, j = i + 4, j + 3 { #no_bounds_check { - c0 = int(DEC_TBL[data[i]]) - c1 = int(DEC_TBL[data[i + 1]]) - c2 = int(DEC_TBL[data[i + 2]]) - c3 = int(DEC_TBL[data[i + 3]]) + d0 = DEC_TBL[data[i]] + d1 = DEC_TBL[data[i + 1]] + d2 = DEC_TBL[data[i + 2]] + d3 = DEC_TBL[data[i + 3]] + + if intrinsics.unlikely((d0 | d1 | d2 | d3) & ~i8(0x3f) != 0) { + return nil, Decode_Error.Invalid_Character + } + + c0, c1, c2, c3 = int(d0), int(d1), int(d2), int(d3) b0 = (c0 << 2) | (c1 >> 4) b1 = (c1 << 4) | (c2 >> 2) b2 = (c2 << 6) | c3 - buf[0] = byte(b0) - buf[1] = byte(b1) - buf[2] = byte(b2) + when T == []byte { + dst[off+0] = byte(b0) + dst[off+1] = byte(b1) + dst[off+2] = byte(b2) + off += 3 + } else { + buf[0] = byte(b0) + buf[1] = byte(b1) + buf[2] = byte(b2) + } } - io.write_full(w, buf[:]) or_return + when T == io.Writer { + if _, err := io.write_full(dst, buf[:]); err != .None { + return nil, err + } + } } rest := length - j if rest > 0 { #no_bounds_check { - c0 = int(DEC_TBL[data[i]]) - c1 = int(DEC_TBL[data[i + 1]]) - c2 = int(DEC_TBL[data[i + 2]]) + // Note: decoded_len handles removing padding. + d0 = DEC_TBL[data[i]] + d1 = DEC_TBL[data[i + 1]] + if d2 = 0; rest == 2 { + d2 = DEC_TBL[data[i + 2]] + } + + if intrinsics.unlikely((d0 | d1 | d2) & ~i8(0x3f) != 0) { + return nil, Decode_Error.Invalid_Character + } + + c0, c1, c2 = int(d0), int(d1), int(d2) b0 = (c0 << 2) | (c1 >> 4) b1 = (c1 << 4) | (c2 >> 2) + + when T == []byte { + switch rest { + case 2: + dst[off+1] = byte(b1) + fallthrough + case 1: + dst[off] = byte(b0) + } + } else { + buf[0] = byte(b0) + buf[1] = byte(b1) + } } - switch rest { - case 1: io.write_byte(w, byte(b0)) or_return - case 2: io.write_full(w, {byte(b0), byte(b1)}) or_return + when T == io.Writer { + if _, err := io.write_full(dst, buf[:rest]); err != .None { + return nil, err + } } } - return nil + when T == io.Writer { + return nil, nil + } else { + return dst[:length], nil + } } decoded_len :: proc(data: string) -> int { diff --git a/core/encoding/cbor/tags.odin b/core/encoding/cbor/tags.odin index fa456673d..ad0a85913 100644 --- a/core/encoding/cbor/tags.odin +++ b/core/encoding/cbor/tags.odin @@ -308,13 +308,13 @@ tag_base64_unmarshal :: proc(_: ^Tag_Implementation, d: Decoder, _: Tag_Number, if t.is_cstring { length := base64.decoded_len(bytes) builder := strings.builder_make(0, length+1) - base64.decode_into(strings.to_stream(&builder), bytes) or_return + b64_decode_into(strings.to_stream(&builder), bytes) or_return raw := (^cstring)(v.data) raw^ = cstring(raw_data(builder.buf)) } else { raw := (^string)(v.data) - raw^ = string(base64.decode(bytes) or_return) + raw^ = string(b64_decode(bytes) or_return) } return @@ -325,16 +325,16 @@ tag_base64_unmarshal :: proc(_: ^Tag_Implementation, d: Decoder, _: Tag_Number, if elem_base.id != byte { return _unsupported(v, hdr) } raw := (^[]byte)(v.data) - raw^ = base64.decode(bytes) or_return + raw^ = b64_decode(bytes) or_return return - + case reflect.Type_Info_Dynamic_Array: elem_base := reflect.type_info_base(t.elem) if elem_base.id != byte { return _unsupported(v, hdr) } - decoded := base64.decode(bytes) or_return - + decoded := b64_decode(bytes) or_return + raw := (^mem.Raw_Dynamic_Array)(v.data) raw.data = raw_data(decoded) raw.len = len(decoded) @@ -348,9 +348,9 @@ tag_base64_unmarshal :: proc(_: ^Tag_Implementation, d: Decoder, _: Tag_Number, if elem_base.id != byte { return _unsupported(v, hdr) } if base64.decoded_len(bytes) > t.count { return _unsupported(v, hdr) } - + slice := ([^]byte)(v.data)[:len(bytes)] - copy(slice, base64.decode(bytes) or_return) + copy(slice, b64_decode(bytes) or_return) return } @@ -384,3 +384,33 @@ tag_base64_marshal :: proc(_: ^Tag_Implementation, e: Encoder, v: any) -> Marsha err_conv(_encode_u64(e, u64(out_len), .Text)) or_return return base64.encode_into(e.writer, bytes) } + +@(private="file") +err_from_b64 :: proc(err: base64.Error) -> Unmarshal_Error { + switch e in err { + case runtime.Allocator_Error: + return e + case io.Error: + return e + case base64.Decode_Error: + return Decode_Data_Error.Bad_Tag_Value + } + + // Should NEVER happen, but fail gracefully. + return io.Error.Unknown +} + +@(private="file") +b64_decode :: proc(data: string) -> ([]byte, Unmarshal_Error) { + decoded, err := base64.decode(data) + if err == nil { + return decoded, nil + } + + return nil, err_from_b64(err) +} + +@(private="file") +b64_decode_into :: proc(w: io.Writer, data: string) -> Unmarshal_Error { + return err_from_b64(base64.decode_into(w, data)) +} diff --git a/tests/core/encoding/base64/base64.odin b/tests/core/encoding/base64/base64.odin index 93b3afb59..ba7572139 100644 --- a/tests/core/encoding/base64/base64.odin +++ b/tests/core/encoding/base64/base64.odin @@ -31,12 +31,22 @@ test_encoding :: proc(t: ^testing.T) { @(test) test_decoding :: proc(t: ^testing.T) { for test in tests { - v := string(base64.decode(test.base64)) + v, err := base64.decode(test.base64) + if !testing.expect_value(t, err, nil) { + continue + } defer delete(v) - testing.expect_value(t, v, test.vector) + testing.expect_value(t, string(v), test.vector) } } +@(test) +test_decoding_failure :: proc(t: ^testing.T) { + v, err := base64.decode("!#$%") + testing.expect(t, v == nil) + testing.expect(t, err == base64.Decode_Error.Invalid_Character) +} + @(test) test_roundtrip :: proc(t: ^testing.T) { values: [1024]u8 @@ -44,8 +54,14 @@ test_roundtrip :: proc(t: ^testing.T) { v = u8(i) } - encoded := base64.encode(values[:]); defer delete(encoded) - decoded := base64.decode(encoded); defer delete(decoded) + encoded := base64.encode(values[:]) + defer delete(encoded) + + decoded, err := base64.decode(encoded) + if !testing.expect_value(t, err, nil) { + return + } + defer delete(decoded) for v, i in decoded { testing.expect_value(t, v, values[i]) @@ -61,8 +77,10 @@ test_base64url :: proc(t: ^testing.T) { defer delete(encoded) testing.expect_value(t, encoded, url) - decoded := string(base64.decode(url, base64.DEC_URL_TABLE)) + decoded, err := base64.decode(url, base64.DEC_URL_TABLE) + if !testing.expect_value(t, err, nil) { + return + } defer delete(decoded) - testing.expect_value(t, decoded, plain) - + testing.expect_value(t, string(decoded), plain) } From 13487a45f20d8ffc8f93740c2b5eec90b0ffff1b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 26 May 2026 10:58:54 +0100 Subject: [PATCH 098/228] Fix typo --- core/odin/tokenizer/token.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/odin/tokenizer/token.odin b/core/odin/tokenizer/token.odin index e5718ab13..8c84ca69b 100644 --- a/core/odin/tokenizer/token.odin +++ b/core/odin/tokenizer/token.odin @@ -67,7 +67,7 @@ Token_Kind :: enum u32 { Cmp_And, // && Cmp_Or, // || - MulMul, // ** + Mul_Mul, // ** B_Assign_Op_Begin, Add_Eq, // += From db512cd83a5e210f38e77533aaefe012211e5ff2 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 27 May 2026 10:37:21 +0100 Subject: [PATCH 099/228] Add `math.cbrt` Based on the https://www.netlib.org/fdlibm/s_cbrt.c --- core/math/cbrt.odin | 103 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 core/math/cbrt.odin diff --git a/core/math/cbrt.odin b/core/math/cbrt.odin new file mode 100644 index 000000000..98c0281aa --- /dev/null +++ b/core/math/cbrt.odin @@ -0,0 +1,103 @@ +package math + +import "base:intrinsics" + +@(require_results) cbrt_f16le :: proc "contextless" (x: f16le) -> f16le { return #force_inline f16le(cbrt_f16(f16(x))) } +@(require_results) cbrt_f16be :: proc "contextless" (x: f16be) -> f16be { return #force_inline f16be(cbrt_f16(f16(x))) } +@(require_results) cbrt_f32le :: proc "contextless" (x: f32le) -> f32le { return #force_inline f32le(cbrt_f32(f32(x))) } +@(require_results) cbrt_f32be :: proc "contextless" (x: f32be) -> f32be { return #force_inline f32be(cbrt_f32(f32(x))) } +@(require_results) cbrt_f64le :: proc "contextless" (x: f64le) -> f64le { return #force_inline f64le(cbrt_f64(f64(x))) } +@(require_results) cbrt_f64be :: proc "contextless" (x: f64be) -> f64be { return #force_inline f64be(cbrt_f64(f64(x))) } + +// cbrt returns the cube root of x. +// +// Special cases are: +// +// cbrt(±0) = ±0 +// cbrt(±Inf) = ±Inf +// cbrt(NaN) = NaN +cbrt :: proc{ + cbrt_f16, cbrt_f16le, cbrt_f16be, + cbrt_f32, cbrt_f32le, cbrt_f32be, + cbrt_f64, cbrt_f64le, cbrt_f64be, +} + + + +@(require_results) +cbrt_f16 :: proc "contextless" (x: f16) -> f16 { return #force_inline f16(cbrt_f64(f64(x))) } +@(require_results) +cbrt_f32 :: proc "contextless" (x: f32) -> f32 { return #force_inline f32(cbrt_f64(f64(x))) } + +// cbrt returns the cube root of x. +// +// Special cases are: +// +// cbrt(±0) = ±0 +// cbrt(±Inf) = ±Inf +// cbrt(NaN) = NaN +@(require_results) +cbrt_f64 :: proc "contextless" (x: f64) -> f64 { + // http://www.netlib.org/fdlibm/s_cbrt.c and came with this notice. + // + // ==================================================== + // Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. + // + // Developed at SunSoft, a Sun Microsystems, Inc. business. + // Permission to use, copy, modify, and distribute this + // software is freely granted, provided that this notice + // is preserved. + // ==================================================== + + B1 :: 715094163 // (682-0.03306235651)*2**20 + B2 :: 696219795 // (664-0.03306235651)*2**20 + SMALLEST_NORMAL :: 0h0010000000000000 // 2.22507385850720138309e-308 == 2**-1022 + + C :: 0h3FE15F15F15F15F1 // 5.42857142857142815906e-01 == 19/35 + D :: 0hBFE691DE2532C834 // -7.05306122448979611050e-01 == -864/1225 + E :: 0h3FF6A0EA0EA0EA0F // 1.41428571428571436819e+00 == 99/70 + F :: 0h3FF9B6DB6DB6DB6E // 1.60714285714285720630e+00 == 45/28 + G :: 0h3FD6DB6DB6DB6DB7 // 3.57142857142857150787e-01 == 5/14 + + x := x + + switch { + case x == 0 || is_nan(x) || is_inf(x, 0): + return x + } + + sign := false + if x < 0 { + x = -x + sign = true + } + + // Approximate cbrt (5-bits) + t := transmute(f64)((transmute(u64)x)/3 + B1<<32) + if x < SMALLEST_NORMAL { + t = f64(1 << 54) + t *= x + t = transmute(f64)((transmute(u64)x)/3 + B2<<32) + } + + // Approximate cbrt (23-bits) + r := t * t / x + s := C + r*t + t *= G + F/(s+E + D/s) + + // Truncate to 22 bits, make larger than cbrt(x) + t = transmute(f64)((transmute(u64)t)&(0xffffffffc<<28) + 1<<30) + + // Single step of Newton-Raphson iteration to 53 bits with error less than 0.667ulps + s = t * t // t*t is exact + r = x / s + w := t + t + r = (r - t) / (w + r) // r-s is exact + t = t + t*r + + // Restore sign + if sign { + t = -t + } + return t +} From 0d5fb4cd9ec3c173e0ca1c918b96d52d4f89751c Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 27 May 2026 10:58:03 +0100 Subject: [PATCH 100/228] Add `rand.Zipf` --- core/math/rand/distributions.odin | 74 +++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/core/math/rand/distributions.odin b/core/math/rand/distributions.odin index 755e6f86f..dea645748 100644 --- a/core/math/rand/distributions.odin +++ b/core/math/rand/distributions.odin @@ -1,5 +1,6 @@ package rand +import "base:runtime" import "core:math" float64_uniform :: float64_range @@ -336,3 +337,76 @@ float64_gompertz :: proc(eta, b: f64, gen := context.random_generator) -> f64 { float32_gompertz :: proc(eta, b: f32, gen := context.random_generator) -> f32 { return f32(float64_gompertz(f64(eta), f64(b), gen)) } + + + +// A contextual structure for generating Zipf distributed variates. +Zipf :: struct { + gen: runtime.Random_Generator, + imax: f64, + v: f64, + q: f64, + s: f64, + oneminus_Q: f64, + oneminus_Qinv: f64, + hxm: f64, + hx0_minus_hxm: f64, +} + + +// Creates a Zipf variate generator. +// The generator produces values k ∈ [0, imax] such that P(k) is proportional to (v + k) ** (-s). +// The parameters must be: s > 1 and v >= 1 +// +// W.Hormann, G.Derflinger: +// "Rejection-Inversion to Generate Variates from Monotone Discrete Distributions" +// [[ http://eeyore.wu-wien.ac.at/papers/96-04-04.wh-der.ps.gz ]] +@(require_results) +zipf_create :: proc(s, v: f64, imax: u64, gen := context.random_generator) -> (z: Zipf, ok: bool) { + if s <= 1 || v < 1 { + return + } + z.gen = gen + z.imax = f64(imax) + z.v = v + z.q = s + z.oneminus_Q = 1.0 - z.q + z.oneminus_Qinv = 1.0 / z.oneminus_Q + z.hxm = zipf_h(z, z.imax + 0.5) + z.hx0_minus_hxm = zipf_h(z, 0.5) - math.exp(math.ln(z.v)*(-z.q)) - z.hxm + z.s = 1 - zipf_hinv(z, zipf_h(z, 1.5)-math.exp(-z.q * math.ln(z.v+1.0))) + return z, true +} + + +@(require_results) +zipf_h :: proc(z: Zipf, x: f64) -> f64 { + return math.exp(z.oneminus_Q * math.ln(z.v + x) * z.oneminus_Qinv) +} +@(require_results) +zipf_hinv :: proc(z: Zipf, x: f64) -> f64 { + return math.exp(z.oneminus_Qinv * math.ln(z.oneminus_Q * x)) - z.v +} + + +// Returns a value drawn from the zipf distribution described by the `Zipf` contextual structure. +@(require_results) +zipf_uint64 :: proc(z: Zipf) -> u64 { + assert(z.gen.procedure != nil) + k := f64(0.0) + + for { + r := float64(z.gen) // [0, 1) + ur := r * z.hx0_minus_hxm + z.hxm + x := zipf_hinv(z, ur) + k := math.floor(x + 0.5) + if k-x <= z.s { + break + } + if ur >= zipf_h(z, k+0.5) - math.exp(-math.ln(k + z.v)*z.q) { + break + } + } + + return u64(k) +} \ No newline at end of file From 615f6b9d77df9ff8ca401599f19fa61d272e01f4 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 27 May 2026 11:01:41 +0100 Subject: [PATCH 101/228] Fix typo --- core/math/rand/distributions.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/math/rand/distributions.odin b/core/math/rand/distributions.odin index dea645748..7718bef9a 100644 --- a/core/math/rand/distributions.odin +++ b/core/math/rand/distributions.odin @@ -399,7 +399,7 @@ zipf_uint64 :: proc(z: Zipf) -> u64 { r := float64(z.gen) // [0, 1) ur := r * z.hx0_minus_hxm + z.hxm x := zipf_hinv(z, ur) - k := math.floor(x + 0.5) + k = math.floor(x + 0.5) if k-x <= z.s { break } From 73d10f1cb694e89bdcab9c38179b7e84d98b07e7 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 27 May 2026 11:03:14 +0100 Subject: [PATCH 102/228] Rename cbrt.odin to math_cbrt.odin --- core/math/{cbrt.odin => math_cbrt.odin} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename core/math/{cbrt.odin => math_cbrt.odin} (100%) diff --git a/core/math/cbrt.odin b/core/math/math_cbrt.odin similarity index 100% rename from core/math/cbrt.odin rename to core/math/math_cbrt.odin From edbbe4be92a59e5b7ddea729dadec812e441960c Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 27 May 2026 15:52:32 +0100 Subject: [PATCH 103/228] Unify `check_type_specialization_to` logic --- src/check_type.cpp | 126 +++++++++++++++++---------------------------- 1 file changed, 48 insertions(+), 78 deletions(-) diff --git a/src/check_type.cpp b/src/check_type.cpp index a891f6d2e..55531fa13 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -1507,6 +1507,52 @@ gb_internal GenTypesData *gen_types_data_of_specialization(Type *specialization) return nullptr; } +gb_internal bool check_type_specialization_to_internal(CheckerContext *ctx, Type *specialization, Type *type, TypeTuple *s_tuple, TypeTuple *t_tuple, bool modify_type) { + GB_ASSERT(t_tuple->variables.count == s_tuple->variables.count); + for_array(i, s_tuple->variables) { + Entity *s_e = s_tuple->variables[i]; + Entity *t_e = t_tuple->variables[i]; + Type *st = s_e->type; + Type *tt = t_e->type; + + // NOTE(bill, 2018-12-14): This is needed to override polymorphic named constants in types + if (st->kind == Type_Generic && t_e->kind == Entity_Constant) { + Entity *e = scope_lookup(st->Generic.scope, st->Generic.interned_name, 0); + GB_ASSERT(e != nullptr); + if (modify_type) { + e->kind = Entity_Constant; + e->Constant.value = t_e->Constant.value; + e->type = t_e->type; + } + } else { + if (st->kind == Type_Basic && tt->kind == Type_Basic && + s_e->kind == Entity_Constant && t_e->kind == Entity_Constant) { + if (!compare_exact_values(Token_CmpEq, s_e->Constant.value, t_e->Constant.value)) + return false; + } else { + bool ok = is_polymorphic_type_assignable(ctx, st, tt, true, modify_type); + if (!ok) { + // TODO(bill, 2021-08-19): is this logic correct? + return false; + } + } + } + } + + if (modify_type) { + // NOTE(bill): This is needed in order to change the actual type but still have the types defined within it. + // `specialization` may already be published in a polymorphic record's gen_types cache; + // finalize it under that record's (recursive) gen_types mutex so a concurrent + // find_polymorphic_record_entity on another thread cannot observe a torn Type. + GenTypesData *gen_types = gen_types_data_of_specialization(specialization); + if (gen_types != nullptr) mutex_lock(&gen_types->mutex); + gb_memmove(specialization, type, gb_size_of(Type)); + if (gen_types != nullptr) mutex_unlock(&gen_types->mutex); + } + + return true; +} + gb_internal bool check_type_specialization_to(CheckerContext *ctx, Type *specialization, Type *type, bool compound, bool modify_type) { if (type == nullptr || type == t_invalid) { @@ -1543,49 +1589,7 @@ gb_internal bool check_type_specialization_to(CheckerContext *ctx, Type *special TypeTuple *s_tuple = get_record_polymorphic_params(s); TypeTuple *t_tuple = get_record_polymorphic_params(t); - GB_ASSERT(t_tuple->variables.count == s_tuple->variables.count); - for_array(i, s_tuple->variables) { - Entity *s_e = s_tuple->variables[i]; - Entity *t_e = t_tuple->variables[i]; - Type *st = s_e->type; - Type *tt = t_e->type; - - // NOTE(bill, 2018-12-14): This is needed to override polymorphic named constants in types - if (st->kind == Type_Generic && t_e->kind == Entity_Constant) { - Entity *e = scope_lookup(st->Generic.scope, st->Generic.interned_name, 0); - GB_ASSERT(e != nullptr); - if (modify_type) { - e->kind = Entity_Constant; - e->Constant.value = t_e->Constant.value; - e->type = t_e->type; - } - } else { - if (st->kind == Type_Basic && tt->kind == Type_Basic && - s_e->kind == Entity_Constant && t_e->kind == Entity_Constant) { - if (!compare_exact_values(Token_CmpEq, s_e->Constant.value, t_e->Constant.value)) - return false; - } else { - bool ok = is_polymorphic_type_assignable(ctx, st, tt, true, modify_type); - if (!ok) { - // TODO(bill, 2021-08-19): is this logic correct? - return false; - } - } - } - } - - if (modify_type) { - // NOTE(bill): This is needed in order to change the actual type but still have the types defined within it. - // `specialization` may already be published in a polymorphic record's gen_types cache; - // finalize it under that record's (recursive) gen_types mutex so a concurrent - // find_polymorphic_record_entity on another thread cannot observe a torn Type. - GenTypesData *gen_types = gen_types_data_of_specialization(specialization); - if (gen_types != nullptr) mutex_lock(&gen_types->mutex); - gb_memmove(specialization, type, gb_size_of(Type)); - if (gen_types != nullptr) mutex_unlock(&gen_types->mutex); - } - - return true; + return check_type_specialization_to_internal(ctx, specialization, type, s_tuple, t_tuple, modify_type); } } else if (t->kind == Type_Union) { if (t->Union.polymorphic_parent == nullptr && @@ -1602,41 +1606,7 @@ gb_internal bool check_type_specialization_to(CheckerContext *ctx, Type *special TypeTuple *s_tuple = get_record_polymorphic_params(s); TypeTuple *t_tuple = get_record_polymorphic_params(t); - GB_ASSERT(t_tuple->variables.count == s_tuple->variables.count); - for_array(i, s_tuple->variables) { - Entity *s_e = s_tuple->variables[i]; - Entity *t_e = t_tuple->variables[i]; - Type *st = s_e->type; - Type *tt = t_e->type; - - // NOTE(bill, 2018-12-14): This is needed to override polymorphic named constants in types - if (st->kind == Type_Generic && t_e->kind == Entity_Constant) { - Entity *e = scope_lookup(st->Generic.scope, st->Generic.interned_name, 0); - GB_ASSERT(e != nullptr); - if (modify_type) { - e->kind = Entity_Constant; - e->Constant.value = t_e->Constant.value; - e->type = t_e->type; - } - } else { - bool ok = is_polymorphic_type_assignable(ctx, st, tt, true, modify_type); - if (!ok) { - // TODO(bill, 2021-08-19): is this logic correct? - return false; - } - } - } - - if (modify_type) { - // NOTE(bill): This is needed in order to change the actual type but still have the types defined within it. - // See the struct branch above: finalize under the originating record's gen_types mutex. - GenTypesData *gen_types = gen_types_data_of_specialization(specialization); - if (gen_types != nullptr) mutex_lock(&gen_types->mutex); - gb_memmove(specialization, type, gb_size_of(Type)); - if (gen_types != nullptr) mutex_unlock(&gen_types->mutex); - } - - return true; + return check_type_specialization_to_internal(ctx, specialization, type, s_tuple, t_tuple, modify_type); } } From 46bb13d0bd55e410c7dbdebf0d7408edf5966eb1 Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Wed, 27 May 2026 19:10:34 +0200 Subject: [PATCH 104/228] check operand type in any_int params --- src/check_expr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index ed2115a30..8681d22ba 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -6724,7 +6724,7 @@ gb_internal CallArgumentError check_call_arguments_internal(CheckerContext *c, A if (!check_is_assignable_to_with_score(c, o, param_type, &s, param_is_variadic, allow_array_programming)) { bool ok = false; if (e && (e->flags & EntityFlag_AnyInt)) { - if (is_type_integer(param_type)) { + if (is_type_integer(param_type) && (is_type_integer(o->type) || is_type_enum(o->type))) { ok = check_is_castable_to(c, o, param_type); } } From 8e9c0d38fa4dbd2d8c36aade7439105fc362f95b Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Wed, 27 May 2026 19:11:08 +0200 Subject: [PATCH 105/228] fix disallowed bool -> any_int in win32 --- core/sys/windows/comctl32.odin | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/sys/windows/comctl32.odin b/core/sys/windows/comctl32.odin index 678c91531..70eb42f84 100644 --- a/core/sys/windows/comctl32.odin +++ b/core/sys/windows/comctl32.odin @@ -410,7 +410,7 @@ Header_SetFilterChangeTimeout :: #force_inline proc "system" (hwnd: HWND, i: c_i return cast(c_int)SendMessageW(hwnd,HDM_SETFILTERCHANGETIMEOUT,0,cast(LPARAM)i) } Header_EditFilter :: #force_inline proc "system" (hwnd: HWND, i: c_int, fDiscardChanges: BOOL) -> BOOL { - return cast(BOOL)SendMessageW(hwnd,HDM_EDITFILTER,cast(WPARAM)i,MAKELPARAM(fDiscardChanges,0)) + return cast(BOOL)SendMessageW(hwnd,HDM_EDITFILTER,cast(WPARAM)i,MAKELPARAM(int(fDiscardChanges),0)) } Header_ClearFilter :: #force_inline proc "system" (hwnd: HWND, i: c_int) -> BOOL { return cast(BOOL)SendMessageW(hwnd,HDM_CLEARFILTER,cast(WPARAM)i,0) @@ -1204,7 +1204,7 @@ ListView_HitTest :: #force_inline proc "system" (hwndLV: HWND, pinfo: ^LV_HITTES return cast(c_int)SendMessageW(hwndLV, LVM_HITTEST, 0, cast(LPARAM)uintptr(pinfo)) } ListView_EnsureVisible :: #force_inline proc "system" (hwndLV: HWND, i: c_int, fPartialOK: BOOL) -> BOOL { - return cast(BOOL)SendMessageW(hwndLV, LVM_ENSUREVISIBLE, cast(WPARAM)i, MAKELPARAM(fPartialOK,0)) + return cast(BOOL)SendMessageW(hwndLV, LVM_ENSUREVISIBLE, cast(WPARAM)i, MAKELPARAM(int(fPartialOK),0)) } ListView_Scroll :: #force_inline proc "system" (hwndLV: HWND, dx,dy: c_int) -> BOOL { return cast(BOOL)SendMessageW(hwndLV, LVM_SCROLL, cast(WPARAM)dx, cast(LPARAM)dy) @@ -2082,7 +2082,7 @@ TabCtrl_DeselectAll :: #force_inline proc "system" (hwnd: HWND, fExcludeFocus: B SendMessageW(hwnd, TCM_DESELECTALL, cast(WPARAM)fExcludeFocus, 0) } TabCtrl_HighlightItem :: #force_inline proc "system" (hwnd: HWND, i: c_int, fHighlight: BOOL) -> BOOL { - return cast(BOOL)SendMessageW(hwnd, TCM_HIGHLIGHTITEM, cast(WPARAM)i, cast(LPARAM)MAKELONG(fHighlight,0)) + return cast(BOOL)SendMessageW(hwnd, TCM_HIGHLIGHTITEM, cast(WPARAM)i, cast(LPARAM)MAKELONG(int(fHighlight),0)) } TabCtrl_SetExtendedStyle :: #force_inline proc "system" (hwnd: HWND, dw: DWORD) -> DWORD { return cast(DWORD)SendMessageW(hwnd, TCM_SETEXTENDEDSTYLE, 0, cast(LPARAM)dw) From dca771047117f85ce8305a12612329d499f5fd37 Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Wed, 27 May 2026 20:02:34 +0200 Subject: [PATCH 106/228] fix error pos style env var overwriting arg --- src/build_settings.cpp | 50 ++++++++++++++++++++++-------------------- src/main.cpp | 2 ++ 2 files changed, 28 insertions(+), 24 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 8f8a259d3..df9142c74 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -1698,6 +1698,32 @@ gb_internal String normalize_minimum_os_version_string(String version) { return make_string_c(normalized); } +gb_internal void init_build_context_error_pos_style() { + build_context.ODIN_ERROR_POS_STYLE = ErrorPosStyle_Default; + + char const *found = gb_get_env("ODIN_ERROR_POS_STYLE", permanent_allocator()); + if (found) { + ErrorPosStyle kind = ErrorPosStyle_Default; + String style = make_string_c(found); + style = string_trim_whitespace(style); + if (style == "" || style == "default" || style == "odin") { + kind = ErrorPosStyle_Default; + } else if (style == "unix" || style == "gcc" || style == "clang" || style == "llvm") { + kind = ErrorPosStyle_Unix; + } else { + gb_printf_err("Invalid ODIN_ERROR_POS_STYLE: got %.*s\n", LIT(style)); + gb_printf_err("Valid formats:\n"); + gb_printf_err("\t\"default\" or \"odin\"\n"); + gb_printf_err("\t\tpath(line:column) message\n"); + gb_printf_err("\t\"unix\"\n"); + gb_printf_err("\t\tpath:line:column: message\n"); + gb_exit(1); + } + + build_context.ODIN_ERROR_POS_STYLE = kind; + } +} + gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subtarget) { BuildContext *bc = &build_context; @@ -1714,30 +1740,6 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta bc->max_error_count = DEFAULT_MAX_ERROR_COLLECTOR_COUNT; } - { - char const *found = gb_get_env("ODIN_ERROR_POS_STYLE", permanent_allocator()); - if (found) { - ErrorPosStyle kind = ErrorPosStyle_Default; - String style = make_string_c(found); - style = string_trim_whitespace(style); - if (style == "" || style == "default" || style == "odin") { - kind = ErrorPosStyle_Default; - } else if (style == "unix" || style == "gcc" || style == "clang" || style == "llvm") { - kind = ErrorPosStyle_Unix; - } else { - gb_printf_err("Invalid ODIN_ERROR_POS_STYLE: got %.*s\n", LIT(style)); - gb_printf_err("Valid formats:\n"); - gb_printf_err("\t\"default\" or \"odin\"\n"); - gb_printf_err("\t\tpath(line:column) message\n"); - gb_printf_err("\t\"unix\"\n"); - gb_printf_err("\t\tpath:line:column: message\n"); - gb_exit(1); - } - - build_context.ODIN_ERROR_POS_STYLE = kind; - } - } - bc->copy_file_contents = true; TargetMetrics *metrics = nullptr; diff --git a/src/main.cpp b/src/main.cpp index 2bb74d912..a63cee5e0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3607,6 +3607,8 @@ int main(int arg_count, char const **arg_ptr) { TIME_SECTION("init args"); map_init(&build_context.defined_values); build_context.extra_packages.allocator = heap_allocator(); + + init_build_context_error_pos_style(); Array args = setup_args(arg_count, arg_ptr); From 3a413c3ef1d07b78267d24af28f51666d201287b Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Wed, 27 May 2026 20:29:56 +0200 Subject: [PATCH 107/228] let using bit field populate scope --- src/check_type.cpp | 51 +++++++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/src/check_type.cpp b/src/check_type.cpp index 55531fa13..128ce3ba5 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -1,6 +1,7 @@ gb_internal ParameterValue handle_parameter_value(CheckerContext *ctx, Type *in_type, Type **out_type_, Ast *expr, bool allow_caller_location); gb_internal Type *determine_type_from_polymorphic(CheckerContext *ctx, Type *poly_type, Operand const &operand); gb_internal Type *check_get_params(CheckerContext *ctx, Scope *scope, Ast *_params, bool *is_variadic_, isize *variadic_index_, bool *success_, isize *specialization_count_, Array const *operands); +gb_internal void populate_using_entity_scope(CheckerContext *ctx, Ast *node, AstField *field, Type *t, isize level); gb_internal void populate_using_array_index(CheckerContext *ctx, Ast *node, AstField *field, Type *t, String name, i32 idx) { t = base_type(t); @@ -33,6 +34,30 @@ gb_internal void populate_using_array_index(CheckerContext *ctx, Ast *node, AstF } } +gb_internal void populate_using_entity_scope_field(CheckerContext *ctx, Ast *node, AstField *parent_field, Type *original_type, isize level, Entity* field_entity) { + GB_ASSERT(field_entity->kind == Entity_Variable); + String name = field_entity->token.string; + InternedString interned = entity_interned_name(field_entity); + Entity *e = scope_lookup_current(ctx->scope, interned); + if (e != nullptr && name != "_") { + gbString ot = type_to_string(original_type); + // TODO(bill): Better type error + if (node != nullptr) { + gbString str = expr_to_string(node); + error(e->token, "'%.*s' is already declared in '%s', through 'using' from '%s'", LIT(name), str, ot); + gb_string_free(str); + } else { + error(e->token, "'%.*s' is already declared, through 'using' from '%s'", LIT(name), ot); + } + gb_string_free(ot); + } else { + add_entity(ctx, ctx->scope, nullptr, field_entity); + if (field_entity->flags & EntityFlag_Using) { + populate_using_entity_scope(ctx, node, parent_field, field_entity->type, level+1); + } + } +} + gb_internal void populate_using_entity_scope(CheckerContext *ctx, Ast *node, AstField *field, Type *t, isize level) { if (t == nullptr) { return; @@ -42,27 +67,11 @@ gb_internal void populate_using_entity_scope(CheckerContext *ctx, Ast *node, Ast if (t->kind == Type_Struct) { for (Entity *f : t->Struct.fields) { - GB_ASSERT(f->kind == Entity_Variable); - String name = f->token.string; - InternedString interned = entity_interned_name(f); - Entity *e = scope_lookup_current(ctx->scope, interned); - if (e != nullptr && name != "_") { - gbString ot = type_to_string(original_type); - // TODO(bill): Better type error - if (node != nullptr) { - gbString str = expr_to_string(node); - error(e->token, "'%.*s' is already declared in '%s', through 'using' from '%s'", LIT(name), str, ot); - gb_string_free(str); - } else { - error(e->token, "'%.*s' is already declared, through 'using' from '%s'", LIT(name), ot); - } - gb_string_free(ot); - } else { - add_entity(ctx, ctx->scope, nullptr, f); - if (f->flags & EntityFlag_Using) { - populate_using_entity_scope(ctx, node, field, f->type, level+1); - } - } + populate_using_entity_scope_field(ctx, node, field, original_type, level, f); + } + } else if (t->kind == Type_BitField) { + for (Entity *f : t->BitField.fields) { + populate_using_entity_scope_field(ctx, node, field, original_type, level, f); } } else if (t->kind == Type_Array && t->Array.count <= 4) { switch (t->Array.count) { From baa41697446631b0117f2d3723de56fe64c9c871 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 28 May 2026 08:35:21 +0100 Subject: [PATCH 108/228] Fix windows tests --- .../sys/windows/test_windows_generated.odin | 18 +++++++-------- tests/core/sys/windows/win32gen/win32gen.cpp | 22 +++++++++++-------- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/tests/core/sys/windows/test_windows_generated.odin b/tests/core/sys/windows/test_windows_generated.odin index c9c7f6729..f859a8bed 100644 --- a/tests/core/sys/windows/test_windows_generated.odin +++ b/tests/core/sys/windows/test_windows_generated.odin @@ -680,17 +680,17 @@ verify_error_codes :: proc(t: ^testing.T) { @(test) verify_error_helpers :: proc(t: ^testing.T) { // winerror.h - expect_value(t, win32.SUCCEEDED(-1), 0x00000000) - expect_value(t, win32.SUCCEEDED(0), 0x00000001) - expect_value(t, win32.SUCCEEDED(1), 0x00000001) + expect_value(t, uint(win32.SUCCEEDED(-1)), 0x00000000) + expect_value(t, uint(win32.SUCCEEDED(0)), 0x00000001) + expect_value(t, uint(win32.SUCCEEDED(1)), 0x00000001) - expect_value(t, win32.FAILED(-1), 0x00000001) - expect_value(t, win32.FAILED(0), 0x00000000) - expect_value(t, win32.FAILED(1), 0x00000000) + expect_value(t, uint(win32.FAILED(-1)), 0x00000001) + expect_value(t, uint(win32.FAILED(0)), 0x00000000) + expect_value(t, uint(win32.FAILED(1)), 0x00000000) - expect_value(t, win32.IS_ERROR(-1), 0x00000001) - expect_value(t, win32.IS_ERROR(0), 0x00000000) - expect_value(t, win32.IS_ERROR(1), 0x00000000) + expect_value(t, uint(win32.IS_ERROR(-1)), 0x00000001) + expect_value(t, uint(win32.IS_ERROR(0)), 0x00000000) + expect_value(t, uint(win32.IS_ERROR(1)), 0x00000000) expect_value(t, win32.HRESULT_CODE(0xFFFFCCCC), 0x0000CCCC) expect_value(t, win32.HRESULT_FACILITY(0xFFFFCCCC), 0x00001FFF) diff --git a/tests/core/sys/windows/win32gen/win32gen.cpp b/tests/core/sys/windows/win32gen/win32gen.cpp index 13b9c25d4..a2ff66d09 100644 --- a/tests/core/sys/windows/win32gen/win32gen.cpp +++ b/tests/core/sys/windows/win32gen/win32gen.cpp @@ -55,6 +55,10 @@ static std::string ConvertLPCWSTRToString(const LPCWSTR lpcwszStr) << '\t' << "expect_value(t, win32." << #s << ", " \ << "0x" << std::uppercase << std::setfill('0') << std::setw(8) << std::hex << s << ")" << endl +#define expect_value_bool(s) out \ + << '\t' << "expect_value(t, uint(win32." << #s << "), " \ + << "0x" << std::uppercase << std::setfill('0') << std::setw(8) << std::hex << s << ")" << endl + #define expect_value_32(s) out \ << '\t' << "expect_value(t, u32(win32." << #s << "), " \ << "0x" << std::uppercase << std::setfill('0') << std::setw(8) << std::hex << (ULONG)(ULONG_PTR)(s) << ")" << endl @@ -882,17 +886,17 @@ static void verify_error_helpers(ofstream& out) { test_proc_begin(); test_proc_comment("winerror.h"); - expect_value(SUCCEEDED(-1)); - expect_value(SUCCEEDED(0)); - expect_value(SUCCEEDED(1)); + expect_value_bool(SUCCEEDED(-1)); + expect_value_bool(SUCCEEDED(0)); + expect_value_bool(SUCCEEDED(1)); out << endl; - expect_value(FAILED(-1)); - expect_value(FAILED(0)); - expect_value(FAILED(1)); + expect_value_bool(FAILED(-1)); + expect_value_bool(FAILED(0)); + expect_value_bool(FAILED(1)); out << endl; - expect_value(IS_ERROR(-1)); - expect_value(IS_ERROR(0)); - expect_value(IS_ERROR(1)); + expect_value_bool(IS_ERROR(-1)); + expect_value_bool(IS_ERROR(0)); + expect_value_bool(IS_ERROR(1)); out << endl; expect_value(HRESULT_CODE(0xFFFFCCCC)); expect_value(HRESULT_FACILITY(0xFFFFCCCC)); From eaa32a82e8045a6cc21dc692be186d987542dfd6 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 29 May 2026 09:38:56 +0100 Subject: [PATCH 109/228] Fix global constant union initialization bug. --- src/llvm_backend.cpp | 3 ++- src/types.cpp | 38 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 49af4ec39..488c84099 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -3421,7 +3421,8 @@ gb_internal bool lb_generate_code(lbGenerator *gen) { cc.link_section = e->Variable.link_section; ExactValue v = tav.value; - lbValue init = lb_const_value(m, e->type, v, cc); + lbValue init = lb_const_value(m, e->type, v, cc, tav.type); + LLVMDeleteGlobal(g.value); g.value = nullptr; diff --git a/src/types.cpp b/src/types.cpp index f87d62297..260dd4918 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -2656,6 +2656,40 @@ gb_internal bool type_has_nil(Type *t) { return false; } +gb_internal bool is_type_union_constantable(Type *type); + +gb_internal bool is_type_constant_type_for_unions(Type *t) { + t = core_type(t); + if (t == nullptr) { return false; } + switch (t->kind) { + case Type_Basic: + if (t->Basic.kind == Basic_typeid) { + return true; + } + return (t->Basic.flags & BasicFlag_ConstantType) != 0; + case Type_BitSet: + return true; + case Type_Proc: + return true; + case Type_Array: + return is_type_constant_type(t->Array.elem); + case Type_EnumeratedArray: + return is_type_constant_type(t->EnumeratedArray.elem); + case Type_Struct: + { + for (Entity *field : t->Struct.fields) { + if (!is_type_constant_type_for_unions(field->type)) { + return false; + } + } + return true; + } + case Type_Union: + return is_type_union_constantable(t); + } + return false; +} + gb_internal bool is_type_union_constantable(Type *type) { Type *bt = base_type(type); GB_ASSERT(bt->kind == Type_Union); @@ -2667,7 +2701,7 @@ gb_internal bool is_type_union_constantable(Type *type) { } for (Type *v : bt->Union.variants) { - if (!is_type_constant_type(v)) { + if (!is_type_constant_type_for_unions(v)) { return false; } } @@ -2680,7 +2714,7 @@ gb_internal bool is_type_raw_union_constantable(Type *type) { GB_ASSERT(bt->Struct.is_raw_union); for (Entity *f : bt->Struct.fields) { - if (!is_type_constant_type(f->type)) { + if (!is_type_constant_type_for_unions(f->type)) { return false; } } From 21fc31dfb8b0110d79bdd4f49156df4603cb4f6f Mon Sep 17 00:00:00 2001 From: Michele Giornetta Date: Fri, 29 May 2026 11:01:01 +0200 Subject: [PATCH 110/228] fix: invert SDL2 and SDL3 in vendor README --- vendor/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vendor/README.md b/vendor/README.md index b1de90a9a..53ff46179 100644 --- a/vendor/README.md +++ b/vendor/README.md @@ -114,7 +114,7 @@ This package is available under the Zlib license. See `LICENSE` for more details ## SDL2 -Bindings for the cross platform multimedia API [SDL3](https://github.com/libsdl-org/SDL) and its sub-projects. +Bindings for the cross platform multimedia API [SDL2](https://github.com/libsdl-org/SDL) and its sub-projects. `SDL2.dll` and `SDL2.lib` are available under SDL's [zlib](https://github.com/libsdl-org/SDL/blob/main/LICENSE.txt) license. @@ -144,7 +144,7 @@ SDL2 TTF relies on 3rd party libraries `zlib`, available under the ZLIB license, ## SDL3 -Bindings for the cross platform multimedia API [SDL2](https://github.com/libsdl-org/SDL) and its sub-projects. +Bindings for the cross platform multimedia API [SDL3](https://github.com/libsdl-org/SDL) and its sub-projects. `SDL3.dll` and `SDL3.lib` are available under SDL's [zlib](https://github.com/libsdl-org/SDL/blob/main/LICENSE.txt) license. @@ -207,4 +207,4 @@ The Vulkan 3D graphics API are automatically generated from headers provided by [zlib](https://github.com/madler/zlib) data compression library See also LICENSE in the `zlib` directory itself. -Includes full bindings. \ No newline at end of file +Includes full bindings. From d7116d641508a554efdb2212d0708d98aedac922 Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Mon, 1 Jun 2026 12:59:23 -0400 Subject: [PATCH 111/228] [sys/linux] remove parapoly from `rt_sigaction` --- core/sys/linux/sys.odin | 2 +- core/sys/linux/types.odin | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/sys/linux/sys.odin b/core/sys/linux/sys.odin index 87e41fa29..0b5c252b9 100644 --- a/core/sys/linux/sys.odin +++ b/core/sys/linux/sys.odin @@ -213,7 +213,7 @@ rt_sigreturn :: proc "c" () -> ! { /* Alter an action taken by a process. */ -rt_sigaction :: proc "contextless" (sig: Signal, sigaction: ^Sig_Action($T), old_sigaction: ^Sig_Action($U)) -> Errno { +rt_sigaction :: proc "contextless" (sig: Signal, sigaction: ^Sig_Action, old_sigaction: ^Sig_Action) -> Errno { // NOTE(jason): It appears that the restorer is required for i386 and amd64 when ODIN_ARCH == .i386 || ODIN_ARCH == .amd64 { sigaction.flags += {.RESTORER} diff --git a/core/sys/linux/types.odin b/core/sys/linux/types.odin index c2334e5b6..d3b2c883b 100644 --- a/core/sys/linux/types.odin +++ b/core/sys/linux/types.odin @@ -747,10 +747,10 @@ Sig_Action_Special :: enum uint { } Sig_Action_Flags :: bit_set[Sig_Action_Flag; uint] -Sig_Action :: struct($T: typeid) { +Sig_Action :: struct { using _u: struct #raw_union { handler: Sig_Handler_Fn, - sigaction: #type proc "c" (sig: Signal, si: ^Sig_Info, ctx: ^T), + sigaction: #type proc "c" (sig: Signal, si: ^Sig_Info, ctx: rawptr), special: Sig_Action_Special, }, flags: Sig_Action_Flags, From bf2d33f0e5b25d1ed695ad2d05b54be01a00ad33 Mon Sep 17 00:00:00 2001 From: juaumjuaumjuaum Date: Tue, 2 Jun 2026 00:00:45 +0200 Subject: [PATCH 112/228] Swap panic_contextless and unimplemented_contexless documentation They were swaped --- base/runtime/core_builtin.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 7a2ce90b8..34e3d4f32 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -1624,14 +1624,14 @@ ensure_contextless :: proc "contextless" (condition: bool, message := #caller_ex } } -// Panics the program with a message to indicate something has yet to be implemented. +// Panics the program with a message. // This uses the `default_assertion_contextless_failure_proc` to assert. @builtin panic_contextless :: proc "contextless" (message: string, loc := #caller_location) -> ! { default_assertion_contextless_failure_proc("panic", message, loc) } -// Panics the program with a message. +// Panics the program with a message to indicate something has yet to be implemented. // This uses the `default_assertion_contextless_failure_proc` to assert. @builtin unimplemented_contextless :: proc "contextless" (message := "", loc := #caller_location) -> ! { From e7698e4adfe9902561b65cd4e825da166b90d938 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Mon, 25 May 2026 10:34:29 +0900 Subject: [PATCH 113/228] core/encoding/pem: Initial import --- core/encoding/pem/doc.odin | 7 + core/encoding/pem/pem.odin | 299 +++++++++++++++++++++++++++++++ examples/all/all_js.odin | 1 + examples/all/all_main.odin | 1 + tests/core/encoding/pem/pem.odin | 86 +++++++++ 5 files changed, 394 insertions(+) create mode 100644 core/encoding/pem/doc.odin create mode 100644 core/encoding/pem/pem.odin create mode 100644 tests/core/encoding/pem/pem.odin diff --git a/core/encoding/pem/doc.odin b/core/encoding/pem/doc.odin new file mode 100644 index 000000000..cf5fb20a5 --- /dev/null +++ b/core/encoding/pem/doc.odin @@ -0,0 +1,7 @@ +/* +Encodes and decodes PEM formatted data. + +See: +- [[ https://www.rfc-editor.org/rfc/rfc7468.html ]] +*/ +package pem diff --git a/core/encoding/pem/pem.odin b/core/encoding/pem/pem.odin new file mode 100644 index 000000000..88ba6e2db --- /dev/null +++ b/core/encoding/pem/pem.odin @@ -0,0 +1,299 @@ +package pem + +import "base:runtime" +import "core:bufio" +import "core:bytes" +import "core:crypto" +import "core:encoding/base64" +import "core:strings" + +@(private) +BASE64_FULL_LINE_LENGTH :: 64 +@(private) +BASE64_FULL_LINE_BYTES :: (BASE64_FULL_LINE_LENGTH / 4) * 3 +@(private) +PREFIX_BEGIN : string : "-----BEGIN " +@(private) +PREFIX_END : string : "-----END " +@(private) +SUFFIX : string : "-----" +@(private) +LF :: "\n" +@(private) +PREEB_OVERHEAD :: len(PREFIX_BEGIN) + len(SUFFIX) + len(LF) +@(private) +POSTEB_OVERHEAD :: len(PREFIX_END) + len(SUFFIX) + +// Block is a block of PEM encoded data. +Block :: struct { + label: string, + data: [dynamic]byte, +} + +LABEL_CERTIFICATE :: "CERTIFICATE" // RFC 5280 +LABEL_X509_CRL :: "X509_CRL" // RFC 5280 +LABEL_CERTIFICATE_REQUEST :: "CERTIFICATE REQUEST" // RFC 2986 +LABEL_PKCS7 :: "PKCS7" // RFC 2315 +LABEL_CMS :: "CMS" // RFC 5652 +LABEL_PRIVATE_KEY :: "PRIVATE KEY" // RFC 5208/ RFC 5958 +LABEL_ENCRYPTED_PRIVATE_KEY :: "ENCRYPTED PRIVATE KEY" // RFC 5958 +LABEL_ATTRIBUTE_CERTIFICATE :: "ATTRIBUTE CERTIFICATE" // RFC 5755 +LABEL_PUBLIC_KEY :: "PUBLIC KEY" // RFC 5280 + +Decode_Error :: enum { + None, + Bad_Boundary, // Invalid boundary line. + Bad_Label, // Invalid label in BEGIN/END boundary line. + Bad_Data, // Invalid base64 data. + Label_Mismatch, // Label in END boundary line does not match. + Missing_End_Boundary, // End of data without END boundary. +} + +Error :: union #shared_nil { + runtime.Allocator_Error, + Decode_Error, +} + +// decode decodes the first encountered PEM block, returning the resulting +// block, remaining data, and nil if and only if (⟺) the process was +// successful. +// +// Note: No PEM blocks will result in this procedure returning all nils, +// and is not considered an error. +@(require_results) +decode :: proc(data: []byte, allocator := context.allocator) -> (blk: ^Block, remaining: []byte, err: Error) { + line: []byte + remaining = data + + // Search for the first `preeb`. + label: string + found := false // Label is allowed to be empty. + for len(remaining) > 0 { + line, remaining = get_line(remaining) + + label, found, err = parse_eb(line, true) + if err != nil { + return nil, nil, err + } + if found { + break + } + } + if !found { + return nil, nil, nil + } + + // RFC 1421: Parse header block. + // RFC 7468 (lax): Skip whitespace. + + // Initialize the block. + blk = new(Block, allocator) or_return + if blk.data, err = make([dynamic]byte, 0, 32, allocator); err != nil { + free(blk, allocator) + return nil, nil, err + } + if blk.label, err = strings.clone(label, allocator); err != nil { + block_delete(blk) + return nil, nil, err + } + + // Parse the `strictbase64text`. + l_buf: [BASE64_FULL_LINE_BYTES]byte + defer crypto.zero_explicit(&l_buf, size_of(l_buf)) + base64text_loop: for len(remaining) > 0 { + line, remaining = get_line(remaining) + l := len(line) + switch { + case l == 0: + block_delete(blk) + return nil, nil, .Bad_Data + case line[0] == '-': + // Looks like we hit the `posteb`, break. + break base64text_loop + case l > BASE64_FULL_LINE_LENGTH || l & 3 != 0: + // Padding is mandatory, so the line length will always + // be a multiple of 4. + block_delete(blk) + return nil, nil, .Bad_Data + } + + decoded, dec_err := base64.decode_into_buf(l_buf[:], transmute(string)(line)) + if dec_err != nil { + block_delete(blk) + return nil, nil, .Bad_Data + } + + if _, err = append(&blk.data, ..decoded); err != nil { + block_delete(blk) + return nil, nil, err + } + + // As `strictbase64text = *base64fullline strictbase64finl`, + // if we did not have a full line, we must have reached + // `strictbase64finl`. Grab what should be the `posteb` + // and break. + if l < BASE64_FULL_LINE_LENGTH { + line, remaining = get_line(remaining) + break + } + } + + // Validate the `posteb`. + post_label: string + post_label, found, err = parse_eb(line, false) + if err == nil { + switch { + case !found: + err = .Missing_End_Boundary + case label != post_label: + err = .Label_Mismatch + } + } + if err != nil { + block_delete(blk) + blk, remaining = nil, nil + } + + return +} + +// encode encodes the specified label and data into PEM format. +@(require_results) +encode :: proc(label: string, data: []byte, newline := false, allocator := context.allocator) -> (res: []byte, err: runtime.Allocator_Error) #optional_allocator_error { + sanitize_sb := proc(sb: ^strings.Builder) { + buf := sb.buf[:] + b, l := raw_data(buf), len(buf) + crypto.zero_explicit(b, l) + strings.builder_destroy(sb) + } + + sb := strings.builder_make_none(allocator) or_return + defer sanitize_sb(&sb) + + label_len := len(label) + + // Write `preeb`. + n := strings.write_string(&sb, PREFIX_BEGIN) + n += strings.write_string(&sb, label) + n += strings.write_string(&sb, SUFFIX) + n += strings.write_string(&sb, LF) + if n != PREEB_OVERHEAD + label_len { + return nil, .Out_Of_Memory + } + + // RFC 1421: Write header block. + + // Write `base64text`. + l: [BASE64_FULL_LINE_LENGTH]byte + defer crypto.zero_explicit(&l, size_of(l)) + + d := data + for len(d) > 0 { + n = min(len(d), BASE64_FULL_LINE_BYTES) + encoded, _ := base64.encode_into_buf(l[:], d[:n]) + d = d[n:] + + expected_len := len(encoded) + len(LF) + n = strings.write_bytes(&sb, encoded) + n += strings.write_string(&sb, LF) + if n != expected_len { + return nil, .Out_Of_Memory + } + } + + // Write `posteb`. + expected_len := POSTEB_OVERHEAD + label_len + (len(LF) if newline else 0) + n = strings.write_string(&sb, PREFIX_END) + n += strings.write_string(&sb, label) + n += strings.write_string(&sb, SUFFIX) + if newline { + n += strings.write_string(&sb, LF) + } + if n != expected_len { + return nil, .Out_Of_Memory + } + + res = transmute([]byte)(strings.clone(strings.to_string(sb), allocator) or_return) + + return +} + +// block_bytes returns a slice to the Block's data. +block_bytes :: proc(blk: ^Block) -> []byte { + return blk.data[:] +} + +// block_delete frees a Block returned from decode. +// +// Note: No allocator is specified as decode uses the same allocator +// for everything. +block_delete :: proc(blk: ^Block) { + allocator := ((^runtime.Raw_Dynamic_Array)(&blk.data)).allocator + + delete(blk.label, allocator) + sanitize_and_delete(blk.data) + free(blk, allocator) +} + +@(private) +get_line :: proc(data: []byte) -> (line, rest: []byte) { + adv: int + adv, line, _, _ = bufio.scan_lines(data, true) + rest = data[adv:] + + return +} + +@(private) +parse_eb :: proc(line: []byte, is_pre: bool) -> (label: string, found: bool, err: Error) { + line := line + + prefix: string + switch is_pre { + case true: + prefix = PREFIX_BEGIN + case false: + prefix = PREFIX_END + } + + l := len(line) + line = bytes.trim_prefix(line, transmute([]byte)(prefix)) + if len(line) == l { + return "", false, nil + } + + l = len(line) + line = bytes.trim_suffix(line, transmute([]byte)(SUFFIX)) + if len(line) == l { + return "", false, .Bad_Boundary + } + + // labelchar = %x21-2C / %x2E-7E ; any printable character, + // ; except hyphen-minus + // label = [ labelchar *( ["-" / SP] labelchar ) ] ; empty ok + l = len(line) + line = bytes.trim(line, []byte{'-', ' '}) + if len(line) != l { + return "", false, .Bad_Label + } + for b in line { + // We already ruled out non-labelchar start/end, so this + // allows ' '/'-'. + if b < 0x20 || b > 0x7e { + return "", false, .Bad_Label + } + } + + found = true + label = transmute(string)(line) + + return +} + +@(private) +sanitize_and_delete :: proc(data: [dynamic]byte) { + b, l := raw_data(data), len(data) + crypto.zero_explicit(b, l) + + delete(data) +} diff --git a/examples/all/all_js.odin b/examples/all/all_js.odin index becc8f522..8dbc320d0 100644 --- a/examples/all/all_js.odin +++ b/examples/all/all_js.odin @@ -71,6 +71,7 @@ package all @(require) import "core:encoding/hxa" @(require) import "core:encoding/ini" @(require) import "core:encoding/json" +@(require) import "core:encoding/pem" @(require) import "core:encoding/varint" @(require) import "core:encoding/xml" @(require) import "core:encoding/uuid" diff --git a/examples/all/all_main.odin b/examples/all/all_main.odin index a35781338..b8655a89e 100644 --- a/examples/all/all_main.odin +++ b/examples/all/all_main.odin @@ -76,6 +76,7 @@ package all @(require) import "core:encoding/hxa" @(require) import "core:encoding/ini" @(require) import "core:encoding/json" +@(require) import "core:encoding/pem" @(require) import "core:encoding/varint" @(require) import "core:encoding/xml" @(require) import "core:encoding/uuid" diff --git a/tests/core/encoding/pem/pem.odin b/tests/core/encoding/pem/pem.odin new file mode 100644 index 000000000..6da8ecd1a --- /dev/null +++ b/tests/core/encoding/pem/pem.odin @@ -0,0 +1,86 @@ +package test_core_pem + +import "core:bytes" +import "core:encoding/hex" +import "core:encoding/pem" +import "core:testing" + +// RFC 7468 Section 9. +@(private) +CMS_PEM_TEXT : string : \ +`-----BEGIN CMS----- +MIGDBgsqhkiG9w0BCRABCaB0MHICAQAwDQYLKoZIhvcNAQkQAwgwXgYJKoZIhvcN +AQcBoFEET3icc87PK0nNK9ENqSxItVIoSa0o0S/ISczMs1ZIzkgsKk4tsQ0N1nUM +dvb05OXi5XLPLEtViMwvLVLwSE0sKlFIVHAqSk3MBkkBAJv0Fx0= +-----END CMS-----` +@(private) +CMS_PEM_PAYLOAD : string : "308183060b2a864886f70d0109100109a0743072020100300d060b2a864886f70d0109100308305e06092a864886f70d010701a051044f789c73cecf2b49cd2bd10da92c48b5522849ad28d12fc849ccccb35648ce482c2a4e2db10d0dd6750c76f6f4e4e5e2e572cf2c4b5588cc2f2d52f0484d2c2a514854702a4a4dcc064901009bf4171d" +@(private) +NOT_PEM_TEXT : string : \ +` +Socialism is not in the least what it pretends to be. +It is not the pioneer of a better and finer world, but the spoiler of what thousands of years of civilization have created. +It does not build, it destroys. +For destruction is the essence of it. +It produces nothing, it only consumes what the social order based on private ownership in the means of production has created. ` +@(private) +COMMENT_TEXT : string : "# 9. Textual Encoding of Cryptographic Message Syntax" + +@(test) +test_pem_roundtrip :: proc(t: ^testing.T) { + // Decode. + blk, remaining, err := pem.decode(transmute([]byte)(CMS_PEM_TEXT)) + if !testing.expectf(t, err == nil, "PEM decode failed: %v", err) { + return + } + defer pem.block_delete(blk) + + if !testing.expectf(t, len(remaining) == 0, "PEM decode left trailing garbage: '%s'", remaining) { + return + } + + // Ensure contents match. + if !testing.expectf(t, blk.label == pem.LABEL_CMS, "PEM unexpected label: '%s'", blk.label) { + return + } + expected_payload, _ := hex.decode(transmute([]byte)(CMS_PEM_PAYLOAD)) + defer delete(expected_payload) + + if !testing.expectf(t, bytes.equal(pem.block_bytes(blk), expected_payload), "PEM unexpected data: '%x'", blk.data) { + return + } + + // Encode and compare. + encoded := pem.encode(blk.label, pem.block_bytes(blk)) + defer delete(encoded) + testing.expectf(t, CMS_PEM_TEXT == transmute(string)(encoded), "PEM encode mismatch: '%s'", encoded) +} + +@(test) +test_pem_no_blocks :: proc(t: ^testing.T) { + blk, remaining, err := pem.decode(transmute([]byte)(NOT_PEM_TEXT)) + testing.expect(t, blk == nil) + testing.expect(t, len(remaining) == 0) + testing.expect(t, err == nil) +} + +@(test) +test_pem_surrounded :: proc(t: ^testing.T) { + blob := COMMENT_TEXT + "\n" + CMS_PEM_TEXT + "\n" + NOT_PEM_TEXT + + // Should skip `COMMENT_TEXT` + blk, remaining, err := pem.decode(transmute([]byte)(blob)) + if !testing.expectf(t, err == nil, "PEM decode failed: %v", err) { + return + } + defer pem.block_delete(blk) + + // Check if the decode is correct by ensuring it round-trips. + encoded := pem.encode(blk.label, pem.block_bytes(blk)) + defer delete(encoded) + if !testing.expectf(t, CMS_PEM_TEXT == transmute(string)(encoded), "PEM encode mismatch: '%s'", encoded) { + return + } + + testing.expectf(t, NOT_PEM_TEXT == transmute(string)(remaining), "PEM remaining not preserved: '%s'", remaining) +} From b914dc1f329352a84da5c2df6f58ee030d53f4d1 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 2 Jun 2026 11:10:58 +0100 Subject: [PATCH 114/228] Change compound literal grammar to match the formal grammar --- core/odin/parser/parser.odin | 3 --- src/parser.cpp | 3 --- 2 files changed, 6 deletions(-) diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin index c170e06cf..b07b75601 100644 --- a/core/odin/parser/parser.odin +++ b/core/odin/parser/parser.odin @@ -3174,9 +3174,6 @@ is_literal_type :: proc(expr: ^ast.Expr) -> bool { } parse_value :: proc(p: ^Parser) -> ^ast.Expr { - if p.curr_tok.kind == .Open_Brace { - return parse_literal_value(p, nil) - } prev_allow_range := p.allow_range defer p.allow_range = prev_allow_range p.allow_range = true diff --git a/src/parser.cpp b/src/parser.cpp index 6dac8914f..bef9a3b4e 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -2039,9 +2039,6 @@ gb_internal Ast *parse_literal_value(AstFile *f, Ast *type) { } gb_internal Ast *parse_value(AstFile *f) { - if (f->curr_token.kind == Token_OpenBrace) { - return parse_literal_value(f, nullptr); - } Ast *value; bool prev_allow_range = f->allow_range; f->allow_range = true; From a479eb777530e2e474867d6501bb489997b30294 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 2 Jun 2026 13:09:40 +0100 Subject: [PATCH 115/228] Support `@(link_section=)` for procedures --- src/check_decl.cpp | 5 +++++ src/checker.cpp | 11 +++++++++++ src/entity.cpp | 1 + src/llvm_backend_proc.cpp | 3 +++ 4 files changed, 20 insertions(+) diff --git a/src/check_decl.cpp b/src/check_decl.cpp index f571c7401..b74a43d62 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -1485,6 +1485,11 @@ gb_internal void check_proc_decl(CheckerContext *ctx, Entity *e, DeclInfo *d) { e->deprecated_message = ac.deprecated_message; e->warning_message = ac.warning_message; ac.link_name = handle_link_name(ctx, e->token, ac.link_name, ac.link_prefix, ac.link_suffix); + + if (ac.link_section.len > 0) { + e->Procedure.link_section = ac.link_section; + } + if (ac.has_disabled_proc) { if (ac.disabled_proc) { e->flags |= EntityFlag_Disabled; diff --git a/src/checker.cpp b/src/checker.cpp index 1b668eff5..ca457fa21 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -4179,6 +4179,17 @@ gb_internal DECL_ATTRIBUTE_PROC(proc_decl_attribute) { } } return true; + } else if (name == "link_section") { + ExactValue ev = check_decl_attribute_value(c, value); + if (ev.kind == ExactValue_String) { + ac->link_section = ev.value_string; + if (!is_foreign_name_valid(ac->link_section)) { + error(elem, "Invalid link section: %.*s", LIT(ac->link_section)); + } + } else { + error(elem, "Expected a string value for '%.*s'", LIT(name)); + } + return true; } return false; } diff --git a/src/entity.cpp b/src/entity.cpp index 1879e9d05..31f90023b 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -249,6 +249,7 @@ struct Entity { String link_name; String link_prefix; String link_suffix; + String link_section; String objc_selector_name; Entity *objc_class; DeferredProcedure deferred_procedure; diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 63ca868ec..606ef9c29 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -253,6 +253,9 @@ gb_internal lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool i lb_set_wasm_procedure_import_attributes(p->value, entity, p->name); } + if (entity->Procedure.link_section.len > 0) { + LLVMSetSection(p->value, alloc_cstring(permanent_allocator(), entity->Procedure.link_section)); + } // NOTE(bill): offset==0 is the return value isize offset = 1; From 7a5a73efae15426d501ed5a387952c48d2edfca1 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 2 Jun 2026 13:21:57 +0100 Subject: [PATCH 116/228] Generalize `is_foreign_name_valid` but add TODO to see how it should work. --- src/checker.cpp | 57 +++++++++++++++++++++++++++++++++++++++---------- src/parser.cpp | 48 ----------------------------------------- 2 files changed, 46 insertions(+), 59 deletions(-) diff --git a/src/checker.cpp b/src/checker.cpp index ca457fa21..26a5f4989 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -3611,6 +3611,52 @@ gb_internal ExactValue check_decl_attribute_value(CheckerContext *c, Ast *value, return ev; } +gb_internal bool is_foreign_name_valid(String const &name) { + if (name.len == 0) { + return false; + } + isize offset = 0; + while (offset < name.len) { + Rune rune; + isize remaining = name.len - offset; + isize width = utf8_decode(name.text+offset, remaining, &rune); + if (rune == GB_RUNE_INVALID && width == 1) { + return false; + } else if (rune == GB_RUNE_BOM && remaining > 0) { + return false; + } + + // TODO(bill, 2026-06-02): This entire logic needs to be completely figured out + // as to what should be allowed or not + // The original limitations of `-$._ +` and alphanumeric was more of an assumption + // than the actual technical limitations of all linkers. + if (offset == 0) { + switch (rune) { + case '-': + case '$': + case '.': + case '_': + case ':': + break; + default: + if (!gb_char_is_alpha(cast(char)rune)) + return false; + break; + } + } else { + int n = utf8proc_charwidth(rune); + if (n <= 0) { + // not a printable character + return false; + } + } + + offset += width; + } + + return true; +} + #define ATTRIBUTE_USER_TAG_NAME "tag" @@ -4179,17 +4225,6 @@ gb_internal DECL_ATTRIBUTE_PROC(proc_decl_attribute) { } } return true; - } else if (name == "link_section") { - ExactValue ev = check_decl_attribute_value(c, value); - if (ev.kind == ExactValue_String) { - ac->link_section = ev.value_string; - if (!is_foreign_name_valid(ac->link_section)) { - error(elem, "Invalid link section: %.*s", LIT(ac->link_section)); - } - } else { - error(elem, "Expected a string value for '%.*s'", LIT(name)); - } - return true; } return false; } diff --git a/src/parser.cpp b/src/parser.cpp index bef9a3b4e..26276b20c 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -2057,54 +2057,6 @@ gb_internal void check_proc_add_tag(AstFile *f, Ast *tag_expr, u64 *tags, ProcTa *tags |= tag; } -gb_internal bool is_foreign_name_valid(String const &name) { - if (name.len == 0) { - return false; - } - isize offset = 0; - while (offset < name.len) { - Rune rune; - isize remaining = name.len - offset; - isize width = utf8_decode(name.text+offset, remaining, &rune); - if (rune == GB_RUNE_INVALID && width == 1) { - return false; - } else if (rune == GB_RUNE_BOM && remaining > 0) { - return false; - } - - if (offset == 0) { - switch (rune) { - case '-': - case '$': - case '.': - case '_': - break; - default: - if (!gb_char_is_alpha(cast(char)rune)) - return false; - break; - } - } else { - switch (rune) { - case '-': - case '$': - case '.': - case '_': - break; - default: - if (!gb_char_is_alphanumeric(cast(char)rune)) { - return false; - } - break; - } - } - - offset += width; - } - - return true; -} - gb_internal void parse_proc_tags(AstFile *f, u64 *tags) { GB_ASSERT(tags != nullptr); From 16eac6187d844fa600911d6ab0b857c177883385 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 2 Jun 2026 13:38:39 +0100 Subject: [PATCH 117/228] Re-add `@(link_section)` for procedures --- src/checker.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/checker.cpp b/src/checker.cpp index 26a5f4989..539be0666 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -4017,6 +4017,17 @@ gb_internal DECL_ATTRIBUTE_PROC(proc_decl_attribute) { error(elem, "Expected a string value for '%.*s'", LIT(name)); } return true; + } else if (name == "link_section") { + ExactValue ev = check_decl_attribute_value(c, value); + if (ev.kind == ExactValue_String) { + ac->link_section = ev.value_string; + if (!is_foreign_name_valid(ac->link_section)) { + error(elem, "Invalid link section: %.*s", LIT(ac->link_section)); + } + } else { + error(elem, "Expected a string value for '%.*s'", LIT(name)); + } + return true; } else if (name == "deprecated") { ExactValue ev = check_decl_attribute_value(c, value); From d41ff62c57cc53a4f064e46d5415db9798f0b8cd Mon Sep 17 00:00:00 2001 From: "Alexander Cusaac (MightyChubz)" Date: Wed, 3 Jun 2026 05:27:25 -0400 Subject: [PATCH 118/228] fix: Get meminfo from `/proc/meminfo` over `sysinfo()` --- core/sys/info/platform_linux.odin | 75 ++++++++++++++++++++++++++----- core/sys/info/sysinfo.odin | 2 +- 2 files changed, 66 insertions(+), 11 deletions(-) diff --git a/core/sys/info/platform_linux.odin b/core/sys/info/platform_linux.odin index 7886b6243..9fc794296 100644 --- a/core/sys/info/platform_linux.odin +++ b/core/sys/info/platform_linux.odin @@ -2,6 +2,7 @@ package sysinfo import "base:intrinsics" import "base:runtime" +import "core:strconv" import "core:strings" import "core:sys/linux" @@ -79,17 +80,71 @@ _os_version :: proc (allocator: runtime.Allocator, loc := #caller_location) -> ( } @(private) -_ram_stats :: proc "contextless" () -> (total_ram, free_ram, total_swap, free_swap: i64, ok: bool) { - // Retrieve RAM info using `sysinfo` - sys_info: linux.Sys_Info - errno := linux.sysinfo(&sys_info) - assert_contextless(errno == .NONE, "Good luck to whoever's debugging this, something's seriously cucked up!") +_ram_stats :: proc() -> (total_ram, free_ram, total_swap, free_swap: i64, ok: bool) { + fd, errno := linux.open("/proc/meminfo", {}) + if errno != .NONE { + // This should never happen since something would be wrong with the system + // if /proc/meminfo wasn't able to be opened for any reason + return 0, 0, 0, 0, false + } - total_ram = i64(sys_info.totalram) * i64(sys_info.mem_unit) - free_ram = i64(sys_info.freeram) * i64(sys_info.mem_unit) - total_swap = i64(sys_info.totalswap) * i64(sys_info.mem_unit) - free_swap = i64(sys_info.freeswap) * i64(sys_info.mem_unit) - ok = true + defer linux.close(fd) + + // We need a relatively large size to store all the info + meminfo_buf: [4096]u8 + n, read_errno := linux.read(fd, meminfo_buf[:]) + if read_errno != .NONE { + return 0, 0, 0, 0, false + } + meminfo := string(meminfo_buf[:n]) + + // Stuff needed as a failsafe for later in the event MemAvailable is being broken + mem_free, buffers, cached, shmem, s_reclaimable: i64 + + for line in strings.split_lines_iterator(&meminfo) { + if len(line) == 0 do continue + + colon_idx := strings.index(line, ":") + if colon_idx < 0 do continue + + key := strings.trim_space(line[:colon_idx]) + value_str := strings.trim_space(strings.trim_suffix(line[colon_idx + 1:], "kB")) + + value, conv_ok := strconv.parse_i64(value_str, 10) + if !conv_ok do continue + + switch key { + case "MemTotal": + total_ram = value + case "MemFree": + mem_free = value + case "MemAvailable": + free_ram = value + case "SwapTotal": + total_swap = value + case "SwapFree": + free_swap = value + case "Buffers": + buffers = value + case "Cached": + cached = value + case "Shmem": + shmem = value + case "SReclaimable": + s_reclaimable = value + } + } + + if free_ram == 0 || free_ram > total_ram { + free_ram = mem_free + buffers + cached + s_reclaimable - shmem + } + + mem_unit :: 1024 + total_ram *= mem_unit + free_ram *= mem_unit + total_swap *= mem_unit + free_swap *= mem_unit + ok = true return } \ No newline at end of file diff --git a/core/sys/info/sysinfo.odin b/core/sys/info/sysinfo.odin index ad120b264..5be40a3a8 100644 --- a/core/sys/info/sysinfo.odin +++ b/core/sys/info/sysinfo.odin @@ -59,7 +59,7 @@ Returns: - free_swap: Free SWAP reported by the operating system, in bytes - ok: `true` when we could retrieve RAM statistics, `false` otherwise */ -ram_stats :: proc "contextless" () -> (total_ram, free_ram, total_swap, free_swap: i64, ok: bool) { +ram_stats :: proc() -> (total_ram, free_ram, total_swap, free_swap: i64, ok: bool) { return _ram_stats() } From 55fd98194125a6406cc426330989663e2a768412 Mon Sep 17 00:00:00 2001 From: "Alexander Cusaac (MightyChubz)" Date: Wed, 3 Jun 2026 12:09:46 -0400 Subject: [PATCH 119/228] refactor: Remove usage of `do` I knew there was something I was forgetting with code in the core packages. I wasn't applying the right arguments and style checks. Oops. --- core/sys/info/platform_linux.odin | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/core/sys/info/platform_linux.odin b/core/sys/info/platform_linux.odin index 9fc794296..191b71f05 100644 --- a/core/sys/info/platform_linux.odin +++ b/core/sys/info/platform_linux.odin @@ -102,16 +102,22 @@ _ram_stats :: proc() -> (total_ram, free_ram, total_swap, free_swap: i64, ok: bo mem_free, buffers, cached, shmem, s_reclaimable: i64 for line in strings.split_lines_iterator(&meminfo) { - if len(line) == 0 do continue + if len(line) == 0 { + continue + } colon_idx := strings.index(line, ":") - if colon_idx < 0 do continue + if colon_idx < 0 { + continue + } key := strings.trim_space(line[:colon_idx]) value_str := strings.trim_space(strings.trim_suffix(line[colon_idx + 1:], "kB")) value, conv_ok := strconv.parse_i64(value_str, 10) - if !conv_ok do continue + if !conv_ok { + continue + } switch key { case "MemTotal": From 639196f28de0bdc1ff42aada9d243ea341cfe882 Mon Sep 17 00:00:00 2001 From: TheRadischen <119001853+TheRadischen@users.noreply.github.com> Date: Wed, 3 Jun 2026 22:33:49 +0200 Subject: [PATCH 120/228] Update slice.odin added a check for rotate_left rotating with 0 length array crashes --- core/slice/slice.odin | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/slice/slice.odin b/core/slice/slice.odin index 0df55320b..464a30339 100644 --- a/core/slice/slice.odin +++ b/core/slice/slice.odin @@ -433,6 +433,9 @@ fill :: proc "contextless" (array: $T/[]$E, value: E) #no_bounds_check { } rotate_left :: proc "contextless" (array: $T/[]$E, mid: int) { + if len(a) == 0 { + return + } n := len(array) m := mid %% n k := n - m From 32de482025409492bf28037ab68ea591295a503d Mon Sep 17 00:00:00 2001 From: "Alexander Cusaac (MightyChubz)" Date: Wed, 3 Jun 2026 16:44:31 -0400 Subject: [PATCH 121/228] docs: Add small comment to explain purpose of approach --- core/sys/info/platform_linux.odin | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/sys/info/platform_linux.odin b/core/sys/info/platform_linux.odin index 191b71f05..e4617ca72 100644 --- a/core/sys/info/platform_linux.odin +++ b/core/sys/info/platform_linux.odin @@ -81,6 +81,8 @@ _os_version :: proc (allocator: runtime.Allocator, loc := #caller_location) -> ( @(private) _ram_stats :: proc() -> (total_ram, free_ram, total_swap, free_swap: i64, ok: bool) { + // The approach is to read /proc/meminfo for the memory information _over_ sysinfo(), + // since sysinfo() just returns MemFree over the value we actually want, MemAvailable. fd, errno := linux.open("/proc/meminfo", {}) if errno != .NONE { // This should never happen since something would be wrong with the system From 3d3aa45e02e127bb910ed49b07350eab760d7c1d Mon Sep 17 00:00:00 2001 From: "Alexander Cusaac (MightyChubz)" Date: Wed, 3 Jun 2026 16:45:06 -0400 Subject: [PATCH 122/228] refactor: Update fallback to just return MemFree --- core/sys/info/platform_linux.odin | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/core/sys/info/platform_linux.odin b/core/sys/info/platform_linux.odin index e4617ca72..7ef58cbb6 100644 --- a/core/sys/info/platform_linux.odin +++ b/core/sys/info/platform_linux.odin @@ -100,8 +100,8 @@ _ram_stats :: proc() -> (total_ram, free_ram, total_swap, free_swap: i64, ok: bo } meminfo := string(meminfo_buf[:n]) - // Stuff needed as a failsafe for later in the event MemAvailable is being broken - mem_free, buffers, cached, shmem, s_reclaimable: i64 + // Fallback in the event MemAvailable is not found or is invalid in its value + mem_free: i64 for line in strings.split_lines_iterator(&meminfo) { if len(line) == 0 { @@ -132,19 +132,14 @@ _ram_stats :: proc() -> (total_ram, free_ram, total_swap, free_swap: i64, ok: bo total_swap = value case "SwapFree": free_swap = value - case "Buffers": - buffers = value - case "Cached": - cached = value - case "Shmem": - shmem = value - case "SReclaimable": - s_reclaimable = value } } if free_ram == 0 || free_ram > total_ram { - free_ram = mem_free + buffers + cached + s_reclaimable - shmem + // We opt to return MemFree here if MemAvailable is not found or is broken to come degree. + // This will act as a predictable fallback, but shouldn't ever really occur unless the user + // is on Linux < 3.14 + free_ram = mem_free } mem_unit :: 1024 @@ -152,6 +147,7 @@ _ram_stats :: proc() -> (total_ram, free_ram, total_swap, free_swap: i64, ok: bo free_ram *= mem_unit total_swap *= mem_unit free_swap *= mem_unit + ok = true return From 962f8dfd1b13f12d21013a55d820b93318ac84d9 Mon Sep 17 00:00:00 2001 From: "Alexander Cusaac (MightyChubz)" Date: Wed, 3 Jun 2026 16:47:37 -0400 Subject: [PATCH 123/228] refactor: Add fallback to `sysinfo()` if `/proc/meminfo` can't be read This is likely to never _actually_ execute, and the possibility of this failing is extremely slim, but if this _does_ fail, then this fallback should catch it, as long as I'm understanding things correctly. If the fallback fails, we just go back to the original assert that existed before. --- core/sys/info/platform_linux.odin | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/core/sys/info/platform_linux.odin b/core/sys/info/platform_linux.odin index 7ef58cbb6..a693e92fc 100644 --- a/core/sys/info/platform_linux.odin +++ b/core/sys/info/platform_linux.odin @@ -86,8 +86,21 @@ _ram_stats :: proc() -> (total_ram, free_ram, total_swap, free_swap: i64, ok: bo fd, errno := linux.open("/proc/meminfo", {}) if errno != .NONE { // This should never happen since something would be wrong with the system - // if /proc/meminfo wasn't able to be opened for any reason - return 0, 0, 0, 0, false + // if /proc/meminfo wasn't able to be opened for any reason. But, in the + // event that this _does_ happen, let's just try to recover through the + // syscall + sys_info: linux.Sys_Info + sysinfo_errno := linux.sysinfo(&sys_info) + assert_contextless(sysinfo_errno == .NONE, "If this has failed, there is no recovery from this") + + total_ram = i64(sys_info.totalram) * i64(sys_info.mem_unit) + free_ram = i64(sys_info.freeram) * i64(sys_info.mem_unit) + total_swap = i64(sys_info.totalswap) * i64(sys_info.mem_unit) + free_swap = i64(sys_info.freeswap) * i64(sys_info.mem_unit) + + ok = true + + return } defer linux.close(fd) @@ -96,7 +109,18 @@ _ram_stats :: proc() -> (total_ram, free_ram, total_swap, free_swap: i64, ok: bo meminfo_buf: [4096]u8 n, read_errno := linux.read(fd, meminfo_buf[:]) if read_errno != .NONE { - return 0, 0, 0, 0, false + sys_info: linux.Sys_Info + sysinfo_errno := linux.sysinfo(&sys_info) + assert_contextless(sysinfo_errno == .NONE, "If this has failed, there is no recovery from this") + + total_ram = i64(sys_info.totalram) * i64(sys_info.mem_unit) + free_ram = i64(sys_info.freeram) * i64(sys_info.mem_unit) + total_swap = i64(sys_info.totalswap) * i64(sys_info.mem_unit) + free_swap = i64(sys_info.freeswap) * i64(sys_info.mem_unit) + + ok = true + + return } meminfo := string(meminfo_buf[:n]) From 26f824eb8e45352ba47d238dad0acf4f1d7568ca Mon Sep 17 00:00:00 2001 From: "Alexander Cusaac (MightyChubz)" Date: Wed, 3 Jun 2026 16:52:58 -0400 Subject: [PATCH 124/228] docs: Updated comment to explain approach more accurately --- core/sys/info/platform_linux.odin | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/sys/info/platform_linux.odin b/core/sys/info/platform_linux.odin index a693e92fc..b7a03efb8 100644 --- a/core/sys/info/platform_linux.odin +++ b/core/sys/info/platform_linux.odin @@ -81,8 +81,10 @@ _os_version :: proc (allocator: runtime.Allocator, loc := #caller_location) -> ( @(private) _ram_stats :: proc() -> (total_ram, free_ram, total_swap, free_swap: i64, ok: bool) { - // The approach is to read /proc/meminfo for the memory information _over_ sysinfo(), - // since sysinfo() just returns MemFree over the value we actually want, MemAvailable. + // The approach is to read /proc/meminfo for the memory information. We do this over + // reading sysinfo() since sysinfo() only returns MemFree, which is based on the amount + // of free pages. The value we actually want is MemAvailable inside meminfo since it is + // estimated around being about to evict things out of the page cache. fd, errno := linux.open("/proc/meminfo", {}) if errno != .NONE { // This should never happen since something would be wrong with the system From c9621748a43ece987ce75d09cd6650335cdf4cb4 Mon Sep 17 00:00:00 2001 From: "Alexander Cusaac (MightyChubz)" Date: Wed, 3 Jun 2026 16:55:28 -0400 Subject: [PATCH 125/228] typo oops --- core/sys/info/platform_linux.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sys/info/platform_linux.odin b/core/sys/info/platform_linux.odin index b7a03efb8..5901abd67 100644 --- a/core/sys/info/platform_linux.odin +++ b/core/sys/info/platform_linux.odin @@ -162,7 +162,7 @@ _ram_stats :: proc() -> (total_ram, free_ram, total_swap, free_swap: i64, ok: bo } if free_ram == 0 || free_ram > total_ram { - // We opt to return MemFree here if MemAvailable is not found or is broken to come degree. + // We opt to return MemFree here if MemAvailable is not found or is broken to some degree. // This will act as a predictable fallback, but shouldn't ever really occur unless the user // is on Linux < 3.14 free_ram = mem_free From 2cc0f8f6dc64649eb1492a752f8891a42b518d78 Mon Sep 17 00:00:00 2001 From: mlgudi Date: Thu, 4 Jun 2026 02:03:00 +0100 Subject: [PATCH 126/228] Fix compiler assertion failure caused by comparison of array-backed bit_fields --- src/llvm_backend_expr.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index fd148e5c5..926dbcd95 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -3450,6 +3450,10 @@ gb_internal lbValue lb_emit_comp(lbProcedure *p, TokenKind op_kind, lbValue left } if (is_type_array_like(a)) { Type *tl = base_type(a); + if (is_type_bit_field(left.type)) { + left = lb_emit_transmute(p, left, tl); + right = lb_emit_transmute(p, right, tl); + } lbValue lhs = lb_address_from_load_or_generate_local(p, left); lbValue rhs = lb_address_from_load_or_generate_local(p, right); From 7ba07860bb0a34bd950e4398ee74393e5e7f5532 Mon Sep 17 00:00:00 2001 From: mlgudi Date: Thu, 4 Jun 2026 03:20:03 +0100 Subject: [PATCH 127/228] Rearrange `lb_emit_comp` `is_type_array_like` branch to avoid unnecessary transmutes for `bit_field`s taking the non-inline path --- src/llvm_backend_expr.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 926dbcd95..6317e6139 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -3450,7 +3450,8 @@ gb_internal lbValue lb_emit_comp(lbProcedure *p, TokenKind op_kind, lbValue left } if (is_type_array_like(a)) { Type *tl = base_type(a); - if (is_type_bit_field(left.type)) { + bool inline_array_arith = lb_can_try_to_inline_array_arith(tl); + if (inline_array_arith && is_type_bit_field(left.type)) { left = lb_emit_transmute(p, left, tl); right = lb_emit_transmute(p, right, tl); } @@ -3468,7 +3469,6 @@ gb_internal lbValue lb_emit_comp(lbProcedure *p, TokenKind op_kind, lbValue left cmp_op = Token_And; } - bool inline_array_arith = lb_can_try_to_inline_array_arith(tl); i32 count = 0; switch (tl->kind) { case Type_Array: count = cast(i32)tl->Array.count; break; From 9942625c63e6757b9a67d12e59726a46df86734e Mon Sep 17 00:00:00 2001 From: "Alexander Cusaac (MightyChubz)" Date: Thu, 4 Jun 2026 13:17:42 -0400 Subject: [PATCH 128/228] refactor: Use `default_context()` over removing `"contextless"` --- core/sys/info/platform_linux.odin | 5 ++++- core/sys/info/sysinfo.odin | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/core/sys/info/platform_linux.odin b/core/sys/info/platform_linux.odin index 5901abd67..ed476a9cd 100644 --- a/core/sys/info/platform_linux.odin +++ b/core/sys/info/platform_linux.odin @@ -80,7 +80,10 @@ _os_version :: proc (allocator: runtime.Allocator, loc := #caller_location) -> ( } @(private) -_ram_stats :: proc() -> (total_ram, free_ram, total_swap, free_swap: i64, ok: bool) { +_ram_stats :: proc "contextless" () -> (total_ram, free_ram, total_swap, free_swap: i64, ok: bool) { + // This is here for some of the strings procedures + context = runtime.default_context() + // The approach is to read /proc/meminfo for the memory information. We do this over // reading sysinfo() since sysinfo() only returns MemFree, which is based on the amount // of free pages. The value we actually want is MemAvailable inside meminfo since it is diff --git a/core/sys/info/sysinfo.odin b/core/sys/info/sysinfo.odin index 5be40a3a8..ad120b264 100644 --- a/core/sys/info/sysinfo.odin +++ b/core/sys/info/sysinfo.odin @@ -59,7 +59,7 @@ Returns: - free_swap: Free SWAP reported by the operating system, in bytes - ok: `true` when we could retrieve RAM statistics, `false` otherwise */ -ram_stats :: proc() -> (total_ram, free_ram, total_swap, free_swap: i64, ok: bool) { +ram_stats :: proc "contextless" () -> (total_ram, free_ram, total_swap, free_swap: i64, ok: bool) { return _ram_stats() } From 05f053996050f7b69e16f8b9a4c4c63f19bf0f41 Mon Sep 17 00:00:00 2001 From: "Alexander Cusaac (MightyChubz)" Date: Thu, 4 Jun 2026 13:21:27 -0400 Subject: [PATCH 129/228] refactor: Move `mem_unit` before loop and apply it in switch statement --- core/sys/info/platform_linux.odin | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/core/sys/info/platform_linux.odin b/core/sys/info/platform_linux.odin index ed476a9cd..eef77afa0 100644 --- a/core/sys/info/platform_linux.odin +++ b/core/sys/info/platform_linux.odin @@ -132,6 +132,7 @@ _ram_stats :: proc "contextless" () -> (total_ram, free_ram, total_swap, free_sw // Fallback in the event MemAvailable is not found or is invalid in its value mem_free: i64 + mem_unit :: 1024 for line in strings.split_lines_iterator(&meminfo) { if len(line) == 0 { continue @@ -152,15 +153,15 @@ _ram_stats :: proc "contextless" () -> (total_ram, free_ram, total_swap, free_sw switch key { case "MemTotal": - total_ram = value + total_ram = value * mem_unit case "MemFree": - mem_free = value + mem_free = value * mem_unit case "MemAvailable": - free_ram = value + free_ram = value * mem_unit case "SwapTotal": - total_swap = value + total_swap = value * mem_unit case "SwapFree": - free_swap = value + free_swap = value * mem_unit } } @@ -171,12 +172,6 @@ _ram_stats :: proc "contextless" () -> (total_ram, free_ram, total_swap, free_sw free_ram = mem_free } - mem_unit :: 1024 - total_ram *= mem_unit - free_ram *= mem_unit - total_swap *= mem_unit - free_swap *= mem_unit - ok = true return From f735e794a6ddaabe4289834783f562a13b2c9560 Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Thu, 4 Jun 2026 16:03:45 -0400 Subject: [PATCH 130/228] [checker] disallow `*` and `/` for bit sets --- src/check_expr.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 8681d22ba..c373c2738 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -2131,6 +2131,10 @@ gb_internal bool check_binary_op(CheckerContext *c, Operand *o, Token op) { /*fallthrough*/ case Token_Mul: case Token_MulEq: + if (is_type_bit_set(type)) { + error(op, "Operator '%.*s' is not allowed with bit sets", LIT(op.string)); + return false; + } case Token_AddEq: if (is_type_bit_set(type)) { return true; From 99992e092f3adaf37854a5c47ccf001ec8cb0c21 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 5 Jun 2026 10:15:51 +0100 Subject: [PATCH 131/228] Fix constant array spreading for unions of constants --- src/llvm_backend_const.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index b5429ae19..eedcfd896 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -678,13 +678,13 @@ LLVMValueRef llvm_const_pad_to_size(lbModule *m, LLVMValueRef val, LLVMTypeRef d } #endif -gb_internal void lb_const_array_spread(lbModule *m, lbConstContext cc, Type *array, ExactValue value, lbValue *res) { +gb_internal void lb_const_array_spread(lbModule *m, lbConstContext cc, Type *array, ExactValue value, lbValue *res, Type *value_type) { GB_ASSERT(array->kind == Type_Array); i64 count = array->Array.count; Type *elem = array->Array.elem; - lbValue single_elem = lb_const_value(m, elem, value, cc); + lbValue single_elem = lb_const_value(m, elem, value, cc, value_type); LLVMValueRef *elems = gb_alloc_array(permanent_allocator(), LLVMValueRef, cast(isize)count); for (i64 i = 0; i < count; i++) { @@ -1061,7 +1061,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb value.kind != ExactValue_Invalid && value.kind != ExactValue_Compound) { - lb_const_array_spread(m, cc, type, value, &res); + lb_const_array_spread(m, cc, type, value, &res, value_type); return res; } else if (is_type_matrix(type) && value.kind != ExactValue_Invalid && From 8d1d126e16ee515a7d0bbce5aba2711e216c906d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 5 Jun 2026 10:19:55 +0100 Subject: [PATCH 132/228] Rearrange context and value_type values of `lb_const_value` --- src/llvm_backend.cpp | 2 +- src/llvm_backend.hpp | 2 +- src/llvm_backend_const.cpp | 66 +++++++++++++++++++------------------- src/llvm_backend_expr.cpp | 10 +++--- src/llvm_backend_stmt.cpp | 2 +- 5 files changed, 41 insertions(+), 41 deletions(-) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 488c84099..40aceb7fe 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -3421,7 +3421,7 @@ gb_internal bool lb_generate_code(lbGenerator *gen) { cc.link_section = e->Variable.link_section; ExactValue v = tav.value; - lbValue init = lb_const_value(m, e->type, v, cc, tav.type); + lbValue init = lb_const_value(m, e->type, v, tav.type, cc); LLVMDeleteGlobal(g.value); diff --git a/src/llvm_backend.hpp b/src/llvm_backend.hpp index e4297300f..fb8d0f89a 100644 --- a/src/llvm_backend.hpp +++ b/src/llvm_backend.hpp @@ -446,7 +446,7 @@ static lbConstContext const LB_CONST_CONTEXT_DEFAULT_NO_LOCAL = {false, false, { gb_internal lbValue lb_const_nil(lbModule *m, Type *type); gb_internal lbValue lb_const_undef(lbModule *m, Type *type); -gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lbConstContext cc = LB_CONST_CONTEXT_DEFAULT, Type *value_type=nullptr); +gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, Type *value_type=nullptr, lbConstContext cc = LB_CONST_CONTEXT_DEFAULT); gb_internal lbValue lb_const_bool(lbModule *m, Type *type, bool value); gb_internal lbValue lb_const_int(lbModule *m, Type *type, u64 value); diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index eedcfd896..0f0d458dc 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -684,7 +684,7 @@ gb_internal void lb_const_array_spread(lbModule *m, lbConstContext cc, Type *arr i64 count = array->Array.count; Type *elem = array->Array.elem; - lbValue single_elem = lb_const_value(m, elem, value, cc, value_type); + lbValue single_elem = lb_const_value(m, elem, value, value_type, cc); LLVMValueRef *elems = gb_alloc_array(permanent_allocator(), LLVMValueRef, cast(isize)count); for (i64 i = 0; i < count; i++) { @@ -716,7 +716,7 @@ gb_internal LLVMValueRef lb_fill_fixed_capacity_dynamic_array(lbModule *m, i64 e return llvm_const_named_struct(m, original_type, svalues, svalue_count); } -gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lbConstContext cc, Type *value_type) { +gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, Type *value_type, lbConstContext cc) { if (cc.allow_local) { cc.is_rodata = false; } @@ -756,7 +756,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb } Type *t = bt->Union.variants[0]; - lbValue cv = lb_const_value(m, t, value, cc); + lbValue cv = lb_const_value(m, t, value, value_type, cc); GB_ASSERT(LLVMIsConstant(cv.value)); LLVMTypeRef llvm_type = lb_type(m, original_type); @@ -817,7 +817,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb GB_PANIC("%s vs %s", type_to_string(value_type), type_to_string(original_type)); } - lbValue cv = lb_const_value(m, value_type, value, cc, value_type); + lbValue cv = lb_const_value(m, value_type, value, value_type, cc); Type *variant_type = cv.type; LLVMValueRef values[4] = {}; @@ -922,7 +922,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb count = gb_max(cast(isize)cl->max_count, count); Type *elem = base_type(type)->Slice.elem; Type *t = alloc_type_array(elem, count); - lbValue backing_array = lb_const_value(m, t, value, cc, nullptr); + lbValue backing_array = lb_const_value(m, t, value, nullptr, cc); LLVMValueRef array_data = nullptr; @@ -1072,7 +1072,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb Type *elem = type->Matrix.elem; - lbValue single_elem = lb_const_value(m, elem, value, cc); + lbValue single_elem = lb_const_value(m, elem, value, value_type, cc); single_elem.value = llvm_const_cast(m, single_elem.value, lb_type(m, elem), /*failure_*/nullptr); i64 total_elem_count = matrix_type_total_internal_elems(type); @@ -1094,7 +1094,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb i64 count = type->SimdVector.count; Type *elem = type->SimdVector.elem; - lbValue single_elem = lb_const_value(m, elem, value, cc); + lbValue single_elem = lb_const_value(m, elem, value, value_type, cc); single_elem.value = llvm_const_cast(m, single_elem.value, lb_type(m, elem), /*failure_*/nullptr); LLVMValueRef *elems = gb_alloc_array(permanent_allocator(), LLVMValueRef, count); @@ -1279,7 +1279,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb case ExactValue_Compound: if (is_type_slice(type)) { - return lb_const_value(m, type, value, cc); + return lb_const_value(m, type, value, value_type, cc); } else if (is_type_soa_struct(type)) { GB_ASSERT(type->kind == Type_Struct); GB_ASSERT(type->Struct.soa_kind == StructSoa_Fixed); @@ -1320,7 +1320,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb } if (lo == i) { TypeAndValue tav = fv->value->tav; - LLVMValueRef val = lb_const_value(m, elem_type, tav.value, cc, tav.type).value; + LLVMValueRef val = lb_const_value(m, elem_type, tav.value, tav.type, cc).value; for (i64 k = lo; k < hi; k++) { aos_values[value_index++] = val; } @@ -1335,7 +1335,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb i64 index = exact_value_to_i64(index_tav.value); if (index == i) { TypeAndValue tav = fv->value->tav; - LLVMValueRef val = lb_const_value(m, elem_type, tav.value, cc, tav.type).value; + LLVMValueRef val = lb_const_value(m, elem_type, tav.value, tav.type, cc).value; aos_values[value_index++] = val; found = true; break; @@ -1388,7 +1388,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb for (isize i = 0; i < elem_count; i++) { TypeAndValue tav = cl->elems[i]->tav; GB_ASSERT(tav.mode != Addressing_Invalid); - aos_values[i] = lb_const_value(m, elem_type, tav.value, cc, tav.type).value; + aos_values[i] = lb_const_value(m, elem_type, tav.value, tav.type, cc).value; } for (isize i = elem_count; i < type->Struct.soa_count; i++) { aos_values[i] = nullptr; @@ -1455,7 +1455,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb } if (lo == i) { TypeAndValue tav = fv->value->tav; - LLVMValueRef val = lb_const_value(m, elem_type, tav.value, cc, tav.type).value; + LLVMValueRef val = lb_const_value(m, elem_type, tav.value, tav.type, cc).value; for (i64 k = lo; k < hi; k++) { values[value_index++] = val; } @@ -1470,7 +1470,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb i64 index = exact_value_to_i64(index_tav.value); if (index == i) { TypeAndValue tav = fv->value->tav; - LLVMValueRef val = lb_const_value(m, elem_type, tav.value, cc, tav.type).value; + LLVMValueRef val = lb_const_value(m, elem_type, tav.value, tav.type, cc).value; values[value_index++] = val; found = true; break; @@ -1490,7 +1490,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb LLVMValueRef* values = gb_alloc_array(temporary_allocator(), LLVMValueRef, cast(isize)type->Array.count); for (isize i = 0; i < type->Array.count; i++) { - values[i] = lb_const_value(m, elem_type, value, cc, elem_type).value; + values[i] = lb_const_value(m, elem_type, value, elem_type, cc).value; } res.value = lb_build_constant_array_values(m, type, elem_type, cast(isize)type->Array.count, values, cc); @@ -1508,7 +1508,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb if (is_type_tuple(tav.type)) { elem_index += tav.type->Tuple.variables.count; } else { - values[elem_index++] = lb_const_value(m, elem_type, tav.value, cc, tav.type).value; + values[elem_index++] = lb_const_value(m, elem_type, tav.value, tav.type, cc).value; } } for (isize i = 0; i < type->Array.count; i++) { @@ -1557,7 +1557,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb } if (lo == i) { TypeAndValue tav = fv->value->tav; - LLVMValueRef val = lb_const_value(m, elem_type, tav.value, cc, tav.type).value; + LLVMValueRef val = lb_const_value(m, elem_type, tav.value, tav.type, cc).value; for (i64 k = lo; k < hi; k++) { values[value_index++] = val; } @@ -1572,7 +1572,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb i64 index = exact_value_to_i64(index_tav.value); if (index == i) { TypeAndValue tav = fv->value->tav; - LLVMValueRef val = lb_const_value(m, elem_type, tav.value, cc, tav.type).value; + LLVMValueRef val = lb_const_value(m, elem_type, tav.value, tav.type, cc).value; values[value_index++] = val; found = true; break; @@ -1600,7 +1600,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb if (is_type_tuple(tav.type)) { elem_index += tav.type->Tuple.variables.count; } else { - values[elem_index++] = lb_const_value(m, elem_type, tav.value, cc, tav.type).value; + values[elem_index++] = lb_const_value(m, elem_type, tav.value, tav.type, cc).value; } } for (isize i = 0; i < type->EnumeratedArray.count; i++) { @@ -1649,7 +1649,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb if (lo == i) { TypeAndValue tav = fv->value->tav; - LLVMValueRef val = lb_const_value(m, elem_type, tav.value, cc, tav.type).value; + LLVMValueRef val = lb_const_value(m, elem_type, tav.value, tav.type, cc).value; for (i64 k = lo; k < hi; k++) { values[value_index++] = val; } @@ -1667,7 +1667,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb if (index == i) { TypeAndValue tav = fv->value->tav; - LLVMValueRef val = lb_const_value(m, elem_type, tav.value, cc, tav.type).value; + LLVMValueRef val = lb_const_value(m, elem_type, tav.value, tav.type, cc).value; values[value_index++] = val; found = true; break; @@ -1691,7 +1691,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb LLVMValueRef* values = gb_alloc_array(temporary_allocator(), LLVMValueRef, cast(isize)capacity); for (isize i = 0; i < capacity; i++) { - values[i] = lb_const_value(m, elem_type, value, cc, elem_type).value; + values[i] = lb_const_value(m, elem_type, value, elem_type, cc).value; } res.value = lb_fill_fixed_capacity_dynamic_array(m, capacity, original_type, values, cc); @@ -1709,7 +1709,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb if (is_type_tuple(tav.type)) { elem_index += tav.type->Tuple.variables.count; } else { - values[elem_index++] = lb_const_value(m, elem_type, tav.value, cc, tav.type).value; + values[elem_index++] = lb_const_value(m, elem_type, tav.value, tav.type, cc).value; } } for (isize i = 0; i < capacity; i++) { @@ -1757,7 +1757,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb } if (lo == i) { TypeAndValue tav = fv->value->tav; - LLVMValueRef val = lb_const_value(m, elem_type, tav.value, cc, tav.type).value; + LLVMValueRef val = lb_const_value(m, elem_type, tav.value, tav.type, cc).value; for (i64 k = lo; k < hi; k++) { values[value_index++] = val; } @@ -1772,7 +1772,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb i64 index = exact_value_to_i64(index_tav.value); if (index == i) { TypeAndValue tav = fv->value->tav; - LLVMValueRef val = lb_const_value(m, elem_type, tav.value, cc, tav.type).value; + LLVMValueRef val = lb_const_value(m, elem_type, tav.value, tav.type, cc).value; values[value_index++] = val; found = true; break; @@ -1791,7 +1791,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb for (isize i = 0; i < elem_count; i++) { TypeAndValue tav = cl->elems[i]->tav; GB_ASSERT(tav.mode != Addressing_Invalid); - values[i] = lb_const_value(m, elem_type, tav.value, cc, tav.type).value; + values[i] = lb_const_value(m, elem_type, tav.value, tav.type, cc).value; } LLVMTypeRef et = lb_type(m, elem_type); @@ -1821,7 +1821,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb TypeAndValue tav = fv->value->tav; if (tav.value.kind != ExactValue_Invalid) { - lbValue value = lb_const_value(m, f->type, tav.value, cc, f->type); + lbValue value = lb_const_value(m, f->type, tav.value, f->type, cc); LLVMValueRef values[2]; unsigned value_count = 0; @@ -1874,7 +1874,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb i32 index = field_remapping[f->Variable.field_index]; if (elem_type_can_be_constant(f->type)) { if (sel.index.count == 1) { - lbValue value = lb_const_value(m, f->type, tav.value, cc, tav.type); + lbValue value = lb_const_value(m, f->type, tav.value, tav.type, cc); LLVMTypeRef value_type = LLVMTypeOf(value.value); GB_ASSERT_MSG(lb_sizeof(value_type) == type_size_of(f->type), "%s vs %s", LLVMPrintTypeToString(value_type), type_to_string(f->type)); values[index] = value.value; @@ -1883,7 +1883,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb if (!visited[index]) { auto new_cc = cc; new_cc.allow_local = false; - values[index] = lb_const_value(m, f->type, {}, new_cc).value; + values[index] = lb_const_value(m, f->type, {}, nullptr, new_cc).value; visited[index] = true; } @@ -1923,7 +1923,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb } } if (is_constant) { - LLVMValueRef elem_value = lb_const_value(m, tav.type, tav.value, cc, tav.type).value; + LLVMValueRef elem_value = lb_const_value(m, tav.type, tav.value, tav.type, cc).value; if (LLVMIsConstant(elem_value) && LLVMIsConstant(values[index])) { values[index] = llvm_const_insert_value(m, values[index], elem_value, idx_list, idx_list_len); } else if (is_local) { @@ -1977,7 +1977,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb i32 index = field_remapping[f->Variable.field_index]; if (elem_type_can_be_constant(f->type)) { - lbValue value = lb_const_value(m, f->type, tav.value, cc, tav.type); + lbValue value = lb_const_value(m, f->type, tav.value, tav.type, cc); LLVMTypeRef value_type = LLVMTypeOf(value.value); GB_ASSERT_MSG(lb_sizeof(value_type) == type_size_of(f->type), "%s vs %s", LLVMPrintTypeToString(value_type), type_to_string(f->type)); values[index] = value.value; @@ -2116,7 +2116,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb TypeAndValue tav = fv->value->tav; - LLVMValueRef val = lb_const_value(m, elem_type, tav.value, cc, tav.type).value; + LLVMValueRef val = lb_const_value(m, elem_type, tav.value, tav.type, cc).value; for (i64 k = lo; k < hi; k++) { i64 offset = matrix_row_major_index_to_offset(type, k); GB_ASSERT(values[offset] == nullptr); @@ -2128,7 +2128,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb i64 index = exact_value_to_i64(index_tav.value); GB_ASSERT(index < max_count); TypeAndValue tav = fv->value->tav; - LLVMValueRef val = lb_const_value(m, elem_type, tav.value, cc, tav.type).value; + LLVMValueRef val = lb_const_value(m, elem_type, tav.value, tav.type, cc).value; i64 offset = matrix_row_major_index_to_offset(type, index); GB_ASSERT(values[offset] == nullptr); values[offset] = val; @@ -2152,7 +2152,7 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, lb GB_ASSERT(tav.mode != Addressing_Invalid); i64 offset = 0; offset = matrix_row_major_index_to_offset(type, i); - values[offset] = lb_const_value(m, elem_type, tav.value, cc, tav.type).value; + values[offset] = lb_const_value(m, elem_type, tav.value, tav.type, cc).value; } for (isize i = 0; i < total_count; i++) { if (values[i] == nullptr) { diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 6317e6139..71a458383 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -3149,7 +3149,7 @@ gb_internal lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) { Type *elem = base_array_type(dst); lbValue e = lb_emit_conv(p, value, elem); lbAddr v = lb_add_local_generated(p, t, false); - lbValue zero = lb_const_value(p->module, elem, exact_value_i64(0), LB_CONST_CONTEXT_DEFAULT_ALLOW_LOCAL); + lbValue zero = lb_const_value(p->module, elem, exact_value_i64(0), elem, LB_CONST_CONTEXT_DEFAULT_ALLOW_LOCAL); for (i64 j = 0; j < dst->Matrix.column_count; j++) { for (i64 i = 0; i < dst->Matrix.row_count; i++) { lbValue ptr = lb_emit_matrix_epi(p, v.addr, i, j); @@ -3186,7 +3186,7 @@ gb_internal lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) { lb_emit_store(p, d, s); } else if (i == j) { lbValue d = lb_emit_matrix_epi(p, v.addr, i, j); - lbValue s = lb_const_value(p->module, dst->Matrix.elem, exact_value_i64(1), LB_CONST_CONTEXT_DEFAULT_ALLOW_LOCAL); + lbValue s = lb_const_value(p->module, dst->Matrix.elem, exact_value_i64(1), dst->Matrix.elem, LB_CONST_CONTEXT_DEFAULT_ALLOW_LOCAL); lb_emit_store(p, d, s); } } @@ -4425,7 +4425,7 @@ gb_internal lbValue lb_build_expr_internal(lbProcedure *p, Ast *expr) { if (tv.value.kind != ExactValue_Invalid) { Type *original_type = lb_build_expr_original_const_type(expr); // NOTE(bill): Short on constant values - return lb_const_value(p->module, type, tv.value, LB_CONST_CONTEXT_DEFAULT_ALLOW_LOCAL, original_type); + return lb_const_value(p->module, type, tv.value, original_type, LB_CONST_CONTEXT_DEFAULT_ALLOW_LOCAL); } else if (tv.mode == Addressing_Type) { // NOTE(bill, 2023-01-16): is this correct? I hope so at least return lb_typeid(m, tv.type); @@ -4506,7 +4506,7 @@ gb_internal lbValue lb_build_expr_internal(lbProcedure *p, Ast *expr) { TypeAndValue tav = type_and_value_of_expr(expr); GB_ASSERT(tav.mode == Addressing_Constant); - return lb_const_value(p->module, type, tv.value, LB_CONST_CONTEXT_DEFAULT_ALLOW_LOCAL, tv.type); + return lb_const_value(p->module, type, tv.value, tv.type, LB_CONST_CONTEXT_DEFAULT_ALLOW_LOCAL); case_end; case_ast_node(se, SelectorCallExpr, expr); @@ -4812,7 +4812,7 @@ gb_internal lbAddr lb_build_addr_from_entity(lbProcedure *p, Entity *e, Ast *exp GB_ASSERT(e != nullptr); if (e->kind == Entity_Constant) { Type *t = default_type(type_of_expr(expr)); - lbValue v = lb_const_value(p->module, t, e->Constant.value, LB_CONST_CONTEXT_DEFAULT_NO_LOCAL, e->type); + lbValue v = lb_const_value(p->module, t, e->Constant.value, e->type, LB_CONST_CONTEXT_DEFAULT_NO_LOCAL); if (LLVMIsConstant(v.value)) { lbAddr g = lb_add_global_generated_from_procedure(p, t, v); return g; diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index fe09b26c8..54447820a 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -2385,7 +2385,7 @@ gb_internal void lb_build_static_variables(lbProcedure *p, AstValueDecl *vd) { if (e->Variable.is_rodata) { cc.is_rodata = true; } - value = lb_const_value(p->module, ast_value->tav.type, ast_value->tav.value, cc); + value = lb_const_value(p->module, ast_value->tav.type, ast_value->tav.value, nullptr, cc); } String mangled_name = {}; From f14071bd14f11915f1985e88969bd17a1850c019 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 5 Jun 2026 14:13:08 +0100 Subject: [PATCH 133/228] Fix `transmute` corrupting a compile time constant --- src/check_expr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index c373c2738..7afb7808c 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -3948,7 +3948,7 @@ gb_internal bool check_transmute(CheckerContext *c, Ast *node, Operand *o, Type if (types_have_same_internal_endian(src_t, dst_t)) { ExactValue src_v = exact_value_to_integer(o->value); GB_ASSERT(src_v.kind == ExactValue_Integer || src_v.kind == ExactValue_Invalid); - BigInt v = src_v.value_integer; + BigInt v = big_int_make(&src_v.value_integer); BigInt smax = {}; BigInt umax = {}; From 23f57a4328ac73c2a5ec02d6e17157d542f9619b Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Fri, 5 Jun 2026 21:07:36 +0200 Subject: [PATCH 134/228] nbio(posix): fix wake_up error when the event loop hasn't ticked yet --- core/nbio/impl_posix.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/core/nbio/impl_posix.odin b/core/nbio/impl_posix.odin index da72ed1fd..05fe584ba 100644 --- a/core/nbio/impl_posix.odin +++ b/core/nbio/impl_posix.odin @@ -120,6 +120,7 @@ _init :: proc(l: ^Event_Loop, allocator: mem.Allocator) -> (rerr: General_Error) filter = .User, flags = {.Add, .Enable, .Clear}, }) + __tick(l, 0) // Tick to enqueue wake up, allowing wake ups before the user's first tick. return nil } From 1b07372547e4ec493b604746ad5ca6af5443a1b2 Mon Sep 17 00:00:00 2001 From: lualvsil Date: Fri, 5 Jun 2026 23:23:50 -0300 Subject: [PATCH 135/228] AArch64 assembly support for foreign import --- src/linker.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/linker.cpp b/src/linker.cpp index 50bb4e524..f32d7ead9 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -562,6 +562,19 @@ try_cross_linking:; LIT(obj_file), LIT(build_context.extra_assembler_flags) ); + } else if (build_context.metrics.arch == TargetArch_arm64) { + result = system_exec_command_line_app("clang", + "%s \"%.*s\" " + "-c -o \"%.*s\" " + "-target %.*s " + "%.*s " + "", + clang_path, + LIT(asm_file), + LIT(obj_file), + LIT(build_context.metrics.target_triplet), + LIT(build_context.extra_assembler_flags) + ); } else { // Note(bumbread): I'm assuming nasm is installed on the host machine. // Shipping binaries on unix-likes gets into the weird territorry of From 77af26b5c8373d94825231f5a48a320766f11aad Mon Sep 17 00:00:00 2001 From: gco Date: Sun, 7 Jun 2026 11:22:30 +1000 Subject: [PATCH 136/228] fix buffer overflow when running a test which shrinks a dynamic array that was not the last allocation --- core/mem/rollback_stack_allocator.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/mem/rollback_stack_allocator.odin b/core/mem/rollback_stack_allocator.odin index 3f16a2897..3c98135de 100644 --- a/core/mem/rollback_stack_allocator.odin +++ b/core/mem/rollback_stack_allocator.odin @@ -344,7 +344,7 @@ rb_resize_bytes_non_zeroed :: proc( } } result = rb_alloc_bytes_non_zeroed(stack, size, alignment) or_return - runtime.mem_copy_non_overlapping(raw_data(result), ptr, old_size) + runtime.mem_copy_non_overlapping(raw_data(result), ptr, min(old_size, size)) err = rb_free(stack, ptr) return } From 43b057dfeb6cc7b1a8c7b91f13ef54b32e779e3f Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Sat, 6 Jun 2026 21:23:26 -0400 Subject: [PATCH 137/228] [linux] change default settings to enable pie and full relro --- src/build_settings.cpp | 14 ++++++++++++++ src/linker.cpp | 10 +++++++++- src/llvm_backend.cpp | 10 ---------- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index df9142c74..4d8a5a495 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -1898,6 +1898,20 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta } break; } + } else if (metrics->os == TargetOs_linux) { + if (bc->reloc_mode == RelocMode_Default) { + bc->reloc_mode = RelocMode_PIC; + } + } else if (metrics->os == TargetOs_openbsd) { + // Always use PIC for OpenBSD: it defaults to PIE + if (bc->reloc_mode == RelocMode_Default) { + bc->reloc_mode = RelocMode_PIC; + } + } else if (metrics->arch == TargetArch_riscv64) { + // NOTE(laytan): didn't seem to work without this. + if (bc->reloc_mode == RelocMode_Default) { + bc->reloc_mode = RelocMode_PIC; + } } else if (metrics->os == TargetOs_linux && subtarget == Subtarget_Android) { switch (metrics->arch) { case TargetArch_arm64: diff --git a/src/linker.cpp b/src/linker.cpp index 50bb4e524..1af78de15 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -788,7 +788,12 @@ try_cross_linking:; } if (build_context.build_mode == BuildMode_Executable && build_context.reloc_mode == RelocMode_PIC) { - // Do not disable PIE, let the linker choose. (most likely you want it enabled) + if (build_context.metrics.os == TargetOs_linux) { + // Linux does not enable PIE by default but required for ASLR + link_settings = gb_string_appendc(link_settings, "-pie "); + } else { + // Do not disable PIE, let the linker choose. (most likely you want it enabled) + } } else if (build_context.build_mode != BuildMode_DynamicLibrary) { if (build_context.metrics.os != TargetOs_openbsd && build_context.metrics.arch != TargetArch_riscv64 @@ -906,6 +911,9 @@ try_cross_linking:; // need to pass -z nobtcfi in order to allow the resulting program to run under // OpenBSD 7.4 and newer. Once support is added at compile time, this can be dropped. platform_lib_str = gb_string_appendc(platform_lib_str, "-Wl,-z,nobtcfi "); + } else if (build_context.metrics.os == TargetOs_linux) { + // required for RELRO + platform_lib_str = gb_string_appendc(platform_lib_str, "-Wl,-z,now -Wl,-z,relro "); } if (is_android) { diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 40aceb7fe..e08116736 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -3156,16 +3156,6 @@ gb_internal bool lb_generate_code(lbGenerator *gen) { switch (build_context.reloc_mode) { case RelocMode_Default: - if (build_context.metrics.os == TargetOs_openbsd) { - // Always use PIC for OpenBSD: it defaults to PIE - reloc_mode = LLVMRelocPIC; - } - - if (build_context.metrics.arch == TargetArch_riscv64) { - // NOTE(laytan): didn't seem to work without this. - reloc_mode = LLVMRelocPIC; - } - break; case RelocMode_Static: reloc_mode = LLVMRelocStatic; From d3b7251757f819a1a5f980d86b2abe1eb6c06478 Mon Sep 17 00:00:00 2001 From: "WP. Yingamphol" Date: Sun, 7 Jun 2026 20:22:12 +0700 Subject: [PATCH 138/228] Fix error message: 'do' not on the same line as 'for' --- core/odin/parser/parser.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin index 9404010da..e213f900e 100644 --- a/core/odin/parser/parser.odin +++ b/core/odin/parser/parser.odin @@ -898,7 +898,7 @@ parse_for_stmt :: proc(p: ^Parser) -> ^ast.Stmt { if allow_token(p, .Do) { body = convert_stmt_to_body(p, parse_stmt(p)) if tok.pos.line != body.pos.line { - error(p, body.pos, "the body of a 'do' must be on the same line as 'else'") + error(p, body.pos, "the body of a 'do' must be on the same line as 'for'") } } else { From 7ecaa41f4de4fe9e355fba7a7f44dcac346c25d4 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 8 Jun 2026 08:46:09 +0100 Subject: [PATCH 139/228] Fix procedures that use the DXGI `link_prefix` --- vendor/directx/dxgi/dxgi.odin | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/vendor/directx/dxgi/dxgi.odin b/vendor/directx/dxgi/dxgi.odin index 8865a5f7c..e4849f80d 100644 --- a/vendor/directx/dxgi/dxgi.odin +++ b/vendor/directx/dxgi/dxgi.odin @@ -39,10 +39,15 @@ foreign dxgi { CreateDXGIFactory :: proc(riid: ^IID, ppFactory: ^rawptr) -> HRESULT --- CreateDXGIFactory1 :: proc(riid: ^IID, ppFactory: ^rawptr) -> HRESULT --- CreateDXGIFactory2 :: proc(Flags: CREATE_FACTORY, riid: ^IID, ppFactory: ^rawptr) -> HRESULT --- - DXGIGetDebugInterface1 :: proc(Flags: u32, riid: ^IID, pDebug: ^rawptr) -> HRESULT --- +} + +@(default_calling_convention="system", link_prefix="DXGI") +foreign dxgi { + GetDebugInterface1 :: proc(Flags: u32, riid: ^IID, pDebug: ^rawptr) -> HRESULT --- DeclareAdapterRemovalSupport :: proc() -> HRESULT --- } + STANDARD_MULTISAMPLE_QUALITY_PATTERN :: 0xffffffff CENTER_MULTISAMPLE_QUALITY_PATTERN :: 0xfffffffe FORMAT_DEFINED :: 1 From 626a8e5580c6ab77beee1b87e676ac992130eb98 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 8 Jun 2026 08:54:39 +0100 Subject: [PATCH 140/228] DXGI: Correct types and alignment --- vendor/directx/dxgi/dxgi.odin | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/vendor/directx/dxgi/dxgi.odin b/vendor/directx/dxgi/dxgi.odin index e4849f80d..df8737d28 100644 --- a/vendor/directx/dxgi/dxgi.odin +++ b/vendor/directx/dxgi/dxgi.odin @@ -43,7 +43,7 @@ foreign dxgi { @(default_calling_convention="system", link_prefix="DXGI") foreign dxgi { - GetDebugInterface1 :: proc(Flags: u32, riid: ^IID, pDebug: ^rawptr) -> HRESULT --- + GetDebugInterface1 :: proc(Flags: u32, riid: ^IID, pDebug: ^rawptr) -> HRESULT --- DeclareAdapterRemovalSupport :: proc() -> HRESULT --- } @@ -586,7 +586,7 @@ ISwapChain_VTable :: struct { SetFullscreenState: proc "system" (this: ^ISwapChain, Fullscreen: BOOL, pTarget: ^IOutput) -> HRESULT, GetFullscreenState: proc "system" (this: ^ISwapChain, pFullscreen: ^BOOL, ppTarget: ^^IOutput) -> HRESULT, GetDesc: proc "system" (this: ^ISwapChain, pDesc: ^SWAP_CHAIN_DESC) -> HRESULT, - ResizeBuffers: proc "system" (this: ^ISwapChain, BufferCount: u32, Width: u32, Height: u32, NewFormat: FORMAT, SwapChainFlags: SWAP_CHAIN) -> HRESULT, + ResizeBuffers: proc "system" (this: ^ISwapChain, BufferCount: u32, Width, Height: u32, NewFormat: FORMAT, SwapChainFlags: SWAP_CHAIN) -> HRESULT, ResizeTarget: proc "system" (this: ^ISwapChain, pNewTargetParameters: ^MODE_DESC) -> HRESULT, GetContainingOutput: proc "system" (this: ^ISwapChain, ppOutput: ^^IOutput) -> HRESULT, GetFrameStatistics: proc "system" (this: ^ISwapChain, pStats: ^FRAME_STATISTICS) -> HRESULT, @@ -744,10 +744,10 @@ IOutputDuplication :: struct #raw_union { IOutputDuplication_VTable :: struct { using idxgiobject_vtable: IObject_VTable, GetDesc: proc "system" (this: ^IOutputDuplication, pDesc: ^OUTDUPL_DESC), - AcquireNextFrame: proc "system" (this: ^IOutputDuplication, TimeoutInMilliseconds: u32, pFrameInfo: ^OUTDUPL_FRAME_INFO, ppDesktopResource: ^^IResource) -> HRESULT, - GetFrameDirtyRects: proc "system" (this: ^IOutputDuplication, DirtyRectsBufferSize: u32, pDirtyRectsBuffer: ^RECT, pDirtyRectsBufferSizeRequired: ^u32) -> HRESULT, - GetFrameMoveRects: proc "system" (this: ^IOutputDuplication, MoveRectsBufferSize: u32, pMoveRectBuffer: ^OUTDUPL_MOVE_RECT, pMoveRectsBufferSizeRequired: ^u32) -> HRESULT, - GetFramePointerShape: proc "system" (this: ^IOutputDuplication, PointerShapeBufferSize: u32, pPointerShapeBuffer: rawptr, pPointerShapeBufferSizeRequired: ^u32, pPointerShapeInfo: ^OUTDUPL_POINTER_SHAPE_INFO) -> HRESULT, + AcquireNextFrame: proc "system" (this: ^IOutputDuplication, TimeoutInMilliseconds: u32, pFrameInfo: ^OUTDUPL_FRAME_INFO, ppDesktopResource: ^^IResource) -> HRESULT, + GetFrameDirtyRects: proc "system" (this: ^IOutputDuplication, DirtyRectsBufferSize: u32, pDirtyRectsBuffer: ^RECT, pDirtyRectsBufferSizeRequired: ^u32) -> HRESULT, + GetFrameMoveRects: proc "system" (this: ^IOutputDuplication, MoveRectsBufferSize: u32, pMoveRectBuffer: ^OUTDUPL_MOVE_RECT, pMoveRectsBufferSizeRequired: ^u32) -> HRESULT, + GetFramePointerShape: proc "system" (this: ^IOutputDuplication, PointerShapeBufferSize: u32, pPointerShapeBuffer: rawptr, pPointerShapeBufferSizeRequired: ^u32, pPointerShapeInfo: ^OUTDUPL_POINTER_SHAPE_INFO) -> HRESULT, MapDesktopSurface: proc "system" (this: ^IOutputDuplication, pLockedRect: ^MAPPED_RECT) -> HRESULT, UnMapDesktopSurface: proc "system" (this: ^IOutputDuplication) -> HRESULT, ReleaseFrame: proc "system" (this: ^IOutputDuplication) -> HRESULT, @@ -972,8 +972,8 @@ ISwapChain2 :: struct #raw_union { } ISwapChain2_VTable :: struct { using idxgiswapchain1_vtable: ISwapChain1_VTable, - SetSourceSize: proc "system" (this: ^ISwapChain2, Width: u32, Height: u32) -> HRESULT, - GetSourceSize: proc "system" (this: ^ISwapChain2, pWidth: ^u32, pHeight: ^u32) -> HRESULT, + SetSourceSize: proc "system" (this: ^ISwapChain2, Width, Height: u32) -> HRESULT, + GetSourceSize: proc "system" (this: ^ISwapChain2, pWidth, pHeight: ^u32) -> HRESULT, SetMaximumFrameLatency: proc "system" (this: ^ISwapChain2, MaxLatency: u32) -> HRESULT, GetMaximumFrameLatency: proc "system" (this: ^ISwapChain2, pMaxLatency: ^u32) -> HRESULT, GetFrameLatencyWaitableObject: proc "system" (this: ^ISwapChain2) -> HANDLE, @@ -1025,7 +1025,7 @@ IDecodeSwapChain_VTable :: struct { PresentBuffer: proc "system" (this: ^IDecodeSwapChain, BufferToPresent: u32, SyncInterval: u32, Flags: PRESENT) -> HRESULT, SetSourceRect: proc "system" (this: ^IDecodeSwapChain, pRect: ^RECT) -> HRESULT, SetTargetRect: proc "system" (this: ^IDecodeSwapChain, pRect: ^RECT) -> HRESULT, - SetDestSize: proc "system" (this: ^IDecodeSwapChain, Width: u32, Height: u32) -> HRESULT, + SetDestSize: proc "system" (this: ^IDecodeSwapChain, Width, Height: u32) -> HRESULT, GetSourceRect: proc "system" (this: ^IDecodeSwapChain, pRect: ^RECT) -> HRESULT, GetTargetRect: proc "system" (this: ^IDecodeSwapChain, pRect: ^RECT) -> HRESULT, GetDestSize: proc "system" (this: ^IDecodeSwapChain, pWidth: ^u32, pHeight: ^u32) -> HRESULT, @@ -1109,7 +1109,7 @@ ISwapChain3_VTable :: struct { GetCurrentBackBufferIndex: proc "system" (this: ^ISwapChain3) -> u32, CheckColorSpaceSupport: proc "system" (this: ^ISwapChain3, ColorSpace: COLOR_SPACE_TYPE, pColorSpaceSupport: ^SWAP_CHAIN_COLOR_SPACE_SUPPORT) -> HRESULT, SetColorSpace1: proc "system" (this: ^ISwapChain3, ColorSpace: COLOR_SPACE_TYPE) -> HRESULT, - ResizeBuffers1: proc "system" (this: ^ISwapChain3, BufferCount: u32, Width: u32, Height: u32, Format: FORMAT, SwapChainFlags: SWAP_CHAIN, pCreationNodeMask: ^u32, ppPresentQueue: ^^IUnknown) -> HRESULT, + ResizeBuffers1: proc "system" (this: ^ISwapChain3, BufferCount: u32, Width, Height: u32, Format: FORMAT, SwapChainFlags: SWAP_CHAIN, pCreationNodeMask: ^u32, ppPresentQueue: ^^IUnknown) -> HRESULT, } OVERLAY_COLOR_SPACE_SUPPORT :: distinct bit_set[OVERLAY_COLOR_SPACE_SUPPORT_FLAG; u32] OVERLAY_COLOR_SPACE_SUPPORT_FLAG :: enum u32 { @@ -1169,8 +1169,9 @@ IAdapter3_VTable :: struct { } OUTDUPL_FLAG :: enum i32 { - COMPOSITED_UI_CAPTURE_ONLY = 1, + COMPOSITED_UI_CAPTURE_ONLY = 0, } +OUTDUPL_FLAGS :: distinct bit_set[OUTDUPL_FLAG; i32] IOutput5_UUID_STRING :: "80A07424-AB52-42EB-833C-0C42FD282D98" @@ -1181,7 +1182,7 @@ IOutput5 :: struct #raw_union { } IOutput5_VTable :: struct { using idxgioutput4_vtable: IOutput4_VTable, - DuplicateOutput1: proc "system" (this: ^IOutput5, pDevice: ^IUnknown, Flags: u32, SupportedFormatsCount: u32, pSupportedFormats: ^FORMAT, ppOutputDuplication: ^^IOutputDuplication) -> HRESULT, + DuplicateOutput1: proc "system" (this: ^IOutput5, pDevice: ^IUnknown, Flags: OUTDUPL_FLAGS, SupportedFormatsCount: u32, pSupportedFormats: [^]FORMAT, ppOutputDuplication: ^^IOutputDuplication) -> HRESULT, } HDR_METADATA_TYPE :: enum i32 { From 7ab61e49356a55c53eb5e57579642b26581eb0f7 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 8 Jun 2026 08:57:38 +0100 Subject: [PATCH 141/228] DXGI: Add debug `fmt` for lengths in structs --- vendor/directx/dxgi/dxgi.odin | 6 +++--- vendor/directx/dxgi/dxgidebug.odin | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/vendor/directx/dxgi/dxgi.odin b/vendor/directx/dxgi/dxgi.odin index df8737d28..b3ece2984 100644 --- a/vendor/directx/dxgi/dxgi.odin +++ b/vendor/directx/dxgi/dxgi.odin @@ -30,9 +30,9 @@ SIZE :: win32.SIZE WCHAR :: win32.WCHAR DWORD :: win32.DWORD -IUnknown :: win32.IUnknown +IUnknown :: win32.IUnknown IUnknown_VTable :: win32.IUnknown_VTable -LPUNKNOWN :: win32.LPUNKNOWN +LPUNKNOWN :: win32.LPUNKNOWN @(default_calling_convention="system") foreign dxgi { @@ -841,7 +841,7 @@ SWAP_CHAIN_FULLSCREEN_DESC :: struct { PRESENT_PARAMETERS :: struct { DirtyRectsCount: u32, - pDirtyRects: [^]RECT, + pDirtyRects: [^]RECT `fmt:"v,DirtyRectsCount"`, pScrollRect: ^RECT, pScrollOffset: ^POINT, } diff --git a/vendor/directx/dxgi/dxgidebug.odin b/vendor/directx/dxgi/dxgidebug.odin index 98a92d953..46cb588fb 100644 --- a/vendor/directx/dxgi/dxgidebug.odin +++ b/vendor/directx/dxgi/dxgidebug.odin @@ -27,7 +27,7 @@ INFO_QUEUE_MESSAGE_CATEGORY :: enum u32 { MISCELLANEOUS = UNKNOWN + 1, INITIALIZATION = MISCELLANEOUS + 1, CLEANUP = INITIALIZATION + 1, - COMPILATION = CLEANUP + 1, + COMPILATION = CLEANUP + 1, STATE_CREATION = COMPILATION + 1, STATE_SETTING = STATE_CREATION + 1, STATE_GETTING = STATE_SETTING + 1, @@ -49,17 +49,17 @@ INFO_QUEUE_MESSAGE :: struct { Category: INFO_QUEUE_MESSAGE_CATEGORY, Severity: INFO_QUEUE_MESSAGE_SEVERITY, ID: INFO_QUEUE_MESSAGE_ID, - pDescription: [^]c.char, + pDescription: [^]c.char `fmt:"q,DescriptionByteLength"`, DescriptionByteLength: SIZE_T, } INFO_QUEUE_FILTER_DESC :: struct { NumCategories: UINT, - pCategoryList: [^]INFO_QUEUE_MESSAGE_CATEGORY, + pCategoryList: [^]INFO_QUEUE_MESSAGE_CATEGORY `fmt:"v,NumCategories"`, NumSeverities: UINT, - pSeverityList: [^]INFO_QUEUE_MESSAGE_SEVERITY, + pSeverityList: [^]INFO_QUEUE_MESSAGE_SEVERITY `fmt:"v,NumSeverities"`, NumIDs: UINT, - pIDList: [^]INFO_QUEUE_MESSAGE_ID, + pIDList: [^]INFO_QUEUE_MESSAGE_ID `fmt:"v,NumIDs"`, } INFO_QUEUE_FILTER :: struct { From da742fc526a47dcbd0333ea7d5b3550f38b0d52d Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Mon, 8 Jun 2026 10:58:05 -0400 Subject: [PATCH 142/228] [no-plt] enable no-plt behavior on linux arm64 and amd64 targets --- src/build_settings.cpp | 7 +++++++ src/llvm_backend.cpp | 6 ++++++ src/llvm_backend_general.cpp | 6 ++++++ src/llvm_backend_proc.cpp | 7 +++++++ 4 files changed, 26 insertions(+) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 4d8a5a495..e3d79e1b9 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -602,6 +602,7 @@ struct BuildContext { RelocMode reloc_mode; bool disable_red_zone; bool disable_unwind; + bool no_plt; isize max_error_count; @@ -1902,6 +1903,12 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta if (bc->reloc_mode == RelocMode_Default) { bc->reloc_mode = RelocMode_PIC; } + switch (metrics->arch) { + case TargetArch_arm64: + case TargetArch_amd64: + bc->no_plt = true; + break; + } } else if (metrics->os == TargetOs_openbsd) { // Always use PIC for OpenBSD: it defaults to PIE if (bc->reloc_mode == RelocMode_Default) { diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index e08116736..15ff125d4 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -2142,6 +2142,9 @@ gb_internal lbProcedure *lb_create_startup_runtime(lbModule *main_module, lbProc lbProcedure *p = lb_create_dummy_procedure(main_module, str_lit(LB_STARTUP_RUNTIME_PROC_NAME), proc_type); p->is_startup = true; + if (build_context.no_plt) { + lb_add_attribute_to_proc(p->module, p->value, "nonlazybind"); + } lb_add_attribute_to_proc(p->module, p->value, "optnone"); lb_add_attribute_to_proc(p->module, p->value, "noinline"); @@ -2162,6 +2165,9 @@ gb_internal lbProcedure *lb_create_cleanup_runtime(lbModule *main_module) { // C lbProcedure *p = lb_create_dummy_procedure(main_module, str_lit(LB_CLEANUP_RUNTIME_PROC_NAME), proc_type); p->is_startup = true; + if (build_context.no_plt) { + lb_add_attribute_to_proc(p->module, p->value, "nonlazybind"); + } lb_add_attribute_to_proc(p->module, p->value, "optnone"); lb_add_attribute_to_proc(p->module, p->value, "noinline"); diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 8068670f0..27a8c66e3 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -59,6 +59,12 @@ gb_internal WORKER_TASK_PROC(lb_init_module_worker_proc) { m->ctx = LLVMContextCreate(); m->mod = LLVMModuleCreateWithNameInContext(m->module_name, m->ctx); // m->debug_builder = nullptr; + if (build_context.no_plt) { + LLVMAddModuleFlag(m->mod, + LLVMModuleFlagBehaviorWarning, + "RtLibUseGOT", 11, + LLVMValueAsMetadata(LLVMConstInt(LLVMInt32TypeInContext(m->ctx), 1, true))); + } if (build_context.ODIN_DEBUG) { enum {DEBUG_METADATA_VERSION = 3}; diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index e26bac5c6..8738dbc9c 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -2,6 +2,9 @@ gb_internal LLVMValueRef lb_call_intrinsic(lbProcedure *p, const char *name, LLV unsigned id = LLVMLookupIntrinsicID(name, gb_strlen(name)); GB_ASSERT_MSG(id != 0, "Unable to find %s", name); LLVMValueRef ip = LLVMGetIntrinsicDeclaration(p->module->mod, id, types, type_count); + if (build_context.no_plt) { + lb_add_attribute_to_proc(p->module, ip, "nonlazybind"); + } LLVMTypeRef call_type = LLVMIntrinsicGetType(p->module->ctx, id, types, type_count); return LLVMBuildCall2(p->builder, call_type, ip, args, arg_count, ""); } @@ -153,6 +156,10 @@ gb_internal lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool i lb_ensure_abi_function_type(m, p); lb_add_function_type_attributes(p->value, p->abi_function_type, p->abi_function_type->calling_convention); + if (build_context.no_plt) { + lb_add_attribute_to_proc(m, p->value, "nonlazybind"); + } + if (build_context.disable_unwind) { lb_add_attribute_to_proc(m, p->value, "nounwind"); } From 286674a8629a1d32d90b6c0106175a80bc6a4534 Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Mon, 8 Jun 2026 10:59:32 -0400 Subject: [PATCH 143/228] [no-plt] restricted to llvm 19+ --- src/build_settings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index e3d79e1b9..f31830598 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -1906,7 +1906,7 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta switch (metrics->arch) { case TargetArch_arm64: case TargetArch_amd64: - bc->no_plt = true; + bc->no_plt = LLVM_VERSION_MAJOR >= 19; break; } } else if (metrics->os == TargetOs_openbsd) { From 671a1876001ad195d2d529216bf915d559708ba9 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 9 Jun 2026 13:25:21 +0100 Subject: [PATCH 144/228] Minor style change in intrinsics.odin --- base/intrinsics/intrinsics.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/intrinsics/intrinsics.odin b/base/intrinsics/intrinsics.odin index 635b31193..af4e20652 100644 --- a/base/intrinsics/intrinsics.odin +++ b/base/intrinsics/intrinsics.odin @@ -371,7 +371,7 @@ simd_pairwise_add :: proc(a, b: #simd[LANES]T) -> #simd[LANES]T where LANES % 2 simd_pairwise_sub :: proc(a, b: #simd[LANES]T) -> #simd[LANES]T where LANES % 2 == 0 --- simd_interleave :: proc(a, ..#simd[LANES/N]T) -> #simd[LANES]T where N >= 1 --- -simd_deinterleave :: proc(a: #simd[LANES]T, $N: uint) -> (#simd[LANES/N]T, #simd[LANES/N]T, ..., #simd[LANES/N]T) where N >= 1, LANES % N == 0 --- +simd_deinterleave :: proc(a: #simd[LANES]T, $N: uint) -> (..#simd[LANES/N]T) where N >= 1, LANES % N == 0 --- // returns N multiple vectors // Checks if the current target supports the given target features. From d80720e30dc572ac61c148f0b1904c60c65ca2e2 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 9 Jun 2026 13:25:41 +0100 Subject: [PATCH 145/228] Minor alignment change in dxcapi.odin --- vendor/directx/dxc/dxcapi.odin | 36 +++++++++++++++++----------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/vendor/directx/dxc/dxcapi.odin b/vendor/directx/dxc/dxcapi.odin index 326d3b3f3..0eb20dbfe 100644 --- a/vendor/directx/dxc/dxcapi.odin +++ b/vendor/directx/dxc/dxcapi.odin @@ -194,27 +194,27 @@ ICompiler :: struct #raw_union { ICompiler_VTable :: struct { using iunknown_vtable: IUnknown_VTable, Compile: proc "system" ( - this: ^ICompiler, - pSource: ^IBlob, - pSourceName: wstring, - pEntryPoint: wstring, - pTargetProfile: wstring, - pArguments: [^]wstring, - argCount: u32, - pDefines: [^]Define, - defineCount: u32, + this: ^ICompiler, + pSource: ^IBlob, + pSourceName: wstring, + pEntryPoint: wstring, + pTargetProfile: wstring, + pArguments: [^]wstring, + argCount: u32, + pDefines: [^]Define, + defineCount: u32, pIncludeHandler: ^IIncludeHandler, - ppResult: ^^IOperationResult) -> HRESULT, + ppResult: ^^IOperationResult) -> HRESULT, Preprocess: proc "system" ( - this: ^ICompiler, - pSource: ^IBlob, - pSourceName: wstring, - pArguments: [^]wstring, - argCount: u32, - pDefines: [^]Define, - defineCount: u32, + this: ^ICompiler, + pSource: ^IBlob, + pSourceName: wstring, + pArguments: [^]wstring, + argCount: u32, + pDefines: [^]Define, + defineCount: u32, pIncludeHandler: ^IIncludeHandler, - ppResult: ^^IOperationResult) -> HRESULT, + ppResult: ^^IOperationResult) -> HRESULT, Disassemble: proc "system" (this: ^ICompiler, pSource: ^Buffer, ppDisassembly: ^IBlobEncoding) -> HRESULT, } From 4d5288d77d466118906e5e43fb1344056bb69b05 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Wed, 10 Jun 2026 10:56:44 +0200 Subject: [PATCH 146/228] Try fix Linux nightly fail --- .github/workflows/nightly.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index ff6253d1c..5b12194e0 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -55,7 +55,7 @@ jobs: run: | docker run --rm -v "$PWD:/src" -w /src alpine sh -c ' apk add --no-cache \ - musl-dev llvm20-dev clang20 git mold lz4 \ + musl-dev llvm20-dev clang20 clang20-headers git mold lz4 \ libxml2-static llvm20-static zlib-static zstd-static \ make && git config --global --add safe.directory /src && @@ -98,7 +98,7 @@ jobs: run: | docker run --rm -v "$PWD:/src" -w /src arm64v8/alpine sh -c ' apk add --no-cache \ - musl-dev llvm20-dev clang20 git mold lz4 \ + musl-dev llvm20-dev clang20 clang20-headers git mold lz4 \ libxml2-static llvm20-static zlib-static zstd-static \ make && git config --global --add safe.directory /src && From 285f6d87bc86b17329fb23416fd512da4393885b Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Wed, 10 Jun 2026 11:00:43 +0200 Subject: [PATCH 147/228] Revert "Try fix Linux nightly fail" Didn't fix the issue. This reverts commit 4d5288d77d466118906e5e43fb1344056bb69b05. --- .github/workflows/nightly.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 5b12194e0..ff6253d1c 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -55,7 +55,7 @@ jobs: run: | docker run --rm -v "$PWD:/src" -w /src alpine sh -c ' apk add --no-cache \ - musl-dev llvm20-dev clang20 clang20-headers git mold lz4 \ + musl-dev llvm20-dev clang20 git mold lz4 \ libxml2-static llvm20-static zlib-static zstd-static \ make && git config --global --add safe.directory /src && @@ -98,7 +98,7 @@ jobs: run: | docker run --rm -v "$PWD:/src" -w /src arm64v8/alpine sh -c ' apk add --no-cache \ - musl-dev llvm20-dev clang20 clang20-headers git mold lz4 \ + musl-dev llvm20-dev clang20 git mold lz4 \ libxml2-static llvm20-static zlib-static zstd-static \ make && git config --global --add safe.directory /src && From eec141eafcb493403d61649b16ae5af34ce5f51c Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Wed, 10 Jun 2026 08:49:54 -0400 Subject: [PATCH 148/228] [nightly] fix build --- .github/workflows/nightly.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index ff6253d1c..fffcf76ef 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -53,9 +53,9 @@ jobs: lfs: true - name: (Linux) Download LLVM and Build Odin run: | - docker run --rm -v "$PWD:/src" -w /src alpine sh -c ' + docker run --rm -v "$PWD:/src" -w /src alpine:3.24 sh -c ' apk add --no-cache \ - musl-dev llvm20-dev clang20 git mold lz4 \ + musl-dev llvm20-dev clang20 build-base git mold lz4 \ libxml2-static llvm20-static zlib-static zstd-static \ make && git config --global --add safe.directory /src && From d403e749ea4a7601a7ed0eb437e7b1cb6582284f Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 11 Jun 2026 00:26:19 +0200 Subject: [PATCH 149/228] Linux ARM nightly fix --- .github/workflows/nightly.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index fffcf76ef..b13aaa8b8 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -98,7 +98,7 @@ jobs: run: | docker run --rm -v "$PWD:/src" -w /src arm64v8/alpine sh -c ' apk add --no-cache \ - musl-dev llvm20-dev clang20 git mold lz4 \ + musl-dev llvm20-dev clang20 build-base git mold lz4 \ libxml2-static llvm20-static zlib-static zstd-static \ make && git config --global --add safe.directory /src && From 29436042b72d21cf75fac5062fcb31efed65696a Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Wed, 10 Jun 2026 21:05:11 -0400 Subject: [PATCH 150/228] [nightly-build] deduplicate macos and linux nightly builds --- .github/workflows/nightly.yml | 120 +++++++--------------------------- 1 file changed, 24 insertions(+), 96 deletions(-) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index b13aaa8b8..5d8fe2e8e 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -44,16 +44,22 @@ jobs: name: windows_artifacts path: dist build_linux: - name: Linux Build + strategy: + matrix: + arch: [amd64, arm64] + env: + ARCH: ${{ matrix.arch }} + DOCKER_IMAGE: ${{ matrix.arch == 'amd64' && 'alpine:3.24' || 'arm64v8/alpine:3.24' }} + name: Linux Build ${{ matrix.arch }} if: github.repository == 'odin-lang/Odin' - runs-on: ubuntu-latest + runs-on: ${{ matrix.arch == 'amd64' && 'ubuntu-latest' || 'ubuntu-24.04-arm' }} steps: - uses: actions/checkout@v4 with: lfs: true - name: (Linux) Download LLVM and Build Odin run: | - docker run --rm -v "$PWD:/src" -w /src alpine:3.24 sh -c ' + docker run --rm -v "$PWD:/src" -w /src $DOCKER_IMAGE sh -c ' apk add --no-cache \ musl-dev llvm20-dev clang20 build-base git mold lz4 \ libxml2-static llvm20-static zlib-static zstd-static \ @@ -65,7 +71,7 @@ jobs: run: ./odin run examples/demo - name: Copy artifacts run: | - FILE="odin-linux-amd64-nightly+$(date -I)" + FILE="odin-linux-$ARCH-nightly+$(date -I)" mkdir $FILE cp odin $FILE cp LICENSE $FILE @@ -79,60 +85,22 @@ jobs: tar -czvf dist.tar.gz $FILE - name: Odin run run: | - FILE="odin-linux-amd64-nightly+$(date -I)" + FILE="odin-linux-$ARCH-nightly+$(date -I)" $FILE/odin run examples/demo - name: Upload artifact uses: actions/upload-artifact@v4 with: - name: linux_artifacts - path: dist.tar.gz - build_linux_arm: - name: Linux ARM Build - if: github.repository == 'odin-lang/Odin' - runs-on: ubuntu-24.04-arm - steps: - - uses: actions/checkout@v4 - with: - lfs: true - - name: (Linux ARM) Download LLVM and Build Odin - run: | - docker run --rm -v "$PWD:/src" -w /src arm64v8/alpine sh -c ' - apk add --no-cache \ - musl-dev llvm20-dev clang20 build-base git mold lz4 \ - libxml2-static llvm20-static zlib-static zstd-static \ - make && - git config --global --add safe.directory /src && - ./ci/build_linux_static.sh - ' - - name: Odin run - run: ./odin run examples/demo - - name: Copy artifacts - run: | - FILE="odin-linux-arm64-nightly+$(date -I)" - mkdir $FILE - cp odin $FILE - cp LICENSE $FILE - cp -r shared $FILE - cp -r base $FILE - cp -r core $FILE - cp -r vendor $FILE - cp -r examples $FILE - ./ci/remove_windows_binaries.sh $FILE - # Creating a tarball so executable permissions are retained, see https://github.com/actions/upload-artifact/issues/38 - tar -czvf dist.tar.gz $FILE - - name: Odin run - run: | - FILE="odin-linux-arm64-nightly+$(date -I)" - $FILE/odin run examples/demo - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: linux_arm_artifacts + name: ${{ matrix.arch == 'amd64' && 'linux_artifacts' || 'linux_arm_artifacts' }} path: dist.tar.gz build_macos: - name: MacOS Build + strategy: + matrix: + arch: [amd64, arm64] + env: + ARCH: ${{ matrix.arch }} + name: Macos Build ${{ matrix.arch }} if: github.repository == 'odin-lang/Odin' - runs-on: macos-15-intel + runs-on: ${{ matrix.arch == 'amd64' && 'macos-15-intel' || 'macos-latest' }} steps: - uses: actions/checkout@v4 with: @@ -141,6 +109,7 @@ jobs: run: | brew update brew install llvm@20 dylibbundler lld@20 + brew link llvm@20 - name: build odin # These -L makes the linker prioritize system libraries over LLVM libraries, this is mainly to @@ -148,7 +117,7 @@ jobs: run: CXXFLAGS="-L/usr/lib/system -L/usr/lib" make nightly - name: Bundle run: | - FILE="odin-macos-amd64-nightly+$(date -I)" + FILE="odin-macos-$ARCH-nightly+$(date -I)" mkdir $FILE cp odin $FILE cp LICENSE $FILE @@ -163,57 +132,16 @@ jobs: tar -czvf dist.tar.gz $FILE - name: Odin run run: | - FILE="odin-macos-amd64-nightly+$(date -I)" + FILE="odin-macos-$ARCH-nightly+$(date -I)" $FILE/odin run examples/demo - name: Upload artifact uses: actions/upload-artifact@v4 with: - name: macos_artifacts - path: dist.tar.gz - build_macos_arm: - name: MacOS ARM Build - if: github.repository == 'odin-lang/Odin' - runs-on: macos-latest # ARM machine - steps: - - uses: actions/checkout@v4 - with: - lfs: true - - name: Download LLVM and setup PATH - run: | - brew update - brew install llvm@20 dylibbundler lld@20 - - - name: build odin - # These -L makes the linker prioritize system libraries over LLVM libraries, this is mainly to - # not link with libunwind bundled with LLVM but link with libunwind on the system. - run: CXXFLAGS="-L/usr/lib/system -L/usr/lib" make nightly - - name: Bundle - run: | - FILE="odin-macos-arm64-nightly+$(date -I)" - mkdir $FILE - cp odin $FILE - cp LICENSE $FILE - cp -r shared $FILE - cp -r base $FILE - cp -r core $FILE - cp -r vendor $FILE - cp -r examples $FILE - ./ci/remove_windows_binaries.sh $FILE - dylibbundler -b -x $FILE/odin -d $FILE/libs -od -p @executable_path/libs - # Creating a tarball so executable permissions are retained, see https://github.com/actions/upload-artifact/issues/38 - tar -czvf dist.tar.gz $FILE - - name: Odin run - run: | - FILE="odin-macos-arm64-nightly+$(date -I)" - $FILE/odin run examples/demo - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: macos_arm_artifacts + name: ${{ matrix.arch == 'amd64' && 'macos_artifacts' || 'macos_arm_artifacts' }} path: dist.tar.gz upload_b2: runs-on: [ubuntu-latest] - needs: [build_windows, build_macos, build_macos_arm, build_linux, build_linux_arm] + needs: [build_windows, build_macos, build_linux] steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 From 83702108a4e68a4d5a31d5bac7b41c40bb64cfe0 Mon Sep 17 00:00:00 2001 From: bluziDev <34328559+bluziDev@users.noreply.github.com> Date: Wed, 10 Jun 2026 23:48:33 -0600 Subject: [PATCH 151/228] Add control sequences for Alternate Screen Buffer Adds constants DECASB_ENTER and DECASB_EXIT to ansi.odin. ASB stands for Alternate Screen Buffer. DECASB_ENTER ( ?1049h ) saves the cursor position, clears the alternate buffer, and switches the view to said buffer. DECASB_EXIT ( ?1049l ) restores the main buffer's contents and the cursor position. Commonly used by editors, games, and TUIs in general to avoid polluting the main buffer. --- core/terminal/ansi/ansi.odin | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/core/terminal/ansi/ansi.odin b/core/terminal/ansi/ansi.odin index 5550a1671..89220253c 100644 --- a/core/terminal/ansi/ansi.odin +++ b/core/terminal/ansi/ansi.odin @@ -32,12 +32,14 @@ DSR :: "6n" // Device Status Report // CSI: private sequences -SCP :: "s" // Save Current Cursor Position -RCP :: "u" // Restore Saved Cursor Position -DECAWM_ON :: "?7h" // Auto Wrap Mode (Enabled) -DECAWM_OFF :: "?7l" // Auto Wrap Mode (Disabled) -DECTCEM_SHOW :: "?25h" // Text Cursor Enable Mode (Visible) -DECTCEM_HIDE :: "?25l" // Text Cursor Enable Mode (Invisible) +SCP :: "s" // Save Current Cursor Position +RCP :: "u" // Restore Saved Cursor Position +DECAWM_ON :: "?7h" // Auto Wrap Mode (Enabled) +DECAWM_OFF :: "?7l" // Auto Wrap Mode (Disabled) +DECTCEM_SHOW :: "?25h" // Text Cursor Enable Mode (Visible) +DECTCEM_HIDE :: "?25l" // Text Cursor Enable Mode (Invisible) +DECASB_ENTER :: "?1049h" // Alternate Screen Buffer (Enter) +DECASB_EXIT :: "?1049l" // Alternate Screen Buffer (Exit) // SGR sequences From b029cf08aa43064556d0fd4fb9fa132023af6715 Mon Sep 17 00:00:00 2001 From: RainerXE <88084796+RainerXE@users.noreply.github.com> Date: Thu, 11 Jun 2026 23:34:20 +0200 Subject: [PATCH 152/228] core/nbio: fix use-after-free of op.l in cross-thread exec --- core/nbio/nbio.odin | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/core/nbio/nbio.odin b/core/nbio/nbio.odin index 703a2b4d7..69fd9d10f 100644 --- a/core/nbio/nbio.odin +++ b/core/nbio/nbio.odin @@ -406,13 +406,18 @@ exec :: proc(op: ^Operation, trigger_wake_up := true) { if op.l == &_tls_event_loop { _exec(op) } else { - for !mpsc_enqueue(&op.l.queue, op) { + // Capture the loop pointer before the enqueue publishes `op`: the + // target loop can complete the operation and return it to the + // operation pool before `op.l` is re-read below, and `l` is in a + // raw union with the pool's free-list link. + l := op.l + for !mpsc_enqueue(&l.queue, op) { warn("operation queue on event loop filled up") - wake_up(op.l) + wake_up(l) _yield() } if trigger_wake_up { - wake_up(op.l) + wake_up(l) } } } From baf85d78a38819313820ac623cd87503244bb97e Mon Sep 17 00:00:00 2001 From: RainerXE <88084796+RainerXE@users.noreply.github.com> Date: Fri, 12 Jun 2026 09:28:14 +0200 Subject: [PATCH 153/228] core/container/pool: fix ABA race in the free list --- core/container/pool/pool.odin | 44 +++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/core/container/pool/pool.odin b/core/container/pool/pool.odin index 34a9e0683..c686d9d6b 100644 --- a/core/container/pool/pool.odin +++ b/core/container/pool/pool.odin @@ -29,6 +29,13 @@ Pool :: struct($T: typeid) { num_outstanding: int, num_ready: int, link_off: uintptr, + // Guards free_list. An untagged Treiber stack is vulnerable to ABA: + // between get's head load and its CAS, another thread can pop the head, + // reuse it, and push it back — the CAS then succeeds and installs a + // stale next pointer, handing an in-flight element to two owners. + // A tagged head would keep this lock-free but requires a double-width + // CAS, which is not portably available. + mu: sync.Mutex, free_list: ^T, } @@ -61,20 +68,20 @@ destroy :: proc(p: ^Pool($T)) { get :: proc(p: ^Pool($T)) -> (elem: ^T, err: runtime.Allocator_Error) #optional_allocator_error { defer sync.atomic_add_explicit(&p.num_outstanding, 1, .Relaxed) - for { - elem = sync.atomic_load_explicit(&p.free_list, .Acquire) - if elem == nil { - // NOTE: pool arena has an internal lock. - return new(T, _pool_arena_allocator(&p.arena)) - } - - if _, ok := sync.atomic_compare_exchange_weak_explicit(&p.free_list, elem, _get_next(p, elem), .Acquire, .Relaxed); ok { - _set_next(p, elem, nil) - _unpoison_elem(p, elem) - sync.atomic_sub_explicit(&p.num_ready, 1, .Relaxed) - return - } + sync.mutex_lock(&p.mu) + elem = p.free_list + if elem == nil { + sync.mutex_unlock(&p.mu) + // NOTE: pool arena has an internal lock. + return new(T, _pool_arena_allocator(&p.arena)) } + p.free_list = _get_next(p, elem) + sync.mutex_unlock(&p.mu) + + _set_next(p, elem, nil) + _unpoison_elem(p, elem) + sync.atomic_sub_explicit(&p.num_ready, 1, .Relaxed) + return } put :: proc(p: ^Pool($T), elem: ^T) { @@ -84,13 +91,10 @@ put :: proc(p: ^Pool($T), elem: ^T) { defer sync.atomic_sub_explicit(&p.num_outstanding, 1, .Relaxed) defer sync.atomic_add_explicit(&p.num_ready, 1, .Relaxed) - for { - head := sync.atomic_load_explicit(&p.free_list, .Relaxed) - _set_next(p, elem, head) - if _, ok := sync.atomic_compare_exchange_weak_explicit(&p.free_list, head, elem, .Release, .Relaxed); ok { - return - } - } + sync.mutex_lock(&p.mu) + _set_next(p, elem, p.free_list) + p.free_list = elem + sync.mutex_unlock(&p.mu) } num_outstanding :: proc(p: ^Pool($T)) -> int { From 81905aaa2da57e45439c76001daf58825e0a644d Mon Sep 17 00:00:00 2001 From: diniamo Date: Fri, 12 Jun 2026 10:31:53 +0200 Subject: [PATCH 154/228] Update Vulkan --- .../vulkan/_gen/create_vulkan_odin_wrapper.py | 12 +- vendor/vulkan/_gen/vk_icd.h | 3 +- vendor/vulkan/_gen/vk_layer.h | 3 + vendor/vulkan/_gen/vk_platform.h | 2 +- vendor/vulkan/_gen/vulkan_beta.h | 153 +- vendor/vulkan/_gen/vulkan_core.h | 10271 ++++++++++++---- vendor/vulkan/_gen/vulkan_ios.h | 4 +- vendor/vulkan/_gen/vulkan_macos.h | 4 +- vendor/vulkan/_gen/vulkan_metal.h | 10 +- .../vulkan/_gen/vulkan_video_codec_av1std.h | 46 +- .../_gen/vulkan_video_codec_av1std_decode.h | 2 +- .../_gen/vulkan_video_codec_av1std_encode.h | 2 +- .../vulkan/_gen/vulkan_video_codec_h264std.h | 18 +- .../_gen/vulkan_video_codec_h264std_decode.h | 4 +- .../_gen/vulkan_video_codec_h264std_encode.h | 2 +- .../vulkan/_gen/vulkan_video_codec_h265std.h | 48 +- .../_gen/vulkan_video_codec_h265std_decode.h | 4 +- .../_gen/vulkan_video_codec_h265std_encode.h | 2 +- .../vulkan/_gen/vulkan_video_codec_vp9std.h | 151 + .../_gen/vulkan_video_codec_vp9std_decode.h | 68 + vendor/vulkan/_gen/vulkan_wayland.h | 114 +- vendor/vulkan/_gen/vulkan_win32.h | 32 +- vendor/vulkan/_gen/vulkan_xcb.h | 6 +- vendor/vulkan/_gen/vulkan_xlib.h | 6 +- vendor/vulkan/core.odin | 313 +- vendor/vulkan/enums.odin | 3518 ++++-- vendor/vulkan/procedures.odin | 1478 ++- vendor/vulkan/structs.odin | 4605 +++++-- 28 files changed, 15136 insertions(+), 5745 deletions(-) create mode 100644 vendor/vulkan/_gen/vulkan_video_codec_vp9std.h create mode 100644 vendor/vulkan/_gen/vulkan_video_codec_vp9std_decode.h diff --git a/vendor/vulkan/_gen/create_vulkan_odin_wrapper.py b/vendor/vulkan/_gen/create_vulkan_odin_wrapper.py index 6e5eea2c0..bb133439c 100644 --- a/vendor/vulkan/_gen/create_vulkan_odin_wrapper.py +++ b/vendor/vulkan/_gen/create_vulkan_odin_wrapper.py @@ -36,6 +36,8 @@ file_and_urls = [ ("vulkan_video_codec_h265std.h", 'https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/main/include/vk_video/vulkan_video_codec_h265std.h', False), ("vulkan_video_codec_h265std_decode.h", 'https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/main/include/vk_video/vulkan_video_codec_h265std_decode.h', False), ("vulkan_video_codec_h265std_encode.h", 'https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/main/include/vk_video/vulkan_video_codec_h265std_encode.h', False), + ("vulkan_video_codec_vp9std_decode.h", 'https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/main/include/vk_video/vulkan_video_codec_vp9std_decode.h', False), + ("vulkan_video_codec_vp9std.h", 'https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/main/include/vk_video/vulkan_video_codec_vp9std.h', False), ] for file, url, _ in file_and_urls: @@ -98,6 +100,7 @@ def convert_type(t, prev_name, curr_name): "const AccelerationStructureGeometryKHR* const*": "^[^]AccelerationStructureGeometryKHR", "const AccelerationStructureBuildRangeInfoKHR* const*": "^[^]AccelerationStructureBuildRangeInfoKHR", "const MicromapUsageEXT* const*": "^[^]MicromapUsageEXT", + "const MicromapUsageKHR* const*": "^[^]MicromapUsageKHR", "struct BaseOutStructure": "BaseOutStructure", "struct BaseInStructure": "BaseInStructure", "struct wl_display": "wl_display", @@ -162,7 +165,7 @@ def to_snake_case(name): s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name) return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).lower() -ext_suffixes = ["KHR", "EXT", "AMD", "NV", "NVX", "GOOGLE", "KHX"] +ext_suffixes = ["KHR", "EXT", "AMD", "NV", "NVX", "GOOGLE", "KHX", "ARM", "QCOM"] ext_suffixes_title = [ext.title() for ext in ext_suffixes] @@ -373,10 +376,17 @@ def parse_enums(f): names_and_values = re.findall(r"VK_(\w+?) = (.*?)(?:,|})", fields, re.S) + ignore_names = set([ + "HOST_IMAGE_COPY_MEMCPY_EXT", + "PIPELINE_CREATE_DISPATCH_BASE_KHR" + ]) groups = [] flags = {} for name, value in names_and_values: + if name in ignore_names: + continue + n = fix_enum_name(name, prefix, suffix, is_flag_bit) try: v = fix_enum_value(value, prefix, suffix, is_flag_bit) diff --git a/vendor/vulkan/_gen/vk_icd.h b/vendor/vulkan/_gen/vk_icd.h index 59204a341..d71f5682a 100644 --- a/vendor/vulkan/_gen/vk_icd.h +++ b/vendor/vulkan/_gen/vk_icd.h @@ -44,8 +44,9 @@ typedef VkResult(VKAPI_PTR *PFN_vkNegotiateLoaderICDInterfaceVersion)(uint32_t *pVersion); // This is defined in vk_layer.h which will be found by the loader, but if an ICD is building against this // file directly, it won't be found. -#ifndef PFN_GetPhysicalDeviceProcAddr +#ifndef IS_DEFINED_PFN_GetPhysicalDeviceProcAddr typedef PFN_vkVoidFunction(VKAPI_PTR *PFN_GetPhysicalDeviceProcAddr)(VkInstance instance, const char *pName); +#define IS_DEFINED_PFN_GetPhysicalDeviceProcAddr #endif // Typedefs for loader/ICD interface diff --git a/vendor/vulkan/_gen/vk_layer.h b/vendor/vulkan/_gen/vk_layer.h index 19d88fce4..19cf5880c 100644 --- a/vendor/vulkan/_gen/vk_layer.h +++ b/vendor/vulkan/_gen/vk_layer.h @@ -27,7 +27,10 @@ #define VK_CURRENT_CHAIN_VERSION 1 // Typedef for use in the interfaces below +#ifndef IS_DEFINED_PFN_GetPhysicalDeviceProcAddr typedef PFN_vkVoidFunction (VKAPI_PTR *PFN_GetPhysicalDeviceProcAddr)(VkInstance instance, const char* pName); +#define IS_DEFINED_PFN_GetPhysicalDeviceProcAddr +#endif // Version negotiation values typedef enum VkNegotiateLayerStructType { diff --git a/vendor/vulkan/_gen/vk_platform.h b/vendor/vulkan/_gen/vk_platform.h index 18e5ca34c..e431c7631 100644 --- a/vendor/vulkan/_gen/vk_platform.h +++ b/vendor/vulkan/_gen/vk_platform.h @@ -2,7 +2,7 @@ // File: vk_platform.h // /* -** Copyright 2014-2025 The Khronos Group Inc. +** Copyright 2014-2026 The Khronos Group Inc. ** ** SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/vulkan/_gen/vulkan_beta.h b/vendor/vulkan/_gen/vulkan_beta.h index 867483d08..147a3f3cc 100644 --- a/vendor/vulkan/_gen/vulkan_beta.h +++ b/vendor/vulkan/_gen/vulkan_beta.h @@ -2,7 +2,7 @@ #define VULKAN_BETA_H_ 1 /* -** Copyright 2015-2025 The Khronos Group Inc. +** Copyright 2015-2026 The Khronos Group Inc. ** ** SPDX-License-Identifier: Apache-2.0 */ @@ -120,7 +120,7 @@ typedef struct VkPipelineShaderStageNodeCreateInfoAMDX { uint32_t index; } VkPipelineShaderStageNodeCreateInfoAMDX; -typedef VkResult (VKAPI_PTR *PFN_vkCreateExecutionGraphPipelinesAMDX)(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkExecutionGraphPipelineCreateInfoAMDX* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines); +typedef VkResult (VKAPI_PTR *PFN_vkCreateExecutionGraphPipelinesAMDX)(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkExecutionGraphPipelineCreateInfoAMDX* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines); typedef VkResult (VKAPI_PTR *PFN_vkGetExecutionGraphPipelineScratchSizeAMDX)(VkDevice device, VkPipeline executionGraph, VkExecutionGraphPipelineScratchSizeAMDX* pSizeInfo); typedef VkResult (VKAPI_PTR *PFN_vkGetExecutionGraphPipelineNodeIndexAMDX)(VkDevice device, VkPipeline executionGraph, const VkPipelineShaderStageNodeCreateInfoAMDX* pNodeInfo, uint32_t* pNodeIndex); typedef void (VKAPI_PTR *PFN_vkCmdInitializeGraphScratchMemoryAMDX)(VkCommandBuffer commandBuffer, VkPipeline executionGraph, VkDeviceAddress scratch, VkDeviceSize scratchSize); @@ -129,6 +129,7 @@ typedef void (VKAPI_PTR *PFN_vkCmdDispatchGraphIndirectAMDX)(VkCommandBuffer typedef void (VKAPI_PTR *PFN_vkCmdDispatchGraphIndirectCountAMDX)(VkCommandBuffer commandBuffer, VkDeviceAddress scratch, VkDeviceSize scratchSize, VkDeviceAddress countInfo); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateExecutionGraphPipelinesAMDX( VkDevice device, VkPipelineCache pipelineCache, @@ -136,42 +137,159 @@ VKAPI_ATTR VkResult VKAPI_CALL vkCreateExecutionGraphPipelinesAMDX( const VkExecutionGraphPipelineCreateInfoAMDX* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetExecutionGraphPipelineScratchSizeAMDX( VkDevice device, VkPipeline executionGraph, VkExecutionGraphPipelineScratchSizeAMDX* pSizeInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetExecutionGraphPipelineNodeIndexAMDX( VkDevice device, VkPipeline executionGraph, const VkPipelineShaderStageNodeCreateInfoAMDX* pNodeInfo, uint32_t* pNodeIndex); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdInitializeGraphScratchMemoryAMDX( VkCommandBuffer commandBuffer, VkPipeline executionGraph, VkDeviceAddress scratch, VkDeviceSize scratchSize); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdDispatchGraphAMDX( VkCommandBuffer commandBuffer, VkDeviceAddress scratch, VkDeviceSize scratchSize, const VkDispatchGraphCountInfoAMDX* pCountInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdDispatchGraphIndirectAMDX( VkCommandBuffer commandBuffer, VkDeviceAddress scratch, VkDeviceSize scratchSize, const VkDispatchGraphCountInfoAMDX* pCountInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdDispatchGraphIndirectCountAMDX( VkCommandBuffer commandBuffer, VkDeviceAddress scratch, VkDeviceSize scratchSize, VkDeviceAddress countInfo); #endif +#endif + + +// VK_NV_cuda_kernel_launch is a preprocessor guard. Do not pass it to API calls. +#define VK_NV_cuda_kernel_launch 1 +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkCudaModuleNV) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkCudaFunctionNV) +#define VK_NV_CUDA_KERNEL_LAUNCH_SPEC_VERSION 2 +#define VK_NV_CUDA_KERNEL_LAUNCH_EXTENSION_NAME "VK_NV_cuda_kernel_launch" +typedef struct VkCudaModuleCreateInfoNV { + VkStructureType sType; + const void* pNext; + size_t dataSize; + const void* pData; +} VkCudaModuleCreateInfoNV; + +typedef struct VkCudaFunctionCreateInfoNV { + VkStructureType sType; + const void* pNext; + VkCudaModuleNV module; + const char* pName; +} VkCudaFunctionCreateInfoNV; + +typedef struct VkCudaLaunchInfoNV { + VkStructureType sType; + const void* pNext; + VkCudaFunctionNV function; + uint32_t gridDimX; + uint32_t gridDimY; + uint32_t gridDimZ; + uint32_t blockDimX; + uint32_t blockDimY; + uint32_t blockDimZ; + uint32_t sharedMemBytes; + size_t paramCount; + const void* const * pParams; + size_t extraCount; + const void* const * pExtras; +} VkCudaLaunchInfoNV; + +typedef struct VkPhysicalDeviceCudaKernelLaunchFeaturesNV { + VkStructureType sType; + void* pNext; + VkBool32 cudaKernelLaunchFeatures; +} VkPhysicalDeviceCudaKernelLaunchFeaturesNV; + +typedef struct VkPhysicalDeviceCudaKernelLaunchPropertiesNV { + VkStructureType sType; + void* pNext; + uint32_t computeCapabilityMinor; + uint32_t computeCapabilityMajor; +} VkPhysicalDeviceCudaKernelLaunchPropertiesNV; + +typedef VkResult (VKAPI_PTR *PFN_vkCreateCudaModuleNV)(VkDevice device, const VkCudaModuleCreateInfoNV* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkCudaModuleNV* pModule); +typedef VkResult (VKAPI_PTR *PFN_vkGetCudaModuleCacheNV)(VkDevice device, VkCudaModuleNV module, size_t* pCacheSize, void* pCacheData); +typedef VkResult (VKAPI_PTR *PFN_vkCreateCudaFunctionNV)(VkDevice device, const VkCudaFunctionCreateInfoNV* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkCudaFunctionNV* pFunction); +typedef void (VKAPI_PTR *PFN_vkDestroyCudaModuleNV)(VkDevice device, VkCudaModuleNV module, const VkAllocationCallbacks* pAllocator); +typedef void (VKAPI_PTR *PFN_vkDestroyCudaFunctionNV)(VkDevice device, VkCudaFunctionNV function, const VkAllocationCallbacks* pAllocator); +typedef void (VKAPI_PTR *PFN_vkCmdCudaLaunchKernelNV)(VkCommandBuffer commandBuffer, const VkCudaLaunchInfoNV* pLaunchInfo); + +#ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateCudaModuleNV( + VkDevice device, + const VkCudaModuleCreateInfoNV* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkCudaModuleNV* pModule); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetCudaModuleCacheNV( + VkDevice device, + VkCudaModuleNV module, + size_t* pCacheSize, + void* pCacheData); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateCudaFunctionNV( + VkDevice device, + const VkCudaFunctionCreateInfoNV* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkCudaFunctionNV* pFunction); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkDestroyCudaModuleNV( + VkDevice device, + VkCudaModuleNV module, + const VkAllocationCallbacks* pAllocator); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkDestroyCudaFunctionNV( + VkDevice device, + VkCudaFunctionNV function, + const VkAllocationCallbacks* pAllocator); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdCudaLaunchKernelNV( + VkCommandBuffer commandBuffer, + const VkCudaLaunchInfoNV* pLaunchInfo); +#endif +#endif // VK_NV_displacement_micromap is a preprocessor guard. Do not pass it to API calls. @@ -219,6 +337,37 @@ typedef struct VkAccelerationStructureTrianglesDisplacementMicromapNV { } VkAccelerationStructureTrianglesDisplacementMicromapNV; + +// VK_AMDX_dense_geometry_format is a preprocessor guard. Do not pass it to API calls. +#define VK_AMDX_dense_geometry_format 1 +#define VK_AMDX_DENSE_GEOMETRY_FORMAT_SPEC_VERSION 1 +#define VK_AMDX_DENSE_GEOMETRY_FORMAT_EXTENSION_NAME "VK_AMDX_dense_geometry_format" +#define VK_COMPRESSED_TRIANGLE_FORMAT_DGF1_BYTE_ALIGNMENT_AMDX 128U +#define VK_COMPRESSED_TRIANGLE_FORMAT_DGF1_BYTE_STRIDE_AMDX 128U + +typedef enum VkCompressedTriangleFormatAMDX { + VK_COMPRESSED_TRIANGLE_FORMAT_DGF1_AMDX = 0, + VK_COMPRESSED_TRIANGLE_FORMAT_MAX_ENUM_AMDX = 0x7FFFFFFF +} VkCompressedTriangleFormatAMDX; +typedef struct VkPhysicalDeviceDenseGeometryFormatFeaturesAMDX { + VkStructureType sType; + void* pNext; + VkBool32 denseGeometryFormat; +} VkPhysicalDeviceDenseGeometryFormatFeaturesAMDX; + +typedef struct VkAccelerationStructureDenseGeometryFormatTrianglesDataAMDX { + VkStructureType sType; + const void* pNext; + VkDeviceOrHostAddressConstKHR compressedData; + VkDeviceSize dataSize; + uint32_t numTriangles; + uint32_t numVertices; + uint32_t maxPrimitiveIndex; + uint32_t maxGeometryIndex; + VkCompressedTriangleFormatAMDX format; +} VkAccelerationStructureDenseGeometryFormatTrianglesDataAMDX; + + #ifdef __cplusplus } #endif diff --git a/vendor/vulkan/_gen/vulkan_core.h b/vendor/vulkan/_gen/vulkan_core.h index 26e53459b..96931f5a1 100644 --- a/vendor/vulkan/_gen/vulkan_core.h +++ b/vendor/vulkan/_gen/vulkan_core.h @@ -2,7 +2,7 @@ #define VULKAN_CORE_H_ 1 /* -** Copyright 2015-2025 The Khronos Group Inc. +** Copyright 2015-2026 The Khronos Group Inc. ** ** SPDX-License-Identifier: Apache-2.0 */ @@ -62,46 +62,40 @@ extern "C" { #define VK_MAKE_API_VERSION(variant, major, minor, patch) \ ((((uint32_t)(variant)) << 29U) | (((uint32_t)(major)) << 22U) | (((uint32_t)(minor)) << 12U) | ((uint32_t)(patch))) -// DEPRECATED: This define has been removed. Specific version defines (e.g. VK_API_VERSION_1_0), or the VK_MAKE_VERSION macro, should be used instead. + //#define VK_API_VERSION VK_MAKE_API_VERSION(0, 1, 0, 0) // Patch version should always be set to 0 -// Vulkan 1.0 version number -#define VK_API_VERSION_1_0 VK_MAKE_API_VERSION(0, 1, 0, 0)// Patch version should always be set to 0 - // Version of this file -#define VK_HEADER_VERSION 309 +#define VK_HEADER_VERSION 354 // Complete version of this file #define VK_HEADER_VERSION_COMPLETE VK_MAKE_API_VERSION(0, 1, 4, VK_HEADER_VERSION) -// VK_MAKE_VERSION is deprecated, but no reason was given in the API XML -// DEPRECATED: This define is deprecated. VK_MAKE_API_VERSION should be used instead. + #define VK_MAKE_VERSION(major, minor, patch) \ ((((uint32_t)(major)) << 22U) | (((uint32_t)(minor)) << 12U) | ((uint32_t)(patch))) -// VK_VERSION_MAJOR is deprecated, but no reason was given in the API XML -// DEPRECATED: This define is deprecated. VK_API_VERSION_MAJOR should be used instead. + #define VK_VERSION_MAJOR(version) ((uint32_t)(version) >> 22U) -// VK_VERSION_MINOR is deprecated, but no reason was given in the API XML -// DEPRECATED: This define is deprecated. VK_API_VERSION_MINOR should be used instead. + #define VK_VERSION_MINOR(version) (((uint32_t)(version) >> 12U) & 0x3FFU) -// VK_VERSION_PATCH is deprecated, but no reason was given in the API XML -// DEPRECATED: This define is deprecated. VK_API_VERSION_PATCH should be used instead. + #define VK_VERSION_PATCH(version) ((uint32_t)(version) & 0xFFFU) #define VK_API_VERSION_VARIANT(version) ((uint32_t)(version) >> 29U) #define VK_API_VERSION_MAJOR(version) (((uint32_t)(version) >> 22U) & 0x7FU) #define VK_API_VERSION_MINOR(version) (((uint32_t)(version) >> 12U) & 0x3FFU) #define VK_API_VERSION_PATCH(version) ((uint32_t)(version) & 0xFFFU) +// Vulkan 1.0 version number +#define VK_API_VERSION_1_0 VK_MAKE_API_VERSION(0, 1, 0, 0)// Patch version should always be set to 0 + typedef uint32_t VkBool32; typedef uint64_t VkDeviceAddress; typedef uint64_t VkDeviceSize; typedef uint32_t VkFlags; typedef uint32_t VkSampleMask; -VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkBuffer) -VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkImage) VK_DEFINE_HANDLE(VkInstance) VK_DEFINE_HANDLE(VkPhysicalDevice) VK_DEFINE_HANDLE(VkDevice) @@ -110,28 +104,28 @@ VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSemaphore) VK_DEFINE_HANDLE(VkCommandBuffer) VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkFence) VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDeviceMemory) -VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkEvent) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkBuffer) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkImage) VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkQueryPool) -VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkBufferView) VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkImageView) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkCommandPool) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkRenderPass) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkFramebuffer) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkEvent) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkBufferView) VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkShaderModule) VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPipelineCache) -VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPipelineLayout) VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPipeline) -VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkRenderPass) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPipelineLayout) VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDescriptorSetLayout) VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSampler) VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDescriptorSet) VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDescriptorPool) -VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkFramebuffer) -VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkCommandPool) -#define VK_ATTACHMENT_UNUSED (~0U) #define VK_FALSE 0U #define VK_LOD_CLAMP_NONE 1000.0F #define VK_QUEUE_FAMILY_IGNORED (~0U) #define VK_REMAINING_ARRAY_LAYERS (~0U) #define VK_REMAINING_MIP_LEVELS (~0U) -#define VK_SUBPASS_EXTERNAL (~0U) #define VK_TRUE 1U #define VK_WHOLE_SIZE (~0ULL) #define VK_MAX_MEMORY_TYPES 32U @@ -140,6 +134,8 @@ VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkCommandPool) #define VK_MAX_EXTENSION_NAME_SIZE 256U #define VK_MAX_DESCRIPTION_SIZE 256U #define VK_MAX_MEMORY_HEAPS 16U +#define VK_ATTACHMENT_UNUSED (~0U) +#define VK_SUBPASS_EXTERNAL (~0U) typedef enum VkResult { VK_SUCCESS = 0, @@ -161,10 +157,11 @@ typedef enum VkResult { VK_ERROR_FORMAT_NOT_SUPPORTED = -11, VK_ERROR_FRAGMENTED_POOL = -12, VK_ERROR_UNKNOWN = -13, + VK_ERROR_VALIDATION_FAILED = -1000011001, VK_ERROR_OUT_OF_POOL_MEMORY = -1000069000, VK_ERROR_INVALID_EXTERNAL_HANDLE = -1000072003, - VK_ERROR_FRAGMENTATION = -1000161000, VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS = -1000257000, + VK_ERROR_FRAGMENTATION = -1000161000, VK_PIPELINE_COMPILE_REQUIRED = 1000297000, VK_ERROR_NOT_PERMITTED = -1000174001, VK_ERROR_SURFACE_LOST_KHR = -1000000000, @@ -172,7 +169,6 @@ typedef enum VkResult { VK_SUBOPTIMAL_KHR = 1000001003, VK_ERROR_OUT_OF_DATE_KHR = -1000001004, VK_ERROR_INCOMPATIBLE_DISPLAY_KHR = -1000003001, - VK_ERROR_VALIDATION_FAILED_EXT = -1000011001, VK_ERROR_INVALID_SHADER_NV = -1000012000, VK_ERROR_IMAGE_USAGE_NOT_SUPPORTED_KHR = -1000023000, VK_ERROR_VIDEO_PICTURE_LAYOUT_NOT_SUPPORTED_KHR = -1000023001, @@ -181,6 +177,7 @@ typedef enum VkResult { VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR = -1000023004, VK_ERROR_VIDEO_STD_VERSION_NOT_SUPPORTED_KHR = -1000023005, VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT = -1000158000, + VK_ERROR_PRESENT_TIMING_QUEUE_FULL_EXT = -1000208000, VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT = -1000255000, VK_THREAD_IDLE_KHR = 1000268000, VK_THREAD_DONE_KHR = 1000268001, @@ -191,6 +188,7 @@ typedef enum VkResult { VK_INCOMPATIBLE_SHADER_BINARY_EXT = 1000482000, VK_PIPELINE_BINARY_MISSING_KHR = 1000483000, VK_ERROR_NOT_ENOUGH_SPACE_KHR = -1000483000, + VK_ERROR_VALIDATION_FAILED_EXT = VK_ERROR_VALIDATION_FAILED, VK_ERROR_OUT_OF_POOL_MEMORY_KHR = VK_ERROR_OUT_OF_POOL_MEMORY, VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR = VK_ERROR_INVALID_EXTERNAL_HANDLE, VK_ERROR_FRAGMENTATION_EXT = VK_ERROR_FRAGMENTATION, @@ -200,7 +198,7 @@ typedef enum VkResult { VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR = VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS, VK_PIPELINE_COMPILE_REQUIRED_EXT = VK_PIPELINE_COMPILE_REQUIRED, VK_ERROR_PIPELINE_COMPILE_REQUIRED_EXT = VK_PIPELINE_COMPILE_REQUIRED, - // VK_ERROR_INCOMPATIBLE_SHADER_BINARY_EXT is a deprecated alias + // VK_ERROR_INCOMPATIBLE_SHADER_BINARY_EXT is a legacy alias VK_ERROR_INCOMPATIBLE_SHADER_BINARY_EXT = VK_INCOMPATIBLE_SHADER_BINARY_EXT, VK_RESULT_MAX_ENUM = 0x7FFFFFFF } VkResult; @@ -255,14 +253,11 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_MEMORY_BARRIER = 46, VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO = 47, VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO = 48, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES = 1000094000, VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO = 1000157000, VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO = 1000157001, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES = 1000083000, VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS = 1000127000, VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO = 1000127001, VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO = 1000060000, - VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO = 1000060003, VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO = 1000060004, VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO = 1000060005, VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO = 1000060006, @@ -284,25 +279,11 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2 = 1000059006, VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2 = 1000059007, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2 = 1000059008, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES = 1000117000, - VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO = 1000117001, VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO = 1000117002, - VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO = 1000117003, - VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO = 1000053000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES = 1000053001, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES = 1000053002, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES = 1000120000, VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO = 1000145000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES = 1000145001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES = 1000145002, VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2 = 1000145003, - VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO = 1000156000, - VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO = 1000156001, - VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO = 1000156002, - VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO = 1000156003, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES = 1000156004, - VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES = 1000156005, - VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO = 1000085000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO = 1000071000, VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES = 1000071001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO = 1000071002, @@ -317,47 +298,33 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO = 1000077000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO = 1000076000, VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES = 1000076001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES = 1000094000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES = 1000083000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES = 1000120000, + VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO = 1000085000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES = 1000168000, VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT = 1000168001, + VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO = 1000156000, + VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO = 1000156001, + VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO = 1000156002, + VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO = 1000156003, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES = 1000156004, + VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES = 1000156005, + VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO = 1000060003, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES = 1000117000, + VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO = 1000117001, + VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO = 1000117003, + VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO = 1000053000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES = 1000053001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES = 1000053002, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES = 1000063000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES = 1000196000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES = 49, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES = 50, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES = 51, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES = 52, VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO = 1000147000, - VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2 = 1000109000, - VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2 = 1000109001, - VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2 = 1000109002, - VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2 = 1000109003, - VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2 = 1000109004, - VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO = 1000109005, - VK_STRUCTURE_TYPE_SUBPASS_END_INFO = 1000109006, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES = 1000177000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES = 1000196000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES = 1000180000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES = 1000082000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES = 1000197000, - VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO = 1000161000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES = 1000161001, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES = 1000161002, - VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO = 1000161003, - VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT = 1000161004, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES = 1000199000, - VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE = 1000199001, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES = 1000221000, - VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO = 1000246000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES = 1000130000, - VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO = 1000130001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES = 1000211000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES = 1000108000, - VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO = 1000108001, - VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO = 1000108002, - VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO = 1000108003, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES = 1000253000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES = 1000175000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES = 1000241000, - VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT = 1000241001, - VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT = 1000241002, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES = 1000261000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES = 1000207000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES = 1000207001, @@ -370,16 +337,43 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO = 1000257002, VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO = 1000257003, VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO = 1000257004, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES = 1000177000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES = 1000180000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES = 1000082000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES = 1000197000, + VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO = 1000161000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES = 1000161001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES = 1000161002, + VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO = 1000161003, + VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT = 1000161004, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES = 1000221000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES = 1000130000, + VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO = 1000130001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES = 1000253000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES = 1000175000, + VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2 = 1000109000, + VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2 = 1000109001, + VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2 = 1000109002, + VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2 = 1000109003, + VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2 = 1000109004, + VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO = 1000109005, + VK_STRUCTURE_TYPE_SUBPASS_END_INFO = 1000109006, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES = 1000199000, + VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE = 1000199001, + VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO = 1000246000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES = 1000108000, + VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO = 1000108001, + VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO = 1000108002, + VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO = 1000108003, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES = 1000241000, + VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT = 1000241001, + VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT = 1000241002, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES = 53, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES = 54, - VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO = 1000192000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES = 1000215000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TOOL_PROPERTIES = 1000245000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES = 1000276000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES = 1000295000, VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO = 1000295001, VK_STRUCTURE_TYPE_PRIVATE_DATA_SLOT_CREATE_INFO = 1000295002, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES = 1000297000, VK_STRUCTURE_TYPE_MEMORY_BARRIER_2 = 1000314000, VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER_2 = 1000314001, VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2 = 1000314002, @@ -388,19 +382,25 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO = 1000314005, VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO = 1000314006, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES = 1000314007, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES = 1000325000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES = 1000335000, VK_STRUCTURE_TYPE_COPY_BUFFER_INFO_2 = 1000337000, VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2 = 1000337001, VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2 = 1000337002, VK_STRUCTURE_TYPE_COPY_IMAGE_TO_BUFFER_INFO_2 = 1000337003, - VK_STRUCTURE_TYPE_BLIT_IMAGE_INFO_2 = 1000337004, - VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2 = 1000337005, VK_STRUCTURE_TYPE_BUFFER_COPY_2 = 1000337006, VK_STRUCTURE_TYPE_IMAGE_COPY_2 = 1000337007, - VK_STRUCTURE_TYPE_IMAGE_BLIT_2 = 1000337008, VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2 = 1000337009, - VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2 = 1000337010, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES = 1000066000, + VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3 = 1000360000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES = 1000413000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES = 1000413001, + VK_STRUCTURE_TYPE_DEVICE_BUFFER_MEMORY_REQUIREMENTS = 1000413002, + VK_STRUCTURE_TYPE_DEVICE_IMAGE_MEMORY_REQUIREMENTS = 1000413003, + VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO = 1000192000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES = 1000215000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES = 1000276000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES = 1000297000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES = 1000325000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES = 1000335000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES = 1000225000, VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO = 1000225001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES = 1000225002, @@ -408,60 +408,35 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES = 1000138001, VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK = 1000138002, VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO = 1000138003, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES = 1000066000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES = 1000280000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES = 1000280001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES = 1000281001, + VK_STRUCTURE_TYPE_BLIT_IMAGE_INFO_2 = 1000337004, + VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2 = 1000337005, + VK_STRUCTURE_TYPE_IMAGE_BLIT_2 = 1000337008, + VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2 = 1000337010, VK_STRUCTURE_TYPE_RENDERING_INFO = 1000044000, VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO = 1000044001, VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO = 1000044002, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES = 1000044003, VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO = 1000044004, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES = 1000280000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES = 1000280001, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES = 1000281001, - VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3 = 1000360000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES = 1000413000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES = 1000413001, - VK_STRUCTURE_TYPE_DEVICE_BUFFER_MEMORY_REQUIREMENTS = 1000413002, - VK_STRUCTURE_TYPE_DEVICE_IMAGE_MEMORY_REQUIREMENTS = 1000413003, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_4_FEATURES = 55, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_4_PROPERTIES = 56, VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO = 1000174000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES = 1000388000, VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES = 1000388001, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES = 1000416000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT_CONTROLS_2_FEATURES = 1000528000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES = 1000544000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES = 1000259000, - VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO = 1000259001, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES = 1000259002, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES = 1000525000, - VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO = 1000190001, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES = 1000190002, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES = 1000265000, VK_STRUCTURE_TYPE_MEMORY_MAP_INFO = 1000271000, VK_STRUCTURE_TYPE_MEMORY_UNMAP_INFO = 1000271001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES = 1000470000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES = 1000470001, - VK_STRUCTURE_TYPE_RENDERING_AREA_INFO = 1000470003, VK_STRUCTURE_TYPE_DEVICE_IMAGE_SUBRESOURCE_INFO = 1000470004, VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2 = 1000338002, VK_STRUCTURE_TYPE_IMAGE_SUBRESOURCE_2 = 1000338003, - VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO = 1000470005, VK_STRUCTURE_TYPE_BUFFER_USAGE_FLAGS_2_CREATE_INFO = 1000470006, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES = 1000080000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_LOCAL_READ_FEATURES = 1000232000, - VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_LOCATION_INFO = 1000232001, - VK_STRUCTURE_TYPE_RENDERING_INPUT_ATTACHMENT_INDEX_INFO = 1000232002, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_FEATURES = 1000545000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_PROPERTIES = 1000545001, VK_STRUCTURE_TYPE_BIND_MEMORY_STATUS = 1000545002, - VK_STRUCTURE_TYPE_BIND_DESCRIPTOR_SETS_INFO = 1000545003, - VK_STRUCTURE_TYPE_PUSH_CONSTANTS_INFO = 1000545004, - VK_STRUCTURE_TYPE_PUSH_DESCRIPTOR_SET_INFO = 1000545005, - VK_STRUCTURE_TYPE_PUSH_DESCRIPTOR_SET_WITH_TEMPLATE_INFO = 1000545006, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES = 1000466000, - VK_STRUCTURE_TYPE_PIPELINE_ROBUSTNESS_CREATE_INFO = 1000068000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES = 1000068001, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES = 1000068002, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES = 1000270000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_PROPERTIES = 1000270001, VK_STRUCTURE_TYPE_MEMORY_TO_IMAGE_COPY = 1000270002, @@ -472,6 +447,29 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_COPY_IMAGE_TO_IMAGE_INFO = 1000270007, VK_STRUCTURE_TYPE_SUBRESOURCE_HOST_MEMCPY_SIZE = 1000270008, VK_STRUCTURE_TYPE_HOST_IMAGE_COPY_DEVICE_PERFORMANCE_QUERY = 1000270009, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES = 1000416000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT_CONTROLS_2_FEATURES = 1000528000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES = 1000544000, + VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO = 1000470005, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES = 1000080000, + VK_STRUCTURE_TYPE_BIND_DESCRIPTOR_SETS_INFO = 1000545003, + VK_STRUCTURE_TYPE_PUSH_CONSTANTS_INFO = 1000545004, + VK_STRUCTURE_TYPE_PUSH_DESCRIPTOR_SET_INFO = 1000545005, + VK_STRUCTURE_TYPE_PUSH_DESCRIPTOR_SET_WITH_TEMPLATE_INFO = 1000545006, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES = 1000466000, + VK_STRUCTURE_TYPE_PIPELINE_ROBUSTNESS_CREATE_INFO = 1000068000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES = 1000068001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES = 1000068002, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES = 1000259000, + VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO = 1000259001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES = 1000259002, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES = 1000525000, + VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO = 1000190001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES = 1000190002, + VK_STRUCTURE_TYPE_RENDERING_AREA_INFO = 1000470003, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_LOCAL_READ_FEATURES = 1000232000, + VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_LOCATION_INFO = 1000232001, + VK_STRUCTURE_TYPE_RENDERING_INPUT_ATTACHMENT_INDEX_INFO = 1000232002, VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR = 1000001000, VK_STRUCTURE_TYPE_PRESENT_INFO_KHR = 1000001001, VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHR = 1000060007, @@ -642,6 +640,13 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID = 1000129004, VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID = 1000129005, VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID = 1000129006, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GPA_FEATURES_AMD = 1000133000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GPA_PROPERTIES_AMD = 1000133001, + VK_STRUCTURE_TYPE_GPA_SAMPLE_BEGIN_INFO_AMD = 1000133002, + VK_STRUCTURE_TYPE_GPA_SESSION_CREATE_INFO_AMD = 1000133003, + VK_STRUCTURE_TYPE_GPA_DEVICE_CLOCK_MODE_INFO_AMD = 1000133004, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GPA_PROPERTIES_2_AMD = 1000133005, + VK_STRUCTURE_TYPE_GPA_DEVICE_GET_CLOCK_INFO_AMD = 1000133006, #ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ENQUEUE_FEATURES_AMDX = 1000134000, #endif @@ -657,7 +662,23 @@ typedef enum VkStructureType { #ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_NODE_CREATE_INFO_AMDX = 1000134004, #endif + VK_STRUCTURE_TYPE_TEXEL_BUFFER_DESCRIPTOR_INFO_EXT = 1000135000, + VK_STRUCTURE_TYPE_IMAGE_DESCRIPTOR_INFO_EXT = 1000135001, + VK_STRUCTURE_TYPE_RESOURCE_DESCRIPTOR_INFO_EXT = 1000135002, + VK_STRUCTURE_TYPE_BIND_HEAP_INFO_EXT = 1000135003, + VK_STRUCTURE_TYPE_PUSH_DATA_INFO_EXT = 1000135004, + VK_STRUCTURE_TYPE_DESCRIPTOR_SET_AND_BINDING_MAPPING_EXT = 1000135005, + VK_STRUCTURE_TYPE_SHADER_DESCRIPTOR_SET_AND_BINDING_MAPPING_INFO_EXT = 1000135006, + VK_STRUCTURE_TYPE_OPAQUE_CAPTURE_DATA_CREATE_INFO_EXT = 1000135007, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_HEAP_PROPERTIES_EXT = 1000135008, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_HEAP_FEATURES_EXT = 1000135009, + VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_DESCRIPTOR_HEAP_INFO_EXT = 1000135010, + VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_INDEX_CREATE_INFO_EXT = 1000135011, + VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_PUSH_DATA_TOKEN_NV = 1000135012, + VK_STRUCTURE_TYPE_SUBSAMPLED_IMAGE_FORMAT_PROPERTIES_EXT = 1000135013, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_HEAP_TENSOR_PROPERTIES_ARM = 1000135014, VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD = 1000044008, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_BFLOAT16_FEATURES_KHR = 1000141000, VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT = 1000143000, VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT = 1000143001, VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT = 1000143002, @@ -724,6 +745,8 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV = 1000166001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT = 1000170000, VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT = 1000170001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_CONVERSION_FEATURES_QCOM = 1000172000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ELAPSED_TIMER_QUERY_FEATURES_QCOM = 1000173000, VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT = 1000178000, VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT = 1000178001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT = 1000178002, @@ -748,6 +771,16 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV = 1000206001, VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV = 1000314008, VK_STRUCTURE_TYPE_CHECKPOINT_DATA_2_NV = 1000314009, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_TIMING_FEATURES_EXT = 1000208000, + VK_STRUCTURE_TYPE_SWAPCHAIN_TIMING_PROPERTIES_EXT = 1000208001, + VK_STRUCTURE_TYPE_SWAPCHAIN_TIME_DOMAIN_PROPERTIES_EXT = 1000208002, + VK_STRUCTURE_TYPE_PRESENT_TIMINGS_INFO_EXT = 1000208003, + VK_STRUCTURE_TYPE_PRESENT_TIMING_INFO_EXT = 1000208004, + VK_STRUCTURE_TYPE_PAST_PRESENTATION_TIMING_INFO_EXT = 1000208005, + VK_STRUCTURE_TYPE_PAST_PRESENTATION_TIMING_PROPERTIES_EXT = 1000208006, + VK_STRUCTURE_TYPE_PAST_PRESENTATION_TIMING_EXT = 1000208007, + VK_STRUCTURE_TYPE_PRESENT_TIMING_SURFACE_CAPABILITIES_EXT = 1000208008, + VK_STRUCTURE_TYPE_SWAPCHAIN_CALIBRATED_TIMESTAMP_INFO_EXT = 1000208009, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL = 1000209000, VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL = 1000210000, VK_STRUCTURE_TYPE_INITIALIZE_PERFORMANCE_API_INFO_INTEL = 1000210001, @@ -772,6 +805,10 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR = 1000044006, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD = 1000227000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD = 1000229000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CONSTANT_DATA_FEATURES_KHR = 1000231000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ABORT_FEATURES_KHR = 1000233000, + VK_STRUCTURE_TYPE_DEVICE_FAULT_SHADER_ABORT_MESSAGE_INFO_KHR = 1000233001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ABORT_PROPERTIES_KHR = 1000233002, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT = 1000234000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_QUAD_CONTROL_FEATURES_KHR = 1000235000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT = 1000237000, @@ -810,15 +847,6 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAP_MEMORY_PLACED_PROPERTIES_EXT = 1000272001, VK_STRUCTURE_TYPE_MEMORY_MAP_PLACED_INFO_EXT = 1000272002, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT = 1000273000, - VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_EXT = 1000274000, - VK_STRUCTURE_TYPE_SURFACE_PRESENT_SCALING_CAPABILITIES_EXT = 1000274001, - VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_COMPATIBILITY_EXT = 1000274002, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT = 1000275000, - VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT = 1000275001, - VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT = 1000275002, - VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT = 1000275003, - VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT = 1000275004, - VK_STRUCTURE_TYPE_RELEASE_SWAPCHAIN_IMAGES_INFO_EXT = 1000275005, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV = 1000277000, VK_STRUCTURE_TYPE_GRAPHICS_SHADER_GROUP_CREATE_INFO_NV = 1000277001, VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV = 1000277002, @@ -838,11 +866,10 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT = 1000284000, VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT = 1000284001, VK_STRUCTURE_TYPE_DEVICE_MEMORY_REPORT_CALLBACK_DATA_EXT = 1000284002, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT = 1000286000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT = 1000286001, VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT = 1000287000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT = 1000287001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT = 1000287002, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_3D_FEATURES_EXT = 1000288000, VK_STRUCTURE_TYPE_PIPELINE_LIBRARY_CREATE_INFO_KHR = 1000290000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_BARRIER_FEATURES_NV = 1000292000, VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_PRESENT_BARRIER_NV = 1000292001, @@ -862,11 +889,35 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_VIDEO_ENCODE_SESSION_PARAMETERS_FEEDBACK_INFO_KHR = 1000299010, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV = 1000300000, VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV = 1000300001, + VK_STRUCTURE_TYPE_PERF_HINT_INFO_QCOM = 1000302000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_QUEUE_PERF_HINT_FEATURES_QCOM = 1000302001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_QUEUE_PERF_HINT_PROPERTIES_QCOM = 1000302002, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_3_FEATURES_QCOM = 1000303000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MULTIPLE_WAIT_QUEUES_FEATURES_QCOM = 1000304000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MULTIPLE_WAIT_QUEUES_PROPERTIES_QCOM = 1000304001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SPLIT_BARRIER_FEATURES_EXT = 1000305000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SPLIT_BARRIER_PROPERTIES_EXT = 1000305001, +#ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_CUDA_MODULE_CREATE_INFO_NV = 1000307000, +#endif +#ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_CUDA_FUNCTION_CREATE_INFO_NV = 1000307001, +#endif +#ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_CUDA_LAUNCH_INFO_NV = 1000307002, +#endif +#ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUDA_KERNEL_LAUNCH_FEATURES_NV = 1000307003, +#endif +#ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUDA_KERNEL_LAUNCH_PROPERTIES_NV = 1000307004, +#endif + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_SHADING_FEATURES_QCOM = 1000309000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_SHADING_PROPERTIES_QCOM = 1000309001, + VK_STRUCTURE_TYPE_RENDER_PASS_TILE_SHADING_CREATE_INFO_QCOM = 1000309002, + VK_STRUCTURE_TYPE_PER_TILE_BEGIN_INFO_QCOM = 1000309003, + VK_STRUCTURE_TYPE_PER_TILE_END_INFO_QCOM = 1000309004, + VK_STRUCTURE_TYPE_DISPATCH_TILE_INFO_QCOM = 1000309005, VK_STRUCTURE_TYPE_QUERY_LOW_LATENCY_SUPPORT_NV = 1000310000, VK_STRUCTURE_TYPE_EXPORT_METAL_OBJECT_CREATE_INFO_EXT = 1000311000, VK_STRUCTURE_TYPE_EXPORT_METAL_OBJECTS_INFO_EXT = 1000311001, @@ -893,6 +944,22 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_DESCRIPTOR_BUFFER_BINDING_INFO_EXT = 1000316011, VK_STRUCTURE_TYPE_DESCRIPTOR_BUFFER_BINDING_PUSH_DESCRIPTOR_BUFFER_HANDLE_EXT = 1000316012, VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CAPTURE_DESCRIPTOR_DATA_INFO_EXT = 1000316009, + VK_STRUCTURE_TYPE_DEVICE_MEMORY_COPY_KHR = 1000318000, + VK_STRUCTURE_TYPE_COPY_DEVICE_MEMORY_INFO_KHR = 1000318001, + VK_STRUCTURE_TYPE_DEVICE_MEMORY_IMAGE_COPY_KHR = 1000318002, + VK_STRUCTURE_TYPE_COPY_DEVICE_MEMORY_IMAGE_INFO_KHR = 1000318003, + VK_STRUCTURE_TYPE_MEMORY_RANGE_BARRIERS_INFO_KHR = 1000318004, + VK_STRUCTURE_TYPE_MEMORY_RANGE_BARRIER_KHR = 1000318005, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_ADDRESS_COMMANDS_FEATURES_KHR = 1000318006, + VK_STRUCTURE_TYPE_BIND_INDEX_BUFFER_3_INFO_KHR = 1000318007, + VK_STRUCTURE_TYPE_BIND_VERTEX_BUFFER_3_INFO_KHR = 1000318008, + VK_STRUCTURE_TYPE_DRAW_INDIRECT_2_INFO_KHR = 1000318009, + VK_STRUCTURE_TYPE_DRAW_INDIRECT_COUNT_2_INFO_KHR = 1000318010, + VK_STRUCTURE_TYPE_DISPATCH_INDIRECT_2_INFO_KHR = 1000318011, + VK_STRUCTURE_TYPE_CONDITIONAL_RENDERING_BEGIN_INFO_2_EXT = 1000318012, + VK_STRUCTURE_TYPE_BIND_TRANSFORM_FEEDBACK_BUFFER_2_INFO_EXT = 1000318013, + VK_STRUCTURE_TYPE_MEMORY_MARKER_INFO_AMD = 1000318014, + VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_2_KHR = 1000318015, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT = 1000320000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_PROPERTIES_EXT = 1000320001, VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_LIBRARY_CREATE_INFO_EXT = 1000320002, @@ -932,7 +999,6 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT = 1000355000, VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_DEPTH_CLIP_CONTROL_CREATE_INFO_EXT = 1000355001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT = 1000356000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_MODE_FIFO_LATEST_READY_FEATURES_EXT = 1000361000, VK_STRUCTURE_TYPE_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA = 1000364000, VK_STRUCTURE_TYPE_MEMORY_ZIRCON_HANDLE_PROPERTIES_FUCHSIA = 1000364001, VK_STRUCTURE_TYPE_MEMORY_GET_ZIRCON_HANDLE_INFO_FUCHSIA = 1000364002, @@ -967,6 +1033,11 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT = 1000381001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT = 1000382000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MAINTENANCE_1_FEATURES_KHR = 1000386000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_UNTYPED_POINTERS_FEATURES_KHR = 1000387000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_RGB_CONVERSION_FEATURES_VALVE = 1000390000, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_RGB_CONVERSION_CAPABILITIES_VALVE = 1000390001, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_PROFILE_RGB_CONVERSION_INFO_VALVE = 1000390002, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_SESSION_RGB_CONVERSION_CREATE_INFO_VALVE = 1000390003, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_MIN_LOD_FEATURES_EXT = 1000391000, VK_STRUCTURE_TYPE_IMAGE_VIEW_MIN_LOD_CREATE_INFO_EXT = 1000391001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT = 1000392000, @@ -1003,6 +1074,8 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_DEVICE_QUEUE_SHADER_CORE_CONTROL_CREATE_INFO_ARM = 1000417000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_FEATURES_ARM = 1000417001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_PROPERTIES_ARM = 1000417002, + VK_STRUCTURE_TYPE_DISPATCH_PARAMETERS_ARM = 1000417003, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_DISPATCH_PARAMETERS_PROPERTIES_ARM = 1000417004, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_SLICED_VIEW_OF_3D_FEATURES_EXT = 1000418000, VK_STRUCTURE_TYPE_IMAGE_VIEW_SLICED_CREATE_INFO_EXT = 1000418001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_SET_HOST_MAPPING_FEATURES_VALVE = 1000420000, @@ -1014,13 +1087,7 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_RENDER_PASS_STRIPE_BEGIN_INFO_ARM = 1000424002, VK_STRUCTURE_TYPE_RENDER_PASS_STRIPE_INFO_ARM = 1000424003, VK_STRUCTURE_TYPE_RENDER_PASS_STRIPE_SUBMIT_INFO_ARM = 1000424004, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_FEATURES_QCOM = 1000425000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_PROPERTIES_QCOM = 1000425001, - VK_STRUCTURE_TYPE_SUBPASS_FRAGMENT_DENSITY_MAP_OFFSET_END_INFO_QCOM = 1000425002, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_FEATURES_NV = 1000426000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_PROPERTIES_NV = 1000426001, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_FEATURES_NV = 1000427000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_PROPERTIES_NV = 1000427001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_COMPUTE_FEATURES_NV = 1000428000, VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_INDIRECT_BUFFER_INFO_NV = 1000428001, VK_STRUCTURE_TYPE_PIPELINE_INDIRECT_DEVICE_ADDRESS_INFO_NV = 1000428002, @@ -1035,6 +1102,12 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_IMAGE_VIEW_SAMPLE_WEIGHT_CREATE_INFO_QCOM = 1000440002, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NESTED_COMMAND_BUFFER_FEATURES_EXT = 1000451000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NESTED_COMMAND_BUFFER_PROPERTIES_EXT = 1000451001, + VK_STRUCTURE_TYPE_NATIVE_BUFFER_USAGE_OHOS = 1000452000, + VK_STRUCTURE_TYPE_NATIVE_BUFFER_PROPERTIES_OHOS = 1000452001, + VK_STRUCTURE_TYPE_NATIVE_BUFFER_FORMAT_PROPERTIES_OHOS = 1000452002, + VK_STRUCTURE_TYPE_IMPORT_NATIVE_BUFFER_INFO_OHOS = 1000452003, + VK_STRUCTURE_TYPE_MEMORY_GET_NATIVE_BUFFER_INFO_OHOS = 1000452004, + VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_OHOS = 1000452005, VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_ACQUIRE_UNMODIFIED_EXT = 1000453000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT = 1000455000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_PROPERTIES_EXT = 1000455001, @@ -1044,6 +1117,30 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_RENDER_PASS_SUBPASS_FEEDBACK_CREATE_INFO_EXT = 1000458003, VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_INFO_LUNARG = 1000459000, VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_LIST_LUNARG = 1000459001, + VK_STRUCTURE_TYPE_TENSOR_CREATE_INFO_ARM = 1000460000, + VK_STRUCTURE_TYPE_TENSOR_VIEW_CREATE_INFO_ARM = 1000460001, + VK_STRUCTURE_TYPE_BIND_TENSOR_MEMORY_INFO_ARM = 1000460002, + VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_TENSOR_ARM = 1000460003, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TENSOR_PROPERTIES_ARM = 1000460004, + VK_STRUCTURE_TYPE_TENSOR_FORMAT_PROPERTIES_ARM = 1000460005, + VK_STRUCTURE_TYPE_TENSOR_DESCRIPTION_ARM = 1000460006, + VK_STRUCTURE_TYPE_TENSOR_MEMORY_REQUIREMENTS_INFO_ARM = 1000460007, + VK_STRUCTURE_TYPE_TENSOR_MEMORY_BARRIER_ARM = 1000460008, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TENSOR_FEATURES_ARM = 1000460009, + VK_STRUCTURE_TYPE_DEVICE_TENSOR_MEMORY_REQUIREMENTS_ARM = 1000460010, + VK_STRUCTURE_TYPE_COPY_TENSOR_INFO_ARM = 1000460011, + VK_STRUCTURE_TYPE_TENSOR_COPY_ARM = 1000460012, + VK_STRUCTURE_TYPE_TENSOR_DEPENDENCY_INFO_ARM = 1000460013, + VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_TENSOR_ARM = 1000460014, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_TENSOR_INFO_ARM = 1000460015, + VK_STRUCTURE_TYPE_EXTERNAL_TENSOR_PROPERTIES_ARM = 1000460016, + VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_TENSOR_CREATE_INFO_ARM = 1000460017, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_TENSOR_FEATURES_ARM = 1000460018, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_TENSOR_PROPERTIES_ARM = 1000460019, + VK_STRUCTURE_TYPE_DESCRIPTOR_GET_TENSOR_INFO_ARM = 1000460020, + VK_STRUCTURE_TYPE_TENSOR_CAPTURE_DESCRIPTOR_DATA_INFO_ARM = 1000460021, + VK_STRUCTURE_TYPE_TENSOR_VIEW_CAPTURE_DESCRIPTOR_DATA_INFO_ARM = 1000460022, + VK_STRUCTURE_TYPE_FRAME_BOUNDARY_TENSORS_ARM = 1000460023, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_FEATURES_EXT = 1000462000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_PROPERTIES_EXT = 1000462001, VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_MODULE_IDENTIFIER_CREATE_INFO_EXT = 1000462002, @@ -1063,6 +1160,18 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ANTI_LAG_FEATURES_AMD = 1000476000, VK_STRUCTURE_TYPE_ANTI_LAG_DATA_AMD = 1000476001, VK_STRUCTURE_TYPE_ANTI_LAG_PRESENTATION_INFO_AMD = 1000476002, +#ifdef VK_ENABLE_BETA_EXTENSIONS + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DENSE_GEOMETRY_FORMAT_FEATURES_AMDX = 1000478000, +#endif +#ifdef VK_ENABLE_BETA_EXTENSIONS + VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_DENSE_GEOMETRY_FORMAT_TRIANGLES_DATA_AMDX = 1000478001, +#endif + VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_PRESENT_ID_2_KHR = 1000479000, + VK_STRUCTURE_TYPE_PRESENT_ID_2_KHR = 1000479001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_ID_2_FEATURES_KHR = 1000479002, + VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_PRESENT_WAIT_2_KHR = 1000480000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_WAIT_2_FEATURES_KHR = 1000480001, + VK_STRUCTURE_TYPE_PRESENT_WAIT_2_INFO_KHR = 1000480002, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_POSITION_FETCH_FEATURES_KHR = 1000481000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT = 1000482000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_PROPERTIES_EXT = 1000482001, @@ -1081,6 +1190,15 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_TILE_PROPERTIES_QCOM = 1000484001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_AMIGO_PROFILING_FEATURES_SEC = 1000485000, VK_STRUCTURE_TYPE_AMIGO_PROFILING_SUBMIT_INFO_SEC = 1000485001, + VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_KHR = 1000274000, + VK_STRUCTURE_TYPE_SURFACE_PRESENT_SCALING_CAPABILITIES_KHR = 1000274001, + VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_COMPATIBILITY_KHR = 1000274002, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_KHR = 1000275000, + VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_KHR = 1000275001, + VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_KHR = 1000275002, + VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_KHR = 1000275003, + VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_KHR = 1000275004, + VK_STRUCTURE_TYPE_RELEASE_SWAPCHAIN_IMAGES_INFO_KHR = 1000275005, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_VIEWPORTS_FEATURES_QCOM = 1000488000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV = 1000490000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_NV = 1000490001, @@ -1099,6 +1217,7 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_BUILTINS_PROPERTIES_ARM = 1000497001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_LIBRARY_GROUP_HANDLES_FEATURES_EXT = 1000498000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_UNUSED_ATTACHMENTS_FEATURES_EXT = 1000499000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INTERNALLY_SYNCHRONIZED_QUEUES_FEATURES_KHR = 1000504000, VK_STRUCTURE_TYPE_LATENCY_SLEEP_MODE_INFO_NV = 1000505000, VK_STRUCTURE_TYPE_LATENCY_SLEEP_INFO_NV = 1000505001, VK_STRUCTURE_TYPE_SET_LATENCY_MARKER_INFO_NV = 1000505002, @@ -1111,6 +1230,27 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_KHR = 1000506000, VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_KHR = 1000506001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_KHR = 1000506002, + VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_CREATE_INFO_ARM = 1000507000, + VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_SESSION_CREATE_INFO_ARM = 1000507001, + VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_RESOURCE_INFO_ARM = 1000507002, + VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_CONSTANT_ARM = 1000507003, + VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_SESSION_MEMORY_REQUIREMENTS_INFO_ARM = 1000507004, + VK_STRUCTURE_TYPE_BIND_DATA_GRAPH_PIPELINE_SESSION_MEMORY_INFO_ARM = 1000507005, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DATA_GRAPH_FEATURES_ARM = 1000507006, + VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_SHADER_MODULE_CREATE_INFO_ARM = 1000507007, + VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_PROPERTY_QUERY_RESULT_ARM = 1000507008, + VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_INFO_ARM = 1000507009, + VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_COMPILER_CONTROL_CREATE_INFO_ARM = 1000507010, + VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_SESSION_BIND_POINT_REQUIREMENTS_INFO_ARM = 1000507011, + VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_SESSION_BIND_POINT_REQUIREMENT_ARM = 1000507012, + VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_IDENTIFIER_CREATE_INFO_ARM = 1000507013, + VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_DISPATCH_INFO_ARM = 1000507014, + VK_STRUCTURE_TYPE_DATA_GRAPH_PROCESSING_ENGINE_CREATE_INFO_ARM = 1000507016, + VK_STRUCTURE_TYPE_QUEUE_FAMILY_DATA_GRAPH_PROCESSING_ENGINE_PROPERTIES_ARM = 1000507017, + VK_STRUCTURE_TYPE_QUEUE_FAMILY_DATA_GRAPH_PROPERTIES_ARM = 1000507018, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_QUEUE_FAMILY_DATA_GRAPH_PROCESSING_ENGINE_INFO_ARM = 1000507019, + VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_CONSTANT_TENSOR_SEMI_STRUCTURED_SPARSITY_INFO_ARM = 1000507015, + VK_STRUCTURE_TYPE_QUEUE_FAMILY_DATA_GRAPH_TOSA_PROPERTIES_ARM = 1000508000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_RENDER_AREAS_FEATURES_QCOM = 1000510000, VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_RENDER_AREAS_RENDER_PASS_BEGIN_INFO_QCOM = 1000510001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_KHR = 1000201000, @@ -1131,6 +1271,10 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_QUALITY_LEVEL_PROPERTIES_KHR = 1000513008, VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_SESSION_CREATE_INFO_KHR = 1000513009, VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_GOP_REMAINING_FRAME_INFO_KHR = 1000513010, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_DECODE_VP9_FEATURES_KHR = 1000514000, + VK_STRUCTURE_TYPE_VIDEO_DECODE_VP9_CAPABILITIES_KHR = 1000514001, + VK_STRUCTURE_TYPE_VIDEO_DECODE_VP9_PICTURE_INFO_KHR = 1000514002, + VK_STRUCTURE_TYPE_VIDEO_DECODE_VP9_PROFILE_INFO_KHR = 1000514003, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_1_FEATURES_KHR = 1000515000, VK_STRUCTURE_TYPE_VIDEO_INLINE_QUERY_INFO_KHR = 1000515001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PER_STAGE_DESCRIPTOR_SET_FEATURES_NV = 1000516000, @@ -1144,6 +1288,8 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_YCBCR_DEGAMMA_CREATE_INFO_QCOM = 1000520001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUBIC_CLAMP_FEATURES_QCOM = 1000521000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_FEATURES_EXT = 1000524000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFIED_IMAGE_LAYOUTS_FEATURES_KHR = 1000527000, + VK_STRUCTURE_TYPE_ATTACHMENT_FEEDBACK_LOOP_INFO_EXT = 1000527001, VK_STRUCTURE_TYPE_SCREEN_BUFFER_PROPERTIES_QNX = 1000529000, VK_STRUCTURE_TYPE_SCREEN_BUFFER_FORMAT_PROPERTIES_QNX = 1000529001, VK_STRUCTURE_TYPE_IMPORT_SCREEN_BUFFER_INFO_QNX = 1000529002, @@ -1154,8 +1300,25 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_SET_DESCRIPTOR_BUFFER_OFFSETS_INFO_EXT = 1000545007, VK_STRUCTURE_TYPE_BIND_DESCRIPTOR_BUFFER_EMBEDDED_SAMPLERS_INFO_EXT = 1000545008, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_POOL_OVERALLOCATION_FEATURES_NV = 1000546000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_MEMORY_HEAP_FEATURES_QCOM = 1000547000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_MEMORY_HEAP_PROPERTIES_QCOM = 1000547001, + VK_STRUCTURE_TYPE_TILE_MEMORY_REQUIREMENTS_QCOM = 1000547002, + VK_STRUCTURE_TYPE_TILE_MEMORY_BIND_INFO_QCOM = 1000547003, + VK_STRUCTURE_TYPE_TILE_MEMORY_SIZE_INFO_QCOM = 1000547004, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_FEATURES_KHR = 1000549000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_PROPERTIES_KHR = 1000426001, + VK_STRUCTURE_TYPE_COPY_MEMORY_INDIRECT_INFO_KHR = 1000549002, + VK_STRUCTURE_TYPE_COPY_MEMORY_TO_IMAGE_INDIRECT_INFO_KHR = 1000549003, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_FEATURES_EXT = 1000427000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_PROPERTIES_EXT = 1000427001, + VK_STRUCTURE_TYPE_DECOMPRESS_MEMORY_INFO_EXT = 1000550002, VK_STRUCTURE_TYPE_DISPLAY_SURFACE_STEREO_CREATE_INFO_NV = 1000551000, VK_STRUCTURE_TYPE_DISPLAY_MODE_STEREO_PROPERTIES_NV = 1000551001, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_INTRA_REFRESH_CAPABILITIES_KHR = 1000552000, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_SESSION_INTRA_REFRESH_CREATE_INFO_KHR = 1000552001, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_INTRA_REFRESH_INFO_KHR = 1000552002, + VK_STRUCTURE_TYPE_VIDEO_REFERENCE_INTRA_REFRESH_INFO_KHR = 1000552003, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_INTRA_REFRESH_FEATURES_KHR = 1000552004, VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUANTIZATION_MAP_CAPABILITIES_KHR = 1000553000, VK_STRUCTURE_TYPE_VIDEO_FORMAT_QUANTIZATION_MAP_PROPERTIES_KHR = 1000553001, VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUANTIZATION_MAP_INFO_KHR = 1000553002, @@ -1167,6 +1330,10 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_QUANTIZATION_MAP_CAPABILITIES_KHR = 1000553007, VK_STRUCTURE_TYPE_VIDEO_FORMAT_AV1_QUANTIZATION_MAP_PROPERTIES_KHR = 1000553008, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAW_ACCESS_CHAINS_FEATURES_NV = 1000555000, + VK_STRUCTURE_TYPE_EXTERNAL_COMPUTE_QUEUE_DEVICE_CREATE_INFO_NV = 1000556000, + VK_STRUCTURE_TYPE_EXTERNAL_COMPUTE_QUEUE_CREATE_INFO_NV = 1000556001, + VK_STRUCTURE_TYPE_EXTERNAL_COMPUTE_QUEUE_DATA_PARAMS_NV = 1000556002, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_COMPUTE_QUEUE_PROPERTIES_NV = 1000556003, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_RELAXED_EXTENDED_INSTRUCTION_FEATURES_KHR = 1000558000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMMAND_BUFFER_INHERITANCE_FEATURES_NV = 1000559000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_7_FEATURES_KHR = 1000562000, @@ -1176,6 +1343,7 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LAYERED_API_VULKAN_PROPERTIES_KHR = 1000562004, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT16_VECTOR_FEATURES_NV = 1000563000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_REPLICATED_COMPOSITES_FEATURES_EXT = 1000564000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT8_FEATURES_EXT = 1000567000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_VALIDATION_FEATURES_NV = 1000568000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_ACCELERATION_STRUCTURE_FEATURES_NV = 1000569000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_ACCELERATION_STRUCTURE_PROPERTIES_NV = 1000569001, @@ -1205,37 +1373,121 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_INDIRECT_EXECUTION_SET_SHADER_LAYOUT_INFO_EXT = 1000572012, VK_STRUCTURE_TYPE_GENERATED_COMMANDS_PIPELINE_INFO_EXT = 1000572013, VK_STRUCTURE_TYPE_GENERATED_COMMANDS_SHADER_INFO_EXT = 1000572014, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FAULT_FEATURES_KHR = 1000573000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FAULT_PROPERTIES_KHR = 1000573001, + VK_STRUCTURE_TYPE_DEVICE_FAULT_INFO_KHR = 1000573002, + VK_STRUCTURE_TYPE_DEVICE_FAULT_DEBUG_INFO_KHR = 1000573003, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_8_FEATURES_KHR = 1000574000, VK_STRUCTURE_TYPE_MEMORY_BARRIER_ACCESS_FLAGS_3_KHR = 1000574002, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ALIGNMENT_CONTROL_FEATURES_MESA = 1000575000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ALIGNMENT_CONTROL_PROPERTIES_MESA = 1000575001, VK_STRUCTURE_TYPE_IMAGE_ALIGNMENT_CONTROL_CREATE_INFO_MESA = 1000575002, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FMA_FEATURES_KHR = 1000579000, + VK_STRUCTURE_TYPE_PUSH_CONSTANT_BANK_INFO_NV = 1000580000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_CONSTANT_BANK_FEATURES_NV = 1000580001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_CONSTANT_BANK_PROPERTIES_NV = 1000580002, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_EXT = 1000581000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_EXT = 1000581001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_CONTROL_FEATURES_EXT = 1000582000, VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_DEPTH_CLAMP_CONTROL_CREATE_INFO_EXT = 1000582001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_9_FEATURES_KHR = 1000584000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_9_PROPERTIES_KHR = 1000584001, + VK_STRUCTURE_TYPE_QUEUE_FAMILY_OWNERSHIP_TRANSFER_PROPERTIES_KHR = 1000584002, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_2_FEATURES_KHR = 1000586000, VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_INLINE_SESSION_PARAMETERS_INFO_KHR = 1000586001, VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_INLINE_SESSION_PARAMETERS_INFO_KHR = 1000586002, VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_INLINE_SESSION_PARAMETERS_INFO_KHR = 1000586003, + VK_STRUCTURE_TYPE_SURFACE_CREATE_INFO_OHOS = 1000685000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HDR_VIVID_FEATURES_HUAWEI = 1000590000, VK_STRUCTURE_TYPE_HDR_VIVID_DYNAMIC_METADATA_HUAWEI = 1000590001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_2_FEATURES_NV = 1000593000, VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_FLEXIBLE_DIMENSIONS_PROPERTIES_NV = 1000593001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_2_PROPERTIES_NV = 1000593002, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_OPACITY_MICROMAP_FEATURES_ARM = 1000596000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_FEEDBACK_2_FEATURES_KHR = 1000598000, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_FEEDBACK_2_CAPABILITIES_KHR = 1000598001, + VK_STRUCTURE_TYPE_QUERY_POOL_VIDEO_ENCODE_PER_PARTITION_FEEDBACK_CREATE_INFO_KHR = 1000598002, VK_STRUCTURE_TYPE_IMPORT_MEMORY_METAL_HANDLE_INFO_EXT = 1000602000, VK_STRUCTURE_TYPE_MEMORY_METAL_HANDLE_PROPERTIES_EXT = 1000602001, VK_STRUCTURE_TYPE_MEMORY_GET_METAL_HANDLE_INFO_EXT = 1000602002, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_KHR = 1000421000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_COUNTERS_BY_REGION_FEATURES_ARM = 1000605000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_COUNTERS_BY_REGION_PROPERTIES_ARM = 1000605001, + VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_ARM = 1000605002, + VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_DESCRIPTION_ARM = 1000605003, + VK_STRUCTURE_TYPE_RENDER_PASS_PERFORMANCE_COUNTERS_BY_REGION_BEGIN_INFO_ARM = 1000605004, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INSTRUMENTATION_FEATURES_ARM = 1000607000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INSTRUMENTATION_PROPERTIES_ARM = 1000607001, + VK_STRUCTURE_TYPE_SHADER_INSTRUMENTATION_CREATE_INFO_ARM = 1000607002, + VK_STRUCTURE_TYPE_SHADER_INSTRUMENTATION_METRIC_DESCRIPTION_ARM = 1000607003, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_ROBUSTNESS_FEATURES_EXT = 1000608000, -#ifdef VK_ENABLE_BETA_EXTENSIONS + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FORMAT_PACK_FEATURES_ARM = 1000609000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_LAYERED_FEATURES_VALVE = 1000611000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_LAYERED_PROPERTIES_VALVE = 1000611001, + VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_DENSITY_MAP_LAYERED_CREATE_INFO_VALVE = 1000611002, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_KHR = 1000286000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_KHR = 1000286001, VK_STRUCTURE_TYPE_SET_PRESENT_CONFIG_NV = 1000613000, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_METERING_FEATURES_NV = 1000613001, -#endif + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SWAPCHAIN_FEATURES_EXT = 1000616000, + VK_STRUCTURE_TYPE_SWAPCHAIN_FLAGS_SURFACE_CAPABILITIES_EXT = 1000616001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_FEATURES_EXT = 1000425000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_PROPERTIES_EXT = 1000425001, + VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_OFFSET_END_INFO_EXT = 1000425002, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ZERO_INITIALIZE_DEVICE_MEMORY_FEATURES_EXT = 1000620000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_MODE_FIFO_LATEST_READY_FEATURES_KHR = 1000361000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_FEATURES_KHR = 1000623000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_OPACITY_MICROMAP_PROPERTIES_KHR = 1000623001, + VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MICROMAP_DATA_KHR = 1000623002, + VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_TRIANGLES_OPACITY_MICROMAP_KHR = 1000623003, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_64_BIT_INDEXING_FEATURES_EXT = 1000627000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_RESOLVE_FEATURES_EXT = 1000628000, + VK_STRUCTURE_TYPE_BEGIN_CUSTOM_RESOLVE_INFO_EXT = 1000628001, + VK_STRUCTURE_TYPE_CUSTOM_RESOLVE_CREATE_INFO_EXT = 1000628002, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DATA_GRAPH_MODEL_FEATURES_QCOM = 1000629000, + VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_BUILTIN_MODEL_CREATE_INFO_QCOM = 1000629001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_10_FEATURES_KHR = 1000630000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_10_PROPERTIES_KHR = 1000630001, + VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_FLAGS_INFO_KHR = 1000630002, + VK_STRUCTURE_TYPE_RENDERING_END_INFO_KHR = 1000619003, + VK_STRUCTURE_TYPE_RESOLVE_IMAGE_MODE_INFO_KHR = 1000630004, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DATA_GRAPH_OPTICAL_FLOW_FEATURES_ARM = 1000631000, + VK_STRUCTURE_TYPE_QUEUE_FAMILY_DATA_GRAPH_OPTICAL_FLOW_PROPERTIES_ARM = 1000631001, + VK_STRUCTURE_TYPE_DATA_GRAPH_OPTICAL_FLOW_IMAGE_FORMAT_INFO_ARM = 1000631003, + VK_STRUCTURE_TYPE_DATA_GRAPH_OPTICAL_FLOW_IMAGE_FORMAT_PROPERTIES_ARM = 1000631004, + VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_OPTICAL_FLOW_DISPATCH_INFO_ARM = 1000631005, + VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_OPTICAL_FLOW_CREATE_INFO_ARM = 1000631002, + VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_RESOURCE_INFO_IMAGE_LAYOUT_ARM = 1000631006, + VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_SINGLE_NODE_CREATE_INFO_ARM = 1000631007, + VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_SINGLE_NODE_CONNECTION_ARM = 1000631008, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_LONG_VECTOR_FEATURES_EXT = 1000635000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_LONG_VECTOR_PROPERTIES_EXT = 1000635001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CACHE_INCREMENTAL_MODE_FEATURES_SEC = 1000637000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_UNIFORM_BUFFER_UNSIZED_ARRAY_FEATURES_EXT = 1000642000, + VK_STRUCTURE_TYPE_COMPUTE_OCCUPANCY_PRIORITY_PARAMETERS_NV = 1000645000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_OCCUPANCY_PRIORITY_FEATURES_NV = 1000645001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_11_FEATURES_KHR = 1000657000, + VK_STRUCTURE_TYPE_QUEUE_FAMILY_OPTIMAL_IMAGE_TRANSFER_GRANULARITY_PROPERTIES_KHR = 1000657001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_PARTITIONED_FEATURES_EXT = 1000662000, + VK_STRUCTURE_TYPE_UBM_SURFACE_CREATE_INFO_SEC = 1000664000, + VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_4_KHR = 1000668000, + VK_STRUCTURE_TYPE_IMAGE_CREATE_FLAGS_2_CREATE_INFO_KHR = 1000668001, + VK_STRUCTURE_TYPE_IMAGE_USAGE_FLAGS_2_CREATE_INFO_KHR = 1000668002, + VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_2_CREATE_INFO_KHR = 1000668003, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_FLAGS_FEATURES_KHR = 1000668004, + VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_2_CREATE_INFO_KHR = 1000668005, + VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_2_KHR = 1000668006, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MIXED_FLOAT_DOT_PRODUCT_FEATURES_VALVE = 1000673000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_THROTTLE_HINT_FEATURES_SEC = 1000674000, + VK_STRUCTURE_TYPE_THROTTLE_HINT_SUBMIT_INFO_SEC = 1000674001, + VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_NEURAL_STATISTICS_CREATE_INFO_ARM = 1000676000, + VK_STRUCTURE_TYPE_DATA_GRAPH_PIPELINE_SESSION_NEURAL_STATISTICS_CREATE_INFO_ARM = 1000676001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DATA_GRAPH_NEURAL_ACCELERATOR_STATISTICS_FEATURES_ARM = 1000676002, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_RESTART_INDEX_FEATURES_EXT = 1000678000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_DECODE_VECTOR_FEATURES_NV = 1000689000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETER_FEATURES = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES, - // VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT is a deprecated alias + // VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT is a legacy alias VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT, VK_STRUCTURE_TYPE_RENDERING_INFO_KHR = VK_STRUCTURE_TYPE_RENDERING_INFO, VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO, @@ -1283,7 +1535,7 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO, - // VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES2_EXT is a deprecated alias + // VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES2_EXT is a legacy alias VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES2_EXT = VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES, VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO, @@ -1358,7 +1610,7 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR = VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO, VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO_KHR = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO, VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO_KHR = VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO, - // VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO_INTEL is a deprecated alias + // VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO_INTEL is a legacy alias VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO_INTEL = VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES, @@ -1399,10 +1651,21 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_HOST_IMAGE_COPY_DEVICE_PERFORMANCE_QUERY_EXT = VK_STRUCTURE_TYPE_HOST_IMAGE_COPY_DEVICE_PERFORMANCE_QUERY, VK_STRUCTURE_TYPE_MEMORY_MAP_INFO_KHR = VK_STRUCTURE_TYPE_MEMORY_MAP_INFO, VK_STRUCTURE_TYPE_MEMORY_UNMAP_INFO_KHR = VK_STRUCTURE_TYPE_MEMORY_UNMAP_INFO, + VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_EXT = VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_KHR, + VK_STRUCTURE_TYPE_SURFACE_PRESENT_SCALING_CAPABILITIES_EXT = VK_STRUCTURE_TYPE_SURFACE_PRESENT_SCALING_CAPABILITIES_KHR, + VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_COMPATIBILITY_EXT = VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_COMPATIBILITY_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_KHR, + VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT = VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_KHR, + VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_KHR, + VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT = VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_KHR, + VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_KHR, + VK_STRUCTURE_TYPE_RELEASE_SWAPCHAIN_IMAGES_INFO_EXT = VK_STRUCTURE_TYPE_RELEASE_SWAPCHAIN_IMAGES_INFO_KHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_KHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES, VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO, VK_STRUCTURE_TYPE_PRIVATE_DATA_SLOT_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_PRIVATE_DATA_SLOT_CREATE_INFO, @@ -1434,6 +1697,7 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT, VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE = VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_EXT, VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_MODE_FIFO_LATEST_READY_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRESENT_MODE_FIFO_LATEST_READY_FEATURES_KHR, VK_STRUCTURE_TYPE_PIPELINE_INFO_EXT = VK_STRUCTURE_TYPE_PIPELINE_INFO_KHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES, VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT = VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES, @@ -1443,6 +1707,12 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_DEVICE_IMAGE_MEMORY_REQUIREMENTS_KHR = VK_STRUCTURE_TYPE_DEVICE_IMAGE_MEMORY_REQUIREMENTS, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_FEATURES_QCOM = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_FEATURES_EXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_PROPERTIES_QCOM = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_PROPERTIES_EXT, + VK_STRUCTURE_TYPE_SUBPASS_FRAGMENT_DENSITY_MAP_OFFSET_END_INFO_QCOM = VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_OFFSET_END_INFO_EXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_PROPERTIES_NV = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_PROPERTIES_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_FEATURES_NV = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_FEATURES_EXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_PROPERTIES_NV = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES, @@ -1469,58 +1739,10 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_PUSH_CONSTANTS_INFO_KHR = VK_STRUCTURE_TYPE_PUSH_CONSTANTS_INFO, VK_STRUCTURE_TYPE_PUSH_DESCRIPTOR_SET_INFO_KHR = VK_STRUCTURE_TYPE_PUSH_DESCRIPTOR_SET_INFO, VK_STRUCTURE_TYPE_PUSH_DESCRIPTOR_SET_WITH_TEMPLATE_INFO_KHR = VK_STRUCTURE_TYPE_PUSH_DESCRIPTOR_SET_WITH_TEMPLATE_INFO, + VK_STRUCTURE_TYPE_RENDERING_END_INFO_EXT = VK_STRUCTURE_TYPE_RENDERING_END_INFO_KHR, VK_STRUCTURE_TYPE_MAX_ENUM = 0x7FFFFFFF } VkStructureType; -typedef enum VkPipelineCacheHeaderVersion { - VK_PIPELINE_CACHE_HEADER_VERSION_ONE = 1, - VK_PIPELINE_CACHE_HEADER_VERSION_MAX_ENUM = 0x7FFFFFFF -} VkPipelineCacheHeaderVersion; - -typedef enum VkImageLayout { - VK_IMAGE_LAYOUT_UNDEFINED = 0, - VK_IMAGE_LAYOUT_GENERAL = 1, - VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL = 2, - VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL = 3, - VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL = 4, - VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL = 5, - VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL = 6, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL = 7, - VK_IMAGE_LAYOUT_PREINITIALIZED = 8, - VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL = 1000117000, - VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL = 1000117001, - VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL = 1000241000, - VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL = 1000241001, - VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL = 1000241002, - VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL = 1000241003, - VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL = 1000314000, - VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL = 1000314001, - VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ = 1000232000, - VK_IMAGE_LAYOUT_PRESENT_SRC_KHR = 1000001002, - VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR = 1000024000, - VK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR = 1000024001, - VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR = 1000024002, - VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR = 1000111000, - VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT = 1000218000, - VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR = 1000164003, - VK_IMAGE_LAYOUT_VIDEO_ENCODE_DST_KHR = 1000299000, - VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR = 1000299001, - VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR = 1000299002, - VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT = 1000339000, - VK_IMAGE_LAYOUT_VIDEO_ENCODE_QUANTIZATION_MAP_KHR = 1000553000, - VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL, - VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, - VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV = VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR, - VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR = VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ, - VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, - VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, - VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, - VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL, - VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL, - VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL, - VK_IMAGE_LAYOUT_MAX_ENUM = 0x7FFFFFFF -} VkImageLayout; - typedef enum VkObjectType { VK_OBJECT_TYPE_UNKNOWN = 0, VK_OBJECT_TYPE_INSTANCE = 1, @@ -1548,8 +1770,8 @@ typedef enum VkObjectType { VK_OBJECT_TYPE_DESCRIPTOR_SET = 23, VK_OBJECT_TYPE_FRAMEBUFFER = 24, VK_OBJECT_TYPE_COMMAND_POOL = 25, - VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION = 1000156000, VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE = 1000085000, + VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION = 1000156000, VK_OBJECT_TYPE_PRIVATE_DATA_SLOT = 1000295000, VK_OBJECT_TYPE_SURFACE_KHR = 1000000000, VK_OBJECT_TYPE_SWAPCHAIN_KHR = 1000001000, @@ -1561,21 +1783,31 @@ typedef enum VkObjectType { VK_OBJECT_TYPE_CU_MODULE_NVX = 1000029000, VK_OBJECT_TYPE_CU_FUNCTION_NVX = 1000029001, VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT = 1000128000, + VK_OBJECT_TYPE_GPA_SESSION_AMD = 1000133000, VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR = 1000150000, VK_OBJECT_TYPE_VALIDATION_CACHE_EXT = 1000160000, VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV = 1000165000, VK_OBJECT_TYPE_PERFORMANCE_CONFIGURATION_INTEL = 1000210000, VK_OBJECT_TYPE_DEFERRED_OPERATION_KHR = 1000268000, VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NV = 1000277000, +#ifdef VK_ENABLE_BETA_EXTENSIONS VK_OBJECT_TYPE_CUDA_MODULE_NV = 1000307000, +#endif +#ifdef VK_ENABLE_BETA_EXTENSIONS VK_OBJECT_TYPE_CUDA_FUNCTION_NV = 1000307001, +#endif VK_OBJECT_TYPE_BUFFER_COLLECTION_FUCHSIA = 1000366000, VK_OBJECT_TYPE_MICROMAP_EXT = 1000396000, + VK_OBJECT_TYPE_TENSOR_ARM = 1000460000, + VK_OBJECT_TYPE_TENSOR_VIEW_ARM = 1000460001, VK_OBJECT_TYPE_OPTICAL_FLOW_SESSION_NV = 1000464000, VK_OBJECT_TYPE_SHADER_EXT = 1000482000, VK_OBJECT_TYPE_PIPELINE_BINARY_KHR = 1000483000, + VK_OBJECT_TYPE_DATA_GRAPH_PIPELINE_SESSION_ARM = 1000507000, + VK_OBJECT_TYPE_EXTERNAL_COMPUTE_QUEUE_NV = 1000556000, VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_EXT = 1000572000, VK_OBJECT_TYPE_INDIRECT_EXECUTION_SET_EXT = 1000572001, + VK_OBJECT_TYPE_SHADER_INSTRUMENTATION_ARM = 1000607000, VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_KHR = VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE, VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_KHR = VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION, VK_OBJECT_TYPE_PRIVATE_DATA_SLOT_EXT = VK_OBJECT_TYPE_PRIVATE_DATA_SLOT, @@ -1591,6 +1823,7 @@ typedef enum VkVendorId { VK_VENDOR_ID_MESA = 0x10005, VK_VENDOR_ID_POCL = 0x10006, VK_VENDOR_ID_MOBILEYE = 0x10007, + VK_VENDOR_ID_APE = 0x10008, VK_VENDOR_ID_MAX_ENUM = 0x7FFFFFFF } VkVendorId; @@ -1858,7 +2091,55 @@ typedef enum VkFormat { VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG = 1000054005, VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG = 1000054006, VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG = 1000054007, + VK_FORMAT_ASTC_3x3x3_UNORM_BLOCK_EXT = 1000288000, + VK_FORMAT_ASTC_3x3x3_SRGB_BLOCK_EXT = 1000288001, + VK_FORMAT_ASTC_3x3x3_SFLOAT_BLOCK_EXT = 1000288002, + VK_FORMAT_ASTC_4x3x3_UNORM_BLOCK_EXT = 1000288003, + VK_FORMAT_ASTC_4x3x3_SRGB_BLOCK_EXT = 1000288004, + VK_FORMAT_ASTC_4x3x3_SFLOAT_BLOCK_EXT = 1000288005, + VK_FORMAT_ASTC_4x4x3_UNORM_BLOCK_EXT = 1000288006, + VK_FORMAT_ASTC_4x4x3_SRGB_BLOCK_EXT = 1000288007, + VK_FORMAT_ASTC_4x4x3_SFLOAT_BLOCK_EXT = 1000288008, + VK_FORMAT_ASTC_4x4x4_UNORM_BLOCK_EXT = 1000288009, + VK_FORMAT_ASTC_4x4x4_SRGB_BLOCK_EXT = 1000288010, + VK_FORMAT_ASTC_4x4x4_SFLOAT_BLOCK_EXT = 1000288011, + VK_FORMAT_ASTC_5x4x4_UNORM_BLOCK_EXT = 1000288012, + VK_FORMAT_ASTC_5x4x4_SRGB_BLOCK_EXT = 1000288013, + VK_FORMAT_ASTC_5x4x4_SFLOAT_BLOCK_EXT = 1000288014, + VK_FORMAT_ASTC_5x5x4_UNORM_BLOCK_EXT = 1000288015, + VK_FORMAT_ASTC_5x5x4_SRGB_BLOCK_EXT = 1000288016, + VK_FORMAT_ASTC_5x5x4_SFLOAT_BLOCK_EXT = 1000288017, + VK_FORMAT_ASTC_5x5x5_UNORM_BLOCK_EXT = 1000288018, + VK_FORMAT_ASTC_5x5x5_SRGB_BLOCK_EXT = 1000288019, + VK_FORMAT_ASTC_5x5x5_SFLOAT_BLOCK_EXT = 1000288020, + VK_FORMAT_ASTC_6x5x5_UNORM_BLOCK_EXT = 1000288021, + VK_FORMAT_ASTC_6x5x5_SRGB_BLOCK_EXT = 1000288022, + VK_FORMAT_ASTC_6x5x5_SFLOAT_BLOCK_EXT = 1000288023, + VK_FORMAT_ASTC_6x6x5_UNORM_BLOCK_EXT = 1000288024, + VK_FORMAT_ASTC_6x6x5_SRGB_BLOCK_EXT = 1000288025, + VK_FORMAT_ASTC_6x6x5_SFLOAT_BLOCK_EXT = 1000288026, + VK_FORMAT_ASTC_6x6x6_UNORM_BLOCK_EXT = 1000288027, + VK_FORMAT_ASTC_6x6x6_SRGB_BLOCK_EXT = 1000288028, + VK_FORMAT_ASTC_6x6x6_SFLOAT_BLOCK_EXT = 1000288029, + VK_FORMAT_R8_BOOL_ARM = 1000460000, + VK_FORMAT_R16_SFLOAT_FPENCODING_BFLOAT16_ARM = 1000460001, + VK_FORMAT_R8_SFLOAT_FPENCODING_FLOAT8E4M3_ARM = 1000460002, + VK_FORMAT_R8_SFLOAT_FPENCODING_FLOAT8E5M2_ARM = 1000460003, VK_FORMAT_R16G16_SFIXED5_NV = 1000464000, + VK_FORMAT_R10X6_UINT_PACK16_ARM = 1000609000, + VK_FORMAT_R10X6G10X6_UINT_2PACK16_ARM = 1000609001, + VK_FORMAT_R10X6G10X6B10X6A10X6_UINT_4PACK16_ARM = 1000609002, + VK_FORMAT_R12X4_UINT_PACK16_ARM = 1000609003, + VK_FORMAT_R12X4G12X4_UINT_2PACK16_ARM = 1000609004, + VK_FORMAT_R12X4G12X4B12X4A12X4_UINT_4PACK16_ARM = 1000609005, + VK_FORMAT_R14X2_UINT_PACK16_ARM = 1000609006, + VK_FORMAT_R14X2G14X2_UINT_2PACK16_ARM = 1000609007, + VK_FORMAT_R14X2G14X2B14X2A14X2_UINT_4PACK16_ARM = 1000609008, + VK_FORMAT_R14X2_UNORM_PACK16_ARM = 1000609009, + VK_FORMAT_R14X2G14X2_UNORM_2PACK16_ARM = 1000609010, + VK_FORMAT_R14X2G14X2B14X2A14X2_UNORM_4PACK16_ARM = 1000609011, + VK_FORMAT_G14X2_B14X2R14X2_2PLANE_420_UNORM_3PACK16_ARM = 1000609012, + VK_FORMAT_G14X2_B14X2R14X2_2PLANE_422_UNORM_3PACK16_ARM = 1000609013, VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK, VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK, VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT = VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK, @@ -1913,7 +2194,7 @@ typedef enum VkFormat { VK_FORMAT_G16_B16R16_2PLANE_444_UNORM_EXT = VK_FORMAT_G16_B16R16_2PLANE_444_UNORM, VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT = VK_FORMAT_A4R4G4B4_UNORM_PACK16, VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT = VK_FORMAT_A4B4G4R4_UNORM_PACK16, - // VK_FORMAT_R16G16_S10_5_NV is a deprecated alias + // VK_FORMAT_R16G16_S10_5_NV is a legacy alias VK_FORMAT_R16G16_S10_5_NV = VK_FORMAT_R16G16_SFIXED5_NV, VK_FORMAT_A1B5G5R5_UNORM_PACK16_KHR = VK_FORMAT_A1B5G5R5_UNORM_PACK16, VK_FORMAT_A8_UNORM_KHR = VK_FORMAT_A8_UNORM, @@ -1953,6 +2234,7 @@ typedef enum VkQueryType { VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR = 1000150000, VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR = 1000150001, VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_NV = 1000165000, + VK_QUERY_TYPE_TIME_ELAPSED_QCOM = 1000173000, VK_QUERY_TYPE_PERFORMANCE_QUERY_INTEL = 1000210000, VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR = 1000299000, VK_QUERY_TYPE_MESH_PRIMITIVES_GENERATED_EXT = 1000328000, @@ -1970,6 +2252,52 @@ typedef enum VkSharingMode { VK_SHARING_MODE_MAX_ENUM = 0x7FFFFFFF } VkSharingMode; +typedef enum VkImageLayout { + VK_IMAGE_LAYOUT_UNDEFINED = 0, + VK_IMAGE_LAYOUT_GENERAL = 1, + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL = 2, + VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL = 3, + VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL = 4, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL = 5, + VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL = 6, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL = 7, + VK_IMAGE_LAYOUT_PREINITIALIZED = 8, + VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL = 1000117000, + VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL = 1000117001, + VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL = 1000241000, + VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL = 1000241001, + VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL = 1000241002, + VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL = 1000241003, + VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL = 1000314000, + VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL = 1000314001, + VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ = 1000232000, + VK_IMAGE_LAYOUT_PRESENT_SRC_KHR = 1000001002, + VK_IMAGE_LAYOUT_VIDEO_DECODE_DST_KHR = 1000024000, + VK_IMAGE_LAYOUT_VIDEO_DECODE_SRC_KHR = 1000024001, + VK_IMAGE_LAYOUT_VIDEO_DECODE_DPB_KHR = 1000024002, + VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR = 1000111000, + VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT = 1000218000, + VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR = 1000164003, + VK_IMAGE_LAYOUT_VIDEO_ENCODE_DST_KHR = 1000299000, + VK_IMAGE_LAYOUT_VIDEO_ENCODE_SRC_KHR = 1000299001, + VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR = 1000299002, + VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT = 1000339000, + VK_IMAGE_LAYOUT_TENSOR_ALIASING_ARM = 1000460000, + VK_IMAGE_LAYOUT_VIDEO_ENCODE_QUANTIZATION_MAP_KHR = 1000553000, + VK_IMAGE_LAYOUT_ZERO_INITIALIZED_EXT = 1000620000, + VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL, + VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, + VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV = VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR, + VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR = VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ, + VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, + VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, + VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, + VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL, + VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL, + VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL, + VK_IMAGE_LAYOUT_MAX_ENUM = 0x7FFFFFFF +} VkImageLayout; + typedef enum VkComponentSwizzle { VK_COMPONENT_SWIZZLE_IDENTITY = 0, VK_COMPONENT_SWIZZLE_ZERO = 1, @@ -1992,6 +2320,116 @@ typedef enum VkImageViewType { VK_IMAGE_VIEW_TYPE_MAX_ENUM = 0x7FFFFFFF } VkImageViewType; +typedef enum VkCommandBufferLevel { + VK_COMMAND_BUFFER_LEVEL_PRIMARY = 0, + VK_COMMAND_BUFFER_LEVEL_SECONDARY = 1, + VK_COMMAND_BUFFER_LEVEL_MAX_ENUM = 0x7FFFFFFF +} VkCommandBufferLevel; + +typedef enum VkIndexType { + VK_INDEX_TYPE_UINT16 = 0, + VK_INDEX_TYPE_UINT32 = 1, + VK_INDEX_TYPE_UINT8 = 1000265000, + VK_INDEX_TYPE_NONE_KHR = 1000165000, + VK_INDEX_TYPE_NONE_NV = VK_INDEX_TYPE_NONE_KHR, + VK_INDEX_TYPE_UINT8_EXT = VK_INDEX_TYPE_UINT8, + VK_INDEX_TYPE_UINT8_KHR = VK_INDEX_TYPE_UINT8, + VK_INDEX_TYPE_MAX_ENUM = 0x7FFFFFFF +} VkIndexType; + +typedef enum VkPipelineCacheHeaderVersion { + VK_PIPELINE_CACHE_HEADER_VERSION_ONE = 1, + VK_PIPELINE_CACHE_HEADER_VERSION_DATA_GRAPH_QCOM = 1000629000, + VK_PIPELINE_CACHE_HEADER_VERSION_MAX_ENUM = 0x7FFFFFFF +} VkPipelineCacheHeaderVersion; + +typedef enum VkBorderColor { + VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK = 0, + VK_BORDER_COLOR_INT_TRANSPARENT_BLACK = 1, + VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK = 2, + VK_BORDER_COLOR_INT_OPAQUE_BLACK = 3, + VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE = 4, + VK_BORDER_COLOR_INT_OPAQUE_WHITE = 5, + VK_BORDER_COLOR_FLOAT_CUSTOM_EXT = 1000287003, + VK_BORDER_COLOR_INT_CUSTOM_EXT = 1000287004, + VK_BORDER_COLOR_MAX_ENUM = 0x7FFFFFFF +} VkBorderColor; + +typedef enum VkFilter { + VK_FILTER_NEAREST = 0, + VK_FILTER_LINEAR = 1, + VK_FILTER_CUBIC_EXT = 1000015000, + VK_FILTER_CUBIC_IMG = VK_FILTER_CUBIC_EXT, + VK_FILTER_MAX_ENUM = 0x7FFFFFFF +} VkFilter; + +typedef enum VkSamplerAddressMode { + VK_SAMPLER_ADDRESS_MODE_REPEAT = 0, + VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT = 1, + VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE = 2, + VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER = 3, + VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE = 4, + // VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE_KHR is a legacy alias + VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE_KHR = VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE, + VK_SAMPLER_ADDRESS_MODE_MAX_ENUM = 0x7FFFFFFF +} VkSamplerAddressMode; + +typedef enum VkCompareOp { + VK_COMPARE_OP_NEVER = 0, + VK_COMPARE_OP_LESS = 1, + VK_COMPARE_OP_EQUAL = 2, + VK_COMPARE_OP_LESS_OR_EQUAL = 3, + VK_COMPARE_OP_GREATER = 4, + VK_COMPARE_OP_NOT_EQUAL = 5, + VK_COMPARE_OP_GREATER_OR_EQUAL = 6, + VK_COMPARE_OP_ALWAYS = 7, + VK_COMPARE_OP_MAX_ENUM = 0x7FFFFFFF +} VkCompareOp; + +typedef enum VkSamplerMipmapMode { + VK_SAMPLER_MIPMAP_MODE_NEAREST = 0, + VK_SAMPLER_MIPMAP_MODE_LINEAR = 1, + VK_SAMPLER_MIPMAP_MODE_MAX_ENUM = 0x7FFFFFFF +} VkSamplerMipmapMode; + +typedef enum VkDescriptorType { + VK_DESCRIPTOR_TYPE_SAMPLER = 0, + VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER = 1, + VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE = 2, + VK_DESCRIPTOR_TYPE_STORAGE_IMAGE = 3, + VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER = 4, + VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER = 5, + VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER = 6, + VK_DESCRIPTOR_TYPE_STORAGE_BUFFER = 7, + VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC = 8, + VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC = 9, + VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT = 10, + VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK = 1000138000, + VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR = 1000150000, + VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV = 1000165000, + VK_DESCRIPTOR_TYPE_SAMPLE_WEIGHT_IMAGE_QCOM = 1000440000, + VK_DESCRIPTOR_TYPE_BLOCK_MATCH_IMAGE_QCOM = 1000440001, + VK_DESCRIPTOR_TYPE_TENSOR_ARM = 1000460000, + VK_DESCRIPTOR_TYPE_MUTABLE_EXT = 1000351000, + VK_DESCRIPTOR_TYPE_PARTITIONED_ACCELERATION_STRUCTURE_NV = 1000570000, + VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT = VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK, + VK_DESCRIPTOR_TYPE_MUTABLE_VALVE = VK_DESCRIPTOR_TYPE_MUTABLE_EXT, + VK_DESCRIPTOR_TYPE_MAX_ENUM = 0x7FFFFFFF +} VkDescriptorType; + +typedef enum VkPipelineBindPoint { + VK_PIPELINE_BIND_POINT_GRAPHICS = 0, + VK_PIPELINE_BIND_POINT_COMPUTE = 1, +#ifdef VK_ENABLE_BETA_EXTENSIONS + VK_PIPELINE_BIND_POINT_EXECUTION_GRAPH_AMDX = 1000134000, +#endif + VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR = 1000165000, + VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI = 1000369003, + VK_PIPELINE_BIND_POINT_DATA_GRAPH_ARM = 1000507000, + VK_PIPELINE_BIND_POINT_RAY_TRACING_NV = VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, + VK_PIPELINE_BIND_POINT_MAX_ENUM = 0x7FFFFFFF +} VkPipelineBindPoint; + typedef enum VkBlendFactor { VK_BLEND_FACTOR_ZERO = 0, VK_BLEND_FACTOR_ONE = 1, @@ -2070,18 +2508,6 @@ typedef enum VkBlendOp { VK_BLEND_OP_MAX_ENUM = 0x7FFFFFFF } VkBlendOp; -typedef enum VkCompareOp { - VK_COMPARE_OP_NEVER = 0, - VK_COMPARE_OP_LESS = 1, - VK_COMPARE_OP_EQUAL = 2, - VK_COMPARE_OP_LESS_OR_EQUAL = 3, - VK_COMPARE_OP_GREATER = 4, - VK_COMPARE_OP_NOT_EQUAL = 5, - VK_COMPARE_OP_GREATER_OR_EQUAL = 6, - VK_COMPARE_OP_ALWAYS = 7, - VK_COMPARE_OP_MAX_ENUM = 0x7FFFFFFF -} VkCompareOp; - typedef enum VkDynamicState { VK_DYNAMIC_STATE_VIEWPORT = 0, VK_DYNAMIC_STATE_SCISSOR = 1, @@ -2182,6 +2608,38 @@ typedef enum VkFrontFace { VK_FRONT_FACE_MAX_ENUM = 0x7FFFFFFF } VkFrontFace; +typedef enum VkLogicOp { + VK_LOGIC_OP_CLEAR = 0, + VK_LOGIC_OP_AND = 1, + VK_LOGIC_OP_AND_REVERSE = 2, + VK_LOGIC_OP_COPY = 3, + VK_LOGIC_OP_AND_INVERTED = 4, + VK_LOGIC_OP_NO_OP = 5, + VK_LOGIC_OP_XOR = 6, + VK_LOGIC_OP_OR = 7, + VK_LOGIC_OP_NOR = 8, + VK_LOGIC_OP_EQUIVALENT = 9, + VK_LOGIC_OP_INVERT = 10, + VK_LOGIC_OP_OR_REVERSE = 11, + VK_LOGIC_OP_COPY_INVERTED = 12, + VK_LOGIC_OP_OR_INVERTED = 13, + VK_LOGIC_OP_NAND = 14, + VK_LOGIC_OP_SET = 15, + VK_LOGIC_OP_MAX_ENUM = 0x7FFFFFFF +} VkLogicOp; + +typedef enum VkStencilOp { + VK_STENCIL_OP_KEEP = 0, + VK_STENCIL_OP_ZERO = 1, + VK_STENCIL_OP_REPLACE = 2, + VK_STENCIL_OP_INCREMENT_AND_CLAMP = 3, + VK_STENCIL_OP_DECREMENT_AND_CLAMP = 4, + VK_STENCIL_OP_INVERT = 5, + VK_STENCIL_OP_INCREMENT_AND_WRAP = 6, + VK_STENCIL_OP_DECREMENT_AND_WRAP = 7, + VK_STENCIL_OP_MAX_ENUM = 0x7FFFFFFF +} VkStencilOp; + typedef enum VkVertexInputRate { VK_VERTEX_INPUT_RATE_VERTEX = 0, VK_VERTEX_INPUT_RATE_INSTANCE = 1, @@ -2211,99 +2669,6 @@ typedef enum VkPolygonMode { VK_POLYGON_MODE_MAX_ENUM = 0x7FFFFFFF } VkPolygonMode; -typedef enum VkStencilOp { - VK_STENCIL_OP_KEEP = 0, - VK_STENCIL_OP_ZERO = 1, - VK_STENCIL_OP_REPLACE = 2, - VK_STENCIL_OP_INCREMENT_AND_CLAMP = 3, - VK_STENCIL_OP_DECREMENT_AND_CLAMP = 4, - VK_STENCIL_OP_INVERT = 5, - VK_STENCIL_OP_INCREMENT_AND_WRAP = 6, - VK_STENCIL_OP_DECREMENT_AND_WRAP = 7, - VK_STENCIL_OP_MAX_ENUM = 0x7FFFFFFF -} VkStencilOp; - -typedef enum VkLogicOp { - VK_LOGIC_OP_CLEAR = 0, - VK_LOGIC_OP_AND = 1, - VK_LOGIC_OP_AND_REVERSE = 2, - VK_LOGIC_OP_COPY = 3, - VK_LOGIC_OP_AND_INVERTED = 4, - VK_LOGIC_OP_NO_OP = 5, - VK_LOGIC_OP_XOR = 6, - VK_LOGIC_OP_OR = 7, - VK_LOGIC_OP_NOR = 8, - VK_LOGIC_OP_EQUIVALENT = 9, - VK_LOGIC_OP_INVERT = 10, - VK_LOGIC_OP_OR_REVERSE = 11, - VK_LOGIC_OP_COPY_INVERTED = 12, - VK_LOGIC_OP_OR_INVERTED = 13, - VK_LOGIC_OP_NAND = 14, - VK_LOGIC_OP_SET = 15, - VK_LOGIC_OP_MAX_ENUM = 0x7FFFFFFF -} VkLogicOp; - -typedef enum VkBorderColor { - VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK = 0, - VK_BORDER_COLOR_INT_TRANSPARENT_BLACK = 1, - VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK = 2, - VK_BORDER_COLOR_INT_OPAQUE_BLACK = 3, - VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE = 4, - VK_BORDER_COLOR_INT_OPAQUE_WHITE = 5, - VK_BORDER_COLOR_FLOAT_CUSTOM_EXT = 1000287003, - VK_BORDER_COLOR_INT_CUSTOM_EXT = 1000287004, - VK_BORDER_COLOR_MAX_ENUM = 0x7FFFFFFF -} VkBorderColor; - -typedef enum VkFilter { - VK_FILTER_NEAREST = 0, - VK_FILTER_LINEAR = 1, - VK_FILTER_CUBIC_EXT = 1000015000, - VK_FILTER_CUBIC_IMG = VK_FILTER_CUBIC_EXT, - VK_FILTER_MAX_ENUM = 0x7FFFFFFF -} VkFilter; - -typedef enum VkSamplerAddressMode { - VK_SAMPLER_ADDRESS_MODE_REPEAT = 0, - VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT = 1, - VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE = 2, - VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER = 3, - VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE = 4, - // VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE_KHR is a deprecated alias - VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE_KHR = VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE, - VK_SAMPLER_ADDRESS_MODE_MAX_ENUM = 0x7FFFFFFF -} VkSamplerAddressMode; - -typedef enum VkSamplerMipmapMode { - VK_SAMPLER_MIPMAP_MODE_NEAREST = 0, - VK_SAMPLER_MIPMAP_MODE_LINEAR = 1, - VK_SAMPLER_MIPMAP_MODE_MAX_ENUM = 0x7FFFFFFF -} VkSamplerMipmapMode; - -typedef enum VkDescriptorType { - VK_DESCRIPTOR_TYPE_SAMPLER = 0, - VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER = 1, - VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE = 2, - VK_DESCRIPTOR_TYPE_STORAGE_IMAGE = 3, - VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER = 4, - VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER = 5, - VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER = 6, - VK_DESCRIPTOR_TYPE_STORAGE_BUFFER = 7, - VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC = 8, - VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC = 9, - VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT = 10, - VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK = 1000138000, - VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR = 1000150000, - VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV = 1000165000, - VK_DESCRIPTOR_TYPE_SAMPLE_WEIGHT_IMAGE_QCOM = 1000440000, - VK_DESCRIPTOR_TYPE_BLOCK_MATCH_IMAGE_QCOM = 1000440001, - VK_DESCRIPTOR_TYPE_MUTABLE_EXT = 1000351000, - VK_DESCRIPTOR_TYPE_PARTITIONED_ACCELERATION_STRUCTURE_NV = 1000570000, - VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT = VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK, - VK_DESCRIPTOR_TYPE_MUTABLE_VALVE = VK_DESCRIPTOR_TYPE_MUTABLE_EXT, - VK_DESCRIPTOR_TYPE_MAX_ENUM = 0x7FFFFFFF -} VkDescriptorType; - typedef enum VkAttachmentLoadOp { VK_ATTACHMENT_LOAD_OP_LOAD = 0, VK_ATTACHMENT_LOAD_OP_CLEAR = 1, @@ -2324,35 +2689,6 @@ typedef enum VkAttachmentStoreOp { VK_ATTACHMENT_STORE_OP_MAX_ENUM = 0x7FFFFFFF } VkAttachmentStoreOp; -typedef enum VkPipelineBindPoint { - VK_PIPELINE_BIND_POINT_GRAPHICS = 0, - VK_PIPELINE_BIND_POINT_COMPUTE = 1, -#ifdef VK_ENABLE_BETA_EXTENSIONS - VK_PIPELINE_BIND_POINT_EXECUTION_GRAPH_AMDX = 1000134000, -#endif - VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR = 1000165000, - VK_PIPELINE_BIND_POINT_SUBPASS_SHADING_HUAWEI = 1000369003, - VK_PIPELINE_BIND_POINT_RAY_TRACING_NV = VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, - VK_PIPELINE_BIND_POINT_MAX_ENUM = 0x7FFFFFFF -} VkPipelineBindPoint; - -typedef enum VkCommandBufferLevel { - VK_COMMAND_BUFFER_LEVEL_PRIMARY = 0, - VK_COMMAND_BUFFER_LEVEL_SECONDARY = 1, - VK_COMMAND_BUFFER_LEVEL_MAX_ENUM = 0x7FFFFFFF -} VkCommandBufferLevel; - -typedef enum VkIndexType { - VK_INDEX_TYPE_UINT16 = 0, - VK_INDEX_TYPE_UINT32 = 1, - VK_INDEX_TYPE_UINT8 = 1000265000, - VK_INDEX_TYPE_NONE_KHR = 1000165000, - VK_INDEX_TYPE_NONE_NV = VK_INDEX_TYPE_NONE_KHR, - VK_INDEX_TYPE_UINT8_EXT = VK_INDEX_TYPE_UINT8, - VK_INDEX_TYPE_UINT8_KHR = VK_INDEX_TYPE_UINT8, - VK_INDEX_TYPE_MAX_ENUM = 0x7FFFFFFF -} VkIndexType; - typedef enum VkSubpassContents { VK_SUBPASS_CONTENTS_INLINE = 0, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS = 1, @@ -2361,67 +2697,6 @@ typedef enum VkSubpassContents { VK_SUBPASS_CONTENTS_MAX_ENUM = 0x7FFFFFFF } VkSubpassContents; -typedef enum VkAccessFlagBits { - VK_ACCESS_INDIRECT_COMMAND_READ_BIT = 0x00000001, - VK_ACCESS_INDEX_READ_BIT = 0x00000002, - VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT = 0x00000004, - VK_ACCESS_UNIFORM_READ_BIT = 0x00000008, - VK_ACCESS_INPUT_ATTACHMENT_READ_BIT = 0x00000010, - VK_ACCESS_SHADER_READ_BIT = 0x00000020, - VK_ACCESS_SHADER_WRITE_BIT = 0x00000040, - VK_ACCESS_COLOR_ATTACHMENT_READ_BIT = 0x00000080, - VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT = 0x00000100, - VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT = 0x00000200, - VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT = 0x00000400, - VK_ACCESS_TRANSFER_READ_BIT = 0x00000800, - VK_ACCESS_TRANSFER_WRITE_BIT = 0x00001000, - VK_ACCESS_HOST_READ_BIT = 0x00002000, - VK_ACCESS_HOST_WRITE_BIT = 0x00004000, - VK_ACCESS_MEMORY_READ_BIT = 0x00008000, - VK_ACCESS_MEMORY_WRITE_BIT = 0x00010000, - VK_ACCESS_NONE = 0, - VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT = 0x02000000, - VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT = 0x04000000, - VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT = 0x08000000, - VK_ACCESS_CONDITIONAL_RENDERING_READ_BIT_EXT = 0x00100000, - VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT = 0x00080000, - VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR = 0x00200000, - VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR = 0x00400000, - VK_ACCESS_FRAGMENT_DENSITY_MAP_READ_BIT_EXT = 0x01000000, - VK_ACCESS_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR = 0x00800000, - VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV = 0x00020000, - VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV = 0x00040000, - VK_ACCESS_SHADING_RATE_IMAGE_READ_BIT_NV = VK_ACCESS_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR, - VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_NV = VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR, - VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_NV = VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR, - VK_ACCESS_NONE_KHR = VK_ACCESS_NONE, - VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_EXT = VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV, - VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_EXT = VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV, - VK_ACCESS_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF -} VkAccessFlagBits; -typedef VkFlags VkAccessFlags; - -typedef enum VkImageAspectFlagBits { - VK_IMAGE_ASPECT_COLOR_BIT = 0x00000001, - VK_IMAGE_ASPECT_DEPTH_BIT = 0x00000002, - VK_IMAGE_ASPECT_STENCIL_BIT = 0x00000004, - VK_IMAGE_ASPECT_METADATA_BIT = 0x00000008, - VK_IMAGE_ASPECT_PLANE_0_BIT = 0x00000010, - VK_IMAGE_ASPECT_PLANE_1_BIT = 0x00000020, - VK_IMAGE_ASPECT_PLANE_2_BIT = 0x00000040, - VK_IMAGE_ASPECT_NONE = 0, - VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT = 0x00000080, - VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT = 0x00000100, - VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT = 0x00000200, - VK_IMAGE_ASPECT_MEMORY_PLANE_3_BIT_EXT = 0x00000400, - VK_IMAGE_ASPECT_PLANE_0_BIT_KHR = VK_IMAGE_ASPECT_PLANE_0_BIT, - VK_IMAGE_ASPECT_PLANE_1_BIT_KHR = VK_IMAGE_ASPECT_PLANE_1_BIT, - VK_IMAGE_ASPECT_PLANE_2_BIT_KHR = VK_IMAGE_ASPECT_PLANE_2_BIT, - VK_IMAGE_ASPECT_NONE_KHR = VK_IMAGE_ASPECT_NONE, - VK_IMAGE_ASPECT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF -} VkImageAspectFlagBits; -typedef VkFlags VkImageAspectFlags; - typedef enum VkFormatFeatureFlagBits { VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT = 0x00000001, VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT = 0x00000002, @@ -2483,19 +2758,22 @@ typedef enum VkImageCreateFlagBits { VK_IMAGE_CREATE_PROTECTED_BIT = 0x00000800, VK_IMAGE_CREATE_DISJOINT_BIT = 0x00000200, VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV = 0x00002000, + VK_IMAGE_CREATE_DESCRIPTOR_HEAP_CAPTURE_REPLAY_BIT_EXT = 0x00010000, VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT = 0x00001000, VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT = 0x00004000, - VK_IMAGE_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT = 0x00010000, VK_IMAGE_CREATE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_BIT_EXT = 0x00040000, VK_IMAGE_CREATE_2D_VIEW_COMPATIBLE_BIT_EXT = 0x00020000, - VK_IMAGE_CREATE_FRAGMENT_DENSITY_MAP_OFFSET_BIT_QCOM = 0x00008000, VK_IMAGE_CREATE_VIDEO_PROFILE_INDEPENDENT_BIT_KHR = 0x00100000, + VK_IMAGE_CREATE_FRAGMENT_DENSITY_MAP_OFFSET_BIT_EXT = 0x00008000, + VK_IMAGE_CREATE_ALIAS_SINGLE_LAYER_DESCRIPTOR_BIT_KHR = 0x00400000, VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR = VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT, VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT_KHR = VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT, VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT_KHR = VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT, VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR = VK_IMAGE_CREATE_EXTENDED_USAGE_BIT, VK_IMAGE_CREATE_DISJOINT_BIT_KHR = VK_IMAGE_CREATE_DISJOINT_BIT, VK_IMAGE_CREATE_ALIAS_BIT_KHR = VK_IMAGE_CREATE_ALIAS_BIT, + VK_IMAGE_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT = VK_IMAGE_CREATE_DESCRIPTOR_HEAP_CAPTURE_REPLAY_BIT_EXT, + VK_IMAGE_CREATE_FRAGMENT_DENSITY_MAP_OFFSET_BIT_QCOM = VK_IMAGE_CREATE_FRAGMENT_DENSITY_MAP_OFFSET_BIT_EXT, VK_IMAGE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkImageCreateFlagBits; typedef VkFlags VkImageCreateFlags; @@ -2534,6 +2812,8 @@ typedef enum VkImageUsageFlagBits { VK_IMAGE_USAGE_INVOCATION_MASK_BIT_HUAWEI = 0x00040000, VK_IMAGE_USAGE_SAMPLE_WEIGHT_BIT_QCOM = 0x00100000, VK_IMAGE_USAGE_SAMPLE_BLOCK_MATCH_BIT_QCOM = 0x00200000, + VK_IMAGE_USAGE_TENSOR_ALIASING_BIT_ARM = 0x00800000, + VK_IMAGE_USAGE_TILE_MEMORY_BIT_QCOM = 0x08000000, VK_IMAGE_USAGE_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR = 0x02000000, VK_IMAGE_USAGE_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR = 0x04000000, VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV = VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR, @@ -2551,6 +2831,7 @@ typedef VkFlags VkInstanceCreateFlags; typedef enum VkMemoryHeapFlagBits { VK_MEMORY_HEAP_DEVICE_LOCAL_BIT = 0x00000001, VK_MEMORY_HEAP_MULTI_INSTANCE_BIT = 0x00000002, + VK_MEMORY_HEAP_TILE_MEMORY_BIT_QCOM = 0x00000008, VK_MEMORY_HEAP_MULTI_INSTANCE_BIT_KHR = VK_MEMORY_HEAP_MULTI_INSTANCE_BIT, VK_MEMORY_HEAP_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkMemoryHeapFlagBits; @@ -2579,13 +2860,46 @@ typedef enum VkQueueFlagBits { VK_QUEUE_VIDEO_DECODE_BIT_KHR = 0x00000020, VK_QUEUE_VIDEO_ENCODE_BIT_KHR = 0x00000040, VK_QUEUE_OPTICAL_FLOW_BIT_NV = 0x00000100, + VK_QUEUE_DATA_GRAPH_BIT_ARM = 0x00000400, VK_QUEUE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkQueueFlagBits; typedef VkFlags VkQueueFlags; + +typedef enum VkShaderStageFlagBits { + VK_SHADER_STAGE_VERTEX_BIT = 0x00000001, + VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT = 0x00000002, + VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT = 0x00000004, + VK_SHADER_STAGE_GEOMETRY_BIT = 0x00000008, + VK_SHADER_STAGE_FRAGMENT_BIT = 0x00000010, + VK_SHADER_STAGE_COMPUTE_BIT = 0x00000020, + VK_SHADER_STAGE_ALL_GRAPHICS = 0x0000001F, + VK_SHADER_STAGE_ALL = 0x7FFFFFFF, + VK_SHADER_STAGE_RAYGEN_BIT_KHR = 0x00000100, + VK_SHADER_STAGE_ANY_HIT_BIT_KHR = 0x00000200, + VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR = 0x00000400, + VK_SHADER_STAGE_MISS_BIT_KHR = 0x00000800, + VK_SHADER_STAGE_INTERSECTION_BIT_KHR = 0x00001000, + VK_SHADER_STAGE_CALLABLE_BIT_KHR = 0x00002000, + VK_SHADER_STAGE_TASK_BIT_EXT = 0x00000040, + VK_SHADER_STAGE_MESH_BIT_EXT = 0x00000080, + VK_SHADER_STAGE_SUBPASS_SHADING_BIT_HUAWEI = 0x00004000, + VK_SHADER_STAGE_CLUSTER_CULLING_BIT_HUAWEI = 0x00080000, + VK_SHADER_STAGE_RAYGEN_BIT_NV = VK_SHADER_STAGE_RAYGEN_BIT_KHR, + VK_SHADER_STAGE_ANY_HIT_BIT_NV = VK_SHADER_STAGE_ANY_HIT_BIT_KHR, + VK_SHADER_STAGE_CLOSEST_HIT_BIT_NV = VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR, + VK_SHADER_STAGE_MISS_BIT_NV = VK_SHADER_STAGE_MISS_BIT_KHR, + VK_SHADER_STAGE_INTERSECTION_BIT_NV = VK_SHADER_STAGE_INTERSECTION_BIT_KHR, + VK_SHADER_STAGE_CALLABLE_BIT_NV = VK_SHADER_STAGE_CALLABLE_BIT_KHR, + VK_SHADER_STAGE_TASK_BIT_NV = VK_SHADER_STAGE_TASK_BIT_EXT, + VK_SHADER_STAGE_MESH_BIT_NV = VK_SHADER_STAGE_MESH_BIT_EXT, + VK_SHADER_STAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkShaderStageFlagBits; +typedef VkFlags VkShaderStageFlags; typedef VkFlags VkDeviceCreateFlags; typedef enum VkDeviceQueueCreateFlagBits { VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT = 0x00000001, + VK_DEVICE_QUEUE_CREATE_INTERNALLY_SYNCHRONIZED_BIT_KHR = 0x00000004, VK_DEVICE_QUEUE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkDeviceQueueCreateFlagBits; typedef VkFlags VkDeviceQueueCreateFlags; @@ -2615,16 +2929,16 @@ typedef enum VkPipelineStageFlagBits { VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR = 0x00200000, VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT = 0x00800000, VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x00400000, - VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV = 0x00020000, VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT = 0x00080000, VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT = 0x00100000, + VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_EXT = 0x00020000, VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV = VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR, VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_NV = VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_NV = VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV = VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV = VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT, + VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV = VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_EXT, VK_PIPELINE_STAGE_NONE_KHR = VK_PIPELINE_STAGE_NONE, - VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_EXT = VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV, VK_PIPELINE_STAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkPipelineStageFlagBits; typedef VkFlags VkPipelineStageFlags; @@ -2635,11 +2949,26 @@ typedef enum VkMemoryMapFlagBits { } VkMemoryMapFlagBits; typedef VkFlags VkMemoryMapFlags; -typedef enum VkSparseMemoryBindFlagBits { - VK_SPARSE_MEMORY_BIND_METADATA_BIT = 0x00000001, - VK_SPARSE_MEMORY_BIND_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF -} VkSparseMemoryBindFlagBits; -typedef VkFlags VkSparseMemoryBindFlags; +typedef enum VkImageAspectFlagBits { + VK_IMAGE_ASPECT_COLOR_BIT = 0x00000001, + VK_IMAGE_ASPECT_DEPTH_BIT = 0x00000002, + VK_IMAGE_ASPECT_STENCIL_BIT = 0x00000004, + VK_IMAGE_ASPECT_METADATA_BIT = 0x00000008, + VK_IMAGE_ASPECT_PLANE_0_BIT = 0x00000010, + VK_IMAGE_ASPECT_PLANE_1_BIT = 0x00000020, + VK_IMAGE_ASPECT_PLANE_2_BIT = 0x00000040, + VK_IMAGE_ASPECT_NONE = 0, + VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT = 0x00000080, + VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT = 0x00000100, + VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT = 0x00000200, + VK_IMAGE_ASPECT_MEMORY_PLANE_3_BIT_EXT = 0x00000400, + VK_IMAGE_ASPECT_PLANE_0_BIT_KHR = VK_IMAGE_ASPECT_PLANE_0_BIT, + VK_IMAGE_ASPECT_PLANE_1_BIT_KHR = VK_IMAGE_ASPECT_PLANE_1_BIT, + VK_IMAGE_ASPECT_PLANE_2_BIT_KHR = VK_IMAGE_ASPECT_PLANE_2_BIT, + VK_IMAGE_ASPECT_NONE_KHR = VK_IMAGE_ASPECT_NONE, + VK_IMAGE_ASPECT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkImageAspectFlagBits; +typedef VkFlags VkImageAspectFlags; typedef enum VkSparseImageFormatFlagBits { VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT = 0x00000001, @@ -2649,6 +2978,12 @@ typedef enum VkSparseImageFormatFlagBits { } VkSparseImageFormatFlagBits; typedef VkFlags VkSparseImageFormatFlags; +typedef enum VkSparseMemoryBindFlagBits { + VK_SPARSE_MEMORY_BIND_METADATA_BIT = 0x00000001, + VK_SPARSE_MEMORY_BIND_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkSparseMemoryBindFlagBits; +typedef VkFlags VkSparseMemoryBindFlags; + typedef enum VkFenceCreateFlagBits { VK_FENCE_CREATE_SIGNALED_BIT = 0x00000001, VK_FENCE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF @@ -2656,12 +2991,11 @@ typedef enum VkFenceCreateFlagBits { typedef VkFlags VkFenceCreateFlags; typedef VkFlags VkSemaphoreCreateFlags; -typedef enum VkEventCreateFlagBits { - VK_EVENT_CREATE_DEVICE_ONLY_BIT = 0x00000001, - VK_EVENT_CREATE_DEVICE_ONLY_BIT_KHR = VK_EVENT_CREATE_DEVICE_ONLY_BIT, - VK_EVENT_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF -} VkEventCreateFlagBits; -typedef VkFlags VkEventCreateFlags; +typedef enum VkQueryPoolCreateFlagBits { + VK_QUERY_POOL_CREATE_RESET_BIT_KHR = 0x00000001, + VK_QUERY_POOL_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkQueryPoolCreateFlagBits; +typedef VkFlags VkQueryPoolCreateFlags; typedef enum VkQueryPipelineStatisticFlagBits { VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT = 0x00000001, @@ -2681,7 +3015,6 @@ typedef enum VkQueryPipelineStatisticFlagBits { VK_QUERY_PIPELINE_STATISTIC_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkQueryPipelineStatisticFlagBits; typedef VkFlags VkQueryPipelineStatisticFlags; -typedef VkFlags VkQueryPoolCreateFlags; typedef enum VkQueryResultFlagBits { VK_QUERY_RESULT_64_BIT = 0x00000001, @@ -2726,6 +3059,7 @@ typedef enum VkBufferUsageFlagBits { #ifdef VK_ENABLE_BETA_EXTENSIONS VK_BUFFER_USAGE_EXECUTION_GRAPH_SCRATCH_BIT_AMDX = 0x02000000, #endif + VK_BUFFER_USAGE_DESCRIPTOR_HEAP_BIT_EXT = 0x10000000, VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR = 0x00080000, VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR = 0x00100000, VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR = 0x00000400, @@ -2736,13 +3070,13 @@ typedef enum VkBufferUsageFlagBits { VK_BUFFER_USAGE_PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER_BIT_EXT = 0x04000000, VK_BUFFER_USAGE_MICROMAP_BUILD_INPUT_READ_ONLY_BIT_EXT = 0x00800000, VK_BUFFER_USAGE_MICROMAP_STORAGE_BIT_EXT = 0x01000000, + VK_BUFFER_USAGE_TILE_MEMORY_BIT_QCOM = 0x08000000, VK_BUFFER_USAGE_RAY_TRACING_BIT_NV = VK_BUFFER_USAGE_SHADER_BINDING_TABLE_BIT_KHR, VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_EXT = VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT, VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_KHR = VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT, VK_BUFFER_USAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkBufferUsageFlagBits; typedef VkFlags VkBufferUsageFlags; -typedef VkFlags VkBufferViewCreateFlags; typedef enum VkImageViewCreateFlagBits { VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT = 0x00000001, @@ -2751,6 +3085,101 @@ typedef enum VkImageViewCreateFlagBits { VK_IMAGE_VIEW_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkImageViewCreateFlagBits; typedef VkFlags VkImageViewCreateFlags; + +typedef enum VkAccessFlagBits { + VK_ACCESS_INDIRECT_COMMAND_READ_BIT = 0x00000001, + VK_ACCESS_INDEX_READ_BIT = 0x00000002, + VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT = 0x00000004, + VK_ACCESS_UNIFORM_READ_BIT = 0x00000008, + VK_ACCESS_INPUT_ATTACHMENT_READ_BIT = 0x00000010, + VK_ACCESS_SHADER_READ_BIT = 0x00000020, + VK_ACCESS_SHADER_WRITE_BIT = 0x00000040, + VK_ACCESS_COLOR_ATTACHMENT_READ_BIT = 0x00000080, + VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT = 0x00000100, + VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT = 0x00000200, + VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT = 0x00000400, + VK_ACCESS_TRANSFER_READ_BIT = 0x00000800, + VK_ACCESS_TRANSFER_WRITE_BIT = 0x00001000, + VK_ACCESS_HOST_READ_BIT = 0x00002000, + VK_ACCESS_HOST_WRITE_BIT = 0x00004000, + VK_ACCESS_MEMORY_READ_BIT = 0x00008000, + VK_ACCESS_MEMORY_WRITE_BIT = 0x00010000, + VK_ACCESS_NONE = 0, + VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT = 0x02000000, + VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT = 0x04000000, + VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT = 0x08000000, + VK_ACCESS_CONDITIONAL_RENDERING_READ_BIT_EXT = 0x00100000, + VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT = 0x00080000, + VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR = 0x00200000, + VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR = 0x00400000, + VK_ACCESS_FRAGMENT_DENSITY_MAP_READ_BIT_EXT = 0x01000000, + VK_ACCESS_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR = 0x00800000, + VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_EXT = 0x00020000, + VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_EXT = 0x00040000, + VK_ACCESS_SHADING_RATE_IMAGE_READ_BIT_NV = VK_ACCESS_FRAGMENT_SHADING_RATE_ATTACHMENT_READ_BIT_KHR, + VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_NV = VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR, + VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_NV = VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR, + VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV = VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_EXT, + VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV = VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_EXT, + VK_ACCESS_NONE_KHR = VK_ACCESS_NONE, + VK_ACCESS_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkAccessFlagBits; +typedef VkFlags VkAccessFlags; + +typedef enum VkDependencyFlagBits { + VK_DEPENDENCY_BY_REGION_BIT = 0x00000001, + VK_DEPENDENCY_DEVICE_GROUP_BIT = 0x00000004, + VK_DEPENDENCY_VIEW_LOCAL_BIT = 0x00000002, + VK_DEPENDENCY_FEEDBACK_LOOP_BIT_EXT = 0x00000008, + VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR = 0x00000020, + VK_DEPENDENCY_ASYMMETRIC_EVENT_BIT_KHR = 0x00000040, + VK_DEPENDENCY_VIEW_LOCAL_BIT_KHR = VK_DEPENDENCY_VIEW_LOCAL_BIT, + VK_DEPENDENCY_DEVICE_GROUP_BIT_KHR = VK_DEPENDENCY_DEVICE_GROUP_BIT, + VK_DEPENDENCY_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkDependencyFlagBits; +typedef VkFlags VkDependencyFlags; + +typedef enum VkCommandPoolCreateFlagBits { + VK_COMMAND_POOL_CREATE_TRANSIENT_BIT = 0x00000001, + VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT = 0x00000002, + VK_COMMAND_POOL_CREATE_PROTECTED_BIT = 0x00000004, + VK_COMMAND_POOL_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkCommandPoolCreateFlagBits; +typedef VkFlags VkCommandPoolCreateFlags; + +typedef enum VkCommandPoolResetFlagBits { + VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT = 0x00000001, + VK_COMMAND_POOL_RESET_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkCommandPoolResetFlagBits; +typedef VkFlags VkCommandPoolResetFlags; + +typedef enum VkQueryControlFlagBits { + VK_QUERY_CONTROL_PRECISE_BIT = 0x00000001, + VK_QUERY_CONTROL_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkQueryControlFlagBits; +typedef VkFlags VkQueryControlFlags; + +typedef enum VkCommandBufferUsageFlagBits { + VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT = 0x00000001, + VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT = 0x00000002, + VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT = 0x00000004, + VK_COMMAND_BUFFER_USAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkCommandBufferUsageFlagBits; +typedef VkFlags VkCommandBufferUsageFlags; + +typedef enum VkCommandBufferResetFlagBits { + VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT = 0x00000001, + VK_COMMAND_BUFFER_RESET_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkCommandBufferResetFlagBits; +typedef VkFlags VkCommandBufferResetFlags; + +typedef enum VkEventCreateFlagBits { + VK_EVENT_CREATE_DEVICE_ONLY_BIT = 0x00000001, + VK_EVENT_CREATE_DEVICE_ONLY_BIT_KHR = VK_EVENT_CREATE_DEVICE_ONLY_BIT, + VK_EVENT_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkEventCreateFlagBits; +typedef VkFlags VkEventCreateFlags; +typedef VkFlags VkBufferViewCreateFlags; typedef VkFlags VkShaderModuleCreateFlags; typedef enum VkPipelineCacheCreateFlagBits { @@ -2761,21 +3190,12 @@ typedef enum VkPipelineCacheCreateFlagBits { } VkPipelineCacheCreateFlagBits; typedef VkFlags VkPipelineCacheCreateFlags; -typedef enum VkColorComponentFlagBits { - VK_COLOR_COMPONENT_R_BIT = 0x00000001, - VK_COLOR_COMPONENT_G_BIT = 0x00000002, - VK_COLOR_COMPONENT_B_BIT = 0x00000004, - VK_COLOR_COMPONENT_A_BIT = 0x00000008, - VK_COLOR_COMPONENT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF -} VkColorComponentFlagBits; -typedef VkFlags VkColorComponentFlags; - typedef enum VkPipelineCreateFlagBits { VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT = 0x00000001, VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT = 0x00000002, VK_PIPELINE_CREATE_DERIVATIVE_BIT = 0x00000004, - VK_PIPELINE_CREATE_VIEW_INDEX_FROM_DEVICE_INDEX_BIT = 0x00000008, VK_PIPELINE_CREATE_DISPATCH_BASE_BIT = 0x00000010, + VK_PIPELINE_CREATE_VIEW_INDEX_FROM_DEVICE_INDEX_BIT = 0x00000008, VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT = 0x00000100, VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT = 0x00000200, VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BIT = 0x08000000, @@ -2800,25 +3220,36 @@ typedef enum VkPipelineCreateFlagBits { VK_PIPELINE_CREATE_RAY_TRACING_ALLOW_MOTION_BIT_NV = 0x00100000, VK_PIPELINE_CREATE_COLOR_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT = 0x02000000, VK_PIPELINE_CREATE_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT = 0x04000000, - VK_PIPELINE_CREATE_RAY_TRACING_OPACITY_MICROMAP_BIT_EXT = 0x01000000, #ifdef VK_ENABLE_BETA_EXTENSIONS VK_PIPELINE_CREATE_RAY_TRACING_DISPLACEMENT_MICROMAP_BIT_NV = 0x10000000, #endif + VK_PIPELINE_CREATE_RAY_TRACING_OPACITY_MICROMAP_BIT_KHR = 0x01000000, + // VK_PIPELINE_CREATE_DISPATCH_BASE is a legacy alias VK_PIPELINE_CREATE_DISPATCH_BASE = VK_PIPELINE_CREATE_DISPATCH_BASE_BIT, VK_PIPELINE_CREATE_VIEW_INDEX_FROM_DEVICE_INDEX_BIT_KHR = VK_PIPELINE_CREATE_VIEW_INDEX_FROM_DEVICE_INDEX_BIT, - VK_PIPELINE_CREATE_DISPATCH_BASE_KHR = VK_PIPELINE_CREATE_DISPATCH_BASE, - // VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT is a deprecated alias + VK_PIPELINE_CREATE_DISPATCH_BASE_BIT_KHR = VK_PIPELINE_CREATE_DISPATCH_BASE_BIT, + // VK_PIPELINE_CREATE_DISPATCH_BASE_KHR is a legacy alias + VK_PIPELINE_CREATE_DISPATCH_BASE_KHR = VK_PIPELINE_CREATE_DISPATCH_BASE_BIT, + // VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT is a legacy alias VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT = VK_PIPELINE_CREATE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT, - // VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR is a deprecated alias + // VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR is a legacy alias VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = VK_PIPELINE_CREATE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR, VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT = VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT, VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT = VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT, + VK_PIPELINE_CREATE_RAY_TRACING_OPACITY_MICROMAP_BIT_EXT = VK_PIPELINE_CREATE_RAY_TRACING_OPACITY_MICROMAP_BIT_KHR, VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BIT_EXT = VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BIT, VK_PIPELINE_CREATE_PROTECTED_ACCESS_ONLY_BIT_EXT = VK_PIPELINE_CREATE_PROTECTED_ACCESS_ONLY_BIT, VK_PIPELINE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkPipelineCreateFlagBits; typedef VkFlags VkPipelineCreateFlags; +typedef enum VkPipelineLayoutCreateFlagBits { + VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT = 0x00000002, + VK_PIPELINE_LAYOUT_CREATE_NO_TASK_SHADER_BIT_KHR = 0x00000004, + VK_PIPELINE_LAYOUT_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkPipelineLayoutCreateFlagBits; +typedef VkFlags VkPipelineLayoutCreateFlags; + typedef enum VkPipelineShaderStageCreateFlagBits { VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT = 0x00000001, VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT = 0x00000002, @@ -2828,75 +3259,6 @@ typedef enum VkPipelineShaderStageCreateFlagBits { } VkPipelineShaderStageCreateFlagBits; typedef VkFlags VkPipelineShaderStageCreateFlags; -typedef enum VkShaderStageFlagBits { - VK_SHADER_STAGE_VERTEX_BIT = 0x00000001, - VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT = 0x00000002, - VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT = 0x00000004, - VK_SHADER_STAGE_GEOMETRY_BIT = 0x00000008, - VK_SHADER_STAGE_FRAGMENT_BIT = 0x00000010, - VK_SHADER_STAGE_COMPUTE_BIT = 0x00000020, - VK_SHADER_STAGE_ALL_GRAPHICS = 0x0000001F, - VK_SHADER_STAGE_ALL = 0x7FFFFFFF, - VK_SHADER_STAGE_RAYGEN_BIT_KHR = 0x00000100, - VK_SHADER_STAGE_ANY_HIT_BIT_KHR = 0x00000200, - VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR = 0x00000400, - VK_SHADER_STAGE_MISS_BIT_KHR = 0x00000800, - VK_SHADER_STAGE_INTERSECTION_BIT_KHR = 0x00001000, - VK_SHADER_STAGE_CALLABLE_BIT_KHR = 0x00002000, - VK_SHADER_STAGE_TASK_BIT_EXT = 0x00000040, - VK_SHADER_STAGE_MESH_BIT_EXT = 0x00000080, - VK_SHADER_STAGE_SUBPASS_SHADING_BIT_HUAWEI = 0x00004000, - VK_SHADER_STAGE_CLUSTER_CULLING_BIT_HUAWEI = 0x00080000, - VK_SHADER_STAGE_RAYGEN_BIT_NV = VK_SHADER_STAGE_RAYGEN_BIT_KHR, - VK_SHADER_STAGE_ANY_HIT_BIT_NV = VK_SHADER_STAGE_ANY_HIT_BIT_KHR, - VK_SHADER_STAGE_CLOSEST_HIT_BIT_NV = VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR, - VK_SHADER_STAGE_MISS_BIT_NV = VK_SHADER_STAGE_MISS_BIT_KHR, - VK_SHADER_STAGE_INTERSECTION_BIT_NV = VK_SHADER_STAGE_INTERSECTION_BIT_KHR, - VK_SHADER_STAGE_CALLABLE_BIT_NV = VK_SHADER_STAGE_CALLABLE_BIT_KHR, - VK_SHADER_STAGE_TASK_BIT_NV = VK_SHADER_STAGE_TASK_BIT_EXT, - VK_SHADER_STAGE_MESH_BIT_NV = VK_SHADER_STAGE_MESH_BIT_EXT, - VK_SHADER_STAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF -} VkShaderStageFlagBits; - -typedef enum VkCullModeFlagBits { - VK_CULL_MODE_NONE = 0, - VK_CULL_MODE_FRONT_BIT = 0x00000001, - VK_CULL_MODE_BACK_BIT = 0x00000002, - VK_CULL_MODE_FRONT_AND_BACK = 0x00000003, - VK_CULL_MODE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF -} VkCullModeFlagBits; -typedef VkFlags VkCullModeFlags; -typedef VkFlags VkPipelineVertexInputStateCreateFlags; -typedef VkFlags VkPipelineInputAssemblyStateCreateFlags; -typedef VkFlags VkPipelineTessellationStateCreateFlags; -typedef VkFlags VkPipelineViewportStateCreateFlags; -typedef VkFlags VkPipelineRasterizationStateCreateFlags; -typedef VkFlags VkPipelineMultisampleStateCreateFlags; - -typedef enum VkPipelineDepthStencilStateCreateFlagBits { - VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXT = 0x00000001, - VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT = 0x00000002, - VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_ARM = VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXT, - VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_ARM = VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT, - VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF -} VkPipelineDepthStencilStateCreateFlagBits; -typedef VkFlags VkPipelineDepthStencilStateCreateFlags; - -typedef enum VkPipelineColorBlendStateCreateFlagBits { - VK_PIPELINE_COLOR_BLEND_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_BIT_EXT = 0x00000001, - VK_PIPELINE_COLOR_BLEND_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_BIT_ARM = VK_PIPELINE_COLOR_BLEND_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_BIT_EXT, - VK_PIPELINE_COLOR_BLEND_STATE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF -} VkPipelineColorBlendStateCreateFlagBits; -typedef VkFlags VkPipelineColorBlendStateCreateFlags; -typedef VkFlags VkPipelineDynamicStateCreateFlags; - -typedef enum VkPipelineLayoutCreateFlagBits { - VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT = 0x00000002, - VK_PIPELINE_LAYOUT_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF -} VkPipelineLayoutCreateFlagBits; -typedef VkFlags VkPipelineLayoutCreateFlags; -typedef VkFlags VkShaderStageFlags; - typedef enum VkSamplerCreateFlagBits { VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT = 0x00000001, VK_SAMPLER_CREATE_SUBSAMPLED_COARSE_RECONSTRUCTION_BIT_EXT = 0x00000002, @@ -2935,24 +3297,55 @@ typedef enum VkDescriptorSetLayoutCreateFlagBits { } VkDescriptorSetLayoutCreateFlagBits; typedef VkFlags VkDescriptorSetLayoutCreateFlags; +typedef enum VkColorComponentFlagBits { + VK_COLOR_COMPONENT_R_BIT = 0x00000001, + VK_COLOR_COMPONENT_G_BIT = 0x00000002, + VK_COLOR_COMPONENT_B_BIT = 0x00000004, + VK_COLOR_COMPONENT_A_BIT = 0x00000008, + VK_COLOR_COMPONENT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkColorComponentFlagBits; +typedef VkFlags VkColorComponentFlags; + +typedef enum VkCullModeFlagBits { + VK_CULL_MODE_NONE = 0, + VK_CULL_MODE_FRONT_BIT = 0x00000001, + VK_CULL_MODE_BACK_BIT = 0x00000002, + VK_CULL_MODE_FRONT_AND_BACK = 0x00000003, + VK_CULL_MODE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkCullModeFlagBits; +typedef VkFlags VkCullModeFlags; + +typedef enum VkPipelineColorBlendStateCreateFlagBits { + VK_PIPELINE_COLOR_BLEND_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_BIT_EXT = 0x00000001, + VK_PIPELINE_COLOR_BLEND_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_BIT_ARM = VK_PIPELINE_COLOR_BLEND_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_BIT_EXT, + VK_PIPELINE_COLOR_BLEND_STATE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkPipelineColorBlendStateCreateFlagBits; +typedef VkFlags VkPipelineColorBlendStateCreateFlags; + +typedef enum VkPipelineDepthStencilStateCreateFlagBits { + VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXT = 0x00000001, + VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT = 0x00000002, + VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_ARM = VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXT, + VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_ARM = VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT, + VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkPipelineDepthStencilStateCreateFlagBits; +typedef VkFlags VkPipelineDepthStencilStateCreateFlags; +typedef VkFlags VkPipelineDynamicStateCreateFlags; +typedef VkFlags VkPipelineInputAssemblyStateCreateFlags; +typedef VkFlags VkPipelineMultisampleStateCreateFlags; +typedef VkFlags VkPipelineRasterizationStateCreateFlags; +typedef VkFlags VkPipelineTessellationStateCreateFlags; +typedef VkFlags VkPipelineVertexInputStateCreateFlags; +typedef VkFlags VkPipelineViewportStateCreateFlags; + typedef enum VkAttachmentDescriptionFlagBits { VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT = 0x00000001, + VK_ATTACHMENT_DESCRIPTION_RESOLVE_SKIP_TRANSFER_FUNCTION_BIT_KHR = 0x00000002, + VK_ATTACHMENT_DESCRIPTION_RESOLVE_ENABLE_TRANSFER_FUNCTION_BIT_KHR = 0x00000004, VK_ATTACHMENT_DESCRIPTION_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkAttachmentDescriptionFlagBits; typedef VkFlags VkAttachmentDescriptionFlags; -typedef enum VkDependencyFlagBits { - VK_DEPENDENCY_BY_REGION_BIT = 0x00000001, - VK_DEPENDENCY_DEVICE_GROUP_BIT = 0x00000004, - VK_DEPENDENCY_VIEW_LOCAL_BIT = 0x00000002, - VK_DEPENDENCY_FEEDBACK_LOOP_BIT_EXT = 0x00000008, - VK_DEPENDENCY_QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_BIT_KHR = 0x00000020, - VK_DEPENDENCY_VIEW_LOCAL_BIT_KHR = VK_DEPENDENCY_VIEW_LOCAL_BIT, - VK_DEPENDENCY_DEVICE_GROUP_BIT_KHR = VK_DEPENDENCY_DEVICE_GROUP_BIT, - VK_DEPENDENCY_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF -} VkDependencyFlagBits; -typedef VkFlags VkDependencyFlags; - typedef enum VkFramebufferCreateFlagBits { VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT = 0x00000001, VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR = VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, @@ -2962,6 +3355,7 @@ typedef VkFlags VkFramebufferCreateFlags; typedef enum VkRenderPassCreateFlagBits { VK_RENDER_PASS_CREATE_TRANSFORM_BIT_QCOM = 0x00000002, + VK_RENDER_PASS_CREATE_PER_LAYER_FRAGMENT_DENSITY_BIT_VALVE = 0x00000004, VK_RENDER_PASS_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkRenderPassCreateFlagBits; typedef VkFlags VkRenderPassCreateFlags; @@ -2969,12 +3363,15 @@ typedef VkFlags VkRenderPassCreateFlags; typedef enum VkSubpassDescriptionFlagBits { VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX = 0x00000001, VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX = 0x00000002, - VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM = 0x00000004, - VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM = 0x00000008, + VK_SUBPASS_DESCRIPTION_TILE_SHADING_APRON_BIT_QCOM = 0x00000100, VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_COLOR_ACCESS_BIT_EXT = 0x00000010, VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXT = 0x00000020, VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT = 0x00000040, VK_SUBPASS_DESCRIPTION_ENABLE_LEGACY_DITHERING_BIT_EXT = 0x00000080, + VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_EXT = 0x00000004, + VK_SUBPASS_DESCRIPTION_CUSTOM_RESOLVE_BIT_EXT = 0x00000008, + VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM = VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_EXT, + VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM = VK_SUBPASS_DESCRIPTION_CUSTOM_RESOLVE_BIT_EXT, VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_COLOR_ACCESS_BIT_ARM = VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_COLOR_ACCESS_BIT_EXT, VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_ARM = VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXT, VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_ARM = VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT, @@ -2982,45 +3379,11 @@ typedef enum VkSubpassDescriptionFlagBits { } VkSubpassDescriptionFlagBits; typedef VkFlags VkSubpassDescriptionFlags; -typedef enum VkCommandPoolCreateFlagBits { - VK_COMMAND_POOL_CREATE_TRANSIENT_BIT = 0x00000001, - VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT = 0x00000002, - VK_COMMAND_POOL_CREATE_PROTECTED_BIT = 0x00000004, - VK_COMMAND_POOL_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF -} VkCommandPoolCreateFlagBits; -typedef VkFlags VkCommandPoolCreateFlags; - -typedef enum VkCommandPoolResetFlagBits { - VK_COMMAND_POOL_RESET_RELEASE_RESOURCES_BIT = 0x00000001, - VK_COMMAND_POOL_RESET_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF -} VkCommandPoolResetFlagBits; -typedef VkFlags VkCommandPoolResetFlags; - -typedef enum VkCommandBufferUsageFlagBits { - VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT = 0x00000001, - VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT = 0x00000002, - VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT = 0x00000004, - VK_COMMAND_BUFFER_USAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF -} VkCommandBufferUsageFlagBits; -typedef VkFlags VkCommandBufferUsageFlags; - -typedef enum VkQueryControlFlagBits { - VK_QUERY_CONTROL_PRECISE_BIT = 0x00000001, - VK_QUERY_CONTROL_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF -} VkQueryControlFlagBits; -typedef VkFlags VkQueryControlFlags; - -typedef enum VkCommandBufferResetFlagBits { - VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT = 0x00000001, - VK_COMMAND_BUFFER_RESET_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF -} VkCommandBufferResetFlagBits; -typedef VkFlags VkCommandBufferResetFlags; - typedef enum VkStencilFaceFlagBits { VK_STENCIL_FACE_FRONT_BIT = 0x00000001, VK_STENCIL_FACE_BACK_BIT = 0x00000002, VK_STENCIL_FACE_FRONT_AND_BACK = 0x00000003, - // VK_STENCIL_FRONT_AND_BACK is a deprecated alias + // VK_STENCIL_FRONT_AND_BACK is a legacy alias VK_STENCIL_FRONT_AND_BACK = VK_STENCIL_FACE_FRONT_AND_BACK, VK_STENCIL_FACE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkStencilFaceFlagBits; @@ -3062,75 +3425,6 @@ typedef struct VkBaseOutStructure { struct VkBaseOutStructure* pNext; } VkBaseOutStructure; -typedef struct VkBufferMemoryBarrier { - VkStructureType sType; - const void* pNext; - VkAccessFlags srcAccessMask; - VkAccessFlags dstAccessMask; - uint32_t srcQueueFamilyIndex; - uint32_t dstQueueFamilyIndex; - VkBuffer buffer; - VkDeviceSize offset; - VkDeviceSize size; -} VkBufferMemoryBarrier; - -typedef struct VkDispatchIndirectCommand { - uint32_t x; - uint32_t y; - uint32_t z; -} VkDispatchIndirectCommand; - -typedef struct VkDrawIndexedIndirectCommand { - uint32_t indexCount; - uint32_t instanceCount; - uint32_t firstIndex; - int32_t vertexOffset; - uint32_t firstInstance; -} VkDrawIndexedIndirectCommand; - -typedef struct VkDrawIndirectCommand { - uint32_t vertexCount; - uint32_t instanceCount; - uint32_t firstVertex; - uint32_t firstInstance; -} VkDrawIndirectCommand; - -typedef struct VkImageSubresourceRange { - VkImageAspectFlags aspectMask; - uint32_t baseMipLevel; - uint32_t levelCount; - uint32_t baseArrayLayer; - uint32_t layerCount; -} VkImageSubresourceRange; - -typedef struct VkImageMemoryBarrier { - VkStructureType sType; - const void* pNext; - VkAccessFlags srcAccessMask; - VkAccessFlags dstAccessMask; - VkImageLayout oldLayout; - VkImageLayout newLayout; - uint32_t srcQueueFamilyIndex; - uint32_t dstQueueFamilyIndex; - VkImage image; - VkImageSubresourceRange subresourceRange; -} VkImageMemoryBarrier; - -typedef struct VkMemoryBarrier { - VkStructureType sType; - const void* pNext; - VkAccessFlags srcAccessMask; - VkAccessFlags dstAccessMask; -} VkMemoryBarrier; - -typedef struct VkPipelineCacheHeaderVersionOne { - uint32_t headerSize; - VkPipelineCacheHeaderVersion headerVersion; - uint32_t vendorID; - uint32_t deviceID; - uint8_t pipelineCacheUUID[VK_UUID_SIZE]; -} VkPipelineCacheHeaderVersionOne; - typedef void* (VKAPI_PTR *PFN_vkAllocationFunction)( void* pUserData, size_t size, @@ -3431,9 +3725,9 @@ typedef struct VkDeviceCreateInfo { VkDeviceCreateFlags flags; uint32_t queueCreateInfoCount; const VkDeviceQueueCreateInfo* pQueueCreateInfos; - // enabledLayerCount is deprecated and should not be used + // enabledLayerCount is legacy and not used uint32_t enabledLayerCount; - // ppEnabledLayerNames is deprecated and should not be used + // ppEnabledLayerNames is legacy and not used const char* const* ppEnabledLayerNames; uint32_t enabledExtensionCount; const char* const* ppEnabledExtensionNames; @@ -3485,6 +3779,41 @@ typedef struct VkMemoryRequirements { uint32_t memoryTypeBits; } VkMemoryRequirements; +typedef struct VkImageSubresource { + VkImageAspectFlags aspectMask; + uint32_t mipLevel; + uint32_t arrayLayer; +} VkImageSubresource; + +typedef struct VkSparseImageFormatProperties { + VkImageAspectFlags aspectMask; + VkExtent3D imageGranularity; + VkSparseImageFormatFlags flags; +} VkSparseImageFormatProperties; + +typedef struct VkSparseImageMemoryBind { + VkImageSubresource subresource; + VkOffset3D offset; + VkExtent3D extent; + VkDeviceMemory memory; + VkDeviceSize memoryOffset; + VkSparseMemoryBindFlags flags; +} VkSparseImageMemoryBind; + +typedef struct VkSparseImageMemoryBindInfo { + VkImage image; + uint32_t bindCount; + const VkSparseImageMemoryBind* pBinds; +} VkSparseImageMemoryBindInfo; + +typedef struct VkSparseImageMemoryRequirements { + VkSparseImageFormatProperties formatProperties; + uint32_t imageMipTailFirstLod; + VkDeviceSize imageMipTailSize; + VkDeviceSize imageMipTailOffset; + VkDeviceSize imageMipTailStride; +} VkSparseImageMemoryRequirements; + typedef struct VkSparseMemoryBind { VkDeviceSize resourceOffset; VkDeviceSize size; @@ -3505,27 +3834,6 @@ typedef struct VkSparseImageOpaqueMemoryBindInfo { const VkSparseMemoryBind* pBinds; } VkSparseImageOpaqueMemoryBindInfo; -typedef struct VkImageSubresource { - VkImageAspectFlags aspectMask; - uint32_t mipLevel; - uint32_t arrayLayer; -} VkImageSubresource; - -typedef struct VkSparseImageMemoryBind { - VkImageSubresource subresource; - VkOffset3D offset; - VkExtent3D extent; - VkDeviceMemory memory; - VkDeviceSize memoryOffset; - VkSparseMemoryBindFlags flags; -} VkSparseImageMemoryBind; - -typedef struct VkSparseImageMemoryBindInfo { - VkImage image; - uint32_t bindCount; - const VkSparseImageMemoryBind* pBinds; -} VkSparseImageMemoryBindInfo; - typedef struct VkBindSparseInfo { VkStructureType sType; const void* pNext; @@ -3541,20 +3849,6 @@ typedef struct VkBindSparseInfo { const VkSemaphore* pSignalSemaphores; } VkBindSparseInfo; -typedef struct VkSparseImageFormatProperties { - VkImageAspectFlags aspectMask; - VkExtent3D imageGranularity; - VkSparseImageFormatFlags flags; -} VkSparseImageFormatProperties; - -typedef struct VkSparseImageMemoryRequirements { - VkSparseImageFormatProperties formatProperties; - uint32_t imageMipTailFirstLod; - VkDeviceSize imageMipTailSize; - VkDeviceSize imageMipTailOffset; - VkDeviceSize imageMipTailStride; -} VkSparseImageMemoryRequirements; - typedef struct VkFenceCreateInfo { VkStructureType sType; const void* pNext; @@ -3567,12 +3861,6 @@ typedef struct VkSemaphoreCreateInfo { VkSemaphoreCreateFlags flags; } VkSemaphoreCreateInfo; -typedef struct VkEventCreateInfo { - VkStructureType sType; - const void* pNext; - VkEventCreateFlags flags; -} VkEventCreateInfo; - typedef struct VkQueryPoolCreateInfo { VkStructureType sType; const void* pNext; @@ -3593,16 +3881,6 @@ typedef struct VkBufferCreateInfo { const uint32_t* pQueueFamilyIndices; } VkBufferCreateInfo; -typedef struct VkBufferViewCreateInfo { - VkStructureType sType; - const void* pNext; - VkBufferViewCreateFlags flags; - VkBuffer buffer; - VkFormat format; - VkDeviceSize offset; - VkDeviceSize range; -} VkBufferViewCreateInfo; - typedef struct VkImageCreateInfo { VkStructureType sType; const void* pNext; @@ -3636,6 +3914,14 @@ typedef struct VkComponentMapping { VkComponentSwizzle a; } VkComponentMapping; +typedef struct VkImageSubresourceRange { + VkImageAspectFlags aspectMask; + uint32_t baseMipLevel; + uint32_t levelCount; + uint32_t baseArrayLayer; + uint32_t layerCount; +} VkImageSubresourceRange; + typedef struct VkImageViewCreateInfo { VkStructureType sType; const void* pNext; @@ -3647,6 +3933,131 @@ typedef struct VkImageViewCreateInfo { VkImageSubresourceRange subresourceRange; } VkImageViewCreateInfo; +typedef struct VkCommandPoolCreateInfo { + VkStructureType sType; + const void* pNext; + VkCommandPoolCreateFlags flags; + uint32_t queueFamilyIndex; +} VkCommandPoolCreateInfo; + +typedef struct VkCommandBufferAllocateInfo { + VkStructureType sType; + const void* pNext; + VkCommandPool commandPool; + VkCommandBufferLevel level; + uint32_t commandBufferCount; +} VkCommandBufferAllocateInfo; + +typedef struct VkCommandBufferInheritanceInfo { + VkStructureType sType; + const void* pNext; + VkRenderPass renderPass; + uint32_t subpass; + VkFramebuffer framebuffer; + VkBool32 occlusionQueryEnable; + VkQueryControlFlags queryFlags; + VkQueryPipelineStatisticFlags pipelineStatistics; +} VkCommandBufferInheritanceInfo; + +typedef struct VkCommandBufferBeginInfo { + VkStructureType sType; + const void* pNext; + VkCommandBufferUsageFlags flags; + const VkCommandBufferInheritanceInfo* pInheritanceInfo; +} VkCommandBufferBeginInfo; + +typedef struct VkBufferCopy { + VkDeviceSize srcOffset; + VkDeviceSize dstOffset; + VkDeviceSize size; +} VkBufferCopy; + +typedef struct VkImageSubresourceLayers { + VkImageAspectFlags aspectMask; + uint32_t mipLevel; + uint32_t baseArrayLayer; + uint32_t layerCount; +} VkImageSubresourceLayers; + +typedef struct VkBufferImageCopy { + VkDeviceSize bufferOffset; + uint32_t bufferRowLength; + uint32_t bufferImageHeight; + VkImageSubresourceLayers imageSubresource; + VkOffset3D imageOffset; + VkExtent3D imageExtent; +} VkBufferImageCopy; + +typedef struct VkImageCopy { + VkImageSubresourceLayers srcSubresource; + VkOffset3D srcOffset; + VkImageSubresourceLayers dstSubresource; + VkOffset3D dstOffset; + VkExtent3D extent; +} VkImageCopy; + +typedef struct VkBufferMemoryBarrier { + VkStructureType sType; + const void* pNext; + VkAccessFlags srcAccessMask; + VkAccessFlags dstAccessMask; + uint32_t srcQueueFamilyIndex; + uint32_t dstQueueFamilyIndex; + VkBuffer buffer; + VkDeviceSize offset; + VkDeviceSize size; +} VkBufferMemoryBarrier; + +typedef struct VkImageMemoryBarrier { + VkStructureType sType; + const void* pNext; + VkAccessFlags srcAccessMask; + VkAccessFlags dstAccessMask; + VkImageLayout oldLayout; + VkImageLayout newLayout; + uint32_t srcQueueFamilyIndex; + uint32_t dstQueueFamilyIndex; + VkImage image; + VkImageSubresourceRange subresourceRange; +} VkImageMemoryBarrier; + +typedef struct VkMemoryBarrier { + VkStructureType sType; + const void* pNext; + VkAccessFlags srcAccessMask; + VkAccessFlags dstAccessMask; +} VkMemoryBarrier; + +typedef struct VkDispatchIndirectCommand { + uint32_t x; + uint32_t y; + uint32_t z; +} VkDispatchIndirectCommand; + +typedef struct VkPipelineCacheHeaderVersionOne { + uint32_t headerSize; + VkPipelineCacheHeaderVersion headerVersion; + uint32_t vendorID; + uint32_t deviceID; + uint8_t pipelineCacheUUID[VK_UUID_SIZE]; +} VkPipelineCacheHeaderVersionOne; + +typedef struct VkEventCreateInfo { + VkStructureType sType; + const void* pNext; + VkEventCreateFlags flags; +} VkEventCreateInfo; + +typedef struct VkBufferViewCreateInfo { + VkStructureType sType; + const void* pNext; + VkBufferViewCreateFlags flags; + VkBuffer buffer; + VkFormat format; + VkDeviceSize offset; + VkDeviceSize range; +} VkBufferViewCreateInfo; + typedef struct VkShaderModuleCreateInfo { VkStructureType sType; const void* pNext; @@ -3696,168 +4107,6 @@ typedef struct VkComputePipelineCreateInfo { int32_t basePipelineIndex; } VkComputePipelineCreateInfo; -typedef struct VkVertexInputBindingDescription { - uint32_t binding; - uint32_t stride; - VkVertexInputRate inputRate; -} VkVertexInputBindingDescription; - -typedef struct VkVertexInputAttributeDescription { - uint32_t location; - uint32_t binding; - VkFormat format; - uint32_t offset; -} VkVertexInputAttributeDescription; - -typedef struct VkPipelineVertexInputStateCreateInfo { - VkStructureType sType; - const void* pNext; - VkPipelineVertexInputStateCreateFlags flags; - uint32_t vertexBindingDescriptionCount; - const VkVertexInputBindingDescription* pVertexBindingDescriptions; - uint32_t vertexAttributeDescriptionCount; - const VkVertexInputAttributeDescription* pVertexAttributeDescriptions; -} VkPipelineVertexInputStateCreateInfo; - -typedef struct VkPipelineInputAssemblyStateCreateInfo { - VkStructureType sType; - const void* pNext; - VkPipelineInputAssemblyStateCreateFlags flags; - VkPrimitiveTopology topology; - VkBool32 primitiveRestartEnable; -} VkPipelineInputAssemblyStateCreateInfo; - -typedef struct VkPipelineTessellationStateCreateInfo { - VkStructureType sType; - const void* pNext; - VkPipelineTessellationStateCreateFlags flags; - uint32_t patchControlPoints; -} VkPipelineTessellationStateCreateInfo; - -typedef struct VkViewport { - float x; - float y; - float width; - float height; - float minDepth; - float maxDepth; -} VkViewport; - -typedef struct VkPipelineViewportStateCreateInfo { - VkStructureType sType; - const void* pNext; - VkPipelineViewportStateCreateFlags flags; - uint32_t viewportCount; - const VkViewport* pViewports; - uint32_t scissorCount; - const VkRect2D* pScissors; -} VkPipelineViewportStateCreateInfo; - -typedef struct VkPipelineRasterizationStateCreateInfo { - VkStructureType sType; - const void* pNext; - VkPipelineRasterizationStateCreateFlags flags; - VkBool32 depthClampEnable; - VkBool32 rasterizerDiscardEnable; - VkPolygonMode polygonMode; - VkCullModeFlags cullMode; - VkFrontFace frontFace; - VkBool32 depthBiasEnable; - float depthBiasConstantFactor; - float depthBiasClamp; - float depthBiasSlopeFactor; - float lineWidth; -} VkPipelineRasterizationStateCreateInfo; - -typedef struct VkPipelineMultisampleStateCreateInfo { - VkStructureType sType; - const void* pNext; - VkPipelineMultisampleStateCreateFlags flags; - VkSampleCountFlagBits rasterizationSamples; - VkBool32 sampleShadingEnable; - float minSampleShading; - const VkSampleMask* pSampleMask; - VkBool32 alphaToCoverageEnable; - VkBool32 alphaToOneEnable; -} VkPipelineMultisampleStateCreateInfo; - -typedef struct VkStencilOpState { - VkStencilOp failOp; - VkStencilOp passOp; - VkStencilOp depthFailOp; - VkCompareOp compareOp; - uint32_t compareMask; - uint32_t writeMask; - uint32_t reference; -} VkStencilOpState; - -typedef struct VkPipelineDepthStencilStateCreateInfo { - VkStructureType sType; - const void* pNext; - VkPipelineDepthStencilStateCreateFlags flags; - VkBool32 depthTestEnable; - VkBool32 depthWriteEnable; - VkCompareOp depthCompareOp; - VkBool32 depthBoundsTestEnable; - VkBool32 stencilTestEnable; - VkStencilOpState front; - VkStencilOpState back; - float minDepthBounds; - float maxDepthBounds; -} VkPipelineDepthStencilStateCreateInfo; - -typedef struct VkPipelineColorBlendAttachmentState { - VkBool32 blendEnable; - VkBlendFactor srcColorBlendFactor; - VkBlendFactor dstColorBlendFactor; - VkBlendOp colorBlendOp; - VkBlendFactor srcAlphaBlendFactor; - VkBlendFactor dstAlphaBlendFactor; - VkBlendOp alphaBlendOp; - VkColorComponentFlags colorWriteMask; -} VkPipelineColorBlendAttachmentState; - -typedef struct VkPipelineColorBlendStateCreateInfo { - VkStructureType sType; - const void* pNext; - VkPipelineColorBlendStateCreateFlags flags; - VkBool32 logicOpEnable; - VkLogicOp logicOp; - uint32_t attachmentCount; - const VkPipelineColorBlendAttachmentState* pAttachments; - float blendConstants[4]; -} VkPipelineColorBlendStateCreateInfo; - -typedef struct VkPipelineDynamicStateCreateInfo { - VkStructureType sType; - const void* pNext; - VkPipelineDynamicStateCreateFlags flags; - uint32_t dynamicStateCount; - const VkDynamicState* pDynamicStates; -} VkPipelineDynamicStateCreateInfo; - -typedef struct VkGraphicsPipelineCreateInfo { - VkStructureType sType; - const void* pNext; - VkPipelineCreateFlags flags; - uint32_t stageCount; - const VkPipelineShaderStageCreateInfo* pStages; - const VkPipelineVertexInputStateCreateInfo* pVertexInputState; - const VkPipelineInputAssemblyStateCreateInfo* pInputAssemblyState; - const VkPipelineTessellationStateCreateInfo* pTessellationState; - const VkPipelineViewportStateCreateInfo* pViewportState; - const VkPipelineRasterizationStateCreateInfo* pRasterizationState; - const VkPipelineMultisampleStateCreateInfo* pMultisampleState; - const VkPipelineDepthStencilStateCreateInfo* pDepthStencilState; - const VkPipelineColorBlendStateCreateInfo* pColorBlendState; - const VkPipelineDynamicStateCreateInfo* pDynamicState; - VkPipelineLayout layout; - VkRenderPass renderPass; - uint32_t subpass; - VkPipeline basePipelineHandle; - int32_t basePipelineIndex; -} VkGraphicsPipelineCreateInfo; - typedef struct VkPushConstantRange { VkShaderStageFlags stageFlags; uint32_t offset; @@ -3970,6 +4219,189 @@ typedef struct VkWriteDescriptorSet { const VkBufferView* pTexelBufferView; } VkWriteDescriptorSet; +typedef union VkClearColorValue { + float float32[4]; + int32_t int32[4]; + uint32_t uint32[4]; +} VkClearColorValue; + +typedef struct VkDrawIndexedIndirectCommand { + uint32_t indexCount; + uint32_t instanceCount; + uint32_t firstIndex; + int32_t vertexOffset; + uint32_t firstInstance; +} VkDrawIndexedIndirectCommand; + +typedef struct VkDrawIndirectCommand { + uint32_t vertexCount; + uint32_t instanceCount; + uint32_t firstVertex; + uint32_t firstInstance; +} VkDrawIndirectCommand; + +typedef struct VkStencilOpState { + VkStencilOp failOp; + VkStencilOp passOp; + VkStencilOp depthFailOp; + VkCompareOp compareOp; + uint32_t compareMask; + uint32_t writeMask; + uint32_t reference; +} VkStencilOpState; + +typedef struct VkVertexInputAttributeDescription { + uint32_t location; + uint32_t binding; + VkFormat format; + uint32_t offset; +} VkVertexInputAttributeDescription; + +typedef struct VkVertexInputBindingDescription { + uint32_t binding; + uint32_t stride; + VkVertexInputRate inputRate; +} VkVertexInputBindingDescription; + +typedef struct VkViewport { + float x; + float y; + float width; + float height; + float minDepth; + float maxDepth; +} VkViewport; + +typedef struct VkPipelineColorBlendAttachmentState { + VkBool32 blendEnable; + VkBlendFactor srcColorBlendFactor; + VkBlendFactor dstColorBlendFactor; + VkBlendOp colorBlendOp; + VkBlendFactor srcAlphaBlendFactor; + VkBlendFactor dstAlphaBlendFactor; + VkBlendOp alphaBlendOp; + VkColorComponentFlags colorWriteMask; +} VkPipelineColorBlendAttachmentState; + +typedef struct VkPipelineColorBlendStateCreateInfo { + VkStructureType sType; + const void* pNext; + VkPipelineColorBlendStateCreateFlags flags; + VkBool32 logicOpEnable; + VkLogicOp logicOp; + uint32_t attachmentCount; + const VkPipelineColorBlendAttachmentState* pAttachments; + float blendConstants[4]; +} VkPipelineColorBlendStateCreateInfo; + +typedef struct VkPipelineDepthStencilStateCreateInfo { + VkStructureType sType; + const void* pNext; + VkPipelineDepthStencilStateCreateFlags flags; + VkBool32 depthTestEnable; + VkBool32 depthWriteEnable; + VkCompareOp depthCompareOp; + VkBool32 depthBoundsTestEnable; + VkBool32 stencilTestEnable; + VkStencilOpState front; + VkStencilOpState back; + float minDepthBounds; + float maxDepthBounds; +} VkPipelineDepthStencilStateCreateInfo; + +typedef struct VkPipelineDynamicStateCreateInfo { + VkStructureType sType; + const void* pNext; + VkPipelineDynamicStateCreateFlags flags; + uint32_t dynamicStateCount; + const VkDynamicState* pDynamicStates; +} VkPipelineDynamicStateCreateInfo; + +typedef struct VkPipelineInputAssemblyStateCreateInfo { + VkStructureType sType; + const void* pNext; + VkPipelineInputAssemblyStateCreateFlags flags; + VkPrimitiveTopology topology; + VkBool32 primitiveRestartEnable; +} VkPipelineInputAssemblyStateCreateInfo; + +typedef struct VkPipelineMultisampleStateCreateInfo { + VkStructureType sType; + const void* pNext; + VkPipelineMultisampleStateCreateFlags flags; + VkSampleCountFlagBits rasterizationSamples; + VkBool32 sampleShadingEnable; + float minSampleShading; + const VkSampleMask* pSampleMask; + VkBool32 alphaToCoverageEnable; + VkBool32 alphaToOneEnable; +} VkPipelineMultisampleStateCreateInfo; + +typedef struct VkPipelineRasterizationStateCreateInfo { + VkStructureType sType; + const void* pNext; + VkPipelineRasterizationStateCreateFlags flags; + VkBool32 depthClampEnable; + VkBool32 rasterizerDiscardEnable; + VkPolygonMode polygonMode; + VkCullModeFlags cullMode; + VkFrontFace frontFace; + VkBool32 depthBiasEnable; + float depthBiasConstantFactor; + float depthBiasClamp; + float depthBiasSlopeFactor; + float lineWidth; +} VkPipelineRasterizationStateCreateInfo; + +typedef struct VkPipelineTessellationStateCreateInfo { + VkStructureType sType; + const void* pNext; + VkPipelineTessellationStateCreateFlags flags; + uint32_t patchControlPoints; +} VkPipelineTessellationStateCreateInfo; + +typedef struct VkPipelineVertexInputStateCreateInfo { + VkStructureType sType; + const void* pNext; + VkPipelineVertexInputStateCreateFlags flags; + uint32_t vertexBindingDescriptionCount; + const VkVertexInputBindingDescription* pVertexBindingDescriptions; + uint32_t vertexAttributeDescriptionCount; + const VkVertexInputAttributeDescription* pVertexAttributeDescriptions; +} VkPipelineVertexInputStateCreateInfo; + +typedef struct VkPipelineViewportStateCreateInfo { + VkStructureType sType; + const void* pNext; + VkPipelineViewportStateCreateFlags flags; + uint32_t viewportCount; + const VkViewport* pViewports; + uint32_t scissorCount; + const VkRect2D* pScissors; +} VkPipelineViewportStateCreateInfo; + +typedef struct VkGraphicsPipelineCreateInfo { + VkStructureType sType; + const void* pNext; + VkPipelineCreateFlags flags; + uint32_t stageCount; + const VkPipelineShaderStageCreateInfo* pStages; + const VkPipelineVertexInputStateCreateInfo* pVertexInputState; + const VkPipelineInputAssemblyStateCreateInfo* pInputAssemblyState; + const VkPipelineTessellationStateCreateInfo* pTessellationState; + const VkPipelineViewportStateCreateInfo* pViewportState; + const VkPipelineRasterizationStateCreateInfo* pRasterizationState; + const VkPipelineMultisampleStateCreateInfo* pMultisampleState; + const VkPipelineDepthStencilStateCreateInfo* pDepthStencilState; + const VkPipelineColorBlendStateCreateInfo* pColorBlendState; + const VkPipelineDynamicStateCreateInfo* pDynamicState; + VkPipelineLayout layout; + VkRenderPass renderPass; + uint32_t subpass; + VkPipeline basePipelineHandle; + int32_t basePipelineIndex; +} VkGraphicsPipelineCreateInfo; + typedef struct VkAttachmentDescription { VkAttachmentDescriptionFlags flags; VkFormat format; @@ -3999,6 +4431,16 @@ typedef struct VkFramebufferCreateInfo { uint32_t layers; } VkFramebufferCreateInfo; +typedef struct VkSubpassDependency { + uint32_t srcSubpass; + uint32_t dstSubpass; + VkPipelineStageFlags srcStageMask; + VkPipelineStageFlags dstStageMask; + VkAccessFlags srcAccessMask; + VkAccessFlags dstAccessMask; + VkDependencyFlags dependencyFlags; +} VkSubpassDependency; + typedef struct VkSubpassDescription { VkSubpassDescriptionFlags flags; VkPipelineBindPoint pipelineBindPoint; @@ -4012,16 +4454,6 @@ typedef struct VkSubpassDescription { const uint32_t* pPreserveAttachments; } VkSubpassDescription; -typedef struct VkSubpassDependency { - uint32_t srcSubpass; - uint32_t dstSubpass; - VkPipelineStageFlags srcStageMask; - VkPipelineStageFlags dstStageMask; - VkAccessFlags srcAccessMask; - VkAccessFlags dstAccessMask; - VkDependencyFlags dependencyFlags; -} VkSubpassDependency; - typedef struct VkRenderPassCreateInfo { VkStructureType sType; const void* pNext; @@ -4034,72 +4466,17 @@ typedef struct VkRenderPassCreateInfo { const VkSubpassDependency* pDependencies; } VkRenderPassCreateInfo; -typedef struct VkCommandPoolCreateInfo { - VkStructureType sType; - const void* pNext; - VkCommandPoolCreateFlags flags; - uint32_t queueFamilyIndex; -} VkCommandPoolCreateInfo; - -typedef struct VkCommandBufferAllocateInfo { - VkStructureType sType; - const void* pNext; - VkCommandPool commandPool; - VkCommandBufferLevel level; - uint32_t commandBufferCount; -} VkCommandBufferAllocateInfo; - -typedef struct VkCommandBufferInheritanceInfo { - VkStructureType sType; - const void* pNext; - VkRenderPass renderPass; - uint32_t subpass; - VkFramebuffer framebuffer; - VkBool32 occlusionQueryEnable; - VkQueryControlFlags queryFlags; - VkQueryPipelineStatisticFlags pipelineStatistics; -} VkCommandBufferInheritanceInfo; - -typedef struct VkCommandBufferBeginInfo { - VkStructureType sType; - const void* pNext; - VkCommandBufferUsageFlags flags; - const VkCommandBufferInheritanceInfo* pInheritanceInfo; -} VkCommandBufferBeginInfo; - -typedef struct VkBufferCopy { - VkDeviceSize srcOffset; - VkDeviceSize dstOffset; - VkDeviceSize size; -} VkBufferCopy; - -typedef struct VkImageSubresourceLayers { - VkImageAspectFlags aspectMask; - uint32_t mipLevel; - uint32_t baseArrayLayer; - uint32_t layerCount; -} VkImageSubresourceLayers; - -typedef struct VkBufferImageCopy { - VkDeviceSize bufferOffset; - uint32_t bufferRowLength; - uint32_t bufferImageHeight; - VkImageSubresourceLayers imageSubresource; - VkOffset3D imageOffset; - VkExtent3D imageExtent; -} VkBufferImageCopy; - -typedef union VkClearColorValue { - float float32[4]; - int32_t int32[4]; - uint32_t uint32[4]; -} VkClearColorValue; - typedef struct VkClearDepthStencilValue { float depth; uint32_t stencil; } VkClearDepthStencilValue; +typedef struct VkClearRect { + VkRect2D rect; + uint32_t baseArrayLayer; + uint32_t layerCount; +} VkClearRect; + typedef union VkClearValue { VkClearColorValue color; VkClearDepthStencilValue depthStencil; @@ -4111,12 +4488,6 @@ typedef struct VkClearAttachment { VkClearValue clearValue; } VkClearAttachment; -typedef struct VkClearRect { - VkRect2D rect; - uint32_t baseArrayLayer; - uint32_t layerCount; -} VkClearRect; - typedef struct VkImageBlit { VkImageSubresourceLayers srcSubresource; VkOffset3D srcOffsets[2]; @@ -4124,14 +4495,6 @@ typedef struct VkImageBlit { VkOffset3D dstOffsets[2]; } VkImageBlit; -typedef struct VkImageCopy { - VkImageSubresourceLayers srcSubresource; - VkOffset3D srcOffset; - VkImageSubresourceLayers dstSubresource; - VkOffset3D dstOffset; - VkExtent3D extent; -} VkImageCopy; - typedef struct VkImageResolve { VkImageSubresourceLayers srcSubresource; VkOffset3D srcOffset; @@ -4192,30 +4555,50 @@ typedef VkResult (VKAPI_PTR *PFN_vkGetFenceStatus)(VkDevice device, VkFence fenc typedef VkResult (VKAPI_PTR *PFN_vkWaitForFences)(VkDevice device, uint32_t fenceCount, const VkFence* pFences, VkBool32 waitAll, uint64_t timeout); typedef VkResult (VKAPI_PTR *PFN_vkCreateSemaphore)(VkDevice device, const VkSemaphoreCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSemaphore* pSemaphore); typedef void (VKAPI_PTR *PFN_vkDestroySemaphore)(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks* pAllocator); -typedef VkResult (VKAPI_PTR *PFN_vkCreateEvent)(VkDevice device, const VkEventCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkEvent* pEvent); -typedef void (VKAPI_PTR *PFN_vkDestroyEvent)(VkDevice device, VkEvent event, const VkAllocationCallbacks* pAllocator); -typedef VkResult (VKAPI_PTR *PFN_vkGetEventStatus)(VkDevice device, VkEvent event); -typedef VkResult (VKAPI_PTR *PFN_vkSetEvent)(VkDevice device, VkEvent event); -typedef VkResult (VKAPI_PTR *PFN_vkResetEvent)(VkDevice device, VkEvent event); typedef VkResult (VKAPI_PTR *PFN_vkCreateQueryPool)(VkDevice device, const VkQueryPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkQueryPool* pQueryPool); typedef void (VKAPI_PTR *PFN_vkDestroyQueryPool)(VkDevice device, VkQueryPool queryPool, const VkAllocationCallbacks* pAllocator); typedef VkResult (VKAPI_PTR *PFN_vkGetQueryPoolResults)(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, size_t dataSize, void* pData, VkDeviceSize stride, VkQueryResultFlags flags); typedef VkResult (VKAPI_PTR *PFN_vkCreateBuffer)(VkDevice device, const VkBufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkBuffer* pBuffer); typedef void (VKAPI_PTR *PFN_vkDestroyBuffer)(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks* pAllocator); -typedef VkResult (VKAPI_PTR *PFN_vkCreateBufferView)(VkDevice device, const VkBufferViewCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkBufferView* pView); -typedef void (VKAPI_PTR *PFN_vkDestroyBufferView)(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks* pAllocator); typedef VkResult (VKAPI_PTR *PFN_vkCreateImage)(VkDevice device, const VkImageCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkImage* pImage); typedef void (VKAPI_PTR *PFN_vkDestroyImage)(VkDevice device, VkImage image, const VkAllocationCallbacks* pAllocator); typedef void (VKAPI_PTR *PFN_vkGetImageSubresourceLayout)(VkDevice device, VkImage image, const VkImageSubresource* pSubresource, VkSubresourceLayout* pLayout); typedef VkResult (VKAPI_PTR *PFN_vkCreateImageView)(VkDevice device, const VkImageViewCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkImageView* pView); typedef void (VKAPI_PTR *PFN_vkDestroyImageView)(VkDevice device, VkImageView imageView, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkCreateCommandPool)(VkDevice device, const VkCommandPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkCommandPool* pCommandPool); +typedef void (VKAPI_PTR *PFN_vkDestroyCommandPool)(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkResetCommandPool)(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags); +typedef VkResult (VKAPI_PTR *PFN_vkAllocateCommandBuffers)(VkDevice device, const VkCommandBufferAllocateInfo* pAllocateInfo, VkCommandBuffer* pCommandBuffers); +typedef void (VKAPI_PTR *PFN_vkFreeCommandBuffers)(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount, const VkCommandBuffer* pCommandBuffers); +typedef VkResult (VKAPI_PTR *PFN_vkBeginCommandBuffer)(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo* pBeginInfo); +typedef VkResult (VKAPI_PTR *PFN_vkEndCommandBuffer)(VkCommandBuffer commandBuffer); +typedef VkResult (VKAPI_PTR *PFN_vkResetCommandBuffer)(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags); +typedef void (VKAPI_PTR *PFN_vkCmdCopyBuffer)(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferCopy* pRegions); +typedef void (VKAPI_PTR *PFN_vkCmdCopyImage)(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy* pRegions); +typedef void (VKAPI_PTR *PFN_vkCmdCopyBufferToImage)(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy* pRegions); +typedef void (VKAPI_PTR *PFN_vkCmdCopyImageToBuffer)(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy* pRegions); +typedef void (VKAPI_PTR *PFN_vkCmdUpdateBuffer)(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize, const void* pData); +typedef void (VKAPI_PTR *PFN_vkCmdFillBuffer)(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data); +typedef void (VKAPI_PTR *PFN_vkCmdPipelineBarrier)(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers, uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers); +typedef void (VKAPI_PTR *PFN_vkCmdBeginQuery)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query, VkQueryControlFlags flags); +typedef void (VKAPI_PTR *PFN_vkCmdEndQuery)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query); +typedef void (VKAPI_PTR *PFN_vkCmdResetQueryPool)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount); +typedef void (VKAPI_PTR *PFN_vkCmdWriteTimestamp)(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool, uint32_t query); +typedef void (VKAPI_PTR *PFN_vkCmdCopyQueryPoolResults)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags); +typedef void (VKAPI_PTR *PFN_vkCmdExecuteCommands)(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer* pCommandBuffers); +typedef VkResult (VKAPI_PTR *PFN_vkCreateEvent)(VkDevice device, const VkEventCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkEvent* pEvent); +typedef void (VKAPI_PTR *PFN_vkDestroyEvent)(VkDevice device, VkEvent event, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkGetEventStatus)(VkDevice device, VkEvent event); +typedef VkResult (VKAPI_PTR *PFN_vkSetEvent)(VkDevice device, VkEvent event); +typedef VkResult (VKAPI_PTR *PFN_vkResetEvent)(VkDevice device, VkEvent event); +typedef VkResult (VKAPI_PTR *PFN_vkCreateBufferView)(VkDevice device, const VkBufferViewCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkBufferView* pView); +typedef void (VKAPI_PTR *PFN_vkDestroyBufferView)(VkDevice device, VkBufferView bufferView, const VkAllocationCallbacks* pAllocator); typedef VkResult (VKAPI_PTR *PFN_vkCreateShaderModule)(VkDevice device, const VkShaderModuleCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkShaderModule* pShaderModule); typedef void (VKAPI_PTR *PFN_vkDestroyShaderModule)(VkDevice device, VkShaderModule shaderModule, const VkAllocationCallbacks* pAllocator); typedef VkResult (VKAPI_PTR *PFN_vkCreatePipelineCache)(VkDevice device, const VkPipelineCacheCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPipelineCache* pPipelineCache); typedef void (VKAPI_PTR *PFN_vkDestroyPipelineCache)(VkDevice device, VkPipelineCache pipelineCache, const VkAllocationCallbacks* pAllocator); typedef VkResult (VKAPI_PTR *PFN_vkGetPipelineCacheData)(VkDevice device, VkPipelineCache pipelineCache, size_t* pDataSize, void* pData); typedef VkResult (VKAPI_PTR *PFN_vkMergePipelineCaches)(VkDevice device, VkPipelineCache dstCache, uint32_t srcCacheCount, const VkPipelineCache* pSrcCaches); -typedef VkResult (VKAPI_PTR *PFN_vkCreateGraphicsPipelines)(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkGraphicsPipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines); typedef VkResult (VKAPI_PTR *PFN_vkCreateComputePipelines)(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkComputePipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines); typedef void (VKAPI_PTR *PFN_vkDestroyPipeline)(VkDevice device, VkPipeline pipeline, const VkAllocationCallbacks* pAllocator); typedef VkResult (VKAPI_PTR *PFN_vkCreatePipelineLayout)(VkDevice device, const VkPipelineLayoutCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPipelineLayout* pPipelineLayout); @@ -4230,20 +4613,21 @@ typedef VkResult (VKAPI_PTR *PFN_vkResetDescriptorPool)(VkDevice device, VkDescr typedef VkResult (VKAPI_PTR *PFN_vkAllocateDescriptorSets)(VkDevice device, const VkDescriptorSetAllocateInfo* pAllocateInfo, VkDescriptorSet* pDescriptorSets); typedef VkResult (VKAPI_PTR *PFN_vkFreeDescriptorSets)(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount, const VkDescriptorSet* pDescriptorSets); typedef void (VKAPI_PTR *PFN_vkUpdateDescriptorSets)(VkDevice device, uint32_t descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites, uint32_t descriptorCopyCount, const VkCopyDescriptorSet* pDescriptorCopies); +typedef void (VKAPI_PTR *PFN_vkCmdBindPipeline)(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline); +typedef void (VKAPI_PTR *PFN_vkCmdBindDescriptorSets)(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet* pDescriptorSets, uint32_t dynamicOffsetCount, const uint32_t* pDynamicOffsets); +typedef void (VKAPI_PTR *PFN_vkCmdClearColorImage)(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColorValue* pColor, uint32_t rangeCount, const VkImageSubresourceRange* pRanges); +typedef void (VKAPI_PTR *PFN_vkCmdDispatch)(VkCommandBuffer commandBuffer, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ); +typedef void (VKAPI_PTR *PFN_vkCmdDispatchIndirect)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset); +typedef void (VKAPI_PTR *PFN_vkCmdSetEvent)(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask); +typedef void (VKAPI_PTR *PFN_vkCmdResetEvent)(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask); +typedef void (VKAPI_PTR *PFN_vkCmdWaitEvents)(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent* pEvents, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, uint32_t memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers, uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers); +typedef void (VKAPI_PTR *PFN_vkCmdPushConstants)(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size, const void* pValues); +typedef VkResult (VKAPI_PTR *PFN_vkCreateGraphicsPipelines)(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkGraphicsPipelineCreateInfo* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines); typedef VkResult (VKAPI_PTR *PFN_vkCreateFramebuffer)(VkDevice device, const VkFramebufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkFramebuffer* pFramebuffer); typedef void (VKAPI_PTR *PFN_vkDestroyFramebuffer)(VkDevice device, VkFramebuffer framebuffer, const VkAllocationCallbacks* pAllocator); typedef VkResult (VKAPI_PTR *PFN_vkCreateRenderPass)(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass); typedef void (VKAPI_PTR *PFN_vkDestroyRenderPass)(VkDevice device, VkRenderPass renderPass, const VkAllocationCallbacks* pAllocator); typedef void (VKAPI_PTR *PFN_vkGetRenderAreaGranularity)(VkDevice device, VkRenderPass renderPass, VkExtent2D* pGranularity); -typedef VkResult (VKAPI_PTR *PFN_vkCreateCommandPool)(VkDevice device, const VkCommandPoolCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkCommandPool* pCommandPool); -typedef void (VKAPI_PTR *PFN_vkDestroyCommandPool)(VkDevice device, VkCommandPool commandPool, const VkAllocationCallbacks* pAllocator); -typedef VkResult (VKAPI_PTR *PFN_vkResetCommandPool)(VkDevice device, VkCommandPool commandPool, VkCommandPoolResetFlags flags); -typedef VkResult (VKAPI_PTR *PFN_vkAllocateCommandBuffers)(VkDevice device, const VkCommandBufferAllocateInfo* pAllocateInfo, VkCommandBuffer* pCommandBuffers); -typedef void (VKAPI_PTR *PFN_vkFreeCommandBuffers)(VkDevice device, VkCommandPool commandPool, uint32_t commandBufferCount, const VkCommandBuffer* pCommandBuffers); -typedef VkResult (VKAPI_PTR *PFN_vkBeginCommandBuffer)(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo* pBeginInfo); -typedef VkResult (VKAPI_PTR *PFN_vkEndCommandBuffer)(VkCommandBuffer commandBuffer); -typedef VkResult (VKAPI_PTR *PFN_vkResetCommandBuffer)(VkCommandBuffer commandBuffer, VkCommandBufferResetFlags flags); -typedef void (VKAPI_PTR *PFN_vkCmdBindPipeline)(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline); typedef void (VKAPI_PTR *PFN_vkCmdSetViewport)(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport* pViewports); typedef void (VKAPI_PTR *PFN_vkCmdSetScissor)(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D* pScissors); typedef void (VKAPI_PTR *PFN_vkCmdSetLineWidth)(VkCommandBuffer commandBuffer, float lineWidth); @@ -4253,40 +4637,19 @@ typedef void (VKAPI_PTR *PFN_vkCmdSetDepthBounds)(VkCommandBuffer commandBuffer, typedef void (VKAPI_PTR *PFN_vkCmdSetStencilCompareMask)(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t compareMask); typedef void (VKAPI_PTR *PFN_vkCmdSetStencilWriteMask)(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t writeMask); typedef void (VKAPI_PTR *PFN_vkCmdSetStencilReference)(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, uint32_t reference); -typedef void (VKAPI_PTR *PFN_vkCmdBindDescriptorSets)(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t firstSet, uint32_t descriptorSetCount, const VkDescriptorSet* pDescriptorSets, uint32_t dynamicOffsetCount, const uint32_t* pDynamicOffsets); typedef void (VKAPI_PTR *PFN_vkCmdBindIndexBuffer)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkIndexType indexType); typedef void (VKAPI_PTR *PFN_vkCmdBindVertexBuffers)(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount, const VkBuffer* pBuffers, const VkDeviceSize* pOffsets); typedef void (VKAPI_PTR *PFN_vkCmdDraw)(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance); typedef void (VKAPI_PTR *PFN_vkCmdDrawIndexed)(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance); typedef void (VKAPI_PTR *PFN_vkCmdDrawIndirect)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride); typedef void (VKAPI_PTR *PFN_vkCmdDrawIndexedIndirect)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride); -typedef void (VKAPI_PTR *PFN_vkCmdDispatch)(VkCommandBuffer commandBuffer, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ); -typedef void (VKAPI_PTR *PFN_vkCmdDispatchIndirect)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset); -typedef void (VKAPI_PTR *PFN_vkCmdCopyBuffer)(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferCopy* pRegions); -typedef void (VKAPI_PTR *PFN_vkCmdCopyImage)(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy* pRegions); typedef void (VKAPI_PTR *PFN_vkCmdBlitImage)(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit* pRegions, VkFilter filter); -typedef void (VKAPI_PTR *PFN_vkCmdCopyBufferToImage)(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy* pRegions); -typedef void (VKAPI_PTR *PFN_vkCmdCopyImageToBuffer)(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy* pRegions); -typedef void (VKAPI_PTR *PFN_vkCmdUpdateBuffer)(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize dataSize, const void* pData); -typedef void (VKAPI_PTR *PFN_vkCmdFillBuffer)(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size, uint32_t data); -typedef void (VKAPI_PTR *PFN_vkCmdClearColorImage)(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearColorValue* pColor, uint32_t rangeCount, const VkImageSubresourceRange* pRanges); typedef void (VKAPI_PTR *PFN_vkCmdClearDepthStencilImage)(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout, const VkClearDepthStencilValue* pDepthStencil, uint32_t rangeCount, const VkImageSubresourceRange* pRanges); typedef void (VKAPI_PTR *PFN_vkCmdClearAttachments)(VkCommandBuffer commandBuffer, uint32_t attachmentCount, const VkClearAttachment* pAttachments, uint32_t rectCount, const VkClearRect* pRects); typedef void (VKAPI_PTR *PFN_vkCmdResolveImage)(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageResolve* pRegions); -typedef void (VKAPI_PTR *PFN_vkCmdSetEvent)(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask); -typedef void (VKAPI_PTR *PFN_vkCmdResetEvent)(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags stageMask); -typedef void (VKAPI_PTR *PFN_vkCmdWaitEvents)(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent* pEvents, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, uint32_t memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers, uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers); -typedef void (VKAPI_PTR *PFN_vkCmdPipelineBarrier)(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount, const VkMemoryBarrier* pMemoryBarriers, uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier* pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier* pImageMemoryBarriers); -typedef void (VKAPI_PTR *PFN_vkCmdBeginQuery)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query, VkQueryControlFlags flags); -typedef void (VKAPI_PTR *PFN_vkCmdEndQuery)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query); -typedef void (VKAPI_PTR *PFN_vkCmdResetQueryPool)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount); -typedef void (VKAPI_PTR *PFN_vkCmdWriteTimestamp)(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool, uint32_t query); -typedef void (VKAPI_PTR *PFN_vkCmdCopyQueryPoolResults)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags); -typedef void (VKAPI_PTR *PFN_vkCmdPushConstants)(VkCommandBuffer commandBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags, uint32_t offset, uint32_t size, const void* pValues); typedef void (VKAPI_PTR *PFN_vkCmdBeginRenderPass)(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, VkSubpassContents contents); typedef void (VKAPI_PTR *PFN_vkCmdNextSubpass)(VkCommandBuffer commandBuffer, VkSubpassContents contents); typedef void (VKAPI_PTR *PFN_vkCmdEndRenderPass)(VkCommandBuffer commandBuffer); -typedef void (VKAPI_PTR *PFN_vkCmdExecuteCommands)(VkCommandBuffer commandBuffer, uint32_t commandBufferCount, const VkCommandBuffer* pCommandBuffers); #ifndef VK_NO_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateInstance( @@ -4510,29 +4873,6 @@ VKAPI_ATTR void VKAPI_CALL vkDestroySemaphore( VkSemaphore semaphore, const VkAllocationCallbacks* pAllocator); -VKAPI_ATTR VkResult VKAPI_CALL vkCreateEvent( - VkDevice device, - const VkEventCreateInfo* pCreateInfo, - const VkAllocationCallbacks* pAllocator, - VkEvent* pEvent); - -VKAPI_ATTR void VKAPI_CALL vkDestroyEvent( - VkDevice device, - VkEvent event, - const VkAllocationCallbacks* pAllocator); - -VKAPI_ATTR VkResult VKAPI_CALL vkGetEventStatus( - VkDevice device, - VkEvent event); - -VKAPI_ATTR VkResult VKAPI_CALL vkSetEvent( - VkDevice device, - VkEvent event); - -VKAPI_ATTR VkResult VKAPI_CALL vkResetEvent( - VkDevice device, - VkEvent event); - VKAPI_ATTR VkResult VKAPI_CALL vkCreateQueryPool( VkDevice device, const VkQueryPoolCreateInfo* pCreateInfo, @@ -4565,17 +4905,6 @@ VKAPI_ATTR void VKAPI_CALL vkDestroyBuffer( VkBuffer buffer, const VkAllocationCallbacks* pAllocator); -VKAPI_ATTR VkResult VKAPI_CALL vkCreateBufferView( - VkDevice device, - const VkBufferViewCreateInfo* pCreateInfo, - const VkAllocationCallbacks* pAllocator, - VkBufferView* pView); - -VKAPI_ATTR void VKAPI_CALL vkDestroyBufferView( - VkDevice device, - VkBufferView bufferView, - const VkAllocationCallbacks* pAllocator); - VKAPI_ATTR VkResult VKAPI_CALL vkCreateImage( VkDevice device, const VkImageCreateInfo* pCreateInfo, @@ -4604,6 +4933,174 @@ VKAPI_ATTR void VKAPI_CALL vkDestroyImageView( VkImageView imageView, const VkAllocationCallbacks* pAllocator); +VKAPI_ATTR VkResult VKAPI_CALL vkCreateCommandPool( + VkDevice device, + const VkCommandPoolCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkCommandPool* pCommandPool); + +VKAPI_ATTR void VKAPI_CALL vkDestroyCommandPool( + VkDevice device, + VkCommandPool commandPool, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkResetCommandPool( + VkDevice device, + VkCommandPool commandPool, + VkCommandPoolResetFlags flags); + +VKAPI_ATTR VkResult VKAPI_CALL vkAllocateCommandBuffers( + VkDevice device, + const VkCommandBufferAllocateInfo* pAllocateInfo, + VkCommandBuffer* pCommandBuffers); + +VKAPI_ATTR void VKAPI_CALL vkFreeCommandBuffers( + VkDevice device, + VkCommandPool commandPool, + uint32_t commandBufferCount, + const VkCommandBuffer* pCommandBuffers); + +VKAPI_ATTR VkResult VKAPI_CALL vkBeginCommandBuffer( + VkCommandBuffer commandBuffer, + const VkCommandBufferBeginInfo* pBeginInfo); + +VKAPI_ATTR VkResult VKAPI_CALL vkEndCommandBuffer( + VkCommandBuffer commandBuffer); + +VKAPI_ATTR VkResult VKAPI_CALL vkResetCommandBuffer( + VkCommandBuffer commandBuffer, + VkCommandBufferResetFlags flags); + +VKAPI_ATTR void VKAPI_CALL vkCmdCopyBuffer( + VkCommandBuffer commandBuffer, + VkBuffer srcBuffer, + VkBuffer dstBuffer, + uint32_t regionCount, + const VkBufferCopy* pRegions); + +VKAPI_ATTR void VKAPI_CALL vkCmdCopyImage( + VkCommandBuffer commandBuffer, + VkImage srcImage, + VkImageLayout srcImageLayout, + VkImage dstImage, + VkImageLayout dstImageLayout, + uint32_t regionCount, + const VkImageCopy* pRegions); + +VKAPI_ATTR void VKAPI_CALL vkCmdCopyBufferToImage( + VkCommandBuffer commandBuffer, + VkBuffer srcBuffer, + VkImage dstImage, + VkImageLayout dstImageLayout, + uint32_t regionCount, + const VkBufferImageCopy* pRegions); + +VKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer( + VkCommandBuffer commandBuffer, + VkImage srcImage, + VkImageLayout srcImageLayout, + VkBuffer dstBuffer, + uint32_t regionCount, + const VkBufferImageCopy* pRegions); + +VKAPI_ATTR void VKAPI_CALL vkCmdUpdateBuffer( + VkCommandBuffer commandBuffer, + VkBuffer dstBuffer, + VkDeviceSize dstOffset, + VkDeviceSize dataSize, + const void* pData); + +VKAPI_ATTR void VKAPI_CALL vkCmdFillBuffer( + VkCommandBuffer commandBuffer, + VkBuffer dstBuffer, + VkDeviceSize dstOffset, + VkDeviceSize size, + uint32_t data); + +VKAPI_ATTR void VKAPI_CALL vkCmdPipelineBarrier( + VkCommandBuffer commandBuffer, + VkPipelineStageFlags srcStageMask, + VkPipelineStageFlags dstStageMask, + VkDependencyFlags dependencyFlags, + uint32_t memoryBarrierCount, + const VkMemoryBarrier* pMemoryBarriers, + uint32_t bufferMemoryBarrierCount, + const VkBufferMemoryBarrier* pBufferMemoryBarriers, + uint32_t imageMemoryBarrierCount, + const VkImageMemoryBarrier* pImageMemoryBarriers); + +VKAPI_ATTR void VKAPI_CALL vkCmdBeginQuery( + VkCommandBuffer commandBuffer, + VkQueryPool queryPool, + uint32_t query, + VkQueryControlFlags flags); + +VKAPI_ATTR void VKAPI_CALL vkCmdEndQuery( + VkCommandBuffer commandBuffer, + VkQueryPool queryPool, + uint32_t query); + +VKAPI_ATTR void VKAPI_CALL vkCmdResetQueryPool( + VkCommandBuffer commandBuffer, + VkQueryPool queryPool, + uint32_t firstQuery, + uint32_t queryCount); + +VKAPI_ATTR void VKAPI_CALL vkCmdWriteTimestamp( + VkCommandBuffer commandBuffer, + VkPipelineStageFlagBits pipelineStage, + VkQueryPool queryPool, + uint32_t query); + +VKAPI_ATTR void VKAPI_CALL vkCmdCopyQueryPoolResults( + VkCommandBuffer commandBuffer, + VkQueryPool queryPool, + uint32_t firstQuery, + uint32_t queryCount, + VkBuffer dstBuffer, + VkDeviceSize dstOffset, + VkDeviceSize stride, + VkQueryResultFlags flags); + +VKAPI_ATTR void VKAPI_CALL vkCmdExecuteCommands( + VkCommandBuffer commandBuffer, + uint32_t commandBufferCount, + const VkCommandBuffer* pCommandBuffers); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateEvent( + VkDevice device, + const VkEventCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkEvent* pEvent); + +VKAPI_ATTR void VKAPI_CALL vkDestroyEvent( + VkDevice device, + VkEvent event, + const VkAllocationCallbacks* pAllocator); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetEventStatus( + VkDevice device, + VkEvent event); + +VKAPI_ATTR VkResult VKAPI_CALL vkSetEvent( + VkDevice device, + VkEvent event); + +VKAPI_ATTR VkResult VKAPI_CALL vkResetEvent( + VkDevice device, + VkEvent event); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateBufferView( + VkDevice device, + const VkBufferViewCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkBufferView* pView); + +VKAPI_ATTR void VKAPI_CALL vkDestroyBufferView( + VkDevice device, + VkBufferView bufferView, + const VkAllocationCallbacks* pAllocator); + VKAPI_ATTR VkResult VKAPI_CALL vkCreateShaderModule( VkDevice device, const VkShaderModuleCreateInfo* pCreateInfo, @@ -4638,14 +5135,6 @@ VKAPI_ATTR VkResult VKAPI_CALL vkMergePipelineCaches( uint32_t srcCacheCount, const VkPipelineCache* pSrcCaches); -VKAPI_ATTR VkResult VKAPI_CALL vkCreateGraphicsPipelines( - VkDevice device, - VkPipelineCache pipelineCache, - uint32_t createInfoCount, - const VkGraphicsPipelineCreateInfo* pCreateInfos, - const VkAllocationCallbacks* pAllocator, - VkPipeline* pPipelines); - VKAPI_ATTR VkResult VKAPI_CALL vkCreateComputePipelines( VkDevice device, VkPipelineCache pipelineCache, @@ -4726,6 +5215,79 @@ VKAPI_ATTR void VKAPI_CALL vkUpdateDescriptorSets( uint32_t descriptorCopyCount, const VkCopyDescriptorSet* pDescriptorCopies); +VKAPI_ATTR void VKAPI_CALL vkCmdBindPipeline( + VkCommandBuffer commandBuffer, + VkPipelineBindPoint pipelineBindPoint, + VkPipeline pipeline); + +VKAPI_ATTR void VKAPI_CALL vkCmdBindDescriptorSets( + VkCommandBuffer commandBuffer, + VkPipelineBindPoint pipelineBindPoint, + VkPipelineLayout layout, + uint32_t firstSet, + uint32_t descriptorSetCount, + const VkDescriptorSet* pDescriptorSets, + uint32_t dynamicOffsetCount, + const uint32_t* pDynamicOffsets); + +VKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage( + VkCommandBuffer commandBuffer, + VkImage image, + VkImageLayout imageLayout, + const VkClearColorValue* pColor, + uint32_t rangeCount, + const VkImageSubresourceRange* pRanges); + +VKAPI_ATTR void VKAPI_CALL vkCmdDispatch( + VkCommandBuffer commandBuffer, + uint32_t groupCountX, + uint32_t groupCountY, + uint32_t groupCountZ); + +VKAPI_ATTR void VKAPI_CALL vkCmdDispatchIndirect( + VkCommandBuffer commandBuffer, + VkBuffer buffer, + VkDeviceSize offset); + +VKAPI_ATTR void VKAPI_CALL vkCmdSetEvent( + VkCommandBuffer commandBuffer, + VkEvent event, + VkPipelineStageFlags stageMask); + +VKAPI_ATTR void VKAPI_CALL vkCmdResetEvent( + VkCommandBuffer commandBuffer, + VkEvent event, + VkPipelineStageFlags stageMask); + +VKAPI_ATTR void VKAPI_CALL vkCmdWaitEvents( + VkCommandBuffer commandBuffer, + uint32_t eventCount, + const VkEvent* pEvents, + VkPipelineStageFlags srcStageMask, + VkPipelineStageFlags dstStageMask, + uint32_t memoryBarrierCount, + const VkMemoryBarrier* pMemoryBarriers, + uint32_t bufferMemoryBarrierCount, + const VkBufferMemoryBarrier* pBufferMemoryBarriers, + uint32_t imageMemoryBarrierCount, + const VkImageMemoryBarrier* pImageMemoryBarriers); + +VKAPI_ATTR void VKAPI_CALL vkCmdPushConstants( + VkCommandBuffer commandBuffer, + VkPipelineLayout layout, + VkShaderStageFlags stageFlags, + uint32_t offset, + uint32_t size, + const void* pValues); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateGraphicsPipelines( + VkDevice device, + VkPipelineCache pipelineCache, + uint32_t createInfoCount, + const VkGraphicsPipelineCreateInfo* pCreateInfos, + const VkAllocationCallbacks* pAllocator, + VkPipeline* pPipelines); + VKAPI_ATTR VkResult VKAPI_CALL vkCreateFramebuffer( VkDevice device, const VkFramebufferCreateInfo* pCreateInfo, @@ -4753,49 +5315,6 @@ VKAPI_ATTR void VKAPI_CALL vkGetRenderAreaGranularity( VkRenderPass renderPass, VkExtent2D* pGranularity); -VKAPI_ATTR VkResult VKAPI_CALL vkCreateCommandPool( - VkDevice device, - const VkCommandPoolCreateInfo* pCreateInfo, - const VkAllocationCallbacks* pAllocator, - VkCommandPool* pCommandPool); - -VKAPI_ATTR void VKAPI_CALL vkDestroyCommandPool( - VkDevice device, - VkCommandPool commandPool, - const VkAllocationCallbacks* pAllocator); - -VKAPI_ATTR VkResult VKAPI_CALL vkResetCommandPool( - VkDevice device, - VkCommandPool commandPool, - VkCommandPoolResetFlags flags); - -VKAPI_ATTR VkResult VKAPI_CALL vkAllocateCommandBuffers( - VkDevice device, - const VkCommandBufferAllocateInfo* pAllocateInfo, - VkCommandBuffer* pCommandBuffers); - -VKAPI_ATTR void VKAPI_CALL vkFreeCommandBuffers( - VkDevice device, - VkCommandPool commandPool, - uint32_t commandBufferCount, - const VkCommandBuffer* pCommandBuffers); - -VKAPI_ATTR VkResult VKAPI_CALL vkBeginCommandBuffer( - VkCommandBuffer commandBuffer, - const VkCommandBufferBeginInfo* pBeginInfo); - -VKAPI_ATTR VkResult VKAPI_CALL vkEndCommandBuffer( - VkCommandBuffer commandBuffer); - -VKAPI_ATTR VkResult VKAPI_CALL vkResetCommandBuffer( - VkCommandBuffer commandBuffer, - VkCommandBufferResetFlags flags); - -VKAPI_ATTR void VKAPI_CALL vkCmdBindPipeline( - VkCommandBuffer commandBuffer, - VkPipelineBindPoint pipelineBindPoint, - VkPipeline pipeline); - VKAPI_ATTR void VKAPI_CALL vkCmdSetViewport( VkCommandBuffer commandBuffer, uint32_t firstViewport, @@ -4842,16 +5361,6 @@ VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilReference( VkStencilFaceFlags faceMask, uint32_t reference); -VKAPI_ATTR void VKAPI_CALL vkCmdBindDescriptorSets( - VkCommandBuffer commandBuffer, - VkPipelineBindPoint pipelineBindPoint, - VkPipelineLayout layout, - uint32_t firstSet, - uint32_t descriptorSetCount, - const VkDescriptorSet* pDescriptorSets, - uint32_t dynamicOffsetCount, - const uint32_t* pDynamicOffsets); - VKAPI_ATTR void VKAPI_CALL vkCmdBindIndexBuffer( VkCommandBuffer commandBuffer, VkBuffer buffer, @@ -4894,33 +5403,6 @@ VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirect( uint32_t drawCount, uint32_t stride); -VKAPI_ATTR void VKAPI_CALL vkCmdDispatch( - VkCommandBuffer commandBuffer, - uint32_t groupCountX, - uint32_t groupCountY, - uint32_t groupCountZ); - -VKAPI_ATTR void VKAPI_CALL vkCmdDispatchIndirect( - VkCommandBuffer commandBuffer, - VkBuffer buffer, - VkDeviceSize offset); - -VKAPI_ATTR void VKAPI_CALL vkCmdCopyBuffer( - VkCommandBuffer commandBuffer, - VkBuffer srcBuffer, - VkBuffer dstBuffer, - uint32_t regionCount, - const VkBufferCopy* pRegions); - -VKAPI_ATTR void VKAPI_CALL vkCmdCopyImage( - VkCommandBuffer commandBuffer, - VkImage srcImage, - VkImageLayout srcImageLayout, - VkImage dstImage, - VkImageLayout dstImageLayout, - uint32_t regionCount, - const VkImageCopy* pRegions); - VKAPI_ATTR void VKAPI_CALL vkCmdBlitImage( VkCommandBuffer commandBuffer, VkImage srcImage, @@ -4931,44 +5413,6 @@ VKAPI_ATTR void VKAPI_CALL vkCmdBlitImage( const VkImageBlit* pRegions, VkFilter filter); -VKAPI_ATTR void VKAPI_CALL vkCmdCopyBufferToImage( - VkCommandBuffer commandBuffer, - VkBuffer srcBuffer, - VkImage dstImage, - VkImageLayout dstImageLayout, - uint32_t regionCount, - const VkBufferImageCopy* pRegions); - -VKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer( - VkCommandBuffer commandBuffer, - VkImage srcImage, - VkImageLayout srcImageLayout, - VkBuffer dstBuffer, - uint32_t regionCount, - const VkBufferImageCopy* pRegions); - -VKAPI_ATTR void VKAPI_CALL vkCmdUpdateBuffer( - VkCommandBuffer commandBuffer, - VkBuffer dstBuffer, - VkDeviceSize dstOffset, - VkDeviceSize dataSize, - const void* pData); - -VKAPI_ATTR void VKAPI_CALL vkCmdFillBuffer( - VkCommandBuffer commandBuffer, - VkBuffer dstBuffer, - VkDeviceSize dstOffset, - VkDeviceSize size, - uint32_t data); - -VKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage( - VkCommandBuffer commandBuffer, - VkImage image, - VkImageLayout imageLayout, - const VkClearColorValue* pColor, - uint32_t rangeCount, - const VkImageSubresourceRange* pRanges); - VKAPI_ATTR void VKAPI_CALL vkCmdClearDepthStencilImage( VkCommandBuffer commandBuffer, VkImage image, @@ -4993,82 +5437,6 @@ VKAPI_ATTR void VKAPI_CALL vkCmdResolveImage( uint32_t regionCount, const VkImageResolve* pRegions); -VKAPI_ATTR void VKAPI_CALL vkCmdSetEvent( - VkCommandBuffer commandBuffer, - VkEvent event, - VkPipelineStageFlags stageMask); - -VKAPI_ATTR void VKAPI_CALL vkCmdResetEvent( - VkCommandBuffer commandBuffer, - VkEvent event, - VkPipelineStageFlags stageMask); - -VKAPI_ATTR void VKAPI_CALL vkCmdWaitEvents( - VkCommandBuffer commandBuffer, - uint32_t eventCount, - const VkEvent* pEvents, - VkPipelineStageFlags srcStageMask, - VkPipelineStageFlags dstStageMask, - uint32_t memoryBarrierCount, - const VkMemoryBarrier* pMemoryBarriers, - uint32_t bufferMemoryBarrierCount, - const VkBufferMemoryBarrier* pBufferMemoryBarriers, - uint32_t imageMemoryBarrierCount, - const VkImageMemoryBarrier* pImageMemoryBarriers); - -VKAPI_ATTR void VKAPI_CALL vkCmdPipelineBarrier( - VkCommandBuffer commandBuffer, - VkPipelineStageFlags srcStageMask, - VkPipelineStageFlags dstStageMask, - VkDependencyFlags dependencyFlags, - uint32_t memoryBarrierCount, - const VkMemoryBarrier* pMemoryBarriers, - uint32_t bufferMemoryBarrierCount, - const VkBufferMemoryBarrier* pBufferMemoryBarriers, - uint32_t imageMemoryBarrierCount, - const VkImageMemoryBarrier* pImageMemoryBarriers); - -VKAPI_ATTR void VKAPI_CALL vkCmdBeginQuery( - VkCommandBuffer commandBuffer, - VkQueryPool queryPool, - uint32_t query, - VkQueryControlFlags flags); - -VKAPI_ATTR void VKAPI_CALL vkCmdEndQuery( - VkCommandBuffer commandBuffer, - VkQueryPool queryPool, - uint32_t query); - -VKAPI_ATTR void VKAPI_CALL vkCmdResetQueryPool( - VkCommandBuffer commandBuffer, - VkQueryPool queryPool, - uint32_t firstQuery, - uint32_t queryCount); - -VKAPI_ATTR void VKAPI_CALL vkCmdWriteTimestamp( - VkCommandBuffer commandBuffer, - VkPipelineStageFlagBits pipelineStage, - VkQueryPool queryPool, - uint32_t query); - -VKAPI_ATTR void VKAPI_CALL vkCmdCopyQueryPoolResults( - VkCommandBuffer commandBuffer, - VkQueryPool queryPool, - uint32_t firstQuery, - uint32_t queryCount, - VkBuffer dstBuffer, - VkDeviceSize dstOffset, - VkDeviceSize stride, - VkQueryResultFlags flags); - -VKAPI_ATTR void VKAPI_CALL vkCmdPushConstants( - VkCommandBuffer commandBuffer, - VkPipelineLayout layout, - VkShaderStageFlags stageFlags, - uint32_t offset, - uint32_t size, - const void* pValues); - VKAPI_ATTR void VKAPI_CALL vkCmdBeginRenderPass( VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, @@ -5080,11 +5448,6 @@ VKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass( VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass( VkCommandBuffer commandBuffer); - -VKAPI_ATTR void VKAPI_CALL vkCmdExecuteCommands( - VkCommandBuffer commandBuffer, - uint32_t commandBufferCount, - const VkCommandBuffer* pCommandBuffers); #endif @@ -5093,8 +5456,8 @@ VKAPI_ATTR void VKAPI_CALL vkCmdExecuteCommands( // Vulkan 1.1 version number #define VK_API_VERSION_1_1 VK_MAKE_API_VERSION(0, 1, 1, 0)// Patch version should always be set to 0 -VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSamplerYcbcrConversion) VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDescriptorUpdateTemplate) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSamplerYcbcrConversion) #define VK_MAX_DEVICE_GROUP_SIZE 32U #define VK_LUID_SIZE 8U #define VK_QUEUE_FAMILY_EXTERNAL (~1U) @@ -5107,13 +5470,13 @@ typedef enum VkPointClippingBehavior { VK_POINT_CLIPPING_BEHAVIOR_MAX_ENUM = 0x7FFFFFFF } VkPointClippingBehavior; -typedef enum VkTessellationDomainOrigin { - VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT = 0, - VK_TESSELLATION_DOMAIN_ORIGIN_LOWER_LEFT = 1, - VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT_KHR = VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT, - VK_TESSELLATION_DOMAIN_ORIGIN_LOWER_LEFT_KHR = VK_TESSELLATION_DOMAIN_ORIGIN_LOWER_LEFT, - VK_TESSELLATION_DOMAIN_ORIGIN_MAX_ENUM = 0x7FFFFFFF -} VkTessellationDomainOrigin; +typedef enum VkDescriptorUpdateTemplateType { + VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET = 0, + VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS = 1, + VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS, + VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET_KHR = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET, + VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_MAX_ENUM = 0x7FFFFFFF +} VkDescriptorUpdateTemplateType; typedef enum VkSamplerYcbcrModelConversion { VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY = 0, @@ -5145,13 +5508,13 @@ typedef enum VkChromaLocation { VK_CHROMA_LOCATION_MAX_ENUM = 0x7FFFFFFF } VkChromaLocation; -typedef enum VkDescriptorUpdateTemplateType { - VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET = 0, - VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS = 1, - VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS, - VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET_KHR = VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET, - VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_MAX_ENUM = 0x7FFFFFFF -} VkDescriptorUpdateTemplateType; +typedef enum VkTessellationDomainOrigin { + VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT = 0, + VK_TESSELLATION_DOMAIN_ORIGIN_LOWER_LEFT = 1, + VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT_KHR = VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT, + VK_TESSELLATION_DOMAIN_ORIGIN_LOWER_LEFT_KHR = VK_TESSELLATION_DOMAIN_ORIGIN_LOWER_LEFT, + VK_TESSELLATION_DOMAIN_ORIGIN_MAX_ENUM = 0x7FFFFFFF +} VkTessellationDomainOrigin; typedef enum VkSubgroupFeatureFlagBits { VK_SUBGROUP_FEATURE_BASIC_BIT = 0x00000001, @@ -5164,7 +5527,8 @@ typedef enum VkSubgroupFeatureFlagBits { VK_SUBGROUP_FEATURE_QUAD_BIT = 0x00000080, VK_SUBGROUP_FEATURE_ROTATE_BIT = 0x00000200, VK_SUBGROUP_FEATURE_ROTATE_CLUSTERED_BIT = 0x00000400, - VK_SUBGROUP_FEATURE_PARTITIONED_BIT_NV = 0x00000100, + VK_SUBGROUP_FEATURE_PARTITIONED_BIT_EXT = 0x00000100, + VK_SUBGROUP_FEATURE_PARTITIONED_BIT_NV = VK_SUBGROUP_FEATURE_PARTITIONED_BIT_EXT, VK_SUBGROUP_FEATURE_ROTATE_BIT_KHR = VK_SUBGROUP_FEATURE_ROTATE_BIT, VK_SUBGROUP_FEATURE_ROTATE_CLUSTERED_BIT_KHR = VK_SUBGROUP_FEATURE_ROTATE_CLUSTERED_BIT, VK_SUBGROUP_FEATURE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF @@ -5188,6 +5552,7 @@ typedef enum VkMemoryAllocateFlagBits { VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT = 0x00000001, VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT = 0x00000002, VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT = 0x00000004, + VK_MEMORY_ALLOCATE_ZERO_INITIALIZE_BIT_EXT = 0x00000008, VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT_KHR = VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT, VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT, VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT, @@ -5195,7 +5560,6 @@ typedef enum VkMemoryAllocateFlagBits { } VkMemoryAllocateFlagBits; typedef VkFlags VkMemoryAllocateFlags; typedef VkFlags VkCommandPoolTrimFlags; -typedef VkFlags VkDescriptorUpdateTemplateCreateFlags; typedef enum VkExternalMemoryHandleTypeFlagBits { VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT = 0x00000001, @@ -5211,6 +5575,7 @@ typedef enum VkExternalMemoryHandleTypeFlagBits { VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT = 0x00000100, VK_EXTERNAL_MEMORY_HANDLE_TYPE_ZIRCON_VMO_BIT_FUCHSIA = 0x00000800, VK_EXTERNAL_MEMORY_HANDLE_TYPE_RDMA_ADDRESS_BIT_NV = 0x00001000, + VK_EXTERNAL_MEMORY_HANDLE_TYPE_OH_NATIVE_BUFFER_BIT_OHOS = 0x00008000, VK_EXTERNAL_MEMORY_HANDLE_TYPE_SCREEN_BUFFER_BIT_QNX = 0x00004000, VK_EXTERNAL_MEMORY_HANDLE_TYPE_MTLBUFFER_BIT_EXT = 0x00010000, VK_EXTERNAL_MEMORY_HANDLE_TYPE_MTLTEXTURE_BIT_EXT = 0x00020000, @@ -5298,15 +5663,7 @@ typedef enum VkExternalSemaphoreFeatureFlagBits { VK_EXTERNAL_SEMAPHORE_FEATURE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkExternalSemaphoreFeatureFlagBits; typedef VkFlags VkExternalSemaphoreFeatureFlags; -typedef struct VkPhysicalDeviceSubgroupProperties { - VkStructureType sType; - void* pNext; - uint32_t subgroupSize; - VkShaderStageFlags supportedStages; - VkSubgroupFeatureFlags supportedOperations; - VkBool32 quadOperationsInAllStages; -} VkPhysicalDeviceSubgroupProperties; - +typedef VkFlags VkDescriptorUpdateTemplateCreateFlags; typedef struct VkBindBufferMemoryInfo { VkStructureType sType; const void* pNext; @@ -5323,15 +5680,6 @@ typedef struct VkBindImageMemoryInfo { VkDeviceSize memoryOffset; } VkBindImageMemoryInfo; -typedef struct VkPhysicalDevice16BitStorageFeatures { - VkStructureType sType; - void* pNext; - VkBool32 storageBuffer16BitAccess; - VkBool32 uniformAndStorageBuffer16BitAccess; - VkBool32 storagePushConstant16; - VkBool32 storageInputOutput16; -} VkPhysicalDevice16BitStorageFeatures; - typedef struct VkMemoryDedicatedRequirements { VkStructureType sType; void* pNext; @@ -5353,14 +5701,6 @@ typedef struct VkMemoryAllocateFlagsInfo { uint32_t deviceMask; } VkMemoryAllocateFlagsInfo; -typedef struct VkDeviceGroupRenderPassBeginInfo { - VkStructureType sType; - const void* pNext; - uint32_t deviceMask; - uint32_t deviceRenderAreaCount; - const VkRect2D* pDeviceRenderAreas; -} VkDeviceGroupRenderPassBeginInfo; - typedef struct VkDeviceGroupCommandBufferBeginInfo { VkStructureType sType; const void* pNext; @@ -5508,72 +5848,12 @@ typedef struct VkPhysicalDeviceSparseImageFormatInfo2 { VkImageTiling tiling; } VkPhysicalDeviceSparseImageFormatInfo2; -typedef struct VkPhysicalDevicePointClippingProperties { - VkStructureType sType; - void* pNext; - VkPointClippingBehavior pointClippingBehavior; -} VkPhysicalDevicePointClippingProperties; - -typedef struct VkInputAttachmentAspectReference { - uint32_t subpass; - uint32_t inputAttachmentIndex; - VkImageAspectFlags aspectMask; -} VkInputAttachmentAspectReference; - -typedef struct VkRenderPassInputAttachmentAspectCreateInfo { - VkStructureType sType; - const void* pNext; - uint32_t aspectReferenceCount; - const VkInputAttachmentAspectReference* pAspectReferences; -} VkRenderPassInputAttachmentAspectCreateInfo; - typedef struct VkImageViewUsageCreateInfo { VkStructureType sType; const void* pNext; VkImageUsageFlags usage; } VkImageViewUsageCreateInfo; -typedef struct VkPipelineTessellationDomainOriginStateCreateInfo { - VkStructureType sType; - const void* pNext; - VkTessellationDomainOrigin domainOrigin; -} VkPipelineTessellationDomainOriginStateCreateInfo; - -typedef struct VkRenderPassMultiviewCreateInfo { - VkStructureType sType; - const void* pNext; - uint32_t subpassCount; - const uint32_t* pViewMasks; - uint32_t dependencyCount; - const int32_t* pViewOffsets; - uint32_t correlationMaskCount; - const uint32_t* pCorrelationMasks; -} VkRenderPassMultiviewCreateInfo; - -typedef struct VkPhysicalDeviceMultiviewFeatures { - VkStructureType sType; - void* pNext; - VkBool32 multiview; - VkBool32 multiviewGeometryShader; - VkBool32 multiviewTessellationShader; -} VkPhysicalDeviceMultiviewFeatures; - -typedef struct VkPhysicalDeviceMultiviewProperties { - VkStructureType sType; - void* pNext; - uint32_t maxMultiviewViewCount; - uint32_t maxMultiviewInstanceIndex; -} VkPhysicalDeviceMultiviewProperties; - -typedef struct VkPhysicalDeviceVariablePointersFeatures { - VkStructureType sType; - void* pNext; - VkBool32 variablePointersStorageBuffer; - VkBool32 variablePointers; -} VkPhysicalDeviceVariablePointersFeatures; - -typedef VkPhysicalDeviceVariablePointersFeatures VkPhysicalDeviceVariablePointerFeatures; - typedef struct VkPhysicalDeviceProtectedMemoryFeatures { VkStructureType sType; void* pNext; @@ -5600,25 +5880,6 @@ typedef struct VkProtectedSubmitInfo { VkBool32 protectedSubmit; } VkProtectedSubmitInfo; -typedef struct VkSamplerYcbcrConversionCreateInfo { - VkStructureType sType; - const void* pNext; - VkFormat format; - VkSamplerYcbcrModelConversion ycbcrModel; - VkSamplerYcbcrRange ycbcrRange; - VkComponentMapping components; - VkChromaLocation xChromaOffset; - VkChromaLocation yChromaOffset; - VkFilter chromaFilter; - VkBool32 forceExplicitReconstruction; -} VkSamplerYcbcrConversionCreateInfo; - -typedef struct VkSamplerYcbcrConversionInfo { - VkStructureType sType; - const void* pNext; - VkSamplerYcbcrConversion conversion; -} VkSamplerYcbcrConversionInfo; - typedef struct VkBindImagePlaneMemoryInfo { VkStructureType sType; const void* pNext; @@ -5631,40 +5892,6 @@ typedef struct VkImagePlaneMemoryRequirementsInfo { VkImageAspectFlagBits planeAspect; } VkImagePlaneMemoryRequirementsInfo; -typedef struct VkPhysicalDeviceSamplerYcbcrConversionFeatures { - VkStructureType sType; - void* pNext; - VkBool32 samplerYcbcrConversion; -} VkPhysicalDeviceSamplerYcbcrConversionFeatures; - -typedef struct VkSamplerYcbcrConversionImageFormatProperties { - VkStructureType sType; - void* pNext; - uint32_t combinedImageSamplerDescriptorCount; -} VkSamplerYcbcrConversionImageFormatProperties; - -typedef struct VkDescriptorUpdateTemplateEntry { - uint32_t dstBinding; - uint32_t dstArrayElement; - uint32_t descriptorCount; - VkDescriptorType descriptorType; - size_t offset; - size_t stride; -} VkDescriptorUpdateTemplateEntry; - -typedef struct VkDescriptorUpdateTemplateCreateInfo { - VkStructureType sType; - const void* pNext; - VkDescriptorUpdateTemplateCreateFlags flags; - uint32_t descriptorUpdateEntryCount; - const VkDescriptorUpdateTemplateEntry* pDescriptorUpdateEntries; - VkDescriptorUpdateTemplateType templateType; - VkDescriptorSetLayout descriptorSetLayout; - VkPipelineBindPoint pipelineBindPoint; - VkPipelineLayout pipelineLayout; - uint32_t set; -} VkDescriptorUpdateTemplateCreateInfo; - typedef struct VkExternalMemoryProperties { VkExternalMemoryFeatureFlags externalMemoryFeatures; VkExternalMemoryHandleTypeFlags exportFromImportedHandleTypes; @@ -5765,6 +5992,55 @@ typedef struct VkExternalSemaphoreProperties { VkExternalSemaphoreFeatureFlags externalSemaphoreFeatures; } VkExternalSemaphoreProperties; +typedef struct VkPhysicalDeviceSubgroupProperties { + VkStructureType sType; + void* pNext; + uint32_t subgroupSize; + VkShaderStageFlags supportedStages; + VkSubgroupFeatureFlags supportedOperations; + VkBool32 quadOperationsInAllStages; +} VkPhysicalDeviceSubgroupProperties; + +typedef struct VkPhysicalDevice16BitStorageFeatures { + VkStructureType sType; + void* pNext; + VkBool32 storageBuffer16BitAccess; + VkBool32 uniformAndStorageBuffer16BitAccess; + VkBool32 storagePushConstant16; + VkBool32 storageInputOutput16; +} VkPhysicalDevice16BitStorageFeatures; + +typedef struct VkPhysicalDeviceVariablePointersFeatures { + VkStructureType sType; + void* pNext; + VkBool32 variablePointersStorageBuffer; + VkBool32 variablePointers; +} VkPhysicalDeviceVariablePointersFeatures; + +typedef VkPhysicalDeviceVariablePointersFeatures VkPhysicalDeviceVariablePointerFeatures; + +typedef struct VkDescriptorUpdateTemplateEntry { + uint32_t dstBinding; + uint32_t dstArrayElement; + uint32_t descriptorCount; + VkDescriptorType descriptorType; + size_t offset; + size_t stride; +} VkDescriptorUpdateTemplateEntry; + +typedef struct VkDescriptorUpdateTemplateCreateInfo { + VkStructureType sType; + const void* pNext; + VkDescriptorUpdateTemplateCreateFlags flags; + uint32_t descriptorUpdateEntryCount; + const VkDescriptorUpdateTemplateEntry* pDescriptorUpdateEntries; + VkDescriptorUpdateTemplateType templateType; + VkDescriptorSetLayout descriptorSetLayout; + VkPipelineBindPoint pipelineBindPoint; + VkPipelineLayout pipelineLayout; + uint32_t set; +} VkDescriptorUpdateTemplateCreateInfo; + typedef struct VkPhysicalDeviceMaintenance3Properties { VkStructureType sType; void* pNext; @@ -5778,6 +6054,96 @@ typedef struct VkDescriptorSetLayoutSupport { VkBool32 supported; } VkDescriptorSetLayoutSupport; +typedef struct VkSamplerYcbcrConversionCreateInfo { + VkStructureType sType; + const void* pNext; + VkFormat format; + VkSamplerYcbcrModelConversion ycbcrModel; + VkSamplerYcbcrRange ycbcrRange; + VkComponentMapping components; + VkChromaLocation xChromaOffset; + VkChromaLocation yChromaOffset; + VkFilter chromaFilter; + VkBool32 forceExplicitReconstruction; +} VkSamplerYcbcrConversionCreateInfo; + +typedef struct VkSamplerYcbcrConversionInfo { + VkStructureType sType; + const void* pNext; + VkSamplerYcbcrConversion conversion; +} VkSamplerYcbcrConversionInfo; + +typedef struct VkPhysicalDeviceSamplerYcbcrConversionFeatures { + VkStructureType sType; + void* pNext; + VkBool32 samplerYcbcrConversion; +} VkPhysicalDeviceSamplerYcbcrConversionFeatures; + +typedef struct VkSamplerYcbcrConversionImageFormatProperties { + VkStructureType sType; + void* pNext; + uint32_t combinedImageSamplerDescriptorCount; +} VkSamplerYcbcrConversionImageFormatProperties; + +typedef struct VkDeviceGroupRenderPassBeginInfo { + VkStructureType sType; + const void* pNext; + uint32_t deviceMask; + uint32_t deviceRenderAreaCount; + const VkRect2D* pDeviceRenderAreas; +} VkDeviceGroupRenderPassBeginInfo; + +typedef struct VkPhysicalDevicePointClippingProperties { + VkStructureType sType; + void* pNext; + VkPointClippingBehavior pointClippingBehavior; +} VkPhysicalDevicePointClippingProperties; + +typedef struct VkInputAttachmentAspectReference { + uint32_t subpass; + uint32_t inputAttachmentIndex; + VkImageAspectFlags aspectMask; +} VkInputAttachmentAspectReference; + +typedef struct VkRenderPassInputAttachmentAspectCreateInfo { + VkStructureType sType; + const void* pNext; + uint32_t aspectReferenceCount; + const VkInputAttachmentAspectReference* pAspectReferences; +} VkRenderPassInputAttachmentAspectCreateInfo; + +typedef struct VkPipelineTessellationDomainOriginStateCreateInfo { + VkStructureType sType; + const void* pNext; + VkTessellationDomainOrigin domainOrigin; +} VkPipelineTessellationDomainOriginStateCreateInfo; + +typedef struct VkRenderPassMultiviewCreateInfo { + VkStructureType sType; + const void* pNext; + uint32_t subpassCount; + const uint32_t* pViewMasks; + uint32_t dependencyCount; + const int32_t* pViewOffsets; + uint32_t correlationMaskCount; + const uint32_t* pCorrelationMasks; +} VkRenderPassMultiviewCreateInfo; + +typedef struct VkPhysicalDeviceMultiviewFeatures { + VkStructureType sType; + void* pNext; + VkBool32 multiview; + VkBool32 multiviewGeometryShader; + VkBool32 multiviewTessellationShader; +} VkPhysicalDeviceMultiviewFeatures; + +typedef struct VkPhysicalDeviceMultiviewProperties { + VkStructureType sType; + void* pNext; + uint32_t maxMultiviewViewCount; + uint32_t maxMultiviewInstanceIndex; +} VkPhysicalDeviceMultiviewProperties; + typedef struct VkPhysicalDeviceShaderDrawParametersFeatures { VkStructureType sType; void* pNext; @@ -5791,7 +6157,6 @@ typedef VkResult (VKAPI_PTR *PFN_vkBindBufferMemory2)(VkDevice device, uint32_t typedef VkResult (VKAPI_PTR *PFN_vkBindImageMemory2)(VkDevice device, uint32_t bindInfoCount, const VkBindImageMemoryInfo* pBindInfos); typedef void (VKAPI_PTR *PFN_vkGetDeviceGroupPeerMemoryFeatures)(VkDevice device, uint32_t heapIndex, uint32_t localDeviceIndex, uint32_t remoteDeviceIndex, VkPeerMemoryFeatureFlags* pPeerMemoryFeatures); typedef void (VKAPI_PTR *PFN_vkCmdSetDeviceMask)(VkCommandBuffer commandBuffer, uint32_t deviceMask); -typedef void (VKAPI_PTR *PFN_vkCmdDispatchBase)(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ); typedef VkResult (VKAPI_PTR *PFN_vkEnumeratePhysicalDeviceGroups)(VkInstance instance, uint32_t* pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties); typedef void (VKAPI_PTR *PFN_vkGetImageMemoryRequirements2)(VkDevice device, const VkImageMemoryRequirementsInfo2* pInfo, VkMemoryRequirements2* pMemoryRequirements); typedef void (VKAPI_PTR *PFN_vkGetBufferMemoryRequirements2)(VkDevice device, const VkBufferMemoryRequirementsInfo2* pInfo, VkMemoryRequirements2* pMemoryRequirements); @@ -5805,15 +6170,16 @@ typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceMemoryProperties2)(VkPhysicalDev typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceSparseImageFormatProperties2)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo, uint32_t* pPropertyCount, VkSparseImageFormatProperties2* pProperties); typedef void (VKAPI_PTR *PFN_vkTrimCommandPool)(VkDevice device, VkCommandPool commandPool, VkCommandPoolTrimFlags flags); typedef void (VKAPI_PTR *PFN_vkGetDeviceQueue2)(VkDevice device, const VkDeviceQueueInfo2* pQueueInfo, VkQueue* pQueue); -typedef VkResult (VKAPI_PTR *PFN_vkCreateSamplerYcbcrConversion)(VkDevice device, const VkSamplerYcbcrConversionCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSamplerYcbcrConversion* pYcbcrConversion); -typedef void (VKAPI_PTR *PFN_vkDestroySamplerYcbcrConversion)(VkDevice device, VkSamplerYcbcrConversion ycbcrConversion, const VkAllocationCallbacks* pAllocator); -typedef VkResult (VKAPI_PTR *PFN_vkCreateDescriptorUpdateTemplate)(VkDevice device, const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate); -typedef void (VKAPI_PTR *PFN_vkDestroyDescriptorUpdateTemplate)(VkDevice device, VkDescriptorUpdateTemplate descriptorUpdateTemplate, const VkAllocationCallbacks* pAllocator); -typedef void (VKAPI_PTR *PFN_vkUpdateDescriptorSetWithTemplate)(VkDevice device, VkDescriptorSet descriptorSet, VkDescriptorUpdateTemplate descriptorUpdateTemplate, const void* pData); typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalBufferProperties)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo, VkExternalBufferProperties* pExternalBufferProperties); typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalFenceProperties)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo, VkExternalFenceProperties* pExternalFenceProperties); typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalSemaphoreProperties)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo, VkExternalSemaphoreProperties* pExternalSemaphoreProperties); +typedef void (VKAPI_PTR *PFN_vkCmdDispatchBase)(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ); +typedef VkResult (VKAPI_PTR *PFN_vkCreateDescriptorUpdateTemplate)(VkDevice device, const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate); +typedef void (VKAPI_PTR *PFN_vkDestroyDescriptorUpdateTemplate)(VkDevice device, VkDescriptorUpdateTemplate descriptorUpdateTemplate, const VkAllocationCallbacks* pAllocator); +typedef void (VKAPI_PTR *PFN_vkUpdateDescriptorSetWithTemplate)(VkDevice device, VkDescriptorSet descriptorSet, VkDescriptorUpdateTemplate descriptorUpdateTemplate, const void* pData); typedef void (VKAPI_PTR *PFN_vkGetDescriptorSetLayoutSupport)(VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, VkDescriptorSetLayoutSupport* pSupport); +typedef VkResult (VKAPI_PTR *PFN_vkCreateSamplerYcbcrConversion)(VkDevice device, const VkSamplerYcbcrConversionCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSamplerYcbcrConversion* pYcbcrConversion); +typedef void (VKAPI_PTR *PFN_vkDestroySamplerYcbcrConversion)(VkDevice device, VkSamplerYcbcrConversion ycbcrConversion, const VkAllocationCallbacks* pAllocator); #ifndef VK_NO_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkEnumerateInstanceVersion( @@ -5840,15 +6206,6 @@ VKAPI_ATTR void VKAPI_CALL vkCmdSetDeviceMask( VkCommandBuffer commandBuffer, uint32_t deviceMask); -VKAPI_ATTR void VKAPI_CALL vkCmdDispatchBase( - VkCommandBuffer commandBuffer, - uint32_t baseGroupX, - uint32_t baseGroupY, - uint32_t baseGroupZ, - uint32_t groupCountX, - uint32_t groupCountY, - uint32_t groupCountZ); - VKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDeviceGroups( VkInstance instance, uint32_t* pPhysicalDeviceGroupCount, @@ -5913,16 +6270,29 @@ VKAPI_ATTR void VKAPI_CALL vkGetDeviceQueue2( const VkDeviceQueueInfo2* pQueueInfo, VkQueue* pQueue); -VKAPI_ATTR VkResult VKAPI_CALL vkCreateSamplerYcbcrConversion( - VkDevice device, - const VkSamplerYcbcrConversionCreateInfo* pCreateInfo, - const VkAllocationCallbacks* pAllocator, - VkSamplerYcbcrConversion* pYcbcrConversion); +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceExternalBufferProperties( + VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo, + VkExternalBufferProperties* pExternalBufferProperties); -VKAPI_ATTR void VKAPI_CALL vkDestroySamplerYcbcrConversion( - VkDevice device, - VkSamplerYcbcrConversion ycbcrConversion, - const VkAllocationCallbacks* pAllocator); +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceExternalFenceProperties( + VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo, + VkExternalFenceProperties* pExternalFenceProperties); + +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceExternalSemaphoreProperties( + VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo, + VkExternalSemaphoreProperties* pExternalSemaphoreProperties); + +VKAPI_ATTR void VKAPI_CALL vkCmdDispatchBase( + VkCommandBuffer commandBuffer, + uint32_t baseGroupX, + uint32_t baseGroupY, + uint32_t baseGroupZ, + uint32_t groupCountX, + uint32_t groupCountY, + uint32_t groupCountZ); VKAPI_ATTR VkResult VKAPI_CALL vkCreateDescriptorUpdateTemplate( VkDevice device, @@ -5941,25 +6311,21 @@ VKAPI_ATTR void VKAPI_CALL vkUpdateDescriptorSetWithTemplate( VkDescriptorUpdateTemplate descriptorUpdateTemplate, const void* pData); -VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceExternalBufferProperties( - VkPhysicalDevice physicalDevice, - const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo, - VkExternalBufferProperties* pExternalBufferProperties); - -VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceExternalFenceProperties( - VkPhysicalDevice physicalDevice, - const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo, - VkExternalFenceProperties* pExternalFenceProperties); - -VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceExternalSemaphoreProperties( - VkPhysicalDevice physicalDevice, - const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo, - VkExternalSemaphoreProperties* pExternalSemaphoreProperties); - VKAPI_ATTR void VKAPI_CALL vkGetDescriptorSetLayoutSupport( VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, VkDescriptorSetLayoutSupport* pSupport); + +VKAPI_ATTR VkResult VKAPI_CALL vkCreateSamplerYcbcrConversion( + VkDevice device, + const VkSamplerYcbcrConversionCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkSamplerYcbcrConversion* pYcbcrConversion); + +VKAPI_ATTR void VKAPI_CALL vkDestroySamplerYcbcrConversion( + VkDevice device, + VkSamplerYcbcrConversion ycbcrConversion, + const VkAllocationCallbacks* pAllocator); #endif @@ -5999,6 +6365,9 @@ typedef enum VkDriverId { VK_DRIVER_ID_IMAGINATION_OPEN_SOURCE_MESA = 25, VK_DRIVER_ID_MESA_HONEYKRISP = 26, VK_DRIVER_ID_VULKAN_SC_EMULATION_ON_VULKAN = 27, + VK_DRIVER_ID_MESA_KOSMICKRISP = 28, + VK_DRIVER_ID_MESA_GFXSTREAM = 29, + VK_DRIVER_ID_APE_SOFT = 30, VK_DRIVER_ID_AMD_PROPRIETARY_KHR = VK_DRIVER_ID_AMD_PROPRIETARY, VK_DRIVER_ID_AMD_OPEN_SOURCE_KHR = VK_DRIVER_ID_AMD_OPEN_SOURCE, VK_DRIVER_ID_MESA_RADV_KHR = VK_DRIVER_ID_MESA_RADV, @@ -6024,6 +6393,14 @@ typedef enum VkShaderFloatControlsIndependence { VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_MAX_ENUM = 0x7FFFFFFF } VkShaderFloatControlsIndependence; +typedef enum VkSemaphoreType { + VK_SEMAPHORE_TYPE_BINARY = 0, + VK_SEMAPHORE_TYPE_TIMELINE = 1, + VK_SEMAPHORE_TYPE_BINARY_KHR = VK_SEMAPHORE_TYPE_BINARY, + VK_SEMAPHORE_TYPE_TIMELINE_KHR = VK_SEMAPHORE_TYPE_TIMELINE, + VK_SEMAPHORE_TYPE_MAX_ENUM = 0x7FFFFFFF +} VkSemaphoreType; + typedef enum VkSamplerReductionMode { VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE = 0, VK_SAMPLER_REDUCTION_MODE_MIN = 1, @@ -6035,30 +6412,32 @@ typedef enum VkSamplerReductionMode { VK_SAMPLER_REDUCTION_MODE_MAX_ENUM = 0x7FFFFFFF } VkSamplerReductionMode; -typedef enum VkSemaphoreType { - VK_SEMAPHORE_TYPE_BINARY = 0, - VK_SEMAPHORE_TYPE_TIMELINE = 1, - VK_SEMAPHORE_TYPE_BINARY_KHR = VK_SEMAPHORE_TYPE_BINARY, - VK_SEMAPHORE_TYPE_TIMELINE_KHR = VK_SEMAPHORE_TYPE_TIMELINE, - VK_SEMAPHORE_TYPE_MAX_ENUM = 0x7FFFFFFF -} VkSemaphoreType; - typedef enum VkResolveModeFlagBits { VK_RESOLVE_MODE_NONE = 0, VK_RESOLVE_MODE_SAMPLE_ZERO_BIT = 0x00000001, VK_RESOLVE_MODE_AVERAGE_BIT = 0x00000002, VK_RESOLVE_MODE_MIN_BIT = 0x00000004, VK_RESOLVE_MODE_MAX_BIT = 0x00000008, - VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID = 0x00000010, + VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_BIT_ANDROID = 0x00000010, + VK_RESOLVE_MODE_CUSTOM_BIT_EXT = 0x00000020, VK_RESOLVE_MODE_NONE_KHR = VK_RESOLVE_MODE_NONE, VK_RESOLVE_MODE_SAMPLE_ZERO_BIT_KHR = VK_RESOLVE_MODE_SAMPLE_ZERO_BIT, VK_RESOLVE_MODE_AVERAGE_BIT_KHR = VK_RESOLVE_MODE_AVERAGE_BIT, VK_RESOLVE_MODE_MIN_BIT_KHR = VK_RESOLVE_MODE_MIN_BIT, VK_RESOLVE_MODE_MAX_BIT_KHR = VK_RESOLVE_MODE_MAX_BIT, + // VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID is a legacy alias + VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID = VK_RESOLVE_MODE_EXTERNAL_FORMAT_DOWNSAMPLE_BIT_ANDROID, VK_RESOLVE_MODE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkResolveModeFlagBits; typedef VkFlags VkResolveModeFlags; +typedef enum VkSemaphoreWaitFlagBits { + VK_SEMAPHORE_WAIT_ANY_BIT = 0x00000001, + VK_SEMAPHORE_WAIT_ANY_BIT_KHR = VK_SEMAPHORE_WAIT_ANY_BIT, + VK_SEMAPHORE_WAIT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkSemaphoreWaitFlagBits; +typedef VkFlags VkSemaphoreWaitFlags; + typedef enum VkDescriptorBindingFlagBits { VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT = 0x00000001, VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT = 0x00000002, @@ -6071,13 +6450,22 @@ typedef enum VkDescriptorBindingFlagBits { VK_DESCRIPTOR_BINDING_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkDescriptorBindingFlagBits; typedef VkFlags VkDescriptorBindingFlags; +typedef struct VkConformanceVersion { + uint8_t major; + uint8_t minor; + uint8_t subminor; + uint8_t patch; +} VkConformanceVersion; + +typedef struct VkPhysicalDeviceDriverProperties { + VkStructureType sType; + void* pNext; + VkDriverId driverID; + char driverName[VK_MAX_DRIVER_NAME_SIZE]; + char driverInfo[VK_MAX_DRIVER_INFO_SIZE]; + VkConformanceVersion conformanceVersion; +} VkPhysicalDeviceDriverProperties; -typedef enum VkSemaphoreWaitFlagBits { - VK_SEMAPHORE_WAIT_ANY_BIT = 0x00000001, - VK_SEMAPHORE_WAIT_ANY_BIT_KHR = VK_SEMAPHORE_WAIT_ANY_BIT, - VK_SEMAPHORE_WAIT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF -} VkSemaphoreWaitFlagBits; -typedef VkFlags VkSemaphoreWaitFlags; typedef struct VkPhysicalDeviceVulkan11Features { VkStructureType sType; void* pNext; @@ -6167,13 +6555,6 @@ typedef struct VkPhysicalDeviceVulkan12Features { VkBool32 subgroupBroadcastDynamicId; } VkPhysicalDeviceVulkan12Features; -typedef struct VkConformanceVersion { - uint8_t major; - uint8_t minor; - uint8_t subminor; - uint8_t patch; -} VkConformanceVersion; - typedef struct VkPhysicalDeviceVulkan12Properties { VkStructureType sType; void* pNext; @@ -6238,81 +6619,95 @@ typedef struct VkImageFormatListCreateInfo { const VkFormat* pViewFormats; } VkImageFormatListCreateInfo; -typedef struct VkAttachmentDescription2 { - VkStructureType sType; - const void* pNext; - VkAttachmentDescriptionFlags flags; - VkFormat format; - VkSampleCountFlagBits samples; - VkAttachmentLoadOp loadOp; - VkAttachmentStoreOp storeOp; - VkAttachmentLoadOp stencilLoadOp; - VkAttachmentStoreOp stencilStoreOp; - VkImageLayout initialLayout; - VkImageLayout finalLayout; -} VkAttachmentDescription2; +typedef struct VkPhysicalDeviceVulkanMemoryModelFeatures { + VkStructureType sType; + void* pNext; + VkBool32 vulkanMemoryModel; + VkBool32 vulkanMemoryModelDeviceScope; + VkBool32 vulkanMemoryModelAvailabilityVisibilityChains; +} VkPhysicalDeviceVulkanMemoryModelFeatures; -typedef struct VkAttachmentReference2 { - VkStructureType sType; - const void* pNext; - uint32_t attachment; - VkImageLayout layout; - VkImageAspectFlags aspectMask; -} VkAttachmentReference2; +typedef struct VkPhysicalDeviceHostQueryResetFeatures { + VkStructureType sType; + void* pNext; + VkBool32 hostQueryReset; +} VkPhysicalDeviceHostQueryResetFeatures; -typedef struct VkSubpassDescription2 { - VkStructureType sType; - const void* pNext; - VkSubpassDescriptionFlags flags; - VkPipelineBindPoint pipelineBindPoint; - uint32_t viewMask; - uint32_t inputAttachmentCount; - const VkAttachmentReference2* pInputAttachments; - uint32_t colorAttachmentCount; - const VkAttachmentReference2* pColorAttachments; - const VkAttachmentReference2* pResolveAttachments; - const VkAttachmentReference2* pDepthStencilAttachment; - uint32_t preserveAttachmentCount; - const uint32_t* pPreserveAttachments; -} VkSubpassDescription2; +typedef struct VkPhysicalDeviceTimelineSemaphoreFeatures { + VkStructureType sType; + void* pNext; + VkBool32 timelineSemaphore; +} VkPhysicalDeviceTimelineSemaphoreFeatures; -typedef struct VkSubpassDependency2 { - VkStructureType sType; - const void* pNext; - uint32_t srcSubpass; - uint32_t dstSubpass; - VkPipelineStageFlags srcStageMask; - VkPipelineStageFlags dstStageMask; - VkAccessFlags srcAccessMask; - VkAccessFlags dstAccessMask; - VkDependencyFlags dependencyFlags; - int32_t viewOffset; -} VkSubpassDependency2; +typedef struct VkPhysicalDeviceTimelineSemaphoreProperties { + VkStructureType sType; + void* pNext; + uint64_t maxTimelineSemaphoreValueDifference; +} VkPhysicalDeviceTimelineSemaphoreProperties; -typedef struct VkRenderPassCreateInfo2 { - VkStructureType sType; - const void* pNext; - VkRenderPassCreateFlags flags; - uint32_t attachmentCount; - const VkAttachmentDescription2* pAttachments; - uint32_t subpassCount; - const VkSubpassDescription2* pSubpasses; - uint32_t dependencyCount; - const VkSubpassDependency2* pDependencies; - uint32_t correlatedViewMaskCount; - const uint32_t* pCorrelatedViewMasks; -} VkRenderPassCreateInfo2; - -typedef struct VkSubpassBeginInfo { - VkStructureType sType; - const void* pNext; - VkSubpassContents contents; -} VkSubpassBeginInfo; - -typedef struct VkSubpassEndInfo { +typedef struct VkSemaphoreTypeCreateInfo { VkStructureType sType; const void* pNext; -} VkSubpassEndInfo; + VkSemaphoreType semaphoreType; + uint64_t initialValue; +} VkSemaphoreTypeCreateInfo; + +typedef struct VkTimelineSemaphoreSubmitInfo { + VkStructureType sType; + const void* pNext; + uint32_t waitSemaphoreValueCount; + const uint64_t* pWaitSemaphoreValues; + uint32_t signalSemaphoreValueCount; + const uint64_t* pSignalSemaphoreValues; +} VkTimelineSemaphoreSubmitInfo; + +typedef struct VkSemaphoreWaitInfo { + VkStructureType sType; + const void* pNext; + VkSemaphoreWaitFlags flags; + uint32_t semaphoreCount; + const VkSemaphore* pSemaphores; + const uint64_t* pValues; +} VkSemaphoreWaitInfo; + +typedef struct VkSemaphoreSignalInfo { + VkStructureType sType; + const void* pNext; + VkSemaphore semaphore; + uint64_t value; +} VkSemaphoreSignalInfo; + +typedef struct VkPhysicalDeviceBufferDeviceAddressFeatures { + VkStructureType sType; + void* pNext; + VkBool32 bufferDeviceAddress; + VkBool32 bufferDeviceAddressCaptureReplay; + VkBool32 bufferDeviceAddressMultiDevice; +} VkPhysicalDeviceBufferDeviceAddressFeatures; + +typedef struct VkBufferDeviceAddressInfo { + VkStructureType sType; + const void* pNext; + VkBuffer buffer; +} VkBufferDeviceAddressInfo; + +typedef struct VkBufferOpaqueCaptureAddressCreateInfo { + VkStructureType sType; + const void* pNext; + uint64_t opaqueCaptureAddress; +} VkBufferOpaqueCaptureAddressCreateInfo; + +typedef struct VkMemoryOpaqueCaptureAddressAllocateInfo { + VkStructureType sType; + const void* pNext; + uint64_t opaqueCaptureAddress; +} VkMemoryOpaqueCaptureAddressAllocateInfo; + +typedef struct VkDeviceMemoryOpaqueCaptureAddressInfo { + VkStructureType sType; + const void* pNext; + VkDeviceMemory memory; +} VkDeviceMemoryOpaqueCaptureAddressInfo; typedef struct VkPhysicalDevice8BitStorageFeatures { VkStructureType sType; @@ -6322,15 +6717,6 @@ typedef struct VkPhysicalDevice8BitStorageFeatures { VkBool32 storagePushConstant8; } VkPhysicalDevice8BitStorageFeatures; -typedef struct VkPhysicalDeviceDriverProperties { - VkStructureType sType; - void* pNext; - VkDriverId driverID; - char driverName[VK_MAX_DRIVER_NAME_SIZE]; - char driverInfo[VK_MAX_DRIVER_INFO_SIZE]; - VkConformanceVersion conformanceVersion; -} VkPhysicalDeviceDriverProperties; - typedef struct VkPhysicalDeviceShaderAtomicInt64Features { VkStructureType sType; void* pNext; @@ -6440,6 +6826,113 @@ typedef struct VkDescriptorSetVariableDescriptorCountLayoutSupport { uint32_t maxVariableDescriptorCount; } VkDescriptorSetVariableDescriptorCountLayoutSupport; +typedef struct VkPhysicalDeviceScalarBlockLayoutFeatures { + VkStructureType sType; + void* pNext; + VkBool32 scalarBlockLayout; +} VkPhysicalDeviceScalarBlockLayoutFeatures; + +typedef struct VkSamplerReductionModeCreateInfo { + VkStructureType sType; + const void* pNext; + VkSamplerReductionMode reductionMode; +} VkSamplerReductionModeCreateInfo; + +typedef struct VkPhysicalDeviceSamplerFilterMinmaxProperties { + VkStructureType sType; + void* pNext; + VkBool32 filterMinmaxSingleComponentFormats; + VkBool32 filterMinmaxImageComponentMapping; +} VkPhysicalDeviceSamplerFilterMinmaxProperties; + +typedef struct VkPhysicalDeviceUniformBufferStandardLayoutFeatures { + VkStructureType sType; + void* pNext; + VkBool32 uniformBufferStandardLayout; +} VkPhysicalDeviceUniformBufferStandardLayoutFeatures; + +typedef struct VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures { + VkStructureType sType; + void* pNext; + VkBool32 shaderSubgroupExtendedTypes; +} VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures; + +typedef struct VkAttachmentDescription2 { + VkStructureType sType; + const void* pNext; + VkAttachmentDescriptionFlags flags; + VkFormat format; + VkSampleCountFlagBits samples; + VkAttachmentLoadOp loadOp; + VkAttachmentStoreOp storeOp; + VkAttachmentLoadOp stencilLoadOp; + VkAttachmentStoreOp stencilStoreOp; + VkImageLayout initialLayout; + VkImageLayout finalLayout; +} VkAttachmentDescription2; + +typedef struct VkAttachmentReference2 { + VkStructureType sType; + const void* pNext; + uint32_t attachment; + VkImageLayout layout; + VkImageAspectFlags aspectMask; +} VkAttachmentReference2; + +typedef struct VkSubpassDescription2 { + VkStructureType sType; + const void* pNext; + VkSubpassDescriptionFlags flags; + VkPipelineBindPoint pipelineBindPoint; + uint32_t viewMask; + uint32_t inputAttachmentCount; + const VkAttachmentReference2* pInputAttachments; + uint32_t colorAttachmentCount; + const VkAttachmentReference2* pColorAttachments; + const VkAttachmentReference2* pResolveAttachments; + const VkAttachmentReference2* pDepthStencilAttachment; + uint32_t preserveAttachmentCount; + const uint32_t* pPreserveAttachments; +} VkSubpassDescription2; + +typedef struct VkSubpassDependency2 { + VkStructureType sType; + const void* pNext; + uint32_t srcSubpass; + uint32_t dstSubpass; + VkPipelineStageFlags srcStageMask; + VkPipelineStageFlags dstStageMask; + VkAccessFlags srcAccessMask; + VkAccessFlags dstAccessMask; + VkDependencyFlags dependencyFlags; + int32_t viewOffset; +} VkSubpassDependency2; + +typedef struct VkSubpassBeginInfo { + VkStructureType sType; + const void* pNext; + VkSubpassContents contents; +} VkSubpassBeginInfo; + +typedef struct VkSubpassEndInfo { + VkStructureType sType; + const void* pNext; +} VkSubpassEndInfo; + +typedef struct VkRenderPassCreateInfo2 { + VkStructureType sType; + const void* pNext; + VkRenderPassCreateFlags flags; + uint32_t attachmentCount; + const VkAttachmentDescription2* pAttachments; + uint32_t subpassCount; + const VkSubpassDescription2* pSubpasses; + uint32_t dependencyCount; + const VkSubpassDependency2* pDependencies; + uint32_t correlatedViewMaskCount; + const uint32_t* pCorrelatedViewMasks; +} VkRenderPassCreateInfo2; + typedef struct VkSubpassDescriptionDepthStencilResolve { VkStructureType sType; const void* pNext; @@ -6457,39 +6950,12 @@ typedef struct VkPhysicalDeviceDepthStencilResolveProperties { VkBool32 independentResolve; } VkPhysicalDeviceDepthStencilResolveProperties; -typedef struct VkPhysicalDeviceScalarBlockLayoutFeatures { - VkStructureType sType; - void* pNext; - VkBool32 scalarBlockLayout; -} VkPhysicalDeviceScalarBlockLayoutFeatures; - typedef struct VkImageStencilUsageCreateInfo { VkStructureType sType; const void* pNext; VkImageUsageFlags stencilUsage; } VkImageStencilUsageCreateInfo; -typedef struct VkSamplerReductionModeCreateInfo { - VkStructureType sType; - const void* pNext; - VkSamplerReductionMode reductionMode; -} VkSamplerReductionModeCreateInfo; - -typedef struct VkPhysicalDeviceSamplerFilterMinmaxProperties { - VkStructureType sType; - void* pNext; - VkBool32 filterMinmaxSingleComponentFormats; - VkBool32 filterMinmaxImageComponentMapping; -} VkPhysicalDeviceSamplerFilterMinmaxProperties; - -typedef struct VkPhysicalDeviceVulkanMemoryModelFeatures { - VkStructureType sType; - void* pNext; - VkBool32 vulkanMemoryModel; - VkBool32 vulkanMemoryModelDeviceScope; - VkBool32 vulkanMemoryModelAvailabilityVisibilityChains; -} VkPhysicalDeviceVulkanMemoryModelFeatures; - typedef struct VkPhysicalDeviceImagelessFramebufferFeatures { VkStructureType sType; void* pNext; @@ -6508,13 +6974,6 @@ typedef struct VkFramebufferAttachmentImageInfo { const VkFormat* pViewFormats; } VkFramebufferAttachmentImageInfo; -typedef struct VkFramebufferAttachmentsCreateInfo { - VkStructureType sType; - const void* pNext; - uint32_t attachmentImageInfoCount; - const VkFramebufferAttachmentImageInfo* pAttachmentImageInfos; -} VkFramebufferAttachmentsCreateInfo; - typedef struct VkRenderPassAttachmentBeginInfo { VkStructureType sType; const void* pNext; @@ -6522,17 +6981,12 @@ typedef struct VkRenderPassAttachmentBeginInfo { const VkImageView* pAttachments; } VkRenderPassAttachmentBeginInfo; -typedef struct VkPhysicalDeviceUniformBufferStandardLayoutFeatures { - VkStructureType sType; - void* pNext; - VkBool32 uniformBufferStandardLayout; -} VkPhysicalDeviceUniformBufferStandardLayoutFeatures; - -typedef struct VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures { - VkStructureType sType; - void* pNext; - VkBool32 shaderSubgroupExtendedTypes; -} VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures; +typedef struct VkFramebufferAttachmentsCreateInfo { + VkStructureType sType; + const void* pNext; + uint32_t attachmentImageInfoCount; + const VkFramebufferAttachmentImageInfo* pAttachmentImageInfos; +} VkFramebufferAttachmentsCreateInfo; typedef struct VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures { VkStructureType sType; @@ -6553,94 +7007,6 @@ typedef struct VkAttachmentDescriptionStencilLayout { VkImageLayout stencilFinalLayout; } VkAttachmentDescriptionStencilLayout; -typedef struct VkPhysicalDeviceHostQueryResetFeatures { - VkStructureType sType; - void* pNext; - VkBool32 hostQueryReset; -} VkPhysicalDeviceHostQueryResetFeatures; - -typedef struct VkPhysicalDeviceTimelineSemaphoreFeatures { - VkStructureType sType; - void* pNext; - VkBool32 timelineSemaphore; -} VkPhysicalDeviceTimelineSemaphoreFeatures; - -typedef struct VkPhysicalDeviceTimelineSemaphoreProperties { - VkStructureType sType; - void* pNext; - uint64_t maxTimelineSemaphoreValueDifference; -} VkPhysicalDeviceTimelineSemaphoreProperties; - -typedef struct VkSemaphoreTypeCreateInfo { - VkStructureType sType; - const void* pNext; - VkSemaphoreType semaphoreType; - uint64_t initialValue; -} VkSemaphoreTypeCreateInfo; - -typedef struct VkTimelineSemaphoreSubmitInfo { - VkStructureType sType; - const void* pNext; - uint32_t waitSemaphoreValueCount; - const uint64_t* pWaitSemaphoreValues; - uint32_t signalSemaphoreValueCount; - const uint64_t* pSignalSemaphoreValues; -} VkTimelineSemaphoreSubmitInfo; - -typedef struct VkSemaphoreWaitInfo { - VkStructureType sType; - const void* pNext; - VkSemaphoreWaitFlags flags; - uint32_t semaphoreCount; - const VkSemaphore* pSemaphores; - const uint64_t* pValues; -} VkSemaphoreWaitInfo; - -typedef struct VkSemaphoreSignalInfo { - VkStructureType sType; - const void* pNext; - VkSemaphore semaphore; - uint64_t value; -} VkSemaphoreSignalInfo; - -typedef struct VkPhysicalDeviceBufferDeviceAddressFeatures { - VkStructureType sType; - void* pNext; - VkBool32 bufferDeviceAddress; - VkBool32 bufferDeviceAddressCaptureReplay; - VkBool32 bufferDeviceAddressMultiDevice; -} VkPhysicalDeviceBufferDeviceAddressFeatures; - -typedef struct VkBufferDeviceAddressInfo { - VkStructureType sType; - const void* pNext; - VkBuffer buffer; -} VkBufferDeviceAddressInfo; - -typedef struct VkBufferOpaqueCaptureAddressCreateInfo { - VkStructureType sType; - const void* pNext; - uint64_t opaqueCaptureAddress; -} VkBufferOpaqueCaptureAddressCreateInfo; - -typedef struct VkMemoryOpaqueCaptureAddressAllocateInfo { - VkStructureType sType; - const void* pNext; - uint64_t opaqueCaptureAddress; -} VkMemoryOpaqueCaptureAddressAllocateInfo; - -typedef struct VkDeviceMemoryOpaqueCaptureAddressInfo { - VkStructureType sType; - const void* pNext; - VkDeviceMemory memory; -} VkDeviceMemoryOpaqueCaptureAddressInfo; - -typedef void (VKAPI_PTR *PFN_vkCmdDrawIndirectCount)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride); -typedef void (VKAPI_PTR *PFN_vkCmdDrawIndexedIndirectCount)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride); -typedef VkResult (VKAPI_PTR *PFN_vkCreateRenderPass2)(VkDevice device, const VkRenderPassCreateInfo2* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass); -typedef void (VKAPI_PTR *PFN_vkCmdBeginRenderPass2)(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, const VkSubpassBeginInfo* pSubpassBeginInfo); -typedef void (VKAPI_PTR *PFN_vkCmdNextSubpass2)(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo* pSubpassBeginInfo, const VkSubpassEndInfo* pSubpassEndInfo); -typedef void (VKAPI_PTR *PFN_vkCmdEndRenderPass2)(VkCommandBuffer commandBuffer, const VkSubpassEndInfo* pSubpassEndInfo); typedef void (VKAPI_PTR *PFN_vkResetQueryPool)(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount); typedef VkResult (VKAPI_PTR *PFN_vkGetSemaphoreCounterValue)(VkDevice device, VkSemaphore semaphore, uint64_t* pValue); typedef VkResult (VKAPI_PTR *PFN_vkWaitSemaphores)(VkDevice device, const VkSemaphoreWaitInfo* pWaitInfo, uint64_t timeout); @@ -6648,8 +7014,46 @@ typedef VkResult (VKAPI_PTR *PFN_vkSignalSemaphore)(VkDevice device, const VkSem typedef VkDeviceAddress (VKAPI_PTR *PFN_vkGetBufferDeviceAddress)(VkDevice device, const VkBufferDeviceAddressInfo* pInfo); typedef uint64_t (VKAPI_PTR *PFN_vkGetBufferOpaqueCaptureAddress)(VkDevice device, const VkBufferDeviceAddressInfo* pInfo); typedef uint64_t (VKAPI_PTR *PFN_vkGetDeviceMemoryOpaqueCaptureAddress)(VkDevice device, const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo); +typedef void (VKAPI_PTR *PFN_vkCmdDrawIndirectCount)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride); +typedef void (VKAPI_PTR *PFN_vkCmdDrawIndexedIndirectCount)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride); +typedef VkResult (VKAPI_PTR *PFN_vkCreateRenderPass2)(VkDevice device, const VkRenderPassCreateInfo2* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass); +typedef void (VKAPI_PTR *PFN_vkCmdBeginRenderPass2)(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, const VkSubpassBeginInfo* pSubpassBeginInfo); +typedef void (VKAPI_PTR *PFN_vkCmdNextSubpass2)(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo* pSubpassBeginInfo, const VkSubpassEndInfo* pSubpassEndInfo); +typedef void (VKAPI_PTR *PFN_vkCmdEndRenderPass2)(VkCommandBuffer commandBuffer, const VkSubpassEndInfo* pSubpassEndInfo); #ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkResetQueryPool( + VkDevice device, + VkQueryPool queryPool, + uint32_t firstQuery, + uint32_t queryCount); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetSemaphoreCounterValue( + VkDevice device, + VkSemaphore semaphore, + uint64_t* pValue); + +VKAPI_ATTR VkResult VKAPI_CALL vkWaitSemaphores( + VkDevice device, + const VkSemaphoreWaitInfo* pWaitInfo, + uint64_t timeout); + +VKAPI_ATTR VkResult VKAPI_CALL vkSignalSemaphore( + VkDevice device, + const VkSemaphoreSignalInfo* pSignalInfo); + +VKAPI_ATTR VkDeviceAddress VKAPI_CALL vkGetBufferDeviceAddress( + VkDevice device, + const VkBufferDeviceAddressInfo* pInfo); + +VKAPI_ATTR uint64_t VKAPI_CALL vkGetBufferOpaqueCaptureAddress( + VkDevice device, + const VkBufferDeviceAddressInfo* pInfo); + +VKAPI_ATTR uint64_t VKAPI_CALL vkGetDeviceMemoryOpaqueCaptureAddress( + VkDevice device, + const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo); + VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirectCount( VkCommandBuffer commandBuffer, VkBuffer buffer, @@ -6687,38 +7091,6 @@ VKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass2( VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass2( VkCommandBuffer commandBuffer, const VkSubpassEndInfo* pSubpassEndInfo); - -VKAPI_ATTR void VKAPI_CALL vkResetQueryPool( - VkDevice device, - VkQueryPool queryPool, - uint32_t firstQuery, - uint32_t queryCount); - -VKAPI_ATTR VkResult VKAPI_CALL vkGetSemaphoreCounterValue( - VkDevice device, - VkSemaphore semaphore, - uint64_t* pValue); - -VKAPI_ATTR VkResult VKAPI_CALL vkWaitSemaphores( - VkDevice device, - const VkSemaphoreWaitInfo* pWaitInfo, - uint64_t timeout); - -VKAPI_ATTR VkResult VKAPI_CALL vkSignalSemaphore( - VkDevice device, - const VkSemaphoreSignalInfo* pSignalInfo); - -VKAPI_ATTR VkDeviceAddress VKAPI_CALL vkGetBufferDeviceAddress( - VkDevice device, - const VkBufferDeviceAddressInfo* pInfo); - -VKAPI_ATTR uint64_t VKAPI_CALL vkGetBufferOpaqueCaptureAddress( - VkDevice device, - const VkBufferDeviceAddressInfo* pInfo); - -VKAPI_ATTR uint64_t VKAPI_CALL vkGetDeviceMemoryOpaqueCaptureAddress( - VkDevice device, - const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo); #endif @@ -6730,17 +7102,6 @@ VKAPI_ATTR uint64_t VKAPI_CALL vkGetDeviceMemoryOpaqueCaptureAddress( typedef uint64_t VkFlags64; VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPrivateDataSlot) -typedef enum VkPipelineCreationFeedbackFlagBits { - VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT = 0x00000001, - VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT = 0x00000002, - VK_PIPELINE_CREATION_FEEDBACK_BASE_PIPELINE_ACCELERATION_BIT = 0x00000004, - VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT_EXT = VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT, - VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT_EXT = VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT, - VK_PIPELINE_CREATION_FEEDBACK_BASE_PIPELINE_ACCELERATION_BIT_EXT = VK_PIPELINE_CREATION_FEEDBACK_BASE_PIPELINE_ACCELERATION_BIT, - VK_PIPELINE_CREATION_FEEDBACK_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF -} VkPipelineCreationFeedbackFlagBits; -typedef VkFlags VkPipelineCreationFeedbackFlags; - typedef enum VkToolPurposeFlagBits { VK_TOOL_PURPOSE_VALIDATION_BIT = 0x00000001, VK_TOOL_PURPOSE_PROFILING_BIT = 0x00000002, @@ -6832,7 +7193,7 @@ static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_NV = 0 static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT = 0x00080000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT = 0x00100000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEI = 0x8000000000ULL; -// VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI is a deprecated alias +// VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI is a legacy alias static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI = 0x8000000000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI = 0x10000000000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR = 0x10000000ULL; @@ -6840,6 +7201,9 @@ static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_MICROMAP_BUILD_BIT_EXT static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_CLUSTER_CULLING_SHADER_BIT_HUAWEI = 0x20000000000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_OPTICAL_FLOW_BIT_NV = 0x20000000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_CONVERT_COOPERATIVE_VECTOR_MATRIX_BIT_NV = 0x100000000000ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_DATA_GRAPH_BIT_ARM = 0x40000000000ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_COPY_INDIRECT_BIT_KHR = 0x400000000000ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_MEMORY_DECOMPRESSION_BIT_EXT = 0x200000000000ULL; typedef VkFlags64 VkAccessFlags2; @@ -6868,8 +7232,12 @@ static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_STORAGE_READ_BIT = 0x200000000 static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT = 0x400000000ULL; static const VkAccessFlagBits2 VK_ACCESS_2_VIDEO_DECODE_READ_BIT_KHR = 0x800000000ULL; static const VkAccessFlagBits2 VK_ACCESS_2_VIDEO_DECODE_WRITE_BIT_KHR = 0x1000000000ULL; +static const VkAccessFlagBits2 VK_ACCESS_2_SAMPLER_HEAP_READ_BIT_EXT = 0x200000000000000ULL; +static const VkAccessFlagBits2 VK_ACCESS_2_RESOURCE_HEAP_READ_BIT_EXT = 0x400000000000000ULL; static const VkAccessFlagBits2 VK_ACCESS_2_VIDEO_ENCODE_READ_BIT_KHR = 0x2000000000ULL; static const VkAccessFlagBits2 VK_ACCESS_2_VIDEO_ENCODE_WRITE_BIT_KHR = 0x4000000000ULL; +static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_TILE_ATTACHMENT_READ_BIT_QCOM = 0x8000000000000ULL; +static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_TILE_ATTACHMENT_WRITE_BIT_QCOM = 0x10000000000000ULL; static const VkAccessFlagBits2 VK_ACCESS_2_NONE_KHR = 0ULL; static const VkAccessFlagBits2 VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT_KHR = 0x00000001ULL; static const VkAccessFlagBits2 VK_ACCESS_2_INDEX_READ_BIT_KHR = 0x00000002ULL; @@ -6914,6 +7282,10 @@ static const VkAccessFlagBits2 VK_ACCESS_2_MICROMAP_READ_BIT_EXT = 0x10000000000 static const VkAccessFlagBits2 VK_ACCESS_2_MICROMAP_WRITE_BIT_EXT = 0x200000000000ULL; static const VkAccessFlagBits2 VK_ACCESS_2_OPTICAL_FLOW_READ_BIT_NV = 0x40000000000ULL; static const VkAccessFlagBits2 VK_ACCESS_2_OPTICAL_FLOW_WRITE_BIT_NV = 0x80000000000ULL; +static const VkAccessFlagBits2 VK_ACCESS_2_DATA_GRAPH_READ_BIT_ARM = 0x800000000000ULL; +static const VkAccessFlagBits2 VK_ACCESS_2_DATA_GRAPH_WRITE_BIT_ARM = 0x1000000000000ULL; +static const VkAccessFlagBits2 VK_ACCESS_2_MEMORY_DECOMPRESSION_READ_BIT_EXT = 0x80000000000000ULL; +static const VkAccessFlagBits2 VK_ACCESS_2_MEMORY_DECOMPRESSION_WRITE_BIT_EXT = 0x100000000000000ULL; typedef enum VkSubmitFlagBits { @@ -6922,20 +7294,6 @@ typedef enum VkSubmitFlagBits { VK_SUBMIT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkSubmitFlagBits; typedef VkFlags VkSubmitFlags; - -typedef enum VkRenderingFlagBits { - VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT = 0x00000001, - VK_RENDERING_SUSPENDING_BIT = 0x00000002, - VK_RENDERING_RESUMING_BIT = 0x00000004, - VK_RENDERING_ENABLE_LEGACY_DITHERING_BIT_EXT = 0x00000008, - VK_RENDERING_CONTENTS_INLINE_BIT_KHR = 0x00000010, - VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT, - VK_RENDERING_SUSPENDING_BIT_KHR = VK_RENDERING_SUSPENDING_BIT, - VK_RENDERING_RESUMING_BIT_KHR = VK_RENDERING_RESUMING_BIT, - VK_RENDERING_CONTENTS_INLINE_BIT_EXT = VK_RENDERING_CONTENTS_INLINE_BIT_KHR, - VK_RENDERING_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF -} VkRenderingFlagBits; -typedef VkFlags VkRenderingFlags; typedef VkFlags64 VkFormatFeatureFlags2; // Flag bits for VkFormatFeatureFlagBits2 @@ -6976,6 +7334,7 @@ static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_FRAGMENT_SHADING_RATE_ static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_HOST_IMAGE_TRANSFER_BIT_EXT = 0x400000000000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_VIDEO_ENCODE_INPUT_BIT_KHR = 0x08000000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_VIDEO_ENCODE_DPB_BIT_KHR = 0x10000000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_BLOCK_MATCHING_SXD_BIT_QCOM = 0x100000000000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT_KHR = 0x00000001ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT_KHR = 0x00000002ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_IMAGE_ATOMIC_BIT_KHR = 0x00000004ULL; @@ -7009,12 +7368,53 @@ static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_WEIGHT_IMAGE_BIT_QCOM static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_WEIGHT_SAMPLED_IMAGE_BIT_QCOM = 0x800000000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM = 0x1000000000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_BOX_FILTER_SAMPLED_BIT_QCOM = 0x2000000000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_TENSOR_SHADER_BIT_ARM = 0x8000000000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_TENSOR_IMAGE_ALIASING_BIT_ARM = 0x80000000000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_OPTICAL_FLOW_IMAGE_BIT_NV = 0x10000000000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_OPTICAL_FLOW_VECTOR_BIT_NV = 0x20000000000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_OPTICAL_FLOW_COST_BIT_NV = 0x40000000000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_TENSOR_DATA_GRAPH_BIT_ARM = 0x1000000000000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_COPY_IMAGE_INDIRECT_DST_BIT_KHR = 0x800000000000000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR = 0x2000000000000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR = 0x4000000000000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_2D_BIT_IMG = 0x200000000000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_DEPTH_COPY_ON_COMPUTE_QUEUE_BIT_KHR = 0x10000000000000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_DEPTH_COPY_ON_TRANSFER_QUEUE_BIT_KHR = 0x20000000000000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STENCIL_COPY_ON_COMPUTE_QUEUE_BIT_KHR = 0x40000000000000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STENCIL_COPY_ON_TRANSFER_QUEUE_BIT_KHR = 0x80000000000000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_DATA_GRAPH_OPTICAL_FLOW_IMAGE_BIT_ARM = 0x100000000000000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_DATA_GRAPH_OPTICAL_FLOW_VECTOR_BIT_ARM = 0x200000000000000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_DATA_GRAPH_OPTICAL_FLOW_COST_BIT_ARM = 0x400000000000000ULL; + +typedef enum VkPipelineCreationFeedbackFlagBits { + VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT = 0x00000001, + VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT = 0x00000002, + VK_PIPELINE_CREATION_FEEDBACK_BASE_PIPELINE_ACCELERATION_BIT = 0x00000004, + VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT_EXT = VK_PIPELINE_CREATION_FEEDBACK_VALID_BIT, + VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT_EXT = VK_PIPELINE_CREATION_FEEDBACK_APPLICATION_PIPELINE_CACHE_HIT_BIT, + VK_PIPELINE_CREATION_FEEDBACK_BASE_PIPELINE_ACCELERATION_BIT_EXT = VK_PIPELINE_CREATION_FEEDBACK_BASE_PIPELINE_ACCELERATION_BIT, + VK_PIPELINE_CREATION_FEEDBACK_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkPipelineCreationFeedbackFlagBits; +typedef VkFlags VkPipelineCreationFeedbackFlags; + +typedef enum VkRenderingFlagBits { + VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT = 0x00000001, + VK_RENDERING_SUSPENDING_BIT = 0x00000002, + VK_RENDERING_RESUMING_BIT = 0x00000004, + VK_RENDERING_ENABLE_LEGACY_DITHERING_BIT_EXT = 0x00000008, + VK_RENDERING_CONTENTS_INLINE_BIT_KHR = 0x00000010, + VK_RENDERING_PER_LAYER_FRAGMENT_DENSITY_BIT_VALVE = 0x00000020, + VK_RENDERING_FRAGMENT_REGION_BIT_EXT = 0x00000040, + VK_RENDERING_CUSTOM_RESOLVE_BIT_EXT = 0x00000080, + VK_RENDERING_LOCAL_READ_CONCURRENT_ACCESS_CONTROL_BIT_KHR = 0x00000100, + VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT, + VK_RENDERING_SUSPENDING_BIT_KHR = VK_RENDERING_SUSPENDING_BIT, + VK_RENDERING_RESUMING_BIT_KHR = VK_RENDERING_RESUMING_BIT, + VK_RENDERING_CONTENTS_INLINE_BIT_EXT = VK_RENDERING_CONTENTS_INLINE_BIT_KHR, + VK_RENDERING_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkRenderingFlagBits; +typedef VkFlags VkRenderingFlags; typedef struct VkPhysicalDeviceVulkan13Features { VkStructureType sType; void* pNext; @@ -7085,25 +7485,6 @@ typedef struct VkPhysicalDeviceVulkan13Properties { VkDeviceSize maxBufferSize; } VkPhysicalDeviceVulkan13Properties; -typedef struct VkPipelineCreationFeedback { - VkPipelineCreationFeedbackFlags flags; - uint64_t duration; -} VkPipelineCreationFeedback; - -typedef struct VkPipelineCreationFeedbackCreateInfo { - VkStructureType sType; - const void* pNext; - VkPipelineCreationFeedback* pPipelineCreationFeedback; - uint32_t pipelineStageCreationFeedbackCount; - VkPipelineCreationFeedback* pPipelineStageCreationFeedbacks; -} VkPipelineCreationFeedbackCreateInfo; - -typedef struct VkPhysicalDeviceShaderTerminateInvocationFeatures { - VkStructureType sType; - void* pNext; - VkBool32 shaderTerminateInvocation; -} VkPhysicalDeviceShaderTerminateInvocationFeatures; - typedef struct VkPhysicalDeviceToolProperties { VkStructureType sType; void* pNext; @@ -7114,12 +7495,6 @@ typedef struct VkPhysicalDeviceToolProperties { char layer[VK_MAX_EXTENSION_NAME_SIZE]; } VkPhysicalDeviceToolProperties; -typedef struct VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures { - VkStructureType sType; - void* pNext; - VkBool32 shaderDemoteToHelperInvocation; -} VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures; - typedef struct VkPhysicalDevicePrivateDataFeatures { VkStructureType sType; void* pNext; @@ -7138,12 +7513,6 @@ typedef struct VkPrivateDataSlotCreateInfo { VkPrivateDataSlotCreateFlags flags; } VkPrivateDataSlotCreateInfo; -typedef struct VkPhysicalDevicePipelineCreationCacheControlFeatures { - VkStructureType sType; - void* pNext; - VkBool32 pipelineCreationCacheControl; -} VkPhysicalDevicePipelineCreationCacheControlFeatures; - typedef struct VkMemoryBarrier2 { VkStructureType sType; const void* pNext; @@ -7228,18 +7597,6 @@ typedef struct VkPhysicalDeviceSynchronization2Features { VkBool32 synchronization2; } VkPhysicalDeviceSynchronization2Features; -typedef struct VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures { - VkStructureType sType; - void* pNext; - VkBool32 shaderZeroInitializeWorkgroupMemory; -} VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures; - -typedef struct VkPhysicalDeviceImageRobustnessFeatures { - VkStructureType sType; - void* pNext; - VkBool32 robustImageAccess; -} VkPhysicalDeviceImageRobustnessFeatures; - typedef struct VkBufferCopy2 { VkStructureType sType; const void* pNext; @@ -7309,6 +7666,190 @@ typedef struct VkCopyImageToBufferInfo2 { const VkBufferImageCopy2* pRegions; } VkCopyImageToBufferInfo2; +typedef struct VkPhysicalDeviceTextureCompressionASTCHDRFeatures { + VkStructureType sType; + void* pNext; + VkBool32 textureCompressionASTC_HDR; +} VkPhysicalDeviceTextureCompressionASTCHDRFeatures; + +typedef struct VkFormatProperties3 { + VkStructureType sType; + void* pNext; + VkFormatFeatureFlags2 linearTilingFeatures; + VkFormatFeatureFlags2 optimalTilingFeatures; + VkFormatFeatureFlags2 bufferFeatures; +} VkFormatProperties3; + +typedef struct VkPhysicalDeviceMaintenance4Features { + VkStructureType sType; + void* pNext; + VkBool32 maintenance4; +} VkPhysicalDeviceMaintenance4Features; + +typedef struct VkPhysicalDeviceMaintenance4Properties { + VkStructureType sType; + void* pNext; + VkDeviceSize maxBufferSize; +} VkPhysicalDeviceMaintenance4Properties; + +typedef struct VkDeviceBufferMemoryRequirements { + VkStructureType sType; + const void* pNext; + const VkBufferCreateInfo* pCreateInfo; +} VkDeviceBufferMemoryRequirements; + +typedef struct VkDeviceImageMemoryRequirements { + VkStructureType sType; + const void* pNext; + const VkImageCreateInfo* pCreateInfo; + VkImageAspectFlagBits planeAspect; +} VkDeviceImageMemoryRequirements; + +typedef struct VkPipelineCreationFeedback { + VkPipelineCreationFeedbackFlags flags; + uint64_t duration; +} VkPipelineCreationFeedback; + +typedef struct VkPipelineCreationFeedbackCreateInfo { + VkStructureType sType; + const void* pNext; + VkPipelineCreationFeedback* pPipelineCreationFeedback; + uint32_t pipelineStageCreationFeedbackCount; + VkPipelineCreationFeedback* pPipelineStageCreationFeedbacks; +} VkPipelineCreationFeedbackCreateInfo; + +typedef struct VkPhysicalDeviceShaderTerminateInvocationFeatures { + VkStructureType sType; + void* pNext; + VkBool32 shaderTerminateInvocation; +} VkPhysicalDeviceShaderTerminateInvocationFeatures; + +typedef struct VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures { + VkStructureType sType; + void* pNext; + VkBool32 shaderDemoteToHelperInvocation; +} VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures; + +typedef struct VkPhysicalDevicePipelineCreationCacheControlFeatures { + VkStructureType sType; + void* pNext; + VkBool32 pipelineCreationCacheControl; +} VkPhysicalDevicePipelineCreationCacheControlFeatures; + +typedef struct VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures { + VkStructureType sType; + void* pNext; + VkBool32 shaderZeroInitializeWorkgroupMemory; +} VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeatures; + +typedef struct VkPhysicalDeviceImageRobustnessFeatures { + VkStructureType sType; + void* pNext; + VkBool32 robustImageAccess; +} VkPhysicalDeviceImageRobustnessFeatures; + +typedef struct VkPhysicalDeviceSubgroupSizeControlFeatures { + VkStructureType sType; + void* pNext; + VkBool32 subgroupSizeControl; + VkBool32 computeFullSubgroups; +} VkPhysicalDeviceSubgroupSizeControlFeatures; + +typedef struct VkPhysicalDeviceSubgroupSizeControlProperties { + VkStructureType sType; + void* pNext; + uint32_t minSubgroupSize; + uint32_t maxSubgroupSize; + uint32_t maxComputeWorkgroupSubgroups; + VkShaderStageFlags requiredSubgroupSizeStages; +} VkPhysicalDeviceSubgroupSizeControlProperties; + +typedef struct VkPipelineShaderStageRequiredSubgroupSizeCreateInfo { + VkStructureType sType; + const void* pNext; + uint32_t requiredSubgroupSize; +} VkPipelineShaderStageRequiredSubgroupSizeCreateInfo; + +typedef struct VkPhysicalDeviceInlineUniformBlockFeatures { + VkStructureType sType; + void* pNext; + VkBool32 inlineUniformBlock; + VkBool32 descriptorBindingInlineUniformBlockUpdateAfterBind; +} VkPhysicalDeviceInlineUniformBlockFeatures; + +typedef struct VkPhysicalDeviceInlineUniformBlockProperties { + VkStructureType sType; + void* pNext; + uint32_t maxInlineUniformBlockSize; + uint32_t maxPerStageDescriptorInlineUniformBlocks; + uint32_t maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks; + uint32_t maxDescriptorSetInlineUniformBlocks; + uint32_t maxDescriptorSetUpdateAfterBindInlineUniformBlocks; +} VkPhysicalDeviceInlineUniformBlockProperties; + +typedef struct VkWriteDescriptorSetInlineUniformBlock { + VkStructureType sType; + const void* pNext; + uint32_t dataSize; + const void* pData; +} VkWriteDescriptorSetInlineUniformBlock; + +typedef struct VkDescriptorPoolInlineUniformBlockCreateInfo { + VkStructureType sType; + const void* pNext; + uint32_t maxInlineUniformBlockBindings; +} VkDescriptorPoolInlineUniformBlockCreateInfo; + +typedef struct VkPhysicalDeviceShaderIntegerDotProductFeatures { + VkStructureType sType; + void* pNext; + VkBool32 shaderIntegerDotProduct; +} VkPhysicalDeviceShaderIntegerDotProductFeatures; + +typedef struct VkPhysicalDeviceShaderIntegerDotProductProperties { + VkStructureType sType; + void* pNext; + VkBool32 integerDotProduct8BitUnsignedAccelerated; + VkBool32 integerDotProduct8BitSignedAccelerated; + VkBool32 integerDotProduct8BitMixedSignednessAccelerated; + VkBool32 integerDotProduct4x8BitPackedUnsignedAccelerated; + VkBool32 integerDotProduct4x8BitPackedSignedAccelerated; + VkBool32 integerDotProduct4x8BitPackedMixedSignednessAccelerated; + VkBool32 integerDotProduct16BitUnsignedAccelerated; + VkBool32 integerDotProduct16BitSignedAccelerated; + VkBool32 integerDotProduct16BitMixedSignednessAccelerated; + VkBool32 integerDotProduct32BitUnsignedAccelerated; + VkBool32 integerDotProduct32BitSignedAccelerated; + VkBool32 integerDotProduct32BitMixedSignednessAccelerated; + VkBool32 integerDotProduct64BitUnsignedAccelerated; + VkBool32 integerDotProduct64BitSignedAccelerated; + VkBool32 integerDotProduct64BitMixedSignednessAccelerated; + VkBool32 integerDotProductAccumulatingSaturating8BitUnsignedAccelerated; + VkBool32 integerDotProductAccumulatingSaturating8BitSignedAccelerated; + VkBool32 integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated; + VkBool32 integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated; + VkBool32 integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated; + VkBool32 integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated; + VkBool32 integerDotProductAccumulatingSaturating16BitUnsignedAccelerated; + VkBool32 integerDotProductAccumulatingSaturating16BitSignedAccelerated; + VkBool32 integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated; + VkBool32 integerDotProductAccumulatingSaturating32BitUnsignedAccelerated; + VkBool32 integerDotProductAccumulatingSaturating32BitSignedAccelerated; + VkBool32 integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated; + VkBool32 integerDotProductAccumulatingSaturating64BitUnsignedAccelerated; + VkBool32 integerDotProductAccumulatingSaturating64BitSignedAccelerated; + VkBool32 integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated; +} VkPhysicalDeviceShaderIntegerDotProductProperties; + +typedef struct VkPhysicalDeviceTexelBufferAlignmentProperties { + VkStructureType sType; + void* pNext; + VkDeviceSize storageTexelBufferOffsetAlignmentBytes; + VkBool32 storageTexelBufferOffsetSingleTexelAlignment; + VkDeviceSize uniformTexelBufferOffsetAlignmentBytes; + VkBool32 uniformTexelBufferOffsetSingleTexelAlignment; +} VkPhysicalDeviceTexelBufferAlignmentProperties; + typedef struct VkImageBlit2 { VkStructureType sType; const void* pNext; @@ -7351,64 +7892,6 @@ typedef struct VkResolveImageInfo2 { const VkImageResolve2* pRegions; } VkResolveImageInfo2; -typedef struct VkPhysicalDeviceSubgroupSizeControlFeatures { - VkStructureType sType; - void* pNext; - VkBool32 subgroupSizeControl; - VkBool32 computeFullSubgroups; -} VkPhysicalDeviceSubgroupSizeControlFeatures; - -typedef struct VkPhysicalDeviceSubgroupSizeControlProperties { - VkStructureType sType; - void* pNext; - uint32_t minSubgroupSize; - uint32_t maxSubgroupSize; - uint32_t maxComputeWorkgroupSubgroups; - VkShaderStageFlags requiredSubgroupSizeStages; -} VkPhysicalDeviceSubgroupSizeControlProperties; - -typedef struct VkPipelineShaderStageRequiredSubgroupSizeCreateInfo { - VkStructureType sType; - void* pNext; - uint32_t requiredSubgroupSize; -} VkPipelineShaderStageRequiredSubgroupSizeCreateInfo; - -typedef struct VkPhysicalDeviceInlineUniformBlockFeatures { - VkStructureType sType; - void* pNext; - VkBool32 inlineUniformBlock; - VkBool32 descriptorBindingInlineUniformBlockUpdateAfterBind; -} VkPhysicalDeviceInlineUniformBlockFeatures; - -typedef struct VkPhysicalDeviceInlineUniformBlockProperties { - VkStructureType sType; - void* pNext; - uint32_t maxInlineUniformBlockSize; - uint32_t maxPerStageDescriptorInlineUniformBlocks; - uint32_t maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks; - uint32_t maxDescriptorSetInlineUniformBlocks; - uint32_t maxDescriptorSetUpdateAfterBindInlineUniformBlocks; -} VkPhysicalDeviceInlineUniformBlockProperties; - -typedef struct VkWriteDescriptorSetInlineUniformBlock { - VkStructureType sType; - const void* pNext; - uint32_t dataSize; - const void* pData; -} VkWriteDescriptorSetInlineUniformBlock; - -typedef struct VkDescriptorPoolInlineUniformBlockCreateInfo { - VkStructureType sType; - const void* pNext; - uint32_t maxInlineUniformBlockBindings; -} VkDescriptorPoolInlineUniformBlockCreateInfo; - -typedef struct VkPhysicalDeviceTextureCompressionASTCHDRFeatures { - VkStructureType sType; - void* pNext; - VkBool32 textureCompressionASTC_HDR; -} VkPhysicalDeviceTextureCompressionASTCHDRFeatures; - typedef struct VkRenderingAttachmentInfo { VkStructureType sType; const void* pNext; @@ -7463,104 +7946,24 @@ typedef struct VkCommandBufferInheritanceRenderingInfo { VkSampleCountFlagBits rasterizationSamples; } VkCommandBufferInheritanceRenderingInfo; -typedef struct VkPhysicalDeviceShaderIntegerDotProductFeatures { - VkStructureType sType; - void* pNext; - VkBool32 shaderIntegerDotProduct; -} VkPhysicalDeviceShaderIntegerDotProductFeatures; - -typedef struct VkPhysicalDeviceShaderIntegerDotProductProperties { - VkStructureType sType; - void* pNext; - VkBool32 integerDotProduct8BitUnsignedAccelerated; - VkBool32 integerDotProduct8BitSignedAccelerated; - VkBool32 integerDotProduct8BitMixedSignednessAccelerated; - VkBool32 integerDotProduct4x8BitPackedUnsignedAccelerated; - VkBool32 integerDotProduct4x8BitPackedSignedAccelerated; - VkBool32 integerDotProduct4x8BitPackedMixedSignednessAccelerated; - VkBool32 integerDotProduct16BitUnsignedAccelerated; - VkBool32 integerDotProduct16BitSignedAccelerated; - VkBool32 integerDotProduct16BitMixedSignednessAccelerated; - VkBool32 integerDotProduct32BitUnsignedAccelerated; - VkBool32 integerDotProduct32BitSignedAccelerated; - VkBool32 integerDotProduct32BitMixedSignednessAccelerated; - VkBool32 integerDotProduct64BitUnsignedAccelerated; - VkBool32 integerDotProduct64BitSignedAccelerated; - VkBool32 integerDotProduct64BitMixedSignednessAccelerated; - VkBool32 integerDotProductAccumulatingSaturating8BitUnsignedAccelerated; - VkBool32 integerDotProductAccumulatingSaturating8BitSignedAccelerated; - VkBool32 integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated; - VkBool32 integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated; - VkBool32 integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated; - VkBool32 integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated; - VkBool32 integerDotProductAccumulatingSaturating16BitUnsignedAccelerated; - VkBool32 integerDotProductAccumulatingSaturating16BitSignedAccelerated; - VkBool32 integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated; - VkBool32 integerDotProductAccumulatingSaturating32BitUnsignedAccelerated; - VkBool32 integerDotProductAccumulatingSaturating32BitSignedAccelerated; - VkBool32 integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated; - VkBool32 integerDotProductAccumulatingSaturating64BitUnsignedAccelerated; - VkBool32 integerDotProductAccumulatingSaturating64BitSignedAccelerated; - VkBool32 integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated; -} VkPhysicalDeviceShaderIntegerDotProductProperties; - -typedef struct VkPhysicalDeviceTexelBufferAlignmentProperties { - VkStructureType sType; - void* pNext; - VkDeviceSize storageTexelBufferOffsetAlignmentBytes; - VkBool32 storageTexelBufferOffsetSingleTexelAlignment; - VkDeviceSize uniformTexelBufferOffsetAlignmentBytes; - VkBool32 uniformTexelBufferOffsetSingleTexelAlignment; -} VkPhysicalDeviceTexelBufferAlignmentProperties; - -typedef struct VkFormatProperties3 { - VkStructureType sType; - void* pNext; - VkFormatFeatureFlags2 linearTilingFeatures; - VkFormatFeatureFlags2 optimalTilingFeatures; - VkFormatFeatureFlags2 bufferFeatures; -} VkFormatProperties3; - -typedef struct VkPhysicalDeviceMaintenance4Features { - VkStructureType sType; - void* pNext; - VkBool32 maintenance4; -} VkPhysicalDeviceMaintenance4Features; - -typedef struct VkPhysicalDeviceMaintenance4Properties { - VkStructureType sType; - void* pNext; - VkDeviceSize maxBufferSize; -} VkPhysicalDeviceMaintenance4Properties; - -typedef struct VkDeviceBufferMemoryRequirements { - VkStructureType sType; - const void* pNext; - const VkBufferCreateInfo* pCreateInfo; -} VkDeviceBufferMemoryRequirements; - -typedef struct VkDeviceImageMemoryRequirements { - VkStructureType sType; - const void* pNext; - const VkImageCreateInfo* pCreateInfo; - VkImageAspectFlagBits planeAspect; -} VkDeviceImageMemoryRequirements; - typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceToolProperties)(VkPhysicalDevice physicalDevice, uint32_t* pToolCount, VkPhysicalDeviceToolProperties* pToolProperties); typedef VkResult (VKAPI_PTR *PFN_vkCreatePrivateDataSlot)(VkDevice device, const VkPrivateDataSlotCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPrivateDataSlot* pPrivateDataSlot); typedef void (VKAPI_PTR *PFN_vkDestroyPrivateDataSlot)(VkDevice device, VkPrivateDataSlot privateDataSlot, const VkAllocationCallbacks* pAllocator); typedef VkResult (VKAPI_PTR *PFN_vkSetPrivateData)(VkDevice device, VkObjectType objectType, uint64_t objectHandle, VkPrivateDataSlot privateDataSlot, uint64_t data); typedef void (VKAPI_PTR *PFN_vkGetPrivateData)(VkDevice device, VkObjectType objectType, uint64_t objectHandle, VkPrivateDataSlot privateDataSlot, uint64_t* pData); -typedef void (VKAPI_PTR *PFN_vkCmdSetEvent2)(VkCommandBuffer commandBuffer, VkEvent event, const VkDependencyInfo* pDependencyInfo); -typedef void (VKAPI_PTR *PFN_vkCmdResetEvent2)(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags2 stageMask); -typedef void (VKAPI_PTR *PFN_vkCmdWaitEvents2)(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent* pEvents, const VkDependencyInfo* pDependencyInfos); typedef void (VKAPI_PTR *PFN_vkCmdPipelineBarrier2)(VkCommandBuffer commandBuffer, const VkDependencyInfo* pDependencyInfo); typedef void (VKAPI_PTR *PFN_vkCmdWriteTimestamp2)(VkCommandBuffer commandBuffer, VkPipelineStageFlags2 stage, VkQueryPool queryPool, uint32_t query); -typedef VkResult (VKAPI_PTR *PFN_vkQueueSubmit2)(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2* pSubmits, VkFence fence); +typedef VkResult (VKAPI_PTR *PFN_vkQueueSubmit2)(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2* pSubmits, VkFence fence); typedef void (VKAPI_PTR *PFN_vkCmdCopyBuffer2)(VkCommandBuffer commandBuffer, const VkCopyBufferInfo2* pCopyBufferInfo); typedef void (VKAPI_PTR *PFN_vkCmdCopyImage2)(VkCommandBuffer commandBuffer, const VkCopyImageInfo2* pCopyImageInfo); typedef void (VKAPI_PTR *PFN_vkCmdCopyBufferToImage2)(VkCommandBuffer commandBuffer, const VkCopyBufferToImageInfo2* pCopyBufferToImageInfo); typedef void (VKAPI_PTR *PFN_vkCmdCopyImageToBuffer2)(VkCommandBuffer commandBuffer, const VkCopyImageToBufferInfo2* pCopyImageToBufferInfo); +typedef void (VKAPI_PTR *PFN_vkGetDeviceBufferMemoryRequirements)(VkDevice device, const VkDeviceBufferMemoryRequirements* pInfo, VkMemoryRequirements2* pMemoryRequirements); +typedef void (VKAPI_PTR *PFN_vkGetDeviceImageMemoryRequirements)(VkDevice device, const VkDeviceImageMemoryRequirements* pInfo, VkMemoryRequirements2* pMemoryRequirements); +typedef void (VKAPI_PTR *PFN_vkGetDeviceImageSparseMemoryRequirements)(VkDevice device, const VkDeviceImageMemoryRequirements* pInfo, uint32_t* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements2* pSparseMemoryRequirements); +typedef void (VKAPI_PTR *PFN_vkCmdSetEvent2)(VkCommandBuffer commandBuffer, VkEvent event, const VkDependencyInfo* pDependencyInfo); +typedef void (VKAPI_PTR *PFN_vkCmdResetEvent2)(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags2 stageMask); +typedef void (VKAPI_PTR *PFN_vkCmdWaitEvents2)(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent* pEvents, const VkDependencyInfo* pDependencyInfos); typedef void (VKAPI_PTR *PFN_vkCmdBlitImage2)(VkCommandBuffer commandBuffer, const VkBlitImageInfo2* pBlitImageInfo); typedef void (VKAPI_PTR *PFN_vkCmdResolveImage2)(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo); typedef void (VKAPI_PTR *PFN_vkCmdBeginRendering)(VkCommandBuffer commandBuffer, const VkRenderingInfo* pRenderingInfo); @@ -7580,9 +7983,6 @@ typedef void (VKAPI_PTR *PFN_vkCmdSetStencilOp)(VkCommandBuffer commandBuffer, V typedef void (VKAPI_PTR *PFN_vkCmdSetRasterizerDiscardEnable)(VkCommandBuffer commandBuffer, VkBool32 rasterizerDiscardEnable); typedef void (VKAPI_PTR *PFN_vkCmdSetDepthBiasEnable)(VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable); typedef void (VKAPI_PTR *PFN_vkCmdSetPrimitiveRestartEnable)(VkCommandBuffer commandBuffer, VkBool32 primitiveRestartEnable); -typedef void (VKAPI_PTR *PFN_vkGetDeviceBufferMemoryRequirements)(VkDevice device, const VkDeviceBufferMemoryRequirements* pInfo, VkMemoryRequirements2* pMemoryRequirements); -typedef void (VKAPI_PTR *PFN_vkGetDeviceImageMemoryRequirements)(VkDevice device, const VkDeviceImageMemoryRequirements* pInfo, VkMemoryRequirements2* pMemoryRequirements); -typedef void (VKAPI_PTR *PFN_vkGetDeviceImageSparseMemoryRequirements)(VkDevice device, const VkDeviceImageMemoryRequirements* pInfo, uint32_t* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements2* pSparseMemoryRequirements); #ifndef VK_NO_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceToolProperties( @@ -7615,22 +8015,6 @@ VKAPI_ATTR void VKAPI_CALL vkGetPrivateData( VkPrivateDataSlot privateDataSlot, uint64_t* pData); -VKAPI_ATTR void VKAPI_CALL vkCmdSetEvent2( - VkCommandBuffer commandBuffer, - VkEvent event, - const VkDependencyInfo* pDependencyInfo); - -VKAPI_ATTR void VKAPI_CALL vkCmdResetEvent2( - VkCommandBuffer commandBuffer, - VkEvent event, - VkPipelineStageFlags2 stageMask); - -VKAPI_ATTR void VKAPI_CALL vkCmdWaitEvents2( - VkCommandBuffer commandBuffer, - uint32_t eventCount, - const VkEvent* pEvents, - const VkDependencyInfo* pDependencyInfos); - VKAPI_ATTR void VKAPI_CALL vkCmdPipelineBarrier2( VkCommandBuffer commandBuffer, const VkDependencyInfo* pDependencyInfo); @@ -7663,6 +8047,38 @@ VKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer2( VkCommandBuffer commandBuffer, const VkCopyImageToBufferInfo2* pCopyImageToBufferInfo); +VKAPI_ATTR void VKAPI_CALL vkGetDeviceBufferMemoryRequirements( + VkDevice device, + const VkDeviceBufferMemoryRequirements* pInfo, + VkMemoryRequirements2* pMemoryRequirements); + +VKAPI_ATTR void VKAPI_CALL vkGetDeviceImageMemoryRequirements( + VkDevice device, + const VkDeviceImageMemoryRequirements* pInfo, + VkMemoryRequirements2* pMemoryRequirements); + +VKAPI_ATTR void VKAPI_CALL vkGetDeviceImageSparseMemoryRequirements( + VkDevice device, + const VkDeviceImageMemoryRequirements* pInfo, + uint32_t* pSparseMemoryRequirementCount, + VkSparseImageMemoryRequirements2* pSparseMemoryRequirements); + +VKAPI_ATTR void VKAPI_CALL vkCmdSetEvent2( + VkCommandBuffer commandBuffer, + VkEvent event, + const VkDependencyInfo* pDependencyInfo); + +VKAPI_ATTR void VKAPI_CALL vkCmdResetEvent2( + VkCommandBuffer commandBuffer, + VkEvent event, + VkPipelineStageFlags2 stageMask); + +VKAPI_ATTR void VKAPI_CALL vkCmdWaitEvents2( + VkCommandBuffer commandBuffer, + uint32_t eventCount, + const VkEvent* pEvents, + const VkDependencyInfo* pDependencyInfos); + VKAPI_ATTR void VKAPI_CALL vkCmdBlitImage2( VkCommandBuffer commandBuffer, const VkBlitImageInfo2* pBlitImageInfo); @@ -7748,22 +8164,6 @@ VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBiasEnable( VKAPI_ATTR void VKAPI_CALL vkCmdSetPrimitiveRestartEnable( VkCommandBuffer commandBuffer, VkBool32 primitiveRestartEnable); - -VKAPI_ATTR void VKAPI_CALL vkGetDeviceBufferMemoryRequirements( - VkDevice device, - const VkDeviceBufferMemoryRequirements* pInfo, - VkMemoryRequirements2* pMemoryRequirements); - -VKAPI_ATTR void VKAPI_CALL vkGetDeviceImageMemoryRequirements( - VkDevice device, - const VkDeviceImageMemoryRequirements* pInfo, - VkMemoryRequirements2* pMemoryRequirements); - -VKAPI_ATTR void VKAPI_CALL vkGetDeviceImageSparseMemoryRequirements( - VkDevice device, - const VkDeviceImageMemoryRequirements* pInfo, - uint32_t* pSparseMemoryRequirementCount, - VkSparseImageMemoryRequirements2* pSparseMemoryRequirements); #endif @@ -7835,6 +8235,69 @@ typedef enum VkMemoryUnmapFlagBits { VK_MEMORY_UNMAP_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkMemoryUnmapFlagBits; typedef VkFlags VkMemoryUnmapFlags; +typedef VkFlags64 VkBufferUsageFlags2; + +// Flag bits for VkBufferUsageFlagBits2 +typedef VkFlags64 VkBufferUsageFlagBits2; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFER_SRC_BIT = 0x00000001ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFER_DST_BIT = 0x00000002ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_UNIFORM_TEXEL_BUFFER_BIT = 0x00000004ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_STORAGE_TEXEL_BUFFER_BIT = 0x00000008ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_UNIFORM_BUFFER_BIT = 0x00000010ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_STORAGE_BUFFER_BIT = 0x00000020ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_INDEX_BUFFER_BIT = 0x00000040ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VERTEX_BUFFER_BIT = 0x00000080ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_INDIRECT_BUFFER_BIT = 0x00000100ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_SHADER_DEVICE_ADDRESS_BIT = 0x00020000ULL; +#ifdef VK_ENABLE_BETA_EXTENSIONS +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_EXECUTION_GRAPH_SCRATCH_BIT_AMDX = 0x02000000ULL; +#endif +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_DESCRIPTOR_HEAP_BIT_EXT = 0x10000000ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_MICROMAP_BUILD_INPUT_READ_ONLY_BIT_EXT = 0x00800000ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_MICROMAP_STORAGE_BIT_EXT = 0x01000000ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFER_SRC_BIT_KHR = 0x00000001ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFER_DST_BIT_KHR = 0x00000002ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_UNIFORM_TEXEL_BUFFER_BIT_KHR = 0x00000004ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_STORAGE_TEXEL_BUFFER_BIT_KHR = 0x00000008ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_UNIFORM_BUFFER_BIT_KHR = 0x00000010ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_STORAGE_BUFFER_BIT_KHR = 0x00000020ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_INDEX_BUFFER_BIT_KHR = 0x00000040ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VERTEX_BUFFER_BIT_KHR = 0x00000080ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_INDIRECT_BUFFER_BIT_KHR = 0x00000100ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_CONDITIONAL_RENDERING_BIT_EXT = 0x00000200ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_SHADER_BINDING_TABLE_BIT_KHR = 0x00000400ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_RAY_TRACING_BIT_NV = 0x00000400ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT = 0x00000800ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT = 0x00001000ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VIDEO_DECODE_SRC_BIT_KHR = 0x00002000ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VIDEO_DECODE_DST_BIT_KHR = 0x00004000ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VIDEO_ENCODE_DST_BIT_KHR = 0x00008000ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VIDEO_ENCODE_SRC_BIT_KHR = 0x00010000ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_SHADER_DEVICE_ADDRESS_BIT_KHR = 0x00020000ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR = 0x00080000ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR = 0x00100000ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT = 0x00200000ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT = 0x00400000ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER_BIT_EXT = 0x04000000ULL; +#ifdef VK_ENABLE_BETA_EXTENSIONS +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_COMPRESSED_DATA_DGF1_BIT_AMDX = 0x200000000ULL; +#endif +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_DATA_GRAPH_FOREIGN_DESCRIPTOR_BIT_ARM = 0x20000000ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TILE_MEMORY_BIT_QCOM = 0x08000000ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_MEMORY_DECOMPRESSION_BIT_EXT = 0x100000000ULL; +static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_PREPROCESS_BUFFER_BIT_EXT = 0x80000000ULL; + + +typedef enum VkHostImageCopyFlagBits { + VK_HOST_IMAGE_COPY_MEMCPY_BIT = 0x00000001, + // VK_HOST_IMAGE_COPY_MEMCPY is a legacy alias + VK_HOST_IMAGE_COPY_MEMCPY = VK_HOST_IMAGE_COPY_MEMCPY_BIT, + VK_HOST_IMAGE_COPY_MEMCPY_BIT_EXT = VK_HOST_IMAGE_COPY_MEMCPY_BIT, + // VK_HOST_IMAGE_COPY_MEMCPY_EXT is a legacy alias + VK_HOST_IMAGE_COPY_MEMCPY_EXT = VK_HOST_IMAGE_COPY_MEMCPY_BIT, + VK_HOST_IMAGE_COPY_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkHostImageCopyFlagBits; +typedef VkFlags VkHostImageCopyFlags; typedef VkFlags64 VkPipelineCreateFlags2; // Flag bits for VkPipelineCreateFlagBits2 @@ -7851,7 +8314,9 @@ static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_PROTECTED_ACCESS_ONL #ifdef VK_ENABLE_BETA_EXTENSIONS static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_EXECUTION_GRAPH_BIT_AMDX = 0x100000000ULL; #endif +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DESCRIPTOR_HEAP_BIT_EXT = 0x1000000000ULL; static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_SKIP_BUILT_IN_PRIMITIVES_BIT_KHR = 0x00001000ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_OPACITY_MICROMAP_BIT_EXT = 0x01000000ULL; static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_ALLOW_SPHERES_AND_LINEAR_SWEPT_SPHERES_BIT_NV = 0x200000000ULL; static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_ENABLE_LEGACY_DITHERING_BIT_EXT = 0x400000000ULL; static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DISABLE_OPTIMIZATION_BIT_KHR = 0x00000001ULL; @@ -7878,69 +8343,23 @@ static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_INDIRECT_BINDABLE_BI static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_ALLOW_MOTION_BIT_NV = 0x00100000ULL; static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x00200000ULL; static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT = 0x00400000ULL; -static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_OPACITY_MICROMAP_BIT_EXT = 0x01000000ULL; static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_COLOR_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT = 0x02000000ULL; static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT = 0x04000000ULL; static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_NO_PROTECTED_ACCESS_BIT_EXT = 0x08000000ULL; static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_PROTECTED_ACCESS_ONLY_BIT_EXT = 0x40000000ULL; +#ifdef VK_ENABLE_BETA_EXTENSIONS static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_DISPLACEMENT_MICROMAP_BIT_NV = 0x10000000ULL; +#endif static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DESCRIPTOR_BUFFER_BIT_EXT = 0x20000000ULL; static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DISALLOW_OPACITY_MICROMAP_BIT_ARM = 0x2000000000ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_INSTRUMENT_SHADERS_BIT_ARM = 0x8000000000ULL; static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_CAPTURE_DATA_BIT_KHR = 0x80000000ULL; static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_INDIRECT_BINDABLE_BIT_EXT = 0x4000000000ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_PER_LAYER_FRAGMENT_DENSITY_BIT_VALVE = 0x10000000000ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_OPACITY_MICROMAP_BIT_KHR = 0x01000000ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_OPACITY_MICROMAP_DISALLOW_MIXED_SPECIAL_INDEX_BIT_KHR = 0x20000000000ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_64_BIT_INDEXING_BIT_EXT = 0x80000000000ULL; -typedef VkFlags64 VkBufferUsageFlags2; - -// Flag bits for VkBufferUsageFlagBits2 -typedef VkFlags64 VkBufferUsageFlagBits2; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFER_SRC_BIT = 0x00000001ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFER_DST_BIT = 0x00000002ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_UNIFORM_TEXEL_BUFFER_BIT = 0x00000004ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_STORAGE_TEXEL_BUFFER_BIT = 0x00000008ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_UNIFORM_BUFFER_BIT = 0x00000010ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_STORAGE_BUFFER_BIT = 0x00000020ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_INDEX_BUFFER_BIT = 0x00000040ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VERTEX_BUFFER_BIT = 0x00000080ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_INDIRECT_BUFFER_BIT = 0x00000100ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_SHADER_DEVICE_ADDRESS_BIT = 0x00020000ULL; -#ifdef VK_ENABLE_BETA_EXTENSIONS -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_EXECUTION_GRAPH_SCRATCH_BIT_AMDX = 0x02000000ULL; -#endif -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFER_SRC_BIT_KHR = 0x00000001ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFER_DST_BIT_KHR = 0x00000002ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_UNIFORM_TEXEL_BUFFER_BIT_KHR = 0x00000004ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_STORAGE_TEXEL_BUFFER_BIT_KHR = 0x00000008ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_UNIFORM_BUFFER_BIT_KHR = 0x00000010ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_STORAGE_BUFFER_BIT_KHR = 0x00000020ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_INDEX_BUFFER_BIT_KHR = 0x00000040ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VERTEX_BUFFER_BIT_KHR = 0x00000080ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_INDIRECT_BUFFER_BIT_KHR = 0x00000100ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_CONDITIONAL_RENDERING_BIT_EXT = 0x00000200ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_SHADER_BINDING_TABLE_BIT_KHR = 0x00000400ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_RAY_TRACING_BIT_NV = 0x00000400ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT = 0x00000800ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT = 0x00001000ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VIDEO_DECODE_SRC_BIT_KHR = 0x00002000ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VIDEO_DECODE_DST_BIT_KHR = 0x00004000ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VIDEO_ENCODE_DST_BIT_KHR = 0x00008000ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_VIDEO_ENCODE_SRC_BIT_KHR = 0x00010000ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_SHADER_DEVICE_ADDRESS_BIT_KHR = 0x00020000ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR = 0x00080000ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR = 0x00100000ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT = 0x00200000ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT = 0x00400000ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER_BIT_EXT = 0x04000000ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_MICROMAP_BUILD_INPUT_READ_ONLY_BIT_EXT = 0x00800000ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_MICROMAP_STORAGE_BIT_EXT = 0x01000000ULL; -static const VkBufferUsageFlagBits2 VK_BUFFER_USAGE_2_PREPROCESS_BUFFER_BIT_EXT = 0x80000000ULL; - - -typedef enum VkHostImageCopyFlagBits { - VK_HOST_IMAGE_COPY_MEMCPY = 0x00000001, - VK_HOST_IMAGE_COPY_MEMCPY_EXT = VK_HOST_IMAGE_COPY_MEMCPY, - VK_HOST_IMAGE_COPY_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF -} VkHostImageCopyFlagBits; -typedef VkFlags VkHostImageCopyFlags; typedef struct VkPhysicalDeviceVulkan14Features { VkStructureType sType; void* pNext; @@ -8016,77 +8435,6 @@ typedef struct VkQueueFamilyGlobalPriorityProperties { VkQueueGlobalPriority priorities[VK_MAX_GLOBAL_PRIORITY_SIZE]; } VkQueueFamilyGlobalPriorityProperties; -typedef struct VkPhysicalDeviceShaderSubgroupRotateFeatures { - VkStructureType sType; - void* pNext; - VkBool32 shaderSubgroupRotate; - VkBool32 shaderSubgroupRotateClustered; -} VkPhysicalDeviceShaderSubgroupRotateFeatures; - -typedef struct VkPhysicalDeviceShaderFloatControls2Features { - VkStructureType sType; - void* pNext; - VkBool32 shaderFloatControls2; -} VkPhysicalDeviceShaderFloatControls2Features; - -typedef struct VkPhysicalDeviceShaderExpectAssumeFeatures { - VkStructureType sType; - void* pNext; - VkBool32 shaderExpectAssume; -} VkPhysicalDeviceShaderExpectAssumeFeatures; - -typedef struct VkPhysicalDeviceLineRasterizationFeatures { - VkStructureType sType; - void* pNext; - VkBool32 rectangularLines; - VkBool32 bresenhamLines; - VkBool32 smoothLines; - VkBool32 stippledRectangularLines; - VkBool32 stippledBresenhamLines; - VkBool32 stippledSmoothLines; -} VkPhysicalDeviceLineRasterizationFeatures; - -typedef struct VkPhysicalDeviceLineRasterizationProperties { - VkStructureType sType; - void* pNext; - uint32_t lineSubPixelPrecisionBits; -} VkPhysicalDeviceLineRasterizationProperties; - -typedef struct VkPipelineRasterizationLineStateCreateInfo { - VkStructureType sType; - const void* pNext; - VkLineRasterizationMode lineRasterizationMode; - VkBool32 stippledLineEnable; - uint32_t lineStippleFactor; - uint16_t lineStipplePattern; -} VkPipelineRasterizationLineStateCreateInfo; - -typedef struct VkPhysicalDeviceVertexAttributeDivisorProperties { - VkStructureType sType; - void* pNext; - uint32_t maxVertexAttribDivisor; - VkBool32 supportsNonZeroFirstInstance; -} VkPhysicalDeviceVertexAttributeDivisorProperties; - -typedef struct VkVertexInputBindingDivisorDescription { - uint32_t binding; - uint32_t divisor; -} VkVertexInputBindingDivisorDescription; - -typedef struct VkPipelineVertexInputDivisorStateCreateInfo { - VkStructureType sType; - const void* pNext; - uint32_t vertexBindingDivisorCount; - const VkVertexInputBindingDivisorDescription* pVertexBindingDivisors; -} VkPipelineVertexInputDivisorStateCreateInfo; - -typedef struct VkPhysicalDeviceVertexAttributeDivisorFeatures { - VkStructureType sType; - void* pNext; - VkBool32 vertexAttributeInstanceRateDivisor; - VkBool32 vertexAttributeInstanceRateZeroDivisor; -} VkPhysicalDeviceVertexAttributeDivisorFeatures; - typedef struct VkPhysicalDeviceIndexTypeUint8Features { VkStructureType sType; void* pNext; @@ -8126,15 +8474,11 @@ typedef struct VkPhysicalDeviceMaintenance5Properties { VkBool32 nonStrictWideLinesUseParallelogram; } VkPhysicalDeviceMaintenance5Properties; -typedef struct VkRenderingAreaInfo { - VkStructureType sType; - const void* pNext; - uint32_t viewMask; - uint32_t colorAttachmentCount; - const VkFormat* pColorAttachmentFormats; - VkFormat depthAttachmentFormat; - VkFormat stencilAttachmentFormat; -} VkRenderingAreaInfo; +typedef struct VkSubresourceLayout2 { + VkStructureType sType; + void* pNext; + VkSubresourceLayout subresourceLayout; +} VkSubresourceLayout2; typedef struct VkImageSubresource2 { VkStructureType sType; @@ -8149,52 +8493,12 @@ typedef struct VkDeviceImageSubresourceInfo { const VkImageSubresource2* pSubresource; } VkDeviceImageSubresourceInfo; -typedef struct VkSubresourceLayout2 { - VkStructureType sType; - void* pNext; - VkSubresourceLayout subresourceLayout; -} VkSubresourceLayout2; - -typedef struct VkPipelineCreateFlags2CreateInfo { - VkStructureType sType; - const void* pNext; - VkPipelineCreateFlags2 flags; -} VkPipelineCreateFlags2CreateInfo; - typedef struct VkBufferUsageFlags2CreateInfo { VkStructureType sType; const void* pNext; VkBufferUsageFlags2 usage; } VkBufferUsageFlags2CreateInfo; -typedef struct VkPhysicalDevicePushDescriptorProperties { - VkStructureType sType; - void* pNext; - uint32_t maxPushDescriptors; -} VkPhysicalDevicePushDescriptorProperties; - -typedef struct VkPhysicalDeviceDynamicRenderingLocalReadFeatures { - VkStructureType sType; - void* pNext; - VkBool32 dynamicRenderingLocalRead; -} VkPhysicalDeviceDynamicRenderingLocalReadFeatures; - -typedef struct VkRenderingAttachmentLocationInfo { - VkStructureType sType; - const void* pNext; - uint32_t colorAttachmentCount; - const uint32_t* pColorAttachmentLocations; -} VkRenderingAttachmentLocationInfo; - -typedef struct VkRenderingInputAttachmentIndexInfo { - VkStructureType sType; - const void* pNext; - uint32_t colorAttachmentCount; - const uint32_t* pColorAttachmentInputIndices; - const uint32_t* pDepthInputAttachmentIndex; - const uint32_t* pStencilInputAttachmentIndex; -} VkRenderingInputAttachmentIndexInfo; - typedef struct VkPhysicalDeviceMaintenance6Features { VkStructureType sType; void* pNext; @@ -8215,77 +8519,6 @@ typedef struct VkBindMemoryStatus { VkResult* pResult; } VkBindMemoryStatus; -typedef struct VkBindDescriptorSetsInfo { - VkStructureType sType; - const void* pNext; - VkShaderStageFlags stageFlags; - VkPipelineLayout layout; - uint32_t firstSet; - uint32_t descriptorSetCount; - const VkDescriptorSet* pDescriptorSets; - uint32_t dynamicOffsetCount; - const uint32_t* pDynamicOffsets; -} VkBindDescriptorSetsInfo; - -typedef struct VkPushConstantsInfo { - VkStructureType sType; - const void* pNext; - VkPipelineLayout layout; - VkShaderStageFlags stageFlags; - uint32_t offset; - uint32_t size; - const void* pValues; -} VkPushConstantsInfo; - -typedef struct VkPushDescriptorSetInfo { - VkStructureType sType; - const void* pNext; - VkShaderStageFlags stageFlags; - VkPipelineLayout layout; - uint32_t set; - uint32_t descriptorWriteCount; - const VkWriteDescriptorSet* pDescriptorWrites; -} VkPushDescriptorSetInfo; - -typedef struct VkPushDescriptorSetWithTemplateInfo { - VkStructureType sType; - const void* pNext; - VkDescriptorUpdateTemplate descriptorUpdateTemplate; - VkPipelineLayout layout; - uint32_t set; - const void* pData; -} VkPushDescriptorSetWithTemplateInfo; - -typedef struct VkPhysicalDevicePipelineProtectedAccessFeatures { - VkStructureType sType; - void* pNext; - VkBool32 pipelineProtectedAccess; -} VkPhysicalDevicePipelineProtectedAccessFeatures; - -typedef struct VkPhysicalDevicePipelineRobustnessFeatures { - VkStructureType sType; - void* pNext; - VkBool32 pipelineRobustness; -} VkPhysicalDevicePipelineRobustnessFeatures; - -typedef struct VkPhysicalDevicePipelineRobustnessProperties { - VkStructureType sType; - void* pNext; - VkPipelineRobustnessBufferBehavior defaultRobustnessStorageBuffers; - VkPipelineRobustnessBufferBehavior defaultRobustnessUniformBuffers; - VkPipelineRobustnessBufferBehavior defaultRobustnessVertexInputs; - VkPipelineRobustnessImageBehavior defaultRobustnessImages; -} VkPhysicalDevicePipelineRobustnessProperties; - -typedef struct VkPipelineRobustnessCreateInfo { - VkStructureType sType; - const void* pNext; - VkPipelineRobustnessBufferBehavior storageBuffers; - VkPipelineRobustnessBufferBehavior uniformBuffers; - VkPipelineRobustnessBufferBehavior vertexInputs; - VkPipelineRobustnessImageBehavior images; -} VkPipelineRobustnessCreateInfo; - typedef struct VkPhysicalDeviceHostImageCopyFeatures { VkStructureType sType; void* pNext; @@ -8379,32 +8612,213 @@ typedef struct VkHostImageCopyDevicePerformanceQuery { VkBool32 identicalMemoryLayout; } VkHostImageCopyDevicePerformanceQuery; -typedef void (VKAPI_PTR *PFN_vkCmdSetLineStipple)(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor, uint16_t lineStipplePattern); +typedef struct VkPhysicalDeviceShaderSubgroupRotateFeatures { + VkStructureType sType; + void* pNext; + VkBool32 shaderSubgroupRotate; + VkBool32 shaderSubgroupRotateClustered; +} VkPhysicalDeviceShaderSubgroupRotateFeatures; + +typedef struct VkPhysicalDeviceShaderFloatControls2Features { + VkStructureType sType; + void* pNext; + VkBool32 shaderFloatControls2; +} VkPhysicalDeviceShaderFloatControls2Features; + +typedef struct VkPhysicalDeviceShaderExpectAssumeFeatures { + VkStructureType sType; + void* pNext; + VkBool32 shaderExpectAssume; +} VkPhysicalDeviceShaderExpectAssumeFeatures; + +typedef struct VkPipelineCreateFlags2CreateInfo { + VkStructureType sType; + const void* pNext; + VkPipelineCreateFlags2 flags; +} VkPipelineCreateFlags2CreateInfo; + +typedef struct VkPhysicalDevicePushDescriptorProperties { + VkStructureType sType; + void* pNext; + uint32_t maxPushDescriptors; +} VkPhysicalDevicePushDescriptorProperties; + +typedef struct VkBindDescriptorSetsInfo { + VkStructureType sType; + const void* pNext; + VkShaderStageFlags stageFlags; + VkPipelineLayout layout; + uint32_t firstSet; + uint32_t descriptorSetCount; + const VkDescriptorSet* pDescriptorSets; + uint32_t dynamicOffsetCount; + const uint32_t* pDynamicOffsets; +} VkBindDescriptorSetsInfo; + +typedef struct VkPushConstantsInfo { + VkStructureType sType; + const void* pNext; + VkPipelineLayout layout; + VkShaderStageFlags stageFlags; + uint32_t offset; + uint32_t size; + const void* pValues; +} VkPushConstantsInfo; + +typedef struct VkPushDescriptorSetInfo { + VkStructureType sType; + const void* pNext; + VkShaderStageFlags stageFlags; + VkPipelineLayout layout; + uint32_t set; + uint32_t descriptorWriteCount; + const VkWriteDescriptorSet* pDescriptorWrites; +} VkPushDescriptorSetInfo; + +typedef struct VkPushDescriptorSetWithTemplateInfo { + VkStructureType sType; + const void* pNext; + VkDescriptorUpdateTemplate descriptorUpdateTemplate; + VkPipelineLayout layout; + uint32_t set; + const void* pData; +} VkPushDescriptorSetWithTemplateInfo; + +typedef struct VkPhysicalDevicePipelineProtectedAccessFeatures { + VkStructureType sType; + void* pNext; + VkBool32 pipelineProtectedAccess; +} VkPhysicalDevicePipelineProtectedAccessFeatures; + +typedef struct VkPhysicalDevicePipelineRobustnessFeatures { + VkStructureType sType; + void* pNext; + VkBool32 pipelineRobustness; +} VkPhysicalDevicePipelineRobustnessFeatures; + +typedef struct VkPhysicalDevicePipelineRobustnessProperties { + VkStructureType sType; + void* pNext; + VkPipelineRobustnessBufferBehavior defaultRobustnessStorageBuffers; + VkPipelineRobustnessBufferBehavior defaultRobustnessUniformBuffers; + VkPipelineRobustnessBufferBehavior defaultRobustnessVertexInputs; + VkPipelineRobustnessImageBehavior defaultRobustnessImages; +} VkPhysicalDevicePipelineRobustnessProperties; + +typedef struct VkPipelineRobustnessCreateInfo { + VkStructureType sType; + const void* pNext; + VkPipelineRobustnessBufferBehavior storageBuffers; + VkPipelineRobustnessBufferBehavior uniformBuffers; + VkPipelineRobustnessBufferBehavior vertexInputs; + VkPipelineRobustnessImageBehavior images; +} VkPipelineRobustnessCreateInfo; + +typedef struct VkPhysicalDeviceLineRasterizationFeatures { + VkStructureType sType; + void* pNext; + VkBool32 rectangularLines; + VkBool32 bresenhamLines; + VkBool32 smoothLines; + VkBool32 stippledRectangularLines; + VkBool32 stippledBresenhamLines; + VkBool32 stippledSmoothLines; +} VkPhysicalDeviceLineRasterizationFeatures; + +typedef struct VkPhysicalDeviceLineRasterizationProperties { + VkStructureType sType; + void* pNext; + uint32_t lineSubPixelPrecisionBits; +} VkPhysicalDeviceLineRasterizationProperties; + +typedef struct VkPipelineRasterizationLineStateCreateInfo { + VkStructureType sType; + const void* pNext; + VkLineRasterizationMode lineRasterizationMode; + VkBool32 stippledLineEnable; + uint32_t lineStippleFactor; + uint16_t lineStipplePattern; +} VkPipelineRasterizationLineStateCreateInfo; + +typedef struct VkPhysicalDeviceVertexAttributeDivisorProperties { + VkStructureType sType; + void* pNext; + uint32_t maxVertexAttribDivisor; + VkBool32 supportsNonZeroFirstInstance; +} VkPhysicalDeviceVertexAttributeDivisorProperties; + +typedef struct VkVertexInputBindingDivisorDescription { + uint32_t binding; + uint32_t divisor; +} VkVertexInputBindingDivisorDescription; + +typedef struct VkPipelineVertexInputDivisorStateCreateInfo { + VkStructureType sType; + const void* pNext; + uint32_t vertexBindingDivisorCount; + const VkVertexInputBindingDivisorDescription* pVertexBindingDivisors; +} VkPipelineVertexInputDivisorStateCreateInfo; + +typedef struct VkPhysicalDeviceVertexAttributeDivisorFeatures { + VkStructureType sType; + void* pNext; + VkBool32 vertexAttributeInstanceRateDivisor; + VkBool32 vertexAttributeInstanceRateZeroDivisor; +} VkPhysicalDeviceVertexAttributeDivisorFeatures; + +typedef struct VkRenderingAreaInfo { + VkStructureType sType; + const void* pNext; + uint32_t viewMask; + uint32_t colorAttachmentCount; + const VkFormat* pColorAttachmentFormats; + VkFormat depthAttachmentFormat; + VkFormat stencilAttachmentFormat; +} VkRenderingAreaInfo; + +typedef struct VkPhysicalDeviceDynamicRenderingLocalReadFeatures { + VkStructureType sType; + void* pNext; + VkBool32 dynamicRenderingLocalRead; +} VkPhysicalDeviceDynamicRenderingLocalReadFeatures; + +typedef struct VkRenderingAttachmentLocationInfo { + VkStructureType sType; + const void* pNext; + uint32_t colorAttachmentCount; + const uint32_t* pColorAttachmentLocations; +} VkRenderingAttachmentLocationInfo; + +typedef struct VkRenderingInputAttachmentIndexInfo { + VkStructureType sType; + const void* pNext; + uint32_t colorAttachmentCount; + const uint32_t* pColorAttachmentInputIndices; + const uint32_t* pDepthInputAttachmentIndex; + const uint32_t* pStencilInputAttachmentIndex; +} VkRenderingInputAttachmentIndexInfo; + typedef VkResult (VKAPI_PTR *PFN_vkMapMemory2)(VkDevice device, const VkMemoryMapInfo* pMemoryMapInfo, void** ppData); typedef VkResult (VKAPI_PTR *PFN_vkUnmapMemory2)(VkDevice device, const VkMemoryUnmapInfo* pMemoryUnmapInfo); -typedef void (VKAPI_PTR *PFN_vkCmdBindIndexBuffer2)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkDeviceSize size, VkIndexType indexType); -typedef void (VKAPI_PTR *PFN_vkGetRenderingAreaGranularity)(VkDevice device, const VkRenderingAreaInfo* pRenderingAreaInfo, VkExtent2D* pGranularity); typedef void (VKAPI_PTR *PFN_vkGetDeviceImageSubresourceLayout)(VkDevice device, const VkDeviceImageSubresourceInfo* pInfo, VkSubresourceLayout2* pLayout); typedef void (VKAPI_PTR *PFN_vkGetImageSubresourceLayout2)(VkDevice device, VkImage image, const VkImageSubresource2* pSubresource, VkSubresourceLayout2* pLayout); -typedef void (VKAPI_PTR *PFN_vkCmdPushDescriptorSet)(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t set, uint32_t descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites); -typedef void (VKAPI_PTR *PFN_vkCmdPushDescriptorSetWithTemplate)(VkCommandBuffer commandBuffer, VkDescriptorUpdateTemplate descriptorUpdateTemplate, VkPipelineLayout layout, uint32_t set, const void* pData); -typedef void (VKAPI_PTR *PFN_vkCmdSetRenderingAttachmentLocations)(VkCommandBuffer commandBuffer, const VkRenderingAttachmentLocationInfo* pLocationInfo); -typedef void (VKAPI_PTR *PFN_vkCmdSetRenderingInputAttachmentIndices)(VkCommandBuffer commandBuffer, const VkRenderingInputAttachmentIndexInfo* pInputAttachmentIndexInfo); -typedef void (VKAPI_PTR *PFN_vkCmdBindDescriptorSets2)(VkCommandBuffer commandBuffer, const VkBindDescriptorSetsInfo* pBindDescriptorSetsInfo); -typedef void (VKAPI_PTR *PFN_vkCmdPushConstants2)(VkCommandBuffer commandBuffer, const VkPushConstantsInfo* pPushConstantsInfo); -typedef void (VKAPI_PTR *PFN_vkCmdPushDescriptorSet2)(VkCommandBuffer commandBuffer, const VkPushDescriptorSetInfo* pPushDescriptorSetInfo); -typedef void (VKAPI_PTR *PFN_vkCmdPushDescriptorSetWithTemplate2)(VkCommandBuffer commandBuffer, const VkPushDescriptorSetWithTemplateInfo* pPushDescriptorSetWithTemplateInfo); typedef VkResult (VKAPI_PTR *PFN_vkCopyMemoryToImage)(VkDevice device, const VkCopyMemoryToImageInfo* pCopyMemoryToImageInfo); typedef VkResult (VKAPI_PTR *PFN_vkCopyImageToMemory)(VkDevice device, const VkCopyImageToMemoryInfo* pCopyImageToMemoryInfo); typedef VkResult (VKAPI_PTR *PFN_vkCopyImageToImage)(VkDevice device, const VkCopyImageToImageInfo* pCopyImageToImageInfo); typedef VkResult (VKAPI_PTR *PFN_vkTransitionImageLayout)(VkDevice device, uint32_t transitionCount, const VkHostImageLayoutTransitionInfo* pTransitions); +typedef void (VKAPI_PTR *PFN_vkCmdPushDescriptorSet)(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t set, uint32_t descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites); +typedef void (VKAPI_PTR *PFN_vkCmdPushDescriptorSetWithTemplate)(VkCommandBuffer commandBuffer, VkDescriptorUpdateTemplate descriptorUpdateTemplate, VkPipelineLayout layout, uint32_t set, const void* pData); +typedef void (VKAPI_PTR *PFN_vkCmdBindDescriptorSets2)(VkCommandBuffer commandBuffer, const VkBindDescriptorSetsInfo* pBindDescriptorSetsInfo); +typedef void (VKAPI_PTR *PFN_vkCmdPushConstants2)(VkCommandBuffer commandBuffer, const VkPushConstantsInfo* pPushConstantsInfo); +typedef void (VKAPI_PTR *PFN_vkCmdPushDescriptorSet2)(VkCommandBuffer commandBuffer, const VkPushDescriptorSetInfo* pPushDescriptorSetInfo); +typedef void (VKAPI_PTR *PFN_vkCmdPushDescriptorSetWithTemplate2)(VkCommandBuffer commandBuffer, const VkPushDescriptorSetWithTemplateInfo* pPushDescriptorSetWithTemplateInfo); +typedef void (VKAPI_PTR *PFN_vkCmdSetLineStipple)(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor, uint16_t lineStipplePattern); +typedef void (VKAPI_PTR *PFN_vkCmdBindIndexBuffer2)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkDeviceSize size, VkIndexType indexType); +typedef void (VKAPI_PTR *PFN_vkGetRenderingAreaGranularity)(VkDevice device, const VkRenderingAreaInfo* pRenderingAreaInfo, VkExtent2D* pGranularity); +typedef void (VKAPI_PTR *PFN_vkCmdSetRenderingAttachmentLocations)(VkCommandBuffer commandBuffer, const VkRenderingAttachmentLocationInfo* pLocationInfo); +typedef void (VKAPI_PTR *PFN_vkCmdSetRenderingInputAttachmentIndices)(VkCommandBuffer commandBuffer, const VkRenderingInputAttachmentIndexInfo* pInputAttachmentIndexInfo); #ifndef VK_NO_PROTOTYPES -VKAPI_ATTR void VKAPI_CALL vkCmdSetLineStipple( - VkCommandBuffer commandBuffer, - uint32_t lineStippleFactor, - uint16_t lineStipplePattern); - VKAPI_ATTR VkResult VKAPI_CALL vkMapMemory2( VkDevice device, const VkMemoryMapInfo* pMemoryMapInfo, @@ -8414,18 +8828,6 @@ VKAPI_ATTR VkResult VKAPI_CALL vkUnmapMemory2( VkDevice device, const VkMemoryUnmapInfo* pMemoryUnmapInfo); -VKAPI_ATTR void VKAPI_CALL vkCmdBindIndexBuffer2( - VkCommandBuffer commandBuffer, - VkBuffer buffer, - VkDeviceSize offset, - VkDeviceSize size, - VkIndexType indexType); - -VKAPI_ATTR void VKAPI_CALL vkGetRenderingAreaGranularity( - VkDevice device, - const VkRenderingAreaInfo* pRenderingAreaInfo, - VkExtent2D* pGranularity); - VKAPI_ATTR void VKAPI_CALL vkGetDeviceImageSubresourceLayout( VkDevice device, const VkDeviceImageSubresourceInfo* pInfo, @@ -8437,45 +8839,6 @@ VKAPI_ATTR void VKAPI_CALL vkGetImageSubresourceLayout2( const VkImageSubresource2* pSubresource, VkSubresourceLayout2* pLayout); -VKAPI_ATTR void VKAPI_CALL vkCmdPushDescriptorSet( - VkCommandBuffer commandBuffer, - VkPipelineBindPoint pipelineBindPoint, - VkPipelineLayout layout, - uint32_t set, - uint32_t descriptorWriteCount, - const VkWriteDescriptorSet* pDescriptorWrites); - -VKAPI_ATTR void VKAPI_CALL vkCmdPushDescriptorSetWithTemplate( - VkCommandBuffer commandBuffer, - VkDescriptorUpdateTemplate descriptorUpdateTemplate, - VkPipelineLayout layout, - uint32_t set, - const void* pData); - -VKAPI_ATTR void VKAPI_CALL vkCmdSetRenderingAttachmentLocations( - VkCommandBuffer commandBuffer, - const VkRenderingAttachmentLocationInfo* pLocationInfo); - -VKAPI_ATTR void VKAPI_CALL vkCmdSetRenderingInputAttachmentIndices( - VkCommandBuffer commandBuffer, - const VkRenderingInputAttachmentIndexInfo* pInputAttachmentIndexInfo); - -VKAPI_ATTR void VKAPI_CALL vkCmdBindDescriptorSets2( - VkCommandBuffer commandBuffer, - const VkBindDescriptorSetsInfo* pBindDescriptorSetsInfo); - -VKAPI_ATTR void VKAPI_CALL vkCmdPushConstants2( - VkCommandBuffer commandBuffer, - const VkPushConstantsInfo* pPushConstantsInfo); - -VKAPI_ATTR void VKAPI_CALL vkCmdPushDescriptorSet2( - VkCommandBuffer commandBuffer, - const VkPushDescriptorSetInfo* pPushDescriptorSetInfo); - -VKAPI_ATTR void VKAPI_CALL vkCmdPushDescriptorSetWithTemplate2( - VkCommandBuffer commandBuffer, - const VkPushDescriptorSetWithTemplateInfo* pPushDescriptorSetWithTemplateInfo); - VKAPI_ATTR VkResult VKAPI_CALL vkCopyMemoryToImage( VkDevice device, const VkCopyMemoryToImageInfo* pCopyMemoryToImageInfo); @@ -8492,6 +8855,62 @@ VKAPI_ATTR VkResult VKAPI_CALL vkTransitionImageLayout( VkDevice device, uint32_t transitionCount, const VkHostImageLayoutTransitionInfo* pTransitions); + +VKAPI_ATTR void VKAPI_CALL vkCmdPushDescriptorSet( + VkCommandBuffer commandBuffer, + VkPipelineBindPoint pipelineBindPoint, + VkPipelineLayout layout, + uint32_t set, + uint32_t descriptorWriteCount, + const VkWriteDescriptorSet* pDescriptorWrites); + +VKAPI_ATTR void VKAPI_CALL vkCmdPushDescriptorSetWithTemplate( + VkCommandBuffer commandBuffer, + VkDescriptorUpdateTemplate descriptorUpdateTemplate, + VkPipelineLayout layout, + uint32_t set, + const void* pData); + +VKAPI_ATTR void VKAPI_CALL vkCmdBindDescriptorSets2( + VkCommandBuffer commandBuffer, + const VkBindDescriptorSetsInfo* pBindDescriptorSetsInfo); + +VKAPI_ATTR void VKAPI_CALL vkCmdPushConstants2( + VkCommandBuffer commandBuffer, + const VkPushConstantsInfo* pPushConstantsInfo); + +VKAPI_ATTR void VKAPI_CALL vkCmdPushDescriptorSet2( + VkCommandBuffer commandBuffer, + const VkPushDescriptorSetInfo* pPushDescriptorSetInfo); + +VKAPI_ATTR void VKAPI_CALL vkCmdPushDescriptorSetWithTemplate2( + VkCommandBuffer commandBuffer, + const VkPushDescriptorSetWithTemplateInfo* pPushDescriptorSetWithTemplateInfo); + +VKAPI_ATTR void VKAPI_CALL vkCmdSetLineStipple( + VkCommandBuffer commandBuffer, + uint32_t lineStippleFactor, + uint16_t lineStipplePattern); + +VKAPI_ATTR void VKAPI_CALL vkCmdBindIndexBuffer2( + VkCommandBuffer commandBuffer, + VkBuffer buffer, + VkDeviceSize offset, + VkDeviceSize size, + VkIndexType indexType); + +VKAPI_ATTR void VKAPI_CALL vkGetRenderingAreaGranularity( + VkDevice device, + const VkRenderingAreaInfo* pRenderingAreaInfo, + VkExtent2D* pGranularity); + +VKAPI_ATTR void VKAPI_CALL vkCmdSetRenderingAttachmentLocations( + VkCommandBuffer commandBuffer, + const VkRenderingAttachmentLocationInfo* pLocationInfo); + +VKAPI_ATTR void VKAPI_CALL vkCmdSetRenderingInputAttachmentIndices( + VkCommandBuffer commandBuffer, + const VkRenderingInputAttachmentIndexInfo* pInputAttachmentIndexInfo); #endif @@ -8508,7 +8927,8 @@ typedef enum VkPresentModeKHR { VK_PRESENT_MODE_FIFO_RELAXED_KHR = 3, VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR = 1000111000, VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR = 1000111001, - VK_PRESENT_MODE_FIFO_LATEST_READY_EXT = 1000361000, + VK_PRESENT_MODE_FIFO_LATEST_READY_KHR = 1000361000, + VK_PRESENT_MODE_FIFO_LATEST_READY_EXT = VK_PRESENT_MODE_FIFO_LATEST_READY_KHR, VK_PRESENT_MODE_MAX_ENUM_KHR = 0x7FFFFFFF } VkPresentModeKHR; @@ -8522,7 +8942,7 @@ typedef enum VkColorSpaceKHR { VK_COLOR_SPACE_BT709_NONLINEAR_EXT = 1000104006, VK_COLOR_SPACE_BT2020_LINEAR_EXT = 1000104007, VK_COLOR_SPACE_HDR10_ST2084_EXT = 1000104008, - // VK_COLOR_SPACE_DOLBYVISION_EXT is deprecated, but no reason was given in the API XML + // VK_COLOR_SPACE_DOLBYVISION_EXT is legacy, but no reason was given in the API XML VK_COLOR_SPACE_DOLBYVISION_EXT = 1000104009, VK_COLOR_SPACE_HDR10_HLG_EXT = 1000104010, VK_COLOR_SPACE_ADOBERGB_LINEAR_EXT = 1000104011, @@ -8530,9 +8950,9 @@ typedef enum VkColorSpaceKHR { VK_COLOR_SPACE_PASS_THROUGH_EXT = 1000104013, VK_COLOR_SPACE_EXTENDED_SRGB_NONLINEAR_EXT = 1000104014, VK_COLOR_SPACE_DISPLAY_NATIVE_AMD = 1000213000, - // VK_COLORSPACE_SRGB_NONLINEAR_KHR is a deprecated alias + // VK_COLORSPACE_SRGB_NONLINEAR_KHR is a legacy alias VK_COLORSPACE_SRGB_NONLINEAR_KHR = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, - // VK_COLOR_SPACE_DCI_P3_LINEAR_EXT is a deprecated alias + // VK_COLOR_SPACE_DCI_P3_LINEAR_EXT is a legacy alias VK_COLOR_SPACE_DCI_P3_LINEAR_EXT = VK_COLOR_SPACE_DISPLAY_P3_LINEAR_EXT, VK_COLOR_SPACE_MAX_ENUM_KHR = 0x7FFFFFFF } VkColorSpaceKHR; @@ -8549,6 +8969,7 @@ typedef enum VkSurfaceTransformFlagBitsKHR { VK_SURFACE_TRANSFORM_INHERIT_BIT_KHR = 0x00000100, VK_SURFACE_TRANSFORM_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF } VkSurfaceTransformFlagBitsKHR; +typedef VkFlags VkSurfaceTransformFlagsKHR; typedef enum VkCompositeAlphaFlagBitsKHR { VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR = 0x00000001, @@ -8558,7 +8979,6 @@ typedef enum VkCompositeAlphaFlagBitsKHR { VK_COMPOSITE_ALPHA_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF } VkCompositeAlphaFlagBitsKHR; typedef VkFlags VkCompositeAlphaFlagsKHR; -typedef VkFlags VkSurfaceTransformFlagsKHR; typedef struct VkSurfaceCapabilitiesKHR { uint32_t minImageCount; uint32_t maxImageCount; @@ -8584,34 +9004,44 @@ typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)(VkPhysica typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t* pPresentModeCount, VkPresentModeKHR* pPresentModes); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkDestroySurfaceKHR( VkInstance instance, VkSurfaceKHR surface, const VkAllocationCallbacks* pAllocator); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceSupportKHR( VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, VkSurfaceKHR surface, VkBool32* pSupported); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceCapabilitiesKHR( VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR* pSurfaceCapabilities); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceFormatsKHR( VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t* pSurfaceFormatCount, VkSurfaceFormatKHR* pSurfaceFormats); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfacePresentModesKHR( VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t* pPresentModeCount, VkPresentModeKHR* pPresentModes); #endif +#endif // VK_KHR_swapchain is a preprocessor guard. Do not pass it to API calls. @@ -8624,7 +9054,12 @@ typedef enum VkSwapchainCreateFlagBitsKHR { VK_SWAPCHAIN_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR = 0x00000001, VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR = 0x00000002, VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR = 0x00000004, - VK_SWAPCHAIN_CREATE_DEFERRED_MEMORY_ALLOCATION_BIT_EXT = 0x00000008, + VK_SWAPCHAIN_CREATE_PRESENT_TIMING_BIT_EXT = 0x00000200, + VK_SWAPCHAIN_CREATE_PRESENT_ID_2_BIT_KHR = 0x00000040, + VK_SWAPCHAIN_CREATE_PRESENT_WAIT_2_BIT_KHR = 0x00000080, + VK_SWAPCHAIN_CREATE_DEFERRED_MEMORY_ALLOCATION_BIT_KHR = 0x00000008, + VK_SWAPCHAIN_CREATE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_BIT_EXT = 0x00000100, + VK_SWAPCHAIN_CREATE_DEFERRED_MEMORY_ALLOCATION_BIT_EXT = VK_SWAPCHAIN_CREATE_DEFERRED_MEMORY_ALLOCATION_BIT_KHR, VK_SWAPCHAIN_CREATE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF } VkSwapchainCreateFlagBitsKHR; typedef VkFlags VkSwapchainCreateFlagsKHR; @@ -8724,23 +9159,30 @@ typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDevicePresentRectanglesKHR)(VkPhys typedef VkResult (VKAPI_PTR *PFN_vkAcquireNextImage2KHR)(VkDevice device, const VkAcquireNextImageInfoKHR* pAcquireInfo, uint32_t* pImageIndex); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateSwapchainKHR( VkDevice device, const VkSwapchainCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchain); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkDestroySwapchainKHR( VkDevice device, VkSwapchainKHR swapchain, const VkAllocationCallbacks* pAllocator); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetSwapchainImagesKHR( VkDevice device, VkSwapchainKHR swapchain, uint32_t* pSwapchainImageCount, VkImage* pSwapchainImages); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkAcquireNextImageKHR( VkDevice device, VkSwapchainKHR swapchain, @@ -8748,31 +9190,42 @@ VKAPI_ATTR VkResult VKAPI_CALL vkAcquireNextImageKHR( VkSemaphore semaphore, VkFence fence, uint32_t* pImageIndex); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkQueuePresentKHR( VkQueue queue, const VkPresentInfoKHR* pPresentInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetDeviceGroupPresentCapabilitiesKHR( VkDevice device, VkDeviceGroupPresentCapabilitiesKHR* pDeviceGroupPresentCapabilities); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetDeviceGroupSurfacePresentModesKHR( VkDevice device, VkSurfaceKHR surface, VkDeviceGroupPresentModeFlagsKHR* pModes); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDevicePresentRectanglesKHR( VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, uint32_t* pRectCount, VkRect2D* pRects); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkAcquireNextImage2KHR( VkDevice device, const VkAcquireNextImageInfoKHR* pAcquireInfo, uint32_t* pImageIndex); #endif +#endif // VK_KHR_display is a preprocessor guard. Do not pass it to API calls. @@ -8858,47 +9311,61 @@ typedef VkResult (VKAPI_PTR *PFN_vkGetDisplayPlaneCapabilitiesKHR)(VkPhysicalDev typedef VkResult (VKAPI_PTR *PFN_vkCreateDisplayPlaneSurfaceKHR)(VkInstance instance, const VkDisplaySurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceDisplayPropertiesKHR( VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkDisplayPropertiesKHR* pProperties); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceDisplayPlanePropertiesKHR( VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkDisplayPlanePropertiesKHR* pProperties); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayPlaneSupportedDisplaysKHR( VkPhysicalDevice physicalDevice, uint32_t planeIndex, uint32_t* pDisplayCount, VkDisplayKHR* pDisplays); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayModePropertiesKHR( VkPhysicalDevice physicalDevice, VkDisplayKHR display, uint32_t* pPropertyCount, VkDisplayModePropertiesKHR* pProperties); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateDisplayModeKHR( VkPhysicalDevice physicalDevice, VkDisplayKHR display, const VkDisplayModeCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDisplayModeKHR* pMode); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayPlaneCapabilitiesKHR( VkPhysicalDevice physicalDevice, VkDisplayModeKHR mode, uint32_t planeIndex, VkDisplayPlaneCapabilitiesKHR* pCapabilities); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateDisplayPlaneSurfaceKHR( VkInstance instance, const VkDisplaySurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); #endif +#endif // VK_KHR_display_swapchain is a preprocessor guard. Do not pass it to API calls. @@ -8916,6 +9383,7 @@ typedef struct VkDisplayPresentInfoKHR { typedef VkResult (VKAPI_PTR *PFN_vkCreateSharedSwapchainsKHR)(VkDevice device, uint32_t swapchainCount, const VkSwapchainCreateInfoKHR* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchains); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateSharedSwapchainsKHR( VkDevice device, uint32_t swapchainCount, @@ -8923,6 +9391,7 @@ VKAPI_ATTR VkResult VKAPI_CALL vkCreateSharedSwapchainsKHR( const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchains); #endif +#endif // VK_KHR_sampler_mirror_clamp_to_edge is a preprocessor guard. Do not pass it to API calls. @@ -8954,6 +9423,7 @@ typedef enum VkVideoCodecOperationFlagBitsKHR { VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR = 0x00000002, VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR = 0x00000004, VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR = 0x00040000, + VK_VIDEO_CODEC_OPERATION_DECODE_VP9_BIT_KHR = 0x00000008, VK_VIDEO_CODEC_OPERATION_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF } VkVideoCodecOperationFlagBitsKHR; typedef VkFlags VkVideoCodecOperationFlagsKHR; @@ -9165,68 +9635,92 @@ typedef void (VKAPI_PTR *PFN_vkCmdEndVideoCodingKHR)(VkCommandBuffer commandBuff typedef void (VKAPI_PTR *PFN_vkCmdControlVideoCodingKHR)(VkCommandBuffer commandBuffer, const VkVideoCodingControlInfoKHR* pCodingControlInfo); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceVideoCapabilitiesKHR( VkPhysicalDevice physicalDevice, const VkVideoProfileInfoKHR* pVideoProfile, VkVideoCapabilitiesKHR* pCapabilities); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceVideoFormatPropertiesKHR( VkPhysicalDevice physicalDevice, const VkPhysicalDeviceVideoFormatInfoKHR* pVideoFormatInfo, uint32_t* pVideoFormatPropertyCount, VkVideoFormatPropertiesKHR* pVideoFormatProperties); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateVideoSessionKHR( VkDevice device, const VkVideoSessionCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkVideoSessionKHR* pVideoSession); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkDestroyVideoSessionKHR( VkDevice device, VkVideoSessionKHR videoSession, const VkAllocationCallbacks* pAllocator); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetVideoSessionMemoryRequirementsKHR( VkDevice device, VkVideoSessionKHR videoSession, uint32_t* pMemoryRequirementsCount, VkVideoSessionMemoryRequirementsKHR* pMemoryRequirements); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkBindVideoSessionMemoryKHR( VkDevice device, VkVideoSessionKHR videoSession, uint32_t bindSessionMemoryInfoCount, const VkBindVideoSessionMemoryInfoKHR* pBindSessionMemoryInfos); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateVideoSessionParametersKHR( VkDevice device, const VkVideoSessionParametersCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkVideoSessionParametersKHR* pVideoSessionParameters); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkUpdateVideoSessionParametersKHR( VkDevice device, VkVideoSessionParametersKHR videoSessionParameters, const VkVideoSessionParametersUpdateInfoKHR* pUpdateInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkDestroyVideoSessionParametersKHR( VkDevice device, VkVideoSessionParametersKHR videoSessionParameters, const VkAllocationCallbacks* pAllocator); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdBeginVideoCodingKHR( VkCommandBuffer commandBuffer, const VkVideoBeginCodingInfoKHR* pBeginInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdEndVideoCodingKHR( VkCommandBuffer commandBuffer, const VkVideoEndCodingInfoKHR* pEndCodingInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdControlVideoCodingKHR( VkCommandBuffer commandBuffer, const VkVideoCodingControlInfoKHR* pCodingControlInfo); #endif +#endif // VK_KHR_video_decode_queue is a preprocessor guard. Do not pass it to API calls. @@ -9278,10 +9772,12 @@ typedef struct VkVideoDecodeInfoKHR { typedef void (VKAPI_PTR *PFN_vkCmdDecodeVideoKHR)(VkCommandBuffer commandBuffer, const VkVideoDecodeInfoKHR* pDecodeInfo); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdDecodeVideoKHR( VkCommandBuffer commandBuffer, const VkVideoDecodeInfoKHR* pDecodeInfo); #endif +#endif // VK_KHR_video_encode_h264 is a preprocessor guard. Do not pass it to API calls. @@ -9301,6 +9797,7 @@ typedef enum VkVideoEncodeH264CapabilityFlagBitsKHR { VK_VIDEO_ENCODE_H264_CAPABILITY_PER_PICTURE_TYPE_MIN_MAX_QP_BIT_KHR = 0x00000040, VK_VIDEO_ENCODE_H264_CAPABILITY_PER_SLICE_CONSTANT_QP_BIT_KHR = 0x00000080, VK_VIDEO_ENCODE_H264_CAPABILITY_GENERATE_PREFIX_NALU_BIT_KHR = 0x00000100, + VK_VIDEO_ENCODE_H264_CAPABILITY_B_PICTURE_INTRA_REFRESH_BIT_KHR = 0x00000400, VK_VIDEO_ENCODE_H264_CAPABILITY_MB_QP_DIFF_WRAPAROUND_BIT_KHR = 0x00000200, VK_VIDEO_ENCODE_H264_CAPABILITY_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF } VkVideoEncodeH264CapabilityFlagBitsKHR; @@ -9502,6 +9999,7 @@ typedef enum VkVideoEncodeH265CapabilityFlagBitsKHR { VK_VIDEO_ENCODE_H265_CAPABILITY_PER_SLICE_SEGMENT_CONSTANT_QP_BIT_KHR = 0x00000080, VK_VIDEO_ENCODE_H265_CAPABILITY_MULTIPLE_TILES_PER_SLICE_SEGMENT_BIT_KHR = 0x00000100, VK_VIDEO_ENCODE_H265_CAPABILITY_MULTIPLE_SLICE_SEGMENTS_PER_TILE_BIT_KHR = 0x00000200, + VK_VIDEO_ENCODE_H265_CAPABILITY_B_PICTURE_INTRA_REFRESH_BIT_KHR = 0x00000800, VK_VIDEO_ENCODE_H265_CAPABILITY_CU_QP_DIFF_WRAPAROUND_BIT_KHR = 0x00000400, VK_VIDEO_ENCODE_H265_CAPABILITY_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF } VkVideoEncodeH265CapabilityFlagBitsKHR; @@ -9792,13 +10290,17 @@ typedef void (VKAPI_PTR *PFN_vkCmdBeginRenderingKHR)(VkCommandBuffer typedef void (VKAPI_PTR *PFN_vkCmdEndRenderingKHR)(VkCommandBuffer commandBuffer); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdBeginRenderingKHR( VkCommandBuffer commandBuffer, const VkRenderingInfo* pRenderingInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderingKHR( VkCommandBuffer commandBuffer); #endif +#endif // VK_KHR_multiview is a preprocessor guard. Do not pass it to API calls. @@ -9844,39 +10346,53 @@ typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceMemoryProperties2KHR)(VkPhysical typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceSparseImageFormatProperties2KHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo, uint32_t* pPropertyCount, VkSparseImageFormatProperties2* pProperties); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFeatures2KHR( VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures2* pFeatures); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceProperties2KHR( VkPhysicalDevice physicalDevice, VkPhysicalDeviceProperties2* pProperties); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceFormatProperties2KHR( VkPhysicalDevice physicalDevice, VkFormat format, VkFormatProperties2* pFormatProperties); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceImageFormatProperties2KHR( VkPhysicalDevice physicalDevice, const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo, VkImageFormatProperties2* pImageFormatProperties); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceQueueFamilyProperties2KHR( VkPhysicalDevice physicalDevice, uint32_t* pQueueFamilyPropertyCount, VkQueueFamilyProperties2* pQueueFamilyProperties); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceMemoryProperties2KHR( VkPhysicalDevice physicalDevice, VkPhysicalDeviceMemoryProperties2* pMemoryProperties); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceSparseImageFormatProperties2KHR( VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSparseImageFormatInfo2* pFormatInfo, uint32_t* pPropertyCount, VkSparseImageFormatProperties2* pProperties); #endif +#endif // VK_KHR_device_group is a preprocessor guard. Do not pass it to API calls. @@ -9910,17 +10426,22 @@ typedef void (VKAPI_PTR *PFN_vkCmdSetDeviceMaskKHR)(VkCommandBuffer commandBuffe typedef void (VKAPI_PTR *PFN_vkCmdDispatchBaseKHR)(VkCommandBuffer commandBuffer, uint32_t baseGroupX, uint32_t baseGroupY, uint32_t baseGroupZ, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetDeviceGroupPeerMemoryFeaturesKHR( VkDevice device, uint32_t heapIndex, uint32_t localDeviceIndex, uint32_t remoteDeviceIndex, VkPeerMemoryFeatureFlags* pPeerMemoryFeatures); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetDeviceMaskKHR( VkCommandBuffer commandBuffer, uint32_t deviceMask); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdDispatchBaseKHR( VkCommandBuffer commandBuffer, uint32_t baseGroupX, @@ -9930,6 +10451,7 @@ VKAPI_ATTR void VKAPI_CALL vkCmdDispatchBaseKHR( uint32_t groupCountY, uint32_t groupCountZ); #endif +#endif // VK_KHR_shader_draw_parameters is a preprocessor guard. Do not pass it to API calls. @@ -9942,20 +10464,22 @@ VKAPI_ATTR void VKAPI_CALL vkCmdDispatchBaseKHR( #define VK_KHR_maintenance1 1 #define VK_KHR_MAINTENANCE_1_SPEC_VERSION 2 #define VK_KHR_MAINTENANCE_1_EXTENSION_NAME "VK_KHR_maintenance1" -// VK_KHR_MAINTENANCE1_SPEC_VERSION is a deprecated alias +// VK_KHR_MAINTENANCE1_SPEC_VERSION is a legacy alias #define VK_KHR_MAINTENANCE1_SPEC_VERSION VK_KHR_MAINTENANCE_1_SPEC_VERSION -// VK_KHR_MAINTENANCE1_EXTENSION_NAME is a deprecated alias +// VK_KHR_MAINTENANCE1_EXTENSION_NAME is a legacy alias #define VK_KHR_MAINTENANCE1_EXTENSION_NAME VK_KHR_MAINTENANCE_1_EXTENSION_NAME typedef VkCommandPoolTrimFlags VkCommandPoolTrimFlagsKHR; typedef void (VKAPI_PTR *PFN_vkTrimCommandPoolKHR)(VkDevice device, VkCommandPool commandPool, VkCommandPoolTrimFlags flags); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkTrimCommandPoolKHR( VkDevice device, VkCommandPool commandPool, VkCommandPoolTrimFlags flags); #endif +#endif // VK_KHR_device_group_creation is a preprocessor guard. Do not pass it to API calls. @@ -9970,11 +10494,13 @@ typedef VkDeviceGroupDeviceCreateInfo VkDeviceGroupDeviceCreateInfoKHR; typedef VkResult (VKAPI_PTR *PFN_vkEnumeratePhysicalDeviceGroupsKHR)(VkInstance instance, uint32_t* pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDeviceGroupsKHR( VkInstance instance, uint32_t* pPhysicalDeviceGroupCount, VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties); #endif +#endif // VK_KHR_external_memory_capabilities is a preprocessor guard. Do not pass it to API calls. @@ -10005,11 +10531,13 @@ typedef VkPhysicalDeviceIDProperties VkPhysicalDeviceIDPropertiesKHR; typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo, VkExternalBufferProperties* pExternalBufferProperties); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceExternalBufferPropertiesKHR( VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalBufferInfo* pExternalBufferInfo, VkExternalBufferProperties* pExternalBufferProperties); #endif +#endif // VK_KHR_external_memory is a preprocessor guard. Do not pass it to API calls. @@ -10053,17 +10581,21 @@ typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryFdKHR)(VkDevice device, const VkMemo typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryFdPropertiesKHR)(VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, int fd, VkMemoryFdPropertiesKHR* pMemoryFdProperties); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryFdKHR( VkDevice device, const VkMemoryGetFdInfoKHR* pGetFdInfo, int* pFd); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryFdPropertiesKHR( VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, int fd, VkMemoryFdPropertiesKHR* pMemoryFdProperties); #endif +#endif // VK_KHR_external_semaphore_capabilities is a preprocessor guard. Do not pass it to API calls. @@ -10085,11 +10617,13 @@ typedef VkExternalSemaphoreProperties VkExternalSemaphorePropertiesKHR; typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo, VkExternalSemaphoreProperties* pExternalSemaphoreProperties); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceExternalSemaphorePropertiesKHR( VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalSemaphoreInfo* pExternalSemaphoreInfo, VkExternalSemaphoreProperties* pExternalSemaphoreProperties); #endif +#endif // VK_KHR_external_semaphore is a preprocessor guard. Do not pass it to API calls. @@ -10128,15 +10662,19 @@ typedef VkResult (VKAPI_PTR *PFN_vkImportSemaphoreFdKHR)(VkDevice device, const typedef VkResult (VKAPI_PTR *PFN_vkGetSemaphoreFdKHR)(VkDevice device, const VkSemaphoreGetFdInfoKHR* pGetFdInfo, int* pFd); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkImportSemaphoreFdKHR( VkDevice device, const VkImportSemaphoreFdInfoKHR* pImportSemaphoreFdInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetSemaphoreFdKHR( VkDevice device, const VkSemaphoreGetFdInfoKHR* pGetFdInfo, int* pFd); #endif +#endif // VK_KHR_push_descriptor is a preprocessor guard. Do not pass it to API calls. @@ -10149,6 +10687,7 @@ typedef void (VKAPI_PTR *PFN_vkCmdPushDescriptorSetKHR)(VkCommandBuffer commandB typedef void (VKAPI_PTR *PFN_vkCmdPushDescriptorSetWithTemplateKHR)(VkCommandBuffer commandBuffer, VkDescriptorUpdateTemplate descriptorUpdateTemplate, VkPipelineLayout layout, uint32_t set, const void* pData); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdPushDescriptorSetKHR( VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, @@ -10156,7 +10695,9 @@ VKAPI_ATTR void VKAPI_CALL vkCmdPushDescriptorSetKHR( uint32_t set, uint32_t descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdPushDescriptorSetWithTemplateKHR( VkCommandBuffer commandBuffer, VkDescriptorUpdateTemplate descriptorUpdateTemplate, @@ -10164,6 +10705,7 @@ VKAPI_ATTR void VKAPI_CALL vkCmdPushDescriptorSetWithTemplateKHR( uint32_t set, const void* pData); #endif +#endif // VK_KHR_shader_float16_int8 is a preprocessor guard. Do not pass it to API calls. @@ -10227,23 +10769,29 @@ typedef void (VKAPI_PTR *PFN_vkDestroyDescriptorUpdateTemplateKHR)(VkDevice devi typedef void (VKAPI_PTR *PFN_vkUpdateDescriptorSetWithTemplateKHR)(VkDevice device, VkDescriptorSet descriptorSet, VkDescriptorUpdateTemplate descriptorUpdateTemplate, const void* pData); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateDescriptorUpdateTemplateKHR( VkDevice device, const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDescriptorUpdateTemplate* pDescriptorUpdateTemplate); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkDestroyDescriptorUpdateTemplateKHR( VkDevice device, VkDescriptorUpdateTemplate descriptorUpdateTemplate, const VkAllocationCallbacks* pAllocator); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkUpdateDescriptorSetWithTemplateKHR( VkDevice device, VkDescriptorSet descriptorSet, VkDescriptorUpdateTemplate descriptorUpdateTemplate, const void* pData); #endif +#endif // VK_KHR_imageless_framebuffer is a preprocessor guard. Do not pass it to API calls. @@ -10284,26 +10832,34 @@ typedef void (VKAPI_PTR *PFN_vkCmdNextSubpass2KHR)(VkCommandBuffer commandBuffer typedef void (VKAPI_PTR *PFN_vkCmdEndRenderPass2KHR)(VkCommandBuffer commandBuffer, const VkSubpassEndInfo* pSubpassEndInfo); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateRenderPass2KHR( VkDevice device, const VkRenderPassCreateInfo2* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdBeginRenderPass2KHR( VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, const VkSubpassBeginInfo* pSubpassBeginInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdNextSubpass2KHR( VkCommandBuffer commandBuffer, const VkSubpassBeginInfo* pSubpassBeginInfo, const VkSubpassEndInfo* pSubpassEndInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdEndRenderPass2KHR( VkCommandBuffer commandBuffer, const VkSubpassEndInfo* pSubpassEndInfo); #endif +#endif // VK_KHR_shared_presentable_image is a preprocessor guard. Do not pass it to API calls. @@ -10319,10 +10875,12 @@ typedef struct VkSharedPresentSurfaceCapabilitiesKHR { typedef VkResult (VKAPI_PTR *PFN_vkGetSwapchainStatusKHR)(VkDevice device, VkSwapchainKHR swapchain); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetSwapchainStatusKHR( VkDevice device, VkSwapchainKHR swapchain); #endif +#endif // VK_KHR_external_fence_capabilities is a preprocessor guard. Do not pass it to API calls. @@ -10344,11 +10902,13 @@ typedef VkExternalFenceProperties VkExternalFencePropertiesKHR; typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalFencePropertiesKHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo, VkExternalFenceProperties* pExternalFenceProperties); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceExternalFencePropertiesKHR( VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo, VkExternalFenceProperties* pExternalFenceProperties); #endif +#endif // VK_KHR_external_fence is a preprocessor guard. Do not pass it to API calls. @@ -10387,15 +10947,19 @@ typedef VkResult (VKAPI_PTR *PFN_vkImportFenceFdKHR)(VkDevice device, const VkIm typedef VkResult (VKAPI_PTR *PFN_vkGetFenceFdKHR)(VkDevice device, const VkFenceGetFdInfoKHR* pGetFdInfo, int* pFd); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkImportFenceFdKHR( VkDevice device, const VkImportFenceFdInfoKHR* pImportFenceFdInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetFenceFdKHR( VkDevice device, const VkFenceGetFdInfoKHR* pGetFdInfo, int* pFd); #endif +#endif // VK_KHR_performance_query is a preprocessor guard. Do not pass it to API calls. @@ -10422,11 +10986,11 @@ typedef enum VkPerformanceCounterScopeKHR { VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_BUFFER_KHR = 0, VK_PERFORMANCE_COUNTER_SCOPE_RENDER_PASS_KHR = 1, VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_KHR = 2, - // VK_QUERY_SCOPE_COMMAND_BUFFER_KHR is a deprecated alias + // VK_QUERY_SCOPE_COMMAND_BUFFER_KHR is a legacy alias VK_QUERY_SCOPE_COMMAND_BUFFER_KHR = VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_BUFFER_KHR, - // VK_QUERY_SCOPE_RENDER_PASS_KHR is a deprecated alias + // VK_QUERY_SCOPE_RENDER_PASS_KHR is a legacy alias VK_QUERY_SCOPE_RENDER_PASS_KHR = VK_PERFORMANCE_COUNTER_SCOPE_RENDER_PASS_KHR, - // VK_QUERY_SCOPE_COMMAND_KHR is a deprecated alias + // VK_QUERY_SCOPE_COMMAND_KHR is a legacy alias VK_QUERY_SCOPE_COMMAND_KHR = VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_KHR, VK_PERFORMANCE_COUNTER_SCOPE_MAX_ENUM_KHR = 0x7FFFFFFF } VkPerformanceCounterScopeKHR; @@ -10444,9 +11008,9 @@ typedef enum VkPerformanceCounterStorageKHR { typedef enum VkPerformanceCounterDescriptionFlagBitsKHR { VK_PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_BIT_KHR = 0x00000001, VK_PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_BIT_KHR = 0x00000002, - // VK_PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_KHR is a deprecated alias + // VK_PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_KHR is a legacy alias VK_PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_KHR = VK_PERFORMANCE_COUNTER_DESCRIPTION_PERFORMANCE_IMPACTING_BIT_KHR, - // VK_PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_KHR is a deprecated alias + // VK_PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_KHR is a legacy alias VK_PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_KHR = VK_PERFORMANCE_COUNTER_DESCRIPTION_CONCURRENTLY_IMPACTED_BIT_KHR, VK_PERFORMANCE_COUNTER_DESCRIPTION_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF } VkPerformanceCounterDescriptionFlagBitsKHR; @@ -10523,34 +11087,42 @@ typedef VkResult (VKAPI_PTR *PFN_vkAcquireProfilingLockKHR)(VkDevice device, con typedef void (VKAPI_PTR *PFN_vkReleaseProfilingLockKHR)(VkDevice device); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR( VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, uint32_t* pCounterCount, VkPerformanceCounterKHR* pCounters, VkPerformanceCounterDescriptionKHR* pCounterDescriptions); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR( VkPhysicalDevice physicalDevice, const VkQueryPoolPerformanceCreateInfoKHR* pPerformanceQueryCreateInfo, uint32_t* pNumPasses); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkAcquireProfilingLockKHR( VkDevice device, const VkAcquireProfilingLockInfoKHR* pInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkReleaseProfilingLockKHR( VkDevice device); #endif +#endif // VK_KHR_maintenance2 is a preprocessor guard. Do not pass it to API calls. #define VK_KHR_maintenance2 1 #define VK_KHR_MAINTENANCE_2_SPEC_VERSION 1 #define VK_KHR_MAINTENANCE_2_EXTENSION_NAME "VK_KHR_maintenance2" -// VK_KHR_MAINTENANCE2_SPEC_VERSION is a deprecated alias +// VK_KHR_MAINTENANCE2_SPEC_VERSION is a legacy alias #define VK_KHR_MAINTENANCE2_SPEC_VERSION VK_KHR_MAINTENANCE_2_SPEC_VERSION -// VK_KHR_MAINTENANCE2_EXTENSION_NAME is a deprecated alias +// VK_KHR_MAINTENANCE2_EXTENSION_NAME is a legacy alias #define VK_KHR_MAINTENANCE2_EXTENSION_NAME VK_KHR_MAINTENANCE_2_EXTENSION_NAME typedef VkPointClippingBehavior VkPointClippingBehaviorKHR; @@ -10594,17 +11166,21 @@ typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfaceCapabilities2KHR)(VkP typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfaceFormats2KHR)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, uint32_t* pSurfaceFormatCount, VkSurfaceFormat2KHR* pSurfaceFormats); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceCapabilities2KHR( VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, VkSurfaceCapabilities2KHR* pSurfaceCapabilities); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceFormats2KHR( VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, uint32_t* pSurfaceFormatCount, VkSurfaceFormat2KHR* pSurfaceFormats); #endif +#endif // VK_KHR_variable_pointers is a preprocessor guard. Do not pass it to API calls. @@ -10658,27 +11234,35 @@ typedef VkResult (VKAPI_PTR *PFN_vkGetDisplayModeProperties2KHR)(VkPhysicalDevic typedef VkResult (VKAPI_PTR *PFN_vkGetDisplayPlaneCapabilities2KHR)(VkPhysicalDevice physicalDevice, const VkDisplayPlaneInfo2KHR* pDisplayPlaneInfo, VkDisplayPlaneCapabilities2KHR* pCapabilities); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceDisplayProperties2KHR( VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkDisplayProperties2KHR* pProperties); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceDisplayPlaneProperties2KHR( VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkDisplayPlaneProperties2KHR* pProperties); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayModeProperties2KHR( VkPhysicalDevice physicalDevice, VkDisplayKHR display, uint32_t* pPropertyCount, VkDisplayModeProperties2KHR* pProperties); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetDisplayPlaneCapabilities2KHR( VkPhysicalDevice physicalDevice, const VkDisplayPlaneInfo2KHR* pDisplayPlaneInfo, VkDisplayPlaneCapabilities2KHR* pCapabilities); #endif +#endif // VK_KHR_dedicated_allocation is a preprocessor guard. Do not pass it to API calls. @@ -10697,6 +11281,20 @@ typedef VkMemoryDedicatedAllocateInfo VkMemoryDedicatedAllocateInfoKHR; #define VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME "VK_KHR_storage_buffer_storage_class" +// VK_KHR_shader_bfloat16 is a preprocessor guard. Do not pass it to API calls. +#define VK_KHR_shader_bfloat16 1 +#define VK_KHR_SHADER_BFLOAT16_SPEC_VERSION 1 +#define VK_KHR_SHADER_BFLOAT16_EXTENSION_NAME "VK_KHR_shader_bfloat16" +typedef struct VkPhysicalDeviceShaderBfloat16FeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 shaderBFloat16Type; + VkBool32 shaderBFloat16DotProduct; + VkBool32 shaderBFloat16CooperativeMatrix; +} VkPhysicalDeviceShaderBfloat16FeaturesKHR; + + + // VK_KHR_relaxed_block_layout is a preprocessor guard. Do not pass it to API calls. #define VK_KHR_relaxed_block_layout 1 #define VK_KHR_RELAXED_BLOCK_LAYOUT_SPEC_VERSION 1 @@ -10722,22 +11320,28 @@ typedef void (VKAPI_PTR *PFN_vkGetBufferMemoryRequirements2KHR)(VkDevice device, typedef void (VKAPI_PTR *PFN_vkGetImageSparseMemoryRequirements2KHR)(VkDevice device, const VkImageSparseMemoryRequirementsInfo2* pInfo, uint32_t* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements2* pSparseMemoryRequirements); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetImageMemoryRequirements2KHR( VkDevice device, const VkImageMemoryRequirementsInfo2* pInfo, VkMemoryRequirements2* pMemoryRequirements); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetBufferMemoryRequirements2KHR( VkDevice device, const VkBufferMemoryRequirementsInfo2* pInfo, VkMemoryRequirements2* pMemoryRequirements); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetImageSparseMemoryRequirements2KHR( VkDevice device, const VkImageSparseMemoryRequirementsInfo2* pInfo, uint32_t* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements2* pSparseMemoryRequirements); #endif +#endif // VK_KHR_image_format_list is a preprocessor guard. Do not pass it to API calls. @@ -10776,17 +11380,21 @@ typedef VkResult (VKAPI_PTR *PFN_vkCreateSamplerYcbcrConversionKHR)(VkDevice dev typedef void (VKAPI_PTR *PFN_vkDestroySamplerYcbcrConversionKHR)(VkDevice device, VkSamplerYcbcrConversion ycbcrConversion, const VkAllocationCallbacks* pAllocator); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateSamplerYcbcrConversionKHR( VkDevice device, const VkSamplerYcbcrConversionCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSamplerYcbcrConversion* pYcbcrConversion); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkDestroySamplerYcbcrConversionKHR( VkDevice device, VkSamplerYcbcrConversion ycbcrConversion, const VkAllocationCallbacks* pAllocator); #endif +#endif // VK_KHR_bind_memory2 is a preprocessor guard. Do not pass it to API calls. @@ -10801,25 +11409,29 @@ typedef VkResult (VKAPI_PTR *PFN_vkBindBufferMemory2KHR)(VkDevice device, uint32 typedef VkResult (VKAPI_PTR *PFN_vkBindImageMemory2KHR)(VkDevice device, uint32_t bindInfoCount, const VkBindImageMemoryInfo* pBindInfos); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkBindBufferMemory2KHR( VkDevice device, uint32_t bindInfoCount, const VkBindBufferMemoryInfo* pBindInfos); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkBindImageMemory2KHR( VkDevice device, uint32_t bindInfoCount, const VkBindImageMemoryInfo* pBindInfos); #endif +#endif // VK_KHR_maintenance3 is a preprocessor guard. Do not pass it to API calls. #define VK_KHR_maintenance3 1 #define VK_KHR_MAINTENANCE_3_SPEC_VERSION 1 #define VK_KHR_MAINTENANCE_3_EXTENSION_NAME "VK_KHR_maintenance3" -// VK_KHR_MAINTENANCE3_SPEC_VERSION is a deprecated alias +// VK_KHR_MAINTENANCE3_SPEC_VERSION is a legacy alias #define VK_KHR_MAINTENANCE3_SPEC_VERSION VK_KHR_MAINTENANCE_3_SPEC_VERSION -// VK_KHR_MAINTENANCE3_EXTENSION_NAME is a deprecated alias +// VK_KHR_MAINTENANCE3_EXTENSION_NAME is a legacy alias #define VK_KHR_MAINTENANCE3_EXTENSION_NAME VK_KHR_MAINTENANCE_3_EXTENSION_NAME typedef VkPhysicalDeviceMaintenance3Properties VkPhysicalDeviceMaintenance3PropertiesKHR; @@ -10828,11 +11440,13 @@ typedef VkDescriptorSetLayoutSupport VkDescriptorSetLayoutSupportKHR; typedef void (VKAPI_PTR *PFN_vkGetDescriptorSetLayoutSupportKHR)(VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, VkDescriptorSetLayoutSupport* pSupport); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetDescriptorSetLayoutSupportKHR( VkDevice device, const VkDescriptorSetLayoutCreateInfo* pCreateInfo, VkDescriptorSetLayoutSupport* pSupport); #endif +#endif // VK_KHR_draw_indirect_count is a preprocessor guard. Do not pass it to API calls. @@ -10843,6 +11457,7 @@ typedef void (VKAPI_PTR *PFN_vkCmdDrawIndirectCountKHR)(VkCommandBuffer commandB typedef void (VKAPI_PTR *PFN_vkCmdDrawIndexedIndirectCountKHR)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirectCountKHR( VkCommandBuffer commandBuffer, VkBuffer buffer, @@ -10851,7 +11466,9 @@ VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirectCountKHR( VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirectCountKHR( VkCommandBuffer commandBuffer, VkBuffer buffer, @@ -10861,6 +11478,7 @@ VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirectCountKHR( uint32_t maxDrawCount, uint32_t stride); #endif +#endif // VK_KHR_shader_subgroup_extended_types is a preprocessor guard. Do not pass it to API calls. @@ -11039,20 +11657,26 @@ typedef VkResult (VKAPI_PTR *PFN_vkWaitSemaphoresKHR)(VkDevice device, const VkS typedef VkResult (VKAPI_PTR *PFN_vkSignalSemaphoreKHR)(VkDevice device, const VkSemaphoreSignalInfo* pSignalInfo); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetSemaphoreCounterValueKHR( VkDevice device, VkSemaphore semaphore, uint64_t* pValue); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkWaitSemaphoresKHR( VkDevice device, const VkSemaphoreWaitInfo* pWaitInfo, uint64_t timeout); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkSignalSemaphoreKHR( VkDevice device, const VkSemaphoreSignalInfo* pSignalInfo); #endif +#endif // VK_KHR_vulkan_memory_model is a preprocessor guard. Do not pass it to API calls. @@ -11147,16 +11771,32 @@ typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR)(VkP typedef void (VKAPI_PTR *PFN_vkCmdSetFragmentShadingRateKHR)(VkCommandBuffer commandBuffer, const VkExtent2D* pFragmentSize, const VkFragmentShadingRateCombinerOpKHR combinerOps[2]); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceFragmentShadingRatesKHR( VkPhysicalDevice physicalDevice, uint32_t* pFragmentShadingRateCount, VkPhysicalDeviceFragmentShadingRateKHR* pFragmentShadingRates); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetFragmentShadingRateKHR( VkCommandBuffer commandBuffer, const VkExtent2D* pFragmentSize, const VkFragmentShadingRateCombinerOpKHR combinerOps[2]); #endif +#endif + + +// VK_KHR_shader_constant_data is a preprocessor guard. Do not pass it to API calls. +#define VK_KHR_shader_constant_data 1 +#define VK_KHR_SHADER_CONSTANT_DATA_SPEC_VERSION 1 +#define VK_KHR_SHADER_CONSTANT_DATA_EXTENSION_NAME "VK_KHR_shader_constant_data" +typedef struct VkPhysicalDeviceShaderConstantDataFeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 shaderConstantData; +} VkPhysicalDeviceShaderConstantDataFeaturesKHR; + // VK_KHR_dynamic_rendering_local_read is a preprocessor guard. Do not pass it to API calls. @@ -11173,14 +11813,43 @@ typedef void (VKAPI_PTR *PFN_vkCmdSetRenderingAttachmentLocationsKHR)(VkCommandB typedef void (VKAPI_PTR *PFN_vkCmdSetRenderingInputAttachmentIndicesKHR)(VkCommandBuffer commandBuffer, const VkRenderingInputAttachmentIndexInfo* pInputAttachmentIndexInfo); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetRenderingAttachmentLocationsKHR( VkCommandBuffer commandBuffer, const VkRenderingAttachmentLocationInfo* pLocationInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetRenderingInputAttachmentIndicesKHR( VkCommandBuffer commandBuffer, const VkRenderingInputAttachmentIndexInfo* pInputAttachmentIndexInfo); #endif +#endif + + +// VK_KHR_shader_abort is a preprocessor guard. Do not pass it to API calls. +#define VK_KHR_shader_abort 1 +#define VK_KHR_SHADER_ABORT_SPEC_VERSION 1 +#define VK_KHR_SHADER_ABORT_EXTENSION_NAME "VK_KHR_shader_abort" +typedef struct VkPhysicalDeviceShaderAbortFeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 shaderAbort; +} VkPhysicalDeviceShaderAbortFeaturesKHR; + +typedef struct VkDeviceFaultShaderAbortMessageInfoKHR { + VkStructureType sType; + void* pNext; + uint64_t messageDataSize; + void* pMessageData; +} VkDeviceFaultShaderAbortMessageInfoKHR; + +typedef struct VkPhysicalDeviceShaderAbortPropertiesKHR { + VkStructureType sType; + void* pNext; + uint64_t maxShaderAbortMessageSize; +} VkPhysicalDeviceShaderAbortPropertiesKHR; + // VK_KHR_shader_quad_control is a preprocessor guard. Do not pass it to API calls. @@ -11207,7 +11876,7 @@ typedef struct VkPhysicalDeviceShaderQuadControlFeaturesKHR { #define VK_KHR_SURFACE_PROTECTED_CAPABILITIES_EXTENSION_NAME "VK_KHR_surface_protected_capabilities" typedef struct VkSurfaceProtectedCapabilitiesKHR { VkStructureType sType; - const void* pNext; + void* pNext; VkBool32 supportsProtected; } VkSurfaceProtectedCapabilitiesKHR; @@ -11238,12 +11907,14 @@ typedef struct VkPhysicalDevicePresentWaitFeaturesKHR { typedef VkResult (VKAPI_PTR *PFN_vkWaitForPresentKHR)(VkDevice device, VkSwapchainKHR swapchain, uint64_t presentId, uint64_t timeout); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkWaitForPresentKHR( VkDevice device, VkSwapchainKHR swapchain, uint64_t presentId, uint64_t timeout); #endif +#endif // VK_KHR_uniform_buffer_standard_layout is a preprocessor guard. Do not pass it to API calls. @@ -11273,18 +11944,24 @@ typedef uint64_t (VKAPI_PTR *PFN_vkGetBufferOpaqueCaptureAddressKHR)(VkDevice de typedef uint64_t (VKAPI_PTR *PFN_vkGetDeviceMemoryOpaqueCaptureAddressKHR)(VkDevice device, const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkDeviceAddress VKAPI_CALL vkGetBufferDeviceAddressKHR( VkDevice device, const VkBufferDeviceAddressInfo* pInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR uint64_t VKAPI_CALL vkGetBufferOpaqueCaptureAddressKHR( VkDevice device, const VkBufferDeviceAddressInfo* pInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR uint64_t VKAPI_CALL vkGetDeviceMemoryOpaqueCaptureAddressKHR( VkDevice device, const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo); #endif +#endif // VK_KHR_deferred_host_operations is a preprocessor guard. Do not pass it to API calls. @@ -11299,28 +11976,38 @@ typedef VkResult (VKAPI_PTR *PFN_vkGetDeferredOperationResultKHR)(VkDevice devic typedef VkResult (VKAPI_PTR *PFN_vkDeferredOperationJoinKHR)(VkDevice device, VkDeferredOperationKHR operation); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateDeferredOperationKHR( VkDevice device, const VkAllocationCallbacks* pAllocator, VkDeferredOperationKHR* pDeferredOperation); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkDestroyDeferredOperationKHR( VkDevice device, VkDeferredOperationKHR operation, const VkAllocationCallbacks* pAllocator); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR uint32_t VKAPI_CALL vkGetDeferredOperationMaxConcurrencyKHR( VkDevice device, VkDeferredOperationKHR operation); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetDeferredOperationResultKHR( VkDevice device, VkDeferredOperationKHR operation); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkDeferredOperationJoinKHR( VkDevice device, VkDeferredOperationKHR operation); #endif +#endif // VK_KHR_pipeline_executable_properties is a preprocessor guard. Do not pass it to API calls. @@ -11394,24 +12081,30 @@ typedef VkResult (VKAPI_PTR *PFN_vkGetPipelineExecutableStatisticsKHR)(VkDevice typedef VkResult (VKAPI_PTR *PFN_vkGetPipelineExecutableInternalRepresentationsKHR)(VkDevice device, const VkPipelineExecutableInfoKHR* pExecutableInfo, uint32_t* pInternalRepresentationCount, VkPipelineExecutableInternalRepresentationKHR* pInternalRepresentations); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPipelineExecutablePropertiesKHR( VkDevice device, const VkPipelineInfoKHR* pPipelineInfo, uint32_t* pExecutableCount, VkPipelineExecutablePropertiesKHR* pProperties); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPipelineExecutableStatisticsKHR( VkDevice device, const VkPipelineExecutableInfoKHR* pExecutableInfo, uint32_t* pStatisticCount, VkPipelineExecutableStatisticKHR* pStatistics); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPipelineExecutableInternalRepresentationsKHR( VkDevice device, const VkPipelineExecutableInfoKHR* pExecutableInfo, uint32_t* pInternalRepresentationCount, VkPipelineExecutableInternalRepresentationKHR* pInternalRepresentations); #endif +#endif // VK_KHR_map_memory2 is a preprocessor guard. Do not pass it to API calls. @@ -11430,15 +12123,19 @@ typedef VkResult (VKAPI_PTR *PFN_vkMapMemory2KHR)(VkDevice device, const VkMemor typedef VkResult (VKAPI_PTR *PFN_vkUnmapMemory2KHR)(VkDevice device, const VkMemoryUnmapInfo* pMemoryUnmapInfo); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkMapMemory2KHR( VkDevice device, const VkMemoryMapInfo* pMemoryMapInfo, void** ppData); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkUnmapMemory2KHR( VkDevice device, const VkMemoryUnmapInfo* pMemoryUnmapInfo); #endif +#endif // VK_KHR_shader_integer_dot_product is a preprocessor guard. Do not pass it to API calls. @@ -11504,6 +12201,7 @@ typedef enum VkVideoEncodeTuningModeKHR { } VkVideoEncodeTuningModeKHR; typedef enum VkVideoEncodeFlagBitsKHR { + VK_VIDEO_ENCODE_INTRA_REFRESH_BIT_KHR = 0x00000004, VK_VIDEO_ENCODE_WITH_QUANTIZATION_DELTA_MAP_BIT_KHR = 0x00000001, VK_VIDEO_ENCODE_WITH_EMPHASIS_MAP_BIT_KHR = 0x00000002, VK_VIDEO_ENCODE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF @@ -11532,6 +12230,13 @@ typedef enum VkVideoEncodeFeedbackFlagBitsKHR { VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BUFFER_OFFSET_BIT_KHR = 0x00000001, VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BYTES_WRITTEN_BIT_KHR = 0x00000002, VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_HAS_OVERRIDES_BIT_KHR = 0x00000004, + VK_VIDEO_ENCODE_FEEDBACK_AVERAGE_QUANTIZATION_BIT_KHR = 0x00000008, + VK_VIDEO_ENCODE_FEEDBACK_MIN_QUANTIZATION_BIT_KHR = 0x00000010, + VK_VIDEO_ENCODE_FEEDBACK_MAX_QUANTIZATION_BIT_KHR = 0x00000020, + VK_VIDEO_ENCODE_FEEDBACK_INTRA_PIXELS_BIT_KHR = 0x00000040, + VK_VIDEO_ENCODE_FEEDBACK_INTER_PIXELS_BIT_KHR = 0x00000080, + VK_VIDEO_ENCODE_FEEDBACK_SKIPPED_PIXELS_BIT_KHR = 0x00000100, + VK_VIDEO_ENCODE_FEEDBACK_PICTURE_PARTITION_COUNT_BIT_KHR = 0x00000200, VK_VIDEO_ENCODE_FEEDBACK_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF } VkVideoEncodeFeedbackFlagBitsKHR; typedef VkFlags VkVideoEncodeFeedbackFlagsKHR; @@ -11652,22 +12357,28 @@ typedef VkResult (VKAPI_PTR *PFN_vkGetEncodedVideoSessionParametersKHR)(VkDevice typedef void (VKAPI_PTR *PFN_vkCmdEncodeVideoKHR)(VkCommandBuffer commandBuffer, const VkVideoEncodeInfoKHR* pEncodeInfo); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR( VkPhysicalDevice physicalDevice, const VkPhysicalDeviceVideoEncodeQualityLevelInfoKHR* pQualityLevelInfo, VkVideoEncodeQualityLevelPropertiesKHR* pQualityLevelProperties); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetEncodedVideoSessionParametersKHR( VkDevice device, const VkVideoEncodeSessionParametersGetInfoKHR* pVideoSessionParametersInfo, VkVideoEncodeSessionParametersFeedbackInfoKHR* pFeedbackInfo, size_t* pDataSize, void* pData); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdEncodeVideoKHR( VkCommandBuffer commandBuffer, const VkVideoEncodeInfoKHR* pEncodeInfo); #endif +#endif // VK_KHR_synchronization2 is a preprocessor guard. Do not pass it to API calls. @@ -11707,41 +12418,423 @@ typedef void (VKAPI_PTR *PFN_vkCmdResetEvent2KHR)(VkCommandBuffer typedef void (VKAPI_PTR *PFN_vkCmdWaitEvents2KHR)(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent* pEvents, const VkDependencyInfo* pDependencyInfos); typedef void (VKAPI_PTR *PFN_vkCmdPipelineBarrier2KHR)(VkCommandBuffer commandBuffer, const VkDependencyInfo* pDependencyInfo); typedef void (VKAPI_PTR *PFN_vkCmdWriteTimestamp2KHR)(VkCommandBuffer commandBuffer, VkPipelineStageFlags2 stage, VkQueryPool queryPool, uint32_t query); -typedef VkResult (VKAPI_PTR *PFN_vkQueueSubmit2KHR)(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2* pSubmits, VkFence fence); +typedef VkResult (VKAPI_PTR *PFN_vkQueueSubmit2KHR)(VkQueue queue, uint32_t submitCount, const VkSubmitInfo2* pSubmits, VkFence fence); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetEvent2KHR( VkCommandBuffer commandBuffer, VkEvent event, const VkDependencyInfo* pDependencyInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdResetEvent2KHR( VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags2 stageMask); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdWaitEvents2KHR( VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent* pEvents, const VkDependencyInfo* pDependencyInfos); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdPipelineBarrier2KHR( VkCommandBuffer commandBuffer, const VkDependencyInfo* pDependencyInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdWriteTimestamp2KHR( VkCommandBuffer commandBuffer, VkPipelineStageFlags2 stage, VkQueryPool queryPool, uint32_t query); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkQueueSubmit2KHR( VkQueue queue, uint32_t submitCount, const VkSubmitInfo2* pSubmits, VkFence fence); #endif +#endif + + +// VK_KHR_device_address_commands is a preprocessor guard. Do not pass it to API calls. +#define VK_KHR_device_address_commands 1 +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkAccelerationStructureKHR) +#define VK_KHR_DEVICE_ADDRESS_COMMANDS_SPEC_VERSION 1 +#define VK_KHR_DEVICE_ADDRESS_COMMANDS_EXTENSION_NAME "VK_KHR_device_address_commands" + +typedef enum VkAccelerationStructureTypeKHR { + VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR = 0, + VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR = 1, + VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR = 2, + VK_ACCELERATION_STRUCTURE_TYPE_OPACITY_MICROMAP_KHR = 1000623000, + VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR, + VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR, + VK_ACCELERATION_STRUCTURE_TYPE_MAX_ENUM_KHR = 0x7FFFFFFF +} VkAccelerationStructureTypeKHR; + +typedef enum VkAddressCommandFlagBitsKHR { + VK_ADDRESS_COMMAND_PROTECTED_BIT_KHR = 0x00000001, + VK_ADDRESS_COMMAND_FULLY_BOUND_BIT_KHR = 0x00000002, + VK_ADDRESS_COMMAND_STORAGE_BUFFER_USAGE_BIT_KHR = 0x00000004, + VK_ADDRESS_COMMAND_UNKNOWN_STORAGE_BUFFER_USAGE_BIT_KHR = 0x00000008, + VK_ADDRESS_COMMAND_TRANSFORM_FEEDBACK_BUFFER_USAGE_BIT_KHR = 0x00000010, + VK_ADDRESS_COMMAND_UNKNOWN_TRANSFORM_FEEDBACK_BUFFER_USAGE_BIT_KHR = 0x00000020, + VK_ADDRESS_COMMAND_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkAddressCommandFlagBitsKHR; +typedef VkFlags VkAddressCommandFlagsKHR; + +typedef enum VkConditionalRenderingFlagBitsEXT { + VK_CONDITIONAL_RENDERING_INVERTED_BIT_EXT = 0x00000001, + VK_CONDITIONAL_RENDERING_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF +} VkConditionalRenderingFlagBitsEXT; +typedef VkFlags VkConditionalRenderingFlagsEXT; + +typedef enum VkAccelerationStructureCreateFlagBitsKHR { + VK_ACCELERATION_STRUCTURE_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR = 0x00000001, + VK_ACCELERATION_STRUCTURE_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT = 0x00000008, + VK_ACCELERATION_STRUCTURE_CREATE_MOTION_BIT_NV = 0x00000004, + VK_ACCELERATION_STRUCTURE_CREATE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkAccelerationStructureCreateFlagBitsKHR; +typedef VkFlags VkAccelerationStructureCreateFlagsKHR; +typedef struct VkDeviceAddressRangeKHR { + VkDeviceAddress address; + VkDeviceSize size; +} VkDeviceAddressRangeKHR; + +typedef struct VkStridedDeviceAddressRangeKHR { + VkDeviceAddress address; + VkDeviceSize size; + VkDeviceSize stride; +} VkStridedDeviceAddressRangeKHR; + +typedef struct VkDeviceMemoryCopyKHR { + VkStructureType sType; + const void* pNext; + VkDeviceAddressRangeKHR srcRange; + VkAddressCommandFlagsKHR srcFlags; + VkDeviceAddressRangeKHR dstRange; + VkAddressCommandFlagsKHR dstFlags; +} VkDeviceMemoryCopyKHR; + +typedef struct VkCopyDeviceMemoryInfoKHR { + VkStructureType sType; + const void* pNext; + uint32_t regionCount; + const VkDeviceMemoryCopyKHR* pRegions; +} VkCopyDeviceMemoryInfoKHR; + +typedef struct VkDeviceMemoryImageCopyKHR { + VkStructureType sType; + const void* pNext; + VkDeviceAddressRangeKHR addressRange; + VkAddressCommandFlagsKHR addressFlags; + uint32_t addressRowLength; + uint32_t addressImageHeight; + VkImageSubresourceLayers imageSubresource; + VkImageLayout imageLayout; + VkOffset3D imageOffset; + VkExtent3D imageExtent; +} VkDeviceMemoryImageCopyKHR; + +typedef struct VkCopyDeviceMemoryImageInfoKHR { + VkStructureType sType; + const void* pNext; + VkImage image; + uint32_t regionCount; + const VkDeviceMemoryImageCopyKHR* pRegions; +} VkCopyDeviceMemoryImageInfoKHR; + +typedef struct VkMemoryRangeBarrierKHR { + VkStructureType sType; + const void* pNext; + VkPipelineStageFlags2 srcStageMask; + VkAccessFlags2 srcAccessMask; + VkPipelineStageFlags2 dstStageMask; + VkAccessFlags2 dstAccessMask; + uint32_t srcQueueFamilyIndex; + uint32_t dstQueueFamilyIndex; + VkDeviceAddressRangeKHR addressRange; + VkAddressCommandFlagsKHR addressFlags; +} VkMemoryRangeBarrierKHR; + +typedef struct VkMemoryRangeBarriersInfoKHR { + VkStructureType sType; + const void* pNext; + uint32_t memoryRangeBarrierCount; + const VkMemoryRangeBarrierKHR* pMemoryRangeBarriers; +} VkMemoryRangeBarriersInfoKHR; + +typedef struct VkPhysicalDeviceDeviceAddressCommandsFeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 deviceAddressCommands; +} VkPhysicalDeviceDeviceAddressCommandsFeaturesKHR; + +typedef struct VkBindIndexBuffer3InfoKHR { + VkStructureType sType; + const void* pNext; + VkDeviceAddressRangeKHR addressRange; + VkAddressCommandFlagsKHR addressFlags; + VkIndexType indexType; +} VkBindIndexBuffer3InfoKHR; + +typedef struct VkBindVertexBuffer3InfoKHR { + VkStructureType sType; + const void* pNext; + VkBool32 setStride; + VkStridedDeviceAddressRangeKHR addressRange; + VkAddressCommandFlagsKHR addressFlags; +} VkBindVertexBuffer3InfoKHR; + +typedef struct VkDrawIndirect2InfoKHR { + VkStructureType sType; + const void* pNext; + VkStridedDeviceAddressRangeKHR addressRange; + VkAddressCommandFlagsKHR addressFlags; + uint32_t drawCount; +} VkDrawIndirect2InfoKHR; + +typedef struct VkDrawIndirectCount2InfoKHR { + VkStructureType sType; + const void* pNext; + VkStridedDeviceAddressRangeKHR addressRange; + VkAddressCommandFlagsKHR addressFlags; + VkDeviceAddressRangeKHR countAddressRange; + VkAddressCommandFlagsKHR countAddressFlags; + uint32_t maxDrawCount; +} VkDrawIndirectCount2InfoKHR; + +typedef struct VkDispatchIndirect2InfoKHR { + VkStructureType sType; + const void* pNext; + VkDeviceAddressRangeKHR addressRange; + VkAddressCommandFlagsKHR addressFlags; +} VkDispatchIndirect2InfoKHR; + +typedef struct VkConditionalRenderingBeginInfo2EXT { + VkStructureType sType; + const void* pNext; + VkDeviceAddressRangeKHR addressRange; + VkAddressCommandFlagsKHR addressFlags; + VkConditionalRenderingFlagsEXT flags; +} VkConditionalRenderingBeginInfo2EXT; + +typedef struct VkBindTransformFeedbackBuffer2InfoEXT { + VkStructureType sType; + const void* pNext; + VkDeviceAddressRangeKHR addressRange; + VkAddressCommandFlagsKHR addressFlags; +} VkBindTransformFeedbackBuffer2InfoEXT; + +typedef struct VkMemoryMarkerInfoAMD { + VkStructureType sType; + const void* pNext; + VkPipelineStageFlags2KHR stage; + VkDeviceAddressRangeKHR dstRange; + VkAddressCommandFlagsKHR dstFlags; + uint32_t marker; +} VkMemoryMarkerInfoAMD; + +typedef struct VkAccelerationStructureCreateInfo2KHR { + VkStructureType sType; + const void* pNext; + VkAccelerationStructureCreateFlagsKHR createFlags; + VkDeviceAddressRangeKHR addressRange; + VkAddressCommandFlagsKHR addressFlags; + VkAccelerationStructureTypeKHR type; +} VkAccelerationStructureCreateInfo2KHR; + +typedef void (VKAPI_PTR *PFN_vkCmdBindIndexBuffer3KHR)(VkCommandBuffer commandBuffer, const VkBindIndexBuffer3InfoKHR* pInfo); +typedef void (VKAPI_PTR *PFN_vkCmdBindVertexBuffers3KHR)(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount, const VkBindVertexBuffer3InfoKHR* pBindingInfos); +typedef void (VKAPI_PTR *PFN_vkCmdDrawIndirect2KHR)(VkCommandBuffer commandBuffer, const VkDrawIndirect2InfoKHR* pInfo); +typedef void (VKAPI_PTR *PFN_vkCmdDrawIndexedIndirect2KHR)(VkCommandBuffer commandBuffer, const VkDrawIndirect2InfoKHR* pInfo); +typedef void (VKAPI_PTR *PFN_vkCmdDispatchIndirect2KHR)(VkCommandBuffer commandBuffer, const VkDispatchIndirect2InfoKHR* pInfo); +typedef void (VKAPI_PTR *PFN_vkCmdCopyMemoryKHR)(VkCommandBuffer commandBuffer, const VkCopyDeviceMemoryInfoKHR* pCopyMemoryInfo); +typedef void (VKAPI_PTR *PFN_vkCmdCopyMemoryToImageKHR)(VkCommandBuffer commandBuffer, const VkCopyDeviceMemoryImageInfoKHR* pCopyMemoryInfo); +typedef void (VKAPI_PTR *PFN_vkCmdCopyImageToMemoryKHR)(VkCommandBuffer commandBuffer, const VkCopyDeviceMemoryImageInfoKHR* pCopyMemoryInfo); +typedef void (VKAPI_PTR *PFN_vkCmdUpdateMemoryKHR)(VkCommandBuffer commandBuffer, const VkDeviceAddressRangeKHR* pDstRange, VkAddressCommandFlagsKHR dstFlags, VkDeviceSize dataSize, const void* pData); +typedef void (VKAPI_PTR *PFN_vkCmdFillMemoryKHR)(VkCommandBuffer commandBuffer, const VkDeviceAddressRangeKHR* pDstRange, VkAddressCommandFlagsKHR dstFlags, uint32_t data); +typedef void (VKAPI_PTR *PFN_vkCmdCopyQueryPoolResultsToMemoryKHR)(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, const VkStridedDeviceAddressRangeKHR* pDstRange, VkAddressCommandFlagsKHR dstFlags, VkQueryResultFlags queryResultFlags); +typedef void (VKAPI_PTR *PFN_vkCmdDrawIndirectCount2KHR)(VkCommandBuffer commandBuffer, const VkDrawIndirectCount2InfoKHR* pInfo); +typedef void (VKAPI_PTR *PFN_vkCmdDrawIndexedIndirectCount2KHR)(VkCommandBuffer commandBuffer, const VkDrawIndirectCount2InfoKHR* pInfo); +typedef void (VKAPI_PTR *PFN_vkCmdBeginConditionalRendering2EXT)(VkCommandBuffer commandBuffer, const VkConditionalRenderingBeginInfo2EXT* pConditionalRenderingBegin); +typedef void (VKAPI_PTR *PFN_vkCmdBindTransformFeedbackBuffers2EXT)(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount, const VkBindTransformFeedbackBuffer2InfoEXT* pBindingInfos); +typedef void (VKAPI_PTR *PFN_vkCmdBeginTransformFeedback2EXT)(VkCommandBuffer commandBuffer, uint32_t firstCounterRange, uint32_t counterRangeCount, const VkBindTransformFeedbackBuffer2InfoEXT* pCounterInfos); +typedef void (VKAPI_PTR *PFN_vkCmdEndTransformFeedback2EXT)(VkCommandBuffer commandBuffer, uint32_t firstCounterRange, uint32_t counterRangeCount, const VkBindTransformFeedbackBuffer2InfoEXT* pCounterInfos); +typedef void (VKAPI_PTR *PFN_vkCmdDrawIndirectByteCount2EXT)(VkCommandBuffer commandBuffer, uint32_t instanceCount, uint32_t firstInstance, const VkBindTransformFeedbackBuffer2InfoEXT* pCounterInfo, uint32_t counterOffset, uint32_t vertexStride); +typedef void (VKAPI_PTR *PFN_vkCmdDrawMeshTasksIndirect2EXT)(VkCommandBuffer commandBuffer, const VkDrawIndirect2InfoKHR* pInfo); +typedef void (VKAPI_PTR *PFN_vkCmdDrawMeshTasksIndirectCount2EXT)(VkCommandBuffer commandBuffer, const VkDrawIndirectCount2InfoKHR* pInfo); +typedef void (VKAPI_PTR *PFN_vkCmdWriteMarkerToMemoryAMD)(VkCommandBuffer commandBuffer, const VkMemoryMarkerInfoAMD* pInfo); +typedef VkResult (VKAPI_PTR *PFN_vkCreateAccelerationStructure2KHR)(VkDevice device, const VkAccelerationStructureCreateInfo2KHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkAccelerationStructureKHR* pAccelerationStructure); + +#ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdBindIndexBuffer3KHR( + VkCommandBuffer commandBuffer, + const VkBindIndexBuffer3InfoKHR* pInfo); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdBindVertexBuffers3KHR( + VkCommandBuffer commandBuffer, + uint32_t firstBinding, + uint32_t bindingCount, + const VkBindVertexBuffer3InfoKHR* pBindingInfos); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirect2KHR( + VkCommandBuffer commandBuffer, + const VkDrawIndirect2InfoKHR* pInfo); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirect2KHR( + VkCommandBuffer commandBuffer, + const VkDrawIndirect2InfoKHR* pInfo); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdDispatchIndirect2KHR( + VkCommandBuffer commandBuffer, + const VkDispatchIndirect2InfoKHR* pInfo); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdCopyMemoryKHR( + VkCommandBuffer commandBuffer, + const VkCopyDeviceMemoryInfoKHR* pCopyMemoryInfo); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdCopyMemoryToImageKHR( + VkCommandBuffer commandBuffer, + const VkCopyDeviceMemoryImageInfoKHR* pCopyMemoryInfo); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToMemoryKHR( + VkCommandBuffer commandBuffer, + const VkCopyDeviceMemoryImageInfoKHR* pCopyMemoryInfo); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdUpdateMemoryKHR( + VkCommandBuffer commandBuffer, + const VkDeviceAddressRangeKHR* pDstRange, + VkAddressCommandFlagsKHR dstFlags, + VkDeviceSize dataSize, + const void* pData); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdFillMemoryKHR( + VkCommandBuffer commandBuffer, + const VkDeviceAddressRangeKHR* pDstRange, + VkAddressCommandFlagsKHR dstFlags, + uint32_t data); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdCopyQueryPoolResultsToMemoryKHR( + VkCommandBuffer commandBuffer, + VkQueryPool queryPool, + uint32_t firstQuery, + uint32_t queryCount, + const VkStridedDeviceAddressRangeKHR* pDstRange, + VkAddressCommandFlagsKHR dstFlags, + VkQueryResultFlags queryResultFlags); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirectCount2KHR( + VkCommandBuffer commandBuffer, + const VkDrawIndirectCount2InfoKHR* pInfo); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirectCount2KHR( + VkCommandBuffer commandBuffer, + const VkDrawIndirectCount2InfoKHR* pInfo); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdBeginConditionalRendering2EXT( + VkCommandBuffer commandBuffer, + const VkConditionalRenderingBeginInfo2EXT* pConditionalRenderingBegin); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdBindTransformFeedbackBuffers2EXT( + VkCommandBuffer commandBuffer, + uint32_t firstBinding, + uint32_t bindingCount, + const VkBindTransformFeedbackBuffer2InfoEXT* pBindingInfos); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdBeginTransformFeedback2EXT( + VkCommandBuffer commandBuffer, + uint32_t firstCounterRange, + uint32_t counterRangeCount, + const VkBindTransformFeedbackBuffer2InfoEXT* pCounterInfos); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdEndTransformFeedback2EXT( + VkCommandBuffer commandBuffer, + uint32_t firstCounterRange, + uint32_t counterRangeCount, + const VkBindTransformFeedbackBuffer2InfoEXT* pCounterInfos); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirectByteCount2EXT( + VkCommandBuffer commandBuffer, + uint32_t instanceCount, + uint32_t firstInstance, + const VkBindTransformFeedbackBuffer2InfoEXT* pCounterInfo, + uint32_t counterOffset, + uint32_t vertexStride); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdDrawMeshTasksIndirect2EXT( + VkCommandBuffer commandBuffer, + const VkDrawIndirect2InfoKHR* pInfo); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdDrawMeshTasksIndirectCount2EXT( + VkCommandBuffer commandBuffer, + const VkDrawIndirectCount2InfoKHR* pInfo); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdWriteMarkerToMemoryAMD( + VkCommandBuffer commandBuffer, + const VkMemoryMarkerInfoAMD* pInfo); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateAccelerationStructure2KHR( + VkDevice device, + const VkAccelerationStructureCreateInfo2KHR* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkAccelerationStructureKHR* pAccelerationStructure); +#endif +#endif // VK_KHR_fragment_shader_barycentric is a preprocessor guard. Do not pass it to API calls. @@ -11831,30 +12924,42 @@ typedef void (VKAPI_PTR *PFN_vkCmdBlitImage2KHR)(VkCommandBuffer commandBuffer, typedef void (VKAPI_PTR *PFN_vkCmdResolveImage2KHR)(VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdCopyBuffer2KHR( VkCommandBuffer commandBuffer, const VkCopyBufferInfo2* pCopyBufferInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdCopyImage2KHR( VkCommandBuffer commandBuffer, const VkCopyImageInfo2* pCopyImageInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdCopyBufferToImage2KHR( VkCommandBuffer commandBuffer, const VkCopyBufferToImageInfo2* pCopyBufferToImageInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdCopyImageToBuffer2KHR( VkCommandBuffer commandBuffer, const VkCopyImageToBufferInfo2* pCopyImageToBufferInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdBlitImage2KHR( VkCommandBuffer commandBuffer, const VkBlitImageInfo2* pBlitImageInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdResolveImage2KHR( VkCommandBuffer commandBuffer, const VkResolveImageInfo2* pResolveImageInfo); #endif +#endif // VK_KHR_format_feature_flags2 is a preprocessor guard. Do not pass it to API calls. @@ -11900,10 +13005,24 @@ typedef struct VkTraceRaysIndirectCommand2KHR { typedef void (VKAPI_PTR *PFN_vkCmdTraceRaysIndirect2KHR)(VkCommandBuffer commandBuffer, VkDeviceAddress indirectDeviceAddress); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdTraceRaysIndirect2KHR( VkCommandBuffer commandBuffer, VkDeviceAddress indirectDeviceAddress); #endif +#endif + + +// VK_KHR_shader_untyped_pointers is a preprocessor guard. Do not pass it to API calls. +#define VK_KHR_shader_untyped_pointers 1 +#define VK_KHR_SHADER_UNTYPED_POINTERS_SPEC_VERSION 1 +#define VK_KHR_SHADER_UNTYPED_POINTERS_EXTENSION_NAME "VK_KHR_shader_untyped_pointers" +typedef struct VkPhysicalDeviceShaderUntypedPointersFeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 shaderUntypedPointers; +} VkPhysicalDeviceShaderUntypedPointersFeaturesKHR; + // VK_KHR_portability_enumeration is a preprocessor guard. Do not pass it to API calls. @@ -11929,22 +13048,28 @@ typedef void (VKAPI_PTR *PFN_vkGetDeviceImageMemoryRequirementsKHR)(VkDevice dev typedef void (VKAPI_PTR *PFN_vkGetDeviceImageSparseMemoryRequirementsKHR)(VkDevice device, const VkDeviceImageMemoryRequirements* pInfo, uint32_t* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements2* pSparseMemoryRequirements); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetDeviceBufferMemoryRequirementsKHR( VkDevice device, const VkDeviceBufferMemoryRequirements* pInfo, VkMemoryRequirements2* pMemoryRequirements); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetDeviceImageMemoryRequirementsKHR( VkDevice device, const VkDeviceImageMemoryRequirements* pInfo, VkMemoryRequirements2* pMemoryRequirements); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetDeviceImageSparseMemoryRequirementsKHR( VkDevice device, const VkDeviceImageMemoryRequirements* pInfo, uint32_t* pSparseMemoryRequirementCount, VkSparseImageMemoryRequirements2* pSparseMemoryRequirements); #endif +#endif // VK_KHR_shader_subgroup_rotate is a preprocessor guard. Do not pass it to API calls. @@ -12001,29 +13126,97 @@ typedef void (VKAPI_PTR *PFN_vkGetDeviceImageSubresourceLayoutKHR)(VkDevice devi typedef void (VKAPI_PTR *PFN_vkGetImageSubresourceLayout2KHR)(VkDevice device, VkImage image, const VkImageSubresource2* pSubresource, VkSubresourceLayout2* pLayout); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdBindIndexBuffer2KHR( VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkDeviceSize size, VkIndexType indexType); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetRenderingAreaGranularityKHR( VkDevice device, const VkRenderingAreaInfo* pRenderingAreaInfo, VkExtent2D* pGranularity); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetDeviceImageSubresourceLayoutKHR( VkDevice device, const VkDeviceImageSubresourceInfo* pInfo, VkSubresourceLayout2* pLayout); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetImageSubresourceLayout2KHR( VkDevice device, VkImage image, const VkImageSubresource2* pSubresource, VkSubresourceLayout2* pLayout); #endif +#endif + + +// VK_KHR_present_id2 is a preprocessor guard. Do not pass it to API calls. +#define VK_KHR_present_id2 1 +#define VK_KHR_PRESENT_ID_2_SPEC_VERSION 1 +#define VK_KHR_PRESENT_ID_2_EXTENSION_NAME "VK_KHR_present_id2" +typedef struct VkSurfaceCapabilitiesPresentId2KHR { + VkStructureType sType; + void* pNext; + VkBool32 presentId2Supported; +} VkSurfaceCapabilitiesPresentId2KHR; + +typedef struct VkPresentId2KHR { + VkStructureType sType; + const void* pNext; + uint32_t swapchainCount; + const uint64_t* pPresentIds; +} VkPresentId2KHR; + +typedef struct VkPhysicalDevicePresentId2FeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 presentId2; +} VkPhysicalDevicePresentId2FeaturesKHR; + + + +// VK_KHR_present_wait2 is a preprocessor guard. Do not pass it to API calls. +#define VK_KHR_present_wait2 1 +#define VK_KHR_PRESENT_WAIT_2_SPEC_VERSION 1 +#define VK_KHR_PRESENT_WAIT_2_EXTENSION_NAME "VK_KHR_present_wait2" +typedef struct VkSurfaceCapabilitiesPresentWait2KHR { + VkStructureType sType; + void* pNext; + VkBool32 presentWait2Supported; +} VkSurfaceCapabilitiesPresentWait2KHR; + +typedef struct VkPhysicalDevicePresentWait2FeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 presentWait2; +} VkPhysicalDevicePresentWait2FeaturesKHR; + +typedef struct VkPresentWait2InfoKHR { + VkStructureType sType; + const void* pNext; + uint64_t presentId; + uint64_t timeout; +} VkPresentWait2InfoKHR; + +typedef VkResult (VKAPI_PTR *PFN_vkWaitForPresent2KHR)(VkDevice device, VkSwapchainKHR swapchain, const VkPresentWait2InfoKHR* pPresentWait2Info); + +#ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkWaitForPresent2KHR( + VkDevice device, + VkSwapchainKHR swapchain, + const VkPresentWait2InfoKHR* pPresentWait2Info); +#endif +#endif // VK_KHR_ray_tracing_position_fetch is a preprocessor guard. Do not pass it to API calls. @@ -12130,34 +13323,165 @@ typedef VkResult (VKAPI_PTR *PFN_vkGetPipelineBinaryDataKHR)(VkDevice device, co typedef VkResult (VKAPI_PTR *PFN_vkReleaseCapturedPipelineDataKHR)(VkDevice device, const VkReleaseCapturedPipelineDataInfoKHR* pInfo, const VkAllocationCallbacks* pAllocator); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreatePipelineBinariesKHR( VkDevice device, const VkPipelineBinaryCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPipelineBinaryHandlesInfoKHR* pBinaries); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkDestroyPipelineBinaryKHR( VkDevice device, VkPipelineBinaryKHR pipelineBinary, const VkAllocationCallbacks* pAllocator); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPipelineKeyKHR( VkDevice device, const VkPipelineCreateInfoKHR* pPipelineCreateInfo, VkPipelineBinaryKeyKHR* pPipelineKey); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPipelineBinaryDataKHR( VkDevice device, const VkPipelineBinaryDataInfoKHR* pInfo, VkPipelineBinaryKeyKHR* pPipelineBinaryKey, size_t* pPipelineBinaryDataSize, void* pPipelineBinaryData); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkReleaseCapturedPipelineDataKHR( VkDevice device, const VkReleaseCapturedPipelineDataInfoKHR* pInfo, const VkAllocationCallbacks* pAllocator); #endif +#endif + + +// VK_KHR_surface_maintenance1 is a preprocessor guard. Do not pass it to API calls. +#define VK_KHR_surface_maintenance1 1 +#define VK_KHR_SURFACE_MAINTENANCE_1_SPEC_VERSION 1 +#define VK_KHR_SURFACE_MAINTENANCE_1_EXTENSION_NAME "VK_KHR_surface_maintenance1" + +typedef enum VkPresentScalingFlagBitsKHR { + VK_PRESENT_SCALING_ONE_TO_ONE_BIT_KHR = 0x00000001, + VK_PRESENT_SCALING_ASPECT_RATIO_STRETCH_BIT_KHR = 0x00000002, + VK_PRESENT_SCALING_STRETCH_BIT_KHR = 0x00000004, + VK_PRESENT_SCALING_ONE_TO_ONE_BIT_EXT = VK_PRESENT_SCALING_ONE_TO_ONE_BIT_KHR, + VK_PRESENT_SCALING_ASPECT_RATIO_STRETCH_BIT_EXT = VK_PRESENT_SCALING_ASPECT_RATIO_STRETCH_BIT_KHR, + VK_PRESENT_SCALING_STRETCH_BIT_EXT = VK_PRESENT_SCALING_STRETCH_BIT_KHR, + VK_PRESENT_SCALING_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkPresentScalingFlagBitsKHR; +typedef VkFlags VkPresentScalingFlagsKHR; + +typedef enum VkPresentGravityFlagBitsKHR { + VK_PRESENT_GRAVITY_MIN_BIT_KHR = 0x00000001, + VK_PRESENT_GRAVITY_MAX_BIT_KHR = 0x00000002, + VK_PRESENT_GRAVITY_CENTERED_BIT_KHR = 0x00000004, + VK_PRESENT_GRAVITY_MIN_BIT_EXT = VK_PRESENT_GRAVITY_MIN_BIT_KHR, + VK_PRESENT_GRAVITY_MAX_BIT_EXT = VK_PRESENT_GRAVITY_MAX_BIT_KHR, + VK_PRESENT_GRAVITY_CENTERED_BIT_EXT = VK_PRESENT_GRAVITY_CENTERED_BIT_KHR, + VK_PRESENT_GRAVITY_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkPresentGravityFlagBitsKHR; +typedef VkFlags VkPresentGravityFlagsKHR; +typedef struct VkSurfacePresentModeKHR { + VkStructureType sType; + void* pNext; + VkPresentModeKHR presentMode; +} VkSurfacePresentModeKHR; + +typedef struct VkSurfacePresentScalingCapabilitiesKHR { + VkStructureType sType; + void* pNext; + VkPresentScalingFlagsKHR supportedPresentScaling; + VkPresentGravityFlagsKHR supportedPresentGravityX; + VkPresentGravityFlagsKHR supportedPresentGravityY; + VkExtent2D minScaledImageExtent; + VkExtent2D maxScaledImageExtent; +} VkSurfacePresentScalingCapabilitiesKHR; + +typedef struct VkSurfacePresentModeCompatibilityKHR { + VkStructureType sType; + void* pNext; + uint32_t presentModeCount; + VkPresentModeKHR* pPresentModes; +} VkSurfacePresentModeCompatibilityKHR; + + + +// VK_KHR_swapchain_maintenance1 is a preprocessor guard. Do not pass it to API calls. +#define VK_KHR_swapchain_maintenance1 1 +#define VK_KHR_SWAPCHAIN_MAINTENANCE_1_SPEC_VERSION 1 +#define VK_KHR_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME "VK_KHR_swapchain_maintenance1" +typedef struct VkPhysicalDeviceSwapchainMaintenance1FeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 swapchainMaintenance1; +} VkPhysicalDeviceSwapchainMaintenance1FeaturesKHR; + +typedef struct VkSwapchainPresentFenceInfoKHR { + VkStructureType sType; + const void* pNext; + uint32_t swapchainCount; + const VkFence* pFences; +} VkSwapchainPresentFenceInfoKHR; + +typedef struct VkSwapchainPresentModesCreateInfoKHR { + VkStructureType sType; + const void* pNext; + uint32_t presentModeCount; + const VkPresentModeKHR* pPresentModes; +} VkSwapchainPresentModesCreateInfoKHR; + +typedef struct VkSwapchainPresentModeInfoKHR { + VkStructureType sType; + const void* pNext; + uint32_t swapchainCount; + const VkPresentModeKHR* pPresentModes; +} VkSwapchainPresentModeInfoKHR; + +typedef struct VkSwapchainPresentScalingCreateInfoKHR { + VkStructureType sType; + const void* pNext; + VkPresentScalingFlagsKHR scalingBehavior; + VkPresentGravityFlagsKHR presentGravityX; + VkPresentGravityFlagsKHR presentGravityY; +} VkSwapchainPresentScalingCreateInfoKHR; + +typedef struct VkReleaseSwapchainImagesInfoKHR { + VkStructureType sType; + const void* pNext; + VkSwapchainKHR swapchain; + uint32_t imageIndexCount; + const uint32_t* pImageIndices; +} VkReleaseSwapchainImagesInfoKHR; + +typedef VkResult (VKAPI_PTR *PFN_vkReleaseSwapchainImagesKHR)(VkDevice device, const VkReleaseSwapchainImagesInfoKHR* pReleaseInfo); + +#ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkReleaseSwapchainImagesKHR( + VkDevice device, + const VkReleaseSwapchainImagesInfoKHR* pReleaseInfo); +#endif +#endif + + +// VK_KHR_internally_synchronized_queues is a preprocessor guard. Do not pass it to API calls. +#define VK_KHR_internally_synchronized_queues 1 +#define VK_KHR_INTERNALLY_SYNCHRONIZED_QUEUES_SPEC_VERSION 1 +#define VK_KHR_INTERNALLY_SYNCHRONIZED_QUEUES_EXTENSION_NAME "VK_KHR_internally_synchronized_queues" +typedef struct VkPhysicalDeviceInternallySynchronizedQueuesFeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 internallySynchronizedQueues; +} VkPhysicalDeviceInternallySynchronizedQueuesFeaturesKHR; + // VK_KHR_cooperative_matrix is a preprocessor guard. Do not pass it to API calls. @@ -12177,10 +13501,11 @@ typedef enum VkComponentTypeKHR { VK_COMPONENT_TYPE_UINT16_KHR = 8, VK_COMPONENT_TYPE_UINT32_KHR = 9, VK_COMPONENT_TYPE_UINT64_KHR = 10, + VK_COMPONENT_TYPE_BFLOAT16_KHR = 1000141000, VK_COMPONENT_TYPE_SINT8_PACKED_NV = 1000491000, VK_COMPONENT_TYPE_UINT8_PACKED_NV = 1000491001, - VK_COMPONENT_TYPE_FLOAT_E4M3_NV = 1000491002, - VK_COMPONENT_TYPE_FLOAT_E5M2_NV = 1000491003, + VK_COMPONENT_TYPE_FLOAT8_E4M3_EXT = 1000491002, + VK_COMPONENT_TYPE_FLOAT8_E5M2_EXT = 1000491003, VK_COMPONENT_TYPE_FLOAT16_NV = VK_COMPONENT_TYPE_FLOAT16_KHR, VK_COMPONENT_TYPE_FLOAT32_NV = VK_COMPONENT_TYPE_FLOAT32_KHR, VK_COMPONENT_TYPE_FLOAT64_NV = VK_COMPONENT_TYPE_FLOAT64_KHR, @@ -12192,6 +13517,8 @@ typedef enum VkComponentTypeKHR { VK_COMPONENT_TYPE_UINT16_NV = VK_COMPONENT_TYPE_UINT16_KHR, VK_COMPONENT_TYPE_UINT32_NV = VK_COMPONENT_TYPE_UINT32_KHR, VK_COMPONENT_TYPE_UINT64_NV = VK_COMPONENT_TYPE_UINT64_KHR, + VK_COMPONENT_TYPE_FLOAT_E4M3_NV = VK_COMPONENT_TYPE_FLOAT8_E4M3_EXT, + VK_COMPONENT_TYPE_FLOAT_E5M2_NV = VK_COMPONENT_TYPE_FLOAT8_E5M2_EXT, VK_COMPONENT_TYPE_MAX_ENUM_KHR = 0x7FFFFFFF } VkComponentTypeKHR; @@ -12236,11 +13563,13 @@ typedef struct VkPhysicalDeviceCooperativeMatrixPropertiesKHR { typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR)(VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkCooperativeMatrixPropertiesKHR* pProperties); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR( VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkCooperativeMatrixPropertiesKHR* pProperties); #endif +#endif // VK_KHR_compute_shader_derivatives is a preprocessor guard. Do not pass it to API calls. @@ -12334,6 +13663,7 @@ typedef enum VkVideoEncodeAV1CapabilityFlagBitsKHR { VK_VIDEO_ENCODE_AV1_CAPABILITY_PRIMARY_REFERENCE_CDF_ONLY_BIT_KHR = 0x00000004, VK_VIDEO_ENCODE_AV1_CAPABILITY_FRAME_SIZE_OVERRIDE_BIT_KHR = 0x00000008, VK_VIDEO_ENCODE_AV1_CAPABILITY_MOTION_VECTOR_SCALING_BIT_KHR = 0x00000010, + VK_VIDEO_ENCODE_AV1_CAPABILITY_COMPOUND_PREDICTION_INTRA_REFRESH_BIT_KHR = 0x00000020, VK_VIDEO_ENCODE_AV1_CAPABILITY_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF } VkVideoEncodeAV1CapabilityFlagBitsKHR; typedef VkFlags VkVideoEncodeAV1CapabilityFlagsKHR; @@ -12501,6 +13831,43 @@ typedef struct VkVideoEncodeAV1RateControlLayerInfoKHR { +// VK_KHR_video_decode_vp9 is a preprocessor guard. Do not pass it to API calls. +#define VK_KHR_video_decode_vp9 1 +#include "vk_video/vulkan_video_codec_vp9std.h" +#include "vk_video/vulkan_video_codec_vp9std_decode.h" +#define VK_MAX_VIDEO_VP9_REFERENCES_PER_FRAME_KHR 3U +#define VK_KHR_VIDEO_DECODE_VP9_SPEC_VERSION 1 +#define VK_KHR_VIDEO_DECODE_VP9_EXTENSION_NAME "VK_KHR_video_decode_vp9" +typedef struct VkPhysicalDeviceVideoDecodeVP9FeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 videoDecodeVP9; +} VkPhysicalDeviceVideoDecodeVP9FeaturesKHR; + +typedef struct VkVideoDecodeVP9ProfileInfoKHR { + VkStructureType sType; + const void* pNext; + StdVideoVP9Profile stdProfile; +} VkVideoDecodeVP9ProfileInfoKHR; + +typedef struct VkVideoDecodeVP9CapabilitiesKHR { + VkStructureType sType; + void* pNext; + StdVideoVP9Level maxLevel; +} VkVideoDecodeVP9CapabilitiesKHR; + +typedef struct VkVideoDecodeVP9PictureInfoKHR { + VkStructureType sType; + const void* pNext; + const StdVideoDecodeVP9PictureInfo* pStdPictureInfo; + int32_t referenceNameSlotIndices[VK_MAX_VIDEO_VP9_REFERENCES_PER_FRAME_KHR]; + uint32_t uncompressedHeaderOffset; + uint32_t compressedHeaderOffset; + uint32_t tilesOffset; +} VkVideoDecodeVP9PictureInfoKHR; + + + // VK_KHR_video_maintenance1 is a preprocessor guard. Do not pass it to API calls. #define VK_KHR_video_maintenance1 1 #define VK_KHR_VIDEO_MAINTENANCE_1_SPEC_VERSION 1 @@ -12541,6 +13908,25 @@ typedef VkPhysicalDeviceVertexAttributeDivisorFeatures VkPhysicalDeviceVertexAtt #define VK_KHR_LOAD_STORE_OP_NONE_EXTENSION_NAME "VK_KHR_load_store_op_none" +// VK_KHR_unified_image_layouts is a preprocessor guard. Do not pass it to API calls. +#define VK_KHR_unified_image_layouts 1 +#define VK_KHR_UNIFIED_IMAGE_LAYOUTS_SPEC_VERSION 1 +#define VK_KHR_UNIFIED_IMAGE_LAYOUTS_EXTENSION_NAME "VK_KHR_unified_image_layouts" +typedef struct VkPhysicalDeviceUnifiedImageLayoutsFeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 unifiedImageLayouts; + VkBool32 unifiedImageLayoutsVideo; +} VkPhysicalDeviceUnifiedImageLayoutsFeaturesKHR; + +typedef struct VkAttachmentFeedbackLoopInfoEXT { + VkStructureType sType; + const void* pNext; + VkBool32 feedbackLoopEnable; +} VkAttachmentFeedbackLoopInfoEXT; + + + // VK_KHR_shader_float_controls2 is a preprocessor guard. Do not pass it to API calls. #define VK_KHR_shader_float_controls2 1 #define VK_KHR_SHADER_FLOAT_CONTROLS_2_SPEC_VERSION 1 @@ -12572,11 +13958,13 @@ typedef VkPipelineRasterizationLineStateCreateInfo VkPipelineRasterizationLineSt typedef void (VKAPI_PTR *PFN_vkCmdSetLineStippleKHR)(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor, uint16_t lineStipplePattern); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetLineStippleKHR( VkCommandBuffer commandBuffer, uint32_t lineStippleFactor, uint16_t lineStipplePattern); #endif +#endif // VK_KHR_calibrated_timestamps is a preprocessor guard. Do not pass it to API calls. @@ -12589,6 +13977,8 @@ typedef enum VkTimeDomainKHR { VK_TIME_DOMAIN_CLOCK_MONOTONIC_KHR = 1, VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_KHR = 2, VK_TIME_DOMAIN_QUERY_PERFORMANCE_COUNTER_KHR = 3, + VK_TIME_DOMAIN_PRESENT_STAGE_LOCAL_EXT = 1000208000, + VK_TIME_DOMAIN_SWAPCHAIN_LOCAL_EXT = 1000208001, VK_TIME_DOMAIN_DEVICE_EXT = VK_TIME_DOMAIN_DEVICE_KHR, VK_TIME_DOMAIN_CLOCK_MONOTONIC_EXT = VK_TIME_DOMAIN_CLOCK_MONOTONIC_KHR, VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_EXT = VK_TIME_DOMAIN_CLOCK_MONOTONIC_RAW_KHR, @@ -12605,11 +13995,14 @@ typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsKHR) typedef VkResult (VKAPI_PTR *PFN_vkGetCalibratedTimestampsKHR)(VkDevice device, uint32_t timestampCount, const VkCalibratedTimestampInfoKHR* pTimestampInfos, uint64_t* pTimestamps, uint64_t* pMaxDeviation); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceCalibrateableTimeDomainsKHR( VkPhysicalDevice physicalDevice, uint32_t* pTimeDomainCount, VkTimeDomainKHR* pTimeDomains); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetCalibratedTimestampsKHR( VkDevice device, uint32_t timestampCount, @@ -12617,6 +14010,7 @@ VKAPI_ATTR VkResult VKAPI_CALL vkGetCalibratedTimestampsKHR( uint64_t* pTimestamps, uint64_t* pMaxDeviation); #endif +#endif // VK_KHR_shader_expect_assume is a preprocessor guard. Do not pass it to API calls. @@ -12672,30 +14066,171 @@ typedef void (VKAPI_PTR *PFN_vkCmdSetDescriptorBufferOffsets2EXT)(VkCommandBuffe typedef void (VKAPI_PTR *PFN_vkCmdBindDescriptorBufferEmbeddedSamplers2EXT)(VkCommandBuffer commandBuffer, const VkBindDescriptorBufferEmbeddedSamplersInfoEXT* pBindDescriptorBufferEmbeddedSamplersInfo); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdBindDescriptorSets2KHR( VkCommandBuffer commandBuffer, const VkBindDescriptorSetsInfo* pBindDescriptorSetsInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdPushConstants2KHR( VkCommandBuffer commandBuffer, const VkPushConstantsInfo* pPushConstantsInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdPushDescriptorSet2KHR( VkCommandBuffer commandBuffer, const VkPushDescriptorSetInfo* pPushDescriptorSetInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdPushDescriptorSetWithTemplate2KHR( VkCommandBuffer commandBuffer, const VkPushDescriptorSetWithTemplateInfo* pPushDescriptorSetWithTemplateInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetDescriptorBufferOffsets2EXT( VkCommandBuffer commandBuffer, const VkSetDescriptorBufferOffsetsInfoEXT* pSetDescriptorBufferOffsetsInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdBindDescriptorBufferEmbeddedSamplers2EXT( VkCommandBuffer commandBuffer, const VkBindDescriptorBufferEmbeddedSamplersInfoEXT* pBindDescriptorBufferEmbeddedSamplersInfo); #endif +#endif + + +// VK_KHR_copy_memory_indirect is a preprocessor guard. Do not pass it to API calls. +#define VK_KHR_copy_memory_indirect 1 +#define VK_KHR_COPY_MEMORY_INDIRECT_SPEC_VERSION 1 +#define VK_KHR_COPY_MEMORY_INDIRECT_EXTENSION_NAME "VK_KHR_copy_memory_indirect" + +typedef enum VkAddressCopyFlagBitsKHR { + VK_ADDRESS_COPY_DEVICE_LOCAL_BIT_KHR = 0x00000001, + VK_ADDRESS_COPY_SPARSE_BIT_KHR = 0x00000002, + VK_ADDRESS_COPY_PROTECTED_BIT_KHR = 0x00000004, + VK_ADDRESS_COPY_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkAddressCopyFlagBitsKHR; +typedef VkFlags VkAddressCopyFlagsKHR; +typedef struct VkCopyMemoryIndirectCommandKHR { + VkDeviceAddress srcAddress; + VkDeviceAddress dstAddress; + VkDeviceSize size; +} VkCopyMemoryIndirectCommandKHR; + +typedef struct VkCopyMemoryIndirectInfoKHR { + VkStructureType sType; + const void* pNext; + VkAddressCopyFlagsKHR srcCopyFlags; + VkAddressCopyFlagsKHR dstCopyFlags; + uint32_t copyCount; + VkStridedDeviceAddressRangeKHR copyAddressRange; +} VkCopyMemoryIndirectInfoKHR; + +typedef struct VkCopyMemoryToImageIndirectCommandKHR { + VkDeviceAddress srcAddress; + uint32_t bufferRowLength; + uint32_t bufferImageHeight; + VkImageSubresourceLayers imageSubresource; + VkOffset3D imageOffset; + VkExtent3D imageExtent; +} VkCopyMemoryToImageIndirectCommandKHR; + +typedef struct VkCopyMemoryToImageIndirectInfoKHR { + VkStructureType sType; + const void* pNext; + VkAddressCopyFlagsKHR srcCopyFlags; + uint32_t copyCount; + VkStridedDeviceAddressRangeKHR copyAddressRange; + VkImage dstImage; + VkImageLayout dstImageLayout; + const VkImageSubresourceLayers* pImageSubresources; +} VkCopyMemoryToImageIndirectInfoKHR; + +typedef struct VkPhysicalDeviceCopyMemoryIndirectFeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 indirectMemoryCopy; + VkBool32 indirectMemoryToImageCopy; +} VkPhysicalDeviceCopyMemoryIndirectFeaturesKHR; + +typedef struct VkPhysicalDeviceCopyMemoryIndirectPropertiesKHR { + VkStructureType sType; + void* pNext; + VkQueueFlags supportedQueues; +} VkPhysicalDeviceCopyMemoryIndirectPropertiesKHR; + +typedef void (VKAPI_PTR *PFN_vkCmdCopyMemoryIndirectKHR)(VkCommandBuffer commandBuffer, const VkCopyMemoryIndirectInfoKHR* pCopyMemoryIndirectInfo); +typedef void (VKAPI_PTR *PFN_vkCmdCopyMemoryToImageIndirectKHR)(VkCommandBuffer commandBuffer, const VkCopyMemoryToImageIndirectInfoKHR* pCopyMemoryToImageIndirectInfo); + +#ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdCopyMemoryIndirectKHR( + VkCommandBuffer commandBuffer, + const VkCopyMemoryIndirectInfoKHR* pCopyMemoryIndirectInfo); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdCopyMemoryToImageIndirectKHR( + VkCommandBuffer commandBuffer, + const VkCopyMemoryToImageIndirectInfoKHR* pCopyMemoryToImageIndirectInfo); +#endif +#endif + + +// VK_KHR_video_encode_intra_refresh is a preprocessor guard. Do not pass it to API calls. +#define VK_KHR_video_encode_intra_refresh 1 +#define VK_KHR_VIDEO_ENCODE_INTRA_REFRESH_SPEC_VERSION 1 +#define VK_KHR_VIDEO_ENCODE_INTRA_REFRESH_EXTENSION_NAME "VK_KHR_video_encode_intra_refresh" + +typedef enum VkVideoEncodeIntraRefreshModeFlagBitsKHR { + VK_VIDEO_ENCODE_INTRA_REFRESH_MODE_NONE_KHR = 0, + VK_VIDEO_ENCODE_INTRA_REFRESH_MODE_PER_PICTURE_PARTITION_BIT_KHR = 0x00000001, + VK_VIDEO_ENCODE_INTRA_REFRESH_MODE_BLOCK_BASED_BIT_KHR = 0x00000002, + VK_VIDEO_ENCODE_INTRA_REFRESH_MODE_BLOCK_ROW_BASED_BIT_KHR = 0x00000004, + VK_VIDEO_ENCODE_INTRA_REFRESH_MODE_BLOCK_COLUMN_BASED_BIT_KHR = 0x00000008, + VK_VIDEO_ENCODE_INTRA_REFRESH_MODE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkVideoEncodeIntraRefreshModeFlagBitsKHR; +typedef VkFlags VkVideoEncodeIntraRefreshModeFlagsKHR; +typedef struct VkVideoEncodeIntraRefreshCapabilitiesKHR { + VkStructureType sType; + void* pNext; + VkVideoEncodeIntraRefreshModeFlagsKHR intraRefreshModes; + uint32_t maxIntraRefreshCycleDuration; + uint32_t maxIntraRefreshActiveReferencePictures; + VkBool32 partitionIndependentIntraRefreshRegions; + VkBool32 nonRectangularIntraRefreshRegions; +} VkVideoEncodeIntraRefreshCapabilitiesKHR; + +typedef struct VkVideoEncodeSessionIntraRefreshCreateInfoKHR { + VkStructureType sType; + const void* pNext; + VkVideoEncodeIntraRefreshModeFlagBitsKHR intraRefreshMode; +} VkVideoEncodeSessionIntraRefreshCreateInfoKHR; + +typedef struct VkVideoEncodeIntraRefreshInfoKHR { + VkStructureType sType; + const void* pNext; + uint32_t intraRefreshCycleDuration; + uint32_t intraRefreshIndex; +} VkVideoEncodeIntraRefreshInfoKHR; + +typedef struct VkVideoReferenceIntraRefreshInfoKHR { + VkStructureType sType; + const void* pNext; + uint32_t dirtyIntraRefreshRegions; +} VkVideoReferenceIntraRefreshInfoKHR; + +typedef struct VkPhysicalDeviceVideoEncodeIntraRefreshFeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 videoEncodeIntraRefresh; +} VkPhysicalDeviceVideoEncodeIntraRefreshFeaturesKHR; + // VK_KHR_video_encode_quantization_map is a preprocessor guard. Do not pass it to API calls. @@ -12836,6 +14371,124 @@ typedef struct VkPhysicalDeviceLayeredApiVulkanPropertiesKHR { +// VK_KHR_device_fault is a preprocessor guard. Do not pass it to API calls. +#define VK_KHR_device_fault 1 +#define VK_KHR_DEVICE_FAULT_SPEC_VERSION 1 +#define VK_KHR_DEVICE_FAULT_EXTENSION_NAME "VK_KHR_device_fault" + +typedef enum VkDeviceFaultAddressTypeKHR { + VK_DEVICE_FAULT_ADDRESS_TYPE_NONE_KHR = 0, + VK_DEVICE_FAULT_ADDRESS_TYPE_READ_INVALID_KHR = 1, + VK_DEVICE_FAULT_ADDRESS_TYPE_WRITE_INVALID_KHR = 2, + VK_DEVICE_FAULT_ADDRESS_TYPE_EXECUTE_INVALID_KHR = 3, + VK_DEVICE_FAULT_ADDRESS_TYPE_INSTRUCTION_POINTER_UNKNOWN_KHR = 4, + VK_DEVICE_FAULT_ADDRESS_TYPE_INSTRUCTION_POINTER_INVALID_KHR = 5, + VK_DEVICE_FAULT_ADDRESS_TYPE_INSTRUCTION_POINTER_FAULT_KHR = 6, + VK_DEVICE_FAULT_ADDRESS_TYPE_NONE_EXT = VK_DEVICE_FAULT_ADDRESS_TYPE_NONE_KHR, + VK_DEVICE_FAULT_ADDRESS_TYPE_READ_INVALID_EXT = VK_DEVICE_FAULT_ADDRESS_TYPE_READ_INVALID_KHR, + VK_DEVICE_FAULT_ADDRESS_TYPE_WRITE_INVALID_EXT = VK_DEVICE_FAULT_ADDRESS_TYPE_WRITE_INVALID_KHR, + VK_DEVICE_FAULT_ADDRESS_TYPE_EXECUTE_INVALID_EXT = VK_DEVICE_FAULT_ADDRESS_TYPE_EXECUTE_INVALID_KHR, + VK_DEVICE_FAULT_ADDRESS_TYPE_INSTRUCTION_POINTER_UNKNOWN_EXT = VK_DEVICE_FAULT_ADDRESS_TYPE_INSTRUCTION_POINTER_UNKNOWN_KHR, + VK_DEVICE_FAULT_ADDRESS_TYPE_INSTRUCTION_POINTER_INVALID_EXT = VK_DEVICE_FAULT_ADDRESS_TYPE_INSTRUCTION_POINTER_INVALID_KHR, + VK_DEVICE_FAULT_ADDRESS_TYPE_INSTRUCTION_POINTER_FAULT_EXT = VK_DEVICE_FAULT_ADDRESS_TYPE_INSTRUCTION_POINTER_FAULT_KHR, + VK_DEVICE_FAULT_ADDRESS_TYPE_MAX_ENUM_KHR = 0x7FFFFFFF +} VkDeviceFaultAddressTypeKHR; + +typedef enum VkDeviceFaultVendorBinaryHeaderVersionKHR { + VK_DEVICE_FAULT_VENDOR_BINARY_HEADER_VERSION_ONE_KHR = 1, + VK_DEVICE_FAULT_VENDOR_BINARY_HEADER_VERSION_ONE_EXT = VK_DEVICE_FAULT_VENDOR_BINARY_HEADER_VERSION_ONE_KHR, + VK_DEVICE_FAULT_VENDOR_BINARY_HEADER_VERSION_MAX_ENUM_KHR = 0x7FFFFFFF +} VkDeviceFaultVendorBinaryHeaderVersionKHR; + +typedef enum VkDeviceFaultFlagBitsKHR { + VK_DEVICE_FAULT_FLAG_DEVICE_LOST_KHR = 0x00000001, + VK_DEVICE_FAULT_FLAG_MEMORY_ADDRESS_KHR = 0x00000002, + VK_DEVICE_FAULT_FLAG_INSTRUCTION_ADDRESS_KHR = 0x00000004, + VK_DEVICE_FAULT_FLAG_VENDOR_KHR = 0x00000008, + VK_DEVICE_FAULT_FLAG_WATCHDOG_TIMEOUT_KHR = 0x00000010, + VK_DEVICE_FAULT_FLAG_OVERFLOW_KHR = 0x00000020, + VK_DEVICE_FAULT_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkDeviceFaultFlagBitsKHR; +typedef VkFlags VkDeviceFaultFlagsKHR; +typedef struct VkPhysicalDeviceFaultFeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 deviceFault; + VkBool32 deviceFaultVendorBinary; + VkBool32 deviceFaultReportMasked; + VkBool32 deviceFaultDeviceLostOnMasked; +} VkPhysicalDeviceFaultFeaturesKHR; + +typedef struct VkPhysicalDeviceFaultPropertiesKHR { + VkStructureType sType; + void* pNext; + uint32_t maxDeviceFaultCount; +} VkPhysicalDeviceFaultPropertiesKHR; + +typedef struct VkDeviceFaultAddressInfoKHR { + VkDeviceFaultAddressTypeKHR addressType; + VkDeviceAddress reportedAddress; + VkDeviceSize addressPrecision; +} VkDeviceFaultAddressInfoKHR; + +typedef struct VkDeviceFaultVendorInfoKHR { + char description[VK_MAX_DESCRIPTION_SIZE]; + uint64_t vendorFaultCode; + uint64_t vendorFaultData; +} VkDeviceFaultVendorInfoKHR; + +typedef struct VkDeviceFaultInfoKHR { + VkStructureType sType; + void* pNext; + VkDeviceFaultFlagsKHR flags; + uint64_t groupId; + char description[VK_MAX_DESCRIPTION_SIZE]; + VkDeviceFaultAddressInfoKHR faultAddressInfo; + VkDeviceFaultAddressInfoKHR instructionAddressInfo; + VkDeviceFaultVendorInfoKHR vendorInfo; +} VkDeviceFaultInfoKHR; + +typedef struct VkDeviceFaultDebugInfoKHR { + VkStructureType sType; + void* pNext; + uint32_t vendorBinarySize; + void* pVendorBinaryData; +} VkDeviceFaultDebugInfoKHR; + +typedef struct VkDeviceFaultVendorBinaryHeaderVersionOneKHR { + uint32_t headerSize; + VkDeviceFaultVendorBinaryHeaderVersionKHR headerVersion; + uint32_t vendorID; + uint32_t deviceID; + uint32_t driverVersion; + uint8_t pipelineCacheUUID[VK_UUID_SIZE]; + uint32_t applicationNameOffset; + uint32_t applicationVersion; + uint32_t engineNameOffset; + uint32_t engineVersion; + uint32_t apiVersion; +} VkDeviceFaultVendorBinaryHeaderVersionOneKHR; + +typedef VkResult (VKAPI_PTR *PFN_vkGetDeviceFaultReportsKHR)(VkDevice device, uint64_t timeout, uint32_t* pFaultCounts, VkDeviceFaultInfoKHR* pFaultInfo); +typedef VkResult (VKAPI_PTR *PFN_vkGetDeviceFaultDebugInfoKHR)(VkDevice device, VkDeviceFaultDebugInfoKHR* pDebugInfo); + +#ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetDeviceFaultReportsKHR( + VkDevice device, + uint64_t timeout, + uint32_t* pFaultCounts, + VkDeviceFaultInfoKHR* pFaultInfo); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetDeviceFaultDebugInfoKHR( + VkDevice device, + VkDeviceFaultDebugInfoKHR* pDebugInfo); +#endif +#endif + + // VK_KHR_maintenance8 is a preprocessor guard. Do not pass it to API calls. #define VK_KHR_maintenance8 1 #define VK_KHR_MAINTENANCE_8_SPEC_VERSION 1 @@ -12846,12 +14499,6 @@ typedef VkFlags64 VkAccessFlags3KHR; typedef VkFlags64 VkAccessFlagBits3KHR; static const VkAccessFlagBits3KHR VK_ACCESS_3_NONE_KHR = 0ULL; -typedef struct VkPhysicalDeviceMaintenance8FeaturesKHR { - VkStructureType sType; - void* pNext; - VkBool32 maintenance8; -} VkPhysicalDeviceMaintenance8FeaturesKHR; - typedef struct VkMemoryBarrierAccessFlags3KHR { VkStructureType sType; const void* pNext; @@ -12859,6 +14506,57 @@ typedef struct VkMemoryBarrierAccessFlags3KHR { VkAccessFlags3KHR dstAccessMask3; } VkMemoryBarrierAccessFlags3KHR; +typedef struct VkPhysicalDeviceMaintenance8FeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 maintenance8; +} VkPhysicalDeviceMaintenance8FeaturesKHR; + + + +// VK_KHR_shader_fma is a preprocessor guard. Do not pass it to API calls. +#define VK_KHR_shader_fma 1 +#define VK_KHR_SHADER_FMA_SPEC_VERSION 1 +#define VK_KHR_SHADER_FMA_EXTENSION_NAME "VK_KHR_shader_fma" +typedef struct VkPhysicalDeviceShaderFmaFeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 shaderFmaFloat16; + VkBool32 shaderFmaFloat32; + VkBool32 shaderFmaFloat64; +} VkPhysicalDeviceShaderFmaFeaturesKHR; + + + +// VK_KHR_maintenance9 is a preprocessor guard. Do not pass it to API calls. +#define VK_KHR_maintenance9 1 +#define VK_KHR_MAINTENANCE_9_SPEC_VERSION 1 +#define VK_KHR_MAINTENANCE_9_EXTENSION_NAME "VK_KHR_maintenance9" + +typedef enum VkDefaultVertexAttributeValueKHR { + VK_DEFAULT_VERTEX_ATTRIBUTE_VALUE_ZERO_ZERO_ZERO_ZERO_KHR = 0, + VK_DEFAULT_VERTEX_ATTRIBUTE_VALUE_ZERO_ZERO_ZERO_ONE_KHR = 1, + VK_DEFAULT_VERTEX_ATTRIBUTE_VALUE_MAX_ENUM_KHR = 0x7FFFFFFF +} VkDefaultVertexAttributeValueKHR; +typedef struct VkPhysicalDeviceMaintenance9FeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 maintenance9; +} VkPhysicalDeviceMaintenance9FeaturesKHR; + +typedef struct VkPhysicalDeviceMaintenance9PropertiesKHR { + VkStructureType sType; + void* pNext; + VkBool32 image2DViewOf3DSparse; + VkDefaultVertexAttributeValueKHR defaultVertexAttributeValue; +} VkPhysicalDeviceMaintenance9PropertiesKHR; + +typedef struct VkQueueFamilyOwnershipTransferPropertiesKHR { + VkStructureType sType; + void* pNext; + uint32_t optimalImageTransferToQueueFamilies; +} VkQueueFamilyOwnershipTransferPropertiesKHR; + // VK_KHR_video_maintenance2 is a preprocessor guard. Do not pass it to API calls. @@ -12894,6 +14592,40 @@ typedef struct VkVideoDecodeAV1InlineSessionParametersInfoKHR { +// VK_KHR_video_encode_feedback2 is a preprocessor guard. Do not pass it to API calls. +#define VK_KHR_video_encode_feedback2 1 +#define VK_KHR_VIDEO_ENCODE_FEEDBACK_2_SPEC_VERSION 1 +#define VK_KHR_VIDEO_ENCODE_FEEDBACK_2_EXTENSION_NAME "VK_KHR_video_encode_feedback2" + +typedef enum VkVideoEncodePerPartitionFeedbackFlagBitsKHR { + VK_VIDEO_ENCODE_PER_PARTITION_FEEDBACK_STATUS_BIT_KHR = 0x00000001, + VK_VIDEO_ENCODE_PER_PARTITION_FEEDBACK_BITSTREAM_BUFFER_OFFSET_BIT_KHR = 0x00000002, + VK_VIDEO_ENCODE_PER_PARTITION_FEEDBACK_BITSTREAM_BYTES_WRITTEN_BIT_KHR = 0x00000004, + VK_VIDEO_ENCODE_PER_PARTITION_FEEDBACK_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkVideoEncodePerPartitionFeedbackFlagBitsKHR; +typedef VkFlags VkVideoEncodePerPartitionFeedbackFlagsKHR; +typedef struct VkPhysicalDeviceVideoEncodeFeedback2FeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 videoEncodeFeedback2; +} VkPhysicalDeviceVideoEncodeFeedback2FeaturesKHR; + +typedef struct VkVideoEncodeFeedback2CapabilitiesKHR { + VkStructureType sType; + void* pNext; + uint32_t maxPerPartitionFeedbackEntries; + VkVideoEncodePerPartitionFeedbackFlagsKHR supportedPerPartitionEncodeFeedbackFlags; +} VkVideoEncodeFeedback2CapabilitiesKHR; + +typedef struct VkQueryPoolVideoEncodePerPartitionFeedbackCreateInfoKHR { + VkStructureType sType; + const void* pNext; + uint32_t maxPerPartitionFeedbackEntries; + VkVideoEncodePerPartitionFeedbackFlagsKHR perPartitionEncodeFeedbackFlags; +} VkQueryPoolVideoEncodePerPartitionFeedbackCreateInfoKHR; + + + // VK_KHR_depth_clamp_zero_one is a preprocessor guard. Do not pass it to API calls. #define VK_KHR_depth_clamp_zero_one 1 #define VK_KHR_DEPTH_CLAMP_ZERO_ONE_SPEC_VERSION 1 @@ -12906,6 +14638,311 @@ typedef struct VkPhysicalDeviceDepthClampZeroOneFeaturesKHR { +// VK_KHR_robustness2 is a preprocessor guard. Do not pass it to API calls. +#define VK_KHR_robustness2 1 +#define VK_KHR_ROBUSTNESS_2_SPEC_VERSION 1 +#define VK_KHR_ROBUSTNESS_2_EXTENSION_NAME "VK_KHR_robustness2" +typedef struct VkPhysicalDeviceRobustness2FeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 robustBufferAccess2; + VkBool32 robustImageAccess2; + VkBool32 nullDescriptor; +} VkPhysicalDeviceRobustness2FeaturesKHR; + +typedef struct VkPhysicalDeviceRobustness2PropertiesKHR { + VkStructureType sType; + void* pNext; + VkDeviceSize robustStorageBufferAccessSizeAlignment; + VkDeviceSize robustUniformBufferAccessSizeAlignment; +} VkPhysicalDeviceRobustness2PropertiesKHR; + + + +// VK_KHR_present_mode_fifo_latest_ready is a preprocessor guard. Do not pass it to API calls. +#define VK_KHR_present_mode_fifo_latest_ready 1 +#define VK_KHR_PRESENT_MODE_FIFO_LATEST_READY_SPEC_VERSION 1 +#define VK_KHR_PRESENT_MODE_FIFO_LATEST_READY_EXTENSION_NAME "VK_KHR_present_mode_fifo_latest_ready" +typedef struct VkPhysicalDevicePresentModeFifoLatestReadyFeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 presentModeFifoLatestReady; +} VkPhysicalDevicePresentModeFifoLatestReadyFeaturesKHR; + + + +// VK_KHR_opacity_micromap is a preprocessor guard. Do not pass it to API calls. +#define VK_KHR_opacity_micromap 1 +#define VK_KHR_OPACITY_MICROMAP_SPEC_VERSION 1 +#define VK_KHR_OPACITY_MICROMAP_EXTENSION_NAME "VK_KHR_opacity_micromap" + +typedef enum VkOpacityMicromapFormatKHR { + VK_OPACITY_MICROMAP_FORMAT_2_STATE_KHR = 1, + VK_OPACITY_MICROMAP_FORMAT_4_STATE_KHR = 2, + VK_OPACITY_MICROMAP_FORMAT_2_STATE_EXT = VK_OPACITY_MICROMAP_FORMAT_2_STATE_KHR, + VK_OPACITY_MICROMAP_FORMAT_4_STATE_EXT = VK_OPACITY_MICROMAP_FORMAT_4_STATE_KHR, + VK_OPACITY_MICROMAP_FORMAT_MAX_ENUM_KHR = 0x7FFFFFFF +} VkOpacityMicromapFormatKHR; + +typedef enum VkOpacityMicromapSpecialIndexKHR { + VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_TRANSPARENT_KHR = -1, + VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_OPAQUE_KHR = -2, + VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_UNKNOWN_TRANSPARENT_KHR = -3, + VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_UNKNOWN_OPAQUE_KHR = -4, + VK_OPACITY_MICROMAP_SPECIAL_INDEX_CLUSTER_GEOMETRY_DISABLE_OPACITY_MICROMAP_NV = -5, + VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_TRANSPARENT_EXT = VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_TRANSPARENT_KHR, + VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_OPAQUE_EXT = VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_OPAQUE_KHR, + VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_UNKNOWN_TRANSPARENT_EXT = VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_UNKNOWN_TRANSPARENT_KHR, + VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_UNKNOWN_OPAQUE_EXT = VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_UNKNOWN_OPAQUE_KHR, + VK_OPACITY_MICROMAP_SPECIAL_INDEX_MAX_ENUM_KHR = 0x7FFFFFFF +} VkOpacityMicromapSpecialIndexKHR; + +typedef enum VkAccelerationStructureSerializedBlockTypeKHR { + VK_ACCELERATION_STRUCTURE_SERIALIZED_BLOCK_TYPE_OPACITY_MICROMAP_KHR = 0, + VK_ACCELERATION_STRUCTURE_SERIALIZED_BLOCK_TYPE_MAX_ENUM_KHR = 0x7FFFFFFF +} VkAccelerationStructureSerializedBlockTypeKHR; +typedef struct VkMicromapUsageKHR { + uint32_t count; + uint32_t subdivisionLevel; + VkOpacityMicromapFormatKHR format; +} VkMicromapUsageKHR; + +typedef struct VkAccelerationStructureGeometryMicromapDataKHR { + VkStructureType sType; + const void* pNext; + uint32_t usageCountsCount; + const VkMicromapUsageKHR* pUsageCounts; + const VkMicromapUsageKHR* const* ppUsageCounts; + VkDeviceAddress data; + VkDeviceAddress triangleArray; + VkDeviceSize triangleArrayStride; +} VkAccelerationStructureGeometryMicromapDataKHR; + +typedef struct VkPhysicalDeviceOpacityMicromapFeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 micromap; +} VkPhysicalDeviceOpacityMicromapFeaturesKHR; + +typedef struct VkPhysicalDeviceOpacityMicromapPropertiesKHR { + VkStructureType sType; + void* pNext; + uint32_t maxOpacity2StateSubdivisionLevel; + uint32_t maxOpacity4StateSubdivisionLevel; + uint32_t maxOpacityLossy4StateSubdivisionLevel; + uint64_t maxMicromapTriangles; +} VkPhysicalDeviceOpacityMicromapPropertiesKHR; + +typedef struct VkMicromapTriangleKHR { + uint32_t dataOffset; + uint16_t subdivisionLevel; + uint16_t format; +} VkMicromapTriangleKHR; + +typedef struct VkAccelerationStructureTrianglesOpacityMicromapKHR { + VkStructureType sType; + void* pNext; + VkIndexType indexType; + VkDeviceAddress indexBuffer; + VkDeviceSize indexStride; + uint32_t baseTriangle; + VkAccelerationStructureKHR micromap; +} VkAccelerationStructureTrianglesOpacityMicromapKHR; + + + +// VK_KHR_maintenance10 is a preprocessor guard. Do not pass it to API calls. +#define VK_KHR_maintenance10 1 +#define VK_KHR_MAINTENANCE_10_SPEC_VERSION 1 +#define VK_KHR_MAINTENANCE_10_EXTENSION_NAME "VK_KHR_maintenance10" + +typedef enum VkRenderingAttachmentFlagBitsKHR { + VK_RENDERING_ATTACHMENT_INPUT_ATTACHMENT_FEEDBACK_BIT_KHR = 0x00000001, + VK_RENDERING_ATTACHMENT_RESOLVE_SKIP_TRANSFER_FUNCTION_BIT_KHR = 0x00000002, + VK_RENDERING_ATTACHMENT_RESOLVE_ENABLE_TRANSFER_FUNCTION_BIT_KHR = 0x00000004, + VK_RENDERING_ATTACHMENT_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkRenderingAttachmentFlagBitsKHR; +typedef VkFlags VkRenderingAttachmentFlagsKHR; + +typedef enum VkResolveImageFlagBitsKHR { + VK_RESOLVE_IMAGE_SKIP_TRANSFER_FUNCTION_BIT_KHR = 0x00000001, + VK_RESOLVE_IMAGE_ENABLE_TRANSFER_FUNCTION_BIT_KHR = 0x00000002, + VK_RESOLVE_IMAGE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkResolveImageFlagBitsKHR; +typedef VkFlags VkResolveImageFlagsKHR; +typedef struct VkPhysicalDeviceMaintenance10FeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 maintenance10; +} VkPhysicalDeviceMaintenance10FeaturesKHR; + +typedef struct VkPhysicalDeviceMaintenance10PropertiesKHR { + VkStructureType sType; + void* pNext; + VkBool32 rgba4OpaqueBlackSwizzled; + VkBool32 resolveSrgbFormatAppliesTransferFunction; + VkBool32 resolveSrgbFormatSupportsTransferFunctionControl; +} VkPhysicalDeviceMaintenance10PropertiesKHR; + +typedef struct VkRenderingEndInfoKHR { + VkStructureType sType; + const void* pNext; +} VkRenderingEndInfoKHR; + +typedef struct VkRenderingAttachmentFlagsInfoKHR { + VkStructureType sType; + const void* pNext; + VkRenderingAttachmentFlagsKHR flags; +} VkRenderingAttachmentFlagsInfoKHR; + +typedef struct VkResolveImageModeInfoKHR { + VkStructureType sType; + const void* pNext; + VkResolveImageFlagsKHR flags; + VkResolveModeFlagBits resolveMode; + VkResolveModeFlagBits stencilResolveMode; +} VkResolveImageModeInfoKHR; + +typedef void (VKAPI_PTR *PFN_vkCmdEndRendering2KHR)(VkCommandBuffer commandBuffer, const VkRenderingEndInfoKHR* pRenderingEndInfo); + +#ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdEndRendering2KHR( + VkCommandBuffer commandBuffer, + const VkRenderingEndInfoKHR* pRenderingEndInfo); +#endif +#endif + + +// VK_KHR_maintenance11 is a preprocessor guard. Do not pass it to API calls. +#define VK_KHR_maintenance11 1 +#define VK_KHR_MAINTENANCE_11_SPEC_VERSION 1 +#define VK_KHR_MAINTENANCE_11_EXTENSION_NAME "VK_KHR_maintenance11" +typedef struct VkPhysicalDeviceMaintenance11FeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 maintenance11; +} VkPhysicalDeviceMaintenance11FeaturesKHR; + +typedef struct VkQueueFamilyOptimalImageTransferGranularityPropertiesKHR { + VkStructureType sType; + void* pNext; + VkExtent3D optimalImageTransferGranularity; +} VkQueueFamilyOptimalImageTransferGranularityPropertiesKHR; + + + +// VK_KHR_extended_flags is a preprocessor guard. Do not pass it to API calls. +#define VK_KHR_extended_flags 1 +#define VK_KHR_EXTENDED_FLAGS_SPEC_VERSION 1 +#define VK_KHR_EXTENDED_FLAGS_EXTENSION_NAME "VK_KHR_extended_flags" +typedef VkFlags64 VkFormatFeatureFlags4KHR; + +// Flag bits for VkFormatFeatureFlagBits4KHR +typedef VkFlags64 VkFormatFeatureFlagBits4KHR; + +typedef VkFlags64 VkImageUsageFlags2KHR; + +// Flag bits for VkImageUsageFlagBits2KHR +typedef VkFlags64 VkImageUsageFlagBits2KHR; +static const VkImageUsageFlagBits2KHR VK_IMAGE_USAGE_2_TRANSFER_SRC_BIT_KHR = 0x00000001ULL; +static const VkImageUsageFlagBits2KHR VK_IMAGE_USAGE_2_TRANSFER_DST_BIT_KHR = 0x00000002ULL; +static const VkImageUsageFlagBits2KHR VK_IMAGE_USAGE_2_SAMPLED_BIT_KHR = 0x00000004ULL; +static const VkImageUsageFlagBits2KHR VK_IMAGE_USAGE_2_STORAGE_BIT_KHR = 0x00000008ULL; +static const VkImageUsageFlagBits2KHR VK_IMAGE_USAGE_2_COLOR_ATTACHMENT_BIT_KHR = 0x00000010ULL; +static const VkImageUsageFlagBits2KHR VK_IMAGE_USAGE_2_DEPTH_STENCIL_ATTACHMENT_BIT_KHR = 0x00000020ULL; +static const VkImageUsageFlagBits2KHR VK_IMAGE_USAGE_2_TRANSIENT_ATTACHMENT_BIT_KHR = 0x00000040ULL; +static const VkImageUsageFlagBits2KHR VK_IMAGE_USAGE_2_INPUT_ATTACHMENT_BIT_KHR = 0x00000080ULL; +static const VkImageUsageFlagBits2KHR VK_IMAGE_USAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x00000100ULL; +static const VkImageUsageFlagBits2KHR VK_IMAGE_USAGE_2_FRAGMENT_DENSITY_MAP_BIT_EXT = 0x00000200ULL; +static const VkImageUsageFlagBits2KHR VK_IMAGE_USAGE_2_VIDEO_DECODE_DST_BIT_KHR = 0x00000400ULL; +static const VkImageUsageFlagBits2KHR VK_IMAGE_USAGE_2_VIDEO_DECODE_SRC_BIT_KHR = 0x00000800ULL; +static const VkImageUsageFlagBits2KHR VK_IMAGE_USAGE_2_VIDEO_DECODE_DPB_BIT_KHR = 0x00001000ULL; +static const VkImageUsageFlagBits2KHR VK_IMAGE_USAGE_2_VIDEO_ENCODE_DST_BIT_KHR = 0x00002000ULL; +static const VkImageUsageFlagBits2KHR VK_IMAGE_USAGE_2_VIDEO_ENCODE_SRC_BIT_KHR = 0x00004000ULL; +static const VkImageUsageFlagBits2KHR VK_IMAGE_USAGE_2_VIDEO_ENCODE_DPB_BIT_KHR = 0x00008000ULL; +static const VkImageUsageFlagBits2KHR VK_IMAGE_USAGE_2_INVOCATION_MASK_BIT_HUAWEI = 0x00040000ULL; +static const VkImageUsageFlagBits2KHR VK_IMAGE_USAGE_2_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT = 0x00080000ULL; +static const VkImageUsageFlagBits2KHR VK_IMAGE_USAGE_2_SAMPLE_WEIGHT_BIT_QCOM = 0x00100000ULL; +static const VkImageUsageFlagBits2KHR VK_IMAGE_USAGE_2_SAMPLE_BLOCK_MATCH_BIT_QCOM = 0x00200000ULL; +static const VkImageUsageFlagBits2KHR VK_IMAGE_USAGE_2_HOST_TRANSFER_BIT_KHR = 0x00400000ULL; +static const VkImageUsageFlagBits2KHR VK_IMAGE_USAGE_2_TENSOR_ALIASING_BIT_ARM = 0x00800000ULL; +static const VkImageUsageFlagBits2KHR VK_IMAGE_USAGE_2_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR = 0x02000000ULL; +static const VkImageUsageFlagBits2KHR VK_IMAGE_USAGE_2_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR = 0x04000000ULL; +static const VkImageUsageFlagBits2KHR VK_IMAGE_USAGE_2_TILE_MEMORY_BIT_QCOM = 0x08000000ULL; + +typedef VkFlags64 VkImageCreateFlags2KHR; + +// Flag bits for VkImageCreateFlagBits2KHR +typedef VkFlags64 VkImageCreateFlagBits2KHR; +static const VkImageCreateFlagBits2KHR VK_IMAGE_CREATE_2_SPARSE_BINDING_BIT_KHR = 0x00000001ULL; +static const VkImageCreateFlagBits2KHR VK_IMAGE_CREATE_2_SPARSE_RESIDENCY_BIT_KHR = 0x00000002ULL; +static const VkImageCreateFlagBits2KHR VK_IMAGE_CREATE_2_SPARSE_ALIASED_BIT_KHR = 0x00000004ULL; +static const VkImageCreateFlagBits2KHR VK_IMAGE_CREATE_2_MUTABLE_FORMAT_BIT_KHR = 0x00000008ULL; +static const VkImageCreateFlagBits2KHR VK_IMAGE_CREATE_2_CUBE_COMPATIBLE_BIT_KHR = 0x00000010ULL; +static const VkImageCreateFlagBits2KHR VK_IMAGE_CREATE_2_ALIAS_SINGLE_LAYER_DESCRIPTOR_BIT_KHR = 0x00400000ULL; +static const VkImageCreateFlagBits2KHR VK_IMAGE_CREATE_2_2D_ARRAY_COMPATIBLE_BIT_KHR = 0x00000020ULL; +static const VkImageCreateFlagBits2KHR VK_IMAGE_CREATE_2_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR = 0x00000040ULL; +static const VkImageCreateFlagBits2KHR VK_IMAGE_CREATE_2_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT_KHR = 0x00000080ULL; +static const VkImageCreateFlagBits2KHR VK_IMAGE_CREATE_2_EXTENDED_USAGE_BIT_KHR = 0x00000100ULL; +static const VkImageCreateFlagBits2KHR VK_IMAGE_CREATE_2_DISJOINT_BIT_KHR = 0x00000200ULL; +static const VkImageCreateFlagBits2KHR VK_IMAGE_CREATE_2_ALIAS_BIT_KHR = 0x00000400ULL; +static const VkImageCreateFlagBits2KHR VK_IMAGE_CREATE_2_PROTECTED_BIT_KHR = 0x00000800ULL; +static const VkImageCreateFlagBits2KHR VK_IMAGE_CREATE_2_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT = 0x00001000ULL; +static const VkImageCreateFlagBits2KHR VK_IMAGE_CREATE_2_CORNER_SAMPLED_BIT_NV = 0x00002000ULL; +static const VkImageCreateFlagBits2KHR VK_IMAGE_CREATE_2_SUBSAMPLED_BIT_EXT = 0x00004000ULL; +static const VkImageCreateFlagBits2KHR VK_IMAGE_CREATE_2_FRAGMENT_DENSITY_MAP_OFFSET_BIT_EXT = 0x00008000ULL; +static const VkImageCreateFlagBits2KHR VK_IMAGE_CREATE_2_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT = 0x00010000ULL; +static const VkImageCreateFlagBits2KHR VK_IMAGE_CREATE_2_2D_VIEW_COMPATIBLE_BIT_EXT = 0x00020000ULL; +static const VkImageCreateFlagBits2KHR VK_IMAGE_CREATE_2_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_BIT_EXT = 0x00040000ULL; +static const VkImageCreateFlagBits2KHR VK_IMAGE_CREATE_2_VIDEO_PROFILE_INDEPENDENT_BIT_KHR = 0x00100000ULL; + +typedef struct VkFormatProperties4KHR { + VkStructureType sType; + void* pNext; + VkFormatFeatureFlags4KHR linearTilingFeatures; + VkFormatFeatureFlags4KHR optimalTilingFeatures; + VkFormatFeatureFlags4KHR bufferFeatures; +} VkFormatProperties4KHR; + +typedef struct VkImageUsageFlags2CreateInfoKHR { + VkStructureType sType; + void* pNext; + VkImageUsageFlags2KHR usage; +} VkImageUsageFlags2CreateInfoKHR; + +typedef struct VkImageCreateFlags2CreateInfoKHR { + VkStructureType sType; + void* pNext; + VkImageCreateFlags2KHR flags; +} VkImageCreateFlags2CreateInfoKHR; + +typedef struct VkImageViewUsage2CreateInfoKHR { + VkStructureType sType; + void* pNext; + VkImageUsageFlags2KHR usage; +} VkImageViewUsage2CreateInfoKHR; + +typedef struct VkPhysicalDeviceExtendedFlagsFeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 extendedFlags; +} VkPhysicalDeviceExtendedFlagsFeaturesKHR; + +typedef struct VkImageStencilUsage2CreateInfoKHR { + VkStructureType sType; + void* pNext; + VkImageUsageFlags2KHR stencilUsage; +} VkImageStencilUsage2CreateInfoKHR; + +typedef struct VkSharedPresentSurfaceCapabilities2KHR { + VkStructureType sType; + void* pNext; + VkImageUsageFlags2KHR sharedPresentSupportedUsageFlags; +} VkSharedPresentSurfaceCapabilities2KHR; + + + // VK_EXT_debug_report is a preprocessor guard. Do not pass it to API calls. #define VK_EXT_debug_report 1 VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDebugReportCallbackEXT) @@ -12954,9 +14991,9 @@ typedef enum VkDebugReportObjectTypeEXT { VK_DEBUG_REPORT_OBJECT_TYPE_CUDA_MODULE_NV_EXT = 1000307000, VK_DEBUG_REPORT_OBJECT_TYPE_CUDA_FUNCTION_NV_EXT = 1000307001, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_COLLECTION_FUCHSIA_EXT = 1000366000, - // VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT is a deprecated alias + // VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT is a legacy alias VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT_EXT, - // VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT is a deprecated alias + // VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT is a legacy alias VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_KHR_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_KHR_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_EXT, @@ -12995,17 +15032,22 @@ typedef void (VKAPI_PTR *PFN_vkDestroyDebugReportCallbackEXT)(VkInstance instanc typedef void (VKAPI_PTR *PFN_vkDebugReportMessageEXT)(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, uint64_t object, size_t location, int32_t messageCode, const char* pLayerPrefix, const char* pMessage); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugReportCallbackEXT( VkInstance instance, const VkDebugReportCallbackCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugReportCallbackEXT* pCallback); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkDestroyDebugReportCallbackEXT( VkInstance instance, VkDebugReportCallbackEXT callback, const VkAllocationCallbacks* pAllocator); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT( VkInstance instance, VkDebugReportFlagsEXT flags, @@ -13016,6 +15058,7 @@ VKAPI_ATTR void VKAPI_CALL vkDebugReportMessageEXT( const char* pLayerPrefix, const char* pMessage); #endif +#endif // VK_NV_glsl_shader is a preprocessor guard. Do not pass it to API calls. @@ -13102,25 +15145,35 @@ typedef void (VKAPI_PTR *PFN_vkCmdDebugMarkerEndEXT)(VkCommandBuffer commandBuff typedef void (VKAPI_PTR *PFN_vkCmdDebugMarkerInsertEXT)(VkCommandBuffer commandBuffer, const VkDebugMarkerMarkerInfoEXT* pMarkerInfo); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkDebugMarkerSetObjectTagEXT( VkDevice device, const VkDebugMarkerObjectTagInfoEXT* pTagInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkDebugMarkerSetObjectNameEXT( VkDevice device, const VkDebugMarkerObjectNameInfoEXT* pNameInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdDebugMarkerBeginEXT( VkCommandBuffer commandBuffer, const VkDebugMarkerMarkerInfoEXT* pMarkerInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdDebugMarkerEndEXT( VkCommandBuffer commandBuffer); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdDebugMarkerInsertEXT( VkCommandBuffer commandBuffer, const VkDebugMarkerMarkerInfoEXT* pMarkerInfo); #endif +#endif // VK_AMD_gcn_shader is a preprocessor guard. Do not pass it to API calls. @@ -13196,6 +15249,7 @@ typedef void (VKAPI_PTR *PFN_vkCmdEndQueryIndexedEXT)(VkCommandBuffer commandBuf typedef void (VKAPI_PTR *PFN_vkCmdDrawIndirectByteCountEXT)(VkCommandBuffer commandBuffer, uint32_t instanceCount, uint32_t firstInstance, VkBuffer counterBuffer, VkDeviceSize counterBufferOffset, uint32_t counterOffset, uint32_t vertexStride); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdBindTransformFeedbackBuffersEXT( VkCommandBuffer commandBuffer, uint32_t firstBinding, @@ -13203,34 +15257,44 @@ VKAPI_ATTR void VKAPI_CALL vkCmdBindTransformFeedbackBuffersEXT( const VkBuffer* pBuffers, const VkDeviceSize* pOffsets, const VkDeviceSize* pSizes); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdBeginTransformFeedbackEXT( VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer, uint32_t counterBufferCount, const VkBuffer* pCounterBuffers, const VkDeviceSize* pCounterBufferOffsets); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdEndTransformFeedbackEXT( VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer, uint32_t counterBufferCount, const VkBuffer* pCounterBuffers, const VkDeviceSize* pCounterBufferOffsets); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdBeginQueryIndexedEXT( VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query, VkQueryControlFlags flags, uint32_t index); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdEndQueryIndexedEXT( VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query, uint32_t index); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirectByteCountEXT( VkCommandBuffer commandBuffer, uint32_t instanceCount, @@ -13240,6 +15304,7 @@ VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirectByteCountEXT( uint32_t counterOffset, uint32_t vertexStride); #endif +#endif // VK_NVX_binary_import is a preprocessor guard. Do not pass it to API calls. @@ -13292,37 +15357,47 @@ typedef void (VKAPI_PTR *PFN_vkDestroyCuFunctionNVX)(VkDevice device, VkCuFuncti typedef void (VKAPI_PTR *PFN_vkCmdCuLaunchKernelNVX)(VkCommandBuffer commandBuffer, const VkCuLaunchInfoNVX* pLaunchInfo); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateCuModuleNVX( VkDevice device, const VkCuModuleCreateInfoNVX* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkCuModuleNVX* pModule); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateCuFunctionNVX( VkDevice device, const VkCuFunctionCreateInfoNVX* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkCuFunctionNVX* pFunction); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkDestroyCuModuleNVX( VkDevice device, VkCuModuleNVX module, const VkAllocationCallbacks* pAllocator); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkDestroyCuFunctionNVX( VkDevice device, VkCuFunctionNVX function, const VkAllocationCallbacks* pAllocator); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdCuLaunchKernelNVX( VkCommandBuffer commandBuffer, const VkCuLaunchInfoNVX* pLaunchInfo); #endif +#endif // VK_NVX_image_view_handle is a preprocessor guard. Do not pass it to API calls. #define VK_NVX_image_view_handle 1 -#define VK_NVX_IMAGE_VIEW_HANDLE_SPEC_VERSION 3 +#define VK_NVX_IMAGE_VIEW_HANDLE_SPEC_VERSION 4 #define VK_NVX_IMAGE_VIEW_HANDLE_EXTENSION_NAME "VK_NVX_image_view_handle" typedef struct VkImageViewHandleInfoNVX { VkStructureType sType; @@ -13342,22 +15417,36 @@ typedef struct VkImageViewAddressPropertiesNVX { typedef uint32_t (VKAPI_PTR *PFN_vkGetImageViewHandleNVX)(VkDevice device, const VkImageViewHandleInfoNVX* pInfo); typedef uint64_t (VKAPI_PTR *PFN_vkGetImageViewHandle64NVX)(VkDevice device, const VkImageViewHandleInfoNVX* pInfo); typedef VkResult (VKAPI_PTR *PFN_vkGetImageViewAddressNVX)(VkDevice device, VkImageView imageView, VkImageViewAddressPropertiesNVX* pProperties); +typedef uint64_t (VKAPI_PTR *PFN_vkGetDeviceCombinedImageSamplerIndexNVX)(VkDevice device, uint64_t imageViewIndex, uint64_t samplerIndex); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR uint32_t VKAPI_CALL vkGetImageViewHandleNVX( VkDevice device, const VkImageViewHandleInfoNVX* pInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR uint64_t VKAPI_CALL vkGetImageViewHandle64NVX( VkDevice device, const VkImageViewHandleInfoNVX* pInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetImageViewAddressNVX( VkDevice device, VkImageView imageView, VkImageViewAddressPropertiesNVX* pProperties); #endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR uint64_t VKAPI_CALL vkGetDeviceCombinedImageSamplerIndexNVX( + VkDevice device, + uint64_t imageViewIndex, + uint64_t samplerIndex); +#endif +#endif + // VK_AMD_draw_indirect_count is a preprocessor guard. Do not pass it to API calls. #define VK_AMD_draw_indirect_count 1 @@ -13367,6 +15456,7 @@ typedef void (VKAPI_PTR *PFN_vkCmdDrawIndirectCountAMD)(VkCommandBuffer commandB typedef void (VKAPI_PTR *PFN_vkCmdDrawIndexedIndirectCountAMD)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirectCountAMD( VkCommandBuffer commandBuffer, VkBuffer buffer, @@ -13375,7 +15465,9 @@ VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirectCountAMD( VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirectCountAMD( VkCommandBuffer commandBuffer, VkBuffer buffer, @@ -13385,6 +15477,7 @@ VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirectCountAMD( uint32_t maxDrawCount, uint32_t stride); #endif +#endif // VK_AMD_negative_viewport_height is a preprocessor guard. Do not pass it to API calls. @@ -13449,6 +15542,7 @@ typedef struct VkShaderStatisticsInfoAMD { typedef VkResult (VKAPI_PTR *PFN_vkGetShaderInfoAMD)(VkDevice device, VkPipeline pipeline, VkShaderStageFlagBits shaderStage, VkShaderInfoTypeAMD infoType, size_t* pInfoSize, void* pInfo); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetShaderInfoAMD( VkDevice device, VkPipeline pipeline, @@ -13457,6 +15551,7 @@ VKAPI_ATTR VkResult VKAPI_CALL vkGetShaderInfoAMD( size_t* pInfoSize, void* pInfo); #endif +#endif // VK_AMD_shader_image_load_store_lod is a preprocessor guard. Do not pass it to API calls. @@ -13514,6 +15609,7 @@ typedef struct VkExternalImageFormatPropertiesNV { typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalImageFormatPropertiesNV)(VkPhysicalDevice physicalDevice, VkFormat format, VkImageType type, VkImageTiling tiling, VkImageUsageFlags usage, VkImageCreateFlags flags, VkExternalMemoryHandleTypeFlagsNV externalHandleType, VkExternalImageFormatPropertiesNV* pExternalImageFormatProperties); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceExternalImageFormatPropertiesNV( VkPhysicalDevice physicalDevice, VkFormat format, @@ -13524,6 +15620,7 @@ VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceExternalImageFormatPropertiesN VkExternalMemoryHandleTypeFlagsNV externalHandleType, VkExternalImageFormatPropertiesNV* pExternalImageFormatProperties); #endif +#endif // VK_NV_external_memory is a preprocessor guard. Do not pass it to API calls. @@ -13621,12 +15718,6 @@ typedef VkPipelineRobustnessCreateInfo VkPipelineRobustnessCreateInfoEXT; #define VK_EXT_conditional_rendering 1 #define VK_EXT_CONDITIONAL_RENDERING_SPEC_VERSION 2 #define VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME "VK_EXT_conditional_rendering" - -typedef enum VkConditionalRenderingFlagBitsEXT { - VK_CONDITIONAL_RENDERING_INVERTED_BIT_EXT = 0x00000001, - VK_CONDITIONAL_RENDERING_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF -} VkConditionalRenderingFlagBitsEXT; -typedef VkFlags VkConditionalRenderingFlagsEXT; typedef struct VkConditionalRenderingBeginInfoEXT { VkStructureType sType; const void* pNext; @@ -13652,13 +15743,17 @@ typedef void (VKAPI_PTR *PFN_vkCmdBeginConditionalRenderingEXT)(VkCommandBuffer typedef void (VKAPI_PTR *PFN_vkCmdEndConditionalRenderingEXT)(VkCommandBuffer commandBuffer); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdBeginConditionalRenderingEXT( VkCommandBuffer commandBuffer, const VkConditionalRenderingBeginInfoEXT* pConditionalRenderingBegin); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdEndConditionalRenderingEXT( VkCommandBuffer commandBuffer); #endif +#endif // VK_NV_clip_space_w_scaling is a preprocessor guard. Do not pass it to API calls. @@ -13681,12 +15776,14 @@ typedef struct VkPipelineViewportWScalingStateCreateInfoNV { typedef void (VKAPI_PTR *PFN_vkCmdSetViewportWScalingNV)(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewportWScalingNV* pViewportWScalings); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetViewportWScalingNV( VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewportWScalingNV* pViewportWScalings); #endif +#endif // VK_EXT_direct_mode_display is a preprocessor guard. Do not pass it to API calls. @@ -13696,10 +15793,12 @@ VKAPI_ATTR void VKAPI_CALL vkCmdSetViewportWScalingNV( typedef VkResult (VKAPI_PTR *PFN_vkReleaseDisplayEXT)(VkPhysicalDevice physicalDevice, VkDisplayKHR display); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkReleaseDisplayEXT( VkPhysicalDevice physicalDevice, VkDisplayKHR display); #endif +#endif // VK_EXT_display_surface_counter is a preprocessor guard. Do not pass it to API calls. @@ -13709,7 +15808,7 @@ VKAPI_ATTR VkResult VKAPI_CALL vkReleaseDisplayEXT( typedef enum VkSurfaceCounterFlagBitsEXT { VK_SURFACE_COUNTER_VBLANK_BIT_EXT = 0x00000001, - // VK_SURFACE_COUNTER_VBLANK_EXT is a deprecated alias + // VK_SURFACE_COUNTER_VBLANK_EXT is a legacy alias VK_SURFACE_COUNTER_VBLANK_EXT = VK_SURFACE_COUNTER_VBLANK_BIT_EXT, VK_SURFACE_COUNTER_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF } VkSurfaceCounterFlagBitsEXT; @@ -13733,11 +15832,13 @@ typedef struct VkSurfaceCapabilities2EXT { typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSurfaceCapabilities2EXT)(VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilities2EXT* pSurfaceCapabilities); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfaceCapabilities2EXT( VkPhysicalDevice physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilities2EXT* pSurfaceCapabilities); #endif +#endif // VK_EXT_display_control is a preprocessor guard. Do not pass it to API calls. @@ -13791,30 +15892,38 @@ typedef VkResult (VKAPI_PTR *PFN_vkRegisterDisplayEventEXT)(VkDevice device, VkD typedef VkResult (VKAPI_PTR *PFN_vkGetSwapchainCounterEXT)(VkDevice device, VkSwapchainKHR swapchain, VkSurfaceCounterFlagBitsEXT counter, uint64_t* pCounterValue); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkDisplayPowerControlEXT( VkDevice device, VkDisplayKHR display, const VkDisplayPowerInfoEXT* pDisplayPowerInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkRegisterDeviceEventEXT( VkDevice device, const VkDeviceEventInfoEXT* pDeviceEventInfo, const VkAllocationCallbacks* pAllocator, VkFence* pFence); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkRegisterDisplayEventEXT( VkDevice device, VkDisplayKHR display, const VkDisplayEventInfoEXT* pDisplayEventInfo, const VkAllocationCallbacks* pAllocator, VkFence* pFence); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetSwapchainCounterEXT( VkDevice device, VkSwapchainKHR swapchain, VkSurfaceCounterFlagBitsEXT counter, uint64_t* pCounterValue); #endif +#endif // VK_GOOGLE_display_timing is a preprocessor guard. Do not pass it to API calls. @@ -13849,17 +15958,21 @@ typedef VkResult (VKAPI_PTR *PFN_vkGetRefreshCycleDurationGOOGLE)(VkDevice devic typedef VkResult (VKAPI_PTR *PFN_vkGetPastPresentationTimingGOOGLE)(VkDevice device, VkSwapchainKHR swapchain, uint32_t* pPresentationTimingCount, VkPastPresentationTimingGOOGLE* pPresentationTimings); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetRefreshCycleDurationGOOGLE( VkDevice device, VkSwapchainKHR swapchain, VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPastPresentationTimingGOOGLE( VkDevice device, VkSwapchainKHR swapchain, uint32_t* pPresentationTimingCount, VkPastPresentationTimingGOOGLE* pPresentationTimings); #endif +#endif // VK_NV_sample_mask_override_coverage is a preprocessor guard. Do not pass it to API calls. @@ -13878,9 +15991,9 @@ VKAPI_ATTR VkResult VKAPI_CALL vkGetPastPresentationTimingGOOGLE( #define VK_NV_viewport_array2 1 #define VK_NV_VIEWPORT_ARRAY_2_SPEC_VERSION 1 #define VK_NV_VIEWPORT_ARRAY_2_EXTENSION_NAME "VK_NV_viewport_array2" -// VK_NV_VIEWPORT_ARRAY2_SPEC_VERSION is a deprecated alias +// VK_NV_VIEWPORT_ARRAY2_SPEC_VERSION is a legacy alias #define VK_NV_VIEWPORT_ARRAY2_SPEC_VERSION VK_NV_VIEWPORT_ARRAY_2_SPEC_VERSION -// VK_NV_VIEWPORT_ARRAY2_EXTENSION_NAME is a deprecated alias +// VK_NV_VIEWPORT_ARRAY2_EXTENSION_NAME is a legacy alias #define VK_NV_VIEWPORT_ARRAY2_EXTENSION_NAME VK_NV_VIEWPORT_ARRAY_2_EXTENSION_NAME @@ -13968,20 +16081,26 @@ typedef void (VKAPI_PTR *PFN_vkCmdSetDiscardRectangleEnableEXT)(VkCommandBuffer typedef void (VKAPI_PTR *PFN_vkCmdSetDiscardRectangleModeEXT)(VkCommandBuffer commandBuffer, VkDiscardRectangleModeEXT discardRectangleMode); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetDiscardRectangleEXT( VkCommandBuffer commandBuffer, uint32_t firstDiscardRectangle, uint32_t discardRectangleCount, const VkRect2D* pDiscardRectangles); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetDiscardRectangleEnableEXT( VkCommandBuffer commandBuffer, VkBool32 discardRectangleEnable); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetDiscardRectangleModeEXT( VkCommandBuffer commandBuffer, VkDiscardRectangleModeEXT discardRectangleMode); #endif +#endif // VK_EXT_conservative_rasterization is a preprocessor guard. Do not pass it to API calls. @@ -14071,12 +16190,14 @@ typedef struct VkHdrMetadataEXT { typedef void (VKAPI_PTR *PFN_vkSetHdrMetadataEXT)(VkDevice device, uint32_t swapchainCount, const VkSwapchainKHR* pSwapchains, const VkHdrMetadataEXT* pMetadata); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkSetHdrMetadataEXT( VkDevice device, uint32_t swapchainCount, const VkSwapchainKHR* pSwapchains, const VkHdrMetadataEXT* pMetadata); #endif +#endif // VK_IMG_relaxed_line_rasterization is a preprocessor guard. Do not pass it to API calls. @@ -14160,10 +16281,10 @@ typedef struct VkDebugUtilsMessengerCallbackDataEXT { } VkDebugUtilsMessengerCallbackDataEXT; typedef VkBool32 (VKAPI_PTR *PFN_vkDebugUtilsMessengerCallbackEXT)( - VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, - VkDebugUtilsMessageTypeFlagsEXT messageTypes, - const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, - void* pUserData); + VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, + VkDebugUtilsMessageTypeFlagsEXT messageTypes, + const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, + void* pUserData); typedef struct VkDebugUtilsMessengerCreateInfoEXT { VkStructureType sType; @@ -14198,53 +16319,75 @@ typedef void (VKAPI_PTR *PFN_vkDestroyDebugUtilsMessengerEXT)(VkInstance instanc typedef void (VKAPI_PTR *PFN_vkSubmitDebugUtilsMessageEXT)(VkInstance instance, VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageTypes, const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkSetDebugUtilsObjectNameEXT( VkDevice device, const VkDebugUtilsObjectNameInfoEXT* pNameInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkSetDebugUtilsObjectTagEXT( VkDevice device, const VkDebugUtilsObjectTagInfoEXT* pTagInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkQueueBeginDebugUtilsLabelEXT( VkQueue queue, const VkDebugUtilsLabelEXT* pLabelInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkQueueEndDebugUtilsLabelEXT( VkQueue queue); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkQueueInsertDebugUtilsLabelEXT( VkQueue queue, const VkDebugUtilsLabelEXT* pLabelInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdBeginDebugUtilsLabelEXT( VkCommandBuffer commandBuffer, const VkDebugUtilsLabelEXT* pLabelInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdEndDebugUtilsLabelEXT( VkCommandBuffer commandBuffer); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdInsertDebugUtilsLabelEXT( VkCommandBuffer commandBuffer, const VkDebugUtilsLabelEXT* pLabelInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateDebugUtilsMessengerEXT( VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugUtilsMessengerEXT* pMessenger); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkDestroyDebugUtilsMessengerEXT( VkInstance instance, VkDebugUtilsMessengerEXT messenger, const VkAllocationCallbacks* pAllocator); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkSubmitDebugUtilsMessageEXT( VkInstance instance, VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageTypes, const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData); #endif +#endif // VK_EXT_sampler_filter_minmax is a preprocessor guard. Do not pass it to API calls. @@ -14265,6 +16408,656 @@ typedef VkPhysicalDeviceSamplerFilterMinmaxProperties VkPhysicalDeviceSamplerFil #define VK_AMD_GPU_SHADER_INT16_EXTENSION_NAME "VK_AMD_gpu_shader_int16" +// VK_AMD_gpa_interface is a preprocessor guard. Do not pass it to API calls. +#define VK_AMD_gpa_interface 1 +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkGpaSessionAMD) +#define VK_AMD_GPA_INTERFACE_SPEC_VERSION 1 +#define VK_AMD_GPA_INTERFACE_EXTENSION_NAME "VK_AMD_gpa_interface" + +typedef enum VkGpaPerfBlockAMD { + VK_GPA_PERF_BLOCK_CPF_AMD = 0, + VK_GPA_PERF_BLOCK_IA_AMD = 1, + VK_GPA_PERF_BLOCK_VGT_AMD = 2, + VK_GPA_PERF_BLOCK_PA_AMD = 3, + VK_GPA_PERF_BLOCK_SC_AMD = 4, + VK_GPA_PERF_BLOCK_SPI_AMD = 5, + VK_GPA_PERF_BLOCK_SQ_AMD = 6, + VK_GPA_PERF_BLOCK_SX_AMD = 7, + VK_GPA_PERF_BLOCK_TA_AMD = 8, + VK_GPA_PERF_BLOCK_TD_AMD = 9, + VK_GPA_PERF_BLOCK_TCP_AMD = 10, + VK_GPA_PERF_BLOCK_TCC_AMD = 11, + VK_GPA_PERF_BLOCK_TCA_AMD = 12, + VK_GPA_PERF_BLOCK_DB_AMD = 13, + VK_GPA_PERF_BLOCK_CB_AMD = 14, + VK_GPA_PERF_BLOCK_GDS_AMD = 15, + VK_GPA_PERF_BLOCK_SRBM_AMD = 16, + VK_GPA_PERF_BLOCK_GRBM_AMD = 17, + VK_GPA_PERF_BLOCK_GRBM_SE_AMD = 18, + VK_GPA_PERF_BLOCK_RLC_AMD = 19, + VK_GPA_PERF_BLOCK_DMA_AMD = 20, + VK_GPA_PERF_BLOCK_MC_AMD = 21, + VK_GPA_PERF_BLOCK_CPG_AMD = 22, + VK_GPA_PERF_BLOCK_CPC_AMD = 23, + VK_GPA_PERF_BLOCK_WD_AMD = 24, + VK_GPA_PERF_BLOCK_TCS_AMD = 25, + VK_GPA_PERF_BLOCK_ATC_AMD = 26, + VK_GPA_PERF_BLOCK_ATC_L2_AMD = 27, + VK_GPA_PERF_BLOCK_MC_VM_L2_AMD = 28, + VK_GPA_PERF_BLOCK_EA_AMD = 29, + VK_GPA_PERF_BLOCK_RPB_AMD = 30, + VK_GPA_PERF_BLOCK_RMI_AMD = 31, + VK_GPA_PERF_BLOCK_UMCCH_AMD = 32, + VK_GPA_PERF_BLOCK_GE_AMD = 33, + VK_GPA_PERF_BLOCK_GL1A_AMD = 34, + VK_GPA_PERF_BLOCK_GL1C_AMD = 35, + VK_GPA_PERF_BLOCK_GL1CG_AMD = 36, + VK_GPA_PERF_BLOCK_GL2A_AMD = 37, + VK_GPA_PERF_BLOCK_GL2C_AMD = 38, + VK_GPA_PERF_BLOCK_CHA_AMD = 39, + VK_GPA_PERF_BLOCK_CHC_AMD = 40, + VK_GPA_PERF_BLOCK_CHCG_AMD = 41, + VK_GPA_PERF_BLOCK_GUS_AMD = 42, + VK_GPA_PERF_BLOCK_GCR_AMD = 43, + VK_GPA_PERF_BLOCK_PH_AMD = 44, + VK_GPA_PERF_BLOCK_UTCL1_AMD = 45, + VK_GPA_PERF_BLOCK_GE_DIST_AMD = 46, + VK_GPA_PERF_BLOCK_GE_SE_AMD = 47, + VK_GPA_PERF_BLOCK_DF_MALL_AMD = 48, + VK_GPA_PERF_BLOCK_SQ_WGP_AMD = 49, + VK_GPA_PERF_BLOCK_PC_AMD = 50, + VK_GPA_PERF_BLOCK_GL1XA_AMD = 51, + VK_GPA_PERF_BLOCK_GL1XC_AMD = 52, + VK_GPA_PERF_BLOCK_WGS_AMD = 53, + VK_GPA_PERF_BLOCK_EACPWD_AMD = 54, + VK_GPA_PERF_BLOCK_EASE_AMD = 55, + VK_GPA_PERF_BLOCK_RLCUSER_AMD = 56, + VK_GPA_PERF_BLOCK_GE1_AMD = VK_GPA_PERF_BLOCK_GE_AMD, + VK_GPA_PERF_BLOCK_RLCLOCAL_AMD = VK_GPA_PERF_BLOCK_RLCUSER_AMD, + VK_GPA_PERF_BLOCK_MAX_ENUM_AMD = 0x7FFFFFFF +} VkGpaPerfBlockAMD; + +typedef enum VkGpaSampleTypeAMD { + VK_GPA_SAMPLE_TYPE_CUMULATIVE_AMD = 0, + VK_GPA_SAMPLE_TYPE_TRACE_AMD = 1, + VK_GPA_SAMPLE_TYPE_TIMING_AMD = 2, + VK_GPA_SAMPLE_TYPE_MAX_ENUM_AMD = 0x7FFFFFFF +} VkGpaSampleTypeAMD; + +typedef enum VkGpaDeviceClockModeAMD { + VK_GPA_DEVICE_CLOCK_MODE_DEFAULT_AMD = 0, + VK_GPA_DEVICE_CLOCK_MODE_QUERY_AMD = 1, + VK_GPA_DEVICE_CLOCK_MODE_PROFILING_AMD = 2, + VK_GPA_DEVICE_CLOCK_MODE_MIN_MEMORY_AMD = 3, + VK_GPA_DEVICE_CLOCK_MODE_MIN_ENGINE_AMD = 4, + VK_GPA_DEVICE_CLOCK_MODE_PEAK_AMD = 5, + VK_GPA_DEVICE_CLOCK_MODE_MAX_ENUM_AMD = 0x7FFFFFFF +} VkGpaDeviceClockModeAMD; + +typedef enum VkGpaSqShaderStageFlagBitsAMD { + VK_GPA_SQ_SHADER_STAGE_PS_BIT_AMD = 0x00000001, + VK_GPA_SQ_SHADER_STAGE_VS_BIT_AMD = 0x00000002, + VK_GPA_SQ_SHADER_STAGE_GS_BIT_AMD = 0x00000004, + VK_GPA_SQ_SHADER_STAGE_ES_BIT_AMD = 0x00000008, + VK_GPA_SQ_SHADER_STAGE_HS_BIT_AMD = 0x00000010, + VK_GPA_SQ_SHADER_STAGE_LS_BIT_AMD = 0x00000020, + VK_GPA_SQ_SHADER_STAGE_CS_BIT_AMD = 0x00000040, + VK_GPA_SQ_SHADER_STAGE_FLAG_BITS_MAX_ENUM_AMD = 0x7FFFFFFF +} VkGpaSqShaderStageFlagBitsAMD; +typedef VkFlags VkGpaSqShaderStageFlagsAMD; +typedef VkFlags VkGpaPerfBlockPropertiesFlagsAMD; +typedef VkFlags VkPhysicalDeviceGpaPropertiesFlagsAMD; +typedef struct VkGpaPerfBlockPropertiesAMD { + VkGpaPerfBlockAMD blockType; + VkGpaPerfBlockPropertiesFlagsAMD flags; + uint32_t instanceCount; + uint32_t maxEventID; + uint32_t maxGlobalOnlyCounters; + uint32_t maxGlobalSharedCounters; + uint32_t maxStreamingCounters; +} VkGpaPerfBlockPropertiesAMD; + +typedef struct VkPhysicalDeviceGpaFeaturesAMD { + VkStructureType sType; + void* pNext; + VkBool32 perfCounters; + VkBool32 streamingPerfCounters; + VkBool32 sqThreadTracing; + VkBool32 clockModes; +} VkPhysicalDeviceGpaFeaturesAMD; + +typedef struct VkPhysicalDeviceGpaPropertiesAMD { + VkStructureType sType; + void* pNext; + VkPhysicalDeviceGpaPropertiesFlagsAMD flags; + VkDeviceSize maxSqttSeBufferSize; + uint32_t shaderEngineCount; + uint32_t perfBlockCount; + VkGpaPerfBlockPropertiesAMD* pPerfBlocks; +} VkPhysicalDeviceGpaPropertiesAMD; + +typedef struct VkPhysicalDeviceGpaProperties2AMD { + VkStructureType sType; + void* pNext; + uint32_t revisionId; +} VkPhysicalDeviceGpaProperties2AMD; + +typedef struct VkGpaPerfCounterAMD { + VkGpaPerfBlockAMD blockType; + uint32_t blockInstance; + uint32_t eventID; +} VkGpaPerfCounterAMD; + +typedef struct VkGpaSampleBeginInfoAMD { + VkStructureType sType; + const void* pNext; + VkGpaSampleTypeAMD sampleType; + VkBool32 sampleInternalOperations; + VkBool32 cacheFlushOnCounterCollection; + VkBool32 sqShaderMaskEnable; + VkGpaSqShaderStageFlagsAMD sqShaderMask; + uint32_t perfCounterCount; + const VkGpaPerfCounterAMD* pPerfCounters; + uint32_t streamingPerfTraceSampleInterval; + VkDeviceSize perfCounterDeviceMemoryLimit; + VkBool32 sqThreadTraceEnable; + VkBool32 sqThreadTraceSuppressInstructionTokens; + VkDeviceSize sqThreadTraceDeviceMemoryLimit; + VkPipelineStageFlags timingPreSample; + VkPipelineStageFlags timingPostSample; +} VkGpaSampleBeginInfoAMD; + +typedef struct VkGpaDeviceClockModeInfoAMD { + VkStructureType sType; + const void* pNext; + VkGpaDeviceClockModeAMD clockMode; + float memoryClockRatioToPeak; + float engineClockRatioToPeak; +} VkGpaDeviceClockModeInfoAMD; + +typedef struct VkGpaDeviceGetClockInfoAMD { + VkStructureType sType; + void* pNext; + float memoryClockRatioToPeak; + float engineClockRatioToPeak; + uint32_t memoryClockFrequency; + uint32_t engineClockFrequency; +} VkGpaDeviceGetClockInfoAMD; + +typedef struct VkGpaSessionCreateInfoAMD { + VkStructureType sType; + const void* pNext; + VkGpaSessionAMD secondaryCopySource; +} VkGpaSessionCreateInfoAMD; + +typedef VkResult (VKAPI_PTR *PFN_vkCreateGpaSessionAMD)(VkDevice device, const VkGpaSessionCreateInfoAMD* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkGpaSessionAMD* pGpaSession); +typedef void (VKAPI_PTR *PFN_vkDestroyGpaSessionAMD)(VkDevice device, VkGpaSessionAMD gpaSession, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkSetGpaDeviceClockModeAMD)(VkDevice device, VkGpaDeviceClockModeInfoAMD* pInfo); +typedef VkResult (VKAPI_PTR *PFN_vkGetGpaDeviceClockInfoAMD)(VkDevice device, VkGpaDeviceGetClockInfoAMD* pInfo); +typedef VkResult (VKAPI_PTR *PFN_vkCmdBeginGpaSessionAMD)(VkCommandBuffer commandBuffer, VkGpaSessionAMD gpaSession); +typedef VkResult (VKAPI_PTR *PFN_vkCmdEndGpaSessionAMD)(VkCommandBuffer commandBuffer, VkGpaSessionAMD gpaSession); +typedef VkResult (VKAPI_PTR *PFN_vkCmdBeginGpaSampleAMD)(VkCommandBuffer commandBuffer, VkGpaSessionAMD gpaSession, const VkGpaSampleBeginInfoAMD* pGpaSampleBeginInfo, uint32_t* pSampleID); +typedef void (VKAPI_PTR *PFN_vkCmdEndGpaSampleAMD)(VkCommandBuffer commandBuffer, VkGpaSessionAMD gpaSession, uint32_t sampleID); +typedef VkResult (VKAPI_PTR *PFN_vkGetGpaSessionStatusAMD)(VkDevice device, VkGpaSessionAMD gpaSession); +typedef VkResult (VKAPI_PTR *PFN_vkGetGpaSessionResultsAMD)(VkDevice device, VkGpaSessionAMD gpaSession, uint32_t sampleID, size_t* pSizeInBytes, void* pData); +typedef VkResult (VKAPI_PTR *PFN_vkResetGpaSessionAMD)(VkDevice device, VkGpaSessionAMD gpaSession); +typedef void (VKAPI_PTR *PFN_vkCmdCopyGpaSessionResultsAMD)(VkCommandBuffer commandBuffer, VkGpaSessionAMD gpaSession); + +#ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateGpaSessionAMD( + VkDevice device, + const VkGpaSessionCreateInfoAMD* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkGpaSessionAMD* pGpaSession); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkDestroyGpaSessionAMD( + VkDevice device, + VkGpaSessionAMD gpaSession, + const VkAllocationCallbacks* pAllocator); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkSetGpaDeviceClockModeAMD( + VkDevice device, + VkGpaDeviceClockModeInfoAMD* pInfo); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetGpaDeviceClockInfoAMD( + VkDevice device, + VkGpaDeviceGetClockInfoAMD* pInfo); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCmdBeginGpaSessionAMD( + VkCommandBuffer commandBuffer, + VkGpaSessionAMD gpaSession); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCmdEndGpaSessionAMD( + VkCommandBuffer commandBuffer, + VkGpaSessionAMD gpaSession); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCmdBeginGpaSampleAMD( + VkCommandBuffer commandBuffer, + VkGpaSessionAMD gpaSession, + const VkGpaSampleBeginInfoAMD* pGpaSampleBeginInfo, + uint32_t* pSampleID); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdEndGpaSampleAMD( + VkCommandBuffer commandBuffer, + VkGpaSessionAMD gpaSession, + uint32_t sampleID); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetGpaSessionStatusAMD( + VkDevice device, + VkGpaSessionAMD gpaSession); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetGpaSessionResultsAMD( + VkDevice device, + VkGpaSessionAMD gpaSession, + uint32_t sampleID, + size_t* pSizeInBytes, + void* pData); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkResetGpaSessionAMD( + VkDevice device, + VkGpaSessionAMD gpaSession); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdCopyGpaSessionResultsAMD( + VkCommandBuffer commandBuffer, + VkGpaSessionAMD gpaSession); +#endif +#endif + + +// VK_EXT_descriptor_heap is a preprocessor guard. Do not pass it to API calls. +#define VK_EXT_descriptor_heap 1 +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkTensorARM) +#define VK_EXT_DESCRIPTOR_HEAP_SPEC_VERSION 1 +#define VK_EXT_DESCRIPTOR_HEAP_EXTENSION_NAME "VK_EXT_descriptor_heap" + +typedef enum VkDescriptorMappingSourceEXT { + VK_DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_CONSTANT_OFFSET_EXT = 0, + VK_DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_PUSH_INDEX_EXT = 1, + VK_DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_INDIRECT_INDEX_EXT = 2, + VK_DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_INDIRECT_INDEX_ARRAY_EXT = 3, + VK_DESCRIPTOR_MAPPING_SOURCE_RESOURCE_HEAP_DATA_EXT = 4, + VK_DESCRIPTOR_MAPPING_SOURCE_PUSH_DATA_EXT = 5, + VK_DESCRIPTOR_MAPPING_SOURCE_PUSH_ADDRESS_EXT = 6, + VK_DESCRIPTOR_MAPPING_SOURCE_INDIRECT_ADDRESS_EXT = 7, + VK_DESCRIPTOR_MAPPING_SOURCE_HEAP_WITH_SHADER_RECORD_INDEX_EXT = 8, + VK_DESCRIPTOR_MAPPING_SOURCE_SHADER_RECORD_DATA_EXT = 9, + VK_DESCRIPTOR_MAPPING_SOURCE_SHADER_RECORD_ADDRESS_EXT = 10, + VK_DESCRIPTOR_MAPPING_SOURCE_MAX_ENUM_EXT = 0x7FFFFFFF +} VkDescriptorMappingSourceEXT; +typedef VkFlags64 VkTensorViewCreateFlagsARM; + +// Flag bits for VkTensorViewCreateFlagBitsARM +typedef VkFlags64 VkTensorViewCreateFlagBitsARM; +static const VkTensorViewCreateFlagBitsARM VK_TENSOR_VIEW_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_ARM = 0x00000001ULL; + + +typedef enum VkSpirvResourceTypeFlagBitsEXT { + VK_SPIRV_RESOURCE_TYPE_ALL_EXT = 0x7FFFFFFF, + VK_SPIRV_RESOURCE_TYPE_SAMPLER_BIT_EXT = 0x00000001, + VK_SPIRV_RESOURCE_TYPE_SAMPLED_IMAGE_BIT_EXT = 0x00000002, + VK_SPIRV_RESOURCE_TYPE_READ_ONLY_IMAGE_BIT_EXT = 0x00000004, + VK_SPIRV_RESOURCE_TYPE_READ_WRITE_IMAGE_BIT_EXT = 0x00000008, + VK_SPIRV_RESOURCE_TYPE_COMBINED_SAMPLED_IMAGE_BIT_EXT = 0x00000010, + VK_SPIRV_RESOURCE_TYPE_UNIFORM_BUFFER_BIT_EXT = 0x00000020, + VK_SPIRV_RESOURCE_TYPE_READ_ONLY_STORAGE_BUFFER_BIT_EXT = 0x00000040, + VK_SPIRV_RESOURCE_TYPE_READ_WRITE_STORAGE_BUFFER_BIT_EXT = 0x00000080, + VK_SPIRV_RESOURCE_TYPE_ACCELERATION_STRUCTURE_BIT_EXT = 0x00000100, + VK_SPIRV_RESOURCE_TYPE_TENSOR_BIT_ARM = 0x00000200, + VK_SPIRV_RESOURCE_TYPE_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF +} VkSpirvResourceTypeFlagBitsEXT; +typedef VkFlags VkSpirvResourceTypeFlagsEXT; +typedef struct VkHostAddressRangeEXT { + void* address; + size_t size; +} VkHostAddressRangeEXT; + +typedef struct VkHostAddressRangeConstEXT { + const void* address; + size_t size; +} VkHostAddressRangeConstEXT; + +typedef VkDeviceAddressRangeKHR VkDeviceAddressRangeEXT; + +typedef struct VkTexelBufferDescriptorInfoEXT { + VkStructureType sType; + const void* pNext; + VkFormat format; + VkDeviceAddressRangeEXT addressRange; +} VkTexelBufferDescriptorInfoEXT; + +typedef struct VkImageDescriptorInfoEXT { + VkStructureType sType; + const void* pNext; + const VkImageViewCreateInfo* pView; + VkImageLayout layout; +} VkImageDescriptorInfoEXT; + +typedef struct VkTensorViewCreateInfoARM { + VkStructureType sType; + const void* pNext; + VkTensorViewCreateFlagsARM flags; + VkTensorARM tensor; + VkFormat format; +} VkTensorViewCreateInfoARM; + +typedef union VkResourceDescriptorDataEXT { + const VkImageDescriptorInfoEXT* pImage; + const VkTexelBufferDescriptorInfoEXT* pTexelBuffer; + const VkDeviceAddressRangeEXT* pAddressRange; + const VkTensorViewCreateInfoARM* pTensorARM; +} VkResourceDescriptorDataEXT; + +typedef struct VkResourceDescriptorInfoEXT { + VkStructureType sType; + const void* pNext; + VkDescriptorType type; + VkResourceDescriptorDataEXT data; +} VkResourceDescriptorInfoEXT; + +typedef struct VkBindHeapInfoEXT { + VkStructureType sType; + const void* pNext; + VkDeviceAddressRangeEXT heapRange; + VkDeviceSize reservedRangeOffset; + VkDeviceSize reservedRangeSize; +} VkBindHeapInfoEXT; + +typedef struct VkPushDataInfoEXT { + VkStructureType sType; + const void* pNext; + uint32_t offset; + VkHostAddressRangeConstEXT data; +} VkPushDataInfoEXT; + +typedef struct VkDescriptorMappingSourceConstantOffsetEXT { + uint32_t heapOffset; + uint32_t heapArrayStride; + const VkSamplerCreateInfo* pEmbeddedSampler; + uint32_t samplerHeapOffset; + uint32_t samplerHeapArrayStride; +} VkDescriptorMappingSourceConstantOffsetEXT; + +typedef struct VkDescriptorMappingSourcePushIndexEXT { + uint32_t heapOffset; + uint32_t pushOffset; + uint32_t heapIndexStride; + uint32_t heapArrayStride; + const VkSamplerCreateInfo* pEmbeddedSampler; + VkBool32 useCombinedImageSamplerIndex; + uint32_t samplerHeapOffset; + uint32_t samplerPushOffset; + uint32_t samplerHeapIndexStride; + uint32_t samplerHeapArrayStride; +} VkDescriptorMappingSourcePushIndexEXT; + +typedef struct VkDescriptorMappingSourceIndirectIndexEXT { + uint32_t heapOffset; + uint32_t pushOffset; + uint32_t addressOffset; + uint32_t heapIndexStride; + uint32_t heapArrayStride; + const VkSamplerCreateInfo* pEmbeddedSampler; + VkBool32 useCombinedImageSamplerIndex; + uint32_t samplerHeapOffset; + uint32_t samplerPushOffset; + uint32_t samplerAddressOffset; + uint32_t samplerHeapIndexStride; + uint32_t samplerHeapArrayStride; +} VkDescriptorMappingSourceIndirectIndexEXT; + +typedef struct VkDescriptorMappingSourceHeapDataEXT { + uint32_t heapOffset; + uint32_t pushOffset; +} VkDescriptorMappingSourceHeapDataEXT; + +typedef struct VkDescriptorMappingSourceIndirectAddressEXT { + uint32_t pushOffset; + uint32_t addressOffset; +} VkDescriptorMappingSourceIndirectAddressEXT; + +typedef struct VkDescriptorMappingSourceShaderRecordIndexEXT { + uint32_t heapOffset; + uint32_t shaderRecordOffset; + uint32_t heapIndexStride; + uint32_t heapArrayStride; + const VkSamplerCreateInfo* pEmbeddedSampler; + VkBool32 useCombinedImageSamplerIndex; + uint32_t samplerHeapOffset; + uint32_t samplerShaderRecordOffset; + uint32_t samplerHeapIndexStride; + uint32_t samplerHeapArrayStride; +} VkDescriptorMappingSourceShaderRecordIndexEXT; + +typedef struct VkDescriptorMappingSourceIndirectIndexArrayEXT { + uint32_t heapOffset; + uint32_t pushOffset; + uint32_t addressOffset; + uint32_t heapIndexStride; + const VkSamplerCreateInfo* pEmbeddedSampler; + VkBool32 useCombinedImageSamplerIndex; + uint32_t samplerHeapOffset; + uint32_t samplerPushOffset; + uint32_t samplerAddressOffset; + uint32_t samplerHeapIndexStride; +} VkDescriptorMappingSourceIndirectIndexArrayEXT; + +typedef union VkDescriptorMappingSourceDataEXT { + VkDescriptorMappingSourceConstantOffsetEXT constantOffset; + VkDescriptorMappingSourcePushIndexEXT pushIndex; + VkDescriptorMappingSourceIndirectIndexEXT indirectIndex; + VkDescriptorMappingSourceIndirectIndexArrayEXT indirectIndexArray; + VkDescriptorMappingSourceHeapDataEXT heapData; + uint32_t pushDataOffset; + uint32_t pushAddressOffset; + VkDescriptorMappingSourceIndirectAddressEXT indirectAddress; + VkDescriptorMappingSourceShaderRecordIndexEXT shaderRecordIndex; + uint32_t shaderRecordDataOffset; + uint32_t shaderRecordAddressOffset; +} VkDescriptorMappingSourceDataEXT; + +typedef struct VkDescriptorSetAndBindingMappingEXT { + VkStructureType sType; + const void* pNext; + uint32_t descriptorSet; + uint32_t firstBinding; + uint32_t bindingCount; + VkSpirvResourceTypeFlagsEXT resourceMask; + VkDescriptorMappingSourceEXT source; + VkDescriptorMappingSourceDataEXT sourceData; +} VkDescriptorSetAndBindingMappingEXT; + +typedef struct VkShaderDescriptorSetAndBindingMappingInfoEXT { + VkStructureType sType; + const void* pNext; + uint32_t mappingCount; + const VkDescriptorSetAndBindingMappingEXT* pMappings; +} VkShaderDescriptorSetAndBindingMappingInfoEXT; + +typedef struct VkOpaqueCaptureDataCreateInfoEXT { + VkStructureType sType; + const void* pNext; + const VkHostAddressRangeConstEXT* pData; +} VkOpaqueCaptureDataCreateInfoEXT; + +typedef struct VkPhysicalDeviceDescriptorHeapFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 descriptorHeap; + VkBool32 descriptorHeapCaptureReplay; +} VkPhysicalDeviceDescriptorHeapFeaturesEXT; + +typedef struct VkPhysicalDeviceDescriptorHeapPropertiesEXT { + VkStructureType sType; + void* pNext; + VkDeviceSize samplerHeapAlignment; + VkDeviceSize resourceHeapAlignment; + VkDeviceSize maxSamplerHeapSize; + VkDeviceSize maxResourceHeapSize; + VkDeviceSize minSamplerHeapReservedRange; + VkDeviceSize minSamplerHeapReservedRangeWithEmbedded; + VkDeviceSize minResourceHeapReservedRange; + VkDeviceSize samplerDescriptorSize; + VkDeviceSize imageDescriptorSize; + VkDeviceSize bufferDescriptorSize; + VkDeviceSize samplerDescriptorAlignment; + VkDeviceSize imageDescriptorAlignment; + VkDeviceSize bufferDescriptorAlignment; + VkDeviceSize maxPushDataSize; + size_t imageCaptureReplayOpaqueDataSize; + uint32_t maxDescriptorHeapEmbeddedSamplers; + uint32_t samplerYcbcrConversionCount; + VkBool32 sparseDescriptorHeaps; + VkBool32 protectedDescriptorHeaps; +} VkPhysicalDeviceDescriptorHeapPropertiesEXT; + +typedef struct VkCommandBufferInheritanceDescriptorHeapInfoEXT { + VkStructureType sType; + const void* pNext; + const VkBindHeapInfoEXT* pSamplerHeapBindInfo; + const VkBindHeapInfoEXT* pResourceHeapBindInfo; +} VkCommandBufferInheritanceDescriptorHeapInfoEXT; + +typedef struct VkSamplerCustomBorderColorIndexCreateInfoEXT { + VkStructureType sType; + const void* pNext; + uint32_t index; +} VkSamplerCustomBorderColorIndexCreateInfoEXT; + +typedef struct VkSamplerCustomBorderColorCreateInfoEXT { + VkStructureType sType; + const void* pNext; + VkClearColorValue customBorderColor; + VkFormat format; +} VkSamplerCustomBorderColorCreateInfoEXT; + +typedef struct VkIndirectCommandsLayoutPushDataTokenNV { + VkStructureType sType; + const void* pNext; + uint32_t pushDataOffset; + uint32_t pushDataSize; +} VkIndirectCommandsLayoutPushDataTokenNV; + +typedef struct VkSubsampledImageFormatPropertiesEXT { + VkStructureType sType; + const void* pNext; + uint32_t subsampledImageDescriptorCount; +} VkSubsampledImageFormatPropertiesEXT; + +typedef struct VkPhysicalDeviceDescriptorHeapTensorPropertiesARM { + VkStructureType sType; + void* pNext; + VkDeviceSize tensorDescriptorSize; + VkDeviceSize tensorDescriptorAlignment; + size_t tensorCaptureReplayOpaqueDataSize; +} VkPhysicalDeviceDescriptorHeapTensorPropertiesARM; + +typedef VkResult (VKAPI_PTR *PFN_vkWriteSamplerDescriptorsEXT)(VkDevice device, uint32_t samplerCount, const VkSamplerCreateInfo* pSamplers, const VkHostAddressRangeEXT* pDescriptors); +typedef VkResult (VKAPI_PTR *PFN_vkWriteResourceDescriptorsEXT)(VkDevice device, uint32_t resourceCount, const VkResourceDescriptorInfoEXT* pResources, const VkHostAddressRangeEXT* pDescriptors); +typedef void (VKAPI_PTR *PFN_vkCmdBindSamplerHeapEXT)(VkCommandBuffer commandBuffer, const VkBindHeapInfoEXT* pBindInfo); +typedef void (VKAPI_PTR *PFN_vkCmdBindResourceHeapEXT)(VkCommandBuffer commandBuffer, const VkBindHeapInfoEXT* pBindInfo); +typedef void (VKAPI_PTR *PFN_vkCmdPushDataEXT)(VkCommandBuffer commandBuffer, const VkPushDataInfoEXT* pPushDataInfo); +typedef VkResult (VKAPI_PTR *PFN_vkGetImageOpaqueCaptureDataEXT)(VkDevice device, uint32_t imageCount, const VkImage* pImages, VkHostAddressRangeEXT* pDatas); +typedef VkDeviceSize (VKAPI_PTR *PFN_vkGetPhysicalDeviceDescriptorSizeEXT)(VkPhysicalDevice physicalDevice, VkDescriptorType descriptorType); +typedef VkResult (VKAPI_PTR *PFN_vkRegisterCustomBorderColorEXT)(VkDevice device, const VkSamplerCustomBorderColorCreateInfoEXT* pBorderColor, VkBool32 requestIndex, uint32_t* pIndex); +typedef void (VKAPI_PTR *PFN_vkUnregisterCustomBorderColorEXT)(VkDevice device, uint32_t index); +typedef VkResult (VKAPI_PTR *PFN_vkGetTensorOpaqueCaptureDataARM)(VkDevice device, uint32_t tensorCount, const VkTensorARM* pTensors, VkHostAddressRangeEXT* pDatas); + +#ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkWriteSamplerDescriptorsEXT( + VkDevice device, + uint32_t samplerCount, + const VkSamplerCreateInfo* pSamplers, + const VkHostAddressRangeEXT* pDescriptors); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkWriteResourceDescriptorsEXT( + VkDevice device, + uint32_t resourceCount, + const VkResourceDescriptorInfoEXT* pResources, + const VkHostAddressRangeEXT* pDescriptors); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdBindSamplerHeapEXT( + VkCommandBuffer commandBuffer, + const VkBindHeapInfoEXT* pBindInfo); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdBindResourceHeapEXT( + VkCommandBuffer commandBuffer, + const VkBindHeapInfoEXT* pBindInfo); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdPushDataEXT( + VkCommandBuffer commandBuffer, + const VkPushDataInfoEXT* pPushDataInfo); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetImageOpaqueCaptureDataEXT( + VkDevice device, + uint32_t imageCount, + const VkImage* pImages, + VkHostAddressRangeEXT* pDatas); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkDeviceSize VKAPI_CALL vkGetPhysicalDeviceDescriptorSizeEXT( + VkPhysicalDevice physicalDevice, + VkDescriptorType descriptorType); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkRegisterCustomBorderColorEXT( + VkDevice device, + const VkSamplerCustomBorderColorCreateInfoEXT* pBorderColor, + VkBool32 requestIndex, + uint32_t* pIndex); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkUnregisterCustomBorderColorEXT( + VkDevice device, + uint32_t index); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetTensorOpaqueCaptureDataARM( + VkDevice device, + uint32_t tensorCount, + const VkTensorARM* pTensors, + VkHostAddressRangeEXT* pDatas); +#endif +#endif + + // VK_AMD_mixed_attachment_samples is a preprocessor guard. Do not pass it to API calls. #define VK_AMD_mixed_attachment_samples 1 #define VK_AMD_MIXED_ATTACHMENT_SAMPLES_SPEC_VERSION 1 @@ -14369,15 +17162,19 @@ typedef void (VKAPI_PTR *PFN_vkCmdSetSampleLocationsEXT)(VkCommandBuffer command typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT)(VkPhysicalDevice physicalDevice, VkSampleCountFlagBits samples, VkMultisamplePropertiesEXT* pMultisampleProperties); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetSampleLocationsEXT( VkCommandBuffer commandBuffer, const VkSampleLocationsInfoEXT* pSampleLocationsInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceMultisamplePropertiesEXT( VkPhysicalDevice physicalDevice, VkSampleCountFlagBits samples, VkMultisamplePropertiesEXT* pMultisampleProperties); #endif +#endif // VK_EXT_blend_operation_advanced is a preprocessor guard. Do not pass it to API calls. @@ -14554,11 +17351,13 @@ typedef struct VkDrmFormatModifierPropertiesList2EXT { typedef VkResult (VKAPI_PTR *PFN_vkGetImageDrmFormatModifierPropertiesEXT)(VkDevice device, VkImage image, VkImageDrmFormatModifierPropertiesEXT* pProperties); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetImageDrmFormatModifierPropertiesEXT( VkDevice device, VkImage image, VkImageDrmFormatModifierPropertiesEXT* pProperties); #endif +#endif // VK_EXT_validation_cache is a preprocessor guard. Do not pass it to API calls. @@ -14592,29 +17391,37 @@ typedef VkResult (VKAPI_PTR *PFN_vkMergeValidationCachesEXT)(VkDevice device, Vk typedef VkResult (VKAPI_PTR *PFN_vkGetValidationCacheDataEXT)(VkDevice device, VkValidationCacheEXT validationCache, size_t* pDataSize, void* pData); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateValidationCacheEXT( VkDevice device, const VkValidationCacheCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkValidationCacheEXT* pValidationCache); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkDestroyValidationCacheEXT( VkDevice device, VkValidationCacheEXT validationCache, const VkAllocationCallbacks* pAllocator); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkMergeValidationCachesEXT( VkDevice device, VkValidationCacheEXT dstCache, uint32_t srcCacheCount, const VkValidationCacheEXT* pSrcCaches); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetValidationCacheDataEXT( VkDevice device, VkValidationCacheEXT validationCache, size_t* pDataSize, void* pData); #endif +#endif // VK_EXT_descriptor_indexing is a preprocessor guard. Do not pass it to API calls. @@ -14725,23 +17532,29 @@ typedef void (VKAPI_PTR *PFN_vkCmdSetViewportShadingRatePaletteNV)(VkCommandBuff typedef void (VKAPI_PTR *PFN_vkCmdSetCoarseSampleOrderNV)(VkCommandBuffer commandBuffer, VkCoarseSampleOrderTypeNV sampleOrderType, uint32_t customSampleOrderCount, const VkCoarseSampleOrderCustomNV* pCustomSampleOrders); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdBindShadingRateImageNV( VkCommandBuffer commandBuffer, VkImageView imageView, VkImageLayout imageLayout); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetViewportShadingRatePaletteNV( VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkShadingRatePaletteNV* pShadingRatePalettes); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetCoarseSampleOrderNV( VkCommandBuffer commandBuffer, VkCoarseSampleOrderTypeNV sampleOrderType, uint32_t customSampleOrderCount, const VkCoarseSampleOrderCustomNV* pCustomSampleOrders); #endif +#endif // VK_NV_ray_tracing is a preprocessor guard. Do not pass it to API calls. @@ -14770,21 +17583,16 @@ typedef enum VkGeometryTypeKHR { VK_GEOMETRY_TYPE_INSTANCES_KHR = 2, VK_GEOMETRY_TYPE_SPHERES_NV = 1000429004, VK_GEOMETRY_TYPE_LINEAR_SWEPT_SPHERES_NV = 1000429005, +#ifdef VK_ENABLE_BETA_EXTENSIONS + VK_GEOMETRY_TYPE_DENSE_GEOMETRY_FORMAT_TRIANGLES_AMDX = 1000478000, +#endif + VK_GEOMETRY_TYPE_MICROMAP_KHR = 1000623000, VK_GEOMETRY_TYPE_TRIANGLES_NV = VK_GEOMETRY_TYPE_TRIANGLES_KHR, VK_GEOMETRY_TYPE_AABBS_NV = VK_GEOMETRY_TYPE_AABBS_KHR, VK_GEOMETRY_TYPE_MAX_ENUM_KHR = 0x7FFFFFFF } VkGeometryTypeKHR; typedef VkGeometryTypeKHR VkGeometryTypeNV; - -typedef enum VkAccelerationStructureTypeKHR { - VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR = 0, - VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR = 1, - VK_ACCELERATION_STRUCTURE_TYPE_GENERIC_KHR = 2, - VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR, - VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR, - VK_ACCELERATION_STRUCTURE_TYPE_MAX_ENUM_KHR = 0x7FFFFFFF -} VkAccelerationStructureTypeKHR; typedef VkAccelerationStructureTypeKHR VkAccelerationStructureTypeNV; @@ -14825,13 +17633,19 @@ typedef enum VkGeometryInstanceFlagBitsKHR { VK_GEOMETRY_INSTANCE_TRIANGLE_FLIP_FACING_BIT_KHR = 0x00000002, VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_KHR = 0x00000004, VK_GEOMETRY_INSTANCE_FORCE_NO_OPAQUE_BIT_KHR = 0x00000008, - VK_GEOMETRY_INSTANCE_FORCE_OPACITY_MICROMAP_2_STATE_EXT = 0x00000010, - VK_GEOMETRY_INSTANCE_DISABLE_OPACITY_MICROMAPS_EXT = 0x00000020, + VK_GEOMETRY_INSTANCE_FORCE_OPACITY_MICROMAP_2_STATE_BIT_KHR = 0x00000010, + VK_GEOMETRY_INSTANCE_DISABLE_OPACITY_MICROMAPS_BIT_KHR = 0x00000020, VK_GEOMETRY_INSTANCE_TRIANGLE_FRONT_COUNTERCLOCKWISE_BIT_KHR = VK_GEOMETRY_INSTANCE_TRIANGLE_FLIP_FACING_BIT_KHR, VK_GEOMETRY_INSTANCE_TRIANGLE_CULL_DISABLE_BIT_NV = VK_GEOMETRY_INSTANCE_TRIANGLE_FACING_CULL_DISABLE_BIT_KHR, VK_GEOMETRY_INSTANCE_TRIANGLE_FRONT_COUNTERCLOCKWISE_BIT_NV = VK_GEOMETRY_INSTANCE_TRIANGLE_FRONT_COUNTERCLOCKWISE_BIT_KHR, VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_NV = VK_GEOMETRY_INSTANCE_FORCE_OPAQUE_BIT_KHR, VK_GEOMETRY_INSTANCE_FORCE_NO_OPAQUE_BIT_NV = VK_GEOMETRY_INSTANCE_FORCE_NO_OPAQUE_BIT_KHR, + VK_GEOMETRY_INSTANCE_FORCE_OPACITY_MICROMAP_2_STATE_BIT_EXT = VK_GEOMETRY_INSTANCE_FORCE_OPACITY_MICROMAP_2_STATE_BIT_KHR, + // VK_GEOMETRY_INSTANCE_FORCE_OPACITY_MICROMAP_2_STATE_EXT is a legacy alias + VK_GEOMETRY_INSTANCE_FORCE_OPACITY_MICROMAP_2_STATE_EXT = VK_GEOMETRY_INSTANCE_FORCE_OPACITY_MICROMAP_2_STATE_BIT_EXT, + VK_GEOMETRY_INSTANCE_DISABLE_OPACITY_MICROMAPS_BIT_EXT = VK_GEOMETRY_INSTANCE_DISABLE_OPACITY_MICROMAPS_BIT_KHR, + // VK_GEOMETRY_INSTANCE_DISABLE_OPACITY_MICROMAPS_EXT is a legacy alias + VK_GEOMETRY_INSTANCE_DISABLE_OPACITY_MICROMAPS_EXT = VK_GEOMETRY_INSTANCE_DISABLE_OPACITY_MICROMAPS_BIT_EXT, VK_GEOMETRY_INSTANCE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF } VkGeometryInstanceFlagBitsKHR; typedef VkFlags VkGeometryInstanceFlagsKHR; @@ -14847,25 +17661,41 @@ typedef enum VkBuildAccelerationStructureFlagBitsKHR { VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR = 0x00000008, VK_BUILD_ACCELERATION_STRUCTURE_LOW_MEMORY_BIT_KHR = 0x00000010, VK_BUILD_ACCELERATION_STRUCTURE_MOTION_BIT_NV = 0x00000020, - VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_UPDATE_EXT = 0x00000040, - VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DISABLE_OPACITY_MICROMAPS_EXT = 0x00000080, - VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_DATA_UPDATE_EXT = 0x00000100, + VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_DATA_UPDATE_BIT_EXT = 0x00000100, #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DISPLACEMENT_MICROMAP_UPDATE_NV = 0x00000200, + VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DISPLACEMENT_MICROMAP_UPDATE_BIT_NV = 0x00000200, #endif - VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DATA_ACCESS_KHR = 0x00000800, + VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DATA_ACCESS_BIT_KHR = 0x00000800, + VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_CLUSTER_OPACITY_MICROMAPS_BIT_NV = 0x00001000, + VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_UPDATE_BIT_KHR = 0x00000040, + VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DISABLE_OPACITY_MICROMAPS_BIT_KHR = 0x00000080, + VK_BUILD_ACCELERATION_STRUCTURE_MICROMAP_LOSSY_BIT_KHR = 0x00000400, VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_NV = VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR, VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_NV = VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_NV = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR, VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_NV = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR, VK_BUILD_ACCELERATION_STRUCTURE_LOW_MEMORY_BIT_NV = VK_BUILD_ACCELERATION_STRUCTURE_LOW_MEMORY_BIT_KHR, + VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_UPDATE_BIT_EXT = VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_UPDATE_BIT_KHR, + // VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_UPDATE_EXT is a legacy alias + VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_UPDATE_EXT = VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_UPDATE_BIT_EXT, + VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DISABLE_OPACITY_MICROMAPS_BIT_EXT = VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DISABLE_OPACITY_MICROMAPS_BIT_KHR, + // VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DISABLE_OPACITY_MICROMAPS_EXT is a legacy alias + VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DISABLE_OPACITY_MICROMAPS_EXT = VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DISABLE_OPACITY_MICROMAPS_BIT_EXT, + // VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_DATA_UPDATE_EXT is a legacy alias + VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_DATA_UPDATE_EXT = VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_OPACITY_MICROMAP_DATA_UPDATE_BIT_EXT, +#ifdef VK_ENABLE_BETA_EXTENSIONS + // VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DISPLACEMENT_MICROMAP_UPDATE_NV is a legacy alias + VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DISPLACEMENT_MICROMAP_UPDATE_NV = VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DISPLACEMENT_MICROMAP_UPDATE_BIT_NV, +#endif + // VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DATA_ACCESS_KHR is a legacy alias + VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DATA_ACCESS_KHR = VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_DATA_ACCESS_BIT_KHR, VK_BUILD_ACCELERATION_STRUCTURE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF } VkBuildAccelerationStructureFlagBitsKHR; typedef VkFlags VkBuildAccelerationStructureFlagsKHR; -typedef VkBuildAccelerationStructureFlagsKHR VkBuildAccelerationStructureFlagsNV; - typedef VkBuildAccelerationStructureFlagBitsKHR VkBuildAccelerationStructureFlagBitsNV; +typedef VkBuildAccelerationStructureFlagsKHR VkBuildAccelerationStructureFlagsNV; + typedef struct VkRayTracingShaderGroupCreateInfoNV { VkStructureType sType; const void* pNext; @@ -14929,13 +17759,13 @@ typedef struct VkGeometryNV { } VkGeometryNV; typedef struct VkAccelerationStructureInfoNV { - VkStructureType sType; - const void* pNext; - VkAccelerationStructureTypeNV type; - VkBuildAccelerationStructureFlagsNV flags; - uint32_t instanceCount; - uint32_t geometryCount; - const VkGeometryNV* pGeometries; + VkStructureType sType; + const void* pNext; + VkAccelerationStructureTypeNV type; + VkBuildAccelerationStructureFlagsKHR flags; + uint32_t instanceCount; + uint32_t geometryCount; + const VkGeometryNV* pGeometries; } VkAccelerationStructureInfoNV; typedef struct VkAccelerationStructureCreateInfoNV { @@ -15012,7 +17842,7 @@ typedef VkAccelerationStructureInstanceKHR VkAccelerationStructureInstanceNV; typedef VkResult (VKAPI_PTR *PFN_vkCreateAccelerationStructureNV)(VkDevice device, const VkAccelerationStructureCreateInfoNV* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkAccelerationStructureNV* pAccelerationStructure); typedef void (VKAPI_PTR *PFN_vkDestroyAccelerationStructureNV)(VkDevice device, VkAccelerationStructureNV accelerationStructure, const VkAllocationCallbacks* pAllocator); -typedef void (VKAPI_PTR *PFN_vkGetAccelerationStructureMemoryRequirementsNV)(VkDevice device, const VkAccelerationStructureMemoryRequirementsInfoNV* pInfo, VkMemoryRequirements2KHR* pMemoryRequirements); +typedef void (VKAPI_PTR *PFN_vkGetAccelerationStructureMemoryRequirementsNV)(VkDevice device, const VkAccelerationStructureMemoryRequirementsInfoNV* pInfo, VkMemoryRequirements2* pMemoryRequirements); typedef VkResult (VKAPI_PTR *PFN_vkBindAccelerationStructureMemoryNV)(VkDevice device, uint32_t bindInfoCount, const VkBindAccelerationStructureMemoryInfoNV* pBindInfos); typedef void (VKAPI_PTR *PFN_vkCmdBuildAccelerationStructureNV)(VkCommandBuffer commandBuffer, const VkAccelerationStructureInfoNV* pInfo, VkBuffer instanceData, VkDeviceSize instanceOffset, VkBool32 update, VkAccelerationStructureNV dst, VkAccelerationStructureNV src, VkBuffer scratch, VkDeviceSize scratchOffset); typedef void (VKAPI_PTR *PFN_vkCmdCopyAccelerationStructureNV)(VkCommandBuffer commandBuffer, VkAccelerationStructureNV dst, VkAccelerationStructureNV src, VkCopyAccelerationStructureModeKHR mode); @@ -15025,27 +17855,36 @@ typedef void (VKAPI_PTR *PFN_vkCmdWriteAccelerationStructuresPropertiesNV)(VkCom typedef VkResult (VKAPI_PTR *PFN_vkCompileDeferredNV)(VkDevice device, VkPipeline pipeline, uint32_t shader); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateAccelerationStructureNV( VkDevice device, const VkAccelerationStructureCreateInfoNV* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkAccelerationStructureNV* pAccelerationStructure); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkDestroyAccelerationStructureNV( VkDevice device, VkAccelerationStructureNV accelerationStructure, const VkAllocationCallbacks* pAllocator); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetAccelerationStructureMemoryRequirementsNV( VkDevice device, const VkAccelerationStructureMemoryRequirementsInfoNV* pInfo, - VkMemoryRequirements2KHR* pMemoryRequirements); + VkMemoryRequirements2* pMemoryRequirements); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkBindAccelerationStructureMemoryNV( VkDevice device, uint32_t bindInfoCount, const VkBindAccelerationStructureMemoryInfoNV* pBindInfos); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdBuildAccelerationStructureNV( VkCommandBuffer commandBuffer, const VkAccelerationStructureInfoNV* pInfo, @@ -15056,13 +17895,17 @@ VKAPI_ATTR void VKAPI_CALL vkCmdBuildAccelerationStructureNV( VkAccelerationStructureNV src, VkBuffer scratch, VkDeviceSize scratchOffset); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdCopyAccelerationStructureNV( VkCommandBuffer commandBuffer, VkAccelerationStructureNV dst, VkAccelerationStructureNV src, VkCopyAccelerationStructureModeKHR mode); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdTraceRaysNV( VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer, @@ -15079,7 +17922,9 @@ VKAPI_ATTR void VKAPI_CALL vkCmdTraceRaysNV( uint32_t width, uint32_t height, uint32_t depth); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateRayTracingPipelinesNV( VkDevice device, VkPipelineCache pipelineCache, @@ -15087,7 +17932,9 @@ VKAPI_ATTR VkResult VKAPI_CALL vkCreateRayTracingPipelinesNV( const VkRayTracingPipelineCreateInfoNV* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetRayTracingShaderGroupHandlesKHR( VkDevice device, VkPipeline pipeline, @@ -15095,7 +17942,9 @@ VKAPI_ATTR VkResult VKAPI_CALL vkGetRayTracingShaderGroupHandlesKHR( uint32_t groupCount, size_t dataSize, void* pData); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetRayTracingShaderGroupHandlesNV( VkDevice device, VkPipeline pipeline, @@ -15103,13 +17952,17 @@ VKAPI_ATTR VkResult VKAPI_CALL vkGetRayTracingShaderGroupHandlesNV( uint32_t groupCount, size_t dataSize, void* pData); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetAccelerationStructureHandleNV( VkDevice device, VkAccelerationStructureNV accelerationStructure, size_t dataSize, void* pData); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdWriteAccelerationStructuresPropertiesNV( VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount, @@ -15117,12 +17970,15 @@ VKAPI_ATTR void VKAPI_CALL vkCmdWriteAccelerationStructuresPropertiesNV( VkQueryType queryType, VkQueryPool queryPool, uint32_t firstQuery); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCompileDeferredNV( VkDevice device, VkPipeline pipeline, uint32_t shader); #endif +#endif // VK_NV_representative_fragment_test is a preprocessor guard. Do not pass it to API calls. @@ -15168,6 +18024,30 @@ typedef struct VkFilterCubicImageViewImageFormatPropertiesEXT { #define VK_QCOM_RENDER_PASS_SHADER_RESOLVE_EXTENSION_NAME "VK_QCOM_render_pass_shader_resolve" +// VK_QCOM_cooperative_matrix_conversion is a preprocessor guard. Do not pass it to API calls. +#define VK_QCOM_cooperative_matrix_conversion 1 +#define VK_QCOM_COOPERATIVE_MATRIX_CONVERSION_SPEC_VERSION 1 +#define VK_QCOM_COOPERATIVE_MATRIX_CONVERSION_EXTENSION_NAME "VK_QCOM_cooperative_matrix_conversion" +typedef struct VkPhysicalDeviceCooperativeMatrixConversionFeaturesQCOM { + VkStructureType sType; + void* pNext; + VkBool32 cooperativeMatrixConversion; +} VkPhysicalDeviceCooperativeMatrixConversionFeaturesQCOM; + + + +// VK_QCOM_elapsed_timer_query is a preprocessor guard. Do not pass it to API calls. +#define VK_QCOM_elapsed_timer_query 1 +#define VK_QCOM_ELAPSED_TIMER_QUERY_SPEC_VERSION 1 +#define VK_QCOM_ELAPSED_TIMER_QUERY_EXTENSION_NAME "VK_QCOM_elapsed_timer_query" +typedef struct VkPhysicalDeviceElapsedTimerQueryFeaturesQCOM { + VkStructureType sType; + void* pNext; + VkBool32 elapsedTimerQuery; +} VkPhysicalDeviceElapsedTimerQueryFeaturesQCOM; + + + // VK_EXT_global_priority is a preprocessor guard. Do not pass it to API calls. #define VK_EXT_global_priority 1 #define VK_EXT_GLOBAL_PRIORITY_SPEC_VERSION 2 @@ -15204,12 +18084,14 @@ typedef struct VkPhysicalDeviceExternalMemoryHostPropertiesEXT { typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryHostPointerPropertiesEXT)(VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, const void* pHostPointer, VkMemoryHostPointerPropertiesEXT* pMemoryHostPointerProperties); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryHostPointerPropertiesEXT( VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, const void* pHostPointer, VkMemoryHostPointerPropertiesEXT* pMemoryHostPointerProperties); #endif +#endif // VK_AMD_buffer_marker is a preprocessor guard. Do not pass it to API calls. @@ -15220,13 +18102,16 @@ typedef void (VKAPI_PTR *PFN_vkCmdWriteBufferMarkerAMD)(VkCommandBuffer commandB typedef void (VKAPI_PTR *PFN_vkCmdWriteBufferMarker2AMD)(VkCommandBuffer commandBuffer, VkPipelineStageFlags2 stage, VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdWriteBufferMarkerAMD( VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdWriteBufferMarker2AMD( VkCommandBuffer commandBuffer, VkPipelineStageFlags2 stage, @@ -15234,6 +18119,7 @@ VKAPI_ATTR void VKAPI_CALL vkCmdWriteBufferMarker2AMD( VkDeviceSize dstOffset, uint32_t marker); #endif +#endif // VK_AMD_pipeline_compiler_control is a preprocessor guard. Do not pass it to API calls. @@ -15265,11 +18151,14 @@ typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT) typedef VkResult (VKAPI_PTR *PFN_vkGetCalibratedTimestampsEXT)(VkDevice device, uint32_t timestampCount, const VkCalibratedTimestampInfoKHR* pTimestampInfos, uint64_t* pTimestamps, uint64_t* pMaxDeviation); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceCalibrateableTimeDomainsEXT( VkPhysicalDevice physicalDevice, uint32_t* pTimeDomainCount, VkTimeDomainKHR* pTimeDomains); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetCalibratedTimestampsEXT( VkDevice device, uint32_t timestampCount, @@ -15277,6 +18166,7 @@ VKAPI_ATTR VkResult VKAPI_CALL vkGetCalibratedTimestampsEXT( uint64_t* pTimestamps, uint64_t* pMaxDeviation); #endif +#endif // VK_AMD_shader_core_properties is a preprocessor guard. Do not pass it to API calls. @@ -15408,18 +18298,23 @@ typedef void (VKAPI_PTR *PFN_vkCmdDrawMeshTasksIndirectNV)(VkCommandBuffer comma typedef void (VKAPI_PTR *PFN_vkCmdDrawMeshTasksIndirectCountNV)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdDrawMeshTasksNV( VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdDrawMeshTasksIndirectNV( VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdDrawMeshTasksIndirectCountNV( VkCommandBuffer commandBuffer, VkBuffer buffer, @@ -15429,6 +18324,7 @@ VKAPI_ATTR void VKAPI_CALL vkCmdDrawMeshTasksIndirectCountNV( uint32_t maxDrawCount, uint32_t stride); #endif +#endif // VK_NV_fragment_shader_barycentric is a preprocessor guard. Do not pass it to API calls. @@ -15472,18 +18368,22 @@ typedef void (VKAPI_PTR *PFN_vkCmdSetExclusiveScissorEnableNV)(VkCommandBuffer c typedef void (VKAPI_PTR *PFN_vkCmdSetExclusiveScissorNV)(VkCommandBuffer commandBuffer, uint32_t firstExclusiveScissor, uint32_t exclusiveScissorCount, const VkRect2D* pExclusiveScissors); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetExclusiveScissorEnableNV( VkCommandBuffer commandBuffer, uint32_t firstExclusiveScissor, uint32_t exclusiveScissorCount, const VkBool32* pExclusiveScissorEnables); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetExclusiveScissorNV( VkCommandBuffer commandBuffer, uint32_t firstExclusiveScissor, uint32_t exclusiveScissorCount, const VkRect2D* pExclusiveScissors); #endif +#endif // VK_NV_device_diagnostic_checkpoints is a preprocessor guard. Do not pass it to API calls. @@ -15521,20 +18421,181 @@ typedef void (VKAPI_PTR *PFN_vkGetQueueCheckpointDataNV)(VkQueue queue, uint32_t typedef void (VKAPI_PTR *PFN_vkGetQueueCheckpointData2NV)(VkQueue queue, uint32_t* pCheckpointDataCount, VkCheckpointData2NV* pCheckpointData); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetCheckpointNV( VkCommandBuffer commandBuffer, const void* pCheckpointMarker); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetQueueCheckpointDataNV( VkQueue queue, uint32_t* pCheckpointDataCount, VkCheckpointDataNV* pCheckpointData); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetQueueCheckpointData2NV( VkQueue queue, uint32_t* pCheckpointDataCount, VkCheckpointData2NV* pCheckpointData); #endif +#endif + + +// VK_EXT_present_timing is a preprocessor guard. Do not pass it to API calls. +#define VK_EXT_present_timing 1 +#define VK_EXT_PRESENT_TIMING_SPEC_VERSION 3 +#define VK_EXT_PRESENT_TIMING_EXTENSION_NAME "VK_EXT_present_timing" + +typedef enum VkPresentStageFlagBitsEXT { + VK_PRESENT_STAGE_QUEUE_OPERATIONS_END_BIT_EXT = 0x00000001, + VK_PRESENT_STAGE_REQUEST_DEQUEUED_BIT_EXT = 0x00000002, + VK_PRESENT_STAGE_IMAGE_FIRST_PIXEL_OUT_BIT_EXT = 0x00000004, + VK_PRESENT_STAGE_IMAGE_FIRST_PIXEL_VISIBLE_BIT_EXT = 0x00000008, + VK_PRESENT_STAGE_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF +} VkPresentStageFlagBitsEXT; +typedef VkFlags VkPresentStageFlagsEXT; + +typedef enum VkPastPresentationTimingFlagBitsEXT { + VK_PAST_PRESENTATION_TIMING_ALLOW_PARTIAL_RESULTS_BIT_EXT = 0x00000001, + VK_PAST_PRESENTATION_TIMING_ALLOW_OUT_OF_ORDER_RESULTS_BIT_EXT = 0x00000002, + VK_PAST_PRESENTATION_TIMING_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF +} VkPastPresentationTimingFlagBitsEXT; +typedef VkFlags VkPastPresentationTimingFlagsEXT; + +typedef enum VkPresentTimingInfoFlagBitsEXT { + VK_PRESENT_TIMING_INFO_PRESENT_AT_RELATIVE_TIME_BIT_EXT = 0x00000001, + VK_PRESENT_TIMING_INFO_PRESENT_AT_NEAREST_REFRESH_CYCLE_BIT_EXT = 0x00000002, + VK_PRESENT_TIMING_INFO_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF +} VkPresentTimingInfoFlagBitsEXT; +typedef VkFlags VkPresentTimingInfoFlagsEXT; +typedef struct VkPhysicalDevicePresentTimingFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 presentTiming; + VkBool32 presentAtAbsoluteTime; + VkBool32 presentAtRelativeTime; +} VkPhysicalDevicePresentTimingFeaturesEXT; + +typedef struct VkPresentTimingSurfaceCapabilitiesEXT { + VkStructureType sType; + void* pNext; + VkBool32 presentTimingSupported; + VkBool32 presentAtAbsoluteTimeSupported; + VkBool32 presentAtRelativeTimeSupported; + VkPresentStageFlagsEXT presentStageQueries; +} VkPresentTimingSurfaceCapabilitiesEXT; + +typedef struct VkSwapchainCalibratedTimestampInfoEXT { + VkStructureType sType; + const void* pNext; + VkSwapchainKHR swapchain; + VkPresentStageFlagsEXT presentStage; + uint64_t timeDomainId; +} VkSwapchainCalibratedTimestampInfoEXT; + +typedef struct VkSwapchainTimingPropertiesEXT { + VkStructureType sType; + void* pNext; + uint64_t refreshDuration; + uint64_t refreshInterval; +} VkSwapchainTimingPropertiesEXT; + +typedef struct VkSwapchainTimeDomainPropertiesEXT { + VkStructureType sType; + void* pNext; + uint32_t timeDomainCount; + VkTimeDomainKHR* pTimeDomains; + uint64_t* pTimeDomainIds; +} VkSwapchainTimeDomainPropertiesEXT; + +typedef struct VkPastPresentationTimingInfoEXT { + VkStructureType sType; + const void* pNext; + VkPastPresentationTimingFlagsEXT flags; + VkSwapchainKHR swapchain; +} VkPastPresentationTimingInfoEXT; + +typedef struct VkPresentStageTimeEXT { + VkPresentStageFlagsEXT stage; + uint64_t time; +} VkPresentStageTimeEXT; + +typedef struct VkPastPresentationTimingEXT { + VkStructureType sType; + void* pNext; + uint64_t presentId; + uint64_t targetTime; + uint32_t presentStageCount; + VkPresentStageTimeEXT* pPresentStages; + VkTimeDomainKHR timeDomain; + uint64_t timeDomainId; + VkBool32 reportComplete; +} VkPastPresentationTimingEXT; + +typedef struct VkPastPresentationTimingPropertiesEXT { + VkStructureType sType; + void* pNext; + uint64_t timingPropertiesCounter; + uint64_t timeDomainsCounter; + uint32_t presentationTimingCount; + VkPastPresentationTimingEXT* pPresentationTimings; +} VkPastPresentationTimingPropertiesEXT; + +typedef struct VkPresentTimingInfoEXT { + VkStructureType sType; + const void* pNext; + VkPresentTimingInfoFlagsEXT flags; + uint64_t targetTime; + uint64_t timeDomainId; + VkPresentStageFlagsEXT presentStageQueries; + VkPresentStageFlagsEXT targetTimeDomainPresentStage; +} VkPresentTimingInfoEXT; + +typedef struct VkPresentTimingsInfoEXT { + VkStructureType sType; + const void* pNext; + uint32_t swapchainCount; + const VkPresentTimingInfoEXT* pTimingInfos; +} VkPresentTimingsInfoEXT; + +typedef VkResult (VKAPI_PTR *PFN_vkSetSwapchainPresentTimingQueueSizeEXT)(VkDevice device, VkSwapchainKHR swapchain, uint32_t size); +typedef VkResult (VKAPI_PTR *PFN_vkGetSwapchainTimingPropertiesEXT)(VkDevice device, VkSwapchainKHR swapchain, VkSwapchainTimingPropertiesEXT* pSwapchainTimingProperties, uint64_t* pSwapchainTimingPropertiesCounter); +typedef VkResult (VKAPI_PTR *PFN_vkGetSwapchainTimeDomainPropertiesEXT)(VkDevice device, VkSwapchainKHR swapchain, VkSwapchainTimeDomainPropertiesEXT* pSwapchainTimeDomainProperties, uint64_t* pTimeDomainsCounter); +typedef VkResult (VKAPI_PTR *PFN_vkGetPastPresentationTimingEXT)(VkDevice device, const VkPastPresentationTimingInfoEXT* pPastPresentationTimingInfo, VkPastPresentationTimingPropertiesEXT* pPastPresentationTimingProperties); + +#ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkSetSwapchainPresentTimingQueueSizeEXT( + VkDevice device, + VkSwapchainKHR swapchain, + uint32_t size); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetSwapchainTimingPropertiesEXT( + VkDevice device, + VkSwapchainKHR swapchain, + VkSwapchainTimingPropertiesEXT* pSwapchainTimingProperties, + uint64_t* pSwapchainTimingPropertiesCounter); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetSwapchainTimeDomainPropertiesEXT( + VkDevice device, + VkSwapchainKHR swapchain, + VkSwapchainTimeDomainPropertiesEXT* pSwapchainTimeDomainProperties, + uint64_t* pTimeDomainsCounter); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetPastPresentationTimingEXT( + VkDevice device, + const VkPastPresentationTimingInfoEXT* pPastPresentationTimingInfo, + VkPastPresentationTimingPropertiesEXT* pPastPresentationTimingProperties); +#endif +#endif // VK_INTEL_shader_integer_functions2 is a preprocessor guard. Do not pass it to API calls. @@ -15649,43 +18710,61 @@ typedef VkResult (VKAPI_PTR *PFN_vkQueueSetPerformanceConfigurationINTEL)(VkQueu typedef VkResult (VKAPI_PTR *PFN_vkGetPerformanceParameterINTEL)(VkDevice device, VkPerformanceParameterTypeINTEL parameter, VkPerformanceValueINTEL* pValue); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkInitializePerformanceApiINTEL( VkDevice device, const VkInitializePerformanceApiInfoINTEL* pInitializeInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkUninitializePerformanceApiINTEL( VkDevice device); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCmdSetPerformanceMarkerINTEL( VkCommandBuffer commandBuffer, const VkPerformanceMarkerInfoINTEL* pMarkerInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCmdSetPerformanceStreamMarkerINTEL( VkCommandBuffer commandBuffer, const VkPerformanceStreamMarkerInfoINTEL* pMarkerInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCmdSetPerformanceOverrideINTEL( VkCommandBuffer commandBuffer, const VkPerformanceOverrideInfoINTEL* pOverrideInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkAcquirePerformanceConfigurationINTEL( VkDevice device, const VkPerformanceConfigurationAcquireInfoINTEL* pAcquireInfo, VkPerformanceConfigurationINTEL* pConfiguration); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkReleasePerformanceConfigurationINTEL( VkDevice device, VkPerformanceConfigurationINTEL configuration); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkQueueSetPerformanceConfigurationINTEL( VkQueue queue, VkPerformanceConfigurationINTEL configuration); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPerformanceParameterINTEL( VkDevice device, VkPerformanceParameterTypeINTEL parameter, VkPerformanceValueINTEL* pValue); #endif +#endif // VK_EXT_pci_bus_info is a preprocessor guard. Do not pass it to API calls. @@ -15722,16 +18801,18 @@ typedef struct VkSwapchainDisplayNativeHdrCreateInfoAMD { typedef void (VKAPI_PTR *PFN_vkSetLocalDimmingAMD)(VkDevice device, VkSwapchainKHR swapChain, VkBool32 localDimmingEnable); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkSetLocalDimmingAMD( VkDevice device, VkSwapchainKHR swapChain, VkBool32 localDimmingEnable); #endif +#endif // VK_EXT_fragment_density_map is a preprocessor guard. Do not pass it to API calls. #define VK_EXT_fragment_density_map 1 -#define VK_EXT_FRAGMENT_DENSITY_MAP_SPEC_VERSION 2 +#define VK_EXT_FRAGMENT_DENSITY_MAP_SPEC_VERSION 3 #define VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME "VK_EXT_fragment_density_map" typedef struct VkPhysicalDeviceFragmentDensityMapFeaturesEXT { VkStructureType sType; @@ -15776,9 +18857,9 @@ typedef VkPhysicalDeviceScalarBlockLayoutFeatures VkPhysicalDeviceScalarBlockLay #define VK_GOOGLE_hlsl_functionality1 1 #define VK_GOOGLE_HLSL_FUNCTIONALITY_1_SPEC_VERSION 1 #define VK_GOOGLE_HLSL_FUNCTIONALITY_1_EXTENSION_NAME "VK_GOOGLE_hlsl_functionality1" -// VK_GOOGLE_HLSL_FUNCTIONALITY1_SPEC_VERSION is a deprecated alias +// VK_GOOGLE_HLSL_FUNCTIONALITY1_SPEC_VERSION is a legacy alias #define VK_GOOGLE_HLSL_FUNCTIONALITY1_SPEC_VERSION VK_GOOGLE_HLSL_FUNCTIONALITY_1_SPEC_VERSION -// VK_GOOGLE_HLSL_FUNCTIONALITY1_EXTENSION_NAME is a deprecated alias +// VK_GOOGLE_HLSL_FUNCTIONALITY1_EXTENSION_NAME is a legacy alias #define VK_GOOGLE_HLSL_FUNCTIONALITY1_EXTENSION_NAME VK_GOOGLE_HLSL_FUNCTIONALITY_1_EXTENSION_NAME @@ -15911,10 +18992,12 @@ typedef struct VkBufferDeviceAddressCreateInfoEXT { typedef VkDeviceAddress (VKAPI_PTR *PFN_vkGetBufferDeviceAddressEXT)(VkDevice device, const VkBufferDeviceAddressInfo* pInfo); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkDeviceAddress VKAPI_CALL vkGetBufferDeviceAddressEXT( VkDevice device, const VkBufferDeviceAddressInfo* pInfo); #endif +#endif // VK_EXT_tooling_info is a preprocessor guard. Do not pass it to API calls. @@ -15930,11 +19013,13 @@ typedef VkPhysicalDeviceToolProperties VkPhysicalDeviceToolPropertiesEXT; typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceToolPropertiesEXT)(VkPhysicalDevice physicalDevice, uint32_t* pToolCount, VkPhysicalDeviceToolProperties* pToolProperties); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceToolPropertiesEXT( VkPhysicalDevice physicalDevice, uint32_t* pToolCount, VkPhysicalDeviceToolProperties* pToolProperties); #endif +#endif // VK_EXT_separate_stencil_usage is a preprocessor guard. Do not pass it to API calls. @@ -16018,11 +19103,13 @@ typedef struct VkPhysicalDeviceCooperativeMatrixPropertiesNV { typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceCooperativeMatrixPropertiesNV)(VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkCooperativeMatrixPropertiesNV* pProperties); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceCooperativeMatrixPropertiesNV( VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkCooperativeMatrixPropertiesNV* pProperties); #endif +#endif // VK_NV_coverage_reduction_mode is a preprocessor guard. Do not pass it to API calls. @@ -16061,11 +19148,13 @@ typedef struct VkFramebufferMixedSamplesCombinationNV { typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV)(VkPhysicalDevice physicalDevice, uint32_t* pCombinationCount, VkFramebufferMixedSamplesCombinationNV* pCombinations); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV( VkPhysicalDevice physicalDevice, uint32_t* pCombinationCount, VkFramebufferMixedSamplesCombinationNV* pCombinations); #endif +#endif // VK_EXT_fragment_shader_interlock is a preprocessor guard. Do not pass it to API calls. @@ -16140,12 +19229,14 @@ typedef struct VkHeadlessSurfaceCreateInfoEXT { typedef VkResult (VKAPI_PTR *PFN_vkCreateHeadlessSurfaceEXT)(VkInstance instance, const VkHeadlessSurfaceCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateHeadlessSurfaceEXT( VkInstance instance, const VkHeadlessSurfaceCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); #endif +#endif // VK_EXT_line_rasterization is a preprocessor guard. Do not pass it to API calls. @@ -16163,11 +19254,13 @@ typedef VkPipelineRasterizationLineStateCreateInfo VkPipelineRasterizationLineSt typedef void (VKAPI_PTR *PFN_vkCmdSetLineStippleEXT)(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor, uint16_t lineStipplePattern); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetLineStippleEXT( VkCommandBuffer commandBuffer, uint32_t lineStippleFactor, uint16_t lineStipplePattern); #endif +#endif // VK_EXT_shader_atomic_float is a preprocessor guard. Do not pass it to API calls. @@ -16202,12 +19295,14 @@ typedef VkPhysicalDeviceHostQueryResetFeatures VkPhysicalDeviceHostQueryResetFea typedef void (VKAPI_PTR *PFN_vkResetQueryPoolEXT)(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkResetQueryPoolEXT( VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount); #endif +#endif // VK_EXT_index_type_uint8 is a preprocessor guard. Do not pass it to API calls. @@ -16242,28 +19337,39 @@ typedef void (VKAPI_PTR *PFN_vkCmdSetStencilTestEnableEXT)(VkCommandBuffer comma typedef void (VKAPI_PTR *PFN_vkCmdSetStencilOpEXT)(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp, VkCompareOp compareOp); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetCullModeEXT( VkCommandBuffer commandBuffer, VkCullModeFlags cullMode); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetFrontFaceEXT( VkCommandBuffer commandBuffer, VkFrontFace frontFace); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetPrimitiveTopologyEXT( VkCommandBuffer commandBuffer, VkPrimitiveTopology primitiveTopology); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetViewportWithCountEXT( VkCommandBuffer commandBuffer, uint32_t viewportCount, const VkViewport* pViewports); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetScissorWithCountEXT( VkCommandBuffer commandBuffer, uint32_t scissorCount, const VkRect2D* pScissors); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdBindVertexBuffers2EXT( VkCommandBuffer commandBuffer, uint32_t firstBinding, @@ -16272,27 +19378,39 @@ VKAPI_ATTR void VKAPI_CALL vkCmdBindVertexBuffers2EXT( const VkDeviceSize* pOffsets, const VkDeviceSize* pSizes, const VkDeviceSize* pStrides); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthTestEnableEXT( VkCommandBuffer commandBuffer, VkBool32 depthTestEnable); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthWriteEnableEXT( VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthCompareOpEXT( VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBoundsTestEnableEXT( VkCommandBuffer commandBuffer, VkBool32 depthBoundsTestEnable); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilTestEnableEXT( VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilOpEXT( VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, @@ -16301,6 +19419,7 @@ VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilOpEXT( VkStencilOp depthFailOp, VkCompareOp compareOp); #endif +#endif // VK_EXT_host_image_copy is a preprocessor guard. Do not pass it to API calls. @@ -16342,29 +19461,39 @@ typedef VkResult (VKAPI_PTR *PFN_vkTransitionImageLayoutEXT)(VkDevice device, ui typedef void (VKAPI_PTR *PFN_vkGetImageSubresourceLayout2EXT)(VkDevice device, VkImage image, const VkImageSubresource2* pSubresource, VkSubresourceLayout2* pLayout); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCopyMemoryToImageEXT( VkDevice device, const VkCopyMemoryToImageInfo* pCopyMemoryToImageInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCopyImageToMemoryEXT( VkDevice device, const VkCopyImageToMemoryInfo* pCopyImageToMemoryInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCopyImageToImageEXT( VkDevice device, const VkCopyImageToImageInfo* pCopyImageToImageInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkTransitionImageLayoutEXT( VkDevice device, uint32_t transitionCount, const VkHostImageLayoutTransitionInfo* pTransitions); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetImageSubresourceLayout2EXT( VkDevice device, VkImage image, const VkImageSubresource2* pSubresource, VkSubresourceLayout2* pLayout); #endif +#endif // VK_EXT_map_memory_placed is a preprocessor guard. Do not pass it to API calls. @@ -16420,44 +19549,19 @@ typedef struct VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT { #define VK_EXT_surface_maintenance1 1 #define VK_EXT_SURFACE_MAINTENANCE_1_SPEC_VERSION 1 #define VK_EXT_SURFACE_MAINTENANCE_1_EXTENSION_NAME "VK_EXT_surface_maintenance1" +typedef VkPresentScalingFlagBitsKHR VkPresentScalingFlagBitsEXT; -typedef enum VkPresentScalingFlagBitsEXT { - VK_PRESENT_SCALING_ONE_TO_ONE_BIT_EXT = 0x00000001, - VK_PRESENT_SCALING_ASPECT_RATIO_STRETCH_BIT_EXT = 0x00000002, - VK_PRESENT_SCALING_STRETCH_BIT_EXT = 0x00000004, - VK_PRESENT_SCALING_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF -} VkPresentScalingFlagBitsEXT; -typedef VkFlags VkPresentScalingFlagsEXT; +typedef VkPresentScalingFlagsKHR VkPresentScalingFlagsEXT; -typedef enum VkPresentGravityFlagBitsEXT { - VK_PRESENT_GRAVITY_MIN_BIT_EXT = 0x00000001, - VK_PRESENT_GRAVITY_MAX_BIT_EXT = 0x00000002, - VK_PRESENT_GRAVITY_CENTERED_BIT_EXT = 0x00000004, - VK_PRESENT_GRAVITY_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF -} VkPresentGravityFlagBitsEXT; -typedef VkFlags VkPresentGravityFlagsEXT; -typedef struct VkSurfacePresentModeEXT { - VkStructureType sType; - void* pNext; - VkPresentModeKHR presentMode; -} VkSurfacePresentModeEXT; +typedef VkPresentGravityFlagBitsKHR VkPresentGravityFlagBitsEXT; -typedef struct VkSurfacePresentScalingCapabilitiesEXT { - VkStructureType sType; - void* pNext; - VkPresentScalingFlagsEXT supportedPresentScaling; - VkPresentGravityFlagsEXT supportedPresentGravityX; - VkPresentGravityFlagsEXT supportedPresentGravityY; - VkExtent2D minScaledImageExtent; - VkExtent2D maxScaledImageExtent; -} VkSurfacePresentScalingCapabilitiesEXT; +typedef VkPresentGravityFlagsKHR VkPresentGravityFlagsEXT; -typedef struct VkSurfacePresentModeCompatibilityEXT { - VkStructureType sType; - void* pNext; - uint32_t presentModeCount; - VkPresentModeKHR* pPresentModes; -} VkSurfacePresentModeCompatibilityEXT; +typedef VkSurfacePresentModeKHR VkSurfacePresentModeEXT; + +typedef VkSurfacePresentScalingCapabilitiesKHR VkSurfacePresentScalingCapabilitiesEXT; + +typedef VkSurfacePresentModeCompatibilityKHR VkSurfacePresentModeCompatibilityEXT; @@ -16465,55 +19569,26 @@ typedef struct VkSurfacePresentModeCompatibilityEXT { #define VK_EXT_swapchain_maintenance1 1 #define VK_EXT_SWAPCHAIN_MAINTENANCE_1_SPEC_VERSION 1 #define VK_EXT_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME "VK_EXT_swapchain_maintenance1" -typedef struct VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT { - VkStructureType sType; - void* pNext; - VkBool32 swapchainMaintenance1; -} VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT; +typedef VkPhysicalDeviceSwapchainMaintenance1FeaturesKHR VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT; -typedef struct VkSwapchainPresentFenceInfoEXT { - VkStructureType sType; - const void* pNext; - uint32_t swapchainCount; - const VkFence* pFences; -} VkSwapchainPresentFenceInfoEXT; +typedef VkSwapchainPresentFenceInfoKHR VkSwapchainPresentFenceInfoEXT; -typedef struct VkSwapchainPresentModesCreateInfoEXT { - VkStructureType sType; - const void* pNext; - uint32_t presentModeCount; - const VkPresentModeKHR* pPresentModes; -} VkSwapchainPresentModesCreateInfoEXT; +typedef VkSwapchainPresentModesCreateInfoKHR VkSwapchainPresentModesCreateInfoEXT; -typedef struct VkSwapchainPresentModeInfoEXT { - VkStructureType sType; - const void* pNext; - uint32_t swapchainCount; - const VkPresentModeKHR* pPresentModes; -} VkSwapchainPresentModeInfoEXT; +typedef VkSwapchainPresentModeInfoKHR VkSwapchainPresentModeInfoEXT; -typedef struct VkSwapchainPresentScalingCreateInfoEXT { - VkStructureType sType; - const void* pNext; - VkPresentScalingFlagsEXT scalingBehavior; - VkPresentGravityFlagsEXT presentGravityX; - VkPresentGravityFlagsEXT presentGravityY; -} VkSwapchainPresentScalingCreateInfoEXT; +typedef VkSwapchainPresentScalingCreateInfoKHR VkSwapchainPresentScalingCreateInfoEXT; -typedef struct VkReleaseSwapchainImagesInfoEXT { - VkStructureType sType; - const void* pNext; - VkSwapchainKHR swapchain; - uint32_t imageIndexCount; - const uint32_t* pImageIndices; -} VkReleaseSwapchainImagesInfoEXT; +typedef VkReleaseSwapchainImagesInfoKHR VkReleaseSwapchainImagesInfoEXT; -typedef VkResult (VKAPI_PTR *PFN_vkReleaseSwapchainImagesEXT)(VkDevice device, const VkReleaseSwapchainImagesInfoEXT* pReleaseInfo); +typedef VkResult (VKAPI_PTR *PFN_vkReleaseSwapchainImagesEXT)(VkDevice device, const VkReleaseSwapchainImagesInfoKHR* pReleaseInfo); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkReleaseSwapchainImagesEXT( VkDevice device, - const VkReleaseSwapchainImagesInfoEXT* pReleaseInfo); + const VkReleaseSwapchainImagesInfoKHR* pReleaseInfo); +#endif #endif @@ -16540,6 +19615,7 @@ typedef enum VkIndirectCommandsTokenTypeNV { VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NV = 5, VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_NV = 6, VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_TASKS_NV = 7, + VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_DATA_NV = 1000135000, VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_NV = 1000328000, VK_INDIRECT_COMMANDS_TOKEN_TYPE_PIPELINE_NV = 1000428003, VK_INDIRECT_COMMANDS_TOKEN_TYPE_DISPATCH_NV = 1000428004, @@ -16686,37 +19762,49 @@ typedef VkResult (VKAPI_PTR *PFN_vkCreateIndirectCommandsLayoutNV)(VkDevice devi typedef void (VKAPI_PTR *PFN_vkDestroyIndirectCommandsLayoutNV)(VkDevice device, VkIndirectCommandsLayoutNV indirectCommandsLayout, const VkAllocationCallbacks* pAllocator); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetGeneratedCommandsMemoryRequirementsNV( VkDevice device, const VkGeneratedCommandsMemoryRequirementsInfoNV* pInfo, VkMemoryRequirements2* pMemoryRequirements); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdPreprocessGeneratedCommandsNV( VkCommandBuffer commandBuffer, const VkGeneratedCommandsInfoNV* pGeneratedCommandsInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdExecuteGeneratedCommandsNV( VkCommandBuffer commandBuffer, VkBool32 isPreprocessed, const VkGeneratedCommandsInfoNV* pGeneratedCommandsInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdBindPipelineShaderGroupNV( VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline, uint32_t groupIndex); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateIndirectCommandsLayoutNV( VkDevice device, const VkIndirectCommandsLayoutCreateInfoNV* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkIndirectCommandsLayoutNV* pIndirectCommandsLayout); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkDestroyIndirectCommandsLayoutNV( VkDevice device, VkIndirectCommandsLayoutNV indirectCommandsLayout, const VkAllocationCallbacks* pAllocator); #endif +#endif // VK_NV_inherited_viewport_scissor is a preprocessor guard. Do not pass it to API calls. @@ -16755,17 +19843,17 @@ typedef VkPhysicalDeviceTexelBufferAlignmentProperties VkPhysicalDeviceTexelBuff // VK_QCOM_render_pass_transform is a preprocessor guard. Do not pass it to API calls. #define VK_QCOM_render_pass_transform 1 -#define VK_QCOM_RENDER_PASS_TRANSFORM_SPEC_VERSION 4 +#define VK_QCOM_RENDER_PASS_TRANSFORM_SPEC_VERSION 5 #define VK_QCOM_RENDER_PASS_TRANSFORM_EXTENSION_NAME "VK_QCOM_render_pass_transform" typedef struct VkRenderPassTransformBeginInfoQCOM { VkStructureType sType; - void* pNext; + const void* pNext; VkSurfaceTransformFlagBitsKHR transform; } VkRenderPassTransformBeginInfoQCOM; typedef struct VkCommandBufferInheritanceRenderPassTransformInfoQCOM { VkStructureType sType; - void* pNext; + const void* pNext; VkSurfaceTransformFlagBitsKHR transform; VkRect2D renderArea; } VkCommandBufferInheritanceRenderPassTransformInfoQCOM; @@ -16810,10 +19898,12 @@ typedef struct VkDepthBiasRepresentationInfoEXT { typedef void (VKAPI_PTR *PFN_vkCmdSetDepthBias2EXT)(VkCommandBuffer commandBuffer, const VkDepthBiasInfoEXT* pDepthBiasInfo); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBias2EXT( VkCommandBuffer commandBuffer, const VkDepthBiasInfoEXT* pDepthBiasInfo); #endif +#endif // VK_EXT_device_memory_report is a preprocessor guard. Do not pass it to API calls. @@ -16870,37 +19960,30 @@ typedef VkResult (VKAPI_PTR *PFN_vkAcquireDrmDisplayEXT)(VkPhysicalDevice physic typedef VkResult (VKAPI_PTR *PFN_vkGetDrmDisplayEXT)(VkPhysicalDevice physicalDevice, int32_t drmFd, uint32_t connectorId, VkDisplayKHR* display); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkAcquireDrmDisplayEXT( VkPhysicalDevice physicalDevice, int32_t drmFd, VkDisplayKHR display); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetDrmDisplayEXT( VkPhysicalDevice physicalDevice, int32_t drmFd, uint32_t connectorId, VkDisplayKHR* display); #endif +#endif // VK_EXT_robustness2 is a preprocessor guard. Do not pass it to API calls. #define VK_EXT_robustness2 1 #define VK_EXT_ROBUSTNESS_2_SPEC_VERSION 1 #define VK_EXT_ROBUSTNESS_2_EXTENSION_NAME "VK_EXT_robustness2" -typedef struct VkPhysicalDeviceRobustness2FeaturesEXT { - VkStructureType sType; - void* pNext; - VkBool32 robustBufferAccess2; - VkBool32 robustImageAccess2; - VkBool32 nullDescriptor; -} VkPhysicalDeviceRobustness2FeaturesEXT; +typedef VkPhysicalDeviceRobustness2FeaturesKHR VkPhysicalDeviceRobustness2FeaturesEXT; -typedef struct VkPhysicalDeviceRobustness2PropertiesEXT { - VkStructureType sType; - void* pNext; - VkDeviceSize robustStorageBufferAccessSizeAlignment; - VkDeviceSize robustUniformBufferAccessSizeAlignment; -} VkPhysicalDeviceRobustness2PropertiesEXT; +typedef VkPhysicalDeviceRobustness2PropertiesKHR VkPhysicalDeviceRobustness2PropertiesEXT; @@ -16908,13 +19991,6 @@ typedef struct VkPhysicalDeviceRobustness2PropertiesEXT { #define VK_EXT_custom_border_color 1 #define VK_EXT_CUSTOM_BORDER_COLOR_SPEC_VERSION 12 #define VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME "VK_EXT_custom_border_color" -typedef struct VkSamplerCustomBorderColorCreateInfoEXT { - VkStructureType sType; - const void* pNext; - VkClearColorValue customBorderColor; - VkFormat format; -} VkSamplerCustomBorderColorCreateInfoEXT; - typedef struct VkPhysicalDeviceCustomBorderColorPropertiesEXT { VkStructureType sType; void* pNext; @@ -16930,6 +20006,18 @@ typedef struct VkPhysicalDeviceCustomBorderColorFeaturesEXT { +// VK_EXT_texture_compression_astc_3d is a preprocessor guard. Do not pass it to API calls. +#define VK_EXT_texture_compression_astc_3d 1 +#define VK_EXT_TEXTURE_COMPRESSION_ASTC_3D_SPEC_VERSION 1 +#define VK_EXT_TEXTURE_COMPRESSION_ASTC_3D_EXTENSION_NAME "VK_EXT_texture_compression_astc_3d" +typedef struct VkPhysicalDeviceTextureCompressionASTC3DFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 textureCompressionASTC_3D; +} VkPhysicalDeviceTextureCompressionASTC3DFeaturesEXT; + + + // VK_GOOGLE_user_type is a preprocessor guard. Do not pass it to API calls. #define VK_GOOGLE_user_type 1 #define VK_GOOGLE_USER_TYPE_SPEC_VERSION 1 @@ -16980,24 +20068,31 @@ typedef VkResult (VKAPI_PTR *PFN_vkSetPrivateDataEXT)(VkDevice device, VkObjectT typedef void (VKAPI_PTR *PFN_vkGetPrivateDataEXT)(VkDevice device, VkObjectType objectType, uint64_t objectHandle, VkPrivateDataSlot privateDataSlot, uint64_t* pData); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreatePrivateDataSlotEXT( VkDevice device, const VkPrivateDataSlotCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPrivateDataSlot* pPrivateDataSlot); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkDestroyPrivateDataSlotEXT( VkDevice device, VkPrivateDataSlot privateDataSlot, const VkAllocationCallbacks* pAllocator); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkSetPrivateDataEXT( VkDevice device, VkObjectType objectType, uint64_t objectHandle, VkPrivateDataSlot privateDataSlot, uint64_t data); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetPrivateDataEXT( VkDevice device, VkObjectType objectType, @@ -17005,6 +20100,7 @@ VKAPI_ATTR void VKAPI_CALL vkGetPrivateDataEXT( VkPrivateDataSlot privateDataSlot, uint64_t* pData); #endif +#endif // VK_EXT_pipeline_creation_cache_control is a preprocessor guard. Do not pass it to API calls. @@ -17048,95 +20144,181 @@ typedef struct VkDeviceDiagnosticsConfigCreateInfoNV { #define VK_QCOM_RENDER_PASS_STORE_OPS_EXTENSION_NAME "VK_QCOM_render_pass_store_ops" -// VK_NV_cuda_kernel_launch is a preprocessor guard. Do not pass it to API calls. -#define VK_NV_cuda_kernel_launch 1 -VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkCudaModuleNV) -VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkCudaFunctionNV) -#define VK_NV_CUDA_KERNEL_LAUNCH_SPEC_VERSION 2 -#define VK_NV_CUDA_KERNEL_LAUNCH_EXTENSION_NAME "VK_NV_cuda_kernel_launch" -typedef struct VkCudaModuleCreateInfoNV { - VkStructureType sType; - const void* pNext; - size_t dataSize; - const void* pData; -} VkCudaModuleCreateInfoNV; +// VK_QCOM_queue_perf_hint is a preprocessor guard. Do not pass it to API calls. +#define VK_QCOM_queue_perf_hint 1 +#define VK_QCOM_QUEUE_PERF_HINT_SPEC_VERSION 1 +#define VK_QCOM_QUEUE_PERF_HINT_EXTENSION_NAME "VK_QCOM_queue_perf_hint" -typedef struct VkCudaFunctionCreateInfoNV { - VkStructureType sType; - const void* pNext; - VkCudaModuleNV module; - const char* pName; -} VkCudaFunctionCreateInfoNV; +typedef enum VkPerfHintTypeQCOM { + VK_PERF_HINT_TYPE_DEFAULT_QCOM = 0, + VK_PERF_HINT_TYPE_FREQUENCY_MIN_QCOM = 1, + VK_PERF_HINT_TYPE_FREQUENCY_MAX_QCOM = 2, + VK_PERF_HINT_TYPE_FREQUENCY_SCALED_QCOM = 3, + VK_PERF_HINT_TYPE_MAX_ENUM_QCOM = 0x7FFFFFFF +} VkPerfHintTypeQCOM; +typedef struct VkPerfHintInfoQCOM { + VkStructureType sType; + void* pNext; + VkPerfHintTypeQCOM type; + uint32_t scale; +} VkPerfHintInfoQCOM; -typedef struct VkCudaLaunchInfoNV { - VkStructureType sType; - const void* pNext; - VkCudaFunctionNV function; - uint32_t gridDimX; - uint32_t gridDimY; - uint32_t gridDimZ; - uint32_t blockDimX; - uint32_t blockDimY; - uint32_t blockDimZ; - uint32_t sharedMemBytes; - size_t paramCount; - const void* const * pParams; - size_t extraCount; - const void* const * pExtras; -} VkCudaLaunchInfoNV; - -typedef struct VkPhysicalDeviceCudaKernelLaunchFeaturesNV { +typedef struct VkPhysicalDeviceQueuePerfHintFeaturesQCOM { VkStructureType sType; void* pNext; - VkBool32 cudaKernelLaunchFeatures; -} VkPhysicalDeviceCudaKernelLaunchFeaturesNV; + VkBool32 queuePerfHint; +} VkPhysicalDeviceQueuePerfHintFeaturesQCOM; -typedef struct VkPhysicalDeviceCudaKernelLaunchPropertiesNV { +typedef struct VkPhysicalDeviceQueuePerfHintPropertiesQCOM { VkStructureType sType; void* pNext; - uint32_t computeCapabilityMinor; - uint32_t computeCapabilityMajor; -} VkPhysicalDeviceCudaKernelLaunchPropertiesNV; + VkQueueFlags supportedQueues; +} VkPhysicalDeviceQueuePerfHintPropertiesQCOM; -typedef VkResult (VKAPI_PTR *PFN_vkCreateCudaModuleNV)(VkDevice device, const VkCudaModuleCreateInfoNV* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkCudaModuleNV* pModule); -typedef VkResult (VKAPI_PTR *PFN_vkGetCudaModuleCacheNV)(VkDevice device, VkCudaModuleNV module, size_t* pCacheSize, void* pCacheData); -typedef VkResult (VKAPI_PTR *PFN_vkCreateCudaFunctionNV)(VkDevice device, const VkCudaFunctionCreateInfoNV* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkCudaFunctionNV* pFunction); -typedef void (VKAPI_PTR *PFN_vkDestroyCudaModuleNV)(VkDevice device, VkCudaModuleNV module, const VkAllocationCallbacks* pAllocator); -typedef void (VKAPI_PTR *PFN_vkDestroyCudaFunctionNV)(VkDevice device, VkCudaFunctionNV function, const VkAllocationCallbacks* pAllocator); -typedef void (VKAPI_PTR *PFN_vkCmdCudaLaunchKernelNV)(VkCommandBuffer commandBuffer, const VkCudaLaunchInfoNV* pLaunchInfo); +typedef VkResult (VKAPI_PTR *PFN_vkQueueSetPerfHintQCOM)(VkQueue queue, const VkPerfHintInfoQCOM* pPerfHintInfo); #ifndef VK_NO_PROTOTYPES -VKAPI_ATTR VkResult VKAPI_CALL vkCreateCudaModuleNV( - VkDevice device, - const VkCudaModuleCreateInfoNV* pCreateInfo, - const VkAllocationCallbacks* pAllocator, - VkCudaModuleNV* pModule); +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkQueueSetPerfHintQCOM( + VkQueue queue, + const VkPerfHintInfoQCOM* pPerfHintInfo); +#endif +#endif -VKAPI_ATTR VkResult VKAPI_CALL vkGetCudaModuleCacheNV( - VkDevice device, - VkCudaModuleNV module, - size_t* pCacheSize, - void* pCacheData); -VKAPI_ATTR VkResult VKAPI_CALL vkCreateCudaFunctionNV( - VkDevice device, - const VkCudaFunctionCreateInfoNV* pCreateInfo, - const VkAllocationCallbacks* pAllocator, - VkCudaFunctionNV* pFunction); +// VK_QCOM_image_processing3 is a preprocessor guard. Do not pass it to API calls. +#define VK_QCOM_image_processing3 1 +#define VK_QCOM_IMAGE_PROCESSING_3_SPEC_VERSION 1 +#define VK_QCOM_IMAGE_PROCESSING_3_EXTENSION_NAME "VK_QCOM_image_processing3" +typedef struct VkPhysicalDeviceImageProcessing3FeaturesQCOM { + VkStructureType sType; + void* pNext; + VkBool32 imageGatherLinear; + VkBool32 imageGatherExtendedModes; + VkBool32 blockMatchExtendedClampToEdge; +} VkPhysicalDeviceImageProcessing3FeaturesQCOM; -VKAPI_ATTR void VKAPI_CALL vkDestroyCudaModuleNV( - VkDevice device, - VkCudaModuleNV module, - const VkAllocationCallbacks* pAllocator); -VKAPI_ATTR void VKAPI_CALL vkDestroyCudaFunctionNV( - VkDevice device, - VkCudaFunctionNV function, - const VkAllocationCallbacks* pAllocator); -VKAPI_ATTR void VKAPI_CALL vkCmdCudaLaunchKernelNV( +// VK_QCOM_shader_multiple_wait_queues is a preprocessor guard. Do not pass it to API calls. +#define VK_QCOM_shader_multiple_wait_queues 1 +#define VK_QCOM_SHADER_MULTIPLE_WAIT_QUEUES_SPEC_VERSION 1 +#define VK_QCOM_SHADER_MULTIPLE_WAIT_QUEUES_EXTENSION_NAME "VK_QCOM_shader_multiple_wait_queues" +typedef struct VkPhysicalDeviceShaderMultipleWaitQueuesFeaturesQCOM { + VkStructureType sType; + void* pNext; + VkBool32 shaderMultipleWaitQueues; +} VkPhysicalDeviceShaderMultipleWaitQueuesFeaturesQCOM; + +typedef struct VkPhysicalDeviceShaderMultipleWaitQueuesPropertiesQCOM { + VkStructureType sType; + void* pNext; + uint32_t maxShaderWaitQueues; +} VkPhysicalDeviceShaderMultipleWaitQueuesPropertiesQCOM; + + + +// VK_EXT_shader_split_barrier is a preprocessor guard. Do not pass it to API calls. +#define VK_EXT_shader_split_barrier 1 +#define VK_EXT_SHADER_SPLIT_BARRIER_SPEC_VERSION 1 +#define VK_EXT_SHADER_SPLIT_BARRIER_EXTENSION_NAME "VK_EXT_shader_split_barrier" +typedef struct VkPhysicalDeviceShaderSplitBarrierFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 shaderSplitBarrier; +} VkPhysicalDeviceShaderSplitBarrierFeaturesEXT; + +typedef struct VkPhysicalDeviceShaderSplitBarrierPropertiesEXT { + VkStructureType sType; + void* pNext; + uint32_t splitBarrierReservedSharedMemory; +} VkPhysicalDeviceShaderSplitBarrierPropertiesEXT; + + + +// VK_QCOM_tile_shading is a preprocessor guard. Do not pass it to API calls. +#define VK_QCOM_tile_shading 1 +#define VK_QCOM_TILE_SHADING_SPEC_VERSION 2 +#define VK_QCOM_TILE_SHADING_EXTENSION_NAME "VK_QCOM_tile_shading" + +typedef enum VkTileShadingRenderPassFlagBitsQCOM { + VK_TILE_SHADING_RENDER_PASS_ENABLE_BIT_QCOM = 0x00000001, + VK_TILE_SHADING_RENDER_PASS_PER_TILE_EXECUTION_BIT_QCOM = 0x00000002, + VK_TILE_SHADING_RENDER_PASS_FLAG_BITS_MAX_ENUM_QCOM = 0x7FFFFFFF +} VkTileShadingRenderPassFlagBitsQCOM; +typedef VkFlags VkTileShadingRenderPassFlagsQCOM; +typedef struct VkPhysicalDeviceTileShadingFeaturesQCOM { + VkStructureType sType; + void* pNext; + VkBool32 tileShading; + VkBool32 tileShadingFragmentStage; + VkBool32 tileShadingColorAttachments; + VkBool32 tileShadingDepthAttachments; + VkBool32 tileShadingStencilAttachments; + VkBool32 tileShadingInputAttachments; + VkBool32 tileShadingSampledAttachments; + VkBool32 tileShadingPerTileDraw; + VkBool32 tileShadingPerTileDispatch; + VkBool32 tileShadingDispatchTile; + VkBool32 tileShadingApron; + VkBool32 tileShadingAnisotropicApron; + VkBool32 tileShadingAtomicOps; + VkBool32 tileShadingImageProcessing; +} VkPhysicalDeviceTileShadingFeaturesQCOM; + +typedef struct VkPhysicalDeviceTileShadingPropertiesQCOM { + VkStructureType sType; + void* pNext; + uint32_t maxApronSize; + VkBool32 preferNonCoherent; + VkExtent2D tileGranularity; + VkExtent2D maxTileShadingRate; +} VkPhysicalDeviceTileShadingPropertiesQCOM; + +typedef struct VkRenderPassTileShadingCreateInfoQCOM { + VkStructureType sType; + const void* pNext; + VkTileShadingRenderPassFlagsQCOM flags; + VkExtent2D tileApronSize; +} VkRenderPassTileShadingCreateInfoQCOM; + +typedef struct VkPerTileBeginInfoQCOM { + VkStructureType sType; + const void* pNext; +} VkPerTileBeginInfoQCOM; + +typedef struct VkPerTileEndInfoQCOM { + VkStructureType sType; + const void* pNext; +} VkPerTileEndInfoQCOM; + +typedef struct VkDispatchTileInfoQCOM { + VkStructureType sType; + const void* pNext; +} VkDispatchTileInfoQCOM; + +typedef void (VKAPI_PTR *PFN_vkCmdDispatchTileQCOM)(VkCommandBuffer commandBuffer, const VkDispatchTileInfoQCOM* pDispatchTileInfo); +typedef void (VKAPI_PTR *PFN_vkCmdBeginPerTileExecutionQCOM)(VkCommandBuffer commandBuffer, const VkPerTileBeginInfoQCOM* pPerTileBeginInfo); +typedef void (VKAPI_PTR *PFN_vkCmdEndPerTileExecutionQCOM)(VkCommandBuffer commandBuffer, const VkPerTileEndInfoQCOM* pPerTileEndInfo); + +#ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdDispatchTileQCOM( VkCommandBuffer commandBuffer, - const VkCudaLaunchInfoNV* pLaunchInfo); + const VkDispatchTileInfoQCOM* pDispatchTileInfo); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdBeginPerTileExecutionQCOM( + VkCommandBuffer commandBuffer, + const VkPerTileBeginInfoQCOM* pPerTileBeginInfo); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdEndPerTileExecutionQCOM( + VkCommandBuffer commandBuffer, + const VkPerTileEndInfoQCOM* pPerTileEndInfo); +#endif #endif @@ -17154,7 +20336,6 @@ typedef struct VkQueryLowLatencySupportNV { // VK_EXT_descriptor_buffer is a preprocessor guard. Do not pass it to API calls. #define VK_EXT_descriptor_buffer 1 -VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkAccelerationStructureKHR) #define VK_EXT_DESCRIPTOR_BUFFER_SPEC_VERSION 1 #define VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME "VK_EXT_descriptor_buffer" typedef struct VkPhysicalDeviceDescriptorBufferPropertiesEXT { @@ -17195,12 +20376,6 @@ typedef struct VkPhysicalDeviceDescriptorBufferPropertiesEXT { VkDeviceSize descriptorBufferAddressSpaceSize; } VkPhysicalDeviceDescriptorBufferPropertiesEXT; -typedef struct VkPhysicalDeviceDescriptorBufferDensityMapPropertiesEXT { - VkStructureType sType; - void* pNext; - size_t combinedImageSamplerDensityMapDescriptorSize; -} VkPhysicalDeviceDescriptorBufferDensityMapPropertiesEXT; - typedef struct VkPhysicalDeviceDescriptorBufferFeaturesEXT { VkStructureType sType; void* pNext; @@ -17288,6 +20463,12 @@ typedef struct VkAccelerationStructureCaptureDescriptorDataInfoEXT { VkAccelerationStructureNV accelerationStructureNV; } VkAccelerationStructureCaptureDescriptorDataInfoEXT; +typedef struct VkPhysicalDeviceDescriptorBufferDensityMapPropertiesEXT { + VkStructureType sType; + void* pNext; + size_t combinedImageSamplerDensityMapDescriptorSize; +} VkPhysicalDeviceDescriptorBufferDensityMapPropertiesEXT; + typedef void (VKAPI_PTR *PFN_vkGetDescriptorSetLayoutSizeEXT)(VkDevice device, VkDescriptorSetLayout layout, VkDeviceSize* pLayoutSizeInBytes); typedef void (VKAPI_PTR *PFN_vkGetDescriptorSetLayoutBindingOffsetEXT)(VkDevice device, VkDescriptorSetLayout layout, uint32_t binding, VkDeviceSize* pOffset); typedef void (VKAPI_PTR *PFN_vkGetDescriptorEXT)(VkDevice device, const VkDescriptorGetInfoEXT* pDescriptorInfo, size_t dataSize, void* pDescriptor); @@ -17301,28 +20482,37 @@ typedef VkResult (VKAPI_PTR *PFN_vkGetSamplerOpaqueCaptureDescriptorDataEXT)(VkD typedef VkResult (VKAPI_PTR *PFN_vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT)(VkDevice device, const VkAccelerationStructureCaptureDescriptorDataInfoEXT* pInfo, void* pData); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetDescriptorSetLayoutSizeEXT( VkDevice device, VkDescriptorSetLayout layout, VkDeviceSize* pLayoutSizeInBytes); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetDescriptorSetLayoutBindingOffsetEXT( VkDevice device, VkDescriptorSetLayout layout, uint32_t binding, VkDeviceSize* pOffset); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetDescriptorEXT( VkDevice device, const VkDescriptorGetInfoEXT* pDescriptorInfo, size_t dataSize, void* pDescriptor); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdBindDescriptorBuffersEXT( VkCommandBuffer commandBuffer, uint32_t bufferCount, const VkDescriptorBufferBindingInfoEXT* pBindingInfos); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetDescriptorBufferOffsetsEXT( VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, @@ -17331,38 +20521,51 @@ VKAPI_ATTR void VKAPI_CALL vkCmdSetDescriptorBufferOffsetsEXT( uint32_t setCount, const uint32_t* pBufferIndices, const VkDeviceSize* pOffsets); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdBindDescriptorBufferEmbeddedSamplersEXT( VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t set); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetBufferOpaqueCaptureDescriptorDataEXT( VkDevice device, const VkBufferCaptureDescriptorDataInfoEXT* pInfo, void* pData); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetImageOpaqueCaptureDescriptorDataEXT( VkDevice device, const VkImageCaptureDescriptorDataInfoEXT* pInfo, void* pData); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetImageViewOpaqueCaptureDescriptorDataEXT( VkDevice device, const VkImageViewCaptureDescriptorDataInfoEXT* pInfo, void* pData); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetSamplerOpaqueCaptureDescriptorDataEXT( VkDevice device, const VkSamplerCaptureDescriptorDataInfoEXT* pInfo, void* pData); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetAccelerationStructureOpaqueCaptureDescriptorDataEXT( VkDevice device, const VkAccelerationStructureCaptureDescriptorDataInfoEXT* pInfo, void* pData); #endif +#endif // VK_EXT_graphics_pipeline_library is a preprocessor guard. Do not pass it to API calls. @@ -17462,11 +20665,13 @@ typedef struct VkPipelineFragmentShadingRateEnumStateCreateInfoNV { typedef void (VKAPI_PTR *PFN_vkCmdSetFragmentShadingRateEnumNV)(VkCommandBuffer commandBuffer, VkFragmentShadingRateNV shadingRate, const VkFragmentShadingRateCombinerOpKHR combinerOps[2]); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetFragmentShadingRateEnumNV( VkCommandBuffer commandBuffer, VkFragmentShadingRateNV shadingRate, const VkFragmentShadingRateCombinerOpKHR combinerOps[2]); #endif +#endif // VK_NV_ray_tracing_motion_blur is a preprocessor guard. Do not pass it to API calls. @@ -17708,22 +20913,10 @@ typedef struct VkPhysicalDevice4444FormatsFeaturesEXT { #define VK_EXT_device_fault 1 #define VK_EXT_DEVICE_FAULT_SPEC_VERSION 2 #define VK_EXT_DEVICE_FAULT_EXTENSION_NAME "VK_EXT_device_fault" +typedef VkDeviceFaultAddressTypeKHR VkDeviceFaultAddressTypeEXT; -typedef enum VkDeviceFaultAddressTypeEXT { - VK_DEVICE_FAULT_ADDRESS_TYPE_NONE_EXT = 0, - VK_DEVICE_FAULT_ADDRESS_TYPE_READ_INVALID_EXT = 1, - VK_DEVICE_FAULT_ADDRESS_TYPE_WRITE_INVALID_EXT = 2, - VK_DEVICE_FAULT_ADDRESS_TYPE_EXECUTE_INVALID_EXT = 3, - VK_DEVICE_FAULT_ADDRESS_TYPE_INSTRUCTION_POINTER_UNKNOWN_EXT = 4, - VK_DEVICE_FAULT_ADDRESS_TYPE_INSTRUCTION_POINTER_INVALID_EXT = 5, - VK_DEVICE_FAULT_ADDRESS_TYPE_INSTRUCTION_POINTER_FAULT_EXT = 6, - VK_DEVICE_FAULT_ADDRESS_TYPE_MAX_ENUM_EXT = 0x7FFFFFFF -} VkDeviceFaultAddressTypeEXT; +typedef VkDeviceFaultVendorBinaryHeaderVersionKHR VkDeviceFaultVendorBinaryHeaderVersionEXT; -typedef enum VkDeviceFaultVendorBinaryHeaderVersionEXT { - VK_DEVICE_FAULT_VENDOR_BINARY_HEADER_VERSION_ONE_EXT = 1, - VK_DEVICE_FAULT_VENDOR_BINARY_HEADER_VERSION_MAX_ENUM_EXT = 0x7FFFFFFF -} VkDeviceFaultVendorBinaryHeaderVersionEXT; typedef struct VkPhysicalDeviceFaultFeaturesEXT { VkStructureType sType; void* pNext; @@ -17739,49 +20932,31 @@ typedef struct VkDeviceFaultCountsEXT { VkDeviceSize vendorBinarySize; } VkDeviceFaultCountsEXT; -typedef struct VkDeviceFaultAddressInfoEXT { - VkDeviceFaultAddressTypeEXT addressType; - VkDeviceAddress reportedAddress; - VkDeviceSize addressPrecision; -} VkDeviceFaultAddressInfoEXT; - -typedef struct VkDeviceFaultVendorInfoEXT { - char description[VK_MAX_DESCRIPTION_SIZE]; - uint64_t vendorFaultCode; - uint64_t vendorFaultData; -} VkDeviceFaultVendorInfoEXT; - typedef struct VkDeviceFaultInfoEXT { VkStructureType sType; void* pNext; char description[VK_MAX_DESCRIPTION_SIZE]; - VkDeviceFaultAddressInfoEXT* pAddressInfos; - VkDeviceFaultVendorInfoEXT* pVendorInfos; + VkDeviceFaultAddressInfoKHR* pAddressInfos; + VkDeviceFaultVendorInfoKHR* pVendorInfos; void* pVendorBinaryData; } VkDeviceFaultInfoEXT; -typedef struct VkDeviceFaultVendorBinaryHeaderVersionOneEXT { - uint32_t headerSize; - VkDeviceFaultVendorBinaryHeaderVersionEXT headerVersion; - uint32_t vendorID; - uint32_t deviceID; - uint32_t driverVersion; - uint8_t pipelineCacheUUID[VK_UUID_SIZE]; - uint32_t applicationNameOffset; - uint32_t applicationVersion; - uint32_t engineNameOffset; - uint32_t engineVersion; - uint32_t apiVersion; -} VkDeviceFaultVendorBinaryHeaderVersionOneEXT; +typedef VkDeviceFaultAddressInfoKHR VkDeviceFaultAddressInfoEXT; + +typedef VkDeviceFaultVendorInfoKHR VkDeviceFaultVendorInfoEXT; + +typedef VkDeviceFaultVendorBinaryHeaderVersionOneKHR VkDeviceFaultVendorBinaryHeaderVersionOneEXT; typedef VkResult (VKAPI_PTR *PFN_vkGetDeviceFaultInfoEXT)(VkDevice device, VkDeviceFaultCountsEXT* pFaultCounts, VkDeviceFaultInfoEXT* pFaultInfo); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetDeviceFaultInfoEXT( VkDevice device, VkDeviceFaultCountsEXT* pFaultCounts, VkDeviceFaultInfoEXT* pFaultInfo); #endif +#endif // VK_ARM_rasterization_order_attachment_access is a preprocessor guard. Do not pass it to API calls. @@ -17873,6 +21048,7 @@ typedef struct VkVertexInputAttributeDescription2EXT { typedef void (VKAPI_PTR *PFN_vkCmdSetVertexInputEXT)(VkCommandBuffer commandBuffer, uint32_t vertexBindingDescriptionCount, const VkVertexInputBindingDescription2EXT* pVertexBindingDescriptions, uint32_t vertexAttributeDescriptionCount, const VkVertexInputAttributeDescription2EXT* pVertexAttributeDescriptions); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetVertexInputEXT( VkCommandBuffer commandBuffer, uint32_t vertexBindingDescriptionCount, @@ -17880,6 +21056,7 @@ VKAPI_ATTR void VKAPI_CALL vkCmdSetVertexInputEXT( uint32_t vertexAttributeDescriptionCount, const VkVertexInputAttributeDescription2EXT* pVertexAttributeDescriptions); #endif +#endif // VK_EXT_physical_device_drm is a preprocessor guard. Do not pass it to API calls. @@ -17967,11 +21144,7 @@ typedef struct VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT { #define VK_EXT_present_mode_fifo_latest_ready 1 #define VK_EXT_PRESENT_MODE_FIFO_LATEST_READY_SPEC_VERSION 1 #define VK_EXT_PRESENT_MODE_FIFO_LATEST_READY_EXTENSION_NAME "VK_EXT_present_mode_fifo_latest_ready" -typedef struct VkPhysicalDevicePresentModeFifoLatestReadyFeaturesEXT { - VkStructureType sType; - void* pNext; - VkBool32 presentModeFifoLatestReady; -} VkPhysicalDevicePresentModeFifoLatestReadyFeaturesEXT; +typedef VkPhysicalDevicePresentModeFifoLatestReadyFeaturesKHR VkPhysicalDevicePresentModeFifoLatestReadyFeaturesEXT; @@ -18002,14 +21175,18 @@ typedef VkResult (VKAPI_PTR *PFN_vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI typedef void (VKAPI_PTR *PFN_vkCmdSubpassShadingHUAWEI)(VkCommandBuffer commandBuffer); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI( VkDevice device, VkRenderPass renderpass, VkExtent2D* pMaxWorkgroupSize); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSubpassShadingHUAWEI( VkCommandBuffer commandBuffer); #endif +#endif // VK_HUAWEI_invocation_mask is a preprocessor guard. Do not pass it to API calls. @@ -18025,11 +21202,13 @@ typedef struct VkPhysicalDeviceInvocationMaskFeaturesHUAWEI { typedef void (VKAPI_PTR *PFN_vkCmdBindInvocationMaskHUAWEI)(VkCommandBuffer commandBuffer, VkImageView imageView, VkImageLayout imageLayout); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdBindInvocationMaskHUAWEI( VkCommandBuffer commandBuffer, VkImageView imageView, VkImageLayout imageLayout); #endif +#endif // VK_NV_external_memory_rdma is a preprocessor guard. Do not pass it to API calls. @@ -18053,11 +21232,13 @@ typedef struct VkPhysicalDeviceExternalMemoryRDMAFeaturesNV { typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryRemoteAddressNV)(VkDevice device, const VkMemoryGetRemoteAddressInfoNV* pMemoryGetRemoteAddressInfo, VkRemoteAddressNV* pAddress); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryRemoteAddressNV( VkDevice device, const VkMemoryGetRemoteAddressInfoNV* pMemoryGetRemoteAddressInfo, VkRemoteAddressNV* pAddress); #endif +#endif // VK_EXT_pipeline_properties is a preprocessor guard. Do not pass it to API calls. @@ -18078,14 +21259,16 @@ typedef struct VkPhysicalDevicePipelinePropertiesFeaturesEXT { VkBool32 pipelinePropertiesIdentifier; } VkPhysicalDevicePipelinePropertiesFeaturesEXT; -typedef VkResult (VKAPI_PTR *PFN_vkGetPipelinePropertiesEXT)(VkDevice device, const VkPipelineInfoEXT* pPipelineInfo, VkBaseOutStructure* pPipelineProperties); +typedef VkResult (VKAPI_PTR *PFN_vkGetPipelinePropertiesEXT)(VkDevice device, const VkPipelineInfoKHR* pPipelineInfo, VkBaseOutStructure* pPipelineProperties); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPipelinePropertiesEXT( VkDevice device, - const VkPipelineInfoEXT* pPipelineInfo, + const VkPipelineInfoKHR* pPipelineInfo, VkBaseOutStructure* pPipelineProperties); #endif +#endif // VK_EXT_frame_boundary is a preprocessor guard. Do not pass it to API calls. @@ -18164,26 +21347,36 @@ typedef void (VKAPI_PTR *PFN_vkCmdSetLogicOpEXT)(VkCommandBuffer commandBuffer, typedef void (VKAPI_PTR *PFN_vkCmdSetPrimitiveRestartEnableEXT)(VkCommandBuffer commandBuffer, VkBool32 primitiveRestartEnable); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetPatchControlPointsEXT( VkCommandBuffer commandBuffer, uint32_t patchControlPoints); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetRasterizerDiscardEnableEXT( VkCommandBuffer commandBuffer, VkBool32 rasterizerDiscardEnable); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBiasEnableEXT( VkCommandBuffer commandBuffer, VkBool32 depthBiasEnable); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetLogicOpEXT( VkCommandBuffer commandBuffer, VkLogicOp logicOp); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetPrimitiveRestartEnableEXT( VkCommandBuffer commandBuffer, VkBool32 primitiveRestartEnable); #endif +#endif // VK_EXT_color_write_enable is a preprocessor guard. Do not pass it to API calls. @@ -18203,14 +21396,16 @@ typedef struct VkPipelineColorWriteCreateInfoEXT { const VkBool32* pColorWriteEnables; } VkPipelineColorWriteCreateInfoEXT; -typedef void (VKAPI_PTR *PFN_vkCmdSetColorWriteEnableEXT)(VkCommandBuffer commandBuffer, uint32_t attachmentCount, const VkBool32* pColorWriteEnables); +typedef void (VKAPI_PTR *PFN_vkCmdSetColorWriteEnableEXT)(VkCommandBuffer commandBuffer, uint32_t attachmentCount, const VkBool32* pColorWriteEnables); #ifndef VK_NO_PROTOTYPES -VKAPI_ATTR void VKAPI_CALL vkCmdSetColorWriteEnableEXT( +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdSetColorWriteEnableEXT( VkCommandBuffer commandBuffer, uint32_t attachmentCount, const VkBool32* pColorWriteEnables); #endif +#endif // VK_EXT_primitives_generated_query is a preprocessor guard. Do not pass it to API calls. @@ -18238,6 +21433,66 @@ typedef VkQueueFamilyGlobalPriorityProperties VkQueueFamilyGlobalPriorityPropert +// VK_VALVE_video_encode_rgb_conversion is a preprocessor guard. Do not pass it to API calls. +#define VK_VALVE_video_encode_rgb_conversion 1 +#define VK_VALVE_VIDEO_ENCODE_RGB_CONVERSION_SPEC_VERSION 1 +#define VK_VALVE_VIDEO_ENCODE_RGB_CONVERSION_EXTENSION_NAME "VK_VALVE_video_encode_rgb_conversion" + +typedef enum VkVideoEncodeRgbModelConversionFlagBitsVALVE { + VK_VIDEO_ENCODE_RGB_MODEL_CONVERSION_RGB_IDENTITY_BIT_VALVE = 0x00000001, + VK_VIDEO_ENCODE_RGB_MODEL_CONVERSION_YCBCR_IDENTITY_BIT_VALVE = 0x00000002, + VK_VIDEO_ENCODE_RGB_MODEL_CONVERSION_YCBCR_709_BIT_VALVE = 0x00000004, + VK_VIDEO_ENCODE_RGB_MODEL_CONVERSION_YCBCR_601_BIT_VALVE = 0x00000008, + VK_VIDEO_ENCODE_RGB_MODEL_CONVERSION_YCBCR_2020_BIT_VALVE = 0x00000010, + VK_VIDEO_ENCODE_RGB_MODEL_CONVERSION_FLAG_BITS_MAX_ENUM_VALVE = 0x7FFFFFFF +} VkVideoEncodeRgbModelConversionFlagBitsVALVE; +typedef VkFlags VkVideoEncodeRgbModelConversionFlagsVALVE; + +typedef enum VkVideoEncodeRgbRangeCompressionFlagBitsVALVE { + VK_VIDEO_ENCODE_RGB_RANGE_COMPRESSION_FULL_RANGE_BIT_VALVE = 0x00000001, + VK_VIDEO_ENCODE_RGB_RANGE_COMPRESSION_NARROW_RANGE_BIT_VALVE = 0x00000002, + VK_VIDEO_ENCODE_RGB_RANGE_COMPRESSION_FLAG_BITS_MAX_ENUM_VALVE = 0x7FFFFFFF +} VkVideoEncodeRgbRangeCompressionFlagBitsVALVE; +typedef VkFlags VkVideoEncodeRgbRangeCompressionFlagsVALVE; + +typedef enum VkVideoEncodeRgbChromaOffsetFlagBitsVALVE { + VK_VIDEO_ENCODE_RGB_CHROMA_OFFSET_COSITED_EVEN_BIT_VALVE = 0x00000001, + VK_VIDEO_ENCODE_RGB_CHROMA_OFFSET_MIDPOINT_BIT_VALVE = 0x00000002, + VK_VIDEO_ENCODE_RGB_CHROMA_OFFSET_FLAG_BITS_MAX_ENUM_VALVE = 0x7FFFFFFF +} VkVideoEncodeRgbChromaOffsetFlagBitsVALVE; +typedef VkFlags VkVideoEncodeRgbChromaOffsetFlagsVALVE; +typedef struct VkPhysicalDeviceVideoEncodeRgbConversionFeaturesVALVE { + VkStructureType sType; + void* pNext; + VkBool32 videoEncodeRgbConversion; +} VkPhysicalDeviceVideoEncodeRgbConversionFeaturesVALVE; + +typedef struct VkVideoEncodeRgbConversionCapabilitiesVALVE { + VkStructureType sType; + void* pNext; + VkVideoEncodeRgbModelConversionFlagsVALVE rgbModels; + VkVideoEncodeRgbRangeCompressionFlagsVALVE rgbRanges; + VkVideoEncodeRgbChromaOffsetFlagsVALVE xChromaOffsets; + VkVideoEncodeRgbChromaOffsetFlagsVALVE yChromaOffsets; +} VkVideoEncodeRgbConversionCapabilitiesVALVE; + +typedef struct VkVideoEncodeProfileRgbConversionInfoVALVE { + VkStructureType sType; + const void* pNext; + VkBool32 performEncodeRgbConversion; +} VkVideoEncodeProfileRgbConversionInfoVALVE; + +typedef struct VkVideoEncodeSessionRgbConversionCreateInfoVALVE { + VkStructureType sType; + const void* pNext; + VkVideoEncodeRgbModelConversionFlagBitsVALVE rgbModel; + VkVideoEncodeRgbRangeCompressionFlagBitsVALVE rgbRange; + VkVideoEncodeRgbChromaOffsetFlagBitsVALVE xChromaOffset; + VkVideoEncodeRgbChromaOffsetFlagBitsVALVE yChromaOffset; +} VkVideoEncodeSessionRgbConversionCreateInfoVALVE; + + + // VK_EXT_image_view_min_lod is a preprocessor guard. Do not pass it to API calls. #define VK_EXT_image_view_min_lod 1 #define VK_EXT_IMAGE_VIEW_MIN_LOD_SPEC_VERSION 1 @@ -18287,6 +21542,7 @@ typedef void (VKAPI_PTR *PFN_vkCmdDrawMultiEXT)(VkCommandBuffer commandBuffer, u typedef void (VKAPI_PTR *PFN_vkCmdDrawMultiIndexedEXT)(VkCommandBuffer commandBuffer, uint32_t drawCount, const VkMultiDrawIndexedInfoEXT* pIndexInfo, uint32_t instanceCount, uint32_t firstInstance, uint32_t stride, const int32_t* pVertexOffset); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdDrawMultiEXT( VkCommandBuffer commandBuffer, uint32_t drawCount, @@ -18294,7 +21550,9 @@ VKAPI_ATTR void VKAPI_CALL vkCmdDrawMultiEXT( uint32_t instanceCount, uint32_t firstInstance, uint32_t stride); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdDrawMultiIndexedEXT( VkCommandBuffer commandBuffer, uint32_t drawCount, @@ -18304,6 +21562,7 @@ VKAPI_ATTR void VKAPI_CALL vkCmdDrawMultiIndexedEXT( uint32_t stride, const int32_t* pVertexOffset); #endif +#endif // VK_EXT_image_2d_view_of_3d is a preprocessor guard. Do not pass it to API calls. @@ -18367,21 +21626,10 @@ typedef enum VkCopyMicromapModeEXT { VK_COPY_MICROMAP_MODE_COMPACT_EXT = 3, VK_COPY_MICROMAP_MODE_MAX_ENUM_EXT = 0x7FFFFFFF } VkCopyMicromapModeEXT; +typedef VkOpacityMicromapFormatKHR VkOpacityMicromapFormatEXT; -typedef enum VkOpacityMicromapFormatEXT { - VK_OPACITY_MICROMAP_FORMAT_2_STATE_EXT = 1, - VK_OPACITY_MICROMAP_FORMAT_4_STATE_EXT = 2, - VK_OPACITY_MICROMAP_FORMAT_MAX_ENUM_EXT = 0x7FFFFFFF -} VkOpacityMicromapFormatEXT; +typedef VkOpacityMicromapSpecialIndexKHR VkOpacityMicromapSpecialIndexEXT; -typedef enum VkOpacityMicromapSpecialIndexEXT { - VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_TRANSPARENT_EXT = -1, - VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_OPAQUE_EXT = -2, - VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_UNKNOWN_TRANSPARENT_EXT = -3, - VK_OPACITY_MICROMAP_SPECIAL_INDEX_FULLY_UNKNOWN_OPAQUE_EXT = -4, - VK_OPACITY_MICROMAP_SPECIAL_INDEX_CLUSTER_GEOMETRY_DISABLE_OPACITY_MICROMAP_NV = -5, - VK_OPACITY_MICROMAP_SPECIAL_INDEX_MAX_ENUM_EXT = 0x7FFFFFFF -} VkOpacityMicromapSpecialIndexEXT; typedef enum VkAccelerationStructureCompatibilityKHR { VK_ACCELERATION_STRUCTURE_COMPATIBILITY_COMPATIBLE_KHR = 0, @@ -18513,65 +21761,76 @@ typedef struct VkAccelerationStructureTrianglesOpacityMicromapEXT { VkMicromapEXT micromap; } VkAccelerationStructureTrianglesOpacityMicromapEXT; -typedef struct VkMicromapTriangleEXT { - uint32_t dataOffset; - uint16_t subdivisionLevel; - uint16_t format; -} VkMicromapTriangleEXT; +typedef VkMicromapTriangleKHR VkMicromapTriangleEXT; -typedef VkResult (VKAPI_PTR *PFN_vkCreateMicromapEXT)(VkDevice device, const VkMicromapCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkMicromapEXT* pMicromap); -typedef void (VKAPI_PTR *PFN_vkDestroyMicromapEXT)(VkDevice device, VkMicromapEXT micromap, const VkAllocationCallbacks* pAllocator); -typedef void (VKAPI_PTR *PFN_vkCmdBuildMicromapsEXT)(VkCommandBuffer commandBuffer, uint32_t infoCount, const VkMicromapBuildInfoEXT* pInfos); -typedef VkResult (VKAPI_PTR *PFN_vkBuildMicromapsEXT)(VkDevice device, VkDeferredOperationKHR deferredOperation, uint32_t infoCount, const VkMicromapBuildInfoEXT* pInfos); -typedef VkResult (VKAPI_PTR *PFN_vkCopyMicromapEXT)(VkDevice device, VkDeferredOperationKHR deferredOperation, const VkCopyMicromapInfoEXT* pInfo); -typedef VkResult (VKAPI_PTR *PFN_vkCopyMicromapToMemoryEXT)(VkDevice device, VkDeferredOperationKHR deferredOperation, const VkCopyMicromapToMemoryInfoEXT* pInfo); -typedef VkResult (VKAPI_PTR *PFN_vkCopyMemoryToMicromapEXT)(VkDevice device, VkDeferredOperationKHR deferredOperation, const VkCopyMemoryToMicromapInfoEXT* pInfo); -typedef VkResult (VKAPI_PTR *PFN_vkWriteMicromapsPropertiesEXT)(VkDevice device, uint32_t micromapCount, const VkMicromapEXT* pMicromaps, VkQueryType queryType, size_t dataSize, void* pData, size_t stride); -typedef void (VKAPI_PTR *PFN_vkCmdCopyMicromapEXT)(VkCommandBuffer commandBuffer, const VkCopyMicromapInfoEXT* pInfo); -typedef void (VKAPI_PTR *PFN_vkCmdCopyMicromapToMemoryEXT)(VkCommandBuffer commandBuffer, const VkCopyMicromapToMemoryInfoEXT* pInfo); -typedef void (VKAPI_PTR *PFN_vkCmdCopyMemoryToMicromapEXT)(VkCommandBuffer commandBuffer, const VkCopyMemoryToMicromapInfoEXT* pInfo); -typedef void (VKAPI_PTR *PFN_vkCmdWriteMicromapsPropertiesEXT)(VkCommandBuffer commandBuffer, uint32_t micromapCount, const VkMicromapEXT* pMicromaps, VkQueryType queryType, VkQueryPool queryPool, uint32_t firstQuery); -typedef void (VKAPI_PTR *PFN_vkGetDeviceMicromapCompatibilityEXT)(VkDevice device, const VkMicromapVersionInfoEXT* pVersionInfo, VkAccelerationStructureCompatibilityKHR* pCompatibility); -typedef void (VKAPI_PTR *PFN_vkGetMicromapBuildSizesEXT)(VkDevice device, VkAccelerationStructureBuildTypeKHR buildType, const VkMicromapBuildInfoEXT* pBuildInfo, VkMicromapBuildSizesInfoEXT* pSizeInfo); +typedef VkResult (VKAPI_PTR *PFN_vkCreateMicromapEXT)(VkDevice device, const VkMicromapCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkMicromapEXT* pMicromap); +typedef void (VKAPI_PTR *PFN_vkDestroyMicromapEXT)(VkDevice device, VkMicromapEXT micromap, const VkAllocationCallbacks* pAllocator); +typedef void (VKAPI_PTR *PFN_vkCmdBuildMicromapsEXT)(VkCommandBuffer commandBuffer, uint32_t infoCount, const VkMicromapBuildInfoEXT* pInfos); +typedef VkResult (VKAPI_PTR *PFN_vkBuildMicromapsEXT)(VkDevice device, VkDeferredOperationKHR deferredOperation, uint32_t infoCount, const VkMicromapBuildInfoEXT* pInfos); +typedef VkResult (VKAPI_PTR *PFN_vkCopyMicromapEXT)(VkDevice device, VkDeferredOperationKHR deferredOperation, const VkCopyMicromapInfoEXT* pInfo); +typedef VkResult (VKAPI_PTR *PFN_vkCopyMicromapToMemoryEXT)(VkDevice device, VkDeferredOperationKHR deferredOperation, const VkCopyMicromapToMemoryInfoEXT* pInfo); +typedef VkResult (VKAPI_PTR *PFN_vkCopyMemoryToMicromapEXT)(VkDevice device, VkDeferredOperationKHR deferredOperation, const VkCopyMemoryToMicromapInfoEXT* pInfo); +typedef VkResult (VKAPI_PTR *PFN_vkWriteMicromapsPropertiesEXT)(VkDevice device, uint32_t micromapCount, const VkMicromapEXT* pMicromaps, VkQueryType queryType, size_t dataSize, void* pData, size_t stride); +typedef void (VKAPI_PTR *PFN_vkCmdCopyMicromapEXT)(VkCommandBuffer commandBuffer, const VkCopyMicromapInfoEXT* pInfo); +typedef void (VKAPI_PTR *PFN_vkCmdCopyMicromapToMemoryEXT)(VkCommandBuffer commandBuffer, const VkCopyMicromapToMemoryInfoEXT* pInfo); +typedef void (VKAPI_PTR *PFN_vkCmdCopyMemoryToMicromapEXT)(VkCommandBuffer commandBuffer, const VkCopyMemoryToMicromapInfoEXT* pInfo); +typedef void (VKAPI_PTR *PFN_vkCmdWriteMicromapsPropertiesEXT)(VkCommandBuffer commandBuffer, uint32_t micromapCount, const VkMicromapEXT* pMicromaps, VkQueryType queryType, VkQueryPool queryPool, uint32_t firstQuery); +typedef void (VKAPI_PTR *PFN_vkGetDeviceMicromapCompatibilityEXT)(VkDevice device, const VkMicromapVersionInfoEXT* pVersionInfo, VkAccelerationStructureCompatibilityKHR* pCompatibility); +typedef void (VKAPI_PTR *PFN_vkGetMicromapBuildSizesEXT)(VkDevice device, VkAccelerationStructureBuildTypeKHR buildType, const VkMicromapBuildInfoEXT* pBuildInfo, VkMicromapBuildSizesInfoEXT* pSizeInfo); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateMicromapEXT( VkDevice device, const VkMicromapCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkMicromapEXT* pMicromap); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkDestroyMicromapEXT( VkDevice device, VkMicromapEXT micromap, const VkAllocationCallbacks* pAllocator); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdBuildMicromapsEXT( VkCommandBuffer commandBuffer, uint32_t infoCount, const VkMicromapBuildInfoEXT* pInfos); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkBuildMicromapsEXT( VkDevice device, VkDeferredOperationKHR deferredOperation, uint32_t infoCount, const VkMicromapBuildInfoEXT* pInfos); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCopyMicromapEXT( VkDevice device, VkDeferredOperationKHR deferredOperation, const VkCopyMicromapInfoEXT* pInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCopyMicromapToMemoryEXT( VkDevice device, VkDeferredOperationKHR deferredOperation, const VkCopyMicromapToMemoryInfoEXT* pInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCopyMemoryToMicromapEXT( VkDevice device, VkDeferredOperationKHR deferredOperation, const VkCopyMemoryToMicromapInfoEXT* pInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkWriteMicromapsPropertiesEXT( VkDevice device, uint32_t micromapCount, @@ -18580,19 +21839,27 @@ VKAPI_ATTR VkResult VKAPI_CALL vkWriteMicromapsPropertiesEXT( size_t dataSize, void* pData, size_t stride); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdCopyMicromapEXT( VkCommandBuffer commandBuffer, const VkCopyMicromapInfoEXT* pInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdCopyMicromapToMemoryEXT( VkCommandBuffer commandBuffer, const VkCopyMicromapToMemoryInfoEXT* pInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdCopyMemoryToMicromapEXT( VkCommandBuffer commandBuffer, const VkCopyMemoryToMicromapInfoEXT* pInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdWriteMicromapsPropertiesEXT( VkCommandBuffer commandBuffer, uint32_t micromapCount, @@ -18600,18 +21867,23 @@ VKAPI_ATTR void VKAPI_CALL vkCmdWriteMicromapsPropertiesEXT( VkQueryType queryType, VkQueryPool queryPool, uint32_t firstQuery); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetDeviceMicromapCompatibilityEXT( VkDevice device, const VkMicromapVersionInfoEXT* pVersionInfo, VkAccelerationStructureCompatibilityKHR* pCompatibility); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetMicromapBuildSizesEXT( VkDevice device, VkAccelerationStructureBuildTypeKHR buildType, const VkMicromapBuildInfoEXT* pBuildInfo, VkMicromapBuildSizesInfoEXT* pSizeInfo); #endif +#endif // VK_EXT_load_store_op_none is a preprocessor guard. Do not pass it to API calls. @@ -18650,17 +21922,21 @@ typedef void (VKAPI_PTR *PFN_vkCmdDrawClusterHUAWEI)(VkCommandBuffer commandBuff typedef void (VKAPI_PTR *PFN_vkCmdDrawClusterIndirectHUAWEI)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdDrawClusterHUAWEI( VkCommandBuffer commandBuffer, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdDrawClusterIndirectHUAWEI( VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset); #endif +#endif // VK_EXT_border_color_swizzle is a preprocessor guard. Do not pass it to API calls. @@ -18696,11 +21972,13 @@ typedef struct VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT { typedef void (VKAPI_PTR *PFN_vkSetDeviceMemoryPriorityEXT)(VkDevice device, VkDeviceMemory memory, float priority); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkSetDeviceMemoryPriorityEXT( VkDevice device, VkDeviceMemory memory, float priority); #endif +#endif // VK_ARM_shader_core_properties is a preprocessor guard. Do not pass it to API calls. @@ -18719,13 +21997,14 @@ typedef struct VkPhysicalDeviceShaderCorePropertiesARM { // VK_ARM_scheduling_controls is a preprocessor guard. Do not pass it to API calls. #define VK_ARM_scheduling_controls 1 -#define VK_ARM_SCHEDULING_CONTROLS_SPEC_VERSION 1 +#define VK_ARM_SCHEDULING_CONTROLS_SPEC_VERSION 2 #define VK_ARM_SCHEDULING_CONTROLS_EXTENSION_NAME "VK_ARM_scheduling_controls" typedef VkFlags64 VkPhysicalDeviceSchedulingControlsFlagsARM; // Flag bits for VkPhysicalDeviceSchedulingControlsFlagBitsARM typedef VkFlags64 VkPhysicalDeviceSchedulingControlsFlagBitsARM; static const VkPhysicalDeviceSchedulingControlsFlagBitsARM VK_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_SHADER_CORE_COUNT_ARM = 0x00000001ULL; +static const VkPhysicalDeviceSchedulingControlsFlagBitsARM VK_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_DISPATCH_PARAMETERS_ARM = 0x00000002ULL; typedef struct VkDeviceQueueShaderCoreControlCreateInfoARM { VkStructureType sType; @@ -18745,6 +22024,31 @@ typedef struct VkPhysicalDeviceSchedulingControlsPropertiesARM { VkPhysicalDeviceSchedulingControlsFlagsARM schedulingControlsFlags; } VkPhysicalDeviceSchedulingControlsPropertiesARM; +typedef struct VkDispatchParametersARM { + VkStructureType sType; + void* pNext; + uint32_t workGroupBatchSize; + uint32_t maxQueuedWorkGroupBatches; + uint32_t maxWarpsPerShaderCore; +} VkDispatchParametersARM; + +typedef struct VkPhysicalDeviceSchedulingControlsDispatchParametersPropertiesARM { + VkStructureType sType; + void* pNext; + uint32_t schedulingControlsMaxWarpsCount; + uint32_t schedulingControlsMaxQueuedBatchesCount; + uint32_t schedulingControlsMaxWorkGroupBatchSize; +} VkPhysicalDeviceSchedulingControlsDispatchParametersPropertiesARM; + +typedef void (VKAPI_PTR *PFN_vkCmdSetDispatchParametersARM)(VkCommandBuffer commandBuffer, const VkDispatchParametersARM* pDispatchParameters); + +#ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdSetDispatchParametersARM( + VkCommandBuffer commandBuffer, + const VkDispatchParametersARM* pDispatchParameters); +#endif +#endif // VK_EXT_image_sliced_view_of_3d is a preprocessor guard. Do not pass it to API calls. @@ -18795,16 +22099,20 @@ typedef void (VKAPI_PTR *PFN_vkGetDescriptorSetLayoutHostMappingInfoVALVE)(VkDev typedef void (VKAPI_PTR *PFN_vkGetDescriptorSetHostMappingVALVE)(VkDevice device, VkDescriptorSet descriptorSet, void** ppData); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetDescriptorSetLayoutHostMappingInfoVALVE( VkDevice device, const VkDescriptorSetBindingReferenceVALVE* pBindingReference, VkDescriptorSetLayoutHostMappingInfoVALVE* pHostMapping); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetDescriptorSetHostMappingVALVE( VkDevice device, VkDescriptorSet descriptorSet, void** ppData); #endif +#endif // VK_EXT_depth_clamp_zero_one is a preprocessor guard. Do not pass it to API calls. @@ -18868,26 +22176,32 @@ typedef struct VkRenderPassStripeSubmitInfoARM { // VK_QCOM_fragment_density_map_offset is a preprocessor guard. Do not pass it to API calls. #define VK_QCOM_fragment_density_map_offset 1 -#define VK_QCOM_FRAGMENT_DENSITY_MAP_OFFSET_SPEC_VERSION 2 +#define VK_QCOM_FRAGMENT_DENSITY_MAP_OFFSET_SPEC_VERSION 3 #define VK_QCOM_FRAGMENT_DENSITY_MAP_OFFSET_EXTENSION_NAME "VK_QCOM_fragment_density_map_offset" -typedef struct VkPhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM { +typedef struct VkPhysicalDeviceFragmentDensityMapOffsetFeaturesEXT { VkStructureType sType; void* pNext; VkBool32 fragmentDensityMapOffset; -} VkPhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM; +} VkPhysicalDeviceFragmentDensityMapOffsetFeaturesEXT; -typedef struct VkPhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM { +typedef VkPhysicalDeviceFragmentDensityMapOffsetFeaturesEXT VkPhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM; + +typedef struct VkPhysicalDeviceFragmentDensityMapOffsetPropertiesEXT { VkStructureType sType; void* pNext; VkExtent2D fragmentDensityOffsetGranularity; -} VkPhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM; +} VkPhysicalDeviceFragmentDensityMapOffsetPropertiesEXT; -typedef struct VkSubpassFragmentDensityMapOffsetEndInfoQCOM { +typedef VkPhysicalDeviceFragmentDensityMapOffsetPropertiesEXT VkPhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM; + +typedef struct VkRenderPassFragmentDensityMapOffsetEndInfoEXT { VkStructureType sType; const void* pNext; uint32_t fragmentDensityOffsetCount; const VkOffset2D* pFragmentDensityOffsets; -} VkSubpassFragmentDensityMapOffsetEndInfoQCOM; +} VkRenderPassFragmentDensityMapOffsetEndInfoEXT; + +typedef VkRenderPassFragmentDensityMapOffsetEndInfoEXT VkSubpassFragmentDensityMapOffsetEndInfoQCOM; @@ -18895,20 +22209,9 @@ typedef struct VkSubpassFragmentDensityMapOffsetEndInfoQCOM { #define VK_NV_copy_memory_indirect 1 #define VK_NV_COPY_MEMORY_INDIRECT_SPEC_VERSION 1 #define VK_NV_COPY_MEMORY_INDIRECT_EXTENSION_NAME "VK_NV_copy_memory_indirect" -typedef struct VkCopyMemoryIndirectCommandNV { - VkDeviceAddress srcAddress; - VkDeviceAddress dstAddress; - VkDeviceSize size; -} VkCopyMemoryIndirectCommandNV; +typedef VkCopyMemoryIndirectCommandKHR VkCopyMemoryIndirectCommandNV; -typedef struct VkCopyMemoryToImageIndirectCommandNV { - VkDeviceAddress srcAddress; - uint32_t bufferRowLength; - uint32_t bufferImageHeight; - VkImageSubresourceLayers imageSubresource; - VkOffset3D imageOffset; - VkExtent3D imageExtent; -} VkCopyMemoryToImageIndirectCommandNV; +typedef VkCopyMemoryToImageIndirectCommandKHR VkCopyMemoryToImageIndirectCommandNV; typedef struct VkPhysicalDeviceCopyMemoryIndirectFeaturesNV { VkStructureType sType; @@ -18916,22 +22219,21 @@ typedef struct VkPhysicalDeviceCopyMemoryIndirectFeaturesNV { VkBool32 indirectCopy; } VkPhysicalDeviceCopyMemoryIndirectFeaturesNV; -typedef struct VkPhysicalDeviceCopyMemoryIndirectPropertiesNV { - VkStructureType sType; - void* pNext; - VkQueueFlags supportedQueues; -} VkPhysicalDeviceCopyMemoryIndirectPropertiesNV; +typedef VkPhysicalDeviceCopyMemoryIndirectPropertiesKHR VkPhysicalDeviceCopyMemoryIndirectPropertiesNV; typedef void (VKAPI_PTR *PFN_vkCmdCopyMemoryIndirectNV)(VkCommandBuffer commandBuffer, VkDeviceAddress copyBufferAddress, uint32_t copyCount, uint32_t stride); typedef void (VKAPI_PTR *PFN_vkCmdCopyMemoryToImageIndirectNV)(VkCommandBuffer commandBuffer, VkDeviceAddress copyBufferAddress, uint32_t copyCount, uint32_t stride, VkImage dstImage, VkImageLayout dstImageLayout, const VkImageSubresourceLayers* pImageSubresources); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdCopyMemoryIndirectNV( VkCommandBuffer commandBuffer, VkDeviceAddress copyBufferAddress, uint32_t copyCount, uint32_t stride); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdCopyMemoryToImageIndirectNV( VkCommandBuffer commandBuffer, VkDeviceAddress copyBufferAddress, @@ -18941,6 +22243,7 @@ VKAPI_ATTR void VKAPI_CALL vkCmdCopyMemoryToImageIndirectNV( VkImageLayout dstImageLayout, const VkImageSubresourceLayers* pImageSubresources); #endif +#endif // VK_NV_memory_decompression is a preprocessor guard. Do not pass it to API calls. @@ -18948,47 +22251,60 @@ VKAPI_ATTR void VKAPI_CALL vkCmdCopyMemoryToImageIndirectNV( #define VK_NV_MEMORY_DECOMPRESSION_SPEC_VERSION 1 #define VK_NV_MEMORY_DECOMPRESSION_EXTENSION_NAME "VK_NV_memory_decompression" -// Flag bits for VkMemoryDecompressionMethodFlagBitsNV -typedef VkFlags64 VkMemoryDecompressionMethodFlagBitsNV; -static const VkMemoryDecompressionMethodFlagBitsNV VK_MEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_NV = 0x00000001ULL; +// Flag bits for VkMemoryDecompressionMethodFlagBitsEXT +typedef VkFlags64 VkMemoryDecompressionMethodFlagBitsEXT; +static const VkMemoryDecompressionMethodFlagBitsEXT VK_MEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_EXT = 0x00000001ULL; +static const VkMemoryDecompressionMethodFlagBitsEXT VK_MEMORY_DECOMPRESSION_METHOD_GDEFLATE_1_0_BIT_NV = 0x00000001ULL; + +typedef VkMemoryDecompressionMethodFlagBitsEXT VkMemoryDecompressionMethodFlagBitsNV; + +typedef VkFlags64 VkMemoryDecompressionMethodFlagsEXT; +typedef VkMemoryDecompressionMethodFlagsEXT VkMemoryDecompressionMethodFlagsNV; -typedef VkFlags64 VkMemoryDecompressionMethodFlagsNV; typedef struct VkDecompressMemoryRegionNV { - VkDeviceAddress srcAddress; - VkDeviceAddress dstAddress; - VkDeviceSize compressedSize; - VkDeviceSize decompressedSize; - VkMemoryDecompressionMethodFlagsNV decompressionMethod; + VkDeviceAddress srcAddress; + VkDeviceAddress dstAddress; + VkDeviceSize compressedSize; + VkDeviceSize decompressedSize; + VkMemoryDecompressionMethodFlagsEXT decompressionMethod; } VkDecompressMemoryRegionNV; -typedef struct VkPhysicalDeviceMemoryDecompressionFeaturesNV { +typedef struct VkPhysicalDeviceMemoryDecompressionFeaturesEXT { VkStructureType sType; void* pNext; VkBool32 memoryDecompression; -} VkPhysicalDeviceMemoryDecompressionFeaturesNV; +} VkPhysicalDeviceMemoryDecompressionFeaturesEXT; -typedef struct VkPhysicalDeviceMemoryDecompressionPropertiesNV { - VkStructureType sType; - void* pNext; - VkMemoryDecompressionMethodFlagsNV decompressionMethods; - uint64_t maxDecompressionIndirectCount; -} VkPhysicalDeviceMemoryDecompressionPropertiesNV; +typedef VkPhysicalDeviceMemoryDecompressionFeaturesEXT VkPhysicalDeviceMemoryDecompressionFeaturesNV; + +typedef struct VkPhysicalDeviceMemoryDecompressionPropertiesEXT { + VkStructureType sType; + void* pNext; + VkMemoryDecompressionMethodFlagsEXT decompressionMethods; + uint64_t maxDecompressionIndirectCount; +} VkPhysicalDeviceMemoryDecompressionPropertiesEXT; + +typedef VkPhysicalDeviceMemoryDecompressionPropertiesEXT VkPhysicalDeviceMemoryDecompressionPropertiesNV; typedef void (VKAPI_PTR *PFN_vkCmdDecompressMemoryNV)(VkCommandBuffer commandBuffer, uint32_t decompressRegionCount, const VkDecompressMemoryRegionNV* pDecompressMemoryRegions); typedef void (VKAPI_PTR *PFN_vkCmdDecompressMemoryIndirectCountNV)(VkCommandBuffer commandBuffer, VkDeviceAddress indirectCommandsAddress, VkDeviceAddress indirectCommandsCountAddress, uint32_t stride); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdDecompressMemoryNV( VkCommandBuffer commandBuffer, uint32_t decompressRegionCount, const VkDecompressMemoryRegionNV* pDecompressMemoryRegions); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdDecompressMemoryIndirectCountNV( VkCommandBuffer commandBuffer, VkDeviceAddress indirectCommandsAddress, VkDeviceAddress indirectCommandsCountAddress, uint32_t stride); #endif +#endif // VK_NV_device_generated_commands_compute is a preprocessor guard. Do not pass it to API calls. @@ -19027,20 +22343,26 @@ typedef void (VKAPI_PTR *PFN_vkCmdUpdatePipelineIndirectBufferNV)(VkCommandBuffe typedef VkDeviceAddress (VKAPI_PTR *PFN_vkGetPipelineIndirectDeviceAddressNV)(VkDevice device, const VkPipelineIndirectDeviceAddressInfoNV* pInfo); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetPipelineIndirectMemoryRequirementsNV( VkDevice device, const VkComputePipelineCreateInfo* pCreateInfo, VkMemoryRequirements2* pMemoryRequirements); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdUpdatePipelineIndirectBufferNV( VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkDeviceAddress VKAPI_CALL vkGetPipelineIndirectDeviceAddressNV( VkDevice device, const VkPipelineIndirectDeviceAddressInfoNV* pInfo); #endif +#endif // VK_NV_ray_tracing_linear_swept_spheres is a preprocessor guard. Do not pass it to API calls. @@ -19287,142 +22609,204 @@ typedef void (VKAPI_PTR *PFN_vkCmdSetRepresentativeFragmentTestEnableNV)(VkComma typedef void (VKAPI_PTR *PFN_vkCmdSetCoverageReductionModeNV)(VkCommandBuffer commandBuffer, VkCoverageReductionModeNV coverageReductionMode); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthClampEnableEXT( VkCommandBuffer commandBuffer, VkBool32 depthClampEnable); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetPolygonModeEXT( VkCommandBuffer commandBuffer, VkPolygonMode polygonMode); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetRasterizationSamplesEXT( VkCommandBuffer commandBuffer, VkSampleCountFlagBits rasterizationSamples); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetSampleMaskEXT( VkCommandBuffer commandBuffer, VkSampleCountFlagBits samples, const VkSampleMask* pSampleMask); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetAlphaToCoverageEnableEXT( VkCommandBuffer commandBuffer, VkBool32 alphaToCoverageEnable); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetAlphaToOneEnableEXT( VkCommandBuffer commandBuffer, VkBool32 alphaToOneEnable); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetLogicOpEnableEXT( VkCommandBuffer commandBuffer, VkBool32 logicOpEnable); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetColorBlendEnableEXT( VkCommandBuffer commandBuffer, uint32_t firstAttachment, uint32_t attachmentCount, const VkBool32* pColorBlendEnables); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetColorBlendEquationEXT( VkCommandBuffer commandBuffer, uint32_t firstAttachment, uint32_t attachmentCount, const VkColorBlendEquationEXT* pColorBlendEquations); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetColorWriteMaskEXT( VkCommandBuffer commandBuffer, uint32_t firstAttachment, uint32_t attachmentCount, const VkColorComponentFlags* pColorWriteMasks); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetTessellationDomainOriginEXT( VkCommandBuffer commandBuffer, VkTessellationDomainOrigin domainOrigin); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetRasterizationStreamEXT( VkCommandBuffer commandBuffer, uint32_t rasterizationStream); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetConservativeRasterizationModeEXT( VkCommandBuffer commandBuffer, VkConservativeRasterizationModeEXT conservativeRasterizationMode); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetExtraPrimitiveOverestimationSizeEXT( VkCommandBuffer commandBuffer, float extraPrimitiveOverestimationSize); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthClipEnableEXT( VkCommandBuffer commandBuffer, VkBool32 depthClipEnable); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetSampleLocationsEnableEXT( VkCommandBuffer commandBuffer, VkBool32 sampleLocationsEnable); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetColorBlendAdvancedEXT( VkCommandBuffer commandBuffer, uint32_t firstAttachment, uint32_t attachmentCount, const VkColorBlendAdvancedEXT* pColorBlendAdvanced); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetProvokingVertexModeEXT( VkCommandBuffer commandBuffer, VkProvokingVertexModeEXT provokingVertexMode); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetLineRasterizationModeEXT( VkCommandBuffer commandBuffer, VkLineRasterizationModeEXT lineRasterizationMode); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetLineStippleEnableEXT( VkCommandBuffer commandBuffer, VkBool32 stippledLineEnable); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthClipNegativeOneToOneEXT( VkCommandBuffer commandBuffer, VkBool32 negativeOneToOne); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetViewportWScalingEnableNV( VkCommandBuffer commandBuffer, VkBool32 viewportWScalingEnable); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetViewportSwizzleNV( VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewportSwizzleNV* pViewportSwizzles); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetCoverageToColorEnableNV( VkCommandBuffer commandBuffer, VkBool32 coverageToColorEnable); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetCoverageToColorLocationNV( VkCommandBuffer commandBuffer, uint32_t coverageToColorLocation); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetCoverageModulationModeNV( VkCommandBuffer commandBuffer, VkCoverageModulationModeNV coverageModulationMode); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetCoverageModulationTableEnableNV( VkCommandBuffer commandBuffer, VkBool32 coverageModulationTableEnable); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetCoverageModulationTableNV( VkCommandBuffer commandBuffer, uint32_t coverageModulationTableCount, const float* pCoverageModulationTable); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetShadingRateImageEnableNV( VkCommandBuffer commandBuffer, VkBool32 shadingRateImageEnable); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetRepresentativeFragmentTestEnableNV( VkCommandBuffer commandBuffer, VkBool32 representativeFragmentTestEnable); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetCoverageReductionModeNV( VkCommandBuffer commandBuffer, VkCoverageReductionModeNV coverageReductionMode); #endif +#endif // VK_EXT_subpass_merge_feedback is a preprocessor guard. Do not pass it to API calls. @@ -19495,7 +22879,8 @@ typedef enum VkDirectDriverLoadingModeLUNARG { } VkDirectDriverLoadingModeLUNARG; typedef VkFlags VkDirectDriverLoadingFlagsLUNARG; typedef PFN_vkVoidFunction (VKAPI_PTR *PFN_vkGetInstanceProcAddrLUNARG)( - VkInstance instance, const char* pName); + VkInstance instance, + const char* pName); typedef struct VkDirectDriverLoadingInfoLUNARG { VkStructureType sType; @@ -19514,6 +22899,315 @@ typedef struct VkDirectDriverLoadingListLUNARG { +// VK_ARM_tensors is a preprocessor guard. Do not pass it to API calls. +#define VK_ARM_tensors 1 +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkTensorViewARM) +#define VK_ARM_TENSORS_SPEC_VERSION 2 +#define VK_ARM_TENSORS_EXTENSION_NAME "VK_ARM_tensors" + +typedef enum VkTensorTilingARM { + VK_TENSOR_TILING_OPTIMAL_ARM = 0, + VK_TENSOR_TILING_LINEAR_ARM = 1, + VK_TENSOR_TILING_MAX_ENUM_ARM = 0x7FFFFFFF +} VkTensorTilingARM; +typedef VkFlags64 VkTensorCreateFlagsARM; + +// Flag bits for VkTensorCreateFlagBitsARM +typedef VkFlags64 VkTensorCreateFlagBitsARM; +static const VkTensorCreateFlagBitsARM VK_TENSOR_CREATE_MUTABLE_FORMAT_BIT_ARM = 0x00000001ULL; +static const VkTensorCreateFlagBitsARM VK_TENSOR_CREATE_PROTECTED_BIT_ARM = 0x00000002ULL; +static const VkTensorCreateFlagBitsARM VK_TENSOR_CREATE_DESCRIPTOR_HEAP_CAPTURE_REPLAY_BIT_ARM = 0x00000008ULL; +static const VkTensorCreateFlagBitsARM VK_TENSOR_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_ARM = 0x00000004ULL; + +typedef VkFlags64 VkTensorUsageFlagsARM; + +// Flag bits for VkTensorUsageFlagBitsARM +typedef VkFlags64 VkTensorUsageFlagBitsARM; +static const VkTensorUsageFlagBitsARM VK_TENSOR_USAGE_SHADER_BIT_ARM = 0x00000002ULL; +static const VkTensorUsageFlagBitsARM VK_TENSOR_USAGE_TRANSFER_SRC_BIT_ARM = 0x00000004ULL; +static const VkTensorUsageFlagBitsARM VK_TENSOR_USAGE_TRANSFER_DST_BIT_ARM = 0x00000008ULL; +static const VkTensorUsageFlagBitsARM VK_TENSOR_USAGE_IMAGE_ALIASING_BIT_ARM = 0x00000010ULL; +static const VkTensorUsageFlagBitsARM VK_TENSOR_USAGE_DATA_GRAPH_BIT_ARM = 0x00000020ULL; + +typedef struct VkTensorDescriptionARM { + VkStructureType sType; + const void* pNext; + VkTensorTilingARM tiling; + VkFormat format; + uint32_t dimensionCount; + const int64_t* pDimensions; + const int64_t* pStrides; + VkTensorUsageFlagsARM usage; +} VkTensorDescriptionARM; + +typedef struct VkTensorCreateInfoARM { + VkStructureType sType; + const void* pNext; + VkTensorCreateFlagsARM flags; + const VkTensorDescriptionARM* pDescription; + VkSharingMode sharingMode; + uint32_t queueFamilyIndexCount; + const uint32_t* pQueueFamilyIndices; +} VkTensorCreateInfoARM; + +typedef struct VkTensorMemoryRequirementsInfoARM { + VkStructureType sType; + const void* pNext; + VkTensorARM tensor; +} VkTensorMemoryRequirementsInfoARM; + +typedef struct VkBindTensorMemoryInfoARM { + VkStructureType sType; + const void* pNext; + VkTensorARM tensor; + VkDeviceMemory memory; + VkDeviceSize memoryOffset; +} VkBindTensorMemoryInfoARM; + +typedef struct VkWriteDescriptorSetTensorARM { + VkStructureType sType; + const void* pNext; + uint32_t tensorViewCount; + const VkTensorViewARM* pTensorViews; +} VkWriteDescriptorSetTensorARM; + +typedef struct VkTensorFormatPropertiesARM { + VkStructureType sType; + void* pNext; + VkFormatFeatureFlags2 optimalTilingTensorFeatures; + VkFormatFeatureFlags2 linearTilingTensorFeatures; +} VkTensorFormatPropertiesARM; + +typedef struct VkPhysicalDeviceTensorPropertiesARM { + VkStructureType sType; + void* pNext; + uint32_t maxTensorDimensionCount; + uint64_t maxTensorElements; + uint64_t maxPerDimensionTensorElements; + int64_t maxTensorStride; + uint64_t maxTensorSize; + uint32_t maxTensorShaderAccessArrayLength; + uint32_t maxTensorShaderAccessSize; + uint32_t maxDescriptorSetStorageTensors; + uint32_t maxPerStageDescriptorSetStorageTensors; + uint32_t maxDescriptorSetUpdateAfterBindStorageTensors; + uint32_t maxPerStageDescriptorUpdateAfterBindStorageTensors; + VkBool32 shaderStorageTensorArrayNonUniformIndexingNative; + VkShaderStageFlags shaderTensorSupportedStages; +} VkPhysicalDeviceTensorPropertiesARM; + +typedef struct VkTensorMemoryBarrierARM { + VkStructureType sType; + const void* pNext; + VkPipelineStageFlags2 srcStageMask; + VkAccessFlags2 srcAccessMask; + VkPipelineStageFlags2 dstStageMask; + VkAccessFlags2 dstAccessMask; + uint32_t srcQueueFamilyIndex; + uint32_t dstQueueFamilyIndex; + VkTensorARM tensor; +} VkTensorMemoryBarrierARM; + +typedef struct VkTensorDependencyInfoARM { + VkStructureType sType; + const void* pNext; + uint32_t tensorMemoryBarrierCount; + const VkTensorMemoryBarrierARM* pTensorMemoryBarriers; +} VkTensorDependencyInfoARM; + +typedef struct VkPhysicalDeviceTensorFeaturesARM { + VkStructureType sType; + void* pNext; + VkBool32 tensorNonPacked; + VkBool32 shaderTensorAccess; + VkBool32 shaderStorageTensorArrayDynamicIndexing; + VkBool32 shaderStorageTensorArrayNonUniformIndexing; + VkBool32 descriptorBindingStorageTensorUpdateAfterBind; + VkBool32 tensors; +} VkPhysicalDeviceTensorFeaturesARM; + +typedef struct VkDeviceTensorMemoryRequirementsARM { + VkStructureType sType; + const void* pNext; + const VkTensorCreateInfoARM* pCreateInfo; +} VkDeviceTensorMemoryRequirementsARM; + +typedef struct VkTensorCopyARM { + VkStructureType sType; + const void* pNext; + uint32_t dimensionCount; + const uint64_t* pSrcOffset; + const uint64_t* pDstOffset; + const uint64_t* pExtent; +} VkTensorCopyARM; + +typedef struct VkCopyTensorInfoARM { + VkStructureType sType; + const void* pNext; + VkTensorARM srcTensor; + VkTensorARM dstTensor; + uint32_t regionCount; + const VkTensorCopyARM* pRegions; +} VkCopyTensorInfoARM; + +typedef struct VkMemoryDedicatedAllocateInfoTensorARM { + VkStructureType sType; + const void* pNext; + VkTensorARM tensor; +} VkMemoryDedicatedAllocateInfoTensorARM; + +typedef struct VkPhysicalDeviceExternalTensorInfoARM { + VkStructureType sType; + const void* pNext; + VkTensorCreateFlagsARM flags; + const VkTensorDescriptionARM* pDescription; + VkExternalMemoryHandleTypeFlagBits handleType; +} VkPhysicalDeviceExternalTensorInfoARM; + +typedef struct VkExternalTensorPropertiesARM { + VkStructureType sType; + const void* pNext; + VkExternalMemoryProperties externalMemoryProperties; +} VkExternalTensorPropertiesARM; + +typedef struct VkExternalMemoryTensorCreateInfoARM { + VkStructureType sType; + const void* pNext; + VkExternalMemoryHandleTypeFlags handleTypes; +} VkExternalMemoryTensorCreateInfoARM; + +typedef struct VkPhysicalDeviceDescriptorBufferTensorFeaturesARM { + VkStructureType sType; + void* pNext; + VkBool32 descriptorBufferTensorDescriptors; +} VkPhysicalDeviceDescriptorBufferTensorFeaturesARM; + +typedef struct VkPhysicalDeviceDescriptorBufferTensorPropertiesARM { + VkStructureType sType; + void* pNext; + size_t tensorCaptureReplayDescriptorDataSize; + size_t tensorViewCaptureReplayDescriptorDataSize; + size_t tensorDescriptorSize; +} VkPhysicalDeviceDescriptorBufferTensorPropertiesARM; + +typedef struct VkDescriptorGetTensorInfoARM { + VkStructureType sType; + const void* pNext; + VkTensorViewARM tensorView; +} VkDescriptorGetTensorInfoARM; + +typedef struct VkTensorCaptureDescriptorDataInfoARM { + VkStructureType sType; + const void* pNext; + VkTensorARM tensor; +} VkTensorCaptureDescriptorDataInfoARM; + +typedef struct VkTensorViewCaptureDescriptorDataInfoARM { + VkStructureType sType; + const void* pNext; + VkTensorViewARM tensorView; +} VkTensorViewCaptureDescriptorDataInfoARM; + +typedef struct VkFrameBoundaryTensorsARM { + VkStructureType sType; + const void* pNext; + uint32_t tensorCount; + const VkTensorARM* pTensors; +} VkFrameBoundaryTensorsARM; + +typedef VkResult (VKAPI_PTR *PFN_vkCreateTensorARM)(VkDevice device, const VkTensorCreateInfoARM* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkTensorARM* pTensor); +typedef void (VKAPI_PTR *PFN_vkDestroyTensorARM)(VkDevice device, VkTensorARM tensor, const VkAllocationCallbacks* pAllocator); +typedef VkResult (VKAPI_PTR *PFN_vkCreateTensorViewARM)(VkDevice device, const VkTensorViewCreateInfoARM* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkTensorViewARM* pView); +typedef void (VKAPI_PTR *PFN_vkDestroyTensorViewARM)(VkDevice device, VkTensorViewARM tensorView, const VkAllocationCallbacks* pAllocator); +typedef void (VKAPI_PTR *PFN_vkGetTensorMemoryRequirementsARM)(VkDevice device, const VkTensorMemoryRequirementsInfoARM* pInfo, VkMemoryRequirements2* pMemoryRequirements); +typedef VkResult (VKAPI_PTR *PFN_vkBindTensorMemoryARM)(VkDevice device, uint32_t bindInfoCount, const VkBindTensorMemoryInfoARM* pBindInfos); +typedef void (VKAPI_PTR *PFN_vkGetDeviceTensorMemoryRequirementsARM)(VkDevice device, const VkDeviceTensorMemoryRequirementsARM* pInfo, VkMemoryRequirements2* pMemoryRequirements); +typedef void (VKAPI_PTR *PFN_vkCmdCopyTensorARM)(VkCommandBuffer commandBuffer, const VkCopyTensorInfoARM* pCopyTensorInfo); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceExternalTensorPropertiesARM)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceExternalTensorInfoARM* pExternalTensorInfo, VkExternalTensorPropertiesARM* pExternalTensorProperties); +typedef VkResult (VKAPI_PTR *PFN_vkGetTensorOpaqueCaptureDescriptorDataARM)(VkDevice device, const VkTensorCaptureDescriptorDataInfoARM* pInfo, void* pData); +typedef VkResult (VKAPI_PTR *PFN_vkGetTensorViewOpaqueCaptureDescriptorDataARM)(VkDevice device, const VkTensorViewCaptureDescriptorDataInfoARM* pInfo, void* pData); + +#ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateTensorARM( + VkDevice device, + const VkTensorCreateInfoARM* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkTensorARM* pTensor); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkDestroyTensorARM( + VkDevice device, + VkTensorARM tensor, + const VkAllocationCallbacks* pAllocator); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateTensorViewARM( + VkDevice device, + const VkTensorViewCreateInfoARM* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkTensorViewARM* pView); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkDestroyTensorViewARM( + VkDevice device, + VkTensorViewARM tensorView, + const VkAllocationCallbacks* pAllocator); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkGetTensorMemoryRequirementsARM( + VkDevice device, + const VkTensorMemoryRequirementsInfoARM* pInfo, + VkMemoryRequirements2* pMemoryRequirements); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkBindTensorMemoryARM( + VkDevice device, + uint32_t bindInfoCount, + const VkBindTensorMemoryInfoARM* pBindInfos); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkGetDeviceTensorMemoryRequirementsARM( + VkDevice device, + const VkDeviceTensorMemoryRequirementsARM* pInfo, + VkMemoryRequirements2* pMemoryRequirements); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdCopyTensorARM( + VkCommandBuffer commandBuffer, + const VkCopyTensorInfoARM* pCopyTensorInfo); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceExternalTensorPropertiesARM( + VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceExternalTensorInfoARM* pExternalTensorInfo, + VkExternalTensorPropertiesARM* pExternalTensorProperties); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetTensorOpaqueCaptureDescriptorDataARM( + VkDevice device, + const VkTensorCaptureDescriptorDataInfoARM* pInfo, + void* pData); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetTensorViewOpaqueCaptureDescriptorDataARM( + VkDevice device, + const VkTensorViewCaptureDescriptorDataInfoARM* pInfo, + void* pData); +#endif +#endif + + // VK_EXT_shader_module_identifier is a preprocessor guard. Do not pass it to API calls. #define VK_EXT_shader_module_identifier 1 #define VK_MAX_SHADER_MODULE_IDENTIFIER_SIZE_EXT 32U @@ -19549,16 +23243,20 @@ typedef void (VKAPI_PTR *PFN_vkGetShaderModuleIdentifierEXT)(VkDevice device, Vk typedef void (VKAPI_PTR *PFN_vkGetShaderModuleCreateInfoIdentifierEXT)(VkDevice device, const VkShaderModuleCreateInfo* pCreateInfo, VkShaderModuleIdentifierEXT* pIdentifier); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetShaderModuleIdentifierEXT( VkDevice device, VkShaderModule shaderModule, VkShaderModuleIdentifierEXT* pIdentifier); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetShaderModuleCreateInfoIdentifierEXT( VkDevice device, const VkShaderModuleCreateInfo* pCreateInfo, VkShaderModuleIdentifierEXT* pIdentifier); #endif +#endif // VK_EXT_rasterization_order_attachment_access is a preprocessor guard. Do not pass it to API calls. @@ -19660,7 +23358,7 @@ typedef struct VkOpticalFlowImageFormatInfoNV { typedef struct VkOpticalFlowImageFormatPropertiesNV { VkStructureType sType; - const void* pNext; + void* pNext; VkFormat format; } VkOpticalFlowImageFormatPropertiesNV; @@ -19701,35 +23399,45 @@ typedef VkResult (VKAPI_PTR *PFN_vkBindOpticalFlowSessionImageNV)(VkDevice devic typedef void (VKAPI_PTR *PFN_vkCmdOpticalFlowExecuteNV)(VkCommandBuffer commandBuffer, VkOpticalFlowSessionNV session, const VkOpticalFlowExecuteInfoNV* pExecuteInfo); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceOpticalFlowImageFormatsNV( VkPhysicalDevice physicalDevice, const VkOpticalFlowImageFormatInfoNV* pOpticalFlowImageFormatInfo, uint32_t* pFormatCount, VkOpticalFlowImageFormatPropertiesNV* pImageFormatProperties); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateOpticalFlowSessionNV( VkDevice device, const VkOpticalFlowSessionCreateInfoNV* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkOpticalFlowSessionNV* pSession); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkDestroyOpticalFlowSessionNV( VkDevice device, VkOpticalFlowSessionNV session, const VkAllocationCallbacks* pAllocator); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkBindOpticalFlowSessionImageNV( VkDevice device, VkOpticalFlowSessionNV session, VkOpticalFlowSessionBindingPointNV bindingPoint, VkImageView view, VkImageLayout layout); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdOpticalFlowExecuteNV( VkCommandBuffer commandBuffer, VkOpticalFlowSessionNV session, const VkOpticalFlowExecuteInfoNV* pExecuteInfo); #endif +#endif // VK_EXT_legacy_dithering is a preprocessor guard. Do not pass it to API calls. @@ -19793,10 +23501,12 @@ typedef struct VkAntiLagDataAMD { typedef void (VKAPI_PTR *PFN_vkAntiLagUpdateAMD)(VkDevice device, const VkAntiLagDataAMD* pData); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkAntiLagUpdateAMD( VkDevice device, const VkAntiLagDataAMD* pData); #endif +#endif // VK_EXT_shader_object is a preprocessor guard. Do not pass it to API calls. @@ -19819,6 +23529,8 @@ typedef enum VkDepthClampModeEXT { typedef enum VkShaderCreateFlagBitsEXT { VK_SHADER_CREATE_LINK_STAGE_BIT_EXT = 0x00000001, + VK_SHADER_CREATE_DESCRIPTOR_HEAP_BIT_EXT = 0x00000400, + VK_SHADER_CREATE_INSTRUMENT_SHADER_BIT_ARM = 0x00000800, VK_SHADER_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT = 0x00000002, VK_SHADER_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT = 0x00000004, VK_SHADER_CREATE_NO_TASK_SHADER_BIT_EXT = 0x00000008, @@ -19826,6 +23538,9 @@ typedef enum VkShaderCreateFlagBitsEXT { VK_SHADER_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_EXT = 0x00000020, VK_SHADER_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT = 0x00000040, VK_SHADER_CREATE_INDIRECT_BINDABLE_BIT_EXT = 0x00000080, + VK_SHADER_CREATE_OPACITY_MICROMAP_DISALLOW_MIXED_SPECIAL_INDEX_BIT_EXT = 0x00001000, + VK_SHADER_CREATE_64_BIT_INDEXING_BIT_EXT = 0x00008000, + VK_SHADER_CREATE_INDEPENDENT_SETS_BIT_KHR = 0x00040000, VK_SHADER_CREATE_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF } VkShaderCreateFlagBitsEXT; typedef VkFlags VkShaderCreateFlagsEXT; @@ -19873,35 +23588,45 @@ typedef void (VKAPI_PTR *PFN_vkCmdBindShadersEXT)(VkCommandBuffer commandBuffer, typedef void (VKAPI_PTR *PFN_vkCmdSetDepthClampRangeEXT)(VkCommandBuffer commandBuffer, VkDepthClampModeEXT depthClampMode, const VkDepthClampRangeEXT* pDepthClampRange); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateShadersEXT( VkDevice device, uint32_t createInfoCount, const VkShaderCreateInfoEXT* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkShaderEXT* pShaders); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkDestroyShaderEXT( VkDevice device, VkShaderEXT shader, const VkAllocationCallbacks* pAllocator); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetShaderBinaryDataEXT( VkDevice device, VkShaderEXT shader, size_t* pDataSize, void* pData); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdBindShadersEXT( VkCommandBuffer commandBuffer, uint32_t stageCount, const VkShaderStageFlagBits* pStages, const VkShaderEXT* pShaders); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthClampRangeEXT( VkCommandBuffer commandBuffer, VkDepthClampModeEXT depthClampMode, const VkDepthClampRangeEXT* pDepthClampRange); #endif +#endif // VK_QCOM_tile_properties is a preprocessor guard. Do not pass it to API calls. @@ -19926,17 +23651,21 @@ typedef VkResult (VKAPI_PTR *PFN_vkGetFramebufferTilePropertiesQCOM)(VkDevice de typedef VkResult (VKAPI_PTR *PFN_vkGetDynamicRenderingTilePropertiesQCOM)(VkDevice device, const VkRenderingInfo* pRenderingInfo, VkTilePropertiesQCOM* pProperties); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetFramebufferTilePropertiesQCOM( VkDevice device, VkFramebuffer framebuffer, uint32_t* pPropertiesCount, VkTilePropertiesQCOM* pProperties); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetDynamicRenderingTilePropertiesQCOM( VkDevice device, const VkRenderingInfo* pRenderingInfo, VkTilePropertiesQCOM* pProperties); #endif +#endif // VK_SEC_amigo_profiling is a preprocessor guard. Do not pass it to API calls. @@ -19975,15 +23704,19 @@ typedef struct VkPhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM { #define VK_NV_RAY_TRACING_INVOCATION_REORDER_SPEC_VERSION 1 #define VK_NV_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME "VK_NV_ray_tracing_invocation_reorder" -typedef enum VkRayTracingInvocationReorderModeNV { - VK_RAY_TRACING_INVOCATION_REORDER_MODE_NONE_NV = 0, - VK_RAY_TRACING_INVOCATION_REORDER_MODE_REORDER_NV = 1, - VK_RAY_TRACING_INVOCATION_REORDER_MODE_MAX_ENUM_NV = 0x7FFFFFFF -} VkRayTracingInvocationReorderModeNV; +typedef enum VkRayTracingInvocationReorderModeEXT { + VK_RAY_TRACING_INVOCATION_REORDER_MODE_NONE_EXT = 0, + VK_RAY_TRACING_INVOCATION_REORDER_MODE_REORDER_EXT = 1, + VK_RAY_TRACING_INVOCATION_REORDER_MODE_NONE_NV = VK_RAY_TRACING_INVOCATION_REORDER_MODE_NONE_EXT, + VK_RAY_TRACING_INVOCATION_REORDER_MODE_REORDER_NV = VK_RAY_TRACING_INVOCATION_REORDER_MODE_REORDER_EXT, + VK_RAY_TRACING_INVOCATION_REORDER_MODE_MAX_ENUM_EXT = 0x7FFFFFFF +} VkRayTracingInvocationReorderModeEXT; +typedef VkRayTracingInvocationReorderModeEXT VkRayTracingInvocationReorderModeNV; + typedef struct VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV { - VkStructureType sType; - void* pNext; - VkRayTracingInvocationReorderModeNV rayTracingInvocationReorderReorderingHint; + VkStructureType sType; + void* pNext; + VkRayTracingInvocationReorderModeEXT rayTracingInvocationReorderReorderingHint; } VkPhysicalDeviceRayTracingInvocationReorderPropertiesNV; typedef struct VkPhysicalDeviceRayTracingInvocationReorderFeaturesNV { @@ -20055,20 +23788,26 @@ typedef VkResult (VKAPI_PTR *PFN_vkConvertCooperativeVectorMatrixNV)(VkDevice de typedef void (VKAPI_PTR *PFN_vkCmdConvertCooperativeVectorMatrixNV)(VkCommandBuffer commandBuffer, uint32_t infoCount, const VkConvertCooperativeVectorMatrixInfoNV* pInfos); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceCooperativeVectorPropertiesNV( VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkCooperativeVectorPropertiesNV* pProperties); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkConvertCooperativeVectorMatrixNV( VkDevice device, const VkConvertCooperativeVectorMatrixInfoNV* pInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdConvertCooperativeVectorMatrixNV( VkCommandBuffer commandBuffer, uint32_t infoCount, const VkConvertCooperativeVectorMatrixInfoNV* pInfos); #endif +#endif // VK_NV_extended_sparse_address_space is a preprocessor guard. Do not pass it to API calls. @@ -20242,7 +23981,7 @@ typedef struct VkSetLatencyMarkerInfoNV { typedef struct VkLatencyTimingsFrameReportNV { VkStructureType sType; - const void* pNext; + void* pNext; uint64_t presentID; uint64_t inputSampleTimeUs; uint64_t simStartTimeUs; @@ -20298,30 +24037,406 @@ typedef void (VKAPI_PTR *PFN_vkGetLatencyTimingsNV)(VkDevice device, VkSwapchain typedef void (VKAPI_PTR *PFN_vkQueueNotifyOutOfBandNV)(VkQueue queue, const VkOutOfBandQueueTypeInfoNV* pQueueTypeInfo); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkSetLatencySleepModeNV( VkDevice device, VkSwapchainKHR swapchain, const VkLatencySleepModeInfoNV* pSleepModeInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkLatencySleepNV( VkDevice device, VkSwapchainKHR swapchain, const VkLatencySleepInfoNV* pSleepInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkSetLatencyMarkerNV( VkDevice device, VkSwapchainKHR swapchain, const VkSetLatencyMarkerInfoNV* pLatencyMarkerInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetLatencyTimingsNV( VkDevice device, VkSwapchainKHR swapchain, VkGetLatencyMarkerInfoNV* pLatencyMarkerInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkQueueNotifyOutOfBandNV( VkQueue queue, const VkOutOfBandQueueTypeInfoNV* pQueueTypeInfo); #endif +#endif + + +// VK_ARM_data_graph is a preprocessor guard. Do not pass it to API calls. +#define VK_ARM_data_graph 1 +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDataGraphPipelineSessionARM) +#define VK_MAX_PHYSICAL_DEVICE_DATA_GRAPH_OPERATION_SET_NAME_SIZE_ARM 128U +#define VK_ARM_DATA_GRAPH_SPEC_VERSION 1 +#define VK_ARM_DATA_GRAPH_EXTENSION_NAME "VK_ARM_data_graph" + +typedef enum VkDataGraphPipelineSessionBindPointARM { + VK_DATA_GRAPH_PIPELINE_SESSION_BIND_POINT_TRANSIENT_ARM = 0, + VK_DATA_GRAPH_PIPELINE_SESSION_BIND_POINT_OPTICAL_FLOW_CACHE_ARM = 1000631001, + VK_DATA_GRAPH_PIPELINE_SESSION_BIND_POINT_NEURAL_ACCELERATOR_STATISTICS_ARM = 1000676000, + VK_DATA_GRAPH_PIPELINE_SESSION_BIND_POINT_MAX_ENUM_ARM = 0x7FFFFFFF +} VkDataGraphPipelineSessionBindPointARM; + +typedef enum VkDataGraphPipelineSessionBindPointTypeARM { + VK_DATA_GRAPH_PIPELINE_SESSION_BIND_POINT_TYPE_MEMORY_ARM = 0, + VK_DATA_GRAPH_PIPELINE_SESSION_BIND_POINT_TYPE_MAX_ENUM_ARM = 0x7FFFFFFF +} VkDataGraphPipelineSessionBindPointTypeARM; + +typedef enum VkDataGraphPipelinePropertyARM { + VK_DATA_GRAPH_PIPELINE_PROPERTY_CREATION_LOG_ARM = 0, + VK_DATA_GRAPH_PIPELINE_PROPERTY_IDENTIFIER_ARM = 1, + VK_DATA_GRAPH_PIPELINE_PROPERTY_NEURAL_ACCELERATOR_DEBUG_DATABASE_ARM = 1000676000, + VK_DATA_GRAPH_PIPELINE_PROPERTY_NEURAL_ACCELERATOR_STATISTICS_INFO_ARM = 1000676001, + VK_DATA_GRAPH_PIPELINE_PROPERTY_MAX_ENUM_ARM = 0x7FFFFFFF +} VkDataGraphPipelinePropertyARM; + +typedef enum VkPhysicalDeviceDataGraphProcessingEngineTypeARM { + VK_PHYSICAL_DEVICE_DATA_GRAPH_PROCESSING_ENGINE_TYPE_DEFAULT_ARM = 0, + VK_PHYSICAL_DEVICE_DATA_GRAPH_PROCESSING_ENGINE_TYPE_NEURAL_QCOM = 1000629000, + VK_PHYSICAL_DEVICE_DATA_GRAPH_PROCESSING_ENGINE_TYPE_COMPUTE_QCOM = 1000629001, + VK_PHYSICAL_DEVICE_DATA_GRAPH_PROCESSING_ENGINE_TYPE_MAX_ENUM_ARM = 0x7FFFFFFF +} VkPhysicalDeviceDataGraphProcessingEngineTypeARM; + +typedef enum VkPhysicalDeviceDataGraphOperationTypeARM { + VK_PHYSICAL_DEVICE_DATA_GRAPH_OPERATION_TYPE_SPIRV_EXTENDED_INSTRUCTION_SET_ARM = 0, + VK_PHYSICAL_DEVICE_DATA_GRAPH_OPERATION_TYPE_NEURAL_MODEL_QCOM = 1000629000, + VK_PHYSICAL_DEVICE_DATA_GRAPH_OPERATION_TYPE_BUILTIN_MODEL_QCOM = 1000629001, + VK_PHYSICAL_DEVICE_DATA_GRAPH_OPERATION_TYPE_OPTICAL_FLOW_ARM = 1000631000, + VK_PHYSICAL_DEVICE_DATA_GRAPH_OPERATION_TYPE_MAX_ENUM_ARM = 0x7FFFFFFF +} VkPhysicalDeviceDataGraphOperationTypeARM; +typedef VkFlags64 VkDataGraphPipelineSessionCreateFlagsARM; + +// Flag bits for VkDataGraphPipelineSessionCreateFlagBitsARM +typedef VkFlags64 VkDataGraphPipelineSessionCreateFlagBitsARM; +static const VkDataGraphPipelineSessionCreateFlagBitsARM VK_DATA_GRAPH_PIPELINE_SESSION_CREATE_PROTECTED_BIT_ARM = 0x00000001ULL; +static const VkDataGraphPipelineSessionCreateFlagBitsARM VK_DATA_GRAPH_PIPELINE_SESSION_CREATE_OPTICAL_FLOW_CACHE_BIT_ARM = 0x00000002ULL; + +typedef VkFlags64 VkDataGraphPipelineDispatchFlagsARM; + +// Flag bits for VkDataGraphPipelineDispatchFlagBitsARM +typedef VkFlags64 VkDataGraphPipelineDispatchFlagBitsARM; + +typedef struct VkPhysicalDeviceDataGraphFeaturesARM { + VkStructureType sType; + void* pNext; + VkBool32 dataGraph; + VkBool32 dataGraphUpdateAfterBind; + VkBool32 dataGraphSpecializationConstants; + VkBool32 dataGraphDescriptorBuffer; + VkBool32 dataGraphShaderModule; +} VkPhysicalDeviceDataGraphFeaturesARM; + +typedef struct VkDataGraphPipelineConstantARM { + VkStructureType sType; + const void* pNext; + uint32_t id; + const void* pConstantData; +} VkDataGraphPipelineConstantARM; + +typedef struct VkDataGraphPipelineResourceInfoARM { + VkStructureType sType; + const void* pNext; + uint32_t descriptorSet; + uint32_t binding; + uint32_t arrayElement; +} VkDataGraphPipelineResourceInfoARM; + +typedef struct VkDataGraphPipelineCompilerControlCreateInfoARM { + VkStructureType sType; + const void* pNext; + const char* pVendorOptions; +} VkDataGraphPipelineCompilerControlCreateInfoARM; + +typedef struct VkDataGraphPipelineCreateInfoARM { + VkStructureType sType; + const void* pNext; + VkPipelineCreateFlags2 flags; + VkPipelineLayout layout; + uint32_t resourceInfoCount; + const VkDataGraphPipelineResourceInfoARM* pResourceInfos; +} VkDataGraphPipelineCreateInfoARM; + +typedef struct VkDataGraphPipelineShaderModuleCreateInfoARM { + VkStructureType sType; + const void* pNext; + VkShaderModule module; + const char* pName; + const VkSpecializationInfo* pSpecializationInfo; + uint32_t constantCount; + const VkDataGraphPipelineConstantARM* pConstants; +} VkDataGraphPipelineShaderModuleCreateInfoARM; + +typedef struct VkDataGraphPipelineSessionCreateInfoARM { + VkStructureType sType; + const void* pNext; + VkDataGraphPipelineSessionCreateFlagsARM flags; + VkPipeline dataGraphPipeline; +} VkDataGraphPipelineSessionCreateInfoARM; + +typedef struct VkDataGraphPipelineSessionBindPointRequirementsInfoARM { + VkStructureType sType; + const void* pNext; + VkDataGraphPipelineSessionARM session; +} VkDataGraphPipelineSessionBindPointRequirementsInfoARM; + +typedef struct VkDataGraphPipelineSessionBindPointRequirementARM { + VkStructureType sType; + void* pNext; + VkDataGraphPipelineSessionBindPointARM bindPoint; + VkDataGraphPipelineSessionBindPointTypeARM bindPointType; + uint32_t numObjects; +} VkDataGraphPipelineSessionBindPointRequirementARM; + +typedef struct VkDataGraphPipelineSessionMemoryRequirementsInfoARM { + VkStructureType sType; + const void* pNext; + VkDataGraphPipelineSessionARM session; + VkDataGraphPipelineSessionBindPointARM bindPoint; + uint32_t objectIndex; +} VkDataGraphPipelineSessionMemoryRequirementsInfoARM; + +typedef struct VkBindDataGraphPipelineSessionMemoryInfoARM { + VkStructureType sType; + const void* pNext; + VkDataGraphPipelineSessionARM session; + VkDataGraphPipelineSessionBindPointARM bindPoint; + uint32_t objectIndex; + VkDeviceMemory memory; + VkDeviceSize memoryOffset; +} VkBindDataGraphPipelineSessionMemoryInfoARM; + +typedef struct VkDataGraphPipelineInfoARM { + VkStructureType sType; + const void* pNext; + VkPipeline dataGraphPipeline; +} VkDataGraphPipelineInfoARM; + +typedef struct VkDataGraphPipelinePropertyQueryResultARM { + VkStructureType sType; + void* pNext; + VkDataGraphPipelinePropertyARM property; + VkBool32 isText; + size_t dataSize; + void* pData; +} VkDataGraphPipelinePropertyQueryResultARM; + +typedef struct VkDataGraphPipelineIdentifierCreateInfoARM { + VkStructureType sType; + const void* pNext; + uint32_t identifierSize; + const uint8_t* pIdentifier; +} VkDataGraphPipelineIdentifierCreateInfoARM; + +typedef struct VkDataGraphPipelineDispatchInfoARM { + VkStructureType sType; + void* pNext; + VkDataGraphPipelineDispatchFlagsARM flags; +} VkDataGraphPipelineDispatchInfoARM; + +typedef struct VkPhysicalDeviceDataGraphProcessingEngineARM { + VkPhysicalDeviceDataGraphProcessingEngineTypeARM type; + VkBool32 isForeign; +} VkPhysicalDeviceDataGraphProcessingEngineARM; + +typedef struct VkPhysicalDeviceDataGraphOperationSupportARM { + VkPhysicalDeviceDataGraphOperationTypeARM operationType; + char name[VK_MAX_PHYSICAL_DEVICE_DATA_GRAPH_OPERATION_SET_NAME_SIZE_ARM]; + uint32_t version; +} VkPhysicalDeviceDataGraphOperationSupportARM; + +typedef struct VkQueueFamilyDataGraphPropertiesARM { + VkStructureType sType; + void* pNext; + VkPhysicalDeviceDataGraphProcessingEngineARM engine; + VkPhysicalDeviceDataGraphOperationSupportARM operation; +} VkQueueFamilyDataGraphPropertiesARM; + +typedef struct VkDataGraphProcessingEngineCreateInfoARM { + VkStructureType sType; + const void* pNext; + uint32_t processingEngineCount; + VkPhysicalDeviceDataGraphProcessingEngineARM* pProcessingEngines; +} VkDataGraphProcessingEngineCreateInfoARM; + +typedef struct VkPhysicalDeviceQueueFamilyDataGraphProcessingEngineInfoARM { + VkStructureType sType; + const void* pNext; + uint32_t queueFamilyIndex; + VkPhysicalDeviceDataGraphProcessingEngineTypeARM engineType; +} VkPhysicalDeviceQueueFamilyDataGraphProcessingEngineInfoARM; + +typedef struct VkQueueFamilyDataGraphProcessingEnginePropertiesARM { + VkStructureType sType; + void* pNext; + VkExternalSemaphoreHandleTypeFlags foreignSemaphoreHandleTypes; + VkExternalMemoryHandleTypeFlags foreignMemoryHandleTypes; +} VkQueueFamilyDataGraphProcessingEnginePropertiesARM; + +typedef struct VkDataGraphPipelineConstantTensorSemiStructuredSparsityInfoARM { + VkStructureType sType; + const void* pNext; + uint32_t dimension; + uint32_t zeroCount; + uint32_t groupSize; +} VkDataGraphPipelineConstantTensorSemiStructuredSparsityInfoARM; + +typedef VkResult (VKAPI_PTR *PFN_vkCreateDataGraphPipelinesARM)(VkDevice device, VkDeferredOperationKHR deferredOperation, VkPipelineCache pipelineCache, uint32_t createInfoCount, const VkDataGraphPipelineCreateInfoARM* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines); +typedef VkResult (VKAPI_PTR *PFN_vkCreateDataGraphPipelineSessionARM)(VkDevice device, const VkDataGraphPipelineSessionCreateInfoARM* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDataGraphPipelineSessionARM* pSession); +typedef VkResult (VKAPI_PTR *PFN_vkGetDataGraphPipelineSessionBindPointRequirementsARM)(VkDevice device, const VkDataGraphPipelineSessionBindPointRequirementsInfoARM* pInfo, uint32_t* pBindPointRequirementCount, VkDataGraphPipelineSessionBindPointRequirementARM* pBindPointRequirements); +typedef void (VKAPI_PTR *PFN_vkGetDataGraphPipelineSessionMemoryRequirementsARM)(VkDevice device, const VkDataGraphPipelineSessionMemoryRequirementsInfoARM* pInfo, VkMemoryRequirements2* pMemoryRequirements); +typedef VkResult (VKAPI_PTR *PFN_vkBindDataGraphPipelineSessionMemoryARM)(VkDevice device, uint32_t bindInfoCount, const VkBindDataGraphPipelineSessionMemoryInfoARM* pBindInfos); +typedef void (VKAPI_PTR *PFN_vkDestroyDataGraphPipelineSessionARM)(VkDevice device, VkDataGraphPipelineSessionARM session, const VkAllocationCallbacks* pAllocator); +typedef void (VKAPI_PTR *PFN_vkCmdDispatchDataGraphARM)(VkCommandBuffer commandBuffer, VkDataGraphPipelineSessionARM session, const VkDataGraphPipelineDispatchInfoARM* pInfo); +typedef VkResult (VKAPI_PTR *PFN_vkGetDataGraphPipelineAvailablePropertiesARM)(VkDevice device, const VkDataGraphPipelineInfoARM* pPipelineInfo, uint32_t* pPropertiesCount, VkDataGraphPipelinePropertyARM* pProperties); +typedef VkResult (VKAPI_PTR *PFN_vkGetDataGraphPipelinePropertiesARM)(VkDevice device, const VkDataGraphPipelineInfoARM* pPipelineInfo, uint32_t propertiesCount, VkDataGraphPipelinePropertyQueryResultARM* pProperties); +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceQueueFamilyDataGraphPropertiesARM)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, uint32_t* pQueueFamilyDataGraphPropertyCount, VkQueueFamilyDataGraphPropertiesARM* pQueueFamilyDataGraphProperties); +typedef void (VKAPI_PTR *PFN_vkGetPhysicalDeviceQueueFamilyDataGraphProcessingEnginePropertiesARM)(VkPhysicalDevice physicalDevice, const VkPhysicalDeviceQueueFamilyDataGraphProcessingEngineInfoARM* pQueueFamilyDataGraphProcessingEngineInfo, VkQueueFamilyDataGraphProcessingEnginePropertiesARM* pQueueFamilyDataGraphProcessingEngineProperties); + +#ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateDataGraphPipelinesARM( + VkDevice device, + VkDeferredOperationKHR deferredOperation, + VkPipelineCache pipelineCache, + uint32_t createInfoCount, + const VkDataGraphPipelineCreateInfoARM* pCreateInfos, + const VkAllocationCallbacks* pAllocator, + VkPipeline* pPipelines); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateDataGraphPipelineSessionARM( + VkDevice device, + const VkDataGraphPipelineSessionCreateInfoARM* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkDataGraphPipelineSessionARM* pSession); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetDataGraphPipelineSessionBindPointRequirementsARM( + VkDevice device, + const VkDataGraphPipelineSessionBindPointRequirementsInfoARM* pInfo, + uint32_t* pBindPointRequirementCount, + VkDataGraphPipelineSessionBindPointRequirementARM* pBindPointRequirements); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkGetDataGraphPipelineSessionMemoryRequirementsARM( + VkDevice device, + const VkDataGraphPipelineSessionMemoryRequirementsInfoARM* pInfo, + VkMemoryRequirements2* pMemoryRequirements); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkBindDataGraphPipelineSessionMemoryARM( + VkDevice device, + uint32_t bindInfoCount, + const VkBindDataGraphPipelineSessionMemoryInfoARM* pBindInfos); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkDestroyDataGraphPipelineSessionARM( + VkDevice device, + VkDataGraphPipelineSessionARM session, + const VkAllocationCallbacks* pAllocator); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdDispatchDataGraphARM( + VkCommandBuffer commandBuffer, + VkDataGraphPipelineSessionARM session, + const VkDataGraphPipelineDispatchInfoARM* pInfo); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetDataGraphPipelineAvailablePropertiesARM( + VkDevice device, + const VkDataGraphPipelineInfoARM* pPipelineInfo, + uint32_t* pPropertiesCount, + VkDataGraphPipelinePropertyARM* pProperties); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetDataGraphPipelinePropertiesARM( + VkDevice device, + const VkDataGraphPipelineInfoARM* pPipelineInfo, + uint32_t propertiesCount, + VkDataGraphPipelinePropertyQueryResultARM* pProperties); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceQueueFamilyDataGraphPropertiesARM( + VkPhysicalDevice physicalDevice, + uint32_t queueFamilyIndex, + uint32_t* pQueueFamilyDataGraphPropertyCount, + VkQueueFamilyDataGraphPropertiesARM* pQueueFamilyDataGraphProperties); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceQueueFamilyDataGraphProcessingEnginePropertiesARM( + VkPhysicalDevice physicalDevice, + const VkPhysicalDeviceQueueFamilyDataGraphProcessingEngineInfoARM* pQueueFamilyDataGraphProcessingEngineInfo, + VkQueueFamilyDataGraphProcessingEnginePropertiesARM* pQueueFamilyDataGraphProcessingEngineProperties); +#endif +#endif + + +// VK_ARM_data_graph_instruction_set_tosa is a preprocessor guard. Do not pass it to API calls. +#define VK_ARM_data_graph_instruction_set_tosa 1 +#define VK_MAX_DATA_GRAPH_TOSA_NAME_SIZE_ARM 128U +#define VK_ARM_DATA_GRAPH_INSTRUCTION_SET_TOSA_SPEC_VERSION 1 +#define VK_ARM_DATA_GRAPH_INSTRUCTION_SET_TOSA_EXTENSION_NAME "VK_ARM_data_graph_instruction_set_tosa" + +typedef enum VkDataGraphTOSALevelARM { + VK_DATA_GRAPH_TOSA_LEVEL_NONE_ARM = 0, + VK_DATA_GRAPH_TOSA_LEVEL_8K_ARM = 1, + VK_DATA_GRAPH_TOSALEVEL_MAX_ENUM_ARM = 0x7FFFFFFF +} VkDataGraphTOSALevelARM; + +typedef enum VkDataGraphTOSAQualityFlagBitsARM { + VK_DATA_GRAPH_TOSA_QUALITY_ACCELERATED_ARM = 0x00000001, + VK_DATA_GRAPH_TOSA_QUALITY_CONFORMANT_ARM = 0x00000002, + VK_DATA_GRAPH_TOSA_QUALITY_EXPERIMENTAL_ARM = 0x00000004, + VK_DATA_GRAPH_TOSA_QUALITY_DEPRECATED_ARM = 0x00000008, + VK_DATA_GRAPH_TOSAQUALITY_FLAG_BITS_MAX_ENUM_ARM = 0x7FFFFFFF +} VkDataGraphTOSAQualityFlagBitsARM; +typedef VkFlags VkDataGraphTOSAQualityFlagsARM; +typedef struct VkDataGraphTOSANameQualityARM { + char name[VK_MAX_DATA_GRAPH_TOSA_NAME_SIZE_ARM]; + VkDataGraphTOSAQualityFlagsARM qualityFlags; +} VkDataGraphTOSANameQualityARM; + +typedef struct VkQueueFamilyDataGraphTOSAPropertiesARM { + VkStructureType sType; + void* pNext; + uint32_t profileCount; + const VkDataGraphTOSANameQualityARM* pProfiles; + uint32_t extensionCount; + const VkDataGraphTOSANameQualityARM* pExtensions; + VkDataGraphTOSALevelARM level; +} VkQueueFamilyDataGraphTOSAPropertiesARM; + +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceQueueFamilyDataGraphEngineOperationPropertiesARM)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, const VkQueueFamilyDataGraphPropertiesARM* pQueueFamilyDataGraphProperties, VkBaseOutStructure* pProperties); + +#ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceQueueFamilyDataGraphEngineOperationPropertiesARM( + VkPhysicalDevice physicalDevice, + uint32_t queueFamilyIndex, + const VkQueueFamilyDataGraphPropertiesARM* pQueueFamilyDataGraphProperties, + VkBaseOutStructure* pProperties); +#endif +#endif // VK_QCOM_multiview_per_view_render_areas is a preprocessor guard. Do not pass it to API calls. @@ -20463,10 +24578,12 @@ typedef struct VkPhysicalDeviceAttachmentFeedbackLoopDynamicStateFeaturesEXT { typedef void (VKAPI_PTR *PFN_vkCmdSetAttachmentFeedbackLoopEnableEXT)(VkCommandBuffer commandBuffer, VkImageAspectFlags aspectMask); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetAttachmentFeedbackLoopEnableEXT( VkCommandBuffer commandBuffer, VkImageAspectFlags aspectMask); #endif +#endif // VK_MSFT_layered_driver is a preprocessor guard. Do not pass it to API calls. @@ -20499,6 +24616,94 @@ typedef struct VkPhysicalDeviceDescriptorPoolOverallocationFeaturesNV { +// VK_QCOM_tile_memory_heap is a preprocessor guard. Do not pass it to API calls. +#define VK_QCOM_tile_memory_heap 1 +#define VK_QCOM_TILE_MEMORY_HEAP_SPEC_VERSION 1 +#define VK_QCOM_TILE_MEMORY_HEAP_EXTENSION_NAME "VK_QCOM_tile_memory_heap" +typedef struct VkPhysicalDeviceTileMemoryHeapFeaturesQCOM { + VkStructureType sType; + void* pNext; + VkBool32 tileMemoryHeap; +} VkPhysicalDeviceTileMemoryHeapFeaturesQCOM; + +typedef struct VkPhysicalDeviceTileMemoryHeapPropertiesQCOM { + VkStructureType sType; + void* pNext; + VkBool32 queueSubmitBoundary; + VkBool32 tileBufferTransfers; +} VkPhysicalDeviceTileMemoryHeapPropertiesQCOM; + +typedef struct VkTileMemoryRequirementsQCOM { + VkStructureType sType; + void* pNext; + VkDeviceSize size; + VkDeviceSize alignment; +} VkTileMemoryRequirementsQCOM; + +typedef struct VkTileMemoryBindInfoQCOM { + VkStructureType sType; + const void* pNext; + VkDeviceMemory memory; +} VkTileMemoryBindInfoQCOM; + +typedef struct VkTileMemorySizeInfoQCOM { + VkStructureType sType; + const void* pNext; + VkDeviceSize size; +} VkTileMemorySizeInfoQCOM; + +typedef void (VKAPI_PTR *PFN_vkCmdBindTileMemoryQCOM)(VkCommandBuffer commandBuffer, const VkTileMemoryBindInfoQCOM* pTileMemoryBindInfo); + +#ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdBindTileMemoryQCOM( + VkCommandBuffer commandBuffer, + const VkTileMemoryBindInfoQCOM* pTileMemoryBindInfo); +#endif +#endif + + +// VK_EXT_memory_decompression is a preprocessor guard. Do not pass it to API calls. +#define VK_EXT_memory_decompression 1 +#define VK_EXT_MEMORY_DECOMPRESSION_SPEC_VERSION 1 +#define VK_EXT_MEMORY_DECOMPRESSION_EXTENSION_NAME "VK_EXT_memory_decompression" +typedef struct VkDecompressMemoryRegionEXT { + VkDeviceAddress srcAddress; + VkDeviceAddress dstAddress; + VkDeviceSize compressedSize; + VkDeviceSize decompressedSize; +} VkDecompressMemoryRegionEXT; + +typedef struct VkDecompressMemoryInfoEXT { + VkStructureType sType; + const void* pNext; + VkMemoryDecompressionMethodFlagsEXT decompressionMethod; + uint32_t regionCount; + const VkDecompressMemoryRegionEXT* pRegions; +} VkDecompressMemoryInfoEXT; + +typedef void (VKAPI_PTR *PFN_vkCmdDecompressMemoryEXT)(VkCommandBuffer commandBuffer, const VkDecompressMemoryInfoEXT* pDecompressMemoryInfoEXT); +typedef void (VKAPI_PTR *PFN_vkCmdDecompressMemoryIndirectCountEXT)(VkCommandBuffer commandBuffer, VkMemoryDecompressionMethodFlagsEXT decompressionMethod, VkDeviceAddress indirectCommandsAddress, VkDeviceAddress indirectCommandsCountAddress, uint32_t maxDecompressionCount, uint32_t stride); + +#ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdDecompressMemoryEXT( + VkCommandBuffer commandBuffer, + const VkDecompressMemoryInfoEXT* pDecompressMemoryInfoEXT); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdDecompressMemoryIndirectCountEXT( + VkCommandBuffer commandBuffer, + VkMemoryDecompressionMethodFlagsEXT decompressionMethod, + VkDeviceAddress indirectCommandsAddress, + VkDeviceAddress indirectCommandsCountAddress, + uint32_t maxDecompressionCount, + uint32_t stride); +#endif +#endif + + // VK_NV_display_stereo is a preprocessor guard. Do not pass it to API calls. #define VK_NV_display_stereo 1 #define VK_NV_DISPLAY_STEREO_SPEC_VERSION 1 @@ -20519,7 +24724,7 @@ typedef struct VkDisplaySurfaceStereoCreateInfoNV { typedef struct VkDisplayModeStereoPropertiesNV { VkStructureType sType; - const void* pNext; + void* pNext; VkBool32 hdmi3DSupported; } VkDisplayModeStereoPropertiesNV; @@ -20537,6 +24742,65 @@ typedef struct VkPhysicalDeviceRawAccessChainsFeaturesNV { +// VK_NV_external_compute_queue is a preprocessor guard. Do not pass it to API calls. +#define VK_NV_external_compute_queue 1 +VK_DEFINE_HANDLE(VkExternalComputeQueueNV) +#define VK_NV_EXTERNAL_COMPUTE_QUEUE_SPEC_VERSION 1 +#define VK_NV_EXTERNAL_COMPUTE_QUEUE_EXTENSION_NAME "VK_NV_external_compute_queue" +typedef struct VkExternalComputeQueueDeviceCreateInfoNV { + VkStructureType sType; + const void* pNext; + uint32_t reservedExternalQueues; +} VkExternalComputeQueueDeviceCreateInfoNV; + +typedef struct VkExternalComputeQueueCreateInfoNV { + VkStructureType sType; + const void* pNext; + VkQueue preferredQueue; +} VkExternalComputeQueueCreateInfoNV; + +typedef struct VkExternalComputeQueueDataParamsNV { + VkStructureType sType; + const void* pNext; + uint32_t deviceIndex; +} VkExternalComputeQueueDataParamsNV; + +typedef struct VkPhysicalDeviceExternalComputeQueuePropertiesNV { + VkStructureType sType; + void* pNext; + uint32_t externalDataSize; + uint32_t maxExternalQueues; +} VkPhysicalDeviceExternalComputeQueuePropertiesNV; + +typedef VkResult (VKAPI_PTR *PFN_vkCreateExternalComputeQueueNV)(VkDevice device, const VkExternalComputeQueueCreateInfoNV* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkExternalComputeQueueNV* pExternalQueue); +typedef void (VKAPI_PTR *PFN_vkDestroyExternalComputeQueueNV)(VkDevice device, VkExternalComputeQueueNV externalQueue, const VkAllocationCallbacks* pAllocator); +typedef void (VKAPI_PTR *PFN_vkGetExternalComputeQueueDataNV)(VkExternalComputeQueueNV externalQueue, VkExternalComputeQueueDataParamsNV* params, void* pData); + +#ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateExternalComputeQueueNV( + VkDevice device, + const VkExternalComputeQueueCreateInfoNV* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkExternalComputeQueueNV* pExternalQueue); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkDestroyExternalComputeQueueNV( + VkDevice device, + VkExternalComputeQueueNV externalQueue, + const VkAllocationCallbacks* pAllocator); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkGetExternalComputeQueueDataNV( + VkExternalComputeQueueNV externalQueue, + VkExternalComputeQueueDataParamsNV* params, + void* pData); +#endif +#endif + + // VK_NV_command_buffer_inheritance is a preprocessor guard. Do not pass it to API calls. #define VK_NV_command_buffer_inheritance 1 #define VK_NV_COMMAND_BUFFER_INHERITANCE_SPEC_VERSION 1 @@ -20573,6 +24837,19 @@ typedef struct VkPhysicalDeviceShaderReplicatedCompositesFeaturesEXT { +// VK_EXT_shader_float8 is a preprocessor guard. Do not pass it to API calls. +#define VK_EXT_shader_float8 1 +#define VK_EXT_SHADER_FLOAT8_SPEC_VERSION 1 +#define VK_EXT_SHADER_FLOAT8_EXTENSION_NAME "VK_EXT_shader_float8" +typedef struct VkPhysicalDeviceShaderFloat8FeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 shaderFloat8; + VkBool32 shaderFloat8CooperativeMatrix; +} VkPhysicalDeviceShaderFloat8FeaturesEXT; + + + // VK_NV_ray_tracing_validation is a preprocessor guard. Do not pass it to API calls. #define VK_NV_ray_tracing_validation 1 #define VK_NV_RAY_TRACING_VALIDATION_SPEC_VERSION 1 @@ -20587,7 +24864,7 @@ typedef struct VkPhysicalDeviceRayTracingValidationFeaturesNV { // VK_NV_cluster_acceleration_structure is a preprocessor guard. Do not pass it to API calls. #define VK_NV_cluster_acceleration_structure 1 -#define VK_NV_CLUSTER_ACCELERATION_STRUCTURE_SPEC_VERSION 2 +#define VK_NV_CLUSTER_ACCELERATION_STRUCTURE_SPEC_VERSION 4 #define VK_NV_CLUSTER_ACCELERATION_STRUCTURE_EXTENSION_NAME "VK_NV_cluster_acceleration_structure" typedef enum VkClusterAccelerationStructureTypeNV { @@ -20603,6 +24880,7 @@ typedef enum VkClusterAccelerationStructureOpTypeNV { VK_CLUSTER_ACCELERATION_STRUCTURE_OP_TYPE_BUILD_TRIANGLE_CLUSTER_NV = 2, VK_CLUSTER_ACCELERATION_STRUCTURE_OP_TYPE_BUILD_TRIANGLE_CLUSTER_TEMPLATE_NV = 3, VK_CLUSTER_ACCELERATION_STRUCTURE_OP_TYPE_INSTANTIATE_TRIANGLE_CLUSTER_NV = 4, + VK_CLUSTER_ACCELERATION_STRUCTURE_OP_TYPE_GET_CLUSTER_TEMPLATE_INDICES_NV = 5, VK_CLUSTER_ACCELERATION_STRUCTURE_OP_TYPE_MAX_ENUM_NV = 0x7FFFFFFF } VkClusterAccelerationStructureOpTypeNV; @@ -20614,6 +24892,7 @@ typedef enum VkClusterAccelerationStructureOpModeNV { } VkClusterAccelerationStructureOpModeNV; typedef enum VkClusterAccelerationStructureAddressResolutionFlagBitsNV { + VK_CLUSTER_ACCELERATION_STRUCTURE_ADDRESS_RESOLUTION_NONE_NV = 0, VK_CLUSTER_ACCELERATION_STRUCTURE_ADDRESS_RESOLUTION_INDIRECTED_DST_IMPLICIT_DATA_BIT_NV = 0x00000001, VK_CLUSTER_ACCELERATION_STRUCTURE_ADDRESS_RESOLUTION_INDIRECTED_SCRATCH_DATA_BIT_NV = 0x00000002, VK_CLUSTER_ACCELERATION_STRUCTURE_ADDRESS_RESOLUTION_INDIRECTED_DST_ADDRESS_ARRAY_BIT_NV = 0x00000004, @@ -20797,9 +25076,13 @@ typedef struct VkClusterAccelerationStructureInstantiateClusterInfoNV { VkStridedDeviceAddressNV vertexBuffer; } VkClusterAccelerationStructureInstantiateClusterInfoNV; +typedef struct VkClusterAccelerationStructureGetTemplateIndicesInfoNV { + VkDeviceAddress clusterTemplateAddress; +} VkClusterAccelerationStructureGetTemplateIndicesInfoNV; + typedef struct VkAccelerationStructureBuildSizesInfoKHR { VkStructureType sType; - const void* pNext; + void* pNext; VkDeviceSize accelerationStructureSize; VkDeviceSize updateScratchSize; VkDeviceSize buildScratchSize; @@ -20815,15 +25098,19 @@ typedef void (VKAPI_PTR *PFN_vkGetClusterAccelerationStructureBuildSizesNV)(VkDe typedef void (VKAPI_PTR *PFN_vkCmdBuildClusterAccelerationStructureIndirectNV)(VkCommandBuffer commandBuffer, const VkClusterAccelerationStructureCommandsInfoNV* pCommandInfos); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetClusterAccelerationStructureBuildSizesNV( VkDevice device, const VkClusterAccelerationStructureInputInfoNV* pInfo, VkAccelerationStructureBuildSizesInfoKHR* pSizeInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdBuildClusterAccelerationStructureIndirectNV( VkCommandBuffer commandBuffer, const VkClusterAccelerationStructureCommandsInfoNV* pCommandInfos); #endif +#endif // VK_NV_partitioned_acceleration_structure is a preprocessor guard. Do not pass it to API calls. @@ -20927,15 +25214,19 @@ typedef void (VKAPI_PTR *PFN_vkGetPartitionedAccelerationStructuresBuildSizesNV) typedef void (VKAPI_PTR *PFN_vkCmdBuildPartitionedAccelerationStructuresNV)(VkCommandBuffer commandBuffer, const VkBuildPartitionedAccelerationStructureInfoNV* pBuildInfo); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetPartitionedAccelerationStructuresBuildSizesNV( VkDevice device, const VkPartitionedAccelerationStructureInstancesInputNV* pInfo, VkAccelerationStructureBuildSizesInfoKHR* pSizeInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdBuildPartitionedAccelerationStructuresNV( VkCommandBuffer commandBuffer, const VkBuildPartitionedAccelerationStructureInfoNV* pBuildInfo); #endif +#endif // VK_EXT_device_generated_commands is a preprocessor guard. Do not pass it to API calls. @@ -20962,6 +25253,8 @@ typedef enum VkIndirectCommandsTokenTypeEXT { VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_COUNT_EXT = 7, VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_COUNT_EXT = 8, VK_INDIRECT_COMMANDS_TOKEN_TYPE_DISPATCH_EXT = 9, + VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_DATA_EXT = 1000135000, + VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_DATA_SEQUENCE_INDEX_EXT = 1000135001, VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_NV_EXT = 1000202002, VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_COUNT_NV_EXT = 1000202003, VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_EXT = 1000328000, @@ -21167,55 +25460,73 @@ typedef void (VKAPI_PTR *PFN_vkUpdateIndirectExecutionSetPipelineEXT)(VkDevice d typedef void (VKAPI_PTR *PFN_vkUpdateIndirectExecutionSetShaderEXT)(VkDevice device, VkIndirectExecutionSetEXT indirectExecutionSet, uint32_t executionSetWriteCount, const VkWriteIndirectExecutionSetShaderEXT* pExecutionSetWrites); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetGeneratedCommandsMemoryRequirementsEXT( VkDevice device, const VkGeneratedCommandsMemoryRequirementsInfoEXT* pInfo, VkMemoryRequirements2* pMemoryRequirements); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdPreprocessGeneratedCommandsEXT( VkCommandBuffer commandBuffer, const VkGeneratedCommandsInfoEXT* pGeneratedCommandsInfo, VkCommandBuffer stateCommandBuffer); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdExecuteGeneratedCommandsEXT( VkCommandBuffer commandBuffer, VkBool32 isPreprocessed, const VkGeneratedCommandsInfoEXT* pGeneratedCommandsInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateIndirectCommandsLayoutEXT( VkDevice device, const VkIndirectCommandsLayoutCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkIndirectCommandsLayoutEXT* pIndirectCommandsLayout); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkDestroyIndirectCommandsLayoutEXT( VkDevice device, VkIndirectCommandsLayoutEXT indirectCommandsLayout, const VkAllocationCallbacks* pAllocator); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateIndirectExecutionSetEXT( VkDevice device, const VkIndirectExecutionSetCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkIndirectExecutionSetEXT* pIndirectExecutionSet); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkDestroyIndirectExecutionSetEXT( VkDevice device, VkIndirectExecutionSetEXT indirectExecutionSet, const VkAllocationCallbacks* pAllocator); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkUpdateIndirectExecutionSetPipelineEXT( VkDevice device, VkIndirectExecutionSetEXT indirectExecutionSet, uint32_t executionSetWriteCount, const VkWriteIndirectExecutionSetPipelineEXT* pExecutionSetWrites); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkUpdateIndirectExecutionSetShaderEXT( VkDevice device, VkIndirectExecutionSetEXT indirectExecutionSet, uint32_t executionSetWriteCount, const VkWriteIndirectExecutionSetShaderEXT* pExecutionSetWrites); #endif +#endif // VK_MESA_image_alignment_control is a preprocessor guard. Do not pass it to API calls. @@ -21242,6 +25553,52 @@ typedef struct VkImageAlignmentControlCreateInfoMESA { +// VK_NV_push_constant_bank is a preprocessor guard. Do not pass it to API calls. +#define VK_NV_push_constant_bank 1 +#define VK_NV_PUSH_CONSTANT_BANK_SPEC_VERSION 1 +#define VK_NV_PUSH_CONSTANT_BANK_EXTENSION_NAME "VK_NV_push_constant_bank" +typedef struct VkPushConstantBankInfoNV { + VkStructureType sType; + const void* pNext; + uint32_t bank; +} VkPushConstantBankInfoNV; + +typedef struct VkPhysicalDevicePushConstantBankFeaturesNV { + VkStructureType sType; + void* pNext; + VkBool32 pushConstantBank; +} VkPhysicalDevicePushConstantBankFeaturesNV; + +typedef struct VkPhysicalDevicePushConstantBankPropertiesNV { + VkStructureType sType; + void* pNext; + uint32_t maxGraphicsPushConstantBanks; + uint32_t maxComputePushConstantBanks; + uint32_t maxGraphicsPushDataBanks; + uint32_t maxComputePushDataBanks; +} VkPhysicalDevicePushConstantBankPropertiesNV; + + + +// VK_EXT_ray_tracing_invocation_reorder is a preprocessor guard. Do not pass it to API calls. +#define VK_EXT_ray_tracing_invocation_reorder 1 +#define VK_EXT_RAY_TRACING_INVOCATION_REORDER_SPEC_VERSION 2 +#define VK_EXT_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME "VK_EXT_ray_tracing_invocation_reorder" +typedef struct VkPhysicalDeviceRayTracingInvocationReorderPropertiesEXT { + VkStructureType sType; + void* pNext; + VkRayTracingInvocationReorderModeEXT rayTracingInvocationReorderReorderingHint; + uint32_t maxShaderBindingTableRecordIndex; +} VkPhysicalDeviceRayTracingInvocationReorderPropertiesEXT; + +typedef struct VkPhysicalDeviceRayTracingInvocationReorderFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 rayTracingInvocationReorder; +} VkPhysicalDeviceRayTracingInvocationReorderFeaturesEXT; + + + // VK_EXT_depth_clamp_control is a preprocessor guard. Do not pass it to API calls. #define VK_EXT_depth_clamp_control 1 #define VK_EXT_DEPTH_CLAMP_CONTROL_SPEC_VERSION 1 @@ -21322,11 +25679,13 @@ typedef struct VkPhysicalDeviceCooperativeMatrix2PropertiesNV { typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV)(VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkCooperativeMatrixFlexibleDimensionsPropertiesNV* pProperties); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV( VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkCooperativeMatrixFlexibleDimensionsPropertiesNV* pProperties); #endif +#endif // VK_ARM_pipeline_opacity_micromap is a preprocessor guard. Do not pass it to API calls. @@ -21341,6 +25700,167 @@ typedef struct VkPhysicalDevicePipelineOpacityMicromapFeaturesARM { +// VK_IMG_filter_linear_2d is a preprocessor guard. Do not pass it to API calls. +#define VK_IMG_filter_linear_2d 1 +#define VK_IMG_FILTER_LINEAR_2D_SPEC_VERSION 1 +#define VK_IMG_FILTER_LINEAR_2D_EXTENSION_NAME "VK_IMG_filter_linear_2d" + + +// VK_ARM_performance_counters_by_region is a preprocessor guard. Do not pass it to API calls. +#define VK_ARM_performance_counters_by_region 1 +#define VK_ARM_PERFORMANCE_COUNTERS_BY_REGION_SPEC_VERSION 1 +#define VK_ARM_PERFORMANCE_COUNTERS_BY_REGION_EXTENSION_NAME "VK_ARM_performance_counters_by_region" +typedef VkFlags VkPerformanceCounterDescriptionFlagsARM; +typedef struct VkPhysicalDevicePerformanceCountersByRegionFeaturesARM { + VkStructureType sType; + void* pNext; + VkBool32 performanceCountersByRegion; +} VkPhysicalDevicePerformanceCountersByRegionFeaturesARM; + +typedef struct VkPhysicalDevicePerformanceCountersByRegionPropertiesARM { + VkStructureType sType; + void* pNext; + uint32_t maxPerRegionPerformanceCounters; + VkExtent2D performanceCounterRegionSize; + uint32_t rowStrideAlignment; + uint32_t regionAlignment; + VkBool32 identityTransformOrder; +} VkPhysicalDevicePerformanceCountersByRegionPropertiesARM; + +typedef struct VkPerformanceCounterARM { + VkStructureType sType; + void* pNext; + uint32_t counterID; +} VkPerformanceCounterARM; + +typedef struct VkPerformanceCounterDescriptionARM { + VkStructureType sType; + void* pNext; + VkPerformanceCounterDescriptionFlagsARM flags; + char name[VK_MAX_DESCRIPTION_SIZE]; +} VkPerformanceCounterDescriptionARM; + +typedef struct VkRenderPassPerformanceCountersByRegionBeginInfoARM { + VkStructureType sType; + void* pNext; + uint32_t counterAddressCount; + const VkDeviceAddress* pCounterAddresses; + VkBool32 serializeRegions; + uint32_t counterIndexCount; + uint32_t* pCounterIndices; +} VkRenderPassPerformanceCountersByRegionBeginInfoARM; + +typedef VkResult (VKAPI_PTR *PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceCountersByRegionARM)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, uint32_t* pCounterCount, VkPerformanceCounterARM* pCounters, VkPerformanceCounterDescriptionARM* pCounterDescriptions); + +#ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDeviceQueueFamilyPerformanceCountersByRegionARM( + VkPhysicalDevice physicalDevice, + uint32_t queueFamilyIndex, + uint32_t* pCounterCount, + VkPerformanceCounterARM* pCounters, + VkPerformanceCounterDescriptionARM* pCounterDescriptions); +#endif +#endif + + +// VK_ARM_shader_instrumentation is a preprocessor guard. Do not pass it to API calls. +#define VK_ARM_shader_instrumentation 1 +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkShaderInstrumentationARM) +#define VK_ARM_SHADER_INSTRUMENTATION_SPEC_VERSION 1 +#define VK_ARM_SHADER_INSTRUMENTATION_EXTENSION_NAME "VK_ARM_shader_instrumentation" +typedef VkFlags VkShaderInstrumentationValuesFlagsARM; +typedef struct VkPhysicalDeviceShaderInstrumentationFeaturesARM { + VkStructureType sType; + void* pNext; + VkBool32 shaderInstrumentation; +} VkPhysicalDeviceShaderInstrumentationFeaturesARM; + +typedef struct VkPhysicalDeviceShaderInstrumentationPropertiesARM { + VkStructureType sType; + void* pNext; + uint32_t numMetrics; + VkBool32 perBasicBlockGranularity; +} VkPhysicalDeviceShaderInstrumentationPropertiesARM; + +typedef struct VkShaderInstrumentationCreateInfoARM { + VkStructureType sType; + void* pNext; +} VkShaderInstrumentationCreateInfoARM; + +typedef struct VkShaderInstrumentationMetricDescriptionARM { + VkStructureType sType; + void* pNext; + char name[VK_MAX_DESCRIPTION_SIZE]; + char description[VK_MAX_DESCRIPTION_SIZE]; +} VkShaderInstrumentationMetricDescriptionARM; + +typedef struct VkShaderInstrumentationMetricDataHeaderARM { + uint32_t resultIndex; + uint32_t resultSubIndex; + VkShaderStageFlags stages; + uint32_t basicBlockIndex; +} VkShaderInstrumentationMetricDataHeaderARM; + +typedef VkResult (VKAPI_PTR *PFN_vkEnumeratePhysicalDeviceShaderInstrumentationMetricsARM)(VkPhysicalDevice physicalDevice, uint32_t* pDescriptionCount, VkShaderInstrumentationMetricDescriptionARM* pDescriptions); +typedef VkResult (VKAPI_PTR *PFN_vkCreateShaderInstrumentationARM)(VkDevice device, const VkShaderInstrumentationCreateInfoARM* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkShaderInstrumentationARM* pInstrumentation); +typedef void (VKAPI_PTR *PFN_vkDestroyShaderInstrumentationARM)(VkDevice device, VkShaderInstrumentationARM instrumentation, const VkAllocationCallbacks* pAllocator); +typedef void (VKAPI_PTR *PFN_vkCmdBeginShaderInstrumentationARM)(VkCommandBuffer commandBuffer, VkShaderInstrumentationARM instrumentation); +typedef void (VKAPI_PTR *PFN_vkCmdEndShaderInstrumentationARM)(VkCommandBuffer commandBuffer); +typedef VkResult (VKAPI_PTR *PFN_vkGetShaderInstrumentationValuesARM)(VkDevice device, VkShaderInstrumentationARM instrumentation, uint32_t* pMetricBlockCount, void* pMetricValues, VkShaderInstrumentationValuesFlagsARM flags); +typedef void (VKAPI_PTR *PFN_vkClearShaderInstrumentationMetricsARM)(VkDevice device, VkShaderInstrumentationARM instrumentation); + +#ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkEnumeratePhysicalDeviceShaderInstrumentationMetricsARM( + VkPhysicalDevice physicalDevice, + uint32_t* pDescriptionCount, + VkShaderInstrumentationMetricDescriptionARM* pDescriptions); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateShaderInstrumentationARM( + VkDevice device, + const VkShaderInstrumentationCreateInfoARM* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkShaderInstrumentationARM* pInstrumentation); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkDestroyShaderInstrumentationARM( + VkDevice device, + VkShaderInstrumentationARM instrumentation, + const VkAllocationCallbacks* pAllocator); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdBeginShaderInstrumentationARM( + VkCommandBuffer commandBuffer, + VkShaderInstrumentationARM instrumentation); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdEndShaderInstrumentationARM( + VkCommandBuffer commandBuffer); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetShaderInstrumentationValuesARM( + VkDevice device, + VkShaderInstrumentationARM instrumentation, + uint32_t* pMetricBlockCount, + void* pMetricValues, + VkShaderInstrumentationValuesFlagsARM flags); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkClearShaderInstrumentationMetricsARM( + VkDevice device, + VkShaderInstrumentationARM instrumentation); +#endif +#endif + + // VK_EXT_vertex_attribute_robustness is a preprocessor guard. Do not pass it to API calls. #define VK_EXT_vertex_attribute_robustness 1 #define VK_EXT_VERTEX_ATTRIBUTE_ROBUSTNESS_SPEC_VERSION 1 @@ -21353,6 +25873,42 @@ typedef struct VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT { +// VK_ARM_format_pack is a preprocessor guard. Do not pass it to API calls. +#define VK_ARM_format_pack 1 +#define VK_ARM_FORMAT_PACK_SPEC_VERSION 1 +#define VK_ARM_FORMAT_PACK_EXTENSION_NAME "VK_ARM_format_pack" +typedef struct VkPhysicalDeviceFormatPackFeaturesARM { + VkStructureType sType; + void* pNext; + VkBool32 formatPack; +} VkPhysicalDeviceFormatPackFeaturesARM; + + + +// VK_VALVE_fragment_density_map_layered is a preprocessor guard. Do not pass it to API calls. +#define VK_VALVE_fragment_density_map_layered 1 +#define VK_VALVE_FRAGMENT_DENSITY_MAP_LAYERED_SPEC_VERSION 1 +#define VK_VALVE_FRAGMENT_DENSITY_MAP_LAYERED_EXTENSION_NAME "VK_VALVE_fragment_density_map_layered" +typedef struct VkPhysicalDeviceFragmentDensityMapLayeredFeaturesVALVE { + VkStructureType sType; + void* pNext; + VkBool32 fragmentDensityMapLayered; +} VkPhysicalDeviceFragmentDensityMapLayeredFeaturesVALVE; + +typedef struct VkPhysicalDeviceFragmentDensityMapLayeredPropertiesVALVE { + VkStructureType sType; + void* pNext; + uint32_t maxFragmentDensityMapLayers; +} VkPhysicalDeviceFragmentDensityMapLayeredPropertiesVALVE; + +typedef struct VkPipelineFragmentDensityMapLayeredCreateInfoVALVE { + VkStructureType sType; + const void* pNext; + uint32_t maxFragmentDensityMapLayers; +} VkPipelineFragmentDensityMapLayeredCreateInfoVALVE; + + + // VK_NV_present_metering is a preprocessor guard. Do not pass it to API calls. #define VK_NV_present_metering 1 #define VK_NV_PRESENT_METERING_SPEC_VERSION 1 @@ -21372,6 +25928,475 @@ typedef struct VkPhysicalDevicePresentMeteringFeaturesNV { +// VK_EXT_multisampled_render_to_swapchain is a preprocessor guard. Do not pass it to API calls. +#define VK_EXT_multisampled_render_to_swapchain 1 +#define VK_EXT_MULTISAMPLED_RENDER_TO_SWAPCHAIN_SPEC_VERSION 1 +#define VK_EXT_MULTISAMPLED_RENDER_TO_SWAPCHAIN_EXTENSION_NAME "VK_EXT_multisampled_render_to_swapchain" +typedef struct VkPhysicalDeviceMultisampledRenderToSwapchainFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 multisampledRenderToSwapchain; +} VkPhysicalDeviceMultisampledRenderToSwapchainFeaturesEXT; + +typedef struct VkSwapchainFlagsSurfaceCapabilitiesEXT { + VkStructureType sType; + void* pNext; + VkSwapchainCreateFlagsKHR swapchainSupportedFlags; +} VkSwapchainFlagsSurfaceCapabilitiesEXT; + + + +// VK_EXT_fragment_density_map_offset is a preprocessor guard. Do not pass it to API calls. +#define VK_EXT_fragment_density_map_offset 1 +#define VK_EXT_FRAGMENT_DENSITY_MAP_OFFSET_SPEC_VERSION 1 +#define VK_EXT_FRAGMENT_DENSITY_MAP_OFFSET_EXTENSION_NAME "VK_EXT_fragment_density_map_offset" +typedef VkRenderingEndInfoKHR VkRenderingEndInfoEXT; + +typedef void (VKAPI_PTR *PFN_vkCmdEndRendering2EXT)(VkCommandBuffer commandBuffer, const VkRenderingEndInfoKHR* pRenderingEndInfo); + +#ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdEndRendering2EXT( + VkCommandBuffer commandBuffer, + const VkRenderingEndInfoKHR* pRenderingEndInfo); +#endif +#endif + + +// VK_EXT_zero_initialize_device_memory is a preprocessor guard. Do not pass it to API calls. +#define VK_EXT_zero_initialize_device_memory 1 +#define VK_EXT_ZERO_INITIALIZE_DEVICE_MEMORY_SPEC_VERSION 1 +#define VK_EXT_ZERO_INITIALIZE_DEVICE_MEMORY_EXTENSION_NAME "VK_EXT_zero_initialize_device_memory" +typedef struct VkPhysicalDeviceZeroInitializeDeviceMemoryFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 zeroInitializeDeviceMemory; +} VkPhysicalDeviceZeroInitializeDeviceMemoryFeaturesEXT; + + + +// VK_EXT_shader_64bit_indexing is a preprocessor guard. Do not pass it to API calls. +#define VK_EXT_shader_64bit_indexing 1 +#define VK_EXT_SHADER_64BIT_INDEXING_SPEC_VERSION 1 +#define VK_EXT_SHADER_64BIT_INDEXING_EXTENSION_NAME "VK_EXT_shader_64bit_indexing" +typedef struct VkPhysicalDeviceShader64BitIndexingFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 shader64BitIndexing; +} VkPhysicalDeviceShader64BitIndexingFeaturesEXT; + + + +// VK_EXT_custom_resolve is a preprocessor guard. Do not pass it to API calls. +#define VK_EXT_custom_resolve 1 +#define VK_EXT_CUSTOM_RESOLVE_SPEC_VERSION 1 +#define VK_EXT_CUSTOM_RESOLVE_EXTENSION_NAME "VK_EXT_custom_resolve" +typedef struct VkPhysicalDeviceCustomResolveFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 customResolve; +} VkPhysicalDeviceCustomResolveFeaturesEXT; + +typedef struct VkBeginCustomResolveInfoEXT { + VkStructureType sType; + void* pNext; +} VkBeginCustomResolveInfoEXT; + +typedef struct VkCustomResolveCreateInfoEXT { + VkStructureType sType; + const void* pNext; + VkBool32 customResolve; + uint32_t colorAttachmentCount; + const VkFormat* pColorAttachmentFormats; + VkFormat depthAttachmentFormat; + VkFormat stencilAttachmentFormat; +} VkCustomResolveCreateInfoEXT; + +typedef void (VKAPI_PTR *PFN_vkCmdBeginCustomResolveEXT)(VkCommandBuffer commandBuffer, const VkBeginCustomResolveInfoEXT* pBeginCustomResolveInfo); + +#ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdBeginCustomResolveEXT( + VkCommandBuffer commandBuffer, + const VkBeginCustomResolveInfoEXT* pBeginCustomResolveInfo); +#endif +#endif + + +// VK_QCOM_data_graph_model is a preprocessor guard. Do not pass it to API calls. +#define VK_QCOM_data_graph_model 1 +#define VK_DATA_GRAPH_MODEL_TOOLCHAIN_VERSION_LENGTH_QCOM 3U +#define VK_QCOM_DATA_GRAPH_MODEL_SPEC_VERSION 1 +#define VK_QCOM_DATA_GRAPH_MODEL_EXTENSION_NAME "VK_QCOM_data_graph_model" + +typedef enum VkDataGraphModelCacheTypeQCOM { + VK_DATA_GRAPH_MODEL_CACHE_TYPE_GENERIC_BINARY_QCOM = 0, + VK_DATA_GRAPH_MODEL_CACHE_TYPE_MAX_ENUM_QCOM = 0x7FFFFFFF +} VkDataGraphModelCacheTypeQCOM; +typedef struct VkPipelineCacheHeaderVersionDataGraphQCOM { + uint32_t headerSize; + VkPipelineCacheHeaderVersion headerVersion; + VkDataGraphModelCacheTypeQCOM cacheType; + uint32_t cacheVersion; + uint32_t toolchainVersion[VK_DATA_GRAPH_MODEL_TOOLCHAIN_VERSION_LENGTH_QCOM]; +} VkPipelineCacheHeaderVersionDataGraphQCOM; + +typedef struct VkDataGraphPipelineBuiltinModelCreateInfoQCOM { + VkStructureType sType; + const void* pNext; + const VkPhysicalDeviceDataGraphOperationSupportARM* pOperation; +} VkDataGraphPipelineBuiltinModelCreateInfoQCOM; + +typedef struct VkPhysicalDeviceDataGraphModelFeaturesQCOM { + VkStructureType sType; + void* pNext; + VkBool32 dataGraphModel; +} VkPhysicalDeviceDataGraphModelFeaturesQCOM; + + + +// VK_ARM_data_graph_optical_flow is a preprocessor guard. Do not pass it to API calls. +#define VK_ARM_data_graph_optical_flow 1 +#define VK_ARM_DATA_GRAPH_OPTICAL_FLOW_SPEC_VERSION 1 +#define VK_ARM_DATA_GRAPH_OPTICAL_FLOW_EXTENSION_NAME "VK_ARM_data_graph_optical_flow" + +typedef enum VkDataGraphOpticalFlowPerformanceLevelARM { + VK_DATA_GRAPH_OPTICAL_FLOW_PERFORMANCE_LEVEL_UNKNOWN_ARM = 0, + VK_DATA_GRAPH_OPTICAL_FLOW_PERFORMANCE_LEVEL_SLOW_ARM = 1, + VK_DATA_GRAPH_OPTICAL_FLOW_PERFORMANCE_LEVEL_MEDIUM_ARM = 2, + VK_DATA_GRAPH_OPTICAL_FLOW_PERFORMANCE_LEVEL_FAST_ARM = 3, + VK_DATA_GRAPH_OPTICAL_FLOW_PERFORMANCE_LEVEL_MAX_ENUM_ARM = 0x7FFFFFFF +} VkDataGraphOpticalFlowPerformanceLevelARM; + +typedef enum VkDataGraphPipelineNodeTypeARM { + VK_DATA_GRAPH_PIPELINE_NODE_TYPE_OPTICAL_FLOW_ARM = 1000631000, + VK_DATA_GRAPH_PIPELINE_NODE_TYPE_MAX_ENUM_ARM = 0x7FFFFFFF +} VkDataGraphPipelineNodeTypeARM; + +typedef enum VkDataGraphPipelineNodeConnectionTypeARM { + VK_DATA_GRAPH_PIPELINE_NODE_CONNECTION_TYPE_OPTICAL_FLOW_INPUT_ARM = 1000631000, + VK_DATA_GRAPH_PIPELINE_NODE_CONNECTION_TYPE_OPTICAL_FLOW_REFERENCE_ARM = 1000631001, + VK_DATA_GRAPH_PIPELINE_NODE_CONNECTION_TYPE_OPTICAL_FLOW_HINT_ARM = 1000631002, + VK_DATA_GRAPH_PIPELINE_NODE_CONNECTION_TYPE_OPTICAL_FLOW_FLOW_VECTOR_ARM = 1000631003, + VK_DATA_GRAPH_PIPELINE_NODE_CONNECTION_TYPE_OPTICAL_FLOW_COST_ARM = 1000631004, + VK_DATA_GRAPH_PIPELINE_NODE_CONNECTION_TYPE_MAX_ENUM_ARM = 0x7FFFFFFF +} VkDataGraphPipelineNodeConnectionTypeARM; + +typedef enum VkDataGraphOpticalFlowGridSizeFlagBitsARM { + VK_DATA_GRAPH_OPTICAL_FLOW_GRID_SIZE_UNKNOWN_ARM = 0, + VK_DATA_GRAPH_OPTICAL_FLOW_GRID_SIZE_1X1_BIT_ARM = 0x00000001, + VK_DATA_GRAPH_OPTICAL_FLOW_GRID_SIZE_2X2_BIT_ARM = 0x00000002, + VK_DATA_GRAPH_OPTICAL_FLOW_GRID_SIZE_4X4_BIT_ARM = 0x00000004, + VK_DATA_GRAPH_OPTICAL_FLOW_GRID_SIZE_8X8_BIT_ARM = 0x00000008, + VK_DATA_GRAPH_OPTICAL_FLOW_GRID_SIZE_FLAG_BITS_MAX_ENUM_ARM = 0x7FFFFFFF +} VkDataGraphOpticalFlowGridSizeFlagBitsARM; +typedef VkFlags VkDataGraphOpticalFlowGridSizeFlagsARM; + +typedef enum VkDataGraphOpticalFlowCreateFlagBitsARM { + VK_DATA_GRAPH_OPTICAL_FLOW_CREATE_ENABLE_HINT_BIT_ARM = 0x00000001, + VK_DATA_GRAPH_OPTICAL_FLOW_CREATE_ENABLE_COST_BIT_ARM = 0x00000002, + VK_DATA_GRAPH_OPTICAL_FLOW_CREATE_RESERVED_30_BIT_ARM = 0x40000000, + VK_DATA_GRAPH_OPTICAL_FLOW_CREATE_FLAG_BITS_MAX_ENUM_ARM = 0x7FFFFFFF +} VkDataGraphOpticalFlowCreateFlagBitsARM; +typedef VkFlags VkDataGraphOpticalFlowCreateFlagsARM; + +typedef enum VkDataGraphOpticalFlowImageUsageFlagBitsARM { + VK_DATA_GRAPH_OPTICAL_FLOW_IMAGE_USAGE_UNKNOWN_ARM = 0, + VK_DATA_GRAPH_OPTICAL_FLOW_IMAGE_USAGE_INPUT_BIT_ARM = 0x00000001, + VK_DATA_GRAPH_OPTICAL_FLOW_IMAGE_USAGE_OUTPUT_BIT_ARM = 0x00000002, + VK_DATA_GRAPH_OPTICAL_FLOW_IMAGE_USAGE_HINT_BIT_ARM = 0x00000004, + VK_DATA_GRAPH_OPTICAL_FLOW_IMAGE_USAGE_COST_BIT_ARM = 0x00000008, + VK_DATA_GRAPH_OPTICAL_FLOW_IMAGE_USAGE_FLAG_BITS_MAX_ENUM_ARM = 0x7FFFFFFF +} VkDataGraphOpticalFlowImageUsageFlagBitsARM; +typedef VkFlags VkDataGraphOpticalFlowImageUsageFlagsARM; + +typedef enum VkDataGraphOpticalFlowExecuteFlagBitsARM { + VK_DATA_GRAPH_OPTICAL_FLOW_EXECUTE_DISABLE_TEMPORAL_HINTS_BIT_ARM = 0x00000001, + VK_DATA_GRAPH_OPTICAL_FLOW_EXECUTE_INPUT_UNCHANGED_BIT_ARM = 0x00000002, + VK_DATA_GRAPH_OPTICAL_FLOW_EXECUTE_REFERENCE_UNCHANGED_BIT_ARM = 0x00000004, + VK_DATA_GRAPH_OPTICAL_FLOW_EXECUTE_INPUT_IS_PREVIOUS_REFERENCE_BIT_ARM = 0x00000008, + VK_DATA_GRAPH_OPTICAL_FLOW_EXECUTE_REFERENCE_IS_PREVIOUS_INPUT_BIT_ARM = 0x00000010, + VK_DATA_GRAPH_OPTICAL_FLOW_EXECUTE_FLAG_BITS_MAX_ENUM_ARM = 0x7FFFFFFF +} VkDataGraphOpticalFlowExecuteFlagBitsARM; +typedef VkFlags VkDataGraphOpticalFlowExecuteFlagsARM; +typedef struct VkPhysicalDeviceDataGraphOpticalFlowFeaturesARM { + VkStructureType sType; + void* pNext; + VkBool32 dataGraphOpticalFlow; +} VkPhysicalDeviceDataGraphOpticalFlowFeaturesARM; + +typedef struct VkQueueFamilyDataGraphOpticalFlowPropertiesARM { + VkStructureType sType; + void* pNext; + VkDataGraphOpticalFlowGridSizeFlagsARM supportedOutputGridSizes; + VkDataGraphOpticalFlowGridSizeFlagsARM supportedHintGridSizes; + VkBool32 hintSupported; + VkBool32 costSupported; + uint32_t minWidth; + uint32_t minHeight; + uint32_t maxWidth; + uint32_t maxHeight; +} VkQueueFamilyDataGraphOpticalFlowPropertiesARM; + +typedef struct VkDataGraphPipelineOpticalFlowCreateInfoARM { + VkStructureType sType; + void* pNext; + uint32_t width; + uint32_t height; + VkFormat imageFormat; + VkFormat flowVectorFormat; + VkFormat costFormat; + VkDataGraphOpticalFlowGridSizeFlagsARM outputGridSize; + VkDataGraphOpticalFlowGridSizeFlagsARM hintGridSize; + VkDataGraphOpticalFlowPerformanceLevelARM performanceLevel; + VkDataGraphOpticalFlowCreateFlagsARM flags; +} VkDataGraphPipelineOpticalFlowCreateInfoARM; + +typedef struct VkDataGraphOpticalFlowImageFormatPropertiesARM { + VkStructureType sType; + void* pNext; + VkFormat format; +} VkDataGraphOpticalFlowImageFormatPropertiesARM; + +typedef struct VkDataGraphOpticalFlowImageFormatInfoARM { + VkStructureType sType; + const void* pNext; + VkDataGraphOpticalFlowImageUsageFlagsARM usage; +} VkDataGraphOpticalFlowImageFormatInfoARM; + +typedef struct VkDataGraphPipelineOpticalFlowDispatchInfoARM { + VkStructureType sType; + void* pNext; + VkDataGraphOpticalFlowExecuteFlagsARM flags; + uint32_t meanFlowL1NormHint; +} VkDataGraphPipelineOpticalFlowDispatchInfoARM; + +typedef struct VkDataGraphPipelineResourceInfoImageLayoutARM { + VkStructureType sType; + const void* pNext; + VkImageLayout layout; +} VkDataGraphPipelineResourceInfoImageLayoutARM; + +typedef struct VkDataGraphPipelineSingleNodeConnectionARM { + VkStructureType sType; + void* pNext; + uint32_t set; + uint32_t binding; + VkDataGraphPipelineNodeConnectionTypeARM connection; +} VkDataGraphPipelineSingleNodeConnectionARM; + +typedef struct VkDataGraphPipelineSingleNodeCreateInfoARM { + VkStructureType sType; + void* pNext; + VkDataGraphPipelineNodeTypeARM nodeType; + uint32_t connectionCount; + const VkDataGraphPipelineSingleNodeConnectionARM* pConnections; +} VkDataGraphPipelineSingleNodeCreateInfoARM; + +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceQueueFamilyDataGraphOpticalFlowImageFormatsARM)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, const VkQueueFamilyDataGraphPropertiesARM* pQueueFamilyDataGraphProperties, const VkDataGraphOpticalFlowImageFormatInfoARM* pOpticalFlowImageFormatInfo, uint32_t* pFormatCount, VkDataGraphOpticalFlowImageFormatPropertiesARM* pImageFormatProperties); + +#ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceQueueFamilyDataGraphOpticalFlowImageFormatsARM( + VkPhysicalDevice physicalDevice, + uint32_t queueFamilyIndex, + const VkQueueFamilyDataGraphPropertiesARM* pQueueFamilyDataGraphProperties, + const VkDataGraphOpticalFlowImageFormatInfoARM* pOpticalFlowImageFormatInfo, + uint32_t* pFormatCount, + VkDataGraphOpticalFlowImageFormatPropertiesARM* pImageFormatProperties); +#endif +#endif + + +// VK_EXT_shader_long_vector is a preprocessor guard. Do not pass it to API calls. +#define VK_EXT_shader_long_vector 1 +#define VK_EXT_SHADER_LONG_VECTOR_SPEC_VERSION 1 +#define VK_EXT_SHADER_LONG_VECTOR_EXTENSION_NAME "VK_EXT_shader_long_vector" +typedef struct VkPhysicalDeviceShaderLongVectorFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 longVector; +} VkPhysicalDeviceShaderLongVectorFeaturesEXT; + +typedef struct VkPhysicalDeviceShaderLongVectorPropertiesEXT { + VkStructureType sType; + void* pNext; + uint32_t maxVectorComponents; +} VkPhysicalDeviceShaderLongVectorPropertiesEXT; + + + +// VK_SEC_pipeline_cache_incremental_mode is a preprocessor guard. Do not pass it to API calls. +#define VK_SEC_pipeline_cache_incremental_mode 1 +#define VK_SEC_PIPELINE_CACHE_INCREMENTAL_MODE_SPEC_VERSION 1 +#define VK_SEC_PIPELINE_CACHE_INCREMENTAL_MODE_EXTENSION_NAME "VK_SEC_pipeline_cache_incremental_mode" +typedef struct VkPhysicalDevicePipelineCacheIncrementalModeFeaturesSEC { + VkStructureType sType; + void* pNext; + VkBool32 pipelineCacheIncrementalMode; +} VkPhysicalDevicePipelineCacheIncrementalModeFeaturesSEC; + + + +// VK_EXT_shader_uniform_buffer_unsized_array is a preprocessor guard. Do not pass it to API calls. +#define VK_EXT_shader_uniform_buffer_unsized_array 1 +#define VK_EXT_SHADER_UNIFORM_BUFFER_UNSIZED_ARRAY_SPEC_VERSION 1 +#define VK_EXT_SHADER_UNIFORM_BUFFER_UNSIZED_ARRAY_EXTENSION_NAME "VK_EXT_shader_uniform_buffer_unsized_array" +typedef struct VkPhysicalDeviceShaderUniformBufferUnsizedArrayFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 shaderUniformBufferUnsizedArray; +} VkPhysicalDeviceShaderUniformBufferUnsizedArrayFeaturesEXT; + + + +// VK_NV_compute_occupancy_priority is a preprocessor guard. Do not pass it to API calls. +#define VK_NV_compute_occupancy_priority 1 +#define VK_NV_COMPUTE_OCCUPANCY_PRIORITY_SPEC_VERSION 1 +#define VK_NV_COMPUTE_OCCUPANCY_PRIORITY_EXTENSION_NAME "VK_NV_compute_occupancy_priority" +#define VK_COMPUTE_OCCUPANCY_PRIORITY_LOW_NV 0.25f +#define VK_COMPUTE_OCCUPANCY_PRIORITY_NORMAL_NV 0.50f +#define VK_COMPUTE_OCCUPANCY_PRIORITY_HIGH_NV 0.75f +typedef struct VkComputeOccupancyPriorityParametersNV { + VkStructureType sType; + const void* pNext; + float occupancyPriority; + float occupancyThrottling; +} VkComputeOccupancyPriorityParametersNV; + +typedef struct VkPhysicalDeviceComputeOccupancyPriorityFeaturesNV { + VkStructureType sType; + void* pNext; + VkBool32 computeOccupancyPriority; +} VkPhysicalDeviceComputeOccupancyPriorityFeaturesNV; + +typedef void (VKAPI_PTR *PFN_vkCmdSetComputeOccupancyPriorityNV)(VkCommandBuffer commandBuffer, const VkComputeOccupancyPriorityParametersNV* pParameters); + +#ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdSetComputeOccupancyPriorityNV( + VkCommandBuffer commandBuffer, + const VkComputeOccupancyPriorityParametersNV* pParameters); +#endif +#endif + + +// VK_EXT_shader_subgroup_partitioned is a preprocessor guard. Do not pass it to API calls. +#define VK_EXT_shader_subgroup_partitioned 1 +#define VK_EXT_SHADER_SUBGROUP_PARTITIONED_SPEC_VERSION 1 +#define VK_EXT_SHADER_SUBGROUP_PARTITIONED_EXTENSION_NAME "VK_EXT_shader_subgroup_partitioned" +typedef struct VkPhysicalDeviceShaderSubgroupPartitionedFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 shaderSubgroupPartitioned; +} VkPhysicalDeviceShaderSubgroupPartitionedFeaturesEXT; + + + +// VK_VALVE_shader_mixed_float_dot_product is a preprocessor guard. Do not pass it to API calls. +#define VK_VALVE_shader_mixed_float_dot_product 1 +#define VK_VALVE_SHADER_MIXED_FLOAT_DOT_PRODUCT_SPEC_VERSION 1 +#define VK_VALVE_SHADER_MIXED_FLOAT_DOT_PRODUCT_EXTENSION_NAME "VK_VALVE_shader_mixed_float_dot_product" +typedef struct VkPhysicalDeviceShaderMixedFloatDotProductFeaturesVALVE { + VkStructureType sType; + void* pNext; + VkBool32 shaderMixedFloatDotProductFloat16AccFloat32; + VkBool32 shaderMixedFloatDotProductFloat16AccFloat16; + VkBool32 shaderMixedFloatDotProductBFloat16Acc; + VkBool32 shaderMixedFloatDotProductFloat8AccFloat32; +} VkPhysicalDeviceShaderMixedFloatDotProductFeaturesVALVE; + + + +// VK_SEC_throttle_hint is a preprocessor guard. Do not pass it to API calls. +#define VK_SEC_throttle_hint 1 +#define VK_SEC_THROTTLE_HINT_SPEC_VERSION 1 +#define VK_SEC_THROTTLE_HINT_EXTENSION_NAME "VK_SEC_throttle_hint" + +typedef enum VkThrottleHintTypeSEC { + VK_THROTTLE_HINT_TYPE_DEFAULT_SEC = 0, + VK_THROTTLE_HINT_TYPE_LOW_SEC = 1, + VK_THROTTLE_HINT_TYPE_HIGH_SEC = 2, + VK_THROTTLE_HINT_TYPE_MAX_ENUM_SEC = 0x7FFFFFFF +} VkThrottleHintTypeSEC; +typedef struct VkThrottleHintSubmitInfoSEC { + VkStructureType sType; + const void* pNext; + VkThrottleHintTypeSEC throttleHint; +} VkThrottleHintSubmitInfoSEC; + +typedef struct VkPhysicalDeviceThrottleHintFeaturesSEC { + VkStructureType sType; + void* pNext; + VkBool32 throttleHint; +} VkPhysicalDeviceThrottleHintFeaturesSEC; + + + +// VK_ARM_data_graph_neural_accelerator_statistics is a preprocessor guard. Do not pass it to API calls. +#define VK_ARM_data_graph_neural_accelerator_statistics 1 +#define VK_ARM_DATA_GRAPH_NEURAL_ACCELERATOR_STATISTICS_SPEC_VERSION 1 +#define VK_ARM_DATA_GRAPH_NEURAL_ACCELERATOR_STATISTICS_EXTENSION_NAME "VK_ARM_data_graph_neural_accelerator_statistics" + +typedef enum VkNeuralAcceleratorStatisticsModeARM { + VK_NEURAL_ACCELERATOR_STATISTICS_MODE_DISABLED_ARM = 0, + VK_NEURAL_ACCELERATOR_STATISTICS_MODE_STATISTICS0_ARM = 1, + VK_NEURAL_ACCELERATOR_STATISTICS_MODE_STATISTICS1_ARM = 2, + VK_NEURAL_ACCELERATOR_STATISTICS_MODE_MAX_ENUM_ARM = 0x7FFFFFFF +} VkNeuralAcceleratorStatisticsModeARM; +typedef struct VkPhysicalDeviceDataGraphNeuralAcceleratorStatisticsFeaturesARM { + VkStructureType sType; + void* pNext; + VkBool32 dataGraphNeuralAcceleratorStatistics; +} VkPhysicalDeviceDataGraphNeuralAcceleratorStatisticsFeaturesARM; + +typedef struct VkDataGraphPipelineNeuralStatisticsCreateInfoARM { + VkStructureType sType; + const void* pNext; + VkBool32 allowNeuralStatistics; +} VkDataGraphPipelineNeuralStatisticsCreateInfoARM; + +typedef struct VkDataGraphPipelineSessionNeuralStatisticsCreateInfoARM { + VkStructureType sType; + const void* pNext; + VkNeuralAcceleratorStatisticsModeARM mode; +} VkDataGraphPipelineSessionNeuralStatisticsCreateInfoARM; + + + +// VK_EXT_primitive_restart_index is a preprocessor guard. Do not pass it to API calls. +#define VK_EXT_primitive_restart_index 1 +#define VK_EXT_PRIMITIVE_RESTART_INDEX_SPEC_VERSION 1 +#define VK_EXT_PRIMITIVE_RESTART_INDEX_EXTENSION_NAME "VK_EXT_primitive_restart_index" +typedef struct VkPhysicalDevicePrimitiveRestartIndexFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 primitiveRestartIndex; +} VkPhysicalDevicePrimitiveRestartIndexFeaturesEXT; + +typedef void (VKAPI_PTR *PFN_vkCmdSetPrimitiveRestartIndexEXT)(VkCommandBuffer commandBuffer, uint32_t primitiveRestartIndex); + +#ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdSetPrimitiveRestartIndexEXT( + VkCommandBuffer commandBuffer, + uint32_t primitiveRestartIndex); +#endif +#endif + + +// VK_NV_cooperative_matrix_decode_vector is a preprocessor guard. Do not pass it to API calls. +#define VK_NV_cooperative_matrix_decode_vector 1 +#define VK_NV_COOPERATIVE_MATRIX_DECODE_VECTOR_SPEC_VERSION 1 +#define VK_NV_COOPERATIVE_MATRIX_DECODE_VECTOR_EXTENSION_NAME "VK_NV_cooperative_matrix_decode_vector" +typedef struct VkPhysicalDeviceCooperativeMatrixDecodeVectorFeaturesNV { + VkStructureType sType; + void* pNext; + VkBool32 cooperativeMatrixDecodeVector; +} VkPhysicalDeviceCooperativeMatrixDecodeVectorFeaturesNV; + + + // VK_KHR_acceleration_structure is a preprocessor guard. Do not pass it to API calls. #define VK_KHR_acceleration_structure 1 #define VK_KHR_ACCELERATION_STRUCTURE_SPEC_VERSION 13 @@ -21382,14 +26407,6 @@ typedef enum VkBuildAccelerationStructureModeKHR { VK_BUILD_ACCELERATION_STRUCTURE_MODE_UPDATE_KHR = 1, VK_BUILD_ACCELERATION_STRUCTURE_MODE_MAX_ENUM_KHR = 0x7FFFFFFF } VkBuildAccelerationStructureModeKHR; - -typedef enum VkAccelerationStructureCreateFlagBitsKHR { - VK_ACCELERATION_STRUCTURE_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR = 0x00000001, - VK_ACCELERATION_STRUCTURE_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT = 0x00000008, - VK_ACCELERATION_STRUCTURE_CREATE_MOTION_BIT_NV = 0x00000004, - VK_ACCELERATION_STRUCTURE_CREATE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF -} VkAccelerationStructureCreateFlagBitsKHR; -typedef VkFlags VkAccelerationStructureCreateFlagsKHR; typedef struct VkAccelerationStructureBuildRangeInfoKHR { uint32_t primitiveCount; uint32_t primitiveOffset; @@ -21546,23 +26563,30 @@ typedef void (VKAPI_PTR *PFN_vkGetDeviceAccelerationStructureCompatibilityKHR)(V typedef void (VKAPI_PTR *PFN_vkGetAccelerationStructureBuildSizesKHR)(VkDevice device, VkAccelerationStructureBuildTypeKHR buildType, const VkAccelerationStructureBuildGeometryInfoKHR* pBuildInfo, const uint32_t* pMaxPrimitiveCounts, VkAccelerationStructureBuildSizesInfoKHR* pSizeInfo); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateAccelerationStructureKHR( VkDevice device, const VkAccelerationStructureCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkAccelerationStructureKHR* pAccelerationStructure); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkDestroyAccelerationStructureKHR( VkDevice device, VkAccelerationStructureKHR accelerationStructure, const VkAllocationCallbacks* pAllocator); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdBuildAccelerationStructuresKHR( VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR* pInfos, const VkAccelerationStructureBuildRangeInfoKHR* const* ppBuildRangeInfos); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdBuildAccelerationStructuresIndirectKHR( VkCommandBuffer commandBuffer, uint32_t infoCount, @@ -21570,29 +26594,39 @@ VKAPI_ATTR void VKAPI_CALL vkCmdBuildAccelerationStructuresIndirectKHR( const VkDeviceAddress* pIndirectDeviceAddresses, const uint32_t* pIndirectStrides, const uint32_t* const* ppMaxPrimitiveCounts); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkBuildAccelerationStructuresKHR( VkDevice device, VkDeferredOperationKHR deferredOperation, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR* pInfos, const VkAccelerationStructureBuildRangeInfoKHR* const* ppBuildRangeInfos); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCopyAccelerationStructureKHR( VkDevice device, VkDeferredOperationKHR deferredOperation, const VkCopyAccelerationStructureInfoKHR* pInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCopyAccelerationStructureToMemoryKHR( VkDevice device, VkDeferredOperationKHR deferredOperation, const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCopyMemoryToAccelerationStructureKHR( VkDevice device, VkDeferredOperationKHR deferredOperation, const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkWriteAccelerationStructuresPropertiesKHR( VkDevice device, uint32_t accelerationStructureCount, @@ -21601,23 +26635,33 @@ VKAPI_ATTR VkResult VKAPI_CALL vkWriteAccelerationStructuresPropertiesKHR( size_t dataSize, void* pData, size_t stride); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdCopyAccelerationStructureKHR( VkCommandBuffer commandBuffer, const VkCopyAccelerationStructureInfoKHR* pInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdCopyAccelerationStructureToMemoryKHR( VkCommandBuffer commandBuffer, const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdCopyMemoryToAccelerationStructureKHR( VkCommandBuffer commandBuffer, const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkDeviceAddress VKAPI_CALL vkGetAccelerationStructureDeviceAddressKHR( VkDevice device, const VkAccelerationStructureDeviceAddressInfoKHR* pInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdWriteAccelerationStructuresPropertiesKHR( VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount, @@ -21625,12 +26669,16 @@ VKAPI_ATTR void VKAPI_CALL vkCmdWriteAccelerationStructuresPropertiesKHR( VkQueryType queryType, VkQueryPool queryPool, uint32_t firstQuery); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetDeviceAccelerationStructureCompatibilityKHR( VkDevice device, const VkAccelerationStructureVersionInfoKHR* pVersionInfo, VkAccelerationStructureCompatibilityKHR* pCompatibility); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkGetAccelerationStructureBuildSizesKHR( VkDevice device, VkAccelerationStructureBuildTypeKHR buildType, @@ -21638,6 +26686,7 @@ VKAPI_ATTR void VKAPI_CALL vkGetAccelerationStructureBuildSizesKHR( const uint32_t* pMaxPrimitiveCounts, VkAccelerationStructureBuildSizesInfoKHR* pSizeInfo); #endif +#endif // VK_KHR_ray_tracing_pipeline is a preprocessor guard. Do not pass it to API calls. @@ -21724,6 +26773,7 @@ typedef VkDeviceSize (VKAPI_PTR *PFN_vkGetRayTracingShaderGroupStackSizeKHR)(VkD typedef void (VKAPI_PTR *PFN_vkCmdSetRayTracingPipelineStackSizeKHR)(VkCommandBuffer commandBuffer, uint32_t pipelineStackSize); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdTraceRaysKHR( VkCommandBuffer commandBuffer, const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable, @@ -21733,7 +26783,9 @@ VKAPI_ATTR void VKAPI_CALL vkCmdTraceRaysKHR( uint32_t width, uint32_t height, uint32_t depth); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateRayTracingPipelinesKHR( VkDevice device, VkDeferredOperationKHR deferredOperation, @@ -21742,7 +26794,9 @@ VKAPI_ATTR VkResult VKAPI_CALL vkCreateRayTracingPipelinesKHR( const VkRayTracingPipelineCreateInfoKHR* pCreateInfos, const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetRayTracingCaptureReplayShaderGroupHandlesKHR( VkDevice device, VkPipeline pipeline, @@ -21750,7 +26804,9 @@ VKAPI_ATTR VkResult VKAPI_CALL vkGetRayTracingCaptureReplayShaderGroupHandlesKHR uint32_t groupCount, size_t dataSize, void* pData); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdTraceRaysIndirectKHR( VkCommandBuffer commandBuffer, const VkStridedDeviceAddressRegionKHR* pRaygenShaderBindingTable, @@ -21758,17 +26814,22 @@ VKAPI_ATTR void VKAPI_CALL vkCmdTraceRaysIndirectKHR( const VkStridedDeviceAddressRegionKHR* pHitShaderBindingTable, const VkStridedDeviceAddressRegionKHR* pCallableShaderBindingTable, VkDeviceAddress indirectDeviceAddress); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkDeviceSize VKAPI_CALL vkGetRayTracingShaderGroupStackSizeKHR( VkDevice device, VkPipeline pipeline, uint32_t group, VkShaderGroupShaderKHR groupShader); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetRayTracingPipelineStackSizeKHR( VkCommandBuffer commandBuffer, uint32_t pipelineStackSize); #endif +#endif // VK_KHR_ray_query is a preprocessor guard. Do not pass it to API calls. @@ -21841,19 +26902,24 @@ typedef void (VKAPI_PTR *PFN_vkCmdDrawMeshTasksIndirectEXT)(VkCommandBuffer comm typedef void (VKAPI_PTR *PFN_vkCmdDrawMeshTasksIndirectCountEXT)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdDrawMeshTasksEXT( VkCommandBuffer commandBuffer, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdDrawMeshTasksIndirectEXT( VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdDrawMeshTasksIndirectCountEXT( VkCommandBuffer commandBuffer, VkBuffer buffer, @@ -21863,6 +26929,7 @@ VKAPI_ATTR void VKAPI_CALL vkCmdDrawMeshTasksIndirectCountEXT( uint32_t maxDrawCount, uint32_t stride); #endif +#endif #ifdef __cplusplus } diff --git a/vendor/vulkan/_gen/vulkan_ios.h b/vendor/vulkan/_gen/vulkan_ios.h index a705dc600..089991a4f 100644 --- a/vendor/vulkan/_gen/vulkan_ios.h +++ b/vendor/vulkan/_gen/vulkan_ios.h @@ -2,7 +2,7 @@ #define VULKAN_IOS_H_ 1 /* -** Copyright 2015-2025 The Khronos Group Inc. +** Copyright 2015-2026 The Khronos Group Inc. ** ** SPDX-License-Identifier: Apache-2.0 */ @@ -34,12 +34,14 @@ typedef struct VkIOSSurfaceCreateInfoMVK { typedef VkResult (VKAPI_PTR *PFN_vkCreateIOSSurfaceMVK)(VkInstance instance, const VkIOSSurfaceCreateInfoMVK* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateIOSSurfaceMVK( VkInstance instance, const VkIOSSurfaceCreateInfoMVK* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); #endif +#endif #ifdef __cplusplus } diff --git a/vendor/vulkan/_gen/vulkan_macos.h b/vendor/vulkan/_gen/vulkan_macos.h index 8d5dd05a7..7d5d8a1b3 100644 --- a/vendor/vulkan/_gen/vulkan_macos.h +++ b/vendor/vulkan/_gen/vulkan_macos.h @@ -2,7 +2,7 @@ #define VULKAN_MACOS_H_ 1 /* -** Copyright 2015-2025 The Khronos Group Inc. +** Copyright 2015-2026 The Khronos Group Inc. ** ** SPDX-License-Identifier: Apache-2.0 */ @@ -34,12 +34,14 @@ typedef struct VkMacOSSurfaceCreateInfoMVK { typedef VkResult (VKAPI_PTR *PFN_vkCreateMacOSSurfaceMVK)(VkInstance instance, const VkMacOSSurfaceCreateInfoMVK* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateMacOSSurfaceMVK( VkInstance instance, const VkMacOSSurfaceCreateInfoMVK* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); #endif +#endif #ifdef __cplusplus } diff --git a/vendor/vulkan/_gen/vulkan_metal.h b/vendor/vulkan/_gen/vulkan_metal.h index 7e44f54cb..501c36388 100644 --- a/vendor/vulkan/_gen/vulkan_metal.h +++ b/vendor/vulkan/_gen/vulkan_metal.h @@ -2,7 +2,7 @@ #define VULKAN_METAL_H_ 1 /* -** Copyright 2015-2025 The Khronos Group Inc. +** Copyright 2015-2026 The Khronos Group Inc. ** ** SPDX-License-Identifier: Apache-2.0 */ @@ -40,12 +40,14 @@ typedef struct VkMetalSurfaceCreateInfoEXT { typedef VkResult (VKAPI_PTR *PFN_vkCreateMetalSurfaceEXT)(VkInstance instance, const VkMetalSurfaceCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateMetalSurfaceEXT( VkInstance instance, const VkMetalSurfaceCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); #endif +#endif // VK_EXT_metal_objects is a preprocessor guard. Do not pass it to API calls. @@ -183,10 +185,12 @@ typedef struct VkImportMetalSharedEventInfoEXT { typedef void (VKAPI_PTR *PFN_vkExportMetalObjectsEXT)(VkDevice device, VkExportMetalObjectsInfoEXT* pMetalObjectsInfo); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkExportMetalObjectsEXT( VkDevice device, VkExportMetalObjectsInfoEXT* pMetalObjectsInfo); #endif +#endif // VK_EXT_external_memory_metal is a preprocessor guard. Do not pass it to API calls. @@ -217,17 +221,21 @@ typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryMetalHandleEXT)(VkDevice device, con typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryMetalHandlePropertiesEXT)(VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, const void* pHandle, VkMemoryMetalHandlePropertiesEXT* pMemoryMetalHandleProperties); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryMetalHandleEXT( VkDevice device, const VkMemoryGetMetalHandleInfoEXT* pGetMetalHandleInfo, void** pHandle); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryMetalHandlePropertiesEXT( VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, const void* pHandle, VkMemoryMetalHandlePropertiesEXT* pMemoryMetalHandleProperties); #endif +#endif #ifdef __cplusplus } diff --git a/vendor/vulkan/_gen/vulkan_video_codec_av1std.h b/vendor/vulkan/_gen/vulkan_video_codec_av1std.h index 347e0d2ae..75cebd74c 100644 --- a/vendor/vulkan/_gen/vulkan_video_codec_av1std.h +++ b/vendor/vulkan/_gen/vulkan_video_codec_av1std.h @@ -2,7 +2,7 @@ #define VULKAN_VIDEO_CODEC_AV1STD_H_ 1 /* -** Copyright 2015-2025 The Khronos Group Inc. +** Copyright 2015-2026 The Khronos Group Inc. ** ** SPDX-License-Identifier: Apache-2.0 */ @@ -22,27 +22,27 @@ extern "C" { // vulkan_video_codec_av1std is a preprocessor guard. Do not pass it to API calls. #define vulkan_video_codec_av1std 1 #include "vulkan_video_codecs_common.h" -#define STD_VIDEO_AV1_NUM_REF_FRAMES 8 -#define STD_VIDEO_AV1_REFS_PER_FRAME 7 -#define STD_VIDEO_AV1_TOTAL_REFS_PER_FRAME 8 -#define STD_VIDEO_AV1_MAX_TILE_COLS 64 -#define STD_VIDEO_AV1_MAX_TILE_ROWS 64 -#define STD_VIDEO_AV1_MAX_SEGMENTS 8 -#define STD_VIDEO_AV1_SEG_LVL_MAX 8 -#define STD_VIDEO_AV1_PRIMARY_REF_NONE 7 -#define STD_VIDEO_AV1_SELECT_INTEGER_MV 2 -#define STD_VIDEO_AV1_SELECT_SCREEN_CONTENT_TOOLS 2 -#define STD_VIDEO_AV1_SKIP_MODE_FRAMES 2 -#define STD_VIDEO_AV1_MAX_LOOP_FILTER_STRENGTHS 4 -#define STD_VIDEO_AV1_LOOP_FILTER_ADJUSTMENTS 2 -#define STD_VIDEO_AV1_MAX_CDEF_FILTER_STRENGTHS 8 -#define STD_VIDEO_AV1_MAX_NUM_PLANES 3 -#define STD_VIDEO_AV1_GLOBAL_MOTION_PARAMS 6 -#define STD_VIDEO_AV1_MAX_NUM_Y_POINTS 14 -#define STD_VIDEO_AV1_MAX_NUM_CB_POINTS 10 -#define STD_VIDEO_AV1_MAX_NUM_CR_POINTS 10 -#define STD_VIDEO_AV1_MAX_NUM_POS_LUMA 24 -#define STD_VIDEO_AV1_MAX_NUM_POS_CHROMA 25 +#define STD_VIDEO_AV1_NUM_REF_FRAMES 8U +#define STD_VIDEO_AV1_REFS_PER_FRAME 7U +#define STD_VIDEO_AV1_TOTAL_REFS_PER_FRAME 8U +#define STD_VIDEO_AV1_MAX_TILE_COLS 64U +#define STD_VIDEO_AV1_MAX_TILE_ROWS 64U +#define STD_VIDEO_AV1_MAX_SEGMENTS 8U +#define STD_VIDEO_AV1_SEG_LVL_MAX 8U +#define STD_VIDEO_AV1_PRIMARY_REF_NONE 7U +#define STD_VIDEO_AV1_SELECT_INTEGER_MV 2U +#define STD_VIDEO_AV1_SELECT_SCREEN_CONTENT_TOOLS 2U +#define STD_VIDEO_AV1_SKIP_MODE_FRAMES 2U +#define STD_VIDEO_AV1_MAX_LOOP_FILTER_STRENGTHS 4U +#define STD_VIDEO_AV1_LOOP_FILTER_ADJUSTMENTS 2U +#define STD_VIDEO_AV1_MAX_CDEF_FILTER_STRENGTHS 8U +#define STD_VIDEO_AV1_MAX_NUM_PLANES 3U +#define STD_VIDEO_AV1_GLOBAL_MOTION_PARAMS 6U +#define STD_VIDEO_AV1_MAX_NUM_Y_POINTS 14U +#define STD_VIDEO_AV1_MAX_NUM_CB_POINTS 10U +#define STD_VIDEO_AV1_MAX_NUM_CR_POINTS 10U +#define STD_VIDEO_AV1_MAX_NUM_POS_LUMA 24U +#define STD_VIDEO_AV1_MAX_NUM_POS_CHROMA 25U typedef enum StdVideoAV1Profile { STD_VIDEO_AV1_PROFILE_MAIN = 0, @@ -144,7 +144,7 @@ typedef enum StdVideoAV1ColorPrimaries { STD_VIDEO_AV1_COLOR_PRIMARIES_SMPTE_432 = 12, STD_VIDEO_AV1_COLOR_PRIMARIES_EBU_3213 = 22, STD_VIDEO_AV1_COLOR_PRIMARIES_INVALID = 0x7FFFFFFF, - // STD_VIDEO_AV1_COLOR_PRIMARIES_BT_UNSPECIFIED is a deprecated alias + // STD_VIDEO_AV1_COLOR_PRIMARIES_BT_UNSPECIFIED is a legacy alias STD_VIDEO_AV1_COLOR_PRIMARIES_BT_UNSPECIFIED = STD_VIDEO_AV1_COLOR_PRIMARIES_UNSPECIFIED, STD_VIDEO_AV1_COLOR_PRIMARIES_MAX_ENUM = 0x7FFFFFFF } StdVideoAV1ColorPrimaries; diff --git a/vendor/vulkan/_gen/vulkan_video_codec_av1std_decode.h b/vendor/vulkan/_gen/vulkan_video_codec_av1std_decode.h index 522628e86..60bf2c039 100644 --- a/vendor/vulkan/_gen/vulkan_video_codec_av1std_decode.h +++ b/vendor/vulkan/_gen/vulkan_video_codec_av1std_decode.h @@ -2,7 +2,7 @@ #define VULKAN_VIDEO_CODEC_AV1STD_DECODE_H_ 1 /* -** Copyright 2015-2025 The Khronos Group Inc. +** Copyright 2015-2026 The Khronos Group Inc. ** ** SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/vulkan/_gen/vulkan_video_codec_av1std_encode.h b/vendor/vulkan/_gen/vulkan_video_codec_av1std_encode.h index ca5f6f474..3602fe125 100644 --- a/vendor/vulkan/_gen/vulkan_video_codec_av1std_encode.h +++ b/vendor/vulkan/_gen/vulkan_video_codec_av1std_encode.h @@ -2,7 +2,7 @@ #define VULKAN_VIDEO_CODEC_AV1STD_ENCODE_H_ 1 /* -** Copyright 2015-2025 The Khronos Group Inc. +** Copyright 2015-2026 The Khronos Group Inc. ** ** SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/vulkan/_gen/vulkan_video_codec_h264std.h b/vendor/vulkan/_gen/vulkan_video_codec_h264std.h index 6fd381066..48621b695 100644 --- a/vendor/vulkan/_gen/vulkan_video_codec_h264std.h +++ b/vendor/vulkan/_gen/vulkan_video_codec_h264std.h @@ -2,7 +2,7 @@ #define VULKAN_VIDEO_CODEC_H264STD_H_ 1 /* -** Copyright 2015-2025 The Khronos Group Inc. +** Copyright 2015-2026 The Khronos Group Inc. ** ** SPDX-License-Identifier: Apache-2.0 */ @@ -22,14 +22,14 @@ extern "C" { // vulkan_video_codec_h264std is a preprocessor guard. Do not pass it to API calls. #define vulkan_video_codec_h264std 1 #include "vulkan_video_codecs_common.h" -#define STD_VIDEO_H264_CPB_CNT_LIST_SIZE 32 -#define STD_VIDEO_H264_SCALING_LIST_4X4_NUM_LISTS 6 -#define STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS 16 -#define STD_VIDEO_H264_SCALING_LIST_8X8_NUM_LISTS 6 -#define STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS 64 -#define STD_VIDEO_H264_MAX_NUM_LIST_REF 32 -#define STD_VIDEO_H264_MAX_CHROMA_PLANES 2 -#define STD_VIDEO_H264_NO_REFERENCE_PICTURE 0xFF +#define STD_VIDEO_H264_CPB_CNT_LIST_SIZE 32U +#define STD_VIDEO_H264_SCALING_LIST_4X4_NUM_LISTS 6U +#define STD_VIDEO_H264_SCALING_LIST_4X4_NUM_ELEMENTS 16U +#define STD_VIDEO_H264_SCALING_LIST_8X8_NUM_LISTS 6U +#define STD_VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS 64U +#define STD_VIDEO_H264_MAX_NUM_LIST_REF 32U +#define STD_VIDEO_H264_MAX_CHROMA_PLANES 2U +#define STD_VIDEO_H264_NO_REFERENCE_PICTURE 0xFFU typedef enum StdVideoH264ChromaFormatIdc { STD_VIDEO_H264_CHROMA_FORMAT_IDC_MONOCHROME = 0, diff --git a/vendor/vulkan/_gen/vulkan_video_codec_h264std_decode.h b/vendor/vulkan/_gen/vulkan_video_codec_h264std_decode.h index d6a90b498..a6bfe9d82 100644 --- a/vendor/vulkan/_gen/vulkan_video_codec_h264std_decode.h +++ b/vendor/vulkan/_gen/vulkan_video_codec_h264std_decode.h @@ -2,7 +2,7 @@ #define VULKAN_VIDEO_CODEC_H264STD_DECODE_H_ 1 /* -** Copyright 2015-2025 The Khronos Group Inc. +** Copyright 2015-2026 The Khronos Group Inc. ** ** SPDX-License-Identifier: Apache-2.0 */ @@ -27,7 +27,7 @@ extern "C" { #define VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_API_VERSION_1_0_0 #define VK_STD_VULKAN_VIDEO_CODEC_H264_DECODE_EXTENSION_NAME "VK_STD_vulkan_video_codec_h264_decode" -#define STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_LIST_SIZE 2 +#define STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_LIST_SIZE 2U typedef enum StdVideoDecodeH264FieldOrderCount { STD_VIDEO_DECODE_H264_FIELD_ORDER_COUNT_TOP = 0, diff --git a/vendor/vulkan/_gen/vulkan_video_codec_h264std_encode.h b/vendor/vulkan/_gen/vulkan_video_codec_h264std_encode.h index 410b1b254..2d42ac321 100644 --- a/vendor/vulkan/_gen/vulkan_video_codec_h264std_encode.h +++ b/vendor/vulkan/_gen/vulkan_video_codec_h264std_encode.h @@ -2,7 +2,7 @@ #define VULKAN_VIDEO_CODEC_H264STD_ENCODE_H_ 1 /* -** Copyright 2015-2025 The Khronos Group Inc. +** Copyright 2015-2026 The Khronos Group Inc. ** ** SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/vulkan/_gen/vulkan_video_codec_h265std.h b/vendor/vulkan/_gen/vulkan_video_codec_h265std.h index 3eecd6011..23617b8f9 100644 --- a/vendor/vulkan/_gen/vulkan_video_codec_h265std.h +++ b/vendor/vulkan/_gen/vulkan_video_codec_h265std.h @@ -2,7 +2,7 @@ #define VULKAN_VIDEO_CODEC_H265STD_H_ 1 /* -** Copyright 2015-2025 The Khronos Group Inc. +** Copyright 2015-2026 The Khronos Group Inc. ** ** SPDX-License-Identifier: Apache-2.0 */ @@ -22,29 +22,29 @@ extern "C" { // vulkan_video_codec_h265std is a preprocessor guard. Do not pass it to API calls. #define vulkan_video_codec_h265std 1 #include "vulkan_video_codecs_common.h" -#define STD_VIDEO_H265_CPB_CNT_LIST_SIZE 32 -#define STD_VIDEO_H265_SUBLAYERS_LIST_SIZE 7 -#define STD_VIDEO_H265_SCALING_LIST_4X4_NUM_LISTS 6 -#define STD_VIDEO_H265_SCALING_LIST_4X4_NUM_ELEMENTS 16 -#define STD_VIDEO_H265_SCALING_LIST_8X8_NUM_LISTS 6 -#define STD_VIDEO_H265_SCALING_LIST_8X8_NUM_ELEMENTS 64 -#define STD_VIDEO_H265_SCALING_LIST_16X16_NUM_LISTS 6 -#define STD_VIDEO_H265_SCALING_LIST_16X16_NUM_ELEMENTS 64 -#define STD_VIDEO_H265_SCALING_LIST_32X32_NUM_LISTS 2 -#define STD_VIDEO_H265_SCALING_LIST_32X32_NUM_ELEMENTS 64 -#define STD_VIDEO_H265_CHROMA_QP_OFFSET_LIST_SIZE 6 -#define STD_VIDEO_H265_CHROMA_QP_OFFSET_TILE_COLS_LIST_SIZE 19 -#define STD_VIDEO_H265_CHROMA_QP_OFFSET_TILE_ROWS_LIST_SIZE 21 -#define STD_VIDEO_H265_PREDICTOR_PALETTE_COMPONENTS_LIST_SIZE 3 -#define STD_VIDEO_H265_PREDICTOR_PALETTE_COMP_ENTRIES_LIST_SIZE 128 -#define STD_VIDEO_H265_MAX_NUM_LIST_REF 15 -#define STD_VIDEO_H265_MAX_CHROMA_PLANES 2 -#define STD_VIDEO_H265_MAX_SHORT_TERM_REF_PIC_SETS 64 -#define STD_VIDEO_H265_MAX_DPB_SIZE 16 -#define STD_VIDEO_H265_MAX_LONG_TERM_REF_PICS_SPS 32 -#define STD_VIDEO_H265_MAX_LONG_TERM_PICS 16 -#define STD_VIDEO_H265_MAX_DELTA_POC 48 -#define STD_VIDEO_H265_NO_REFERENCE_PICTURE 0xFF +#define STD_VIDEO_H265_CPB_CNT_LIST_SIZE 32U +#define STD_VIDEO_H265_SUBLAYERS_LIST_SIZE 7U +#define STD_VIDEO_H265_SCALING_LIST_4X4_NUM_LISTS 6U +#define STD_VIDEO_H265_SCALING_LIST_4X4_NUM_ELEMENTS 16U +#define STD_VIDEO_H265_SCALING_LIST_8X8_NUM_LISTS 6U +#define STD_VIDEO_H265_SCALING_LIST_8X8_NUM_ELEMENTS 64U +#define STD_VIDEO_H265_SCALING_LIST_16X16_NUM_LISTS 6U +#define STD_VIDEO_H265_SCALING_LIST_16X16_NUM_ELEMENTS 64U +#define STD_VIDEO_H265_SCALING_LIST_32X32_NUM_LISTS 2U +#define STD_VIDEO_H265_SCALING_LIST_32X32_NUM_ELEMENTS 64U +#define STD_VIDEO_H265_CHROMA_QP_OFFSET_LIST_SIZE 6U +#define STD_VIDEO_H265_CHROMA_QP_OFFSET_TILE_COLS_LIST_SIZE 19U +#define STD_VIDEO_H265_CHROMA_QP_OFFSET_TILE_ROWS_LIST_SIZE 21U +#define STD_VIDEO_H265_PREDICTOR_PALETTE_COMPONENTS_LIST_SIZE 3U +#define STD_VIDEO_H265_PREDICTOR_PALETTE_COMP_ENTRIES_LIST_SIZE 128U +#define STD_VIDEO_H265_MAX_NUM_LIST_REF 15U +#define STD_VIDEO_H265_MAX_CHROMA_PLANES 2U +#define STD_VIDEO_H265_MAX_SHORT_TERM_REF_PIC_SETS 64U +#define STD_VIDEO_H265_MAX_DPB_SIZE 16U +#define STD_VIDEO_H265_MAX_LONG_TERM_REF_PICS_SPS 32U +#define STD_VIDEO_H265_MAX_LONG_TERM_PICS 16U +#define STD_VIDEO_H265_MAX_DELTA_POC 48U +#define STD_VIDEO_H265_NO_REFERENCE_PICTURE 0xFFU typedef enum StdVideoH265ChromaFormatIdc { STD_VIDEO_H265_CHROMA_FORMAT_IDC_MONOCHROME = 0, diff --git a/vendor/vulkan/_gen/vulkan_video_codec_h265std_decode.h b/vendor/vulkan/_gen/vulkan_video_codec_h265std_decode.h index a9e1a0964..1758d4a88 100644 --- a/vendor/vulkan/_gen/vulkan_video_codec_h265std_decode.h +++ b/vendor/vulkan/_gen/vulkan_video_codec_h265std_decode.h @@ -2,7 +2,7 @@ #define VULKAN_VIDEO_CODEC_H265STD_DECODE_H_ 1 /* -** Copyright 2015-2025 The Khronos Group Inc. +** Copyright 2015-2026 The Khronos Group Inc. ** ** SPDX-License-Identifier: Apache-2.0 */ @@ -27,7 +27,7 @@ extern "C" { #define VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_API_VERSION_1_0_0 #define VK_STD_VULKAN_VIDEO_CODEC_H265_DECODE_EXTENSION_NAME "VK_STD_vulkan_video_codec_h265_decode" -#define STD_VIDEO_DECODE_H265_REF_PIC_SET_LIST_SIZE 8 +#define STD_VIDEO_DECODE_H265_REF_PIC_SET_LIST_SIZE 8U typedef struct StdVideoDecodeH265PictureInfoFlags { uint32_t IrapPicFlag : 1; uint32_t IdrPicFlag : 1; diff --git a/vendor/vulkan/_gen/vulkan_video_codec_h265std_encode.h b/vendor/vulkan/_gen/vulkan_video_codec_h265std_encode.h index fe2f28d57..e584a7262 100644 --- a/vendor/vulkan/_gen/vulkan_video_codec_h265std_encode.h +++ b/vendor/vulkan/_gen/vulkan_video_codec_h265std_encode.h @@ -2,7 +2,7 @@ #define VULKAN_VIDEO_CODEC_H265STD_ENCODE_H_ 1 /* -** Copyright 2015-2025 The Khronos Group Inc. +** Copyright 2015-2026 The Khronos Group Inc. ** ** SPDX-License-Identifier: Apache-2.0 */ diff --git a/vendor/vulkan/_gen/vulkan_video_codec_vp9std.h b/vendor/vulkan/_gen/vulkan_video_codec_vp9std.h new file mode 100644 index 000000000..3c62f287e --- /dev/null +++ b/vendor/vulkan/_gen/vulkan_video_codec_vp9std.h @@ -0,0 +1,151 @@ +#ifndef VULKAN_VIDEO_CODEC_VP9STD_H_ +#define VULKAN_VIDEO_CODEC_VP9STD_H_ 1 + +/* +** Copyright 2015-2026 The Khronos Group Inc. +** +** SPDX-License-Identifier: Apache-2.0 +*/ + +/* +** This header is generated from the Khronos Vulkan XML API Registry. +** +*/ + + +#ifdef __cplusplus +extern "C" { +#endif + + + +// vulkan_video_codec_vp9std is a preprocessor guard. Do not pass it to API calls. +#define vulkan_video_codec_vp9std 1 +#include "vulkan_video_codecs_common.h" +#define STD_VIDEO_VP9_NUM_REF_FRAMES 8U +#define STD_VIDEO_VP9_REFS_PER_FRAME 3U +#define STD_VIDEO_VP9_MAX_REF_FRAMES 4U +#define STD_VIDEO_VP9_LOOP_FILTER_ADJUSTMENTS 2U +#define STD_VIDEO_VP9_MAX_SEGMENTS 8U +#define STD_VIDEO_VP9_SEG_LVL_MAX 4U +#define STD_VIDEO_VP9_MAX_SEGMENTATION_TREE_PROBS 7U +#define STD_VIDEO_VP9_MAX_SEGMENTATION_PRED_PROB 3U + +typedef enum StdVideoVP9Profile { + STD_VIDEO_VP9_PROFILE_0 = 0, + STD_VIDEO_VP9_PROFILE_1 = 1, + STD_VIDEO_VP9_PROFILE_2 = 2, + STD_VIDEO_VP9_PROFILE_3 = 3, + STD_VIDEO_VP9_PROFILE_INVALID = 0x7FFFFFFF, + STD_VIDEO_VP9_PROFILE_MAX_ENUM = 0x7FFFFFFF +} StdVideoVP9Profile; + +typedef enum StdVideoVP9Level { + STD_VIDEO_VP9_LEVEL_1_0 = 0, + STD_VIDEO_VP9_LEVEL_1_1 = 1, + STD_VIDEO_VP9_LEVEL_2_0 = 2, + STD_VIDEO_VP9_LEVEL_2_1 = 3, + STD_VIDEO_VP9_LEVEL_3_0 = 4, + STD_VIDEO_VP9_LEVEL_3_1 = 5, + STD_VIDEO_VP9_LEVEL_4_0 = 6, + STD_VIDEO_VP9_LEVEL_4_1 = 7, + STD_VIDEO_VP9_LEVEL_5_0 = 8, + STD_VIDEO_VP9_LEVEL_5_1 = 9, + STD_VIDEO_VP9_LEVEL_5_2 = 10, + STD_VIDEO_VP9_LEVEL_6_0 = 11, + STD_VIDEO_VP9_LEVEL_6_1 = 12, + STD_VIDEO_VP9_LEVEL_6_2 = 13, + STD_VIDEO_VP9_LEVEL_INVALID = 0x7FFFFFFF, + STD_VIDEO_VP9_LEVEL_MAX_ENUM = 0x7FFFFFFF +} StdVideoVP9Level; + +typedef enum StdVideoVP9FrameType { + STD_VIDEO_VP9_FRAME_TYPE_KEY = 0, + STD_VIDEO_VP9_FRAME_TYPE_NON_KEY = 1, + STD_VIDEO_VP9_FRAME_TYPE_INVALID = 0x7FFFFFFF, + STD_VIDEO_VP9_FRAME_TYPE_MAX_ENUM = 0x7FFFFFFF +} StdVideoVP9FrameType; + +typedef enum StdVideoVP9ReferenceName { + STD_VIDEO_VP9_REFERENCE_NAME_INTRA_FRAME = 0, + STD_VIDEO_VP9_REFERENCE_NAME_LAST_FRAME = 1, + STD_VIDEO_VP9_REFERENCE_NAME_GOLDEN_FRAME = 2, + STD_VIDEO_VP9_REFERENCE_NAME_ALTREF_FRAME = 3, + STD_VIDEO_VP9_REFERENCE_NAME_INVALID = 0x7FFFFFFF, + STD_VIDEO_VP9_REFERENCE_NAME_MAX_ENUM = 0x7FFFFFFF +} StdVideoVP9ReferenceName; + +typedef enum StdVideoVP9InterpolationFilter { + STD_VIDEO_VP9_INTERPOLATION_FILTER_EIGHTTAP = 0, + STD_VIDEO_VP9_INTERPOLATION_FILTER_EIGHTTAP_SMOOTH = 1, + STD_VIDEO_VP9_INTERPOLATION_FILTER_EIGHTTAP_SHARP = 2, + STD_VIDEO_VP9_INTERPOLATION_FILTER_BILINEAR = 3, + STD_VIDEO_VP9_INTERPOLATION_FILTER_SWITCHABLE = 4, + STD_VIDEO_VP9_INTERPOLATION_FILTER_INVALID = 0x7FFFFFFF, + STD_VIDEO_VP9_INTERPOLATION_FILTER_MAX_ENUM = 0x7FFFFFFF +} StdVideoVP9InterpolationFilter; + +typedef enum StdVideoVP9ColorSpace { + STD_VIDEO_VP9_COLOR_SPACE_UNKNOWN = 0, + STD_VIDEO_VP9_COLOR_SPACE_BT_601 = 1, + STD_VIDEO_VP9_COLOR_SPACE_BT_709 = 2, + STD_VIDEO_VP9_COLOR_SPACE_SMPTE_170 = 3, + STD_VIDEO_VP9_COLOR_SPACE_SMPTE_240 = 4, + STD_VIDEO_VP9_COLOR_SPACE_BT_2020 = 5, + STD_VIDEO_VP9_COLOR_SPACE_RESERVED = 6, + STD_VIDEO_VP9_COLOR_SPACE_RGB = 7, + STD_VIDEO_VP9_COLOR_SPACE_INVALID = 0x7FFFFFFF, + STD_VIDEO_VP9_COLOR_SPACE_MAX_ENUM = 0x7FFFFFFF +} StdVideoVP9ColorSpace; +typedef struct StdVideoVP9ColorConfigFlags { + uint32_t color_range : 1; + uint32_t reserved : 31; +} StdVideoVP9ColorConfigFlags; + +typedef struct StdVideoVP9ColorConfig { + StdVideoVP9ColorConfigFlags flags; + uint8_t BitDepth; + uint8_t subsampling_x; + uint8_t subsampling_y; + uint8_t reserved1; + StdVideoVP9ColorSpace color_space; +} StdVideoVP9ColorConfig; + +typedef struct StdVideoVP9LoopFilterFlags { + uint32_t loop_filter_delta_enabled : 1; + uint32_t loop_filter_delta_update : 1; + uint32_t reserved : 30; +} StdVideoVP9LoopFilterFlags; + +typedef struct StdVideoVP9LoopFilter { + StdVideoVP9LoopFilterFlags flags; + uint8_t loop_filter_level; + uint8_t loop_filter_sharpness; + uint8_t update_ref_delta; + int8_t loop_filter_ref_deltas[STD_VIDEO_VP9_MAX_REF_FRAMES]; + uint8_t update_mode_delta; + int8_t loop_filter_mode_deltas[STD_VIDEO_VP9_LOOP_FILTER_ADJUSTMENTS]; +} StdVideoVP9LoopFilter; + +typedef struct StdVideoVP9SegmentationFlags { + uint32_t segmentation_update_map : 1; + uint32_t segmentation_temporal_update : 1; + uint32_t segmentation_update_data : 1; + uint32_t segmentation_abs_or_delta_update : 1; + uint32_t reserved : 28; +} StdVideoVP9SegmentationFlags; + +typedef struct StdVideoVP9Segmentation { + StdVideoVP9SegmentationFlags flags; + uint8_t segmentation_tree_probs[STD_VIDEO_VP9_MAX_SEGMENTATION_TREE_PROBS]; + uint8_t segmentation_pred_prob[STD_VIDEO_VP9_MAX_SEGMENTATION_PRED_PROB]; + uint8_t FeatureEnabled[STD_VIDEO_VP9_MAX_SEGMENTS]; + int16_t FeatureData[STD_VIDEO_VP9_MAX_SEGMENTS][STD_VIDEO_VP9_SEG_LVL_MAX]; +} StdVideoVP9Segmentation; + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/vulkan/_gen/vulkan_video_codec_vp9std_decode.h b/vendor/vulkan/_gen/vulkan_video_codec_vp9std_decode.h new file mode 100644 index 000000000..ac7fa7be8 --- /dev/null +++ b/vendor/vulkan/_gen/vulkan_video_codec_vp9std_decode.h @@ -0,0 +1,68 @@ +#ifndef VULKAN_VIDEO_CODEC_VP9STD_DECODE_H_ +#define VULKAN_VIDEO_CODEC_VP9STD_DECODE_H_ 1 + +/* +** Copyright 2015-2026 The Khronos Group Inc. +** +** SPDX-License-Identifier: Apache-2.0 +*/ + +/* +** This header is generated from the Khronos Vulkan XML API Registry. +** +*/ + + +#ifdef __cplusplus +extern "C" { +#endif + + + +// vulkan_video_codec_vp9std_decode is a preprocessor guard. Do not pass it to API calls. +#define vulkan_video_codec_vp9std_decode 1 +#include "vulkan_video_codec_vp9std.h" + +#define VK_STD_VULKAN_VIDEO_CODEC_VP9_DECODE_API_VERSION_1_0_0 VK_MAKE_VIDEO_STD_VERSION(1, 0, 0) + +#define VK_STD_VULKAN_VIDEO_CODEC_VP9_DECODE_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_VP9_DECODE_API_VERSION_1_0_0 +#define VK_STD_VULKAN_VIDEO_CODEC_VP9_DECODE_EXTENSION_NAME "VK_STD_vulkan_video_codec_vp9_decode" +typedef struct StdVideoDecodeVP9PictureInfoFlags { + uint32_t error_resilient_mode : 1; + uint32_t intra_only : 1; + uint32_t allow_high_precision_mv : 1; + uint32_t refresh_frame_context : 1; + uint32_t frame_parallel_decoding_mode : 1; + uint32_t segmentation_enabled : 1; + uint32_t show_frame : 1; + uint32_t UsePrevFrameMvs : 1; + uint32_t reserved : 24; +} StdVideoDecodeVP9PictureInfoFlags; + +typedef struct StdVideoDecodeVP9PictureInfo { + StdVideoDecodeVP9PictureInfoFlags flags; + StdVideoVP9Profile profile; + StdVideoVP9FrameType frame_type; + uint8_t frame_context_idx; + uint8_t reset_frame_context; + uint8_t refresh_frame_flags; + uint8_t ref_frame_sign_bias_mask; + StdVideoVP9InterpolationFilter interpolation_filter; + uint8_t base_q_idx; + int8_t delta_q_y_dc; + int8_t delta_q_uv_dc; + int8_t delta_q_uv_ac; + uint8_t tile_cols_log2; + uint8_t tile_rows_log2; + uint16_t reserved1[3]; + const StdVideoVP9ColorConfig* pColorConfig; + const StdVideoVP9LoopFilter* pLoopFilter; + const StdVideoVP9Segmentation* pSegmentation; +} StdVideoDecodeVP9PictureInfo; + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/vulkan/_gen/vulkan_wayland.h b/vendor/vulkan/_gen/vulkan_wayland.h index 5a2dcb5f0..41025db43 100644 --- a/vendor/vulkan/_gen/vulkan_wayland.h +++ b/vendor/vulkan/_gen/vulkan_wayland.h @@ -1,55 +1,59 @@ -#ifndef VULKAN_WAYLAND_H_ -#define VULKAN_WAYLAND_H_ 1 - -/* -** Copyright 2015-2025 The Khronos Group Inc. -** -** SPDX-License-Identifier: Apache-2.0 -*/ - -/* -** This header is generated from the Khronos Vulkan XML API Registry. -** -*/ - - -#ifdef __cplusplus -extern "C" { -#endif - - - -// VK_KHR_wayland_surface is a preprocessor guard. Do not pass it to API calls. -#define VK_KHR_wayland_surface 1 -#define VK_KHR_WAYLAND_SURFACE_SPEC_VERSION 6 -#define VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME "VK_KHR_wayland_surface" -typedef VkFlags VkWaylandSurfaceCreateFlagsKHR; -typedef struct VkWaylandSurfaceCreateInfoKHR { - VkStructureType sType; - const void* pNext; - VkWaylandSurfaceCreateFlagsKHR flags; - struct wl_display* display; - struct wl_surface* surface; -} VkWaylandSurfaceCreateInfoKHR; - -typedef VkResult (VKAPI_PTR *PFN_vkCreateWaylandSurfaceKHR)(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); -typedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, struct wl_display* display); - -#ifndef VK_NO_PROTOTYPES -VKAPI_ATTR VkResult VKAPI_CALL vkCreateWaylandSurfaceKHR( - VkInstance instance, - const VkWaylandSurfaceCreateInfoKHR* pCreateInfo, - const VkAllocationCallbacks* pAllocator, - VkSurfaceKHR* pSurface); - -VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceWaylandPresentationSupportKHR( - VkPhysicalDevice physicalDevice, - uint32_t queueFamilyIndex, - struct wl_display* display); -#endif - -#ifdef __cplusplus -} -#endif - -#endif +#ifndef VULKAN_WAYLAND_H_ +#define VULKAN_WAYLAND_H_ 1 + +/* +** Copyright 2015-2026 The Khronos Group Inc. +** +** SPDX-License-Identifier: Apache-2.0 +*/ + +/* +** This header is generated from the Khronos Vulkan XML API Registry. +** +*/ + + +#ifdef __cplusplus +extern "C" { +#endif + + + +// VK_KHR_wayland_surface is a preprocessor guard. Do not pass it to API calls. +#define VK_KHR_wayland_surface 1 +#define VK_KHR_WAYLAND_SURFACE_SPEC_VERSION 6 +#define VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME "VK_KHR_wayland_surface" +typedef VkFlags VkWaylandSurfaceCreateFlagsKHR; +typedef struct VkWaylandSurfaceCreateInfoKHR { + VkStructureType sType; + const void* pNext; + VkWaylandSurfaceCreateFlagsKHR flags; + struct wl_display* display; + struct wl_surface* surface; +} VkWaylandSurfaceCreateInfoKHR; + +typedef VkResult (VKAPI_PTR *PFN_vkCreateWaylandSurfaceKHR)(VkInstance instance, const VkWaylandSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); +typedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, struct wl_display* display); + +#ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateWaylandSurfaceKHR( + VkInstance instance, + const VkWaylandSurfaceCreateInfoKHR* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkSurfaceKHR* pSurface); +#endif + +#ifndef VK_ONLY_EXPORTED_PROTOTYPES +VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceWaylandPresentationSupportKHR( + VkPhysicalDevice physicalDevice, + uint32_t queueFamilyIndex, + struct wl_display* display); +#endif +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/vulkan/_gen/vulkan_win32.h b/vendor/vulkan/_gen/vulkan_win32.h index e66ed1fcd..5c7e8bd6d 100644 --- a/vendor/vulkan/_gen/vulkan_win32.h +++ b/vendor/vulkan/_gen/vulkan_win32.h @@ -2,7 +2,7 @@ #define VULKAN_WIN32_H_ 1 /* -** Copyright 2015-2025 The Khronos Group Inc. +** Copyright 2015-2026 The Khronos Group Inc. ** ** SPDX-License-Identifier: Apache-2.0 */ @@ -36,16 +36,20 @@ typedef VkResult (VKAPI_PTR *PFN_vkCreateWin32SurfaceKHR)(VkInstance instance, c typedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateWin32SurfaceKHR( VkInstance instance, const VkWin32SurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceWin32PresentationSupportKHR( VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex); #endif +#endif // VK_KHR_external_memory_win32 is a preprocessor guard. Do not pass it to API calls. @@ -85,17 +89,21 @@ typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryWin32HandleKHR)(VkDevice device, con typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryWin32HandlePropertiesKHR)(VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, HANDLE handle, VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryWin32HandleKHR( VkDevice device, const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo, HANDLE* pHandle); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryWin32HandlePropertiesKHR( VkDevice device, VkExternalMemoryHandleTypeFlagBits handleType, HANDLE handle, VkMemoryWin32HandlePropertiesKHR* pMemoryWin32HandleProperties); #endif +#endif // VK_KHR_win32_keyed_mutex is a preprocessor guard. Do not pass it to API calls. @@ -158,15 +166,19 @@ typedef VkResult (VKAPI_PTR *PFN_vkImportSemaphoreWin32HandleKHR)(VkDevice devic typedef VkResult (VKAPI_PTR *PFN_vkGetSemaphoreWin32HandleKHR)(VkDevice device, const VkSemaphoreGetWin32HandleInfoKHR* pGetWin32HandleInfo, HANDLE* pHandle); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkImportSemaphoreWin32HandleKHR( VkDevice device, const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetSemaphoreWin32HandleKHR( VkDevice device, const VkSemaphoreGetWin32HandleInfoKHR* pGetWin32HandleInfo, HANDLE* pHandle); #endif +#endif // VK_KHR_external_fence_win32 is a preprocessor guard. Do not pass it to API calls. @@ -202,15 +214,19 @@ typedef VkResult (VKAPI_PTR *PFN_vkImportFenceWin32HandleKHR)(VkDevice device, c typedef VkResult (VKAPI_PTR *PFN_vkGetFenceWin32HandleKHR)(VkDevice device, const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo, HANDLE* pHandle); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkImportFenceWin32HandleKHR( VkDevice device, const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetFenceWin32HandleKHR( VkDevice device, const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo, HANDLE* pHandle); #endif +#endif // VK_NV_external_memory_win32 is a preprocessor guard. Do not pass it to API calls. @@ -234,12 +250,14 @@ typedef struct VkExportMemoryWin32HandleInfoNV { typedef VkResult (VKAPI_PTR *PFN_vkGetMemoryWin32HandleNV)(VkDevice device, VkDeviceMemory memory, VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE* pHandle); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryWin32HandleNV( VkDevice device, VkDeviceMemory memory, VkExternalMemoryHandleTypeFlagsNV handleType, HANDLE* pHandle); #endif +#endif // VK_NV_win32_keyed_mutex is a preprocessor guard. Do not pass it to API calls. @@ -296,25 +314,33 @@ typedef VkResult (VKAPI_PTR *PFN_vkReleaseFullScreenExclusiveModeEXT)(VkDevice d typedef VkResult (VKAPI_PTR *PFN_vkGetDeviceGroupSurfacePresentModes2EXT)(VkDevice device, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, VkDeviceGroupPresentModeFlagsKHR* pModes); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceSurfacePresentModes2EXT( VkPhysicalDevice physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, uint32_t* pPresentModeCount, VkPresentModeKHR* pPresentModes); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkAcquireFullScreenExclusiveModeEXT( VkDevice device, VkSwapchainKHR swapchain); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkReleaseFullScreenExclusiveModeEXT( VkDevice device, VkSwapchainKHR swapchain); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetDeviceGroupSurfacePresentModes2EXT( VkDevice device, const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo, VkDeviceGroupPresentModeFlagsKHR* pModes); #endif +#endif // VK_NV_acquire_winrt_display is a preprocessor guard. Do not pass it to API calls. @@ -325,15 +351,19 @@ typedef VkResult (VKAPI_PTR *PFN_vkAcquireWinrtDisplayNV)(VkPhysicalDevice physi typedef VkResult (VKAPI_PTR *PFN_vkGetWinrtDisplayNV)(VkPhysicalDevice physicalDevice, uint32_t deviceRelativeId, VkDisplayKHR* pDisplay); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkAcquireWinrtDisplayNV( VkPhysicalDevice physicalDevice, VkDisplayKHR display); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkGetWinrtDisplayNV( VkPhysicalDevice physicalDevice, uint32_t deviceRelativeId, VkDisplayKHR* pDisplay); #endif +#endif #ifdef __cplusplus } diff --git a/vendor/vulkan/_gen/vulkan_xcb.h b/vendor/vulkan/_gen/vulkan_xcb.h index 4e0627559..473f8c288 100644 --- a/vendor/vulkan/_gen/vulkan_xcb.h +++ b/vendor/vulkan/_gen/vulkan_xcb.h @@ -2,7 +2,7 @@ #define VULKAN_XCB_H_ 1 /* -** Copyright 2015-2025 The Khronos Group Inc. +** Copyright 2015-2026 The Khronos Group Inc. ** ** SPDX-License-Identifier: Apache-2.0 */ @@ -36,18 +36,22 @@ typedef VkResult (VKAPI_PTR *PFN_vkCreateXcbSurfaceKHR)(VkInstance instance, con typedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, xcb_connection_t* connection, xcb_visualid_t visual_id); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateXcbSurfaceKHR( VkInstance instance, const VkXcbSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceXcbPresentationSupportKHR( VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, xcb_connection_t* connection, xcb_visualid_t visual_id); #endif +#endif #ifdef __cplusplus } diff --git a/vendor/vulkan/_gen/vulkan_xlib.h b/vendor/vulkan/_gen/vulkan_xlib.h index b581779c1..dfd107c3e 100644 --- a/vendor/vulkan/_gen/vulkan_xlib.h +++ b/vendor/vulkan/_gen/vulkan_xlib.h @@ -2,7 +2,7 @@ #define VULKAN_XLIB_H_ 1 /* -** Copyright 2015-2025 The Khronos Group Inc. +** Copyright 2015-2026 The Khronos Group Inc. ** ** SPDX-License-Identifier: Apache-2.0 */ @@ -36,18 +36,22 @@ typedef VkResult (VKAPI_PTR *PFN_vkCreateXlibSurfaceKHR)(VkInstance instance, co typedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, Display* dpy, VisualID visualID); #ifndef VK_NO_PROTOTYPES +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCreateXlibSurfaceKHR( VkInstance instance, const VkXlibSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); +#endif +#ifndef VK_ONLY_EXPORTED_PROTOTYPES VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceXlibPresentationSupportKHR( VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, Display* dpy, VisualID visualID); #endif +#endif #ifdef __cplusplus } diff --git a/vendor/vulkan/core.odin b/vendor/vulkan/core.odin index 3cc166dc8..7ae53e713 100644 --- a/vendor/vulkan/core.odin +++ b/vendor/vulkan/core.odin @@ -95,7 +95,7 @@ VULKAN_VIDEO_CODEC_H265_ENCODE_SPEC_VERSION :: VULKAN_VIDEO_CODEC_H265_ENCODE_AP MAKE_VIDEO_STD_VERSION :: MAKE_VERSION // General Constants -HEADER_VERSION :: 309 +HEADER_VERSION :: 354 MAX_DRIVER_NAME_SIZE :: 256 MAX_DRIVER_INFO_SIZE :: 256 @@ -154,6 +154,14 @@ VIDEO_H265_MAX_LONG_TERM_PICS :: 16 VIDEO_H265_MAX_DELTA_POC :: 48 VIDEO_H265_NO_REFERENCE_PICTURE :: 0xFF VIDEO_DECODE_H265_REF_PIC_SET_LIST_SIZE :: 8 +VIDEO_VP9_NUM_REF_FRAMES :: 8 +VIDEO_VP9_REFS_PER_FRAME :: 3 +VIDEO_VP9_MAX_REF_FRAMES :: 4 +VIDEO_VP9_LOOP_FILTER_ADJUSTMENTS :: 2 +VIDEO_VP9_MAX_SEGMENTS :: 8 +VIDEO_VP9_SEG_LVL_MAX :: 4 +VIDEO_VP9_MAX_SEGMENTATION_TREE_PROBS :: 7 +VIDEO_VP9_MAX_SEGMENTATION_PRED_PROB :: 3 // Vulkan Video Codec Constants VULKAN_VIDEO_CODEC_AV1_DECODE_EXTENSION_NAME :: "VK_STD_vulkan_video_codec_av1_decode" @@ -162,6 +170,7 @@ VULKAN_VIDEO_CODEC_H264_DECODE_EXTENSION_NAME :: "VK_STD_vulkan_video_codec_h264 VULKAN_VIDEO_CODEC_H264_ENCODE_EXTENSION_NAME :: "VK_STD_vulkan_video_codec_h264_encode" VULKAN_VIDEO_CODEC_H265_DECODE_EXTENSION_NAME :: "VK_STD_vulkan_video_codec_h265_decode" VULKAN_VIDEO_CODEC_H265_ENCODE_EXTENSION_NAME :: "VK_STD_vulkan_video_codec_h265_encode" +VULKAN_VIDEO_CODEC_VP9_DECODE_EXTENSION_NAME :: "VK_STD_vulkan_video_codec_vp9_decode" // Vendor Constants KHR_surface :: 1 @@ -294,6 +303,9 @@ KHR_DEDICATED_ALLOCATION_EXTENSION_NAME :: "VK_KHR_dedicate KHR_storage_buffer_storage_class :: 1 KHR_STORAGE_BUFFER_STORAGE_CLASS_SPEC_VERSION :: 1 KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME :: "VK_KHR_storage_buffer_storage_class" +KHR_shader_bfloat16 :: 1 +KHR_SHADER_BFLOAT16_SPEC_VERSION :: 1 +KHR_SHADER_BFLOAT16_EXTENSION_NAME :: "VK_KHR_shader_bfloat16" KHR_relaxed_block_layout :: 1 KHR_RELAXED_BLOCK_LAYOUT_SPEC_VERSION :: 1 KHR_RELAXED_BLOCK_LAYOUT_EXTENSION_NAME :: "VK_KHR_relaxed_block_layout" @@ -362,9 +374,15 @@ KHR_SHADER_TERMINATE_INVOCATION_EXTENSION_NAME :: "VK_KHR_shader_t KHR_fragment_shading_rate :: 1 KHR_FRAGMENT_SHADING_RATE_SPEC_VERSION :: 2 KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME :: "VK_KHR_fragment_shading_rate" +KHR_shader_constant_data :: 1 +KHR_SHADER_CONSTANT_DATA_SPEC_VERSION :: 1 +KHR_SHADER_CONSTANT_DATA_EXTENSION_NAME :: "VK_KHR_shader_constant_data" KHR_dynamic_rendering_local_read :: 1 KHR_DYNAMIC_RENDERING_LOCAL_READ_SPEC_VERSION :: 1 KHR_DYNAMIC_RENDERING_LOCAL_READ_EXTENSION_NAME :: "VK_KHR_dynamic_rendering_local_read" +KHR_shader_abort :: 1 +KHR_SHADER_ABORT_SPEC_VERSION :: 1 +KHR_SHADER_ABORT_EXTENSION_NAME :: "VK_KHR_shader_abort" KHR_shader_quad_control :: 1 KHR_SHADER_QUAD_CONTROL_SPEC_VERSION :: 1 KHR_SHADER_QUAD_CONTROL_EXTENSION_NAME :: "VK_KHR_shader_quad_control" @@ -413,6 +431,9 @@ KHR_VIDEO_ENCODE_QUEUE_EXTENSION_NAME :: "VK_KHR_video_en KHR_synchronization2 :: 1 KHR_SYNCHRONIZATION_2_SPEC_VERSION :: 1 KHR_SYNCHRONIZATION_2_EXTENSION_NAME :: "VK_KHR_synchronization2" +KHR_device_address_commands :: 1 +KHR_DEVICE_ADDRESS_COMMANDS_SPEC_VERSION :: 1 +KHR_DEVICE_ADDRESS_COMMANDS_EXTENSION_NAME :: "VK_KHR_device_address_commands" KHR_fragment_shader_barycentric :: 1 KHR_FRAGMENT_SHADER_BARYCENTRIC_SPEC_VERSION :: 1 KHR_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME :: "VK_KHR_fragment_shader_barycentric" @@ -434,6 +455,9 @@ KHR_FORMAT_FEATURE_FLAGS_2_EXTENSION_NAME :: "VK_KHR_format_f KHR_ray_tracing_maintenance1 :: 1 KHR_RAY_TRACING_MAINTENANCE_1_SPEC_VERSION :: 1 KHR_RAY_TRACING_MAINTENANCE_1_EXTENSION_NAME :: "VK_KHR_ray_tracing_maintenance1" +KHR_shader_untyped_pointers :: 1 +KHR_SHADER_UNTYPED_POINTERS_SPEC_VERSION :: 1 +KHR_SHADER_UNTYPED_POINTERS_EXTENSION_NAME :: "VK_KHR_shader_untyped_pointers" KHR_portability_enumeration :: 1 KHR_PORTABILITY_ENUMERATION_SPEC_VERSION :: 1 KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME :: "VK_KHR_portability_enumeration" @@ -449,6 +473,12 @@ KHR_SHADER_MAXIMAL_RECONVERGENCE_EXTENSION_NAME :: "VK_KHR_shader_m KHR_maintenance5 :: 1 KHR_MAINTENANCE_5_SPEC_VERSION :: 1 KHR_MAINTENANCE_5_EXTENSION_NAME :: "VK_KHR_maintenance5" +KHR_present_id2 :: 1 +KHR_PRESENT_ID_2_SPEC_VERSION :: 1 +KHR_PRESENT_ID_2_EXTENSION_NAME :: "VK_KHR_present_id2" +KHR_present_wait2 :: 1 +KHR_PRESENT_WAIT_2_SPEC_VERSION :: 1 +KHR_PRESENT_WAIT_2_EXTENSION_NAME :: "VK_KHR_present_wait2" KHR_ray_tracing_position_fetch :: 1 KHR_RAY_TRACING_POSITION_FETCH_SPEC_VERSION :: 1 KHR_RAY_TRACING_POSITION_FETCH_EXTENSION_NAME :: "VK_KHR_ray_tracing_position_fetch" @@ -456,6 +486,15 @@ KHR_pipeline_binary :: 1 MAX_PIPELINE_BINARY_KEY_SIZE_KHR :: 32 KHR_PIPELINE_BINARY_SPEC_VERSION :: 1 KHR_PIPELINE_BINARY_EXTENSION_NAME :: "VK_KHR_pipeline_binary" +KHR_surface_maintenance1 :: 1 +KHR_SURFACE_MAINTENANCE_1_SPEC_VERSION :: 1 +KHR_SURFACE_MAINTENANCE_1_EXTENSION_NAME :: "VK_KHR_surface_maintenance1" +KHR_swapchain_maintenance1 :: 1 +KHR_SWAPCHAIN_MAINTENANCE_1_SPEC_VERSION :: 1 +KHR_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME :: "VK_KHR_swapchain_maintenance1" +KHR_internally_synchronized_queues :: 1 +KHR_INTERNALLY_SYNCHRONIZED_QUEUES_SPEC_VERSION :: 1 +KHR_INTERNALLY_SYNCHRONIZED_QUEUES_EXTENSION_NAME :: "VK_KHR_internally_synchronized_queues" KHR_cooperative_matrix :: 1 KHR_COOPERATIVE_MATRIX_SPEC_VERSION :: 2 KHR_COOPERATIVE_MATRIX_EXTENSION_NAME :: "VK_KHR_cooperative_matrix" @@ -469,6 +508,10 @@ KHR_VIDEO_DECODE_AV1_EXTENSION_NAME :: "VK_KHR_video_de KHR_video_encode_av1 :: 1 KHR_VIDEO_ENCODE_AV1_SPEC_VERSION :: 1 KHR_VIDEO_ENCODE_AV1_EXTENSION_NAME :: "VK_KHR_video_encode_av1" +KHR_video_decode_vp9 :: 1 +MAX_VIDEO_VP9_REFERENCES_PER_FRAME_KHR :: 3 +KHR_VIDEO_DECODE_VP9_SPEC_VERSION :: 1 +KHR_VIDEO_DECODE_VP9_EXTENSION_NAME :: "VK_KHR_video_decode_vp9" KHR_video_maintenance1 :: 1 KHR_VIDEO_MAINTENANCE_1_SPEC_VERSION :: 1 KHR_VIDEO_MAINTENANCE_1_EXTENSION_NAME :: "VK_KHR_video_maintenance1" @@ -478,6 +521,9 @@ KHR_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME :: "VK_KHR_vertex_a KHR_load_store_op_none :: 1 KHR_LOAD_STORE_OP_NONE_SPEC_VERSION :: 1 KHR_LOAD_STORE_OP_NONE_EXTENSION_NAME :: "VK_KHR_load_store_op_none" +KHR_unified_image_layouts :: 1 +KHR_UNIFIED_IMAGE_LAYOUTS_SPEC_VERSION :: 1 +KHR_UNIFIED_IMAGE_LAYOUTS_EXTENSION_NAME :: "VK_KHR_unified_image_layouts" KHR_shader_float_controls2 :: 1 KHR_SHADER_FLOAT_CONTROLS_2_SPEC_VERSION :: 1 KHR_SHADER_FLOAT_CONTROLS_2_EXTENSION_NAME :: "VK_KHR_shader_float_controls2" @@ -496,6 +542,12 @@ KHR_SHADER_EXPECT_ASSUME_EXTENSION_NAME :: "VK_KHR_shader_e KHR_maintenance6 :: 1 KHR_MAINTENANCE_6_SPEC_VERSION :: 1 KHR_MAINTENANCE_6_EXTENSION_NAME :: "VK_KHR_maintenance6" +KHR_copy_memory_indirect :: 1 +KHR_COPY_MEMORY_INDIRECT_SPEC_VERSION :: 1 +KHR_COPY_MEMORY_INDIRECT_EXTENSION_NAME :: "VK_KHR_copy_memory_indirect" +KHR_video_encode_intra_refresh :: 1 +KHR_VIDEO_ENCODE_INTRA_REFRESH_SPEC_VERSION :: 1 +KHR_VIDEO_ENCODE_INTRA_REFRESH_EXTENSION_NAME :: "VK_KHR_video_encode_intra_refresh" KHR_video_encode_quantization_map :: 1 KHR_VIDEO_ENCODE_QUANTIZATION_MAP_SPEC_VERSION :: 2 KHR_VIDEO_ENCODE_QUANTIZATION_MAP_EXTENSION_NAME :: "VK_KHR_video_encode_quantization_map" @@ -505,15 +557,45 @@ KHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_EXTENSION_NAME :: "VK_KHR_shader_r KHR_maintenance7 :: 1 KHR_MAINTENANCE_7_SPEC_VERSION :: 1 KHR_MAINTENANCE_7_EXTENSION_NAME :: "VK_KHR_maintenance7" +KHR_device_fault :: 1 +KHR_DEVICE_FAULT_SPEC_VERSION :: 1 +KHR_DEVICE_FAULT_EXTENSION_NAME :: "VK_KHR_device_fault" KHR_maintenance8 :: 1 KHR_MAINTENANCE_8_SPEC_VERSION :: 1 KHR_MAINTENANCE_8_EXTENSION_NAME :: "VK_KHR_maintenance8" +KHR_shader_fma :: 1 +KHR_SHADER_FMA_SPEC_VERSION :: 1 +KHR_SHADER_FMA_EXTENSION_NAME :: "VK_KHR_shader_fma" +KHR_maintenance9 :: 1 +KHR_MAINTENANCE_9_SPEC_VERSION :: 1 +KHR_MAINTENANCE_9_EXTENSION_NAME :: "VK_KHR_maintenance9" KHR_video_maintenance2 :: 1 KHR_VIDEO_MAINTENANCE_2_SPEC_VERSION :: 1 KHR_VIDEO_MAINTENANCE_2_EXTENSION_NAME :: "VK_KHR_video_maintenance2" +KHR_video_encode_feedback2 :: 1 +KHR_VIDEO_ENCODE_FEEDBACK_2_SPEC_VERSION :: 1 +KHR_VIDEO_ENCODE_FEEDBACK_2_EXTENSION_NAME :: "VK_KHR_video_encode_feedback2" KHR_depth_clamp_zero_one :: 1 KHR_DEPTH_CLAMP_ZERO_ONE_SPEC_VERSION :: 1 KHR_DEPTH_CLAMP_ZERO_ONE_EXTENSION_NAME :: "VK_KHR_depth_clamp_zero_one" +KHR_robustness2 :: 1 +KHR_ROBUSTNESS_2_SPEC_VERSION :: 1 +KHR_ROBUSTNESS_2_EXTENSION_NAME :: "VK_KHR_robustness2" +KHR_present_mode_fifo_latest_ready :: 1 +KHR_PRESENT_MODE_FIFO_LATEST_READY_SPEC_VERSION :: 1 +KHR_PRESENT_MODE_FIFO_LATEST_READY_EXTENSION_NAME :: "VK_KHR_present_mode_fifo_latest_ready" +KHR_opacity_micromap :: 1 +KHR_OPACITY_MICROMAP_SPEC_VERSION :: 1 +KHR_OPACITY_MICROMAP_EXTENSION_NAME :: "VK_KHR_opacity_micromap" +KHR_maintenance10 :: 1 +KHR_MAINTENANCE_10_SPEC_VERSION :: 1 +KHR_MAINTENANCE_10_EXTENSION_NAME :: "VK_KHR_maintenance10" +KHR_maintenance11 :: 1 +KHR_MAINTENANCE_11_SPEC_VERSION :: 1 +KHR_MAINTENANCE_11_EXTENSION_NAME :: "VK_KHR_maintenance11" +KHR_extended_flags :: 1 +KHR_EXTENDED_FLAGS_SPEC_VERSION :: 1 +KHR_EXTENDED_FLAGS_EXTENSION_NAME :: "VK_KHR_extended_flags" EXT_debug_report :: 1 EXT_DEBUG_REPORT_SPEC_VERSION :: 10 EXT_DEBUG_REPORT_EXTENSION_NAME :: "VK_EXT_debug_report" @@ -548,7 +630,7 @@ NVX_binary_import :: 1 NVX_BINARY_IMPORT_SPEC_VERSION :: 2 NVX_BINARY_IMPORT_EXTENSION_NAME :: "VK_NVX_binary_import" NVX_image_view_handle :: 1 -NVX_IMAGE_VIEW_HANDLE_SPEC_VERSION :: 3 +NVX_IMAGE_VIEW_HANDLE_SPEC_VERSION :: 4 NVX_IMAGE_VIEW_HANDLE_EXTENSION_NAME :: "VK_NVX_image_view_handle" AMD_draw_indirect_count :: 1 AMD_DRAW_INDIRECT_COUNT_SPEC_VERSION :: 2 @@ -664,6 +746,12 @@ EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME :: "VK_EXT_sampler_ AMD_gpu_shader_int16 :: 1 AMD_GPU_SHADER_INT16_SPEC_VERSION :: 2 AMD_GPU_SHADER_INT16_EXTENSION_NAME :: "VK_AMD_gpu_shader_int16" +AMD_gpa_interface :: 1 +AMD_GPA_INTERFACE_SPEC_VERSION :: 1 +AMD_GPA_INTERFACE_EXTENSION_NAME :: "VK_AMD_gpa_interface" +EXT_descriptor_heap :: 1 +EXT_DESCRIPTOR_HEAP_SPEC_VERSION :: 1 +EXT_DESCRIPTOR_HEAP_EXTENSION_NAME :: "VK_EXT_descriptor_heap" AMD_mixed_attachment_samples :: 1 AMD_MIXED_ATTACHMENT_SAMPLES_SPEC_VERSION :: 1 AMD_MIXED_ATTACHMENT_SAMPLES_EXTENSION_NAME :: "VK_AMD_mixed_attachment_samples" @@ -723,6 +811,15 @@ NV_REPRESENTATIVE_FRAGMENT_TEST_EXTENSION_NAME :: "VK_NV_represent EXT_filter_cubic :: 1 EXT_FILTER_CUBIC_SPEC_VERSION :: 3 EXT_FILTER_CUBIC_EXTENSION_NAME :: "VK_EXT_filter_cubic" +QCOM_render_pass_shader_resolve :: 1 +QCOM_RENDER_PASS_SHADER_RESOLVE_SPEC_VERSION :: 4 +QCOM_RENDER_PASS_SHADER_RESOLVE_EXTENSION_NAME :: "VK_QCOM_render_pass_shader_resolve" +QCOM_cooperative_matrix_conversion :: 1 +QCOM_COOPERATIVE_MATRIX_CONVERSION_SPEC_VERSION :: 1 +QCOM_COOPERATIVE_MATRIX_CONVERSION_EXTENSION_NAME :: "VK_QCOM_cooperative_matrix_conversion" +QCOM_elapsed_timer_query :: 1 +QCOM_ELAPSED_TIMER_QUERY_SPEC_VERSION :: 1 +QCOM_ELAPSED_TIMER_QUERY_EXTENSION_NAME :: "VK_QCOM_elapsed_timer_query" EXT_global_priority :: 1 EXT_GLOBAL_PRIORITY_SPEC_VERSION :: 2 EXT_GLOBAL_PRIORITY_EXTENSION_NAME :: "VK_EXT_global_priority" @@ -771,6 +868,9 @@ NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME :: "VK_NV_scissor_e NV_device_diagnostic_checkpoints :: 1 NV_DEVICE_DIAGNOSTIC_CHECKPOINTS_SPEC_VERSION :: 2 NV_DEVICE_DIAGNOSTIC_CHECKPOINTS_EXTENSION_NAME :: "VK_NV_device_diagnostic_checkpoints" +EXT_present_timing :: 1 +EXT_PRESENT_TIMING_SPEC_VERSION :: 3 +EXT_PRESENT_TIMING_EXTENSION_NAME :: "VK_EXT_present_timing" EXT_pci_bus_info :: 1 EXT_PCI_BUS_INFO_SPEC_VERSION :: 2 EXT_PCI_BUS_INFO_EXTENSION_NAME :: "VK_EXT_pci_bus_info" @@ -778,7 +878,7 @@ AMD_display_native_hdr :: 1 AMD_DISPLAY_NATIVE_HDR_SPEC_VERSION :: 1 AMD_DISPLAY_NATIVE_HDR_EXTENSION_NAME :: "VK_AMD_display_native_hdr" EXT_fragment_density_map :: 1 -EXT_FRAGMENT_DENSITY_MAP_SPEC_VERSION :: 2 +EXT_FRAGMENT_DENSITY_MAP_SPEC_VERSION :: 3 EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME :: "VK_EXT_fragment_density_map" EXT_scalar_block_layout :: 1 EXT_SCALAR_BLOCK_LAYOUT_SPEC_VERSION :: 1 @@ -884,6 +984,9 @@ NV_INHERITED_VIEWPORT_SCISSOR_EXTENSION_NAME :: "VK_NV_inherited EXT_texel_buffer_alignment :: 1 EXT_TEXEL_BUFFER_ALIGNMENT_SPEC_VERSION :: 1 EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME :: "VK_EXT_texel_buffer_alignment" +QCOM_render_pass_transform :: 1 +QCOM_RENDER_PASS_TRANSFORM_SPEC_VERSION :: 5 +QCOM_RENDER_PASS_TRANSFORM_EXTENSION_NAME :: "VK_QCOM_render_pass_transform" EXT_depth_bias_control :: 1 EXT_DEPTH_BIAS_CONTROL_SPEC_VERSION :: 1 EXT_DEPTH_BIAS_CONTROL_EXTENSION_NAME :: "VK_EXT_depth_bias_control" @@ -899,6 +1002,9 @@ EXT_ROBUSTNESS_2_EXTENSION_NAME :: "VK_EXT_robustne EXT_custom_border_color :: 1 EXT_CUSTOM_BORDER_COLOR_SPEC_VERSION :: 12 EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME :: "VK_EXT_custom_border_color" +EXT_texture_compression_astc_3d :: 1 +EXT_TEXTURE_COMPRESSION_ASTC_3D_SPEC_VERSION :: 1 +EXT_TEXTURE_COMPRESSION_ASTC_3D_EXTENSION_NAME :: "VK_EXT_texture_compression_astc_3d" GOOGLE_user_type :: 1 GOOGLE_USER_TYPE_SPEC_VERSION :: 1 GOOGLE_USER_TYPE_EXTENSION_NAME :: "VK_GOOGLE_user_type" @@ -914,9 +1020,24 @@ EXT_PIPELINE_CREATION_CACHE_CONTROL_EXTENSION_NAME :: "VK_EXT_pipeline NV_device_diagnostics_config :: 1 NV_DEVICE_DIAGNOSTICS_CONFIG_SPEC_VERSION :: 2 NV_DEVICE_DIAGNOSTICS_CONFIG_EXTENSION_NAME :: "VK_NV_device_diagnostics_config" -NV_cuda_kernel_launch :: 1 -NV_CUDA_KERNEL_LAUNCH_SPEC_VERSION :: 2 -NV_CUDA_KERNEL_LAUNCH_EXTENSION_NAME :: "VK_NV_cuda_kernel_launch" +QCOM_render_pass_store_ops :: 1 +QCOM_RENDER_PASS_STORE_OPS_SPEC_VERSION :: 2 +QCOM_RENDER_PASS_STORE_OPS_EXTENSION_NAME :: "VK_QCOM_render_pass_store_ops" +QCOM_queue_perf_hint :: 1 +QCOM_QUEUE_PERF_HINT_SPEC_VERSION :: 1 +QCOM_QUEUE_PERF_HINT_EXTENSION_NAME :: "VK_QCOM_queue_perf_hint" +QCOM_image_processing3 :: 1 +QCOM_IMAGE_PROCESSING_3_SPEC_VERSION :: 1 +QCOM_IMAGE_PROCESSING_3_EXTENSION_NAME :: "VK_QCOM_image_processing3" +QCOM_shader_multiple_wait_queues :: 1 +QCOM_SHADER_MULTIPLE_WAIT_QUEUES_SPEC_VERSION :: 1 +QCOM_SHADER_MULTIPLE_WAIT_QUEUES_EXTENSION_NAME :: "VK_QCOM_shader_multiple_wait_queues" +EXT_shader_split_barrier :: 1 +EXT_SHADER_SPLIT_BARRIER_SPEC_VERSION :: 1 +EXT_SHADER_SPLIT_BARRIER_EXTENSION_NAME :: "VK_EXT_shader_split_barrier" +QCOM_tile_shading :: 1 +QCOM_TILE_SHADING_SPEC_VERSION :: 2 +QCOM_TILE_SHADING_EXTENSION_NAME :: "VK_QCOM_tile_shading" NV_low_latency :: 1 NV_LOW_LATENCY_SPEC_VERSION :: 1 NV_LOW_LATENCY_EXTENSION_NAME :: "VK_NV_low_latency" @@ -941,6 +1062,9 @@ EXT_YCBCR_2PLANE_444_FORMATS_EXTENSION_NAME :: "VK_EXT_ycbcr_2p EXT_fragment_density_map2 :: 1 EXT_FRAGMENT_DENSITY_MAP_2_SPEC_VERSION :: 1 EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME :: "VK_EXT_fragment_density_map2" +QCOM_rotated_copy_commands :: 1 +QCOM_ROTATED_COPY_COMMANDS_SPEC_VERSION :: 2 +QCOM_ROTATED_COPY_COMMANDS_EXTENSION_NAME :: "VK_QCOM_rotated_copy_commands" EXT_image_robustness :: 1 EXT_IMAGE_ROBUSTNESS_SPEC_VERSION :: 1 EXT_IMAGE_ROBUSTNESS_EXTENSION_NAME :: "VK_EXT_image_robustness" @@ -956,6 +1080,9 @@ EXT_4444_FORMATS_EXTENSION_NAME :: "VK_EXT_4444_for EXT_device_fault :: 1 EXT_DEVICE_FAULT_SPEC_VERSION :: 2 EXT_DEVICE_FAULT_EXTENSION_NAME :: "VK_EXT_device_fault" +ARM_rasterization_order_attachment_access :: 1 +ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_SPEC_VERSION :: 1 +ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_EXTENSION_NAME :: "VK_ARM_rasterization_order_attachment_access" EXT_rgba10x6_formats :: 1 EXT_RGBA10X6_FORMATS_SPEC_VERSION :: 1 EXT_RGBA10X6_FORMATS_EXTENSION_NAME :: "VK_EXT_rgba10x6_formats" @@ -1026,6 +1153,12 @@ EXT_BORDER_COLOR_SWIZZLE_EXTENSION_NAME :: "VK_EXT_border_c EXT_pageable_device_local_memory :: 1 EXT_PAGEABLE_DEVICE_LOCAL_MEMORY_SPEC_VERSION :: 1 EXT_PAGEABLE_DEVICE_LOCAL_MEMORY_EXTENSION_NAME :: "VK_EXT_pageable_device_local_memory" +ARM_shader_core_properties :: 1 +ARM_SHADER_CORE_PROPERTIES_SPEC_VERSION :: 1 +ARM_SHADER_CORE_PROPERTIES_EXTENSION_NAME :: "VK_ARM_shader_core_properties" +ARM_scheduling_controls :: 1 +ARM_SCHEDULING_CONTROLS_SPEC_VERSION :: 2 +ARM_SCHEDULING_CONTROLS_EXTENSION_NAME :: "VK_ARM_scheduling_controls" EXT_image_sliced_view_of_3d :: 1 EXT_IMAGE_SLICED_VIEW_OF_3D_SPEC_VERSION :: 1 EXT_IMAGE_SLICED_VIEW_OF_3D_EXTENSION_NAME :: "VK_EXT_image_sliced_view_of_3d" @@ -1036,6 +1169,12 @@ EXT_DEPTH_CLAMP_ZERO_ONE_EXTENSION_NAME :: "VK_EXT_depth_cl EXT_non_seamless_cube_map :: 1 EXT_NON_SEAMLESS_CUBE_MAP_SPEC_VERSION :: 1 EXT_NON_SEAMLESS_CUBE_MAP_EXTENSION_NAME :: "VK_EXT_non_seamless_cube_map" +ARM_render_pass_striped :: 1 +ARM_RENDER_PASS_STRIPED_SPEC_VERSION :: 1 +ARM_RENDER_PASS_STRIPED_EXTENSION_NAME :: "VK_ARM_render_pass_striped" +QCOM_fragment_density_map_offset :: 1 +QCOM_FRAGMENT_DENSITY_MAP_OFFSET_SPEC_VERSION :: 3 +QCOM_FRAGMENT_DENSITY_MAP_OFFSET_EXTENSION_NAME :: "VK_QCOM_fragment_density_map_offset" NV_copy_memory_indirect :: 1 NV_COPY_MEMORY_INDIRECT_SPEC_VERSION :: 1 NV_COPY_MEMORY_INDIRECT_EXTENSION_NAME :: "VK_NV_copy_memory_indirect" @@ -1057,6 +1196,9 @@ GOOGLE_SURFACELESS_QUERY_EXTENSION_NAME :: "VK_GOOGLE_surfa EXT_image_compression_control_swapchain :: 1 EXT_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_SPEC_VERSION :: 1 EXT_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_EXTENSION_NAME :: "VK_EXT_image_compression_control_swapchain" +QCOM_image_processing :: 1 +QCOM_IMAGE_PROCESSING_SPEC_VERSION :: 1 +QCOM_IMAGE_PROCESSING_EXTENSION_NAME :: "VK_QCOM_image_processing" EXT_nested_command_buffer :: 1 EXT_NESTED_COMMAND_BUFFER_SPEC_VERSION :: 1 EXT_NESTED_COMMAND_BUFFER_EXTENSION_NAME :: "VK_EXT_nested_command_buffer" @@ -1069,6 +1211,9 @@ EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME :: "VK_EXT_extended EXT_subpass_merge_feedback :: 1 EXT_SUBPASS_MERGE_FEEDBACK_SPEC_VERSION :: 2 EXT_SUBPASS_MERGE_FEEDBACK_EXTENSION_NAME :: "VK_EXT_subpass_merge_feedback" +ARM_tensors :: 1 +ARM_TENSORS_SPEC_VERSION :: 2 +ARM_TENSORS_EXTENSION_NAME :: "VK_ARM_tensors" EXT_shader_module_identifier :: 1 MAX_SHADER_MODULE_IDENTIFIER_SIZE_EXT :: 32 EXT_SHADER_MODULE_IDENTIFIER_SPEC_VERSION :: 1 @@ -1091,6 +1236,12 @@ AMD_ANTI_LAG_EXTENSION_NAME :: "VK_AMD_anti_lag EXT_shader_object :: 1 EXT_SHADER_OBJECT_SPEC_VERSION :: 1 EXT_SHADER_OBJECT_EXTENSION_NAME :: "VK_EXT_shader_object" +QCOM_tile_properties :: 1 +QCOM_TILE_PROPERTIES_SPEC_VERSION :: 1 +QCOM_TILE_PROPERTIES_EXTENSION_NAME :: "VK_QCOM_tile_properties" +QCOM_multiview_per_view_viewports :: 1 +QCOM_MULTIVIEW_PER_VIEW_VIEWPORTS_SPEC_VERSION :: 1 +QCOM_MULTIVIEW_PER_VIEW_VIEWPORTS_EXTENSION_NAME :: "VK_QCOM_multiview_per_view_viewports" NV_ray_tracing_invocation_reorder :: 1 NV_RAY_TRACING_INVOCATION_REORDER_SPEC_VERSION :: 1 NV_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME :: "VK_NV_ray_tracing_invocation_reorder" @@ -1109,6 +1260,9 @@ EXT_LEGACY_VERTEX_ATTRIBUTES_EXTENSION_NAME :: "VK_EXT_legacy_v EXT_layer_settings :: 1 EXT_LAYER_SETTINGS_SPEC_VERSION :: 2 EXT_LAYER_SETTINGS_EXTENSION_NAME :: "VK_EXT_layer_settings" +ARM_shader_core_builtins :: 1 +ARM_SHADER_CORE_BUILTINS_SPEC_VERSION :: 2 +ARM_SHADER_CORE_BUILTINS_EXTENSION_NAME :: "VK_ARM_shader_core_builtins" EXT_pipeline_library_group_handles :: 1 EXT_PIPELINE_LIBRARY_GROUP_HANDLES_SPEC_VERSION :: 1 EXT_PIPELINE_LIBRARY_GROUP_HANDLES_EXTENSION_NAME :: "VK_EXT_pipeline_library_group_handles" @@ -1118,21 +1272,53 @@ EXT_DYNAMIC_RENDERING_UNUSED_ATTACHMENTS_EXTENSION_NAME :: "VK_EXT_dynamic_ NV_low_latency2 :: 1 NV_LOW_LATENCY_2_SPEC_VERSION :: 2 NV_LOW_LATENCY_2_EXTENSION_NAME :: "VK_NV_low_latency2" +ARM_data_graph :: 1 +MAX_PHYSICAL_DEVICE_DATA_GRAPH_OPERATION_SET_NAME_SIZE_ARM :: 128 +ARM_DATA_GRAPH_SPEC_VERSION :: 1 +ARM_DATA_GRAPH_EXTENSION_NAME :: "VK_ARM_data_graph" +ARM_data_graph_instruction_set_tosa :: 1 +MAX_DATA_GRAPH_TOSA_NAME_SIZE_ARM :: 128 +ARM_DATA_GRAPH_INSTRUCTION_SET_TOSA_SPEC_VERSION :: 1 +ARM_DATA_GRAPH_INSTRUCTION_SET_TOSA_EXTENSION_NAME :: "VK_ARM_data_graph_instruction_set_tosa" +QCOM_multiview_per_view_render_areas :: 1 +QCOM_MULTIVIEW_PER_VIEW_RENDER_AREAS_SPEC_VERSION :: 1 +QCOM_MULTIVIEW_PER_VIEW_RENDER_AREAS_EXTENSION_NAME :: "VK_QCOM_multiview_per_view_render_areas" NV_per_stage_descriptor_set :: 1 NV_PER_STAGE_DESCRIPTOR_SET_SPEC_VERSION :: 1 NV_PER_STAGE_DESCRIPTOR_SET_EXTENSION_NAME :: "VK_NV_per_stage_descriptor_set" +QCOM_image_processing2 :: 1 +QCOM_IMAGE_PROCESSING_2_SPEC_VERSION :: 1 +QCOM_IMAGE_PROCESSING_2_EXTENSION_NAME :: "VK_QCOM_image_processing2" +QCOM_filter_cubic_weights :: 1 +QCOM_FILTER_CUBIC_WEIGHTS_SPEC_VERSION :: 1 +QCOM_FILTER_CUBIC_WEIGHTS_EXTENSION_NAME :: "VK_QCOM_filter_cubic_weights" +QCOM_ycbcr_degamma :: 1 +QCOM_YCBCR_DEGAMMA_SPEC_VERSION :: 1 +QCOM_YCBCR_DEGAMMA_EXTENSION_NAME :: "VK_QCOM_ycbcr_degamma" +QCOM_filter_cubic_clamp :: 1 +QCOM_FILTER_CUBIC_CLAMP_SPEC_VERSION :: 1 +QCOM_FILTER_CUBIC_CLAMP_EXTENSION_NAME :: "VK_QCOM_filter_cubic_clamp" EXT_attachment_feedback_loop_dynamic_state :: 1 EXT_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_SPEC_VERSION :: 1 EXT_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_EXTENSION_NAME :: "VK_EXT_attachment_feedback_loop_dynamic_state" NV_descriptor_pool_overallocation :: 1 NV_DESCRIPTOR_POOL_OVERALLOCATION_SPEC_VERSION :: 1 NV_DESCRIPTOR_POOL_OVERALLOCATION_EXTENSION_NAME :: "VK_NV_descriptor_pool_overallocation" +QCOM_tile_memory_heap :: 1 +QCOM_TILE_MEMORY_HEAP_SPEC_VERSION :: 1 +QCOM_TILE_MEMORY_HEAP_EXTENSION_NAME :: "VK_QCOM_tile_memory_heap" +EXT_memory_decompression :: 1 +EXT_MEMORY_DECOMPRESSION_SPEC_VERSION :: 1 +EXT_MEMORY_DECOMPRESSION_EXTENSION_NAME :: "VK_EXT_memory_decompression" NV_display_stereo :: 1 NV_DISPLAY_STEREO_SPEC_VERSION :: 1 NV_DISPLAY_STEREO_EXTENSION_NAME :: "VK_NV_display_stereo" NV_raw_access_chains :: 1 NV_RAW_ACCESS_CHAINS_SPEC_VERSION :: 1 NV_RAW_ACCESS_CHAINS_EXTENSION_NAME :: "VK_NV_raw_access_chains" +NV_external_compute_queue :: 1 +NV_EXTERNAL_COMPUTE_QUEUE_SPEC_VERSION :: 1 +NV_EXTERNAL_COMPUTE_QUEUE_EXTENSION_NAME :: "VK_NV_external_compute_queue" NV_command_buffer_inheritance :: 1 NV_COMMAND_BUFFER_INHERITANCE_SPEC_VERSION :: 1 NV_COMMAND_BUFFER_INHERITANCE_EXTENSION_NAME :: "VK_NV_command_buffer_inheritance" @@ -1142,11 +1328,14 @@ NV_SHADER_ATOMIC_FLOAT16_VECTOR_EXTENSION_NAME :: "VK_NV_shader_at EXT_shader_replicated_composites :: 1 EXT_SHADER_REPLICATED_COMPOSITES_SPEC_VERSION :: 1 EXT_SHADER_REPLICATED_COMPOSITES_EXTENSION_NAME :: "VK_EXT_shader_replicated_composites" +EXT_shader_float8 :: 1 +EXT_SHADER_FLOAT8_SPEC_VERSION :: 1 +EXT_SHADER_FLOAT8_EXTENSION_NAME :: "VK_EXT_shader_float8" NV_ray_tracing_validation :: 1 NV_RAY_TRACING_VALIDATION_SPEC_VERSION :: 1 NV_RAY_TRACING_VALIDATION_EXTENSION_NAME :: "VK_NV_ray_tracing_validation" NV_cluster_acceleration_structure :: 1 -NV_CLUSTER_ACCELERATION_STRUCTURE_SPEC_VERSION :: 2 +NV_CLUSTER_ACCELERATION_STRUCTURE_SPEC_VERSION :: 4 NV_CLUSTER_ACCELERATION_STRUCTURE_EXTENSION_NAME :: "VK_NV_cluster_acceleration_structure" NV_partitioned_acceleration_structure :: 1 NV_PARTITIONED_ACCELERATION_STRUCTURE_SPEC_VERSION :: 1 @@ -1155,18 +1344,82 @@ PARTITIONED_ACCELERATION_STRUCTURE_PARTITION_INDEX_GLOBAL_NV :: ~u32(0) EXT_device_generated_commands :: 1 EXT_DEVICE_GENERATED_COMMANDS_SPEC_VERSION :: 1 EXT_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME :: "VK_EXT_device_generated_commands" +NV_push_constant_bank :: 1 +NV_PUSH_CONSTANT_BANK_SPEC_VERSION :: 1 +NV_PUSH_CONSTANT_BANK_EXTENSION_NAME :: "VK_NV_push_constant_bank" +EXT_ray_tracing_invocation_reorder :: 1 +EXT_RAY_TRACING_INVOCATION_REORDER_SPEC_VERSION :: 2 +EXT_RAY_TRACING_INVOCATION_REORDER_EXTENSION_NAME :: "VK_EXT_ray_tracing_invocation_reorder" EXT_depth_clamp_control :: 1 EXT_DEPTH_CLAMP_CONTROL_SPEC_VERSION :: 1 EXT_DEPTH_CLAMP_CONTROL_EXTENSION_NAME :: "VK_EXT_depth_clamp_control" NV_cooperative_matrix2 :: 1 NV_COOPERATIVE_MATRIX_2_SPEC_VERSION :: 1 NV_COOPERATIVE_MATRIX_2_EXTENSION_NAME :: "VK_NV_cooperative_matrix2" +ARM_pipeline_opacity_micromap :: 1 +ARM_PIPELINE_OPACITY_MICROMAP_SPEC_VERSION :: 1 +ARM_PIPELINE_OPACITY_MICROMAP_EXTENSION_NAME :: "VK_ARM_pipeline_opacity_micromap" +ARM_performance_counters_by_region :: 1 +ARM_PERFORMANCE_COUNTERS_BY_REGION_SPEC_VERSION :: 1 +ARM_PERFORMANCE_COUNTERS_BY_REGION_EXTENSION_NAME :: "VK_ARM_performance_counters_by_region" +ARM_shader_instrumentation :: 1 +ARM_SHADER_INSTRUMENTATION_SPEC_VERSION :: 1 +ARM_SHADER_INSTRUMENTATION_EXTENSION_NAME :: "VK_ARM_shader_instrumentation" EXT_vertex_attribute_robustness :: 1 EXT_VERTEX_ATTRIBUTE_ROBUSTNESS_SPEC_VERSION :: 1 EXT_VERTEX_ATTRIBUTE_ROBUSTNESS_EXTENSION_NAME :: "VK_EXT_vertex_attribute_robustness" +ARM_format_pack :: 1 +ARM_FORMAT_PACK_SPEC_VERSION :: 1 +ARM_FORMAT_PACK_EXTENSION_NAME :: "VK_ARM_format_pack" NV_present_metering :: 1 NV_PRESENT_METERING_SPEC_VERSION :: 1 NV_PRESENT_METERING_EXTENSION_NAME :: "VK_NV_present_metering" +EXT_multisampled_render_to_swapchain :: 1 +EXT_MULTISAMPLED_RENDER_TO_SWAPCHAIN_SPEC_VERSION :: 1 +EXT_MULTISAMPLED_RENDER_TO_SWAPCHAIN_EXTENSION_NAME :: "VK_EXT_multisampled_render_to_swapchain" +EXT_fragment_density_map_offset :: 1 +EXT_FRAGMENT_DENSITY_MAP_OFFSET_SPEC_VERSION :: 1 +EXT_FRAGMENT_DENSITY_MAP_OFFSET_EXTENSION_NAME :: "VK_EXT_fragment_density_map_offset" +EXT_zero_initialize_device_memory :: 1 +EXT_ZERO_INITIALIZE_DEVICE_MEMORY_SPEC_VERSION :: 1 +EXT_ZERO_INITIALIZE_DEVICE_MEMORY_EXTENSION_NAME :: "VK_EXT_zero_initialize_device_memory" +EXT_shader_64bit_indexing :: 1 +EXT_SHADER_64BIT_INDEXING_SPEC_VERSION :: 1 +EXT_SHADER_64BIT_INDEXING_EXTENSION_NAME :: "VK_EXT_shader_64bit_indexing" +EXT_custom_resolve :: 1 +EXT_CUSTOM_RESOLVE_SPEC_VERSION :: 1 +EXT_CUSTOM_RESOLVE_EXTENSION_NAME :: "VK_EXT_custom_resolve" +QCOM_data_graph_model :: 1 +DATA_GRAPH_MODEL_TOOLCHAIN_VERSION_LENGTH_QCOM :: 3 +QCOM_DATA_GRAPH_MODEL_SPEC_VERSION :: 1 +QCOM_DATA_GRAPH_MODEL_EXTENSION_NAME :: "VK_QCOM_data_graph_model" +ARM_data_graph_optical_flow :: 1 +ARM_DATA_GRAPH_OPTICAL_FLOW_SPEC_VERSION :: 1 +ARM_DATA_GRAPH_OPTICAL_FLOW_EXTENSION_NAME :: "VK_ARM_data_graph_optical_flow" +EXT_shader_long_vector :: 1 +EXT_SHADER_LONG_VECTOR_SPEC_VERSION :: 1 +EXT_SHADER_LONG_VECTOR_EXTENSION_NAME :: "VK_EXT_shader_long_vector" +EXT_shader_uniform_buffer_unsized_array :: 1 +EXT_SHADER_UNIFORM_BUFFER_UNSIZED_ARRAY_SPEC_VERSION :: 1 +EXT_SHADER_UNIFORM_BUFFER_UNSIZED_ARRAY_EXTENSION_NAME :: "VK_EXT_shader_uniform_buffer_unsized_array" +NV_compute_occupancy_priority :: 1 +NV_COMPUTE_OCCUPANCY_PRIORITY_SPEC_VERSION :: 1 +NV_COMPUTE_OCCUPANCY_PRIORITY_EXTENSION_NAME :: "VK_NV_compute_occupancy_priority" +COMPUTE_OCCUPANCY_PRIORITY_LOW_NV :: 25 +COMPUTE_OCCUPANCY_PRIORITY_NORMAL_NV :: 50 +COMPUTE_OCCUPANCY_PRIORITY_HIGH_NV :: 75 +EXT_shader_subgroup_partitioned :: 1 +EXT_SHADER_SUBGROUP_PARTITIONED_SPEC_VERSION :: 1 +EXT_SHADER_SUBGROUP_PARTITIONED_EXTENSION_NAME :: "VK_EXT_shader_subgroup_partitioned" +ARM_data_graph_neural_accelerator_statistics :: 1 +ARM_DATA_GRAPH_NEURAL_ACCELERATOR_STATISTICS_SPEC_VERSION :: 1 +ARM_DATA_GRAPH_NEURAL_ACCELERATOR_STATISTICS_EXTENSION_NAME :: "VK_ARM_data_graph_neural_accelerator_statistics" +EXT_primitive_restart_index :: 1 +EXT_PRIMITIVE_RESTART_INDEX_SPEC_VERSION :: 1 +EXT_PRIMITIVE_RESTART_INDEX_EXTENSION_NAME :: "VK_EXT_primitive_restart_index" +NV_cooperative_matrix_decode_vector :: 1 +NV_COOPERATIVE_MATRIX_DECODE_VECTOR_SPEC_VERSION :: 1 +NV_COOPERATIVE_MATRIX_DECODE_VECTOR_EXTENSION_NAME :: "VK_NV_cooperative_matrix_decode_vector" KHR_acceleration_structure :: 1 KHR_ACCELERATION_STRUCTURE_SPEC_VERSION :: 13 KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME :: "VK_KHR_acceleration_structure" @@ -1230,38 +1483,45 @@ KHR_PORTABILITY_SUBSET_EXTENSION_NAME :: "VK_KHR_portabil AMDX_shader_enqueue :: 1 AMDX_SHADER_ENQUEUE_SPEC_VERSION :: 2 AMDX_SHADER_ENQUEUE_EXTENSION_NAME :: "VK_AMDX_shader_enqueue" +NV_cuda_kernel_launch :: 1 +NV_CUDA_KERNEL_LAUNCH_SPEC_VERSION :: 2 +NV_CUDA_KERNEL_LAUNCH_EXTENSION_NAME :: "VK_NV_cuda_kernel_launch" NV_displacement_micromap :: 1 NV_DISPLACEMENT_MICROMAP_SPEC_VERSION :: 2 NV_DISPLACEMENT_MICROMAP_EXTENSION_NAME :: "VK_NV_displacement_micromap" +AMDX_dense_geometry_format :: 1 +AMDX_DENSE_GEOMETRY_FORMAT_SPEC_VERSION :: 1 +AMDX_DENSE_GEOMETRY_FORMAT_EXTENSION_NAME :: "VK_AMDX_dense_geometry_format" // Handles types -Instance :: distinct Handle -PhysicalDevice :: distinct Handle -Device :: distinct Handle -Queue :: distinct Handle -CommandBuffer :: distinct Handle -Buffer :: distinct NonDispatchableHandle -Image :: distinct NonDispatchableHandle +Instance :: distinct Handle +PhysicalDevice :: distinct Handle +Device :: distinct Handle +Queue :: distinct Handle +CommandBuffer :: distinct Handle +ExternalComputeQueueNV :: distinct Handle Semaphore :: distinct NonDispatchableHandle Fence :: distinct NonDispatchableHandle DeviceMemory :: distinct NonDispatchableHandle -Event :: distinct NonDispatchableHandle +Buffer :: distinct NonDispatchableHandle +Image :: distinct NonDispatchableHandle QueryPool :: distinct NonDispatchableHandle -BufferView :: distinct NonDispatchableHandle ImageView :: distinct NonDispatchableHandle +CommandPool :: distinct NonDispatchableHandle +RenderPass :: distinct NonDispatchableHandle +Framebuffer :: distinct NonDispatchableHandle +Event :: distinct NonDispatchableHandle +BufferView :: distinct NonDispatchableHandle ShaderModule :: distinct NonDispatchableHandle PipelineCache :: distinct NonDispatchableHandle -PipelineLayout :: distinct NonDispatchableHandle Pipeline :: distinct NonDispatchableHandle -RenderPass :: distinct NonDispatchableHandle +PipelineLayout :: distinct NonDispatchableHandle DescriptorSetLayout :: distinct NonDispatchableHandle Sampler :: distinct NonDispatchableHandle DescriptorSet :: distinct NonDispatchableHandle DescriptorPool :: distinct NonDispatchableHandle -Framebuffer :: distinct NonDispatchableHandle -CommandPool :: distinct NonDispatchableHandle -SamplerYcbcrConversion :: distinct NonDispatchableHandle DescriptorUpdateTemplate :: distinct NonDispatchableHandle +SamplerYcbcrConversion :: distinct NonDispatchableHandle PrivateDataSlot :: distinct NonDispatchableHandle SurfaceKHR :: distinct NonDispatchableHandle SwapchainKHR :: distinct NonDispatchableHandle @@ -1270,22 +1530,27 @@ DisplayModeKHR :: distinct NonDispatchableHandle VideoSessionKHR :: distinct NonDispatchableHandle VideoSessionParametersKHR :: distinct NonDispatchableHandle DeferredOperationKHR :: distinct NonDispatchableHandle +AccelerationStructureKHR :: distinct NonDispatchableHandle PipelineBinaryKHR :: distinct NonDispatchableHandle DebugReportCallbackEXT :: distinct NonDispatchableHandle CuModuleNVX :: distinct NonDispatchableHandle CuFunctionNVX :: distinct NonDispatchableHandle DebugUtilsMessengerEXT :: distinct NonDispatchableHandle +GpaSessionAMD :: distinct NonDispatchableHandle +TensorARM :: distinct NonDispatchableHandle ValidationCacheEXT :: distinct NonDispatchableHandle AccelerationStructureNV :: distinct NonDispatchableHandle PerformanceConfigurationINTEL :: distinct NonDispatchableHandle IndirectCommandsLayoutNV :: distinct NonDispatchableHandle -CudaModuleNV :: distinct NonDispatchableHandle -CudaFunctionNV :: distinct NonDispatchableHandle -AccelerationStructureKHR :: distinct NonDispatchableHandle MicromapEXT :: distinct NonDispatchableHandle +TensorViewARM :: distinct NonDispatchableHandle OpticalFlowSessionNV :: distinct NonDispatchableHandle ShaderEXT :: distinct NonDispatchableHandle +DataGraphPipelineSessionARM :: distinct NonDispatchableHandle IndirectExecutionSetEXT :: distinct NonDispatchableHandle IndirectCommandsLayoutEXT :: distinct NonDispatchableHandle +ShaderInstrumentationARM :: distinct NonDispatchableHandle +CudaModuleNV :: distinct NonDispatchableHandle +CudaFunctionNV :: distinct NonDispatchableHandle diff --git a/vendor/vulkan/enums.odin b/vendor/vulkan/enums.odin index 3b9a1dc34..8e85924de 100644 --- a/vendor/vulkan/enums.odin +++ b/vendor/vulkan/enums.odin @@ -33,12 +33,17 @@ AccelerationStructureMotionInstanceTypeNV :: enum c.int { SRT_MOTION = 2, } +AccelerationStructureSerializedBlockTypeKHR :: enum c.int { + OPACITY_MICROMAP = 0, +} + AccelerationStructureTypeKHR :: enum c.int { - TOP_LEVEL = 0, - BOTTOM_LEVEL = 1, - GENERIC = 2, - TOP_LEVEL_NV = TOP_LEVEL, - BOTTOM_LEVEL_NV = BOTTOM_LEVEL, + TOP_LEVEL = 0, + BOTTOM_LEVEL = 1, + GENERIC = 2, + OPACITY_MICROMAP = 1000623000, + TOP_LEVEL_NV = TOP_LEVEL, + BOTTOM_LEVEL_NV = BOTTOM_LEVEL, } AccessFlags :: distinct bit_set[AccessFlag; Flags] @@ -69,13 +74,13 @@ AccessFlag :: enum Flags { ACCELERATION_STRUCTURE_WRITE_KHR = 22, FRAGMENT_DENSITY_MAP_READ_EXT = 24, FRAGMENT_SHADING_RATE_ATTACHMENT_READ_KHR = 23, - COMMAND_PREPROCESS_READ_NV = 17, - COMMAND_PREPROCESS_WRITE_NV = 18, + COMMAND_PREPROCESS_READ_EXT = 17, + COMMAND_PREPROCESS_WRITE_EXT = 18, SHADING_RATE_IMAGE_READ_NV = FRAGMENT_SHADING_RATE_ATTACHMENT_READ_KHR, ACCELERATION_STRUCTURE_READ_NV = ACCELERATION_STRUCTURE_READ_KHR, ACCELERATION_STRUCTURE_WRITE_NV = ACCELERATION_STRUCTURE_WRITE_KHR, - COMMAND_PREPROCESS_READ_EXT = COMMAND_PREPROCESS_READ_NV, - COMMAND_PREPROCESS_WRITE_EXT = COMMAND_PREPROCESS_WRITE_NV, + COMMAND_PREPROCESS_READ_NV = COMMAND_PREPROCESS_READ_EXT, + COMMAND_PREPROCESS_WRITE_NV = COMMAND_PREPROCESS_WRITE_EXT, } AccessFlags_NONE :: AccessFlags{} @@ -85,6 +90,23 @@ AcquireProfilingLockFlagsKHR :: distinct bit_set[AcquireProfilingLockFlagKHR; Fl AcquireProfilingLockFlagKHR :: enum Flags { } +AddressCommandFlagsKHR :: distinct bit_set[AddressCommandFlagKHR; Flags] +AddressCommandFlagKHR :: enum Flags { + PROTECTED = 0, + FULLY_BOUND = 1, + STORAGE_BUFFER_USAGE = 2, + UNKNOWN_STORAGE_BUFFER_USAGE = 3, + TRANSFORM_FEEDBACK_BUFFER_USAGE = 4, + UNKNOWN_TRANSFORM_FEEDBACK_BUFFER_USAGE = 5, +} + +AddressCopyFlagsKHR :: distinct bit_set[AddressCopyFlagKHR; Flags] +AddressCopyFlagKHR :: enum Flags { + DEVICE_LOCAL = 0, + SPARSE = 1, + PROTECTED = 2, +} + AntiLagModeAMD :: enum c.int { DRIVER_CONTROL = 0, ON = 1, @@ -98,7 +120,9 @@ AntiLagStageAMD :: enum c.int { AttachmentDescriptionFlags :: distinct bit_set[AttachmentDescriptionFlag; Flags] AttachmentDescriptionFlag :: enum Flags { - MAY_ALIAS = 0, + MAY_ALIAS = 0, + RESOLVE_SKIP_TRANSFER_FUNCTION_KHR = 1, + RESOLVE_ENABLE_TRANSFER_FUNCTION_KHR = 2, } AttachmentLoadOp :: enum c.int { @@ -197,8 +221,8 @@ BlendOverlapEXT :: enum c.int { } BlockMatchWindowCompareModeQCOM :: enum c.int { - BLOCK_MATCH_WINDOW_COMPARE_MODE_MIN_QCOM = 0, - BLOCK_MATCH_WINDOW_COMPARE_MODE_MAX_QCOM = 1, + MIN = 0, + MAX = 1, } BorderColor :: enum c.int { @@ -243,6 +267,7 @@ BufferUsageFlag :: enum Flags { TRANSFORM_FEEDBACK_COUNTER_BUFFER_EXT = 12, CONDITIONAL_RENDERING_EXT = 9, EXECUTION_GRAPH_SCRATCH_AMDX = 25, + DESCRIPTOR_HEAP_EXT = 28, ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_KHR = 19, ACCELERATION_STRUCTURE_STORAGE_KHR = 20, SHADER_BINDING_TABLE_KHR = 10, @@ -253,6 +278,7 @@ BufferUsageFlag :: enum Flags { PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER_EXT = 26, MICROMAP_BUILD_INPUT_READ_ONLY_EXT = 23, MICROMAP_STORAGE_EXT = 24, + TILE_MEMORY_QCOM = 27, RAY_TRACING_NV = SHADER_BINDING_TABLE_KHR, SHADER_DEVICE_ADDRESS_EXT = SHADER_DEVICE_ADDRESS, SHADER_DEVICE_ADDRESS_KHR = SHADER_DEVICE_ADDRESS, @@ -266,16 +292,20 @@ BuildAccelerationStructureFlagKHR :: enum Flags { PREFER_FAST_BUILD = 3, LOW_MEMORY = 4, MOTION_NV = 5, - ALLOW_OPACITY_MICROMAP_UPDATE_EXT = 6, - ALLOW_DISABLE_OPACITY_MICROMAPS_EXT = 7, ALLOW_OPACITY_MICROMAP_DATA_UPDATE_EXT = 8, ALLOW_DISPLACEMENT_MICROMAP_UPDATE_NV = 9, ALLOW_DATA_ACCESS = 11, + ALLOW_CLUSTER_OPACITY_MICROMAPS_NV = 12, + ALLOW_OPACITY_MICROMAP_UPDATE = 6, + ALLOW_DISABLE_OPACITY_MICROMAPS = 7, + MICROMAP_LOSSY = 10, ALLOW_UPDATE_NV = ALLOW_UPDATE, ALLOW_COMPACTION_NV = ALLOW_COMPACTION, PREFER_FAST_TRACE_NV = PREFER_FAST_TRACE, PREFER_FAST_BUILD_NV = PREFER_FAST_BUILD, LOW_MEMORY_NV = LOW_MEMORY, + ALLOW_OPACITY_MICROMAP_UPDATE_EXT = ALLOW_OPACITY_MICROMAP_UPDATE, + ALLOW_DISABLE_OPACITY_MICROMAPS_EXT = ALLOW_DISABLE_OPACITY_MICROMAPS, } BuildAccelerationStructureModeKHR :: enum c.int { @@ -311,6 +341,9 @@ ClusterAccelerationStructureAddressResolutionFlagNV :: enum Flags { INDIRECTED_SRC_INFOS_COUNT = 5, } +ClusterAccelerationStructureAddressResolutionFlagsNV_NONE :: ClusterAccelerationStructureAddressResolutionFlagsNV{} + + ClusterAccelerationStructureClusterFlagsNV :: distinct bit_set[ClusterAccelerationStructureClusterFlagNV; Flags] ClusterAccelerationStructureClusterFlagNV :: enum Flags { ALLOW_DISABLE_OPACITY_MICROMAPS = 0, @@ -342,6 +375,7 @@ ClusterAccelerationStructureOpTypeNV :: enum c.int { BUILD_TRIANGLE_CLUSTER = 2, BUILD_TRIANGLE_CLUSTER_TEMPLATE = 3, INSTANTIATE_TRIANGLE_CLUSTER = 4, + GET_CLUSTER_TEMPLATE_INDICES = 5, } ClusterAccelerationStructureTypeNV :: enum c.int { @@ -448,10 +482,11 @@ ComponentTypeKHR :: enum c.int { UINT16 = 8, UINT32 = 9, UINT64 = 10, + BFLOAT16 = 1000141000, SINT8_PACKED_NV = 1000491000, UINT8_PACKED_NV = 1000491001, - FLOAT_E4M3_NV = 1000491002, - FLOAT_E5M2_NV = 1000491003, + FLOAT8_E4M3_EXT = 1000491002, + FLOAT8_E5M2_EXT = 1000491003, FLOAT16_NV = FLOAT16, FLOAT32_NV = FLOAT32, FLOAT64_NV = FLOAT64, @@ -463,6 +498,8 @@ ComponentTypeKHR :: enum c.int { UINT16_NV = UINT16, UINT32_NV = UINT32, UINT64_NV = UINT64, + FLOAT_E4M3_NV = FLOAT8_E4M3_EXT, + FLOAT_E5M2_NV = FLOAT8_E5M2_EXT, } CompositeAlphaFlagsKHR :: distinct bit_set[CompositeAlphaFlagKHR; Flags] @@ -473,6 +510,10 @@ CompositeAlphaFlagKHR :: enum Flags { INHERIT = 3, } +CompressedTriangleFormatAMDX :: enum c.int { + COMPRESSED_TRIANGLE_FORMAT_DGF1_AMDX = 0, +} + ConditionalRenderingFlagsEXT :: distinct bit_set[ConditionalRenderingFlagEXT; Flags] ConditionalRenderingFlagEXT :: enum Flags { INVERTED = 0, @@ -520,10 +561,10 @@ CoverageReductionModeNV :: enum c.int { } CubicFilterWeightsQCOM :: enum c.int { - CUBIC_FILTER_WEIGHTS_CATMULL_ROM_QCOM = 0, - CUBIC_FILTER_WEIGHTS_ZERO_TANGENT_CARDINAL_QCOM = 1, - CUBIC_FILTER_WEIGHTS_B_SPLINE_QCOM = 2, - CUBIC_FILTER_WEIGHTS_MITCHELL_NETRAVALI_QCOM = 3, + CATMULL_ROM = 0, + ZERO_TANGENT_CARDINAL = 1, + B_SPLINE = 2, + MITCHELL_NETRAVALI = 3, } CullModeFlags :: distinct bit_set[CullModeFlag; Flags] @@ -536,6 +577,97 @@ CullModeFlags_NONE :: CullModeFlags{} CullModeFlags_FRONT_AND_BACK :: CullModeFlags{.FRONT, .BACK} +DataGraphModelCacheTypeQCOM :: enum c.int { + GENERIC_BINARY = 0, +} + +DataGraphOpticalFlowCreateFlagsARM :: distinct bit_set[DataGraphOpticalFlowCreateFlagARM; Flags] +DataGraphOpticalFlowCreateFlagARM :: enum Flags { + ENABLE_HINT = 0, + ENABLE_COST = 1, + RESERVED_30 = 30, +} + +DataGraphOpticalFlowExecuteFlagsARM :: distinct bit_set[DataGraphOpticalFlowExecuteFlagARM; Flags] +DataGraphOpticalFlowExecuteFlagARM :: enum Flags { + DISABLE_TEMPORAL_HINTS = 0, + INPUT_UNCHANGED = 1, + REFERENCE_UNCHANGED = 2, + INPUT_IS_PREVIOUS_REFERENCE = 3, + REFERENCE_IS_PREVIOUS_INPUT = 4, +} + +DataGraphOpticalFlowGridSizeFlagsARM :: distinct bit_set[DataGraphOpticalFlowGridSizeFlagARM; Flags] +DataGraphOpticalFlowGridSizeFlagARM :: enum Flags { + _1X1 = 0, + _2X2 = 1, + _4X4 = 2, + _8X8 = 3, +} + +DataGraphOpticalFlowGridSizeFlagsARM_UNKNOWN :: DataGraphOpticalFlowGridSizeFlagsARM{} + + +DataGraphOpticalFlowImageUsageFlagsARM :: distinct bit_set[DataGraphOpticalFlowImageUsageFlagARM; Flags] +DataGraphOpticalFlowImageUsageFlagARM :: enum Flags { + INPUT = 0, + OUTPUT = 1, + HINT = 2, + COST = 3, +} + +DataGraphOpticalFlowImageUsageFlagsARM_UNKNOWN :: DataGraphOpticalFlowImageUsageFlagsARM{} + + +DataGraphOpticalFlowPerformanceLevelARM :: enum c.int { + UNKNOWN = 0, + SLOW = 1, + MEDIUM = 2, + FAST = 3, +} + +DataGraphPipelineNodeConnectionTypeARM :: enum c.int { + OPTICAL_FLOW_INPUT = 1000631000, + OPTICAL_FLOW_REFERENCE = 1000631001, + OPTICAL_FLOW_HINT = 1000631002, + OPTICAL_FLOW_FLOW_VECTOR = 1000631003, + OPTICAL_FLOW_COST = 1000631004, +} + +DataGraphPipelineNodeTypeARM :: enum c.int { + OPTICAL_FLOW = 1000631000, +} + +DataGraphPipelinePropertyARM :: enum c.int { + CREATION_LOG = 0, + IDENTIFIER = 1, + NEURAL_ACCELERATOR_DEBUG_DATABASE = 1000676000, + NEURAL_ACCELERATOR_STATISTICS_INFO = 1000676001, +} + +DataGraphPipelineSessionBindPointARM :: enum c.int { + TRANSIENT = 0, + OPTICAL_FLOW_CACHE = 1000631001, + NEURAL_ACCELERATOR_STATISTICS = 1000676000, +} + +DataGraphPipelineSessionBindPointTypeARM :: enum c.int { + MEMORY = 0, +} + +DataGraphTOSALevelARM :: enum c.int { + NONE = 0, + _8K = 1, +} + +DataGraphTOSAQualityFlagsARM :: distinct bit_set[DataGraphTOSAQualityFlagARM; Flags] +DataGraphTOSAQualityFlagARM :: enum Flags { + ACCELERATED = 0, + CONFORMANT = 1, + EXPERIMENTAL = 2, + DEPRECATED = 3, +} + DebugReportFlagsEXT :: distinct bit_set[DebugReportFlagEXT; Flags] DebugReportFlagEXT :: enum Flags { INFORMATION = 0, @@ -609,6 +741,11 @@ DebugUtilsMessageTypeFlagEXT :: enum Flags { DEVICE_ADDRESS_BINDING = 3, } +DefaultVertexAttributeValueKHR :: enum c.int { + ZERO_ZERO_ZERO_ZERO = 0, + ZERO_ZERO_ZERO_ONE = 1, +} + DependencyFlags :: distinct bit_set[DependencyFlag; Flags] DependencyFlag :: enum Flags { BY_REGION = 0, @@ -616,6 +753,7 @@ DependencyFlag :: enum Flags { VIEW_LOCAL = 1, FEEDBACK_LOOP_EXT = 3, QUEUE_FAMILY_OWNERSHIP_TRANSFER_USE_ALL_STAGES_KHR = 5, + ASYMMETRIC_EVENT_KHR = 6, VIEW_LOCAL_KHR = VIEW_LOCAL, DEVICE_GROUP_KHR = DEVICE_GROUP, } @@ -643,6 +781,20 @@ DescriptorBindingFlag :: enum Flags { VARIABLE_DESCRIPTOR_COUNT_EXT = VARIABLE_DESCRIPTOR_COUNT, } +DescriptorMappingSourceEXT :: enum c.int { + HEAP_WITH_CONSTANT_OFFSET = 0, + HEAP_WITH_PUSH_INDEX = 1, + HEAP_WITH_INDIRECT_INDEX = 2, + HEAP_WITH_INDIRECT_INDEX_ARRAY = 3, + RESOURCE_HEAP_DATA = 4, + PUSH_DATA = 5, + PUSH_ADDRESS = 6, + INDIRECT_ADDRESS = 7, + HEAP_WITH_SHADER_RECORD_INDEX = 8, + SHADER_RECORD_DATA = 9, + SHADER_RECORD_ADDRESS = 10, +} + DescriptorPoolCreateFlags :: distinct bit_set[DescriptorPoolCreateFlag; Flags] DescriptorPoolCreateFlag :: enum Flags { FREE_DESCRIPTOR_SET = 0, @@ -685,6 +837,7 @@ DescriptorType :: enum c.int { ACCELERATION_STRUCTURE_NV = 1000165000, SAMPLE_WEIGHT_IMAGE_QCOM = 1000440000, BLOCK_MATCH_IMAGE_QCOM = 1000440001, + TENSOR_ARM = 1000460000, MUTABLE_EXT = 1000351000, PARTITIONED_ACCELERATION_STRUCTURE_NV = 1000570000, INLINE_UNIFORM_BLOCK_EXT = INLINE_UNIFORM_BLOCK, @@ -720,18 +873,35 @@ DeviceEventTypeEXT :: enum c.int { DISPLAY_HOTPLUG = 0, } -DeviceFaultAddressTypeEXT :: enum c.int { - NONE = 0, - READ_INVALID = 1, - WRITE_INVALID = 2, - EXECUTE_INVALID = 3, - INSTRUCTION_POINTER_UNKNOWN = 4, - INSTRUCTION_POINTER_INVALID = 5, - INSTRUCTION_POINTER_FAULT = 6, +DeviceFaultAddressTypeKHR :: enum c.int { + NONE = 0, + READ_INVALID = 1, + WRITE_INVALID = 2, + EXECUTE_INVALID = 3, + INSTRUCTION_POINTER_UNKNOWN = 4, + INSTRUCTION_POINTER_INVALID = 5, + INSTRUCTION_POINTER_FAULT = 6, + READ_INVALID_EXT = READ_INVALID, + WRITE_INVALID_EXT = WRITE_INVALID, + EXECUTE_INVALID_EXT = EXECUTE_INVALID, + INSTRUCTION_POINTER_UNKNOWN_EXT = INSTRUCTION_POINTER_UNKNOWN, + INSTRUCTION_POINTER_INVALID_EXT = INSTRUCTION_POINTER_INVALID, + INSTRUCTION_POINTER_FAULT_EXT = INSTRUCTION_POINTER_FAULT, } -DeviceFaultVendorBinaryHeaderVersionEXT :: enum c.int { - ONE = 1, +DeviceFaultFlagsKHR :: distinct bit_set[DeviceFaultFlagKHR; Flags] +DeviceFaultFlagKHR :: enum Flags { + FLAG_DEVICE_LOST = 0, + FLAG_MEMORY_ADDRESS = 1, + FLAG_INSTRUCTION_ADDRESS = 2, + FLAG_VENDOR = 3, + FLAG_WATCHDOG_TIMEOUT = 4, + FLAG_OVERFLOW = 5, +} + +DeviceFaultVendorBinaryHeaderVersionKHR :: enum c.int { + ONE = 1, + ONE_EXT = ONE, } DeviceGroupPresentModeFlagsKHR :: distinct bit_set[DeviceGroupPresentModeFlagKHR; Flags] @@ -752,7 +922,8 @@ DeviceMemoryReportEventTypeEXT :: enum c.int { DeviceQueueCreateFlags :: distinct bit_set[DeviceQueueCreateFlag; Flags] DeviceQueueCreateFlag :: enum Flags { - PROTECTED = 0, + PROTECTED = 0, + INTERNALLY_SYNCHRONIZED_KHR = 2, } DirectDriverLoadingModeLUNARG :: enum c.int { @@ -824,6 +995,9 @@ DriverId :: enum c.int { IMAGINATION_OPEN_SOURCE_MESA = 25, MESA_HONEYKRISP = 26, VULKAN_SC_EMULATION_ON_VULKAN = 27, + MESA_KOSMICKRISP = 28, + MESA_GFXSTREAM = 29, + APE_SOFT = 30, AMD_PROPRIETARY_KHR = AMD_PROPRIETARY, AMD_OPEN_SOURCE_KHR = AMD_OPEN_SOURCE, MESA_RADV_KHR = MESA_RADV, @@ -999,6 +1173,7 @@ ExternalMemoryHandleTypeFlag :: enum Flags { HOST_MAPPED_FOREIGN_MEMORY_EXT = 8, ZIRCON_VMO_FUCHSIA = 11, RDMA_ADDRESS_NV = 12, + OH_NATIVE_BUFFER_OHOS = 15, SCREEN_BUFFER_QNX = 14, MTLBUFFER_EXT = 16, MTLTEXTURE_EXT = 17, @@ -1312,7 +1487,55 @@ Format :: enum c.int { PVRTC1_4BPP_SRGB_BLOCK_IMG = 1000054005, PVRTC2_2BPP_SRGB_BLOCK_IMG = 1000054006, PVRTC2_4BPP_SRGB_BLOCK_IMG = 1000054007, + ASTC_3x3x3_UNORM_BLOCK_EXT = 1000288000, + ASTC_3x3x3_SRGB_BLOCK_EXT = 1000288001, + ASTC_3x3x3_SFLOAT_BLOCK_EXT = 1000288002, + ASTC_4x3x3_UNORM_BLOCK_EXT = 1000288003, + ASTC_4x3x3_SRGB_BLOCK_EXT = 1000288004, + ASTC_4x3x3_SFLOAT_BLOCK_EXT = 1000288005, + ASTC_4x4x3_UNORM_BLOCK_EXT = 1000288006, + ASTC_4x4x3_SRGB_BLOCK_EXT = 1000288007, + ASTC_4x4x3_SFLOAT_BLOCK_EXT = 1000288008, + ASTC_4x4x4_UNORM_BLOCK_EXT = 1000288009, + ASTC_4x4x4_SRGB_BLOCK_EXT = 1000288010, + ASTC_4x4x4_SFLOAT_BLOCK_EXT = 1000288011, + ASTC_5x4x4_UNORM_BLOCK_EXT = 1000288012, + ASTC_5x4x4_SRGB_BLOCK_EXT = 1000288013, + ASTC_5x4x4_SFLOAT_BLOCK_EXT = 1000288014, + ASTC_5x5x4_UNORM_BLOCK_EXT = 1000288015, + ASTC_5x5x4_SRGB_BLOCK_EXT = 1000288016, + ASTC_5x5x4_SFLOAT_BLOCK_EXT = 1000288017, + ASTC_5x5x5_UNORM_BLOCK_EXT = 1000288018, + ASTC_5x5x5_SRGB_BLOCK_EXT = 1000288019, + ASTC_5x5x5_SFLOAT_BLOCK_EXT = 1000288020, + ASTC_6x5x5_UNORM_BLOCK_EXT = 1000288021, + ASTC_6x5x5_SRGB_BLOCK_EXT = 1000288022, + ASTC_6x5x5_SFLOAT_BLOCK_EXT = 1000288023, + ASTC_6x6x5_UNORM_BLOCK_EXT = 1000288024, + ASTC_6x6x5_SRGB_BLOCK_EXT = 1000288025, + ASTC_6x6x5_SFLOAT_BLOCK_EXT = 1000288026, + ASTC_6x6x6_UNORM_BLOCK_EXT = 1000288027, + ASTC_6x6x6_SRGB_BLOCK_EXT = 1000288028, + ASTC_6x6x6_SFLOAT_BLOCK_EXT = 1000288029, + R8_BOOL_ARM = 1000460000, + R16_SFLOAT_FPENCODING_BFLOAT16_ARM = 1000460001, + R8_SFLOAT_FPENCODING_FLOAT8E4M3_ARM = 1000460002, + R8_SFLOAT_FPENCODING_FLOAT8E5M2_ARM = 1000460003, R16G16_SFIXED5_NV = 1000464000, + R10X6_UINT_PACK16_ARM = 1000609000, + R10X6G10X6_UINT_2PACK16_ARM = 1000609001, + R10X6G10X6B10X6A10X6_UINT_4PACK16_ARM = 1000609002, + R12X4_UINT_PACK16_ARM = 1000609003, + R12X4G12X4_UINT_2PACK16_ARM = 1000609004, + R12X4G12X4B12X4A12X4_UINT_4PACK16_ARM = 1000609005, + R14X2_UINT_PACK16_ARM = 1000609006, + R14X2G14X2_UINT_2PACK16_ARM = 1000609007, + R14X2G14X2B14X2A14X2_UINT_4PACK16_ARM = 1000609008, + R14X2_UNORM_PACK16_ARM = 1000609009, + R14X2G14X2_UNORM_2PACK16_ARM = 1000609010, + R14X2G14X2B14X2A14X2_UNORM_4PACK16_ARM = 1000609011, + G14X2_B14X2R14X2_2PLANE_420_UNORM_3PACK16_ARM = 1000609012, + G14X2_B14X2R14X2_2PLANE_422_UNORM_3PACK16_ARM = 1000609013, ASTC_4x4_SFLOAT_BLOCK_EXT = ASTC_4x4_SFLOAT_BLOCK, ASTC_5x4_SFLOAT_BLOCK_EXT = ASTC_5x4_SFLOAT_BLOCK, ASTC_5x5_SFLOAT_BLOCK_EXT = ASTC_5x5_SFLOAT_BLOCK, @@ -1483,23 +1706,115 @@ GeometryInstanceFlagKHR :: enum Flags { TRIANGLE_FLIP_FACING = 1, FORCE_OPAQUE = 2, FORCE_NO_OPAQUE = 3, - FORCE_OPACITY_MICROMAP_2_STATE_EXT = 4, - DISABLE_OPACITY_MICROMAPS_EXT = 5, + FORCE_OPACITY_MICROMAP_2_STATE = 4, + DISABLE_OPACITY_MICROMAPS = 5, TRIANGLE_FRONT_COUNTERCLOCKWISE = TRIANGLE_FLIP_FACING, TRIANGLE_CULL_DISABLE_NV = TRIANGLE_FACING_CULL_DISABLE, TRIANGLE_FRONT_COUNTERCLOCKWISE_NV = TRIANGLE_FRONT_COUNTERCLOCKWISE, FORCE_OPAQUE_NV = FORCE_OPAQUE, FORCE_NO_OPAQUE_NV = FORCE_NO_OPAQUE, + FORCE_OPACITY_MICROMAP_2_STATE_EXT = FORCE_OPACITY_MICROMAP_2_STATE, + DISABLE_OPACITY_MICROMAPS_EXT = DISABLE_OPACITY_MICROMAPS, } GeometryTypeKHR :: enum c.int { - TRIANGLES = 0, - AABBS = 1, - INSTANCES = 2, - SPHERES_NV = 1000429004, - LINEAR_SWEPT_SPHERES_NV = 1000429005, - TRIANGLES_NV = TRIANGLES, - AABBS_NV = AABBS, + TRIANGLES = 0, + AABBS = 1, + INSTANCES = 2, + SPHERES_NV = 1000429004, + LINEAR_SWEPT_SPHERES_NV = 1000429005, + DENSE_GEOMETRY_FORMAT_TRIANGLES_AMDX = 1000478000, + MICROMAP = 1000623000, + TRIANGLES_NV = TRIANGLES, + AABBS_NV = AABBS, +} + +GpaDeviceClockModeAMD :: enum c.int { + DEFAULT = 0, + QUERY = 1, + PROFILING = 2, + MIN_MEMORY = 3, + MIN_ENGINE = 4, + PEAK = 5, +} + +GpaPerfBlockAMD :: enum c.int { + CPF = 0, + IA = 1, + VGT = 2, + PA = 3, + SC = 4, + SPI = 5, + SQ = 6, + SX = 7, + TA = 8, + TD = 9, + TCP = 10, + TCC = 11, + TCA = 12, + DB = 13, + CB = 14, + GDS = 15, + SRBM = 16, + GRBM = 17, + GRBM_SE = 18, + RLC = 19, + DMA = 20, + MC = 21, + CPG = 22, + CPC = 23, + WD = 24, + TCS = 25, + ATC = 26, + ATC_L2 = 27, + MC_VM_L2 = 28, + EA = 29, + RPB = 30, + RMI = 31, + UMCCH = 32, + GE = 33, + GL1A = 34, + GL1C = 35, + GL1CG = 36, + GL2A = 37, + GL2C = 38, + CHA = 39, + CHC = 40, + CHCG = 41, + GUS = 42, + GCR = 43, + PH = 44, + UTCL1 = 45, + GE_DIST = 46, + GE_SE = 47, + DF_MALL = 48, + SQ_WGP = 49, + PC = 50, + GL1XA = 51, + GL1XC = 52, + WGS = 53, + EACPWD = 54, + EASE = 55, + RLCUSER = 56, + GE1 = GE, + RLCLOCAL = RLCUSER, +} + +GpaSampleTypeAMD :: enum c.int { + CUMULATIVE = 0, + TRACE = 1, + TIMING = 2, +} + +GpaSqShaderStageFlagsAMD :: distinct bit_set[GpaSqShaderStageFlagAMD; Flags] +GpaSqShaderStageFlagAMD :: enum Flags { + PS = 0, + VS = 1, + GS = 2, + ES = 3, + HS = 4, + LS = 5, + CS = 6, } GraphicsPipelineLibraryFlagsEXT :: distinct bit_set[GraphicsPipelineLibraryFlagEXT; Flags] @@ -1593,19 +1908,22 @@ ImageCreateFlag :: enum Flags { PROTECTED = 11, DISJOINT = 9, CORNER_SAMPLED_NV = 13, + DESCRIPTOR_HEAP_CAPTURE_REPLAY_EXT = 16, SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_EXT = 12, SUBSAMPLED_EXT = 14, - DESCRIPTOR_BUFFER_CAPTURE_REPLAY_EXT = 16, MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_EXT = 18, D2_VIEW_COMPATIBLE_EXT = 17, - FRAGMENT_DENSITY_MAP_OFFSET_QCOM = 15, VIDEO_PROFILE_INDEPENDENT_KHR = 20, + FRAGMENT_DENSITY_MAP_OFFSET_EXT = 15, + ALIAS_SINGLE_LAYER_DESCRIPTOR_KHR = 22, SPLIT_INSTANCE_BIND_REGIONS_KHR = SPLIT_INSTANCE_BIND_REGIONS, D2_ARRAY_COMPATIBLE_KHR = D2_ARRAY_COMPATIBLE, BLOCK_TEXEL_VIEW_COMPATIBLE_KHR = BLOCK_TEXEL_VIEW_COMPATIBLE, EXTENDED_USAGE_KHR = EXTENDED_USAGE, DISJOINT_KHR = DISJOINT, ALIAS_KHR = ALIAS, + DESCRIPTOR_BUFFER_CAPTURE_REPLAY_EXT = DESCRIPTOR_HEAP_CAPTURE_REPLAY_EXT, + FRAGMENT_DENSITY_MAP_OFFSET_QCOM = FRAGMENT_DENSITY_MAP_OFFSET_EXT, } ImageLayout :: enum c.int { @@ -1638,7 +1956,9 @@ ImageLayout :: enum c.int { VIDEO_ENCODE_SRC_KHR = 1000299001, VIDEO_ENCODE_DPB_KHR = 1000299002, ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT = 1000339000, + TENSOR_ALIASING_ARM = 1000460000, VIDEO_ENCODE_QUANTIZATION_MAP_KHR = 1000553000, + ZERO_INITIALIZED_EXT = 1000620000, DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL_KHR = DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL_KHR = DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, SHADING_RATE_OPTIMAL_NV = FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR, @@ -1686,6 +2006,8 @@ ImageUsageFlag :: enum Flags { INVOCATION_MASK_HUAWEI = 18, SAMPLE_WEIGHT_QCOM = 20, SAMPLE_BLOCK_MATCH_QCOM = 21, + TENSOR_ALIASING_ARM = 23, + TILE_MEMORY_QCOM = 27, VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_KHR = 25, VIDEO_ENCODE_EMPHASIS_MAP_KHR = 26, SHADING_RATE_IMAGE_NV = FRAGMENT_SHADING_RATE_ATTACHMENT_KHR, @@ -1749,6 +2071,8 @@ IndirectCommandsTokenTypeEXT :: enum c.int { DRAW_INDEXED_COUNT = 7, DRAW_COUNT = 8, DISPATCH = 9, + PUSH_DATA = 1000135000, + PUSH_DATA_SEQUENCE_INDEX = 1000135001, DRAW_MESH_TASKS_NV = 1000202002, DRAW_MESH_TASKS_COUNT_NV = 1000202003, DRAW_MESH_TASKS = 1000328000, @@ -1765,6 +2089,7 @@ IndirectCommandsTokenTypeNV :: enum c.int { DRAW_INDEXED = 5, DRAW = 6, DRAW_TASKS = 7, + PUSH_DATA = 1000135000, DRAW_MESH_TASKS = 1000328000, PIPELINE = 1000428003, DISPATCH = 1000428004, @@ -1859,6 +2184,7 @@ MemoryAllocateFlag :: enum Flags { DEVICE_MASK = 0, DEVICE_ADDRESS = 1, DEVICE_ADDRESS_CAPTURE_REPLAY = 2, + ZERO_INITIALIZE_EXT = 3, DEVICE_MASK_KHR = DEVICE_MASK, DEVICE_ADDRESS_KHR = DEVICE_ADDRESS, DEVICE_ADDRESS_CAPTURE_REPLAY_KHR = DEVICE_ADDRESS_CAPTURE_REPLAY, @@ -1868,6 +2194,7 @@ MemoryHeapFlags :: distinct bit_set[MemoryHeapFlag; Flags] MemoryHeapFlag :: enum Flags { DEVICE_LOCAL = 0, MULTI_INSTANCE = 1, + TILE_MEMORY_QCOM = 3, MULTI_INSTANCE_KHR = MULTI_INSTANCE, } @@ -1910,6 +2237,12 @@ MicromapTypeEXT :: enum c.int { DISPLACEMENT_MICROMAP_NV = 1000397000, } +NeuralAcceleratorStatisticsModeARM :: enum c.int { + DISABLED = 0, + STATISTICS0 = 1, + STATISTICS1 = 2, +} + ObjectType :: enum c.int { UNKNOWN = 0, INSTANCE = 1, @@ -1937,8 +2270,8 @@ ObjectType :: enum c.int { DESCRIPTOR_SET = 23, FRAMEBUFFER = 24, COMMAND_POOL = 25, - SAMPLER_YCBCR_CONVERSION = 1000156000, DESCRIPTOR_UPDATE_TEMPLATE = 1000085000, + SAMPLER_YCBCR_CONVERSION = 1000156000, PRIVATE_DATA_SLOT = 1000295000, SURFACE_KHR = 1000000000, SWAPCHAIN_KHR = 1000001000, @@ -1950,6 +2283,7 @@ ObjectType :: enum c.int { CU_MODULE_NVX = 1000029000, CU_FUNCTION_NVX = 1000029001, DEBUG_UTILS_MESSENGER_EXT = 1000128000, + GPA_SESSION_AMD = 1000133000, ACCELERATION_STRUCTURE_KHR = 1000150000, VALIDATION_CACHE_EXT = 1000160000, ACCELERATION_STRUCTURE_NV = 1000165000, @@ -1960,27 +2294,38 @@ ObjectType :: enum c.int { CUDA_FUNCTION_NV = 1000307001, BUFFER_COLLECTION_FUCHSIA = 1000366000, MICROMAP_EXT = 1000396000, + TENSOR_ARM = 1000460000, + TENSOR_VIEW_ARM = 1000460001, OPTICAL_FLOW_SESSION_NV = 1000464000, SHADER_EXT = 1000482000, PIPELINE_BINARY_KHR = 1000483000, + DATA_GRAPH_PIPELINE_SESSION_ARM = 1000507000, + EXTERNAL_COMPUTE_QUEUE_NV = 1000556000, INDIRECT_COMMANDS_LAYOUT_EXT = 1000572000, INDIRECT_EXECUTION_SET_EXT = 1000572001, + SHADER_INSTRUMENTATION_ARM = 1000607000, DESCRIPTOR_UPDATE_TEMPLATE_KHR = DESCRIPTOR_UPDATE_TEMPLATE, SAMPLER_YCBCR_CONVERSION_KHR = SAMPLER_YCBCR_CONVERSION, PRIVATE_DATA_SLOT_EXT = PRIVATE_DATA_SLOT, } -OpacityMicromapFormatEXT :: enum c.int { - _2_STATE = 1, - _4_STATE = 2, +OpacityMicromapFormatKHR :: enum c.int { + _2_STATE = 1, + _4_STATE = 2, + _2_STATE_EXT = _2_STATE, + _4_STATE_EXT = _4_STATE, } -OpacityMicromapSpecialIndexEXT :: enum c.int { +OpacityMicromapSpecialIndexKHR :: enum c.int { FULLY_TRANSPARENT = -1, FULLY_OPAQUE = -2, FULLY_UNKNOWN_TRANSPARENT = -3, FULLY_UNKNOWN_OPAQUE = -4, CLUSTER_GEOMETRY_DISABLE_OPACITY_MICROMAP_NV = -5, + FULLY_TRANSPARENT_EXT = FULLY_TRANSPARENT, + FULLY_OPAQUE_EXT = FULLY_OPAQUE, + FULLY_UNKNOWN_TRANSPARENT_EXT = FULLY_UNKNOWN_TRANSPARENT, + FULLY_UNKNOWN_OPAQUE_EXT = FULLY_UNKNOWN_OPAQUE, } OpticalFlowExecuteFlagsNV :: distinct bit_set[OpticalFlowExecuteFlagNV; Flags] @@ -2059,6 +2404,12 @@ PartitionedAccelerationStructureOpTypeNV :: enum c.int { WRITE_PARTITION_TRANSLATION = 2, } +PastPresentationTimingFlagsEXT :: distinct bit_set[PastPresentationTimingFlagEXT; Flags] +PastPresentationTimingFlagEXT :: enum Flags { + ALLOW_PARTIAL_RESULTS = 0, + ALLOW_OUT_OF_ORDER_RESULTS = 1, +} + PeerMemoryFeatureFlags :: distinct bit_set[PeerMemoryFeatureFlag; Flags] PeerMemoryFeatureFlag :: enum Flags { COPY_SRC = 0, @@ -2071,6 +2422,13 @@ PeerMemoryFeatureFlag :: enum Flags { GENERIC_DST_KHR = GENERIC_DST, } +PerfHintTypeQCOM :: enum c.int { + DEFAULT = 0, + FREQUENCY_MIN = 1, + FREQUENCY_MAX = 2, + FREQUENCY_SCALED = 3, +} + PerformanceConfigurationTypeINTEL :: enum c.int { PERFORMANCE_CONFIGURATION_TYPE_COMMAND_QUEUE_METRICS_DISCOVERY_ACTIVATED_INTEL = 0, } @@ -2131,6 +2489,19 @@ PerformanceValueTypeINTEL :: enum c.int { PERFORMANCE_VALUE_TYPE_STRING_INTEL = 4, } +PhysicalDeviceDataGraphOperationTypeARM :: enum c.int { + SPIRV_EXTENDED_INSTRUCTION_SET = 0, + NEURAL_MODEL_QCOM = 1000629000, + BUILTIN_MODEL_QCOM = 1000629001, + OPTICAL_FLOW = 1000631000, +} + +PhysicalDeviceDataGraphProcessingEngineTypeARM :: enum c.int { + DEFAULT = 0, + NEURAL_QCOM = 1000629000, + COMPUTE_QCOM = 1000629001, +} + PhysicalDeviceLayeredApiKHR :: enum c.int { VULKAN = 0, D3D12 = 1, @@ -2153,6 +2524,7 @@ PipelineBindPoint :: enum c.int { EXECUTION_GRAPH_AMDX = 1000134000, RAY_TRACING_KHR = 1000165000, SUBPASS_SHADING_HUAWEI = 1000369003, + DATA_GRAPH_ARM = 1000507000, RAY_TRACING_NV = RAY_TRACING_KHR, } @@ -2164,7 +2536,8 @@ PipelineCacheCreateFlag :: enum Flags { } PipelineCacheHeaderVersion :: enum c.int { - ONE = 1, + ONE = 1, + DATA_GRAPH_QCOM = 1000629000, } PipelineColorBlendStateCreateFlags :: distinct bit_set[PipelineColorBlendStateCreateFlag; Flags] @@ -2182,8 +2555,8 @@ PipelineCreateFlag :: enum Flags { DISABLE_OPTIMIZATION = 0, ALLOW_DERIVATIVES = 1, DERIVATIVE = 2, - VIEW_INDEX_FROM_DEVICE_INDEX = 3, DISPATCH_BASE = 4, + VIEW_INDEX_FROM_DEVICE_INDEX = 3, FAIL_ON_PIPELINE_COMPILE_REQUIRED = 8, EARLY_RETURN_ON_FAILURE = 9, NO_PROTECTED_ACCESS = 27, @@ -2208,14 +2581,15 @@ PipelineCreateFlag :: enum Flags { RAY_TRACING_ALLOW_MOTION_NV = 20, COLOR_ATTACHMENT_FEEDBACK_LOOP_EXT = 25, DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_EXT = 26, - RAY_TRACING_OPACITY_MICROMAP_EXT = 24, RAY_TRACING_DISPLACEMENT_MICROMAP_NV = 28, + RAY_TRACING_OPACITY_MICROMAP_KHR = 24, VIEW_INDEX_FROM_DEVICE_INDEX_KHR = VIEW_INDEX_FROM_DEVICE_INDEX, DISPATCH_BASE_KHR = DISPATCH_BASE, PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_EXT = RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_EXT, PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_KHR = RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_KHR, FAIL_ON_PIPELINE_COMPILE_REQUIRED_EXT = FAIL_ON_PIPELINE_COMPILE_REQUIRED, EARLY_RETURN_ON_FAILURE_EXT = EARLY_RETURN_ON_FAILURE, + RAY_TRACING_OPACITY_MICROMAP_EXT = RAY_TRACING_OPACITY_MICROMAP_KHR, NO_PROTECTED_ACCESS_EXT = NO_PROTECTED_ACCESS, PROTECTED_ACCESS_ONLY_EXT = PROTECTED_ACCESS_ONLY, } @@ -2248,6 +2622,7 @@ PipelineExecutableStatisticFormatKHR :: enum c.int { PipelineLayoutCreateFlags :: distinct bit_set[PipelineLayoutCreateFlag; Flags] PipelineLayoutCreateFlag :: enum Flags { INDEPENDENT_SETS_EXT = 1, + NO_TASK_SHADER_KHR = 2, } PipelineRobustnessBufferBehavior :: enum c.int { @@ -2305,15 +2680,15 @@ PipelineStageFlag :: enum Flags { RAY_TRACING_SHADER_KHR = 21, FRAGMENT_DENSITY_PROCESS_EXT = 23, FRAGMENT_SHADING_RATE_ATTACHMENT_KHR = 22, - COMMAND_PREPROCESS_NV = 17, TASK_SHADER_EXT = 19, MESH_SHADER_EXT = 20, + COMMAND_PREPROCESS_EXT = 17, SHADING_RATE_IMAGE_NV = FRAGMENT_SHADING_RATE_ATTACHMENT_KHR, RAY_TRACING_SHADER_NV = RAY_TRACING_SHADER_KHR, ACCELERATION_STRUCTURE_BUILD_NV = ACCELERATION_STRUCTURE_BUILD_KHR, TASK_SHADER_NV = TASK_SHADER_EXT, MESH_SHADER_NV = MESH_SHADER_EXT, - COMMAND_PREPROCESS_EXT = COMMAND_PREPROCESS_NV, + COMMAND_PREPROCESS_NV = COMMAND_PREPROCESS_EXT, } PipelineStageFlags_NONE :: PipelineStageFlags{} @@ -2333,11 +2708,14 @@ PolygonMode :: enum c.int { FILL_RECTANGLE_NV = 1000153000, } -PresentGravityFlagsEXT :: distinct bit_set[PresentGravityFlagEXT; Flags] -PresentGravityFlagEXT :: enum Flags { - MIN = 0, - MAX = 1, - CENTERED = 2, +PresentGravityFlagsKHR :: distinct bit_set[PresentGravityFlagKHR; Flags] +PresentGravityFlagKHR :: enum Flags { + MIN = 0, + MAX = 1, + CENTERED = 2, + MIN_EXT = MIN, + MAX_EXT = MAX, + CENTERED_EXT = CENTERED, } PresentModeKHR :: enum c.int { @@ -2347,14 +2725,32 @@ PresentModeKHR :: enum c.int { FIFO_RELAXED = 3, SHARED_DEMAND_REFRESH = 1000111000, SHARED_CONTINUOUS_REFRESH = 1000111001, - FIFO_LATEST_READY_EXT = 1000361000, + FIFO_LATEST_READY = 1000361000, + FIFO_LATEST_READY_EXT = FIFO_LATEST_READY, } -PresentScalingFlagsEXT :: distinct bit_set[PresentScalingFlagEXT; Flags] -PresentScalingFlagEXT :: enum Flags { - ONE_TO_ONE = 0, - ASPECT_RATIO_STRETCH = 1, - STRETCH = 2, +PresentScalingFlagsKHR :: distinct bit_set[PresentScalingFlagKHR; Flags] +PresentScalingFlagKHR :: enum Flags { + ONE_TO_ONE = 0, + ASPECT_RATIO_STRETCH = 1, + STRETCH = 2, + ONE_TO_ONE_EXT = ONE_TO_ONE, + ASPECT_RATIO_STRETCH_EXT = ASPECT_RATIO_STRETCH, + STRETCH_EXT = STRETCH, +} + +PresentStageFlagsEXT :: distinct bit_set[PresentStageFlagEXT; Flags] +PresentStageFlagEXT :: enum Flags { + QUEUE_OPERATIONS_END = 0, + REQUEST_DEQUEUED = 1, + IMAGE_FIRST_PIXEL_OUT = 2, + IMAGE_FIRST_PIXEL_VISIBLE = 3, +} + +PresentTimingInfoFlagsEXT :: distinct bit_set[PresentTimingInfoFlagEXT; Flags] +PresentTimingInfoFlagEXT :: enum Flags { + PRESENT_AT_RELATIVE_TIME = 0, + PRESENT_AT_NEAREST_REFRESH_CYCLE = 1, } PrimitiveTopology :: enum c.int { @@ -2399,6 +2795,11 @@ QueryPipelineStatisticFlag :: enum Flags { CLUSTER_CULLING_SHADER_INVOCATIONS_HUAWEI = 13, } +QueryPoolCreateFlags :: distinct bit_set[QueryPoolCreateFlag; Flags] +QueryPoolCreateFlag :: enum Flags { + RESET_KHR = 0, +} + QueryPoolSamplingModeINTEL :: enum c.int { QUERY_POOL_SAMPLING_MODE_MANUAL_INTEL = 0, } @@ -2429,6 +2830,7 @@ QueryType :: enum c.int { ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR = 1000150000, ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR = 1000150001, ACCELERATION_STRUCTURE_COMPACTED_SIZE_NV = 1000165000, + TIME_ELAPSED_QCOM = 1000173000, PERFORMANCE_QUERY_INTEL = 1000210000, VIDEO_ENCODE_FEEDBACK_KHR = 1000299000, MESH_PRIMITIVES_GENERATED_EXT = 1000328000, @@ -2449,6 +2851,7 @@ QueueFlag :: enum Flags { VIDEO_DECODE_KHR = 5, VIDEO_ENCODE_KHR = 6, OPTICAL_FLOW_NV = 8, + DATA_GRAPH_ARM = 10, } QueueGlobalPriority :: enum c.int { @@ -2471,9 +2874,10 @@ RasterizationOrderAMD :: enum c.int { RELAXED = 1, } -RayTracingInvocationReorderModeNV :: enum c.int { - NONE = 0, - REORDER = 1, +RayTracingInvocationReorderModeEXT :: enum c.int { + NONE = 0, + REORDER = 1, + REORDER_NV = REORDER, } RayTracingLssIndexingModeNV :: enum c.int { @@ -2497,20 +2901,38 @@ RayTracingShaderGroupTypeKHR :: enum c.int { RenderPassCreateFlags :: distinct bit_set[RenderPassCreateFlag; Flags] RenderPassCreateFlag :: enum Flags { - TRANSFORM_QCOM = 1, + TRANSFORM_QCOM = 1, + PER_LAYER_FRAGMENT_DENSITY_VALVE = 2, +} + +RenderingAttachmentFlagsKHR :: distinct bit_set[RenderingAttachmentFlagKHR; Flags] +RenderingAttachmentFlagKHR :: enum Flags { + INPUT_ATTACHMENT_FEEDBACK = 0, + RESOLVE_SKIP_TRANSFER_FUNCTION = 1, + RESOLVE_ENABLE_TRANSFER_FUNCTION = 2, } RenderingFlags :: distinct bit_set[RenderingFlag; Flags] RenderingFlag :: enum Flags { - CONTENTS_SECONDARY_COMMAND_BUFFERS = 0, - SUSPENDING = 1, - RESUMING = 2, - ENABLE_LEGACY_DITHERING_EXT = 3, - CONTENTS_INLINE_KHR = 4, - CONTENTS_SECONDARY_COMMAND_BUFFERS_KHR = CONTENTS_SECONDARY_COMMAND_BUFFERS, - SUSPENDING_KHR = SUSPENDING, - RESUMING_KHR = RESUMING, - CONTENTS_INLINE_EXT = CONTENTS_INLINE_KHR, + CONTENTS_SECONDARY_COMMAND_BUFFERS = 0, + SUSPENDING = 1, + RESUMING = 2, + ENABLE_LEGACY_DITHERING_EXT = 3, + CONTENTS_INLINE_KHR = 4, + PER_LAYER_FRAGMENT_DENSITY_VALVE = 5, + FRAGMENT_REGION_EXT = 6, + CUSTOM_RESOLVE_EXT = 7, + LOCAL_READ_CONCURRENT_ACCESS_CONTROL_KHR = 8, + CONTENTS_SECONDARY_COMMAND_BUFFERS_KHR = CONTENTS_SECONDARY_COMMAND_BUFFERS, + SUSPENDING_KHR = SUSPENDING, + RESUMING_KHR = RESUMING, + CONTENTS_INLINE_EXT = CONTENTS_INLINE_KHR, +} + +ResolveImageFlagsKHR :: distinct bit_set[ResolveImageFlagKHR; Flags] +ResolveImageFlagKHR :: enum Flags { + SKIP_TRANSFER_FUNCTION = 0, + ENABLE_TRANSFER_FUNCTION = 1, } ResolveModeFlags :: distinct bit_set[ResolveModeFlag; Flags] @@ -2520,6 +2942,7 @@ ResolveModeFlag :: enum Flags { MIN = 2, MAX = 3, EXTERNAL_FORMAT_DOWNSAMPLE_ANDROID = 4, + CUSTOM_EXT = 5, SAMPLE_ZERO_KHR = SAMPLE_ZERO, AVERAGE_KHR = AVERAGE, MIN_KHR = MIN, @@ -2549,10 +2972,11 @@ Result :: enum c.int { ERROR_FORMAT_NOT_SUPPORTED = -11, ERROR_FRAGMENTED_POOL = -12, ERROR_UNKNOWN = -13, + ERROR_VALIDATION_FAILED = -1000011001, ERROR_OUT_OF_POOL_MEMORY = -1000069000, ERROR_INVALID_EXTERNAL_HANDLE = -1000072003, - ERROR_FRAGMENTATION = -1000161000, ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS = -1000257000, + ERROR_FRAGMENTATION = -1000161000, PIPELINE_COMPILE_REQUIRED = 1000297000, ERROR_NOT_PERMITTED = -1000174001, ERROR_SURFACE_LOST_KHR = -1000000000, @@ -2560,7 +2984,6 @@ Result :: enum c.int { SUBOPTIMAL_KHR = 1000001003, ERROR_OUT_OF_DATE_KHR = -1000001004, ERROR_INCOMPATIBLE_DISPLAY_KHR = -1000003001, - ERROR_VALIDATION_FAILED_EXT = -1000011001, ERROR_INVALID_SHADER_NV = -1000012000, ERROR_IMAGE_USAGE_NOT_SUPPORTED_KHR = -1000023000, ERROR_VIDEO_PICTURE_LAYOUT_NOT_SUPPORTED_KHR = -1000023001, @@ -2569,6 +2992,7 @@ Result :: enum c.int { ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR = -1000023004, ERROR_VIDEO_STD_VERSION_NOT_SUPPORTED_KHR = -1000023005, ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT = -1000158000, + ERROR_PRESENT_TIMING_QUEUE_FULL_EXT = -1000208000, ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT = -1000255000, THREAD_IDLE_KHR = 1000268000, THREAD_DONE_KHR = 1000268001, @@ -2579,6 +3003,7 @@ Result :: enum c.int { INCOMPATIBLE_SHADER_BINARY_EXT = 1000482000, PIPELINE_BINARY_MISSING_KHR = 1000483000, ERROR_NOT_ENOUGH_SPACE_KHR = -1000483000, + ERROR_VALIDATION_FAILED_EXT = ERROR_VALIDATION_FAILED, ERROR_OUT_OF_POOL_MEMORY_KHR = ERROR_OUT_OF_POOL_MEMORY, ERROR_INVALID_EXTERNAL_HANDLE_KHR = ERROR_INVALID_EXTERNAL_HANDLE, ERROR_FRAGMENTATION_EXT = ERROR_FRAGMENTATION, @@ -2696,14 +3121,19 @@ ShaderCorePropertiesFlagAMD :: enum Flags { ShaderCreateFlagsEXT :: distinct bit_set[ShaderCreateFlagEXT; Flags] ShaderCreateFlagEXT :: enum Flags { - LINK_STAGE = 0, - ALLOW_VARYING_SUBGROUP_SIZE = 1, - REQUIRE_FULL_SUBGROUPS = 2, - NO_TASK_SHADER = 3, - DISPATCH_BASE = 4, - FRAGMENT_SHADING_RATE_ATTACHMENT = 5, - FRAGMENT_DENSITY_MAP_ATTACHMENT = 6, - INDIRECT_BINDABLE = 7, + LINK_STAGE = 0, + DESCRIPTOR_HEAP = 10, + INSTRUMENT_SHADER_ARM = 11, + ALLOW_VARYING_SUBGROUP_SIZE = 1, + REQUIRE_FULL_SUBGROUPS = 2, + NO_TASK_SHADER = 3, + DISPATCH_BASE = 4, + FRAGMENT_SHADING_RATE_ATTACHMENT = 5, + FRAGMENT_DENSITY_MAP_ATTACHMENT = 6, + INDIRECT_BINDABLE = 7, + OPACITY_MICROMAP_DISALLOW_MIXED_SPECIAL_INDEX = 12, + _64_INDEXING = 15, + INDEPENDENT_SETS_KHR = 18, } ShaderFloatControlsIndependence :: enum c.int { @@ -2792,6 +3222,24 @@ SparseMemoryBindFlag :: enum Flags { METADATA = 0, } +SpirvResourceTypeFlagsEXT :: distinct bit_set[SpirvResourceTypeFlagEXT; Flags] +SpirvResourceTypeFlagEXT :: enum Flags { + SAMPLER = 0, + SAMPLED_IMAGE = 1, + READ_ONLY_IMAGE = 2, + READ_WRITE_IMAGE = 3, + COMBINED_SAMPLED_IMAGE = 4, + UNIFORM_BUFFER = 5, + READ_ONLY_STORAGE_BUFFER = 6, + READ_WRITE_STORAGE_BUFFER = 7, + ACCELERATION_STRUCTURE = 8, + TENSOR_ARM = 9, + _MAX = 31, // Needed for the *_ALL bit set +} + +SpirvResourceTypeFlagsEXT_ALL :: SpirvResourceTypeFlagsEXT{.SAMPLER, .SAMPLED_IMAGE, .READ_ONLY_IMAGE, .READ_WRITE_IMAGE, .COMBINED_SAMPLED_IMAGE, .UNIFORM_BUFFER, .READ_ONLY_STORAGE_BUFFER, .READ_WRITE_STORAGE_BUFFER, .ACCELERATION_STRUCTURE, .TENSOR_ARM, SpirvResourceTypeFlagEXT(10), SpirvResourceTypeFlagEXT(11), SpirvResourceTypeFlagEXT(12), SpirvResourceTypeFlagEXT(13), SpirvResourceTypeFlagEXT(14), SpirvResourceTypeFlagEXT(15), SpirvResourceTypeFlagEXT(16), SpirvResourceTypeFlagEXT(17), SpirvResourceTypeFlagEXT(18), SpirvResourceTypeFlagEXT(19), SpirvResourceTypeFlagEXT(20), SpirvResourceTypeFlagEXT(21), SpirvResourceTypeFlagEXT(22), SpirvResourceTypeFlagEXT(23), SpirvResourceTypeFlagEXT(24), SpirvResourceTypeFlagEXT(25), SpirvResourceTypeFlagEXT(26), SpirvResourceTypeFlagEXT(27), SpirvResourceTypeFlagEXT(28), SpirvResourceTypeFlagEXT(29), SpirvResourceTypeFlagEXT(30)} + + StencilFaceFlags :: distinct bit_set[StencilFaceFlag; Flags] StencilFaceFlag :: enum Flags { FRONT = 0, @@ -2813,1242 +3261,1505 @@ StencilOp :: enum c.int { } StructureType :: enum c.int { - APPLICATION_INFO = 0, - INSTANCE_CREATE_INFO = 1, - DEVICE_QUEUE_CREATE_INFO = 2, - DEVICE_CREATE_INFO = 3, - SUBMIT_INFO = 4, - MEMORY_ALLOCATE_INFO = 5, - MAPPED_MEMORY_RANGE = 6, - BIND_SPARSE_INFO = 7, - FENCE_CREATE_INFO = 8, - SEMAPHORE_CREATE_INFO = 9, - EVENT_CREATE_INFO = 10, - QUERY_POOL_CREATE_INFO = 11, - BUFFER_CREATE_INFO = 12, - BUFFER_VIEW_CREATE_INFO = 13, - IMAGE_CREATE_INFO = 14, - IMAGE_VIEW_CREATE_INFO = 15, - SHADER_MODULE_CREATE_INFO = 16, - PIPELINE_CACHE_CREATE_INFO = 17, - PIPELINE_SHADER_STAGE_CREATE_INFO = 18, - PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO = 19, - PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO = 20, - PIPELINE_TESSELLATION_STATE_CREATE_INFO = 21, - PIPELINE_VIEWPORT_STATE_CREATE_INFO = 22, - PIPELINE_RASTERIZATION_STATE_CREATE_INFO = 23, - PIPELINE_MULTISAMPLE_STATE_CREATE_INFO = 24, - PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO = 25, - PIPELINE_COLOR_BLEND_STATE_CREATE_INFO = 26, - PIPELINE_DYNAMIC_STATE_CREATE_INFO = 27, - GRAPHICS_PIPELINE_CREATE_INFO = 28, - COMPUTE_PIPELINE_CREATE_INFO = 29, - PIPELINE_LAYOUT_CREATE_INFO = 30, - SAMPLER_CREATE_INFO = 31, - DESCRIPTOR_SET_LAYOUT_CREATE_INFO = 32, - DESCRIPTOR_POOL_CREATE_INFO = 33, - DESCRIPTOR_SET_ALLOCATE_INFO = 34, - WRITE_DESCRIPTOR_SET = 35, - COPY_DESCRIPTOR_SET = 36, - FRAMEBUFFER_CREATE_INFO = 37, - RENDER_PASS_CREATE_INFO = 38, - COMMAND_POOL_CREATE_INFO = 39, - COMMAND_BUFFER_ALLOCATE_INFO = 40, - COMMAND_BUFFER_INHERITANCE_INFO = 41, - COMMAND_BUFFER_BEGIN_INFO = 42, - RENDER_PASS_BEGIN_INFO = 43, - BUFFER_MEMORY_BARRIER = 44, - IMAGE_MEMORY_BARRIER = 45, - MEMORY_BARRIER = 46, - LOADER_INSTANCE_CREATE_INFO = 47, - LOADER_DEVICE_CREATE_INFO = 48, - PHYSICAL_DEVICE_SUBGROUP_PROPERTIES = 1000094000, - BIND_BUFFER_MEMORY_INFO = 1000157000, - BIND_IMAGE_MEMORY_INFO = 1000157001, - PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES = 1000083000, - MEMORY_DEDICATED_REQUIREMENTS = 1000127000, - MEMORY_DEDICATED_ALLOCATE_INFO = 1000127001, - MEMORY_ALLOCATE_FLAGS_INFO = 1000060000, - DEVICE_GROUP_RENDER_PASS_BEGIN_INFO = 1000060003, - DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO = 1000060004, - DEVICE_GROUP_SUBMIT_INFO = 1000060005, - DEVICE_GROUP_BIND_SPARSE_INFO = 1000060006, - BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO = 1000060013, - BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO = 1000060014, - PHYSICAL_DEVICE_GROUP_PROPERTIES = 1000070000, - DEVICE_GROUP_DEVICE_CREATE_INFO = 1000070001, - BUFFER_MEMORY_REQUIREMENTS_INFO_2 = 1000146000, - IMAGE_MEMORY_REQUIREMENTS_INFO_2 = 1000146001, - IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2 = 1000146002, - MEMORY_REQUIREMENTS_2 = 1000146003, - SPARSE_IMAGE_MEMORY_REQUIREMENTS_2 = 1000146004, - PHYSICAL_DEVICE_FEATURES_2 = 1000059000, - PHYSICAL_DEVICE_PROPERTIES_2 = 1000059001, - FORMAT_PROPERTIES_2 = 1000059002, - IMAGE_FORMAT_PROPERTIES_2 = 1000059003, - PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2 = 1000059004, - QUEUE_FAMILY_PROPERTIES_2 = 1000059005, - PHYSICAL_DEVICE_MEMORY_PROPERTIES_2 = 1000059006, - SPARSE_IMAGE_FORMAT_PROPERTIES_2 = 1000059007, - PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2 = 1000059008, - PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES = 1000117000, - RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO = 1000117001, - IMAGE_VIEW_USAGE_CREATE_INFO = 1000117002, - PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO = 1000117003, - RENDER_PASS_MULTIVIEW_CREATE_INFO = 1000053000, - PHYSICAL_DEVICE_MULTIVIEW_FEATURES = 1000053001, - PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES = 1000053002, - PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES = 1000120000, - PROTECTED_SUBMIT_INFO = 1000145000, - PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES = 1000145001, - PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES = 1000145002, - DEVICE_QUEUE_INFO_2 = 1000145003, - SAMPLER_YCBCR_CONVERSION_CREATE_INFO = 1000156000, - SAMPLER_YCBCR_CONVERSION_INFO = 1000156001, - BIND_IMAGE_PLANE_MEMORY_INFO = 1000156002, - IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO = 1000156003, - PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES = 1000156004, - SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES = 1000156005, - DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO = 1000085000, - PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO = 1000071000, - EXTERNAL_IMAGE_FORMAT_PROPERTIES = 1000071001, - PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO = 1000071002, - EXTERNAL_BUFFER_PROPERTIES = 1000071003, - PHYSICAL_DEVICE_ID_PROPERTIES = 1000071004, - EXTERNAL_MEMORY_BUFFER_CREATE_INFO = 1000072000, - EXTERNAL_MEMORY_IMAGE_CREATE_INFO = 1000072001, - EXPORT_MEMORY_ALLOCATE_INFO = 1000072002, - PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO = 1000112000, - EXTERNAL_FENCE_PROPERTIES = 1000112001, - EXPORT_FENCE_CREATE_INFO = 1000113000, - EXPORT_SEMAPHORE_CREATE_INFO = 1000077000, - PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO = 1000076000, - EXTERNAL_SEMAPHORE_PROPERTIES = 1000076001, - PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES = 1000168000, - DESCRIPTOR_SET_LAYOUT_SUPPORT = 1000168001, - PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES = 1000063000, - PHYSICAL_DEVICE_VULKAN_1_1_FEATURES = 49, - PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES = 50, - PHYSICAL_DEVICE_VULKAN_1_2_FEATURES = 51, - PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES = 52, - IMAGE_FORMAT_LIST_CREATE_INFO = 1000147000, - ATTACHMENT_DESCRIPTION_2 = 1000109000, - ATTACHMENT_REFERENCE_2 = 1000109001, - SUBPASS_DESCRIPTION_2 = 1000109002, - SUBPASS_DEPENDENCY_2 = 1000109003, - RENDER_PASS_CREATE_INFO_2 = 1000109004, - SUBPASS_BEGIN_INFO = 1000109005, - SUBPASS_END_INFO = 1000109006, - PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES = 1000177000, - PHYSICAL_DEVICE_DRIVER_PROPERTIES = 1000196000, - PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES = 1000180000, - PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES = 1000082000, - PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES = 1000197000, - DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO = 1000161000, - PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES = 1000161001, - PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES = 1000161002, - DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO = 1000161003, - DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT = 1000161004, - PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES = 1000199000, - SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE = 1000199001, - PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES = 1000221000, - IMAGE_STENCIL_USAGE_CREATE_INFO = 1000246000, - PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES = 1000130000, - SAMPLER_REDUCTION_MODE_CREATE_INFO = 1000130001, - PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES = 1000211000, - PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES = 1000108000, - FRAMEBUFFER_ATTACHMENTS_CREATE_INFO = 1000108001, - FRAMEBUFFER_ATTACHMENT_IMAGE_INFO = 1000108002, - RENDER_PASS_ATTACHMENT_BEGIN_INFO = 1000108003, - PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES = 1000253000, - PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES = 1000175000, - PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES = 1000241000, - ATTACHMENT_REFERENCE_STENCIL_LAYOUT = 1000241001, - ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT = 1000241002, - PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES = 1000261000, - PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES = 1000207000, - PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES = 1000207001, - SEMAPHORE_TYPE_CREATE_INFO = 1000207002, - TIMELINE_SEMAPHORE_SUBMIT_INFO = 1000207003, - SEMAPHORE_WAIT_INFO = 1000207004, - SEMAPHORE_SIGNAL_INFO = 1000207005, - PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES = 1000257000, - BUFFER_DEVICE_ADDRESS_INFO = 1000244001, - BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO = 1000257002, - MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO = 1000257003, - DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO = 1000257004, - PHYSICAL_DEVICE_VULKAN_1_3_FEATURES = 53, - PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES = 54, - PIPELINE_CREATION_FEEDBACK_CREATE_INFO = 1000192000, - PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES = 1000215000, - PHYSICAL_DEVICE_TOOL_PROPERTIES = 1000245000, - PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES = 1000276000, - PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES = 1000295000, - DEVICE_PRIVATE_DATA_CREATE_INFO = 1000295001, - PRIVATE_DATA_SLOT_CREATE_INFO = 1000295002, - PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES = 1000297000, - MEMORY_BARRIER_2 = 1000314000, - BUFFER_MEMORY_BARRIER_2 = 1000314001, - IMAGE_MEMORY_BARRIER_2 = 1000314002, - DEPENDENCY_INFO = 1000314003, - SUBMIT_INFO_2 = 1000314004, - SEMAPHORE_SUBMIT_INFO = 1000314005, - COMMAND_BUFFER_SUBMIT_INFO = 1000314006, - PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES = 1000314007, - PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES = 1000325000, - PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES = 1000335000, - COPY_BUFFER_INFO_2 = 1000337000, - COPY_IMAGE_INFO_2 = 1000337001, - COPY_BUFFER_TO_IMAGE_INFO_2 = 1000337002, - COPY_IMAGE_TO_BUFFER_INFO_2 = 1000337003, - BLIT_IMAGE_INFO_2 = 1000337004, - RESOLVE_IMAGE_INFO_2 = 1000337005, - BUFFER_COPY_2 = 1000337006, - IMAGE_COPY_2 = 1000337007, - IMAGE_BLIT_2 = 1000337008, - BUFFER_IMAGE_COPY_2 = 1000337009, - IMAGE_RESOLVE_2 = 1000337010, - PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES = 1000225000, - PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO = 1000225001, - PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES = 1000225002, - PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES = 1000138000, - PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES = 1000138001, - WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK = 1000138002, - DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO = 1000138003, - PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES = 1000066000, - RENDERING_INFO = 1000044000, - RENDERING_ATTACHMENT_INFO = 1000044001, - PIPELINE_RENDERING_CREATE_INFO = 1000044002, - PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES = 1000044003, - COMMAND_BUFFER_INHERITANCE_RENDERING_INFO = 1000044004, - PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES = 1000280000, - PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES = 1000280001, - PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES = 1000281001, - FORMAT_PROPERTIES_3 = 1000360000, - PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES = 1000413000, - PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES = 1000413001, - DEVICE_BUFFER_MEMORY_REQUIREMENTS = 1000413002, - DEVICE_IMAGE_MEMORY_REQUIREMENTS = 1000413003, - PHYSICAL_DEVICE_VULKAN_1_4_FEATURES = 55, - PHYSICAL_DEVICE_VULKAN_1_4_PROPERTIES = 56, - DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO = 1000174000, - PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES = 1000388000, - QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES = 1000388001, - PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES = 1000416000, - PHYSICAL_DEVICE_SHADER_FLOAT_CONTROLS_2_FEATURES = 1000528000, - PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES = 1000544000, - PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES = 1000259000, - PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO = 1000259001, - PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES = 1000259002, - PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES = 1000525000, - PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO = 1000190001, - PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES = 1000190002, - PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES = 1000265000, - MEMORY_MAP_INFO = 1000271000, - MEMORY_UNMAP_INFO = 1000271001, - PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES = 1000470000, - PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES = 1000470001, - RENDERING_AREA_INFO = 1000470003, - DEVICE_IMAGE_SUBRESOURCE_INFO = 1000470004, - SUBRESOURCE_LAYOUT_2 = 1000338002, - IMAGE_SUBRESOURCE_2 = 1000338003, - PIPELINE_CREATE_FLAGS_2_CREATE_INFO = 1000470005, - BUFFER_USAGE_FLAGS_2_CREATE_INFO = 1000470006, - PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES = 1000080000, - PHYSICAL_DEVICE_DYNAMIC_RENDERING_LOCAL_READ_FEATURES = 1000232000, - RENDERING_ATTACHMENT_LOCATION_INFO = 1000232001, - RENDERING_INPUT_ATTACHMENT_INDEX_INFO = 1000232002, - PHYSICAL_DEVICE_MAINTENANCE_6_FEATURES = 1000545000, - PHYSICAL_DEVICE_MAINTENANCE_6_PROPERTIES = 1000545001, - BIND_MEMORY_STATUS = 1000545002, - BIND_DESCRIPTOR_SETS_INFO = 1000545003, - PUSH_CONSTANTS_INFO = 1000545004, - PUSH_DESCRIPTOR_SET_INFO = 1000545005, - PUSH_DESCRIPTOR_SET_WITH_TEMPLATE_INFO = 1000545006, - PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES = 1000466000, - PIPELINE_ROBUSTNESS_CREATE_INFO = 1000068000, - PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES = 1000068001, - PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES = 1000068002, - PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES = 1000270000, - PHYSICAL_DEVICE_HOST_IMAGE_COPY_PROPERTIES = 1000270001, - MEMORY_TO_IMAGE_COPY = 1000270002, - IMAGE_TO_MEMORY_COPY = 1000270003, - COPY_IMAGE_TO_MEMORY_INFO = 1000270004, - COPY_MEMORY_TO_IMAGE_INFO = 1000270005, - HOST_IMAGE_LAYOUT_TRANSITION_INFO = 1000270006, - COPY_IMAGE_TO_IMAGE_INFO = 1000270007, - SUBRESOURCE_HOST_MEMCPY_SIZE = 1000270008, - HOST_IMAGE_COPY_DEVICE_PERFORMANCE_QUERY = 1000270009, - SWAPCHAIN_CREATE_INFO_KHR = 1000001000, - PRESENT_INFO_KHR = 1000001001, - DEVICE_GROUP_PRESENT_CAPABILITIES_KHR = 1000060007, - IMAGE_SWAPCHAIN_CREATE_INFO_KHR = 1000060008, - BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR = 1000060009, - ACQUIRE_NEXT_IMAGE_INFO_KHR = 1000060010, - DEVICE_GROUP_PRESENT_INFO_KHR = 1000060011, - DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR = 1000060012, - DISPLAY_MODE_CREATE_INFO_KHR = 1000002000, - DISPLAY_SURFACE_CREATE_INFO_KHR = 1000002001, - DISPLAY_PRESENT_INFO_KHR = 1000003000, - XLIB_SURFACE_CREATE_INFO_KHR = 1000004000, - XCB_SURFACE_CREATE_INFO_KHR = 1000005000, - WAYLAND_SURFACE_CREATE_INFO_KHR = 1000006000, - ANDROID_SURFACE_CREATE_INFO_KHR = 1000008000, - WIN32_SURFACE_CREATE_INFO_KHR = 1000009000, - DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT = 1000011000, - PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD = 1000018000, - DEBUG_MARKER_OBJECT_NAME_INFO_EXT = 1000022000, - DEBUG_MARKER_OBJECT_TAG_INFO_EXT = 1000022001, - DEBUG_MARKER_MARKER_INFO_EXT = 1000022002, - VIDEO_PROFILE_INFO_KHR = 1000023000, - VIDEO_CAPABILITIES_KHR = 1000023001, - VIDEO_PICTURE_RESOURCE_INFO_KHR = 1000023002, - VIDEO_SESSION_MEMORY_REQUIREMENTS_KHR = 1000023003, - BIND_VIDEO_SESSION_MEMORY_INFO_KHR = 1000023004, - VIDEO_SESSION_CREATE_INFO_KHR = 1000023005, - VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000023006, - VIDEO_SESSION_PARAMETERS_UPDATE_INFO_KHR = 1000023007, - VIDEO_BEGIN_CODING_INFO_KHR = 1000023008, - VIDEO_END_CODING_INFO_KHR = 1000023009, - VIDEO_CODING_CONTROL_INFO_KHR = 1000023010, - VIDEO_REFERENCE_SLOT_INFO_KHR = 1000023011, - QUEUE_FAMILY_VIDEO_PROPERTIES_KHR = 1000023012, - VIDEO_PROFILE_LIST_INFO_KHR = 1000023013, - PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR = 1000023014, - VIDEO_FORMAT_PROPERTIES_KHR = 1000023015, - QUEUE_FAMILY_QUERY_RESULT_STATUS_PROPERTIES_KHR = 1000023016, - VIDEO_DECODE_INFO_KHR = 1000024000, - VIDEO_DECODE_CAPABILITIES_KHR = 1000024001, - VIDEO_DECODE_USAGE_INFO_KHR = 1000024002, - DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV = 1000026000, - DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV = 1000026001, - DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV = 1000026002, - PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT = 1000028000, - PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT = 1000028001, - PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT = 1000028002, - CU_MODULE_CREATE_INFO_NVX = 1000029000, - CU_FUNCTION_CREATE_INFO_NVX = 1000029001, - CU_LAUNCH_INFO_NVX = 1000029002, - CU_MODULE_TEXTURING_MODE_CREATE_INFO_NVX = 1000029004, - IMAGE_VIEW_HANDLE_INFO_NVX = 1000030000, - IMAGE_VIEW_ADDRESS_PROPERTIES_NVX = 1000030001, - VIDEO_ENCODE_H264_CAPABILITIES_KHR = 1000038000, - VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000038001, - VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR = 1000038002, - VIDEO_ENCODE_H264_PICTURE_INFO_KHR = 1000038003, - VIDEO_ENCODE_H264_DPB_SLOT_INFO_KHR = 1000038004, - VIDEO_ENCODE_H264_NALU_SLICE_INFO_KHR = 1000038005, - VIDEO_ENCODE_H264_GOP_REMAINING_FRAME_INFO_KHR = 1000038006, - VIDEO_ENCODE_H264_PROFILE_INFO_KHR = 1000038007, - VIDEO_ENCODE_H264_RATE_CONTROL_INFO_KHR = 1000038008, - VIDEO_ENCODE_H264_RATE_CONTROL_LAYER_INFO_KHR = 1000038009, - VIDEO_ENCODE_H264_SESSION_CREATE_INFO_KHR = 1000038010, - VIDEO_ENCODE_H264_QUALITY_LEVEL_PROPERTIES_KHR = 1000038011, - VIDEO_ENCODE_H264_SESSION_PARAMETERS_GET_INFO_KHR = 1000038012, - VIDEO_ENCODE_H264_SESSION_PARAMETERS_FEEDBACK_INFO_KHR = 1000038013, - VIDEO_ENCODE_H265_CAPABILITIES_KHR = 1000039000, - VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000039001, - VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_KHR = 1000039002, - VIDEO_ENCODE_H265_PICTURE_INFO_KHR = 1000039003, - VIDEO_ENCODE_H265_DPB_SLOT_INFO_KHR = 1000039004, - VIDEO_ENCODE_H265_NALU_SLICE_SEGMENT_INFO_KHR = 1000039005, - VIDEO_ENCODE_H265_GOP_REMAINING_FRAME_INFO_KHR = 1000039006, - VIDEO_ENCODE_H265_PROFILE_INFO_KHR = 1000039007, - VIDEO_ENCODE_H265_RATE_CONTROL_INFO_KHR = 1000039009, - VIDEO_ENCODE_H265_RATE_CONTROL_LAYER_INFO_KHR = 1000039010, - VIDEO_ENCODE_H265_SESSION_CREATE_INFO_KHR = 1000039011, - VIDEO_ENCODE_H265_QUALITY_LEVEL_PROPERTIES_KHR = 1000039012, - VIDEO_ENCODE_H265_SESSION_PARAMETERS_GET_INFO_KHR = 1000039013, - VIDEO_ENCODE_H265_SESSION_PARAMETERS_FEEDBACK_INFO_KHR = 1000039014, - VIDEO_DECODE_H264_CAPABILITIES_KHR = 1000040000, - VIDEO_DECODE_H264_PICTURE_INFO_KHR = 1000040001, - VIDEO_DECODE_H264_PROFILE_INFO_KHR = 1000040003, - VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000040004, - VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR = 1000040005, - VIDEO_DECODE_H264_DPB_SLOT_INFO_KHR = 1000040006, - TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD = 1000041000, - STREAM_DESCRIPTOR_SURFACE_CREATE_INFO_GGP = 1000049000, - PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV = 1000050000, - EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV = 1000056000, - EXPORT_MEMORY_ALLOCATE_INFO_NV = 1000056001, - IMPORT_MEMORY_WIN32_HANDLE_INFO_NV = 1000057000, - EXPORT_MEMORY_WIN32_HANDLE_INFO_NV = 1000057001, - WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV = 1000058000, - VALIDATION_FLAGS_EXT = 1000061000, - VI_SURFACE_CREATE_INFO_NN = 1000062000, - IMAGE_VIEW_ASTC_DECODE_MODE_EXT = 1000067000, - PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT = 1000067001, - IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR = 1000073000, - EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR = 1000073001, - MEMORY_WIN32_HANDLE_PROPERTIES_KHR = 1000073002, - MEMORY_GET_WIN32_HANDLE_INFO_KHR = 1000073003, - IMPORT_MEMORY_FD_INFO_KHR = 1000074000, - MEMORY_FD_PROPERTIES_KHR = 1000074001, - MEMORY_GET_FD_INFO_KHR = 1000074002, - WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR = 1000075000, - IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR = 1000078000, - EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR = 1000078001, - D3D12_FENCE_SUBMIT_INFO_KHR = 1000078002, - SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR = 1000078003, - IMPORT_SEMAPHORE_FD_INFO_KHR = 1000079000, - SEMAPHORE_GET_FD_INFO_KHR = 1000079001, - COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT = 1000081000, - PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT = 1000081001, - CONDITIONAL_RENDERING_BEGIN_INFO_EXT = 1000081002, - PRESENT_REGIONS_KHR = 1000084000, - PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV = 1000087000, - SURFACE_CAPABILITIES_2_EXT = 1000090000, - DISPLAY_POWER_INFO_EXT = 1000091000, - DEVICE_EVENT_INFO_EXT = 1000091001, - DISPLAY_EVENT_INFO_EXT = 1000091002, - SWAPCHAIN_COUNTER_CREATE_INFO_EXT = 1000091003, - PRESENT_TIMES_INFO_GOOGLE = 1000092000, - PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX = 1000097000, - MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX = 1000044009, - PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV = 1000098000, - PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT = 1000099000, - PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT = 1000099001, - PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT = 1000101000, - PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT = 1000101001, - PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT = 1000102000, - PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT = 1000102001, - HDR_METADATA_EXT = 1000105000, - PHYSICAL_DEVICE_RELAXED_LINE_RASTERIZATION_FEATURES_IMG = 1000110000, - SHARED_PRESENT_SURFACE_CAPABILITIES_KHR = 1000111000, - IMPORT_FENCE_WIN32_HANDLE_INFO_KHR = 1000114000, - EXPORT_FENCE_WIN32_HANDLE_INFO_KHR = 1000114001, - FENCE_GET_WIN32_HANDLE_INFO_KHR = 1000114002, - IMPORT_FENCE_FD_INFO_KHR = 1000115000, - FENCE_GET_FD_INFO_KHR = 1000115001, - PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR = 1000116000, - PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR = 1000116001, - QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR = 1000116002, - PERFORMANCE_QUERY_SUBMIT_INFO_KHR = 1000116003, - ACQUIRE_PROFILING_LOCK_INFO_KHR = 1000116004, - PERFORMANCE_COUNTER_KHR = 1000116005, - PERFORMANCE_COUNTER_DESCRIPTION_KHR = 1000116006, - PHYSICAL_DEVICE_SURFACE_INFO_2_KHR = 1000119000, - SURFACE_CAPABILITIES_2_KHR = 1000119001, - SURFACE_FORMAT_2_KHR = 1000119002, - DISPLAY_PROPERTIES_2_KHR = 1000121000, - DISPLAY_PLANE_PROPERTIES_2_KHR = 1000121001, - DISPLAY_MODE_PROPERTIES_2_KHR = 1000121002, - DISPLAY_PLANE_INFO_2_KHR = 1000121003, - DISPLAY_PLANE_CAPABILITIES_2_KHR = 1000121004, - IOS_SURFACE_CREATE_INFO_MVK = 1000122000, - MACOS_SURFACE_CREATE_INFO_MVK = 1000123000, - DEBUG_UTILS_OBJECT_NAME_INFO_EXT = 1000128000, - DEBUG_UTILS_OBJECT_TAG_INFO_EXT = 1000128001, - DEBUG_UTILS_LABEL_EXT = 1000128002, - DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT = 1000128003, - DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT = 1000128004, - ANDROID_HARDWARE_BUFFER_USAGE_ANDROID = 1000129000, - ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID = 1000129001, - ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID = 1000129002, - IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID = 1000129003, - MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID = 1000129004, - EXTERNAL_FORMAT_ANDROID = 1000129005, - ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID = 1000129006, - PHYSICAL_DEVICE_SHADER_ENQUEUE_FEATURES_AMDX = 1000134000, - PHYSICAL_DEVICE_SHADER_ENQUEUE_PROPERTIES_AMDX = 1000134001, - EXECUTION_GRAPH_PIPELINE_SCRATCH_SIZE_AMDX = 1000134002, - EXECUTION_GRAPH_PIPELINE_CREATE_INFO_AMDX = 1000134003, - PIPELINE_SHADER_STAGE_NODE_CREATE_INFO_AMDX = 1000134004, - ATTACHMENT_SAMPLE_COUNT_INFO_AMD = 1000044008, - SAMPLE_LOCATIONS_INFO_EXT = 1000143000, - RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT = 1000143001, - PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT = 1000143002, - PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT = 1000143003, - MULTISAMPLE_PROPERTIES_EXT = 1000143004, - PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT = 1000148000, - PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT = 1000148001, - PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT = 1000148002, - PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV = 1000149000, - WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR = 1000150007, - ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR = 1000150000, - ACCELERATION_STRUCTURE_DEVICE_ADDRESS_INFO_KHR = 1000150002, - ACCELERATION_STRUCTURE_GEOMETRY_AABBS_DATA_KHR = 1000150003, - ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR = 1000150004, - ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR = 1000150005, - ACCELERATION_STRUCTURE_GEOMETRY_KHR = 1000150006, - ACCELERATION_STRUCTURE_VERSION_INFO_KHR = 1000150009, - COPY_ACCELERATION_STRUCTURE_INFO_KHR = 1000150010, - COPY_ACCELERATION_STRUCTURE_TO_MEMORY_INFO_KHR = 1000150011, - COPY_MEMORY_TO_ACCELERATION_STRUCTURE_INFO_KHR = 1000150012, - PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR = 1000150013, - PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR = 1000150014, - ACCELERATION_STRUCTURE_CREATE_INFO_KHR = 1000150017, - ACCELERATION_STRUCTURE_BUILD_SIZES_INFO_KHR = 1000150020, - PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR = 1000347000, - PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR = 1000347001, - RAY_TRACING_PIPELINE_CREATE_INFO_KHR = 1000150015, - RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR = 1000150016, - RAY_TRACING_PIPELINE_INTERFACE_CREATE_INFO_KHR = 1000150018, - PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR = 1000348013, - PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV = 1000152000, - PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV = 1000154000, - PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV = 1000154001, - DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT = 1000158000, - PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT = 1000158002, - IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT = 1000158003, - IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT = 1000158004, - IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT = 1000158005, - DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT = 1000158006, - VALIDATION_CACHE_CREATE_INFO_EXT = 1000160000, - SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT = 1000160001, - PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR = 1000163000, - PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR = 1000163001, - PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV = 1000164000, - PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV = 1000164001, - PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV = 1000164002, - PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV = 1000164005, - RAY_TRACING_PIPELINE_CREATE_INFO_NV = 1000165000, - ACCELERATION_STRUCTURE_CREATE_INFO_NV = 1000165001, - GEOMETRY_NV = 1000165003, - GEOMETRY_TRIANGLES_NV = 1000165004, - GEOMETRY_AABB_NV = 1000165005, - BIND_ACCELERATION_STRUCTURE_MEMORY_INFO_NV = 1000165006, - WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV = 1000165007, - ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_NV = 1000165008, - PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV = 1000165009, - RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV = 1000165011, - ACCELERATION_STRUCTURE_INFO_NV = 1000165012, - PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV = 1000166000, - PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV = 1000166001, - PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT = 1000170000, - FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT = 1000170001, - IMPORT_MEMORY_HOST_POINTER_INFO_EXT = 1000178000, - MEMORY_HOST_POINTER_PROPERTIES_EXT = 1000178001, - PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT = 1000178002, - PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR = 1000181000, - PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD = 1000183000, - PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD = 1000185000, - VIDEO_DECODE_H265_CAPABILITIES_KHR = 1000187000, - VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000187001, - VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_KHR = 1000187002, - VIDEO_DECODE_H265_PROFILE_INFO_KHR = 1000187003, - VIDEO_DECODE_H265_PICTURE_INFO_KHR = 1000187004, - VIDEO_DECODE_H265_DPB_SLOT_INFO_KHR = 1000187005, - DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD = 1000189000, - PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT = 1000190000, - PRESENT_FRAME_TOKEN_GGP = 1000191000, - PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV = 1000202000, - PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV = 1000202001, - PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV = 1000204000, - PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV = 1000205000, - PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV = 1000205002, - CHECKPOINT_DATA_NV = 1000206000, - QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV = 1000206001, - QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV = 1000314008, - CHECKPOINT_DATA_2_NV = 1000314009, - PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL = 1000209000, - QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL = 1000210000, - INITIALIZE_PERFORMANCE_API_INFO_INTEL = 1000210001, - PERFORMANCE_MARKER_INFO_INTEL = 1000210002, - PERFORMANCE_STREAM_MARKER_INFO_INTEL = 1000210003, - PERFORMANCE_OVERRIDE_INFO_INTEL = 1000210004, - PERFORMANCE_CONFIGURATION_ACQUIRE_INFO_INTEL = 1000210005, - PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT = 1000212000, - DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD = 1000213000, - SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD = 1000213001, - IMAGEPIPE_SURFACE_CREATE_INFO_FUCHSIA = 1000214000, - METAL_SURFACE_CREATE_INFO_EXT = 1000217000, - PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT = 1000218000, - PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT = 1000218001, - RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT = 1000218002, - RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT = 1000044007, - FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR = 1000226000, - PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR = 1000226001, - PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR = 1000226002, - PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR = 1000226003, - PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_KHR = 1000226004, - RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR = 1000044006, - PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD = 1000227000, - PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD = 1000229000, - PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT = 1000234000, - PHYSICAL_DEVICE_SHADER_QUAD_CONTROL_FEATURES_KHR = 1000235000, - PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT = 1000237000, - PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT = 1000238000, - MEMORY_PRIORITY_ALLOCATE_INFO_EXT = 1000238001, - SURFACE_PROTECTED_CAPABILITIES_KHR = 1000239000, - PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV = 1000240000, - PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT = 1000244000, - BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT = 1000244002, - VALIDATION_FEATURES_EXT = 1000247000, - PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR = 1000248000, - PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV = 1000249000, - COOPERATIVE_MATRIX_PROPERTIES_NV = 1000249001, - PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV = 1000249002, - PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV = 1000250000, - PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV = 1000250001, - FRAMEBUFFER_MIXED_SAMPLES_COMBINATION_NV = 1000250002, - PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT = 1000251000, - PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT = 1000252000, - PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT = 1000254000, - PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT = 1000254001, - PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT = 1000254002, - SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT = 1000255000, - SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT = 1000255002, - SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT = 1000255001, - HEADLESS_SURFACE_CREATE_INFO_EXT = 1000256000, - PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT = 1000260000, - PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT = 1000267000, - PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR = 1000269000, - PIPELINE_INFO_KHR = 1000269001, - PIPELINE_EXECUTABLE_PROPERTIES_KHR = 1000269002, - PIPELINE_EXECUTABLE_INFO_KHR = 1000269003, - PIPELINE_EXECUTABLE_STATISTIC_KHR = 1000269004, - PIPELINE_EXECUTABLE_INTERNAL_REPRESENTATION_KHR = 1000269005, - PHYSICAL_DEVICE_MAP_MEMORY_PLACED_FEATURES_EXT = 1000272000, - PHYSICAL_DEVICE_MAP_MEMORY_PLACED_PROPERTIES_EXT = 1000272001, - MEMORY_MAP_PLACED_INFO_EXT = 1000272002, - PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT = 1000273000, - SURFACE_PRESENT_MODE_EXT = 1000274000, - SURFACE_PRESENT_SCALING_CAPABILITIES_EXT = 1000274001, - SURFACE_PRESENT_MODE_COMPATIBILITY_EXT = 1000274002, - PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT = 1000275000, - SWAPCHAIN_PRESENT_FENCE_INFO_EXT = 1000275001, - SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT = 1000275002, - SWAPCHAIN_PRESENT_MODE_INFO_EXT = 1000275003, - SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT = 1000275004, - RELEASE_SWAPCHAIN_IMAGES_INFO_EXT = 1000275005, - PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV = 1000277000, - GRAPHICS_SHADER_GROUP_CREATE_INFO_NV = 1000277001, - GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV = 1000277002, - INDIRECT_COMMANDS_LAYOUT_TOKEN_NV = 1000277003, - INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NV = 1000277004, - GENERATED_COMMANDS_INFO_NV = 1000277005, - GENERATED_COMMANDS_MEMORY_REQUIREMENTS_INFO_NV = 1000277006, - PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV = 1000277007, - PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV = 1000278000, - COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV = 1000278001, - PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT = 1000281000, - COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM = 1000282000, - RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM = 1000282001, - PHYSICAL_DEVICE_DEPTH_BIAS_CONTROL_FEATURES_EXT = 1000283000, - DEPTH_BIAS_INFO_EXT = 1000283001, - DEPTH_BIAS_REPRESENTATION_INFO_EXT = 1000283002, - PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT = 1000284000, - DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT = 1000284001, - DEVICE_MEMORY_REPORT_CALLBACK_DATA_EXT = 1000284002, - PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT = 1000286000, - PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT = 1000286001, - SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT = 1000287000, - PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT = 1000287001, - PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT = 1000287002, - PIPELINE_LIBRARY_CREATE_INFO_KHR = 1000290000, - PHYSICAL_DEVICE_PRESENT_BARRIER_FEATURES_NV = 1000292000, - SURFACE_CAPABILITIES_PRESENT_BARRIER_NV = 1000292001, - SWAPCHAIN_PRESENT_BARRIER_CREATE_INFO_NV = 1000292002, - PRESENT_ID_KHR = 1000294000, - PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR = 1000294001, - VIDEO_ENCODE_INFO_KHR = 1000299000, - VIDEO_ENCODE_RATE_CONTROL_INFO_KHR = 1000299001, - VIDEO_ENCODE_RATE_CONTROL_LAYER_INFO_KHR = 1000299002, - VIDEO_ENCODE_CAPABILITIES_KHR = 1000299003, - VIDEO_ENCODE_USAGE_INFO_KHR = 1000299004, - QUERY_POOL_VIDEO_ENCODE_FEEDBACK_CREATE_INFO_KHR = 1000299005, - PHYSICAL_DEVICE_VIDEO_ENCODE_QUALITY_LEVEL_INFO_KHR = 1000299006, - VIDEO_ENCODE_QUALITY_LEVEL_PROPERTIES_KHR = 1000299007, - VIDEO_ENCODE_QUALITY_LEVEL_INFO_KHR = 1000299008, - VIDEO_ENCODE_SESSION_PARAMETERS_GET_INFO_KHR = 1000299009, - VIDEO_ENCODE_SESSION_PARAMETERS_FEEDBACK_INFO_KHR = 1000299010, - PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV = 1000300000, - DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV = 1000300001, - CUDA_MODULE_CREATE_INFO_NV = 1000307000, - CUDA_FUNCTION_CREATE_INFO_NV = 1000307001, - CUDA_LAUNCH_INFO_NV = 1000307002, - PHYSICAL_DEVICE_CUDA_KERNEL_LAUNCH_FEATURES_NV = 1000307003, - PHYSICAL_DEVICE_CUDA_KERNEL_LAUNCH_PROPERTIES_NV = 1000307004, - QUERY_LOW_LATENCY_SUPPORT_NV = 1000310000, - EXPORT_METAL_OBJECT_CREATE_INFO_EXT = 1000311000, - EXPORT_METAL_OBJECTS_INFO_EXT = 1000311001, - EXPORT_METAL_DEVICE_INFO_EXT = 1000311002, - EXPORT_METAL_COMMAND_QUEUE_INFO_EXT = 1000311003, - EXPORT_METAL_BUFFER_INFO_EXT = 1000311004, - IMPORT_METAL_BUFFER_INFO_EXT = 1000311005, - EXPORT_METAL_TEXTURE_INFO_EXT = 1000311006, - IMPORT_METAL_TEXTURE_INFO_EXT = 1000311007, - EXPORT_METAL_IO_SURFACE_INFO_EXT = 1000311008, - IMPORT_METAL_IO_SURFACE_INFO_EXT = 1000311009, - EXPORT_METAL_SHARED_EVENT_INFO_EXT = 1000311010, - IMPORT_METAL_SHARED_EVENT_INFO_EXT = 1000311011, - PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_PROPERTIES_EXT = 1000316000, - PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_DENSITY_MAP_PROPERTIES_EXT = 1000316001, - PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT = 1000316002, - DESCRIPTOR_ADDRESS_INFO_EXT = 1000316003, - DESCRIPTOR_GET_INFO_EXT = 1000316004, - BUFFER_CAPTURE_DESCRIPTOR_DATA_INFO_EXT = 1000316005, - IMAGE_CAPTURE_DESCRIPTOR_DATA_INFO_EXT = 1000316006, - IMAGE_VIEW_CAPTURE_DESCRIPTOR_DATA_INFO_EXT = 1000316007, - SAMPLER_CAPTURE_DESCRIPTOR_DATA_INFO_EXT = 1000316008, - OPAQUE_CAPTURE_DESCRIPTOR_DATA_CREATE_INFO_EXT = 1000316010, - DESCRIPTOR_BUFFER_BINDING_INFO_EXT = 1000316011, - DESCRIPTOR_BUFFER_BINDING_PUSH_DESCRIPTOR_BUFFER_HANDLE_EXT = 1000316012, - ACCELERATION_STRUCTURE_CAPTURE_DESCRIPTOR_DATA_INFO_EXT = 1000316009, - PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT = 1000320000, - PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_PROPERTIES_EXT = 1000320001, - GRAPHICS_PIPELINE_LIBRARY_CREATE_INFO_EXT = 1000320002, - PHYSICAL_DEVICE_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_FEATURES_AMD = 1000321000, - PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR = 1000203000, - PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_PROPERTIES_KHR = 1000322000, - PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR = 1000323000, - PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV = 1000326000, - PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV = 1000326001, - PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV = 1000326002, - ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV = 1000327000, - PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV = 1000327001, - ACCELERATION_STRUCTURE_MOTION_INFO_NV = 1000327002, - PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT = 1000328000, - PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_EXT = 1000328001, - PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT = 1000330000, - PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT = 1000332000, - PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT = 1000332001, - COPY_COMMAND_TRANSFORM_INFO_QCOM = 1000333000, - PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR = 1000336000, - PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_FEATURES_EXT = 1000338000, - IMAGE_COMPRESSION_CONTROL_EXT = 1000338001, - IMAGE_COMPRESSION_PROPERTIES_EXT = 1000338004, - PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT = 1000339000, - PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT = 1000340000, - PHYSICAL_DEVICE_FAULT_FEATURES_EXT = 1000341000, - DEVICE_FAULT_COUNTS_EXT = 1000341001, - DEVICE_FAULT_INFO_EXT = 1000341002, - PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT = 1000344000, - DIRECTFB_SURFACE_CREATE_INFO_EXT = 1000346000, - PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT = 1000352000, - VERTEX_INPUT_BINDING_DESCRIPTION_2_EXT = 1000352001, - VERTEX_INPUT_ATTRIBUTE_DESCRIPTION_2_EXT = 1000352002, - PHYSICAL_DEVICE_DRM_PROPERTIES_EXT = 1000353000, - PHYSICAL_DEVICE_ADDRESS_BINDING_REPORT_FEATURES_EXT = 1000354000, - DEVICE_ADDRESS_BINDING_CALLBACK_DATA_EXT = 1000354001, - PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT = 1000355000, - PIPELINE_VIEWPORT_DEPTH_CLIP_CONTROL_CREATE_INFO_EXT = 1000355001, - PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT = 1000356000, - PHYSICAL_DEVICE_PRESENT_MODE_FIFO_LATEST_READY_FEATURES_EXT = 1000361000, - IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA = 1000364000, - MEMORY_ZIRCON_HANDLE_PROPERTIES_FUCHSIA = 1000364001, - MEMORY_GET_ZIRCON_HANDLE_INFO_FUCHSIA = 1000364002, - IMPORT_SEMAPHORE_ZIRCON_HANDLE_INFO_FUCHSIA = 1000365000, - SEMAPHORE_GET_ZIRCON_HANDLE_INFO_FUCHSIA = 1000365001, - BUFFER_COLLECTION_CREATE_INFO_FUCHSIA = 1000366000, - IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA = 1000366001, - BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA = 1000366002, - BUFFER_COLLECTION_PROPERTIES_FUCHSIA = 1000366003, - BUFFER_CONSTRAINTS_INFO_FUCHSIA = 1000366004, - BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA = 1000366005, - IMAGE_CONSTRAINTS_INFO_FUCHSIA = 1000366006, - IMAGE_FORMAT_CONSTRAINTS_INFO_FUCHSIA = 1000366007, - SYSMEM_COLOR_SPACE_FUCHSIA = 1000366008, - BUFFER_COLLECTION_CONSTRAINTS_INFO_FUCHSIA = 1000366009, - SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI = 1000369000, - PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI = 1000369001, - PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI = 1000369002, - PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI = 1000370000, - MEMORY_GET_REMOTE_ADDRESS_INFO_NV = 1000371000, - PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV = 1000371001, - PIPELINE_PROPERTIES_IDENTIFIER_EXT = 1000372000, - PHYSICAL_DEVICE_PIPELINE_PROPERTIES_FEATURES_EXT = 1000372001, - PHYSICAL_DEVICE_FRAME_BOUNDARY_FEATURES_EXT = 1000375000, - FRAME_BOUNDARY_EXT = 1000375001, - PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT = 1000376000, - SUBPASS_RESOLVE_PERFORMANCE_QUERY_EXT = 1000376001, - MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_INFO_EXT = 1000376002, - PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT = 1000377000, - SCREEN_SURFACE_CREATE_INFO_QNX = 1000378000, - PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT = 1000381000, - PIPELINE_COLOR_WRITE_CREATE_INFO_EXT = 1000381001, - PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT = 1000382000, - PHYSICAL_DEVICE_RAY_TRACING_MAINTENANCE_1_FEATURES_KHR = 1000386000, - PHYSICAL_DEVICE_IMAGE_VIEW_MIN_LOD_FEATURES_EXT = 1000391000, - IMAGE_VIEW_MIN_LOD_CREATE_INFO_EXT = 1000391001, - PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT = 1000392000, - PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT = 1000392001, - PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT = 1000393000, - PHYSICAL_DEVICE_SHADER_TILE_IMAGE_FEATURES_EXT = 1000395000, - PHYSICAL_DEVICE_SHADER_TILE_IMAGE_PROPERTIES_EXT = 1000395001, - MICROMAP_BUILD_INFO_EXT = 1000396000, - MICROMAP_VERSION_INFO_EXT = 1000396001, - COPY_MICROMAP_INFO_EXT = 1000396002, - COPY_MICROMAP_TO_MEMORY_INFO_EXT = 1000396003, - COPY_MEMORY_TO_MICROMAP_INFO_EXT = 1000396004, - PHYSICAL_DEVICE_OPACITY_MICROMAP_FEATURES_EXT = 1000396005, - PHYSICAL_DEVICE_OPACITY_MICROMAP_PROPERTIES_EXT = 1000396006, - MICROMAP_CREATE_INFO_EXT = 1000396007, - MICROMAP_BUILD_SIZES_INFO_EXT = 1000396008, - ACCELERATION_STRUCTURE_TRIANGLES_OPACITY_MICROMAP_EXT = 1000396009, - PHYSICAL_DEVICE_DISPLACEMENT_MICROMAP_FEATURES_NV = 1000397000, - PHYSICAL_DEVICE_DISPLACEMENT_MICROMAP_PROPERTIES_NV = 1000397001, - ACCELERATION_STRUCTURE_TRIANGLES_DISPLACEMENT_MICROMAP_NV = 1000397002, - PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_FEATURES_HUAWEI = 1000404000, - PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_PROPERTIES_HUAWEI = 1000404001, - PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_VRS_FEATURES_HUAWEI = 1000404002, - PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT = 1000411000, - SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT = 1000411001, - PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT = 1000412000, - PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_ARM = 1000415000, - DEVICE_QUEUE_SHADER_CORE_CONTROL_CREATE_INFO_ARM = 1000417000, - PHYSICAL_DEVICE_SCHEDULING_CONTROLS_FEATURES_ARM = 1000417001, - PHYSICAL_DEVICE_SCHEDULING_CONTROLS_PROPERTIES_ARM = 1000417002, - PHYSICAL_DEVICE_IMAGE_SLICED_VIEW_OF_3D_FEATURES_EXT = 1000418000, - IMAGE_VIEW_SLICED_CREATE_INFO_EXT = 1000418001, - PHYSICAL_DEVICE_DESCRIPTOR_SET_HOST_MAPPING_FEATURES_VALVE = 1000420000, - DESCRIPTOR_SET_BINDING_REFERENCE_VALVE = 1000420001, - DESCRIPTOR_SET_LAYOUT_HOST_MAPPING_INFO_VALVE = 1000420002, - PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT = 1000422000, - PHYSICAL_DEVICE_RENDER_PASS_STRIPED_FEATURES_ARM = 1000424000, - PHYSICAL_DEVICE_RENDER_PASS_STRIPED_PROPERTIES_ARM = 1000424001, - RENDER_PASS_STRIPE_BEGIN_INFO_ARM = 1000424002, - RENDER_PASS_STRIPE_INFO_ARM = 1000424003, - RENDER_PASS_STRIPE_SUBMIT_INFO_ARM = 1000424004, - PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_FEATURES_QCOM = 1000425000, - PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_PROPERTIES_QCOM = 1000425001, - SUBPASS_FRAGMENT_DENSITY_MAP_OFFSET_END_INFO_QCOM = 1000425002, - PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_FEATURES_NV = 1000426000, - PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_PROPERTIES_NV = 1000426001, - PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_FEATURES_NV = 1000427000, - PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_PROPERTIES_NV = 1000427001, - PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_COMPUTE_FEATURES_NV = 1000428000, - COMPUTE_PIPELINE_INDIRECT_BUFFER_INFO_NV = 1000428001, - PIPELINE_INDIRECT_DEVICE_ADDRESS_INFO_NV = 1000428002, - PHYSICAL_DEVICE_RAY_TRACING_LINEAR_SWEPT_SPHERES_FEATURES_NV = 1000429008, - ACCELERATION_STRUCTURE_GEOMETRY_LINEAR_SWEPT_SPHERES_DATA_NV = 1000429009, - ACCELERATION_STRUCTURE_GEOMETRY_SPHERES_DATA_NV = 1000429010, - PHYSICAL_DEVICE_LINEAR_COLOR_ATTACHMENT_FEATURES_NV = 1000430000, - PHYSICAL_DEVICE_SHADER_MAXIMAL_RECONVERGENCE_FEATURES_KHR = 1000434000, - PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_FEATURES_EXT = 1000437000, - PHYSICAL_DEVICE_IMAGE_PROCESSING_FEATURES_QCOM = 1000440000, - PHYSICAL_DEVICE_IMAGE_PROCESSING_PROPERTIES_QCOM = 1000440001, - IMAGE_VIEW_SAMPLE_WEIGHT_CREATE_INFO_QCOM = 1000440002, - PHYSICAL_DEVICE_NESTED_COMMAND_BUFFER_FEATURES_EXT = 1000451000, - PHYSICAL_DEVICE_NESTED_COMMAND_BUFFER_PROPERTIES_EXT = 1000451001, - EXTERNAL_MEMORY_ACQUIRE_UNMODIFIED_EXT = 1000453000, - PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT = 1000455000, - PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_PROPERTIES_EXT = 1000455001, - PHYSICAL_DEVICE_SUBPASS_MERGE_FEEDBACK_FEATURES_EXT = 1000458000, - RENDER_PASS_CREATION_CONTROL_EXT = 1000458001, - RENDER_PASS_CREATION_FEEDBACK_CREATE_INFO_EXT = 1000458002, - RENDER_PASS_SUBPASS_FEEDBACK_CREATE_INFO_EXT = 1000458003, - DIRECT_DRIVER_LOADING_INFO_LUNARG = 1000459000, - DIRECT_DRIVER_LOADING_LIST_LUNARG = 1000459001, - PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_FEATURES_EXT = 1000462000, - PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_PROPERTIES_EXT = 1000462001, - PIPELINE_SHADER_STAGE_MODULE_IDENTIFIER_CREATE_INFO_EXT = 1000462002, - SHADER_MODULE_IDENTIFIER_EXT = 1000462003, - PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT = 1000342000, - PHYSICAL_DEVICE_OPTICAL_FLOW_FEATURES_NV = 1000464000, - PHYSICAL_DEVICE_OPTICAL_FLOW_PROPERTIES_NV = 1000464001, - OPTICAL_FLOW_IMAGE_FORMAT_INFO_NV = 1000464002, - OPTICAL_FLOW_IMAGE_FORMAT_PROPERTIES_NV = 1000464003, - OPTICAL_FLOW_SESSION_CREATE_INFO_NV = 1000464004, - OPTICAL_FLOW_EXECUTE_INFO_NV = 1000464005, - OPTICAL_FLOW_SESSION_CREATE_PRIVATE_DATA_INFO_NV = 1000464010, - PHYSICAL_DEVICE_LEGACY_DITHERING_FEATURES_EXT = 1000465000, - PHYSICAL_DEVICE_EXTERNAL_FORMAT_RESOLVE_FEATURES_ANDROID = 1000468000, - PHYSICAL_DEVICE_EXTERNAL_FORMAT_RESOLVE_PROPERTIES_ANDROID = 1000468001, - ANDROID_HARDWARE_BUFFER_FORMAT_RESOLVE_PROPERTIES_ANDROID = 1000468002, - PHYSICAL_DEVICE_ANTI_LAG_FEATURES_AMD = 1000476000, - ANTI_LAG_DATA_AMD = 1000476001, - ANTI_LAG_PRESENTATION_INFO_AMD = 1000476002, - PHYSICAL_DEVICE_RAY_TRACING_POSITION_FETCH_FEATURES_KHR = 1000481000, - PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT = 1000482000, - PHYSICAL_DEVICE_SHADER_OBJECT_PROPERTIES_EXT = 1000482001, - SHADER_CREATE_INFO_EXT = 1000482002, - PHYSICAL_DEVICE_PIPELINE_BINARY_FEATURES_KHR = 1000483000, - PIPELINE_BINARY_CREATE_INFO_KHR = 1000483001, - PIPELINE_BINARY_INFO_KHR = 1000483002, - PIPELINE_BINARY_KEY_KHR = 1000483003, - PHYSICAL_DEVICE_PIPELINE_BINARY_PROPERTIES_KHR = 1000483004, - RELEASE_CAPTURED_PIPELINE_DATA_INFO_KHR = 1000483005, - PIPELINE_BINARY_DATA_INFO_KHR = 1000483006, - PIPELINE_CREATE_INFO_KHR = 1000483007, - DEVICE_PIPELINE_BINARY_INTERNAL_CACHE_CONTROL_KHR = 1000483008, - PIPELINE_BINARY_HANDLES_INFO_KHR = 1000483009, - PHYSICAL_DEVICE_TILE_PROPERTIES_FEATURES_QCOM = 1000484000, - TILE_PROPERTIES_QCOM = 1000484001, - PHYSICAL_DEVICE_AMIGO_PROFILING_FEATURES_SEC = 1000485000, - AMIGO_PROFILING_SUBMIT_INFO_SEC = 1000485001, - PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_VIEWPORTS_FEATURES_QCOM = 1000488000, - PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV = 1000490000, - PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_NV = 1000490001, - PHYSICAL_DEVICE_COOPERATIVE_VECTOR_FEATURES_NV = 1000491000, - PHYSICAL_DEVICE_COOPERATIVE_VECTOR_PROPERTIES_NV = 1000491001, - COOPERATIVE_VECTOR_PROPERTIES_NV = 1000491002, - CONVERT_COOPERATIVE_VECTOR_MATRIX_INFO_NV = 1000491004, - PHYSICAL_DEVICE_EXTENDED_SPARSE_ADDRESS_SPACE_FEATURES_NV = 1000492000, - PHYSICAL_DEVICE_EXTENDED_SPARSE_ADDRESS_SPACE_PROPERTIES_NV = 1000492001, - PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT = 1000351000, - MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_EXT = 1000351002, - PHYSICAL_DEVICE_LEGACY_VERTEX_ATTRIBUTES_FEATURES_EXT = 1000495000, - PHYSICAL_DEVICE_LEGACY_VERTEX_ATTRIBUTES_PROPERTIES_EXT = 1000495001, - LAYER_SETTINGS_CREATE_INFO_EXT = 1000496000, - PHYSICAL_DEVICE_SHADER_CORE_BUILTINS_FEATURES_ARM = 1000497000, - PHYSICAL_DEVICE_SHADER_CORE_BUILTINS_PROPERTIES_ARM = 1000497001, - PHYSICAL_DEVICE_PIPELINE_LIBRARY_GROUP_HANDLES_FEATURES_EXT = 1000498000, - PHYSICAL_DEVICE_DYNAMIC_RENDERING_UNUSED_ATTACHMENTS_FEATURES_EXT = 1000499000, - LATENCY_SLEEP_MODE_INFO_NV = 1000505000, - LATENCY_SLEEP_INFO_NV = 1000505001, - SET_LATENCY_MARKER_INFO_NV = 1000505002, - GET_LATENCY_MARKER_INFO_NV = 1000505003, - LATENCY_TIMINGS_FRAME_REPORT_NV = 1000505004, - LATENCY_SUBMISSION_PRESENT_ID_NV = 1000505005, - OUT_OF_BAND_QUEUE_TYPE_INFO_NV = 1000505006, - SWAPCHAIN_LATENCY_CREATE_INFO_NV = 1000505007, - LATENCY_SURFACE_CAPABILITIES_NV = 1000505008, - PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_KHR = 1000506000, - COOPERATIVE_MATRIX_PROPERTIES_KHR = 1000506001, - PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_KHR = 1000506002, - PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_RENDER_AREAS_FEATURES_QCOM = 1000510000, - MULTIVIEW_PER_VIEW_RENDER_AREAS_RENDER_PASS_BEGIN_INFO_QCOM = 1000510001, - PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_KHR = 1000201000, - PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_PROPERTIES_KHR = 1000511000, - VIDEO_DECODE_AV1_CAPABILITIES_KHR = 1000512000, - VIDEO_DECODE_AV1_PICTURE_INFO_KHR = 1000512001, - VIDEO_DECODE_AV1_PROFILE_INFO_KHR = 1000512003, - VIDEO_DECODE_AV1_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000512004, - VIDEO_DECODE_AV1_DPB_SLOT_INFO_KHR = 1000512005, - VIDEO_ENCODE_AV1_CAPABILITIES_KHR = 1000513000, - VIDEO_ENCODE_AV1_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000513001, - VIDEO_ENCODE_AV1_PICTURE_INFO_KHR = 1000513002, - VIDEO_ENCODE_AV1_DPB_SLOT_INFO_KHR = 1000513003, - PHYSICAL_DEVICE_VIDEO_ENCODE_AV1_FEATURES_KHR = 1000513004, - VIDEO_ENCODE_AV1_PROFILE_INFO_KHR = 1000513005, - VIDEO_ENCODE_AV1_RATE_CONTROL_INFO_KHR = 1000513006, - VIDEO_ENCODE_AV1_RATE_CONTROL_LAYER_INFO_KHR = 1000513007, - VIDEO_ENCODE_AV1_QUALITY_LEVEL_PROPERTIES_KHR = 1000513008, - VIDEO_ENCODE_AV1_SESSION_CREATE_INFO_KHR = 1000513009, - VIDEO_ENCODE_AV1_GOP_REMAINING_FRAME_INFO_KHR = 1000513010, - PHYSICAL_DEVICE_VIDEO_MAINTENANCE_1_FEATURES_KHR = 1000515000, - VIDEO_INLINE_QUERY_INFO_KHR = 1000515001, - PHYSICAL_DEVICE_PER_STAGE_DESCRIPTOR_SET_FEATURES_NV = 1000516000, - PHYSICAL_DEVICE_IMAGE_PROCESSING_2_FEATURES_QCOM = 1000518000, - PHYSICAL_DEVICE_IMAGE_PROCESSING_2_PROPERTIES_QCOM = 1000518001, - SAMPLER_BLOCK_MATCH_WINDOW_CREATE_INFO_QCOM = 1000518002, - SAMPLER_CUBIC_WEIGHTS_CREATE_INFO_QCOM = 1000519000, - PHYSICAL_DEVICE_CUBIC_WEIGHTS_FEATURES_QCOM = 1000519001, - BLIT_IMAGE_CUBIC_WEIGHTS_INFO_QCOM = 1000519002, - PHYSICAL_DEVICE_YCBCR_DEGAMMA_FEATURES_QCOM = 1000520000, - SAMPLER_YCBCR_CONVERSION_YCBCR_DEGAMMA_CREATE_INFO_QCOM = 1000520001, - PHYSICAL_DEVICE_CUBIC_CLAMP_FEATURES_QCOM = 1000521000, - PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_FEATURES_EXT = 1000524000, - SCREEN_BUFFER_PROPERTIES_QNX = 1000529000, - SCREEN_BUFFER_FORMAT_PROPERTIES_QNX = 1000529001, - IMPORT_SCREEN_BUFFER_INFO_QNX = 1000529002, - EXTERNAL_FORMAT_QNX = 1000529003, - PHYSICAL_DEVICE_EXTERNAL_MEMORY_SCREEN_BUFFER_FEATURES_QNX = 1000529004, - PHYSICAL_DEVICE_LAYERED_DRIVER_PROPERTIES_MSFT = 1000530000, - CALIBRATED_TIMESTAMP_INFO_KHR = 1000184000, - SET_DESCRIPTOR_BUFFER_OFFSETS_INFO_EXT = 1000545007, - BIND_DESCRIPTOR_BUFFER_EMBEDDED_SAMPLERS_INFO_EXT = 1000545008, - PHYSICAL_DEVICE_DESCRIPTOR_POOL_OVERALLOCATION_FEATURES_NV = 1000546000, - DISPLAY_SURFACE_STEREO_CREATE_INFO_NV = 1000551000, - DISPLAY_MODE_STEREO_PROPERTIES_NV = 1000551001, - VIDEO_ENCODE_QUANTIZATION_MAP_CAPABILITIES_KHR = 1000553000, - VIDEO_FORMAT_QUANTIZATION_MAP_PROPERTIES_KHR = 1000553001, - VIDEO_ENCODE_QUANTIZATION_MAP_INFO_KHR = 1000553002, - VIDEO_ENCODE_QUANTIZATION_MAP_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000553005, - PHYSICAL_DEVICE_VIDEO_ENCODE_QUANTIZATION_MAP_FEATURES_KHR = 1000553009, - VIDEO_ENCODE_H264_QUANTIZATION_MAP_CAPABILITIES_KHR = 1000553003, - VIDEO_ENCODE_H265_QUANTIZATION_MAP_CAPABILITIES_KHR = 1000553004, - VIDEO_FORMAT_H265_QUANTIZATION_MAP_PROPERTIES_KHR = 1000553006, - VIDEO_ENCODE_AV1_QUANTIZATION_MAP_CAPABILITIES_KHR = 1000553007, - VIDEO_FORMAT_AV1_QUANTIZATION_MAP_PROPERTIES_KHR = 1000553008, - PHYSICAL_DEVICE_RAW_ACCESS_CHAINS_FEATURES_NV = 1000555000, - PHYSICAL_DEVICE_SHADER_RELAXED_EXTENDED_INSTRUCTION_FEATURES_KHR = 1000558000, - PHYSICAL_DEVICE_COMMAND_BUFFER_INHERITANCE_FEATURES_NV = 1000559000, - PHYSICAL_DEVICE_MAINTENANCE_7_FEATURES_KHR = 1000562000, - PHYSICAL_DEVICE_MAINTENANCE_7_PROPERTIES_KHR = 1000562001, - PHYSICAL_DEVICE_LAYERED_API_PROPERTIES_LIST_KHR = 1000562002, - PHYSICAL_DEVICE_LAYERED_API_PROPERTIES_KHR = 1000562003, - PHYSICAL_DEVICE_LAYERED_API_VULKAN_PROPERTIES_KHR = 1000562004, - PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT16_VECTOR_FEATURES_NV = 1000563000, - PHYSICAL_DEVICE_SHADER_REPLICATED_COMPOSITES_FEATURES_EXT = 1000564000, - PHYSICAL_DEVICE_RAY_TRACING_VALIDATION_FEATURES_NV = 1000568000, - PHYSICAL_DEVICE_CLUSTER_ACCELERATION_STRUCTURE_FEATURES_NV = 1000569000, - PHYSICAL_DEVICE_CLUSTER_ACCELERATION_STRUCTURE_PROPERTIES_NV = 1000569001, - CLUSTER_ACCELERATION_STRUCTURE_CLUSTERS_BOTTOM_LEVEL_INPUT_NV = 1000569002, - CLUSTER_ACCELERATION_STRUCTURE_TRIANGLE_CLUSTER_INPUT_NV = 1000569003, - CLUSTER_ACCELERATION_STRUCTURE_MOVE_OBJECTS_INPUT_NV = 1000569004, - CLUSTER_ACCELERATION_STRUCTURE_INPUT_INFO_NV = 1000569005, - CLUSTER_ACCELERATION_STRUCTURE_COMMANDS_INFO_NV = 1000569006, - RAY_TRACING_PIPELINE_CLUSTER_ACCELERATION_STRUCTURE_CREATE_INFO_NV = 1000569007, - PHYSICAL_DEVICE_PARTITIONED_ACCELERATION_STRUCTURE_FEATURES_NV = 1000570000, - PHYSICAL_DEVICE_PARTITIONED_ACCELERATION_STRUCTURE_PROPERTIES_NV = 1000570001, - WRITE_DESCRIPTOR_SET_PARTITIONED_ACCELERATION_STRUCTURE_NV = 1000570002, - PARTITIONED_ACCELERATION_STRUCTURE_INSTANCES_INPUT_NV = 1000570003, - BUILD_PARTITIONED_ACCELERATION_STRUCTURE_INFO_NV = 1000570004, - PARTITIONED_ACCELERATION_STRUCTURE_FLAGS_NV = 1000570005, - PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_EXT = 1000572000, - PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_EXT = 1000572001, - GENERATED_COMMANDS_MEMORY_REQUIREMENTS_INFO_EXT = 1000572002, - INDIRECT_EXECUTION_SET_CREATE_INFO_EXT = 1000572003, - GENERATED_COMMANDS_INFO_EXT = 1000572004, - INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_EXT = 1000572006, - INDIRECT_COMMANDS_LAYOUT_TOKEN_EXT = 1000572007, - WRITE_INDIRECT_EXECUTION_SET_PIPELINE_EXT = 1000572008, - WRITE_INDIRECT_EXECUTION_SET_SHADER_EXT = 1000572009, - INDIRECT_EXECUTION_SET_PIPELINE_INFO_EXT = 1000572010, - INDIRECT_EXECUTION_SET_SHADER_INFO_EXT = 1000572011, - INDIRECT_EXECUTION_SET_SHADER_LAYOUT_INFO_EXT = 1000572012, - GENERATED_COMMANDS_PIPELINE_INFO_EXT = 1000572013, - GENERATED_COMMANDS_SHADER_INFO_EXT = 1000572014, - PHYSICAL_DEVICE_MAINTENANCE_8_FEATURES_KHR = 1000574000, - MEMORY_BARRIER_ACCESS_FLAGS_3_KHR = 1000574002, - PHYSICAL_DEVICE_IMAGE_ALIGNMENT_CONTROL_FEATURES_MESA = 1000575000, - PHYSICAL_DEVICE_IMAGE_ALIGNMENT_CONTROL_PROPERTIES_MESA = 1000575001, - IMAGE_ALIGNMENT_CONTROL_CREATE_INFO_MESA = 1000575002, - PHYSICAL_DEVICE_DEPTH_CLAMP_CONTROL_FEATURES_EXT = 1000582000, - PIPELINE_VIEWPORT_DEPTH_CLAMP_CONTROL_CREATE_INFO_EXT = 1000582001, - PHYSICAL_DEVICE_VIDEO_MAINTENANCE_2_FEATURES_KHR = 1000586000, - VIDEO_DECODE_H264_INLINE_SESSION_PARAMETERS_INFO_KHR = 1000586001, - VIDEO_DECODE_H265_INLINE_SESSION_PARAMETERS_INFO_KHR = 1000586002, - VIDEO_DECODE_AV1_INLINE_SESSION_PARAMETERS_INFO_KHR = 1000586003, - PHYSICAL_DEVICE_HDR_VIVID_FEATURES_HUAWEI = 1000590000, - HDR_VIVID_DYNAMIC_METADATA_HUAWEI = 1000590001, - PHYSICAL_DEVICE_COOPERATIVE_MATRIX_2_FEATURES_NV = 1000593000, - COOPERATIVE_MATRIX_FLEXIBLE_DIMENSIONS_PROPERTIES_NV = 1000593001, - PHYSICAL_DEVICE_COOPERATIVE_MATRIX_2_PROPERTIES_NV = 1000593002, - PHYSICAL_DEVICE_PIPELINE_OPACITY_MICROMAP_FEATURES_ARM = 1000596000, - IMPORT_MEMORY_METAL_HANDLE_INFO_EXT = 1000602000, - MEMORY_METAL_HANDLE_PROPERTIES_EXT = 1000602001, - MEMORY_GET_METAL_HANDLE_INFO_EXT = 1000602002, - PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_KHR = 1000421000, - PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_ROBUSTNESS_FEATURES_EXT = 1000608000, - SET_PRESENT_CONFIG_NV = 1000613000, - PHYSICAL_DEVICE_PRESENT_METERING_FEATURES_NV = 1000613001, - PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES = PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES, - PHYSICAL_DEVICE_SHADER_DRAW_PARAMETER_FEATURES = PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES, - DEBUG_REPORT_CREATE_INFO_EXT = DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT, - RENDERING_INFO_KHR = RENDERING_INFO, - RENDERING_ATTACHMENT_INFO_KHR = RENDERING_ATTACHMENT_INFO, - PIPELINE_RENDERING_CREATE_INFO_KHR = PIPELINE_RENDERING_CREATE_INFO, - PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR = PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES, - COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR = COMMAND_BUFFER_INHERITANCE_RENDERING_INFO, - RENDER_PASS_MULTIVIEW_CREATE_INFO_KHR = RENDER_PASS_MULTIVIEW_CREATE_INFO, - PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHR = PHYSICAL_DEVICE_MULTIVIEW_FEATURES, - PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES_KHR = PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, - PHYSICAL_DEVICE_FEATURES_2_KHR = PHYSICAL_DEVICE_FEATURES_2, - PHYSICAL_DEVICE_PROPERTIES_2_KHR = PHYSICAL_DEVICE_PROPERTIES_2, - FORMAT_PROPERTIES_2_KHR = FORMAT_PROPERTIES_2, - IMAGE_FORMAT_PROPERTIES_2_KHR = IMAGE_FORMAT_PROPERTIES_2, - PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2_KHR = PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2, - QUEUE_FAMILY_PROPERTIES_2_KHR = QUEUE_FAMILY_PROPERTIES_2, - PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR = PHYSICAL_DEVICE_MEMORY_PROPERTIES_2, - SPARSE_IMAGE_FORMAT_PROPERTIES_2_KHR = SPARSE_IMAGE_FORMAT_PROPERTIES_2, - PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2_KHR = PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2, - MEMORY_ALLOCATE_FLAGS_INFO_KHR = MEMORY_ALLOCATE_FLAGS_INFO, - DEVICE_GROUP_RENDER_PASS_BEGIN_INFO_KHR = DEVICE_GROUP_RENDER_PASS_BEGIN_INFO, - DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO_KHR = DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO, - DEVICE_GROUP_SUBMIT_INFO_KHR = DEVICE_GROUP_SUBMIT_INFO, - DEVICE_GROUP_BIND_SPARSE_INFO_KHR = DEVICE_GROUP_BIND_SPARSE_INFO, - BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO_KHR = BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO, - BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO_KHR = BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO, - PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT = PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES, - PIPELINE_ROBUSTNESS_CREATE_INFO_EXT = PIPELINE_ROBUSTNESS_CREATE_INFO, - PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES_EXT = PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES, - PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES_EXT = PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES, - PHYSICAL_DEVICE_GROUP_PROPERTIES_KHR = PHYSICAL_DEVICE_GROUP_PROPERTIES, - DEVICE_GROUP_DEVICE_CREATE_INFO_KHR = DEVICE_GROUP_DEVICE_CREATE_INFO, - PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO_KHR = PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO, - EXTERNAL_IMAGE_FORMAT_PROPERTIES_KHR = EXTERNAL_IMAGE_FORMAT_PROPERTIES, - PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO_KHR = PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO, - EXTERNAL_BUFFER_PROPERTIES_KHR = EXTERNAL_BUFFER_PROPERTIES, - PHYSICAL_DEVICE_ID_PROPERTIES_KHR = PHYSICAL_DEVICE_ID_PROPERTIES, - EXTERNAL_MEMORY_BUFFER_CREATE_INFO_KHR = EXTERNAL_MEMORY_BUFFER_CREATE_INFO, - EXTERNAL_MEMORY_IMAGE_CREATE_INFO_KHR = EXTERNAL_MEMORY_IMAGE_CREATE_INFO, - EXPORT_MEMORY_ALLOCATE_INFO_KHR = EXPORT_MEMORY_ALLOCATE_INFO, - PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO_KHR = PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO, - EXTERNAL_SEMAPHORE_PROPERTIES_KHR = EXTERNAL_SEMAPHORE_PROPERTIES, - EXPORT_SEMAPHORE_CREATE_INFO_KHR = EXPORT_SEMAPHORE_CREATE_INFO, - PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR = PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES, - PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES_KHR = PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES, - PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR = PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES, - PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR = PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, - DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR = DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO, - SURFACE_CAPABILITIES2_EXT = SURFACE_CAPABILITIES_2_EXT, - PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR = PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES, - FRAMEBUFFER_ATTACHMENTS_CREATE_INFO_KHR = FRAMEBUFFER_ATTACHMENTS_CREATE_INFO, - FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR = FRAMEBUFFER_ATTACHMENT_IMAGE_INFO, - RENDER_PASS_ATTACHMENT_BEGIN_INFO_KHR = RENDER_PASS_ATTACHMENT_BEGIN_INFO, - ATTACHMENT_DESCRIPTION_2_KHR = ATTACHMENT_DESCRIPTION_2, - ATTACHMENT_REFERENCE_2_KHR = ATTACHMENT_REFERENCE_2, - SUBPASS_DESCRIPTION_2_KHR = SUBPASS_DESCRIPTION_2, - SUBPASS_DEPENDENCY_2_KHR = SUBPASS_DEPENDENCY_2, - RENDER_PASS_CREATE_INFO_2_KHR = RENDER_PASS_CREATE_INFO_2, - SUBPASS_BEGIN_INFO_KHR = SUBPASS_BEGIN_INFO, - SUBPASS_END_INFO_KHR = SUBPASS_END_INFO, - PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO_KHR = PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO, - EXTERNAL_FENCE_PROPERTIES_KHR = EXTERNAL_FENCE_PROPERTIES, - EXPORT_FENCE_CREATE_INFO_KHR = EXPORT_FENCE_CREATE_INFO, - PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES_KHR = PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES, - RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO_KHR = RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO, - IMAGE_VIEW_USAGE_CREATE_INFO_KHR = IMAGE_VIEW_USAGE_CREATE_INFO, - PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO_KHR = PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO, - PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES_KHR = PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES, - PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR = PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES_KHR, - MEMORY_DEDICATED_REQUIREMENTS_KHR = MEMORY_DEDICATED_REQUIREMENTS, - MEMORY_DEDICATED_ALLOCATE_INFO_KHR = MEMORY_DEDICATED_ALLOCATE_INFO, - PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT = PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES, - SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT = SAMPLER_REDUCTION_MODE_CREATE_INFO, - PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT = PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES, - PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT = PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES, - WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT = WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK, - DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT = DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO, - BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR = BUFFER_MEMORY_REQUIREMENTS_INFO_2, - IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR = IMAGE_MEMORY_REQUIREMENTS_INFO_2, - IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2_KHR = IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2, - MEMORY_REQUIREMENTS_2_KHR = MEMORY_REQUIREMENTS_2, - SPARSE_IMAGE_MEMORY_REQUIREMENTS_2_KHR = SPARSE_IMAGE_MEMORY_REQUIREMENTS_2, - IMAGE_FORMAT_LIST_CREATE_INFO_KHR = IMAGE_FORMAT_LIST_CREATE_INFO, - ATTACHMENT_SAMPLE_COUNT_INFO_NV = ATTACHMENT_SAMPLE_COUNT_INFO_AMD, - SAMPLER_YCBCR_CONVERSION_CREATE_INFO_KHR = SAMPLER_YCBCR_CONVERSION_CREATE_INFO, - SAMPLER_YCBCR_CONVERSION_INFO_KHR = SAMPLER_YCBCR_CONVERSION_INFO, - BIND_IMAGE_PLANE_MEMORY_INFO_KHR = BIND_IMAGE_PLANE_MEMORY_INFO, - IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO_KHR = IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO, - PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES_KHR = PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, - SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES_KHR = SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES, - BIND_BUFFER_MEMORY_INFO_KHR = BIND_BUFFER_MEMORY_INFO, - BIND_IMAGE_MEMORY_INFO_KHR = BIND_IMAGE_MEMORY_INFO, - DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT = DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO, - PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT = PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES, - PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT = PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES, - DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT = DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO, - DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT = DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT, - PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES_KHR = PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES, - DESCRIPTOR_SET_LAYOUT_SUPPORT_KHR = DESCRIPTOR_SET_LAYOUT_SUPPORT, - DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT = DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO, - PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES_KHR = PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES, - PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR = PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES, - PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR = PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES, - CALIBRATED_TIMESTAMP_INFO_EXT = CALIBRATED_TIMESTAMP_INFO_KHR, - DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_KHR = DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO, - PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_KHR = PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES, - QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_KHR = QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES, - PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT = PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO, - PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT = PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES, - PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT = PIPELINE_CREATION_FEEDBACK_CREATE_INFO, - PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR = PHYSICAL_DEVICE_DRIVER_PROPERTIES, - PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR = PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES, - PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR = PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES, - SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE_KHR = SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE, - PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV = PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_KHR, - PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV = PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR, - PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR = PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES, - PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES_KHR = PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES, - SEMAPHORE_TYPE_CREATE_INFO_KHR = SEMAPHORE_TYPE_CREATE_INFO, - TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR = TIMELINE_SEMAPHORE_SUBMIT_INFO, - SEMAPHORE_WAIT_INFO_KHR = SEMAPHORE_WAIT_INFO, - SEMAPHORE_SIGNAL_INFO_KHR = SEMAPHORE_SIGNAL_INFO, - QUERY_POOL_CREATE_INFO_INTEL = QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL, - PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR = PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES, - PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR = PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES, - PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT = PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES, - PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT = PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES, - PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT = PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO, - PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT = PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES, - PHYSICAL_DEVICE_DYNAMIC_RENDERING_LOCAL_READ_FEATURES_KHR = PHYSICAL_DEVICE_DYNAMIC_RENDERING_LOCAL_READ_FEATURES, - RENDERING_ATTACHMENT_LOCATION_INFO_KHR = RENDERING_ATTACHMENT_LOCATION_INFO, - RENDERING_INPUT_ATTACHMENT_INDEX_INFO_KHR = RENDERING_INPUT_ATTACHMENT_INDEX_INFO, - PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES_KHR = PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES, - ATTACHMENT_REFERENCE_STENCIL_LAYOUT_KHR = ATTACHMENT_REFERENCE_STENCIL_LAYOUT, - ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT_KHR = ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT, - PHYSICAL_DEVICE_BUFFER_ADDRESS_FEATURES_EXT = PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT, - BUFFER_DEVICE_ADDRESS_INFO_EXT = BUFFER_DEVICE_ADDRESS_INFO, - PHYSICAL_DEVICE_TOOL_PROPERTIES_EXT = PHYSICAL_DEVICE_TOOL_PROPERTIES, - IMAGE_STENCIL_USAGE_CREATE_INFO_EXT = IMAGE_STENCIL_USAGE_CREATE_INFO, - PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR = PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES, - PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_KHR = PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES, - BUFFER_DEVICE_ADDRESS_INFO_KHR = BUFFER_DEVICE_ADDRESS_INFO, - BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO_KHR = BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO, - MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO_KHR = MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO, - DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO_KHR = DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO, - PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT = PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES, - PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT = PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO, - PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT = PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES, - PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT = PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES, - PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT = PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES, - PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES_EXT = PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES, - PHYSICAL_DEVICE_HOST_IMAGE_COPY_PROPERTIES_EXT = PHYSICAL_DEVICE_HOST_IMAGE_COPY_PROPERTIES, - MEMORY_TO_IMAGE_COPY_EXT = MEMORY_TO_IMAGE_COPY, - IMAGE_TO_MEMORY_COPY_EXT = IMAGE_TO_MEMORY_COPY, - COPY_IMAGE_TO_MEMORY_INFO_EXT = COPY_IMAGE_TO_MEMORY_INFO, - COPY_MEMORY_TO_IMAGE_INFO_EXT = COPY_MEMORY_TO_IMAGE_INFO, - HOST_IMAGE_LAYOUT_TRANSITION_INFO_EXT = HOST_IMAGE_LAYOUT_TRANSITION_INFO, - COPY_IMAGE_TO_IMAGE_INFO_EXT = COPY_IMAGE_TO_IMAGE_INFO, - SUBRESOURCE_HOST_MEMCPY_SIZE_EXT = SUBRESOURCE_HOST_MEMCPY_SIZE, - HOST_IMAGE_COPY_DEVICE_PERFORMANCE_QUERY_EXT = HOST_IMAGE_COPY_DEVICE_PERFORMANCE_QUERY, - MEMORY_MAP_INFO_KHR = MEMORY_MAP_INFO, - MEMORY_UNMAP_INFO_KHR = MEMORY_UNMAP_INFO, - PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT = PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES, - PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR = PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES, - PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR = PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES, - PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT = PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES, - PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT = PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES, - DEVICE_PRIVATE_DATA_CREATE_INFO_EXT = DEVICE_PRIVATE_DATA_CREATE_INFO, - PRIVATE_DATA_SLOT_CREATE_INFO_EXT = PRIVATE_DATA_SLOT_CREATE_INFO, - PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT = PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES, - MEMORY_BARRIER_2_KHR = MEMORY_BARRIER_2, - BUFFER_MEMORY_BARRIER_2_KHR = BUFFER_MEMORY_BARRIER_2, - IMAGE_MEMORY_BARRIER_2_KHR = IMAGE_MEMORY_BARRIER_2, - DEPENDENCY_INFO_KHR = DEPENDENCY_INFO, - SUBMIT_INFO_2_KHR = SUBMIT_INFO_2, - SEMAPHORE_SUBMIT_INFO_KHR = SEMAPHORE_SUBMIT_INFO, - COMMAND_BUFFER_SUBMIT_INFO_KHR = COMMAND_BUFFER_SUBMIT_INFO, - PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR = PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES, - PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR = PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES, - PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT = PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES, - COPY_BUFFER_INFO_2_KHR = COPY_BUFFER_INFO_2, - COPY_IMAGE_INFO_2_KHR = COPY_IMAGE_INFO_2, - COPY_BUFFER_TO_IMAGE_INFO_2_KHR = COPY_BUFFER_TO_IMAGE_INFO_2, - COPY_IMAGE_TO_BUFFER_INFO_2_KHR = COPY_IMAGE_TO_BUFFER_INFO_2, - BLIT_IMAGE_INFO_2_KHR = BLIT_IMAGE_INFO_2, - RESOLVE_IMAGE_INFO_2_KHR = RESOLVE_IMAGE_INFO_2, - BUFFER_COPY_2_KHR = BUFFER_COPY_2, - IMAGE_COPY_2_KHR = IMAGE_COPY_2, - IMAGE_BLIT_2_KHR = IMAGE_BLIT_2, - BUFFER_IMAGE_COPY_2_KHR = BUFFER_IMAGE_COPY_2, - IMAGE_RESOLVE_2_KHR = IMAGE_RESOLVE_2, - SUBRESOURCE_LAYOUT_2_EXT = SUBRESOURCE_LAYOUT_2, - IMAGE_SUBRESOURCE_2_EXT = IMAGE_SUBRESOURCE_2, - PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_ARM = PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT, - PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE = PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT, - MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE = MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_EXT, - FORMAT_PROPERTIES_3_KHR = FORMAT_PROPERTIES_3, - PIPELINE_INFO_EXT = PIPELINE_INFO_KHR, - PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT = PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES, - QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT = QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES, - PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR = PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES, - PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR = PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES, - DEVICE_BUFFER_MEMORY_REQUIREMENTS_KHR = DEVICE_BUFFER_MEMORY_REQUIREMENTS, - DEVICE_IMAGE_MEMORY_REQUIREMENTS_KHR = DEVICE_IMAGE_MEMORY_REQUIREMENTS, - PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES_KHR = PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES, - PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_EXT = PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_KHR, - PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES_EXT = PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES, - PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES_KHR = PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES, - PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES_KHR = PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES, - RENDERING_AREA_INFO_KHR = RENDERING_AREA_INFO, - DEVICE_IMAGE_SUBRESOURCE_INFO_KHR = DEVICE_IMAGE_SUBRESOURCE_INFO, - SUBRESOURCE_LAYOUT_2_KHR = SUBRESOURCE_LAYOUT_2, - IMAGE_SUBRESOURCE_2_KHR = IMAGE_SUBRESOURCE_2, - PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR = PIPELINE_CREATE_FLAGS_2_CREATE_INFO, - BUFFER_USAGE_FLAGS_2_CREATE_INFO_KHR = BUFFER_USAGE_FLAGS_2_CREATE_INFO, - SHADER_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT = PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO, - PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_KHR = PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES, - PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_KHR = PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO, - PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR = PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES, - PHYSICAL_DEVICE_SHADER_FLOAT_CONTROLS_2_FEATURES_KHR = PHYSICAL_DEVICE_SHADER_FLOAT_CONTROLS_2_FEATURES, - PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_KHR = PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES, - PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_KHR = PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES, - PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_KHR = PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO, - PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_KHR = PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES, - PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES_KHR = PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES, - PHYSICAL_DEVICE_MAINTENANCE_6_FEATURES_KHR = PHYSICAL_DEVICE_MAINTENANCE_6_FEATURES, - PHYSICAL_DEVICE_MAINTENANCE_6_PROPERTIES_KHR = PHYSICAL_DEVICE_MAINTENANCE_6_PROPERTIES, - BIND_MEMORY_STATUS_KHR = BIND_MEMORY_STATUS, - BIND_DESCRIPTOR_SETS_INFO_KHR = BIND_DESCRIPTOR_SETS_INFO, - PUSH_CONSTANTS_INFO_KHR = PUSH_CONSTANTS_INFO, - PUSH_DESCRIPTOR_SET_INFO_KHR = PUSH_DESCRIPTOR_SET_INFO, - PUSH_DESCRIPTOR_SET_WITH_TEMPLATE_INFO_KHR = PUSH_DESCRIPTOR_SET_WITH_TEMPLATE_INFO, + APPLICATION_INFO = 0, + INSTANCE_CREATE_INFO = 1, + DEVICE_QUEUE_CREATE_INFO = 2, + DEVICE_CREATE_INFO = 3, + SUBMIT_INFO = 4, + MEMORY_ALLOCATE_INFO = 5, + MAPPED_MEMORY_RANGE = 6, + BIND_SPARSE_INFO = 7, + FENCE_CREATE_INFO = 8, + SEMAPHORE_CREATE_INFO = 9, + EVENT_CREATE_INFO = 10, + QUERY_POOL_CREATE_INFO = 11, + BUFFER_CREATE_INFO = 12, + BUFFER_VIEW_CREATE_INFO = 13, + IMAGE_CREATE_INFO = 14, + IMAGE_VIEW_CREATE_INFO = 15, + SHADER_MODULE_CREATE_INFO = 16, + PIPELINE_CACHE_CREATE_INFO = 17, + PIPELINE_SHADER_STAGE_CREATE_INFO = 18, + PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO = 19, + PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO = 20, + PIPELINE_TESSELLATION_STATE_CREATE_INFO = 21, + PIPELINE_VIEWPORT_STATE_CREATE_INFO = 22, + PIPELINE_RASTERIZATION_STATE_CREATE_INFO = 23, + PIPELINE_MULTISAMPLE_STATE_CREATE_INFO = 24, + PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO = 25, + PIPELINE_COLOR_BLEND_STATE_CREATE_INFO = 26, + PIPELINE_DYNAMIC_STATE_CREATE_INFO = 27, + GRAPHICS_PIPELINE_CREATE_INFO = 28, + COMPUTE_PIPELINE_CREATE_INFO = 29, + PIPELINE_LAYOUT_CREATE_INFO = 30, + SAMPLER_CREATE_INFO = 31, + DESCRIPTOR_SET_LAYOUT_CREATE_INFO = 32, + DESCRIPTOR_POOL_CREATE_INFO = 33, + DESCRIPTOR_SET_ALLOCATE_INFO = 34, + WRITE_DESCRIPTOR_SET = 35, + COPY_DESCRIPTOR_SET = 36, + FRAMEBUFFER_CREATE_INFO = 37, + RENDER_PASS_CREATE_INFO = 38, + COMMAND_POOL_CREATE_INFO = 39, + COMMAND_BUFFER_ALLOCATE_INFO = 40, + COMMAND_BUFFER_INHERITANCE_INFO = 41, + COMMAND_BUFFER_BEGIN_INFO = 42, + RENDER_PASS_BEGIN_INFO = 43, + BUFFER_MEMORY_BARRIER = 44, + IMAGE_MEMORY_BARRIER = 45, + MEMORY_BARRIER = 46, + LOADER_INSTANCE_CREATE_INFO = 47, + LOADER_DEVICE_CREATE_INFO = 48, + BIND_BUFFER_MEMORY_INFO = 1000157000, + BIND_IMAGE_MEMORY_INFO = 1000157001, + MEMORY_DEDICATED_REQUIREMENTS = 1000127000, + MEMORY_DEDICATED_ALLOCATE_INFO = 1000127001, + MEMORY_ALLOCATE_FLAGS_INFO = 1000060000, + DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO = 1000060004, + DEVICE_GROUP_SUBMIT_INFO = 1000060005, + DEVICE_GROUP_BIND_SPARSE_INFO = 1000060006, + BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO = 1000060013, + BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO = 1000060014, + PHYSICAL_DEVICE_GROUP_PROPERTIES = 1000070000, + DEVICE_GROUP_DEVICE_CREATE_INFO = 1000070001, + BUFFER_MEMORY_REQUIREMENTS_INFO_2 = 1000146000, + IMAGE_MEMORY_REQUIREMENTS_INFO_2 = 1000146001, + IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2 = 1000146002, + MEMORY_REQUIREMENTS_2 = 1000146003, + SPARSE_IMAGE_MEMORY_REQUIREMENTS_2 = 1000146004, + PHYSICAL_DEVICE_FEATURES_2 = 1000059000, + PHYSICAL_DEVICE_PROPERTIES_2 = 1000059001, + FORMAT_PROPERTIES_2 = 1000059002, + IMAGE_FORMAT_PROPERTIES_2 = 1000059003, + PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2 = 1000059004, + QUEUE_FAMILY_PROPERTIES_2 = 1000059005, + PHYSICAL_DEVICE_MEMORY_PROPERTIES_2 = 1000059006, + SPARSE_IMAGE_FORMAT_PROPERTIES_2 = 1000059007, + PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2 = 1000059008, + IMAGE_VIEW_USAGE_CREATE_INFO = 1000117002, + PROTECTED_SUBMIT_INFO = 1000145000, + PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES = 1000145001, + PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES = 1000145002, + DEVICE_QUEUE_INFO_2 = 1000145003, + PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO = 1000071000, + EXTERNAL_IMAGE_FORMAT_PROPERTIES = 1000071001, + PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO = 1000071002, + EXTERNAL_BUFFER_PROPERTIES = 1000071003, + PHYSICAL_DEVICE_ID_PROPERTIES = 1000071004, + EXTERNAL_MEMORY_BUFFER_CREATE_INFO = 1000072000, + EXTERNAL_MEMORY_IMAGE_CREATE_INFO = 1000072001, + EXPORT_MEMORY_ALLOCATE_INFO = 1000072002, + PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO = 1000112000, + EXTERNAL_FENCE_PROPERTIES = 1000112001, + EXPORT_FENCE_CREATE_INFO = 1000113000, + EXPORT_SEMAPHORE_CREATE_INFO = 1000077000, + PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO = 1000076000, + EXTERNAL_SEMAPHORE_PROPERTIES = 1000076001, + PHYSICAL_DEVICE_SUBGROUP_PROPERTIES = 1000094000, + PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES = 1000083000, + PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES = 1000120000, + DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO = 1000085000, + PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES = 1000168000, + DESCRIPTOR_SET_LAYOUT_SUPPORT = 1000168001, + SAMPLER_YCBCR_CONVERSION_CREATE_INFO = 1000156000, + SAMPLER_YCBCR_CONVERSION_INFO = 1000156001, + BIND_IMAGE_PLANE_MEMORY_INFO = 1000156002, + IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO = 1000156003, + PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES = 1000156004, + SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES = 1000156005, + DEVICE_GROUP_RENDER_PASS_BEGIN_INFO = 1000060003, + PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES = 1000117000, + RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO = 1000117001, + PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO = 1000117003, + RENDER_PASS_MULTIVIEW_CREATE_INFO = 1000053000, + PHYSICAL_DEVICE_MULTIVIEW_FEATURES = 1000053001, + PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES = 1000053002, + PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES = 1000063000, + PHYSICAL_DEVICE_DRIVER_PROPERTIES = 1000196000, + PHYSICAL_DEVICE_VULKAN_1_1_FEATURES = 49, + PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES = 50, + PHYSICAL_DEVICE_VULKAN_1_2_FEATURES = 51, + PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES = 52, + IMAGE_FORMAT_LIST_CREATE_INFO = 1000147000, + PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES = 1000211000, + PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES = 1000261000, + PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES = 1000207000, + PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES = 1000207001, + SEMAPHORE_TYPE_CREATE_INFO = 1000207002, + TIMELINE_SEMAPHORE_SUBMIT_INFO = 1000207003, + SEMAPHORE_WAIT_INFO = 1000207004, + SEMAPHORE_SIGNAL_INFO = 1000207005, + PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES = 1000257000, + BUFFER_DEVICE_ADDRESS_INFO = 1000244001, + BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO = 1000257002, + MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO = 1000257003, + DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO = 1000257004, + PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES = 1000177000, + PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES = 1000180000, + PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES = 1000082000, + PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES = 1000197000, + DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO = 1000161000, + PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES = 1000161001, + PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES = 1000161002, + DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO = 1000161003, + DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT = 1000161004, + PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES = 1000221000, + PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES = 1000130000, + SAMPLER_REDUCTION_MODE_CREATE_INFO = 1000130001, + PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES = 1000253000, + PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES = 1000175000, + ATTACHMENT_DESCRIPTION_2 = 1000109000, + ATTACHMENT_REFERENCE_2 = 1000109001, + SUBPASS_DESCRIPTION_2 = 1000109002, + SUBPASS_DEPENDENCY_2 = 1000109003, + RENDER_PASS_CREATE_INFO_2 = 1000109004, + SUBPASS_BEGIN_INFO = 1000109005, + SUBPASS_END_INFO = 1000109006, + PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES = 1000199000, + SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE = 1000199001, + IMAGE_STENCIL_USAGE_CREATE_INFO = 1000246000, + PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES = 1000108000, + FRAMEBUFFER_ATTACHMENTS_CREATE_INFO = 1000108001, + FRAMEBUFFER_ATTACHMENT_IMAGE_INFO = 1000108002, + RENDER_PASS_ATTACHMENT_BEGIN_INFO = 1000108003, + PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES = 1000241000, + ATTACHMENT_REFERENCE_STENCIL_LAYOUT = 1000241001, + ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT = 1000241002, + PHYSICAL_DEVICE_VULKAN_1_3_FEATURES = 53, + PHYSICAL_DEVICE_VULKAN_1_3_PROPERTIES = 54, + PHYSICAL_DEVICE_TOOL_PROPERTIES = 1000245000, + PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES = 1000295000, + DEVICE_PRIVATE_DATA_CREATE_INFO = 1000295001, + PRIVATE_DATA_SLOT_CREATE_INFO = 1000295002, + MEMORY_BARRIER_2 = 1000314000, + BUFFER_MEMORY_BARRIER_2 = 1000314001, + IMAGE_MEMORY_BARRIER_2 = 1000314002, + DEPENDENCY_INFO = 1000314003, + SUBMIT_INFO_2 = 1000314004, + SEMAPHORE_SUBMIT_INFO = 1000314005, + COMMAND_BUFFER_SUBMIT_INFO = 1000314006, + PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES = 1000314007, + COPY_BUFFER_INFO_2 = 1000337000, + COPY_IMAGE_INFO_2 = 1000337001, + COPY_BUFFER_TO_IMAGE_INFO_2 = 1000337002, + COPY_IMAGE_TO_BUFFER_INFO_2 = 1000337003, + BUFFER_COPY_2 = 1000337006, + IMAGE_COPY_2 = 1000337007, + BUFFER_IMAGE_COPY_2 = 1000337009, + PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES = 1000066000, + FORMAT_PROPERTIES_3 = 1000360000, + PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES = 1000413000, + PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES = 1000413001, + DEVICE_BUFFER_MEMORY_REQUIREMENTS = 1000413002, + DEVICE_IMAGE_MEMORY_REQUIREMENTS = 1000413003, + PIPELINE_CREATION_FEEDBACK_CREATE_INFO = 1000192000, + PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES = 1000215000, + PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES = 1000276000, + PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES = 1000297000, + PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES = 1000325000, + PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES = 1000335000, + PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES = 1000225000, + PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO = 1000225001, + PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES = 1000225002, + PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES = 1000138000, + PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES = 1000138001, + WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK = 1000138002, + DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO = 1000138003, + PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES = 1000280000, + PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES = 1000280001, + PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES = 1000281001, + BLIT_IMAGE_INFO_2 = 1000337004, + RESOLVE_IMAGE_INFO_2 = 1000337005, + IMAGE_BLIT_2 = 1000337008, + IMAGE_RESOLVE_2 = 1000337010, + RENDERING_INFO = 1000044000, + RENDERING_ATTACHMENT_INFO = 1000044001, + PIPELINE_RENDERING_CREATE_INFO = 1000044002, + PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES = 1000044003, + COMMAND_BUFFER_INHERITANCE_RENDERING_INFO = 1000044004, + PHYSICAL_DEVICE_VULKAN_1_4_FEATURES = 55, + PHYSICAL_DEVICE_VULKAN_1_4_PROPERTIES = 56, + DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO = 1000174000, + PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES = 1000388000, + QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES = 1000388001, + PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES = 1000265000, + MEMORY_MAP_INFO = 1000271000, + MEMORY_UNMAP_INFO = 1000271001, + PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES = 1000470000, + PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES = 1000470001, + DEVICE_IMAGE_SUBRESOURCE_INFO = 1000470004, + SUBRESOURCE_LAYOUT_2 = 1000338002, + IMAGE_SUBRESOURCE_2 = 1000338003, + BUFFER_USAGE_FLAGS_2_CREATE_INFO = 1000470006, + PHYSICAL_DEVICE_MAINTENANCE_6_FEATURES = 1000545000, + PHYSICAL_DEVICE_MAINTENANCE_6_PROPERTIES = 1000545001, + BIND_MEMORY_STATUS = 1000545002, + PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES = 1000270000, + PHYSICAL_DEVICE_HOST_IMAGE_COPY_PROPERTIES = 1000270001, + MEMORY_TO_IMAGE_COPY = 1000270002, + IMAGE_TO_MEMORY_COPY = 1000270003, + COPY_IMAGE_TO_MEMORY_INFO = 1000270004, + COPY_MEMORY_TO_IMAGE_INFO = 1000270005, + HOST_IMAGE_LAYOUT_TRANSITION_INFO = 1000270006, + COPY_IMAGE_TO_IMAGE_INFO = 1000270007, + SUBRESOURCE_HOST_MEMCPY_SIZE = 1000270008, + HOST_IMAGE_COPY_DEVICE_PERFORMANCE_QUERY = 1000270009, + PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES = 1000416000, + PHYSICAL_DEVICE_SHADER_FLOAT_CONTROLS_2_FEATURES = 1000528000, + PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES = 1000544000, + PIPELINE_CREATE_FLAGS_2_CREATE_INFO = 1000470005, + PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES = 1000080000, + BIND_DESCRIPTOR_SETS_INFO = 1000545003, + PUSH_CONSTANTS_INFO = 1000545004, + PUSH_DESCRIPTOR_SET_INFO = 1000545005, + PUSH_DESCRIPTOR_SET_WITH_TEMPLATE_INFO = 1000545006, + PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES = 1000466000, + PIPELINE_ROBUSTNESS_CREATE_INFO = 1000068000, + PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES = 1000068001, + PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES = 1000068002, + PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES = 1000259000, + PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO = 1000259001, + PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES = 1000259002, + PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES = 1000525000, + PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO = 1000190001, + PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES = 1000190002, + RENDERING_AREA_INFO = 1000470003, + PHYSICAL_DEVICE_DYNAMIC_RENDERING_LOCAL_READ_FEATURES = 1000232000, + RENDERING_ATTACHMENT_LOCATION_INFO = 1000232001, + RENDERING_INPUT_ATTACHMENT_INDEX_INFO = 1000232002, + SWAPCHAIN_CREATE_INFO_KHR = 1000001000, + PRESENT_INFO_KHR = 1000001001, + DEVICE_GROUP_PRESENT_CAPABILITIES_KHR = 1000060007, + IMAGE_SWAPCHAIN_CREATE_INFO_KHR = 1000060008, + BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR = 1000060009, + ACQUIRE_NEXT_IMAGE_INFO_KHR = 1000060010, + DEVICE_GROUP_PRESENT_INFO_KHR = 1000060011, + DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR = 1000060012, + DISPLAY_MODE_CREATE_INFO_KHR = 1000002000, + DISPLAY_SURFACE_CREATE_INFO_KHR = 1000002001, + DISPLAY_PRESENT_INFO_KHR = 1000003000, + XLIB_SURFACE_CREATE_INFO_KHR = 1000004000, + XCB_SURFACE_CREATE_INFO_KHR = 1000005000, + WAYLAND_SURFACE_CREATE_INFO_KHR = 1000006000, + ANDROID_SURFACE_CREATE_INFO_KHR = 1000008000, + WIN32_SURFACE_CREATE_INFO_KHR = 1000009000, + DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT = 1000011000, + PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD = 1000018000, + DEBUG_MARKER_OBJECT_NAME_INFO_EXT = 1000022000, + DEBUG_MARKER_OBJECT_TAG_INFO_EXT = 1000022001, + DEBUG_MARKER_MARKER_INFO_EXT = 1000022002, + VIDEO_PROFILE_INFO_KHR = 1000023000, + VIDEO_CAPABILITIES_KHR = 1000023001, + VIDEO_PICTURE_RESOURCE_INFO_KHR = 1000023002, + VIDEO_SESSION_MEMORY_REQUIREMENTS_KHR = 1000023003, + BIND_VIDEO_SESSION_MEMORY_INFO_KHR = 1000023004, + VIDEO_SESSION_CREATE_INFO_KHR = 1000023005, + VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000023006, + VIDEO_SESSION_PARAMETERS_UPDATE_INFO_KHR = 1000023007, + VIDEO_BEGIN_CODING_INFO_KHR = 1000023008, + VIDEO_END_CODING_INFO_KHR = 1000023009, + VIDEO_CODING_CONTROL_INFO_KHR = 1000023010, + VIDEO_REFERENCE_SLOT_INFO_KHR = 1000023011, + QUEUE_FAMILY_VIDEO_PROPERTIES_KHR = 1000023012, + VIDEO_PROFILE_LIST_INFO_KHR = 1000023013, + PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR = 1000023014, + VIDEO_FORMAT_PROPERTIES_KHR = 1000023015, + QUEUE_FAMILY_QUERY_RESULT_STATUS_PROPERTIES_KHR = 1000023016, + VIDEO_DECODE_INFO_KHR = 1000024000, + VIDEO_DECODE_CAPABILITIES_KHR = 1000024001, + VIDEO_DECODE_USAGE_INFO_KHR = 1000024002, + DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV = 1000026000, + DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV = 1000026001, + DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV = 1000026002, + PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT = 1000028000, + PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT = 1000028001, + PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT = 1000028002, + CU_MODULE_CREATE_INFO_NVX = 1000029000, + CU_FUNCTION_CREATE_INFO_NVX = 1000029001, + CU_LAUNCH_INFO_NVX = 1000029002, + CU_MODULE_TEXTURING_MODE_CREATE_INFO_NVX = 1000029004, + IMAGE_VIEW_HANDLE_INFO_NVX = 1000030000, + IMAGE_VIEW_ADDRESS_PROPERTIES_NVX = 1000030001, + VIDEO_ENCODE_H264_CAPABILITIES_KHR = 1000038000, + VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000038001, + VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR = 1000038002, + VIDEO_ENCODE_H264_PICTURE_INFO_KHR = 1000038003, + VIDEO_ENCODE_H264_DPB_SLOT_INFO_KHR = 1000038004, + VIDEO_ENCODE_H264_NALU_SLICE_INFO_KHR = 1000038005, + VIDEO_ENCODE_H264_GOP_REMAINING_FRAME_INFO_KHR = 1000038006, + VIDEO_ENCODE_H264_PROFILE_INFO_KHR = 1000038007, + VIDEO_ENCODE_H264_RATE_CONTROL_INFO_KHR = 1000038008, + VIDEO_ENCODE_H264_RATE_CONTROL_LAYER_INFO_KHR = 1000038009, + VIDEO_ENCODE_H264_SESSION_CREATE_INFO_KHR = 1000038010, + VIDEO_ENCODE_H264_QUALITY_LEVEL_PROPERTIES_KHR = 1000038011, + VIDEO_ENCODE_H264_SESSION_PARAMETERS_GET_INFO_KHR = 1000038012, + VIDEO_ENCODE_H264_SESSION_PARAMETERS_FEEDBACK_INFO_KHR = 1000038013, + VIDEO_ENCODE_H265_CAPABILITIES_KHR = 1000039000, + VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000039001, + VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_KHR = 1000039002, + VIDEO_ENCODE_H265_PICTURE_INFO_KHR = 1000039003, + VIDEO_ENCODE_H265_DPB_SLOT_INFO_KHR = 1000039004, + VIDEO_ENCODE_H265_NALU_SLICE_SEGMENT_INFO_KHR = 1000039005, + VIDEO_ENCODE_H265_GOP_REMAINING_FRAME_INFO_KHR = 1000039006, + VIDEO_ENCODE_H265_PROFILE_INFO_KHR = 1000039007, + VIDEO_ENCODE_H265_RATE_CONTROL_INFO_KHR = 1000039009, + VIDEO_ENCODE_H265_RATE_CONTROL_LAYER_INFO_KHR = 1000039010, + VIDEO_ENCODE_H265_SESSION_CREATE_INFO_KHR = 1000039011, + VIDEO_ENCODE_H265_QUALITY_LEVEL_PROPERTIES_KHR = 1000039012, + VIDEO_ENCODE_H265_SESSION_PARAMETERS_GET_INFO_KHR = 1000039013, + VIDEO_ENCODE_H265_SESSION_PARAMETERS_FEEDBACK_INFO_KHR = 1000039014, + VIDEO_DECODE_H264_CAPABILITIES_KHR = 1000040000, + VIDEO_DECODE_H264_PICTURE_INFO_KHR = 1000040001, + VIDEO_DECODE_H264_PROFILE_INFO_KHR = 1000040003, + VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000040004, + VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR = 1000040005, + VIDEO_DECODE_H264_DPB_SLOT_INFO_KHR = 1000040006, + TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD = 1000041000, + STREAM_DESCRIPTOR_SURFACE_CREATE_INFO_GGP = 1000049000, + PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV = 1000050000, + EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV = 1000056000, + EXPORT_MEMORY_ALLOCATE_INFO_NV = 1000056001, + IMPORT_MEMORY_WIN32_HANDLE_INFO_NV = 1000057000, + EXPORT_MEMORY_WIN32_HANDLE_INFO_NV = 1000057001, + WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV = 1000058000, + VALIDATION_FLAGS_EXT = 1000061000, + VI_SURFACE_CREATE_INFO_NN = 1000062000, + IMAGE_VIEW_ASTC_DECODE_MODE_EXT = 1000067000, + PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT = 1000067001, + IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR = 1000073000, + EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR = 1000073001, + MEMORY_WIN32_HANDLE_PROPERTIES_KHR = 1000073002, + MEMORY_GET_WIN32_HANDLE_INFO_KHR = 1000073003, + IMPORT_MEMORY_FD_INFO_KHR = 1000074000, + MEMORY_FD_PROPERTIES_KHR = 1000074001, + MEMORY_GET_FD_INFO_KHR = 1000074002, + WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR = 1000075000, + IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR = 1000078000, + EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR = 1000078001, + D3D12_FENCE_SUBMIT_INFO_KHR = 1000078002, + SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR = 1000078003, + IMPORT_SEMAPHORE_FD_INFO_KHR = 1000079000, + SEMAPHORE_GET_FD_INFO_KHR = 1000079001, + COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT = 1000081000, + PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT = 1000081001, + CONDITIONAL_RENDERING_BEGIN_INFO_EXT = 1000081002, + PRESENT_REGIONS_KHR = 1000084000, + PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV = 1000087000, + SURFACE_CAPABILITIES_2_EXT = 1000090000, + DISPLAY_POWER_INFO_EXT = 1000091000, + DEVICE_EVENT_INFO_EXT = 1000091001, + DISPLAY_EVENT_INFO_EXT = 1000091002, + SWAPCHAIN_COUNTER_CREATE_INFO_EXT = 1000091003, + PRESENT_TIMES_INFO_GOOGLE = 1000092000, + PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX = 1000097000, + MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX = 1000044009, + PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV = 1000098000, + PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT = 1000099000, + PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT = 1000099001, + PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT = 1000101000, + PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT = 1000101001, + PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT = 1000102000, + PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT = 1000102001, + HDR_METADATA_EXT = 1000105000, + PHYSICAL_DEVICE_RELAXED_LINE_RASTERIZATION_FEATURES_IMG = 1000110000, + SHARED_PRESENT_SURFACE_CAPABILITIES_KHR = 1000111000, + IMPORT_FENCE_WIN32_HANDLE_INFO_KHR = 1000114000, + EXPORT_FENCE_WIN32_HANDLE_INFO_KHR = 1000114001, + FENCE_GET_WIN32_HANDLE_INFO_KHR = 1000114002, + IMPORT_FENCE_FD_INFO_KHR = 1000115000, + FENCE_GET_FD_INFO_KHR = 1000115001, + PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR = 1000116000, + PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR = 1000116001, + QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR = 1000116002, + PERFORMANCE_QUERY_SUBMIT_INFO_KHR = 1000116003, + ACQUIRE_PROFILING_LOCK_INFO_KHR = 1000116004, + PERFORMANCE_COUNTER_KHR = 1000116005, + PERFORMANCE_COUNTER_DESCRIPTION_KHR = 1000116006, + PHYSICAL_DEVICE_SURFACE_INFO_2_KHR = 1000119000, + SURFACE_CAPABILITIES_2_KHR = 1000119001, + SURFACE_FORMAT_2_KHR = 1000119002, + DISPLAY_PROPERTIES_2_KHR = 1000121000, + DISPLAY_PLANE_PROPERTIES_2_KHR = 1000121001, + DISPLAY_MODE_PROPERTIES_2_KHR = 1000121002, + DISPLAY_PLANE_INFO_2_KHR = 1000121003, + DISPLAY_PLANE_CAPABILITIES_2_KHR = 1000121004, + IOS_SURFACE_CREATE_INFO_MVK = 1000122000, + MACOS_SURFACE_CREATE_INFO_MVK = 1000123000, + DEBUG_UTILS_OBJECT_NAME_INFO_EXT = 1000128000, + DEBUG_UTILS_OBJECT_TAG_INFO_EXT = 1000128001, + DEBUG_UTILS_LABEL_EXT = 1000128002, + DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT = 1000128003, + DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT = 1000128004, + ANDROID_HARDWARE_BUFFER_USAGE_ANDROID = 1000129000, + ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID = 1000129001, + ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID = 1000129002, + IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID = 1000129003, + MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID = 1000129004, + EXTERNAL_FORMAT_ANDROID = 1000129005, + ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID = 1000129006, + PHYSICAL_DEVICE_GPA_FEATURES_AMD = 1000133000, + PHYSICAL_DEVICE_GPA_PROPERTIES_AMD = 1000133001, + GPA_SAMPLE_BEGIN_INFO_AMD = 1000133002, + GPA_SESSION_CREATE_INFO_AMD = 1000133003, + GPA_DEVICE_CLOCK_MODE_INFO_AMD = 1000133004, + PHYSICAL_DEVICE_GPA_PROPERTIES_2_AMD = 1000133005, + GPA_DEVICE_GET_CLOCK_INFO_AMD = 1000133006, + PHYSICAL_DEVICE_SHADER_ENQUEUE_FEATURES_AMDX = 1000134000, + PHYSICAL_DEVICE_SHADER_ENQUEUE_PROPERTIES_AMDX = 1000134001, + EXECUTION_GRAPH_PIPELINE_SCRATCH_SIZE_AMDX = 1000134002, + EXECUTION_GRAPH_PIPELINE_CREATE_INFO_AMDX = 1000134003, + PIPELINE_SHADER_STAGE_NODE_CREATE_INFO_AMDX = 1000134004, + TEXEL_BUFFER_DESCRIPTOR_INFO_EXT = 1000135000, + IMAGE_DESCRIPTOR_INFO_EXT = 1000135001, + RESOURCE_DESCRIPTOR_INFO_EXT = 1000135002, + BIND_HEAP_INFO_EXT = 1000135003, + PUSH_DATA_INFO_EXT = 1000135004, + DESCRIPTOR_SET_AND_BINDING_MAPPING_EXT = 1000135005, + SHADER_DESCRIPTOR_SET_AND_BINDING_MAPPING_INFO_EXT = 1000135006, + OPAQUE_CAPTURE_DATA_CREATE_INFO_EXT = 1000135007, + PHYSICAL_DEVICE_DESCRIPTOR_HEAP_PROPERTIES_EXT = 1000135008, + PHYSICAL_DEVICE_DESCRIPTOR_HEAP_FEATURES_EXT = 1000135009, + COMMAND_BUFFER_INHERITANCE_DESCRIPTOR_HEAP_INFO_EXT = 1000135010, + SAMPLER_CUSTOM_BORDER_COLOR_INDEX_CREATE_INFO_EXT = 1000135011, + INDIRECT_COMMANDS_LAYOUT_PUSH_DATA_TOKEN_NV = 1000135012, + SUBSAMPLED_IMAGE_FORMAT_PROPERTIES_EXT = 1000135013, + PHYSICAL_DEVICE_DESCRIPTOR_HEAP_TENSOR_PROPERTIES_ARM = 1000135014, + ATTACHMENT_SAMPLE_COUNT_INFO_AMD = 1000044008, + PHYSICAL_DEVICE_SHADER_BFLOAT16_FEATURES_KHR = 1000141000, + SAMPLE_LOCATIONS_INFO_EXT = 1000143000, + RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT = 1000143001, + PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT = 1000143002, + PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT = 1000143003, + MULTISAMPLE_PROPERTIES_EXT = 1000143004, + PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT = 1000148000, + PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT = 1000148001, + PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT = 1000148002, + PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV = 1000149000, + WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR = 1000150007, + ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR = 1000150000, + ACCELERATION_STRUCTURE_DEVICE_ADDRESS_INFO_KHR = 1000150002, + ACCELERATION_STRUCTURE_GEOMETRY_AABBS_DATA_KHR = 1000150003, + ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR = 1000150004, + ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR = 1000150005, + ACCELERATION_STRUCTURE_GEOMETRY_KHR = 1000150006, + ACCELERATION_STRUCTURE_VERSION_INFO_KHR = 1000150009, + COPY_ACCELERATION_STRUCTURE_INFO_KHR = 1000150010, + COPY_ACCELERATION_STRUCTURE_TO_MEMORY_INFO_KHR = 1000150011, + COPY_MEMORY_TO_ACCELERATION_STRUCTURE_INFO_KHR = 1000150012, + PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR = 1000150013, + PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR = 1000150014, + ACCELERATION_STRUCTURE_CREATE_INFO_KHR = 1000150017, + ACCELERATION_STRUCTURE_BUILD_SIZES_INFO_KHR = 1000150020, + PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR = 1000347000, + PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR = 1000347001, + RAY_TRACING_PIPELINE_CREATE_INFO_KHR = 1000150015, + RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR = 1000150016, + RAY_TRACING_PIPELINE_INTERFACE_CREATE_INFO_KHR = 1000150018, + PHYSICAL_DEVICE_RAY_QUERY_FEATURES_KHR = 1000348013, + PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV = 1000152000, + PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV = 1000154000, + PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV = 1000154001, + DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT = 1000158000, + PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT = 1000158002, + IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT = 1000158003, + IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT = 1000158004, + IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT = 1000158005, + DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT = 1000158006, + VALIDATION_CACHE_CREATE_INFO_EXT = 1000160000, + SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT = 1000160001, + PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR = 1000163000, + PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR = 1000163001, + PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV = 1000164000, + PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV = 1000164001, + PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV = 1000164002, + PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV = 1000164005, + RAY_TRACING_PIPELINE_CREATE_INFO_NV = 1000165000, + ACCELERATION_STRUCTURE_CREATE_INFO_NV = 1000165001, + GEOMETRY_NV = 1000165003, + GEOMETRY_TRIANGLES_NV = 1000165004, + GEOMETRY_AABB_NV = 1000165005, + BIND_ACCELERATION_STRUCTURE_MEMORY_INFO_NV = 1000165006, + WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV = 1000165007, + ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_NV = 1000165008, + PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV = 1000165009, + RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV = 1000165011, + ACCELERATION_STRUCTURE_INFO_NV = 1000165012, + PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV = 1000166000, + PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV = 1000166001, + PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT = 1000170000, + FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT = 1000170001, + PHYSICAL_DEVICE_COOPERATIVE_MATRIX_CONVERSION_FEATURES_QCOM = 1000172000, + PHYSICAL_DEVICE_ELAPSED_TIMER_QUERY_FEATURES_QCOM = 1000173000, + IMPORT_MEMORY_HOST_POINTER_INFO_EXT = 1000178000, + MEMORY_HOST_POINTER_PROPERTIES_EXT = 1000178001, + PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT = 1000178002, + PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR = 1000181000, + PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD = 1000183000, + PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD = 1000185000, + VIDEO_DECODE_H265_CAPABILITIES_KHR = 1000187000, + VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000187001, + VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_KHR = 1000187002, + VIDEO_DECODE_H265_PROFILE_INFO_KHR = 1000187003, + VIDEO_DECODE_H265_PICTURE_INFO_KHR = 1000187004, + VIDEO_DECODE_H265_DPB_SLOT_INFO_KHR = 1000187005, + DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD = 1000189000, + PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT = 1000190000, + PRESENT_FRAME_TOKEN_GGP = 1000191000, + PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV = 1000202000, + PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV = 1000202001, + PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV = 1000204000, + PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV = 1000205000, + PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV = 1000205002, + CHECKPOINT_DATA_NV = 1000206000, + QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV = 1000206001, + QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV = 1000314008, + CHECKPOINT_DATA_2_NV = 1000314009, + PHYSICAL_DEVICE_PRESENT_TIMING_FEATURES_EXT = 1000208000, + SWAPCHAIN_TIMING_PROPERTIES_EXT = 1000208001, + SWAPCHAIN_TIME_DOMAIN_PROPERTIES_EXT = 1000208002, + PRESENT_TIMINGS_INFO_EXT = 1000208003, + PRESENT_TIMING_INFO_EXT = 1000208004, + PAST_PRESENTATION_TIMING_INFO_EXT = 1000208005, + PAST_PRESENTATION_TIMING_PROPERTIES_EXT = 1000208006, + PAST_PRESENTATION_TIMING_EXT = 1000208007, + PRESENT_TIMING_SURFACE_CAPABILITIES_EXT = 1000208008, + SWAPCHAIN_CALIBRATED_TIMESTAMP_INFO_EXT = 1000208009, + PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL = 1000209000, + QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL = 1000210000, + INITIALIZE_PERFORMANCE_API_INFO_INTEL = 1000210001, + PERFORMANCE_MARKER_INFO_INTEL = 1000210002, + PERFORMANCE_STREAM_MARKER_INFO_INTEL = 1000210003, + PERFORMANCE_OVERRIDE_INFO_INTEL = 1000210004, + PERFORMANCE_CONFIGURATION_ACQUIRE_INFO_INTEL = 1000210005, + PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT = 1000212000, + DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD = 1000213000, + SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD = 1000213001, + IMAGEPIPE_SURFACE_CREATE_INFO_FUCHSIA = 1000214000, + METAL_SURFACE_CREATE_INFO_EXT = 1000217000, + PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT = 1000218000, + PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT = 1000218001, + RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT = 1000218002, + RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT = 1000044007, + FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR = 1000226000, + PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR = 1000226001, + PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR = 1000226002, + PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR = 1000226003, + PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_KHR = 1000226004, + RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR = 1000044006, + PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD = 1000227000, + PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD = 1000229000, + PHYSICAL_DEVICE_SHADER_CONSTANT_DATA_FEATURES_KHR = 1000231000, + PHYSICAL_DEVICE_SHADER_ABORT_FEATURES_KHR = 1000233000, + DEVICE_FAULT_SHADER_ABORT_MESSAGE_INFO_KHR = 1000233001, + PHYSICAL_DEVICE_SHADER_ABORT_PROPERTIES_KHR = 1000233002, + PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT = 1000234000, + PHYSICAL_DEVICE_SHADER_QUAD_CONTROL_FEATURES_KHR = 1000235000, + PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT = 1000237000, + PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT = 1000238000, + MEMORY_PRIORITY_ALLOCATE_INFO_EXT = 1000238001, + SURFACE_PROTECTED_CAPABILITIES_KHR = 1000239000, + PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV = 1000240000, + PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT = 1000244000, + BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT = 1000244002, + VALIDATION_FEATURES_EXT = 1000247000, + PHYSICAL_DEVICE_PRESENT_WAIT_FEATURES_KHR = 1000248000, + PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV = 1000249000, + COOPERATIVE_MATRIX_PROPERTIES_NV = 1000249001, + PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV = 1000249002, + PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV = 1000250000, + PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV = 1000250001, + FRAMEBUFFER_MIXED_SAMPLES_COMBINATION_NV = 1000250002, + PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT = 1000251000, + PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT = 1000252000, + PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT = 1000254000, + PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT = 1000254001, + PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT = 1000254002, + SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT = 1000255000, + SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT = 1000255002, + SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT = 1000255001, + HEADLESS_SURFACE_CREATE_INFO_EXT = 1000256000, + PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT = 1000260000, + PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT = 1000267000, + PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR = 1000269000, + PIPELINE_INFO_KHR = 1000269001, + PIPELINE_EXECUTABLE_PROPERTIES_KHR = 1000269002, + PIPELINE_EXECUTABLE_INFO_KHR = 1000269003, + PIPELINE_EXECUTABLE_STATISTIC_KHR = 1000269004, + PIPELINE_EXECUTABLE_INTERNAL_REPRESENTATION_KHR = 1000269005, + PHYSICAL_DEVICE_MAP_MEMORY_PLACED_FEATURES_EXT = 1000272000, + PHYSICAL_DEVICE_MAP_MEMORY_PLACED_PROPERTIES_EXT = 1000272001, + MEMORY_MAP_PLACED_INFO_EXT = 1000272002, + PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT = 1000273000, + PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV = 1000277000, + GRAPHICS_SHADER_GROUP_CREATE_INFO_NV = 1000277001, + GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV = 1000277002, + INDIRECT_COMMANDS_LAYOUT_TOKEN_NV = 1000277003, + INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NV = 1000277004, + GENERATED_COMMANDS_INFO_NV = 1000277005, + GENERATED_COMMANDS_MEMORY_REQUIREMENTS_INFO_NV = 1000277006, + PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV = 1000277007, + PHYSICAL_DEVICE_INHERITED_VIEWPORT_SCISSOR_FEATURES_NV = 1000278000, + COMMAND_BUFFER_INHERITANCE_VIEWPORT_SCISSOR_INFO_NV = 1000278001, + PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT = 1000281000, + COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM = 1000282000, + RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM = 1000282001, + PHYSICAL_DEVICE_DEPTH_BIAS_CONTROL_FEATURES_EXT = 1000283000, + DEPTH_BIAS_INFO_EXT = 1000283001, + DEPTH_BIAS_REPRESENTATION_INFO_EXT = 1000283002, + PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT = 1000284000, + DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT = 1000284001, + DEVICE_MEMORY_REPORT_CALLBACK_DATA_EXT = 1000284002, + SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT = 1000287000, + PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT = 1000287001, + PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT = 1000287002, + PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_3D_FEATURES_EXT = 1000288000, + PIPELINE_LIBRARY_CREATE_INFO_KHR = 1000290000, + PHYSICAL_DEVICE_PRESENT_BARRIER_FEATURES_NV = 1000292000, + SURFACE_CAPABILITIES_PRESENT_BARRIER_NV = 1000292001, + SWAPCHAIN_PRESENT_BARRIER_CREATE_INFO_NV = 1000292002, + PRESENT_ID_KHR = 1000294000, + PHYSICAL_DEVICE_PRESENT_ID_FEATURES_KHR = 1000294001, + VIDEO_ENCODE_INFO_KHR = 1000299000, + VIDEO_ENCODE_RATE_CONTROL_INFO_KHR = 1000299001, + VIDEO_ENCODE_RATE_CONTROL_LAYER_INFO_KHR = 1000299002, + VIDEO_ENCODE_CAPABILITIES_KHR = 1000299003, + VIDEO_ENCODE_USAGE_INFO_KHR = 1000299004, + QUERY_POOL_VIDEO_ENCODE_FEEDBACK_CREATE_INFO_KHR = 1000299005, + PHYSICAL_DEVICE_VIDEO_ENCODE_QUALITY_LEVEL_INFO_KHR = 1000299006, + VIDEO_ENCODE_QUALITY_LEVEL_PROPERTIES_KHR = 1000299007, + VIDEO_ENCODE_QUALITY_LEVEL_INFO_KHR = 1000299008, + VIDEO_ENCODE_SESSION_PARAMETERS_GET_INFO_KHR = 1000299009, + VIDEO_ENCODE_SESSION_PARAMETERS_FEEDBACK_INFO_KHR = 1000299010, + PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV = 1000300000, + DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV = 1000300001, + PERF_HINT_INFO_QCOM = 1000302000, + PHYSICAL_DEVICE_QUEUE_PERF_HINT_FEATURES_QCOM = 1000302001, + PHYSICAL_DEVICE_QUEUE_PERF_HINT_PROPERTIES_QCOM = 1000302002, + PHYSICAL_DEVICE_IMAGE_PROCESSING_3_FEATURES_QCOM = 1000303000, + PHYSICAL_DEVICE_SHADER_MULTIPLE_WAIT_QUEUES_FEATURES_QCOM = 1000304000, + PHYSICAL_DEVICE_SHADER_MULTIPLE_WAIT_QUEUES_PROPERTIES_QCOM = 1000304001, + PHYSICAL_DEVICE_SHADER_SPLIT_BARRIER_FEATURES_EXT = 1000305000, + PHYSICAL_DEVICE_SHADER_SPLIT_BARRIER_PROPERTIES_EXT = 1000305001, + CUDA_MODULE_CREATE_INFO_NV = 1000307000, + CUDA_FUNCTION_CREATE_INFO_NV = 1000307001, + CUDA_LAUNCH_INFO_NV = 1000307002, + PHYSICAL_DEVICE_CUDA_KERNEL_LAUNCH_FEATURES_NV = 1000307003, + PHYSICAL_DEVICE_CUDA_KERNEL_LAUNCH_PROPERTIES_NV = 1000307004, + PHYSICAL_DEVICE_TILE_SHADING_FEATURES_QCOM = 1000309000, + PHYSICAL_DEVICE_TILE_SHADING_PROPERTIES_QCOM = 1000309001, + RENDER_PASS_TILE_SHADING_CREATE_INFO_QCOM = 1000309002, + PER_TILE_BEGIN_INFO_QCOM = 1000309003, + PER_TILE_END_INFO_QCOM = 1000309004, + DISPATCH_TILE_INFO_QCOM = 1000309005, + QUERY_LOW_LATENCY_SUPPORT_NV = 1000310000, + EXPORT_METAL_OBJECT_CREATE_INFO_EXT = 1000311000, + EXPORT_METAL_OBJECTS_INFO_EXT = 1000311001, + EXPORT_METAL_DEVICE_INFO_EXT = 1000311002, + EXPORT_METAL_COMMAND_QUEUE_INFO_EXT = 1000311003, + EXPORT_METAL_BUFFER_INFO_EXT = 1000311004, + IMPORT_METAL_BUFFER_INFO_EXT = 1000311005, + EXPORT_METAL_TEXTURE_INFO_EXT = 1000311006, + IMPORT_METAL_TEXTURE_INFO_EXT = 1000311007, + EXPORT_METAL_IO_SURFACE_INFO_EXT = 1000311008, + IMPORT_METAL_IO_SURFACE_INFO_EXT = 1000311009, + EXPORT_METAL_SHARED_EVENT_INFO_EXT = 1000311010, + IMPORT_METAL_SHARED_EVENT_INFO_EXT = 1000311011, + PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_PROPERTIES_EXT = 1000316000, + PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_DENSITY_MAP_PROPERTIES_EXT = 1000316001, + PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT = 1000316002, + DESCRIPTOR_ADDRESS_INFO_EXT = 1000316003, + DESCRIPTOR_GET_INFO_EXT = 1000316004, + BUFFER_CAPTURE_DESCRIPTOR_DATA_INFO_EXT = 1000316005, + IMAGE_CAPTURE_DESCRIPTOR_DATA_INFO_EXT = 1000316006, + IMAGE_VIEW_CAPTURE_DESCRIPTOR_DATA_INFO_EXT = 1000316007, + SAMPLER_CAPTURE_DESCRIPTOR_DATA_INFO_EXT = 1000316008, + OPAQUE_CAPTURE_DESCRIPTOR_DATA_CREATE_INFO_EXT = 1000316010, + DESCRIPTOR_BUFFER_BINDING_INFO_EXT = 1000316011, + DESCRIPTOR_BUFFER_BINDING_PUSH_DESCRIPTOR_BUFFER_HANDLE_EXT = 1000316012, + ACCELERATION_STRUCTURE_CAPTURE_DESCRIPTOR_DATA_INFO_EXT = 1000316009, + DEVICE_MEMORY_COPY_KHR = 1000318000, + COPY_DEVICE_MEMORY_INFO_KHR = 1000318001, + DEVICE_MEMORY_IMAGE_COPY_KHR = 1000318002, + COPY_DEVICE_MEMORY_IMAGE_INFO_KHR = 1000318003, + MEMORY_RANGE_BARRIERS_INFO_KHR = 1000318004, + MEMORY_RANGE_BARRIER_KHR = 1000318005, + PHYSICAL_DEVICE_DEVICE_ADDRESS_COMMANDS_FEATURES_KHR = 1000318006, + BIND_INDEX_BUFFER_3_INFO_KHR = 1000318007, + BIND_VERTEX_BUFFER_3_INFO_KHR = 1000318008, + DRAW_INDIRECT_2_INFO_KHR = 1000318009, + DRAW_INDIRECT_COUNT_2_INFO_KHR = 1000318010, + DISPATCH_INDIRECT_2_INFO_KHR = 1000318011, + CONDITIONAL_RENDERING_BEGIN_INFO_2_EXT = 1000318012, + BIND_TRANSFORM_FEEDBACK_BUFFER_2_INFO_EXT = 1000318013, + MEMORY_MARKER_INFO_AMD = 1000318014, + ACCELERATION_STRUCTURE_CREATE_INFO_2_KHR = 1000318015, + PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT = 1000320000, + PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_PROPERTIES_EXT = 1000320001, + GRAPHICS_PIPELINE_LIBRARY_CREATE_INFO_EXT = 1000320002, + PHYSICAL_DEVICE_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_FEATURES_AMD = 1000321000, + PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR = 1000203000, + PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_PROPERTIES_KHR = 1000322000, + PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR = 1000323000, + PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV = 1000326000, + PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV = 1000326001, + PIPELINE_FRAGMENT_SHADING_RATE_ENUM_STATE_CREATE_INFO_NV = 1000326002, + ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV = 1000327000, + PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV = 1000327001, + ACCELERATION_STRUCTURE_MOTION_INFO_NV = 1000327002, + PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT = 1000328000, + PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_EXT = 1000328001, + PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT = 1000330000, + PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT = 1000332000, + PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT = 1000332001, + COPY_COMMAND_TRANSFORM_INFO_QCOM = 1000333000, + PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR = 1000336000, + PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_FEATURES_EXT = 1000338000, + IMAGE_COMPRESSION_CONTROL_EXT = 1000338001, + IMAGE_COMPRESSION_PROPERTIES_EXT = 1000338004, + PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT = 1000339000, + PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT = 1000340000, + PHYSICAL_DEVICE_FAULT_FEATURES_EXT = 1000341000, + DEVICE_FAULT_COUNTS_EXT = 1000341001, + DEVICE_FAULT_INFO_EXT = 1000341002, + PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT = 1000344000, + DIRECTFB_SURFACE_CREATE_INFO_EXT = 1000346000, + PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT = 1000352000, + VERTEX_INPUT_BINDING_DESCRIPTION_2_EXT = 1000352001, + VERTEX_INPUT_ATTRIBUTE_DESCRIPTION_2_EXT = 1000352002, + PHYSICAL_DEVICE_DRM_PROPERTIES_EXT = 1000353000, + PHYSICAL_DEVICE_ADDRESS_BINDING_REPORT_FEATURES_EXT = 1000354000, + DEVICE_ADDRESS_BINDING_CALLBACK_DATA_EXT = 1000354001, + PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT = 1000355000, + PIPELINE_VIEWPORT_DEPTH_CLIP_CONTROL_CREATE_INFO_EXT = 1000355001, + PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT = 1000356000, + IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA = 1000364000, + MEMORY_ZIRCON_HANDLE_PROPERTIES_FUCHSIA = 1000364001, + MEMORY_GET_ZIRCON_HANDLE_INFO_FUCHSIA = 1000364002, + IMPORT_SEMAPHORE_ZIRCON_HANDLE_INFO_FUCHSIA = 1000365000, + SEMAPHORE_GET_ZIRCON_HANDLE_INFO_FUCHSIA = 1000365001, + BUFFER_COLLECTION_CREATE_INFO_FUCHSIA = 1000366000, + IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA = 1000366001, + BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA = 1000366002, + BUFFER_COLLECTION_PROPERTIES_FUCHSIA = 1000366003, + BUFFER_CONSTRAINTS_INFO_FUCHSIA = 1000366004, + BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA = 1000366005, + IMAGE_CONSTRAINTS_INFO_FUCHSIA = 1000366006, + IMAGE_FORMAT_CONSTRAINTS_INFO_FUCHSIA = 1000366007, + SYSMEM_COLOR_SPACE_FUCHSIA = 1000366008, + BUFFER_COLLECTION_CONSTRAINTS_INFO_FUCHSIA = 1000366009, + SUBPASS_SHADING_PIPELINE_CREATE_INFO_HUAWEI = 1000369000, + PHYSICAL_DEVICE_SUBPASS_SHADING_FEATURES_HUAWEI = 1000369001, + PHYSICAL_DEVICE_SUBPASS_SHADING_PROPERTIES_HUAWEI = 1000369002, + PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI = 1000370000, + MEMORY_GET_REMOTE_ADDRESS_INFO_NV = 1000371000, + PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV = 1000371001, + PIPELINE_PROPERTIES_IDENTIFIER_EXT = 1000372000, + PHYSICAL_DEVICE_PIPELINE_PROPERTIES_FEATURES_EXT = 1000372001, + PHYSICAL_DEVICE_FRAME_BOUNDARY_FEATURES_EXT = 1000375000, + FRAME_BOUNDARY_EXT = 1000375001, + PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT = 1000376000, + SUBPASS_RESOLVE_PERFORMANCE_QUERY_EXT = 1000376001, + MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_INFO_EXT = 1000376002, + PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT = 1000377000, + SCREEN_SURFACE_CREATE_INFO_QNX = 1000378000, + PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT = 1000381000, + PIPELINE_COLOR_WRITE_CREATE_INFO_EXT = 1000381001, + PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT = 1000382000, + PHYSICAL_DEVICE_RAY_TRACING_MAINTENANCE_1_FEATURES_KHR = 1000386000, + PHYSICAL_DEVICE_SHADER_UNTYPED_POINTERS_FEATURES_KHR = 1000387000, + PHYSICAL_DEVICE_VIDEO_ENCODE_RGB_CONVERSION_FEATURES_VALVE = 1000390000, + VIDEO_ENCODE_RGB_CONVERSION_CAPABILITIES_VALVE = 1000390001, + VIDEO_ENCODE_PROFILE_RGB_CONVERSION_INFO_VALVE = 1000390002, + VIDEO_ENCODE_SESSION_RGB_CONVERSION_CREATE_INFO_VALVE = 1000390003, + PHYSICAL_DEVICE_IMAGE_VIEW_MIN_LOD_FEATURES_EXT = 1000391000, + IMAGE_VIEW_MIN_LOD_CREATE_INFO_EXT = 1000391001, + PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT = 1000392000, + PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT = 1000392001, + PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT = 1000393000, + PHYSICAL_DEVICE_SHADER_TILE_IMAGE_FEATURES_EXT = 1000395000, + PHYSICAL_DEVICE_SHADER_TILE_IMAGE_PROPERTIES_EXT = 1000395001, + MICROMAP_BUILD_INFO_EXT = 1000396000, + MICROMAP_VERSION_INFO_EXT = 1000396001, + COPY_MICROMAP_INFO_EXT = 1000396002, + COPY_MICROMAP_TO_MEMORY_INFO_EXT = 1000396003, + COPY_MEMORY_TO_MICROMAP_INFO_EXT = 1000396004, + PHYSICAL_DEVICE_OPACITY_MICROMAP_FEATURES_EXT = 1000396005, + PHYSICAL_DEVICE_OPACITY_MICROMAP_PROPERTIES_EXT = 1000396006, + MICROMAP_CREATE_INFO_EXT = 1000396007, + MICROMAP_BUILD_SIZES_INFO_EXT = 1000396008, + ACCELERATION_STRUCTURE_TRIANGLES_OPACITY_MICROMAP_EXT = 1000396009, + PHYSICAL_DEVICE_DISPLACEMENT_MICROMAP_FEATURES_NV = 1000397000, + PHYSICAL_DEVICE_DISPLACEMENT_MICROMAP_PROPERTIES_NV = 1000397001, + ACCELERATION_STRUCTURE_TRIANGLES_DISPLACEMENT_MICROMAP_NV = 1000397002, + PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_FEATURES_HUAWEI = 1000404000, + PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_PROPERTIES_HUAWEI = 1000404001, + PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_VRS_FEATURES_HUAWEI = 1000404002, + PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT = 1000411000, + SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT = 1000411001, + PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT = 1000412000, + PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_ARM = 1000415000, + DEVICE_QUEUE_SHADER_CORE_CONTROL_CREATE_INFO_ARM = 1000417000, + PHYSICAL_DEVICE_SCHEDULING_CONTROLS_FEATURES_ARM = 1000417001, + PHYSICAL_DEVICE_SCHEDULING_CONTROLS_PROPERTIES_ARM = 1000417002, + DISPATCH_PARAMETERS_ARM = 1000417003, + PHYSICAL_DEVICE_SCHEDULING_CONTROLS_DISPATCH_PARAMETERS_PROPERTIES_ARM = 1000417004, + PHYSICAL_DEVICE_IMAGE_SLICED_VIEW_OF_3D_FEATURES_EXT = 1000418000, + IMAGE_VIEW_SLICED_CREATE_INFO_EXT = 1000418001, + PHYSICAL_DEVICE_DESCRIPTOR_SET_HOST_MAPPING_FEATURES_VALVE = 1000420000, + DESCRIPTOR_SET_BINDING_REFERENCE_VALVE = 1000420001, + DESCRIPTOR_SET_LAYOUT_HOST_MAPPING_INFO_VALVE = 1000420002, + PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT = 1000422000, + PHYSICAL_DEVICE_RENDER_PASS_STRIPED_FEATURES_ARM = 1000424000, + PHYSICAL_DEVICE_RENDER_PASS_STRIPED_PROPERTIES_ARM = 1000424001, + RENDER_PASS_STRIPE_BEGIN_INFO_ARM = 1000424002, + RENDER_PASS_STRIPE_INFO_ARM = 1000424003, + RENDER_PASS_STRIPE_SUBMIT_INFO_ARM = 1000424004, + PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_FEATURES_NV = 1000426000, + PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_COMPUTE_FEATURES_NV = 1000428000, + COMPUTE_PIPELINE_INDIRECT_BUFFER_INFO_NV = 1000428001, + PIPELINE_INDIRECT_DEVICE_ADDRESS_INFO_NV = 1000428002, + PHYSICAL_DEVICE_RAY_TRACING_LINEAR_SWEPT_SPHERES_FEATURES_NV = 1000429008, + ACCELERATION_STRUCTURE_GEOMETRY_LINEAR_SWEPT_SPHERES_DATA_NV = 1000429009, + ACCELERATION_STRUCTURE_GEOMETRY_SPHERES_DATA_NV = 1000429010, + PHYSICAL_DEVICE_LINEAR_COLOR_ATTACHMENT_FEATURES_NV = 1000430000, + PHYSICAL_DEVICE_SHADER_MAXIMAL_RECONVERGENCE_FEATURES_KHR = 1000434000, + PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_FEATURES_EXT = 1000437000, + PHYSICAL_DEVICE_IMAGE_PROCESSING_FEATURES_QCOM = 1000440000, + PHYSICAL_DEVICE_IMAGE_PROCESSING_PROPERTIES_QCOM = 1000440001, + IMAGE_VIEW_SAMPLE_WEIGHT_CREATE_INFO_QCOM = 1000440002, + PHYSICAL_DEVICE_NESTED_COMMAND_BUFFER_FEATURES_EXT = 1000451000, + PHYSICAL_DEVICE_NESTED_COMMAND_BUFFER_PROPERTIES_EXT = 1000451001, + NATIVE_BUFFER_USAGE_OHOS = 1000452000, + NATIVE_BUFFER_PROPERTIES_OHOS = 1000452001, + NATIVE_BUFFER_FORMAT_PROPERTIES_OHOS = 1000452002, + IMPORT_NATIVE_BUFFER_INFO_OHOS = 1000452003, + MEMORY_GET_NATIVE_BUFFER_INFO_OHOS = 1000452004, + EXTERNAL_FORMAT_OHOS = 1000452005, + EXTERNAL_MEMORY_ACQUIRE_UNMODIFIED_EXT = 1000453000, + PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT = 1000455000, + PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_PROPERTIES_EXT = 1000455001, + PHYSICAL_DEVICE_SUBPASS_MERGE_FEEDBACK_FEATURES_EXT = 1000458000, + RENDER_PASS_CREATION_CONTROL_EXT = 1000458001, + RENDER_PASS_CREATION_FEEDBACK_CREATE_INFO_EXT = 1000458002, + RENDER_PASS_SUBPASS_FEEDBACK_CREATE_INFO_EXT = 1000458003, + DIRECT_DRIVER_LOADING_INFO_LUNARG = 1000459000, + DIRECT_DRIVER_LOADING_LIST_LUNARG = 1000459001, + TENSOR_CREATE_INFO_ARM = 1000460000, + TENSOR_VIEW_CREATE_INFO_ARM = 1000460001, + BIND_TENSOR_MEMORY_INFO_ARM = 1000460002, + WRITE_DESCRIPTOR_SET_TENSOR_ARM = 1000460003, + PHYSICAL_DEVICE_TENSOR_PROPERTIES_ARM = 1000460004, + TENSOR_FORMAT_PROPERTIES_ARM = 1000460005, + TENSOR_DESCRIPTION_ARM = 1000460006, + TENSOR_MEMORY_REQUIREMENTS_INFO_ARM = 1000460007, + TENSOR_MEMORY_BARRIER_ARM = 1000460008, + PHYSICAL_DEVICE_TENSOR_FEATURES_ARM = 1000460009, + DEVICE_TENSOR_MEMORY_REQUIREMENTS_ARM = 1000460010, + COPY_TENSOR_INFO_ARM = 1000460011, + TENSOR_COPY_ARM = 1000460012, + TENSOR_DEPENDENCY_INFO_ARM = 1000460013, + MEMORY_DEDICATED_ALLOCATE_INFO_TENSOR_ARM = 1000460014, + PHYSICAL_DEVICE_EXTERNAL_TENSOR_INFO_ARM = 1000460015, + EXTERNAL_TENSOR_PROPERTIES_ARM = 1000460016, + EXTERNAL_MEMORY_TENSOR_CREATE_INFO_ARM = 1000460017, + PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_TENSOR_FEATURES_ARM = 1000460018, + PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_TENSOR_PROPERTIES_ARM = 1000460019, + DESCRIPTOR_GET_TENSOR_INFO_ARM = 1000460020, + TENSOR_CAPTURE_DESCRIPTOR_DATA_INFO_ARM = 1000460021, + TENSOR_VIEW_CAPTURE_DESCRIPTOR_DATA_INFO_ARM = 1000460022, + FRAME_BOUNDARY_TENSORS_ARM = 1000460023, + PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_FEATURES_EXT = 1000462000, + PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_PROPERTIES_EXT = 1000462001, + PIPELINE_SHADER_STAGE_MODULE_IDENTIFIER_CREATE_INFO_EXT = 1000462002, + SHADER_MODULE_IDENTIFIER_EXT = 1000462003, + PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT = 1000342000, + PHYSICAL_DEVICE_OPTICAL_FLOW_FEATURES_NV = 1000464000, + PHYSICAL_DEVICE_OPTICAL_FLOW_PROPERTIES_NV = 1000464001, + OPTICAL_FLOW_IMAGE_FORMAT_INFO_NV = 1000464002, + OPTICAL_FLOW_IMAGE_FORMAT_PROPERTIES_NV = 1000464003, + OPTICAL_FLOW_SESSION_CREATE_INFO_NV = 1000464004, + OPTICAL_FLOW_EXECUTE_INFO_NV = 1000464005, + OPTICAL_FLOW_SESSION_CREATE_PRIVATE_DATA_INFO_NV = 1000464010, + PHYSICAL_DEVICE_LEGACY_DITHERING_FEATURES_EXT = 1000465000, + PHYSICAL_DEVICE_EXTERNAL_FORMAT_RESOLVE_FEATURES_ANDROID = 1000468000, + PHYSICAL_DEVICE_EXTERNAL_FORMAT_RESOLVE_PROPERTIES_ANDROID = 1000468001, + ANDROID_HARDWARE_BUFFER_FORMAT_RESOLVE_PROPERTIES_ANDROID = 1000468002, + PHYSICAL_DEVICE_ANTI_LAG_FEATURES_AMD = 1000476000, + ANTI_LAG_DATA_AMD = 1000476001, + ANTI_LAG_PRESENTATION_INFO_AMD = 1000476002, + PHYSICAL_DEVICE_DENSE_GEOMETRY_FORMAT_FEATURES_AMDX = 1000478000, + ACCELERATION_STRUCTURE_DENSE_GEOMETRY_FORMAT_TRIANGLES_DATA_AMDX = 1000478001, + SURFACE_CAPABILITIES_PRESENT_ID_2_KHR = 1000479000, + PRESENT_ID_2_KHR = 1000479001, + PHYSICAL_DEVICE_PRESENT_ID_2_FEATURES_KHR = 1000479002, + SURFACE_CAPABILITIES_PRESENT_WAIT_2_KHR = 1000480000, + PHYSICAL_DEVICE_PRESENT_WAIT_2_FEATURES_KHR = 1000480001, + PRESENT_WAIT_2_INFO_KHR = 1000480002, + PHYSICAL_DEVICE_RAY_TRACING_POSITION_FETCH_FEATURES_KHR = 1000481000, + PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT = 1000482000, + PHYSICAL_DEVICE_SHADER_OBJECT_PROPERTIES_EXT = 1000482001, + SHADER_CREATE_INFO_EXT = 1000482002, + PHYSICAL_DEVICE_PIPELINE_BINARY_FEATURES_KHR = 1000483000, + PIPELINE_BINARY_CREATE_INFO_KHR = 1000483001, + PIPELINE_BINARY_INFO_KHR = 1000483002, + PIPELINE_BINARY_KEY_KHR = 1000483003, + PHYSICAL_DEVICE_PIPELINE_BINARY_PROPERTIES_KHR = 1000483004, + RELEASE_CAPTURED_PIPELINE_DATA_INFO_KHR = 1000483005, + PIPELINE_BINARY_DATA_INFO_KHR = 1000483006, + PIPELINE_CREATE_INFO_KHR = 1000483007, + DEVICE_PIPELINE_BINARY_INTERNAL_CACHE_CONTROL_KHR = 1000483008, + PIPELINE_BINARY_HANDLES_INFO_KHR = 1000483009, + PHYSICAL_DEVICE_TILE_PROPERTIES_FEATURES_QCOM = 1000484000, + TILE_PROPERTIES_QCOM = 1000484001, + PHYSICAL_DEVICE_AMIGO_PROFILING_FEATURES_SEC = 1000485000, + AMIGO_PROFILING_SUBMIT_INFO_SEC = 1000485001, + SURFACE_PRESENT_MODE_KHR = 1000274000, + SURFACE_PRESENT_SCALING_CAPABILITIES_KHR = 1000274001, + SURFACE_PRESENT_MODE_COMPATIBILITY_KHR = 1000274002, + PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_KHR = 1000275000, + SWAPCHAIN_PRESENT_FENCE_INFO_KHR = 1000275001, + SWAPCHAIN_PRESENT_MODES_CREATE_INFO_KHR = 1000275002, + SWAPCHAIN_PRESENT_MODE_INFO_KHR = 1000275003, + SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_KHR = 1000275004, + RELEASE_SWAPCHAIN_IMAGES_INFO_KHR = 1000275005, + PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_VIEWPORTS_FEATURES_QCOM = 1000488000, + PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV = 1000490000, + PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_NV = 1000490001, + PHYSICAL_DEVICE_COOPERATIVE_VECTOR_FEATURES_NV = 1000491000, + PHYSICAL_DEVICE_COOPERATIVE_VECTOR_PROPERTIES_NV = 1000491001, + COOPERATIVE_VECTOR_PROPERTIES_NV = 1000491002, + CONVERT_COOPERATIVE_VECTOR_MATRIX_INFO_NV = 1000491004, + PHYSICAL_DEVICE_EXTENDED_SPARSE_ADDRESS_SPACE_FEATURES_NV = 1000492000, + PHYSICAL_DEVICE_EXTENDED_SPARSE_ADDRESS_SPACE_PROPERTIES_NV = 1000492001, + PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT = 1000351000, + MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_EXT = 1000351002, + PHYSICAL_DEVICE_LEGACY_VERTEX_ATTRIBUTES_FEATURES_EXT = 1000495000, + PHYSICAL_DEVICE_LEGACY_VERTEX_ATTRIBUTES_PROPERTIES_EXT = 1000495001, + LAYER_SETTINGS_CREATE_INFO_EXT = 1000496000, + PHYSICAL_DEVICE_SHADER_CORE_BUILTINS_FEATURES_ARM = 1000497000, + PHYSICAL_DEVICE_SHADER_CORE_BUILTINS_PROPERTIES_ARM = 1000497001, + PHYSICAL_DEVICE_PIPELINE_LIBRARY_GROUP_HANDLES_FEATURES_EXT = 1000498000, + PHYSICAL_DEVICE_DYNAMIC_RENDERING_UNUSED_ATTACHMENTS_FEATURES_EXT = 1000499000, + PHYSICAL_DEVICE_INTERNALLY_SYNCHRONIZED_QUEUES_FEATURES_KHR = 1000504000, + LATENCY_SLEEP_MODE_INFO_NV = 1000505000, + LATENCY_SLEEP_INFO_NV = 1000505001, + SET_LATENCY_MARKER_INFO_NV = 1000505002, + GET_LATENCY_MARKER_INFO_NV = 1000505003, + LATENCY_TIMINGS_FRAME_REPORT_NV = 1000505004, + LATENCY_SUBMISSION_PRESENT_ID_NV = 1000505005, + OUT_OF_BAND_QUEUE_TYPE_INFO_NV = 1000505006, + SWAPCHAIN_LATENCY_CREATE_INFO_NV = 1000505007, + LATENCY_SURFACE_CAPABILITIES_NV = 1000505008, + PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_KHR = 1000506000, + COOPERATIVE_MATRIX_PROPERTIES_KHR = 1000506001, + PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_KHR = 1000506002, + DATA_GRAPH_PIPELINE_CREATE_INFO_ARM = 1000507000, + DATA_GRAPH_PIPELINE_SESSION_CREATE_INFO_ARM = 1000507001, + DATA_GRAPH_PIPELINE_RESOURCE_INFO_ARM = 1000507002, + DATA_GRAPH_PIPELINE_CONSTANT_ARM = 1000507003, + DATA_GRAPH_PIPELINE_SESSION_MEMORY_REQUIREMENTS_INFO_ARM = 1000507004, + BIND_DATA_GRAPH_PIPELINE_SESSION_MEMORY_INFO_ARM = 1000507005, + PHYSICAL_DEVICE_DATA_GRAPH_FEATURES_ARM = 1000507006, + DATA_GRAPH_PIPELINE_SHADER_MODULE_CREATE_INFO_ARM = 1000507007, + DATA_GRAPH_PIPELINE_PROPERTY_QUERY_RESULT_ARM = 1000507008, + DATA_GRAPH_PIPELINE_INFO_ARM = 1000507009, + DATA_GRAPH_PIPELINE_COMPILER_CONTROL_CREATE_INFO_ARM = 1000507010, + DATA_GRAPH_PIPELINE_SESSION_BIND_POINT_REQUIREMENTS_INFO_ARM = 1000507011, + DATA_GRAPH_PIPELINE_SESSION_BIND_POINT_REQUIREMENT_ARM = 1000507012, + DATA_GRAPH_PIPELINE_IDENTIFIER_CREATE_INFO_ARM = 1000507013, + DATA_GRAPH_PIPELINE_DISPATCH_INFO_ARM = 1000507014, + DATA_GRAPH_PROCESSING_ENGINE_CREATE_INFO_ARM = 1000507016, + QUEUE_FAMILY_DATA_GRAPH_PROCESSING_ENGINE_PROPERTIES_ARM = 1000507017, + QUEUE_FAMILY_DATA_GRAPH_PROPERTIES_ARM = 1000507018, + PHYSICAL_DEVICE_QUEUE_FAMILY_DATA_GRAPH_PROCESSING_ENGINE_INFO_ARM = 1000507019, + DATA_GRAPH_PIPELINE_CONSTANT_TENSOR_SEMI_STRUCTURED_SPARSITY_INFO_ARM = 1000507015, + QUEUE_FAMILY_DATA_GRAPH_TOSA_PROPERTIES_ARM = 1000508000, + PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_RENDER_AREAS_FEATURES_QCOM = 1000510000, + MULTIVIEW_PER_VIEW_RENDER_AREAS_RENDER_PASS_BEGIN_INFO_QCOM = 1000510001, + PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_KHR = 1000201000, + PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_PROPERTIES_KHR = 1000511000, + VIDEO_DECODE_AV1_CAPABILITIES_KHR = 1000512000, + VIDEO_DECODE_AV1_PICTURE_INFO_KHR = 1000512001, + VIDEO_DECODE_AV1_PROFILE_INFO_KHR = 1000512003, + VIDEO_DECODE_AV1_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000512004, + VIDEO_DECODE_AV1_DPB_SLOT_INFO_KHR = 1000512005, + VIDEO_ENCODE_AV1_CAPABILITIES_KHR = 1000513000, + VIDEO_ENCODE_AV1_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000513001, + VIDEO_ENCODE_AV1_PICTURE_INFO_KHR = 1000513002, + VIDEO_ENCODE_AV1_DPB_SLOT_INFO_KHR = 1000513003, + PHYSICAL_DEVICE_VIDEO_ENCODE_AV1_FEATURES_KHR = 1000513004, + VIDEO_ENCODE_AV1_PROFILE_INFO_KHR = 1000513005, + VIDEO_ENCODE_AV1_RATE_CONTROL_INFO_KHR = 1000513006, + VIDEO_ENCODE_AV1_RATE_CONTROL_LAYER_INFO_KHR = 1000513007, + VIDEO_ENCODE_AV1_QUALITY_LEVEL_PROPERTIES_KHR = 1000513008, + VIDEO_ENCODE_AV1_SESSION_CREATE_INFO_KHR = 1000513009, + VIDEO_ENCODE_AV1_GOP_REMAINING_FRAME_INFO_KHR = 1000513010, + PHYSICAL_DEVICE_VIDEO_DECODE_VP9_FEATURES_KHR = 1000514000, + VIDEO_DECODE_VP9_CAPABILITIES_KHR = 1000514001, + VIDEO_DECODE_VP9_PICTURE_INFO_KHR = 1000514002, + VIDEO_DECODE_VP9_PROFILE_INFO_KHR = 1000514003, + PHYSICAL_DEVICE_VIDEO_MAINTENANCE_1_FEATURES_KHR = 1000515000, + VIDEO_INLINE_QUERY_INFO_KHR = 1000515001, + PHYSICAL_DEVICE_PER_STAGE_DESCRIPTOR_SET_FEATURES_NV = 1000516000, + PHYSICAL_DEVICE_IMAGE_PROCESSING_2_FEATURES_QCOM = 1000518000, + PHYSICAL_DEVICE_IMAGE_PROCESSING_2_PROPERTIES_QCOM = 1000518001, + SAMPLER_BLOCK_MATCH_WINDOW_CREATE_INFO_QCOM = 1000518002, + SAMPLER_CUBIC_WEIGHTS_CREATE_INFO_QCOM = 1000519000, + PHYSICAL_DEVICE_CUBIC_WEIGHTS_FEATURES_QCOM = 1000519001, + BLIT_IMAGE_CUBIC_WEIGHTS_INFO_QCOM = 1000519002, + PHYSICAL_DEVICE_YCBCR_DEGAMMA_FEATURES_QCOM = 1000520000, + SAMPLER_YCBCR_CONVERSION_YCBCR_DEGAMMA_CREATE_INFO_QCOM = 1000520001, + PHYSICAL_DEVICE_CUBIC_CLAMP_FEATURES_QCOM = 1000521000, + PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_FEATURES_EXT = 1000524000, + PHYSICAL_DEVICE_UNIFIED_IMAGE_LAYOUTS_FEATURES_KHR = 1000527000, + ATTACHMENT_FEEDBACK_LOOP_INFO_EXT = 1000527001, + SCREEN_BUFFER_PROPERTIES_QNX = 1000529000, + SCREEN_BUFFER_FORMAT_PROPERTIES_QNX = 1000529001, + IMPORT_SCREEN_BUFFER_INFO_QNX = 1000529002, + EXTERNAL_FORMAT_QNX = 1000529003, + PHYSICAL_DEVICE_EXTERNAL_MEMORY_SCREEN_BUFFER_FEATURES_QNX = 1000529004, + PHYSICAL_DEVICE_LAYERED_DRIVER_PROPERTIES_MSFT = 1000530000, + CALIBRATED_TIMESTAMP_INFO_KHR = 1000184000, + SET_DESCRIPTOR_BUFFER_OFFSETS_INFO_EXT = 1000545007, + BIND_DESCRIPTOR_BUFFER_EMBEDDED_SAMPLERS_INFO_EXT = 1000545008, + PHYSICAL_DEVICE_DESCRIPTOR_POOL_OVERALLOCATION_FEATURES_NV = 1000546000, + PHYSICAL_DEVICE_TILE_MEMORY_HEAP_FEATURES_QCOM = 1000547000, + PHYSICAL_DEVICE_TILE_MEMORY_HEAP_PROPERTIES_QCOM = 1000547001, + TILE_MEMORY_REQUIREMENTS_QCOM = 1000547002, + TILE_MEMORY_BIND_INFO_QCOM = 1000547003, + TILE_MEMORY_SIZE_INFO_QCOM = 1000547004, + PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_FEATURES_KHR = 1000549000, + PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_PROPERTIES_KHR = 1000426001, + COPY_MEMORY_INDIRECT_INFO_KHR = 1000549002, + COPY_MEMORY_TO_IMAGE_INDIRECT_INFO_KHR = 1000549003, + PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_FEATURES_EXT = 1000427000, + PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_PROPERTIES_EXT = 1000427001, + DECOMPRESS_MEMORY_INFO_EXT = 1000550002, + DISPLAY_SURFACE_STEREO_CREATE_INFO_NV = 1000551000, + DISPLAY_MODE_STEREO_PROPERTIES_NV = 1000551001, + VIDEO_ENCODE_INTRA_REFRESH_CAPABILITIES_KHR = 1000552000, + VIDEO_ENCODE_SESSION_INTRA_REFRESH_CREATE_INFO_KHR = 1000552001, + VIDEO_ENCODE_INTRA_REFRESH_INFO_KHR = 1000552002, + VIDEO_REFERENCE_INTRA_REFRESH_INFO_KHR = 1000552003, + PHYSICAL_DEVICE_VIDEO_ENCODE_INTRA_REFRESH_FEATURES_KHR = 1000552004, + VIDEO_ENCODE_QUANTIZATION_MAP_CAPABILITIES_KHR = 1000553000, + VIDEO_FORMAT_QUANTIZATION_MAP_PROPERTIES_KHR = 1000553001, + VIDEO_ENCODE_QUANTIZATION_MAP_INFO_KHR = 1000553002, + VIDEO_ENCODE_QUANTIZATION_MAP_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000553005, + PHYSICAL_DEVICE_VIDEO_ENCODE_QUANTIZATION_MAP_FEATURES_KHR = 1000553009, + VIDEO_ENCODE_H264_QUANTIZATION_MAP_CAPABILITIES_KHR = 1000553003, + VIDEO_ENCODE_H265_QUANTIZATION_MAP_CAPABILITIES_KHR = 1000553004, + VIDEO_FORMAT_H265_QUANTIZATION_MAP_PROPERTIES_KHR = 1000553006, + VIDEO_ENCODE_AV1_QUANTIZATION_MAP_CAPABILITIES_KHR = 1000553007, + VIDEO_FORMAT_AV1_QUANTIZATION_MAP_PROPERTIES_KHR = 1000553008, + PHYSICAL_DEVICE_RAW_ACCESS_CHAINS_FEATURES_NV = 1000555000, + EXTERNAL_COMPUTE_QUEUE_DEVICE_CREATE_INFO_NV = 1000556000, + EXTERNAL_COMPUTE_QUEUE_CREATE_INFO_NV = 1000556001, + EXTERNAL_COMPUTE_QUEUE_DATA_PARAMS_NV = 1000556002, + PHYSICAL_DEVICE_EXTERNAL_COMPUTE_QUEUE_PROPERTIES_NV = 1000556003, + PHYSICAL_DEVICE_SHADER_RELAXED_EXTENDED_INSTRUCTION_FEATURES_KHR = 1000558000, + PHYSICAL_DEVICE_COMMAND_BUFFER_INHERITANCE_FEATURES_NV = 1000559000, + PHYSICAL_DEVICE_MAINTENANCE_7_FEATURES_KHR = 1000562000, + PHYSICAL_DEVICE_MAINTENANCE_7_PROPERTIES_KHR = 1000562001, + PHYSICAL_DEVICE_LAYERED_API_PROPERTIES_LIST_KHR = 1000562002, + PHYSICAL_DEVICE_LAYERED_API_PROPERTIES_KHR = 1000562003, + PHYSICAL_DEVICE_LAYERED_API_VULKAN_PROPERTIES_KHR = 1000562004, + PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT16_VECTOR_FEATURES_NV = 1000563000, + PHYSICAL_DEVICE_SHADER_REPLICATED_COMPOSITES_FEATURES_EXT = 1000564000, + PHYSICAL_DEVICE_SHADER_FLOAT8_FEATURES_EXT = 1000567000, + PHYSICAL_DEVICE_RAY_TRACING_VALIDATION_FEATURES_NV = 1000568000, + PHYSICAL_DEVICE_CLUSTER_ACCELERATION_STRUCTURE_FEATURES_NV = 1000569000, + PHYSICAL_DEVICE_CLUSTER_ACCELERATION_STRUCTURE_PROPERTIES_NV = 1000569001, + CLUSTER_ACCELERATION_STRUCTURE_CLUSTERS_BOTTOM_LEVEL_INPUT_NV = 1000569002, + CLUSTER_ACCELERATION_STRUCTURE_TRIANGLE_CLUSTER_INPUT_NV = 1000569003, + CLUSTER_ACCELERATION_STRUCTURE_MOVE_OBJECTS_INPUT_NV = 1000569004, + CLUSTER_ACCELERATION_STRUCTURE_INPUT_INFO_NV = 1000569005, + CLUSTER_ACCELERATION_STRUCTURE_COMMANDS_INFO_NV = 1000569006, + RAY_TRACING_PIPELINE_CLUSTER_ACCELERATION_STRUCTURE_CREATE_INFO_NV = 1000569007, + PHYSICAL_DEVICE_PARTITIONED_ACCELERATION_STRUCTURE_FEATURES_NV = 1000570000, + PHYSICAL_DEVICE_PARTITIONED_ACCELERATION_STRUCTURE_PROPERTIES_NV = 1000570001, + WRITE_DESCRIPTOR_SET_PARTITIONED_ACCELERATION_STRUCTURE_NV = 1000570002, + PARTITIONED_ACCELERATION_STRUCTURE_INSTANCES_INPUT_NV = 1000570003, + BUILD_PARTITIONED_ACCELERATION_STRUCTURE_INFO_NV = 1000570004, + PARTITIONED_ACCELERATION_STRUCTURE_FLAGS_NV = 1000570005, + PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_EXT = 1000572000, + PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_EXT = 1000572001, + GENERATED_COMMANDS_MEMORY_REQUIREMENTS_INFO_EXT = 1000572002, + INDIRECT_EXECUTION_SET_CREATE_INFO_EXT = 1000572003, + GENERATED_COMMANDS_INFO_EXT = 1000572004, + INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_EXT = 1000572006, + INDIRECT_COMMANDS_LAYOUT_TOKEN_EXT = 1000572007, + WRITE_INDIRECT_EXECUTION_SET_PIPELINE_EXT = 1000572008, + WRITE_INDIRECT_EXECUTION_SET_SHADER_EXT = 1000572009, + INDIRECT_EXECUTION_SET_PIPELINE_INFO_EXT = 1000572010, + INDIRECT_EXECUTION_SET_SHADER_INFO_EXT = 1000572011, + INDIRECT_EXECUTION_SET_SHADER_LAYOUT_INFO_EXT = 1000572012, + GENERATED_COMMANDS_PIPELINE_INFO_EXT = 1000572013, + GENERATED_COMMANDS_SHADER_INFO_EXT = 1000572014, + PHYSICAL_DEVICE_FAULT_FEATURES_KHR = 1000573000, + PHYSICAL_DEVICE_FAULT_PROPERTIES_KHR = 1000573001, + DEVICE_FAULT_INFO_KHR = 1000573002, + DEVICE_FAULT_DEBUG_INFO_KHR = 1000573003, + PHYSICAL_DEVICE_MAINTENANCE_8_FEATURES_KHR = 1000574000, + MEMORY_BARRIER_ACCESS_FLAGS_3_KHR = 1000574002, + PHYSICAL_DEVICE_IMAGE_ALIGNMENT_CONTROL_FEATURES_MESA = 1000575000, + PHYSICAL_DEVICE_IMAGE_ALIGNMENT_CONTROL_PROPERTIES_MESA = 1000575001, + IMAGE_ALIGNMENT_CONTROL_CREATE_INFO_MESA = 1000575002, + PHYSICAL_DEVICE_SHADER_FMA_FEATURES_KHR = 1000579000, + PUSH_CONSTANT_BANK_INFO_NV = 1000580000, + PHYSICAL_DEVICE_PUSH_CONSTANT_BANK_FEATURES_NV = 1000580001, + PHYSICAL_DEVICE_PUSH_CONSTANT_BANK_PROPERTIES_NV = 1000580002, + PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_EXT = 1000581000, + PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_EXT = 1000581001, + PHYSICAL_DEVICE_DEPTH_CLAMP_CONTROL_FEATURES_EXT = 1000582000, + PIPELINE_VIEWPORT_DEPTH_CLAMP_CONTROL_CREATE_INFO_EXT = 1000582001, + PHYSICAL_DEVICE_MAINTENANCE_9_FEATURES_KHR = 1000584000, + PHYSICAL_DEVICE_MAINTENANCE_9_PROPERTIES_KHR = 1000584001, + QUEUE_FAMILY_OWNERSHIP_TRANSFER_PROPERTIES_KHR = 1000584002, + PHYSICAL_DEVICE_VIDEO_MAINTENANCE_2_FEATURES_KHR = 1000586000, + VIDEO_DECODE_H264_INLINE_SESSION_PARAMETERS_INFO_KHR = 1000586001, + VIDEO_DECODE_H265_INLINE_SESSION_PARAMETERS_INFO_KHR = 1000586002, + VIDEO_DECODE_AV1_INLINE_SESSION_PARAMETERS_INFO_KHR = 1000586003, + SURFACE_CREATE_INFO_OHOS = 1000685000, + PHYSICAL_DEVICE_HDR_VIVID_FEATURES_HUAWEI = 1000590000, + HDR_VIVID_DYNAMIC_METADATA_HUAWEI = 1000590001, + PHYSICAL_DEVICE_COOPERATIVE_MATRIX_2_FEATURES_NV = 1000593000, + COOPERATIVE_MATRIX_FLEXIBLE_DIMENSIONS_PROPERTIES_NV = 1000593001, + PHYSICAL_DEVICE_COOPERATIVE_MATRIX_2_PROPERTIES_NV = 1000593002, + PHYSICAL_DEVICE_PIPELINE_OPACITY_MICROMAP_FEATURES_ARM = 1000596000, + PHYSICAL_DEVICE_VIDEO_ENCODE_FEEDBACK_2_FEATURES_KHR = 1000598000, + VIDEO_ENCODE_FEEDBACK_2_CAPABILITIES_KHR = 1000598001, + QUERY_POOL_VIDEO_ENCODE_PER_PARTITION_FEEDBACK_CREATE_INFO_KHR = 1000598002, + IMPORT_MEMORY_METAL_HANDLE_INFO_EXT = 1000602000, + MEMORY_METAL_HANDLE_PROPERTIES_EXT = 1000602001, + MEMORY_GET_METAL_HANDLE_INFO_EXT = 1000602002, + PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_KHR = 1000421000, + PHYSICAL_DEVICE_PERFORMANCE_COUNTERS_BY_REGION_FEATURES_ARM = 1000605000, + PHYSICAL_DEVICE_PERFORMANCE_COUNTERS_BY_REGION_PROPERTIES_ARM = 1000605001, + PERFORMANCE_COUNTER_ARM = 1000605002, + PERFORMANCE_COUNTER_DESCRIPTION_ARM = 1000605003, + RENDER_PASS_PERFORMANCE_COUNTERS_BY_REGION_BEGIN_INFO_ARM = 1000605004, + PHYSICAL_DEVICE_SHADER_INSTRUMENTATION_FEATURES_ARM = 1000607000, + PHYSICAL_DEVICE_SHADER_INSTRUMENTATION_PROPERTIES_ARM = 1000607001, + SHADER_INSTRUMENTATION_CREATE_INFO_ARM = 1000607002, + SHADER_INSTRUMENTATION_METRIC_DESCRIPTION_ARM = 1000607003, + PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_ROBUSTNESS_FEATURES_EXT = 1000608000, + PHYSICAL_DEVICE_FORMAT_PACK_FEATURES_ARM = 1000609000, + PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_LAYERED_FEATURES_VALVE = 1000611000, + PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_LAYERED_PROPERTIES_VALVE = 1000611001, + PIPELINE_FRAGMENT_DENSITY_MAP_LAYERED_CREATE_INFO_VALVE = 1000611002, + PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_KHR = 1000286000, + PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_KHR = 1000286001, + SET_PRESENT_CONFIG_NV = 1000613000, + PHYSICAL_DEVICE_PRESENT_METERING_FEATURES_NV = 1000613001, + PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SWAPCHAIN_FEATURES_EXT = 1000616000, + SWAPCHAIN_FLAGS_SURFACE_CAPABILITIES_EXT = 1000616001, + PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_FEATURES_EXT = 1000425000, + PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_PROPERTIES_EXT = 1000425001, + RENDER_PASS_FRAGMENT_DENSITY_MAP_OFFSET_END_INFO_EXT = 1000425002, + PHYSICAL_DEVICE_ZERO_INITIALIZE_DEVICE_MEMORY_FEATURES_EXT = 1000620000, + PHYSICAL_DEVICE_PRESENT_MODE_FIFO_LATEST_READY_FEATURES_KHR = 1000361000, + PHYSICAL_DEVICE_OPACITY_MICROMAP_FEATURES_KHR = 1000623000, + PHYSICAL_DEVICE_OPACITY_MICROMAP_PROPERTIES_KHR = 1000623001, + ACCELERATION_STRUCTURE_GEOMETRY_MICROMAP_DATA_KHR = 1000623002, + ACCELERATION_STRUCTURE_TRIANGLES_OPACITY_MICROMAP_KHR = 1000623003, + PHYSICAL_DEVICE_SHADER_64_BIT_INDEXING_FEATURES_EXT = 1000627000, + PHYSICAL_DEVICE_CUSTOM_RESOLVE_FEATURES_EXT = 1000628000, + BEGIN_CUSTOM_RESOLVE_INFO_EXT = 1000628001, + CUSTOM_RESOLVE_CREATE_INFO_EXT = 1000628002, + PHYSICAL_DEVICE_DATA_GRAPH_MODEL_FEATURES_QCOM = 1000629000, + DATA_GRAPH_PIPELINE_BUILTIN_MODEL_CREATE_INFO_QCOM = 1000629001, + PHYSICAL_DEVICE_MAINTENANCE_10_FEATURES_KHR = 1000630000, + PHYSICAL_DEVICE_MAINTENANCE_10_PROPERTIES_KHR = 1000630001, + RENDERING_ATTACHMENT_FLAGS_INFO_KHR = 1000630002, + RENDERING_END_INFO_KHR = 1000619003, + RESOLVE_IMAGE_MODE_INFO_KHR = 1000630004, + PHYSICAL_DEVICE_DATA_GRAPH_OPTICAL_FLOW_FEATURES_ARM = 1000631000, + QUEUE_FAMILY_DATA_GRAPH_OPTICAL_FLOW_PROPERTIES_ARM = 1000631001, + DATA_GRAPH_OPTICAL_FLOW_IMAGE_FORMAT_INFO_ARM = 1000631003, + DATA_GRAPH_OPTICAL_FLOW_IMAGE_FORMAT_PROPERTIES_ARM = 1000631004, + DATA_GRAPH_PIPELINE_OPTICAL_FLOW_DISPATCH_INFO_ARM = 1000631005, + DATA_GRAPH_PIPELINE_OPTICAL_FLOW_CREATE_INFO_ARM = 1000631002, + DATA_GRAPH_PIPELINE_RESOURCE_INFO_IMAGE_LAYOUT_ARM = 1000631006, + DATA_GRAPH_PIPELINE_SINGLE_NODE_CREATE_INFO_ARM = 1000631007, + DATA_GRAPH_PIPELINE_SINGLE_NODE_CONNECTION_ARM = 1000631008, + PHYSICAL_DEVICE_SHADER_LONG_VECTOR_FEATURES_EXT = 1000635000, + PHYSICAL_DEVICE_SHADER_LONG_VECTOR_PROPERTIES_EXT = 1000635001, + PHYSICAL_DEVICE_PIPELINE_CACHE_INCREMENTAL_MODE_FEATURES_SEC = 1000637000, + PHYSICAL_DEVICE_SHADER_UNIFORM_BUFFER_UNSIZED_ARRAY_FEATURES_EXT = 1000642000, + COMPUTE_OCCUPANCY_PRIORITY_PARAMETERS_NV = 1000645000, + PHYSICAL_DEVICE_COMPUTE_OCCUPANCY_PRIORITY_FEATURES_NV = 1000645001, + PHYSICAL_DEVICE_MAINTENANCE_11_FEATURES_KHR = 1000657000, + QUEUE_FAMILY_OPTIMAL_IMAGE_TRANSFER_GRANULARITY_PROPERTIES_KHR = 1000657001, + PHYSICAL_DEVICE_SHADER_SUBGROUP_PARTITIONED_FEATURES_EXT = 1000662000, + UBM_SURFACE_CREATE_INFO_SEC = 1000664000, + FORMAT_PROPERTIES_4_KHR = 1000668000, + IMAGE_CREATE_FLAGS_2_CREATE_INFO_KHR = 1000668001, + IMAGE_USAGE_FLAGS_2_CREATE_INFO_KHR = 1000668002, + IMAGE_VIEW_USAGE_2_CREATE_INFO_KHR = 1000668003, + PHYSICAL_DEVICE_EXTENDED_FLAGS_FEATURES_KHR = 1000668004, + IMAGE_STENCIL_USAGE_2_CREATE_INFO_KHR = 1000668005, + SHARED_PRESENT_SURFACE_CAPABILITIES_2_KHR = 1000668006, + PHYSICAL_DEVICE_SHADER_MIXED_FLOAT_DOT_PRODUCT_FEATURES_VALVE = 1000673000, + PHYSICAL_DEVICE_THROTTLE_HINT_FEATURES_SEC = 1000674000, + THROTTLE_HINT_SUBMIT_INFO_SEC = 1000674001, + DATA_GRAPH_PIPELINE_NEURAL_STATISTICS_CREATE_INFO_ARM = 1000676000, + DATA_GRAPH_PIPELINE_SESSION_NEURAL_STATISTICS_CREATE_INFO_ARM = 1000676001, + PHYSICAL_DEVICE_DATA_GRAPH_NEURAL_ACCELERATOR_STATISTICS_FEATURES_ARM = 1000676002, + PHYSICAL_DEVICE_PRIMITIVE_RESTART_INDEX_FEATURES_EXT = 1000678000, + PHYSICAL_DEVICE_COOPERATIVE_MATRIX_DECODE_VECTOR_FEATURES_NV = 1000689000, + PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES = PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES, + PHYSICAL_DEVICE_SHADER_DRAW_PARAMETER_FEATURES = PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES, + DEBUG_REPORT_CREATE_INFO_EXT = DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT, + RENDERING_INFO_KHR = RENDERING_INFO, + RENDERING_ATTACHMENT_INFO_KHR = RENDERING_ATTACHMENT_INFO, + PIPELINE_RENDERING_CREATE_INFO_KHR = PIPELINE_RENDERING_CREATE_INFO, + PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR = PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES, + COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR = COMMAND_BUFFER_INHERITANCE_RENDERING_INFO, + RENDER_PASS_MULTIVIEW_CREATE_INFO_KHR = RENDER_PASS_MULTIVIEW_CREATE_INFO, + PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHR = PHYSICAL_DEVICE_MULTIVIEW_FEATURES, + PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES_KHR = PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, + PHYSICAL_DEVICE_FEATURES_2_KHR = PHYSICAL_DEVICE_FEATURES_2, + PHYSICAL_DEVICE_PROPERTIES_2_KHR = PHYSICAL_DEVICE_PROPERTIES_2, + FORMAT_PROPERTIES_2_KHR = FORMAT_PROPERTIES_2, + IMAGE_FORMAT_PROPERTIES_2_KHR = IMAGE_FORMAT_PROPERTIES_2, + PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2_KHR = PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2, + QUEUE_FAMILY_PROPERTIES_2_KHR = QUEUE_FAMILY_PROPERTIES_2, + PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR = PHYSICAL_DEVICE_MEMORY_PROPERTIES_2, + SPARSE_IMAGE_FORMAT_PROPERTIES_2_KHR = SPARSE_IMAGE_FORMAT_PROPERTIES_2, + PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2_KHR = PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2, + MEMORY_ALLOCATE_FLAGS_INFO_KHR = MEMORY_ALLOCATE_FLAGS_INFO, + DEVICE_GROUP_RENDER_PASS_BEGIN_INFO_KHR = DEVICE_GROUP_RENDER_PASS_BEGIN_INFO, + DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO_KHR = DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO, + DEVICE_GROUP_SUBMIT_INFO_KHR = DEVICE_GROUP_SUBMIT_INFO, + DEVICE_GROUP_BIND_SPARSE_INFO_KHR = DEVICE_GROUP_BIND_SPARSE_INFO, + BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO_KHR = BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO, + BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO_KHR = BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO, + PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT = PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES, + PIPELINE_ROBUSTNESS_CREATE_INFO_EXT = PIPELINE_ROBUSTNESS_CREATE_INFO, + PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES_EXT = PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES, + PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES_EXT = PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES, + PHYSICAL_DEVICE_GROUP_PROPERTIES_KHR = PHYSICAL_DEVICE_GROUP_PROPERTIES, + DEVICE_GROUP_DEVICE_CREATE_INFO_KHR = DEVICE_GROUP_DEVICE_CREATE_INFO, + PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO_KHR = PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO, + EXTERNAL_IMAGE_FORMAT_PROPERTIES_KHR = EXTERNAL_IMAGE_FORMAT_PROPERTIES, + PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO_KHR = PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO, + EXTERNAL_BUFFER_PROPERTIES_KHR = EXTERNAL_BUFFER_PROPERTIES, + PHYSICAL_DEVICE_ID_PROPERTIES_KHR = PHYSICAL_DEVICE_ID_PROPERTIES, + EXTERNAL_MEMORY_BUFFER_CREATE_INFO_KHR = EXTERNAL_MEMORY_BUFFER_CREATE_INFO, + EXTERNAL_MEMORY_IMAGE_CREATE_INFO_KHR = EXTERNAL_MEMORY_IMAGE_CREATE_INFO, + EXPORT_MEMORY_ALLOCATE_INFO_KHR = EXPORT_MEMORY_ALLOCATE_INFO, + PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO_KHR = PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO, + EXTERNAL_SEMAPHORE_PROPERTIES_KHR = EXTERNAL_SEMAPHORE_PROPERTIES, + EXPORT_SEMAPHORE_CREATE_INFO_KHR = EXPORT_SEMAPHORE_CREATE_INFO, + PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR = PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES, + PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES_KHR = PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES, + PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR = PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES, + PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR = PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, + DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR = DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO, + SURFACE_CAPABILITIES2_EXT = SURFACE_CAPABILITIES_2_EXT, + PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR = PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES, + FRAMEBUFFER_ATTACHMENTS_CREATE_INFO_KHR = FRAMEBUFFER_ATTACHMENTS_CREATE_INFO, + FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR = FRAMEBUFFER_ATTACHMENT_IMAGE_INFO, + RENDER_PASS_ATTACHMENT_BEGIN_INFO_KHR = RENDER_PASS_ATTACHMENT_BEGIN_INFO, + ATTACHMENT_DESCRIPTION_2_KHR = ATTACHMENT_DESCRIPTION_2, + ATTACHMENT_REFERENCE_2_KHR = ATTACHMENT_REFERENCE_2, + SUBPASS_DESCRIPTION_2_KHR = SUBPASS_DESCRIPTION_2, + SUBPASS_DEPENDENCY_2_KHR = SUBPASS_DEPENDENCY_2, + RENDER_PASS_CREATE_INFO_2_KHR = RENDER_PASS_CREATE_INFO_2, + SUBPASS_BEGIN_INFO_KHR = SUBPASS_BEGIN_INFO, + SUBPASS_END_INFO_KHR = SUBPASS_END_INFO, + PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO_KHR = PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO, + EXTERNAL_FENCE_PROPERTIES_KHR = EXTERNAL_FENCE_PROPERTIES, + EXPORT_FENCE_CREATE_INFO_KHR = EXPORT_FENCE_CREATE_INFO, + PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES_KHR = PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES, + RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO_KHR = RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO, + IMAGE_VIEW_USAGE_CREATE_INFO_KHR = IMAGE_VIEW_USAGE_CREATE_INFO, + PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO_KHR = PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO, + PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES_KHR = PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES, + PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR = PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES_KHR, + MEMORY_DEDICATED_REQUIREMENTS_KHR = MEMORY_DEDICATED_REQUIREMENTS, + MEMORY_DEDICATED_ALLOCATE_INFO_KHR = MEMORY_DEDICATED_ALLOCATE_INFO, + PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT = PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES, + SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT = SAMPLER_REDUCTION_MODE_CREATE_INFO, + PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT = PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES, + PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT = PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES, + WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT = WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK, + DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT = DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO, + BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR = BUFFER_MEMORY_REQUIREMENTS_INFO_2, + IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR = IMAGE_MEMORY_REQUIREMENTS_INFO_2, + IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2_KHR = IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2, + MEMORY_REQUIREMENTS_2_KHR = MEMORY_REQUIREMENTS_2, + SPARSE_IMAGE_MEMORY_REQUIREMENTS_2_KHR = SPARSE_IMAGE_MEMORY_REQUIREMENTS_2, + IMAGE_FORMAT_LIST_CREATE_INFO_KHR = IMAGE_FORMAT_LIST_CREATE_INFO, + ATTACHMENT_SAMPLE_COUNT_INFO_NV = ATTACHMENT_SAMPLE_COUNT_INFO_AMD, + SAMPLER_YCBCR_CONVERSION_CREATE_INFO_KHR = SAMPLER_YCBCR_CONVERSION_CREATE_INFO, + SAMPLER_YCBCR_CONVERSION_INFO_KHR = SAMPLER_YCBCR_CONVERSION_INFO, + BIND_IMAGE_PLANE_MEMORY_INFO_KHR = BIND_IMAGE_PLANE_MEMORY_INFO, + IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO_KHR = IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO, + PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES_KHR = PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, + SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES_KHR = SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES, + BIND_BUFFER_MEMORY_INFO_KHR = BIND_BUFFER_MEMORY_INFO, + BIND_IMAGE_MEMORY_INFO_KHR = BIND_IMAGE_MEMORY_INFO, + DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT = DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO, + PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT = PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES, + PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT = PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES, + DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT = DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO, + DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT = DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT, + PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES_KHR = PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES, + DESCRIPTOR_SET_LAYOUT_SUPPORT_KHR = DESCRIPTOR_SET_LAYOUT_SUPPORT, + DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT = DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO, + PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES_KHR = PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES, + PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR = PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES, + PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR = PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES, + CALIBRATED_TIMESTAMP_INFO_EXT = CALIBRATED_TIMESTAMP_INFO_KHR, + DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_KHR = DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO, + PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_KHR = PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES, + QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_KHR = QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES, + PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT = PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO, + PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT = PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES, + PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT = PIPELINE_CREATION_FEEDBACK_CREATE_INFO, + PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR = PHYSICAL_DEVICE_DRIVER_PROPERTIES, + PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR = PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES, + PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR = PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES, + SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE_KHR = SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE, + PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV = PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_KHR, + PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV = PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR, + PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR = PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES, + PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES_KHR = PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES, + SEMAPHORE_TYPE_CREATE_INFO_KHR = SEMAPHORE_TYPE_CREATE_INFO, + TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR = TIMELINE_SEMAPHORE_SUBMIT_INFO, + SEMAPHORE_WAIT_INFO_KHR = SEMAPHORE_WAIT_INFO, + SEMAPHORE_SIGNAL_INFO_KHR = SEMAPHORE_SIGNAL_INFO, + QUERY_POOL_CREATE_INFO_INTEL = QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL, + PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR = PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES, + PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES_KHR = PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES, + PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT = PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES, + PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT = PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES, + PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT = PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO, + PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT = PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES, + PHYSICAL_DEVICE_DYNAMIC_RENDERING_LOCAL_READ_FEATURES_KHR = PHYSICAL_DEVICE_DYNAMIC_RENDERING_LOCAL_READ_FEATURES, + RENDERING_ATTACHMENT_LOCATION_INFO_KHR = RENDERING_ATTACHMENT_LOCATION_INFO, + RENDERING_INPUT_ATTACHMENT_INDEX_INFO_KHR = RENDERING_INPUT_ATTACHMENT_INDEX_INFO, + PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES_KHR = PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES, + ATTACHMENT_REFERENCE_STENCIL_LAYOUT_KHR = ATTACHMENT_REFERENCE_STENCIL_LAYOUT, + ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT_KHR = ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT, + PHYSICAL_DEVICE_BUFFER_ADDRESS_FEATURES_EXT = PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT, + BUFFER_DEVICE_ADDRESS_INFO_EXT = BUFFER_DEVICE_ADDRESS_INFO, + PHYSICAL_DEVICE_TOOL_PROPERTIES_EXT = PHYSICAL_DEVICE_TOOL_PROPERTIES, + IMAGE_STENCIL_USAGE_CREATE_INFO_EXT = IMAGE_STENCIL_USAGE_CREATE_INFO, + PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR = PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES, + PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_KHR = PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES, + BUFFER_DEVICE_ADDRESS_INFO_KHR = BUFFER_DEVICE_ADDRESS_INFO, + BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO_KHR = BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO, + MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO_KHR = MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO, + DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO_KHR = DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO, + PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT = PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES, + PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT = PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO, + PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT = PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES, + PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT = PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES, + PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT = PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES, + PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES_EXT = PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES, + PHYSICAL_DEVICE_HOST_IMAGE_COPY_PROPERTIES_EXT = PHYSICAL_DEVICE_HOST_IMAGE_COPY_PROPERTIES, + MEMORY_TO_IMAGE_COPY_EXT = MEMORY_TO_IMAGE_COPY, + IMAGE_TO_MEMORY_COPY_EXT = IMAGE_TO_MEMORY_COPY, + COPY_IMAGE_TO_MEMORY_INFO_EXT = COPY_IMAGE_TO_MEMORY_INFO, + COPY_MEMORY_TO_IMAGE_INFO_EXT = COPY_MEMORY_TO_IMAGE_INFO, + HOST_IMAGE_LAYOUT_TRANSITION_INFO_EXT = HOST_IMAGE_LAYOUT_TRANSITION_INFO, + COPY_IMAGE_TO_IMAGE_INFO_EXT = COPY_IMAGE_TO_IMAGE_INFO, + SUBRESOURCE_HOST_MEMCPY_SIZE_EXT = SUBRESOURCE_HOST_MEMCPY_SIZE, + HOST_IMAGE_COPY_DEVICE_PERFORMANCE_QUERY_EXT = HOST_IMAGE_COPY_DEVICE_PERFORMANCE_QUERY, + MEMORY_MAP_INFO_KHR = MEMORY_MAP_INFO, + MEMORY_UNMAP_INFO_KHR = MEMORY_UNMAP_INFO, + SURFACE_PRESENT_MODE_EXT = SURFACE_PRESENT_MODE_KHR, + SURFACE_PRESENT_SCALING_CAPABILITIES_EXT = SURFACE_PRESENT_SCALING_CAPABILITIES_KHR, + SURFACE_PRESENT_MODE_COMPATIBILITY_EXT = SURFACE_PRESENT_MODE_COMPATIBILITY_KHR, + PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT = PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_KHR, + SWAPCHAIN_PRESENT_FENCE_INFO_EXT = SWAPCHAIN_PRESENT_FENCE_INFO_KHR, + SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT = SWAPCHAIN_PRESENT_MODES_CREATE_INFO_KHR, + SWAPCHAIN_PRESENT_MODE_INFO_EXT = SWAPCHAIN_PRESENT_MODE_INFO_KHR, + SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT = SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_KHR, + RELEASE_SWAPCHAIN_IMAGES_INFO_EXT = RELEASE_SWAPCHAIN_IMAGES_INFO_KHR, + PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT = PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES, + PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR = PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES, + PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR = PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES, + PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT = PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES, + PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT = PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_KHR, + PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT = PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_KHR, + PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT = PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES, + DEVICE_PRIVATE_DATA_CREATE_INFO_EXT = DEVICE_PRIVATE_DATA_CREATE_INFO, + PRIVATE_DATA_SLOT_CREATE_INFO_EXT = PRIVATE_DATA_SLOT_CREATE_INFO, + PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT = PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES, + MEMORY_BARRIER_2_KHR = MEMORY_BARRIER_2, + BUFFER_MEMORY_BARRIER_2_KHR = BUFFER_MEMORY_BARRIER_2, + IMAGE_MEMORY_BARRIER_2_KHR = IMAGE_MEMORY_BARRIER_2, + DEPENDENCY_INFO_KHR = DEPENDENCY_INFO, + SUBMIT_INFO_2_KHR = SUBMIT_INFO_2, + SEMAPHORE_SUBMIT_INFO_KHR = SEMAPHORE_SUBMIT_INFO, + COMMAND_BUFFER_SUBMIT_INFO_KHR = COMMAND_BUFFER_SUBMIT_INFO, + PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES_KHR = PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES, + PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES_KHR = PHYSICAL_DEVICE_ZERO_INITIALIZE_WORKGROUP_MEMORY_FEATURES, + PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT = PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES, + COPY_BUFFER_INFO_2_KHR = COPY_BUFFER_INFO_2, + COPY_IMAGE_INFO_2_KHR = COPY_IMAGE_INFO_2, + COPY_BUFFER_TO_IMAGE_INFO_2_KHR = COPY_BUFFER_TO_IMAGE_INFO_2, + COPY_IMAGE_TO_BUFFER_INFO_2_KHR = COPY_IMAGE_TO_BUFFER_INFO_2, + BLIT_IMAGE_INFO_2_KHR = BLIT_IMAGE_INFO_2, + RESOLVE_IMAGE_INFO_2_KHR = RESOLVE_IMAGE_INFO_2, + BUFFER_COPY_2_KHR = BUFFER_COPY_2, + IMAGE_COPY_2_KHR = IMAGE_COPY_2, + IMAGE_BLIT_2_KHR = IMAGE_BLIT_2, + BUFFER_IMAGE_COPY_2_KHR = BUFFER_IMAGE_COPY_2, + IMAGE_RESOLVE_2_KHR = IMAGE_RESOLVE_2, + SUBRESOURCE_LAYOUT_2_EXT = SUBRESOURCE_LAYOUT_2, + IMAGE_SUBRESOURCE_2_EXT = IMAGE_SUBRESOURCE_2, + PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_ARM = PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT, + PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE = PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT, + MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE = MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_EXT, + FORMAT_PROPERTIES_3_KHR = FORMAT_PROPERTIES_3, + PHYSICAL_DEVICE_PRESENT_MODE_FIFO_LATEST_READY_FEATURES_EXT = PHYSICAL_DEVICE_PRESENT_MODE_FIFO_LATEST_READY_FEATURES_KHR, + PIPELINE_INFO_EXT = PIPELINE_INFO_KHR, + PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT = PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES, + QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT = QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES, + PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR = PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES, + PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR = PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES, + DEVICE_BUFFER_MEMORY_REQUIREMENTS_KHR = DEVICE_BUFFER_MEMORY_REQUIREMENTS, + DEVICE_IMAGE_MEMORY_REQUIREMENTS_KHR = DEVICE_IMAGE_MEMORY_REQUIREMENTS, + PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES_KHR = PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES, + PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_EXT = PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_KHR, + PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_FEATURES_QCOM = PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_FEATURES_EXT, + PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_PROPERTIES_QCOM = PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_PROPERTIES_EXT, + SUBPASS_FRAGMENT_DENSITY_MAP_OFFSET_END_INFO_QCOM = RENDER_PASS_FRAGMENT_DENSITY_MAP_OFFSET_END_INFO_EXT, + PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_PROPERTIES_NV = PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_PROPERTIES_KHR, + PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_FEATURES_NV = PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_FEATURES_EXT, + PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_PROPERTIES_NV = PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_PROPERTIES_EXT, + PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES_EXT = PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES, + PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES_KHR = PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES, + PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES_KHR = PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES, + RENDERING_AREA_INFO_KHR = RENDERING_AREA_INFO, + DEVICE_IMAGE_SUBRESOURCE_INFO_KHR = DEVICE_IMAGE_SUBRESOURCE_INFO, + SUBRESOURCE_LAYOUT_2_KHR = SUBRESOURCE_LAYOUT_2, + IMAGE_SUBRESOURCE_2_KHR = IMAGE_SUBRESOURCE_2, + PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR = PIPELINE_CREATE_FLAGS_2_CREATE_INFO, + BUFFER_USAGE_FLAGS_2_CREATE_INFO_KHR = BUFFER_USAGE_FLAGS_2_CREATE_INFO, + SHADER_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT = PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO, + PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_KHR = PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES, + PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_KHR = PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO, + PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR = PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES, + PHYSICAL_DEVICE_SHADER_FLOAT_CONTROLS_2_FEATURES_KHR = PHYSICAL_DEVICE_SHADER_FLOAT_CONTROLS_2_FEATURES, + PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_KHR = PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES, + PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_KHR = PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES, + PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_KHR = PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO, + PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_KHR = PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES, + PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES_KHR = PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES, + PHYSICAL_DEVICE_MAINTENANCE_6_FEATURES_KHR = PHYSICAL_DEVICE_MAINTENANCE_6_FEATURES, + PHYSICAL_DEVICE_MAINTENANCE_6_PROPERTIES_KHR = PHYSICAL_DEVICE_MAINTENANCE_6_PROPERTIES, + BIND_MEMORY_STATUS_KHR = BIND_MEMORY_STATUS, + BIND_DESCRIPTOR_SETS_INFO_KHR = BIND_DESCRIPTOR_SETS_INFO, + PUSH_CONSTANTS_INFO_KHR = PUSH_CONSTANTS_INFO, + PUSH_DESCRIPTOR_SET_INFO_KHR = PUSH_DESCRIPTOR_SET_INFO, + PUSH_DESCRIPTOR_SET_WITH_TEMPLATE_INFO_KHR = PUSH_DESCRIPTOR_SET_WITH_TEMPLATE_INFO, + RENDERING_END_INFO_EXT = RENDERING_END_INFO_KHR, } SubgroupFeatureFlags :: distinct bit_set[SubgroupFeatureFlag; Flags] @@ -4063,7 +4774,8 @@ SubgroupFeatureFlag :: enum Flags { QUAD = 7, ROTATE = 9, ROTATE_CLUSTERED = 10, - PARTITIONED_NV = 8, + PARTITIONED_EXT = 8, + PARTITIONED_NV = PARTITIONED_EXT, ROTATE_KHR = ROTATE, ROTATE_CLUSTERED_KHR = ROTATE_CLUSTERED, } @@ -4085,12 +4797,15 @@ SubpassDescriptionFlags :: distinct bit_set[SubpassDescriptionFlag; Flags] SubpassDescriptionFlag :: enum Flags { PER_VIEW_ATTRIBUTES_NVX = 0, PER_VIEW_POSITION_X_ONLY_NVX = 1, - FRAGMENT_REGION_QCOM = 2, - SHADER_RESOLVE_QCOM = 3, + TILE_SHADING_APRON_QCOM = 8, RASTERIZATION_ORDER_ATTACHMENT_COLOR_ACCESS_EXT = 4, RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_EXT = 5, RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_EXT = 6, ENABLE_LEGACY_DITHERING_EXT = 7, + FRAGMENT_REGION_EXT = 2, + CUSTOM_RESOLVE_EXT = 3, + FRAGMENT_REGION_QCOM = FRAGMENT_REGION_EXT, + SHADER_RESOLVE_QCOM = CUSTOM_RESOLVE_EXT, RASTERIZATION_ORDER_ATTACHMENT_COLOR_ACCESS_ARM = RASTERIZATION_ORDER_ATTACHMENT_COLOR_ACCESS_EXT, RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_ARM = RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_EXT, RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_ARM = RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_EXT, @@ -4133,10 +4848,15 @@ SurfaceTransformFlagKHR :: enum Flags { SwapchainCreateFlagsKHR :: distinct bit_set[SwapchainCreateFlagKHR; Flags] SwapchainCreateFlagKHR :: enum Flags { - SPLIT_INSTANCE_BIND_REGIONS = 0, - PROTECTED = 1, - MUTABLE_FORMAT = 2, - DEFERRED_MEMORY_ALLOCATION_EXT = 3, + SPLIT_INSTANCE_BIND_REGIONS = 0, + PROTECTED = 1, + MUTABLE_FORMAT = 2, + PRESENT_TIMING_EXT = 9, + PRESENT_ID_2 = 6, + PRESENT_WAIT_2 = 7, + DEFERRED_MEMORY_ALLOCATION = 3, + MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_EXT = 8, + DEFERRED_MEMORY_ALLOCATION_EXT = DEFERRED_MEMORY_ALLOCATION, } SystemAllocationScope :: enum c.int { @@ -4147,6 +4867,11 @@ SystemAllocationScope :: enum c.int { INSTANCE = 4, } +TensorTilingARM :: enum c.int { + OPTIMAL = 0, + LINEAR = 1, +} + TessellationDomainOrigin :: enum c.int { UPPER_LEFT = 0, LOWER_LEFT = 1, @@ -4154,11 +4879,25 @@ TessellationDomainOrigin :: enum c.int { LOWER_LEFT_KHR = LOWER_LEFT, } +ThrottleHintTypeSEC :: enum c.int { + THROTTLE_HINT_TYPE_DEFAULT_SEC = 0, + THROTTLE_HINT_TYPE_LOW_SEC = 1, + THROTTLE_HINT_TYPE_HIGH_SEC = 2, +} + +TileShadingRenderPassFlagsQCOM :: distinct bit_set[TileShadingRenderPassFlagQCOM; Flags] +TileShadingRenderPassFlagQCOM :: enum Flags { + ENABLE = 0, + PER_TILE_EXECUTION = 1, +} + TimeDomainKHR :: enum c.int { DEVICE = 0, CLOCK_MONOTONIC = 1, CLOCK_MONOTONIC_RAW = 2, QUERY_PERFORMANCE_COUNTER = 3, + PRESENT_STAGE_LOCAL_EXT = 1000208000, + SWAPCHAIN_LOCAL_EXT = 1000208001, DEVICE_EXT = DEVICE, CLOCK_MONOTONIC_EXT = CLOCK_MONOTONIC, CLOCK_MONOTONIC_RAW_EXT = CLOCK_MONOTONIC_RAW, @@ -4218,6 +4957,7 @@ VendorId :: enum c.int { MESA = 0x10005, POCL = 0x10006, MOBILEYE = 0x10007, + APE = 0x10008, } VertexInputRate :: enum c.int { @@ -4283,6 +5023,7 @@ VideoCodecOperationFlagKHR :: enum Flags { DECODE_H265 = 1, DECODE_AV1 = 2, ENCODE_AV1 = 18, + DECODE_VP9 = 3, } VideoCodecOperationFlagsKHR_NONE :: VideoCodecOperationFlagsKHR{} @@ -4340,6 +5081,7 @@ VideoEncodeAV1CapabilityFlagKHR :: enum Flags { PRIMARY_REFERENCE_CDF_ONLY = 2, FRAME_SIZE_OVERRIDE = 3, MOTION_VECTOR_SCALING = 4, + COMPOUND_PREDICTION_INTRA_REFRESH = 5, } VideoEncodeAV1PredictionModeKHR :: enum c.int { @@ -4400,10 +5142,18 @@ VideoEncodeFeedbackFlagKHR :: enum Flags { BITSTREAM_BUFFER_OFFSET = 0, BITSTREAM_BYTES_WRITTEN = 1, BITSTREAM_HAS_OVERRIDES = 2, + AVERAGE_QUANTIZATION = 3, + MIN_QUANTIZATION = 4, + MAX_QUANTIZATION = 5, + INTRA_PIXELS = 6, + INTER_PIXELS = 7, + SKIPPED_PIXELS = 8, + PICTURE_PARTITION_COUNT = 9, } VideoEncodeFlagsKHR :: distinct bit_set[VideoEncodeFlagKHR; Flags] VideoEncodeFlagKHR :: enum Flags { + INTRA_REFRESH = 2, WITH_QUANTIZATION_DELTA_MAP = 0, WITH_EMPHASIS_MAP = 1, } @@ -4419,6 +5169,7 @@ VideoEncodeH264CapabilityFlagKHR :: enum Flags { PER_PICTURE_TYPE_MIN_MAX_QP = 6, PER_SLICE_CONSTANT_QP = 7, GENERATE_PREFIX_NALU = 8, + B_PICTURE_INTRA_REFRESH = 10, MB_QP_DIFF_WRAPAROUND = 9, } @@ -4467,6 +5218,7 @@ VideoEncodeH265CapabilityFlagKHR :: enum Flags { PER_SLICE_SEGMENT_CONSTANT_QP = 7, MULTIPLE_TILES_PER_SLICE_SEGMENT = 8, MULTIPLE_SLICE_SEGMENTS_PER_TILE = 9, + B_PICTURE_INTRA_REFRESH = 11, CU_QP_DIFF_WRAPAROUND = 10, } @@ -4519,6 +5271,24 @@ VideoEncodeH265TransformBlockSizeFlagKHR :: enum Flags { _32 = 3, } +VideoEncodeIntraRefreshModeFlagsKHR :: distinct bit_set[VideoEncodeIntraRefreshModeFlagKHR; Flags] +VideoEncodeIntraRefreshModeFlagKHR :: enum Flags { + PER_PICTURE_PARTITION = 0, + BLOCK_BASED = 1, + BLOCK_ROW_BASED = 2, + BLOCK_COLUMN_BASED = 3, +} + +VideoEncodeIntraRefreshModeFlagsKHR_NONE :: VideoEncodeIntraRefreshModeFlagsKHR{} + + +VideoEncodePerPartitionFeedbackFlagsKHR :: distinct bit_set[VideoEncodePerPartitionFeedbackFlagKHR; Flags] +VideoEncodePerPartitionFeedbackFlagKHR :: enum Flags { + STATUS = 0, + BITSTREAM_BUFFER_OFFSET = 1, + BITSTREAM_BYTES_WRITTEN = 2, +} + VideoEncodeRateControlModeFlagsKHR :: distinct bit_set[VideoEncodeRateControlModeFlagKHR; Flags] VideoEncodeRateControlModeFlagKHR :: enum Flags { DISABLED = 0, @@ -4529,6 +5299,27 @@ VideoEncodeRateControlModeFlagKHR :: enum Flags { VideoEncodeRateControlModeFlagsKHR_DEFAULT :: VideoEncodeRateControlModeFlagsKHR{} +VideoEncodeRgbChromaOffsetFlagsVALVE :: distinct bit_set[VideoEncodeRgbChromaOffsetFlagVALVE; Flags] +VideoEncodeRgbChromaOffsetFlagVALVE :: enum Flags { + VIDEO_ENCODE_RGB_CHROMA_OFFSET_COSITED_EVEN_VALVE = 0, + VIDEO_ENCODE_RGB_CHROMA_OFFSET_MIDPOINT_VALVE = 1, +} + +VideoEncodeRgbModelConversionFlagsVALVE :: distinct bit_set[VideoEncodeRgbModelConversionFlagVALVE; Flags] +VideoEncodeRgbModelConversionFlagVALVE :: enum Flags { + VIDEO_ENCODE_RGB_MODEL_CONVERSION_RGB_IDENTITY_VALVE = 0, + VIDEO_ENCODE_RGB_MODEL_CONVERSION_YCBCR_IDENTITY_VALVE = 1, + VIDEO_ENCODE_RGB_MODEL_CONVERSION_YCBCR_709_VALVE = 2, + VIDEO_ENCODE_RGB_MODEL_CONVERSION_YCBCR_601_VALVE = 3, + VIDEO_ENCODE_RGB_MODEL_CONVERSION_YCBCR_2020_VALVE = 4, +} + +VideoEncodeRgbRangeCompressionFlagsVALVE :: distinct bit_set[VideoEncodeRgbRangeCompressionFlagVALVE; Flags] +VideoEncodeRgbRangeCompressionFlagVALVE :: enum Flags { + VIDEO_ENCODE_RGB_RANGE_COMPRESSION_FULL_RANGE_VALVE = 0, + VIDEO_ENCODE_RGB_RANGE_COMPRESSION_NARROW_RANGE_VALVE = 1, +} + VideoEncodeTuningModeKHR :: enum c.int { DEFAULT = 0, HIGH_QUALITY = 1, @@ -4620,6 +5411,24 @@ VideoSessionParametersCreateFlagKHR :: enum Flags { QUANTIZATION_MAP_COMPATIBLE = 0, } +VideoVP9ColorSpace :: enum c.int { +} + +VideoVP9FrameType :: enum c.int { +} + +VideoVP9InterpolationFilter :: enum c.int { +} + +VideoVP9Level :: enum c.int { +} + +VideoVP9Profile :: enum c.int { +} + +VideoVP9ReferenceName :: enum c.int { +} + ViewportCoordinateSwizzleNV :: enum c.int { POSITIVE_X = 0, NEGATIVE_X = 1, @@ -4657,6 +5466,8 @@ DisplayModeCreateFlagsKHR :: distinct bit_set[Display DisplayModeCreateFlagKHR :: enum u32 {} DisplaySurfaceCreateFlagsKHR :: distinct bit_set[DisplaySurfaceCreateFlagKHR; Flags] DisplaySurfaceCreateFlagKHR :: enum u32 {} +GpaPerfBlockPropertiesFlagsAMD :: distinct bit_set[GpaPerfBlockPropertiesFlagAMD; Flags] +GpaPerfBlockPropertiesFlagAMD :: enum u32 {} HeadlessSurfaceCreateFlagsEXT :: distinct bit_set[HeadlessSurfaceCreateFlagEXT; Flags] HeadlessSurfaceCreateFlagEXT :: enum u32 {} IOSSurfaceCreateFlagsMVK :: distinct bit_set[IOSSurfaceCreateFlagMVK; Flags] @@ -4665,6 +5476,10 @@ MacOSSurfaceCreateFlagsMVK :: distinct bit_set[MacOSSu MacOSSurfaceCreateFlagMVK :: enum u32 {} MetalSurfaceCreateFlagsEXT :: distinct bit_set[MetalSurfaceCreateFlagEXT; Flags] MetalSurfaceCreateFlagEXT :: enum u32 {} +PerformanceCounterDescriptionFlagsARM :: distinct bit_set[PerformanceCounterDescriptionFlagARM; Flags] +PerformanceCounterDescriptionFlagARM :: enum u32 {} +PhysicalDeviceGpaPropertiesFlagsAMD :: distinct bit_set[PhysicalDeviceGpaPropertiesFlagAMD; Flags] +PhysicalDeviceGpaPropertiesFlagAMD :: enum u32 {} PipelineCoverageModulationStateCreateFlagsNV :: distinct bit_set[PipelineCoverageModulationStateCreateFlagNV; Flags] PipelineCoverageModulationStateCreateFlagNV :: enum u32 {} PipelineCoverageReductionStateCreateFlagsNV :: distinct bit_set[PipelineCoverageReductionStateCreateFlagNV; Flags] @@ -4697,10 +5512,10 @@ PipelineViewportSwizzleStateCreateFlagsNV :: distinct bit_set[Pipelin PipelineViewportSwizzleStateCreateFlagNV :: enum u32 {} PrivateDataSlotCreateFlags :: distinct bit_set[PrivateDataSlotCreateFlag; Flags] PrivateDataSlotCreateFlag :: enum u32 {} -QueryPoolCreateFlags :: distinct bit_set[QueryPoolCreateFlag; Flags] -QueryPoolCreateFlag :: enum u32 {} SemaphoreCreateFlags :: distinct bit_set[SemaphoreCreateFlag; Flags] SemaphoreCreateFlag :: enum u32 {} +ShaderInstrumentationValuesFlagsARM :: distinct bit_set[ShaderInstrumentationValuesFlagARM; Flags] +ShaderInstrumentationValuesFlagARM :: enum u32 {} ShaderModuleCreateFlags :: distinct bit_set[ShaderModuleCreateFlag; Flags] ShaderModuleCreateFlag :: enum u32 {} ValidationCacheCreateFlagsEXT :: distinct bit_set[ValidationCacheCreateFlagEXT; Flags] @@ -4745,8 +5560,12 @@ AccessFlag2 :: enum Flags64 { SHADER_STORAGE_WRITE = 34, VIDEO_DECODE_READ_KHR = 35, VIDEO_DECODE_WRITE_KHR = 36, + SAMPLER_HEAP_READ_EXT = 57, + RESOURCE_HEAP_READ_EXT = 58, VIDEO_ENCODE_READ_KHR = 37, VIDEO_ENCODE_WRITE_KHR = 38, + SHADER_TILE_ATTACHMENT_READ_QCOM = 51, + SHADER_TILE_ATTACHMENT_WRITE_QCOM = 52, INDIRECT_COMMAND_READ_KHR = 0, INDEX_READ_KHR = 1, VERTEX_ATTRIBUTE_READ_KHR = 2, @@ -4790,6 +5609,10 @@ AccessFlag2 :: enum Flags64 { MICROMAP_WRITE_EXT = 45, OPTICAL_FLOW_READ_NV = 42, OPTICAL_FLOW_WRITE_NV = 43, + DATA_GRAPH_READ_ARM = 47, + DATA_GRAPH_WRITE_ARM = 48, + MEMORY_DECOMPRESSION_READ_EXT = 55, + MEMORY_DECOMPRESSION_WRITE_EXT = 56, } BufferUsageFlags2 :: distinct bit_set[BufferUsageFlag2; Flags64] @@ -4805,6 +5628,9 @@ BufferUsageFlag2 :: enum Flags64 { INDIRECT_BUFFER = 8, SHADER_DEVICE_ADDRESS = 17, EXECUTION_GRAPH_SCRATCH_AMDX = 25, + DESCRIPTOR_HEAP_EXT = 28, + MICROMAP_BUILD_INPUT_READ_ONLY_EXT = 23, + MICROMAP_STORAGE_EXT = 24, TRANSFER_SRC_KHR = 0, TRANSFER_DST_KHR = 1, UNIFORM_TEXEL_BUFFER_KHR = 2, @@ -4829,8 +5655,10 @@ BufferUsageFlag2 :: enum Flags64 { SAMPLER_DESCRIPTOR_BUFFER_EXT = 21, RESOURCE_DESCRIPTOR_BUFFER_EXT = 22, PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER_EXT = 26, - MICROMAP_BUILD_INPUT_READ_ONLY_EXT = 23, - MICROMAP_STORAGE_EXT = 24, + COMPRESSED_DATA_DGF1_AMDX = 33, + DATA_GRAPH_FOREIGN_DESCRIPTOR_ARM = 29, + TILE_MEMORY_QCOM = 27, + MEMORY_DECOMPRESSION_EXT = 32, PREPROCESS_BUFFER_EXT = 31, } @@ -4872,6 +5700,7 @@ FormatFeatureFlag2 :: enum Flags64 { HOST_IMAGE_TRANSFER_EXT = 46, VIDEO_ENCODE_INPUT_KHR = 27, VIDEO_ENCODE_DPB_KHR = 28, + BLOCK_MATCHING_SXD_QCOM = 44, SAMPLED_IMAGE_KHR = 0, STORAGE_IMAGE_KHR = 1, STORAGE_IMAGE_ATOMIC_KHR = 2, @@ -4905,11 +5734,23 @@ FormatFeatureFlag2 :: enum Flags64 { WEIGHT_SAMPLED_IMAGE_QCOM = 35, BLOCK_MATCHING_QCOM = 36, BOX_FILTER_SAMPLED_QCOM = 37, + TENSOR_SHADER_ARM = 39, + TENSOR_IMAGE_ALIASING_ARM = 43, OPTICAL_FLOW_IMAGE_NV = 40, OPTICAL_FLOW_VECTOR_NV = 41, OPTICAL_FLOW_COST_NV = 42, + TENSOR_DATA_GRAPH_ARM = 48, + COPY_IMAGE_INDIRECT_DST_KHR = 59, VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_KHR = 49, VIDEO_ENCODE_EMPHASIS_MAP_KHR = 50, + SAMPLED_IMAGE_FILTER_LINEAR_2D_IMG = 45, + DEPTH_COPY_ON_COMPUTE_QUEUE_KHR = 52, + DEPTH_COPY_ON_TRANSFER_QUEUE_KHR = 53, + STENCIL_COPY_ON_COMPUTE_QUEUE_KHR = 54, + STENCIL_COPY_ON_TRANSFER_QUEUE_KHR = 55, + DATA_GRAPH_OPTICAL_FLOW_IMAGE_ARM = 56, + DATA_GRAPH_OPTICAL_FLOW_VECTOR_ARM = 57, + DATA_GRAPH_OPTICAL_FLOW_COST_ARM = 58, } PipelineCreateFlags2 :: distinct bit_set[PipelineCreateFlag2; Flags64] @@ -4924,7 +5765,9 @@ PipelineCreateFlag2 :: enum Flags64 { NO_PROTECTED_ACCESS = 27, PROTECTED_ACCESS_ONLY = 30, EXECUTION_GRAPH_AMDX = 32, + DESCRIPTOR_HEAP_EXT = 36, RAY_TRACING_SKIP_BUILT_IN_PRIMITIVES_KHR = 12, + RAY_TRACING_OPACITY_MICROMAP_EXT = 24, RAY_TRACING_ALLOW_SPHERES_AND_LINEAR_SWEPT_SPHERES_NV = 33, ENABLE_LEGACY_DITHERING_EXT = 34, DISABLE_OPTIMIZATION_KHR = 0, @@ -4951,7 +5794,6 @@ PipelineCreateFlag2 :: enum Flags64 { RAY_TRACING_ALLOW_MOTION_NV = 20, RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_KHR = 21, RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_EXT = 22, - RAY_TRACING_OPACITY_MICROMAP_EXT = 24, COLOR_ATTACHMENT_FEEDBACK_LOOP_EXT = 25, DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_EXT = 26, NO_PROTECTED_ACCESS_EXT = 27, @@ -4959,8 +5801,13 @@ PipelineCreateFlag2 :: enum Flags64 { RAY_TRACING_DISPLACEMENT_MICROMAP_NV = 28, DESCRIPTOR_BUFFER_EXT = 29, DISALLOW_OPACITY_MICROMAP_ARM = 37, + INSTRUMENT_SHADERS_ARM = 39, CAPTURE_DATA_KHR = 31, INDIRECT_BINDABLE_EXT = 38, + PER_LAYER_FRAGMENT_DENSITY_VALVE = 40, + RAY_TRACING_OPACITY_MICROMAP_KHR = 24, + OPACITY_MICROMAP_DISALLOW_MIXED_SPECIAL_INDEX_KHR = 41, + _64_INDEXING_EXT = 43, } PipelineStageFlags2 :: distinct bit_set[PipelineStageFlag2; Flags64] @@ -5040,6 +5887,9 @@ PipelineStageFlag2 :: enum Flags64 { CLUSTER_CULLING_SHADER_HUAWEI = 41, OPTICAL_FLOW_NV = 29, CONVERT_COOPERATIVE_VECTOR_MATRIX_NV = 44, + DATA_GRAPH_ARM = 42, + COPY_INDIRECT_KHR = 46, + MEMORY_DECOMPRESSION_EXT = 45, } diff --git a/vendor/vulkan/procedures.odin b/vendor/vulkan/procedures.odin index 12eedbcfe..bb1a05ac0 100644 --- a/vendor/vulkan/procedures.odin +++ b/vendor/vulkan/procedures.odin @@ -9,6 +9,7 @@ ProcDeviceMemoryReportCallbackEXT :: #type proc "system" (pCallbackData: ProcEnumerateInstanceExtensionProperties :: #type proc "system" (pLayerName: cstring, pPropertyCount: ^u32, pProperties: [^]ExtensionProperties) -> Result ProcEnumerateInstanceLayerProperties :: #type proc "system" (pPropertyCount: ^u32, pProperties: [^]LayerProperties) -> Result ProcEnumerateInstanceVersion :: #type proc "system" (pApiVersion: ^u32) -> Result +ProcGetExternalComputeQueueDataNV :: #type proc "system" (externalQueue: ExternalComputeQueueNV, params: [^]ExternalComputeQueueDataParamsNV, pData: rawptr) // Misc Procedure Types ProcAllocationFunction :: #type proc "system" (pUserData: rawptr, size: int, alignment: int, allocationScope: SystemAllocationScope) -> rawptr @@ -20,104 +21,112 @@ ProcReallocationFunction :: #type proc "system" (pUserData: rawptr, pO ProcVoidFunction :: #type proc "system" () // Instance Procedure Types -ProcAcquireDrmDisplayEXT :: #type proc "system" (physicalDevice: PhysicalDevice, drmFd: i32, display: DisplayKHR) -> Result -ProcAcquireWinrtDisplayNV :: #type proc "system" (physicalDevice: PhysicalDevice, display: DisplayKHR) -> Result -ProcCreateDebugReportCallbackEXT :: #type proc "system" (instance: Instance, pCreateInfo: ^DebugReportCallbackCreateInfoEXT, pAllocator: ^AllocationCallbacks, pCallback: ^DebugReportCallbackEXT) -> Result -ProcCreateDebugUtilsMessengerEXT :: #type proc "system" (instance: Instance, pCreateInfo: ^DebugUtilsMessengerCreateInfoEXT, pAllocator: ^AllocationCallbacks, pMessenger: ^DebugUtilsMessengerEXT) -> Result -ProcCreateDevice :: #type proc "system" (physicalDevice: PhysicalDevice, pCreateInfo: ^DeviceCreateInfo, pAllocator: ^AllocationCallbacks, pDevice: ^Device) -> Result -ProcCreateDisplayModeKHR :: #type proc "system" (physicalDevice: PhysicalDevice, display: DisplayKHR, pCreateInfo: ^DisplayModeCreateInfoKHR, pAllocator: ^AllocationCallbacks, pMode: ^DisplayModeKHR) -> Result -ProcCreateDisplayPlaneSurfaceKHR :: #type proc "system" (instance: Instance, pCreateInfo: ^DisplaySurfaceCreateInfoKHR, pAllocator: ^AllocationCallbacks, pSurface: ^SurfaceKHR) -> Result -ProcCreateHeadlessSurfaceEXT :: #type proc "system" (instance: Instance, pCreateInfo: ^HeadlessSurfaceCreateInfoEXT, pAllocator: ^AllocationCallbacks, pSurface: ^SurfaceKHR) -> Result -ProcCreateIOSSurfaceMVK :: #type proc "system" (instance: Instance, pCreateInfo: ^IOSSurfaceCreateInfoMVK, pAllocator: ^AllocationCallbacks, pSurface: ^SurfaceKHR) -> Result -ProcCreateMacOSSurfaceMVK :: #type proc "system" (instance: Instance, pCreateInfo: ^MacOSSurfaceCreateInfoMVK, pAllocator: ^AllocationCallbacks, pSurface: ^SurfaceKHR) -> Result -ProcCreateMetalSurfaceEXT :: #type proc "system" (instance: Instance, pCreateInfo: ^MetalSurfaceCreateInfoEXT, pAllocator: ^AllocationCallbacks, pSurface: ^SurfaceKHR) -> Result -ProcCreateWaylandSurfaceKHR :: #type proc "system" (instance: Instance, pCreateInfo: ^WaylandSurfaceCreateInfoKHR, pAllocator: ^AllocationCallbacks, pSurface: ^SurfaceKHR) -> Result -ProcCreateWin32SurfaceKHR :: #type proc "system" (instance: Instance, pCreateInfo: ^Win32SurfaceCreateInfoKHR, pAllocator: ^AllocationCallbacks, pSurface: ^SurfaceKHR) -> Result -ProcCreateXcbSurfaceKHR :: #type proc "system" (instance: Instance, pCreateInfo: ^XcbSurfaceCreateInfoKHR, pAllocator: ^AllocationCallbacks, pSurface: ^SurfaceKHR) -> Result -ProcCreateXlibSurfaceKHR :: #type proc "system" (instance: Instance, pCreateInfo: ^XlibSurfaceCreateInfoKHR, pAllocator: ^AllocationCallbacks, pSurface: ^SurfaceKHR) -> Result -ProcDebugReportMessageEXT :: #type proc "system" (instance: Instance, flags: DebugReportFlagsEXT, objectType: DebugReportObjectTypeEXT, object: u64, location: int, messageCode: i32, pLayerPrefix: cstring, pMessage: cstring) -ProcDestroyDebugReportCallbackEXT :: #type proc "system" (instance: Instance, callback: DebugReportCallbackEXT, pAllocator: ^AllocationCallbacks) -ProcDestroyDebugUtilsMessengerEXT :: #type proc "system" (instance: Instance, messenger: DebugUtilsMessengerEXT, pAllocator: ^AllocationCallbacks) -ProcDestroyInstance :: #type proc "system" (instance: Instance, pAllocator: ^AllocationCallbacks) -ProcDestroySurfaceKHR :: #type proc "system" (instance: Instance, surface: SurfaceKHR, pAllocator: ^AllocationCallbacks) -ProcEnumerateDeviceExtensionProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pLayerName: cstring, pPropertyCount: ^u32, pProperties: [^]ExtensionProperties) -> Result -ProcEnumerateDeviceLayerProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]LayerProperties) -> Result -ProcEnumeratePhysicalDeviceGroups :: #type proc "system" (instance: Instance, pPhysicalDeviceGroupCount: ^u32, pPhysicalDeviceGroupProperties: [^]PhysicalDeviceGroupProperties) -> Result -ProcEnumeratePhysicalDeviceGroupsKHR :: #type proc "system" (instance: Instance, pPhysicalDeviceGroupCount: ^u32, pPhysicalDeviceGroupProperties: [^]PhysicalDeviceGroupProperties) -> Result -ProcEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR :: #type proc "system" (physicalDevice: PhysicalDevice, queueFamilyIndex: u32, pCounterCount: ^u32, pCounters: [^]PerformanceCounterKHR, pCounterDescriptions: [^]PerformanceCounterDescriptionKHR) -> Result -ProcEnumeratePhysicalDevices :: #type proc "system" (instance: Instance, pPhysicalDeviceCount: ^u32, pPhysicalDevices: [^]PhysicalDevice) -> Result -ProcGetDisplayModeProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, display: DisplayKHR, pPropertyCount: ^u32, pProperties: [^]DisplayModeProperties2KHR) -> Result -ProcGetDisplayModePropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, display: DisplayKHR, pPropertyCount: ^u32, pProperties: [^]DisplayModePropertiesKHR) -> Result -ProcGetDisplayPlaneCapabilities2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pDisplayPlaneInfo: ^DisplayPlaneInfo2KHR, pCapabilities: [^]DisplayPlaneCapabilities2KHR) -> Result -ProcGetDisplayPlaneCapabilitiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, mode: DisplayModeKHR, planeIndex: u32, pCapabilities: [^]DisplayPlaneCapabilitiesKHR) -> Result -ProcGetDisplayPlaneSupportedDisplaysKHR :: #type proc "system" (physicalDevice: PhysicalDevice, planeIndex: u32, pDisplayCount: ^u32, pDisplays: [^]DisplayKHR) -> Result -ProcGetDrmDisplayEXT :: #type proc "system" (physicalDevice: PhysicalDevice, drmFd: i32, connectorId: u32, display: ^DisplayKHR) -> Result -ProcGetInstanceProcAddr :: #type proc "system" (instance: Instance, pName: cstring) -> ProcVoidFunction -ProcGetInstanceProcAddrLUNARG :: #type proc "system" (instance: Instance, pName: cstring) -> ProcVoidFunction -ProcGetPhysicalDeviceCalibrateableTimeDomainsEXT :: #type proc "system" (physicalDevice: PhysicalDevice, pTimeDomainCount: ^u32, pTimeDomains: [^]TimeDomainKHR) -> Result -ProcGetPhysicalDeviceCalibrateableTimeDomainsKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pTimeDomainCount: ^u32, pTimeDomains: [^]TimeDomainKHR) -> Result -ProcGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]CooperativeMatrixFlexibleDimensionsPropertiesNV) -> Result -ProcGetPhysicalDeviceCooperativeMatrixPropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]CooperativeMatrixPropertiesKHR) -> Result -ProcGetPhysicalDeviceCooperativeMatrixPropertiesNV :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]CooperativeMatrixPropertiesNV) -> Result -ProcGetPhysicalDeviceCooperativeVectorPropertiesNV :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]CooperativeVectorPropertiesNV) -> Result -ProcGetPhysicalDeviceDisplayPlaneProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]DisplayPlaneProperties2KHR) -> Result -ProcGetPhysicalDeviceDisplayPlanePropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]DisplayPlanePropertiesKHR) -> Result -ProcGetPhysicalDeviceDisplayProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]DisplayProperties2KHR) -> Result -ProcGetPhysicalDeviceDisplayPropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]DisplayPropertiesKHR) -> Result -ProcGetPhysicalDeviceExternalBufferProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pExternalBufferInfo: ^PhysicalDeviceExternalBufferInfo, pExternalBufferProperties: [^]ExternalBufferProperties) -ProcGetPhysicalDeviceExternalBufferPropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pExternalBufferInfo: ^PhysicalDeviceExternalBufferInfo, pExternalBufferProperties: [^]ExternalBufferProperties) -ProcGetPhysicalDeviceExternalFenceProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pExternalFenceInfo: ^PhysicalDeviceExternalFenceInfo, pExternalFenceProperties: [^]ExternalFenceProperties) -ProcGetPhysicalDeviceExternalFencePropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pExternalFenceInfo: ^PhysicalDeviceExternalFenceInfo, pExternalFenceProperties: [^]ExternalFenceProperties) -ProcGetPhysicalDeviceExternalImageFormatPropertiesNV :: #type proc "system" (physicalDevice: PhysicalDevice, format: Format, type: ImageType, tiling: ImageTiling, usage: ImageUsageFlags, flags: ImageCreateFlags, externalHandleType: ExternalMemoryHandleTypeFlagsNV, pExternalImageFormatProperties: [^]ExternalImageFormatPropertiesNV) -> Result -ProcGetPhysicalDeviceExternalSemaphoreProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pExternalSemaphoreInfo: ^PhysicalDeviceExternalSemaphoreInfo, pExternalSemaphoreProperties: [^]ExternalSemaphoreProperties) -ProcGetPhysicalDeviceExternalSemaphorePropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pExternalSemaphoreInfo: ^PhysicalDeviceExternalSemaphoreInfo, pExternalSemaphoreProperties: [^]ExternalSemaphoreProperties) -ProcGetPhysicalDeviceFeatures :: #type proc "system" (physicalDevice: PhysicalDevice, pFeatures: [^]PhysicalDeviceFeatures) -ProcGetPhysicalDeviceFeatures2 :: #type proc "system" (physicalDevice: PhysicalDevice, pFeatures: [^]PhysicalDeviceFeatures2) -ProcGetPhysicalDeviceFeatures2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pFeatures: [^]PhysicalDeviceFeatures2) -ProcGetPhysicalDeviceFormatProperties :: #type proc "system" (physicalDevice: PhysicalDevice, format: Format, pFormatProperties: [^]FormatProperties) -ProcGetPhysicalDeviceFormatProperties2 :: #type proc "system" (physicalDevice: PhysicalDevice, format: Format, pFormatProperties: [^]FormatProperties2) -ProcGetPhysicalDeviceFormatProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, format: Format, pFormatProperties: [^]FormatProperties2) -ProcGetPhysicalDeviceFragmentShadingRatesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pFragmentShadingRateCount: ^u32, pFragmentShadingRates: [^]PhysicalDeviceFragmentShadingRateKHR) -> Result -ProcGetPhysicalDeviceImageFormatProperties :: #type proc "system" (physicalDevice: PhysicalDevice, format: Format, type: ImageType, tiling: ImageTiling, usage: ImageUsageFlags, flags: ImageCreateFlags, pImageFormatProperties: [^]ImageFormatProperties) -> Result -ProcGetPhysicalDeviceImageFormatProperties2 :: #type proc "system" (physicalDevice: PhysicalDevice, pImageFormatInfo: ^PhysicalDeviceImageFormatInfo2, pImageFormatProperties: [^]ImageFormatProperties2) -> Result -ProcGetPhysicalDeviceImageFormatProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pImageFormatInfo: ^PhysicalDeviceImageFormatInfo2, pImageFormatProperties: [^]ImageFormatProperties2) -> Result -ProcGetPhysicalDeviceMemoryProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pMemoryProperties: [^]PhysicalDeviceMemoryProperties) -ProcGetPhysicalDeviceMemoryProperties2 :: #type proc "system" (physicalDevice: PhysicalDevice, pMemoryProperties: [^]PhysicalDeviceMemoryProperties2) -ProcGetPhysicalDeviceMemoryProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pMemoryProperties: [^]PhysicalDeviceMemoryProperties2) -ProcGetPhysicalDeviceMultisamplePropertiesEXT :: #type proc "system" (physicalDevice: PhysicalDevice, samples: SampleCountFlags, pMultisampleProperties: [^]MultisamplePropertiesEXT) -ProcGetPhysicalDeviceOpticalFlowImageFormatsNV :: #type proc "system" (physicalDevice: PhysicalDevice, pOpticalFlowImageFormatInfo: ^OpticalFlowImageFormatInfoNV, pFormatCount: ^u32, pImageFormatProperties: [^]OpticalFlowImageFormatPropertiesNV) -> Result -ProcGetPhysicalDevicePresentRectanglesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, surface: SurfaceKHR, pRectCount: ^u32, pRects: [^]Rect2D) -> Result -ProcGetPhysicalDeviceProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pProperties: [^]PhysicalDeviceProperties) -ProcGetPhysicalDeviceProperties2 :: #type proc "system" (physicalDevice: PhysicalDevice, pProperties: [^]PhysicalDeviceProperties2) -ProcGetPhysicalDeviceProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pProperties: [^]PhysicalDeviceProperties2) -ProcGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pPerformanceQueryCreateInfo: ^QueryPoolPerformanceCreateInfoKHR, pNumPasses: [^]u32) -ProcGetPhysicalDeviceQueueFamilyProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pQueueFamilyPropertyCount: ^u32, pQueueFamilyProperties: [^]QueueFamilyProperties) -ProcGetPhysicalDeviceQueueFamilyProperties2 :: #type proc "system" (physicalDevice: PhysicalDevice, pQueueFamilyPropertyCount: ^u32, pQueueFamilyProperties: [^]QueueFamilyProperties2) -ProcGetPhysicalDeviceQueueFamilyProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pQueueFamilyPropertyCount: ^u32, pQueueFamilyProperties: [^]QueueFamilyProperties2) -ProcGetPhysicalDeviceSparseImageFormatProperties :: #type proc "system" (physicalDevice: PhysicalDevice, format: Format, type: ImageType, samples: SampleCountFlags, usage: ImageUsageFlags, tiling: ImageTiling, pPropertyCount: ^u32, pProperties: [^]SparseImageFormatProperties) -ProcGetPhysicalDeviceSparseImageFormatProperties2 :: #type proc "system" (physicalDevice: PhysicalDevice, pFormatInfo: ^PhysicalDeviceSparseImageFormatInfo2, pPropertyCount: ^u32, pProperties: [^]SparseImageFormatProperties2) -ProcGetPhysicalDeviceSparseImageFormatProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pFormatInfo: ^PhysicalDeviceSparseImageFormatInfo2, pPropertyCount: ^u32, pProperties: [^]SparseImageFormatProperties2) -ProcGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV :: #type proc "system" (physicalDevice: PhysicalDevice, pCombinationCount: ^u32, pCombinations: [^]FramebufferMixedSamplesCombinationNV) -> Result -ProcGetPhysicalDeviceSurfaceCapabilities2EXT :: #type proc "system" (physicalDevice: PhysicalDevice, surface: SurfaceKHR, pSurfaceCapabilities: [^]SurfaceCapabilities2EXT) -> Result -ProcGetPhysicalDeviceSurfaceCapabilities2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pSurfaceInfo: ^PhysicalDeviceSurfaceInfo2KHR, pSurfaceCapabilities: [^]SurfaceCapabilities2KHR) -> Result -ProcGetPhysicalDeviceSurfaceCapabilitiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, surface: SurfaceKHR, pSurfaceCapabilities: [^]SurfaceCapabilitiesKHR) -> Result -ProcGetPhysicalDeviceSurfaceFormats2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pSurfaceInfo: ^PhysicalDeviceSurfaceInfo2KHR, pSurfaceFormatCount: ^u32, pSurfaceFormats: [^]SurfaceFormat2KHR) -> Result -ProcGetPhysicalDeviceSurfaceFormatsKHR :: #type proc "system" (physicalDevice: PhysicalDevice, surface: SurfaceKHR, pSurfaceFormatCount: ^u32, pSurfaceFormats: [^]SurfaceFormatKHR) -> Result -ProcGetPhysicalDeviceSurfacePresentModes2EXT :: #type proc "system" (physicalDevice: PhysicalDevice, pSurfaceInfo: ^PhysicalDeviceSurfaceInfo2KHR, pPresentModeCount: ^u32, pPresentModes: [^]PresentModeKHR) -> Result -ProcGetPhysicalDeviceSurfacePresentModesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, surface: SurfaceKHR, pPresentModeCount: ^u32, pPresentModes: [^]PresentModeKHR) -> Result -ProcGetPhysicalDeviceSurfaceSupportKHR :: #type proc "system" (physicalDevice: PhysicalDevice, queueFamilyIndex: u32, surface: SurfaceKHR, pSupported: ^b32) -> Result -ProcGetPhysicalDeviceToolProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pToolCount: ^u32, pToolProperties: [^]PhysicalDeviceToolProperties) -> Result -ProcGetPhysicalDeviceToolPropertiesEXT :: #type proc "system" (physicalDevice: PhysicalDevice, pToolCount: ^u32, pToolProperties: [^]PhysicalDeviceToolProperties) -> Result -ProcGetPhysicalDeviceVideoCapabilitiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pVideoProfile: ^VideoProfileInfoKHR, pCapabilities: [^]VideoCapabilitiesKHR) -> Result -ProcGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pQualityLevelInfo: ^PhysicalDeviceVideoEncodeQualityLevelInfoKHR, pQualityLevelProperties: [^]VideoEncodeQualityLevelPropertiesKHR) -> Result -ProcGetPhysicalDeviceVideoFormatPropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pVideoFormatInfo: ^PhysicalDeviceVideoFormatInfoKHR, pVideoFormatPropertyCount: ^u32, pVideoFormatProperties: [^]VideoFormatPropertiesKHR) -> Result -ProcGetPhysicalDeviceWaylandPresentationSupportKHR :: #type proc "system" (physicalDevice: PhysicalDevice, queueFamilyIndex: u32, display: ^wl_display) -> b32 -ProcGetPhysicalDeviceWin32PresentationSupportKHR :: #type proc "system" (physicalDevice: PhysicalDevice, queueFamilyIndex: u32) -> b32 -ProcGetPhysicalDeviceXcbPresentationSupportKHR :: #type proc "system" (physicalDevice: PhysicalDevice, queueFamilyIndex: u32, connection: ^xcb_connection_t, visual_id: xcb_visualid_t) -> b32 -ProcGetPhysicalDeviceXlibPresentationSupportKHR :: #type proc "system" (physicalDevice: PhysicalDevice, queueFamilyIndex: u32, dpy: ^XlibDisplay, visualID: XlibVisualID) -> b32 -ProcGetWinrtDisplayNV :: #type proc "system" (physicalDevice: PhysicalDevice, deviceRelativeId: u32, pDisplay: ^DisplayKHR) -> Result -ProcReleaseDisplayEXT :: #type proc "system" (physicalDevice: PhysicalDevice, display: DisplayKHR) -> Result -ProcSubmitDebugUtilsMessageEXT :: #type proc "system" (instance: Instance, messageSeverity: DebugUtilsMessageSeverityFlagsEXT, messageTypes: DebugUtilsMessageTypeFlagsEXT, pCallbackData: ^DebugUtilsMessengerCallbackDataEXT) +ProcAcquireDrmDisplayEXT :: #type proc "system" (physicalDevice: PhysicalDevice, drmFd: i32, display: DisplayKHR) -> Result +ProcAcquireWinrtDisplayNV :: #type proc "system" (physicalDevice: PhysicalDevice, display: DisplayKHR) -> Result +ProcCreateDebugReportCallbackEXT :: #type proc "system" (instance: Instance, pCreateInfo: ^DebugReportCallbackCreateInfoEXT, pAllocator: ^AllocationCallbacks, pCallback: ^DebugReportCallbackEXT) -> Result +ProcCreateDebugUtilsMessengerEXT :: #type proc "system" (instance: Instance, pCreateInfo: ^DebugUtilsMessengerCreateInfoEXT, pAllocator: ^AllocationCallbacks, pMessenger: ^DebugUtilsMessengerEXT) -> Result +ProcCreateDevice :: #type proc "system" (physicalDevice: PhysicalDevice, pCreateInfo: ^DeviceCreateInfo, pAllocator: ^AllocationCallbacks, pDevice: ^Device) -> Result +ProcCreateDisplayModeKHR :: #type proc "system" (physicalDevice: PhysicalDevice, display: DisplayKHR, pCreateInfo: ^DisplayModeCreateInfoKHR, pAllocator: ^AllocationCallbacks, pMode: ^DisplayModeKHR) -> Result +ProcCreateDisplayPlaneSurfaceKHR :: #type proc "system" (instance: Instance, pCreateInfo: ^DisplaySurfaceCreateInfoKHR, pAllocator: ^AllocationCallbacks, pSurface: ^SurfaceKHR) -> Result +ProcCreateHeadlessSurfaceEXT :: #type proc "system" (instance: Instance, pCreateInfo: ^HeadlessSurfaceCreateInfoEXT, pAllocator: ^AllocationCallbacks, pSurface: ^SurfaceKHR) -> Result +ProcCreateIOSSurfaceMVK :: #type proc "system" (instance: Instance, pCreateInfo: ^IOSSurfaceCreateInfoMVK, pAllocator: ^AllocationCallbacks, pSurface: ^SurfaceKHR) -> Result +ProcCreateMacOSSurfaceMVK :: #type proc "system" (instance: Instance, pCreateInfo: ^MacOSSurfaceCreateInfoMVK, pAllocator: ^AllocationCallbacks, pSurface: ^SurfaceKHR) -> Result +ProcCreateMetalSurfaceEXT :: #type proc "system" (instance: Instance, pCreateInfo: ^MetalSurfaceCreateInfoEXT, pAllocator: ^AllocationCallbacks, pSurface: ^SurfaceKHR) -> Result +ProcCreateWaylandSurfaceKHR :: #type proc "system" (instance: Instance, pCreateInfo: ^WaylandSurfaceCreateInfoKHR, pAllocator: ^AllocationCallbacks, pSurface: ^SurfaceKHR) -> Result +ProcCreateWin32SurfaceKHR :: #type proc "system" (instance: Instance, pCreateInfo: ^Win32SurfaceCreateInfoKHR, pAllocator: ^AllocationCallbacks, pSurface: ^SurfaceKHR) -> Result +ProcCreateXcbSurfaceKHR :: #type proc "system" (instance: Instance, pCreateInfo: ^XcbSurfaceCreateInfoKHR, pAllocator: ^AllocationCallbacks, pSurface: ^SurfaceKHR) -> Result +ProcCreateXlibSurfaceKHR :: #type proc "system" (instance: Instance, pCreateInfo: ^XlibSurfaceCreateInfoKHR, pAllocator: ^AllocationCallbacks, pSurface: ^SurfaceKHR) -> Result +ProcDebugReportMessageEXT :: #type proc "system" (instance: Instance, flags: DebugReportFlagsEXT, objectType: DebugReportObjectTypeEXT, object: u64, location: int, messageCode: i32, pLayerPrefix: cstring, pMessage: cstring) +ProcDestroyDebugReportCallbackEXT :: #type proc "system" (instance: Instance, callback: DebugReportCallbackEXT, pAllocator: ^AllocationCallbacks) +ProcDestroyDebugUtilsMessengerEXT :: #type proc "system" (instance: Instance, messenger: DebugUtilsMessengerEXT, pAllocator: ^AllocationCallbacks) +ProcDestroyInstance :: #type proc "system" (instance: Instance, pAllocator: ^AllocationCallbacks) +ProcDestroySurfaceKHR :: #type proc "system" (instance: Instance, surface: SurfaceKHR, pAllocator: ^AllocationCallbacks) +ProcEnumerateDeviceExtensionProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pLayerName: cstring, pPropertyCount: ^u32, pProperties: [^]ExtensionProperties) -> Result +ProcEnumerateDeviceLayerProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]LayerProperties) -> Result +ProcEnumeratePhysicalDeviceGroups :: #type proc "system" (instance: Instance, pPhysicalDeviceGroupCount: ^u32, pPhysicalDeviceGroupProperties: [^]PhysicalDeviceGroupProperties) -> Result +ProcEnumeratePhysicalDeviceGroupsKHR :: #type proc "system" (instance: Instance, pPhysicalDeviceGroupCount: ^u32, pPhysicalDeviceGroupProperties: [^]PhysicalDeviceGroupProperties) -> Result +ProcEnumeratePhysicalDeviceQueueFamilyPerformanceCountersByRegionARM :: #type proc "system" (physicalDevice: PhysicalDevice, queueFamilyIndex: u32, pCounterCount: ^u32, pCounters: [^]PerformanceCounterARM, pCounterDescriptions: [^]PerformanceCounterDescriptionARM) -> Result +ProcEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR :: #type proc "system" (physicalDevice: PhysicalDevice, queueFamilyIndex: u32, pCounterCount: ^u32, pCounters: [^]PerformanceCounterKHR, pCounterDescriptions: [^]PerformanceCounterDescriptionKHR) -> Result +ProcEnumeratePhysicalDeviceShaderInstrumentationMetricsARM :: #type proc "system" (physicalDevice: PhysicalDevice, pDescriptionCount: ^u32, pDescriptions: [^]ShaderInstrumentationMetricDescriptionARM) -> Result +ProcEnumeratePhysicalDevices :: #type proc "system" (instance: Instance, pPhysicalDeviceCount: ^u32, pPhysicalDevices: [^]PhysicalDevice) -> Result +ProcGetDisplayModeProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, display: DisplayKHR, pPropertyCount: ^u32, pProperties: [^]DisplayModeProperties2KHR) -> Result +ProcGetDisplayModePropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, display: DisplayKHR, pPropertyCount: ^u32, pProperties: [^]DisplayModePropertiesKHR) -> Result +ProcGetDisplayPlaneCapabilities2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pDisplayPlaneInfo: ^DisplayPlaneInfo2KHR, pCapabilities: [^]DisplayPlaneCapabilities2KHR) -> Result +ProcGetDisplayPlaneCapabilitiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, mode: DisplayModeKHR, planeIndex: u32, pCapabilities: [^]DisplayPlaneCapabilitiesKHR) -> Result +ProcGetDisplayPlaneSupportedDisplaysKHR :: #type proc "system" (physicalDevice: PhysicalDevice, planeIndex: u32, pDisplayCount: ^u32, pDisplays: [^]DisplayKHR) -> Result +ProcGetDrmDisplayEXT :: #type proc "system" (physicalDevice: PhysicalDevice, drmFd: i32, connectorId: u32, display: ^DisplayKHR) -> Result +ProcGetInstanceProcAddr :: #type proc "system" (instance: Instance, pName: cstring) -> ProcVoidFunction +ProcGetInstanceProcAddrLUNARG :: #type proc "system" (instance: Instance, pName: cstring) -> ProcVoidFunction +ProcGetPhysicalDeviceCalibrateableTimeDomainsEXT :: #type proc "system" (physicalDevice: PhysicalDevice, pTimeDomainCount: ^u32, pTimeDomains: [^]TimeDomainKHR) -> Result +ProcGetPhysicalDeviceCalibrateableTimeDomainsKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pTimeDomainCount: ^u32, pTimeDomains: [^]TimeDomainKHR) -> Result +ProcGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]CooperativeMatrixFlexibleDimensionsPropertiesNV) -> Result +ProcGetPhysicalDeviceCooperativeMatrixPropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]CooperativeMatrixPropertiesKHR) -> Result +ProcGetPhysicalDeviceCooperativeMatrixPropertiesNV :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]CooperativeMatrixPropertiesNV) -> Result +ProcGetPhysicalDeviceCooperativeVectorPropertiesNV :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]CooperativeVectorPropertiesNV) -> Result +ProcGetPhysicalDeviceDescriptorSizeEXT :: #type proc "system" (physicalDevice: PhysicalDevice, descriptorType: DescriptorType) -> DeviceSize +ProcGetPhysicalDeviceDisplayPlaneProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]DisplayPlaneProperties2KHR) -> Result +ProcGetPhysicalDeviceDisplayPlanePropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]DisplayPlanePropertiesKHR) -> Result +ProcGetPhysicalDeviceDisplayProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]DisplayProperties2KHR) -> Result +ProcGetPhysicalDeviceDisplayPropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]DisplayPropertiesKHR) -> Result +ProcGetPhysicalDeviceExternalBufferProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pExternalBufferInfo: ^PhysicalDeviceExternalBufferInfo, pExternalBufferProperties: [^]ExternalBufferProperties) +ProcGetPhysicalDeviceExternalBufferPropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pExternalBufferInfo: ^PhysicalDeviceExternalBufferInfo, pExternalBufferProperties: [^]ExternalBufferProperties) +ProcGetPhysicalDeviceExternalFenceProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pExternalFenceInfo: ^PhysicalDeviceExternalFenceInfo, pExternalFenceProperties: [^]ExternalFenceProperties) +ProcGetPhysicalDeviceExternalFencePropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pExternalFenceInfo: ^PhysicalDeviceExternalFenceInfo, pExternalFenceProperties: [^]ExternalFenceProperties) +ProcGetPhysicalDeviceExternalImageFormatPropertiesNV :: #type proc "system" (physicalDevice: PhysicalDevice, format: Format, type: ImageType, tiling: ImageTiling, usage: ImageUsageFlags, flags: ImageCreateFlags, externalHandleType: ExternalMemoryHandleTypeFlagsNV, pExternalImageFormatProperties: [^]ExternalImageFormatPropertiesNV) -> Result +ProcGetPhysicalDeviceExternalSemaphoreProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pExternalSemaphoreInfo: ^PhysicalDeviceExternalSemaphoreInfo, pExternalSemaphoreProperties: [^]ExternalSemaphoreProperties) +ProcGetPhysicalDeviceExternalSemaphorePropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pExternalSemaphoreInfo: ^PhysicalDeviceExternalSemaphoreInfo, pExternalSemaphoreProperties: [^]ExternalSemaphoreProperties) +ProcGetPhysicalDeviceExternalTensorPropertiesARM :: #type proc "system" (physicalDevice: PhysicalDevice, pExternalTensorInfo: ^PhysicalDeviceExternalTensorInfoARM, pExternalTensorProperties: [^]ExternalTensorPropertiesARM) +ProcGetPhysicalDeviceFeatures :: #type proc "system" (physicalDevice: PhysicalDevice, pFeatures: [^]PhysicalDeviceFeatures) +ProcGetPhysicalDeviceFeatures2 :: #type proc "system" (physicalDevice: PhysicalDevice, pFeatures: [^]PhysicalDeviceFeatures2) +ProcGetPhysicalDeviceFeatures2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pFeatures: [^]PhysicalDeviceFeatures2) +ProcGetPhysicalDeviceFormatProperties :: #type proc "system" (physicalDevice: PhysicalDevice, format: Format, pFormatProperties: [^]FormatProperties) +ProcGetPhysicalDeviceFormatProperties2 :: #type proc "system" (physicalDevice: PhysicalDevice, format: Format, pFormatProperties: [^]FormatProperties2) +ProcGetPhysicalDeviceFormatProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, format: Format, pFormatProperties: [^]FormatProperties2) +ProcGetPhysicalDeviceFragmentShadingRatesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pFragmentShadingRateCount: ^u32, pFragmentShadingRates: [^]PhysicalDeviceFragmentShadingRateKHR) -> Result +ProcGetPhysicalDeviceImageFormatProperties :: #type proc "system" (physicalDevice: PhysicalDevice, format: Format, type: ImageType, tiling: ImageTiling, usage: ImageUsageFlags, flags: ImageCreateFlags, pImageFormatProperties: [^]ImageFormatProperties) -> Result +ProcGetPhysicalDeviceImageFormatProperties2 :: #type proc "system" (physicalDevice: PhysicalDevice, pImageFormatInfo: ^PhysicalDeviceImageFormatInfo2, pImageFormatProperties: [^]ImageFormatProperties2) -> Result +ProcGetPhysicalDeviceImageFormatProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pImageFormatInfo: ^PhysicalDeviceImageFormatInfo2, pImageFormatProperties: [^]ImageFormatProperties2) -> Result +ProcGetPhysicalDeviceMemoryProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pMemoryProperties: [^]PhysicalDeviceMemoryProperties) +ProcGetPhysicalDeviceMemoryProperties2 :: #type proc "system" (physicalDevice: PhysicalDevice, pMemoryProperties: [^]PhysicalDeviceMemoryProperties2) +ProcGetPhysicalDeviceMemoryProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pMemoryProperties: [^]PhysicalDeviceMemoryProperties2) +ProcGetPhysicalDeviceMultisamplePropertiesEXT :: #type proc "system" (physicalDevice: PhysicalDevice, samples: SampleCountFlags, pMultisampleProperties: [^]MultisamplePropertiesEXT) +ProcGetPhysicalDeviceOpticalFlowImageFormatsNV :: #type proc "system" (physicalDevice: PhysicalDevice, pOpticalFlowImageFormatInfo: ^OpticalFlowImageFormatInfoNV, pFormatCount: ^u32, pImageFormatProperties: [^]OpticalFlowImageFormatPropertiesNV) -> Result +ProcGetPhysicalDevicePresentRectanglesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, surface: SurfaceKHR, pRectCount: ^u32, pRects: [^]Rect2D) -> Result +ProcGetPhysicalDeviceProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pProperties: [^]PhysicalDeviceProperties) +ProcGetPhysicalDeviceProperties2 :: #type proc "system" (physicalDevice: PhysicalDevice, pProperties: [^]PhysicalDeviceProperties2) +ProcGetPhysicalDeviceProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pProperties: [^]PhysicalDeviceProperties2) +ProcGetPhysicalDeviceQueueFamilyDataGraphEngineOperationPropertiesARM :: #type proc "system" (physicalDevice: PhysicalDevice, queueFamilyIndex: u32, pQueueFamilyDataGraphProperties: [^]QueueFamilyDataGraphPropertiesARM, pProperties: [^]BaseOutStructure) -> Result +ProcGetPhysicalDeviceQueueFamilyDataGraphOpticalFlowImageFormatsARM :: #type proc "system" (physicalDevice: PhysicalDevice, queueFamilyIndex: u32, pQueueFamilyDataGraphProperties: [^]QueueFamilyDataGraphPropertiesARM, pOpticalFlowImageFormatInfo: ^DataGraphOpticalFlowImageFormatInfoARM, pFormatCount: ^u32, pImageFormatProperties: [^]DataGraphOpticalFlowImageFormatPropertiesARM) -> Result +ProcGetPhysicalDeviceQueueFamilyDataGraphProcessingEnginePropertiesARM :: #type proc "system" (physicalDevice: PhysicalDevice, pQueueFamilyDataGraphProcessingEngineInfo: ^PhysicalDeviceQueueFamilyDataGraphProcessingEngineInfoARM, pQueueFamilyDataGraphProcessingEngineProperties: [^]QueueFamilyDataGraphProcessingEnginePropertiesARM) +ProcGetPhysicalDeviceQueueFamilyDataGraphPropertiesARM :: #type proc "system" (physicalDevice: PhysicalDevice, queueFamilyIndex: u32, pQueueFamilyDataGraphPropertyCount: ^u32, pQueueFamilyDataGraphProperties: [^]QueueFamilyDataGraphPropertiesARM) -> Result +ProcGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pPerformanceQueryCreateInfo: ^QueryPoolPerformanceCreateInfoKHR, pNumPasses: [^]u32) +ProcGetPhysicalDeviceQueueFamilyProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pQueueFamilyPropertyCount: ^u32, pQueueFamilyProperties: [^]QueueFamilyProperties) +ProcGetPhysicalDeviceQueueFamilyProperties2 :: #type proc "system" (physicalDevice: PhysicalDevice, pQueueFamilyPropertyCount: ^u32, pQueueFamilyProperties: [^]QueueFamilyProperties2) +ProcGetPhysicalDeviceQueueFamilyProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pQueueFamilyPropertyCount: ^u32, pQueueFamilyProperties: [^]QueueFamilyProperties2) +ProcGetPhysicalDeviceSparseImageFormatProperties :: #type proc "system" (physicalDevice: PhysicalDevice, format: Format, type: ImageType, samples: SampleCountFlags, usage: ImageUsageFlags, tiling: ImageTiling, pPropertyCount: ^u32, pProperties: [^]SparseImageFormatProperties) +ProcGetPhysicalDeviceSparseImageFormatProperties2 :: #type proc "system" (physicalDevice: PhysicalDevice, pFormatInfo: ^PhysicalDeviceSparseImageFormatInfo2, pPropertyCount: ^u32, pProperties: [^]SparseImageFormatProperties2) +ProcGetPhysicalDeviceSparseImageFormatProperties2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pFormatInfo: ^PhysicalDeviceSparseImageFormatInfo2, pPropertyCount: ^u32, pProperties: [^]SparseImageFormatProperties2) +ProcGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV :: #type proc "system" (physicalDevice: PhysicalDevice, pCombinationCount: ^u32, pCombinations: [^]FramebufferMixedSamplesCombinationNV) -> Result +ProcGetPhysicalDeviceSurfaceCapabilities2EXT :: #type proc "system" (physicalDevice: PhysicalDevice, surface: SurfaceKHR, pSurfaceCapabilities: [^]SurfaceCapabilities2EXT) -> Result +ProcGetPhysicalDeviceSurfaceCapabilities2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pSurfaceInfo: ^PhysicalDeviceSurfaceInfo2KHR, pSurfaceCapabilities: [^]SurfaceCapabilities2KHR) -> Result +ProcGetPhysicalDeviceSurfaceCapabilitiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, surface: SurfaceKHR, pSurfaceCapabilities: [^]SurfaceCapabilitiesKHR) -> Result +ProcGetPhysicalDeviceSurfaceFormats2KHR :: #type proc "system" (physicalDevice: PhysicalDevice, pSurfaceInfo: ^PhysicalDeviceSurfaceInfo2KHR, pSurfaceFormatCount: ^u32, pSurfaceFormats: [^]SurfaceFormat2KHR) -> Result +ProcGetPhysicalDeviceSurfaceFormatsKHR :: #type proc "system" (physicalDevice: PhysicalDevice, surface: SurfaceKHR, pSurfaceFormatCount: ^u32, pSurfaceFormats: [^]SurfaceFormatKHR) -> Result +ProcGetPhysicalDeviceSurfacePresentModes2EXT :: #type proc "system" (physicalDevice: PhysicalDevice, pSurfaceInfo: ^PhysicalDeviceSurfaceInfo2KHR, pPresentModeCount: ^u32, pPresentModes: [^]PresentModeKHR) -> Result +ProcGetPhysicalDeviceSurfacePresentModesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, surface: SurfaceKHR, pPresentModeCount: ^u32, pPresentModes: [^]PresentModeKHR) -> Result +ProcGetPhysicalDeviceSurfaceSupportKHR :: #type proc "system" (physicalDevice: PhysicalDevice, queueFamilyIndex: u32, surface: SurfaceKHR, pSupported: ^b32) -> Result +ProcGetPhysicalDeviceToolProperties :: #type proc "system" (physicalDevice: PhysicalDevice, pToolCount: ^u32, pToolProperties: [^]PhysicalDeviceToolProperties) -> Result +ProcGetPhysicalDeviceToolPropertiesEXT :: #type proc "system" (physicalDevice: PhysicalDevice, pToolCount: ^u32, pToolProperties: [^]PhysicalDeviceToolProperties) -> Result +ProcGetPhysicalDeviceVideoCapabilitiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pVideoProfile: ^VideoProfileInfoKHR, pCapabilities: [^]VideoCapabilitiesKHR) -> Result +ProcGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pQualityLevelInfo: ^PhysicalDeviceVideoEncodeQualityLevelInfoKHR, pQualityLevelProperties: [^]VideoEncodeQualityLevelPropertiesKHR) -> Result +ProcGetPhysicalDeviceVideoFormatPropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pVideoFormatInfo: ^PhysicalDeviceVideoFormatInfoKHR, pVideoFormatPropertyCount: ^u32, pVideoFormatProperties: [^]VideoFormatPropertiesKHR) -> Result +ProcGetPhysicalDeviceWaylandPresentationSupportKHR :: #type proc "system" (physicalDevice: PhysicalDevice, queueFamilyIndex: u32, display: ^wl_display) -> b32 +ProcGetPhysicalDeviceWin32PresentationSupportKHR :: #type proc "system" (physicalDevice: PhysicalDevice, queueFamilyIndex: u32) -> b32 +ProcGetPhysicalDeviceXcbPresentationSupportKHR :: #type proc "system" (physicalDevice: PhysicalDevice, queueFamilyIndex: u32, connection: ^xcb_connection_t, visual_id: xcb_visualid_t) -> b32 +ProcGetPhysicalDeviceXlibPresentationSupportKHR :: #type proc "system" (physicalDevice: PhysicalDevice, queueFamilyIndex: u32, dpy: ^XlibDisplay, visualID: XlibVisualID) -> b32 +ProcGetWinrtDisplayNV :: #type proc "system" (physicalDevice: PhysicalDevice, deviceRelativeId: u32, pDisplay: ^DisplayKHR) -> Result +ProcReleaseDisplayEXT :: #type proc "system" (physicalDevice: PhysicalDevice, display: DisplayKHR) -> Result +ProcSubmitDebugUtilsMessageEXT :: #type proc "system" (instance: Instance, messageSeverity: DebugUtilsMessageSeverityFlagsEXT, messageTypes: DebugUtilsMessageTypeFlagsEXT, pCallbackData: ^DebugUtilsMessengerCallbackDataEXT) // Device Procedure Types ProcAcquireFullScreenExclusiveModeEXT :: #type proc "system" (device: Device, swapchain: SwapchainKHR) -> Result @@ -134,15 +143,23 @@ ProcBindAccelerationStructureMemoryNV :: #type proc "system ProcBindBufferMemory :: #type proc "system" (device: Device, buffer: Buffer, memory: DeviceMemory, memoryOffset: DeviceSize) -> Result ProcBindBufferMemory2 :: #type proc "system" (device: Device, bindInfoCount: u32, pBindInfos: [^]BindBufferMemoryInfo) -> Result ProcBindBufferMemory2KHR :: #type proc "system" (device: Device, bindInfoCount: u32, pBindInfos: [^]BindBufferMemoryInfo) -> Result +ProcBindDataGraphPipelineSessionMemoryARM :: #type proc "system" (device: Device, bindInfoCount: u32, pBindInfos: [^]BindDataGraphPipelineSessionMemoryInfoARM) -> Result ProcBindImageMemory :: #type proc "system" (device: Device, image: Image, memory: DeviceMemory, memoryOffset: DeviceSize) -> Result ProcBindImageMemory2 :: #type proc "system" (device: Device, bindInfoCount: u32, pBindInfos: [^]BindImageMemoryInfo) -> Result ProcBindImageMemory2KHR :: #type proc "system" (device: Device, bindInfoCount: u32, pBindInfos: [^]BindImageMemoryInfo) -> Result ProcBindOpticalFlowSessionImageNV :: #type proc "system" (device: Device, session: OpticalFlowSessionNV, bindingPoint: OpticalFlowSessionBindingPointNV, view: ImageView, layout: ImageLayout) -> Result +ProcBindTensorMemoryARM :: #type proc "system" (device: Device, bindInfoCount: u32, pBindInfos: [^]BindTensorMemoryInfoARM) -> Result ProcBindVideoSessionMemoryKHR :: #type proc "system" (device: Device, videoSession: VideoSessionKHR, bindSessionMemoryInfoCount: u32, pBindSessionMemoryInfos: [^]BindVideoSessionMemoryInfoKHR) -> Result ProcBuildAccelerationStructuresKHR :: #type proc "system" (device: Device, deferredOperation: DeferredOperationKHR, infoCount: u32, pInfos: [^]AccelerationStructureBuildGeometryInfoKHR, ppBuildRangeInfos: ^[^]AccelerationStructureBuildRangeInfoKHR) -> Result ProcBuildMicromapsEXT :: #type proc "system" (device: Device, deferredOperation: DeferredOperationKHR, infoCount: u32, pInfos: [^]MicromapBuildInfoEXT) -> Result +ProcClearShaderInstrumentationMetricsARM :: #type proc "system" (device: Device, instrumentation: ShaderInstrumentationARM) +ProcCmdBeginConditionalRendering2EXT :: #type proc "system" (commandBuffer: CommandBuffer, pConditionalRenderingBegin: ^ConditionalRenderingBeginInfo2EXT) ProcCmdBeginConditionalRenderingEXT :: #type proc "system" (commandBuffer: CommandBuffer, pConditionalRenderingBegin: ^ConditionalRenderingBeginInfoEXT) +ProcCmdBeginCustomResolveEXT :: #type proc "system" (commandBuffer: CommandBuffer, pBeginCustomResolveInfo: ^BeginCustomResolveInfoEXT) ProcCmdBeginDebugUtilsLabelEXT :: #type proc "system" (commandBuffer: CommandBuffer, pLabelInfo: ^DebugUtilsLabelEXT) +ProcCmdBeginGpaSampleAMD :: #type proc "system" (commandBuffer: CommandBuffer, gpaSession: GpaSessionAMD, pGpaSampleBeginInfo: ^GpaSampleBeginInfoAMD, pSampleID: ^u32) -> Result +ProcCmdBeginGpaSessionAMD :: #type proc "system" (commandBuffer: CommandBuffer, gpaSession: GpaSessionAMD) -> Result +ProcCmdBeginPerTileExecutionQCOM :: #type proc "system" (commandBuffer: CommandBuffer, pPerTileBeginInfo: ^PerTileBeginInfoQCOM) ProcCmdBeginQuery :: #type proc "system" (commandBuffer: CommandBuffer, queryPool: QueryPool, query: u32, flags: QueryControlFlags) ProcCmdBeginQueryIndexedEXT :: #type proc "system" (commandBuffer: CommandBuffer, queryPool: QueryPool, query: u32, flags: QueryControlFlags, index: u32) ProcCmdBeginRenderPass :: #type proc "system" (commandBuffer: CommandBuffer, pRenderPassBegin: ^RenderPassBeginInfo, contents: SubpassContents) @@ -150,6 +167,8 @@ ProcCmdBeginRenderPass2 :: #type proc "system ProcCmdBeginRenderPass2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pRenderPassBegin: ^RenderPassBeginInfo, pSubpassBeginInfo: ^SubpassBeginInfo) ProcCmdBeginRendering :: #type proc "system" (commandBuffer: CommandBuffer, pRenderingInfo: ^RenderingInfo) ProcCmdBeginRenderingKHR :: #type proc "system" (commandBuffer: CommandBuffer, pRenderingInfo: ^RenderingInfo) +ProcCmdBeginShaderInstrumentationARM :: #type proc "system" (commandBuffer: CommandBuffer, instrumentation: ShaderInstrumentationARM) +ProcCmdBeginTransformFeedback2EXT :: #type proc "system" (commandBuffer: CommandBuffer, firstCounterRange: u32, counterRangeCount: u32, pCounterInfos: [^]BindTransformFeedbackBuffer2InfoEXT) ProcCmdBeginTransformFeedbackEXT :: #type proc "system" (commandBuffer: CommandBuffer, firstCounterBuffer: u32, counterBufferCount: u32, pCounterBuffers: [^]Buffer, pCounterBufferOffsets: [^]DeviceSize) ProcCmdBeginVideoCodingKHR :: #type proc "system" (commandBuffer: CommandBuffer, pBeginInfo: ^VideoBeginCodingInfoKHR) ProcCmdBindDescriptorBufferEmbeddedSamplers2EXT :: #type proc "system" (commandBuffer: CommandBuffer, pBindDescriptorBufferEmbeddedSamplersInfo: ^BindDescriptorBufferEmbeddedSamplersInfoEXT) @@ -161,15 +180,21 @@ ProcCmdBindDescriptorSets2KHR :: #type proc "system ProcCmdBindIndexBuffer :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, indexType: IndexType) ProcCmdBindIndexBuffer2 :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, size: DeviceSize, indexType: IndexType) ProcCmdBindIndexBuffer2KHR :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, size: DeviceSize, indexType: IndexType) +ProcCmdBindIndexBuffer3KHR :: #type proc "system" (commandBuffer: CommandBuffer, pInfo: ^BindIndexBuffer3InfoKHR) ProcCmdBindInvocationMaskHUAWEI :: #type proc "system" (commandBuffer: CommandBuffer, imageView: ImageView, imageLayout: ImageLayout) ProcCmdBindPipeline :: #type proc "system" (commandBuffer: CommandBuffer, pipelineBindPoint: PipelineBindPoint, pipeline: Pipeline) ProcCmdBindPipelineShaderGroupNV :: #type proc "system" (commandBuffer: CommandBuffer, pipelineBindPoint: PipelineBindPoint, pipeline: Pipeline, groupIndex: u32) +ProcCmdBindResourceHeapEXT :: #type proc "system" (commandBuffer: CommandBuffer, pBindInfo: ^BindHeapInfoEXT) +ProcCmdBindSamplerHeapEXT :: #type proc "system" (commandBuffer: CommandBuffer, pBindInfo: ^BindHeapInfoEXT) ProcCmdBindShadersEXT :: #type proc "system" (commandBuffer: CommandBuffer, stageCount: u32, pStages: [^]ShaderStageFlags, pShaders: [^]ShaderEXT) ProcCmdBindShadingRateImageNV :: #type proc "system" (commandBuffer: CommandBuffer, imageView: ImageView, imageLayout: ImageLayout) +ProcCmdBindTileMemoryQCOM :: #type proc "system" (commandBuffer: CommandBuffer, pTileMemoryBindInfo: ^TileMemoryBindInfoQCOM) +ProcCmdBindTransformFeedbackBuffers2EXT :: #type proc "system" (commandBuffer: CommandBuffer, firstBinding: u32, bindingCount: u32, pBindingInfos: [^]BindTransformFeedbackBuffer2InfoEXT) ProcCmdBindTransformFeedbackBuffersEXT :: #type proc "system" (commandBuffer: CommandBuffer, firstBinding: u32, bindingCount: u32, pBuffers: [^]Buffer, pOffsets: [^]DeviceSize, pSizes: [^]DeviceSize) ProcCmdBindVertexBuffers :: #type proc "system" (commandBuffer: CommandBuffer, firstBinding: u32, bindingCount: u32, pBuffers: [^]Buffer, pOffsets: [^]DeviceSize) ProcCmdBindVertexBuffers2 :: #type proc "system" (commandBuffer: CommandBuffer, firstBinding: u32, bindingCount: u32, pBuffers: [^]Buffer, pOffsets: [^]DeviceSize, pSizes: [^]DeviceSize, pStrides: [^]DeviceSize) ProcCmdBindVertexBuffers2EXT :: #type proc "system" (commandBuffer: CommandBuffer, firstBinding: u32, bindingCount: u32, pBuffers: [^]Buffer, pOffsets: [^]DeviceSize, pSizes: [^]DeviceSize, pStrides: [^]DeviceSize) +ProcCmdBindVertexBuffers3KHR :: #type proc "system" (commandBuffer: CommandBuffer, firstBinding: u32, bindingCount: u32, pBindingInfos: [^]BindVertexBuffer3InfoKHR) ProcCmdBlitImage :: #type proc "system" (commandBuffer: CommandBuffer, srcImage: Image, srcImageLayout: ImageLayout, dstImage: Image, dstImageLayout: ImageLayout, regionCount: u32, pRegions: [^]ImageBlit, filter: Filter) ProcCmdBlitImage2 :: #type proc "system" (commandBuffer: CommandBuffer, pBlitImageInfo: ^BlitImageInfo2) ProcCmdBlitImage2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pBlitImageInfo: ^BlitImageInfo2) @@ -193,48 +218,68 @@ ProcCmdCopyBuffer2KHR :: #type proc "system ProcCmdCopyBufferToImage :: #type proc "system" (commandBuffer: CommandBuffer, srcBuffer: Buffer, dstImage: Image, dstImageLayout: ImageLayout, regionCount: u32, pRegions: [^]BufferImageCopy) ProcCmdCopyBufferToImage2 :: #type proc "system" (commandBuffer: CommandBuffer, pCopyBufferToImageInfo: ^CopyBufferToImageInfo2) ProcCmdCopyBufferToImage2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pCopyBufferToImageInfo: ^CopyBufferToImageInfo2) +ProcCmdCopyGpaSessionResultsAMD :: #type proc "system" (commandBuffer: CommandBuffer, gpaSession: GpaSessionAMD) ProcCmdCopyImage :: #type proc "system" (commandBuffer: CommandBuffer, srcImage: Image, srcImageLayout: ImageLayout, dstImage: Image, dstImageLayout: ImageLayout, regionCount: u32, pRegions: [^]ImageCopy) ProcCmdCopyImage2 :: #type proc "system" (commandBuffer: CommandBuffer, pCopyImageInfo: ^CopyImageInfo2) ProcCmdCopyImage2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pCopyImageInfo: ^CopyImageInfo2) ProcCmdCopyImageToBuffer :: #type proc "system" (commandBuffer: CommandBuffer, srcImage: Image, srcImageLayout: ImageLayout, dstBuffer: Buffer, regionCount: u32, pRegions: [^]BufferImageCopy) ProcCmdCopyImageToBuffer2 :: #type proc "system" (commandBuffer: CommandBuffer, pCopyImageToBufferInfo: ^CopyImageToBufferInfo2) ProcCmdCopyImageToBuffer2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pCopyImageToBufferInfo: ^CopyImageToBufferInfo2) +ProcCmdCopyImageToMemoryKHR :: #type proc "system" (commandBuffer: CommandBuffer, pCopyMemoryInfo: ^CopyDeviceMemoryImageInfoKHR) +ProcCmdCopyMemoryIndirectKHR :: #type proc "system" (commandBuffer: CommandBuffer, pCopyMemoryIndirectInfo: ^CopyMemoryIndirectInfoKHR) ProcCmdCopyMemoryIndirectNV :: #type proc "system" (commandBuffer: CommandBuffer, copyBufferAddress: DeviceAddress, copyCount: u32, stride: u32) +ProcCmdCopyMemoryKHR :: #type proc "system" (commandBuffer: CommandBuffer, pCopyMemoryInfo: ^CopyDeviceMemoryInfoKHR) ProcCmdCopyMemoryToAccelerationStructureKHR :: #type proc "system" (commandBuffer: CommandBuffer, pInfo: ^CopyMemoryToAccelerationStructureInfoKHR) +ProcCmdCopyMemoryToImageIndirectKHR :: #type proc "system" (commandBuffer: CommandBuffer, pCopyMemoryToImageIndirectInfo: ^CopyMemoryToImageIndirectInfoKHR) ProcCmdCopyMemoryToImageIndirectNV :: #type proc "system" (commandBuffer: CommandBuffer, copyBufferAddress: DeviceAddress, copyCount: u32, stride: u32, dstImage: Image, dstImageLayout: ImageLayout, pImageSubresources: [^]ImageSubresourceLayers) +ProcCmdCopyMemoryToImageKHR :: #type proc "system" (commandBuffer: CommandBuffer, pCopyMemoryInfo: ^CopyDeviceMemoryImageInfoKHR) ProcCmdCopyMemoryToMicromapEXT :: #type proc "system" (commandBuffer: CommandBuffer, pInfo: ^CopyMemoryToMicromapInfoEXT) ProcCmdCopyMicromapEXT :: #type proc "system" (commandBuffer: CommandBuffer, pInfo: ^CopyMicromapInfoEXT) ProcCmdCopyMicromapToMemoryEXT :: #type proc "system" (commandBuffer: CommandBuffer, pInfo: ^CopyMicromapToMemoryInfoEXT) ProcCmdCopyQueryPoolResults :: #type proc "system" (commandBuffer: CommandBuffer, queryPool: QueryPool, firstQuery: u32, queryCount: u32, dstBuffer: Buffer, dstOffset: DeviceSize, stride: DeviceSize, flags: QueryResultFlags) +ProcCmdCopyQueryPoolResultsToMemoryKHR :: #type proc "system" (commandBuffer: CommandBuffer, queryPool: QueryPool, firstQuery: u32, queryCount: u32, pDstRange: ^StridedDeviceAddressRangeKHR, dstFlags: AddressCommandFlagsKHR, queryResultFlags: QueryResultFlags) +ProcCmdCopyTensorARM :: #type proc "system" (commandBuffer: CommandBuffer, pCopyTensorInfo: ^CopyTensorInfoARM) ProcCmdCuLaunchKernelNVX :: #type proc "system" (commandBuffer: CommandBuffer, pLaunchInfo: ^CuLaunchInfoNVX) ProcCmdCudaLaunchKernelNV :: #type proc "system" (commandBuffer: CommandBuffer, pLaunchInfo: ^CudaLaunchInfoNV) ProcCmdDebugMarkerBeginEXT :: #type proc "system" (commandBuffer: CommandBuffer, pMarkerInfo: ^DebugMarkerMarkerInfoEXT) ProcCmdDebugMarkerEndEXT :: #type proc "system" (commandBuffer: CommandBuffer) ProcCmdDebugMarkerInsertEXT :: #type proc "system" (commandBuffer: CommandBuffer, pMarkerInfo: ^DebugMarkerMarkerInfoEXT) ProcCmdDecodeVideoKHR :: #type proc "system" (commandBuffer: CommandBuffer, pDecodeInfo: ^VideoDecodeInfoKHR) +ProcCmdDecompressMemoryEXT :: #type proc "system" (commandBuffer: CommandBuffer, pDecompressMemoryInfoEXT: ^DecompressMemoryInfoEXT) +ProcCmdDecompressMemoryIndirectCountEXT :: #type proc "system" (commandBuffer: CommandBuffer, decompressionMethod: MemoryDecompressionMethodFlagsEXT, indirectCommandsAddress: DeviceAddress, indirectCommandsCountAddress: DeviceAddress, maxDecompressionCount: u32, stride: u32) ProcCmdDecompressMemoryIndirectCountNV :: #type proc "system" (commandBuffer: CommandBuffer, indirectCommandsAddress: DeviceAddress, indirectCommandsCountAddress: DeviceAddress, stride: u32) ProcCmdDecompressMemoryNV :: #type proc "system" (commandBuffer: CommandBuffer, decompressRegionCount: u32, pDecompressMemoryRegions: [^]DecompressMemoryRegionNV) ProcCmdDispatch :: #type proc "system" (commandBuffer: CommandBuffer, groupCountX: u32, groupCountY: u32, groupCountZ: u32) ProcCmdDispatchBase :: #type proc "system" (commandBuffer: CommandBuffer, baseGroupX: u32, baseGroupY: u32, baseGroupZ: u32, groupCountX: u32, groupCountY: u32, groupCountZ: u32) ProcCmdDispatchBaseKHR :: #type proc "system" (commandBuffer: CommandBuffer, baseGroupX: u32, baseGroupY: u32, baseGroupZ: u32, groupCountX: u32, groupCountY: u32, groupCountZ: u32) +ProcCmdDispatchDataGraphARM :: #type proc "system" (commandBuffer: CommandBuffer, session: DataGraphPipelineSessionARM, pInfo: ^DataGraphPipelineDispatchInfoARM) ProcCmdDispatchGraphAMDX :: #type proc "system" (commandBuffer: CommandBuffer, scratch: DeviceAddress, scratchSize: DeviceSize, pCountInfo: ^DispatchGraphCountInfoAMDX) ProcCmdDispatchGraphIndirectAMDX :: #type proc "system" (commandBuffer: CommandBuffer, scratch: DeviceAddress, scratchSize: DeviceSize, pCountInfo: ^DispatchGraphCountInfoAMDX) ProcCmdDispatchGraphIndirectCountAMDX :: #type proc "system" (commandBuffer: CommandBuffer, scratch: DeviceAddress, scratchSize: DeviceSize, countInfo: DeviceAddress) ProcCmdDispatchIndirect :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize) +ProcCmdDispatchIndirect2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pInfo: ^DispatchIndirect2InfoKHR) +ProcCmdDispatchTileQCOM :: #type proc "system" (commandBuffer: CommandBuffer, pDispatchTileInfo: ^DispatchTileInfoQCOM) ProcCmdDraw :: #type proc "system" (commandBuffer: CommandBuffer, vertexCount: u32, instanceCount: u32, firstVertex: u32, firstInstance: u32) ProcCmdDrawClusterHUAWEI :: #type proc "system" (commandBuffer: CommandBuffer, groupCountX: u32, groupCountY: u32, groupCountZ: u32) ProcCmdDrawClusterIndirectHUAWEI :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize) ProcCmdDrawIndexed :: #type proc "system" (commandBuffer: CommandBuffer, indexCount: u32, instanceCount: u32, firstIndex: u32, vertexOffset: i32, firstInstance: u32) ProcCmdDrawIndexedIndirect :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, drawCount: u32, stride: u32) +ProcCmdDrawIndexedIndirect2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pInfo: ^DrawIndirect2InfoKHR) ProcCmdDrawIndexedIndirectCount :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, countBuffer: Buffer, countBufferOffset: DeviceSize, maxDrawCount: u32, stride: u32) +ProcCmdDrawIndexedIndirectCount2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pInfo: ^DrawIndirectCount2InfoKHR) ProcCmdDrawIndexedIndirectCountAMD :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, countBuffer: Buffer, countBufferOffset: DeviceSize, maxDrawCount: u32, stride: u32) ProcCmdDrawIndexedIndirectCountKHR :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, countBuffer: Buffer, countBufferOffset: DeviceSize, maxDrawCount: u32, stride: u32) ProcCmdDrawIndirect :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, drawCount: u32, stride: u32) +ProcCmdDrawIndirect2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pInfo: ^DrawIndirect2InfoKHR) +ProcCmdDrawIndirectByteCount2EXT :: #type proc "system" (commandBuffer: CommandBuffer, instanceCount: u32, firstInstance: u32, pCounterInfo: ^BindTransformFeedbackBuffer2InfoEXT, counterOffset: u32, vertexStride: u32) ProcCmdDrawIndirectByteCountEXT :: #type proc "system" (commandBuffer: CommandBuffer, instanceCount: u32, firstInstance: u32, counterBuffer: Buffer, counterBufferOffset: DeviceSize, counterOffset: u32, vertexStride: u32) ProcCmdDrawIndirectCount :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, countBuffer: Buffer, countBufferOffset: DeviceSize, maxDrawCount: u32, stride: u32) +ProcCmdDrawIndirectCount2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pInfo: ^DrawIndirectCount2InfoKHR) ProcCmdDrawIndirectCountAMD :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, countBuffer: Buffer, countBufferOffset: DeviceSize, maxDrawCount: u32, stride: u32) ProcCmdDrawIndirectCountKHR :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, countBuffer: Buffer, countBufferOffset: DeviceSize, maxDrawCount: u32, stride: u32) ProcCmdDrawMeshTasksEXT :: #type proc "system" (commandBuffer: CommandBuffer, groupCountX: u32, groupCountY: u32, groupCountZ: u32) +ProcCmdDrawMeshTasksIndirect2EXT :: #type proc "system" (commandBuffer: CommandBuffer, pInfo: ^DrawIndirect2InfoKHR) +ProcCmdDrawMeshTasksIndirectCount2EXT :: #type proc "system" (commandBuffer: CommandBuffer, pInfo: ^DrawIndirectCount2InfoKHR) ProcCmdDrawMeshTasksIndirectCountEXT :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, countBuffer: Buffer, countBufferOffset: DeviceSize, maxDrawCount: u32, stride: u32) ProcCmdDrawMeshTasksIndirectCountNV :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, countBuffer: Buffer, countBufferOffset: DeviceSize, maxDrawCount: u32, stride: u32) ProcCmdDrawMeshTasksIndirectEXT :: #type proc "system" (commandBuffer: CommandBuffer, buffer: Buffer, offset: DeviceSize, drawCount: u32, stride: u32) @@ -245,19 +290,27 @@ ProcCmdDrawMultiIndexedEXT :: #type proc "system ProcCmdEncodeVideoKHR :: #type proc "system" (commandBuffer: CommandBuffer, pEncodeInfo: ^VideoEncodeInfoKHR) ProcCmdEndConditionalRenderingEXT :: #type proc "system" (commandBuffer: CommandBuffer) ProcCmdEndDebugUtilsLabelEXT :: #type proc "system" (commandBuffer: CommandBuffer) +ProcCmdEndGpaSampleAMD :: #type proc "system" (commandBuffer: CommandBuffer, gpaSession: GpaSessionAMD, sampleID: u32) +ProcCmdEndGpaSessionAMD :: #type proc "system" (commandBuffer: CommandBuffer, gpaSession: GpaSessionAMD) -> Result +ProcCmdEndPerTileExecutionQCOM :: #type proc "system" (commandBuffer: CommandBuffer, pPerTileEndInfo: ^PerTileEndInfoQCOM) ProcCmdEndQuery :: #type proc "system" (commandBuffer: CommandBuffer, queryPool: QueryPool, query: u32) ProcCmdEndQueryIndexedEXT :: #type proc "system" (commandBuffer: CommandBuffer, queryPool: QueryPool, query: u32, index: u32) ProcCmdEndRenderPass :: #type proc "system" (commandBuffer: CommandBuffer) ProcCmdEndRenderPass2 :: #type proc "system" (commandBuffer: CommandBuffer, pSubpassEndInfo: ^SubpassEndInfo) ProcCmdEndRenderPass2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pSubpassEndInfo: ^SubpassEndInfo) ProcCmdEndRendering :: #type proc "system" (commandBuffer: CommandBuffer) +ProcCmdEndRendering2EXT :: #type proc "system" (commandBuffer: CommandBuffer, pRenderingEndInfo: ^RenderingEndInfoKHR) +ProcCmdEndRendering2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pRenderingEndInfo: ^RenderingEndInfoKHR) ProcCmdEndRenderingKHR :: #type proc "system" (commandBuffer: CommandBuffer) +ProcCmdEndShaderInstrumentationARM :: #type proc "system" (commandBuffer: CommandBuffer) +ProcCmdEndTransformFeedback2EXT :: #type proc "system" (commandBuffer: CommandBuffer, firstCounterRange: u32, counterRangeCount: u32, pCounterInfos: [^]BindTransformFeedbackBuffer2InfoEXT) ProcCmdEndTransformFeedbackEXT :: #type proc "system" (commandBuffer: CommandBuffer, firstCounterBuffer: u32, counterBufferCount: u32, pCounterBuffers: [^]Buffer, pCounterBufferOffsets: [^]DeviceSize) ProcCmdEndVideoCodingKHR :: #type proc "system" (commandBuffer: CommandBuffer, pEndCodingInfo: ^VideoEndCodingInfoKHR) ProcCmdExecuteCommands :: #type proc "system" (commandBuffer: CommandBuffer, commandBufferCount: u32, pCommandBuffers: [^]CommandBuffer) ProcCmdExecuteGeneratedCommandsEXT :: #type proc "system" (commandBuffer: CommandBuffer, isPreprocessed: b32, pGeneratedCommandsInfo: ^GeneratedCommandsInfoEXT) ProcCmdExecuteGeneratedCommandsNV :: #type proc "system" (commandBuffer: CommandBuffer, isPreprocessed: b32, pGeneratedCommandsInfo: ^GeneratedCommandsInfoNV) ProcCmdFillBuffer :: #type proc "system" (commandBuffer: CommandBuffer, dstBuffer: Buffer, dstOffset: DeviceSize, size: DeviceSize, data: u32) +ProcCmdFillMemoryKHR :: #type proc "system" (commandBuffer: CommandBuffer, pDstRange: ^DeviceAddressRangeKHR, dstFlags: AddressCommandFlagsKHR, data: u32) ProcCmdInitializeGraphScratchMemoryAMDX :: #type proc "system" (commandBuffer: CommandBuffer, executionGraph: Pipeline, scratch: DeviceAddress, scratchSize: DeviceSize) ProcCmdInsertDebugUtilsLabelEXT :: #type proc "system" (commandBuffer: CommandBuffer, pLabelInfo: ^DebugUtilsLabelEXT) ProcCmdNextSubpass :: #type proc "system" (commandBuffer: CommandBuffer, contents: SubpassContents) @@ -272,6 +325,7 @@ ProcCmdPreprocessGeneratedCommandsNV :: #type proc "system ProcCmdPushConstants :: #type proc "system" (commandBuffer: CommandBuffer, layout: PipelineLayout, stageFlags: ShaderStageFlags, offset: u32, size: u32, pValues: rawptr) ProcCmdPushConstants2 :: #type proc "system" (commandBuffer: CommandBuffer, pPushConstantsInfo: ^PushConstantsInfo) ProcCmdPushConstants2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pPushConstantsInfo: ^PushConstantsInfo) +ProcCmdPushDataEXT :: #type proc "system" (commandBuffer: CommandBuffer, pPushDataInfo: ^PushDataInfoEXT) ProcCmdPushDescriptorSet :: #type proc "system" (commandBuffer: CommandBuffer, pipelineBindPoint: PipelineBindPoint, layout: PipelineLayout, set: u32, descriptorWriteCount: u32, pDescriptorWrites: [^]WriteDescriptorSet) ProcCmdPushDescriptorSet2 :: #type proc "system" (commandBuffer: CommandBuffer, pPushDescriptorSetInfo: ^PushDescriptorSetInfo) ProcCmdPushDescriptorSet2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pPushDescriptorSetInfo: ^PushDescriptorSetInfo) @@ -296,7 +350,9 @@ ProcCmdSetCoarseSampleOrderNV :: #type proc "system ProcCmdSetColorBlendAdvancedEXT :: #type proc "system" (commandBuffer: CommandBuffer, firstAttachment: u32, attachmentCount: u32, pColorBlendAdvanced: ^ColorBlendAdvancedEXT) ProcCmdSetColorBlendEnableEXT :: #type proc "system" (commandBuffer: CommandBuffer, firstAttachment: u32, attachmentCount: u32, pColorBlendEnables: [^]b32) ProcCmdSetColorBlendEquationEXT :: #type proc "system" (commandBuffer: CommandBuffer, firstAttachment: u32, attachmentCount: u32, pColorBlendEquations: [^]ColorBlendEquationEXT) +ProcCmdSetColorWriteEnableEXT :: #type proc "system" (commandBuffer: CommandBuffer, attachmentCount: u32, pColorWriteEnables: [^]b32) ProcCmdSetColorWriteMaskEXT :: #type proc "system" (commandBuffer: CommandBuffer, firstAttachment: u32, attachmentCount: u32, pColorWriteMasks: [^]ColorComponentFlags) +ProcCmdSetComputeOccupancyPriorityNV :: #type proc "system" (commandBuffer: CommandBuffer, pParameters: [^]ComputeOccupancyPriorityParametersNV) ProcCmdSetConservativeRasterizationModeEXT :: #type proc "system" (commandBuffer: CommandBuffer, conservativeRasterizationMode: ConservativeRasterizationModeEXT) ProcCmdSetCoverageModulationModeNV :: #type proc "system" (commandBuffer: CommandBuffer, coverageModulationMode: CoverageModulationModeNV) ProcCmdSetCoverageModulationTableEnableNV :: #type proc "system" (commandBuffer: CommandBuffer, coverageModulationTableEnable: b32) @@ -330,6 +386,7 @@ ProcCmdSetDeviceMaskKHR :: #type proc "system ProcCmdSetDiscardRectangleEXT :: #type proc "system" (commandBuffer: CommandBuffer, firstDiscardRectangle: u32, discardRectangleCount: u32, pDiscardRectangles: [^]Rect2D) ProcCmdSetDiscardRectangleEnableEXT :: #type proc "system" (commandBuffer: CommandBuffer, discardRectangleEnable: b32) ProcCmdSetDiscardRectangleModeEXT :: #type proc "system" (commandBuffer: CommandBuffer, discardRectangleMode: DiscardRectangleModeEXT) +ProcCmdSetDispatchParametersARM :: #type proc "system" (commandBuffer: CommandBuffer, pDispatchParameters: [^]DispatchParametersARM) ProcCmdSetEvent :: #type proc "system" (commandBuffer: CommandBuffer, event: Event, stageMask: PipelineStageFlags) ProcCmdSetEvent2 :: #type proc "system" (commandBuffer: CommandBuffer, event: Event, pDependencyInfo: ^DependencyInfo) ProcCmdSetEvent2KHR :: #type proc "system" (commandBuffer: CommandBuffer, event: Event, pDependencyInfo: ^DependencyInfo) @@ -355,6 +412,7 @@ ProcCmdSetPerformanceStreamMarkerINTEL :: #type proc "system ProcCmdSetPolygonModeEXT :: #type proc "system" (commandBuffer: CommandBuffer, polygonMode: PolygonMode) ProcCmdSetPrimitiveRestartEnable :: #type proc "system" (commandBuffer: CommandBuffer, primitiveRestartEnable: b32) ProcCmdSetPrimitiveRestartEnableEXT :: #type proc "system" (commandBuffer: CommandBuffer, primitiveRestartEnable: b32) +ProcCmdSetPrimitiveRestartIndexEXT :: #type proc "system" (commandBuffer: CommandBuffer, primitiveRestartIndex: u32) ProcCmdSetPrimitiveTopology :: #type proc "system" (commandBuffer: CommandBuffer, primitiveTopology: PrimitiveTopology) ProcCmdSetPrimitiveTopologyEXT :: #type proc "system" (commandBuffer: CommandBuffer, primitiveTopology: PrimitiveTopology) ProcCmdSetProvokingVertexModeEXT :: #type proc "system" (commandBuffer: CommandBuffer, provokingVertexMode: ProvokingVertexModeEXT) @@ -397,6 +455,7 @@ ProcCmdTraceRaysIndirectKHR :: #type proc "system ProcCmdTraceRaysKHR :: #type proc "system" (commandBuffer: CommandBuffer, pRaygenShaderBindingTable: [^]StridedDeviceAddressRegionKHR, pMissShaderBindingTable: [^]StridedDeviceAddressRegionKHR, pHitShaderBindingTable: [^]StridedDeviceAddressRegionKHR, pCallableShaderBindingTable: [^]StridedDeviceAddressRegionKHR, width: u32, height: u32, depth: u32) ProcCmdTraceRaysNV :: #type proc "system" (commandBuffer: CommandBuffer, raygenShaderBindingTableBuffer: Buffer, raygenShaderBindingOffset: DeviceSize, missShaderBindingTableBuffer: Buffer, missShaderBindingOffset: DeviceSize, missShaderBindingStride: DeviceSize, hitShaderBindingTableBuffer: Buffer, hitShaderBindingOffset: DeviceSize, hitShaderBindingStride: DeviceSize, callableShaderBindingTableBuffer: Buffer, callableShaderBindingOffset: DeviceSize, callableShaderBindingStride: DeviceSize, width: u32, height: u32, depth: u32) ProcCmdUpdateBuffer :: #type proc "system" (commandBuffer: CommandBuffer, dstBuffer: Buffer, dstOffset: DeviceSize, dataSize: DeviceSize, pData: rawptr) +ProcCmdUpdateMemoryKHR :: #type proc "system" (commandBuffer: CommandBuffer, pDstRange: ^DeviceAddressRangeKHR, dstFlags: AddressCommandFlagsKHR, dataSize: DeviceSize, pData: rawptr) ProcCmdUpdatePipelineIndirectBufferNV :: #type proc "system" (commandBuffer: CommandBuffer, pipelineBindPoint: PipelineBindPoint, pipeline: Pipeline) ProcCmdWaitEvents :: #type proc "system" (commandBuffer: CommandBuffer, eventCount: u32, pEvents: [^]Event, srcStageMask: PipelineStageFlags, dstStageMask: PipelineStageFlags, memoryBarrierCount: u32, pMemoryBarriers: [^]MemoryBarrier, bufferMemoryBarrierCount: u32, pBufferMemoryBarriers: [^]BufferMemoryBarrier, imageMemoryBarrierCount: u32, pImageMemoryBarriers: [^]ImageMemoryBarrier) ProcCmdWaitEvents2 :: #type proc "system" (commandBuffer: CommandBuffer, eventCount: u32, pEvents: [^]Event, pDependencyInfos: [^]DependencyInfo) @@ -405,6 +464,7 @@ ProcCmdWriteAccelerationStructuresPropertiesKHR :: #type proc "system ProcCmdWriteAccelerationStructuresPropertiesNV :: #type proc "system" (commandBuffer: CommandBuffer, accelerationStructureCount: u32, pAccelerationStructures: [^]AccelerationStructureNV, queryType: QueryType, queryPool: QueryPool, firstQuery: u32) ProcCmdWriteBufferMarker2AMD :: #type proc "system" (commandBuffer: CommandBuffer, stage: PipelineStageFlags2, dstBuffer: Buffer, dstOffset: DeviceSize, marker: u32) ProcCmdWriteBufferMarkerAMD :: #type proc "system" (commandBuffer: CommandBuffer, pipelineStage: PipelineStageFlags, dstBuffer: Buffer, dstOffset: DeviceSize, marker: u32) +ProcCmdWriteMarkerToMemoryAMD :: #type proc "system" (commandBuffer: CommandBuffer, pInfo: ^MemoryMarkerInfoAMD) ProcCmdWriteMicromapsPropertiesEXT :: #type proc "system" (commandBuffer: CommandBuffer, micromapCount: u32, pMicromaps: [^]MicromapEXT, queryType: QueryType, queryPool: QueryPool, firstQuery: u32) ProcCmdWriteTimestamp :: #type proc "system" (commandBuffer: CommandBuffer, pipelineStage: PipelineStageFlags, queryPool: QueryPool, query: u32) ProcCmdWriteTimestamp2 :: #type proc "system" (commandBuffer: CommandBuffer, stage: PipelineStageFlags2, queryPool: QueryPool, query: u32) @@ -423,6 +483,7 @@ ProcCopyMemoryToImageEXT :: #type proc "system ProcCopyMemoryToMicromapEXT :: #type proc "system" (device: Device, deferredOperation: DeferredOperationKHR, pInfo: ^CopyMemoryToMicromapInfoEXT) -> Result ProcCopyMicromapEXT :: #type proc "system" (device: Device, deferredOperation: DeferredOperationKHR, pInfo: ^CopyMicromapInfoEXT) -> Result ProcCopyMicromapToMemoryEXT :: #type proc "system" (device: Device, deferredOperation: DeferredOperationKHR, pInfo: ^CopyMicromapToMemoryInfoEXT) -> Result +ProcCreateAccelerationStructure2KHR :: #type proc "system" (device: Device, pCreateInfo: ^AccelerationStructureCreateInfo2KHR, pAllocator: ^AllocationCallbacks, pAccelerationStructure: ^AccelerationStructureKHR) -> Result ProcCreateAccelerationStructureKHR :: #type proc "system" (device: Device, pCreateInfo: ^AccelerationStructureCreateInfoKHR, pAllocator: ^AllocationCallbacks, pAccelerationStructure: ^AccelerationStructureKHR) -> Result ProcCreateAccelerationStructureNV :: #type proc "system" (device: Device, pCreateInfo: ^AccelerationStructureCreateInfoNV, pAllocator: ^AllocationCallbacks, pAccelerationStructure: ^AccelerationStructureNV) -> Result ProcCreateBuffer :: #type proc "system" (device: Device, pCreateInfo: ^BufferCreateInfo, pAllocator: ^AllocationCallbacks, pBuffer: ^Buffer) -> Result @@ -433,6 +494,8 @@ ProcCreateCuFunctionNVX :: #type proc "system ProcCreateCuModuleNVX :: #type proc "system" (device: Device, pCreateInfo: ^CuModuleCreateInfoNVX, pAllocator: ^AllocationCallbacks, pModule: ^CuModuleNVX) -> Result ProcCreateCudaFunctionNV :: #type proc "system" (device: Device, pCreateInfo: ^CudaFunctionCreateInfoNV, pAllocator: ^AllocationCallbacks, pFunction: ^CudaFunctionNV) -> Result ProcCreateCudaModuleNV :: #type proc "system" (device: Device, pCreateInfo: ^CudaModuleCreateInfoNV, pAllocator: ^AllocationCallbacks, pModule: ^CudaModuleNV) -> Result +ProcCreateDataGraphPipelineSessionARM :: #type proc "system" (device: Device, pCreateInfo: ^DataGraphPipelineSessionCreateInfoARM, pAllocator: ^AllocationCallbacks, pSession: ^DataGraphPipelineSessionARM) -> Result +ProcCreateDataGraphPipelinesARM :: #type proc "system" (device: Device, deferredOperation: DeferredOperationKHR, pipelineCache: PipelineCache, createInfoCount: u32, pCreateInfos: [^]DataGraphPipelineCreateInfoARM, pAllocator: ^AllocationCallbacks, pPipelines: [^]Pipeline) -> Result ProcCreateDeferredOperationKHR :: #type proc "system" (device: Device, pAllocator: ^AllocationCallbacks, pDeferredOperation: ^DeferredOperationKHR) -> Result ProcCreateDescriptorPool :: #type proc "system" (device: Device, pCreateInfo: ^DescriptorPoolCreateInfo, pAllocator: ^AllocationCallbacks, pDescriptorPool: ^DescriptorPool) -> Result ProcCreateDescriptorSetLayout :: #type proc "system" (device: Device, pCreateInfo: ^DescriptorSetLayoutCreateInfo, pAllocator: ^AllocationCallbacks, pSetLayout: ^DescriptorSetLayout) -> Result @@ -440,8 +503,10 @@ ProcCreateDescriptorUpdateTemplate :: #type proc "system ProcCreateDescriptorUpdateTemplateKHR :: #type proc "system" (device: Device, pCreateInfo: ^DescriptorUpdateTemplateCreateInfo, pAllocator: ^AllocationCallbacks, pDescriptorUpdateTemplate: ^DescriptorUpdateTemplate) -> Result ProcCreateEvent :: #type proc "system" (device: Device, pCreateInfo: ^EventCreateInfo, pAllocator: ^AllocationCallbacks, pEvent: ^Event) -> Result ProcCreateExecutionGraphPipelinesAMDX :: #type proc "system" (device: Device, pipelineCache: PipelineCache, createInfoCount: u32, pCreateInfos: [^]ExecutionGraphPipelineCreateInfoAMDX, pAllocator: ^AllocationCallbacks, pPipelines: [^]Pipeline) -> Result +ProcCreateExternalComputeQueueNV :: #type proc "system" (device: Device, pCreateInfo: ^ExternalComputeQueueCreateInfoNV, pAllocator: ^AllocationCallbacks, pExternalQueue: ^ExternalComputeQueueNV) -> Result ProcCreateFence :: #type proc "system" (device: Device, pCreateInfo: ^FenceCreateInfo, pAllocator: ^AllocationCallbacks, pFence: ^Fence) -> Result ProcCreateFramebuffer :: #type proc "system" (device: Device, pCreateInfo: ^FramebufferCreateInfo, pAllocator: ^AllocationCallbacks, pFramebuffer: ^Framebuffer) -> Result +ProcCreateGpaSessionAMD :: #type proc "system" (device: Device, pCreateInfo: ^GpaSessionCreateInfoAMD, pAllocator: ^AllocationCallbacks, pGpaSession: ^GpaSessionAMD) -> Result ProcCreateGraphicsPipelines :: #type proc "system" (device: Device, pipelineCache: PipelineCache, createInfoCount: u32, pCreateInfos: [^]GraphicsPipelineCreateInfo, pAllocator: ^AllocationCallbacks, pPipelines: [^]Pipeline) -> Result ProcCreateImage :: #type proc "system" (device: Device, pCreateInfo: ^ImageCreateInfo, pAllocator: ^AllocationCallbacks, pImage: ^Image) -> Result ProcCreateImageView :: #type proc "system" (device: Device, pCreateInfo: ^ImageViewCreateInfo, pAllocator: ^AllocationCallbacks, pView: ^ImageView) -> Result @@ -465,10 +530,13 @@ ProcCreateSampler :: #type proc "system ProcCreateSamplerYcbcrConversion :: #type proc "system" (device: Device, pCreateInfo: ^SamplerYcbcrConversionCreateInfo, pAllocator: ^AllocationCallbacks, pYcbcrConversion: ^SamplerYcbcrConversion) -> Result ProcCreateSamplerYcbcrConversionKHR :: #type proc "system" (device: Device, pCreateInfo: ^SamplerYcbcrConversionCreateInfo, pAllocator: ^AllocationCallbacks, pYcbcrConversion: ^SamplerYcbcrConversion) -> Result ProcCreateSemaphore :: #type proc "system" (device: Device, pCreateInfo: ^SemaphoreCreateInfo, pAllocator: ^AllocationCallbacks, pSemaphore: ^Semaphore) -> Result +ProcCreateShaderInstrumentationARM :: #type proc "system" (device: Device, pCreateInfo: ^ShaderInstrumentationCreateInfoARM, pAllocator: ^AllocationCallbacks, pInstrumentation: ^ShaderInstrumentationARM) -> Result ProcCreateShaderModule :: #type proc "system" (device: Device, pCreateInfo: ^ShaderModuleCreateInfo, pAllocator: ^AllocationCallbacks, pShaderModule: ^ShaderModule) -> Result ProcCreateShadersEXT :: #type proc "system" (device: Device, createInfoCount: u32, pCreateInfos: [^]ShaderCreateInfoEXT, pAllocator: ^AllocationCallbacks, pShaders: [^]ShaderEXT) -> Result ProcCreateSharedSwapchainsKHR :: #type proc "system" (device: Device, swapchainCount: u32, pCreateInfos: [^]SwapchainCreateInfoKHR, pAllocator: ^AllocationCallbacks, pSwapchains: [^]SwapchainKHR) -> Result ProcCreateSwapchainKHR :: #type proc "system" (device: Device, pCreateInfo: ^SwapchainCreateInfoKHR, pAllocator: ^AllocationCallbacks, pSwapchain: ^SwapchainKHR) -> Result +ProcCreateTensorARM :: #type proc "system" (device: Device, pCreateInfo: ^TensorCreateInfoARM, pAllocator: ^AllocationCallbacks, pTensor: ^TensorARM) -> Result +ProcCreateTensorViewARM :: #type proc "system" (device: Device, pCreateInfo: ^TensorViewCreateInfoARM, pAllocator: ^AllocationCallbacks, pView: ^TensorViewARM) -> Result ProcCreateValidationCacheEXT :: #type proc "system" (device: Device, pCreateInfo: ^ValidationCacheCreateInfoEXT, pAllocator: ^AllocationCallbacks, pValidationCache: ^ValidationCacheEXT) -> Result ProcCreateVideoSessionKHR :: #type proc "system" (device: Device, pCreateInfo: ^VideoSessionCreateInfoKHR, pAllocator: ^AllocationCallbacks, pVideoSession: ^VideoSessionKHR) -> Result ProcCreateVideoSessionParametersKHR :: #type proc "system" (device: Device, pCreateInfo: ^VideoSessionParametersCreateInfoKHR, pAllocator: ^AllocationCallbacks, pVideoSessionParameters: [^]VideoSessionParametersKHR) -> Result @@ -484,6 +552,7 @@ ProcDestroyCuFunctionNVX :: #type proc "system ProcDestroyCuModuleNVX :: #type proc "system" (device: Device, module: CuModuleNVX, pAllocator: ^AllocationCallbacks) ProcDestroyCudaFunctionNV :: #type proc "system" (device: Device, function: CudaFunctionNV, pAllocator: ^AllocationCallbacks) ProcDestroyCudaModuleNV :: #type proc "system" (device: Device, module: CudaModuleNV, pAllocator: ^AllocationCallbacks) +ProcDestroyDataGraphPipelineSessionARM :: #type proc "system" (device: Device, session: DataGraphPipelineSessionARM, pAllocator: ^AllocationCallbacks) ProcDestroyDeferredOperationKHR :: #type proc "system" (device: Device, operation: DeferredOperationKHR, pAllocator: ^AllocationCallbacks) ProcDestroyDescriptorPool :: #type proc "system" (device: Device, descriptorPool: DescriptorPool, pAllocator: ^AllocationCallbacks) ProcDestroyDescriptorSetLayout :: #type proc "system" (device: Device, descriptorSetLayout: DescriptorSetLayout, pAllocator: ^AllocationCallbacks) @@ -491,8 +560,10 @@ ProcDestroyDescriptorUpdateTemplate :: #type proc "system ProcDestroyDescriptorUpdateTemplateKHR :: #type proc "system" (device: Device, descriptorUpdateTemplate: DescriptorUpdateTemplate, pAllocator: ^AllocationCallbacks) ProcDestroyDevice :: #type proc "system" (device: Device, pAllocator: ^AllocationCallbacks) ProcDestroyEvent :: #type proc "system" (device: Device, event: Event, pAllocator: ^AllocationCallbacks) +ProcDestroyExternalComputeQueueNV :: #type proc "system" (device: Device, externalQueue: ExternalComputeQueueNV, pAllocator: ^AllocationCallbacks) ProcDestroyFence :: #type proc "system" (device: Device, fence: Fence, pAllocator: ^AllocationCallbacks) ProcDestroyFramebuffer :: #type proc "system" (device: Device, framebuffer: Framebuffer, pAllocator: ^AllocationCallbacks) +ProcDestroyGpaSessionAMD :: #type proc "system" (device: Device, gpaSession: GpaSessionAMD, pAllocator: ^AllocationCallbacks) ProcDestroyImage :: #type proc "system" (device: Device, image: Image, pAllocator: ^AllocationCallbacks) ProcDestroyImageView :: #type proc "system" (device: Device, imageView: ImageView, pAllocator: ^AllocationCallbacks) ProcDestroyIndirectCommandsLayoutEXT :: #type proc "system" (device: Device, indirectCommandsLayout: IndirectCommandsLayoutEXT, pAllocator: ^AllocationCallbacks) @@ -513,8 +584,11 @@ ProcDestroySamplerYcbcrConversion :: #type proc "system ProcDestroySamplerYcbcrConversionKHR :: #type proc "system" (device: Device, ycbcrConversion: SamplerYcbcrConversion, pAllocator: ^AllocationCallbacks) ProcDestroySemaphore :: #type proc "system" (device: Device, semaphore: Semaphore, pAllocator: ^AllocationCallbacks) ProcDestroyShaderEXT :: #type proc "system" (device: Device, shader: ShaderEXT, pAllocator: ^AllocationCallbacks) +ProcDestroyShaderInstrumentationARM :: #type proc "system" (device: Device, instrumentation: ShaderInstrumentationARM, pAllocator: ^AllocationCallbacks) ProcDestroyShaderModule :: #type proc "system" (device: Device, shaderModule: ShaderModule, pAllocator: ^AllocationCallbacks) ProcDestroySwapchainKHR :: #type proc "system" (device: Device, swapchain: SwapchainKHR, pAllocator: ^AllocationCallbacks) +ProcDestroyTensorARM :: #type proc "system" (device: Device, tensor: TensorARM, pAllocator: ^AllocationCallbacks) +ProcDestroyTensorViewARM :: #type proc "system" (device: Device, tensorView: TensorViewARM, pAllocator: ^AllocationCallbacks) ProcDestroyValidationCacheEXT :: #type proc "system" (device: Device, validationCache: ValidationCacheEXT, pAllocator: ^AllocationCallbacks) ProcDestroyVideoSessionKHR :: #type proc "system" (device: Device, videoSession: VideoSessionKHR, pAllocator: ^AllocationCallbacks) ProcDestroyVideoSessionParametersKHR :: #type proc "system" (device: Device, videoSessionParameters: VideoSessionParametersKHR, pAllocator: ^AllocationCallbacks) @@ -529,7 +603,7 @@ ProcFreeMemory :: #type proc "system ProcGetAccelerationStructureBuildSizesKHR :: #type proc "system" (device: Device, buildType: AccelerationStructureBuildTypeKHR, pBuildInfo: ^AccelerationStructureBuildGeometryInfoKHR, pMaxPrimitiveCounts: [^]u32, pSizeInfo: ^AccelerationStructureBuildSizesInfoKHR) ProcGetAccelerationStructureDeviceAddressKHR :: #type proc "system" (device: Device, pInfo: ^AccelerationStructureDeviceAddressInfoKHR) -> DeviceAddress ProcGetAccelerationStructureHandleNV :: #type proc "system" (device: Device, accelerationStructure: AccelerationStructureNV, dataSize: int, pData: rawptr) -> Result -ProcGetAccelerationStructureMemoryRequirementsNV :: #type proc "system" (device: Device, pInfo: ^AccelerationStructureMemoryRequirementsInfoNV, pMemoryRequirements: [^]MemoryRequirements2KHR) +ProcGetAccelerationStructureMemoryRequirementsNV :: #type proc "system" (device: Device, pInfo: ^AccelerationStructureMemoryRequirementsInfoNV, pMemoryRequirements: [^]MemoryRequirements2) ProcGetAccelerationStructureOpaqueCaptureDescriptorDataEXT :: #type proc "system" (device: Device, pInfo: ^AccelerationStructureCaptureDescriptorDataInfoEXT, pData: rawptr) -> Result ProcGetBufferDeviceAddress :: #type proc "system" (device: Device, pInfo: ^BufferDeviceAddressInfo) -> DeviceAddress ProcGetBufferDeviceAddressEXT :: #type proc "system" (device: Device, pInfo: ^BufferDeviceAddressInfo) -> DeviceAddress @@ -544,6 +618,10 @@ ProcGetCalibratedTimestampsEXT :: #type proc "system ProcGetCalibratedTimestampsKHR :: #type proc "system" (device: Device, timestampCount: u32, pTimestampInfos: [^]CalibratedTimestampInfoKHR, pTimestamps: [^]u64, pMaxDeviation: ^u64) -> Result ProcGetClusterAccelerationStructureBuildSizesNV :: #type proc "system" (device: Device, pInfo: ^ClusterAccelerationStructureInputInfoNV, pSizeInfo: ^AccelerationStructureBuildSizesInfoKHR) ProcGetCudaModuleCacheNV :: #type proc "system" (device: Device, module: CudaModuleNV, pCacheSize: ^int, pCacheData: rawptr) -> Result +ProcGetDataGraphPipelineAvailablePropertiesARM :: #type proc "system" (device: Device, pPipelineInfo: ^DataGraphPipelineInfoARM, pPropertiesCount: ^u32, pProperties: [^]DataGraphPipelinePropertyARM) -> Result +ProcGetDataGraphPipelinePropertiesARM :: #type proc "system" (device: Device, pPipelineInfo: ^DataGraphPipelineInfoARM, propertiesCount: u32, pProperties: [^]DataGraphPipelinePropertyQueryResultARM) -> Result +ProcGetDataGraphPipelineSessionBindPointRequirementsARM :: #type proc "system" (device: Device, pInfo: ^DataGraphPipelineSessionBindPointRequirementsInfoARM, pBindPointRequirementCount: ^u32, pBindPointRequirements: [^]DataGraphPipelineSessionBindPointRequirementARM) -> Result +ProcGetDataGraphPipelineSessionMemoryRequirementsARM :: #type proc "system" (device: Device, pInfo: ^DataGraphPipelineSessionMemoryRequirementsInfoARM, pMemoryRequirements: [^]MemoryRequirements2) ProcGetDeferredOperationMaxConcurrencyKHR :: #type proc "system" (device: Device, operation: DeferredOperationKHR) -> u32 ProcGetDeferredOperationResultKHR :: #type proc "system" (device: Device, operation: DeferredOperationKHR) -> Result ProcGetDescriptorEXT :: #type proc "system" (device: Device, pDescriptorInfo: ^DescriptorGetInfoEXT, dataSize: int, pDescriptor: rawptr) @@ -556,7 +634,10 @@ ProcGetDescriptorSetLayoutSupportKHR :: #type proc "system ProcGetDeviceAccelerationStructureCompatibilityKHR :: #type proc "system" (device: Device, pVersionInfo: ^AccelerationStructureVersionInfoKHR, pCompatibility: ^AccelerationStructureCompatibilityKHR) ProcGetDeviceBufferMemoryRequirements :: #type proc "system" (device: Device, pInfo: ^DeviceBufferMemoryRequirements, pMemoryRequirements: [^]MemoryRequirements2) ProcGetDeviceBufferMemoryRequirementsKHR :: #type proc "system" (device: Device, pInfo: ^DeviceBufferMemoryRequirements, pMemoryRequirements: [^]MemoryRequirements2) +ProcGetDeviceCombinedImageSamplerIndexNVX :: #type proc "system" (device: Device, imageViewIndex: u64, samplerIndex: u64) -> u64 +ProcGetDeviceFaultDebugInfoKHR :: #type proc "system" (device: Device, pDebugInfo: ^DeviceFaultDebugInfoKHR) -> Result ProcGetDeviceFaultInfoEXT :: #type proc "system" (device: Device, pFaultCounts: [^]DeviceFaultCountsEXT, pFaultInfo: ^DeviceFaultInfoEXT) -> Result +ProcGetDeviceFaultReportsKHR :: #type proc "system" (device: Device, timeout: u64, pFaultCounts: [^]u32, pFaultInfo: ^DeviceFaultInfoKHR) -> Result ProcGetDeviceGroupPeerMemoryFeatures :: #type proc "system" (device: Device, heapIndex: u32, localDeviceIndex: u32, remoteDeviceIndex: u32, pPeerMemoryFeatures: [^]PeerMemoryFeatureFlags) ProcGetDeviceGroupPeerMemoryFeaturesKHR :: #type proc "system" (device: Device, heapIndex: u32, localDeviceIndex: u32, remoteDeviceIndex: u32, pPeerMemoryFeatures: [^]PeerMemoryFeatureFlags) ProcGetDeviceGroupPresentCapabilitiesKHR :: #type proc "system" (device: Device, pDeviceGroupPresentCapabilities: [^]DeviceGroupPresentCapabilitiesKHR) -> Result @@ -576,6 +657,7 @@ ProcGetDeviceProcAddr :: #type proc "system ProcGetDeviceQueue :: #type proc "system" (device: Device, queueFamilyIndex: u32, queueIndex: u32, pQueue: ^Queue) ProcGetDeviceQueue2 :: #type proc "system" (device: Device, pQueueInfo: ^DeviceQueueInfo2, pQueue: ^Queue) ProcGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI :: #type proc "system" (device: Device, renderpass: RenderPass, pMaxWorkgroupSize: ^Extent2D) -> Result +ProcGetDeviceTensorMemoryRequirementsARM :: #type proc "system" (device: Device, pInfo: ^DeviceTensorMemoryRequirementsARM, pMemoryRequirements: [^]MemoryRequirements2) ProcGetDynamicRenderingTilePropertiesQCOM :: #type proc "system" (device: Device, pRenderingInfo: ^RenderingInfo, pProperties: [^]TilePropertiesQCOM) -> Result ProcGetEncodedVideoSessionParametersKHR :: #type proc "system" (device: Device, pVideoSessionParametersInfo: ^VideoEncodeSessionParametersGetInfoKHR, pFeedbackInfo: ^VideoEncodeSessionParametersFeedbackInfoKHR, pDataSize: ^int, pData: rawptr) -> Result ProcGetEventStatus :: #type proc "system" (device: Device, event: Event) -> Result @@ -587,10 +669,14 @@ ProcGetFenceWin32HandleKHR :: #type proc "system ProcGetFramebufferTilePropertiesQCOM :: #type proc "system" (device: Device, framebuffer: Framebuffer, pPropertiesCount: ^u32, pProperties: [^]TilePropertiesQCOM) -> Result ProcGetGeneratedCommandsMemoryRequirementsEXT :: #type proc "system" (device: Device, pInfo: ^GeneratedCommandsMemoryRequirementsInfoEXT, pMemoryRequirements: [^]MemoryRequirements2) ProcGetGeneratedCommandsMemoryRequirementsNV :: #type proc "system" (device: Device, pInfo: ^GeneratedCommandsMemoryRequirementsInfoNV, pMemoryRequirements: [^]MemoryRequirements2) +ProcGetGpaDeviceClockInfoAMD :: #type proc "system" (device: Device, pInfo: ^GpaDeviceGetClockInfoAMD) -> Result +ProcGetGpaSessionResultsAMD :: #type proc "system" (device: Device, gpaSession: GpaSessionAMD, sampleID: u32, pSizeInBytes: [^]int, pData: rawptr) -> Result +ProcGetGpaSessionStatusAMD :: #type proc "system" (device: Device, gpaSession: GpaSessionAMD) -> Result ProcGetImageDrmFormatModifierPropertiesEXT :: #type proc "system" (device: Device, image: Image, pProperties: [^]ImageDrmFormatModifierPropertiesEXT) -> Result ProcGetImageMemoryRequirements :: #type proc "system" (device: Device, image: Image, pMemoryRequirements: [^]MemoryRequirements) ProcGetImageMemoryRequirements2 :: #type proc "system" (device: Device, pInfo: ^ImageMemoryRequirementsInfo2, pMemoryRequirements: [^]MemoryRequirements2) ProcGetImageMemoryRequirements2KHR :: #type proc "system" (device: Device, pInfo: ^ImageMemoryRequirementsInfo2, pMemoryRequirements: [^]MemoryRequirements2) +ProcGetImageOpaqueCaptureDataEXT :: #type proc "system" (device: Device, imageCount: u32, pImages: [^]Image, pDatas: [^]HostAddressRangeEXT) -> Result ProcGetImageOpaqueCaptureDescriptorDataEXT :: #type proc "system" (device: Device, pInfo: ^ImageCaptureDescriptorDataInfoEXT, pData: rawptr) -> Result ProcGetImageSparseMemoryRequirements :: #type proc "system" (device: Device, image: Image, pSparseMemoryRequirementCount: ^u32, pSparseMemoryRequirements: [^]SparseImageMemoryRequirements) ProcGetImageSparseMemoryRequirements2 :: #type proc "system" (device: Device, pInfo: ^ImageSparseMemoryRequirementsInfo2, pSparseMemoryRequirementCount: ^u32, pSparseMemoryRequirements: [^]SparseImageMemoryRequirements2) @@ -615,6 +701,7 @@ ProcGetMemoryWin32HandleNV :: #type proc "system ProcGetMemoryWin32HandlePropertiesKHR :: #type proc "system" (device: Device, handleType: ExternalMemoryHandleTypeFlags, handle: HANDLE, pMemoryWin32HandleProperties: [^]MemoryWin32HandlePropertiesKHR) -> Result ProcGetMicromapBuildSizesEXT :: #type proc "system" (device: Device, buildType: AccelerationStructureBuildTypeKHR, pBuildInfo: ^MicromapBuildInfoEXT, pSizeInfo: ^MicromapBuildSizesInfoEXT) ProcGetPartitionedAccelerationStructuresBuildSizesNV :: #type proc "system" (device: Device, pInfo: ^PartitionedAccelerationStructureInstancesInputNV, pSizeInfo: ^AccelerationStructureBuildSizesInfoKHR) +ProcGetPastPresentationTimingEXT :: #type proc "system" (device: Device, pPastPresentationTimingInfo: ^PastPresentationTimingInfoEXT, pPastPresentationTimingProperties: [^]PastPresentationTimingPropertiesEXT) -> Result ProcGetPastPresentationTimingGOOGLE :: #type proc "system" (device: Device, swapchain: SwapchainKHR, pPresentationTimingCount: ^u32, pPresentationTimings: [^]PastPresentationTimingGOOGLE) -> Result ProcGetPerformanceParameterINTEL :: #type proc "system" (device: Device, parameter: PerformanceParameterTypeINTEL, pValue: ^PerformanceValueINTEL) -> Result ProcGetPipelineBinaryDataKHR :: #type proc "system" (device: Device, pInfo: ^PipelineBinaryDataInfoKHR, pPipelineBinaryKey: ^PipelineBinaryKeyKHR, pPipelineBinaryDataSize: ^int, pPipelineBinaryData: rawptr) -> Result @@ -625,7 +712,7 @@ ProcGetPipelineExecutableStatisticsKHR :: #type proc "system ProcGetPipelineIndirectDeviceAddressNV :: #type proc "system" (device: Device, pInfo: ^PipelineIndirectDeviceAddressInfoNV) -> DeviceAddress ProcGetPipelineIndirectMemoryRequirementsNV :: #type proc "system" (device: Device, pCreateInfo: ^ComputePipelineCreateInfo, pMemoryRequirements: [^]MemoryRequirements2) ProcGetPipelineKeyKHR :: #type proc "system" (device: Device, pPipelineCreateInfo: ^PipelineCreateInfoKHR, pPipelineKey: ^PipelineBinaryKeyKHR) -> Result -ProcGetPipelinePropertiesEXT :: #type proc "system" (device: Device, pPipelineInfo: ^PipelineInfoEXT, pPipelineProperties: [^]BaseOutStructure) -> Result +ProcGetPipelinePropertiesEXT :: #type proc "system" (device: Device, pPipelineInfo: ^PipelineInfoKHR, pPipelineProperties: [^]BaseOutStructure) -> Result ProcGetPrivateData :: #type proc "system" (device: Device, objectType: ObjectType, objectHandle: u64, privateDataSlot: PrivateDataSlot, pData: ^u64) ProcGetPrivateDataEXT :: #type proc "system" (device: Device, objectType: ObjectType, objectHandle: u64, privateDataSlot: PrivateDataSlot, pData: ^u64) ProcGetQueryPoolResults :: #type proc "system" (device: Device, queryPool: QueryPool, firstQuery: u32, queryCount: u32, dataSize: int, pData: rawptr, stride: DeviceSize, flags: QueryResultFlags) -> Result @@ -646,11 +733,18 @@ ProcGetSemaphoreFdKHR :: #type proc "system ProcGetSemaphoreWin32HandleKHR :: #type proc "system" (device: Device, pGetWin32HandleInfo: ^SemaphoreGetWin32HandleInfoKHR, pHandle: ^HANDLE) -> Result ProcGetShaderBinaryDataEXT :: #type proc "system" (device: Device, shader: ShaderEXT, pDataSize: ^int, pData: rawptr) -> Result ProcGetShaderInfoAMD :: #type proc "system" (device: Device, pipeline: Pipeline, shaderStage: ShaderStageFlags, infoType: ShaderInfoTypeAMD, pInfoSize: ^int, pInfo: rawptr) -> Result +ProcGetShaderInstrumentationValuesARM :: #type proc "system" (device: Device, instrumentation: ShaderInstrumentationARM, pMetricBlockCount: ^u32, pMetricValues: rawptr, flags: ShaderInstrumentationValuesFlagsARM) -> Result ProcGetShaderModuleCreateInfoIdentifierEXT :: #type proc "system" (device: Device, pCreateInfo: ^ShaderModuleCreateInfo, pIdentifier: ^ShaderModuleIdentifierEXT) ProcGetShaderModuleIdentifierEXT :: #type proc "system" (device: Device, shaderModule: ShaderModule, pIdentifier: ^ShaderModuleIdentifierEXT) ProcGetSwapchainCounterEXT :: #type proc "system" (device: Device, swapchain: SwapchainKHR, counter: SurfaceCounterFlagsEXT, pCounterValue: ^u64) -> Result ProcGetSwapchainImagesKHR :: #type proc "system" (device: Device, swapchain: SwapchainKHR, pSwapchainImageCount: ^u32, pSwapchainImages: [^]Image) -> Result ProcGetSwapchainStatusKHR :: #type proc "system" (device: Device, swapchain: SwapchainKHR) -> Result +ProcGetSwapchainTimeDomainPropertiesEXT :: #type proc "system" (device: Device, swapchain: SwapchainKHR, pSwapchainTimeDomainProperties: [^]SwapchainTimeDomainPropertiesEXT, pTimeDomainsCounter: ^u64) -> Result +ProcGetSwapchainTimingPropertiesEXT :: #type proc "system" (device: Device, swapchain: SwapchainKHR, pSwapchainTimingProperties: [^]SwapchainTimingPropertiesEXT, pSwapchainTimingPropertiesCounter: ^u64) -> Result +ProcGetTensorMemoryRequirementsARM :: #type proc "system" (device: Device, pInfo: ^TensorMemoryRequirementsInfoARM, pMemoryRequirements: [^]MemoryRequirements2) +ProcGetTensorOpaqueCaptureDataARM :: #type proc "system" (device: Device, tensorCount: u32, pTensors: [^]TensorARM, pDatas: [^]HostAddressRangeEXT) -> Result +ProcGetTensorOpaqueCaptureDescriptorDataARM :: #type proc "system" (device: Device, pInfo: ^TensorCaptureDescriptorDataInfoARM, pData: rawptr) -> Result +ProcGetTensorViewOpaqueCaptureDescriptorDataARM :: #type proc "system" (device: Device, pInfo: ^TensorViewCaptureDescriptorDataInfoARM, pData: rawptr) -> Result ProcGetValidationCacheDataEXT :: #type proc "system" (device: Device, validationCache: ValidationCacheEXT, pDataSize: ^int, pData: rawptr) -> Result ProcGetVideoSessionMemoryRequirementsKHR :: #type proc "system" (device: Device, videoSession: VideoSessionKHR, pMemoryRequirementsCount: ^u32, pMemoryRequirements: [^]VideoSessionMemoryRequirementsKHR) -> Result ProcImportFenceFdKHR :: #type proc "system" (device: Device, pImportFenceFdInfo: ^ImportFenceFdInfoKHR) -> Result @@ -676,30 +770,35 @@ ProcQueueSubmit :: #type proc "system ProcQueueSubmit2 :: #type proc "system" (queue: Queue, submitCount: u32, pSubmits: [^]SubmitInfo2, fence: Fence) -> Result ProcQueueSubmit2KHR :: #type proc "system" (queue: Queue, submitCount: u32, pSubmits: [^]SubmitInfo2, fence: Fence) -> Result ProcQueueWaitIdle :: #type proc "system" (queue: Queue) -> Result +ProcRegisterCustomBorderColorEXT :: #type proc "system" (device: Device, pBorderColor: ^SamplerCustomBorderColorCreateInfoEXT, requestIndex: b32, pIndex: ^u32) -> Result ProcRegisterDeviceEventEXT :: #type proc "system" (device: Device, pDeviceEventInfo: ^DeviceEventInfoEXT, pAllocator: ^AllocationCallbacks, pFence: ^Fence) -> Result ProcRegisterDisplayEventEXT :: #type proc "system" (device: Device, display: DisplayKHR, pDisplayEventInfo: ^DisplayEventInfoEXT, pAllocator: ^AllocationCallbacks, pFence: ^Fence) -> Result ProcReleaseCapturedPipelineDataKHR :: #type proc "system" (device: Device, pInfo: ^ReleaseCapturedPipelineDataInfoKHR, pAllocator: ^AllocationCallbacks) -> Result ProcReleaseFullScreenExclusiveModeEXT :: #type proc "system" (device: Device, swapchain: SwapchainKHR) -> Result ProcReleasePerformanceConfigurationINTEL :: #type proc "system" (device: Device, configuration: PerformanceConfigurationINTEL) -> Result ProcReleaseProfilingLockKHR :: #type proc "system" (device: Device) -ProcReleaseSwapchainImagesEXT :: #type proc "system" (device: Device, pReleaseInfo: ^ReleaseSwapchainImagesInfoEXT) -> Result +ProcReleaseSwapchainImagesEXT :: #type proc "system" (device: Device, pReleaseInfo: ^ReleaseSwapchainImagesInfoKHR) -> Result +ProcReleaseSwapchainImagesKHR :: #type proc "system" (device: Device, pReleaseInfo: ^ReleaseSwapchainImagesInfoKHR) -> Result ProcResetCommandBuffer :: #type proc "system" (commandBuffer: CommandBuffer, flags: CommandBufferResetFlags) -> Result ProcResetCommandPool :: #type proc "system" (device: Device, commandPool: CommandPool, flags: CommandPoolResetFlags) -> Result ProcResetDescriptorPool :: #type proc "system" (device: Device, descriptorPool: DescriptorPool, flags: DescriptorPoolResetFlags) -> Result ProcResetEvent :: #type proc "system" (device: Device, event: Event) -> Result ProcResetFences :: #type proc "system" (device: Device, fenceCount: u32, pFences: [^]Fence) -> Result +ProcResetGpaSessionAMD :: #type proc "system" (device: Device, gpaSession: GpaSessionAMD) -> Result ProcResetQueryPool :: #type proc "system" (device: Device, queryPool: QueryPool, firstQuery: u32, queryCount: u32) ProcResetQueryPoolEXT :: #type proc "system" (device: Device, queryPool: QueryPool, firstQuery: u32, queryCount: u32) ProcSetDebugUtilsObjectNameEXT :: #type proc "system" (device: Device, pNameInfo: ^DebugUtilsObjectNameInfoEXT) -> Result ProcSetDebugUtilsObjectTagEXT :: #type proc "system" (device: Device, pTagInfo: ^DebugUtilsObjectTagInfoEXT) -> Result ProcSetDeviceMemoryPriorityEXT :: #type proc "system" (device: Device, memory: DeviceMemory, priority: f32) ProcSetEvent :: #type proc "system" (device: Device, event: Event) -> Result +ProcSetGpaDeviceClockModeAMD :: #type proc "system" (device: Device, pInfo: ^GpaDeviceClockModeInfoAMD) -> Result ProcSetHdrMetadataEXT :: #type proc "system" (device: Device, swapchainCount: u32, pSwapchains: [^]SwapchainKHR, pMetadata: ^HdrMetadataEXT) ProcSetLatencyMarkerNV :: #type proc "system" (device: Device, swapchain: SwapchainKHR, pLatencyMarkerInfo: ^SetLatencyMarkerInfoNV) ProcSetLatencySleepModeNV :: #type proc "system" (device: Device, swapchain: SwapchainKHR, pSleepModeInfo: ^LatencySleepModeInfoNV) -> Result ProcSetLocalDimmingAMD :: #type proc "system" (device: Device, swapChain: SwapchainKHR, localDimmingEnable: b32) ProcSetPrivateData :: #type proc "system" (device: Device, objectType: ObjectType, objectHandle: u64, privateDataSlot: PrivateDataSlot, data: u64) -> Result ProcSetPrivateDataEXT :: #type proc "system" (device: Device, objectType: ObjectType, objectHandle: u64, privateDataSlot: PrivateDataSlot, data: u64) -> Result +ProcSetSwapchainPresentTimingQueueSizeEXT :: #type proc "system" (device: Device, swapchain: SwapchainKHR, size: u32) -> Result ProcSignalSemaphore :: #type proc "system" (device: Device, pSignalInfo: ^SemaphoreSignalInfo) -> Result ProcSignalSemaphoreKHR :: #type proc "system" (device: Device, pSignalInfo: ^SemaphoreSignalInfo) -> Result ProcTransitionImageLayout :: #type proc "system" (device: Device, transitionCount: u32, pTransitions: [^]HostImageLayoutTransitionInfo) -> Result @@ -710,6 +809,7 @@ ProcUninitializePerformanceApiINTEL :: #type proc "system ProcUnmapMemory :: #type proc "system" (device: Device, memory: DeviceMemory) ProcUnmapMemory2 :: #type proc "system" (device: Device, pMemoryUnmapInfo: ^MemoryUnmapInfo) -> Result ProcUnmapMemory2KHR :: #type proc "system" (device: Device, pMemoryUnmapInfo: ^MemoryUnmapInfo) -> Result +ProcUnregisterCustomBorderColorEXT :: #type proc "system" (device: Device, index: u32) ProcUpdateDescriptorSetWithTemplate :: #type proc "system" (device: Device, descriptorSet: DescriptorSet, descriptorUpdateTemplate: DescriptorUpdateTemplate, pData: rawptr) ProcUpdateDescriptorSetWithTemplateKHR :: #type proc "system" (device: Device, descriptorSet: DescriptorSet, descriptorUpdateTemplate: DescriptorUpdateTemplate, pData: rawptr) ProcUpdateDescriptorSets :: #type proc "system" (device: Device, descriptorWriteCount: u32, pDescriptorWrites: [^]WriteDescriptorSet, descriptorCopyCount: u32, pDescriptorCopies: [^]CopyDescriptorSet) @@ -717,11 +817,14 @@ ProcUpdateIndirectExecutionSetPipelineEXT :: #type proc "system ProcUpdateIndirectExecutionSetShaderEXT :: #type proc "system" (device: Device, indirectExecutionSet: IndirectExecutionSetEXT, executionSetWriteCount: u32, pExecutionSetWrites: [^]WriteIndirectExecutionSetShaderEXT) ProcUpdateVideoSessionParametersKHR :: #type proc "system" (device: Device, videoSessionParameters: VideoSessionParametersKHR, pUpdateInfo: ^VideoSessionParametersUpdateInfoKHR) -> Result ProcWaitForFences :: #type proc "system" (device: Device, fenceCount: u32, pFences: [^]Fence, waitAll: b32, timeout: u64) -> Result +ProcWaitForPresent2KHR :: #type proc "system" (device: Device, swapchain: SwapchainKHR, pPresentWait2Info: ^PresentWait2InfoKHR) -> Result ProcWaitForPresentKHR :: #type proc "system" (device: Device, swapchain: SwapchainKHR, presentId: u64, timeout: u64) -> Result ProcWaitSemaphores :: #type proc "system" (device: Device, pWaitInfo: ^SemaphoreWaitInfo, timeout: u64) -> Result ProcWaitSemaphoresKHR :: #type proc "system" (device: Device, pWaitInfo: ^SemaphoreWaitInfo, timeout: u64) -> Result ProcWriteAccelerationStructuresPropertiesKHR :: #type proc "system" (device: Device, accelerationStructureCount: u32, pAccelerationStructures: [^]AccelerationStructureKHR, queryType: QueryType, dataSize: int, pData: rawptr, stride: int) -> Result ProcWriteMicromapsPropertiesEXT :: #type proc "system" (device: Device, micromapCount: u32, pMicromaps: [^]MicromapEXT, queryType: QueryType, dataSize: int, pData: rawptr, stride: int) -> Result +ProcWriteResourceDescriptorsEXT :: #type proc "system" (device: Device, resourceCount: u32, pResources: [^]ResourceDescriptorInfoEXT, pDescriptors: [^]HostAddressRangeEXT) -> Result +ProcWriteSamplerDescriptorsEXT :: #type proc "system" (device: Device, samplerCount: u32, pSamplers: [^]SamplerCreateInfo, pDescriptors: [^]HostAddressRangeEXT) -> Result // Loader Procedures @@ -731,106 +834,115 @@ DeviceMemoryReportCallbackEXT: ProcDeviceMemoryReportCallbackEXT EnumerateInstanceExtensionProperties: ProcEnumerateInstanceExtensionProperties EnumerateInstanceLayerProperties: ProcEnumerateInstanceLayerProperties EnumerateInstanceVersion: ProcEnumerateInstanceVersion +GetExternalComputeQueueDataNV: ProcGetExternalComputeQueueDataNV GetInstanceProcAddr: ProcGetInstanceProcAddr // Instance Procedures -AcquireDrmDisplayEXT: ProcAcquireDrmDisplayEXT -AcquireWinrtDisplayNV: ProcAcquireWinrtDisplayNV -CreateDebugReportCallbackEXT: ProcCreateDebugReportCallbackEXT -CreateDebugUtilsMessengerEXT: ProcCreateDebugUtilsMessengerEXT -CreateDevice: ProcCreateDevice -CreateDisplayModeKHR: ProcCreateDisplayModeKHR -CreateDisplayPlaneSurfaceKHR: ProcCreateDisplayPlaneSurfaceKHR -CreateHeadlessSurfaceEXT: ProcCreateHeadlessSurfaceEXT -CreateIOSSurfaceMVK: ProcCreateIOSSurfaceMVK -CreateMacOSSurfaceMVK: ProcCreateMacOSSurfaceMVK -CreateMetalSurfaceEXT: ProcCreateMetalSurfaceEXT -CreateWaylandSurfaceKHR: ProcCreateWaylandSurfaceKHR -CreateWin32SurfaceKHR: ProcCreateWin32SurfaceKHR -CreateXcbSurfaceKHR: ProcCreateXcbSurfaceKHR -CreateXlibSurfaceKHR: ProcCreateXlibSurfaceKHR -DebugReportMessageEXT: ProcDebugReportMessageEXT -DestroyDebugReportCallbackEXT: ProcDestroyDebugReportCallbackEXT -DestroyDebugUtilsMessengerEXT: ProcDestroyDebugUtilsMessengerEXT -DestroyInstance: ProcDestroyInstance -DestroySurfaceKHR: ProcDestroySurfaceKHR -EnumerateDeviceExtensionProperties: ProcEnumerateDeviceExtensionProperties -EnumerateDeviceLayerProperties: ProcEnumerateDeviceLayerProperties -EnumeratePhysicalDeviceGroups: ProcEnumeratePhysicalDeviceGroups -EnumeratePhysicalDeviceGroupsKHR: ProcEnumeratePhysicalDeviceGroupsKHR -EnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR: ProcEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR -EnumeratePhysicalDevices: ProcEnumeratePhysicalDevices -GetDisplayModeProperties2KHR: ProcGetDisplayModeProperties2KHR -GetDisplayModePropertiesKHR: ProcGetDisplayModePropertiesKHR -GetDisplayPlaneCapabilities2KHR: ProcGetDisplayPlaneCapabilities2KHR -GetDisplayPlaneCapabilitiesKHR: ProcGetDisplayPlaneCapabilitiesKHR -GetDisplayPlaneSupportedDisplaysKHR: ProcGetDisplayPlaneSupportedDisplaysKHR -GetDrmDisplayEXT: ProcGetDrmDisplayEXT -GetInstanceProcAddrLUNARG: ProcGetInstanceProcAddrLUNARG -GetPhysicalDeviceCalibrateableTimeDomainsEXT: ProcGetPhysicalDeviceCalibrateableTimeDomainsEXT -GetPhysicalDeviceCalibrateableTimeDomainsKHR: ProcGetPhysicalDeviceCalibrateableTimeDomainsKHR -GetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV: ProcGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV -GetPhysicalDeviceCooperativeMatrixPropertiesKHR: ProcGetPhysicalDeviceCooperativeMatrixPropertiesKHR -GetPhysicalDeviceCooperativeMatrixPropertiesNV: ProcGetPhysicalDeviceCooperativeMatrixPropertiesNV -GetPhysicalDeviceCooperativeVectorPropertiesNV: ProcGetPhysicalDeviceCooperativeVectorPropertiesNV -GetPhysicalDeviceDisplayPlaneProperties2KHR: ProcGetPhysicalDeviceDisplayPlaneProperties2KHR -GetPhysicalDeviceDisplayPlanePropertiesKHR: ProcGetPhysicalDeviceDisplayPlanePropertiesKHR -GetPhysicalDeviceDisplayProperties2KHR: ProcGetPhysicalDeviceDisplayProperties2KHR -GetPhysicalDeviceDisplayPropertiesKHR: ProcGetPhysicalDeviceDisplayPropertiesKHR -GetPhysicalDeviceExternalBufferProperties: ProcGetPhysicalDeviceExternalBufferProperties -GetPhysicalDeviceExternalBufferPropertiesKHR: ProcGetPhysicalDeviceExternalBufferPropertiesKHR -GetPhysicalDeviceExternalFenceProperties: ProcGetPhysicalDeviceExternalFenceProperties -GetPhysicalDeviceExternalFencePropertiesKHR: ProcGetPhysicalDeviceExternalFencePropertiesKHR -GetPhysicalDeviceExternalImageFormatPropertiesNV: ProcGetPhysicalDeviceExternalImageFormatPropertiesNV -GetPhysicalDeviceExternalSemaphoreProperties: ProcGetPhysicalDeviceExternalSemaphoreProperties -GetPhysicalDeviceExternalSemaphorePropertiesKHR: ProcGetPhysicalDeviceExternalSemaphorePropertiesKHR -GetPhysicalDeviceFeatures: ProcGetPhysicalDeviceFeatures -GetPhysicalDeviceFeatures2: ProcGetPhysicalDeviceFeatures2 -GetPhysicalDeviceFeatures2KHR: ProcGetPhysicalDeviceFeatures2KHR -GetPhysicalDeviceFormatProperties: ProcGetPhysicalDeviceFormatProperties -GetPhysicalDeviceFormatProperties2: ProcGetPhysicalDeviceFormatProperties2 -GetPhysicalDeviceFormatProperties2KHR: ProcGetPhysicalDeviceFormatProperties2KHR -GetPhysicalDeviceFragmentShadingRatesKHR: ProcGetPhysicalDeviceFragmentShadingRatesKHR -GetPhysicalDeviceImageFormatProperties: ProcGetPhysicalDeviceImageFormatProperties -GetPhysicalDeviceImageFormatProperties2: ProcGetPhysicalDeviceImageFormatProperties2 -GetPhysicalDeviceImageFormatProperties2KHR: ProcGetPhysicalDeviceImageFormatProperties2KHR -GetPhysicalDeviceMemoryProperties: ProcGetPhysicalDeviceMemoryProperties -GetPhysicalDeviceMemoryProperties2: ProcGetPhysicalDeviceMemoryProperties2 -GetPhysicalDeviceMemoryProperties2KHR: ProcGetPhysicalDeviceMemoryProperties2KHR -GetPhysicalDeviceMultisamplePropertiesEXT: ProcGetPhysicalDeviceMultisamplePropertiesEXT -GetPhysicalDeviceOpticalFlowImageFormatsNV: ProcGetPhysicalDeviceOpticalFlowImageFormatsNV -GetPhysicalDevicePresentRectanglesKHR: ProcGetPhysicalDevicePresentRectanglesKHR -GetPhysicalDeviceProperties: ProcGetPhysicalDeviceProperties -GetPhysicalDeviceProperties2: ProcGetPhysicalDeviceProperties2 -GetPhysicalDeviceProperties2KHR: ProcGetPhysicalDeviceProperties2KHR -GetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR: ProcGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR -GetPhysicalDeviceQueueFamilyProperties: ProcGetPhysicalDeviceQueueFamilyProperties -GetPhysicalDeviceQueueFamilyProperties2: ProcGetPhysicalDeviceQueueFamilyProperties2 -GetPhysicalDeviceQueueFamilyProperties2KHR: ProcGetPhysicalDeviceQueueFamilyProperties2KHR -GetPhysicalDeviceSparseImageFormatProperties: ProcGetPhysicalDeviceSparseImageFormatProperties -GetPhysicalDeviceSparseImageFormatProperties2: ProcGetPhysicalDeviceSparseImageFormatProperties2 -GetPhysicalDeviceSparseImageFormatProperties2KHR: ProcGetPhysicalDeviceSparseImageFormatProperties2KHR -GetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV: ProcGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV -GetPhysicalDeviceSurfaceCapabilities2EXT: ProcGetPhysicalDeviceSurfaceCapabilities2EXT -GetPhysicalDeviceSurfaceCapabilities2KHR: ProcGetPhysicalDeviceSurfaceCapabilities2KHR -GetPhysicalDeviceSurfaceCapabilitiesKHR: ProcGetPhysicalDeviceSurfaceCapabilitiesKHR -GetPhysicalDeviceSurfaceFormats2KHR: ProcGetPhysicalDeviceSurfaceFormats2KHR -GetPhysicalDeviceSurfaceFormatsKHR: ProcGetPhysicalDeviceSurfaceFormatsKHR -GetPhysicalDeviceSurfacePresentModes2EXT: ProcGetPhysicalDeviceSurfacePresentModes2EXT -GetPhysicalDeviceSurfacePresentModesKHR: ProcGetPhysicalDeviceSurfacePresentModesKHR -GetPhysicalDeviceSurfaceSupportKHR: ProcGetPhysicalDeviceSurfaceSupportKHR -GetPhysicalDeviceToolProperties: ProcGetPhysicalDeviceToolProperties -GetPhysicalDeviceToolPropertiesEXT: ProcGetPhysicalDeviceToolPropertiesEXT -GetPhysicalDeviceVideoCapabilitiesKHR: ProcGetPhysicalDeviceVideoCapabilitiesKHR -GetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR: ProcGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR -GetPhysicalDeviceVideoFormatPropertiesKHR: ProcGetPhysicalDeviceVideoFormatPropertiesKHR -GetPhysicalDeviceWaylandPresentationSupportKHR: ProcGetPhysicalDeviceWaylandPresentationSupportKHR -GetPhysicalDeviceWin32PresentationSupportKHR: ProcGetPhysicalDeviceWin32PresentationSupportKHR -GetPhysicalDeviceXcbPresentationSupportKHR: ProcGetPhysicalDeviceXcbPresentationSupportKHR -GetPhysicalDeviceXlibPresentationSupportKHR: ProcGetPhysicalDeviceXlibPresentationSupportKHR -GetWinrtDisplayNV: ProcGetWinrtDisplayNV -ReleaseDisplayEXT: ProcReleaseDisplayEXT -SubmitDebugUtilsMessageEXT: ProcSubmitDebugUtilsMessageEXT +AcquireDrmDisplayEXT: ProcAcquireDrmDisplayEXT +AcquireWinrtDisplayNV: ProcAcquireWinrtDisplayNV +CreateDebugReportCallbackEXT: ProcCreateDebugReportCallbackEXT +CreateDebugUtilsMessengerEXT: ProcCreateDebugUtilsMessengerEXT +CreateDevice: ProcCreateDevice +CreateDisplayModeKHR: ProcCreateDisplayModeKHR +CreateDisplayPlaneSurfaceKHR: ProcCreateDisplayPlaneSurfaceKHR +CreateHeadlessSurfaceEXT: ProcCreateHeadlessSurfaceEXT +CreateIOSSurfaceMVK: ProcCreateIOSSurfaceMVK +CreateMacOSSurfaceMVK: ProcCreateMacOSSurfaceMVK +CreateMetalSurfaceEXT: ProcCreateMetalSurfaceEXT +CreateWaylandSurfaceKHR: ProcCreateWaylandSurfaceKHR +CreateWin32SurfaceKHR: ProcCreateWin32SurfaceKHR +CreateXcbSurfaceKHR: ProcCreateXcbSurfaceKHR +CreateXlibSurfaceKHR: ProcCreateXlibSurfaceKHR +DebugReportMessageEXT: ProcDebugReportMessageEXT +DestroyDebugReportCallbackEXT: ProcDestroyDebugReportCallbackEXT +DestroyDebugUtilsMessengerEXT: ProcDestroyDebugUtilsMessengerEXT +DestroyInstance: ProcDestroyInstance +DestroySurfaceKHR: ProcDestroySurfaceKHR +EnumerateDeviceExtensionProperties: ProcEnumerateDeviceExtensionProperties +EnumerateDeviceLayerProperties: ProcEnumerateDeviceLayerProperties +EnumeratePhysicalDeviceGroups: ProcEnumeratePhysicalDeviceGroups +EnumeratePhysicalDeviceGroupsKHR: ProcEnumeratePhysicalDeviceGroupsKHR +EnumeratePhysicalDeviceQueueFamilyPerformanceCountersByRegionARM: ProcEnumeratePhysicalDeviceQueueFamilyPerformanceCountersByRegionARM +EnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR: ProcEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR +EnumeratePhysicalDeviceShaderInstrumentationMetricsARM: ProcEnumeratePhysicalDeviceShaderInstrumentationMetricsARM +EnumeratePhysicalDevices: ProcEnumeratePhysicalDevices +GetDisplayModeProperties2KHR: ProcGetDisplayModeProperties2KHR +GetDisplayModePropertiesKHR: ProcGetDisplayModePropertiesKHR +GetDisplayPlaneCapabilities2KHR: ProcGetDisplayPlaneCapabilities2KHR +GetDisplayPlaneCapabilitiesKHR: ProcGetDisplayPlaneCapabilitiesKHR +GetDisplayPlaneSupportedDisplaysKHR: ProcGetDisplayPlaneSupportedDisplaysKHR +GetDrmDisplayEXT: ProcGetDrmDisplayEXT +GetInstanceProcAddrLUNARG: ProcGetInstanceProcAddrLUNARG +GetPhysicalDeviceCalibrateableTimeDomainsEXT: ProcGetPhysicalDeviceCalibrateableTimeDomainsEXT +GetPhysicalDeviceCalibrateableTimeDomainsKHR: ProcGetPhysicalDeviceCalibrateableTimeDomainsKHR +GetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV: ProcGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV +GetPhysicalDeviceCooperativeMatrixPropertiesKHR: ProcGetPhysicalDeviceCooperativeMatrixPropertiesKHR +GetPhysicalDeviceCooperativeMatrixPropertiesNV: ProcGetPhysicalDeviceCooperativeMatrixPropertiesNV +GetPhysicalDeviceCooperativeVectorPropertiesNV: ProcGetPhysicalDeviceCooperativeVectorPropertiesNV +GetPhysicalDeviceDescriptorSizeEXT: ProcGetPhysicalDeviceDescriptorSizeEXT +GetPhysicalDeviceDisplayPlaneProperties2KHR: ProcGetPhysicalDeviceDisplayPlaneProperties2KHR +GetPhysicalDeviceDisplayPlanePropertiesKHR: ProcGetPhysicalDeviceDisplayPlanePropertiesKHR +GetPhysicalDeviceDisplayProperties2KHR: ProcGetPhysicalDeviceDisplayProperties2KHR +GetPhysicalDeviceDisplayPropertiesKHR: ProcGetPhysicalDeviceDisplayPropertiesKHR +GetPhysicalDeviceExternalBufferProperties: ProcGetPhysicalDeviceExternalBufferProperties +GetPhysicalDeviceExternalBufferPropertiesKHR: ProcGetPhysicalDeviceExternalBufferPropertiesKHR +GetPhysicalDeviceExternalFenceProperties: ProcGetPhysicalDeviceExternalFenceProperties +GetPhysicalDeviceExternalFencePropertiesKHR: ProcGetPhysicalDeviceExternalFencePropertiesKHR +GetPhysicalDeviceExternalImageFormatPropertiesNV: ProcGetPhysicalDeviceExternalImageFormatPropertiesNV +GetPhysicalDeviceExternalSemaphoreProperties: ProcGetPhysicalDeviceExternalSemaphoreProperties +GetPhysicalDeviceExternalSemaphorePropertiesKHR: ProcGetPhysicalDeviceExternalSemaphorePropertiesKHR +GetPhysicalDeviceExternalTensorPropertiesARM: ProcGetPhysicalDeviceExternalTensorPropertiesARM +GetPhysicalDeviceFeatures: ProcGetPhysicalDeviceFeatures +GetPhysicalDeviceFeatures2: ProcGetPhysicalDeviceFeatures2 +GetPhysicalDeviceFeatures2KHR: ProcGetPhysicalDeviceFeatures2KHR +GetPhysicalDeviceFormatProperties: ProcGetPhysicalDeviceFormatProperties +GetPhysicalDeviceFormatProperties2: ProcGetPhysicalDeviceFormatProperties2 +GetPhysicalDeviceFormatProperties2KHR: ProcGetPhysicalDeviceFormatProperties2KHR +GetPhysicalDeviceFragmentShadingRatesKHR: ProcGetPhysicalDeviceFragmentShadingRatesKHR +GetPhysicalDeviceImageFormatProperties: ProcGetPhysicalDeviceImageFormatProperties +GetPhysicalDeviceImageFormatProperties2: ProcGetPhysicalDeviceImageFormatProperties2 +GetPhysicalDeviceImageFormatProperties2KHR: ProcGetPhysicalDeviceImageFormatProperties2KHR +GetPhysicalDeviceMemoryProperties: ProcGetPhysicalDeviceMemoryProperties +GetPhysicalDeviceMemoryProperties2: ProcGetPhysicalDeviceMemoryProperties2 +GetPhysicalDeviceMemoryProperties2KHR: ProcGetPhysicalDeviceMemoryProperties2KHR +GetPhysicalDeviceMultisamplePropertiesEXT: ProcGetPhysicalDeviceMultisamplePropertiesEXT +GetPhysicalDeviceOpticalFlowImageFormatsNV: ProcGetPhysicalDeviceOpticalFlowImageFormatsNV +GetPhysicalDevicePresentRectanglesKHR: ProcGetPhysicalDevicePresentRectanglesKHR +GetPhysicalDeviceProperties: ProcGetPhysicalDeviceProperties +GetPhysicalDeviceProperties2: ProcGetPhysicalDeviceProperties2 +GetPhysicalDeviceProperties2KHR: ProcGetPhysicalDeviceProperties2KHR +GetPhysicalDeviceQueueFamilyDataGraphEngineOperationPropertiesARM: ProcGetPhysicalDeviceQueueFamilyDataGraphEngineOperationPropertiesARM +GetPhysicalDeviceQueueFamilyDataGraphOpticalFlowImageFormatsARM: ProcGetPhysicalDeviceQueueFamilyDataGraphOpticalFlowImageFormatsARM +GetPhysicalDeviceQueueFamilyDataGraphProcessingEnginePropertiesARM: ProcGetPhysicalDeviceQueueFamilyDataGraphProcessingEnginePropertiesARM +GetPhysicalDeviceQueueFamilyDataGraphPropertiesARM: ProcGetPhysicalDeviceQueueFamilyDataGraphPropertiesARM +GetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR: ProcGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR +GetPhysicalDeviceQueueFamilyProperties: ProcGetPhysicalDeviceQueueFamilyProperties +GetPhysicalDeviceQueueFamilyProperties2: ProcGetPhysicalDeviceQueueFamilyProperties2 +GetPhysicalDeviceQueueFamilyProperties2KHR: ProcGetPhysicalDeviceQueueFamilyProperties2KHR +GetPhysicalDeviceSparseImageFormatProperties: ProcGetPhysicalDeviceSparseImageFormatProperties +GetPhysicalDeviceSparseImageFormatProperties2: ProcGetPhysicalDeviceSparseImageFormatProperties2 +GetPhysicalDeviceSparseImageFormatProperties2KHR: ProcGetPhysicalDeviceSparseImageFormatProperties2KHR +GetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV: ProcGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV +GetPhysicalDeviceSurfaceCapabilities2EXT: ProcGetPhysicalDeviceSurfaceCapabilities2EXT +GetPhysicalDeviceSurfaceCapabilities2KHR: ProcGetPhysicalDeviceSurfaceCapabilities2KHR +GetPhysicalDeviceSurfaceCapabilitiesKHR: ProcGetPhysicalDeviceSurfaceCapabilitiesKHR +GetPhysicalDeviceSurfaceFormats2KHR: ProcGetPhysicalDeviceSurfaceFormats2KHR +GetPhysicalDeviceSurfaceFormatsKHR: ProcGetPhysicalDeviceSurfaceFormatsKHR +GetPhysicalDeviceSurfacePresentModes2EXT: ProcGetPhysicalDeviceSurfacePresentModes2EXT +GetPhysicalDeviceSurfacePresentModesKHR: ProcGetPhysicalDeviceSurfacePresentModesKHR +GetPhysicalDeviceSurfaceSupportKHR: ProcGetPhysicalDeviceSurfaceSupportKHR +GetPhysicalDeviceToolProperties: ProcGetPhysicalDeviceToolProperties +GetPhysicalDeviceToolPropertiesEXT: ProcGetPhysicalDeviceToolPropertiesEXT +GetPhysicalDeviceVideoCapabilitiesKHR: ProcGetPhysicalDeviceVideoCapabilitiesKHR +GetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR: ProcGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR +GetPhysicalDeviceVideoFormatPropertiesKHR: ProcGetPhysicalDeviceVideoFormatPropertiesKHR +GetPhysicalDeviceWaylandPresentationSupportKHR: ProcGetPhysicalDeviceWaylandPresentationSupportKHR +GetPhysicalDeviceWin32PresentationSupportKHR: ProcGetPhysicalDeviceWin32PresentationSupportKHR +GetPhysicalDeviceXcbPresentationSupportKHR: ProcGetPhysicalDeviceXcbPresentationSupportKHR +GetPhysicalDeviceXlibPresentationSupportKHR: ProcGetPhysicalDeviceXlibPresentationSupportKHR +GetWinrtDisplayNV: ProcGetWinrtDisplayNV +ReleaseDisplayEXT: ProcReleaseDisplayEXT +SubmitDebugUtilsMessageEXT: ProcSubmitDebugUtilsMessageEXT // Device Procedures AcquireFullScreenExclusiveModeEXT: ProcAcquireFullScreenExclusiveModeEXT @@ -847,15 +959,23 @@ BindAccelerationStructureMemoryNV: ProcBindAccelerationStru BindBufferMemory: ProcBindBufferMemory BindBufferMemory2: ProcBindBufferMemory2 BindBufferMemory2KHR: ProcBindBufferMemory2KHR +BindDataGraphPipelineSessionMemoryARM: ProcBindDataGraphPipelineSessionMemoryARM BindImageMemory: ProcBindImageMemory BindImageMemory2: ProcBindImageMemory2 BindImageMemory2KHR: ProcBindImageMemory2KHR BindOpticalFlowSessionImageNV: ProcBindOpticalFlowSessionImageNV +BindTensorMemoryARM: ProcBindTensorMemoryARM BindVideoSessionMemoryKHR: ProcBindVideoSessionMemoryKHR BuildAccelerationStructuresKHR: ProcBuildAccelerationStructuresKHR BuildMicromapsEXT: ProcBuildMicromapsEXT +ClearShaderInstrumentationMetricsARM: ProcClearShaderInstrumentationMetricsARM +CmdBeginConditionalRendering2EXT: ProcCmdBeginConditionalRendering2EXT CmdBeginConditionalRenderingEXT: ProcCmdBeginConditionalRenderingEXT +CmdBeginCustomResolveEXT: ProcCmdBeginCustomResolveEXT CmdBeginDebugUtilsLabelEXT: ProcCmdBeginDebugUtilsLabelEXT +CmdBeginGpaSampleAMD: ProcCmdBeginGpaSampleAMD +CmdBeginGpaSessionAMD: ProcCmdBeginGpaSessionAMD +CmdBeginPerTileExecutionQCOM: ProcCmdBeginPerTileExecutionQCOM CmdBeginQuery: ProcCmdBeginQuery CmdBeginQueryIndexedEXT: ProcCmdBeginQueryIndexedEXT CmdBeginRenderPass: ProcCmdBeginRenderPass @@ -863,6 +983,8 @@ CmdBeginRenderPass2: ProcCmdBeginRenderPass2 CmdBeginRenderPass2KHR: ProcCmdBeginRenderPass2KHR CmdBeginRendering: ProcCmdBeginRendering CmdBeginRenderingKHR: ProcCmdBeginRenderingKHR +CmdBeginShaderInstrumentationARM: ProcCmdBeginShaderInstrumentationARM +CmdBeginTransformFeedback2EXT: ProcCmdBeginTransformFeedback2EXT CmdBeginTransformFeedbackEXT: ProcCmdBeginTransformFeedbackEXT CmdBeginVideoCodingKHR: ProcCmdBeginVideoCodingKHR CmdBindDescriptorBufferEmbeddedSamplers2EXT: ProcCmdBindDescriptorBufferEmbeddedSamplers2EXT @@ -874,15 +996,21 @@ CmdBindDescriptorSets2KHR: ProcCmdBindDescriptorSet CmdBindIndexBuffer: ProcCmdBindIndexBuffer CmdBindIndexBuffer2: ProcCmdBindIndexBuffer2 CmdBindIndexBuffer2KHR: ProcCmdBindIndexBuffer2KHR +CmdBindIndexBuffer3KHR: ProcCmdBindIndexBuffer3KHR CmdBindInvocationMaskHUAWEI: ProcCmdBindInvocationMaskHUAWEI CmdBindPipeline: ProcCmdBindPipeline CmdBindPipelineShaderGroupNV: ProcCmdBindPipelineShaderGroupNV +CmdBindResourceHeapEXT: ProcCmdBindResourceHeapEXT +CmdBindSamplerHeapEXT: ProcCmdBindSamplerHeapEXT CmdBindShadersEXT: ProcCmdBindShadersEXT CmdBindShadingRateImageNV: ProcCmdBindShadingRateImageNV +CmdBindTileMemoryQCOM: ProcCmdBindTileMemoryQCOM +CmdBindTransformFeedbackBuffers2EXT: ProcCmdBindTransformFeedbackBuffers2EXT CmdBindTransformFeedbackBuffersEXT: ProcCmdBindTransformFeedbackBuffersEXT CmdBindVertexBuffers: ProcCmdBindVertexBuffers CmdBindVertexBuffers2: ProcCmdBindVertexBuffers2 CmdBindVertexBuffers2EXT: ProcCmdBindVertexBuffers2EXT +CmdBindVertexBuffers3KHR: ProcCmdBindVertexBuffers3KHR CmdBlitImage: ProcCmdBlitImage CmdBlitImage2: ProcCmdBlitImage2 CmdBlitImage2KHR: ProcCmdBlitImage2KHR @@ -906,48 +1034,68 @@ CmdCopyBuffer2KHR: ProcCmdCopyBuffer2KHR CmdCopyBufferToImage: ProcCmdCopyBufferToImage CmdCopyBufferToImage2: ProcCmdCopyBufferToImage2 CmdCopyBufferToImage2KHR: ProcCmdCopyBufferToImage2KHR +CmdCopyGpaSessionResultsAMD: ProcCmdCopyGpaSessionResultsAMD CmdCopyImage: ProcCmdCopyImage CmdCopyImage2: ProcCmdCopyImage2 CmdCopyImage2KHR: ProcCmdCopyImage2KHR CmdCopyImageToBuffer: ProcCmdCopyImageToBuffer CmdCopyImageToBuffer2: ProcCmdCopyImageToBuffer2 CmdCopyImageToBuffer2KHR: ProcCmdCopyImageToBuffer2KHR +CmdCopyImageToMemoryKHR: ProcCmdCopyImageToMemoryKHR +CmdCopyMemoryIndirectKHR: ProcCmdCopyMemoryIndirectKHR CmdCopyMemoryIndirectNV: ProcCmdCopyMemoryIndirectNV +CmdCopyMemoryKHR: ProcCmdCopyMemoryKHR CmdCopyMemoryToAccelerationStructureKHR: ProcCmdCopyMemoryToAccelerationStructureKHR +CmdCopyMemoryToImageIndirectKHR: ProcCmdCopyMemoryToImageIndirectKHR CmdCopyMemoryToImageIndirectNV: ProcCmdCopyMemoryToImageIndirectNV +CmdCopyMemoryToImageKHR: ProcCmdCopyMemoryToImageKHR CmdCopyMemoryToMicromapEXT: ProcCmdCopyMemoryToMicromapEXT CmdCopyMicromapEXT: ProcCmdCopyMicromapEXT CmdCopyMicromapToMemoryEXT: ProcCmdCopyMicromapToMemoryEXT CmdCopyQueryPoolResults: ProcCmdCopyQueryPoolResults +CmdCopyQueryPoolResultsToMemoryKHR: ProcCmdCopyQueryPoolResultsToMemoryKHR +CmdCopyTensorARM: ProcCmdCopyTensorARM CmdCuLaunchKernelNVX: ProcCmdCuLaunchKernelNVX CmdCudaLaunchKernelNV: ProcCmdCudaLaunchKernelNV CmdDebugMarkerBeginEXT: ProcCmdDebugMarkerBeginEXT CmdDebugMarkerEndEXT: ProcCmdDebugMarkerEndEXT CmdDebugMarkerInsertEXT: ProcCmdDebugMarkerInsertEXT CmdDecodeVideoKHR: ProcCmdDecodeVideoKHR +CmdDecompressMemoryEXT: ProcCmdDecompressMemoryEXT +CmdDecompressMemoryIndirectCountEXT: ProcCmdDecompressMemoryIndirectCountEXT CmdDecompressMemoryIndirectCountNV: ProcCmdDecompressMemoryIndirectCountNV CmdDecompressMemoryNV: ProcCmdDecompressMemoryNV CmdDispatch: ProcCmdDispatch CmdDispatchBase: ProcCmdDispatchBase CmdDispatchBaseKHR: ProcCmdDispatchBaseKHR +CmdDispatchDataGraphARM: ProcCmdDispatchDataGraphARM CmdDispatchGraphAMDX: ProcCmdDispatchGraphAMDX CmdDispatchGraphIndirectAMDX: ProcCmdDispatchGraphIndirectAMDX CmdDispatchGraphIndirectCountAMDX: ProcCmdDispatchGraphIndirectCountAMDX CmdDispatchIndirect: ProcCmdDispatchIndirect +CmdDispatchIndirect2KHR: ProcCmdDispatchIndirect2KHR +CmdDispatchTileQCOM: ProcCmdDispatchTileQCOM CmdDraw: ProcCmdDraw CmdDrawClusterHUAWEI: ProcCmdDrawClusterHUAWEI CmdDrawClusterIndirectHUAWEI: ProcCmdDrawClusterIndirectHUAWEI CmdDrawIndexed: ProcCmdDrawIndexed CmdDrawIndexedIndirect: ProcCmdDrawIndexedIndirect +CmdDrawIndexedIndirect2KHR: ProcCmdDrawIndexedIndirect2KHR CmdDrawIndexedIndirectCount: ProcCmdDrawIndexedIndirectCount +CmdDrawIndexedIndirectCount2KHR: ProcCmdDrawIndexedIndirectCount2KHR CmdDrawIndexedIndirectCountAMD: ProcCmdDrawIndexedIndirectCountAMD CmdDrawIndexedIndirectCountKHR: ProcCmdDrawIndexedIndirectCountKHR CmdDrawIndirect: ProcCmdDrawIndirect +CmdDrawIndirect2KHR: ProcCmdDrawIndirect2KHR +CmdDrawIndirectByteCount2EXT: ProcCmdDrawIndirectByteCount2EXT CmdDrawIndirectByteCountEXT: ProcCmdDrawIndirectByteCountEXT CmdDrawIndirectCount: ProcCmdDrawIndirectCount +CmdDrawIndirectCount2KHR: ProcCmdDrawIndirectCount2KHR CmdDrawIndirectCountAMD: ProcCmdDrawIndirectCountAMD CmdDrawIndirectCountKHR: ProcCmdDrawIndirectCountKHR CmdDrawMeshTasksEXT: ProcCmdDrawMeshTasksEXT +CmdDrawMeshTasksIndirect2EXT: ProcCmdDrawMeshTasksIndirect2EXT +CmdDrawMeshTasksIndirectCount2EXT: ProcCmdDrawMeshTasksIndirectCount2EXT CmdDrawMeshTasksIndirectCountEXT: ProcCmdDrawMeshTasksIndirectCountEXT CmdDrawMeshTasksIndirectCountNV: ProcCmdDrawMeshTasksIndirectCountNV CmdDrawMeshTasksIndirectEXT: ProcCmdDrawMeshTasksIndirectEXT @@ -958,19 +1106,27 @@ CmdDrawMultiIndexedEXT: ProcCmdDrawMultiIndexedE CmdEncodeVideoKHR: ProcCmdEncodeVideoKHR CmdEndConditionalRenderingEXT: ProcCmdEndConditionalRenderingEXT CmdEndDebugUtilsLabelEXT: ProcCmdEndDebugUtilsLabelEXT +CmdEndGpaSampleAMD: ProcCmdEndGpaSampleAMD +CmdEndGpaSessionAMD: ProcCmdEndGpaSessionAMD +CmdEndPerTileExecutionQCOM: ProcCmdEndPerTileExecutionQCOM CmdEndQuery: ProcCmdEndQuery CmdEndQueryIndexedEXT: ProcCmdEndQueryIndexedEXT CmdEndRenderPass: ProcCmdEndRenderPass CmdEndRenderPass2: ProcCmdEndRenderPass2 CmdEndRenderPass2KHR: ProcCmdEndRenderPass2KHR CmdEndRendering: ProcCmdEndRendering +CmdEndRendering2EXT: ProcCmdEndRendering2EXT +CmdEndRendering2KHR: ProcCmdEndRendering2KHR CmdEndRenderingKHR: ProcCmdEndRenderingKHR +CmdEndShaderInstrumentationARM: ProcCmdEndShaderInstrumentationARM +CmdEndTransformFeedback2EXT: ProcCmdEndTransformFeedback2EXT CmdEndTransformFeedbackEXT: ProcCmdEndTransformFeedbackEXT CmdEndVideoCodingKHR: ProcCmdEndVideoCodingKHR CmdExecuteCommands: ProcCmdExecuteCommands CmdExecuteGeneratedCommandsEXT: ProcCmdExecuteGeneratedCommandsEXT CmdExecuteGeneratedCommandsNV: ProcCmdExecuteGeneratedCommandsNV CmdFillBuffer: ProcCmdFillBuffer +CmdFillMemoryKHR: ProcCmdFillMemoryKHR CmdInitializeGraphScratchMemoryAMDX: ProcCmdInitializeGraphScratchMemoryAMDX CmdInsertDebugUtilsLabelEXT: ProcCmdInsertDebugUtilsLabelEXT CmdNextSubpass: ProcCmdNextSubpass @@ -985,6 +1141,7 @@ CmdPreprocessGeneratedCommandsNV: ProcCmdPreprocessGenerat CmdPushConstants: ProcCmdPushConstants CmdPushConstants2: ProcCmdPushConstants2 CmdPushConstants2KHR: ProcCmdPushConstants2KHR +CmdPushDataEXT: ProcCmdPushDataEXT CmdPushDescriptorSet: ProcCmdPushDescriptorSet CmdPushDescriptorSet2: ProcCmdPushDescriptorSet2 CmdPushDescriptorSet2KHR: ProcCmdPushDescriptorSet2KHR @@ -1009,7 +1166,9 @@ CmdSetCoarseSampleOrderNV: ProcCmdSetCoarseSampleOr CmdSetColorBlendAdvancedEXT: ProcCmdSetColorBlendAdvancedEXT CmdSetColorBlendEnableEXT: ProcCmdSetColorBlendEnableEXT CmdSetColorBlendEquationEXT: ProcCmdSetColorBlendEquationEXT +CmdSetColorWriteEnableEXT: ProcCmdSetColorWriteEnableEXT CmdSetColorWriteMaskEXT: ProcCmdSetColorWriteMaskEXT +CmdSetComputeOccupancyPriorityNV: ProcCmdSetComputeOccupancyPriorityNV CmdSetConservativeRasterizationModeEXT: ProcCmdSetConservativeRasterizationModeEXT CmdSetCoverageModulationModeNV: ProcCmdSetCoverageModulationModeNV CmdSetCoverageModulationTableEnableNV: ProcCmdSetCoverageModulationTableEnableNV @@ -1043,6 +1202,7 @@ CmdSetDeviceMaskKHR: ProcCmdSetDeviceMaskKHR CmdSetDiscardRectangleEXT: ProcCmdSetDiscardRectangleEXT CmdSetDiscardRectangleEnableEXT: ProcCmdSetDiscardRectangleEnableEXT CmdSetDiscardRectangleModeEXT: ProcCmdSetDiscardRectangleModeEXT +CmdSetDispatchParametersARM: ProcCmdSetDispatchParametersARM CmdSetEvent: ProcCmdSetEvent CmdSetEvent2: ProcCmdSetEvent2 CmdSetEvent2KHR: ProcCmdSetEvent2KHR @@ -1068,6 +1228,7 @@ CmdSetPerformanceStreamMarkerINTEL: ProcCmdSetPerformanceStr CmdSetPolygonModeEXT: ProcCmdSetPolygonModeEXT CmdSetPrimitiveRestartEnable: ProcCmdSetPrimitiveRestartEnable CmdSetPrimitiveRestartEnableEXT: ProcCmdSetPrimitiveRestartEnableEXT +CmdSetPrimitiveRestartIndexEXT: ProcCmdSetPrimitiveRestartIndexEXT CmdSetPrimitiveTopology: ProcCmdSetPrimitiveTopology CmdSetPrimitiveTopologyEXT: ProcCmdSetPrimitiveTopologyEXT CmdSetProvokingVertexModeEXT: ProcCmdSetProvokingVertexModeEXT @@ -1110,6 +1271,7 @@ CmdTraceRaysIndirectKHR: ProcCmdTraceRaysIndirect CmdTraceRaysKHR: ProcCmdTraceRaysKHR CmdTraceRaysNV: ProcCmdTraceRaysNV CmdUpdateBuffer: ProcCmdUpdateBuffer +CmdUpdateMemoryKHR: ProcCmdUpdateMemoryKHR CmdUpdatePipelineIndirectBufferNV: ProcCmdUpdatePipelineIndirectBufferNV CmdWaitEvents: ProcCmdWaitEvents CmdWaitEvents2: ProcCmdWaitEvents2 @@ -1118,6 +1280,7 @@ CmdWriteAccelerationStructuresPropertiesKHR: ProcCmdWriteAcceleration CmdWriteAccelerationStructuresPropertiesNV: ProcCmdWriteAccelerationStructuresPropertiesNV CmdWriteBufferMarker2AMD: ProcCmdWriteBufferMarker2AMD CmdWriteBufferMarkerAMD: ProcCmdWriteBufferMarkerAMD +CmdWriteMarkerToMemoryAMD: ProcCmdWriteMarkerToMemoryAMD CmdWriteMicromapsPropertiesEXT: ProcCmdWriteMicromapsPropertiesEXT CmdWriteTimestamp: ProcCmdWriteTimestamp CmdWriteTimestamp2: ProcCmdWriteTimestamp2 @@ -1136,6 +1299,7 @@ CopyMemoryToImageEXT: ProcCopyMemoryToImageEXT CopyMemoryToMicromapEXT: ProcCopyMemoryToMicromapEXT CopyMicromapEXT: ProcCopyMicromapEXT CopyMicromapToMemoryEXT: ProcCopyMicromapToMemoryEXT +CreateAccelerationStructure2KHR: ProcCreateAccelerationStructure2KHR CreateAccelerationStructureKHR: ProcCreateAccelerationStructureKHR CreateAccelerationStructureNV: ProcCreateAccelerationStructureNV CreateBuffer: ProcCreateBuffer @@ -1146,6 +1310,8 @@ CreateCuFunctionNVX: ProcCreateCuFunctionNVX CreateCuModuleNVX: ProcCreateCuModuleNVX CreateCudaFunctionNV: ProcCreateCudaFunctionNV CreateCudaModuleNV: ProcCreateCudaModuleNV +CreateDataGraphPipelineSessionARM: ProcCreateDataGraphPipelineSessionARM +CreateDataGraphPipelinesARM: ProcCreateDataGraphPipelinesARM CreateDeferredOperationKHR: ProcCreateDeferredOperationKHR CreateDescriptorPool: ProcCreateDescriptorPool CreateDescriptorSetLayout: ProcCreateDescriptorSetLayout @@ -1153,8 +1319,10 @@ CreateDescriptorUpdateTemplate: ProcCreateDescriptorUpda CreateDescriptorUpdateTemplateKHR: ProcCreateDescriptorUpdateTemplateKHR CreateEvent: ProcCreateEvent CreateExecutionGraphPipelinesAMDX: ProcCreateExecutionGraphPipelinesAMDX +CreateExternalComputeQueueNV: ProcCreateExternalComputeQueueNV CreateFence: ProcCreateFence CreateFramebuffer: ProcCreateFramebuffer +CreateGpaSessionAMD: ProcCreateGpaSessionAMD CreateGraphicsPipelines: ProcCreateGraphicsPipelines CreateImage: ProcCreateImage CreateImageView: ProcCreateImageView @@ -1178,10 +1346,13 @@ CreateSampler: ProcCreateSampler CreateSamplerYcbcrConversion: ProcCreateSamplerYcbcrConversion CreateSamplerYcbcrConversionKHR: ProcCreateSamplerYcbcrConversionKHR CreateSemaphore: ProcCreateSemaphore +CreateShaderInstrumentationARM: ProcCreateShaderInstrumentationARM CreateShaderModule: ProcCreateShaderModule CreateShadersEXT: ProcCreateShadersEXT CreateSharedSwapchainsKHR: ProcCreateSharedSwapchainsKHR CreateSwapchainKHR: ProcCreateSwapchainKHR +CreateTensorARM: ProcCreateTensorARM +CreateTensorViewARM: ProcCreateTensorViewARM CreateValidationCacheEXT: ProcCreateValidationCacheEXT CreateVideoSessionKHR: ProcCreateVideoSessionKHR CreateVideoSessionParametersKHR: ProcCreateVideoSessionParametersKHR @@ -1197,6 +1368,7 @@ DestroyCuFunctionNVX: ProcDestroyCuFunctionNVX DestroyCuModuleNVX: ProcDestroyCuModuleNVX DestroyCudaFunctionNV: ProcDestroyCudaFunctionNV DestroyCudaModuleNV: ProcDestroyCudaModuleNV +DestroyDataGraphPipelineSessionARM: ProcDestroyDataGraphPipelineSessionARM DestroyDeferredOperationKHR: ProcDestroyDeferredOperationKHR DestroyDescriptorPool: ProcDestroyDescriptorPool DestroyDescriptorSetLayout: ProcDestroyDescriptorSetLayout @@ -1204,8 +1376,10 @@ DestroyDescriptorUpdateTemplate: ProcDestroyDescriptorUpd DestroyDescriptorUpdateTemplateKHR: ProcDestroyDescriptorUpdateTemplateKHR DestroyDevice: ProcDestroyDevice DestroyEvent: ProcDestroyEvent +DestroyExternalComputeQueueNV: ProcDestroyExternalComputeQueueNV DestroyFence: ProcDestroyFence DestroyFramebuffer: ProcDestroyFramebuffer +DestroyGpaSessionAMD: ProcDestroyGpaSessionAMD DestroyImage: ProcDestroyImage DestroyImageView: ProcDestroyImageView DestroyIndirectCommandsLayoutEXT: ProcDestroyIndirectCommandsLayoutEXT @@ -1226,8 +1400,11 @@ DestroySamplerYcbcrConversion: ProcDestroySamplerYcbcrC DestroySamplerYcbcrConversionKHR: ProcDestroySamplerYcbcrConversionKHR DestroySemaphore: ProcDestroySemaphore DestroyShaderEXT: ProcDestroyShaderEXT +DestroyShaderInstrumentationARM: ProcDestroyShaderInstrumentationARM DestroyShaderModule: ProcDestroyShaderModule DestroySwapchainKHR: ProcDestroySwapchainKHR +DestroyTensorARM: ProcDestroyTensorARM +DestroyTensorViewARM: ProcDestroyTensorViewARM DestroyValidationCacheEXT: ProcDestroyValidationCacheEXT DestroyVideoSessionKHR: ProcDestroyVideoSessionKHR DestroyVideoSessionParametersKHR: ProcDestroyVideoSessionParametersKHR @@ -1257,6 +1434,10 @@ GetCalibratedTimestampsEXT: ProcGetCalibratedTimesta GetCalibratedTimestampsKHR: ProcGetCalibratedTimestampsKHR GetClusterAccelerationStructureBuildSizesNV: ProcGetClusterAccelerationStructureBuildSizesNV GetCudaModuleCacheNV: ProcGetCudaModuleCacheNV +GetDataGraphPipelineAvailablePropertiesARM: ProcGetDataGraphPipelineAvailablePropertiesARM +GetDataGraphPipelinePropertiesARM: ProcGetDataGraphPipelinePropertiesARM +GetDataGraphPipelineSessionBindPointRequirementsARM: ProcGetDataGraphPipelineSessionBindPointRequirementsARM +GetDataGraphPipelineSessionMemoryRequirementsARM: ProcGetDataGraphPipelineSessionMemoryRequirementsARM GetDeferredOperationMaxConcurrencyKHR: ProcGetDeferredOperationMaxConcurrencyKHR GetDeferredOperationResultKHR: ProcGetDeferredOperationResultKHR GetDescriptorEXT: ProcGetDescriptorEXT @@ -1269,7 +1450,10 @@ GetDescriptorSetLayoutSupportKHR: ProcGetDescriptorSetLayo GetDeviceAccelerationStructureCompatibilityKHR: ProcGetDeviceAccelerationStructureCompatibilityKHR GetDeviceBufferMemoryRequirements: ProcGetDeviceBufferMemoryRequirements GetDeviceBufferMemoryRequirementsKHR: ProcGetDeviceBufferMemoryRequirementsKHR +GetDeviceCombinedImageSamplerIndexNVX: ProcGetDeviceCombinedImageSamplerIndexNVX +GetDeviceFaultDebugInfoKHR: ProcGetDeviceFaultDebugInfoKHR GetDeviceFaultInfoEXT: ProcGetDeviceFaultInfoEXT +GetDeviceFaultReportsKHR: ProcGetDeviceFaultReportsKHR GetDeviceGroupPeerMemoryFeatures: ProcGetDeviceGroupPeerMemoryFeatures GetDeviceGroupPeerMemoryFeaturesKHR: ProcGetDeviceGroupPeerMemoryFeaturesKHR GetDeviceGroupPresentCapabilitiesKHR: ProcGetDeviceGroupPresentCapabilitiesKHR @@ -1289,6 +1473,7 @@ GetDeviceProcAddr: ProcGetDeviceProcAddr GetDeviceQueue: ProcGetDeviceQueue GetDeviceQueue2: ProcGetDeviceQueue2 GetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI: ProcGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI +GetDeviceTensorMemoryRequirementsARM: ProcGetDeviceTensorMemoryRequirementsARM GetDynamicRenderingTilePropertiesQCOM: ProcGetDynamicRenderingTilePropertiesQCOM GetEncodedVideoSessionParametersKHR: ProcGetEncodedVideoSessionParametersKHR GetEventStatus: ProcGetEventStatus @@ -1300,10 +1485,14 @@ GetFenceWin32HandleKHR: ProcGetFenceWin32HandleK GetFramebufferTilePropertiesQCOM: ProcGetFramebufferTilePropertiesQCOM GetGeneratedCommandsMemoryRequirementsEXT: ProcGetGeneratedCommandsMemoryRequirementsEXT GetGeneratedCommandsMemoryRequirementsNV: ProcGetGeneratedCommandsMemoryRequirementsNV +GetGpaDeviceClockInfoAMD: ProcGetGpaDeviceClockInfoAMD +GetGpaSessionResultsAMD: ProcGetGpaSessionResultsAMD +GetGpaSessionStatusAMD: ProcGetGpaSessionStatusAMD GetImageDrmFormatModifierPropertiesEXT: ProcGetImageDrmFormatModifierPropertiesEXT GetImageMemoryRequirements: ProcGetImageMemoryRequirements GetImageMemoryRequirements2: ProcGetImageMemoryRequirements2 GetImageMemoryRequirements2KHR: ProcGetImageMemoryRequirements2KHR +GetImageOpaqueCaptureDataEXT: ProcGetImageOpaqueCaptureDataEXT GetImageOpaqueCaptureDescriptorDataEXT: ProcGetImageOpaqueCaptureDescriptorDataEXT GetImageSparseMemoryRequirements: ProcGetImageSparseMemoryRequirements GetImageSparseMemoryRequirements2: ProcGetImageSparseMemoryRequirements2 @@ -1328,6 +1517,7 @@ GetMemoryWin32HandleNV: ProcGetMemoryWin32Handle GetMemoryWin32HandlePropertiesKHR: ProcGetMemoryWin32HandlePropertiesKHR GetMicromapBuildSizesEXT: ProcGetMicromapBuildSizesEXT GetPartitionedAccelerationStructuresBuildSizesNV: ProcGetPartitionedAccelerationStructuresBuildSizesNV +GetPastPresentationTimingEXT: ProcGetPastPresentationTimingEXT GetPastPresentationTimingGOOGLE: ProcGetPastPresentationTimingGOOGLE GetPerformanceParameterINTEL: ProcGetPerformanceParameterINTEL GetPipelineBinaryDataKHR: ProcGetPipelineBinaryDataKHR @@ -1359,11 +1549,18 @@ GetSemaphoreFdKHR: ProcGetSemaphoreFdKHR GetSemaphoreWin32HandleKHR: ProcGetSemaphoreWin32HandleKHR GetShaderBinaryDataEXT: ProcGetShaderBinaryDataEXT GetShaderInfoAMD: ProcGetShaderInfoAMD +GetShaderInstrumentationValuesARM: ProcGetShaderInstrumentationValuesARM GetShaderModuleCreateInfoIdentifierEXT: ProcGetShaderModuleCreateInfoIdentifierEXT GetShaderModuleIdentifierEXT: ProcGetShaderModuleIdentifierEXT GetSwapchainCounterEXT: ProcGetSwapchainCounterEXT GetSwapchainImagesKHR: ProcGetSwapchainImagesKHR GetSwapchainStatusKHR: ProcGetSwapchainStatusKHR +GetSwapchainTimeDomainPropertiesEXT: ProcGetSwapchainTimeDomainPropertiesEXT +GetSwapchainTimingPropertiesEXT: ProcGetSwapchainTimingPropertiesEXT +GetTensorMemoryRequirementsARM: ProcGetTensorMemoryRequirementsARM +GetTensorOpaqueCaptureDataARM: ProcGetTensorOpaqueCaptureDataARM +GetTensorOpaqueCaptureDescriptorDataARM: ProcGetTensorOpaqueCaptureDescriptorDataARM +GetTensorViewOpaqueCaptureDescriptorDataARM: ProcGetTensorViewOpaqueCaptureDescriptorDataARM GetValidationCacheDataEXT: ProcGetValidationCacheDataEXT GetVideoSessionMemoryRequirementsKHR: ProcGetVideoSessionMemoryRequirementsKHR ImportFenceFdKHR: ProcImportFenceFdKHR @@ -1389,6 +1586,7 @@ QueueSubmit: ProcQueueSubmit QueueSubmit2: ProcQueueSubmit2 QueueSubmit2KHR: ProcQueueSubmit2KHR QueueWaitIdle: ProcQueueWaitIdle +RegisterCustomBorderColorEXT: ProcRegisterCustomBorderColorEXT RegisterDeviceEventEXT: ProcRegisterDeviceEventEXT RegisterDisplayEventEXT: ProcRegisterDisplayEventEXT ReleaseCapturedPipelineDataKHR: ProcReleaseCapturedPipelineDataKHR @@ -1396,23 +1594,27 @@ ReleaseFullScreenExclusiveModeEXT: ProcReleaseFullScreenExc ReleasePerformanceConfigurationINTEL: ProcReleasePerformanceConfigurationINTEL ReleaseProfilingLockKHR: ProcReleaseProfilingLockKHR ReleaseSwapchainImagesEXT: ProcReleaseSwapchainImagesEXT +ReleaseSwapchainImagesKHR: ProcReleaseSwapchainImagesKHR ResetCommandBuffer: ProcResetCommandBuffer ResetCommandPool: ProcResetCommandPool ResetDescriptorPool: ProcResetDescriptorPool ResetEvent: ProcResetEvent ResetFences: ProcResetFences +ResetGpaSessionAMD: ProcResetGpaSessionAMD ResetQueryPool: ProcResetQueryPool ResetQueryPoolEXT: ProcResetQueryPoolEXT SetDebugUtilsObjectNameEXT: ProcSetDebugUtilsObjectNameEXT SetDebugUtilsObjectTagEXT: ProcSetDebugUtilsObjectTagEXT SetDeviceMemoryPriorityEXT: ProcSetDeviceMemoryPriorityEXT SetEvent: ProcSetEvent +SetGpaDeviceClockModeAMD: ProcSetGpaDeviceClockModeAMD SetHdrMetadataEXT: ProcSetHdrMetadataEXT SetLatencyMarkerNV: ProcSetLatencyMarkerNV SetLatencySleepModeNV: ProcSetLatencySleepModeNV SetLocalDimmingAMD: ProcSetLocalDimmingAMD SetPrivateData: ProcSetPrivateData SetPrivateDataEXT: ProcSetPrivateDataEXT +SetSwapchainPresentTimingQueueSizeEXT: ProcSetSwapchainPresentTimingQueueSizeEXT SignalSemaphore: ProcSignalSemaphore SignalSemaphoreKHR: ProcSignalSemaphoreKHR TransitionImageLayout: ProcTransitionImageLayout @@ -1423,6 +1625,7 @@ UninitializePerformanceApiINTEL: ProcUninitializePerforma UnmapMemory: ProcUnmapMemory UnmapMemory2: ProcUnmapMemory2 UnmapMemory2KHR: ProcUnmapMemory2KHR +UnregisterCustomBorderColorEXT: ProcUnregisterCustomBorderColorEXT UpdateDescriptorSetWithTemplate: ProcUpdateDescriptorSetWithTemplate UpdateDescriptorSetWithTemplateKHR: ProcUpdateDescriptorSetWithTemplateKHR UpdateDescriptorSets: ProcUpdateDescriptorSets @@ -1430,11 +1633,14 @@ UpdateIndirectExecutionSetPipelineEXT: ProcUpdateIndirectExecut UpdateIndirectExecutionSetShaderEXT: ProcUpdateIndirectExecutionSetShaderEXT UpdateVideoSessionParametersKHR: ProcUpdateVideoSessionParametersKHR WaitForFences: ProcWaitForFences +WaitForPresent2KHR: ProcWaitForPresent2KHR WaitForPresentKHR: ProcWaitForPresentKHR WaitSemaphores: ProcWaitSemaphores WaitSemaphoresKHR: ProcWaitSemaphoresKHR WriteAccelerationStructuresPropertiesKHR: ProcWriteAccelerationStructuresPropertiesKHR WriteMicromapsPropertiesEXT: ProcWriteMicromapsPropertiesEXT +WriteResourceDescriptorsEXT: ProcWriteResourceDescriptorsEXT +WriteSamplerDescriptorsEXT: ProcWriteSamplerDescriptorsEXT load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { // Loader Procedures @@ -1444,106 +1650,115 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&EnumerateInstanceExtensionProperties, "vkEnumerateInstanceExtensionProperties") set_proc_address(&EnumerateInstanceLayerProperties, "vkEnumerateInstanceLayerProperties") set_proc_address(&EnumerateInstanceVersion, "vkEnumerateInstanceVersion") + set_proc_address(&GetExternalComputeQueueDataNV, "vkGetExternalComputeQueueDataNV") set_proc_address(&GetInstanceProcAddr, "vkGetInstanceProcAddr") // Instance Procedures - set_proc_address(&AcquireDrmDisplayEXT, "vkAcquireDrmDisplayEXT") - set_proc_address(&AcquireWinrtDisplayNV, "vkAcquireWinrtDisplayNV") - set_proc_address(&CreateDebugReportCallbackEXT, "vkCreateDebugReportCallbackEXT") - set_proc_address(&CreateDebugUtilsMessengerEXT, "vkCreateDebugUtilsMessengerEXT") - set_proc_address(&CreateDevice, "vkCreateDevice") - set_proc_address(&CreateDisplayModeKHR, "vkCreateDisplayModeKHR") - set_proc_address(&CreateDisplayPlaneSurfaceKHR, "vkCreateDisplayPlaneSurfaceKHR") - set_proc_address(&CreateHeadlessSurfaceEXT, "vkCreateHeadlessSurfaceEXT") - set_proc_address(&CreateIOSSurfaceMVK, "vkCreateIOSSurfaceMVK") - set_proc_address(&CreateMacOSSurfaceMVK, "vkCreateMacOSSurfaceMVK") - set_proc_address(&CreateMetalSurfaceEXT, "vkCreateMetalSurfaceEXT") - set_proc_address(&CreateWaylandSurfaceKHR, "vkCreateWaylandSurfaceKHR") - set_proc_address(&CreateWin32SurfaceKHR, "vkCreateWin32SurfaceKHR") - set_proc_address(&CreateXcbSurfaceKHR, "vkCreateXcbSurfaceKHR") - set_proc_address(&CreateXlibSurfaceKHR, "vkCreateXlibSurfaceKHR") - set_proc_address(&DebugReportMessageEXT, "vkDebugReportMessageEXT") - set_proc_address(&DestroyDebugReportCallbackEXT, "vkDestroyDebugReportCallbackEXT") - set_proc_address(&DestroyDebugUtilsMessengerEXT, "vkDestroyDebugUtilsMessengerEXT") - set_proc_address(&DestroyInstance, "vkDestroyInstance") - set_proc_address(&DestroySurfaceKHR, "vkDestroySurfaceKHR") - set_proc_address(&EnumerateDeviceExtensionProperties, "vkEnumerateDeviceExtensionProperties") - set_proc_address(&EnumerateDeviceLayerProperties, "vkEnumerateDeviceLayerProperties") - set_proc_address(&EnumeratePhysicalDeviceGroups, "vkEnumeratePhysicalDeviceGroups") - set_proc_address(&EnumeratePhysicalDeviceGroupsKHR, "vkEnumeratePhysicalDeviceGroupsKHR") - set_proc_address(&EnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR, "vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR") - set_proc_address(&EnumeratePhysicalDevices, "vkEnumeratePhysicalDevices") - set_proc_address(&GetDisplayModeProperties2KHR, "vkGetDisplayModeProperties2KHR") - set_proc_address(&GetDisplayModePropertiesKHR, "vkGetDisplayModePropertiesKHR") - set_proc_address(&GetDisplayPlaneCapabilities2KHR, "vkGetDisplayPlaneCapabilities2KHR") - set_proc_address(&GetDisplayPlaneCapabilitiesKHR, "vkGetDisplayPlaneCapabilitiesKHR") - set_proc_address(&GetDisplayPlaneSupportedDisplaysKHR, "vkGetDisplayPlaneSupportedDisplaysKHR") - set_proc_address(&GetDrmDisplayEXT, "vkGetDrmDisplayEXT") - set_proc_address(&GetInstanceProcAddrLUNARG, "vkGetInstanceProcAddrLUNARG") - set_proc_address(&GetPhysicalDeviceCalibrateableTimeDomainsEXT, "vkGetPhysicalDeviceCalibrateableTimeDomainsEXT") - set_proc_address(&GetPhysicalDeviceCalibrateableTimeDomainsKHR, "vkGetPhysicalDeviceCalibrateableTimeDomainsKHR") - set_proc_address(&GetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV, "vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV") - set_proc_address(&GetPhysicalDeviceCooperativeMatrixPropertiesKHR, "vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR") - set_proc_address(&GetPhysicalDeviceCooperativeMatrixPropertiesNV, "vkGetPhysicalDeviceCooperativeMatrixPropertiesNV") - set_proc_address(&GetPhysicalDeviceCooperativeVectorPropertiesNV, "vkGetPhysicalDeviceCooperativeVectorPropertiesNV") - set_proc_address(&GetPhysicalDeviceDisplayPlaneProperties2KHR, "vkGetPhysicalDeviceDisplayPlaneProperties2KHR") - set_proc_address(&GetPhysicalDeviceDisplayPlanePropertiesKHR, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR") - set_proc_address(&GetPhysicalDeviceDisplayProperties2KHR, "vkGetPhysicalDeviceDisplayProperties2KHR") - set_proc_address(&GetPhysicalDeviceDisplayPropertiesKHR, "vkGetPhysicalDeviceDisplayPropertiesKHR") - set_proc_address(&GetPhysicalDeviceExternalBufferProperties, "vkGetPhysicalDeviceExternalBufferProperties") - set_proc_address(&GetPhysicalDeviceExternalBufferPropertiesKHR, "vkGetPhysicalDeviceExternalBufferPropertiesKHR") - set_proc_address(&GetPhysicalDeviceExternalFenceProperties, "vkGetPhysicalDeviceExternalFenceProperties") - set_proc_address(&GetPhysicalDeviceExternalFencePropertiesKHR, "vkGetPhysicalDeviceExternalFencePropertiesKHR") - set_proc_address(&GetPhysicalDeviceExternalImageFormatPropertiesNV, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV") - set_proc_address(&GetPhysicalDeviceExternalSemaphoreProperties, "vkGetPhysicalDeviceExternalSemaphoreProperties") - set_proc_address(&GetPhysicalDeviceExternalSemaphorePropertiesKHR, "vkGetPhysicalDeviceExternalSemaphorePropertiesKHR") - set_proc_address(&GetPhysicalDeviceFeatures, "vkGetPhysicalDeviceFeatures") - set_proc_address(&GetPhysicalDeviceFeatures2, "vkGetPhysicalDeviceFeatures2") - set_proc_address(&GetPhysicalDeviceFeatures2KHR, "vkGetPhysicalDeviceFeatures2KHR") - set_proc_address(&GetPhysicalDeviceFormatProperties, "vkGetPhysicalDeviceFormatProperties") - set_proc_address(&GetPhysicalDeviceFormatProperties2, "vkGetPhysicalDeviceFormatProperties2") - set_proc_address(&GetPhysicalDeviceFormatProperties2KHR, "vkGetPhysicalDeviceFormatProperties2KHR") - set_proc_address(&GetPhysicalDeviceFragmentShadingRatesKHR, "vkGetPhysicalDeviceFragmentShadingRatesKHR") - set_proc_address(&GetPhysicalDeviceImageFormatProperties, "vkGetPhysicalDeviceImageFormatProperties") - set_proc_address(&GetPhysicalDeviceImageFormatProperties2, "vkGetPhysicalDeviceImageFormatProperties2") - set_proc_address(&GetPhysicalDeviceImageFormatProperties2KHR, "vkGetPhysicalDeviceImageFormatProperties2KHR") - set_proc_address(&GetPhysicalDeviceMemoryProperties, "vkGetPhysicalDeviceMemoryProperties") - set_proc_address(&GetPhysicalDeviceMemoryProperties2, "vkGetPhysicalDeviceMemoryProperties2") - set_proc_address(&GetPhysicalDeviceMemoryProperties2KHR, "vkGetPhysicalDeviceMemoryProperties2KHR") - set_proc_address(&GetPhysicalDeviceMultisamplePropertiesEXT, "vkGetPhysicalDeviceMultisamplePropertiesEXT") - set_proc_address(&GetPhysicalDeviceOpticalFlowImageFormatsNV, "vkGetPhysicalDeviceOpticalFlowImageFormatsNV") - set_proc_address(&GetPhysicalDevicePresentRectanglesKHR, "vkGetPhysicalDevicePresentRectanglesKHR") - set_proc_address(&GetPhysicalDeviceProperties, "vkGetPhysicalDeviceProperties") - set_proc_address(&GetPhysicalDeviceProperties2, "vkGetPhysicalDeviceProperties2") - set_proc_address(&GetPhysicalDeviceProperties2KHR, "vkGetPhysicalDeviceProperties2KHR") - set_proc_address(&GetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR, "vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR") - set_proc_address(&GetPhysicalDeviceQueueFamilyProperties, "vkGetPhysicalDeviceQueueFamilyProperties") - set_proc_address(&GetPhysicalDeviceQueueFamilyProperties2, "vkGetPhysicalDeviceQueueFamilyProperties2") - set_proc_address(&GetPhysicalDeviceQueueFamilyProperties2KHR, "vkGetPhysicalDeviceQueueFamilyProperties2KHR") - set_proc_address(&GetPhysicalDeviceSparseImageFormatProperties, "vkGetPhysicalDeviceSparseImageFormatProperties") - set_proc_address(&GetPhysicalDeviceSparseImageFormatProperties2, "vkGetPhysicalDeviceSparseImageFormatProperties2") - set_proc_address(&GetPhysicalDeviceSparseImageFormatProperties2KHR, "vkGetPhysicalDeviceSparseImageFormatProperties2KHR") - set_proc_address(&GetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV, "vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV") - set_proc_address(&GetPhysicalDeviceSurfaceCapabilities2EXT, "vkGetPhysicalDeviceSurfaceCapabilities2EXT") - set_proc_address(&GetPhysicalDeviceSurfaceCapabilities2KHR, "vkGetPhysicalDeviceSurfaceCapabilities2KHR") - set_proc_address(&GetPhysicalDeviceSurfaceCapabilitiesKHR, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR") - set_proc_address(&GetPhysicalDeviceSurfaceFormats2KHR, "vkGetPhysicalDeviceSurfaceFormats2KHR") - set_proc_address(&GetPhysicalDeviceSurfaceFormatsKHR, "vkGetPhysicalDeviceSurfaceFormatsKHR") - set_proc_address(&GetPhysicalDeviceSurfacePresentModes2EXT, "vkGetPhysicalDeviceSurfacePresentModes2EXT") - set_proc_address(&GetPhysicalDeviceSurfacePresentModesKHR, "vkGetPhysicalDeviceSurfacePresentModesKHR") - set_proc_address(&GetPhysicalDeviceSurfaceSupportKHR, "vkGetPhysicalDeviceSurfaceSupportKHR") - set_proc_address(&GetPhysicalDeviceToolProperties, "vkGetPhysicalDeviceToolProperties") - set_proc_address(&GetPhysicalDeviceToolPropertiesEXT, "vkGetPhysicalDeviceToolPropertiesEXT") - set_proc_address(&GetPhysicalDeviceVideoCapabilitiesKHR, "vkGetPhysicalDeviceVideoCapabilitiesKHR") - set_proc_address(&GetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR, "vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR") - set_proc_address(&GetPhysicalDeviceVideoFormatPropertiesKHR, "vkGetPhysicalDeviceVideoFormatPropertiesKHR") - set_proc_address(&GetPhysicalDeviceWaylandPresentationSupportKHR, "vkGetPhysicalDeviceWaylandPresentationSupportKHR") - set_proc_address(&GetPhysicalDeviceWin32PresentationSupportKHR, "vkGetPhysicalDeviceWin32PresentationSupportKHR") - set_proc_address(&GetPhysicalDeviceXcbPresentationSupportKHR, "vkGetPhysicalDeviceXcbPresentationSupportKHR") - set_proc_address(&GetPhysicalDeviceXlibPresentationSupportKHR, "vkGetPhysicalDeviceXlibPresentationSupportKHR") - set_proc_address(&GetWinrtDisplayNV, "vkGetWinrtDisplayNV") - set_proc_address(&ReleaseDisplayEXT, "vkReleaseDisplayEXT") - set_proc_address(&SubmitDebugUtilsMessageEXT, "vkSubmitDebugUtilsMessageEXT") + set_proc_address(&AcquireDrmDisplayEXT, "vkAcquireDrmDisplayEXT") + set_proc_address(&AcquireWinrtDisplayNV, "vkAcquireWinrtDisplayNV") + set_proc_address(&CreateDebugReportCallbackEXT, "vkCreateDebugReportCallbackEXT") + set_proc_address(&CreateDebugUtilsMessengerEXT, "vkCreateDebugUtilsMessengerEXT") + set_proc_address(&CreateDevice, "vkCreateDevice") + set_proc_address(&CreateDisplayModeKHR, "vkCreateDisplayModeKHR") + set_proc_address(&CreateDisplayPlaneSurfaceKHR, "vkCreateDisplayPlaneSurfaceKHR") + set_proc_address(&CreateHeadlessSurfaceEXT, "vkCreateHeadlessSurfaceEXT") + set_proc_address(&CreateIOSSurfaceMVK, "vkCreateIOSSurfaceMVK") + set_proc_address(&CreateMacOSSurfaceMVK, "vkCreateMacOSSurfaceMVK") + set_proc_address(&CreateMetalSurfaceEXT, "vkCreateMetalSurfaceEXT") + set_proc_address(&CreateWaylandSurfaceKHR, "vkCreateWaylandSurfaceKHR") + set_proc_address(&CreateWin32SurfaceKHR, "vkCreateWin32SurfaceKHR") + set_proc_address(&CreateXcbSurfaceKHR, "vkCreateXcbSurfaceKHR") + set_proc_address(&CreateXlibSurfaceKHR, "vkCreateXlibSurfaceKHR") + set_proc_address(&DebugReportMessageEXT, "vkDebugReportMessageEXT") + set_proc_address(&DestroyDebugReportCallbackEXT, "vkDestroyDebugReportCallbackEXT") + set_proc_address(&DestroyDebugUtilsMessengerEXT, "vkDestroyDebugUtilsMessengerEXT") + set_proc_address(&DestroyInstance, "vkDestroyInstance") + set_proc_address(&DestroySurfaceKHR, "vkDestroySurfaceKHR") + set_proc_address(&EnumerateDeviceExtensionProperties, "vkEnumerateDeviceExtensionProperties") + set_proc_address(&EnumerateDeviceLayerProperties, "vkEnumerateDeviceLayerProperties") + set_proc_address(&EnumeratePhysicalDeviceGroups, "vkEnumeratePhysicalDeviceGroups") + set_proc_address(&EnumeratePhysicalDeviceGroupsKHR, "vkEnumeratePhysicalDeviceGroupsKHR") + set_proc_address(&EnumeratePhysicalDeviceQueueFamilyPerformanceCountersByRegionARM, "vkEnumeratePhysicalDeviceQueueFamilyPerformanceCountersByRegionARM") + set_proc_address(&EnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR, "vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR") + set_proc_address(&EnumeratePhysicalDeviceShaderInstrumentationMetricsARM, "vkEnumeratePhysicalDeviceShaderInstrumentationMetricsARM") + set_proc_address(&EnumeratePhysicalDevices, "vkEnumeratePhysicalDevices") + set_proc_address(&GetDisplayModeProperties2KHR, "vkGetDisplayModeProperties2KHR") + set_proc_address(&GetDisplayModePropertiesKHR, "vkGetDisplayModePropertiesKHR") + set_proc_address(&GetDisplayPlaneCapabilities2KHR, "vkGetDisplayPlaneCapabilities2KHR") + set_proc_address(&GetDisplayPlaneCapabilitiesKHR, "vkGetDisplayPlaneCapabilitiesKHR") + set_proc_address(&GetDisplayPlaneSupportedDisplaysKHR, "vkGetDisplayPlaneSupportedDisplaysKHR") + set_proc_address(&GetDrmDisplayEXT, "vkGetDrmDisplayEXT") + set_proc_address(&GetInstanceProcAddrLUNARG, "vkGetInstanceProcAddrLUNARG") + set_proc_address(&GetPhysicalDeviceCalibrateableTimeDomainsEXT, "vkGetPhysicalDeviceCalibrateableTimeDomainsEXT") + set_proc_address(&GetPhysicalDeviceCalibrateableTimeDomainsKHR, "vkGetPhysicalDeviceCalibrateableTimeDomainsKHR") + set_proc_address(&GetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV, "vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV") + set_proc_address(&GetPhysicalDeviceCooperativeMatrixPropertiesKHR, "vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR") + set_proc_address(&GetPhysicalDeviceCooperativeMatrixPropertiesNV, "vkGetPhysicalDeviceCooperativeMatrixPropertiesNV") + set_proc_address(&GetPhysicalDeviceCooperativeVectorPropertiesNV, "vkGetPhysicalDeviceCooperativeVectorPropertiesNV") + set_proc_address(&GetPhysicalDeviceDescriptorSizeEXT, "vkGetPhysicalDeviceDescriptorSizeEXT") + set_proc_address(&GetPhysicalDeviceDisplayPlaneProperties2KHR, "vkGetPhysicalDeviceDisplayPlaneProperties2KHR") + set_proc_address(&GetPhysicalDeviceDisplayPlanePropertiesKHR, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR") + set_proc_address(&GetPhysicalDeviceDisplayProperties2KHR, "vkGetPhysicalDeviceDisplayProperties2KHR") + set_proc_address(&GetPhysicalDeviceDisplayPropertiesKHR, "vkGetPhysicalDeviceDisplayPropertiesKHR") + set_proc_address(&GetPhysicalDeviceExternalBufferProperties, "vkGetPhysicalDeviceExternalBufferProperties") + set_proc_address(&GetPhysicalDeviceExternalBufferPropertiesKHR, "vkGetPhysicalDeviceExternalBufferPropertiesKHR") + set_proc_address(&GetPhysicalDeviceExternalFenceProperties, "vkGetPhysicalDeviceExternalFenceProperties") + set_proc_address(&GetPhysicalDeviceExternalFencePropertiesKHR, "vkGetPhysicalDeviceExternalFencePropertiesKHR") + set_proc_address(&GetPhysicalDeviceExternalImageFormatPropertiesNV, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV") + set_proc_address(&GetPhysicalDeviceExternalSemaphoreProperties, "vkGetPhysicalDeviceExternalSemaphoreProperties") + set_proc_address(&GetPhysicalDeviceExternalSemaphorePropertiesKHR, "vkGetPhysicalDeviceExternalSemaphorePropertiesKHR") + set_proc_address(&GetPhysicalDeviceExternalTensorPropertiesARM, "vkGetPhysicalDeviceExternalTensorPropertiesARM") + set_proc_address(&GetPhysicalDeviceFeatures, "vkGetPhysicalDeviceFeatures") + set_proc_address(&GetPhysicalDeviceFeatures2, "vkGetPhysicalDeviceFeatures2") + set_proc_address(&GetPhysicalDeviceFeatures2KHR, "vkGetPhysicalDeviceFeatures2KHR") + set_proc_address(&GetPhysicalDeviceFormatProperties, "vkGetPhysicalDeviceFormatProperties") + set_proc_address(&GetPhysicalDeviceFormatProperties2, "vkGetPhysicalDeviceFormatProperties2") + set_proc_address(&GetPhysicalDeviceFormatProperties2KHR, "vkGetPhysicalDeviceFormatProperties2KHR") + set_proc_address(&GetPhysicalDeviceFragmentShadingRatesKHR, "vkGetPhysicalDeviceFragmentShadingRatesKHR") + set_proc_address(&GetPhysicalDeviceImageFormatProperties, "vkGetPhysicalDeviceImageFormatProperties") + set_proc_address(&GetPhysicalDeviceImageFormatProperties2, "vkGetPhysicalDeviceImageFormatProperties2") + set_proc_address(&GetPhysicalDeviceImageFormatProperties2KHR, "vkGetPhysicalDeviceImageFormatProperties2KHR") + set_proc_address(&GetPhysicalDeviceMemoryProperties, "vkGetPhysicalDeviceMemoryProperties") + set_proc_address(&GetPhysicalDeviceMemoryProperties2, "vkGetPhysicalDeviceMemoryProperties2") + set_proc_address(&GetPhysicalDeviceMemoryProperties2KHR, "vkGetPhysicalDeviceMemoryProperties2KHR") + set_proc_address(&GetPhysicalDeviceMultisamplePropertiesEXT, "vkGetPhysicalDeviceMultisamplePropertiesEXT") + set_proc_address(&GetPhysicalDeviceOpticalFlowImageFormatsNV, "vkGetPhysicalDeviceOpticalFlowImageFormatsNV") + set_proc_address(&GetPhysicalDevicePresentRectanglesKHR, "vkGetPhysicalDevicePresentRectanglesKHR") + set_proc_address(&GetPhysicalDeviceProperties, "vkGetPhysicalDeviceProperties") + set_proc_address(&GetPhysicalDeviceProperties2, "vkGetPhysicalDeviceProperties2") + set_proc_address(&GetPhysicalDeviceProperties2KHR, "vkGetPhysicalDeviceProperties2KHR") + set_proc_address(&GetPhysicalDeviceQueueFamilyDataGraphEngineOperationPropertiesARM, "vkGetPhysicalDeviceQueueFamilyDataGraphEngineOperationPropertiesARM") + set_proc_address(&GetPhysicalDeviceQueueFamilyDataGraphOpticalFlowImageFormatsARM, "vkGetPhysicalDeviceQueueFamilyDataGraphOpticalFlowImageFormatsARM") + set_proc_address(&GetPhysicalDeviceQueueFamilyDataGraphProcessingEnginePropertiesARM, "vkGetPhysicalDeviceQueueFamilyDataGraphProcessingEnginePropertiesARM") + set_proc_address(&GetPhysicalDeviceQueueFamilyDataGraphPropertiesARM, "vkGetPhysicalDeviceQueueFamilyDataGraphPropertiesARM") + set_proc_address(&GetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR, "vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR") + set_proc_address(&GetPhysicalDeviceQueueFamilyProperties, "vkGetPhysicalDeviceQueueFamilyProperties") + set_proc_address(&GetPhysicalDeviceQueueFamilyProperties2, "vkGetPhysicalDeviceQueueFamilyProperties2") + set_proc_address(&GetPhysicalDeviceQueueFamilyProperties2KHR, "vkGetPhysicalDeviceQueueFamilyProperties2KHR") + set_proc_address(&GetPhysicalDeviceSparseImageFormatProperties, "vkGetPhysicalDeviceSparseImageFormatProperties") + set_proc_address(&GetPhysicalDeviceSparseImageFormatProperties2, "vkGetPhysicalDeviceSparseImageFormatProperties2") + set_proc_address(&GetPhysicalDeviceSparseImageFormatProperties2KHR, "vkGetPhysicalDeviceSparseImageFormatProperties2KHR") + set_proc_address(&GetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV, "vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV") + set_proc_address(&GetPhysicalDeviceSurfaceCapabilities2EXT, "vkGetPhysicalDeviceSurfaceCapabilities2EXT") + set_proc_address(&GetPhysicalDeviceSurfaceCapabilities2KHR, "vkGetPhysicalDeviceSurfaceCapabilities2KHR") + set_proc_address(&GetPhysicalDeviceSurfaceCapabilitiesKHR, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR") + set_proc_address(&GetPhysicalDeviceSurfaceFormats2KHR, "vkGetPhysicalDeviceSurfaceFormats2KHR") + set_proc_address(&GetPhysicalDeviceSurfaceFormatsKHR, "vkGetPhysicalDeviceSurfaceFormatsKHR") + set_proc_address(&GetPhysicalDeviceSurfacePresentModes2EXT, "vkGetPhysicalDeviceSurfacePresentModes2EXT") + set_proc_address(&GetPhysicalDeviceSurfacePresentModesKHR, "vkGetPhysicalDeviceSurfacePresentModesKHR") + set_proc_address(&GetPhysicalDeviceSurfaceSupportKHR, "vkGetPhysicalDeviceSurfaceSupportKHR") + set_proc_address(&GetPhysicalDeviceToolProperties, "vkGetPhysicalDeviceToolProperties") + set_proc_address(&GetPhysicalDeviceToolPropertiesEXT, "vkGetPhysicalDeviceToolPropertiesEXT") + set_proc_address(&GetPhysicalDeviceVideoCapabilitiesKHR, "vkGetPhysicalDeviceVideoCapabilitiesKHR") + set_proc_address(&GetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR, "vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR") + set_proc_address(&GetPhysicalDeviceVideoFormatPropertiesKHR, "vkGetPhysicalDeviceVideoFormatPropertiesKHR") + set_proc_address(&GetPhysicalDeviceWaylandPresentationSupportKHR, "vkGetPhysicalDeviceWaylandPresentationSupportKHR") + set_proc_address(&GetPhysicalDeviceWin32PresentationSupportKHR, "vkGetPhysicalDeviceWin32PresentationSupportKHR") + set_proc_address(&GetPhysicalDeviceXcbPresentationSupportKHR, "vkGetPhysicalDeviceXcbPresentationSupportKHR") + set_proc_address(&GetPhysicalDeviceXlibPresentationSupportKHR, "vkGetPhysicalDeviceXlibPresentationSupportKHR") + set_proc_address(&GetWinrtDisplayNV, "vkGetWinrtDisplayNV") + set_proc_address(&ReleaseDisplayEXT, "vkReleaseDisplayEXT") + set_proc_address(&SubmitDebugUtilsMessageEXT, "vkSubmitDebugUtilsMessageEXT") // Device Procedures set_proc_address(&AcquireFullScreenExclusiveModeEXT, "vkAcquireFullScreenExclusiveModeEXT") @@ -1560,15 +1775,23 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&BindBufferMemory, "vkBindBufferMemory") set_proc_address(&BindBufferMemory2, "vkBindBufferMemory2") set_proc_address(&BindBufferMemory2KHR, "vkBindBufferMemory2KHR") + set_proc_address(&BindDataGraphPipelineSessionMemoryARM, "vkBindDataGraphPipelineSessionMemoryARM") set_proc_address(&BindImageMemory, "vkBindImageMemory") set_proc_address(&BindImageMemory2, "vkBindImageMemory2") set_proc_address(&BindImageMemory2KHR, "vkBindImageMemory2KHR") set_proc_address(&BindOpticalFlowSessionImageNV, "vkBindOpticalFlowSessionImageNV") + set_proc_address(&BindTensorMemoryARM, "vkBindTensorMemoryARM") set_proc_address(&BindVideoSessionMemoryKHR, "vkBindVideoSessionMemoryKHR") set_proc_address(&BuildAccelerationStructuresKHR, "vkBuildAccelerationStructuresKHR") set_proc_address(&BuildMicromapsEXT, "vkBuildMicromapsEXT") + set_proc_address(&ClearShaderInstrumentationMetricsARM, "vkClearShaderInstrumentationMetricsARM") + set_proc_address(&CmdBeginConditionalRendering2EXT, "vkCmdBeginConditionalRendering2EXT") set_proc_address(&CmdBeginConditionalRenderingEXT, "vkCmdBeginConditionalRenderingEXT") + set_proc_address(&CmdBeginCustomResolveEXT, "vkCmdBeginCustomResolveEXT") set_proc_address(&CmdBeginDebugUtilsLabelEXT, "vkCmdBeginDebugUtilsLabelEXT") + set_proc_address(&CmdBeginGpaSampleAMD, "vkCmdBeginGpaSampleAMD") + set_proc_address(&CmdBeginGpaSessionAMD, "vkCmdBeginGpaSessionAMD") + set_proc_address(&CmdBeginPerTileExecutionQCOM, "vkCmdBeginPerTileExecutionQCOM") set_proc_address(&CmdBeginQuery, "vkCmdBeginQuery") set_proc_address(&CmdBeginQueryIndexedEXT, "vkCmdBeginQueryIndexedEXT") set_proc_address(&CmdBeginRenderPass, "vkCmdBeginRenderPass") @@ -1576,6 +1799,8 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&CmdBeginRenderPass2KHR, "vkCmdBeginRenderPass2KHR") set_proc_address(&CmdBeginRendering, "vkCmdBeginRendering") set_proc_address(&CmdBeginRenderingKHR, "vkCmdBeginRenderingKHR") + set_proc_address(&CmdBeginShaderInstrumentationARM, "vkCmdBeginShaderInstrumentationARM") + set_proc_address(&CmdBeginTransformFeedback2EXT, "vkCmdBeginTransformFeedback2EXT") set_proc_address(&CmdBeginTransformFeedbackEXT, "vkCmdBeginTransformFeedbackEXT") set_proc_address(&CmdBeginVideoCodingKHR, "vkCmdBeginVideoCodingKHR") set_proc_address(&CmdBindDescriptorBufferEmbeddedSamplers2EXT, "vkCmdBindDescriptorBufferEmbeddedSamplers2EXT") @@ -1587,15 +1812,21 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&CmdBindIndexBuffer, "vkCmdBindIndexBuffer") set_proc_address(&CmdBindIndexBuffer2, "vkCmdBindIndexBuffer2") set_proc_address(&CmdBindIndexBuffer2KHR, "vkCmdBindIndexBuffer2KHR") + set_proc_address(&CmdBindIndexBuffer3KHR, "vkCmdBindIndexBuffer3KHR") set_proc_address(&CmdBindInvocationMaskHUAWEI, "vkCmdBindInvocationMaskHUAWEI") set_proc_address(&CmdBindPipeline, "vkCmdBindPipeline") set_proc_address(&CmdBindPipelineShaderGroupNV, "vkCmdBindPipelineShaderGroupNV") + set_proc_address(&CmdBindResourceHeapEXT, "vkCmdBindResourceHeapEXT") + set_proc_address(&CmdBindSamplerHeapEXT, "vkCmdBindSamplerHeapEXT") set_proc_address(&CmdBindShadersEXT, "vkCmdBindShadersEXT") set_proc_address(&CmdBindShadingRateImageNV, "vkCmdBindShadingRateImageNV") + set_proc_address(&CmdBindTileMemoryQCOM, "vkCmdBindTileMemoryQCOM") + set_proc_address(&CmdBindTransformFeedbackBuffers2EXT, "vkCmdBindTransformFeedbackBuffers2EXT") set_proc_address(&CmdBindTransformFeedbackBuffersEXT, "vkCmdBindTransformFeedbackBuffersEXT") set_proc_address(&CmdBindVertexBuffers, "vkCmdBindVertexBuffers") set_proc_address(&CmdBindVertexBuffers2, "vkCmdBindVertexBuffers2") set_proc_address(&CmdBindVertexBuffers2EXT, "vkCmdBindVertexBuffers2EXT") + set_proc_address(&CmdBindVertexBuffers3KHR, "vkCmdBindVertexBuffers3KHR") set_proc_address(&CmdBlitImage, "vkCmdBlitImage") set_proc_address(&CmdBlitImage2, "vkCmdBlitImage2") set_proc_address(&CmdBlitImage2KHR, "vkCmdBlitImage2KHR") @@ -1619,48 +1850,68 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&CmdCopyBufferToImage, "vkCmdCopyBufferToImage") set_proc_address(&CmdCopyBufferToImage2, "vkCmdCopyBufferToImage2") set_proc_address(&CmdCopyBufferToImage2KHR, "vkCmdCopyBufferToImage2KHR") + set_proc_address(&CmdCopyGpaSessionResultsAMD, "vkCmdCopyGpaSessionResultsAMD") set_proc_address(&CmdCopyImage, "vkCmdCopyImage") set_proc_address(&CmdCopyImage2, "vkCmdCopyImage2") set_proc_address(&CmdCopyImage2KHR, "vkCmdCopyImage2KHR") set_proc_address(&CmdCopyImageToBuffer, "vkCmdCopyImageToBuffer") set_proc_address(&CmdCopyImageToBuffer2, "vkCmdCopyImageToBuffer2") set_proc_address(&CmdCopyImageToBuffer2KHR, "vkCmdCopyImageToBuffer2KHR") + set_proc_address(&CmdCopyImageToMemoryKHR, "vkCmdCopyImageToMemoryKHR") + set_proc_address(&CmdCopyMemoryIndirectKHR, "vkCmdCopyMemoryIndirectKHR") set_proc_address(&CmdCopyMemoryIndirectNV, "vkCmdCopyMemoryIndirectNV") + set_proc_address(&CmdCopyMemoryKHR, "vkCmdCopyMemoryKHR") set_proc_address(&CmdCopyMemoryToAccelerationStructureKHR, "vkCmdCopyMemoryToAccelerationStructureKHR") + set_proc_address(&CmdCopyMemoryToImageIndirectKHR, "vkCmdCopyMemoryToImageIndirectKHR") set_proc_address(&CmdCopyMemoryToImageIndirectNV, "vkCmdCopyMemoryToImageIndirectNV") + set_proc_address(&CmdCopyMemoryToImageKHR, "vkCmdCopyMemoryToImageKHR") set_proc_address(&CmdCopyMemoryToMicromapEXT, "vkCmdCopyMemoryToMicromapEXT") set_proc_address(&CmdCopyMicromapEXT, "vkCmdCopyMicromapEXT") set_proc_address(&CmdCopyMicromapToMemoryEXT, "vkCmdCopyMicromapToMemoryEXT") set_proc_address(&CmdCopyQueryPoolResults, "vkCmdCopyQueryPoolResults") + set_proc_address(&CmdCopyQueryPoolResultsToMemoryKHR, "vkCmdCopyQueryPoolResultsToMemoryKHR") + set_proc_address(&CmdCopyTensorARM, "vkCmdCopyTensorARM") set_proc_address(&CmdCuLaunchKernelNVX, "vkCmdCuLaunchKernelNVX") set_proc_address(&CmdCudaLaunchKernelNV, "vkCmdCudaLaunchKernelNV") set_proc_address(&CmdDebugMarkerBeginEXT, "vkCmdDebugMarkerBeginEXT") set_proc_address(&CmdDebugMarkerEndEXT, "vkCmdDebugMarkerEndEXT") set_proc_address(&CmdDebugMarkerInsertEXT, "vkCmdDebugMarkerInsertEXT") set_proc_address(&CmdDecodeVideoKHR, "vkCmdDecodeVideoKHR") + set_proc_address(&CmdDecompressMemoryEXT, "vkCmdDecompressMemoryEXT") + set_proc_address(&CmdDecompressMemoryIndirectCountEXT, "vkCmdDecompressMemoryIndirectCountEXT") set_proc_address(&CmdDecompressMemoryIndirectCountNV, "vkCmdDecompressMemoryIndirectCountNV") set_proc_address(&CmdDecompressMemoryNV, "vkCmdDecompressMemoryNV") set_proc_address(&CmdDispatch, "vkCmdDispatch") set_proc_address(&CmdDispatchBase, "vkCmdDispatchBase") set_proc_address(&CmdDispatchBaseKHR, "vkCmdDispatchBaseKHR") + set_proc_address(&CmdDispatchDataGraphARM, "vkCmdDispatchDataGraphARM") set_proc_address(&CmdDispatchGraphAMDX, "vkCmdDispatchGraphAMDX") set_proc_address(&CmdDispatchGraphIndirectAMDX, "vkCmdDispatchGraphIndirectAMDX") set_proc_address(&CmdDispatchGraphIndirectCountAMDX, "vkCmdDispatchGraphIndirectCountAMDX") set_proc_address(&CmdDispatchIndirect, "vkCmdDispatchIndirect") + set_proc_address(&CmdDispatchIndirect2KHR, "vkCmdDispatchIndirect2KHR") + set_proc_address(&CmdDispatchTileQCOM, "vkCmdDispatchTileQCOM") set_proc_address(&CmdDraw, "vkCmdDraw") set_proc_address(&CmdDrawClusterHUAWEI, "vkCmdDrawClusterHUAWEI") set_proc_address(&CmdDrawClusterIndirectHUAWEI, "vkCmdDrawClusterIndirectHUAWEI") set_proc_address(&CmdDrawIndexed, "vkCmdDrawIndexed") set_proc_address(&CmdDrawIndexedIndirect, "vkCmdDrawIndexedIndirect") + set_proc_address(&CmdDrawIndexedIndirect2KHR, "vkCmdDrawIndexedIndirect2KHR") set_proc_address(&CmdDrawIndexedIndirectCount, "vkCmdDrawIndexedIndirectCount") + set_proc_address(&CmdDrawIndexedIndirectCount2KHR, "vkCmdDrawIndexedIndirectCount2KHR") set_proc_address(&CmdDrawIndexedIndirectCountAMD, "vkCmdDrawIndexedIndirectCountAMD") set_proc_address(&CmdDrawIndexedIndirectCountKHR, "vkCmdDrawIndexedIndirectCountKHR") set_proc_address(&CmdDrawIndirect, "vkCmdDrawIndirect") + set_proc_address(&CmdDrawIndirect2KHR, "vkCmdDrawIndirect2KHR") + set_proc_address(&CmdDrawIndirectByteCount2EXT, "vkCmdDrawIndirectByteCount2EXT") set_proc_address(&CmdDrawIndirectByteCountEXT, "vkCmdDrawIndirectByteCountEXT") set_proc_address(&CmdDrawIndirectCount, "vkCmdDrawIndirectCount") + set_proc_address(&CmdDrawIndirectCount2KHR, "vkCmdDrawIndirectCount2KHR") set_proc_address(&CmdDrawIndirectCountAMD, "vkCmdDrawIndirectCountAMD") set_proc_address(&CmdDrawIndirectCountKHR, "vkCmdDrawIndirectCountKHR") set_proc_address(&CmdDrawMeshTasksEXT, "vkCmdDrawMeshTasksEXT") + set_proc_address(&CmdDrawMeshTasksIndirect2EXT, "vkCmdDrawMeshTasksIndirect2EXT") + set_proc_address(&CmdDrawMeshTasksIndirectCount2EXT, "vkCmdDrawMeshTasksIndirectCount2EXT") set_proc_address(&CmdDrawMeshTasksIndirectCountEXT, "vkCmdDrawMeshTasksIndirectCountEXT") set_proc_address(&CmdDrawMeshTasksIndirectCountNV, "vkCmdDrawMeshTasksIndirectCountNV") set_proc_address(&CmdDrawMeshTasksIndirectEXT, "vkCmdDrawMeshTasksIndirectEXT") @@ -1671,19 +1922,27 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&CmdEncodeVideoKHR, "vkCmdEncodeVideoKHR") set_proc_address(&CmdEndConditionalRenderingEXT, "vkCmdEndConditionalRenderingEXT") set_proc_address(&CmdEndDebugUtilsLabelEXT, "vkCmdEndDebugUtilsLabelEXT") + set_proc_address(&CmdEndGpaSampleAMD, "vkCmdEndGpaSampleAMD") + set_proc_address(&CmdEndGpaSessionAMD, "vkCmdEndGpaSessionAMD") + set_proc_address(&CmdEndPerTileExecutionQCOM, "vkCmdEndPerTileExecutionQCOM") set_proc_address(&CmdEndQuery, "vkCmdEndQuery") set_proc_address(&CmdEndQueryIndexedEXT, "vkCmdEndQueryIndexedEXT") set_proc_address(&CmdEndRenderPass, "vkCmdEndRenderPass") set_proc_address(&CmdEndRenderPass2, "vkCmdEndRenderPass2") set_proc_address(&CmdEndRenderPass2KHR, "vkCmdEndRenderPass2KHR") set_proc_address(&CmdEndRendering, "vkCmdEndRendering") + set_proc_address(&CmdEndRendering2EXT, "vkCmdEndRendering2EXT") + set_proc_address(&CmdEndRendering2KHR, "vkCmdEndRendering2KHR") set_proc_address(&CmdEndRenderingKHR, "vkCmdEndRenderingKHR") + set_proc_address(&CmdEndShaderInstrumentationARM, "vkCmdEndShaderInstrumentationARM") + set_proc_address(&CmdEndTransformFeedback2EXT, "vkCmdEndTransformFeedback2EXT") set_proc_address(&CmdEndTransformFeedbackEXT, "vkCmdEndTransformFeedbackEXT") set_proc_address(&CmdEndVideoCodingKHR, "vkCmdEndVideoCodingKHR") set_proc_address(&CmdExecuteCommands, "vkCmdExecuteCommands") set_proc_address(&CmdExecuteGeneratedCommandsEXT, "vkCmdExecuteGeneratedCommandsEXT") set_proc_address(&CmdExecuteGeneratedCommandsNV, "vkCmdExecuteGeneratedCommandsNV") set_proc_address(&CmdFillBuffer, "vkCmdFillBuffer") + set_proc_address(&CmdFillMemoryKHR, "vkCmdFillMemoryKHR") set_proc_address(&CmdInitializeGraphScratchMemoryAMDX, "vkCmdInitializeGraphScratchMemoryAMDX") set_proc_address(&CmdInsertDebugUtilsLabelEXT, "vkCmdInsertDebugUtilsLabelEXT") set_proc_address(&CmdNextSubpass, "vkCmdNextSubpass") @@ -1698,6 +1957,7 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&CmdPushConstants, "vkCmdPushConstants") set_proc_address(&CmdPushConstants2, "vkCmdPushConstants2") set_proc_address(&CmdPushConstants2KHR, "vkCmdPushConstants2KHR") + set_proc_address(&CmdPushDataEXT, "vkCmdPushDataEXT") set_proc_address(&CmdPushDescriptorSet, "vkCmdPushDescriptorSet") set_proc_address(&CmdPushDescriptorSet2, "vkCmdPushDescriptorSet2") set_proc_address(&CmdPushDescriptorSet2KHR, "vkCmdPushDescriptorSet2KHR") @@ -1722,7 +1982,9 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&CmdSetColorBlendAdvancedEXT, "vkCmdSetColorBlendAdvancedEXT") set_proc_address(&CmdSetColorBlendEnableEXT, "vkCmdSetColorBlendEnableEXT") set_proc_address(&CmdSetColorBlendEquationEXT, "vkCmdSetColorBlendEquationEXT") + set_proc_address(&CmdSetColorWriteEnableEXT, "vkCmdSetColorWriteEnableEXT") set_proc_address(&CmdSetColorWriteMaskEXT, "vkCmdSetColorWriteMaskEXT") + set_proc_address(&CmdSetComputeOccupancyPriorityNV, "vkCmdSetComputeOccupancyPriorityNV") set_proc_address(&CmdSetConservativeRasterizationModeEXT, "vkCmdSetConservativeRasterizationModeEXT") set_proc_address(&CmdSetCoverageModulationModeNV, "vkCmdSetCoverageModulationModeNV") set_proc_address(&CmdSetCoverageModulationTableEnableNV, "vkCmdSetCoverageModulationTableEnableNV") @@ -1756,6 +2018,7 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&CmdSetDiscardRectangleEXT, "vkCmdSetDiscardRectangleEXT") set_proc_address(&CmdSetDiscardRectangleEnableEXT, "vkCmdSetDiscardRectangleEnableEXT") set_proc_address(&CmdSetDiscardRectangleModeEXT, "vkCmdSetDiscardRectangleModeEXT") + set_proc_address(&CmdSetDispatchParametersARM, "vkCmdSetDispatchParametersARM") set_proc_address(&CmdSetEvent, "vkCmdSetEvent") set_proc_address(&CmdSetEvent2, "vkCmdSetEvent2") set_proc_address(&CmdSetEvent2KHR, "vkCmdSetEvent2KHR") @@ -1781,6 +2044,7 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&CmdSetPolygonModeEXT, "vkCmdSetPolygonModeEXT") set_proc_address(&CmdSetPrimitiveRestartEnable, "vkCmdSetPrimitiveRestartEnable") set_proc_address(&CmdSetPrimitiveRestartEnableEXT, "vkCmdSetPrimitiveRestartEnableEXT") + set_proc_address(&CmdSetPrimitiveRestartIndexEXT, "vkCmdSetPrimitiveRestartIndexEXT") set_proc_address(&CmdSetPrimitiveTopology, "vkCmdSetPrimitiveTopology") set_proc_address(&CmdSetPrimitiveTopologyEXT, "vkCmdSetPrimitiveTopologyEXT") set_proc_address(&CmdSetProvokingVertexModeEXT, "vkCmdSetProvokingVertexModeEXT") @@ -1823,6 +2087,7 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&CmdTraceRaysKHR, "vkCmdTraceRaysKHR") set_proc_address(&CmdTraceRaysNV, "vkCmdTraceRaysNV") set_proc_address(&CmdUpdateBuffer, "vkCmdUpdateBuffer") + set_proc_address(&CmdUpdateMemoryKHR, "vkCmdUpdateMemoryKHR") set_proc_address(&CmdUpdatePipelineIndirectBufferNV, "vkCmdUpdatePipelineIndirectBufferNV") set_proc_address(&CmdWaitEvents, "vkCmdWaitEvents") set_proc_address(&CmdWaitEvents2, "vkCmdWaitEvents2") @@ -1831,6 +2096,7 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&CmdWriteAccelerationStructuresPropertiesNV, "vkCmdWriteAccelerationStructuresPropertiesNV") set_proc_address(&CmdWriteBufferMarker2AMD, "vkCmdWriteBufferMarker2AMD") set_proc_address(&CmdWriteBufferMarkerAMD, "vkCmdWriteBufferMarkerAMD") + set_proc_address(&CmdWriteMarkerToMemoryAMD, "vkCmdWriteMarkerToMemoryAMD") set_proc_address(&CmdWriteMicromapsPropertiesEXT, "vkCmdWriteMicromapsPropertiesEXT") set_proc_address(&CmdWriteTimestamp, "vkCmdWriteTimestamp") set_proc_address(&CmdWriteTimestamp2, "vkCmdWriteTimestamp2") @@ -1849,6 +2115,7 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&CopyMemoryToMicromapEXT, "vkCopyMemoryToMicromapEXT") set_proc_address(&CopyMicromapEXT, "vkCopyMicromapEXT") set_proc_address(&CopyMicromapToMemoryEXT, "vkCopyMicromapToMemoryEXT") + set_proc_address(&CreateAccelerationStructure2KHR, "vkCreateAccelerationStructure2KHR") set_proc_address(&CreateAccelerationStructureKHR, "vkCreateAccelerationStructureKHR") set_proc_address(&CreateAccelerationStructureNV, "vkCreateAccelerationStructureNV") set_proc_address(&CreateBuffer, "vkCreateBuffer") @@ -1859,6 +2126,8 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&CreateCuModuleNVX, "vkCreateCuModuleNVX") set_proc_address(&CreateCudaFunctionNV, "vkCreateCudaFunctionNV") set_proc_address(&CreateCudaModuleNV, "vkCreateCudaModuleNV") + set_proc_address(&CreateDataGraphPipelineSessionARM, "vkCreateDataGraphPipelineSessionARM") + set_proc_address(&CreateDataGraphPipelinesARM, "vkCreateDataGraphPipelinesARM") set_proc_address(&CreateDeferredOperationKHR, "vkCreateDeferredOperationKHR") set_proc_address(&CreateDescriptorPool, "vkCreateDescriptorPool") set_proc_address(&CreateDescriptorSetLayout, "vkCreateDescriptorSetLayout") @@ -1866,8 +2135,10 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&CreateDescriptorUpdateTemplateKHR, "vkCreateDescriptorUpdateTemplateKHR") set_proc_address(&CreateEvent, "vkCreateEvent") set_proc_address(&CreateExecutionGraphPipelinesAMDX, "vkCreateExecutionGraphPipelinesAMDX") + set_proc_address(&CreateExternalComputeQueueNV, "vkCreateExternalComputeQueueNV") set_proc_address(&CreateFence, "vkCreateFence") set_proc_address(&CreateFramebuffer, "vkCreateFramebuffer") + set_proc_address(&CreateGpaSessionAMD, "vkCreateGpaSessionAMD") set_proc_address(&CreateGraphicsPipelines, "vkCreateGraphicsPipelines") set_proc_address(&CreateImage, "vkCreateImage") set_proc_address(&CreateImageView, "vkCreateImageView") @@ -1891,10 +2162,13 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&CreateSamplerYcbcrConversion, "vkCreateSamplerYcbcrConversion") set_proc_address(&CreateSamplerYcbcrConversionKHR, "vkCreateSamplerYcbcrConversionKHR") set_proc_address(&CreateSemaphore, "vkCreateSemaphore") + set_proc_address(&CreateShaderInstrumentationARM, "vkCreateShaderInstrumentationARM") set_proc_address(&CreateShaderModule, "vkCreateShaderModule") set_proc_address(&CreateShadersEXT, "vkCreateShadersEXT") set_proc_address(&CreateSharedSwapchainsKHR, "vkCreateSharedSwapchainsKHR") set_proc_address(&CreateSwapchainKHR, "vkCreateSwapchainKHR") + set_proc_address(&CreateTensorARM, "vkCreateTensorARM") + set_proc_address(&CreateTensorViewARM, "vkCreateTensorViewARM") set_proc_address(&CreateValidationCacheEXT, "vkCreateValidationCacheEXT") set_proc_address(&CreateVideoSessionKHR, "vkCreateVideoSessionKHR") set_proc_address(&CreateVideoSessionParametersKHR, "vkCreateVideoSessionParametersKHR") @@ -1910,6 +2184,7 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&DestroyCuModuleNVX, "vkDestroyCuModuleNVX") set_proc_address(&DestroyCudaFunctionNV, "vkDestroyCudaFunctionNV") set_proc_address(&DestroyCudaModuleNV, "vkDestroyCudaModuleNV") + set_proc_address(&DestroyDataGraphPipelineSessionARM, "vkDestroyDataGraphPipelineSessionARM") set_proc_address(&DestroyDeferredOperationKHR, "vkDestroyDeferredOperationKHR") set_proc_address(&DestroyDescriptorPool, "vkDestroyDescriptorPool") set_proc_address(&DestroyDescriptorSetLayout, "vkDestroyDescriptorSetLayout") @@ -1917,8 +2192,10 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&DestroyDescriptorUpdateTemplateKHR, "vkDestroyDescriptorUpdateTemplateKHR") set_proc_address(&DestroyDevice, "vkDestroyDevice") set_proc_address(&DestroyEvent, "vkDestroyEvent") + set_proc_address(&DestroyExternalComputeQueueNV, "vkDestroyExternalComputeQueueNV") set_proc_address(&DestroyFence, "vkDestroyFence") set_proc_address(&DestroyFramebuffer, "vkDestroyFramebuffer") + set_proc_address(&DestroyGpaSessionAMD, "vkDestroyGpaSessionAMD") set_proc_address(&DestroyImage, "vkDestroyImage") set_proc_address(&DestroyImageView, "vkDestroyImageView") set_proc_address(&DestroyIndirectCommandsLayoutEXT, "vkDestroyIndirectCommandsLayoutEXT") @@ -1939,8 +2216,11 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&DestroySamplerYcbcrConversionKHR, "vkDestroySamplerYcbcrConversionKHR") set_proc_address(&DestroySemaphore, "vkDestroySemaphore") set_proc_address(&DestroyShaderEXT, "vkDestroyShaderEXT") + set_proc_address(&DestroyShaderInstrumentationARM, "vkDestroyShaderInstrumentationARM") set_proc_address(&DestroyShaderModule, "vkDestroyShaderModule") set_proc_address(&DestroySwapchainKHR, "vkDestroySwapchainKHR") + set_proc_address(&DestroyTensorARM, "vkDestroyTensorARM") + set_proc_address(&DestroyTensorViewARM, "vkDestroyTensorViewARM") set_proc_address(&DestroyValidationCacheEXT, "vkDestroyValidationCacheEXT") set_proc_address(&DestroyVideoSessionKHR, "vkDestroyVideoSessionKHR") set_proc_address(&DestroyVideoSessionParametersKHR, "vkDestroyVideoSessionParametersKHR") @@ -1970,6 +2250,10 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&GetCalibratedTimestampsKHR, "vkGetCalibratedTimestampsKHR") set_proc_address(&GetClusterAccelerationStructureBuildSizesNV, "vkGetClusterAccelerationStructureBuildSizesNV") set_proc_address(&GetCudaModuleCacheNV, "vkGetCudaModuleCacheNV") + set_proc_address(&GetDataGraphPipelineAvailablePropertiesARM, "vkGetDataGraphPipelineAvailablePropertiesARM") + set_proc_address(&GetDataGraphPipelinePropertiesARM, "vkGetDataGraphPipelinePropertiesARM") + set_proc_address(&GetDataGraphPipelineSessionBindPointRequirementsARM, "vkGetDataGraphPipelineSessionBindPointRequirementsARM") + set_proc_address(&GetDataGraphPipelineSessionMemoryRequirementsARM, "vkGetDataGraphPipelineSessionMemoryRequirementsARM") set_proc_address(&GetDeferredOperationMaxConcurrencyKHR, "vkGetDeferredOperationMaxConcurrencyKHR") set_proc_address(&GetDeferredOperationResultKHR, "vkGetDeferredOperationResultKHR") set_proc_address(&GetDescriptorEXT, "vkGetDescriptorEXT") @@ -1982,7 +2266,10 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&GetDeviceAccelerationStructureCompatibilityKHR, "vkGetDeviceAccelerationStructureCompatibilityKHR") set_proc_address(&GetDeviceBufferMemoryRequirements, "vkGetDeviceBufferMemoryRequirements") set_proc_address(&GetDeviceBufferMemoryRequirementsKHR, "vkGetDeviceBufferMemoryRequirementsKHR") + set_proc_address(&GetDeviceCombinedImageSamplerIndexNVX, "vkGetDeviceCombinedImageSamplerIndexNVX") + set_proc_address(&GetDeviceFaultDebugInfoKHR, "vkGetDeviceFaultDebugInfoKHR") set_proc_address(&GetDeviceFaultInfoEXT, "vkGetDeviceFaultInfoEXT") + set_proc_address(&GetDeviceFaultReportsKHR, "vkGetDeviceFaultReportsKHR") set_proc_address(&GetDeviceGroupPeerMemoryFeatures, "vkGetDeviceGroupPeerMemoryFeatures") set_proc_address(&GetDeviceGroupPeerMemoryFeaturesKHR, "vkGetDeviceGroupPeerMemoryFeaturesKHR") set_proc_address(&GetDeviceGroupPresentCapabilitiesKHR, "vkGetDeviceGroupPresentCapabilitiesKHR") @@ -2002,6 +2289,7 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&GetDeviceQueue, "vkGetDeviceQueue") set_proc_address(&GetDeviceQueue2, "vkGetDeviceQueue2") set_proc_address(&GetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI, "vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI") + set_proc_address(&GetDeviceTensorMemoryRequirementsARM, "vkGetDeviceTensorMemoryRequirementsARM") set_proc_address(&GetDynamicRenderingTilePropertiesQCOM, "vkGetDynamicRenderingTilePropertiesQCOM") set_proc_address(&GetEncodedVideoSessionParametersKHR, "vkGetEncodedVideoSessionParametersKHR") set_proc_address(&GetEventStatus, "vkGetEventStatus") @@ -2013,10 +2301,14 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&GetFramebufferTilePropertiesQCOM, "vkGetFramebufferTilePropertiesQCOM") set_proc_address(&GetGeneratedCommandsMemoryRequirementsEXT, "vkGetGeneratedCommandsMemoryRequirementsEXT") set_proc_address(&GetGeneratedCommandsMemoryRequirementsNV, "vkGetGeneratedCommandsMemoryRequirementsNV") + set_proc_address(&GetGpaDeviceClockInfoAMD, "vkGetGpaDeviceClockInfoAMD") + set_proc_address(&GetGpaSessionResultsAMD, "vkGetGpaSessionResultsAMD") + set_proc_address(&GetGpaSessionStatusAMD, "vkGetGpaSessionStatusAMD") set_proc_address(&GetImageDrmFormatModifierPropertiesEXT, "vkGetImageDrmFormatModifierPropertiesEXT") set_proc_address(&GetImageMemoryRequirements, "vkGetImageMemoryRequirements") set_proc_address(&GetImageMemoryRequirements2, "vkGetImageMemoryRequirements2") set_proc_address(&GetImageMemoryRequirements2KHR, "vkGetImageMemoryRequirements2KHR") + set_proc_address(&GetImageOpaqueCaptureDataEXT, "vkGetImageOpaqueCaptureDataEXT") set_proc_address(&GetImageOpaqueCaptureDescriptorDataEXT, "vkGetImageOpaqueCaptureDescriptorDataEXT") set_proc_address(&GetImageSparseMemoryRequirements, "vkGetImageSparseMemoryRequirements") set_proc_address(&GetImageSparseMemoryRequirements2, "vkGetImageSparseMemoryRequirements2") @@ -2041,6 +2333,7 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&GetMemoryWin32HandlePropertiesKHR, "vkGetMemoryWin32HandlePropertiesKHR") set_proc_address(&GetMicromapBuildSizesEXT, "vkGetMicromapBuildSizesEXT") set_proc_address(&GetPartitionedAccelerationStructuresBuildSizesNV, "vkGetPartitionedAccelerationStructuresBuildSizesNV") + set_proc_address(&GetPastPresentationTimingEXT, "vkGetPastPresentationTimingEXT") set_proc_address(&GetPastPresentationTimingGOOGLE, "vkGetPastPresentationTimingGOOGLE") set_proc_address(&GetPerformanceParameterINTEL, "vkGetPerformanceParameterINTEL") set_proc_address(&GetPipelineBinaryDataKHR, "vkGetPipelineBinaryDataKHR") @@ -2072,11 +2365,18 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&GetSemaphoreWin32HandleKHR, "vkGetSemaphoreWin32HandleKHR") set_proc_address(&GetShaderBinaryDataEXT, "vkGetShaderBinaryDataEXT") set_proc_address(&GetShaderInfoAMD, "vkGetShaderInfoAMD") + set_proc_address(&GetShaderInstrumentationValuesARM, "vkGetShaderInstrumentationValuesARM") set_proc_address(&GetShaderModuleCreateInfoIdentifierEXT, "vkGetShaderModuleCreateInfoIdentifierEXT") set_proc_address(&GetShaderModuleIdentifierEXT, "vkGetShaderModuleIdentifierEXT") set_proc_address(&GetSwapchainCounterEXT, "vkGetSwapchainCounterEXT") set_proc_address(&GetSwapchainImagesKHR, "vkGetSwapchainImagesKHR") set_proc_address(&GetSwapchainStatusKHR, "vkGetSwapchainStatusKHR") + set_proc_address(&GetSwapchainTimeDomainPropertiesEXT, "vkGetSwapchainTimeDomainPropertiesEXT") + set_proc_address(&GetSwapchainTimingPropertiesEXT, "vkGetSwapchainTimingPropertiesEXT") + set_proc_address(&GetTensorMemoryRequirementsARM, "vkGetTensorMemoryRequirementsARM") + set_proc_address(&GetTensorOpaqueCaptureDataARM, "vkGetTensorOpaqueCaptureDataARM") + set_proc_address(&GetTensorOpaqueCaptureDescriptorDataARM, "vkGetTensorOpaqueCaptureDescriptorDataARM") + set_proc_address(&GetTensorViewOpaqueCaptureDescriptorDataARM, "vkGetTensorViewOpaqueCaptureDescriptorDataARM") set_proc_address(&GetValidationCacheDataEXT, "vkGetValidationCacheDataEXT") set_proc_address(&GetVideoSessionMemoryRequirementsKHR, "vkGetVideoSessionMemoryRequirementsKHR") set_proc_address(&ImportFenceFdKHR, "vkImportFenceFdKHR") @@ -2102,6 +2402,7 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&QueueSubmit2, "vkQueueSubmit2") set_proc_address(&QueueSubmit2KHR, "vkQueueSubmit2KHR") set_proc_address(&QueueWaitIdle, "vkQueueWaitIdle") + set_proc_address(&RegisterCustomBorderColorEXT, "vkRegisterCustomBorderColorEXT") set_proc_address(&RegisterDeviceEventEXT, "vkRegisterDeviceEventEXT") set_proc_address(&RegisterDisplayEventEXT, "vkRegisterDisplayEventEXT") set_proc_address(&ReleaseCapturedPipelineDataKHR, "vkReleaseCapturedPipelineDataKHR") @@ -2109,23 +2410,27 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&ReleasePerformanceConfigurationINTEL, "vkReleasePerformanceConfigurationINTEL") set_proc_address(&ReleaseProfilingLockKHR, "vkReleaseProfilingLockKHR") set_proc_address(&ReleaseSwapchainImagesEXT, "vkReleaseSwapchainImagesEXT") + set_proc_address(&ReleaseSwapchainImagesKHR, "vkReleaseSwapchainImagesKHR") set_proc_address(&ResetCommandBuffer, "vkResetCommandBuffer") set_proc_address(&ResetCommandPool, "vkResetCommandPool") set_proc_address(&ResetDescriptorPool, "vkResetDescriptorPool") set_proc_address(&ResetEvent, "vkResetEvent") set_proc_address(&ResetFences, "vkResetFences") + set_proc_address(&ResetGpaSessionAMD, "vkResetGpaSessionAMD") set_proc_address(&ResetQueryPool, "vkResetQueryPool") set_proc_address(&ResetQueryPoolEXT, "vkResetQueryPoolEXT") set_proc_address(&SetDebugUtilsObjectNameEXT, "vkSetDebugUtilsObjectNameEXT") set_proc_address(&SetDebugUtilsObjectTagEXT, "vkSetDebugUtilsObjectTagEXT") set_proc_address(&SetDeviceMemoryPriorityEXT, "vkSetDeviceMemoryPriorityEXT") set_proc_address(&SetEvent, "vkSetEvent") + set_proc_address(&SetGpaDeviceClockModeAMD, "vkSetGpaDeviceClockModeAMD") set_proc_address(&SetHdrMetadataEXT, "vkSetHdrMetadataEXT") set_proc_address(&SetLatencyMarkerNV, "vkSetLatencyMarkerNV") set_proc_address(&SetLatencySleepModeNV, "vkSetLatencySleepModeNV") set_proc_address(&SetLocalDimmingAMD, "vkSetLocalDimmingAMD") set_proc_address(&SetPrivateData, "vkSetPrivateData") set_proc_address(&SetPrivateDataEXT, "vkSetPrivateDataEXT") + set_proc_address(&SetSwapchainPresentTimingQueueSizeEXT, "vkSetSwapchainPresentTimingQueueSizeEXT") set_proc_address(&SignalSemaphore, "vkSignalSemaphore") set_proc_address(&SignalSemaphoreKHR, "vkSignalSemaphoreKHR") set_proc_address(&TransitionImageLayout, "vkTransitionImageLayout") @@ -2136,6 +2441,7 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&UnmapMemory, "vkUnmapMemory") set_proc_address(&UnmapMemory2, "vkUnmapMemory2") set_proc_address(&UnmapMemory2KHR, "vkUnmapMemory2KHR") + set_proc_address(&UnregisterCustomBorderColorEXT, "vkUnregisterCustomBorderColorEXT") set_proc_address(&UpdateDescriptorSetWithTemplate, "vkUpdateDescriptorSetWithTemplate") set_proc_address(&UpdateDescriptorSetWithTemplateKHR, "vkUpdateDescriptorSetWithTemplateKHR") set_proc_address(&UpdateDescriptorSets, "vkUpdateDescriptorSets") @@ -2143,11 +2449,14 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&UpdateIndirectExecutionSetShaderEXT, "vkUpdateIndirectExecutionSetShaderEXT") set_proc_address(&UpdateVideoSessionParametersKHR, "vkUpdateVideoSessionParametersKHR") set_proc_address(&WaitForFences, "vkWaitForFences") + set_proc_address(&WaitForPresent2KHR, "vkWaitForPresent2KHR") set_proc_address(&WaitForPresentKHR, "vkWaitForPresentKHR") set_proc_address(&WaitSemaphores, "vkWaitSemaphores") set_proc_address(&WaitSemaphoresKHR, "vkWaitSemaphoresKHR") set_proc_address(&WriteAccelerationStructuresPropertiesKHR, "vkWriteAccelerationStructuresPropertiesKHR") set_proc_address(&WriteMicromapsPropertiesEXT, "vkWriteMicromapsPropertiesEXT") + set_proc_address(&WriteResourceDescriptorsEXT, "vkWriteResourceDescriptorsEXT") + set_proc_address(&WriteSamplerDescriptorsEXT, "vkWriteSamplerDescriptorsEXT") } @@ -2167,15 +2476,23 @@ Device_VTable :: struct { BindBufferMemory: ProcBindBufferMemory, BindBufferMemory2: ProcBindBufferMemory2, BindBufferMemory2KHR: ProcBindBufferMemory2KHR, + BindDataGraphPipelineSessionMemoryARM: ProcBindDataGraphPipelineSessionMemoryARM, BindImageMemory: ProcBindImageMemory, BindImageMemory2: ProcBindImageMemory2, BindImageMemory2KHR: ProcBindImageMemory2KHR, BindOpticalFlowSessionImageNV: ProcBindOpticalFlowSessionImageNV, + BindTensorMemoryARM: ProcBindTensorMemoryARM, BindVideoSessionMemoryKHR: ProcBindVideoSessionMemoryKHR, BuildAccelerationStructuresKHR: ProcBuildAccelerationStructuresKHR, BuildMicromapsEXT: ProcBuildMicromapsEXT, + ClearShaderInstrumentationMetricsARM: ProcClearShaderInstrumentationMetricsARM, + CmdBeginConditionalRendering2EXT: ProcCmdBeginConditionalRendering2EXT, CmdBeginConditionalRenderingEXT: ProcCmdBeginConditionalRenderingEXT, + CmdBeginCustomResolveEXT: ProcCmdBeginCustomResolveEXT, CmdBeginDebugUtilsLabelEXT: ProcCmdBeginDebugUtilsLabelEXT, + CmdBeginGpaSampleAMD: ProcCmdBeginGpaSampleAMD, + CmdBeginGpaSessionAMD: ProcCmdBeginGpaSessionAMD, + CmdBeginPerTileExecutionQCOM: ProcCmdBeginPerTileExecutionQCOM, CmdBeginQuery: ProcCmdBeginQuery, CmdBeginQueryIndexedEXT: ProcCmdBeginQueryIndexedEXT, CmdBeginRenderPass: ProcCmdBeginRenderPass, @@ -2183,6 +2500,8 @@ Device_VTable :: struct { CmdBeginRenderPass2KHR: ProcCmdBeginRenderPass2KHR, CmdBeginRendering: ProcCmdBeginRendering, CmdBeginRenderingKHR: ProcCmdBeginRenderingKHR, + CmdBeginShaderInstrumentationARM: ProcCmdBeginShaderInstrumentationARM, + CmdBeginTransformFeedback2EXT: ProcCmdBeginTransformFeedback2EXT, CmdBeginTransformFeedbackEXT: ProcCmdBeginTransformFeedbackEXT, CmdBeginVideoCodingKHR: ProcCmdBeginVideoCodingKHR, CmdBindDescriptorBufferEmbeddedSamplers2EXT: ProcCmdBindDescriptorBufferEmbeddedSamplers2EXT, @@ -2194,15 +2513,21 @@ Device_VTable :: struct { CmdBindIndexBuffer: ProcCmdBindIndexBuffer, CmdBindIndexBuffer2: ProcCmdBindIndexBuffer2, CmdBindIndexBuffer2KHR: ProcCmdBindIndexBuffer2KHR, + CmdBindIndexBuffer3KHR: ProcCmdBindIndexBuffer3KHR, CmdBindInvocationMaskHUAWEI: ProcCmdBindInvocationMaskHUAWEI, CmdBindPipeline: ProcCmdBindPipeline, CmdBindPipelineShaderGroupNV: ProcCmdBindPipelineShaderGroupNV, + CmdBindResourceHeapEXT: ProcCmdBindResourceHeapEXT, + CmdBindSamplerHeapEXT: ProcCmdBindSamplerHeapEXT, CmdBindShadersEXT: ProcCmdBindShadersEXT, CmdBindShadingRateImageNV: ProcCmdBindShadingRateImageNV, + CmdBindTileMemoryQCOM: ProcCmdBindTileMemoryQCOM, + CmdBindTransformFeedbackBuffers2EXT: ProcCmdBindTransformFeedbackBuffers2EXT, CmdBindTransformFeedbackBuffersEXT: ProcCmdBindTransformFeedbackBuffersEXT, CmdBindVertexBuffers: ProcCmdBindVertexBuffers, CmdBindVertexBuffers2: ProcCmdBindVertexBuffers2, CmdBindVertexBuffers2EXT: ProcCmdBindVertexBuffers2EXT, + CmdBindVertexBuffers3KHR: ProcCmdBindVertexBuffers3KHR, CmdBlitImage: ProcCmdBlitImage, CmdBlitImage2: ProcCmdBlitImage2, CmdBlitImage2KHR: ProcCmdBlitImage2KHR, @@ -2226,48 +2551,68 @@ Device_VTable :: struct { CmdCopyBufferToImage: ProcCmdCopyBufferToImage, CmdCopyBufferToImage2: ProcCmdCopyBufferToImage2, CmdCopyBufferToImage2KHR: ProcCmdCopyBufferToImage2KHR, + CmdCopyGpaSessionResultsAMD: ProcCmdCopyGpaSessionResultsAMD, CmdCopyImage: ProcCmdCopyImage, CmdCopyImage2: ProcCmdCopyImage2, CmdCopyImage2KHR: ProcCmdCopyImage2KHR, CmdCopyImageToBuffer: ProcCmdCopyImageToBuffer, CmdCopyImageToBuffer2: ProcCmdCopyImageToBuffer2, CmdCopyImageToBuffer2KHR: ProcCmdCopyImageToBuffer2KHR, + CmdCopyImageToMemoryKHR: ProcCmdCopyImageToMemoryKHR, + CmdCopyMemoryIndirectKHR: ProcCmdCopyMemoryIndirectKHR, CmdCopyMemoryIndirectNV: ProcCmdCopyMemoryIndirectNV, + CmdCopyMemoryKHR: ProcCmdCopyMemoryKHR, CmdCopyMemoryToAccelerationStructureKHR: ProcCmdCopyMemoryToAccelerationStructureKHR, + CmdCopyMemoryToImageIndirectKHR: ProcCmdCopyMemoryToImageIndirectKHR, CmdCopyMemoryToImageIndirectNV: ProcCmdCopyMemoryToImageIndirectNV, + CmdCopyMemoryToImageKHR: ProcCmdCopyMemoryToImageKHR, CmdCopyMemoryToMicromapEXT: ProcCmdCopyMemoryToMicromapEXT, CmdCopyMicromapEXT: ProcCmdCopyMicromapEXT, CmdCopyMicromapToMemoryEXT: ProcCmdCopyMicromapToMemoryEXT, CmdCopyQueryPoolResults: ProcCmdCopyQueryPoolResults, + CmdCopyQueryPoolResultsToMemoryKHR: ProcCmdCopyQueryPoolResultsToMemoryKHR, + CmdCopyTensorARM: ProcCmdCopyTensorARM, CmdCuLaunchKernelNVX: ProcCmdCuLaunchKernelNVX, CmdCudaLaunchKernelNV: ProcCmdCudaLaunchKernelNV, CmdDebugMarkerBeginEXT: ProcCmdDebugMarkerBeginEXT, CmdDebugMarkerEndEXT: ProcCmdDebugMarkerEndEXT, CmdDebugMarkerInsertEXT: ProcCmdDebugMarkerInsertEXT, CmdDecodeVideoKHR: ProcCmdDecodeVideoKHR, + CmdDecompressMemoryEXT: ProcCmdDecompressMemoryEXT, + CmdDecompressMemoryIndirectCountEXT: ProcCmdDecompressMemoryIndirectCountEXT, CmdDecompressMemoryIndirectCountNV: ProcCmdDecompressMemoryIndirectCountNV, CmdDecompressMemoryNV: ProcCmdDecompressMemoryNV, CmdDispatch: ProcCmdDispatch, CmdDispatchBase: ProcCmdDispatchBase, CmdDispatchBaseKHR: ProcCmdDispatchBaseKHR, + CmdDispatchDataGraphARM: ProcCmdDispatchDataGraphARM, CmdDispatchGraphAMDX: ProcCmdDispatchGraphAMDX, CmdDispatchGraphIndirectAMDX: ProcCmdDispatchGraphIndirectAMDX, CmdDispatchGraphIndirectCountAMDX: ProcCmdDispatchGraphIndirectCountAMDX, CmdDispatchIndirect: ProcCmdDispatchIndirect, + CmdDispatchIndirect2KHR: ProcCmdDispatchIndirect2KHR, + CmdDispatchTileQCOM: ProcCmdDispatchTileQCOM, CmdDraw: ProcCmdDraw, CmdDrawClusterHUAWEI: ProcCmdDrawClusterHUAWEI, CmdDrawClusterIndirectHUAWEI: ProcCmdDrawClusterIndirectHUAWEI, CmdDrawIndexed: ProcCmdDrawIndexed, CmdDrawIndexedIndirect: ProcCmdDrawIndexedIndirect, + CmdDrawIndexedIndirect2KHR: ProcCmdDrawIndexedIndirect2KHR, CmdDrawIndexedIndirectCount: ProcCmdDrawIndexedIndirectCount, + CmdDrawIndexedIndirectCount2KHR: ProcCmdDrawIndexedIndirectCount2KHR, CmdDrawIndexedIndirectCountAMD: ProcCmdDrawIndexedIndirectCountAMD, CmdDrawIndexedIndirectCountKHR: ProcCmdDrawIndexedIndirectCountKHR, CmdDrawIndirect: ProcCmdDrawIndirect, + CmdDrawIndirect2KHR: ProcCmdDrawIndirect2KHR, + CmdDrawIndirectByteCount2EXT: ProcCmdDrawIndirectByteCount2EXT, CmdDrawIndirectByteCountEXT: ProcCmdDrawIndirectByteCountEXT, CmdDrawIndirectCount: ProcCmdDrawIndirectCount, + CmdDrawIndirectCount2KHR: ProcCmdDrawIndirectCount2KHR, CmdDrawIndirectCountAMD: ProcCmdDrawIndirectCountAMD, CmdDrawIndirectCountKHR: ProcCmdDrawIndirectCountKHR, CmdDrawMeshTasksEXT: ProcCmdDrawMeshTasksEXT, + CmdDrawMeshTasksIndirect2EXT: ProcCmdDrawMeshTasksIndirect2EXT, + CmdDrawMeshTasksIndirectCount2EXT: ProcCmdDrawMeshTasksIndirectCount2EXT, CmdDrawMeshTasksIndirectCountEXT: ProcCmdDrawMeshTasksIndirectCountEXT, CmdDrawMeshTasksIndirectCountNV: ProcCmdDrawMeshTasksIndirectCountNV, CmdDrawMeshTasksIndirectEXT: ProcCmdDrawMeshTasksIndirectEXT, @@ -2278,19 +2623,27 @@ Device_VTable :: struct { CmdEncodeVideoKHR: ProcCmdEncodeVideoKHR, CmdEndConditionalRenderingEXT: ProcCmdEndConditionalRenderingEXT, CmdEndDebugUtilsLabelEXT: ProcCmdEndDebugUtilsLabelEXT, + CmdEndGpaSampleAMD: ProcCmdEndGpaSampleAMD, + CmdEndGpaSessionAMD: ProcCmdEndGpaSessionAMD, + CmdEndPerTileExecutionQCOM: ProcCmdEndPerTileExecutionQCOM, CmdEndQuery: ProcCmdEndQuery, CmdEndQueryIndexedEXT: ProcCmdEndQueryIndexedEXT, CmdEndRenderPass: ProcCmdEndRenderPass, CmdEndRenderPass2: ProcCmdEndRenderPass2, CmdEndRenderPass2KHR: ProcCmdEndRenderPass2KHR, CmdEndRendering: ProcCmdEndRendering, + CmdEndRendering2EXT: ProcCmdEndRendering2EXT, + CmdEndRendering2KHR: ProcCmdEndRendering2KHR, CmdEndRenderingKHR: ProcCmdEndRenderingKHR, + CmdEndShaderInstrumentationARM: ProcCmdEndShaderInstrumentationARM, + CmdEndTransformFeedback2EXT: ProcCmdEndTransformFeedback2EXT, CmdEndTransformFeedbackEXT: ProcCmdEndTransformFeedbackEXT, CmdEndVideoCodingKHR: ProcCmdEndVideoCodingKHR, CmdExecuteCommands: ProcCmdExecuteCommands, CmdExecuteGeneratedCommandsEXT: ProcCmdExecuteGeneratedCommandsEXT, CmdExecuteGeneratedCommandsNV: ProcCmdExecuteGeneratedCommandsNV, CmdFillBuffer: ProcCmdFillBuffer, + CmdFillMemoryKHR: ProcCmdFillMemoryKHR, CmdInitializeGraphScratchMemoryAMDX: ProcCmdInitializeGraphScratchMemoryAMDX, CmdInsertDebugUtilsLabelEXT: ProcCmdInsertDebugUtilsLabelEXT, CmdNextSubpass: ProcCmdNextSubpass, @@ -2305,6 +2658,7 @@ Device_VTable :: struct { CmdPushConstants: ProcCmdPushConstants, CmdPushConstants2: ProcCmdPushConstants2, CmdPushConstants2KHR: ProcCmdPushConstants2KHR, + CmdPushDataEXT: ProcCmdPushDataEXT, CmdPushDescriptorSet: ProcCmdPushDescriptorSet, CmdPushDescriptorSet2: ProcCmdPushDescriptorSet2, CmdPushDescriptorSet2KHR: ProcCmdPushDescriptorSet2KHR, @@ -2329,7 +2683,9 @@ Device_VTable :: struct { CmdSetColorBlendAdvancedEXT: ProcCmdSetColorBlendAdvancedEXT, CmdSetColorBlendEnableEXT: ProcCmdSetColorBlendEnableEXT, CmdSetColorBlendEquationEXT: ProcCmdSetColorBlendEquationEXT, + CmdSetColorWriteEnableEXT: ProcCmdSetColorWriteEnableEXT, CmdSetColorWriteMaskEXT: ProcCmdSetColorWriteMaskEXT, + CmdSetComputeOccupancyPriorityNV: ProcCmdSetComputeOccupancyPriorityNV, CmdSetConservativeRasterizationModeEXT: ProcCmdSetConservativeRasterizationModeEXT, CmdSetCoverageModulationModeNV: ProcCmdSetCoverageModulationModeNV, CmdSetCoverageModulationTableEnableNV: ProcCmdSetCoverageModulationTableEnableNV, @@ -2363,6 +2719,7 @@ Device_VTable :: struct { CmdSetDiscardRectangleEXT: ProcCmdSetDiscardRectangleEXT, CmdSetDiscardRectangleEnableEXT: ProcCmdSetDiscardRectangleEnableEXT, CmdSetDiscardRectangleModeEXT: ProcCmdSetDiscardRectangleModeEXT, + CmdSetDispatchParametersARM: ProcCmdSetDispatchParametersARM, CmdSetEvent: ProcCmdSetEvent, CmdSetEvent2: ProcCmdSetEvent2, CmdSetEvent2KHR: ProcCmdSetEvent2KHR, @@ -2388,6 +2745,7 @@ Device_VTable :: struct { CmdSetPolygonModeEXT: ProcCmdSetPolygonModeEXT, CmdSetPrimitiveRestartEnable: ProcCmdSetPrimitiveRestartEnable, CmdSetPrimitiveRestartEnableEXT: ProcCmdSetPrimitiveRestartEnableEXT, + CmdSetPrimitiveRestartIndexEXT: ProcCmdSetPrimitiveRestartIndexEXT, CmdSetPrimitiveTopology: ProcCmdSetPrimitiveTopology, CmdSetPrimitiveTopologyEXT: ProcCmdSetPrimitiveTopologyEXT, CmdSetProvokingVertexModeEXT: ProcCmdSetProvokingVertexModeEXT, @@ -2430,6 +2788,7 @@ Device_VTable :: struct { CmdTraceRaysKHR: ProcCmdTraceRaysKHR, CmdTraceRaysNV: ProcCmdTraceRaysNV, CmdUpdateBuffer: ProcCmdUpdateBuffer, + CmdUpdateMemoryKHR: ProcCmdUpdateMemoryKHR, CmdUpdatePipelineIndirectBufferNV: ProcCmdUpdatePipelineIndirectBufferNV, CmdWaitEvents: ProcCmdWaitEvents, CmdWaitEvents2: ProcCmdWaitEvents2, @@ -2438,6 +2797,7 @@ Device_VTable :: struct { CmdWriteAccelerationStructuresPropertiesNV: ProcCmdWriteAccelerationStructuresPropertiesNV, CmdWriteBufferMarker2AMD: ProcCmdWriteBufferMarker2AMD, CmdWriteBufferMarkerAMD: ProcCmdWriteBufferMarkerAMD, + CmdWriteMarkerToMemoryAMD: ProcCmdWriteMarkerToMemoryAMD, CmdWriteMicromapsPropertiesEXT: ProcCmdWriteMicromapsPropertiesEXT, CmdWriteTimestamp: ProcCmdWriteTimestamp, CmdWriteTimestamp2: ProcCmdWriteTimestamp2, @@ -2456,6 +2816,7 @@ Device_VTable :: struct { CopyMemoryToMicromapEXT: ProcCopyMemoryToMicromapEXT, CopyMicromapEXT: ProcCopyMicromapEXT, CopyMicromapToMemoryEXT: ProcCopyMicromapToMemoryEXT, + CreateAccelerationStructure2KHR: ProcCreateAccelerationStructure2KHR, CreateAccelerationStructureKHR: ProcCreateAccelerationStructureKHR, CreateAccelerationStructureNV: ProcCreateAccelerationStructureNV, CreateBuffer: ProcCreateBuffer, @@ -2466,6 +2827,8 @@ Device_VTable :: struct { CreateCuModuleNVX: ProcCreateCuModuleNVX, CreateCudaFunctionNV: ProcCreateCudaFunctionNV, CreateCudaModuleNV: ProcCreateCudaModuleNV, + CreateDataGraphPipelineSessionARM: ProcCreateDataGraphPipelineSessionARM, + CreateDataGraphPipelinesARM: ProcCreateDataGraphPipelinesARM, CreateDeferredOperationKHR: ProcCreateDeferredOperationKHR, CreateDescriptorPool: ProcCreateDescriptorPool, CreateDescriptorSetLayout: ProcCreateDescriptorSetLayout, @@ -2473,8 +2836,10 @@ Device_VTable :: struct { CreateDescriptorUpdateTemplateKHR: ProcCreateDescriptorUpdateTemplateKHR, CreateEvent: ProcCreateEvent, CreateExecutionGraphPipelinesAMDX: ProcCreateExecutionGraphPipelinesAMDX, + CreateExternalComputeQueueNV: ProcCreateExternalComputeQueueNV, CreateFence: ProcCreateFence, CreateFramebuffer: ProcCreateFramebuffer, + CreateGpaSessionAMD: ProcCreateGpaSessionAMD, CreateGraphicsPipelines: ProcCreateGraphicsPipelines, CreateImage: ProcCreateImage, CreateImageView: ProcCreateImageView, @@ -2498,10 +2863,13 @@ Device_VTable :: struct { CreateSamplerYcbcrConversion: ProcCreateSamplerYcbcrConversion, CreateSamplerYcbcrConversionKHR: ProcCreateSamplerYcbcrConversionKHR, CreateSemaphore: ProcCreateSemaphore, + CreateShaderInstrumentationARM: ProcCreateShaderInstrumentationARM, CreateShaderModule: ProcCreateShaderModule, CreateShadersEXT: ProcCreateShadersEXT, CreateSharedSwapchainsKHR: ProcCreateSharedSwapchainsKHR, CreateSwapchainKHR: ProcCreateSwapchainKHR, + CreateTensorARM: ProcCreateTensorARM, + CreateTensorViewARM: ProcCreateTensorViewARM, CreateValidationCacheEXT: ProcCreateValidationCacheEXT, CreateVideoSessionKHR: ProcCreateVideoSessionKHR, CreateVideoSessionParametersKHR: ProcCreateVideoSessionParametersKHR, @@ -2517,6 +2885,7 @@ Device_VTable :: struct { DestroyCuModuleNVX: ProcDestroyCuModuleNVX, DestroyCudaFunctionNV: ProcDestroyCudaFunctionNV, DestroyCudaModuleNV: ProcDestroyCudaModuleNV, + DestroyDataGraphPipelineSessionARM: ProcDestroyDataGraphPipelineSessionARM, DestroyDeferredOperationKHR: ProcDestroyDeferredOperationKHR, DestroyDescriptorPool: ProcDestroyDescriptorPool, DestroyDescriptorSetLayout: ProcDestroyDescriptorSetLayout, @@ -2524,8 +2893,10 @@ Device_VTable :: struct { DestroyDescriptorUpdateTemplateKHR: ProcDestroyDescriptorUpdateTemplateKHR, DestroyDevice: ProcDestroyDevice, DestroyEvent: ProcDestroyEvent, + DestroyExternalComputeQueueNV: ProcDestroyExternalComputeQueueNV, DestroyFence: ProcDestroyFence, DestroyFramebuffer: ProcDestroyFramebuffer, + DestroyGpaSessionAMD: ProcDestroyGpaSessionAMD, DestroyImage: ProcDestroyImage, DestroyImageView: ProcDestroyImageView, DestroyIndirectCommandsLayoutEXT: ProcDestroyIndirectCommandsLayoutEXT, @@ -2546,8 +2917,11 @@ Device_VTable :: struct { DestroySamplerYcbcrConversionKHR: ProcDestroySamplerYcbcrConversionKHR, DestroySemaphore: ProcDestroySemaphore, DestroyShaderEXT: ProcDestroyShaderEXT, + DestroyShaderInstrumentationARM: ProcDestroyShaderInstrumentationARM, DestroyShaderModule: ProcDestroyShaderModule, DestroySwapchainKHR: ProcDestroySwapchainKHR, + DestroyTensorARM: ProcDestroyTensorARM, + DestroyTensorViewARM: ProcDestroyTensorViewARM, DestroyValidationCacheEXT: ProcDestroyValidationCacheEXT, DestroyVideoSessionKHR: ProcDestroyVideoSessionKHR, DestroyVideoSessionParametersKHR: ProcDestroyVideoSessionParametersKHR, @@ -2577,6 +2951,10 @@ Device_VTable :: struct { GetCalibratedTimestampsKHR: ProcGetCalibratedTimestampsKHR, GetClusterAccelerationStructureBuildSizesNV: ProcGetClusterAccelerationStructureBuildSizesNV, GetCudaModuleCacheNV: ProcGetCudaModuleCacheNV, + GetDataGraphPipelineAvailablePropertiesARM: ProcGetDataGraphPipelineAvailablePropertiesARM, + GetDataGraphPipelinePropertiesARM: ProcGetDataGraphPipelinePropertiesARM, + GetDataGraphPipelineSessionBindPointRequirementsARM: ProcGetDataGraphPipelineSessionBindPointRequirementsARM, + GetDataGraphPipelineSessionMemoryRequirementsARM: ProcGetDataGraphPipelineSessionMemoryRequirementsARM, GetDeferredOperationMaxConcurrencyKHR: ProcGetDeferredOperationMaxConcurrencyKHR, GetDeferredOperationResultKHR: ProcGetDeferredOperationResultKHR, GetDescriptorEXT: ProcGetDescriptorEXT, @@ -2589,7 +2967,10 @@ Device_VTable :: struct { GetDeviceAccelerationStructureCompatibilityKHR: ProcGetDeviceAccelerationStructureCompatibilityKHR, GetDeviceBufferMemoryRequirements: ProcGetDeviceBufferMemoryRequirements, GetDeviceBufferMemoryRequirementsKHR: ProcGetDeviceBufferMemoryRequirementsKHR, + GetDeviceCombinedImageSamplerIndexNVX: ProcGetDeviceCombinedImageSamplerIndexNVX, + GetDeviceFaultDebugInfoKHR: ProcGetDeviceFaultDebugInfoKHR, GetDeviceFaultInfoEXT: ProcGetDeviceFaultInfoEXT, + GetDeviceFaultReportsKHR: ProcGetDeviceFaultReportsKHR, GetDeviceGroupPeerMemoryFeatures: ProcGetDeviceGroupPeerMemoryFeatures, GetDeviceGroupPeerMemoryFeaturesKHR: ProcGetDeviceGroupPeerMemoryFeaturesKHR, GetDeviceGroupPresentCapabilitiesKHR: ProcGetDeviceGroupPresentCapabilitiesKHR, @@ -2609,6 +2990,7 @@ Device_VTable :: struct { GetDeviceQueue: ProcGetDeviceQueue, GetDeviceQueue2: ProcGetDeviceQueue2, GetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI: ProcGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI, + GetDeviceTensorMemoryRequirementsARM: ProcGetDeviceTensorMemoryRequirementsARM, GetDynamicRenderingTilePropertiesQCOM: ProcGetDynamicRenderingTilePropertiesQCOM, GetEncodedVideoSessionParametersKHR: ProcGetEncodedVideoSessionParametersKHR, GetEventStatus: ProcGetEventStatus, @@ -2620,10 +3002,14 @@ Device_VTable :: struct { GetFramebufferTilePropertiesQCOM: ProcGetFramebufferTilePropertiesQCOM, GetGeneratedCommandsMemoryRequirementsEXT: ProcGetGeneratedCommandsMemoryRequirementsEXT, GetGeneratedCommandsMemoryRequirementsNV: ProcGetGeneratedCommandsMemoryRequirementsNV, + GetGpaDeviceClockInfoAMD: ProcGetGpaDeviceClockInfoAMD, + GetGpaSessionResultsAMD: ProcGetGpaSessionResultsAMD, + GetGpaSessionStatusAMD: ProcGetGpaSessionStatusAMD, GetImageDrmFormatModifierPropertiesEXT: ProcGetImageDrmFormatModifierPropertiesEXT, GetImageMemoryRequirements: ProcGetImageMemoryRequirements, GetImageMemoryRequirements2: ProcGetImageMemoryRequirements2, GetImageMemoryRequirements2KHR: ProcGetImageMemoryRequirements2KHR, + GetImageOpaqueCaptureDataEXT: ProcGetImageOpaqueCaptureDataEXT, GetImageOpaqueCaptureDescriptorDataEXT: ProcGetImageOpaqueCaptureDescriptorDataEXT, GetImageSparseMemoryRequirements: ProcGetImageSparseMemoryRequirements, GetImageSparseMemoryRequirements2: ProcGetImageSparseMemoryRequirements2, @@ -2648,6 +3034,7 @@ Device_VTable :: struct { GetMemoryWin32HandlePropertiesKHR: ProcGetMemoryWin32HandlePropertiesKHR, GetMicromapBuildSizesEXT: ProcGetMicromapBuildSizesEXT, GetPartitionedAccelerationStructuresBuildSizesNV: ProcGetPartitionedAccelerationStructuresBuildSizesNV, + GetPastPresentationTimingEXT: ProcGetPastPresentationTimingEXT, GetPastPresentationTimingGOOGLE: ProcGetPastPresentationTimingGOOGLE, GetPerformanceParameterINTEL: ProcGetPerformanceParameterINTEL, GetPipelineBinaryDataKHR: ProcGetPipelineBinaryDataKHR, @@ -2679,11 +3066,18 @@ Device_VTable :: struct { GetSemaphoreWin32HandleKHR: ProcGetSemaphoreWin32HandleKHR, GetShaderBinaryDataEXT: ProcGetShaderBinaryDataEXT, GetShaderInfoAMD: ProcGetShaderInfoAMD, + GetShaderInstrumentationValuesARM: ProcGetShaderInstrumentationValuesARM, GetShaderModuleCreateInfoIdentifierEXT: ProcGetShaderModuleCreateInfoIdentifierEXT, GetShaderModuleIdentifierEXT: ProcGetShaderModuleIdentifierEXT, GetSwapchainCounterEXT: ProcGetSwapchainCounterEXT, GetSwapchainImagesKHR: ProcGetSwapchainImagesKHR, GetSwapchainStatusKHR: ProcGetSwapchainStatusKHR, + GetSwapchainTimeDomainPropertiesEXT: ProcGetSwapchainTimeDomainPropertiesEXT, + GetSwapchainTimingPropertiesEXT: ProcGetSwapchainTimingPropertiesEXT, + GetTensorMemoryRequirementsARM: ProcGetTensorMemoryRequirementsARM, + GetTensorOpaqueCaptureDataARM: ProcGetTensorOpaqueCaptureDataARM, + GetTensorOpaqueCaptureDescriptorDataARM: ProcGetTensorOpaqueCaptureDescriptorDataARM, + GetTensorViewOpaqueCaptureDescriptorDataARM: ProcGetTensorViewOpaqueCaptureDescriptorDataARM, GetValidationCacheDataEXT: ProcGetValidationCacheDataEXT, GetVideoSessionMemoryRequirementsKHR: ProcGetVideoSessionMemoryRequirementsKHR, ImportFenceFdKHR: ProcImportFenceFdKHR, @@ -2709,6 +3103,7 @@ Device_VTable :: struct { QueueSubmit2: ProcQueueSubmit2, QueueSubmit2KHR: ProcQueueSubmit2KHR, QueueWaitIdle: ProcQueueWaitIdle, + RegisterCustomBorderColorEXT: ProcRegisterCustomBorderColorEXT, RegisterDeviceEventEXT: ProcRegisterDeviceEventEXT, RegisterDisplayEventEXT: ProcRegisterDisplayEventEXT, ReleaseCapturedPipelineDataKHR: ProcReleaseCapturedPipelineDataKHR, @@ -2716,23 +3111,27 @@ Device_VTable :: struct { ReleasePerformanceConfigurationINTEL: ProcReleasePerformanceConfigurationINTEL, ReleaseProfilingLockKHR: ProcReleaseProfilingLockKHR, ReleaseSwapchainImagesEXT: ProcReleaseSwapchainImagesEXT, + ReleaseSwapchainImagesKHR: ProcReleaseSwapchainImagesKHR, ResetCommandBuffer: ProcResetCommandBuffer, ResetCommandPool: ProcResetCommandPool, ResetDescriptorPool: ProcResetDescriptorPool, ResetEvent: ProcResetEvent, ResetFences: ProcResetFences, + ResetGpaSessionAMD: ProcResetGpaSessionAMD, ResetQueryPool: ProcResetQueryPool, ResetQueryPoolEXT: ProcResetQueryPoolEXT, SetDebugUtilsObjectNameEXT: ProcSetDebugUtilsObjectNameEXT, SetDebugUtilsObjectTagEXT: ProcSetDebugUtilsObjectTagEXT, SetDeviceMemoryPriorityEXT: ProcSetDeviceMemoryPriorityEXT, SetEvent: ProcSetEvent, + SetGpaDeviceClockModeAMD: ProcSetGpaDeviceClockModeAMD, SetHdrMetadataEXT: ProcSetHdrMetadataEXT, SetLatencyMarkerNV: ProcSetLatencyMarkerNV, SetLatencySleepModeNV: ProcSetLatencySleepModeNV, SetLocalDimmingAMD: ProcSetLocalDimmingAMD, SetPrivateData: ProcSetPrivateData, SetPrivateDataEXT: ProcSetPrivateDataEXT, + SetSwapchainPresentTimingQueueSizeEXT: ProcSetSwapchainPresentTimingQueueSizeEXT, SignalSemaphore: ProcSignalSemaphore, SignalSemaphoreKHR: ProcSignalSemaphoreKHR, TransitionImageLayout: ProcTransitionImageLayout, @@ -2743,6 +3142,7 @@ Device_VTable :: struct { UnmapMemory: ProcUnmapMemory, UnmapMemory2: ProcUnmapMemory2, UnmapMemory2KHR: ProcUnmapMemory2KHR, + UnregisterCustomBorderColorEXT: ProcUnregisterCustomBorderColorEXT, UpdateDescriptorSetWithTemplate: ProcUpdateDescriptorSetWithTemplate, UpdateDescriptorSetWithTemplateKHR: ProcUpdateDescriptorSetWithTemplateKHR, UpdateDescriptorSets: ProcUpdateDescriptorSets, @@ -2750,11 +3150,14 @@ Device_VTable :: struct { UpdateIndirectExecutionSetShaderEXT: ProcUpdateIndirectExecutionSetShaderEXT, UpdateVideoSessionParametersKHR: ProcUpdateVideoSessionParametersKHR, WaitForFences: ProcWaitForFences, + WaitForPresent2KHR: ProcWaitForPresent2KHR, WaitForPresentKHR: ProcWaitForPresentKHR, WaitSemaphores: ProcWaitSemaphores, WaitSemaphoresKHR: ProcWaitSemaphoresKHR, WriteAccelerationStructuresPropertiesKHR: ProcWriteAccelerationStructuresPropertiesKHR, WriteMicromapsPropertiesEXT: ProcWriteMicromapsPropertiesEXT, + WriteResourceDescriptorsEXT: ProcWriteResourceDescriptorsEXT, + WriteSamplerDescriptorsEXT: ProcWriteSamplerDescriptorsEXT, } load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable) { @@ -2772,15 +3175,23 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.BindBufferMemory = auto_cast GetDeviceProcAddr(device, "vkBindBufferMemory") vtable.BindBufferMemory2 = auto_cast GetDeviceProcAddr(device, "vkBindBufferMemory2") vtable.BindBufferMemory2KHR = auto_cast GetDeviceProcAddr(device, "vkBindBufferMemory2KHR") + vtable.BindDataGraphPipelineSessionMemoryARM = auto_cast GetDeviceProcAddr(device, "vkBindDataGraphPipelineSessionMemoryARM") vtable.BindImageMemory = auto_cast GetDeviceProcAddr(device, "vkBindImageMemory") vtable.BindImageMemory2 = auto_cast GetDeviceProcAddr(device, "vkBindImageMemory2") vtable.BindImageMemory2KHR = auto_cast GetDeviceProcAddr(device, "vkBindImageMemory2KHR") vtable.BindOpticalFlowSessionImageNV = auto_cast GetDeviceProcAddr(device, "vkBindOpticalFlowSessionImageNV") + vtable.BindTensorMemoryARM = auto_cast GetDeviceProcAddr(device, "vkBindTensorMemoryARM") vtable.BindVideoSessionMemoryKHR = auto_cast GetDeviceProcAddr(device, "vkBindVideoSessionMemoryKHR") vtable.BuildAccelerationStructuresKHR = auto_cast GetDeviceProcAddr(device, "vkBuildAccelerationStructuresKHR") vtable.BuildMicromapsEXT = auto_cast GetDeviceProcAddr(device, "vkBuildMicromapsEXT") + vtable.ClearShaderInstrumentationMetricsARM = auto_cast GetDeviceProcAddr(device, "vkClearShaderInstrumentationMetricsARM") + vtable.CmdBeginConditionalRendering2EXT = auto_cast GetDeviceProcAddr(device, "vkCmdBeginConditionalRendering2EXT") vtable.CmdBeginConditionalRenderingEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBeginConditionalRenderingEXT") + vtable.CmdBeginCustomResolveEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBeginCustomResolveEXT") vtable.CmdBeginDebugUtilsLabelEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBeginDebugUtilsLabelEXT") + vtable.CmdBeginGpaSampleAMD = auto_cast GetDeviceProcAddr(device, "vkCmdBeginGpaSampleAMD") + vtable.CmdBeginGpaSessionAMD = auto_cast GetDeviceProcAddr(device, "vkCmdBeginGpaSessionAMD") + vtable.CmdBeginPerTileExecutionQCOM = auto_cast GetDeviceProcAddr(device, "vkCmdBeginPerTileExecutionQCOM") vtable.CmdBeginQuery = auto_cast GetDeviceProcAddr(device, "vkCmdBeginQuery") vtable.CmdBeginQueryIndexedEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBeginQueryIndexedEXT") vtable.CmdBeginRenderPass = auto_cast GetDeviceProcAddr(device, "vkCmdBeginRenderPass") @@ -2788,6 +3199,8 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.CmdBeginRenderPass2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdBeginRenderPass2KHR") vtable.CmdBeginRendering = auto_cast GetDeviceProcAddr(device, "vkCmdBeginRendering") vtable.CmdBeginRenderingKHR = auto_cast GetDeviceProcAddr(device, "vkCmdBeginRenderingKHR") + vtable.CmdBeginShaderInstrumentationARM = auto_cast GetDeviceProcAddr(device, "vkCmdBeginShaderInstrumentationARM") + vtable.CmdBeginTransformFeedback2EXT = auto_cast GetDeviceProcAddr(device, "vkCmdBeginTransformFeedback2EXT") vtable.CmdBeginTransformFeedbackEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBeginTransformFeedbackEXT") vtable.CmdBeginVideoCodingKHR = auto_cast GetDeviceProcAddr(device, "vkCmdBeginVideoCodingKHR") vtable.CmdBindDescriptorBufferEmbeddedSamplers2EXT = auto_cast GetDeviceProcAddr(device, "vkCmdBindDescriptorBufferEmbeddedSamplers2EXT") @@ -2799,15 +3212,21 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.CmdBindIndexBuffer = auto_cast GetDeviceProcAddr(device, "vkCmdBindIndexBuffer") vtable.CmdBindIndexBuffer2 = auto_cast GetDeviceProcAddr(device, "vkCmdBindIndexBuffer2") vtable.CmdBindIndexBuffer2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdBindIndexBuffer2KHR") + vtable.CmdBindIndexBuffer3KHR = auto_cast GetDeviceProcAddr(device, "vkCmdBindIndexBuffer3KHR") vtable.CmdBindInvocationMaskHUAWEI = auto_cast GetDeviceProcAddr(device, "vkCmdBindInvocationMaskHUAWEI") vtable.CmdBindPipeline = auto_cast GetDeviceProcAddr(device, "vkCmdBindPipeline") vtable.CmdBindPipelineShaderGroupNV = auto_cast GetDeviceProcAddr(device, "vkCmdBindPipelineShaderGroupNV") + vtable.CmdBindResourceHeapEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBindResourceHeapEXT") + vtable.CmdBindSamplerHeapEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBindSamplerHeapEXT") vtable.CmdBindShadersEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBindShadersEXT") vtable.CmdBindShadingRateImageNV = auto_cast GetDeviceProcAddr(device, "vkCmdBindShadingRateImageNV") + vtable.CmdBindTileMemoryQCOM = auto_cast GetDeviceProcAddr(device, "vkCmdBindTileMemoryQCOM") + vtable.CmdBindTransformFeedbackBuffers2EXT = auto_cast GetDeviceProcAddr(device, "vkCmdBindTransformFeedbackBuffers2EXT") vtable.CmdBindTransformFeedbackBuffersEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBindTransformFeedbackBuffersEXT") vtable.CmdBindVertexBuffers = auto_cast GetDeviceProcAddr(device, "vkCmdBindVertexBuffers") vtable.CmdBindVertexBuffers2 = auto_cast GetDeviceProcAddr(device, "vkCmdBindVertexBuffers2") vtable.CmdBindVertexBuffers2EXT = auto_cast GetDeviceProcAddr(device, "vkCmdBindVertexBuffers2EXT") + vtable.CmdBindVertexBuffers3KHR = auto_cast GetDeviceProcAddr(device, "vkCmdBindVertexBuffers3KHR") vtable.CmdBlitImage = auto_cast GetDeviceProcAddr(device, "vkCmdBlitImage") vtable.CmdBlitImage2 = auto_cast GetDeviceProcAddr(device, "vkCmdBlitImage2") vtable.CmdBlitImage2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdBlitImage2KHR") @@ -2831,48 +3250,68 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.CmdCopyBufferToImage = auto_cast GetDeviceProcAddr(device, "vkCmdCopyBufferToImage") vtable.CmdCopyBufferToImage2 = auto_cast GetDeviceProcAddr(device, "vkCmdCopyBufferToImage2") vtable.CmdCopyBufferToImage2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyBufferToImage2KHR") + vtable.CmdCopyGpaSessionResultsAMD = auto_cast GetDeviceProcAddr(device, "vkCmdCopyGpaSessionResultsAMD") vtable.CmdCopyImage = auto_cast GetDeviceProcAddr(device, "vkCmdCopyImage") vtable.CmdCopyImage2 = auto_cast GetDeviceProcAddr(device, "vkCmdCopyImage2") vtable.CmdCopyImage2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyImage2KHR") vtable.CmdCopyImageToBuffer = auto_cast GetDeviceProcAddr(device, "vkCmdCopyImageToBuffer") vtable.CmdCopyImageToBuffer2 = auto_cast GetDeviceProcAddr(device, "vkCmdCopyImageToBuffer2") vtable.CmdCopyImageToBuffer2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyImageToBuffer2KHR") + vtable.CmdCopyImageToMemoryKHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyImageToMemoryKHR") + vtable.CmdCopyMemoryIndirectKHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyMemoryIndirectKHR") vtable.CmdCopyMemoryIndirectNV = auto_cast GetDeviceProcAddr(device, "vkCmdCopyMemoryIndirectNV") + vtable.CmdCopyMemoryKHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyMemoryKHR") vtable.CmdCopyMemoryToAccelerationStructureKHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyMemoryToAccelerationStructureKHR") + vtable.CmdCopyMemoryToImageIndirectKHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyMemoryToImageIndirectKHR") vtable.CmdCopyMemoryToImageIndirectNV = auto_cast GetDeviceProcAddr(device, "vkCmdCopyMemoryToImageIndirectNV") + vtable.CmdCopyMemoryToImageKHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyMemoryToImageKHR") vtable.CmdCopyMemoryToMicromapEXT = auto_cast GetDeviceProcAddr(device, "vkCmdCopyMemoryToMicromapEXT") vtable.CmdCopyMicromapEXT = auto_cast GetDeviceProcAddr(device, "vkCmdCopyMicromapEXT") vtable.CmdCopyMicromapToMemoryEXT = auto_cast GetDeviceProcAddr(device, "vkCmdCopyMicromapToMemoryEXT") vtable.CmdCopyQueryPoolResults = auto_cast GetDeviceProcAddr(device, "vkCmdCopyQueryPoolResults") + vtable.CmdCopyQueryPoolResultsToMemoryKHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyQueryPoolResultsToMemoryKHR") + vtable.CmdCopyTensorARM = auto_cast GetDeviceProcAddr(device, "vkCmdCopyTensorARM") vtable.CmdCuLaunchKernelNVX = auto_cast GetDeviceProcAddr(device, "vkCmdCuLaunchKernelNVX") vtable.CmdCudaLaunchKernelNV = auto_cast GetDeviceProcAddr(device, "vkCmdCudaLaunchKernelNV") vtable.CmdDebugMarkerBeginEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDebugMarkerBeginEXT") vtable.CmdDebugMarkerEndEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDebugMarkerEndEXT") vtable.CmdDebugMarkerInsertEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDebugMarkerInsertEXT") vtable.CmdDecodeVideoKHR = auto_cast GetDeviceProcAddr(device, "vkCmdDecodeVideoKHR") + vtable.CmdDecompressMemoryEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDecompressMemoryEXT") + vtable.CmdDecompressMemoryIndirectCountEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDecompressMemoryIndirectCountEXT") vtable.CmdDecompressMemoryIndirectCountNV = auto_cast GetDeviceProcAddr(device, "vkCmdDecompressMemoryIndirectCountNV") vtable.CmdDecompressMemoryNV = auto_cast GetDeviceProcAddr(device, "vkCmdDecompressMemoryNV") vtable.CmdDispatch = auto_cast GetDeviceProcAddr(device, "vkCmdDispatch") vtable.CmdDispatchBase = auto_cast GetDeviceProcAddr(device, "vkCmdDispatchBase") vtable.CmdDispatchBaseKHR = auto_cast GetDeviceProcAddr(device, "vkCmdDispatchBaseKHR") + vtable.CmdDispatchDataGraphARM = auto_cast GetDeviceProcAddr(device, "vkCmdDispatchDataGraphARM") vtable.CmdDispatchGraphAMDX = auto_cast GetDeviceProcAddr(device, "vkCmdDispatchGraphAMDX") vtable.CmdDispatchGraphIndirectAMDX = auto_cast GetDeviceProcAddr(device, "vkCmdDispatchGraphIndirectAMDX") vtable.CmdDispatchGraphIndirectCountAMDX = auto_cast GetDeviceProcAddr(device, "vkCmdDispatchGraphIndirectCountAMDX") vtable.CmdDispatchIndirect = auto_cast GetDeviceProcAddr(device, "vkCmdDispatchIndirect") + vtable.CmdDispatchIndirect2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdDispatchIndirect2KHR") + vtable.CmdDispatchTileQCOM = auto_cast GetDeviceProcAddr(device, "vkCmdDispatchTileQCOM") vtable.CmdDraw = auto_cast GetDeviceProcAddr(device, "vkCmdDraw") vtable.CmdDrawClusterHUAWEI = auto_cast GetDeviceProcAddr(device, "vkCmdDrawClusterHUAWEI") vtable.CmdDrawClusterIndirectHUAWEI = auto_cast GetDeviceProcAddr(device, "vkCmdDrawClusterIndirectHUAWEI") vtable.CmdDrawIndexed = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndexed") vtable.CmdDrawIndexedIndirect = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndexedIndirect") + vtable.CmdDrawIndexedIndirect2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndexedIndirect2KHR") vtable.CmdDrawIndexedIndirectCount = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndexedIndirectCount") + vtable.CmdDrawIndexedIndirectCount2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndexedIndirectCount2KHR") vtable.CmdDrawIndexedIndirectCountAMD = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndexedIndirectCountAMD") vtable.CmdDrawIndexedIndirectCountKHR = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndexedIndirectCountKHR") vtable.CmdDrawIndirect = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndirect") + vtable.CmdDrawIndirect2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndirect2KHR") + vtable.CmdDrawIndirectByteCount2EXT = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndirectByteCount2EXT") vtable.CmdDrawIndirectByteCountEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndirectByteCountEXT") vtable.CmdDrawIndirectCount = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndirectCount") + vtable.CmdDrawIndirectCount2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndirectCount2KHR") vtable.CmdDrawIndirectCountAMD = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndirectCountAMD") vtable.CmdDrawIndirectCountKHR = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndirectCountKHR") vtable.CmdDrawMeshTasksEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDrawMeshTasksEXT") + vtable.CmdDrawMeshTasksIndirect2EXT = auto_cast GetDeviceProcAddr(device, "vkCmdDrawMeshTasksIndirect2EXT") + vtable.CmdDrawMeshTasksIndirectCount2EXT = auto_cast GetDeviceProcAddr(device, "vkCmdDrawMeshTasksIndirectCount2EXT") vtable.CmdDrawMeshTasksIndirectCountEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDrawMeshTasksIndirectCountEXT") vtable.CmdDrawMeshTasksIndirectCountNV = auto_cast GetDeviceProcAddr(device, "vkCmdDrawMeshTasksIndirectCountNV") vtable.CmdDrawMeshTasksIndirectEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDrawMeshTasksIndirectEXT") @@ -2883,19 +3322,27 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.CmdEncodeVideoKHR = auto_cast GetDeviceProcAddr(device, "vkCmdEncodeVideoKHR") vtable.CmdEndConditionalRenderingEXT = auto_cast GetDeviceProcAddr(device, "vkCmdEndConditionalRenderingEXT") vtable.CmdEndDebugUtilsLabelEXT = auto_cast GetDeviceProcAddr(device, "vkCmdEndDebugUtilsLabelEXT") + vtable.CmdEndGpaSampleAMD = auto_cast GetDeviceProcAddr(device, "vkCmdEndGpaSampleAMD") + vtable.CmdEndGpaSessionAMD = auto_cast GetDeviceProcAddr(device, "vkCmdEndGpaSessionAMD") + vtable.CmdEndPerTileExecutionQCOM = auto_cast GetDeviceProcAddr(device, "vkCmdEndPerTileExecutionQCOM") vtable.CmdEndQuery = auto_cast GetDeviceProcAddr(device, "vkCmdEndQuery") vtable.CmdEndQueryIndexedEXT = auto_cast GetDeviceProcAddr(device, "vkCmdEndQueryIndexedEXT") vtable.CmdEndRenderPass = auto_cast GetDeviceProcAddr(device, "vkCmdEndRenderPass") vtable.CmdEndRenderPass2 = auto_cast GetDeviceProcAddr(device, "vkCmdEndRenderPass2") vtable.CmdEndRenderPass2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdEndRenderPass2KHR") vtable.CmdEndRendering = auto_cast GetDeviceProcAddr(device, "vkCmdEndRendering") + vtable.CmdEndRendering2EXT = auto_cast GetDeviceProcAddr(device, "vkCmdEndRendering2EXT") + vtable.CmdEndRendering2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdEndRendering2KHR") vtable.CmdEndRenderingKHR = auto_cast GetDeviceProcAddr(device, "vkCmdEndRenderingKHR") + vtable.CmdEndShaderInstrumentationARM = auto_cast GetDeviceProcAddr(device, "vkCmdEndShaderInstrumentationARM") + vtable.CmdEndTransformFeedback2EXT = auto_cast GetDeviceProcAddr(device, "vkCmdEndTransformFeedback2EXT") vtable.CmdEndTransformFeedbackEXT = auto_cast GetDeviceProcAddr(device, "vkCmdEndTransformFeedbackEXT") vtable.CmdEndVideoCodingKHR = auto_cast GetDeviceProcAddr(device, "vkCmdEndVideoCodingKHR") vtable.CmdExecuteCommands = auto_cast GetDeviceProcAddr(device, "vkCmdExecuteCommands") vtable.CmdExecuteGeneratedCommandsEXT = auto_cast GetDeviceProcAddr(device, "vkCmdExecuteGeneratedCommandsEXT") vtable.CmdExecuteGeneratedCommandsNV = auto_cast GetDeviceProcAddr(device, "vkCmdExecuteGeneratedCommandsNV") vtable.CmdFillBuffer = auto_cast GetDeviceProcAddr(device, "vkCmdFillBuffer") + vtable.CmdFillMemoryKHR = auto_cast GetDeviceProcAddr(device, "vkCmdFillMemoryKHR") vtable.CmdInitializeGraphScratchMemoryAMDX = auto_cast GetDeviceProcAddr(device, "vkCmdInitializeGraphScratchMemoryAMDX") vtable.CmdInsertDebugUtilsLabelEXT = auto_cast GetDeviceProcAddr(device, "vkCmdInsertDebugUtilsLabelEXT") vtable.CmdNextSubpass = auto_cast GetDeviceProcAddr(device, "vkCmdNextSubpass") @@ -2910,6 +3357,7 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.CmdPushConstants = auto_cast GetDeviceProcAddr(device, "vkCmdPushConstants") vtable.CmdPushConstants2 = auto_cast GetDeviceProcAddr(device, "vkCmdPushConstants2") vtable.CmdPushConstants2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdPushConstants2KHR") + vtable.CmdPushDataEXT = auto_cast GetDeviceProcAddr(device, "vkCmdPushDataEXT") vtable.CmdPushDescriptorSet = auto_cast GetDeviceProcAddr(device, "vkCmdPushDescriptorSet") vtable.CmdPushDescriptorSet2 = auto_cast GetDeviceProcAddr(device, "vkCmdPushDescriptorSet2") vtable.CmdPushDescriptorSet2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdPushDescriptorSet2KHR") @@ -2934,7 +3382,9 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.CmdSetColorBlendAdvancedEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetColorBlendAdvancedEXT") vtable.CmdSetColorBlendEnableEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetColorBlendEnableEXT") vtable.CmdSetColorBlendEquationEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetColorBlendEquationEXT") + vtable.CmdSetColorWriteEnableEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetColorWriteEnableEXT") vtable.CmdSetColorWriteMaskEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetColorWriteMaskEXT") + vtable.CmdSetComputeOccupancyPriorityNV = auto_cast GetDeviceProcAddr(device, "vkCmdSetComputeOccupancyPriorityNV") vtable.CmdSetConservativeRasterizationModeEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetConservativeRasterizationModeEXT") vtable.CmdSetCoverageModulationModeNV = auto_cast GetDeviceProcAddr(device, "vkCmdSetCoverageModulationModeNV") vtable.CmdSetCoverageModulationTableEnableNV = auto_cast GetDeviceProcAddr(device, "vkCmdSetCoverageModulationTableEnableNV") @@ -2968,6 +3418,7 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.CmdSetDiscardRectangleEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetDiscardRectangleEXT") vtable.CmdSetDiscardRectangleEnableEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetDiscardRectangleEnableEXT") vtable.CmdSetDiscardRectangleModeEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetDiscardRectangleModeEXT") + vtable.CmdSetDispatchParametersARM = auto_cast GetDeviceProcAddr(device, "vkCmdSetDispatchParametersARM") vtable.CmdSetEvent = auto_cast GetDeviceProcAddr(device, "vkCmdSetEvent") vtable.CmdSetEvent2 = auto_cast GetDeviceProcAddr(device, "vkCmdSetEvent2") vtable.CmdSetEvent2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdSetEvent2KHR") @@ -2993,6 +3444,7 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.CmdSetPolygonModeEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetPolygonModeEXT") vtable.CmdSetPrimitiveRestartEnable = auto_cast GetDeviceProcAddr(device, "vkCmdSetPrimitiveRestartEnable") vtable.CmdSetPrimitiveRestartEnableEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetPrimitiveRestartEnableEXT") + vtable.CmdSetPrimitiveRestartIndexEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetPrimitiveRestartIndexEXT") vtable.CmdSetPrimitiveTopology = auto_cast GetDeviceProcAddr(device, "vkCmdSetPrimitiveTopology") vtable.CmdSetPrimitiveTopologyEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetPrimitiveTopologyEXT") vtable.CmdSetProvokingVertexModeEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetProvokingVertexModeEXT") @@ -3035,6 +3487,7 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.CmdTraceRaysKHR = auto_cast GetDeviceProcAddr(device, "vkCmdTraceRaysKHR") vtable.CmdTraceRaysNV = auto_cast GetDeviceProcAddr(device, "vkCmdTraceRaysNV") vtable.CmdUpdateBuffer = auto_cast GetDeviceProcAddr(device, "vkCmdUpdateBuffer") + vtable.CmdUpdateMemoryKHR = auto_cast GetDeviceProcAddr(device, "vkCmdUpdateMemoryKHR") vtable.CmdUpdatePipelineIndirectBufferNV = auto_cast GetDeviceProcAddr(device, "vkCmdUpdatePipelineIndirectBufferNV") vtable.CmdWaitEvents = auto_cast GetDeviceProcAddr(device, "vkCmdWaitEvents") vtable.CmdWaitEvents2 = auto_cast GetDeviceProcAddr(device, "vkCmdWaitEvents2") @@ -3043,6 +3496,7 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.CmdWriteAccelerationStructuresPropertiesNV = auto_cast GetDeviceProcAddr(device, "vkCmdWriteAccelerationStructuresPropertiesNV") vtable.CmdWriteBufferMarker2AMD = auto_cast GetDeviceProcAddr(device, "vkCmdWriteBufferMarker2AMD") vtable.CmdWriteBufferMarkerAMD = auto_cast GetDeviceProcAddr(device, "vkCmdWriteBufferMarkerAMD") + vtable.CmdWriteMarkerToMemoryAMD = auto_cast GetDeviceProcAddr(device, "vkCmdWriteMarkerToMemoryAMD") vtable.CmdWriteMicromapsPropertiesEXT = auto_cast GetDeviceProcAddr(device, "vkCmdWriteMicromapsPropertiesEXT") vtable.CmdWriteTimestamp = auto_cast GetDeviceProcAddr(device, "vkCmdWriteTimestamp") vtable.CmdWriteTimestamp2 = auto_cast GetDeviceProcAddr(device, "vkCmdWriteTimestamp2") @@ -3061,6 +3515,7 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.CopyMemoryToMicromapEXT = auto_cast GetDeviceProcAddr(device, "vkCopyMemoryToMicromapEXT") vtable.CopyMicromapEXT = auto_cast GetDeviceProcAddr(device, "vkCopyMicromapEXT") vtable.CopyMicromapToMemoryEXT = auto_cast GetDeviceProcAddr(device, "vkCopyMicromapToMemoryEXT") + vtable.CreateAccelerationStructure2KHR = auto_cast GetDeviceProcAddr(device, "vkCreateAccelerationStructure2KHR") vtable.CreateAccelerationStructureKHR = auto_cast GetDeviceProcAddr(device, "vkCreateAccelerationStructureKHR") vtable.CreateAccelerationStructureNV = auto_cast GetDeviceProcAddr(device, "vkCreateAccelerationStructureNV") vtable.CreateBuffer = auto_cast GetDeviceProcAddr(device, "vkCreateBuffer") @@ -3071,6 +3526,8 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.CreateCuModuleNVX = auto_cast GetDeviceProcAddr(device, "vkCreateCuModuleNVX") vtable.CreateCudaFunctionNV = auto_cast GetDeviceProcAddr(device, "vkCreateCudaFunctionNV") vtable.CreateCudaModuleNV = auto_cast GetDeviceProcAddr(device, "vkCreateCudaModuleNV") + vtable.CreateDataGraphPipelineSessionARM = auto_cast GetDeviceProcAddr(device, "vkCreateDataGraphPipelineSessionARM") + vtable.CreateDataGraphPipelinesARM = auto_cast GetDeviceProcAddr(device, "vkCreateDataGraphPipelinesARM") vtable.CreateDeferredOperationKHR = auto_cast GetDeviceProcAddr(device, "vkCreateDeferredOperationKHR") vtable.CreateDescriptorPool = auto_cast GetDeviceProcAddr(device, "vkCreateDescriptorPool") vtable.CreateDescriptorSetLayout = auto_cast GetDeviceProcAddr(device, "vkCreateDescriptorSetLayout") @@ -3078,8 +3535,10 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.CreateDescriptorUpdateTemplateKHR = auto_cast GetDeviceProcAddr(device, "vkCreateDescriptorUpdateTemplateKHR") vtable.CreateEvent = auto_cast GetDeviceProcAddr(device, "vkCreateEvent") vtable.CreateExecutionGraphPipelinesAMDX = auto_cast GetDeviceProcAddr(device, "vkCreateExecutionGraphPipelinesAMDX") + vtable.CreateExternalComputeQueueNV = auto_cast GetDeviceProcAddr(device, "vkCreateExternalComputeQueueNV") vtable.CreateFence = auto_cast GetDeviceProcAddr(device, "vkCreateFence") vtable.CreateFramebuffer = auto_cast GetDeviceProcAddr(device, "vkCreateFramebuffer") + vtable.CreateGpaSessionAMD = auto_cast GetDeviceProcAddr(device, "vkCreateGpaSessionAMD") vtable.CreateGraphicsPipelines = auto_cast GetDeviceProcAddr(device, "vkCreateGraphicsPipelines") vtable.CreateImage = auto_cast GetDeviceProcAddr(device, "vkCreateImage") vtable.CreateImageView = auto_cast GetDeviceProcAddr(device, "vkCreateImageView") @@ -3103,10 +3562,13 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.CreateSamplerYcbcrConversion = auto_cast GetDeviceProcAddr(device, "vkCreateSamplerYcbcrConversion") vtable.CreateSamplerYcbcrConversionKHR = auto_cast GetDeviceProcAddr(device, "vkCreateSamplerYcbcrConversionKHR") vtable.CreateSemaphore = auto_cast GetDeviceProcAddr(device, "vkCreateSemaphore") + vtable.CreateShaderInstrumentationARM = auto_cast GetDeviceProcAddr(device, "vkCreateShaderInstrumentationARM") vtable.CreateShaderModule = auto_cast GetDeviceProcAddr(device, "vkCreateShaderModule") vtable.CreateShadersEXT = auto_cast GetDeviceProcAddr(device, "vkCreateShadersEXT") vtable.CreateSharedSwapchainsKHR = auto_cast GetDeviceProcAddr(device, "vkCreateSharedSwapchainsKHR") vtable.CreateSwapchainKHR = auto_cast GetDeviceProcAddr(device, "vkCreateSwapchainKHR") + vtable.CreateTensorARM = auto_cast GetDeviceProcAddr(device, "vkCreateTensorARM") + vtable.CreateTensorViewARM = auto_cast GetDeviceProcAddr(device, "vkCreateTensorViewARM") vtable.CreateValidationCacheEXT = auto_cast GetDeviceProcAddr(device, "vkCreateValidationCacheEXT") vtable.CreateVideoSessionKHR = auto_cast GetDeviceProcAddr(device, "vkCreateVideoSessionKHR") vtable.CreateVideoSessionParametersKHR = auto_cast GetDeviceProcAddr(device, "vkCreateVideoSessionParametersKHR") @@ -3122,6 +3584,7 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.DestroyCuModuleNVX = auto_cast GetDeviceProcAddr(device, "vkDestroyCuModuleNVX") vtable.DestroyCudaFunctionNV = auto_cast GetDeviceProcAddr(device, "vkDestroyCudaFunctionNV") vtable.DestroyCudaModuleNV = auto_cast GetDeviceProcAddr(device, "vkDestroyCudaModuleNV") + vtable.DestroyDataGraphPipelineSessionARM = auto_cast GetDeviceProcAddr(device, "vkDestroyDataGraphPipelineSessionARM") vtable.DestroyDeferredOperationKHR = auto_cast GetDeviceProcAddr(device, "vkDestroyDeferredOperationKHR") vtable.DestroyDescriptorPool = auto_cast GetDeviceProcAddr(device, "vkDestroyDescriptorPool") vtable.DestroyDescriptorSetLayout = auto_cast GetDeviceProcAddr(device, "vkDestroyDescriptorSetLayout") @@ -3129,8 +3592,10 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.DestroyDescriptorUpdateTemplateKHR = auto_cast GetDeviceProcAddr(device, "vkDestroyDescriptorUpdateTemplateKHR") vtable.DestroyDevice = auto_cast GetDeviceProcAddr(device, "vkDestroyDevice") vtable.DestroyEvent = auto_cast GetDeviceProcAddr(device, "vkDestroyEvent") + vtable.DestroyExternalComputeQueueNV = auto_cast GetDeviceProcAddr(device, "vkDestroyExternalComputeQueueNV") vtable.DestroyFence = auto_cast GetDeviceProcAddr(device, "vkDestroyFence") vtable.DestroyFramebuffer = auto_cast GetDeviceProcAddr(device, "vkDestroyFramebuffer") + vtable.DestroyGpaSessionAMD = auto_cast GetDeviceProcAddr(device, "vkDestroyGpaSessionAMD") vtable.DestroyImage = auto_cast GetDeviceProcAddr(device, "vkDestroyImage") vtable.DestroyImageView = auto_cast GetDeviceProcAddr(device, "vkDestroyImageView") vtable.DestroyIndirectCommandsLayoutEXT = auto_cast GetDeviceProcAddr(device, "vkDestroyIndirectCommandsLayoutEXT") @@ -3151,8 +3616,11 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.DestroySamplerYcbcrConversionKHR = auto_cast GetDeviceProcAddr(device, "vkDestroySamplerYcbcrConversionKHR") vtable.DestroySemaphore = auto_cast GetDeviceProcAddr(device, "vkDestroySemaphore") vtable.DestroyShaderEXT = auto_cast GetDeviceProcAddr(device, "vkDestroyShaderEXT") + vtable.DestroyShaderInstrumentationARM = auto_cast GetDeviceProcAddr(device, "vkDestroyShaderInstrumentationARM") vtable.DestroyShaderModule = auto_cast GetDeviceProcAddr(device, "vkDestroyShaderModule") vtable.DestroySwapchainKHR = auto_cast GetDeviceProcAddr(device, "vkDestroySwapchainKHR") + vtable.DestroyTensorARM = auto_cast GetDeviceProcAddr(device, "vkDestroyTensorARM") + vtable.DestroyTensorViewARM = auto_cast GetDeviceProcAddr(device, "vkDestroyTensorViewARM") vtable.DestroyValidationCacheEXT = auto_cast GetDeviceProcAddr(device, "vkDestroyValidationCacheEXT") vtable.DestroyVideoSessionKHR = auto_cast GetDeviceProcAddr(device, "vkDestroyVideoSessionKHR") vtable.DestroyVideoSessionParametersKHR = auto_cast GetDeviceProcAddr(device, "vkDestroyVideoSessionParametersKHR") @@ -3182,6 +3650,10 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.GetCalibratedTimestampsKHR = auto_cast GetDeviceProcAddr(device, "vkGetCalibratedTimestampsKHR") vtable.GetClusterAccelerationStructureBuildSizesNV = auto_cast GetDeviceProcAddr(device, "vkGetClusterAccelerationStructureBuildSizesNV") vtable.GetCudaModuleCacheNV = auto_cast GetDeviceProcAddr(device, "vkGetCudaModuleCacheNV") + vtable.GetDataGraphPipelineAvailablePropertiesARM = auto_cast GetDeviceProcAddr(device, "vkGetDataGraphPipelineAvailablePropertiesARM") + vtable.GetDataGraphPipelinePropertiesARM = auto_cast GetDeviceProcAddr(device, "vkGetDataGraphPipelinePropertiesARM") + vtable.GetDataGraphPipelineSessionBindPointRequirementsARM = auto_cast GetDeviceProcAddr(device, "vkGetDataGraphPipelineSessionBindPointRequirementsARM") + vtable.GetDataGraphPipelineSessionMemoryRequirementsARM = auto_cast GetDeviceProcAddr(device, "vkGetDataGraphPipelineSessionMemoryRequirementsARM") vtable.GetDeferredOperationMaxConcurrencyKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeferredOperationMaxConcurrencyKHR") vtable.GetDeferredOperationResultKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeferredOperationResultKHR") vtable.GetDescriptorEXT = auto_cast GetDeviceProcAddr(device, "vkGetDescriptorEXT") @@ -3194,7 +3666,10 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.GetDeviceAccelerationStructureCompatibilityKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeviceAccelerationStructureCompatibilityKHR") vtable.GetDeviceBufferMemoryRequirements = auto_cast GetDeviceProcAddr(device, "vkGetDeviceBufferMemoryRequirements") vtable.GetDeviceBufferMemoryRequirementsKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeviceBufferMemoryRequirementsKHR") + vtable.GetDeviceCombinedImageSamplerIndexNVX = auto_cast GetDeviceProcAddr(device, "vkGetDeviceCombinedImageSamplerIndexNVX") + vtable.GetDeviceFaultDebugInfoKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeviceFaultDebugInfoKHR") vtable.GetDeviceFaultInfoEXT = auto_cast GetDeviceProcAddr(device, "vkGetDeviceFaultInfoEXT") + vtable.GetDeviceFaultReportsKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeviceFaultReportsKHR") vtable.GetDeviceGroupPeerMemoryFeatures = auto_cast GetDeviceProcAddr(device, "vkGetDeviceGroupPeerMemoryFeatures") vtable.GetDeviceGroupPeerMemoryFeaturesKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeviceGroupPeerMemoryFeaturesKHR") vtable.GetDeviceGroupPresentCapabilitiesKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeviceGroupPresentCapabilitiesKHR") @@ -3214,6 +3689,7 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.GetDeviceQueue = auto_cast GetDeviceProcAddr(device, "vkGetDeviceQueue") vtable.GetDeviceQueue2 = auto_cast GetDeviceProcAddr(device, "vkGetDeviceQueue2") vtable.GetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI = auto_cast GetDeviceProcAddr(device, "vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI") + vtable.GetDeviceTensorMemoryRequirementsARM = auto_cast GetDeviceProcAddr(device, "vkGetDeviceTensorMemoryRequirementsARM") vtable.GetDynamicRenderingTilePropertiesQCOM = auto_cast GetDeviceProcAddr(device, "vkGetDynamicRenderingTilePropertiesQCOM") vtable.GetEncodedVideoSessionParametersKHR = auto_cast GetDeviceProcAddr(device, "vkGetEncodedVideoSessionParametersKHR") vtable.GetEventStatus = auto_cast GetDeviceProcAddr(device, "vkGetEventStatus") @@ -3225,10 +3701,14 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.GetFramebufferTilePropertiesQCOM = auto_cast GetDeviceProcAddr(device, "vkGetFramebufferTilePropertiesQCOM") vtable.GetGeneratedCommandsMemoryRequirementsEXT = auto_cast GetDeviceProcAddr(device, "vkGetGeneratedCommandsMemoryRequirementsEXT") vtable.GetGeneratedCommandsMemoryRequirementsNV = auto_cast GetDeviceProcAddr(device, "vkGetGeneratedCommandsMemoryRequirementsNV") + vtable.GetGpaDeviceClockInfoAMD = auto_cast GetDeviceProcAddr(device, "vkGetGpaDeviceClockInfoAMD") + vtable.GetGpaSessionResultsAMD = auto_cast GetDeviceProcAddr(device, "vkGetGpaSessionResultsAMD") + vtable.GetGpaSessionStatusAMD = auto_cast GetDeviceProcAddr(device, "vkGetGpaSessionStatusAMD") vtable.GetImageDrmFormatModifierPropertiesEXT = auto_cast GetDeviceProcAddr(device, "vkGetImageDrmFormatModifierPropertiesEXT") vtable.GetImageMemoryRequirements = auto_cast GetDeviceProcAddr(device, "vkGetImageMemoryRequirements") vtable.GetImageMemoryRequirements2 = auto_cast GetDeviceProcAddr(device, "vkGetImageMemoryRequirements2") vtable.GetImageMemoryRequirements2KHR = auto_cast GetDeviceProcAddr(device, "vkGetImageMemoryRequirements2KHR") + vtable.GetImageOpaqueCaptureDataEXT = auto_cast GetDeviceProcAddr(device, "vkGetImageOpaqueCaptureDataEXT") vtable.GetImageOpaqueCaptureDescriptorDataEXT = auto_cast GetDeviceProcAddr(device, "vkGetImageOpaqueCaptureDescriptorDataEXT") vtable.GetImageSparseMemoryRequirements = auto_cast GetDeviceProcAddr(device, "vkGetImageSparseMemoryRequirements") vtable.GetImageSparseMemoryRequirements2 = auto_cast GetDeviceProcAddr(device, "vkGetImageSparseMemoryRequirements2") @@ -3253,6 +3733,7 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.GetMemoryWin32HandlePropertiesKHR = auto_cast GetDeviceProcAddr(device, "vkGetMemoryWin32HandlePropertiesKHR") vtable.GetMicromapBuildSizesEXT = auto_cast GetDeviceProcAddr(device, "vkGetMicromapBuildSizesEXT") vtable.GetPartitionedAccelerationStructuresBuildSizesNV = auto_cast GetDeviceProcAddr(device, "vkGetPartitionedAccelerationStructuresBuildSizesNV") + vtable.GetPastPresentationTimingEXT = auto_cast GetDeviceProcAddr(device, "vkGetPastPresentationTimingEXT") vtable.GetPastPresentationTimingGOOGLE = auto_cast GetDeviceProcAddr(device, "vkGetPastPresentationTimingGOOGLE") vtable.GetPerformanceParameterINTEL = auto_cast GetDeviceProcAddr(device, "vkGetPerformanceParameterINTEL") vtable.GetPipelineBinaryDataKHR = auto_cast GetDeviceProcAddr(device, "vkGetPipelineBinaryDataKHR") @@ -3284,11 +3765,18 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.GetSemaphoreWin32HandleKHR = auto_cast GetDeviceProcAddr(device, "vkGetSemaphoreWin32HandleKHR") vtable.GetShaderBinaryDataEXT = auto_cast GetDeviceProcAddr(device, "vkGetShaderBinaryDataEXT") vtable.GetShaderInfoAMD = auto_cast GetDeviceProcAddr(device, "vkGetShaderInfoAMD") + vtable.GetShaderInstrumentationValuesARM = auto_cast GetDeviceProcAddr(device, "vkGetShaderInstrumentationValuesARM") vtable.GetShaderModuleCreateInfoIdentifierEXT = auto_cast GetDeviceProcAddr(device, "vkGetShaderModuleCreateInfoIdentifierEXT") vtable.GetShaderModuleIdentifierEXT = auto_cast GetDeviceProcAddr(device, "vkGetShaderModuleIdentifierEXT") vtable.GetSwapchainCounterEXT = auto_cast GetDeviceProcAddr(device, "vkGetSwapchainCounterEXT") vtable.GetSwapchainImagesKHR = auto_cast GetDeviceProcAddr(device, "vkGetSwapchainImagesKHR") vtable.GetSwapchainStatusKHR = auto_cast GetDeviceProcAddr(device, "vkGetSwapchainStatusKHR") + vtable.GetSwapchainTimeDomainPropertiesEXT = auto_cast GetDeviceProcAddr(device, "vkGetSwapchainTimeDomainPropertiesEXT") + vtable.GetSwapchainTimingPropertiesEXT = auto_cast GetDeviceProcAddr(device, "vkGetSwapchainTimingPropertiesEXT") + vtable.GetTensorMemoryRequirementsARM = auto_cast GetDeviceProcAddr(device, "vkGetTensorMemoryRequirementsARM") + vtable.GetTensorOpaqueCaptureDataARM = auto_cast GetDeviceProcAddr(device, "vkGetTensorOpaqueCaptureDataARM") + vtable.GetTensorOpaqueCaptureDescriptorDataARM = auto_cast GetDeviceProcAddr(device, "vkGetTensorOpaqueCaptureDescriptorDataARM") + vtable.GetTensorViewOpaqueCaptureDescriptorDataARM = auto_cast GetDeviceProcAddr(device, "vkGetTensorViewOpaqueCaptureDescriptorDataARM") vtable.GetValidationCacheDataEXT = auto_cast GetDeviceProcAddr(device, "vkGetValidationCacheDataEXT") vtable.GetVideoSessionMemoryRequirementsKHR = auto_cast GetDeviceProcAddr(device, "vkGetVideoSessionMemoryRequirementsKHR") vtable.ImportFenceFdKHR = auto_cast GetDeviceProcAddr(device, "vkImportFenceFdKHR") @@ -3314,6 +3802,7 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.QueueSubmit2 = auto_cast GetDeviceProcAddr(device, "vkQueueSubmit2") vtable.QueueSubmit2KHR = auto_cast GetDeviceProcAddr(device, "vkQueueSubmit2KHR") vtable.QueueWaitIdle = auto_cast GetDeviceProcAddr(device, "vkQueueWaitIdle") + vtable.RegisterCustomBorderColorEXT = auto_cast GetDeviceProcAddr(device, "vkRegisterCustomBorderColorEXT") vtable.RegisterDeviceEventEXT = auto_cast GetDeviceProcAddr(device, "vkRegisterDeviceEventEXT") vtable.RegisterDisplayEventEXT = auto_cast GetDeviceProcAddr(device, "vkRegisterDisplayEventEXT") vtable.ReleaseCapturedPipelineDataKHR = auto_cast GetDeviceProcAddr(device, "vkReleaseCapturedPipelineDataKHR") @@ -3321,23 +3810,27 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.ReleasePerformanceConfigurationINTEL = auto_cast GetDeviceProcAddr(device, "vkReleasePerformanceConfigurationINTEL") vtable.ReleaseProfilingLockKHR = auto_cast GetDeviceProcAddr(device, "vkReleaseProfilingLockKHR") vtable.ReleaseSwapchainImagesEXT = auto_cast GetDeviceProcAddr(device, "vkReleaseSwapchainImagesEXT") + vtable.ReleaseSwapchainImagesKHR = auto_cast GetDeviceProcAddr(device, "vkReleaseSwapchainImagesKHR") vtable.ResetCommandBuffer = auto_cast GetDeviceProcAddr(device, "vkResetCommandBuffer") vtable.ResetCommandPool = auto_cast GetDeviceProcAddr(device, "vkResetCommandPool") vtable.ResetDescriptorPool = auto_cast GetDeviceProcAddr(device, "vkResetDescriptorPool") vtable.ResetEvent = auto_cast GetDeviceProcAddr(device, "vkResetEvent") vtable.ResetFences = auto_cast GetDeviceProcAddr(device, "vkResetFences") + vtable.ResetGpaSessionAMD = auto_cast GetDeviceProcAddr(device, "vkResetGpaSessionAMD") vtable.ResetQueryPool = auto_cast GetDeviceProcAddr(device, "vkResetQueryPool") vtable.ResetQueryPoolEXT = auto_cast GetDeviceProcAddr(device, "vkResetQueryPoolEXT") vtable.SetDebugUtilsObjectNameEXT = auto_cast GetDeviceProcAddr(device, "vkSetDebugUtilsObjectNameEXT") vtable.SetDebugUtilsObjectTagEXT = auto_cast GetDeviceProcAddr(device, "vkSetDebugUtilsObjectTagEXT") vtable.SetDeviceMemoryPriorityEXT = auto_cast GetDeviceProcAddr(device, "vkSetDeviceMemoryPriorityEXT") vtable.SetEvent = auto_cast GetDeviceProcAddr(device, "vkSetEvent") + vtable.SetGpaDeviceClockModeAMD = auto_cast GetDeviceProcAddr(device, "vkSetGpaDeviceClockModeAMD") vtable.SetHdrMetadataEXT = auto_cast GetDeviceProcAddr(device, "vkSetHdrMetadataEXT") vtable.SetLatencyMarkerNV = auto_cast GetDeviceProcAddr(device, "vkSetLatencyMarkerNV") vtable.SetLatencySleepModeNV = auto_cast GetDeviceProcAddr(device, "vkSetLatencySleepModeNV") vtable.SetLocalDimmingAMD = auto_cast GetDeviceProcAddr(device, "vkSetLocalDimmingAMD") vtable.SetPrivateData = auto_cast GetDeviceProcAddr(device, "vkSetPrivateData") vtable.SetPrivateDataEXT = auto_cast GetDeviceProcAddr(device, "vkSetPrivateDataEXT") + vtable.SetSwapchainPresentTimingQueueSizeEXT = auto_cast GetDeviceProcAddr(device, "vkSetSwapchainPresentTimingQueueSizeEXT") vtable.SignalSemaphore = auto_cast GetDeviceProcAddr(device, "vkSignalSemaphore") vtable.SignalSemaphoreKHR = auto_cast GetDeviceProcAddr(device, "vkSignalSemaphoreKHR") vtable.TransitionImageLayout = auto_cast GetDeviceProcAddr(device, "vkTransitionImageLayout") @@ -3348,6 +3841,7 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.UnmapMemory = auto_cast GetDeviceProcAddr(device, "vkUnmapMemory") vtable.UnmapMemory2 = auto_cast GetDeviceProcAddr(device, "vkUnmapMemory2") vtable.UnmapMemory2KHR = auto_cast GetDeviceProcAddr(device, "vkUnmapMemory2KHR") + vtable.UnregisterCustomBorderColorEXT = auto_cast GetDeviceProcAddr(device, "vkUnregisterCustomBorderColorEXT") vtable.UpdateDescriptorSetWithTemplate = auto_cast GetDeviceProcAddr(device, "vkUpdateDescriptorSetWithTemplate") vtable.UpdateDescriptorSetWithTemplateKHR = auto_cast GetDeviceProcAddr(device, "vkUpdateDescriptorSetWithTemplateKHR") vtable.UpdateDescriptorSets = auto_cast GetDeviceProcAddr(device, "vkUpdateDescriptorSets") @@ -3355,11 +3849,14 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.UpdateIndirectExecutionSetShaderEXT = auto_cast GetDeviceProcAddr(device, "vkUpdateIndirectExecutionSetShaderEXT") vtable.UpdateVideoSessionParametersKHR = auto_cast GetDeviceProcAddr(device, "vkUpdateVideoSessionParametersKHR") vtable.WaitForFences = auto_cast GetDeviceProcAddr(device, "vkWaitForFences") + vtable.WaitForPresent2KHR = auto_cast GetDeviceProcAddr(device, "vkWaitForPresent2KHR") vtable.WaitForPresentKHR = auto_cast GetDeviceProcAddr(device, "vkWaitForPresentKHR") vtable.WaitSemaphores = auto_cast GetDeviceProcAddr(device, "vkWaitSemaphores") vtable.WaitSemaphoresKHR = auto_cast GetDeviceProcAddr(device, "vkWaitSemaphoresKHR") vtable.WriteAccelerationStructuresPropertiesKHR = auto_cast GetDeviceProcAddr(device, "vkWriteAccelerationStructuresPropertiesKHR") vtable.WriteMicromapsPropertiesEXT = auto_cast GetDeviceProcAddr(device, "vkWriteMicromapsPropertiesEXT") + vtable.WriteResourceDescriptorsEXT = auto_cast GetDeviceProcAddr(device, "vkWriteResourceDescriptorsEXT") + vtable.WriteSamplerDescriptorsEXT = auto_cast GetDeviceProcAddr(device, "vkWriteSamplerDescriptorsEXT") } load_proc_addresses_device :: proc(device: Device) { @@ -3377,15 +3874,23 @@ load_proc_addresses_device :: proc(device: Device) { BindBufferMemory = auto_cast GetDeviceProcAddr(device, "vkBindBufferMemory") BindBufferMemory2 = auto_cast GetDeviceProcAddr(device, "vkBindBufferMemory2") BindBufferMemory2KHR = auto_cast GetDeviceProcAddr(device, "vkBindBufferMemory2KHR") + BindDataGraphPipelineSessionMemoryARM = auto_cast GetDeviceProcAddr(device, "vkBindDataGraphPipelineSessionMemoryARM") BindImageMemory = auto_cast GetDeviceProcAddr(device, "vkBindImageMemory") BindImageMemory2 = auto_cast GetDeviceProcAddr(device, "vkBindImageMemory2") BindImageMemory2KHR = auto_cast GetDeviceProcAddr(device, "vkBindImageMemory2KHR") BindOpticalFlowSessionImageNV = auto_cast GetDeviceProcAddr(device, "vkBindOpticalFlowSessionImageNV") + BindTensorMemoryARM = auto_cast GetDeviceProcAddr(device, "vkBindTensorMemoryARM") BindVideoSessionMemoryKHR = auto_cast GetDeviceProcAddr(device, "vkBindVideoSessionMemoryKHR") BuildAccelerationStructuresKHR = auto_cast GetDeviceProcAddr(device, "vkBuildAccelerationStructuresKHR") BuildMicromapsEXT = auto_cast GetDeviceProcAddr(device, "vkBuildMicromapsEXT") + ClearShaderInstrumentationMetricsARM = auto_cast GetDeviceProcAddr(device, "vkClearShaderInstrumentationMetricsARM") + CmdBeginConditionalRendering2EXT = auto_cast GetDeviceProcAddr(device, "vkCmdBeginConditionalRendering2EXT") CmdBeginConditionalRenderingEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBeginConditionalRenderingEXT") + CmdBeginCustomResolveEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBeginCustomResolveEXT") CmdBeginDebugUtilsLabelEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBeginDebugUtilsLabelEXT") + CmdBeginGpaSampleAMD = auto_cast GetDeviceProcAddr(device, "vkCmdBeginGpaSampleAMD") + CmdBeginGpaSessionAMD = auto_cast GetDeviceProcAddr(device, "vkCmdBeginGpaSessionAMD") + CmdBeginPerTileExecutionQCOM = auto_cast GetDeviceProcAddr(device, "vkCmdBeginPerTileExecutionQCOM") CmdBeginQuery = auto_cast GetDeviceProcAddr(device, "vkCmdBeginQuery") CmdBeginQueryIndexedEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBeginQueryIndexedEXT") CmdBeginRenderPass = auto_cast GetDeviceProcAddr(device, "vkCmdBeginRenderPass") @@ -3393,6 +3898,8 @@ load_proc_addresses_device :: proc(device: Device) { CmdBeginRenderPass2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdBeginRenderPass2KHR") CmdBeginRendering = auto_cast GetDeviceProcAddr(device, "vkCmdBeginRendering") CmdBeginRenderingKHR = auto_cast GetDeviceProcAddr(device, "vkCmdBeginRenderingKHR") + CmdBeginShaderInstrumentationARM = auto_cast GetDeviceProcAddr(device, "vkCmdBeginShaderInstrumentationARM") + CmdBeginTransformFeedback2EXT = auto_cast GetDeviceProcAddr(device, "vkCmdBeginTransformFeedback2EXT") CmdBeginTransformFeedbackEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBeginTransformFeedbackEXT") CmdBeginVideoCodingKHR = auto_cast GetDeviceProcAddr(device, "vkCmdBeginVideoCodingKHR") CmdBindDescriptorBufferEmbeddedSamplers2EXT = auto_cast GetDeviceProcAddr(device, "vkCmdBindDescriptorBufferEmbeddedSamplers2EXT") @@ -3404,15 +3911,21 @@ load_proc_addresses_device :: proc(device: Device) { CmdBindIndexBuffer = auto_cast GetDeviceProcAddr(device, "vkCmdBindIndexBuffer") CmdBindIndexBuffer2 = auto_cast GetDeviceProcAddr(device, "vkCmdBindIndexBuffer2") CmdBindIndexBuffer2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdBindIndexBuffer2KHR") + CmdBindIndexBuffer3KHR = auto_cast GetDeviceProcAddr(device, "vkCmdBindIndexBuffer3KHR") CmdBindInvocationMaskHUAWEI = auto_cast GetDeviceProcAddr(device, "vkCmdBindInvocationMaskHUAWEI") CmdBindPipeline = auto_cast GetDeviceProcAddr(device, "vkCmdBindPipeline") CmdBindPipelineShaderGroupNV = auto_cast GetDeviceProcAddr(device, "vkCmdBindPipelineShaderGroupNV") + CmdBindResourceHeapEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBindResourceHeapEXT") + CmdBindSamplerHeapEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBindSamplerHeapEXT") CmdBindShadersEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBindShadersEXT") CmdBindShadingRateImageNV = auto_cast GetDeviceProcAddr(device, "vkCmdBindShadingRateImageNV") + CmdBindTileMemoryQCOM = auto_cast GetDeviceProcAddr(device, "vkCmdBindTileMemoryQCOM") + CmdBindTransformFeedbackBuffers2EXT = auto_cast GetDeviceProcAddr(device, "vkCmdBindTransformFeedbackBuffers2EXT") CmdBindTransformFeedbackBuffersEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBindTransformFeedbackBuffersEXT") CmdBindVertexBuffers = auto_cast GetDeviceProcAddr(device, "vkCmdBindVertexBuffers") CmdBindVertexBuffers2 = auto_cast GetDeviceProcAddr(device, "vkCmdBindVertexBuffers2") CmdBindVertexBuffers2EXT = auto_cast GetDeviceProcAddr(device, "vkCmdBindVertexBuffers2EXT") + CmdBindVertexBuffers3KHR = auto_cast GetDeviceProcAddr(device, "vkCmdBindVertexBuffers3KHR") CmdBlitImage = auto_cast GetDeviceProcAddr(device, "vkCmdBlitImage") CmdBlitImage2 = auto_cast GetDeviceProcAddr(device, "vkCmdBlitImage2") CmdBlitImage2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdBlitImage2KHR") @@ -3436,48 +3949,68 @@ load_proc_addresses_device :: proc(device: Device) { CmdCopyBufferToImage = auto_cast GetDeviceProcAddr(device, "vkCmdCopyBufferToImage") CmdCopyBufferToImage2 = auto_cast GetDeviceProcAddr(device, "vkCmdCopyBufferToImage2") CmdCopyBufferToImage2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyBufferToImage2KHR") + CmdCopyGpaSessionResultsAMD = auto_cast GetDeviceProcAddr(device, "vkCmdCopyGpaSessionResultsAMD") CmdCopyImage = auto_cast GetDeviceProcAddr(device, "vkCmdCopyImage") CmdCopyImage2 = auto_cast GetDeviceProcAddr(device, "vkCmdCopyImage2") CmdCopyImage2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyImage2KHR") CmdCopyImageToBuffer = auto_cast GetDeviceProcAddr(device, "vkCmdCopyImageToBuffer") CmdCopyImageToBuffer2 = auto_cast GetDeviceProcAddr(device, "vkCmdCopyImageToBuffer2") CmdCopyImageToBuffer2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyImageToBuffer2KHR") + CmdCopyImageToMemoryKHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyImageToMemoryKHR") + CmdCopyMemoryIndirectKHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyMemoryIndirectKHR") CmdCopyMemoryIndirectNV = auto_cast GetDeviceProcAddr(device, "vkCmdCopyMemoryIndirectNV") + CmdCopyMemoryKHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyMemoryKHR") CmdCopyMemoryToAccelerationStructureKHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyMemoryToAccelerationStructureKHR") + CmdCopyMemoryToImageIndirectKHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyMemoryToImageIndirectKHR") CmdCopyMemoryToImageIndirectNV = auto_cast GetDeviceProcAddr(device, "vkCmdCopyMemoryToImageIndirectNV") + CmdCopyMemoryToImageKHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyMemoryToImageKHR") CmdCopyMemoryToMicromapEXT = auto_cast GetDeviceProcAddr(device, "vkCmdCopyMemoryToMicromapEXT") CmdCopyMicromapEXT = auto_cast GetDeviceProcAddr(device, "vkCmdCopyMicromapEXT") CmdCopyMicromapToMemoryEXT = auto_cast GetDeviceProcAddr(device, "vkCmdCopyMicromapToMemoryEXT") CmdCopyQueryPoolResults = auto_cast GetDeviceProcAddr(device, "vkCmdCopyQueryPoolResults") + CmdCopyQueryPoolResultsToMemoryKHR = auto_cast GetDeviceProcAddr(device, "vkCmdCopyQueryPoolResultsToMemoryKHR") + CmdCopyTensorARM = auto_cast GetDeviceProcAddr(device, "vkCmdCopyTensorARM") CmdCuLaunchKernelNVX = auto_cast GetDeviceProcAddr(device, "vkCmdCuLaunchKernelNVX") CmdCudaLaunchKernelNV = auto_cast GetDeviceProcAddr(device, "vkCmdCudaLaunchKernelNV") CmdDebugMarkerBeginEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDebugMarkerBeginEXT") CmdDebugMarkerEndEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDebugMarkerEndEXT") CmdDebugMarkerInsertEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDebugMarkerInsertEXT") CmdDecodeVideoKHR = auto_cast GetDeviceProcAddr(device, "vkCmdDecodeVideoKHR") + CmdDecompressMemoryEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDecompressMemoryEXT") + CmdDecompressMemoryIndirectCountEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDecompressMemoryIndirectCountEXT") CmdDecompressMemoryIndirectCountNV = auto_cast GetDeviceProcAddr(device, "vkCmdDecompressMemoryIndirectCountNV") CmdDecompressMemoryNV = auto_cast GetDeviceProcAddr(device, "vkCmdDecompressMemoryNV") CmdDispatch = auto_cast GetDeviceProcAddr(device, "vkCmdDispatch") CmdDispatchBase = auto_cast GetDeviceProcAddr(device, "vkCmdDispatchBase") CmdDispatchBaseKHR = auto_cast GetDeviceProcAddr(device, "vkCmdDispatchBaseKHR") + CmdDispatchDataGraphARM = auto_cast GetDeviceProcAddr(device, "vkCmdDispatchDataGraphARM") CmdDispatchGraphAMDX = auto_cast GetDeviceProcAddr(device, "vkCmdDispatchGraphAMDX") CmdDispatchGraphIndirectAMDX = auto_cast GetDeviceProcAddr(device, "vkCmdDispatchGraphIndirectAMDX") CmdDispatchGraphIndirectCountAMDX = auto_cast GetDeviceProcAddr(device, "vkCmdDispatchGraphIndirectCountAMDX") CmdDispatchIndirect = auto_cast GetDeviceProcAddr(device, "vkCmdDispatchIndirect") + CmdDispatchIndirect2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdDispatchIndirect2KHR") + CmdDispatchTileQCOM = auto_cast GetDeviceProcAddr(device, "vkCmdDispatchTileQCOM") CmdDraw = auto_cast GetDeviceProcAddr(device, "vkCmdDraw") CmdDrawClusterHUAWEI = auto_cast GetDeviceProcAddr(device, "vkCmdDrawClusterHUAWEI") CmdDrawClusterIndirectHUAWEI = auto_cast GetDeviceProcAddr(device, "vkCmdDrawClusterIndirectHUAWEI") CmdDrawIndexed = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndexed") CmdDrawIndexedIndirect = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndexedIndirect") + CmdDrawIndexedIndirect2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndexedIndirect2KHR") CmdDrawIndexedIndirectCount = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndexedIndirectCount") + CmdDrawIndexedIndirectCount2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndexedIndirectCount2KHR") CmdDrawIndexedIndirectCountAMD = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndexedIndirectCountAMD") CmdDrawIndexedIndirectCountKHR = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndexedIndirectCountKHR") CmdDrawIndirect = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndirect") + CmdDrawIndirect2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndirect2KHR") + CmdDrawIndirectByteCount2EXT = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndirectByteCount2EXT") CmdDrawIndirectByteCountEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndirectByteCountEXT") CmdDrawIndirectCount = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndirectCount") + CmdDrawIndirectCount2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndirectCount2KHR") CmdDrawIndirectCountAMD = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndirectCountAMD") CmdDrawIndirectCountKHR = auto_cast GetDeviceProcAddr(device, "vkCmdDrawIndirectCountKHR") CmdDrawMeshTasksEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDrawMeshTasksEXT") + CmdDrawMeshTasksIndirect2EXT = auto_cast GetDeviceProcAddr(device, "vkCmdDrawMeshTasksIndirect2EXT") + CmdDrawMeshTasksIndirectCount2EXT = auto_cast GetDeviceProcAddr(device, "vkCmdDrawMeshTasksIndirectCount2EXT") CmdDrawMeshTasksIndirectCountEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDrawMeshTasksIndirectCountEXT") CmdDrawMeshTasksIndirectCountNV = auto_cast GetDeviceProcAddr(device, "vkCmdDrawMeshTasksIndirectCountNV") CmdDrawMeshTasksIndirectEXT = auto_cast GetDeviceProcAddr(device, "vkCmdDrawMeshTasksIndirectEXT") @@ -3488,19 +4021,27 @@ load_proc_addresses_device :: proc(device: Device) { CmdEncodeVideoKHR = auto_cast GetDeviceProcAddr(device, "vkCmdEncodeVideoKHR") CmdEndConditionalRenderingEXT = auto_cast GetDeviceProcAddr(device, "vkCmdEndConditionalRenderingEXT") CmdEndDebugUtilsLabelEXT = auto_cast GetDeviceProcAddr(device, "vkCmdEndDebugUtilsLabelEXT") + CmdEndGpaSampleAMD = auto_cast GetDeviceProcAddr(device, "vkCmdEndGpaSampleAMD") + CmdEndGpaSessionAMD = auto_cast GetDeviceProcAddr(device, "vkCmdEndGpaSessionAMD") + CmdEndPerTileExecutionQCOM = auto_cast GetDeviceProcAddr(device, "vkCmdEndPerTileExecutionQCOM") CmdEndQuery = auto_cast GetDeviceProcAddr(device, "vkCmdEndQuery") CmdEndQueryIndexedEXT = auto_cast GetDeviceProcAddr(device, "vkCmdEndQueryIndexedEXT") CmdEndRenderPass = auto_cast GetDeviceProcAddr(device, "vkCmdEndRenderPass") CmdEndRenderPass2 = auto_cast GetDeviceProcAddr(device, "vkCmdEndRenderPass2") CmdEndRenderPass2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdEndRenderPass2KHR") CmdEndRendering = auto_cast GetDeviceProcAddr(device, "vkCmdEndRendering") + CmdEndRendering2EXT = auto_cast GetDeviceProcAddr(device, "vkCmdEndRendering2EXT") + CmdEndRendering2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdEndRendering2KHR") CmdEndRenderingKHR = auto_cast GetDeviceProcAddr(device, "vkCmdEndRenderingKHR") + CmdEndShaderInstrumentationARM = auto_cast GetDeviceProcAddr(device, "vkCmdEndShaderInstrumentationARM") + CmdEndTransformFeedback2EXT = auto_cast GetDeviceProcAddr(device, "vkCmdEndTransformFeedback2EXT") CmdEndTransformFeedbackEXT = auto_cast GetDeviceProcAddr(device, "vkCmdEndTransformFeedbackEXT") CmdEndVideoCodingKHR = auto_cast GetDeviceProcAddr(device, "vkCmdEndVideoCodingKHR") CmdExecuteCommands = auto_cast GetDeviceProcAddr(device, "vkCmdExecuteCommands") CmdExecuteGeneratedCommandsEXT = auto_cast GetDeviceProcAddr(device, "vkCmdExecuteGeneratedCommandsEXT") CmdExecuteGeneratedCommandsNV = auto_cast GetDeviceProcAddr(device, "vkCmdExecuteGeneratedCommandsNV") CmdFillBuffer = auto_cast GetDeviceProcAddr(device, "vkCmdFillBuffer") + CmdFillMemoryKHR = auto_cast GetDeviceProcAddr(device, "vkCmdFillMemoryKHR") CmdInitializeGraphScratchMemoryAMDX = auto_cast GetDeviceProcAddr(device, "vkCmdInitializeGraphScratchMemoryAMDX") CmdInsertDebugUtilsLabelEXT = auto_cast GetDeviceProcAddr(device, "vkCmdInsertDebugUtilsLabelEXT") CmdNextSubpass = auto_cast GetDeviceProcAddr(device, "vkCmdNextSubpass") @@ -3515,6 +4056,7 @@ load_proc_addresses_device :: proc(device: Device) { CmdPushConstants = auto_cast GetDeviceProcAddr(device, "vkCmdPushConstants") CmdPushConstants2 = auto_cast GetDeviceProcAddr(device, "vkCmdPushConstants2") CmdPushConstants2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdPushConstants2KHR") + CmdPushDataEXT = auto_cast GetDeviceProcAddr(device, "vkCmdPushDataEXT") CmdPushDescriptorSet = auto_cast GetDeviceProcAddr(device, "vkCmdPushDescriptorSet") CmdPushDescriptorSet2 = auto_cast GetDeviceProcAddr(device, "vkCmdPushDescriptorSet2") CmdPushDescriptorSet2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdPushDescriptorSet2KHR") @@ -3539,7 +4081,9 @@ load_proc_addresses_device :: proc(device: Device) { CmdSetColorBlendAdvancedEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetColorBlendAdvancedEXT") CmdSetColorBlendEnableEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetColorBlendEnableEXT") CmdSetColorBlendEquationEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetColorBlendEquationEXT") + CmdSetColorWriteEnableEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetColorWriteEnableEXT") CmdSetColorWriteMaskEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetColorWriteMaskEXT") + CmdSetComputeOccupancyPriorityNV = auto_cast GetDeviceProcAddr(device, "vkCmdSetComputeOccupancyPriorityNV") CmdSetConservativeRasterizationModeEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetConservativeRasterizationModeEXT") CmdSetCoverageModulationModeNV = auto_cast GetDeviceProcAddr(device, "vkCmdSetCoverageModulationModeNV") CmdSetCoverageModulationTableEnableNV = auto_cast GetDeviceProcAddr(device, "vkCmdSetCoverageModulationTableEnableNV") @@ -3573,6 +4117,7 @@ load_proc_addresses_device :: proc(device: Device) { CmdSetDiscardRectangleEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetDiscardRectangleEXT") CmdSetDiscardRectangleEnableEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetDiscardRectangleEnableEXT") CmdSetDiscardRectangleModeEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetDiscardRectangleModeEXT") + CmdSetDispatchParametersARM = auto_cast GetDeviceProcAddr(device, "vkCmdSetDispatchParametersARM") CmdSetEvent = auto_cast GetDeviceProcAddr(device, "vkCmdSetEvent") CmdSetEvent2 = auto_cast GetDeviceProcAddr(device, "vkCmdSetEvent2") CmdSetEvent2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdSetEvent2KHR") @@ -3598,6 +4143,7 @@ load_proc_addresses_device :: proc(device: Device) { CmdSetPolygonModeEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetPolygonModeEXT") CmdSetPrimitiveRestartEnable = auto_cast GetDeviceProcAddr(device, "vkCmdSetPrimitiveRestartEnable") CmdSetPrimitiveRestartEnableEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetPrimitiveRestartEnableEXT") + CmdSetPrimitiveRestartIndexEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetPrimitiveRestartIndexEXT") CmdSetPrimitiveTopology = auto_cast GetDeviceProcAddr(device, "vkCmdSetPrimitiveTopology") CmdSetPrimitiveTopologyEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetPrimitiveTopologyEXT") CmdSetProvokingVertexModeEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetProvokingVertexModeEXT") @@ -3640,6 +4186,7 @@ load_proc_addresses_device :: proc(device: Device) { CmdTraceRaysKHR = auto_cast GetDeviceProcAddr(device, "vkCmdTraceRaysKHR") CmdTraceRaysNV = auto_cast GetDeviceProcAddr(device, "vkCmdTraceRaysNV") CmdUpdateBuffer = auto_cast GetDeviceProcAddr(device, "vkCmdUpdateBuffer") + CmdUpdateMemoryKHR = auto_cast GetDeviceProcAddr(device, "vkCmdUpdateMemoryKHR") CmdUpdatePipelineIndirectBufferNV = auto_cast GetDeviceProcAddr(device, "vkCmdUpdatePipelineIndirectBufferNV") CmdWaitEvents = auto_cast GetDeviceProcAddr(device, "vkCmdWaitEvents") CmdWaitEvents2 = auto_cast GetDeviceProcAddr(device, "vkCmdWaitEvents2") @@ -3648,6 +4195,7 @@ load_proc_addresses_device :: proc(device: Device) { CmdWriteAccelerationStructuresPropertiesNV = auto_cast GetDeviceProcAddr(device, "vkCmdWriteAccelerationStructuresPropertiesNV") CmdWriteBufferMarker2AMD = auto_cast GetDeviceProcAddr(device, "vkCmdWriteBufferMarker2AMD") CmdWriteBufferMarkerAMD = auto_cast GetDeviceProcAddr(device, "vkCmdWriteBufferMarkerAMD") + CmdWriteMarkerToMemoryAMD = auto_cast GetDeviceProcAddr(device, "vkCmdWriteMarkerToMemoryAMD") CmdWriteMicromapsPropertiesEXT = auto_cast GetDeviceProcAddr(device, "vkCmdWriteMicromapsPropertiesEXT") CmdWriteTimestamp = auto_cast GetDeviceProcAddr(device, "vkCmdWriteTimestamp") CmdWriteTimestamp2 = auto_cast GetDeviceProcAddr(device, "vkCmdWriteTimestamp2") @@ -3666,6 +4214,7 @@ load_proc_addresses_device :: proc(device: Device) { CopyMemoryToMicromapEXT = auto_cast GetDeviceProcAddr(device, "vkCopyMemoryToMicromapEXT") CopyMicromapEXT = auto_cast GetDeviceProcAddr(device, "vkCopyMicromapEXT") CopyMicromapToMemoryEXT = auto_cast GetDeviceProcAddr(device, "vkCopyMicromapToMemoryEXT") + CreateAccelerationStructure2KHR = auto_cast GetDeviceProcAddr(device, "vkCreateAccelerationStructure2KHR") CreateAccelerationStructureKHR = auto_cast GetDeviceProcAddr(device, "vkCreateAccelerationStructureKHR") CreateAccelerationStructureNV = auto_cast GetDeviceProcAddr(device, "vkCreateAccelerationStructureNV") CreateBuffer = auto_cast GetDeviceProcAddr(device, "vkCreateBuffer") @@ -3676,6 +4225,8 @@ load_proc_addresses_device :: proc(device: Device) { CreateCuModuleNVX = auto_cast GetDeviceProcAddr(device, "vkCreateCuModuleNVX") CreateCudaFunctionNV = auto_cast GetDeviceProcAddr(device, "vkCreateCudaFunctionNV") CreateCudaModuleNV = auto_cast GetDeviceProcAddr(device, "vkCreateCudaModuleNV") + CreateDataGraphPipelineSessionARM = auto_cast GetDeviceProcAddr(device, "vkCreateDataGraphPipelineSessionARM") + CreateDataGraphPipelinesARM = auto_cast GetDeviceProcAddr(device, "vkCreateDataGraphPipelinesARM") CreateDeferredOperationKHR = auto_cast GetDeviceProcAddr(device, "vkCreateDeferredOperationKHR") CreateDescriptorPool = auto_cast GetDeviceProcAddr(device, "vkCreateDescriptorPool") CreateDescriptorSetLayout = auto_cast GetDeviceProcAddr(device, "vkCreateDescriptorSetLayout") @@ -3683,8 +4234,10 @@ load_proc_addresses_device :: proc(device: Device) { CreateDescriptorUpdateTemplateKHR = auto_cast GetDeviceProcAddr(device, "vkCreateDescriptorUpdateTemplateKHR") CreateEvent = auto_cast GetDeviceProcAddr(device, "vkCreateEvent") CreateExecutionGraphPipelinesAMDX = auto_cast GetDeviceProcAddr(device, "vkCreateExecutionGraphPipelinesAMDX") + CreateExternalComputeQueueNV = auto_cast GetDeviceProcAddr(device, "vkCreateExternalComputeQueueNV") CreateFence = auto_cast GetDeviceProcAddr(device, "vkCreateFence") CreateFramebuffer = auto_cast GetDeviceProcAddr(device, "vkCreateFramebuffer") + CreateGpaSessionAMD = auto_cast GetDeviceProcAddr(device, "vkCreateGpaSessionAMD") CreateGraphicsPipelines = auto_cast GetDeviceProcAddr(device, "vkCreateGraphicsPipelines") CreateImage = auto_cast GetDeviceProcAddr(device, "vkCreateImage") CreateImageView = auto_cast GetDeviceProcAddr(device, "vkCreateImageView") @@ -3708,10 +4261,13 @@ load_proc_addresses_device :: proc(device: Device) { CreateSamplerYcbcrConversion = auto_cast GetDeviceProcAddr(device, "vkCreateSamplerYcbcrConversion") CreateSamplerYcbcrConversionKHR = auto_cast GetDeviceProcAddr(device, "vkCreateSamplerYcbcrConversionKHR") CreateSemaphore = auto_cast GetDeviceProcAddr(device, "vkCreateSemaphore") + CreateShaderInstrumentationARM = auto_cast GetDeviceProcAddr(device, "vkCreateShaderInstrumentationARM") CreateShaderModule = auto_cast GetDeviceProcAddr(device, "vkCreateShaderModule") CreateShadersEXT = auto_cast GetDeviceProcAddr(device, "vkCreateShadersEXT") CreateSharedSwapchainsKHR = auto_cast GetDeviceProcAddr(device, "vkCreateSharedSwapchainsKHR") CreateSwapchainKHR = auto_cast GetDeviceProcAddr(device, "vkCreateSwapchainKHR") + CreateTensorARM = auto_cast GetDeviceProcAddr(device, "vkCreateTensorARM") + CreateTensorViewARM = auto_cast GetDeviceProcAddr(device, "vkCreateTensorViewARM") CreateValidationCacheEXT = auto_cast GetDeviceProcAddr(device, "vkCreateValidationCacheEXT") CreateVideoSessionKHR = auto_cast GetDeviceProcAddr(device, "vkCreateVideoSessionKHR") CreateVideoSessionParametersKHR = auto_cast GetDeviceProcAddr(device, "vkCreateVideoSessionParametersKHR") @@ -3727,6 +4283,7 @@ load_proc_addresses_device :: proc(device: Device) { DestroyCuModuleNVX = auto_cast GetDeviceProcAddr(device, "vkDestroyCuModuleNVX") DestroyCudaFunctionNV = auto_cast GetDeviceProcAddr(device, "vkDestroyCudaFunctionNV") DestroyCudaModuleNV = auto_cast GetDeviceProcAddr(device, "vkDestroyCudaModuleNV") + DestroyDataGraphPipelineSessionARM = auto_cast GetDeviceProcAddr(device, "vkDestroyDataGraphPipelineSessionARM") DestroyDeferredOperationKHR = auto_cast GetDeviceProcAddr(device, "vkDestroyDeferredOperationKHR") DestroyDescriptorPool = auto_cast GetDeviceProcAddr(device, "vkDestroyDescriptorPool") DestroyDescriptorSetLayout = auto_cast GetDeviceProcAddr(device, "vkDestroyDescriptorSetLayout") @@ -3734,8 +4291,10 @@ load_proc_addresses_device :: proc(device: Device) { DestroyDescriptorUpdateTemplateKHR = auto_cast GetDeviceProcAddr(device, "vkDestroyDescriptorUpdateTemplateKHR") DestroyDevice = auto_cast GetDeviceProcAddr(device, "vkDestroyDevice") DestroyEvent = auto_cast GetDeviceProcAddr(device, "vkDestroyEvent") + DestroyExternalComputeQueueNV = auto_cast GetDeviceProcAddr(device, "vkDestroyExternalComputeQueueNV") DestroyFence = auto_cast GetDeviceProcAddr(device, "vkDestroyFence") DestroyFramebuffer = auto_cast GetDeviceProcAddr(device, "vkDestroyFramebuffer") + DestroyGpaSessionAMD = auto_cast GetDeviceProcAddr(device, "vkDestroyGpaSessionAMD") DestroyImage = auto_cast GetDeviceProcAddr(device, "vkDestroyImage") DestroyImageView = auto_cast GetDeviceProcAddr(device, "vkDestroyImageView") DestroyIndirectCommandsLayoutEXT = auto_cast GetDeviceProcAddr(device, "vkDestroyIndirectCommandsLayoutEXT") @@ -3756,8 +4315,11 @@ load_proc_addresses_device :: proc(device: Device) { DestroySamplerYcbcrConversionKHR = auto_cast GetDeviceProcAddr(device, "vkDestroySamplerYcbcrConversionKHR") DestroySemaphore = auto_cast GetDeviceProcAddr(device, "vkDestroySemaphore") DestroyShaderEXT = auto_cast GetDeviceProcAddr(device, "vkDestroyShaderEXT") + DestroyShaderInstrumentationARM = auto_cast GetDeviceProcAddr(device, "vkDestroyShaderInstrumentationARM") DestroyShaderModule = auto_cast GetDeviceProcAddr(device, "vkDestroyShaderModule") DestroySwapchainKHR = auto_cast GetDeviceProcAddr(device, "vkDestroySwapchainKHR") + DestroyTensorARM = auto_cast GetDeviceProcAddr(device, "vkDestroyTensorARM") + DestroyTensorViewARM = auto_cast GetDeviceProcAddr(device, "vkDestroyTensorViewARM") DestroyValidationCacheEXT = auto_cast GetDeviceProcAddr(device, "vkDestroyValidationCacheEXT") DestroyVideoSessionKHR = auto_cast GetDeviceProcAddr(device, "vkDestroyVideoSessionKHR") DestroyVideoSessionParametersKHR = auto_cast GetDeviceProcAddr(device, "vkDestroyVideoSessionParametersKHR") @@ -3787,6 +4349,10 @@ load_proc_addresses_device :: proc(device: Device) { GetCalibratedTimestampsKHR = auto_cast GetDeviceProcAddr(device, "vkGetCalibratedTimestampsKHR") GetClusterAccelerationStructureBuildSizesNV = auto_cast GetDeviceProcAddr(device, "vkGetClusterAccelerationStructureBuildSizesNV") GetCudaModuleCacheNV = auto_cast GetDeviceProcAddr(device, "vkGetCudaModuleCacheNV") + GetDataGraphPipelineAvailablePropertiesARM = auto_cast GetDeviceProcAddr(device, "vkGetDataGraphPipelineAvailablePropertiesARM") + GetDataGraphPipelinePropertiesARM = auto_cast GetDeviceProcAddr(device, "vkGetDataGraphPipelinePropertiesARM") + GetDataGraphPipelineSessionBindPointRequirementsARM = auto_cast GetDeviceProcAddr(device, "vkGetDataGraphPipelineSessionBindPointRequirementsARM") + GetDataGraphPipelineSessionMemoryRequirementsARM = auto_cast GetDeviceProcAddr(device, "vkGetDataGraphPipelineSessionMemoryRequirementsARM") GetDeferredOperationMaxConcurrencyKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeferredOperationMaxConcurrencyKHR") GetDeferredOperationResultKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeferredOperationResultKHR") GetDescriptorEXT = auto_cast GetDeviceProcAddr(device, "vkGetDescriptorEXT") @@ -3799,7 +4365,10 @@ load_proc_addresses_device :: proc(device: Device) { GetDeviceAccelerationStructureCompatibilityKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeviceAccelerationStructureCompatibilityKHR") GetDeviceBufferMemoryRequirements = auto_cast GetDeviceProcAddr(device, "vkGetDeviceBufferMemoryRequirements") GetDeviceBufferMemoryRequirementsKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeviceBufferMemoryRequirementsKHR") + GetDeviceCombinedImageSamplerIndexNVX = auto_cast GetDeviceProcAddr(device, "vkGetDeviceCombinedImageSamplerIndexNVX") + GetDeviceFaultDebugInfoKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeviceFaultDebugInfoKHR") GetDeviceFaultInfoEXT = auto_cast GetDeviceProcAddr(device, "vkGetDeviceFaultInfoEXT") + GetDeviceFaultReportsKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeviceFaultReportsKHR") GetDeviceGroupPeerMemoryFeatures = auto_cast GetDeviceProcAddr(device, "vkGetDeviceGroupPeerMemoryFeatures") GetDeviceGroupPeerMemoryFeaturesKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeviceGroupPeerMemoryFeaturesKHR") GetDeviceGroupPresentCapabilitiesKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeviceGroupPresentCapabilitiesKHR") @@ -3819,6 +4388,7 @@ load_proc_addresses_device :: proc(device: Device) { GetDeviceQueue = auto_cast GetDeviceProcAddr(device, "vkGetDeviceQueue") GetDeviceQueue2 = auto_cast GetDeviceProcAddr(device, "vkGetDeviceQueue2") GetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI = auto_cast GetDeviceProcAddr(device, "vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI") + GetDeviceTensorMemoryRequirementsARM = auto_cast GetDeviceProcAddr(device, "vkGetDeviceTensorMemoryRequirementsARM") GetDynamicRenderingTilePropertiesQCOM = auto_cast GetDeviceProcAddr(device, "vkGetDynamicRenderingTilePropertiesQCOM") GetEncodedVideoSessionParametersKHR = auto_cast GetDeviceProcAddr(device, "vkGetEncodedVideoSessionParametersKHR") GetEventStatus = auto_cast GetDeviceProcAddr(device, "vkGetEventStatus") @@ -3830,10 +4400,14 @@ load_proc_addresses_device :: proc(device: Device) { GetFramebufferTilePropertiesQCOM = auto_cast GetDeviceProcAddr(device, "vkGetFramebufferTilePropertiesQCOM") GetGeneratedCommandsMemoryRequirementsEXT = auto_cast GetDeviceProcAddr(device, "vkGetGeneratedCommandsMemoryRequirementsEXT") GetGeneratedCommandsMemoryRequirementsNV = auto_cast GetDeviceProcAddr(device, "vkGetGeneratedCommandsMemoryRequirementsNV") + GetGpaDeviceClockInfoAMD = auto_cast GetDeviceProcAddr(device, "vkGetGpaDeviceClockInfoAMD") + GetGpaSessionResultsAMD = auto_cast GetDeviceProcAddr(device, "vkGetGpaSessionResultsAMD") + GetGpaSessionStatusAMD = auto_cast GetDeviceProcAddr(device, "vkGetGpaSessionStatusAMD") GetImageDrmFormatModifierPropertiesEXT = auto_cast GetDeviceProcAddr(device, "vkGetImageDrmFormatModifierPropertiesEXT") GetImageMemoryRequirements = auto_cast GetDeviceProcAddr(device, "vkGetImageMemoryRequirements") GetImageMemoryRequirements2 = auto_cast GetDeviceProcAddr(device, "vkGetImageMemoryRequirements2") GetImageMemoryRequirements2KHR = auto_cast GetDeviceProcAddr(device, "vkGetImageMemoryRequirements2KHR") + GetImageOpaqueCaptureDataEXT = auto_cast GetDeviceProcAddr(device, "vkGetImageOpaqueCaptureDataEXT") GetImageOpaqueCaptureDescriptorDataEXT = auto_cast GetDeviceProcAddr(device, "vkGetImageOpaqueCaptureDescriptorDataEXT") GetImageSparseMemoryRequirements = auto_cast GetDeviceProcAddr(device, "vkGetImageSparseMemoryRequirements") GetImageSparseMemoryRequirements2 = auto_cast GetDeviceProcAddr(device, "vkGetImageSparseMemoryRequirements2") @@ -3858,6 +4432,7 @@ load_proc_addresses_device :: proc(device: Device) { GetMemoryWin32HandlePropertiesKHR = auto_cast GetDeviceProcAddr(device, "vkGetMemoryWin32HandlePropertiesKHR") GetMicromapBuildSizesEXT = auto_cast GetDeviceProcAddr(device, "vkGetMicromapBuildSizesEXT") GetPartitionedAccelerationStructuresBuildSizesNV = auto_cast GetDeviceProcAddr(device, "vkGetPartitionedAccelerationStructuresBuildSizesNV") + GetPastPresentationTimingEXT = auto_cast GetDeviceProcAddr(device, "vkGetPastPresentationTimingEXT") GetPastPresentationTimingGOOGLE = auto_cast GetDeviceProcAddr(device, "vkGetPastPresentationTimingGOOGLE") GetPerformanceParameterINTEL = auto_cast GetDeviceProcAddr(device, "vkGetPerformanceParameterINTEL") GetPipelineBinaryDataKHR = auto_cast GetDeviceProcAddr(device, "vkGetPipelineBinaryDataKHR") @@ -3889,11 +4464,18 @@ load_proc_addresses_device :: proc(device: Device) { GetSemaphoreWin32HandleKHR = auto_cast GetDeviceProcAddr(device, "vkGetSemaphoreWin32HandleKHR") GetShaderBinaryDataEXT = auto_cast GetDeviceProcAddr(device, "vkGetShaderBinaryDataEXT") GetShaderInfoAMD = auto_cast GetDeviceProcAddr(device, "vkGetShaderInfoAMD") + GetShaderInstrumentationValuesARM = auto_cast GetDeviceProcAddr(device, "vkGetShaderInstrumentationValuesARM") GetShaderModuleCreateInfoIdentifierEXT = auto_cast GetDeviceProcAddr(device, "vkGetShaderModuleCreateInfoIdentifierEXT") GetShaderModuleIdentifierEXT = auto_cast GetDeviceProcAddr(device, "vkGetShaderModuleIdentifierEXT") GetSwapchainCounterEXT = auto_cast GetDeviceProcAddr(device, "vkGetSwapchainCounterEXT") GetSwapchainImagesKHR = auto_cast GetDeviceProcAddr(device, "vkGetSwapchainImagesKHR") GetSwapchainStatusKHR = auto_cast GetDeviceProcAddr(device, "vkGetSwapchainStatusKHR") + GetSwapchainTimeDomainPropertiesEXT = auto_cast GetDeviceProcAddr(device, "vkGetSwapchainTimeDomainPropertiesEXT") + GetSwapchainTimingPropertiesEXT = auto_cast GetDeviceProcAddr(device, "vkGetSwapchainTimingPropertiesEXT") + GetTensorMemoryRequirementsARM = auto_cast GetDeviceProcAddr(device, "vkGetTensorMemoryRequirementsARM") + GetTensorOpaqueCaptureDataARM = auto_cast GetDeviceProcAddr(device, "vkGetTensorOpaqueCaptureDataARM") + GetTensorOpaqueCaptureDescriptorDataARM = auto_cast GetDeviceProcAddr(device, "vkGetTensorOpaqueCaptureDescriptorDataARM") + GetTensorViewOpaqueCaptureDescriptorDataARM = auto_cast GetDeviceProcAddr(device, "vkGetTensorViewOpaqueCaptureDescriptorDataARM") GetValidationCacheDataEXT = auto_cast GetDeviceProcAddr(device, "vkGetValidationCacheDataEXT") GetVideoSessionMemoryRequirementsKHR = auto_cast GetDeviceProcAddr(device, "vkGetVideoSessionMemoryRequirementsKHR") ImportFenceFdKHR = auto_cast GetDeviceProcAddr(device, "vkImportFenceFdKHR") @@ -3919,6 +4501,7 @@ load_proc_addresses_device :: proc(device: Device) { QueueSubmit2 = auto_cast GetDeviceProcAddr(device, "vkQueueSubmit2") QueueSubmit2KHR = auto_cast GetDeviceProcAddr(device, "vkQueueSubmit2KHR") QueueWaitIdle = auto_cast GetDeviceProcAddr(device, "vkQueueWaitIdle") + RegisterCustomBorderColorEXT = auto_cast GetDeviceProcAddr(device, "vkRegisterCustomBorderColorEXT") RegisterDeviceEventEXT = auto_cast GetDeviceProcAddr(device, "vkRegisterDeviceEventEXT") RegisterDisplayEventEXT = auto_cast GetDeviceProcAddr(device, "vkRegisterDisplayEventEXT") ReleaseCapturedPipelineDataKHR = auto_cast GetDeviceProcAddr(device, "vkReleaseCapturedPipelineDataKHR") @@ -3926,23 +4509,27 @@ load_proc_addresses_device :: proc(device: Device) { ReleasePerformanceConfigurationINTEL = auto_cast GetDeviceProcAddr(device, "vkReleasePerformanceConfigurationINTEL") ReleaseProfilingLockKHR = auto_cast GetDeviceProcAddr(device, "vkReleaseProfilingLockKHR") ReleaseSwapchainImagesEXT = auto_cast GetDeviceProcAddr(device, "vkReleaseSwapchainImagesEXT") + ReleaseSwapchainImagesKHR = auto_cast GetDeviceProcAddr(device, "vkReleaseSwapchainImagesKHR") ResetCommandBuffer = auto_cast GetDeviceProcAddr(device, "vkResetCommandBuffer") ResetCommandPool = auto_cast GetDeviceProcAddr(device, "vkResetCommandPool") ResetDescriptorPool = auto_cast GetDeviceProcAddr(device, "vkResetDescriptorPool") ResetEvent = auto_cast GetDeviceProcAddr(device, "vkResetEvent") ResetFences = auto_cast GetDeviceProcAddr(device, "vkResetFences") + ResetGpaSessionAMD = auto_cast GetDeviceProcAddr(device, "vkResetGpaSessionAMD") ResetQueryPool = auto_cast GetDeviceProcAddr(device, "vkResetQueryPool") ResetQueryPoolEXT = auto_cast GetDeviceProcAddr(device, "vkResetQueryPoolEXT") SetDebugUtilsObjectNameEXT = auto_cast GetDeviceProcAddr(device, "vkSetDebugUtilsObjectNameEXT") SetDebugUtilsObjectTagEXT = auto_cast GetDeviceProcAddr(device, "vkSetDebugUtilsObjectTagEXT") SetDeviceMemoryPriorityEXT = auto_cast GetDeviceProcAddr(device, "vkSetDeviceMemoryPriorityEXT") SetEvent = auto_cast GetDeviceProcAddr(device, "vkSetEvent") + SetGpaDeviceClockModeAMD = auto_cast GetDeviceProcAddr(device, "vkSetGpaDeviceClockModeAMD") SetHdrMetadataEXT = auto_cast GetDeviceProcAddr(device, "vkSetHdrMetadataEXT") SetLatencyMarkerNV = auto_cast GetDeviceProcAddr(device, "vkSetLatencyMarkerNV") SetLatencySleepModeNV = auto_cast GetDeviceProcAddr(device, "vkSetLatencySleepModeNV") SetLocalDimmingAMD = auto_cast GetDeviceProcAddr(device, "vkSetLocalDimmingAMD") SetPrivateData = auto_cast GetDeviceProcAddr(device, "vkSetPrivateData") SetPrivateDataEXT = auto_cast GetDeviceProcAddr(device, "vkSetPrivateDataEXT") + SetSwapchainPresentTimingQueueSizeEXT = auto_cast GetDeviceProcAddr(device, "vkSetSwapchainPresentTimingQueueSizeEXT") SignalSemaphore = auto_cast GetDeviceProcAddr(device, "vkSignalSemaphore") SignalSemaphoreKHR = auto_cast GetDeviceProcAddr(device, "vkSignalSemaphoreKHR") TransitionImageLayout = auto_cast GetDeviceProcAddr(device, "vkTransitionImageLayout") @@ -3953,6 +4540,7 @@ load_proc_addresses_device :: proc(device: Device) { UnmapMemory = auto_cast GetDeviceProcAddr(device, "vkUnmapMemory") UnmapMemory2 = auto_cast GetDeviceProcAddr(device, "vkUnmapMemory2") UnmapMemory2KHR = auto_cast GetDeviceProcAddr(device, "vkUnmapMemory2KHR") + UnregisterCustomBorderColorEXT = auto_cast GetDeviceProcAddr(device, "vkUnregisterCustomBorderColorEXT") UpdateDescriptorSetWithTemplate = auto_cast GetDeviceProcAddr(device, "vkUpdateDescriptorSetWithTemplate") UpdateDescriptorSetWithTemplateKHR = auto_cast GetDeviceProcAddr(device, "vkUpdateDescriptorSetWithTemplateKHR") UpdateDescriptorSets = auto_cast GetDeviceProcAddr(device, "vkUpdateDescriptorSets") @@ -3960,111 +4548,122 @@ load_proc_addresses_device :: proc(device: Device) { UpdateIndirectExecutionSetShaderEXT = auto_cast GetDeviceProcAddr(device, "vkUpdateIndirectExecutionSetShaderEXT") UpdateVideoSessionParametersKHR = auto_cast GetDeviceProcAddr(device, "vkUpdateVideoSessionParametersKHR") WaitForFences = auto_cast GetDeviceProcAddr(device, "vkWaitForFences") + WaitForPresent2KHR = auto_cast GetDeviceProcAddr(device, "vkWaitForPresent2KHR") WaitForPresentKHR = auto_cast GetDeviceProcAddr(device, "vkWaitForPresentKHR") WaitSemaphores = auto_cast GetDeviceProcAddr(device, "vkWaitSemaphores") WaitSemaphoresKHR = auto_cast GetDeviceProcAddr(device, "vkWaitSemaphoresKHR") WriteAccelerationStructuresPropertiesKHR = auto_cast GetDeviceProcAddr(device, "vkWriteAccelerationStructuresPropertiesKHR") WriteMicromapsPropertiesEXT = auto_cast GetDeviceProcAddr(device, "vkWriteMicromapsPropertiesEXT") + WriteResourceDescriptorsEXT = auto_cast GetDeviceProcAddr(device, "vkWriteResourceDescriptorsEXT") + WriteSamplerDescriptorsEXT = auto_cast GetDeviceProcAddr(device, "vkWriteSamplerDescriptorsEXT") } load_proc_addresses_instance :: proc(instance: Instance) { - AcquireDrmDisplayEXT = auto_cast GetInstanceProcAddr(instance, "vkAcquireDrmDisplayEXT") - AcquireWinrtDisplayNV = auto_cast GetInstanceProcAddr(instance, "vkAcquireWinrtDisplayNV") - CreateDebugReportCallbackEXT = auto_cast GetInstanceProcAddr(instance, "vkCreateDebugReportCallbackEXT") - CreateDebugUtilsMessengerEXT = auto_cast GetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT") - CreateDevice = auto_cast GetInstanceProcAddr(instance, "vkCreateDevice") - CreateDisplayModeKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateDisplayModeKHR") - CreateDisplayPlaneSurfaceKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateDisplayPlaneSurfaceKHR") - CreateHeadlessSurfaceEXT = auto_cast GetInstanceProcAddr(instance, "vkCreateHeadlessSurfaceEXT") - CreateIOSSurfaceMVK = auto_cast GetInstanceProcAddr(instance, "vkCreateIOSSurfaceMVK") - CreateMacOSSurfaceMVK = auto_cast GetInstanceProcAddr(instance, "vkCreateMacOSSurfaceMVK") - CreateMetalSurfaceEXT = auto_cast GetInstanceProcAddr(instance, "vkCreateMetalSurfaceEXT") - CreateWaylandSurfaceKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateWaylandSurfaceKHR") - CreateWin32SurfaceKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateWin32SurfaceKHR") - CreateXcbSurfaceKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateXcbSurfaceKHR") - CreateXlibSurfaceKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateXlibSurfaceKHR") - DebugReportMessageEXT = auto_cast GetInstanceProcAddr(instance, "vkDebugReportMessageEXT") - DestroyDebugReportCallbackEXT = auto_cast GetInstanceProcAddr(instance, "vkDestroyDebugReportCallbackEXT") - DestroyDebugUtilsMessengerEXT = auto_cast GetInstanceProcAddr(instance, "vkDestroyDebugUtilsMessengerEXT") - DestroyInstance = auto_cast GetInstanceProcAddr(instance, "vkDestroyInstance") - DestroySurfaceKHR = auto_cast GetInstanceProcAddr(instance, "vkDestroySurfaceKHR") - EnumerateDeviceExtensionProperties = auto_cast GetInstanceProcAddr(instance, "vkEnumerateDeviceExtensionProperties") - EnumerateDeviceLayerProperties = auto_cast GetInstanceProcAddr(instance, "vkEnumerateDeviceLayerProperties") - EnumeratePhysicalDeviceGroups = auto_cast GetInstanceProcAddr(instance, "vkEnumeratePhysicalDeviceGroups") - EnumeratePhysicalDeviceGroupsKHR = auto_cast GetInstanceProcAddr(instance, "vkEnumeratePhysicalDeviceGroupsKHR") - EnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR = auto_cast GetInstanceProcAddr(instance, "vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR") - EnumeratePhysicalDevices = auto_cast GetInstanceProcAddr(instance, "vkEnumeratePhysicalDevices") - GetDisplayModeProperties2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetDisplayModeProperties2KHR") - GetDisplayModePropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetDisplayModePropertiesKHR") - GetDisplayPlaneCapabilities2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetDisplayPlaneCapabilities2KHR") - GetDisplayPlaneCapabilitiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetDisplayPlaneCapabilitiesKHR") - GetDisplayPlaneSupportedDisplaysKHR = auto_cast GetInstanceProcAddr(instance, "vkGetDisplayPlaneSupportedDisplaysKHR") - GetDrmDisplayEXT = auto_cast GetInstanceProcAddr(instance, "vkGetDrmDisplayEXT") - GetInstanceProcAddrLUNARG = auto_cast GetInstanceProcAddr(instance, "vkGetInstanceProcAddrLUNARG") - GetPhysicalDeviceCalibrateableTimeDomainsEXT = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceCalibrateableTimeDomainsEXT") - GetPhysicalDeviceCalibrateableTimeDomainsKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceCalibrateableTimeDomainsKHR") - GetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV") - GetPhysicalDeviceCooperativeMatrixPropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR") - GetPhysicalDeviceCooperativeMatrixPropertiesNV = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceCooperativeMatrixPropertiesNV") - GetPhysicalDeviceCooperativeVectorPropertiesNV = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceCooperativeVectorPropertiesNV") - GetPhysicalDeviceDisplayPlaneProperties2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceDisplayPlaneProperties2KHR") - GetPhysicalDeviceDisplayPlanePropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR") - GetPhysicalDeviceDisplayProperties2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceDisplayProperties2KHR") - GetPhysicalDeviceDisplayPropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceDisplayPropertiesKHR") - GetPhysicalDeviceExternalBufferProperties = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalBufferProperties") - GetPhysicalDeviceExternalBufferPropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalBufferPropertiesKHR") - GetPhysicalDeviceExternalFenceProperties = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalFenceProperties") - GetPhysicalDeviceExternalFencePropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalFencePropertiesKHR") - GetPhysicalDeviceExternalImageFormatPropertiesNV = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV") - GetPhysicalDeviceExternalSemaphoreProperties = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalSemaphoreProperties") - GetPhysicalDeviceExternalSemaphorePropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalSemaphorePropertiesKHR") - GetPhysicalDeviceFeatures = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceFeatures") - GetPhysicalDeviceFeatures2 = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceFeatures2") - GetPhysicalDeviceFeatures2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceFeatures2KHR") - GetPhysicalDeviceFormatProperties = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceFormatProperties") - GetPhysicalDeviceFormatProperties2 = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceFormatProperties2") - GetPhysicalDeviceFormatProperties2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceFormatProperties2KHR") - GetPhysicalDeviceFragmentShadingRatesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceFragmentShadingRatesKHR") - GetPhysicalDeviceImageFormatProperties = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceImageFormatProperties") - GetPhysicalDeviceImageFormatProperties2 = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceImageFormatProperties2") - GetPhysicalDeviceImageFormatProperties2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceImageFormatProperties2KHR") - GetPhysicalDeviceMemoryProperties = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceMemoryProperties") - GetPhysicalDeviceMemoryProperties2 = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceMemoryProperties2") - GetPhysicalDeviceMemoryProperties2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceMemoryProperties2KHR") - GetPhysicalDeviceMultisamplePropertiesEXT = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceMultisamplePropertiesEXT") - GetPhysicalDeviceOpticalFlowImageFormatsNV = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceOpticalFlowImageFormatsNV") - GetPhysicalDevicePresentRectanglesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDevicePresentRectanglesKHR") - GetPhysicalDeviceProperties = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties") - GetPhysicalDeviceProperties2 = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties2") - GetPhysicalDeviceProperties2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties2KHR") - GetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR") - GetPhysicalDeviceQueueFamilyProperties = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyProperties") - GetPhysicalDeviceQueueFamilyProperties2 = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyProperties2") - GetPhysicalDeviceQueueFamilyProperties2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyProperties2KHR") - GetPhysicalDeviceSparseImageFormatProperties = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSparseImageFormatProperties") - GetPhysicalDeviceSparseImageFormatProperties2 = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSparseImageFormatProperties2") - GetPhysicalDeviceSparseImageFormatProperties2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSparseImageFormatProperties2KHR") - GetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV") - GetPhysicalDeviceSurfaceCapabilities2EXT = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceCapabilities2EXT") - GetPhysicalDeviceSurfaceCapabilities2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceCapabilities2KHR") - GetPhysicalDeviceSurfaceCapabilitiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR") - GetPhysicalDeviceSurfaceFormats2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceFormats2KHR") - GetPhysicalDeviceSurfaceFormatsKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceFormatsKHR") - GetPhysicalDeviceSurfacePresentModes2EXT = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfacePresentModes2EXT") - GetPhysicalDeviceSurfacePresentModesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfacePresentModesKHR") - GetPhysicalDeviceSurfaceSupportKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceSupportKHR") - GetPhysicalDeviceToolProperties = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceToolProperties") - GetPhysicalDeviceToolPropertiesEXT = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceToolPropertiesEXT") - GetPhysicalDeviceVideoCapabilitiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceVideoCapabilitiesKHR") - GetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR") - GetPhysicalDeviceVideoFormatPropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceVideoFormatPropertiesKHR") - GetPhysicalDeviceWaylandPresentationSupportKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceWaylandPresentationSupportKHR") - GetPhysicalDeviceWin32PresentationSupportKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceWin32PresentationSupportKHR") - GetPhysicalDeviceXcbPresentationSupportKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceXcbPresentationSupportKHR") - GetPhysicalDeviceXlibPresentationSupportKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceXlibPresentationSupportKHR") - GetWinrtDisplayNV = auto_cast GetInstanceProcAddr(instance, "vkGetWinrtDisplayNV") - ReleaseDisplayEXT = auto_cast GetInstanceProcAddr(instance, "vkReleaseDisplayEXT") - SubmitDebugUtilsMessageEXT = auto_cast GetInstanceProcAddr(instance, "vkSubmitDebugUtilsMessageEXT") + AcquireDrmDisplayEXT = auto_cast GetInstanceProcAddr(instance, "vkAcquireDrmDisplayEXT") + AcquireWinrtDisplayNV = auto_cast GetInstanceProcAddr(instance, "vkAcquireWinrtDisplayNV") + CreateDebugReportCallbackEXT = auto_cast GetInstanceProcAddr(instance, "vkCreateDebugReportCallbackEXT") + CreateDebugUtilsMessengerEXT = auto_cast GetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT") + CreateDevice = auto_cast GetInstanceProcAddr(instance, "vkCreateDevice") + CreateDisplayModeKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateDisplayModeKHR") + CreateDisplayPlaneSurfaceKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateDisplayPlaneSurfaceKHR") + CreateHeadlessSurfaceEXT = auto_cast GetInstanceProcAddr(instance, "vkCreateHeadlessSurfaceEXT") + CreateIOSSurfaceMVK = auto_cast GetInstanceProcAddr(instance, "vkCreateIOSSurfaceMVK") + CreateMacOSSurfaceMVK = auto_cast GetInstanceProcAddr(instance, "vkCreateMacOSSurfaceMVK") + CreateMetalSurfaceEXT = auto_cast GetInstanceProcAddr(instance, "vkCreateMetalSurfaceEXT") + CreateWaylandSurfaceKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateWaylandSurfaceKHR") + CreateWin32SurfaceKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateWin32SurfaceKHR") + CreateXcbSurfaceKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateXcbSurfaceKHR") + CreateXlibSurfaceKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateXlibSurfaceKHR") + DebugReportMessageEXT = auto_cast GetInstanceProcAddr(instance, "vkDebugReportMessageEXT") + DestroyDebugReportCallbackEXT = auto_cast GetInstanceProcAddr(instance, "vkDestroyDebugReportCallbackEXT") + DestroyDebugUtilsMessengerEXT = auto_cast GetInstanceProcAddr(instance, "vkDestroyDebugUtilsMessengerEXT") + DestroyInstance = auto_cast GetInstanceProcAddr(instance, "vkDestroyInstance") + DestroySurfaceKHR = auto_cast GetInstanceProcAddr(instance, "vkDestroySurfaceKHR") + EnumerateDeviceExtensionProperties = auto_cast GetInstanceProcAddr(instance, "vkEnumerateDeviceExtensionProperties") + EnumerateDeviceLayerProperties = auto_cast GetInstanceProcAddr(instance, "vkEnumerateDeviceLayerProperties") + EnumeratePhysicalDeviceGroups = auto_cast GetInstanceProcAddr(instance, "vkEnumeratePhysicalDeviceGroups") + EnumeratePhysicalDeviceGroupsKHR = auto_cast GetInstanceProcAddr(instance, "vkEnumeratePhysicalDeviceGroupsKHR") + EnumeratePhysicalDeviceQueueFamilyPerformanceCountersByRegionARM = auto_cast GetInstanceProcAddr(instance, "vkEnumeratePhysicalDeviceQueueFamilyPerformanceCountersByRegionARM") + EnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR = auto_cast GetInstanceProcAddr(instance, "vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR") + EnumeratePhysicalDeviceShaderInstrumentationMetricsARM = auto_cast GetInstanceProcAddr(instance, "vkEnumeratePhysicalDeviceShaderInstrumentationMetricsARM") + EnumeratePhysicalDevices = auto_cast GetInstanceProcAddr(instance, "vkEnumeratePhysicalDevices") + GetDisplayModeProperties2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetDisplayModeProperties2KHR") + GetDisplayModePropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetDisplayModePropertiesKHR") + GetDisplayPlaneCapabilities2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetDisplayPlaneCapabilities2KHR") + GetDisplayPlaneCapabilitiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetDisplayPlaneCapabilitiesKHR") + GetDisplayPlaneSupportedDisplaysKHR = auto_cast GetInstanceProcAddr(instance, "vkGetDisplayPlaneSupportedDisplaysKHR") + GetDrmDisplayEXT = auto_cast GetInstanceProcAddr(instance, "vkGetDrmDisplayEXT") + GetInstanceProcAddrLUNARG = auto_cast GetInstanceProcAddr(instance, "vkGetInstanceProcAddrLUNARG") + GetPhysicalDeviceCalibrateableTimeDomainsEXT = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceCalibrateableTimeDomainsEXT") + GetPhysicalDeviceCalibrateableTimeDomainsKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceCalibrateableTimeDomainsKHR") + GetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV") + GetPhysicalDeviceCooperativeMatrixPropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR") + GetPhysicalDeviceCooperativeMatrixPropertiesNV = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceCooperativeMatrixPropertiesNV") + GetPhysicalDeviceCooperativeVectorPropertiesNV = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceCooperativeVectorPropertiesNV") + GetPhysicalDeviceDescriptorSizeEXT = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceDescriptorSizeEXT") + GetPhysicalDeviceDisplayPlaneProperties2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceDisplayPlaneProperties2KHR") + GetPhysicalDeviceDisplayPlanePropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR") + GetPhysicalDeviceDisplayProperties2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceDisplayProperties2KHR") + GetPhysicalDeviceDisplayPropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceDisplayPropertiesKHR") + GetPhysicalDeviceExternalBufferProperties = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalBufferProperties") + GetPhysicalDeviceExternalBufferPropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalBufferPropertiesKHR") + GetPhysicalDeviceExternalFenceProperties = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalFenceProperties") + GetPhysicalDeviceExternalFencePropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalFencePropertiesKHR") + GetPhysicalDeviceExternalImageFormatPropertiesNV = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalImageFormatPropertiesNV") + GetPhysicalDeviceExternalSemaphoreProperties = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalSemaphoreProperties") + GetPhysicalDeviceExternalSemaphorePropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalSemaphorePropertiesKHR") + GetPhysicalDeviceExternalTensorPropertiesARM = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceExternalTensorPropertiesARM") + GetPhysicalDeviceFeatures = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceFeatures") + GetPhysicalDeviceFeatures2 = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceFeatures2") + GetPhysicalDeviceFeatures2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceFeatures2KHR") + GetPhysicalDeviceFormatProperties = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceFormatProperties") + GetPhysicalDeviceFormatProperties2 = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceFormatProperties2") + GetPhysicalDeviceFormatProperties2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceFormatProperties2KHR") + GetPhysicalDeviceFragmentShadingRatesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceFragmentShadingRatesKHR") + GetPhysicalDeviceImageFormatProperties = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceImageFormatProperties") + GetPhysicalDeviceImageFormatProperties2 = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceImageFormatProperties2") + GetPhysicalDeviceImageFormatProperties2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceImageFormatProperties2KHR") + GetPhysicalDeviceMemoryProperties = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceMemoryProperties") + GetPhysicalDeviceMemoryProperties2 = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceMemoryProperties2") + GetPhysicalDeviceMemoryProperties2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceMemoryProperties2KHR") + GetPhysicalDeviceMultisamplePropertiesEXT = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceMultisamplePropertiesEXT") + GetPhysicalDeviceOpticalFlowImageFormatsNV = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceOpticalFlowImageFormatsNV") + GetPhysicalDevicePresentRectanglesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDevicePresentRectanglesKHR") + GetPhysicalDeviceProperties = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties") + GetPhysicalDeviceProperties2 = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties2") + GetPhysicalDeviceProperties2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceProperties2KHR") + GetPhysicalDeviceQueueFamilyDataGraphEngineOperationPropertiesARM = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyDataGraphEngineOperationPropertiesARM") + GetPhysicalDeviceQueueFamilyDataGraphOpticalFlowImageFormatsARM = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyDataGraphOpticalFlowImageFormatsARM") + GetPhysicalDeviceQueueFamilyDataGraphProcessingEnginePropertiesARM = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyDataGraphProcessingEnginePropertiesARM") + GetPhysicalDeviceQueueFamilyDataGraphPropertiesARM = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyDataGraphPropertiesARM") + GetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR") + GetPhysicalDeviceQueueFamilyProperties = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyProperties") + GetPhysicalDeviceQueueFamilyProperties2 = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyProperties2") + GetPhysicalDeviceQueueFamilyProperties2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceQueueFamilyProperties2KHR") + GetPhysicalDeviceSparseImageFormatProperties = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSparseImageFormatProperties") + GetPhysicalDeviceSparseImageFormatProperties2 = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSparseImageFormatProperties2") + GetPhysicalDeviceSparseImageFormatProperties2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSparseImageFormatProperties2KHR") + GetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV") + GetPhysicalDeviceSurfaceCapabilities2EXT = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceCapabilities2EXT") + GetPhysicalDeviceSurfaceCapabilities2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceCapabilities2KHR") + GetPhysicalDeviceSurfaceCapabilitiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR") + GetPhysicalDeviceSurfaceFormats2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceFormats2KHR") + GetPhysicalDeviceSurfaceFormatsKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceFormatsKHR") + GetPhysicalDeviceSurfacePresentModes2EXT = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfacePresentModes2EXT") + GetPhysicalDeviceSurfacePresentModesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfacePresentModesKHR") + GetPhysicalDeviceSurfaceSupportKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceSurfaceSupportKHR") + GetPhysicalDeviceToolProperties = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceToolProperties") + GetPhysicalDeviceToolPropertiesEXT = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceToolPropertiesEXT") + GetPhysicalDeviceVideoCapabilitiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceVideoCapabilitiesKHR") + GetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR") + GetPhysicalDeviceVideoFormatPropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceVideoFormatPropertiesKHR") + GetPhysicalDeviceWaylandPresentationSupportKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceWaylandPresentationSupportKHR") + GetPhysicalDeviceWin32PresentationSupportKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceWin32PresentationSupportKHR") + GetPhysicalDeviceXcbPresentationSupportKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceXcbPresentationSupportKHR") + GetPhysicalDeviceXlibPresentationSupportKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceXlibPresentationSupportKHR") + GetWinrtDisplayNV = auto_cast GetInstanceProcAddr(instance, "vkGetWinrtDisplayNV") + ReleaseDisplayEXT = auto_cast GetInstanceProcAddr(instance, "vkReleaseDisplayEXT") + SubmitDebugUtilsMessageEXT = auto_cast GetInstanceProcAddr(instance, "vkSubmitDebugUtilsMessageEXT") // Device Procedures (may call into dispatch) AcquireFullScreenExclusiveModeEXT = auto_cast GetInstanceProcAddr(instance, "vkAcquireFullScreenExclusiveModeEXT") @@ -4081,15 +4680,23 @@ load_proc_addresses_instance :: proc(instance: Instance) { BindBufferMemory = auto_cast GetInstanceProcAddr(instance, "vkBindBufferMemory") BindBufferMemory2 = auto_cast GetInstanceProcAddr(instance, "vkBindBufferMemory2") BindBufferMemory2KHR = auto_cast GetInstanceProcAddr(instance, "vkBindBufferMemory2KHR") + BindDataGraphPipelineSessionMemoryARM = auto_cast GetInstanceProcAddr(instance, "vkBindDataGraphPipelineSessionMemoryARM") BindImageMemory = auto_cast GetInstanceProcAddr(instance, "vkBindImageMemory") BindImageMemory2 = auto_cast GetInstanceProcAddr(instance, "vkBindImageMemory2") BindImageMemory2KHR = auto_cast GetInstanceProcAddr(instance, "vkBindImageMemory2KHR") BindOpticalFlowSessionImageNV = auto_cast GetInstanceProcAddr(instance, "vkBindOpticalFlowSessionImageNV") + BindTensorMemoryARM = auto_cast GetInstanceProcAddr(instance, "vkBindTensorMemoryARM") BindVideoSessionMemoryKHR = auto_cast GetInstanceProcAddr(instance, "vkBindVideoSessionMemoryKHR") BuildAccelerationStructuresKHR = auto_cast GetInstanceProcAddr(instance, "vkBuildAccelerationStructuresKHR") BuildMicromapsEXT = auto_cast GetInstanceProcAddr(instance, "vkBuildMicromapsEXT") + ClearShaderInstrumentationMetricsARM = auto_cast GetInstanceProcAddr(instance, "vkClearShaderInstrumentationMetricsARM") + CmdBeginConditionalRendering2EXT = auto_cast GetInstanceProcAddr(instance, "vkCmdBeginConditionalRendering2EXT") CmdBeginConditionalRenderingEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdBeginConditionalRenderingEXT") + CmdBeginCustomResolveEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdBeginCustomResolveEXT") CmdBeginDebugUtilsLabelEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdBeginDebugUtilsLabelEXT") + CmdBeginGpaSampleAMD = auto_cast GetInstanceProcAddr(instance, "vkCmdBeginGpaSampleAMD") + CmdBeginGpaSessionAMD = auto_cast GetInstanceProcAddr(instance, "vkCmdBeginGpaSessionAMD") + CmdBeginPerTileExecutionQCOM = auto_cast GetInstanceProcAddr(instance, "vkCmdBeginPerTileExecutionQCOM") CmdBeginQuery = auto_cast GetInstanceProcAddr(instance, "vkCmdBeginQuery") CmdBeginQueryIndexedEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdBeginQueryIndexedEXT") CmdBeginRenderPass = auto_cast GetInstanceProcAddr(instance, "vkCmdBeginRenderPass") @@ -4097,6 +4704,8 @@ load_proc_addresses_instance :: proc(instance: Instance) { CmdBeginRenderPass2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdBeginRenderPass2KHR") CmdBeginRendering = auto_cast GetInstanceProcAddr(instance, "vkCmdBeginRendering") CmdBeginRenderingKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdBeginRenderingKHR") + CmdBeginShaderInstrumentationARM = auto_cast GetInstanceProcAddr(instance, "vkCmdBeginShaderInstrumentationARM") + CmdBeginTransformFeedback2EXT = auto_cast GetInstanceProcAddr(instance, "vkCmdBeginTransformFeedback2EXT") CmdBeginTransformFeedbackEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdBeginTransformFeedbackEXT") CmdBeginVideoCodingKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdBeginVideoCodingKHR") CmdBindDescriptorBufferEmbeddedSamplers2EXT = auto_cast GetInstanceProcAddr(instance, "vkCmdBindDescriptorBufferEmbeddedSamplers2EXT") @@ -4108,15 +4717,21 @@ load_proc_addresses_instance :: proc(instance: Instance) { CmdBindIndexBuffer = auto_cast GetInstanceProcAddr(instance, "vkCmdBindIndexBuffer") CmdBindIndexBuffer2 = auto_cast GetInstanceProcAddr(instance, "vkCmdBindIndexBuffer2") CmdBindIndexBuffer2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdBindIndexBuffer2KHR") + CmdBindIndexBuffer3KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdBindIndexBuffer3KHR") CmdBindInvocationMaskHUAWEI = auto_cast GetInstanceProcAddr(instance, "vkCmdBindInvocationMaskHUAWEI") CmdBindPipeline = auto_cast GetInstanceProcAddr(instance, "vkCmdBindPipeline") CmdBindPipelineShaderGroupNV = auto_cast GetInstanceProcAddr(instance, "vkCmdBindPipelineShaderGroupNV") + CmdBindResourceHeapEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdBindResourceHeapEXT") + CmdBindSamplerHeapEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdBindSamplerHeapEXT") CmdBindShadersEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdBindShadersEXT") CmdBindShadingRateImageNV = auto_cast GetInstanceProcAddr(instance, "vkCmdBindShadingRateImageNV") + CmdBindTileMemoryQCOM = auto_cast GetInstanceProcAddr(instance, "vkCmdBindTileMemoryQCOM") + CmdBindTransformFeedbackBuffers2EXT = auto_cast GetInstanceProcAddr(instance, "vkCmdBindTransformFeedbackBuffers2EXT") CmdBindTransformFeedbackBuffersEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdBindTransformFeedbackBuffersEXT") CmdBindVertexBuffers = auto_cast GetInstanceProcAddr(instance, "vkCmdBindVertexBuffers") CmdBindVertexBuffers2 = auto_cast GetInstanceProcAddr(instance, "vkCmdBindVertexBuffers2") CmdBindVertexBuffers2EXT = auto_cast GetInstanceProcAddr(instance, "vkCmdBindVertexBuffers2EXT") + CmdBindVertexBuffers3KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdBindVertexBuffers3KHR") CmdBlitImage = auto_cast GetInstanceProcAddr(instance, "vkCmdBlitImage") CmdBlitImage2 = auto_cast GetInstanceProcAddr(instance, "vkCmdBlitImage2") CmdBlitImage2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdBlitImage2KHR") @@ -4140,48 +4755,68 @@ load_proc_addresses_instance :: proc(instance: Instance) { CmdCopyBufferToImage = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyBufferToImage") CmdCopyBufferToImage2 = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyBufferToImage2") CmdCopyBufferToImage2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyBufferToImage2KHR") + CmdCopyGpaSessionResultsAMD = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyGpaSessionResultsAMD") CmdCopyImage = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyImage") CmdCopyImage2 = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyImage2") CmdCopyImage2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyImage2KHR") CmdCopyImageToBuffer = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyImageToBuffer") CmdCopyImageToBuffer2 = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyImageToBuffer2") CmdCopyImageToBuffer2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyImageToBuffer2KHR") + CmdCopyImageToMemoryKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyImageToMemoryKHR") + CmdCopyMemoryIndirectKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyMemoryIndirectKHR") CmdCopyMemoryIndirectNV = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyMemoryIndirectNV") + CmdCopyMemoryKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyMemoryKHR") CmdCopyMemoryToAccelerationStructureKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyMemoryToAccelerationStructureKHR") + CmdCopyMemoryToImageIndirectKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyMemoryToImageIndirectKHR") CmdCopyMemoryToImageIndirectNV = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyMemoryToImageIndirectNV") + CmdCopyMemoryToImageKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyMemoryToImageKHR") CmdCopyMemoryToMicromapEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyMemoryToMicromapEXT") CmdCopyMicromapEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyMicromapEXT") CmdCopyMicromapToMemoryEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyMicromapToMemoryEXT") CmdCopyQueryPoolResults = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyQueryPoolResults") + CmdCopyQueryPoolResultsToMemoryKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyQueryPoolResultsToMemoryKHR") + CmdCopyTensorARM = auto_cast GetInstanceProcAddr(instance, "vkCmdCopyTensorARM") CmdCuLaunchKernelNVX = auto_cast GetInstanceProcAddr(instance, "vkCmdCuLaunchKernelNVX") CmdCudaLaunchKernelNV = auto_cast GetInstanceProcAddr(instance, "vkCmdCudaLaunchKernelNV") CmdDebugMarkerBeginEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdDebugMarkerBeginEXT") CmdDebugMarkerEndEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdDebugMarkerEndEXT") CmdDebugMarkerInsertEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdDebugMarkerInsertEXT") CmdDecodeVideoKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdDecodeVideoKHR") + CmdDecompressMemoryEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdDecompressMemoryEXT") + CmdDecompressMemoryIndirectCountEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdDecompressMemoryIndirectCountEXT") CmdDecompressMemoryIndirectCountNV = auto_cast GetInstanceProcAddr(instance, "vkCmdDecompressMemoryIndirectCountNV") CmdDecompressMemoryNV = auto_cast GetInstanceProcAddr(instance, "vkCmdDecompressMemoryNV") CmdDispatch = auto_cast GetInstanceProcAddr(instance, "vkCmdDispatch") CmdDispatchBase = auto_cast GetInstanceProcAddr(instance, "vkCmdDispatchBase") CmdDispatchBaseKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdDispatchBaseKHR") + CmdDispatchDataGraphARM = auto_cast GetInstanceProcAddr(instance, "vkCmdDispatchDataGraphARM") CmdDispatchGraphAMDX = auto_cast GetInstanceProcAddr(instance, "vkCmdDispatchGraphAMDX") CmdDispatchGraphIndirectAMDX = auto_cast GetInstanceProcAddr(instance, "vkCmdDispatchGraphIndirectAMDX") CmdDispatchGraphIndirectCountAMDX = auto_cast GetInstanceProcAddr(instance, "vkCmdDispatchGraphIndirectCountAMDX") CmdDispatchIndirect = auto_cast GetInstanceProcAddr(instance, "vkCmdDispatchIndirect") + CmdDispatchIndirect2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdDispatchIndirect2KHR") + CmdDispatchTileQCOM = auto_cast GetInstanceProcAddr(instance, "vkCmdDispatchTileQCOM") CmdDraw = auto_cast GetInstanceProcAddr(instance, "vkCmdDraw") CmdDrawClusterHUAWEI = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawClusterHUAWEI") CmdDrawClusterIndirectHUAWEI = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawClusterIndirectHUAWEI") CmdDrawIndexed = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawIndexed") CmdDrawIndexedIndirect = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawIndexedIndirect") + CmdDrawIndexedIndirect2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawIndexedIndirect2KHR") CmdDrawIndexedIndirectCount = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawIndexedIndirectCount") + CmdDrawIndexedIndirectCount2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawIndexedIndirectCount2KHR") CmdDrawIndexedIndirectCountAMD = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawIndexedIndirectCountAMD") CmdDrawIndexedIndirectCountKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawIndexedIndirectCountKHR") CmdDrawIndirect = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawIndirect") + CmdDrawIndirect2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawIndirect2KHR") + CmdDrawIndirectByteCount2EXT = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawIndirectByteCount2EXT") CmdDrawIndirectByteCountEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawIndirectByteCountEXT") CmdDrawIndirectCount = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawIndirectCount") + CmdDrawIndirectCount2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawIndirectCount2KHR") CmdDrawIndirectCountAMD = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawIndirectCountAMD") CmdDrawIndirectCountKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawIndirectCountKHR") CmdDrawMeshTasksEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawMeshTasksEXT") + CmdDrawMeshTasksIndirect2EXT = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawMeshTasksIndirect2EXT") + CmdDrawMeshTasksIndirectCount2EXT = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawMeshTasksIndirectCount2EXT") CmdDrawMeshTasksIndirectCountEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawMeshTasksIndirectCountEXT") CmdDrawMeshTasksIndirectCountNV = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawMeshTasksIndirectCountNV") CmdDrawMeshTasksIndirectEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdDrawMeshTasksIndirectEXT") @@ -4192,19 +4827,27 @@ load_proc_addresses_instance :: proc(instance: Instance) { CmdEncodeVideoKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdEncodeVideoKHR") CmdEndConditionalRenderingEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdEndConditionalRenderingEXT") CmdEndDebugUtilsLabelEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdEndDebugUtilsLabelEXT") + CmdEndGpaSampleAMD = auto_cast GetInstanceProcAddr(instance, "vkCmdEndGpaSampleAMD") + CmdEndGpaSessionAMD = auto_cast GetInstanceProcAddr(instance, "vkCmdEndGpaSessionAMD") + CmdEndPerTileExecutionQCOM = auto_cast GetInstanceProcAddr(instance, "vkCmdEndPerTileExecutionQCOM") CmdEndQuery = auto_cast GetInstanceProcAddr(instance, "vkCmdEndQuery") CmdEndQueryIndexedEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdEndQueryIndexedEXT") CmdEndRenderPass = auto_cast GetInstanceProcAddr(instance, "vkCmdEndRenderPass") CmdEndRenderPass2 = auto_cast GetInstanceProcAddr(instance, "vkCmdEndRenderPass2") CmdEndRenderPass2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdEndRenderPass2KHR") CmdEndRendering = auto_cast GetInstanceProcAddr(instance, "vkCmdEndRendering") + CmdEndRendering2EXT = auto_cast GetInstanceProcAddr(instance, "vkCmdEndRendering2EXT") + CmdEndRendering2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdEndRendering2KHR") CmdEndRenderingKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdEndRenderingKHR") + CmdEndShaderInstrumentationARM = auto_cast GetInstanceProcAddr(instance, "vkCmdEndShaderInstrumentationARM") + CmdEndTransformFeedback2EXT = auto_cast GetInstanceProcAddr(instance, "vkCmdEndTransformFeedback2EXT") CmdEndTransformFeedbackEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdEndTransformFeedbackEXT") CmdEndVideoCodingKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdEndVideoCodingKHR") CmdExecuteCommands = auto_cast GetInstanceProcAddr(instance, "vkCmdExecuteCommands") CmdExecuteGeneratedCommandsEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdExecuteGeneratedCommandsEXT") CmdExecuteGeneratedCommandsNV = auto_cast GetInstanceProcAddr(instance, "vkCmdExecuteGeneratedCommandsNV") CmdFillBuffer = auto_cast GetInstanceProcAddr(instance, "vkCmdFillBuffer") + CmdFillMemoryKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdFillMemoryKHR") CmdInitializeGraphScratchMemoryAMDX = auto_cast GetInstanceProcAddr(instance, "vkCmdInitializeGraphScratchMemoryAMDX") CmdInsertDebugUtilsLabelEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdInsertDebugUtilsLabelEXT") CmdNextSubpass = auto_cast GetInstanceProcAddr(instance, "vkCmdNextSubpass") @@ -4219,6 +4862,7 @@ load_proc_addresses_instance :: proc(instance: Instance) { CmdPushConstants = auto_cast GetInstanceProcAddr(instance, "vkCmdPushConstants") CmdPushConstants2 = auto_cast GetInstanceProcAddr(instance, "vkCmdPushConstants2") CmdPushConstants2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdPushConstants2KHR") + CmdPushDataEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdPushDataEXT") CmdPushDescriptorSet = auto_cast GetInstanceProcAddr(instance, "vkCmdPushDescriptorSet") CmdPushDescriptorSet2 = auto_cast GetInstanceProcAddr(instance, "vkCmdPushDescriptorSet2") CmdPushDescriptorSet2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdPushDescriptorSet2KHR") @@ -4243,7 +4887,9 @@ load_proc_addresses_instance :: proc(instance: Instance) { CmdSetColorBlendAdvancedEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetColorBlendAdvancedEXT") CmdSetColorBlendEnableEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetColorBlendEnableEXT") CmdSetColorBlendEquationEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetColorBlendEquationEXT") + CmdSetColorWriteEnableEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetColorWriteEnableEXT") CmdSetColorWriteMaskEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetColorWriteMaskEXT") + CmdSetComputeOccupancyPriorityNV = auto_cast GetInstanceProcAddr(instance, "vkCmdSetComputeOccupancyPriorityNV") CmdSetConservativeRasterizationModeEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetConservativeRasterizationModeEXT") CmdSetCoverageModulationModeNV = auto_cast GetInstanceProcAddr(instance, "vkCmdSetCoverageModulationModeNV") CmdSetCoverageModulationTableEnableNV = auto_cast GetInstanceProcAddr(instance, "vkCmdSetCoverageModulationTableEnableNV") @@ -4277,6 +4923,7 @@ load_proc_addresses_instance :: proc(instance: Instance) { CmdSetDiscardRectangleEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetDiscardRectangleEXT") CmdSetDiscardRectangleEnableEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetDiscardRectangleEnableEXT") CmdSetDiscardRectangleModeEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetDiscardRectangleModeEXT") + CmdSetDispatchParametersARM = auto_cast GetInstanceProcAddr(instance, "vkCmdSetDispatchParametersARM") CmdSetEvent = auto_cast GetInstanceProcAddr(instance, "vkCmdSetEvent") CmdSetEvent2 = auto_cast GetInstanceProcAddr(instance, "vkCmdSetEvent2") CmdSetEvent2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdSetEvent2KHR") @@ -4302,6 +4949,7 @@ load_proc_addresses_instance :: proc(instance: Instance) { CmdSetPolygonModeEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetPolygonModeEXT") CmdSetPrimitiveRestartEnable = auto_cast GetInstanceProcAddr(instance, "vkCmdSetPrimitiveRestartEnable") CmdSetPrimitiveRestartEnableEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetPrimitiveRestartEnableEXT") + CmdSetPrimitiveRestartIndexEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetPrimitiveRestartIndexEXT") CmdSetPrimitiveTopology = auto_cast GetInstanceProcAddr(instance, "vkCmdSetPrimitiveTopology") CmdSetPrimitiveTopologyEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetPrimitiveTopologyEXT") CmdSetProvokingVertexModeEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetProvokingVertexModeEXT") @@ -4344,6 +4992,7 @@ load_proc_addresses_instance :: proc(instance: Instance) { CmdTraceRaysKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdTraceRaysKHR") CmdTraceRaysNV = auto_cast GetInstanceProcAddr(instance, "vkCmdTraceRaysNV") CmdUpdateBuffer = auto_cast GetInstanceProcAddr(instance, "vkCmdUpdateBuffer") + CmdUpdateMemoryKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdUpdateMemoryKHR") CmdUpdatePipelineIndirectBufferNV = auto_cast GetInstanceProcAddr(instance, "vkCmdUpdatePipelineIndirectBufferNV") CmdWaitEvents = auto_cast GetInstanceProcAddr(instance, "vkCmdWaitEvents") CmdWaitEvents2 = auto_cast GetInstanceProcAddr(instance, "vkCmdWaitEvents2") @@ -4352,6 +5001,7 @@ load_proc_addresses_instance :: proc(instance: Instance) { CmdWriteAccelerationStructuresPropertiesNV = auto_cast GetInstanceProcAddr(instance, "vkCmdWriteAccelerationStructuresPropertiesNV") CmdWriteBufferMarker2AMD = auto_cast GetInstanceProcAddr(instance, "vkCmdWriteBufferMarker2AMD") CmdWriteBufferMarkerAMD = auto_cast GetInstanceProcAddr(instance, "vkCmdWriteBufferMarkerAMD") + CmdWriteMarkerToMemoryAMD = auto_cast GetInstanceProcAddr(instance, "vkCmdWriteMarkerToMemoryAMD") CmdWriteMicromapsPropertiesEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdWriteMicromapsPropertiesEXT") CmdWriteTimestamp = auto_cast GetInstanceProcAddr(instance, "vkCmdWriteTimestamp") CmdWriteTimestamp2 = auto_cast GetInstanceProcAddr(instance, "vkCmdWriteTimestamp2") @@ -4370,6 +5020,7 @@ load_proc_addresses_instance :: proc(instance: Instance) { CopyMemoryToMicromapEXT = auto_cast GetInstanceProcAddr(instance, "vkCopyMemoryToMicromapEXT") CopyMicromapEXT = auto_cast GetInstanceProcAddr(instance, "vkCopyMicromapEXT") CopyMicromapToMemoryEXT = auto_cast GetInstanceProcAddr(instance, "vkCopyMicromapToMemoryEXT") + CreateAccelerationStructure2KHR = auto_cast GetInstanceProcAddr(instance, "vkCreateAccelerationStructure2KHR") CreateAccelerationStructureKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateAccelerationStructureKHR") CreateAccelerationStructureNV = auto_cast GetInstanceProcAddr(instance, "vkCreateAccelerationStructureNV") CreateBuffer = auto_cast GetInstanceProcAddr(instance, "vkCreateBuffer") @@ -4380,6 +5031,8 @@ load_proc_addresses_instance :: proc(instance: Instance) { CreateCuModuleNVX = auto_cast GetInstanceProcAddr(instance, "vkCreateCuModuleNVX") CreateCudaFunctionNV = auto_cast GetInstanceProcAddr(instance, "vkCreateCudaFunctionNV") CreateCudaModuleNV = auto_cast GetInstanceProcAddr(instance, "vkCreateCudaModuleNV") + CreateDataGraphPipelineSessionARM = auto_cast GetInstanceProcAddr(instance, "vkCreateDataGraphPipelineSessionARM") + CreateDataGraphPipelinesARM = auto_cast GetInstanceProcAddr(instance, "vkCreateDataGraphPipelinesARM") CreateDeferredOperationKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateDeferredOperationKHR") CreateDescriptorPool = auto_cast GetInstanceProcAddr(instance, "vkCreateDescriptorPool") CreateDescriptorSetLayout = auto_cast GetInstanceProcAddr(instance, "vkCreateDescriptorSetLayout") @@ -4387,8 +5040,10 @@ load_proc_addresses_instance :: proc(instance: Instance) { CreateDescriptorUpdateTemplateKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateDescriptorUpdateTemplateKHR") CreateEvent = auto_cast GetInstanceProcAddr(instance, "vkCreateEvent") CreateExecutionGraphPipelinesAMDX = auto_cast GetInstanceProcAddr(instance, "vkCreateExecutionGraphPipelinesAMDX") + CreateExternalComputeQueueNV = auto_cast GetInstanceProcAddr(instance, "vkCreateExternalComputeQueueNV") CreateFence = auto_cast GetInstanceProcAddr(instance, "vkCreateFence") CreateFramebuffer = auto_cast GetInstanceProcAddr(instance, "vkCreateFramebuffer") + CreateGpaSessionAMD = auto_cast GetInstanceProcAddr(instance, "vkCreateGpaSessionAMD") CreateGraphicsPipelines = auto_cast GetInstanceProcAddr(instance, "vkCreateGraphicsPipelines") CreateImage = auto_cast GetInstanceProcAddr(instance, "vkCreateImage") CreateImageView = auto_cast GetInstanceProcAddr(instance, "vkCreateImageView") @@ -4412,10 +5067,13 @@ load_proc_addresses_instance :: proc(instance: Instance) { CreateSamplerYcbcrConversion = auto_cast GetInstanceProcAddr(instance, "vkCreateSamplerYcbcrConversion") CreateSamplerYcbcrConversionKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateSamplerYcbcrConversionKHR") CreateSemaphore = auto_cast GetInstanceProcAddr(instance, "vkCreateSemaphore") + CreateShaderInstrumentationARM = auto_cast GetInstanceProcAddr(instance, "vkCreateShaderInstrumentationARM") CreateShaderModule = auto_cast GetInstanceProcAddr(instance, "vkCreateShaderModule") CreateShadersEXT = auto_cast GetInstanceProcAddr(instance, "vkCreateShadersEXT") CreateSharedSwapchainsKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateSharedSwapchainsKHR") CreateSwapchainKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateSwapchainKHR") + CreateTensorARM = auto_cast GetInstanceProcAddr(instance, "vkCreateTensorARM") + CreateTensorViewARM = auto_cast GetInstanceProcAddr(instance, "vkCreateTensorViewARM") CreateValidationCacheEXT = auto_cast GetInstanceProcAddr(instance, "vkCreateValidationCacheEXT") CreateVideoSessionKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateVideoSessionKHR") CreateVideoSessionParametersKHR = auto_cast GetInstanceProcAddr(instance, "vkCreateVideoSessionParametersKHR") @@ -4431,6 +5089,7 @@ load_proc_addresses_instance :: proc(instance: Instance) { DestroyCuModuleNVX = auto_cast GetInstanceProcAddr(instance, "vkDestroyCuModuleNVX") DestroyCudaFunctionNV = auto_cast GetInstanceProcAddr(instance, "vkDestroyCudaFunctionNV") DestroyCudaModuleNV = auto_cast GetInstanceProcAddr(instance, "vkDestroyCudaModuleNV") + DestroyDataGraphPipelineSessionARM = auto_cast GetInstanceProcAddr(instance, "vkDestroyDataGraphPipelineSessionARM") DestroyDeferredOperationKHR = auto_cast GetInstanceProcAddr(instance, "vkDestroyDeferredOperationKHR") DestroyDescriptorPool = auto_cast GetInstanceProcAddr(instance, "vkDestroyDescriptorPool") DestroyDescriptorSetLayout = auto_cast GetInstanceProcAddr(instance, "vkDestroyDescriptorSetLayout") @@ -4438,8 +5097,10 @@ load_proc_addresses_instance :: proc(instance: Instance) { DestroyDescriptorUpdateTemplateKHR = auto_cast GetInstanceProcAddr(instance, "vkDestroyDescriptorUpdateTemplateKHR") DestroyDevice = auto_cast GetInstanceProcAddr(instance, "vkDestroyDevice") DestroyEvent = auto_cast GetInstanceProcAddr(instance, "vkDestroyEvent") + DestroyExternalComputeQueueNV = auto_cast GetInstanceProcAddr(instance, "vkDestroyExternalComputeQueueNV") DestroyFence = auto_cast GetInstanceProcAddr(instance, "vkDestroyFence") DestroyFramebuffer = auto_cast GetInstanceProcAddr(instance, "vkDestroyFramebuffer") + DestroyGpaSessionAMD = auto_cast GetInstanceProcAddr(instance, "vkDestroyGpaSessionAMD") DestroyImage = auto_cast GetInstanceProcAddr(instance, "vkDestroyImage") DestroyImageView = auto_cast GetInstanceProcAddr(instance, "vkDestroyImageView") DestroyIndirectCommandsLayoutEXT = auto_cast GetInstanceProcAddr(instance, "vkDestroyIndirectCommandsLayoutEXT") @@ -4460,8 +5121,11 @@ load_proc_addresses_instance :: proc(instance: Instance) { DestroySamplerYcbcrConversionKHR = auto_cast GetInstanceProcAddr(instance, "vkDestroySamplerYcbcrConversionKHR") DestroySemaphore = auto_cast GetInstanceProcAddr(instance, "vkDestroySemaphore") DestroyShaderEXT = auto_cast GetInstanceProcAddr(instance, "vkDestroyShaderEXT") + DestroyShaderInstrumentationARM = auto_cast GetInstanceProcAddr(instance, "vkDestroyShaderInstrumentationARM") DestroyShaderModule = auto_cast GetInstanceProcAddr(instance, "vkDestroyShaderModule") DestroySwapchainKHR = auto_cast GetInstanceProcAddr(instance, "vkDestroySwapchainKHR") + DestroyTensorARM = auto_cast GetInstanceProcAddr(instance, "vkDestroyTensorARM") + DestroyTensorViewARM = auto_cast GetInstanceProcAddr(instance, "vkDestroyTensorViewARM") DestroyValidationCacheEXT = auto_cast GetInstanceProcAddr(instance, "vkDestroyValidationCacheEXT") DestroyVideoSessionKHR = auto_cast GetInstanceProcAddr(instance, "vkDestroyVideoSessionKHR") DestroyVideoSessionParametersKHR = auto_cast GetInstanceProcAddr(instance, "vkDestroyVideoSessionParametersKHR") @@ -4491,6 +5155,10 @@ load_proc_addresses_instance :: proc(instance: Instance) { GetCalibratedTimestampsKHR = auto_cast GetInstanceProcAddr(instance, "vkGetCalibratedTimestampsKHR") GetClusterAccelerationStructureBuildSizesNV = auto_cast GetInstanceProcAddr(instance, "vkGetClusterAccelerationStructureBuildSizesNV") GetCudaModuleCacheNV = auto_cast GetInstanceProcAddr(instance, "vkGetCudaModuleCacheNV") + GetDataGraphPipelineAvailablePropertiesARM = auto_cast GetInstanceProcAddr(instance, "vkGetDataGraphPipelineAvailablePropertiesARM") + GetDataGraphPipelinePropertiesARM = auto_cast GetInstanceProcAddr(instance, "vkGetDataGraphPipelinePropertiesARM") + GetDataGraphPipelineSessionBindPointRequirementsARM = auto_cast GetInstanceProcAddr(instance, "vkGetDataGraphPipelineSessionBindPointRequirementsARM") + GetDataGraphPipelineSessionMemoryRequirementsARM = auto_cast GetInstanceProcAddr(instance, "vkGetDataGraphPipelineSessionMemoryRequirementsARM") GetDeferredOperationMaxConcurrencyKHR = auto_cast GetInstanceProcAddr(instance, "vkGetDeferredOperationMaxConcurrencyKHR") GetDeferredOperationResultKHR = auto_cast GetInstanceProcAddr(instance, "vkGetDeferredOperationResultKHR") GetDescriptorEXT = auto_cast GetInstanceProcAddr(instance, "vkGetDescriptorEXT") @@ -4503,7 +5171,10 @@ load_proc_addresses_instance :: proc(instance: Instance) { GetDeviceAccelerationStructureCompatibilityKHR = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceAccelerationStructureCompatibilityKHR") GetDeviceBufferMemoryRequirements = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceBufferMemoryRequirements") GetDeviceBufferMemoryRequirementsKHR = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceBufferMemoryRequirementsKHR") + GetDeviceCombinedImageSamplerIndexNVX = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceCombinedImageSamplerIndexNVX") + GetDeviceFaultDebugInfoKHR = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceFaultDebugInfoKHR") GetDeviceFaultInfoEXT = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceFaultInfoEXT") + GetDeviceFaultReportsKHR = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceFaultReportsKHR") GetDeviceGroupPeerMemoryFeatures = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceGroupPeerMemoryFeatures") GetDeviceGroupPeerMemoryFeaturesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceGroupPeerMemoryFeaturesKHR") GetDeviceGroupPresentCapabilitiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceGroupPresentCapabilitiesKHR") @@ -4523,6 +5194,7 @@ load_proc_addresses_instance :: proc(instance: Instance) { GetDeviceQueue = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceQueue") GetDeviceQueue2 = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceQueue2") GetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceSubpassShadingMaxWorkgroupSizeHUAWEI") + GetDeviceTensorMemoryRequirementsARM = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceTensorMemoryRequirementsARM") GetDynamicRenderingTilePropertiesQCOM = auto_cast GetInstanceProcAddr(instance, "vkGetDynamicRenderingTilePropertiesQCOM") GetEncodedVideoSessionParametersKHR = auto_cast GetInstanceProcAddr(instance, "vkGetEncodedVideoSessionParametersKHR") GetEventStatus = auto_cast GetInstanceProcAddr(instance, "vkGetEventStatus") @@ -4534,10 +5206,14 @@ load_proc_addresses_instance :: proc(instance: Instance) { GetFramebufferTilePropertiesQCOM = auto_cast GetInstanceProcAddr(instance, "vkGetFramebufferTilePropertiesQCOM") GetGeneratedCommandsMemoryRequirementsEXT = auto_cast GetInstanceProcAddr(instance, "vkGetGeneratedCommandsMemoryRequirementsEXT") GetGeneratedCommandsMemoryRequirementsNV = auto_cast GetInstanceProcAddr(instance, "vkGetGeneratedCommandsMemoryRequirementsNV") + GetGpaDeviceClockInfoAMD = auto_cast GetInstanceProcAddr(instance, "vkGetGpaDeviceClockInfoAMD") + GetGpaSessionResultsAMD = auto_cast GetInstanceProcAddr(instance, "vkGetGpaSessionResultsAMD") + GetGpaSessionStatusAMD = auto_cast GetInstanceProcAddr(instance, "vkGetGpaSessionStatusAMD") GetImageDrmFormatModifierPropertiesEXT = auto_cast GetInstanceProcAddr(instance, "vkGetImageDrmFormatModifierPropertiesEXT") GetImageMemoryRequirements = auto_cast GetInstanceProcAddr(instance, "vkGetImageMemoryRequirements") GetImageMemoryRequirements2 = auto_cast GetInstanceProcAddr(instance, "vkGetImageMemoryRequirements2") GetImageMemoryRequirements2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetImageMemoryRequirements2KHR") + GetImageOpaqueCaptureDataEXT = auto_cast GetInstanceProcAddr(instance, "vkGetImageOpaqueCaptureDataEXT") GetImageOpaqueCaptureDescriptorDataEXT = auto_cast GetInstanceProcAddr(instance, "vkGetImageOpaqueCaptureDescriptorDataEXT") GetImageSparseMemoryRequirements = auto_cast GetInstanceProcAddr(instance, "vkGetImageSparseMemoryRequirements") GetImageSparseMemoryRequirements2 = auto_cast GetInstanceProcAddr(instance, "vkGetImageSparseMemoryRequirements2") @@ -4562,6 +5238,7 @@ load_proc_addresses_instance :: proc(instance: Instance) { GetMemoryWin32HandlePropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetMemoryWin32HandlePropertiesKHR") GetMicromapBuildSizesEXT = auto_cast GetInstanceProcAddr(instance, "vkGetMicromapBuildSizesEXT") GetPartitionedAccelerationStructuresBuildSizesNV = auto_cast GetInstanceProcAddr(instance, "vkGetPartitionedAccelerationStructuresBuildSizesNV") + GetPastPresentationTimingEXT = auto_cast GetInstanceProcAddr(instance, "vkGetPastPresentationTimingEXT") GetPastPresentationTimingGOOGLE = auto_cast GetInstanceProcAddr(instance, "vkGetPastPresentationTimingGOOGLE") GetPerformanceParameterINTEL = auto_cast GetInstanceProcAddr(instance, "vkGetPerformanceParameterINTEL") GetPipelineBinaryDataKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPipelineBinaryDataKHR") @@ -4593,11 +5270,18 @@ load_proc_addresses_instance :: proc(instance: Instance) { GetSemaphoreWin32HandleKHR = auto_cast GetInstanceProcAddr(instance, "vkGetSemaphoreWin32HandleKHR") GetShaderBinaryDataEXT = auto_cast GetInstanceProcAddr(instance, "vkGetShaderBinaryDataEXT") GetShaderInfoAMD = auto_cast GetInstanceProcAddr(instance, "vkGetShaderInfoAMD") + GetShaderInstrumentationValuesARM = auto_cast GetInstanceProcAddr(instance, "vkGetShaderInstrumentationValuesARM") GetShaderModuleCreateInfoIdentifierEXT = auto_cast GetInstanceProcAddr(instance, "vkGetShaderModuleCreateInfoIdentifierEXT") GetShaderModuleIdentifierEXT = auto_cast GetInstanceProcAddr(instance, "vkGetShaderModuleIdentifierEXT") GetSwapchainCounterEXT = auto_cast GetInstanceProcAddr(instance, "vkGetSwapchainCounterEXT") GetSwapchainImagesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetSwapchainImagesKHR") GetSwapchainStatusKHR = auto_cast GetInstanceProcAddr(instance, "vkGetSwapchainStatusKHR") + GetSwapchainTimeDomainPropertiesEXT = auto_cast GetInstanceProcAddr(instance, "vkGetSwapchainTimeDomainPropertiesEXT") + GetSwapchainTimingPropertiesEXT = auto_cast GetInstanceProcAddr(instance, "vkGetSwapchainTimingPropertiesEXT") + GetTensorMemoryRequirementsARM = auto_cast GetInstanceProcAddr(instance, "vkGetTensorMemoryRequirementsARM") + GetTensorOpaqueCaptureDataARM = auto_cast GetInstanceProcAddr(instance, "vkGetTensorOpaqueCaptureDataARM") + GetTensorOpaqueCaptureDescriptorDataARM = auto_cast GetInstanceProcAddr(instance, "vkGetTensorOpaqueCaptureDescriptorDataARM") + GetTensorViewOpaqueCaptureDescriptorDataARM = auto_cast GetInstanceProcAddr(instance, "vkGetTensorViewOpaqueCaptureDescriptorDataARM") GetValidationCacheDataEXT = auto_cast GetInstanceProcAddr(instance, "vkGetValidationCacheDataEXT") GetVideoSessionMemoryRequirementsKHR = auto_cast GetInstanceProcAddr(instance, "vkGetVideoSessionMemoryRequirementsKHR") ImportFenceFdKHR = auto_cast GetInstanceProcAddr(instance, "vkImportFenceFdKHR") @@ -4623,6 +5307,7 @@ load_proc_addresses_instance :: proc(instance: Instance) { QueueSubmit2 = auto_cast GetInstanceProcAddr(instance, "vkQueueSubmit2") QueueSubmit2KHR = auto_cast GetInstanceProcAddr(instance, "vkQueueSubmit2KHR") QueueWaitIdle = auto_cast GetInstanceProcAddr(instance, "vkQueueWaitIdle") + RegisterCustomBorderColorEXT = auto_cast GetInstanceProcAddr(instance, "vkRegisterCustomBorderColorEXT") RegisterDeviceEventEXT = auto_cast GetInstanceProcAddr(instance, "vkRegisterDeviceEventEXT") RegisterDisplayEventEXT = auto_cast GetInstanceProcAddr(instance, "vkRegisterDisplayEventEXT") ReleaseCapturedPipelineDataKHR = auto_cast GetInstanceProcAddr(instance, "vkReleaseCapturedPipelineDataKHR") @@ -4630,23 +5315,27 @@ load_proc_addresses_instance :: proc(instance: Instance) { ReleasePerformanceConfigurationINTEL = auto_cast GetInstanceProcAddr(instance, "vkReleasePerformanceConfigurationINTEL") ReleaseProfilingLockKHR = auto_cast GetInstanceProcAddr(instance, "vkReleaseProfilingLockKHR") ReleaseSwapchainImagesEXT = auto_cast GetInstanceProcAddr(instance, "vkReleaseSwapchainImagesEXT") + ReleaseSwapchainImagesKHR = auto_cast GetInstanceProcAddr(instance, "vkReleaseSwapchainImagesKHR") ResetCommandBuffer = auto_cast GetInstanceProcAddr(instance, "vkResetCommandBuffer") ResetCommandPool = auto_cast GetInstanceProcAddr(instance, "vkResetCommandPool") ResetDescriptorPool = auto_cast GetInstanceProcAddr(instance, "vkResetDescriptorPool") ResetEvent = auto_cast GetInstanceProcAddr(instance, "vkResetEvent") ResetFences = auto_cast GetInstanceProcAddr(instance, "vkResetFences") + ResetGpaSessionAMD = auto_cast GetInstanceProcAddr(instance, "vkResetGpaSessionAMD") ResetQueryPool = auto_cast GetInstanceProcAddr(instance, "vkResetQueryPool") ResetQueryPoolEXT = auto_cast GetInstanceProcAddr(instance, "vkResetQueryPoolEXT") SetDebugUtilsObjectNameEXT = auto_cast GetInstanceProcAddr(instance, "vkSetDebugUtilsObjectNameEXT") SetDebugUtilsObjectTagEXT = auto_cast GetInstanceProcAddr(instance, "vkSetDebugUtilsObjectTagEXT") SetDeviceMemoryPriorityEXT = auto_cast GetInstanceProcAddr(instance, "vkSetDeviceMemoryPriorityEXT") SetEvent = auto_cast GetInstanceProcAddr(instance, "vkSetEvent") + SetGpaDeviceClockModeAMD = auto_cast GetInstanceProcAddr(instance, "vkSetGpaDeviceClockModeAMD") SetHdrMetadataEXT = auto_cast GetInstanceProcAddr(instance, "vkSetHdrMetadataEXT") SetLatencyMarkerNV = auto_cast GetInstanceProcAddr(instance, "vkSetLatencyMarkerNV") SetLatencySleepModeNV = auto_cast GetInstanceProcAddr(instance, "vkSetLatencySleepModeNV") SetLocalDimmingAMD = auto_cast GetInstanceProcAddr(instance, "vkSetLocalDimmingAMD") SetPrivateData = auto_cast GetInstanceProcAddr(instance, "vkSetPrivateData") SetPrivateDataEXT = auto_cast GetInstanceProcAddr(instance, "vkSetPrivateDataEXT") + SetSwapchainPresentTimingQueueSizeEXT = auto_cast GetInstanceProcAddr(instance, "vkSetSwapchainPresentTimingQueueSizeEXT") SignalSemaphore = auto_cast GetInstanceProcAddr(instance, "vkSignalSemaphore") SignalSemaphoreKHR = auto_cast GetInstanceProcAddr(instance, "vkSignalSemaphoreKHR") TransitionImageLayout = auto_cast GetInstanceProcAddr(instance, "vkTransitionImageLayout") @@ -4657,6 +5346,7 @@ load_proc_addresses_instance :: proc(instance: Instance) { UnmapMemory = auto_cast GetInstanceProcAddr(instance, "vkUnmapMemory") UnmapMemory2 = auto_cast GetInstanceProcAddr(instance, "vkUnmapMemory2") UnmapMemory2KHR = auto_cast GetInstanceProcAddr(instance, "vkUnmapMemory2KHR") + UnregisterCustomBorderColorEXT = auto_cast GetInstanceProcAddr(instance, "vkUnregisterCustomBorderColorEXT") UpdateDescriptorSetWithTemplate = auto_cast GetInstanceProcAddr(instance, "vkUpdateDescriptorSetWithTemplate") UpdateDescriptorSetWithTemplateKHR = auto_cast GetInstanceProcAddr(instance, "vkUpdateDescriptorSetWithTemplateKHR") UpdateDescriptorSets = auto_cast GetInstanceProcAddr(instance, "vkUpdateDescriptorSets") @@ -4664,11 +5354,14 @@ load_proc_addresses_instance :: proc(instance: Instance) { UpdateIndirectExecutionSetShaderEXT = auto_cast GetInstanceProcAddr(instance, "vkUpdateIndirectExecutionSetShaderEXT") UpdateVideoSessionParametersKHR = auto_cast GetInstanceProcAddr(instance, "vkUpdateVideoSessionParametersKHR") WaitForFences = auto_cast GetInstanceProcAddr(instance, "vkWaitForFences") + WaitForPresent2KHR = auto_cast GetInstanceProcAddr(instance, "vkWaitForPresent2KHR") WaitForPresentKHR = auto_cast GetInstanceProcAddr(instance, "vkWaitForPresentKHR") WaitSemaphores = auto_cast GetInstanceProcAddr(instance, "vkWaitSemaphores") WaitSemaphoresKHR = auto_cast GetInstanceProcAddr(instance, "vkWaitSemaphoresKHR") WriteAccelerationStructuresPropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkWriteAccelerationStructuresPropertiesKHR") WriteMicromapsPropertiesEXT = auto_cast GetInstanceProcAddr(instance, "vkWriteMicromapsPropertiesEXT") + WriteResourceDescriptorsEXT = auto_cast GetInstanceProcAddr(instance, "vkWriteResourceDescriptorsEXT") + WriteSamplerDescriptorsEXT = auto_cast GetInstanceProcAddr(instance, "vkWriteSamplerDescriptorsEXT") } load_proc_addresses_global :: proc(vk_get_instance_proc_addr: rawptr) { @@ -4680,6 +5373,7 @@ load_proc_addresses_global :: proc(vk_get_instance_proc_addr: rawptr) { EnumerateInstanceExtensionProperties = auto_cast GetInstanceProcAddr(nil, "vkEnumerateInstanceExtensionProperties") EnumerateInstanceLayerProperties = auto_cast GetInstanceProcAddr(nil, "vkEnumerateInstanceLayerProperties") EnumerateInstanceVersion = auto_cast GetInstanceProcAddr(nil, "vkEnumerateInstanceVersion") + GetExternalComputeQueueDataNV = auto_cast GetInstanceProcAddr(nil, "vkGetExternalComputeQueueDataNV") GetInstanceProcAddr = auto_cast GetInstanceProcAddr(nil, "vkGetInstanceProcAddr") } diff --git a/vendor/vulkan/structs.odin b/vendor/vulkan/structs.odin index 5391b3319..bae689c0a 100644 --- a/vendor/vulkan/structs.odin +++ b/vendor/vulkan/structs.odin @@ -92,75 +92,6 @@ BaseOutStructure :: struct { pNext: ^BaseOutStructure, } -BufferMemoryBarrier :: struct { - sType: StructureType, - pNext: rawptr, - srcAccessMask: AccessFlags, - dstAccessMask: AccessFlags, - srcQueueFamilyIndex: u32, - dstQueueFamilyIndex: u32, - buffer: Buffer, - offset: DeviceSize, - size: DeviceSize, -} - -DispatchIndirectCommand :: struct { - x: u32, - y: u32, - z: u32, -} - -DrawIndexedIndirectCommand :: struct { - indexCount: u32, - instanceCount: u32, - firstIndex: u32, - vertexOffset: i32, - firstInstance: u32, -} - -DrawIndirectCommand :: struct { - vertexCount: u32, - instanceCount: u32, - firstVertex: u32, - firstInstance: u32, -} - -ImageSubresourceRange :: struct { - aspectMask: ImageAspectFlags, - baseMipLevel: u32, - levelCount: u32, - baseArrayLayer: u32, - layerCount: u32, -} - -ImageMemoryBarrier :: struct { - sType: StructureType, - pNext: rawptr, - srcAccessMask: AccessFlags, - dstAccessMask: AccessFlags, - oldLayout: ImageLayout, - newLayout: ImageLayout, - srcQueueFamilyIndex: u32, - dstQueueFamilyIndex: u32, - image: Image, - subresourceRange: ImageSubresourceRange, -} - -MemoryBarrier :: struct { - sType: StructureType, - pNext: rawptr, - srcAccessMask: AccessFlags, - dstAccessMask: AccessFlags, -} - -PipelineCacheHeaderVersionOne :: struct { - headerSize: u32, - headerVersion: PipelineCacheHeaderVersion, - vendorID: u32, - deviceID: u32, - pipelineCacheUUID: [UUID_SIZE]u8, -} - AllocationCallbacks :: struct { pUserData: rawptr, pfnAllocation: ProcAllocationFunction, @@ -483,6 +414,41 @@ MemoryRequirements :: struct { memoryTypeBits: u32, } +ImageSubresource :: struct { + aspectMask: ImageAspectFlags, + mipLevel: u32, + arrayLayer: u32, +} + +SparseImageFormatProperties :: struct { + aspectMask: ImageAspectFlags, + imageGranularity: Extent3D, + flags: SparseImageFormatFlags, +} + +SparseImageMemoryBind :: struct { + subresource: ImageSubresource, + offset: Offset3D, + extent: Extent3D, + memory: DeviceMemory, + memoryOffset: DeviceSize, + flags: SparseMemoryBindFlags, +} + +SparseImageMemoryBindInfo :: struct { + image: Image, + bindCount: u32, + pBinds: [^]SparseImageMemoryBind, +} + +SparseImageMemoryRequirements :: struct { + formatProperties: SparseImageFormatProperties, + imageMipTailFirstLod: u32, + imageMipTailSize: DeviceSize, + imageMipTailOffset: DeviceSize, + imageMipTailStride: DeviceSize, +} + SparseMemoryBind :: struct { resourceOffset: DeviceSize, size: DeviceSize, @@ -503,27 +469,6 @@ SparseImageOpaqueMemoryBindInfo :: struct { pBinds: [^]SparseMemoryBind, } -ImageSubresource :: struct { - aspectMask: ImageAspectFlags, - mipLevel: u32, - arrayLayer: u32, -} - -SparseImageMemoryBind :: struct { - subresource: ImageSubresource, - offset: Offset3D, - extent: Extent3D, - memory: DeviceMemory, - memoryOffset: DeviceSize, - flags: SparseMemoryBindFlags, -} - -SparseImageMemoryBindInfo :: struct { - image: Image, - bindCount: u32, - pBinds: [^]SparseImageMemoryBind, -} - BindSparseInfo :: struct { sType: StructureType, pNext: rawptr, @@ -539,20 +484,6 @@ BindSparseInfo :: struct { pSignalSemaphores: [^]Semaphore, } -SparseImageFormatProperties :: struct { - aspectMask: ImageAspectFlags, - imageGranularity: Extent3D, - flags: SparseImageFormatFlags, -} - -SparseImageMemoryRequirements :: struct { - formatProperties: SparseImageFormatProperties, - imageMipTailFirstLod: u32, - imageMipTailSize: DeviceSize, - imageMipTailOffset: DeviceSize, - imageMipTailStride: DeviceSize, -} - FenceCreateInfo :: struct { sType: StructureType, pNext: rawptr, @@ -565,12 +496,6 @@ SemaphoreCreateInfo :: struct { flags: SemaphoreCreateFlags, } -EventCreateInfo :: struct { - sType: StructureType, - pNext: rawptr, - flags: EventCreateFlags, -} - QueryPoolCreateInfo :: struct { sType: StructureType, pNext: rawptr, @@ -591,16 +516,6 @@ BufferCreateInfo :: struct { pQueueFamilyIndices: [^]u32, } -BufferViewCreateInfo :: struct { - sType: StructureType, - pNext: rawptr, - flags: BufferViewCreateFlags, - buffer: Buffer, - format: Format, - offset: DeviceSize, - range: DeviceSize, -} - ImageCreateInfo :: struct { sType: StructureType, pNext: rawptr, @@ -634,6 +549,14 @@ ComponentMapping :: struct { a: ComponentSwizzle, } +ImageSubresourceRange :: struct { + aspectMask: ImageAspectFlags, + baseMipLevel: u32, + levelCount: u32, + baseArrayLayer: u32, + layerCount: u32, +} + ImageViewCreateInfo :: struct { sType: StructureType, pNext: rawptr, @@ -645,6 +568,131 @@ ImageViewCreateInfo :: struct { subresourceRange: ImageSubresourceRange, } +CommandPoolCreateInfo :: struct { + sType: StructureType, + pNext: rawptr, + flags: CommandPoolCreateFlags, + queueFamilyIndex: u32, +} + +CommandBufferAllocateInfo :: struct { + sType: StructureType, + pNext: rawptr, + commandPool: CommandPool, + level: CommandBufferLevel, + commandBufferCount: u32, +} + +CommandBufferInheritanceInfo :: struct { + sType: StructureType, + pNext: rawptr, + renderPass: RenderPass, + subpass: u32, + framebuffer: Framebuffer, + occlusionQueryEnable: b32, + queryFlags: QueryControlFlags, + pipelineStatistics: QueryPipelineStatisticFlags, +} + +CommandBufferBeginInfo :: struct { + sType: StructureType, + pNext: rawptr, + flags: CommandBufferUsageFlags, + pInheritanceInfo: ^CommandBufferInheritanceInfo, +} + +BufferCopy :: struct { + srcOffset: DeviceSize, + dstOffset: DeviceSize, + size: DeviceSize, +} + +ImageSubresourceLayers :: struct { + aspectMask: ImageAspectFlags, + mipLevel: u32, + baseArrayLayer: u32, + layerCount: u32, +} + +BufferImageCopy :: struct { + bufferOffset: DeviceSize, + bufferRowLength: u32, + bufferImageHeight: u32, + imageSubresource: ImageSubresourceLayers, + imageOffset: Offset3D, + imageExtent: Extent3D, +} + +ImageCopy :: struct { + srcSubresource: ImageSubresourceLayers, + srcOffset: Offset3D, + dstSubresource: ImageSubresourceLayers, + dstOffset: Offset3D, + extent: Extent3D, +} + +BufferMemoryBarrier :: struct { + sType: StructureType, + pNext: rawptr, + srcAccessMask: AccessFlags, + dstAccessMask: AccessFlags, + srcQueueFamilyIndex: u32, + dstQueueFamilyIndex: u32, + buffer: Buffer, + offset: DeviceSize, + size: DeviceSize, +} + +ImageMemoryBarrier :: struct { + sType: StructureType, + pNext: rawptr, + srcAccessMask: AccessFlags, + dstAccessMask: AccessFlags, + oldLayout: ImageLayout, + newLayout: ImageLayout, + srcQueueFamilyIndex: u32, + dstQueueFamilyIndex: u32, + image: Image, + subresourceRange: ImageSubresourceRange, +} + +MemoryBarrier :: struct { + sType: StructureType, + pNext: rawptr, + srcAccessMask: AccessFlags, + dstAccessMask: AccessFlags, +} + +DispatchIndirectCommand :: struct { + x: u32, + y: u32, + z: u32, +} + +PipelineCacheHeaderVersionOne :: struct { + headerSize: u32, + headerVersion: PipelineCacheHeaderVersion, + vendorID: u32, + deviceID: u32, + pipelineCacheUUID: [UUID_SIZE]u8, +} + +EventCreateInfo :: struct { + sType: StructureType, + pNext: rawptr, + flags: EventCreateFlags, +} + +BufferViewCreateInfo :: struct { + sType: StructureType, + pNext: rawptr, + flags: BufferViewCreateFlags, + buffer: Buffer, + format: Format, + offset: DeviceSize, + range: DeviceSize, +} + ShaderModuleCreateInfo :: struct { sType: StructureType, pNext: rawptr, @@ -694,168 +742,6 @@ ComputePipelineCreateInfo :: struct { basePipelineIndex: i32, } -VertexInputBindingDescription :: struct { - binding: u32, - stride: u32, - inputRate: VertexInputRate, -} - -VertexInputAttributeDescription :: struct { - location: u32, - binding: u32, - format: Format, - offset: u32, -} - -PipelineVertexInputStateCreateInfo :: struct { - sType: StructureType, - pNext: rawptr, - flags: PipelineVertexInputStateCreateFlags, - vertexBindingDescriptionCount: u32, - pVertexBindingDescriptions: [^]VertexInputBindingDescription, - vertexAttributeDescriptionCount: u32, - pVertexAttributeDescriptions: [^]VertexInputAttributeDescription, -} - -PipelineInputAssemblyStateCreateInfo :: struct { - sType: StructureType, - pNext: rawptr, - flags: PipelineInputAssemblyStateCreateFlags, - topology: PrimitiveTopology, - primitiveRestartEnable: b32, -} - -PipelineTessellationStateCreateInfo :: struct { - sType: StructureType, - pNext: rawptr, - flags: PipelineTessellationStateCreateFlags, - patchControlPoints: u32, -} - -Viewport :: struct { - x: f32, - y: f32, - width: f32, - height: f32, - minDepth: f32, - maxDepth: f32, -} - -PipelineViewportStateCreateInfo :: struct { - sType: StructureType, - pNext: rawptr, - flags: PipelineViewportStateCreateFlags, - viewportCount: u32, - pViewports: [^]Viewport, - scissorCount: u32, - pScissors: [^]Rect2D, -} - -PipelineRasterizationStateCreateInfo :: struct { - sType: StructureType, - pNext: rawptr, - flags: PipelineRasterizationStateCreateFlags, - depthClampEnable: b32, - rasterizerDiscardEnable: b32, - polygonMode: PolygonMode, - cullMode: CullModeFlags, - frontFace: FrontFace, - depthBiasEnable: b32, - depthBiasConstantFactor: f32, - depthBiasClamp: f32, - depthBiasSlopeFactor: f32, - lineWidth: f32, -} - -PipelineMultisampleStateCreateInfo :: struct { - sType: StructureType, - pNext: rawptr, - flags: PipelineMultisampleStateCreateFlags, - rasterizationSamples: SampleCountFlags, - sampleShadingEnable: b32, - minSampleShading: f32, - pSampleMask: ^SampleMask, - alphaToCoverageEnable: b32, - alphaToOneEnable: b32, -} - -StencilOpState :: struct { - failOp: StencilOp, - passOp: StencilOp, - depthFailOp: StencilOp, - compareOp: CompareOp, - compareMask: u32, - writeMask: u32, - reference: u32, -} - -PipelineDepthStencilStateCreateInfo :: struct { - sType: StructureType, - pNext: rawptr, - flags: PipelineDepthStencilStateCreateFlags, - depthTestEnable: b32, - depthWriteEnable: b32, - depthCompareOp: CompareOp, - depthBoundsTestEnable: b32, - stencilTestEnable: b32, - front: StencilOpState, - back: StencilOpState, - minDepthBounds: f32, - maxDepthBounds: f32, -} - -PipelineColorBlendAttachmentState :: struct { - blendEnable: b32, - srcColorBlendFactor: BlendFactor, - dstColorBlendFactor: BlendFactor, - colorBlendOp: BlendOp, - srcAlphaBlendFactor: BlendFactor, - dstAlphaBlendFactor: BlendFactor, - alphaBlendOp: BlendOp, - colorWriteMask: ColorComponentFlags, -} - -PipelineColorBlendStateCreateInfo :: struct { - sType: StructureType, - pNext: rawptr, - flags: PipelineColorBlendStateCreateFlags, - logicOpEnable: b32, - logicOp: LogicOp, - attachmentCount: u32, - pAttachments: [^]PipelineColorBlendAttachmentState, - blendConstants: [4]f32, -} - -PipelineDynamicStateCreateInfo :: struct { - sType: StructureType, - pNext: rawptr, - flags: PipelineDynamicStateCreateFlags, - dynamicStateCount: u32, - pDynamicStates: [^]DynamicState, -} - -GraphicsPipelineCreateInfo :: struct { - sType: StructureType, - pNext: rawptr, - flags: PipelineCreateFlags, - stageCount: u32, - pStages: [^]PipelineShaderStageCreateInfo, - pVertexInputState: ^PipelineVertexInputStateCreateInfo, - pInputAssemblyState: ^PipelineInputAssemblyStateCreateInfo, - pTessellationState: ^PipelineTessellationStateCreateInfo, - pViewportState: ^PipelineViewportStateCreateInfo, - pRasterizationState: ^PipelineRasterizationStateCreateInfo, - pMultisampleState: ^PipelineMultisampleStateCreateInfo, - pDepthStencilState: ^PipelineDepthStencilStateCreateInfo, - pColorBlendState: ^PipelineColorBlendStateCreateInfo, - pDynamicState: ^PipelineDynamicStateCreateInfo, - layout: PipelineLayout, - renderPass: RenderPass, - subpass: u32, - basePipelineHandle: Pipeline, - basePipelineIndex: i32, -} - PushConstantRange :: struct { stageFlags: ShaderStageFlags, offset: u32, @@ -968,6 +854,189 @@ WriteDescriptorSet :: struct { pTexelBufferView: ^BufferView, } +ClearColorValue :: struct #raw_union { + float32: [4]f32, + int32: [4]i32, + uint32: [4]u32, +} + +DrawIndexedIndirectCommand :: struct { + indexCount: u32, + instanceCount: u32, + firstIndex: u32, + vertexOffset: i32, + firstInstance: u32, +} + +DrawIndirectCommand :: struct { + vertexCount: u32, + instanceCount: u32, + firstVertex: u32, + firstInstance: u32, +} + +StencilOpState :: struct { + failOp: StencilOp, + passOp: StencilOp, + depthFailOp: StencilOp, + compareOp: CompareOp, + compareMask: u32, + writeMask: u32, + reference: u32, +} + +VertexInputAttributeDescription :: struct { + location: u32, + binding: u32, + format: Format, + offset: u32, +} + +VertexInputBindingDescription :: struct { + binding: u32, + stride: u32, + inputRate: VertexInputRate, +} + +Viewport :: struct { + x: f32, + y: f32, + width: f32, + height: f32, + minDepth: f32, + maxDepth: f32, +} + +PipelineColorBlendAttachmentState :: struct { + blendEnable: b32, + srcColorBlendFactor: BlendFactor, + dstColorBlendFactor: BlendFactor, + colorBlendOp: BlendOp, + srcAlphaBlendFactor: BlendFactor, + dstAlphaBlendFactor: BlendFactor, + alphaBlendOp: BlendOp, + colorWriteMask: ColorComponentFlags, +} + +PipelineColorBlendStateCreateInfo :: struct { + sType: StructureType, + pNext: rawptr, + flags: PipelineColorBlendStateCreateFlags, + logicOpEnable: b32, + logicOp: LogicOp, + attachmentCount: u32, + pAttachments: [^]PipelineColorBlendAttachmentState, + blendConstants: [4]f32, +} + +PipelineDepthStencilStateCreateInfo :: struct { + sType: StructureType, + pNext: rawptr, + flags: PipelineDepthStencilStateCreateFlags, + depthTestEnable: b32, + depthWriteEnable: b32, + depthCompareOp: CompareOp, + depthBoundsTestEnable: b32, + stencilTestEnable: b32, + front: StencilOpState, + back: StencilOpState, + minDepthBounds: f32, + maxDepthBounds: f32, +} + +PipelineDynamicStateCreateInfo :: struct { + sType: StructureType, + pNext: rawptr, + flags: PipelineDynamicStateCreateFlags, + dynamicStateCount: u32, + pDynamicStates: [^]DynamicState, +} + +PipelineInputAssemblyStateCreateInfo :: struct { + sType: StructureType, + pNext: rawptr, + flags: PipelineInputAssemblyStateCreateFlags, + topology: PrimitiveTopology, + primitiveRestartEnable: b32, +} + +PipelineMultisampleStateCreateInfo :: struct { + sType: StructureType, + pNext: rawptr, + flags: PipelineMultisampleStateCreateFlags, + rasterizationSamples: SampleCountFlags, + sampleShadingEnable: b32, + minSampleShading: f32, + pSampleMask: ^SampleMask, + alphaToCoverageEnable: b32, + alphaToOneEnable: b32, +} + +PipelineRasterizationStateCreateInfo :: struct { + sType: StructureType, + pNext: rawptr, + flags: PipelineRasterizationStateCreateFlags, + depthClampEnable: b32, + rasterizerDiscardEnable: b32, + polygonMode: PolygonMode, + cullMode: CullModeFlags, + frontFace: FrontFace, + depthBiasEnable: b32, + depthBiasConstantFactor: f32, + depthBiasClamp: f32, + depthBiasSlopeFactor: f32, + lineWidth: f32, +} + +PipelineTessellationStateCreateInfo :: struct { + sType: StructureType, + pNext: rawptr, + flags: PipelineTessellationStateCreateFlags, + patchControlPoints: u32, +} + +PipelineVertexInputStateCreateInfo :: struct { + sType: StructureType, + pNext: rawptr, + flags: PipelineVertexInputStateCreateFlags, + vertexBindingDescriptionCount: u32, + pVertexBindingDescriptions: [^]VertexInputBindingDescription, + vertexAttributeDescriptionCount: u32, + pVertexAttributeDescriptions: [^]VertexInputAttributeDescription, +} + +PipelineViewportStateCreateInfo :: struct { + sType: StructureType, + pNext: rawptr, + flags: PipelineViewportStateCreateFlags, + viewportCount: u32, + pViewports: [^]Viewport, + scissorCount: u32, + pScissors: [^]Rect2D, +} + +GraphicsPipelineCreateInfo :: struct { + sType: StructureType, + pNext: rawptr, + flags: PipelineCreateFlags, + stageCount: u32, + pStages: [^]PipelineShaderStageCreateInfo, + pVertexInputState: ^PipelineVertexInputStateCreateInfo, + pInputAssemblyState: ^PipelineInputAssemblyStateCreateInfo, + pTessellationState: ^PipelineTessellationStateCreateInfo, + pViewportState: ^PipelineViewportStateCreateInfo, + pRasterizationState: ^PipelineRasterizationStateCreateInfo, + pMultisampleState: ^PipelineMultisampleStateCreateInfo, + pDepthStencilState: ^PipelineDepthStencilStateCreateInfo, + pColorBlendState: ^PipelineColorBlendStateCreateInfo, + pDynamicState: ^PipelineDynamicStateCreateInfo, + layout: PipelineLayout, + renderPass: RenderPass, + subpass: u32, + basePipelineHandle: Pipeline, + basePipelineIndex: i32, +} + AttachmentDescription :: struct { flags: AttachmentDescriptionFlags, format: Format, @@ -997,6 +1066,16 @@ FramebufferCreateInfo :: struct { layers: u32, } +SubpassDependency :: struct { + srcSubpass: u32, + dstSubpass: u32, + srcStageMask: PipelineStageFlags, + dstStageMask: PipelineStageFlags, + srcAccessMask: AccessFlags, + dstAccessMask: AccessFlags, + dependencyFlags: DependencyFlags, +} + SubpassDescription :: struct { flags: SubpassDescriptionFlags, pipelineBindPoint: PipelineBindPoint, @@ -1010,16 +1089,6 @@ SubpassDescription :: struct { pPreserveAttachments: [^]u32, } -SubpassDependency :: struct { - srcSubpass: u32, - dstSubpass: u32, - srcStageMask: PipelineStageFlags, - dstStageMask: PipelineStageFlags, - srcAccessMask: AccessFlags, - dstAccessMask: AccessFlags, - dependencyFlags: DependencyFlags, -} - RenderPassCreateInfo :: struct { sType: StructureType, pNext: rawptr, @@ -1032,72 +1101,17 @@ RenderPassCreateInfo :: struct { pDependencies: [^]SubpassDependency, } -CommandPoolCreateInfo :: struct { - sType: StructureType, - pNext: rawptr, - flags: CommandPoolCreateFlags, - queueFamilyIndex: u32, -} - -CommandBufferAllocateInfo :: struct { - sType: StructureType, - pNext: rawptr, - commandPool: CommandPool, - level: CommandBufferLevel, - commandBufferCount: u32, -} - -CommandBufferInheritanceInfo :: struct { - sType: StructureType, - pNext: rawptr, - renderPass: RenderPass, - subpass: u32, - framebuffer: Framebuffer, - occlusionQueryEnable: b32, - queryFlags: QueryControlFlags, - pipelineStatistics: QueryPipelineStatisticFlags, -} - -CommandBufferBeginInfo :: struct { - sType: StructureType, - pNext: rawptr, - flags: CommandBufferUsageFlags, - pInheritanceInfo: ^CommandBufferInheritanceInfo, -} - -BufferCopy :: struct { - srcOffset: DeviceSize, - dstOffset: DeviceSize, - size: DeviceSize, -} - -ImageSubresourceLayers :: struct { - aspectMask: ImageAspectFlags, - mipLevel: u32, - baseArrayLayer: u32, - layerCount: u32, -} - -BufferImageCopy :: struct { - bufferOffset: DeviceSize, - bufferRowLength: u32, - bufferImageHeight: u32, - imageSubresource: ImageSubresourceLayers, - imageOffset: Offset3D, - imageExtent: Extent3D, -} - -ClearColorValue :: struct #raw_union { - float32: [4]f32, - int32: [4]i32, - uint32: [4]u32, -} - ClearDepthStencilValue :: struct { depth: f32, stencil: u32, } +ClearRect :: struct { + rect: Rect2D, + baseArrayLayer: u32, + layerCount: u32, +} + ClearValue :: struct #raw_union { color: ClearColorValue, depthStencil: ClearDepthStencilValue, @@ -1109,12 +1123,6 @@ ClearAttachment :: struct { clearValue: ClearValue, } -ClearRect :: struct { - rect: Rect2D, - baseArrayLayer: u32, - layerCount: u32, -} - ImageBlit :: struct { srcSubresource: ImageSubresourceLayers, srcOffsets: [2]Offset3D, @@ -1122,14 +1130,6 @@ ImageBlit :: struct { dstOffsets: [2]Offset3D, } -ImageCopy :: struct { - srcSubresource: ImageSubresourceLayers, - srcOffset: Offset3D, - dstSubresource: ImageSubresourceLayers, - dstOffset: Offset3D, - extent: Extent3D, -} - ImageResolve :: struct { srcSubresource: ImageSubresourceLayers, srcOffset: Offset3D, @@ -1148,15 +1148,6 @@ RenderPassBeginInfo :: struct { pClearValues: [^]ClearValue, } -PhysicalDeviceSubgroupProperties :: struct { - sType: StructureType, - pNext: rawptr, - subgroupSize: u32, - supportedStages: ShaderStageFlags, - supportedOperations: SubgroupFeatureFlags, - quadOperationsInAllStages: b32, -} - BindBufferMemoryInfo :: struct { sType: StructureType, pNext: rawptr, @@ -1173,15 +1164,6 @@ BindImageMemoryInfo :: struct { memoryOffset: DeviceSize, } -PhysicalDevice16BitStorageFeatures :: struct { - sType: StructureType, - pNext: rawptr, - storageBuffer16BitAccess: b32, - uniformAndStorageBuffer16BitAccess: b32, - storagePushConstant16: b32, - storageInputOutput16: b32, -} - MemoryDedicatedRequirements :: struct { sType: StructureType, pNext: rawptr, @@ -1203,14 +1185,6 @@ MemoryAllocateFlagsInfo :: struct { deviceMask: u32, } -DeviceGroupRenderPassBeginInfo :: struct { - sType: StructureType, - pNext: rawptr, - deviceMask: u32, - deviceRenderAreaCount: u32, - pDeviceRenderAreas: [^]Rect2D, -} - DeviceGroupCommandBufferBeginInfo :: struct { sType: StructureType, pNext: rawptr, @@ -1358,70 +1332,12 @@ PhysicalDeviceSparseImageFormatInfo2 :: struct { tiling: ImageTiling, } -PhysicalDevicePointClippingProperties :: struct { - sType: StructureType, - pNext: rawptr, - pointClippingBehavior: PointClippingBehavior, -} - -InputAttachmentAspectReference :: struct { - subpass: u32, - inputAttachmentIndex: u32, - aspectMask: ImageAspectFlags, -} - -RenderPassInputAttachmentAspectCreateInfo :: struct { - sType: StructureType, - pNext: rawptr, - aspectReferenceCount: u32, - pAspectReferences: [^]InputAttachmentAspectReference, -} - ImageViewUsageCreateInfo :: struct { sType: StructureType, pNext: rawptr, usage: ImageUsageFlags, } -PipelineTessellationDomainOriginStateCreateInfo :: struct { - sType: StructureType, - pNext: rawptr, - domainOrigin: TessellationDomainOrigin, -} - -RenderPassMultiviewCreateInfo :: struct { - sType: StructureType, - pNext: rawptr, - subpassCount: u32, - pViewMasks: [^]u32, - dependencyCount: u32, - pViewOffsets: [^]i32, - correlationMaskCount: u32, - pCorrelationMasks: [^]u32, -} - -PhysicalDeviceMultiviewFeatures :: struct { - sType: StructureType, - pNext: rawptr, - multiview: b32, - multiviewGeometryShader: b32, - multiviewTessellationShader: b32, -} - -PhysicalDeviceMultiviewProperties :: struct { - sType: StructureType, - pNext: rawptr, - maxMultiviewViewCount: u32, - maxMultiviewInstanceIndex: u32, -} - -PhysicalDeviceVariablePointersFeatures :: struct { - sType: StructureType, - pNext: rawptr, - variablePointersStorageBuffer: b32, - variablePointers: b32, -} - PhysicalDeviceProtectedMemoryFeatures :: struct { sType: StructureType, pNext: rawptr, @@ -1448,25 +1364,6 @@ ProtectedSubmitInfo :: struct { protectedSubmit: b32, } -SamplerYcbcrConversionCreateInfo :: struct { - sType: StructureType, - pNext: rawptr, - format: Format, - ycbcrModel: SamplerYcbcrModelConversion, - ycbcrRange: SamplerYcbcrRange, - components: ComponentMapping, - xChromaOffset: ChromaLocation, - yChromaOffset: ChromaLocation, - chromaFilter: Filter, - forceExplicitReconstruction: b32, -} - -SamplerYcbcrConversionInfo :: struct { - sType: StructureType, - pNext: rawptr, - conversion: SamplerYcbcrConversion, -} - BindImagePlaneMemoryInfo :: struct { sType: StructureType, pNext: rawptr, @@ -1479,40 +1376,6 @@ ImagePlaneMemoryRequirementsInfo :: struct { planeAspect: ImageAspectFlags, } -PhysicalDeviceSamplerYcbcrConversionFeatures :: struct { - sType: StructureType, - pNext: rawptr, - samplerYcbcrConversion: b32, -} - -SamplerYcbcrConversionImageFormatProperties :: struct { - sType: StructureType, - pNext: rawptr, - combinedImageSamplerDescriptorCount: u32, -} - -DescriptorUpdateTemplateEntry :: struct { - dstBinding: u32, - dstArrayElement: u32, - descriptorCount: u32, - descriptorType: DescriptorType, - offset: int, - stride: int, -} - -DescriptorUpdateTemplateCreateInfo :: struct { - sType: StructureType, - pNext: rawptr, - flags: DescriptorUpdateTemplateCreateFlags, - descriptorUpdateEntryCount: u32, - pDescriptorUpdateEntries: [^]DescriptorUpdateTemplateEntry, - templateType: DescriptorUpdateTemplateType, - descriptorSetLayout: DescriptorSetLayout, - pipelineBindPoint: PipelineBindPoint, - pipelineLayout: PipelineLayout, - set: u32, -} - ExternalMemoryProperties :: struct { externalMemoryFeatures: ExternalMemoryFeatureFlags, exportFromImportedHandleTypes: ExternalMemoryHandleTypeFlags, @@ -1613,6 +1476,53 @@ ExternalSemaphoreProperties :: struct { externalSemaphoreFeatures: ExternalSemaphoreFeatureFlags, } +PhysicalDeviceSubgroupProperties :: struct { + sType: StructureType, + pNext: rawptr, + subgroupSize: u32, + supportedStages: ShaderStageFlags, + supportedOperations: SubgroupFeatureFlags, + quadOperationsInAllStages: b32, +} + +PhysicalDevice16BitStorageFeatures :: struct { + sType: StructureType, + pNext: rawptr, + storageBuffer16BitAccess: b32, + uniformAndStorageBuffer16BitAccess: b32, + storagePushConstant16: b32, + storageInputOutput16: b32, +} + +PhysicalDeviceVariablePointersFeatures :: struct { + sType: StructureType, + pNext: rawptr, + variablePointersStorageBuffer: b32, + variablePointers: b32, +} + +DescriptorUpdateTemplateEntry :: struct { + dstBinding: u32, + dstArrayElement: u32, + descriptorCount: u32, + descriptorType: DescriptorType, + offset: int, + stride: int, +} + +DescriptorUpdateTemplateCreateInfo :: struct { + sType: StructureType, + pNext: rawptr, + flags: DescriptorUpdateTemplateCreateFlags, + descriptorUpdateEntryCount: u32, + pDescriptorUpdateEntries: [^]DescriptorUpdateTemplateEntry, + templateType: DescriptorUpdateTemplateType, + descriptorSetLayout: DescriptorSetLayout, + pipelineBindPoint: PipelineBindPoint, + pipelineLayout: PipelineLayout, + set: u32, +} + PhysicalDeviceMaintenance3Properties :: struct { sType: StructureType, pNext: rawptr, @@ -1626,12 +1536,118 @@ DescriptorSetLayoutSupport :: struct { supported: b32, } +SamplerYcbcrConversionCreateInfo :: struct { + sType: StructureType, + pNext: rawptr, + format: Format, + ycbcrModel: SamplerYcbcrModelConversion, + ycbcrRange: SamplerYcbcrRange, + components: ComponentMapping, + xChromaOffset: ChromaLocation, + yChromaOffset: ChromaLocation, + chromaFilter: Filter, + forceExplicitReconstruction: b32, +} + +SamplerYcbcrConversionInfo :: struct { + sType: StructureType, + pNext: rawptr, + conversion: SamplerYcbcrConversion, +} + +PhysicalDeviceSamplerYcbcrConversionFeatures :: struct { + sType: StructureType, + pNext: rawptr, + samplerYcbcrConversion: b32, +} + +SamplerYcbcrConversionImageFormatProperties :: struct { + sType: StructureType, + pNext: rawptr, + combinedImageSamplerDescriptorCount: u32, +} + +DeviceGroupRenderPassBeginInfo :: struct { + sType: StructureType, + pNext: rawptr, + deviceMask: u32, + deviceRenderAreaCount: u32, + pDeviceRenderAreas: [^]Rect2D, +} + +PhysicalDevicePointClippingProperties :: struct { + sType: StructureType, + pNext: rawptr, + pointClippingBehavior: PointClippingBehavior, +} + +InputAttachmentAspectReference :: struct { + subpass: u32, + inputAttachmentIndex: u32, + aspectMask: ImageAspectFlags, +} + +RenderPassInputAttachmentAspectCreateInfo :: struct { + sType: StructureType, + pNext: rawptr, + aspectReferenceCount: u32, + pAspectReferences: [^]InputAttachmentAspectReference, +} + +PipelineTessellationDomainOriginStateCreateInfo :: struct { + sType: StructureType, + pNext: rawptr, + domainOrigin: TessellationDomainOrigin, +} + +RenderPassMultiviewCreateInfo :: struct { + sType: StructureType, + pNext: rawptr, + subpassCount: u32, + pViewMasks: [^]u32, + dependencyCount: u32, + pViewOffsets: [^]i32, + correlationMaskCount: u32, + pCorrelationMasks: [^]u32, +} + +PhysicalDeviceMultiviewFeatures :: struct { + sType: StructureType, + pNext: rawptr, + multiview: b32, + multiviewGeometryShader: b32, + multiviewTessellationShader: b32, +} + +PhysicalDeviceMultiviewProperties :: struct { + sType: StructureType, + pNext: rawptr, + maxMultiviewViewCount: u32, + maxMultiviewInstanceIndex: u32, +} + PhysicalDeviceShaderDrawParametersFeatures :: struct { sType: StructureType, pNext: rawptr, shaderDrawParameters: b32, } +ConformanceVersion :: struct { + major: u8, + minor: u8, + subminor: u8, + patch: u8, +} + +PhysicalDeviceDriverProperties :: struct { + sType: StructureType, + pNext: rawptr, + driverID: DriverId, + driverName: [MAX_DRIVER_NAME_SIZE]byte, + driverInfo: [MAX_DRIVER_INFO_SIZE]byte, + conformanceVersion: ConformanceVersion, +} + PhysicalDeviceVulkan11Features :: struct { sType: StructureType, pNext: rawptr, @@ -1721,13 +1737,6 @@ PhysicalDeviceVulkan12Features :: struct { subgroupBroadcastDynamicId: b32, } -ConformanceVersion :: struct { - major: u8, - minor: u8, - subminor: u8, - patch: u8, -} - PhysicalDeviceVulkan12Properties :: struct { sType: StructureType, pNext: rawptr, @@ -1792,80 +1801,94 @@ ImageFormatListCreateInfo :: struct { pViewFormats: [^]Format, } -AttachmentDescription2 :: struct { +PhysicalDeviceVulkanMemoryModelFeatures :: struct { + sType: StructureType, + pNext: rawptr, + vulkanMemoryModel: b32, + vulkanMemoryModelDeviceScope: b32, + vulkanMemoryModelAvailabilityVisibilityChains: b32, +} + +PhysicalDeviceHostQueryResetFeatures :: struct { sType: StructureType, pNext: rawptr, - flags: AttachmentDescriptionFlags, - format: Format, - samples: SampleCountFlags, - loadOp: AttachmentLoadOp, - storeOp: AttachmentStoreOp, - stencilLoadOp: AttachmentLoadOp, - stencilStoreOp: AttachmentStoreOp, - initialLayout: ImageLayout, - finalLayout: ImageLayout, + hostQueryReset: b32, } -AttachmentReference2 :: struct { - sType: StructureType, - pNext: rawptr, - attachment: u32, - layout: ImageLayout, - aspectMask: ImageAspectFlags, +PhysicalDeviceTimelineSemaphoreFeatures :: struct { + sType: StructureType, + pNext: rawptr, + timelineSemaphore: b32, } -SubpassDescription2 :: struct { - sType: StructureType, - pNext: rawptr, - flags: SubpassDescriptionFlags, - pipelineBindPoint: PipelineBindPoint, - viewMask: u32, - inputAttachmentCount: u32, - pInputAttachments: [^]AttachmentReference2, - colorAttachmentCount: u32, - pColorAttachments: [^]AttachmentReference2, - pResolveAttachments: [^]AttachmentReference2, - pDepthStencilAttachment: ^AttachmentReference2, - preserveAttachmentCount: u32, - pPreserveAttachments: [^]u32, +PhysicalDeviceTimelineSemaphoreProperties :: struct { + sType: StructureType, + pNext: rawptr, + maxTimelineSemaphoreValueDifference: u64, } -SubpassDependency2 :: struct { - sType: StructureType, - pNext: rawptr, - srcSubpass: u32, - dstSubpass: u32, - srcStageMask: PipelineStageFlags, - dstStageMask: PipelineStageFlags, - srcAccessMask: AccessFlags, - dstAccessMask: AccessFlags, - dependencyFlags: DependencyFlags, - viewOffset: i32, +SemaphoreTypeCreateInfo :: struct { + sType: StructureType, + pNext: rawptr, + semaphoreType: SemaphoreType, + initialValue: u64, } -RenderPassCreateInfo2 :: struct { - sType: StructureType, - pNext: rawptr, - flags: RenderPassCreateFlags, - attachmentCount: u32, - pAttachments: [^]AttachmentDescription2, - subpassCount: u32, - pSubpasses: [^]SubpassDescription2, - dependencyCount: u32, - pDependencies: [^]SubpassDependency2, - correlatedViewMaskCount: u32, - pCorrelatedViewMasks: [^]u32, +TimelineSemaphoreSubmitInfo :: struct { + sType: StructureType, + pNext: rawptr, + waitSemaphoreValueCount: u32, + pWaitSemaphoreValues: [^]u64, + signalSemaphoreValueCount: u32, + pSignalSemaphoreValues: [^]u64, } -SubpassBeginInfo :: struct { - sType: StructureType, - pNext: rawptr, - contents: SubpassContents, +SemaphoreWaitInfo :: struct { + sType: StructureType, + pNext: rawptr, + flags: SemaphoreWaitFlags, + semaphoreCount: u32, + pSemaphores: [^]Semaphore, + pValues: [^]u64, } -SubpassEndInfo :: struct { - sType: StructureType, - pNext: rawptr, +SemaphoreSignalInfo :: struct { + sType: StructureType, + pNext: rawptr, + semaphore: Semaphore, + value: u64, +} + +PhysicalDeviceBufferDeviceAddressFeatures :: struct { + sType: StructureType, + pNext: rawptr, + bufferDeviceAddress: b32, + bufferDeviceAddressCaptureReplay: b32, + bufferDeviceAddressMultiDevice: b32, +} + +BufferDeviceAddressInfo :: struct { + sType: StructureType, + pNext: rawptr, + buffer: Buffer, +} + +BufferOpaqueCaptureAddressCreateInfo :: struct { + sType: StructureType, + pNext: rawptr, + opaqueCaptureAddress: u64, +} + +MemoryOpaqueCaptureAddressAllocateInfo :: struct { + sType: StructureType, + pNext: rawptr, + opaqueCaptureAddress: u64, +} + +DeviceMemoryOpaqueCaptureAddressInfo :: struct { + sType: StructureType, + pNext: rawptr, + memory: DeviceMemory, } PhysicalDevice8BitStorageFeatures :: struct { @@ -1876,15 +1899,6 @@ PhysicalDevice8BitStorageFeatures :: struct { storagePushConstant8: b32, } -PhysicalDeviceDriverProperties :: struct { - sType: StructureType, - pNext: rawptr, - driverID: DriverId, - driverName: [MAX_DRIVER_NAME_SIZE]byte, - driverInfo: [MAX_DRIVER_INFO_SIZE]byte, - conformanceVersion: ConformanceVersion, -} - PhysicalDeviceShaderAtomicInt64Features :: struct { sType: StructureType, pNext: rawptr, @@ -1994,6 +2008,113 @@ DescriptorSetVariableDescriptorCountLayoutSupport :: struct { maxVariableDescriptorCount: u32, } +PhysicalDeviceScalarBlockLayoutFeatures :: struct { + sType: StructureType, + pNext: rawptr, + scalarBlockLayout: b32, +} + +SamplerReductionModeCreateInfo :: struct { + sType: StructureType, + pNext: rawptr, + reductionMode: SamplerReductionMode, +} + +PhysicalDeviceSamplerFilterMinmaxProperties :: struct { + sType: StructureType, + pNext: rawptr, + filterMinmaxSingleComponentFormats: b32, + filterMinmaxImageComponentMapping: b32, +} + +PhysicalDeviceUniformBufferStandardLayoutFeatures :: struct { + sType: StructureType, + pNext: rawptr, + uniformBufferStandardLayout: b32, +} + +PhysicalDeviceShaderSubgroupExtendedTypesFeatures :: struct { + sType: StructureType, + pNext: rawptr, + shaderSubgroupExtendedTypes: b32, +} + +AttachmentDescription2 :: struct { + sType: StructureType, + pNext: rawptr, + flags: AttachmentDescriptionFlags, + format: Format, + samples: SampleCountFlags, + loadOp: AttachmentLoadOp, + storeOp: AttachmentStoreOp, + stencilLoadOp: AttachmentLoadOp, + stencilStoreOp: AttachmentStoreOp, + initialLayout: ImageLayout, + finalLayout: ImageLayout, +} + +AttachmentReference2 :: struct { + sType: StructureType, + pNext: rawptr, + attachment: u32, + layout: ImageLayout, + aspectMask: ImageAspectFlags, +} + +SubpassDescription2 :: struct { + sType: StructureType, + pNext: rawptr, + flags: SubpassDescriptionFlags, + pipelineBindPoint: PipelineBindPoint, + viewMask: u32, + inputAttachmentCount: u32, + pInputAttachments: [^]AttachmentReference2, + colorAttachmentCount: u32, + pColorAttachments: [^]AttachmentReference2, + pResolveAttachments: [^]AttachmentReference2, + pDepthStencilAttachment: ^AttachmentReference2, + preserveAttachmentCount: u32, + pPreserveAttachments: [^]u32, +} + +SubpassDependency2 :: struct { + sType: StructureType, + pNext: rawptr, + srcSubpass: u32, + dstSubpass: u32, + srcStageMask: PipelineStageFlags, + dstStageMask: PipelineStageFlags, + srcAccessMask: AccessFlags, + dstAccessMask: AccessFlags, + dependencyFlags: DependencyFlags, + viewOffset: i32, +} + +SubpassBeginInfo :: struct { + sType: StructureType, + pNext: rawptr, + contents: SubpassContents, +} + +SubpassEndInfo :: struct { + sType: StructureType, + pNext: rawptr, +} + +RenderPassCreateInfo2 :: struct { + sType: StructureType, + pNext: rawptr, + flags: RenderPassCreateFlags, + attachmentCount: u32, + pAttachments: [^]AttachmentDescription2, + subpassCount: u32, + pSubpasses: [^]SubpassDescription2, + dependencyCount: u32, + pDependencies: [^]SubpassDependency2, + correlatedViewMaskCount: u32, + pCorrelatedViewMasks: [^]u32, +} + SubpassDescriptionDepthStencilResolve :: struct { sType: StructureType, pNext: rawptr, @@ -2011,39 +2132,12 @@ PhysicalDeviceDepthStencilResolveProperties :: struct { independentResolve: b32, } -PhysicalDeviceScalarBlockLayoutFeatures :: struct { - sType: StructureType, - pNext: rawptr, - scalarBlockLayout: b32, -} - ImageStencilUsageCreateInfo :: struct { sType: StructureType, pNext: rawptr, stencilUsage: ImageUsageFlags, } -SamplerReductionModeCreateInfo :: struct { - sType: StructureType, - pNext: rawptr, - reductionMode: SamplerReductionMode, -} - -PhysicalDeviceSamplerFilterMinmaxProperties :: struct { - sType: StructureType, - pNext: rawptr, - filterMinmaxSingleComponentFormats: b32, - filterMinmaxImageComponentMapping: b32, -} - -PhysicalDeviceVulkanMemoryModelFeatures :: struct { - sType: StructureType, - pNext: rawptr, - vulkanMemoryModel: b32, - vulkanMemoryModelDeviceScope: b32, - vulkanMemoryModelAvailabilityVisibilityChains: b32, -} - PhysicalDeviceImagelessFramebufferFeatures :: struct { sType: StructureType, pNext: rawptr, @@ -2062,13 +2156,6 @@ FramebufferAttachmentImageInfo :: struct { pViewFormats: [^]Format, } -FramebufferAttachmentsCreateInfo :: struct { - sType: StructureType, - pNext: rawptr, - attachmentImageInfoCount: u32, - pAttachmentImageInfos: [^]FramebufferAttachmentImageInfo, -} - RenderPassAttachmentBeginInfo :: struct { sType: StructureType, pNext: rawptr, @@ -2076,16 +2163,11 @@ RenderPassAttachmentBeginInfo :: struct { pAttachments: [^]ImageView, } -PhysicalDeviceUniformBufferStandardLayoutFeatures :: struct { - sType: StructureType, - pNext: rawptr, - uniformBufferStandardLayout: b32, -} - -PhysicalDeviceShaderSubgroupExtendedTypesFeatures :: struct { - sType: StructureType, - pNext: rawptr, - shaderSubgroupExtendedTypes: b32, +FramebufferAttachmentsCreateInfo :: struct { + sType: StructureType, + pNext: rawptr, + attachmentImageInfoCount: u32, + pAttachmentImageInfos: [^]FramebufferAttachmentImageInfo, } PhysicalDeviceSeparateDepthStencilLayoutsFeatures :: struct { @@ -2107,88 +2189,6 @@ AttachmentDescriptionStencilLayout :: struct { stencilFinalLayout: ImageLayout, } -PhysicalDeviceHostQueryResetFeatures :: struct { - sType: StructureType, - pNext: rawptr, - hostQueryReset: b32, -} - -PhysicalDeviceTimelineSemaphoreFeatures :: struct { - sType: StructureType, - pNext: rawptr, - timelineSemaphore: b32, -} - -PhysicalDeviceTimelineSemaphoreProperties :: struct { - sType: StructureType, - pNext: rawptr, - maxTimelineSemaphoreValueDifference: u64, -} - -SemaphoreTypeCreateInfo :: struct { - sType: StructureType, - pNext: rawptr, - semaphoreType: SemaphoreType, - initialValue: u64, -} - -TimelineSemaphoreSubmitInfo :: struct { - sType: StructureType, - pNext: rawptr, - waitSemaphoreValueCount: u32, - pWaitSemaphoreValues: [^]u64, - signalSemaphoreValueCount: u32, - pSignalSemaphoreValues: [^]u64, -} - -SemaphoreWaitInfo :: struct { - sType: StructureType, - pNext: rawptr, - flags: SemaphoreWaitFlags, - semaphoreCount: u32, - pSemaphores: [^]Semaphore, - pValues: [^]u64, -} - -SemaphoreSignalInfo :: struct { - sType: StructureType, - pNext: rawptr, - semaphore: Semaphore, - value: u64, -} - -PhysicalDeviceBufferDeviceAddressFeatures :: struct { - sType: StructureType, - pNext: rawptr, - bufferDeviceAddress: b32, - bufferDeviceAddressCaptureReplay: b32, - bufferDeviceAddressMultiDevice: b32, -} - -BufferDeviceAddressInfo :: struct { - sType: StructureType, - pNext: rawptr, - buffer: Buffer, -} - -BufferOpaqueCaptureAddressCreateInfo :: struct { - sType: StructureType, - pNext: rawptr, - opaqueCaptureAddress: u64, -} - -MemoryOpaqueCaptureAddressAllocateInfo :: struct { - sType: StructureType, - pNext: rawptr, - opaqueCaptureAddress: u64, -} - -DeviceMemoryOpaqueCaptureAddressInfo :: struct { - sType: StructureType, - pNext: rawptr, - memory: DeviceMemory, -} - PhysicalDeviceVulkan13Features :: struct { sType: StructureType, pNext: rawptr, @@ -2259,25 +2259,6 @@ PhysicalDeviceVulkan13Properties :: struct { maxBufferSize: DeviceSize, } -PipelineCreationFeedback :: struct { - flags: PipelineCreationFeedbackFlags, - duration: u64, -} - -PipelineCreationFeedbackCreateInfo :: struct { - sType: StructureType, - pNext: rawptr, - pPipelineCreationFeedback: ^PipelineCreationFeedback, - pipelineStageCreationFeedbackCount: u32, - pPipelineStageCreationFeedbacks: [^]PipelineCreationFeedback, -} - -PhysicalDeviceShaderTerminateInvocationFeatures :: struct { - sType: StructureType, - pNext: rawptr, - shaderTerminateInvocation: b32, -} - PhysicalDeviceToolProperties :: struct { sType: StructureType, pNext: rawptr, @@ -2288,12 +2269,6 @@ PhysicalDeviceToolProperties :: struct { layer: [MAX_EXTENSION_NAME_SIZE]byte, } -PhysicalDeviceShaderDemoteToHelperInvocationFeatures :: struct { - sType: StructureType, - pNext: rawptr, - shaderDemoteToHelperInvocation: b32, -} - PhysicalDevicePrivateDataFeatures :: struct { sType: StructureType, pNext: rawptr, @@ -2312,12 +2287,6 @@ PrivateDataSlotCreateInfo :: struct { flags: PrivateDataSlotCreateFlags, } -PhysicalDevicePipelineCreationCacheControlFeatures :: struct { - sType: StructureType, - pNext: rawptr, - pipelineCreationCacheControl: b32, -} - MemoryBarrier2 :: struct { sType: StructureType, pNext: rawptr, @@ -2402,18 +2371,6 @@ PhysicalDeviceSynchronization2Features :: struct { synchronization2: b32, } -PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures :: struct { - sType: StructureType, - pNext: rawptr, - shaderZeroInitializeWorkgroupMemory: b32, -} - -PhysicalDeviceImageRobustnessFeatures :: struct { - sType: StructureType, - pNext: rawptr, - robustImageAccess: b32, -} - BufferCopy2 :: struct { sType: StructureType, pNext: rawptr, @@ -2483,46 +2440,86 @@ CopyImageToBufferInfo2 :: struct { pRegions: [^]BufferImageCopy2, } -ImageBlit2 :: struct { - sType: StructureType, - pNext: rawptr, - srcSubresource: ImageSubresourceLayers, - srcOffsets: [2]Offset3D, - dstSubresource: ImageSubresourceLayers, - dstOffsets: [2]Offset3D, +PhysicalDeviceTextureCompressionASTCHDRFeatures :: struct { + sType: StructureType, + pNext: rawptr, + textureCompressionASTC_HDR: b32, } -BlitImageInfo2 :: struct { - sType: StructureType, - pNext: rawptr, - srcImage: Image, - srcImageLayout: ImageLayout, - dstImage: Image, - dstImageLayout: ImageLayout, - regionCount: u32, - pRegions: [^]ImageBlit2, - filter: Filter, +FormatProperties3 :: struct { + sType: StructureType, + pNext: rawptr, + linearTilingFeatures: FormatFeatureFlags2, + optimalTilingFeatures: FormatFeatureFlags2, + bufferFeatures: FormatFeatureFlags2, } -ImageResolve2 :: struct { - sType: StructureType, - pNext: rawptr, - srcSubresource: ImageSubresourceLayers, - srcOffset: Offset3D, - dstSubresource: ImageSubresourceLayers, - dstOffset: Offset3D, - extent: Extent3D, +PhysicalDeviceMaintenance4Features :: struct { + sType: StructureType, + pNext: rawptr, + maintenance4: b32, } -ResolveImageInfo2 :: struct { - sType: StructureType, - pNext: rawptr, - srcImage: Image, - srcImageLayout: ImageLayout, - dstImage: Image, - dstImageLayout: ImageLayout, - regionCount: u32, - pRegions: [^]ImageResolve2, +PhysicalDeviceMaintenance4Properties :: struct { + sType: StructureType, + pNext: rawptr, + maxBufferSize: DeviceSize, +} + +DeviceBufferMemoryRequirements :: struct { + sType: StructureType, + pNext: rawptr, + pCreateInfo: ^BufferCreateInfo, +} + +DeviceImageMemoryRequirements :: struct { + sType: StructureType, + pNext: rawptr, + pCreateInfo: ^ImageCreateInfo, + planeAspect: ImageAspectFlags, +} + +PipelineCreationFeedback :: struct { + flags: PipelineCreationFeedbackFlags, + duration: u64, +} + +PipelineCreationFeedbackCreateInfo :: struct { + sType: StructureType, + pNext: rawptr, + pPipelineCreationFeedback: ^PipelineCreationFeedback, + pipelineStageCreationFeedbackCount: u32, + pPipelineStageCreationFeedbacks: [^]PipelineCreationFeedback, +} + +PhysicalDeviceShaderTerminateInvocationFeatures :: struct { + sType: StructureType, + pNext: rawptr, + shaderTerminateInvocation: b32, +} + +PhysicalDeviceShaderDemoteToHelperInvocationFeatures :: struct { + sType: StructureType, + pNext: rawptr, + shaderDemoteToHelperInvocation: b32, +} + +PhysicalDevicePipelineCreationCacheControlFeatures :: struct { + sType: StructureType, + pNext: rawptr, + pipelineCreationCacheControl: b32, +} + +PhysicalDeviceZeroInitializeWorkgroupMemoryFeatures :: struct { + sType: StructureType, + pNext: rawptr, + shaderZeroInitializeWorkgroupMemory: b32, +} + +PhysicalDeviceImageRobustnessFeatures :: struct { + sType: StructureType, + pNext: rawptr, + robustImageAccess: b32, } PhysicalDeviceSubgroupSizeControlFeatures :: struct { @@ -2577,10 +2574,96 @@ DescriptorPoolInlineUniformBlockCreateInfo :: struct { maxInlineUniformBlockBindings: u32, } -PhysicalDeviceTextureCompressionASTCHDRFeatures :: struct { - sType: StructureType, - pNext: rawptr, - textureCompressionASTC_HDR: b32, +PhysicalDeviceShaderIntegerDotProductFeatures :: struct { + sType: StructureType, + pNext: rawptr, + shaderIntegerDotProduct: b32, +} + +PhysicalDeviceShaderIntegerDotProductProperties :: struct { + sType: StructureType, + pNext: rawptr, + integerDotProduct8BitUnsignedAccelerated: b32, + integerDotProduct8BitSignedAccelerated: b32, + integerDotProduct8BitMixedSignednessAccelerated: b32, + integerDotProduct4x8BitPackedUnsignedAccelerated: b32, + integerDotProduct4x8BitPackedSignedAccelerated: b32, + integerDotProduct4x8BitPackedMixedSignednessAccelerated: b32, + integerDotProduct16BitUnsignedAccelerated: b32, + integerDotProduct16BitSignedAccelerated: b32, + integerDotProduct16BitMixedSignednessAccelerated: b32, + integerDotProduct32BitUnsignedAccelerated: b32, + integerDotProduct32BitSignedAccelerated: b32, + integerDotProduct32BitMixedSignednessAccelerated: b32, + integerDotProduct64BitUnsignedAccelerated: b32, + integerDotProduct64BitSignedAccelerated: b32, + integerDotProduct64BitMixedSignednessAccelerated: b32, + integerDotProductAccumulatingSaturating8BitUnsignedAccelerated: b32, + integerDotProductAccumulatingSaturating8BitSignedAccelerated: b32, + integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated: b32, + integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated: b32, + integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated: b32, + integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated: b32, + integerDotProductAccumulatingSaturating16BitUnsignedAccelerated: b32, + integerDotProductAccumulatingSaturating16BitSignedAccelerated: b32, + integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated: b32, + integerDotProductAccumulatingSaturating32BitUnsignedAccelerated: b32, + integerDotProductAccumulatingSaturating32BitSignedAccelerated: b32, + integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated: b32, + integerDotProductAccumulatingSaturating64BitUnsignedAccelerated: b32, + integerDotProductAccumulatingSaturating64BitSignedAccelerated: b32, + integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated: b32, +} + +PhysicalDeviceTexelBufferAlignmentProperties :: struct { + sType: StructureType, + pNext: rawptr, + storageTexelBufferOffsetAlignmentBytes: DeviceSize, + storageTexelBufferOffsetSingleTexelAlignment: b32, + uniformTexelBufferOffsetAlignmentBytes: DeviceSize, + uniformTexelBufferOffsetSingleTexelAlignment: b32, +} + +ImageBlit2 :: struct { + sType: StructureType, + pNext: rawptr, + srcSubresource: ImageSubresourceLayers, + srcOffsets: [2]Offset3D, + dstSubresource: ImageSubresourceLayers, + dstOffsets: [2]Offset3D, +} + +BlitImageInfo2 :: struct { + sType: StructureType, + pNext: rawptr, + srcImage: Image, + srcImageLayout: ImageLayout, + dstImage: Image, + dstImageLayout: ImageLayout, + regionCount: u32, + pRegions: [^]ImageBlit2, + filter: Filter, +} + +ImageResolve2 :: struct { + sType: StructureType, + pNext: rawptr, + srcSubresource: ImageSubresourceLayers, + srcOffset: Offset3D, + dstSubresource: ImageSubresourceLayers, + dstOffset: Offset3D, + extent: Extent3D, +} + +ResolveImageInfo2 :: struct { + sType: StructureType, + pNext: rawptr, + srcImage: Image, + srcImageLayout: ImageLayout, + dstImage: Image, + dstImageLayout: ImageLayout, + regionCount: u32, + pRegions: [^]ImageResolve2, } RenderingAttachmentInfo :: struct { @@ -2637,89 +2720,6 @@ CommandBufferInheritanceRenderingInfo :: struct { rasterizationSamples: SampleCountFlags, } -PhysicalDeviceShaderIntegerDotProductFeatures :: struct { - sType: StructureType, - pNext: rawptr, - shaderIntegerDotProduct: b32, -} - -PhysicalDeviceShaderIntegerDotProductProperties :: struct { - sType: StructureType, - pNext: rawptr, - integerDotProduct8BitUnsignedAccelerated: b32, - integerDotProduct8BitSignedAccelerated: b32, - integerDotProduct8BitMixedSignednessAccelerated: b32, - integerDotProduct4x8BitPackedUnsignedAccelerated: b32, - integerDotProduct4x8BitPackedSignedAccelerated: b32, - integerDotProduct4x8BitPackedMixedSignednessAccelerated: b32, - integerDotProduct16BitUnsignedAccelerated: b32, - integerDotProduct16BitSignedAccelerated: b32, - integerDotProduct16BitMixedSignednessAccelerated: b32, - integerDotProduct32BitUnsignedAccelerated: b32, - integerDotProduct32BitSignedAccelerated: b32, - integerDotProduct32BitMixedSignednessAccelerated: b32, - integerDotProduct64BitUnsignedAccelerated: b32, - integerDotProduct64BitSignedAccelerated: b32, - integerDotProduct64BitMixedSignednessAccelerated: b32, - integerDotProductAccumulatingSaturating8BitUnsignedAccelerated: b32, - integerDotProductAccumulatingSaturating8BitSignedAccelerated: b32, - integerDotProductAccumulatingSaturating8BitMixedSignednessAccelerated: b32, - integerDotProductAccumulatingSaturating4x8BitPackedUnsignedAccelerated: b32, - integerDotProductAccumulatingSaturating4x8BitPackedSignedAccelerated: b32, - integerDotProductAccumulatingSaturating4x8BitPackedMixedSignednessAccelerated: b32, - integerDotProductAccumulatingSaturating16BitUnsignedAccelerated: b32, - integerDotProductAccumulatingSaturating16BitSignedAccelerated: b32, - integerDotProductAccumulatingSaturating16BitMixedSignednessAccelerated: b32, - integerDotProductAccumulatingSaturating32BitUnsignedAccelerated: b32, - integerDotProductAccumulatingSaturating32BitSignedAccelerated: b32, - integerDotProductAccumulatingSaturating32BitMixedSignednessAccelerated: b32, - integerDotProductAccumulatingSaturating64BitUnsignedAccelerated: b32, - integerDotProductAccumulatingSaturating64BitSignedAccelerated: b32, - integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated: b32, -} - -PhysicalDeviceTexelBufferAlignmentProperties :: struct { - sType: StructureType, - pNext: rawptr, - storageTexelBufferOffsetAlignmentBytes: DeviceSize, - storageTexelBufferOffsetSingleTexelAlignment: b32, - uniformTexelBufferOffsetAlignmentBytes: DeviceSize, - uniformTexelBufferOffsetSingleTexelAlignment: b32, -} - -FormatProperties3 :: struct { - sType: StructureType, - pNext: rawptr, - linearTilingFeatures: FormatFeatureFlags2, - optimalTilingFeatures: FormatFeatureFlags2, - bufferFeatures: FormatFeatureFlags2, -} - -PhysicalDeviceMaintenance4Features :: struct { - sType: StructureType, - pNext: rawptr, - maintenance4: b32, -} - -PhysicalDeviceMaintenance4Properties :: struct { - sType: StructureType, - pNext: rawptr, - maxBufferSize: DeviceSize, -} - -DeviceBufferMemoryRequirements :: struct { - sType: StructureType, - pNext: rawptr, - pCreateInfo: ^BufferCreateInfo, -} - -DeviceImageMemoryRequirements :: struct { - sType: StructureType, - pNext: rawptr, - pCreateInfo: ^ImageCreateInfo, - planeAspect: ImageAspectFlags, -} - PhysicalDeviceVulkan14Features :: struct { sType: StructureType, pNext: rawptr, @@ -2795,77 +2795,6 @@ QueueFamilyGlobalPriorityProperties :: struct { priorities: [MAX_GLOBAL_PRIORITY_SIZE]QueueGlobalPriority, } -PhysicalDeviceShaderSubgroupRotateFeatures :: struct { - sType: StructureType, - pNext: rawptr, - shaderSubgroupRotate: b32, - shaderSubgroupRotateClustered: b32, -} - -PhysicalDeviceShaderFloatControls2Features :: struct { - sType: StructureType, - pNext: rawptr, - shaderFloatControls2: b32, -} - -PhysicalDeviceShaderExpectAssumeFeatures :: struct { - sType: StructureType, - pNext: rawptr, - shaderExpectAssume: b32, -} - -PhysicalDeviceLineRasterizationFeatures :: struct { - sType: StructureType, - pNext: rawptr, - rectangularLines: b32, - bresenhamLines: b32, - smoothLines: b32, - stippledRectangularLines: b32, - stippledBresenhamLines: b32, - stippledSmoothLines: b32, -} - -PhysicalDeviceLineRasterizationProperties :: struct { - sType: StructureType, - pNext: rawptr, - lineSubPixelPrecisionBits: u32, -} - -PipelineRasterizationLineStateCreateInfo :: struct { - sType: StructureType, - pNext: rawptr, - lineRasterizationMode: LineRasterizationMode, - stippledLineEnable: b32, - lineStippleFactor: u32, - lineStipplePattern: u16, -} - -PhysicalDeviceVertexAttributeDivisorProperties :: struct { - sType: StructureType, - pNext: rawptr, - maxVertexAttribDivisor: u32, - supportsNonZeroFirstInstance: b32, -} - -VertexInputBindingDivisorDescription :: struct { - binding: u32, - divisor: u32, -} - -PipelineVertexInputDivisorStateCreateInfo :: struct { - sType: StructureType, - pNext: rawptr, - vertexBindingDivisorCount: u32, - pVertexBindingDivisors: [^]VertexInputBindingDivisorDescription, -} - -PhysicalDeviceVertexAttributeDivisorFeatures :: struct { - sType: StructureType, - pNext: rawptr, - vertexAttributeInstanceRateDivisor: b32, - vertexAttributeInstanceRateZeroDivisor: b32, -} - PhysicalDeviceIndexTypeUint8Features :: struct { sType: StructureType, pNext: rawptr, @@ -2905,14 +2834,10 @@ PhysicalDeviceMaintenance5Properties :: struct { nonStrictWideLinesUseParallelogram: b32, } -RenderingAreaInfo :: struct { - sType: StructureType, - pNext: rawptr, - viewMask: u32, - colorAttachmentCount: u32, - pColorAttachmentFormats: [^]Format, - depthAttachmentFormat: Format, - stencilAttachmentFormat: Format, +SubresourceLayout2 :: struct { + sType: StructureType, + pNext: rawptr, + subresourceLayout: SubresourceLayout, } ImageSubresource2 :: struct { @@ -2928,52 +2853,12 @@ DeviceImageSubresourceInfo :: struct { pSubresource: ^ImageSubresource2, } -SubresourceLayout2 :: struct { - sType: StructureType, - pNext: rawptr, - subresourceLayout: SubresourceLayout, -} - -PipelineCreateFlags2CreateInfo :: struct { - sType: StructureType, - pNext: rawptr, - flags: PipelineCreateFlags2, -} - BufferUsageFlags2CreateInfo :: struct { sType: StructureType, pNext: rawptr, usage: BufferUsageFlags2, } -PhysicalDevicePushDescriptorProperties :: struct { - sType: StructureType, - pNext: rawptr, - maxPushDescriptors: u32, -} - -PhysicalDeviceDynamicRenderingLocalReadFeatures :: struct { - sType: StructureType, - pNext: rawptr, - dynamicRenderingLocalRead: b32, -} - -RenderingAttachmentLocationInfo :: struct { - sType: StructureType, - pNext: rawptr, - colorAttachmentCount: u32, - pColorAttachmentLocations: [^]u32, -} - -RenderingInputAttachmentIndexInfo :: struct { - sType: StructureType, - pNext: rawptr, - colorAttachmentCount: u32, - pColorAttachmentInputIndices: [^]u32, - pDepthInputAttachmentIndex: ^u32, - pStencilInputAttachmentIndex: ^u32, -} - PhysicalDeviceMaintenance6Features :: struct { sType: StructureType, pNext: rawptr, @@ -2994,77 +2879,6 @@ BindMemoryStatus :: struct { pResult: ^Result, } -BindDescriptorSetsInfo :: struct { - sType: StructureType, - pNext: rawptr, - stageFlags: ShaderStageFlags, - layout: PipelineLayout, - firstSet: u32, - descriptorSetCount: u32, - pDescriptorSets: [^]DescriptorSet, - dynamicOffsetCount: u32, - pDynamicOffsets: [^]u32, -} - -PushConstantsInfo :: struct { - sType: StructureType, - pNext: rawptr, - layout: PipelineLayout, - stageFlags: ShaderStageFlags, - offset: u32, - size: u32, - pValues: rawptr, -} - -PushDescriptorSetInfo :: struct { - sType: StructureType, - pNext: rawptr, - stageFlags: ShaderStageFlags, - layout: PipelineLayout, - set: u32, - descriptorWriteCount: u32, - pDescriptorWrites: [^]WriteDescriptorSet, -} - -PushDescriptorSetWithTemplateInfo :: struct { - sType: StructureType, - pNext: rawptr, - descriptorUpdateTemplate: DescriptorUpdateTemplate, - layout: PipelineLayout, - set: u32, - pData: rawptr, -} - -PhysicalDevicePipelineProtectedAccessFeatures :: struct { - sType: StructureType, - pNext: rawptr, - pipelineProtectedAccess: b32, -} - -PhysicalDevicePipelineRobustnessFeatures :: struct { - sType: StructureType, - pNext: rawptr, - pipelineRobustness: b32, -} - -PhysicalDevicePipelineRobustnessProperties :: struct { - sType: StructureType, - pNext: rawptr, - defaultRobustnessStorageBuffers: PipelineRobustnessBufferBehavior, - defaultRobustnessUniformBuffers: PipelineRobustnessBufferBehavior, - defaultRobustnessVertexInputs: PipelineRobustnessBufferBehavior, - defaultRobustnessImages: PipelineRobustnessImageBehavior, -} - -PipelineRobustnessCreateInfo :: struct { - sType: StructureType, - pNext: rawptr, - storageBuffers: PipelineRobustnessBufferBehavior, - uniformBuffers: PipelineRobustnessBufferBehavior, - vertexInputs: PipelineRobustnessBufferBehavior, - images: PipelineRobustnessImageBehavior, -} - PhysicalDeviceHostImageCopyFeatures :: struct { sType: StructureType, pNext: rawptr, @@ -3158,6 +2972,192 @@ HostImageCopyDevicePerformanceQuery :: struct { identicalMemoryLayout: b32, } +PhysicalDeviceShaderSubgroupRotateFeatures :: struct { + sType: StructureType, + pNext: rawptr, + shaderSubgroupRotate: b32, + shaderSubgroupRotateClustered: b32, +} + +PhysicalDeviceShaderFloatControls2Features :: struct { + sType: StructureType, + pNext: rawptr, + shaderFloatControls2: b32, +} + +PhysicalDeviceShaderExpectAssumeFeatures :: struct { + sType: StructureType, + pNext: rawptr, + shaderExpectAssume: b32, +} + +PipelineCreateFlags2CreateInfo :: struct { + sType: StructureType, + pNext: rawptr, + flags: PipelineCreateFlags2, +} + +PhysicalDevicePushDescriptorProperties :: struct { + sType: StructureType, + pNext: rawptr, + maxPushDescriptors: u32, +} + +BindDescriptorSetsInfo :: struct { + sType: StructureType, + pNext: rawptr, + stageFlags: ShaderStageFlags, + layout: PipelineLayout, + firstSet: u32, + descriptorSetCount: u32, + pDescriptorSets: [^]DescriptorSet, + dynamicOffsetCount: u32, + pDynamicOffsets: [^]u32, +} + +PushConstantsInfo :: struct { + sType: StructureType, + pNext: rawptr, + layout: PipelineLayout, + stageFlags: ShaderStageFlags, + offset: u32, + size: u32, + pValues: rawptr, +} + +PushDescriptorSetInfo :: struct { + sType: StructureType, + pNext: rawptr, + stageFlags: ShaderStageFlags, + layout: PipelineLayout, + set: u32, + descriptorWriteCount: u32, + pDescriptorWrites: [^]WriteDescriptorSet, +} + +PushDescriptorSetWithTemplateInfo :: struct { + sType: StructureType, + pNext: rawptr, + descriptorUpdateTemplate: DescriptorUpdateTemplate, + layout: PipelineLayout, + set: u32, + pData: rawptr, +} + +PhysicalDevicePipelineProtectedAccessFeatures :: struct { + sType: StructureType, + pNext: rawptr, + pipelineProtectedAccess: b32, +} + +PhysicalDevicePipelineRobustnessFeatures :: struct { + sType: StructureType, + pNext: rawptr, + pipelineRobustness: b32, +} + +PhysicalDevicePipelineRobustnessProperties :: struct { + sType: StructureType, + pNext: rawptr, + defaultRobustnessStorageBuffers: PipelineRobustnessBufferBehavior, + defaultRobustnessUniformBuffers: PipelineRobustnessBufferBehavior, + defaultRobustnessVertexInputs: PipelineRobustnessBufferBehavior, + defaultRobustnessImages: PipelineRobustnessImageBehavior, +} + +PipelineRobustnessCreateInfo :: struct { + sType: StructureType, + pNext: rawptr, + storageBuffers: PipelineRobustnessBufferBehavior, + uniformBuffers: PipelineRobustnessBufferBehavior, + vertexInputs: PipelineRobustnessBufferBehavior, + images: PipelineRobustnessImageBehavior, +} + +PhysicalDeviceLineRasterizationFeatures :: struct { + sType: StructureType, + pNext: rawptr, + rectangularLines: b32, + bresenhamLines: b32, + smoothLines: b32, + stippledRectangularLines: b32, + stippledBresenhamLines: b32, + stippledSmoothLines: b32, +} + +PhysicalDeviceLineRasterizationProperties :: struct { + sType: StructureType, + pNext: rawptr, + lineSubPixelPrecisionBits: u32, +} + +PipelineRasterizationLineStateCreateInfo :: struct { + sType: StructureType, + pNext: rawptr, + lineRasterizationMode: LineRasterizationMode, + stippledLineEnable: b32, + lineStippleFactor: u32, + lineStipplePattern: u16, +} + +PhysicalDeviceVertexAttributeDivisorProperties :: struct { + sType: StructureType, + pNext: rawptr, + maxVertexAttribDivisor: u32, + supportsNonZeroFirstInstance: b32, +} + +VertexInputBindingDivisorDescription :: struct { + binding: u32, + divisor: u32, +} + +PipelineVertexInputDivisorStateCreateInfo :: struct { + sType: StructureType, + pNext: rawptr, + vertexBindingDivisorCount: u32, + pVertexBindingDivisors: [^]VertexInputBindingDivisorDescription, +} + +PhysicalDeviceVertexAttributeDivisorFeatures :: struct { + sType: StructureType, + pNext: rawptr, + vertexAttributeInstanceRateDivisor: b32, + vertexAttributeInstanceRateZeroDivisor: b32, +} + +RenderingAreaInfo :: struct { + sType: StructureType, + pNext: rawptr, + viewMask: u32, + colorAttachmentCount: u32, + pColorAttachmentFormats: [^]Format, + depthAttachmentFormat: Format, + stencilAttachmentFormat: Format, +} + +PhysicalDeviceDynamicRenderingLocalReadFeatures :: struct { + sType: StructureType, + pNext: rawptr, + dynamicRenderingLocalRead: b32, +} + +RenderingAttachmentLocationInfo :: struct { + sType: StructureType, + pNext: rawptr, + colorAttachmentCount: u32, + pColorAttachmentLocations: [^]u32, +} + +RenderingInputAttachmentIndexInfo :: struct { + sType: StructureType, + pNext: rawptr, + colorAttachmentCount: u32, + pColorAttachmentInputIndices: [^]u32, + pDepthInputAttachmentIndex: ^u32, + pStencilInputAttachmentIndex: ^u32, +} + SurfaceCapabilitiesKHR :: struct { minImageCount: u32, maxImageCount: u32, @@ -4005,6 +4005,14 @@ DisplayPlaneCapabilities2KHR :: struct { capabilities: DisplayPlaneCapabilitiesKHR, } +PhysicalDeviceShaderBfloat16FeaturesKHR :: struct { + sType: StructureType, + pNext: rawptr, + shaderBFloat16Type: b32, + shaderBFloat16DotProduct: b32, + shaderBFloat16CooperativeMatrix: b32, +} + PhysicalDeviceShaderClockFeaturesKHR :: struct { sType: StructureType, pNext: rawptr, @@ -4117,6 +4125,31 @@ RenderingFragmentShadingRateAttachmentInfoKHR :: struct { shadingRateAttachmentTexelSize: Extent2D, } +PhysicalDeviceShaderConstantDataFeaturesKHR :: struct { + sType: StructureType, + pNext: rawptr, + shaderConstantData: b32, +} + +PhysicalDeviceShaderAbortFeaturesKHR :: struct { + sType: StructureType, + pNext: rawptr, + shaderAbort: b32, +} + +DeviceFaultShaderAbortMessageInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + messageDataSize: u64, + pMessageData: rawptr, +} + +PhysicalDeviceShaderAbortPropertiesKHR :: struct { + sType: StructureType, + pNext: rawptr, + maxShaderAbortMessageSize: u64, +} + PhysicalDeviceShaderQuadControlFeaturesKHR :: struct { sType: StructureType, pNext: rawptr, @@ -4301,6 +4334,154 @@ VideoEncodeSessionParametersFeedbackInfoKHR :: struct { hasOverrides: b32, } +DeviceAddressRangeKHR :: struct { + address: DeviceAddress, + size: DeviceSize, +} + +StridedDeviceAddressRangeKHR :: struct { + address: DeviceAddress, + size: DeviceSize, + stride: DeviceSize, +} + +DeviceMemoryCopyKHR :: struct { + sType: StructureType, + pNext: rawptr, + srcRange: DeviceAddressRangeKHR, + srcFlags: AddressCommandFlagsKHR, + dstRange: DeviceAddressRangeKHR, + dstFlags: AddressCommandFlagsKHR, +} + +CopyDeviceMemoryInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + regionCount: u32, + pRegions: [^]DeviceMemoryCopyKHR, +} + +DeviceMemoryImageCopyKHR :: struct { + sType: StructureType, + pNext: rawptr, + addressRange: DeviceAddressRangeKHR, + addressFlags: AddressCommandFlagsKHR, + addressRowLength: u32, + addressImageHeight: u32, + imageSubresource: ImageSubresourceLayers, + imageLayout: ImageLayout, + imageOffset: Offset3D, + imageExtent: Extent3D, +} + +CopyDeviceMemoryImageInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + image: Image, + regionCount: u32, + pRegions: [^]DeviceMemoryImageCopyKHR, +} + +MemoryRangeBarrierKHR :: struct { + sType: StructureType, + pNext: rawptr, + srcStageMask: PipelineStageFlags2, + srcAccessMask: AccessFlags2, + dstStageMask: PipelineStageFlags2, + dstAccessMask: AccessFlags2, + srcQueueFamilyIndex: u32, + dstQueueFamilyIndex: u32, + addressRange: DeviceAddressRangeKHR, + addressFlags: AddressCommandFlagsKHR, +} + +MemoryRangeBarriersInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + memoryRangeBarrierCount: u32, + pMemoryRangeBarriers: [^]MemoryRangeBarrierKHR, +} + +PhysicalDeviceDeviceAddressCommandsFeaturesKHR :: struct { + sType: StructureType, + pNext: rawptr, + deviceAddressCommands: b32, +} + +BindIndexBuffer3InfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + addressRange: DeviceAddressRangeKHR, + addressFlags: AddressCommandFlagsKHR, + indexType: IndexType, +} + +BindVertexBuffer3InfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + setStride: b32, + addressRange: StridedDeviceAddressRangeKHR, + addressFlags: AddressCommandFlagsKHR, +} + +DrawIndirect2InfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + addressRange: StridedDeviceAddressRangeKHR, + addressFlags: AddressCommandFlagsKHR, + drawCount: u32, +} + +DrawIndirectCount2InfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + addressRange: StridedDeviceAddressRangeKHR, + addressFlags: AddressCommandFlagsKHR, + countAddressRange: DeviceAddressRangeKHR, + countAddressFlags: AddressCommandFlagsKHR, + maxDrawCount: u32, +} + +DispatchIndirect2InfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + addressRange: DeviceAddressRangeKHR, + addressFlags: AddressCommandFlagsKHR, +} + +ConditionalRenderingBeginInfo2EXT :: struct { + sType: StructureType, + pNext: rawptr, + addressRange: DeviceAddressRangeKHR, + addressFlags: AddressCommandFlagsKHR, + flags: ConditionalRenderingFlagsEXT, +} + +BindTransformFeedbackBuffer2InfoEXT :: struct { + sType: StructureType, + pNext: rawptr, + addressRange: DeviceAddressRangeKHR, + addressFlags: AddressCommandFlagsKHR, +} + +MemoryMarkerInfoAMD :: struct { + sType: StructureType, + pNext: rawptr, + stage: PipelineStageFlags2KHR, + dstRange: DeviceAddressRangeKHR, + dstFlags: AddressCommandFlagsKHR, + marker: u32, +} + +AccelerationStructureCreateInfo2KHR :: struct { + sType: StructureType, + pNext: rawptr, + createFlags: AccelerationStructureCreateFlagsKHR, + addressRange: DeviceAddressRangeKHR, + addressFlags: AddressCommandFlagsKHR, + type: AccelerationStructureTypeKHR, +} + PhysicalDeviceFragmentShaderBarycentricFeaturesKHR :: struct { sType: StructureType, pNext: rawptr, @@ -4352,12 +4533,56 @@ TraceRaysIndirectCommand2KHR :: struct { depth: u32, } +PhysicalDeviceShaderUntypedPointersFeaturesKHR :: struct { + sType: StructureType, + pNext: rawptr, + shaderUntypedPointers: b32, +} + PhysicalDeviceShaderMaximalReconvergenceFeaturesKHR :: struct { sType: StructureType, pNext: rawptr, shaderMaximalReconvergence: b32, } +SurfaceCapabilitiesPresentId2KHR :: struct { + sType: StructureType, + pNext: rawptr, + presentId2Supported: b32, +} + +PresentId2KHR :: struct { + sType: StructureType, + pNext: rawptr, + swapchainCount: u32, + pPresentIds: [^]u64, +} + +PhysicalDevicePresentId2FeaturesKHR :: struct { + sType: StructureType, + pNext: rawptr, + presentId2: b32, +} + +SurfaceCapabilitiesPresentWait2KHR :: struct { + sType: StructureType, + pNext: rawptr, + presentWait2Supported: b32, +} + +PhysicalDevicePresentWait2FeaturesKHR :: struct { + sType: StructureType, + pNext: rawptr, + presentWait2: b32, +} + +PresentWait2InfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + presentId: u64, + timeout: u64, +} + PhysicalDeviceRayTracingPositionFetchFeaturesKHR :: struct { sType: StructureType, pNext: rawptr, @@ -4443,6 +4668,78 @@ PipelineBinaryHandlesInfoKHR :: struct { pPipelineBinaries: [^]PipelineBinaryKHR, } +SurfacePresentModeKHR :: struct { + sType: StructureType, + pNext: rawptr, + presentMode: PresentModeKHR, +} + +SurfacePresentScalingCapabilitiesKHR :: struct { + sType: StructureType, + pNext: rawptr, + supportedPresentScaling: PresentScalingFlagsKHR, + supportedPresentGravityX: PresentGravityFlagsKHR, + supportedPresentGravityY: PresentGravityFlagsKHR, + minScaledImageExtent: Extent2D, + maxScaledImageExtent: Extent2D, +} + +SurfacePresentModeCompatibilityKHR :: struct { + sType: StructureType, + pNext: rawptr, + presentModeCount: u32, + pPresentModes: [^]PresentModeKHR, +} + +PhysicalDeviceSwapchainMaintenance1FeaturesKHR :: struct { + sType: StructureType, + pNext: rawptr, + swapchainMaintenance1: b32, +} + +SwapchainPresentFenceInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + swapchainCount: u32, + pFences: [^]Fence, +} + +SwapchainPresentModesCreateInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + presentModeCount: u32, + pPresentModes: [^]PresentModeKHR, +} + +SwapchainPresentModeInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + swapchainCount: u32, + pPresentModes: [^]PresentModeKHR, +} + +SwapchainPresentScalingCreateInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + scalingBehavior: PresentScalingFlagsKHR, + presentGravityX: PresentGravityFlagsKHR, + presentGravityY: PresentGravityFlagsKHR, +} + +ReleaseSwapchainImagesInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + swapchain: SwapchainKHR, + imageIndexCount: u32, + pImageIndices: [^]u32, +} + +PhysicalDeviceInternallySynchronizedQueuesFeaturesKHR :: struct { + sType: StructureType, + pNext: rawptr, + internallySynchronizedQueues: b32, +} + CooperativeMatrixPropertiesKHR :: struct { sType: StructureType, pNext: rawptr, @@ -4656,6 +4953,34 @@ VideoEncodeAV1RateControlLayerInfoKHR :: struct { maxFrameSize: VideoEncodeAV1FrameSizeKHR, } +PhysicalDeviceVideoDecodeVP9FeaturesKHR :: struct { + sType: StructureType, + pNext: rawptr, + videoDecodeVP9: b32, +} + +VideoDecodeVP9ProfileInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + stdProfile: VideoVP9Profile, +} + +VideoDecodeVP9CapabilitiesKHR :: struct { + sType: StructureType, + pNext: rawptr, + maxLevel: VideoVP9Level, +} + +VideoDecodeVP9PictureInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + pStdPictureInfo: ^VideoDecodeVP9PictureInfo, + referenceNameSlotIndices: [MAX_VIDEO_VP9_REFERENCES_PER_FRAME_KHR]i32, + uncompressedHeaderOffset: u32, + compressedHeaderOffset: u32, + tilesOffset: u32, +} + PhysicalDeviceVideoMaintenance1FeaturesKHR :: struct { sType: StructureType, pNext: rawptr, @@ -4670,6 +4995,19 @@ VideoInlineQueryInfoKHR :: struct { queryCount: u32, } +PhysicalDeviceUnifiedImageLayoutsFeaturesKHR :: struct { + sType: StructureType, + pNext: rawptr, + unifiedImageLayouts: b32, + unifiedImageLayoutsVideo: b32, +} + +AttachmentFeedbackLoopInfoEXT :: struct { + sType: StructureType, + pNext: rawptr, + feedbackLoopEnable: b32, +} + CalibratedTimestampInfoKHR :: struct { sType: StructureType, pNext: rawptr, @@ -4695,6 +5033,89 @@ BindDescriptorBufferEmbeddedSamplersInfoEXT :: struct { set: u32, } +CopyMemoryIndirectCommandKHR :: struct { + srcAddress: DeviceAddress, + dstAddress: DeviceAddress, + size: DeviceSize, +} + +CopyMemoryIndirectInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + srcCopyFlags: AddressCopyFlagsKHR, + dstCopyFlags: AddressCopyFlagsKHR, + copyCount: u32, + copyAddressRange: StridedDeviceAddressRangeKHR, +} + +CopyMemoryToImageIndirectCommandKHR :: struct { + srcAddress: DeviceAddress, + bufferRowLength: u32, + bufferImageHeight: u32, + imageSubresource: ImageSubresourceLayers, + imageOffset: Offset3D, + imageExtent: Extent3D, +} + +CopyMemoryToImageIndirectInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + srcCopyFlags: AddressCopyFlagsKHR, + copyCount: u32, + copyAddressRange: StridedDeviceAddressRangeKHR, + dstImage: Image, + dstImageLayout: ImageLayout, + pImageSubresources: [^]ImageSubresourceLayers, +} + +PhysicalDeviceCopyMemoryIndirectFeaturesKHR :: struct { + sType: StructureType, + pNext: rawptr, + indirectMemoryCopy: b32, + indirectMemoryToImageCopy: b32, +} + +PhysicalDeviceCopyMemoryIndirectPropertiesKHR :: struct { + sType: StructureType, + pNext: rawptr, + supportedQueues: QueueFlags, +} + +VideoEncodeIntraRefreshCapabilitiesKHR :: struct { + sType: StructureType, + pNext: rawptr, + intraRefreshModes: VideoEncodeIntraRefreshModeFlagsKHR, + maxIntraRefreshCycleDuration: u32, + maxIntraRefreshActiveReferencePictures: u32, + partitionIndependentIntraRefreshRegions: b32, + nonRectangularIntraRefreshRegions: b32, +} + +VideoEncodeSessionIntraRefreshCreateInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + intraRefreshMode: VideoEncodeIntraRefreshModeFlagsKHR, +} + +VideoEncodeIntraRefreshInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + intraRefreshCycleDuration: u32, + intraRefreshIndex: u32, +} + +VideoReferenceIntraRefreshInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + dirtyIntraRefreshRegions: u32, +} + +PhysicalDeviceVideoEncodeIntraRefreshFeaturesKHR :: struct { + sType: StructureType, + pNext: rawptr, + videoEncodeIntraRefresh: b32, +} + VideoEncodeQuantizationMapCapabilitiesKHR :: struct { sType: StructureType, pNext: rawptr, @@ -4806,10 +5227,63 @@ PhysicalDeviceLayeredApiVulkanPropertiesKHR :: struct { properties: PhysicalDeviceProperties2, } -PhysicalDeviceMaintenance8FeaturesKHR :: struct { - sType: StructureType, - pNext: rawptr, - maintenance8: b32, +PhysicalDeviceFaultFeaturesKHR :: struct { + sType: StructureType, + pNext: rawptr, + deviceFault: b32, + deviceFaultVendorBinary: b32, + deviceFaultReportMasked: b32, + deviceFaultDeviceLostOnMasked: b32, +} + +PhysicalDeviceFaultPropertiesKHR :: struct { + sType: StructureType, + pNext: rawptr, + maxDeviceFaultCount: u32, +} + +DeviceFaultAddressInfoKHR :: struct { + addressType: DeviceFaultAddressTypeKHR, + reportedAddress: DeviceAddress, + addressPrecision: DeviceSize, +} + +DeviceFaultVendorInfoKHR :: struct { + description: [MAX_DESCRIPTION_SIZE]byte, + vendorFaultCode: u64, + vendorFaultData: u64, +} + +DeviceFaultInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + flags: DeviceFaultFlagsKHR, + groupId: u64, + description: [MAX_DESCRIPTION_SIZE]byte, + faultAddressInfo: DeviceFaultAddressInfoKHR, + instructionAddressInfo: DeviceFaultAddressInfoKHR, + vendorInfo: DeviceFaultVendorInfoKHR, +} + +DeviceFaultDebugInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + vendorBinarySize: u32, + pVendorBinaryData: rawptr, +} + +DeviceFaultVendorBinaryHeaderVersionOneKHR :: struct { + headerSize: u32, + headerVersion: DeviceFaultVendorBinaryHeaderVersionKHR, + vendorID: u32, + deviceID: u32, + driverVersion: u32, + pipelineCacheUUID: [UUID_SIZE]u8, + applicationNameOffset: u32, + applicationVersion: u32, + engineNameOffset: u32, + engineVersion: u32, + apiVersion: u32, } MemoryBarrierAccessFlags3KHR :: struct { @@ -4819,6 +5293,39 @@ MemoryBarrierAccessFlags3KHR :: struct { dstAccessMask3: AccessFlags3KHR, } +PhysicalDeviceMaintenance8FeaturesKHR :: struct { + sType: StructureType, + pNext: rawptr, + maintenance8: b32, +} + +PhysicalDeviceShaderFmaFeaturesKHR :: struct { + sType: StructureType, + pNext: rawptr, + shaderFmaFloat16: b32, + shaderFmaFloat32: b32, + shaderFmaFloat64: b32, +} + +PhysicalDeviceMaintenance9FeaturesKHR :: struct { + sType: StructureType, + pNext: rawptr, + maintenance9: b32, +} + +PhysicalDeviceMaintenance9PropertiesKHR :: struct { + sType: StructureType, + pNext: rawptr, + image2DViewOf3DSparse: b32, + defaultVertexAttributeValue: DefaultVertexAttributeValueKHR, +} + +QueueFamilyOwnershipTransferPropertiesKHR :: struct { + sType: StructureType, + pNext: rawptr, + optimalImageTransferToQueueFamilies: u32, +} + PhysicalDeviceVideoMaintenance2FeaturesKHR :: struct { sType: StructureType, pNext: rawptr, @@ -4846,12 +5353,190 @@ VideoDecodeAV1InlineSessionParametersInfoKHR :: struct { pStdSequenceHeader: ^VideoAV1SequenceHeader, } +PhysicalDeviceVideoEncodeFeedback2FeaturesKHR :: struct { + sType: StructureType, + pNext: rawptr, + videoEncodeFeedback2: b32, +} + +VideoEncodeFeedback2CapabilitiesKHR :: struct { + sType: StructureType, + pNext: rawptr, + maxPerPartitionFeedbackEntries: u32, + supportedPerPartitionEncodeFeedbackFlags: VideoEncodePerPartitionFeedbackFlagsKHR, +} + +QueryPoolVideoEncodePerPartitionFeedbackCreateInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + maxPerPartitionFeedbackEntries: u32, + perPartitionEncodeFeedbackFlags: VideoEncodePerPartitionFeedbackFlagsKHR, +} + PhysicalDeviceDepthClampZeroOneFeaturesKHR :: struct { sType: StructureType, pNext: rawptr, depthClampZeroOne: b32, } +PhysicalDeviceRobustness2FeaturesKHR :: struct { + sType: StructureType, + pNext: rawptr, + robustBufferAccess2: b32, + robustImageAccess2: b32, + nullDescriptor: b32, +} + +PhysicalDeviceRobustness2PropertiesKHR :: struct { + sType: StructureType, + pNext: rawptr, + robustStorageBufferAccessSizeAlignment: DeviceSize, + robustUniformBufferAccessSizeAlignment: DeviceSize, +} + +PhysicalDevicePresentModeFifoLatestReadyFeaturesKHR :: struct { + sType: StructureType, + pNext: rawptr, + presentModeFifoLatestReady: b32, +} + +MicromapUsageKHR :: struct { + count: u32, + subdivisionLevel: u32, + format: OpacityMicromapFormatKHR, +} + +AccelerationStructureGeometryMicromapDataKHR :: struct { + sType: StructureType, + pNext: rawptr, + usageCountsCount: u32, + pUsageCounts: [^]MicromapUsageKHR, + ppUsageCounts: ^[^]MicromapUsageKHR, + data: DeviceAddress, + triangleArray: DeviceAddress, + triangleArrayStride: DeviceSize, +} + +PhysicalDeviceOpacityMicromapFeaturesKHR :: struct { + sType: StructureType, + pNext: rawptr, + micromap: b32, +} + +PhysicalDeviceOpacityMicromapPropertiesKHR :: struct { + sType: StructureType, + pNext: rawptr, + maxOpacity2StateSubdivisionLevel: u32, + maxOpacity4StateSubdivisionLevel: u32, + maxOpacityLossy4StateSubdivisionLevel: u32, + maxMicromapTriangles: u64, +} + +MicromapTriangleKHR :: struct { + dataOffset: u32, + subdivisionLevel: u16, + format: u16, +} + +AccelerationStructureTrianglesOpacityMicromapKHR :: struct { + sType: StructureType, + pNext: rawptr, + indexType: IndexType, + indexBuffer: DeviceAddress, + indexStride: DeviceSize, + baseTriangle: u32, + micromap: AccelerationStructureKHR, +} + +PhysicalDeviceMaintenance10FeaturesKHR :: struct { + sType: StructureType, + pNext: rawptr, + maintenance10: b32, +} + +PhysicalDeviceMaintenance10PropertiesKHR :: struct { + sType: StructureType, + pNext: rawptr, + rgba4OpaqueBlackSwizzled: b32, + resolveSrgbFormatAppliesTransferFunction: b32, + resolveSrgbFormatSupportsTransferFunctionControl: b32, +} + +RenderingEndInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, +} + +RenderingAttachmentFlagsInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + flags: RenderingAttachmentFlagsKHR, +} + +ResolveImageModeInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + flags: ResolveImageFlagsKHR, + resolveMode: ResolveModeFlags, + stencilResolveMode: ResolveModeFlags, +} + +PhysicalDeviceMaintenance11FeaturesKHR :: struct { + sType: StructureType, + pNext: rawptr, + maintenance11: b32, +} + +QueueFamilyOptimalImageTransferGranularityPropertiesKHR :: struct { + sType: StructureType, + pNext: rawptr, + optimalImageTransferGranularity: Extent3D, +} + +FormatProperties4KHR :: struct { + sType: StructureType, + pNext: rawptr, + linearTilingFeatures: FormatFeatureFlags4KHR, + optimalTilingFeatures: FormatFeatureFlags4KHR, + bufferFeatures: FormatFeatureFlags4KHR, +} + +ImageUsageFlags2CreateInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + usage: ImageUsageFlags2KHR, +} + +ImageCreateFlags2CreateInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + flags: ImageCreateFlags2KHR, +} + +ImageViewUsage2CreateInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + usage: ImageUsageFlags2KHR, +} + +PhysicalDeviceExtendedFlagsFeaturesKHR :: struct { + sType: StructureType, + pNext: rawptr, + extendedFlags: b32, +} + +ImageStencilUsage2CreateInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + stencilUsage: ImageUsageFlags2KHR, +} + +SharedPresentSurfaceCapabilities2KHR :: struct { + sType: StructureType, + pNext: rawptr, + sharedPresentSupportedUsageFlags: ImageUsageFlags2KHR, +} + DebugReportCallbackCreateInfoEXT :: struct { sType: StructureType, pNext: rawptr, @@ -5309,6 +5994,332 @@ DebugUtilsObjectTagInfoEXT :: struct { pTag: rawptr, } +GpaPerfBlockPropertiesAMD :: struct { + blockType: GpaPerfBlockAMD, + flags: GpaPerfBlockPropertiesFlagsAMD, + instanceCount: u32, + maxEventID: u32, + maxGlobalOnlyCounters: u32, + maxGlobalSharedCounters: u32, + maxStreamingCounters: u32, +} + +PhysicalDeviceGpaFeaturesAMD :: struct { + sType: StructureType, + pNext: rawptr, + perfCounters: b32, + streamingPerfCounters: b32, + sqThreadTracing: b32, + clockModes: b32, +} + +PhysicalDeviceGpaPropertiesAMD :: struct { + sType: StructureType, + pNext: rawptr, + flags: PhysicalDeviceGpaPropertiesFlagsAMD, + maxSqttSeBufferSize: DeviceSize, + shaderEngineCount: u32, + perfBlockCount: u32, + pPerfBlocks: [^]GpaPerfBlockPropertiesAMD, +} + +PhysicalDeviceGpaProperties2AMD :: struct { + sType: StructureType, + pNext: rawptr, + revisionId: u32, +} + +GpaPerfCounterAMD :: struct { + blockType: GpaPerfBlockAMD, + blockInstance: u32, + eventID: u32, +} + +GpaSampleBeginInfoAMD :: struct { + sType: StructureType, + pNext: rawptr, + sampleType: GpaSampleTypeAMD, + sampleInternalOperations: b32, + cacheFlushOnCounterCollection: b32, + sqShaderMaskEnable: b32, + sqShaderMask: GpaSqShaderStageFlagsAMD, + perfCounterCount: u32, + pPerfCounters: [^]GpaPerfCounterAMD, + streamingPerfTraceSampleInterval: u32, + perfCounterDeviceMemoryLimit: DeviceSize, + sqThreadTraceEnable: b32, + sqThreadTraceSuppressInstructionTokens: b32, + sqThreadTraceDeviceMemoryLimit: DeviceSize, + timingPreSample: PipelineStageFlags, + timingPostSample: PipelineStageFlags, +} + +GpaDeviceClockModeInfoAMD :: struct { + sType: StructureType, + pNext: rawptr, + clockMode: GpaDeviceClockModeAMD, + memoryClockRatioToPeak: f32, + engineClockRatioToPeak: f32, +} + +GpaDeviceGetClockInfoAMD :: struct { + sType: StructureType, + pNext: rawptr, + memoryClockRatioToPeak: f32, + engineClockRatioToPeak: f32, + memoryClockFrequency: u32, + engineClockFrequency: u32, +} + +GpaSessionCreateInfoAMD :: struct { + sType: StructureType, + pNext: rawptr, + secondaryCopySource: GpaSessionAMD, +} + +HostAddressRangeEXT :: struct { + address: rawptr, + size: int, +} + +HostAddressRangeConstEXT :: struct { + address: rawptr, + size: int, +} + +TexelBufferDescriptorInfoEXT :: struct { + sType: StructureType, + pNext: rawptr, + format: Format, + addressRange: DeviceAddressRangeEXT, +} + +ImageDescriptorInfoEXT :: struct { + sType: StructureType, + pNext: rawptr, + pView: ^ImageViewCreateInfo, + layout: ImageLayout, +} + +TensorViewCreateInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + flags: TensorViewCreateFlagsARM, + tensor: TensorARM, + format: Format, +} + +ResourceDescriptorDataEXT :: struct #raw_union { + pImage: ^ImageDescriptorInfoEXT, + pTexelBuffer: ^TexelBufferDescriptorInfoEXT, + pAddressRange: ^DeviceAddressRangeEXT, + pTensorARM: ^TensorViewCreateInfoARM, +} + +ResourceDescriptorInfoEXT :: struct { + sType: StructureType, + pNext: rawptr, + type: DescriptorType, + data: ResourceDescriptorDataEXT, +} + +BindHeapInfoEXT :: struct { + sType: StructureType, + pNext: rawptr, + heapRange: DeviceAddressRangeEXT, + reservedRangeOffset: DeviceSize, + reservedRangeSize: DeviceSize, +} + +PushDataInfoEXT :: struct { + sType: StructureType, + pNext: rawptr, + offset: u32, + data: HostAddressRangeConstEXT, +} + +DescriptorMappingSourceConstantOffsetEXT :: struct { + heapOffset: u32, + heapArrayStride: u32, + pEmbeddedSampler: ^SamplerCreateInfo, + samplerHeapOffset: u32, + samplerHeapArrayStride: u32, +} + +DescriptorMappingSourcePushIndexEXT :: struct { + heapOffset: u32, + pushOffset: u32, + heapIndexStride: u32, + heapArrayStride: u32, + pEmbeddedSampler: ^SamplerCreateInfo, + useCombinedImageSamplerIndex: b32, + samplerHeapOffset: u32, + samplerPushOffset: u32, + samplerHeapIndexStride: u32, + samplerHeapArrayStride: u32, +} + +DescriptorMappingSourceIndirectIndexEXT :: struct { + heapOffset: u32, + pushOffset: u32, + addressOffset: u32, + heapIndexStride: u32, + heapArrayStride: u32, + pEmbeddedSampler: ^SamplerCreateInfo, + useCombinedImageSamplerIndex: b32, + samplerHeapOffset: u32, + samplerPushOffset: u32, + samplerAddressOffset: u32, + samplerHeapIndexStride: u32, + samplerHeapArrayStride: u32, +} + +DescriptorMappingSourceHeapDataEXT :: struct { + heapOffset: u32, + pushOffset: u32, +} + +DescriptorMappingSourceIndirectAddressEXT :: struct { + pushOffset: u32, + addressOffset: u32, +} + +DescriptorMappingSourceShaderRecordIndexEXT :: struct { + heapOffset: u32, + shaderRecordOffset: u32, + heapIndexStride: u32, + heapArrayStride: u32, + pEmbeddedSampler: ^SamplerCreateInfo, + useCombinedImageSamplerIndex: b32, + samplerHeapOffset: u32, + samplerShaderRecordOffset: u32, + samplerHeapIndexStride: u32, + samplerHeapArrayStride: u32, +} + +DescriptorMappingSourceIndirectIndexArrayEXT :: struct { + heapOffset: u32, + pushOffset: u32, + addressOffset: u32, + heapIndexStride: u32, + pEmbeddedSampler: ^SamplerCreateInfo, + useCombinedImageSamplerIndex: b32, + samplerHeapOffset: u32, + samplerPushOffset: u32, + samplerAddressOffset: u32, + samplerHeapIndexStride: u32, +} + +DescriptorMappingSourceDataEXT :: struct #raw_union { + constantOffset: DescriptorMappingSourceConstantOffsetEXT, + pushIndex: DescriptorMappingSourcePushIndexEXT, + indirectIndex: DescriptorMappingSourceIndirectIndexEXT, + indirectIndexArray: DescriptorMappingSourceIndirectIndexArrayEXT, + heapData: DescriptorMappingSourceHeapDataEXT, + pushDataOffset: u32, + pushAddressOffset: u32, + indirectAddress: DescriptorMappingSourceIndirectAddressEXT, + shaderRecordIndex: DescriptorMappingSourceShaderRecordIndexEXT, + shaderRecordDataOffset: u32, + shaderRecordAddressOffset: u32, +} + +DescriptorSetAndBindingMappingEXT :: struct { + sType: StructureType, + pNext: rawptr, + descriptorSet: u32, + firstBinding: u32, + bindingCount: u32, + resourceMask: SpirvResourceTypeFlagsEXT, + source: DescriptorMappingSourceEXT, + sourceData: DescriptorMappingSourceDataEXT, +} + +ShaderDescriptorSetAndBindingMappingInfoEXT :: struct { + sType: StructureType, + pNext: rawptr, + mappingCount: u32, + pMappings: [^]DescriptorSetAndBindingMappingEXT, +} + +OpaqueCaptureDataCreateInfoEXT :: struct { + sType: StructureType, + pNext: rawptr, + pData: ^HostAddressRangeConstEXT, +} + +PhysicalDeviceDescriptorHeapFeaturesEXT :: struct { + sType: StructureType, + pNext: rawptr, + descriptorHeap: b32, + descriptorHeapCaptureReplay: b32, +} + +PhysicalDeviceDescriptorHeapPropertiesEXT :: struct { + sType: StructureType, + pNext: rawptr, + samplerHeapAlignment: DeviceSize, + resourceHeapAlignment: DeviceSize, + maxSamplerHeapSize: DeviceSize, + maxResourceHeapSize: DeviceSize, + minSamplerHeapReservedRange: DeviceSize, + minSamplerHeapReservedRangeWithEmbedded: DeviceSize, + minResourceHeapReservedRange: DeviceSize, + samplerDescriptorSize: DeviceSize, + imageDescriptorSize: DeviceSize, + bufferDescriptorSize: DeviceSize, + samplerDescriptorAlignment: DeviceSize, + imageDescriptorAlignment: DeviceSize, + bufferDescriptorAlignment: DeviceSize, + maxPushDataSize: DeviceSize, + imageCaptureReplayOpaqueDataSize: int, + maxDescriptorHeapEmbeddedSamplers: u32, + samplerYcbcrConversionCount: u32, + sparseDescriptorHeaps: b32, + protectedDescriptorHeaps: b32, +} + +CommandBufferInheritanceDescriptorHeapInfoEXT :: struct { + sType: StructureType, + pNext: rawptr, + pSamplerHeapBindInfo: ^BindHeapInfoEXT, + pResourceHeapBindInfo: ^BindHeapInfoEXT, +} + +SamplerCustomBorderColorIndexCreateInfoEXT :: struct { + sType: StructureType, + pNext: rawptr, + index: u32, +} + +SamplerCustomBorderColorCreateInfoEXT :: struct { + sType: StructureType, + pNext: rawptr, + customBorderColor: ClearColorValue, + format: Format, +} + +IndirectCommandsLayoutPushDataTokenNV :: struct { + sType: StructureType, + pNext: rawptr, + pushDataOffset: u32, + pushDataSize: u32, +} + +SubsampledImageFormatPropertiesEXT :: struct { + sType: StructureType, + pNext: rawptr, + subsampledImageDescriptorCount: u32, +} + +PhysicalDeviceDescriptorHeapTensorPropertiesARM :: struct { + sType: StructureType, + pNext: rawptr, + tensorDescriptorSize: DeviceSize, + tensorDescriptorAlignment: DeviceSize, + tensorCaptureReplayOpaqueDataSize: int, +} + AttachmentSampleCountInfoAMD :: struct { sType: StructureType, pNext: rawptr, @@ -5614,7 +6625,7 @@ AccelerationStructureInfoNV :: struct { sType: StructureType, pNext: rawptr, type: AccelerationStructureTypeNV, - flags: BuildAccelerationStructureFlagsNV, + flags: BuildAccelerationStructureFlagsKHR, instanceCount: u32, geometryCount: u32, pGeometries: [^]GeometryNV, @@ -5715,6 +6726,18 @@ FilterCubicImageViewImageFormatPropertiesEXT :: struct { filterCubicMinmax: b32, } +PhysicalDeviceCooperativeMatrixConversionFeaturesQCOM :: struct { + sType: StructureType, + pNext: rawptr, + cooperativeMatrixConversion: b32, +} + +PhysicalDeviceElapsedTimerQueryFeaturesQCOM :: struct { + sType: StructureType, + pNext: rawptr, + elapsedTimerQuery: b32, +} + ImportMemoryHostPointerInfoEXT :: struct { sType: StructureType, pNext: rawptr, @@ -5846,6 +6869,96 @@ CheckpointData2NV :: struct { pCheckpointMarker: rawptr, } +PhysicalDevicePresentTimingFeaturesEXT :: struct { + sType: StructureType, + pNext: rawptr, + presentTiming: b32, + presentAtAbsoluteTime: b32, + presentAtRelativeTime: b32, +} + +PresentTimingSurfaceCapabilitiesEXT :: struct { + sType: StructureType, + pNext: rawptr, + presentTimingSupported: b32, + presentAtAbsoluteTimeSupported: b32, + presentAtRelativeTimeSupported: b32, + presentStageQueries: PresentStageFlagsEXT, +} + +SwapchainCalibratedTimestampInfoEXT :: struct { + sType: StructureType, + pNext: rawptr, + swapchain: SwapchainKHR, + presentStage: PresentStageFlagsEXT, + timeDomainId: u64, +} + +SwapchainTimingPropertiesEXT :: struct { + sType: StructureType, + pNext: rawptr, + refreshDuration: u64, + refreshInterval: u64, +} + +SwapchainTimeDomainPropertiesEXT :: struct { + sType: StructureType, + pNext: rawptr, + timeDomainCount: u32, + pTimeDomains: [^]TimeDomainKHR, + pTimeDomainIds: [^]u64, +} + +PastPresentationTimingInfoEXT :: struct { + sType: StructureType, + pNext: rawptr, + flags: PastPresentationTimingFlagsEXT, + swapchain: SwapchainKHR, +} + +PresentStageTimeEXT :: struct { + stage: PresentStageFlagsEXT, + time: u64, +} + +PastPresentationTimingEXT :: struct { + sType: StructureType, + pNext: rawptr, + presentId: u64, + targetTime: u64, + presentStageCount: u32, + pPresentStages: [^]PresentStageTimeEXT, + timeDomain: TimeDomainKHR, + timeDomainId: u64, + reportComplete: b32, +} + +PastPresentationTimingPropertiesEXT :: struct { + sType: StructureType, + pNext: rawptr, + timingPropertiesCounter: u64, + timeDomainsCounter: u64, + presentationTimingCount: u32, + pPresentationTimings: [^]PastPresentationTimingEXT, +} + +PresentTimingInfoEXT :: struct { + sType: StructureType, + pNext: rawptr, + flags: PresentTimingInfoFlagsEXT, + targetTime: u64, + timeDomainId: u64, + presentStageQueries: PresentStageFlagsEXT, + targetTimeDomainPresentStage: PresentStageFlagsEXT, +} + +PresentTimingsInfoEXT :: struct { + sType: StructureType, + pNext: rawptr, + swapchainCount: u32, + pTimingInfos: [^]PresentTimingInfoEXT, +} + PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL :: struct { sType: StructureType, pNext: rawptr, @@ -6169,72 +7282,6 @@ PhysicalDeviceShaderAtomicFloat2FeaturesEXT :: struct { sparseImageFloat32AtomicMinMax: b32, } -SurfacePresentModeEXT :: struct { - sType: StructureType, - pNext: rawptr, - presentMode: PresentModeKHR, -} - -SurfacePresentScalingCapabilitiesEXT :: struct { - sType: StructureType, - pNext: rawptr, - supportedPresentScaling: PresentScalingFlagsEXT, - supportedPresentGravityX: PresentGravityFlagsEXT, - supportedPresentGravityY: PresentGravityFlagsEXT, - minScaledImageExtent: Extent2D, - maxScaledImageExtent: Extent2D, -} - -SurfacePresentModeCompatibilityEXT :: struct { - sType: StructureType, - pNext: rawptr, - presentModeCount: u32, - pPresentModes: [^]PresentModeKHR, -} - -PhysicalDeviceSwapchainMaintenance1FeaturesEXT :: struct { - sType: StructureType, - pNext: rawptr, - swapchainMaintenance1: b32, -} - -SwapchainPresentFenceInfoEXT :: struct { - sType: StructureType, - pNext: rawptr, - swapchainCount: u32, - pFences: [^]Fence, -} - -SwapchainPresentModesCreateInfoEXT :: struct { - sType: StructureType, - pNext: rawptr, - presentModeCount: u32, - pPresentModes: [^]PresentModeKHR, -} - -SwapchainPresentModeInfoEXT :: struct { - sType: StructureType, - pNext: rawptr, - swapchainCount: u32, - pPresentModes: [^]PresentModeKHR, -} - -SwapchainPresentScalingCreateInfoEXT :: struct { - sType: StructureType, - pNext: rawptr, - scalingBehavior: PresentScalingFlagsEXT, - presentGravityX: PresentGravityFlagsEXT, - presentGravityY: PresentGravityFlagsEXT, -} - -ReleaseSwapchainImagesInfoEXT :: struct { - sType: StructureType, - pNext: rawptr, - swapchain: SwapchainKHR, - imageIndexCount: u32, - pImageIndices: [^]u32, -} - PhysicalDeviceDeviceGeneratedCommandsPropertiesNV :: struct { sType: StructureType, pNext: rawptr, @@ -6437,28 +7484,6 @@ DeviceDeviceMemoryReportCreateInfoEXT :: struct { pUserData: rawptr, } -PhysicalDeviceRobustness2FeaturesEXT :: struct { - sType: StructureType, - pNext: rawptr, - robustBufferAccess2: b32, - robustImageAccess2: b32, - nullDescriptor: b32, -} - -PhysicalDeviceRobustness2PropertiesEXT :: struct { - sType: StructureType, - pNext: rawptr, - robustStorageBufferAccessSizeAlignment: DeviceSize, - robustUniformBufferAccessSizeAlignment: DeviceSize, -} - -SamplerCustomBorderColorCreateInfoEXT :: struct { - sType: StructureType, - pNext: rawptr, - customBorderColor: ClearColorValue, - format: Format, -} - PhysicalDeviceCustomBorderColorPropertiesEXT :: struct { sType: StructureType, pNext: rawptr, @@ -6472,6 +7497,12 @@ PhysicalDeviceCustomBorderColorFeaturesEXT :: struct { customBorderColorWithoutFormat: b32, } +PhysicalDeviceTextureCompressionASTC3DFeaturesEXT :: struct { + sType: StructureType, + pNext: rawptr, + textureCompressionASTC_3D: b32, +} + PhysicalDevicePresentBarrierFeaturesNV :: struct { sType: StructureType, pNext: rawptr, @@ -6502,48 +7533,105 @@ DeviceDiagnosticsConfigCreateInfoNV :: struct { flags: DeviceDiagnosticsConfigFlagsNV, } -CudaModuleCreateInfoNV :: struct { - sType: StructureType, - pNext: rawptr, - dataSize: int, - pData: rawptr, +PerfHintInfoQCOM :: struct { + sType: StructureType, + pNext: rawptr, + type: PerfHintTypeQCOM, + scale: u32, } -CudaFunctionCreateInfoNV :: struct { - sType: StructureType, - pNext: rawptr, - module: CudaModuleNV, - pName: cstring, +PhysicalDeviceQueuePerfHintFeaturesQCOM :: struct { + sType: StructureType, + pNext: rawptr, + queuePerfHint: b32, } -CudaLaunchInfoNV :: struct { - sType: StructureType, - pNext: rawptr, - function: CudaFunctionNV, - gridDimX: u32, - gridDimY: u32, - gridDimZ: u32, - blockDimX: u32, - blockDimY: u32, - blockDimZ: u32, - sharedMemBytes: u32, - paramCount: int, - pParams: [^]rawptr, - extraCount: int, - pExtras: [^]rawptr, +PhysicalDeviceQueuePerfHintPropertiesQCOM :: struct { + sType: StructureType, + pNext: rawptr, + supportedQueues: QueueFlags, } -PhysicalDeviceCudaKernelLaunchFeaturesNV :: struct { +PhysicalDeviceImageProcessing3FeaturesQCOM :: struct { + sType: StructureType, + pNext: rawptr, + imageGatherLinear: b32, + imageGatherExtendedModes: b32, + blockMatchExtendedClampToEdge: b32, +} + +PhysicalDeviceShaderMultipleWaitQueuesFeaturesQCOM :: struct { sType: StructureType, pNext: rawptr, - cudaKernelLaunchFeatures: b32, + shaderMultipleWaitQueues: b32, } -PhysicalDeviceCudaKernelLaunchPropertiesNV :: struct { - sType: StructureType, - pNext: rawptr, - computeCapabilityMinor: u32, - computeCapabilityMajor: u32, +PhysicalDeviceShaderMultipleWaitQueuesPropertiesQCOM :: struct { + sType: StructureType, + pNext: rawptr, + maxShaderWaitQueues: u32, +} + +PhysicalDeviceShaderSplitBarrierFeaturesEXT :: struct { + sType: StructureType, + pNext: rawptr, + shaderSplitBarrier: b32, +} + +PhysicalDeviceShaderSplitBarrierPropertiesEXT :: struct { + sType: StructureType, + pNext: rawptr, + splitBarrierReservedSharedMemory: u32, +} + +PhysicalDeviceTileShadingFeaturesQCOM :: struct { + sType: StructureType, + pNext: rawptr, + tileShading: b32, + tileShadingFragmentStage: b32, + tileShadingColorAttachments: b32, + tileShadingDepthAttachments: b32, + tileShadingStencilAttachments: b32, + tileShadingInputAttachments: b32, + tileShadingSampledAttachments: b32, + tileShadingPerTileDraw: b32, + tileShadingPerTileDispatch: b32, + tileShadingDispatchTile: b32, + tileShadingApron: b32, + tileShadingAnisotropicApron: b32, + tileShadingAtomicOps: b32, + tileShadingImageProcessing: b32, +} + +PhysicalDeviceTileShadingPropertiesQCOM :: struct { + sType: StructureType, + pNext: rawptr, + maxApronSize: u32, + preferNonCoherent: b32, + tileGranularity: Extent2D, + maxTileShadingRate: Extent2D, +} + +RenderPassTileShadingCreateInfoQCOM :: struct { + sType: StructureType, + pNext: rawptr, + flags: TileShadingRenderPassFlagsQCOM, + tileApronSize: Extent2D, +} + +PerTileBeginInfoQCOM :: struct { + sType: StructureType, + pNext: rawptr, +} + +PerTileEndInfoQCOM :: struct { + sType: StructureType, + pNext: rawptr, +} + +DispatchTileInfoQCOM :: struct { + sType: StructureType, + pNext: rawptr, } QueryLowLatencySupportNV :: struct { @@ -6590,12 +7678,6 @@ PhysicalDeviceDescriptorBufferPropertiesEXT :: struct { descriptorBufferAddressSpaceSize: DeviceSize, } -PhysicalDeviceDescriptorBufferDensityMapPropertiesEXT :: struct { - sType: StructureType, - pNext: rawptr, - combinedImageSamplerDensityMapDescriptorSize: int, -} - PhysicalDeviceDescriptorBufferFeaturesEXT :: struct { sType: StructureType, pNext: rawptr, @@ -6683,6 +7765,12 @@ AccelerationStructureCaptureDescriptorDataInfoEXT :: struct { accelerationStructureNV: AccelerationStructureNV, } +PhysicalDeviceDescriptorBufferDensityMapPropertiesEXT :: struct { + sType: StructureType, + pNext: rawptr, + combinedImageSamplerDensityMapDescriptorSize: int, +} + PhysicalDeviceGraphicsPipelineLibraryFeaturesEXT :: struct { sType: StructureType, pNext: rawptr, @@ -6890,41 +7978,15 @@ DeviceFaultCountsEXT :: struct { vendorBinarySize: DeviceSize, } -DeviceFaultAddressInfoEXT :: struct { - addressType: DeviceFaultAddressTypeEXT, - reportedAddress: DeviceAddress, - addressPrecision: DeviceSize, -} - -DeviceFaultVendorInfoEXT :: struct { - description: [MAX_DESCRIPTION_SIZE]byte, - vendorFaultCode: u64, - vendorFaultData: u64, -} - DeviceFaultInfoEXT :: struct { sType: StructureType, pNext: rawptr, description: [MAX_DESCRIPTION_SIZE]byte, - pAddressInfos: [^]DeviceFaultAddressInfoEXT, - pVendorInfos: [^]DeviceFaultVendorInfoEXT, + pAddressInfos: [^]DeviceFaultAddressInfoKHR, + pVendorInfos: [^]DeviceFaultVendorInfoKHR, pVendorBinaryData: rawptr, } -DeviceFaultVendorBinaryHeaderVersionOneEXT :: struct { - headerSize: u32, - headerVersion: DeviceFaultVendorBinaryHeaderVersionEXT, - vendorID: u32, - deviceID: u32, - driverVersion: u32, - pipelineCacheUUID: [UUID_SIZE]u8, - applicationNameOffset: u32, - applicationVersion: u32, - engineNameOffset: u32, - engineVersion: u32, - apiVersion: u32, -} - PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT :: struct { sType: StructureType, pNext: rawptr, @@ -7026,12 +8088,6 @@ PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT :: struct { primitiveTopologyPatchListRestart: b32, } -PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT :: struct { - sType: StructureType, - pNext: rawptr, - presentModeFifoLatestReady: b32, -} - SubpassShadingPipelineCreateInfoHUAWEI :: struct { sType: StructureType, pNext: rawptr, @@ -7150,6 +8206,36 @@ PhysicalDevicePrimitivesGeneratedQueryFeaturesEXT :: struct { primitivesGeneratedQueryWithNonZeroStreams: b32, } +PhysicalDeviceVideoEncodeRgbConversionFeaturesVALVE :: struct { + sType: StructureType, + pNext: rawptr, + videoEncodeRgbConversion: b32, +} + +VideoEncodeRgbConversionCapabilitiesVALVE :: struct { + sType: StructureType, + pNext: rawptr, + rgbModels: VideoEncodeRgbModelConversionFlagsVALVE, + rgbRanges: VideoEncodeRgbRangeCompressionFlagsVALVE, + xChromaOffsets: VideoEncodeRgbChromaOffsetFlagsVALVE, + yChromaOffsets: VideoEncodeRgbChromaOffsetFlagsVALVE, +} + +VideoEncodeProfileRgbConversionInfoVALVE :: struct { + sType: StructureType, + pNext: rawptr, + performEncodeRgbConversion: b32, +} + +VideoEncodeSessionRgbConversionCreateInfoVALVE :: struct { + sType: StructureType, + pNext: rawptr, + rgbModel: VideoEncodeRgbModelConversionFlagsVALVE, + rgbRange: VideoEncodeRgbRangeCompressionFlagsVALVE, + xChromaOffset: VideoEncodeRgbChromaOffsetFlagsVALVE, + yChromaOffset: VideoEncodeRgbChromaOffsetFlagsVALVE, +} + PhysicalDeviceImageViewMinLodFeaturesEXT :: struct { sType: StructureType, pNext: rawptr, @@ -7312,12 +8398,6 @@ AccelerationStructureTrianglesOpacityMicromapEXT :: struct { micromap: MicromapEXT, } -MicromapTriangleEXT :: struct { - dataOffset: u32, - subdivisionLevel: u16, - format: u16, -} - PhysicalDeviceClusterCullingShaderFeaturesHUAWEI :: struct { sType: StructureType, pNext: rawptr, @@ -7386,6 +8466,22 @@ PhysicalDeviceSchedulingControlsPropertiesARM :: struct { schedulingControlsFlags: PhysicalDeviceSchedulingControlsFlagsARM, } +DispatchParametersARM :: struct { + sType: StructureType, + pNext: rawptr, + workGroupBatchSize: u32, + maxQueuedWorkGroupBatches: u32, + maxWarpsPerShaderCore: u32, +} + +PhysicalDeviceSchedulingControlsDispatchParametersPropertiesARM :: struct { + sType: StructureType, + pNext: rawptr, + schedulingControlsMaxWarpsCount: u32, + schedulingControlsMaxQueuedBatchesCount: u32, + schedulingControlsMaxWorkGroupBatchSize: u32, +} + PhysicalDeviceImageSlicedViewOf3DFeaturesEXT :: struct { sType: StructureType, pNext: rawptr, @@ -7458,70 +8554,49 @@ RenderPassStripeSubmitInfoARM :: struct { pStripeSemaphoreInfos: [^]SemaphoreSubmitInfo, } -PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM :: struct { +PhysicalDeviceFragmentDensityMapOffsetFeaturesEXT :: struct { sType: StructureType, pNext: rawptr, fragmentDensityMapOffset: b32, } -PhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM :: struct { +PhysicalDeviceFragmentDensityMapOffsetPropertiesEXT :: struct { sType: StructureType, pNext: rawptr, fragmentDensityOffsetGranularity: Extent2D, } -SubpassFragmentDensityMapOffsetEndInfoQCOM :: struct { +RenderPassFragmentDensityMapOffsetEndInfoEXT :: struct { sType: StructureType, pNext: rawptr, fragmentDensityOffsetCount: u32, pFragmentDensityOffsets: [^]Offset2D, } -CopyMemoryIndirectCommandNV :: struct { - srcAddress: DeviceAddress, - dstAddress: DeviceAddress, - size: DeviceSize, -} - -CopyMemoryToImageIndirectCommandNV :: struct { - srcAddress: DeviceAddress, - bufferRowLength: u32, - bufferImageHeight: u32, - imageSubresource: ImageSubresourceLayers, - imageOffset: Offset3D, - imageExtent: Extent3D, -} - PhysicalDeviceCopyMemoryIndirectFeaturesNV :: struct { sType: StructureType, pNext: rawptr, indirectCopy: b32, } -PhysicalDeviceCopyMemoryIndirectPropertiesNV :: struct { - sType: StructureType, - pNext: rawptr, - supportedQueues: QueueFlags, -} - DecompressMemoryRegionNV :: struct { srcAddress: DeviceAddress, dstAddress: DeviceAddress, compressedSize: DeviceSize, decompressedSize: DeviceSize, - decompressionMethod: MemoryDecompressionMethodFlagsNV, + decompressionMethod: MemoryDecompressionMethodFlagsEXT, } -PhysicalDeviceMemoryDecompressionFeaturesNV :: struct { +PhysicalDeviceMemoryDecompressionFeaturesEXT :: struct { sType: StructureType, pNext: rawptr, memoryDecompression: b32, } -PhysicalDeviceMemoryDecompressionPropertiesNV :: struct { +PhysicalDeviceMemoryDecompressionPropertiesEXT :: struct { sType: StructureType, pNext: rawptr, - decompressionMethods: MemoryDecompressionMethodFlagsNV, + decompressionMethods: MemoryDecompressionMethodFlagsEXT, maxDecompressionIndirectCount: u64, } @@ -7754,6 +8829,192 @@ DirectDriverLoadingListLUNARG :: struct { pDrivers: [^]DirectDriverLoadingInfoLUNARG, } +TensorDescriptionARM :: struct { + sType: StructureType, + pNext: rawptr, + tiling: TensorTilingARM, + format: Format, + dimensionCount: u32, + pDimensions: [^]i64, + pStrides: [^]i64, + usage: TensorUsageFlagsARM, +} + +TensorCreateInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + flags: TensorCreateFlagsARM, + pDescription: ^TensorDescriptionARM, + sharingMode: SharingMode, + queueFamilyIndexCount: u32, + pQueueFamilyIndices: [^]u32, +} + +TensorMemoryRequirementsInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + tensor: TensorARM, +} + +BindTensorMemoryInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + tensor: TensorARM, + memory: DeviceMemory, + memoryOffset: DeviceSize, +} + +WriteDescriptorSetTensorARM :: struct { + sType: StructureType, + pNext: rawptr, + tensorViewCount: u32, + pTensorViews: [^]TensorViewARM, +} + +TensorFormatPropertiesARM :: struct { + sType: StructureType, + pNext: rawptr, + optimalTilingTensorFeatures: FormatFeatureFlags2, + linearTilingTensorFeatures: FormatFeatureFlags2, +} + +PhysicalDeviceTensorPropertiesARM :: struct { + sType: StructureType, + pNext: rawptr, + maxTensorDimensionCount: u32, + maxTensorElements: u64, + maxPerDimensionTensorElements: u64, + maxTensorStride: i64, + maxTensorSize: u64, + maxTensorShaderAccessArrayLength: u32, + maxTensorShaderAccessSize: u32, + maxDescriptorSetStorageTensors: u32, + maxPerStageDescriptorSetStorageTensors: u32, + maxDescriptorSetUpdateAfterBindStorageTensors: u32, + maxPerStageDescriptorUpdateAfterBindStorageTensors: u32, + shaderStorageTensorArrayNonUniformIndexingNative: b32, + shaderTensorSupportedStages: ShaderStageFlags, +} + +TensorMemoryBarrierARM :: struct { + sType: StructureType, + pNext: rawptr, + srcStageMask: PipelineStageFlags2, + srcAccessMask: AccessFlags2, + dstStageMask: PipelineStageFlags2, + dstAccessMask: AccessFlags2, + srcQueueFamilyIndex: u32, + dstQueueFamilyIndex: u32, + tensor: TensorARM, +} + +TensorDependencyInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + tensorMemoryBarrierCount: u32, + pTensorMemoryBarriers: [^]TensorMemoryBarrierARM, +} + +PhysicalDeviceTensorFeaturesARM :: struct { + sType: StructureType, + pNext: rawptr, + tensorNonPacked: b32, + shaderTensorAccess: b32, + shaderStorageTensorArrayDynamicIndexing: b32, + shaderStorageTensorArrayNonUniformIndexing: b32, + descriptorBindingStorageTensorUpdateAfterBind: b32, + tensors: b32, +} + +DeviceTensorMemoryRequirementsARM :: struct { + sType: StructureType, + pNext: rawptr, + pCreateInfo: ^TensorCreateInfoARM, +} + +TensorCopyARM :: struct { + sType: StructureType, + pNext: rawptr, + dimensionCount: u32, + pSrcOffset: ^u64, + pDstOffset: ^u64, + pExtent: ^u64, +} + +CopyTensorInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + srcTensor: TensorARM, + dstTensor: TensorARM, + regionCount: u32, + pRegions: [^]TensorCopyARM, +} + +MemoryDedicatedAllocateInfoTensorARM :: struct { + sType: StructureType, + pNext: rawptr, + tensor: TensorARM, +} + +PhysicalDeviceExternalTensorInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + flags: TensorCreateFlagsARM, + pDescription: ^TensorDescriptionARM, + handleType: ExternalMemoryHandleTypeFlags, +} + +ExternalTensorPropertiesARM :: struct { + sType: StructureType, + pNext: rawptr, + externalMemoryProperties: ExternalMemoryProperties, +} + +ExternalMemoryTensorCreateInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + handleTypes: ExternalMemoryHandleTypeFlags, +} + +PhysicalDeviceDescriptorBufferTensorFeaturesARM :: struct { + sType: StructureType, + pNext: rawptr, + descriptorBufferTensorDescriptors: b32, +} + +PhysicalDeviceDescriptorBufferTensorPropertiesARM :: struct { + sType: StructureType, + pNext: rawptr, + tensorCaptureReplayDescriptorDataSize: int, + tensorViewCaptureReplayDescriptorDataSize: int, + tensorDescriptorSize: int, +} + +DescriptorGetTensorInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + tensorView: TensorViewARM, +} + +TensorCaptureDescriptorDataInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + tensor: TensorARM, +} + +TensorViewCaptureDescriptorDataInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + tensorView: TensorViewARM, +} + +FrameBoundaryTensorsARM :: struct { + sType: StructureType, + pNext: rawptr, + tensorCount: u32, + pTensors: [^]TensorARM, +} + PhysicalDeviceShaderModuleIdentifierFeaturesEXT :: struct { sType: StructureType, pNext: rawptr, @@ -7942,7 +9203,7 @@ PhysicalDeviceMultiviewPerViewViewportsFeaturesQCOM :: struct { PhysicalDeviceRayTracingInvocationReorderPropertiesNV :: struct { sType: StructureType, pNext: rawptr, - rayTracingInvocationReorderReorderingHint: RayTracingInvocationReorderModeNV, + rayTracingInvocationReorderReorderingHint: RayTracingInvocationReorderModeEXT, } PhysicalDeviceRayTracingInvocationReorderFeaturesNV :: struct { @@ -8135,6 +9396,185 @@ LatencySurfaceCapabilitiesNV :: struct { pPresentModes: [^]PresentModeKHR, } +PhysicalDeviceDataGraphFeaturesARM :: struct { + sType: StructureType, + pNext: rawptr, + dataGraph: b32, + dataGraphUpdateAfterBind: b32, + dataGraphSpecializationConstants: b32, + dataGraphDescriptorBuffer: b32, + dataGraphShaderModule: b32, +} + +DataGraphPipelineConstantARM :: struct { + sType: StructureType, + pNext: rawptr, + id: u32, + pConstantData: rawptr, +} + +DataGraphPipelineResourceInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + descriptorSet: u32, + binding: u32, + arrayElement: u32, +} + +DataGraphPipelineCompilerControlCreateInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + pVendorOptions: cstring, +} + +DataGraphPipelineCreateInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + flags: PipelineCreateFlags2, + layout: PipelineLayout, + resourceInfoCount: u32, + pResourceInfos: [^]DataGraphPipelineResourceInfoARM, +} + +DataGraphPipelineShaderModuleCreateInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + module: ShaderModule, + pName: cstring, + pSpecializationInfo: ^SpecializationInfo, + constantCount: u32, + pConstants: [^]DataGraphPipelineConstantARM, +} + +DataGraphPipelineSessionCreateInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + flags: DataGraphPipelineSessionCreateFlagsARM, + dataGraphPipeline: Pipeline, +} + +DataGraphPipelineSessionBindPointRequirementsInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + session: DataGraphPipelineSessionARM, +} + +DataGraphPipelineSessionBindPointRequirementARM :: struct { + sType: StructureType, + pNext: rawptr, + bindPoint: DataGraphPipelineSessionBindPointARM, + bindPointType: DataGraphPipelineSessionBindPointTypeARM, + numObjects: u32, +} + +DataGraphPipelineSessionMemoryRequirementsInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + session: DataGraphPipelineSessionARM, + bindPoint: DataGraphPipelineSessionBindPointARM, + objectIndex: u32, +} + +BindDataGraphPipelineSessionMemoryInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + session: DataGraphPipelineSessionARM, + bindPoint: DataGraphPipelineSessionBindPointARM, + objectIndex: u32, + memory: DeviceMemory, + memoryOffset: DeviceSize, +} + +DataGraphPipelineInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + dataGraphPipeline: Pipeline, +} + +DataGraphPipelinePropertyQueryResultARM :: struct { + sType: StructureType, + pNext: rawptr, + property: DataGraphPipelinePropertyARM, + isText: b32, + dataSize: int, + pData: rawptr, +} + +DataGraphPipelineIdentifierCreateInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + identifierSize: u32, + pIdentifier: ^u8, +} + +DataGraphPipelineDispatchInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + flags: DataGraphPipelineDispatchFlagsARM, +} + +PhysicalDeviceDataGraphProcessingEngineARM :: struct { + type: PhysicalDeviceDataGraphProcessingEngineTypeARM, + isForeign: b32, +} + +PhysicalDeviceDataGraphOperationSupportARM :: struct { + operationType: PhysicalDeviceDataGraphOperationTypeARM, + name: [MAX_PHYSICAL_DEVICE_DATA_GRAPH_OPERATION_SET_NAME_SIZE_ARM]byte, + version: u32, +} + +QueueFamilyDataGraphPropertiesARM :: struct { + sType: StructureType, + pNext: rawptr, + engine: PhysicalDeviceDataGraphProcessingEngineARM, + operation: PhysicalDeviceDataGraphOperationSupportARM, +} + +DataGraphProcessingEngineCreateInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + processingEngineCount: u32, + pProcessingEngines: [^]PhysicalDeviceDataGraphProcessingEngineARM, +} + +PhysicalDeviceQueueFamilyDataGraphProcessingEngineInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + queueFamilyIndex: u32, + engineType: PhysicalDeviceDataGraphProcessingEngineTypeARM, +} + +QueueFamilyDataGraphProcessingEnginePropertiesARM :: struct { + sType: StructureType, + pNext: rawptr, + foreignSemaphoreHandleTypes: ExternalSemaphoreHandleTypeFlags, + foreignMemoryHandleTypes: ExternalMemoryHandleTypeFlags, +} + +DataGraphPipelineConstantTensorSemiStructuredSparsityInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + dimension: u32, + zeroCount: u32, + groupSize: u32, +} + +DataGraphTOSANameQualityARM :: struct { + name: [MAX_DATA_GRAPH_TOSA_NAME_SIZE_ARM]byte, + qualityFlags: DataGraphTOSAQualityFlagsARM, +} + +QueueFamilyDataGraphTOSAPropertiesARM :: struct { + sType: StructureType, + pNext: rawptr, + profileCount: u32, + pProfiles: [^]DataGraphTOSANameQualityARM, + extensionCount: u32, + pExtensions: [^]DataGraphTOSANameQualityARM, + level: DataGraphTOSALevelARM, +} + PhysicalDeviceMultiviewPerViewRenderAreasFeaturesQCOM :: struct { sType: StructureType, pNext: rawptr, @@ -8229,6 +9669,53 @@ PhysicalDeviceDescriptorPoolOverallocationFeaturesNV :: struct { descriptorPoolOverallocation: b32, } +PhysicalDeviceTileMemoryHeapFeaturesQCOM :: struct { + sType: StructureType, + pNext: rawptr, + tileMemoryHeap: b32, +} + +PhysicalDeviceTileMemoryHeapPropertiesQCOM :: struct { + sType: StructureType, + pNext: rawptr, + queueSubmitBoundary: b32, + tileBufferTransfers: b32, +} + +TileMemoryRequirementsQCOM :: struct { + sType: StructureType, + pNext: rawptr, + size: DeviceSize, + alignment: DeviceSize, +} + +TileMemoryBindInfoQCOM :: struct { + sType: StructureType, + pNext: rawptr, + memory: DeviceMemory, +} + +TileMemorySizeInfoQCOM :: struct { + sType: StructureType, + pNext: rawptr, + size: DeviceSize, +} + +DecompressMemoryRegionEXT :: struct { + srcAddress: DeviceAddress, + dstAddress: DeviceAddress, + compressedSize: DeviceSize, + decompressedSize: DeviceSize, +} + +DecompressMemoryInfoEXT :: struct { + sType: StructureType, + pNext: rawptr, + decompressionMethod: MemoryDecompressionMethodFlagsEXT, + regionCount: u32, + pRegions: [^]DecompressMemoryRegionEXT, +} + DisplaySurfaceStereoCreateInfoNV :: struct { sType: StructureType, pNext: rawptr, @@ -8247,6 +9734,31 @@ PhysicalDeviceRawAccessChainsFeaturesNV :: struct { shaderRawAccessChains: b32, } +ExternalComputeQueueDeviceCreateInfoNV :: struct { + sType: StructureType, + pNext: rawptr, + reservedExternalQueues: u32, +} + +ExternalComputeQueueCreateInfoNV :: struct { + sType: StructureType, + pNext: rawptr, + preferredQueue: Queue, +} + +ExternalComputeQueueDataParamsNV :: struct { + sType: StructureType, + pNext: rawptr, + deviceIndex: u32, +} + +PhysicalDeviceExternalComputeQueuePropertiesNV :: struct { + sType: StructureType, + pNext: rawptr, + externalDataSize: u32, + maxExternalQueues: u32, +} + PhysicalDeviceCommandBufferInheritanceFeaturesNV :: struct { sType: StructureType, pNext: rawptr, @@ -8265,6 +9777,13 @@ PhysicalDeviceShaderReplicatedCompositesFeaturesEXT :: struct { shaderReplicatedComposites: b32, } +PhysicalDeviceShaderFloat8FeaturesEXT :: struct { + sType: StructureType, + pNext: rawptr, + shaderFloat8: b32, + shaderFloat8CooperativeMatrix: b32, +} + PhysicalDeviceRayTracingValidationFeaturesNV :: struct { sType: StructureType, pNext: rawptr, @@ -8429,6 +9948,10 @@ ClusterAccelerationStructureInstantiateClusterInfoNV :: struct { vertexBuffer: StridedDeviceAddressNV, } +ClusterAccelerationStructureGetTemplateIndicesInfoNV :: struct { + clusterTemplateAddress: DeviceAddress, +} + AccelerationStructureBuildSizesInfoKHR :: struct { sType: StructureType, pNext: rawptr, @@ -8709,6 +10232,40 @@ ImageAlignmentControlCreateInfoMESA :: struct { maximumRequestedAlignment: u32, } +PushConstantBankInfoNV :: struct { + sType: StructureType, + pNext: rawptr, + bank: u32, +} + +PhysicalDevicePushConstantBankFeaturesNV :: struct { + sType: StructureType, + pNext: rawptr, + pushConstantBank: b32, +} + +PhysicalDevicePushConstantBankPropertiesNV :: struct { + sType: StructureType, + pNext: rawptr, + maxGraphicsPushConstantBanks: u32, + maxComputePushConstantBanks: u32, + maxGraphicsPushDataBanks: u32, + maxComputePushDataBanks: u32, +} + +PhysicalDeviceRayTracingInvocationReorderPropertiesEXT :: struct { + sType: StructureType, + pNext: rawptr, + rayTracingInvocationReorderReorderingHint: RayTracingInvocationReorderModeEXT, + maxShaderBindingTableRecordIndex: u32, +} + +PhysicalDeviceRayTracingInvocationReorderFeaturesEXT :: struct { + sType: StructureType, + pNext: rawptr, + rayTracingInvocationReorder: b32, +} + PhysicalDeviceDepthClampControlFeaturesEXT :: struct { sType: StructureType, pNext: rawptr, @@ -8776,12 +10333,107 @@ PhysicalDevicePipelineOpacityMicromapFeaturesARM :: struct { pipelineOpacityMicromap: b32, } +PhysicalDevicePerformanceCountersByRegionFeaturesARM :: struct { + sType: StructureType, + pNext: rawptr, + performanceCountersByRegion: b32, +} + +PhysicalDevicePerformanceCountersByRegionPropertiesARM :: struct { + sType: StructureType, + pNext: rawptr, + maxPerRegionPerformanceCounters: u32, + performanceCounterRegionSize: Extent2D, + rowStrideAlignment: u32, + regionAlignment: u32, + identityTransformOrder: b32, +} + +PerformanceCounterARM :: struct { + sType: StructureType, + pNext: rawptr, + counterID: u32, +} + +PerformanceCounterDescriptionARM :: struct { + sType: StructureType, + pNext: rawptr, + flags: PerformanceCounterDescriptionFlagsARM, + name: [MAX_DESCRIPTION_SIZE]byte, +} + +RenderPassPerformanceCountersByRegionBeginInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + counterAddressCount: u32, + pCounterAddresses: [^]DeviceAddress, + serializeRegions: b32, + counterIndexCount: u32, + pCounterIndices: [^]u32, +} + +PhysicalDeviceShaderInstrumentationFeaturesARM :: struct { + sType: StructureType, + pNext: rawptr, + shaderInstrumentation: b32, +} + +PhysicalDeviceShaderInstrumentationPropertiesARM :: struct { + sType: StructureType, + pNext: rawptr, + numMetrics: u32, + perBasicBlockGranularity: b32, +} + +ShaderInstrumentationCreateInfoARM :: struct { + sType: StructureType, + pNext: rawptr, +} + +ShaderInstrumentationMetricDescriptionARM :: struct { + sType: StructureType, + pNext: rawptr, + name: [MAX_DESCRIPTION_SIZE]byte, + description: [MAX_DESCRIPTION_SIZE]byte, +} + +ShaderInstrumentationMetricDataHeaderARM :: struct { + resultIndex: u32, + resultSubIndex: u32, + stages: ShaderStageFlags, + basicBlockIndex: u32, +} + PhysicalDeviceVertexAttributeRobustnessFeaturesEXT :: struct { sType: StructureType, pNext: rawptr, vertexAttributeRobustness: b32, } +PhysicalDeviceFormatPackFeaturesARM :: struct { + sType: StructureType, + pNext: rawptr, + formatPack: b32, +} + +PhysicalDeviceFragmentDensityMapLayeredFeaturesVALVE :: struct { + sType: StructureType, + pNext: rawptr, + fragmentDensityMapLayered: b32, +} + +PhysicalDeviceFragmentDensityMapLayeredPropertiesVALVE :: struct { + sType: StructureType, + pNext: rawptr, + maxFragmentDensityMapLayers: u32, +} + +PipelineFragmentDensityMapLayeredCreateInfoVALVE :: struct { + sType: StructureType, + pNext: rawptr, + maxFragmentDensityMapLayers: u32, +} + SetPresentConfigNV :: struct { sType: StructureType, pNext: rawptr, @@ -8795,6 +10447,239 @@ PhysicalDevicePresentMeteringFeaturesNV :: struct { presentMetering: b32, } +PhysicalDeviceMultisampledRenderToSwapchainFeaturesEXT :: struct { + sType: StructureType, + pNext: rawptr, + multisampledRenderToSwapchain: b32, +} + +SwapchainFlagsSurfaceCapabilitiesEXT :: struct { + sType: StructureType, + pNext: rawptr, + swapchainSupportedFlags: SwapchainCreateFlagsKHR, +} + +PhysicalDeviceZeroInitializeDeviceMemoryFeaturesEXT :: struct { + sType: StructureType, + pNext: rawptr, + zeroInitializeDeviceMemory: b32, +} + +PhysicalDeviceShader64BitIndexingFeaturesEXT :: struct { + sType: StructureType, + pNext: rawptr, + shader64BitIndexing: b32, +} + +PhysicalDeviceCustomResolveFeaturesEXT :: struct { + sType: StructureType, + pNext: rawptr, + customResolve: b32, +} + +BeginCustomResolveInfoEXT :: struct { + sType: StructureType, + pNext: rawptr, +} + +CustomResolveCreateInfoEXT :: struct { + sType: StructureType, + pNext: rawptr, + customResolve: b32, + colorAttachmentCount: u32, + pColorAttachmentFormats: [^]Format, + depthAttachmentFormat: Format, + stencilAttachmentFormat: Format, +} + +PipelineCacheHeaderVersionDataGraphQCOM :: struct { + headerSize: u32, + headerVersion: PipelineCacheHeaderVersion, + cacheType: DataGraphModelCacheTypeQCOM, + cacheVersion: u32, + toolchainVersion: [DATA_GRAPH_MODEL_TOOLCHAIN_VERSION_LENGTH_QCOM]u32, +} + +DataGraphPipelineBuiltinModelCreateInfoQCOM :: struct { + sType: StructureType, + pNext: rawptr, + pOperation: ^PhysicalDeviceDataGraphOperationSupportARM, +} + +PhysicalDeviceDataGraphModelFeaturesQCOM :: struct { + sType: StructureType, + pNext: rawptr, + dataGraphModel: b32, +} + +PhysicalDeviceDataGraphOpticalFlowFeaturesARM :: struct { + sType: StructureType, + pNext: rawptr, + dataGraphOpticalFlow: b32, +} + +QueueFamilyDataGraphOpticalFlowPropertiesARM :: struct { + sType: StructureType, + pNext: rawptr, + supportedOutputGridSizes: DataGraphOpticalFlowGridSizeFlagsARM, + supportedHintGridSizes: DataGraphOpticalFlowGridSizeFlagsARM, + hintSupported: b32, + costSupported: b32, + minWidth: u32, + minHeight: u32, + maxWidth: u32, + maxHeight: u32, +} + +DataGraphPipelineOpticalFlowCreateInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + width: u32, + height: u32, + imageFormat: Format, + flowVectorFormat: Format, + costFormat: Format, + outputGridSize: DataGraphOpticalFlowGridSizeFlagsARM, + hintGridSize: DataGraphOpticalFlowGridSizeFlagsARM, + performanceLevel: DataGraphOpticalFlowPerformanceLevelARM, + flags: DataGraphOpticalFlowCreateFlagsARM, +} + +DataGraphOpticalFlowImageFormatPropertiesARM :: struct { + sType: StructureType, + pNext: rawptr, + format: Format, +} + +DataGraphOpticalFlowImageFormatInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + usage: DataGraphOpticalFlowImageUsageFlagsARM, +} + +DataGraphPipelineOpticalFlowDispatchInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + flags: DataGraphOpticalFlowExecuteFlagsARM, + meanFlowL1NormHint: u32, +} + +DataGraphPipelineResourceInfoImageLayoutARM :: struct { + sType: StructureType, + pNext: rawptr, + layout: ImageLayout, +} + +DataGraphPipelineSingleNodeConnectionARM :: struct { + sType: StructureType, + pNext: rawptr, + set: u32, + binding: u32, + connection: DataGraphPipelineNodeConnectionTypeARM, +} + +DataGraphPipelineSingleNodeCreateInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + nodeType: DataGraphPipelineNodeTypeARM, + connectionCount: u32, + pConnections: [^]DataGraphPipelineSingleNodeConnectionARM, +} + +PhysicalDeviceShaderLongVectorFeaturesEXT :: struct { + sType: StructureType, + pNext: rawptr, + longVector: b32, +} + +PhysicalDeviceShaderLongVectorPropertiesEXT :: struct { + sType: StructureType, + pNext: rawptr, + maxVectorComponents: u32, +} + +PhysicalDevicePipelineCacheIncrementalModeFeaturesSEC :: struct { + sType: StructureType, + pNext: rawptr, + pipelineCacheIncrementalMode: b32, +} + +PhysicalDeviceShaderUniformBufferUnsizedArrayFeaturesEXT :: struct { + sType: StructureType, + pNext: rawptr, + shaderUniformBufferUnsizedArray: b32, +} + +ComputeOccupancyPriorityParametersNV :: struct { + sType: StructureType, + pNext: rawptr, + occupancyPriority: f32, + occupancyThrottling: f32, +} + +PhysicalDeviceComputeOccupancyPriorityFeaturesNV :: struct { + sType: StructureType, + pNext: rawptr, + computeOccupancyPriority: b32, +} + +PhysicalDeviceShaderSubgroupPartitionedFeaturesEXT :: struct { + sType: StructureType, + pNext: rawptr, + shaderSubgroupPartitioned: b32, +} + +PhysicalDeviceShaderMixedFloatDotProductFeaturesVALVE :: struct { + sType: StructureType, + pNext: rawptr, + shaderMixedFloatDotProductFloat16AccFloat32: b32, + shaderMixedFloatDotProductFloat16AccFloat16: b32, + shaderMixedFloatDotProductBFloat16Acc: b32, + shaderMixedFloatDotProductFloat8AccFloat32: b32, +} + +ThrottleHintSubmitInfoSEC :: struct { + sType: StructureType, + pNext: rawptr, + throttleHint: ThrottleHintTypeSEC, +} + +PhysicalDeviceThrottleHintFeaturesSEC :: struct { + sType: StructureType, + pNext: rawptr, + throttleHint: b32, +} + +PhysicalDeviceDataGraphNeuralAcceleratorStatisticsFeaturesARM :: struct { + sType: StructureType, + pNext: rawptr, + dataGraphNeuralAcceleratorStatistics: b32, +} + +DataGraphPipelineNeuralStatisticsCreateInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + allowNeuralStatistics: b32, +} + +DataGraphPipelineSessionNeuralStatisticsCreateInfoARM :: struct { + sType: StructureType, + pNext: rawptr, + mode: NeuralAcceleratorStatisticsModeARM, +} + +PhysicalDevicePrimitiveRestartIndexFeaturesEXT :: struct { + sType: StructureType, + pNext: rawptr, + primitiveRestartIndex: b32, +} + +PhysicalDeviceCooperativeMatrixDecodeVectorFeaturesNV :: struct { + sType: StructureType, + pNext: rawptr, + cooperativeMatrixDecodeVector: b32, +} + AccelerationStructureBuildRangeInfoKHR :: struct { primitiveCount: u32, primitiveOffset: u32, @@ -9440,6 +11325,50 @@ PipelineShaderStageNodeCreateInfoAMDX :: struct { index: u32, } +CudaModuleCreateInfoNV :: struct { + sType: StructureType, + pNext: rawptr, + dataSize: int, + pData: rawptr, +} + +CudaFunctionCreateInfoNV :: struct { + sType: StructureType, + pNext: rawptr, + module: CudaModuleNV, + pName: cstring, +} + +CudaLaunchInfoNV :: struct { + sType: StructureType, + pNext: rawptr, + function: CudaFunctionNV, + gridDimX: u32, + gridDimY: u32, + gridDimZ: u32, + blockDimX: u32, + blockDimY: u32, + blockDimZ: u32, + sharedMemBytes: u32, + paramCount: int, + pParams: [^]rawptr, + extraCount: int, + pExtras: [^]rawptr, +} + +PhysicalDeviceCudaKernelLaunchFeaturesNV :: struct { + sType: StructureType, + pNext: rawptr, + cudaKernelLaunchFeatures: b32, +} + +PhysicalDeviceCudaKernelLaunchPropertiesNV :: struct { + sType: StructureType, + pNext: rawptr, + computeCapabilityMinor: u32, + computeCapabilityMajor: u32, +} + PhysicalDeviceDisplacementMicromapFeaturesNV :: struct { sType: StructureType, pNext: rawptr, @@ -9473,6 +11402,24 @@ AccelerationStructureTrianglesDisplacementMicromapNV :: struct { micromap: MicromapEXT, } +PhysicalDeviceDenseGeometryFormatFeaturesAMDX :: struct { + sType: StructureType, + pNext: rawptr, + denseGeometryFormat: b32, +} + +AccelerationStructureDenseGeometryFormatTrianglesDataAMDX :: struct { + sType: StructureType, + pNext: rawptr, + compressedData: DeviceOrHostAddressConstKHR, + dataSize: DeviceSize, + numTriangles: u32, + numVertices: u32, + maxPrimitiveIndex: u32, + maxGeometryIndex: u32, + format: CompressedTriangleFormatAMDX, +} + VideoAV1ColorConfigFlags :: distinct bit_set[VideoAV1ColorConfigFlag; u32] VideoAV1ColorConfigFlag :: enum u32 { mono_chrome, @@ -10595,6 +12542,85 @@ VideoEncodeH265ReferenceInfo :: struct { TemporalId: u8, } +VideoDecodeVP9PictureInfoFlags :: distinct bit_set[VideoDecodeVP9PictureInfoFlag; u32] +VideoDecodeVP9PictureInfoFlag :: enum u32 { + error_resilient_mode, + intra_only, + allow_high_precision_mv, + refresh_frame_context, + frame_parallel_decoding_mode, + segmentation_enabled, + show_frame, + UsePrevFrameMvs, +} + +VideoDecodeVP9PictureInfo :: struct { + flags: VideoDecodeVP9PictureInfoFlags, + profile: VideoVP9Profile, + frame_type: VideoVP9FrameType, + frame_context_idx: u8, + reset_frame_context: u8, + refresh_frame_flags: u8, + ref_frame_sign_bias_mask: u8, + interpolation_filter: VideoVP9InterpolationFilter, + base_q_idx: u8, + delta_q_y_dc: i8, + delta_q_uv_dc: i8, + delta_q_uv_ac: i8, + tile_cols_log2: u8, + tile_rows_log2: u8, + reserved1: [3]u16, + pColorConfig: ^VideoVP9ColorConfig, + pLoopFilter: ^VideoVP9LoopFilter, + pSegmentation: ^VideoVP9Segmentation, +} + +VideoVP9ColorConfigFlags :: distinct bit_set[VideoVP9ColorConfigFlag; u32] +VideoVP9ColorConfigFlag :: enum u32 { + color_range, +} + +VideoVP9ColorConfig :: struct { + flags: VideoVP9ColorConfigFlags, + BitDepth: u8, + subsampling_x: u8, + subsampling_y: u8, + reserved1: u8, + color_space: VideoVP9ColorSpace, +} + +VideoVP9LoopFilterFlags :: distinct bit_set[VideoVP9LoopFilterFlag; u32] +VideoVP9LoopFilterFlag :: enum u32 { + loop_filter_delta_enabled, + loop_filter_delta_update, +} + +VideoVP9LoopFilter :: struct { + flags: VideoVP9LoopFilterFlags, + loop_filter_level: u8, + loop_filter_sharpness: u8, + update_ref_delta: u8, + loop_filter_ref_deltas: [VIDEO_VP9_MAX_REF_FRAMES]i8, + update_mode_delta: u8, + loop_filter_mode_deltas: [VIDEO_VP9_LOOP_FILTER_ADJUSTMENTS]i8, +} + +VideoVP9SegmentationFlags :: distinct bit_set[VideoVP9SegmentationFlag; u32] +VideoVP9SegmentationFlag :: enum u32 { + segmentation_update_map, + segmentation_temporal_update, + segmentation_update_data, + segmentation_abs_or_delta_update, +} + +VideoVP9Segmentation :: struct { + flags: VideoVP9SegmentationFlags, + segmentation_tree_probs: [VIDEO_VP9_MAX_SEGMENTATION_TREE_PROBS]u8, + segmentation_pred_prob: [VIDEO_VP9_MAX_SEGMENTATION_PRED_PROB]u8, + FeatureEnabled: [VIDEO_VP9_MAX_SEGMENTS]u8, + FeatureData: [VIDEO_VP9_MAX_SEGMENTS][VIDEO_VP9_SEG_LVL_MAX]i16, +} + // Opaque structs wl_surface :: struct {} // Opaque struct defined by Wayland @@ -10830,6 +12856,12 @@ PushDescriptorSetInfoKHR :: PushDescriptorSet PushDescriptorSetWithTemplateInfoKHR :: PushDescriptorSetWithTemplateInfo AccessFlags3KHR :: Flags64 AccessFlag3KHR :: Flags64 +FormatFeatureFlags4KHR :: Flags64 +FormatFeatureFlag4KHR :: Flags64 +ImageUsageFlags2KHR :: Flags64 +ImageUsageFlag2KHR :: Flags64 +ImageCreateFlags2KHR :: Flags64 +ImageCreateFlag2KHR :: Flags64 PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT :: PhysicalDeviceTextureCompressionASTCHDRFeatures PipelineRobustnessBufferBehaviorEXT :: PipelineRobustnessBufferBehavior PipelineRobustnessImageBehaviorEXT :: PipelineRobustnessImageBehavior @@ -10839,6 +12871,9 @@ PipelineRobustnessCreateInfoEXT :: PipelineRobustnes SamplerReductionModeEXT :: SamplerReductionMode SamplerReductionModeCreateInfoEXT :: SamplerReductionModeCreateInfo PhysicalDeviceSamplerFilterMinmaxPropertiesEXT :: PhysicalDeviceSamplerFilterMinmaxProperties +TensorViewCreateFlagsARM :: Flags64 +TensorViewCreateFlagARM :: Flags64 +DeviceAddressRangeEXT :: DeviceAddressRangeKHR PhysicalDeviceInlineUniformBlockFeaturesEXT :: PhysicalDeviceInlineUniformBlockFeatures PhysicalDeviceInlineUniformBlockPropertiesEXT :: PhysicalDeviceInlineUniformBlockProperties WriteDescriptorSetInlineUniformBlockEXT :: WriteDescriptorSetInlineUniformBlock @@ -10859,8 +12894,8 @@ GeometryFlagsNV :: GeometryFlagsKHR GeometryFlagNV :: GeometryFlagKHR GeometryInstanceFlagsNV :: GeometryInstanceFlagsKHR GeometryInstanceFlagNV :: GeometryInstanceFlagKHR -BuildAccelerationStructureFlagsNV :: BuildAccelerationStructureFlagsKHR BuildAccelerationStructureFlagNV :: BuildAccelerationStructureFlagKHR +BuildAccelerationStructureFlagsNV :: BuildAccelerationStructureFlagsKHR TransformMatrixNV :: TransformMatrixKHR AabbPositionsNV :: AabbPositionsKHR AccelerationStructureInstanceNV :: AccelerationStructureInstanceKHR @@ -10910,8 +12945,23 @@ SubresourceHostMemcpySizeEXT :: SubresourceHostMe HostImageCopyDevicePerformanceQueryEXT :: HostImageCopyDevicePerformanceQuery SubresourceLayout2EXT :: SubresourceLayout2 ImageSubresource2EXT :: ImageSubresource2 +PresentScalingFlagEXT :: PresentScalingFlagKHR +PresentScalingFlagsEXT :: PresentScalingFlagsKHR +PresentGravityFlagEXT :: PresentGravityFlagKHR +PresentGravityFlagsEXT :: PresentGravityFlagsKHR +SurfacePresentModeEXT :: SurfacePresentModeKHR +SurfacePresentScalingCapabilitiesEXT :: SurfacePresentScalingCapabilitiesKHR +SurfacePresentModeCompatibilityEXT :: SurfacePresentModeCompatibilityKHR +PhysicalDeviceSwapchainMaintenance1FeaturesEXT :: PhysicalDeviceSwapchainMaintenance1FeaturesKHR +SwapchainPresentFenceInfoEXT :: SwapchainPresentFenceInfoKHR +SwapchainPresentModesCreateInfoEXT :: SwapchainPresentModesCreateInfoKHR +SwapchainPresentModeInfoEXT :: SwapchainPresentModeInfoKHR +SwapchainPresentScalingCreateInfoEXT :: SwapchainPresentScalingCreateInfoKHR +ReleaseSwapchainImagesInfoEXT :: ReleaseSwapchainImagesInfoKHR PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT :: PhysicalDeviceShaderDemoteToHelperInvocationFeatures PhysicalDeviceTexelBufferAlignmentPropertiesEXT :: PhysicalDeviceTexelBufferAlignmentProperties +PhysicalDeviceRobustness2FeaturesEXT :: PhysicalDeviceRobustness2FeaturesKHR +PhysicalDeviceRobustness2PropertiesEXT :: PhysicalDeviceRobustness2PropertiesKHR PrivateDataSlotEXT :: PrivateDataSlot PrivateDataSlotCreateFlagsEXT :: PrivateDataSlotCreateFlags PhysicalDevicePrivateDataFeaturesEXT :: PhysicalDevicePrivateDataFeatures @@ -10919,19 +12969,48 @@ DevicePrivateDataCreateInfoEXT :: DevicePrivateData PrivateDataSlotCreateInfoEXT :: PrivateDataSlotCreateInfo PhysicalDevicePipelineCreationCacheControlFeaturesEXT :: PhysicalDevicePipelineCreationCacheControlFeatures PhysicalDeviceImageRobustnessFeaturesEXT :: PhysicalDeviceImageRobustnessFeatures +DeviceFaultAddressTypeEXT :: DeviceFaultAddressTypeKHR +DeviceFaultVendorBinaryHeaderVersionEXT :: DeviceFaultVendorBinaryHeaderVersionKHR +DeviceFaultAddressInfoEXT :: DeviceFaultAddressInfoKHR +DeviceFaultVendorInfoEXT :: DeviceFaultVendorInfoKHR +DeviceFaultVendorBinaryHeaderVersionOneEXT :: DeviceFaultVendorBinaryHeaderVersionOneKHR PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM :: PhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT PhysicalDeviceMutableDescriptorTypeFeaturesVALVE :: PhysicalDeviceMutableDescriptorTypeFeaturesEXT MutableDescriptorTypeListVALVE :: MutableDescriptorTypeListEXT MutableDescriptorTypeCreateInfoVALVE :: MutableDescriptorTypeCreateInfoEXT +PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT :: PhysicalDevicePresentModeFifoLatestReadyFeaturesKHR PipelineInfoEXT :: PipelineInfoKHR PhysicalDeviceGlobalPriorityQueryFeaturesEXT :: PhysicalDeviceGlobalPriorityQueryFeatures QueueFamilyGlobalPriorityPropertiesEXT :: QueueFamilyGlobalPriorityProperties +OpacityMicromapFormatEXT :: OpacityMicromapFormatKHR +OpacityMicromapSpecialIndexEXT :: OpacityMicromapSpecialIndexKHR +MicromapTriangleEXT :: MicromapTriangleKHR PhysicalDeviceSchedulingControlsFlagsARM :: Flags64 PhysicalDeviceSchedulingControlsFlagARM :: Flags64 PhysicalDeviceDepthClampZeroOneFeaturesEXT :: PhysicalDeviceDepthClampZeroOneFeaturesKHR -MemoryDecompressionMethodFlagNV :: Flags64 -MemoryDecompressionMethodFlagsNV :: Flags64 +PhysicalDeviceFragmentDensityMapOffsetFeaturesQCOM :: PhysicalDeviceFragmentDensityMapOffsetFeaturesEXT +PhysicalDeviceFragmentDensityMapOffsetPropertiesQCOM :: PhysicalDeviceFragmentDensityMapOffsetPropertiesEXT +SubpassFragmentDensityMapOffsetEndInfoQCOM :: RenderPassFragmentDensityMapOffsetEndInfoEXT +CopyMemoryIndirectCommandNV :: CopyMemoryIndirectCommandKHR +CopyMemoryToImageIndirectCommandNV :: CopyMemoryToImageIndirectCommandKHR +PhysicalDeviceCopyMemoryIndirectPropertiesNV :: PhysicalDeviceCopyMemoryIndirectPropertiesKHR +MemoryDecompressionMethodFlagEXT :: Flags64 +MemoryDecompressionMethodFlagNV :: MemoryDecompressionMethodFlagEXT +MemoryDecompressionMethodFlagsEXT :: Flags64 +MemoryDecompressionMethodFlagsNV :: MemoryDecompressionMethodFlagsEXT +PhysicalDeviceMemoryDecompressionFeaturesNV :: PhysicalDeviceMemoryDecompressionFeaturesEXT +PhysicalDeviceMemoryDecompressionPropertiesNV :: PhysicalDeviceMemoryDecompressionPropertiesEXT +TensorCreateFlagsARM :: Flags64 +TensorCreateFlagARM :: Flags64 +TensorUsageFlagsARM :: Flags64 +TensorUsageFlagARM :: Flags64 PhysicalDevicePipelineProtectedAccessFeaturesEXT :: PhysicalDevicePipelineProtectedAccessFeatures ShaderRequiredSubgroupSizeCreateInfoEXT :: PipelineShaderStageRequiredSubgroupSizeCreateInfo +RayTracingInvocationReorderModeNV :: RayTracingInvocationReorderModeEXT +DataGraphPipelineSessionCreateFlagsARM :: Flags64 +DataGraphPipelineSessionCreateFlagARM :: Flags64 +DataGraphPipelineDispatchFlagsARM :: Flags64 +DataGraphPipelineDispatchFlagARM :: Flags64 +RenderingEndInfoEXT :: RenderingEndInfoKHR From f41b57f1cc35cd2e35c73863f1134677a7320c10 Mon Sep 17 00:00:00 2001 From: TheRadischen <119001853+TheRadischen@users.noreply.github.com> Date: Fri, 12 Jun 2026 21:48:41 +0200 Subject: [PATCH 155/228] fixed type in slice.rotate sry bll, i swear im never programming tired again --- core/slice/slice.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/slice/slice.odin b/core/slice/slice.odin index 464a30339..8485af145 100644 --- a/core/slice/slice.odin +++ b/core/slice/slice.odin @@ -433,7 +433,7 @@ fill :: proc "contextless" (array: $T/[]$E, value: E) #no_bounds_check { } rotate_left :: proc "contextless" (array: $T/[]$E, mid: int) { - if len(a) == 0 { + if len(array) == 0 { return } n := len(array) From b05d459a134cfc1bb672829e896291fc9616edbe Mon Sep 17 00:00:00 2001 From: Krzysztof Furman Date: Fri, 12 Jun 2026 21:33:56 +0100 Subject: [PATCH 156/228] Make the type hash 63-bit to not crash OMG JIT in WebKit under WASM. --- src/name_canonicalization.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/name_canonicalization.cpp b/src/name_canonicalization.cpp index 1a4ca6439..ccd65e610 100644 --- a/src/name_canonicalization.cpp +++ b/src/name_canonicalization.cpp @@ -520,6 +520,8 @@ gb_internal u64 type_hash_canonical_type(Type *type) { type_writer_make_hasher(&w, &w.hash_ctx); write_type_to_canonical_string(&w, type); u64 hash = typeid_hash_context_fini(&w.hash_ctx); + hash &= 0x7fffffffffffffffull; + hash = hash ? hash : 1; type->canonical_hash.store(hash, std::memory_order_relaxed); From 2373fabe47dc2989e1700359b1ddd6def3b23622 Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Fri, 12 Jun 2026 22:57:39 -0400 Subject: [PATCH 157/228] [stack-canaries] added protection modes --- src/build_settings.cpp | 12 +++++++++++- src/llvm_backend_proc.cpp | 10 ++++++++++ src/main.cpp | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index f31830598..19414fc89 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -278,6 +278,14 @@ enum RelocMode : u8 { RelocMode_DynamicNoPIC, }; +enum StackProtector : u8 { + StackProtector_Default, + StackProtector_None, + StackProtector_Ssp, + StackProtector_SspReq, + StackProtector_SspStrong, +}; + enum BuildPath : u8 { BuildPath_Main_Package, // Input Path to the package directory (or file) we're building. BuildPath_RC, // Input Path for .rc file, can be set with `-resource:`. @@ -599,7 +607,9 @@ struct BuildContext { bool print_linker_flags; - RelocMode reloc_mode; + RelocMode reloc_mode; + StackProtector stack_protector; + bool disable_red_zone; bool disable_unwind; bool no_plt; diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 8738dbc9c..738f763cf 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -160,6 +160,16 @@ gb_internal lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool i lb_add_attribute_to_proc(m, p->value, "nonlazybind"); } + switch (build_context.stack_protector) { + case StackProtector_Default: + case StackProtector_Ssp: + lb_add_attribute_to_proc(m, p->value, "ssp"); + case StackProtector_SspReq: + lb_add_attribute_to_proc(m, p->value, "sspreq"); + case StackProtector_SspStrong: + lb_add_attribute_to_proc(m, p->value, "sspstrong"); + } + if (build_context.disable_unwind) { lb_add_attribute_to_proc(m, p->value, "nounwind"); } diff --git a/src/main.cpp b/src/main.cpp index a63cee5e0..b8fcafd44 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -354,6 +354,7 @@ enum BuildFlagKind { BuildFlag_NoThreadLocal, BuildFlag_RelocMode, + BuildFlag_StackProtector, BuildFlag_DisableRedZone, BuildFlag_DisableUnwind, @@ -587,6 +588,7 @@ gb_internal bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_MinimumOSVersion, str_lit("minimum-os-version"), BuildFlagParam_String, Command__does_build | Command_bundle_android); add_flag(&build_flags, BuildFlag_RelocMode, str_lit("reloc-mode"), BuildFlagParam_String, Command__does_build); + add_flag(&build_flags, BuildFlag_StackProtector, str_lit("stack-protector"), BuildFlagParam_String, Command__does_build); add_flag(&build_flags, BuildFlag_DisableRedZone, str_lit("disable-red-zone"), BuildFlagParam_None, Command__does_build); add_flag(&build_flags, BuildFlag_DisableUnwind, str_lit("disable-unwind"), BuildFlagParam_None, Command__does_build); @@ -1431,6 +1433,29 @@ gb_internal bool parse_build_flags(Array args) { break; } + case BuildFlag_StackProtector: { + GB_ASSERT(value.kind == ExactValue_String); + String v = value.value_string; + if (v == "default") { + build_context.stack_protector = StackProtector_Default; + } else if (v == "none") { + build_context.stack_protector = StackProtector_None; + } else if (v == "base") { + build_context.stack_protector = StackProtector_Ssp; + } else if (v == "all") { + build_context.stack_protector = StackProtector_SspReq; + } else if (v == "strong") { + build_context.stack_protector = StackProtector_SspStrong; + } else { + gb_printf_err("-stack-protector flag expected one of the following\n"); + gb_printf_err("\tdefault\n"); + gb_printf_err("\tnone\n"); + gb_printf_err("\tbase\n"); + gb_printf_err("\tall\n"); + gb_printf_err("\tstrong\n"); + bad_flags = true; + } + } case BuildFlag_DisableRedZone: build_context.disable_red_zone = true; break; @@ -2986,6 +3011,16 @@ gb_internal int print_show_help(String const arg0, String command, String option print_usage_line(3, "-reloc-mode:dynamic-no-pic"); } + if (print_flag("-stack-protector:")) { + print_usage_line(2, "Specifies the stack protector."); + print_usage_line(2, "Available options:"); + print_usage_line(3, "-stack-protector:default"); + print_usage_line(3, "-stack-protector:none"); + print_usage_line(3, "-stack-protector:base"); + print_usage_line(3, "-stack-protector:all"); + print_usage_line(3, "-stack-protector:strong"); + } + #if defined(GB_SYSTEM_WINDOWS) if (print_flag("-resource:")) { print_usage_line(2, "[Windows only]"); From 8ccee661574490ecf1a43dd76b70fae0cb2ed56f Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Fri, 12 Jun 2026 23:27:32 -0400 Subject: [PATCH 158/228] [stack-canaries] fixed platform behavior --- src/build_settings.cpp | 39 ++++++++++++++++++++++++++++----------- src/llvm_backend_proc.cpp | 4 +++- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 19414fc89..6a1b296d0 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -1909,16 +1909,6 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta } break; } - } else if (metrics->os == TargetOs_linux) { - if (bc->reloc_mode == RelocMode_Default) { - bc->reloc_mode = RelocMode_PIC; - } - switch (metrics->arch) { - case TargetArch_arm64: - case TargetArch_amd64: - bc->no_plt = LLVM_VERSION_MAJOR >= 19; - break; - } } else if (metrics->os == TargetOs_openbsd) { // Always use PIC for OpenBSD: it defaults to PIE if (bc->reloc_mode == RelocMode_Default) { @@ -1947,10 +1937,37 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta bc->metrics.target_triplet = str_lit("i686-linux-android"); bc->reloc_mode = RelocMode_PIC; break; - default: GB_PANIC("Unknown architecture for -subtarget:android"); } + } else if (metrics->os == TargetOs_linux) { + if (bc->reloc_mode == RelocMode_Default) { + bc->reloc_mode = RelocMode_PIC; + } + switch (metrics->arch) { + case TargetArch_arm64: + case TargetArch_amd64: + bc->no_plt = LLVM_VERSION_MAJOR >= 19; + break; + } + } + + if (metrics->os == TargetOs_windows || + metrics->os == TargetOs_darwin || + metrics->os == TargetOs_linux || + metrics->os == TargetOs_freebsd || + metrics->os == TargetOs_openbsd || + metrics->os == TargetOs_netbsd) { + if (bc->stack_protector == StackProtector_Default) { + bc->stack_protector = StackProtector_Ssp; + } + } else { + if (bc->stack_protector == StackProtector_Default) { + bc->stack_protector = StackProtector_None; + } else { + gb_printf_err("-stack-protector is not supported on this target\n"); + gb_exit(1); + } } if (bc->metrics.os == TargetOs_windows) { diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 738f763cf..7994ab4ba 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -161,13 +161,15 @@ gb_internal lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool i } switch (build_context.stack_protector) { - case StackProtector_Default: case StackProtector_Ssp: lb_add_attribute_to_proc(m, p->value, "ssp"); + break; case StackProtector_SspReq: lb_add_attribute_to_proc(m, p->value, "sspreq"); + break; case StackProtector_SspStrong: lb_add_attribute_to_proc(m, p->value, "sspstrong"); + break; } if (build_context.disable_unwind) { From f850fef613f83060974d4852124f98256d60b9e6 Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Fri, 12 Jun 2026 23:54:26 -0400 Subject: [PATCH 159/228] [stack-canaries] disallow stack canaries on non-intel linux --- src/build_settings.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 6a1b296d0..ff184ff63 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -1952,9 +1952,18 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta } } - if (metrics->os == TargetOs_windows || + // note: there are some stack protection toolchain issues on non-intel + // platforms that will clash with PIC/PIE: + // `unresolvable R_AARCH64_ADR_PREL_PG_HI21 relocation against symbol` + if (metrics->os == TargetOs_linux && ( + metrics->arch == TargetArch_amd64 || + metrics->arch == TargetArch_i386 + )) { + if (bc->stack_protector == StackProtector_Default) { + bc->stack_protector = StackProtector_Ssp; + } + } else if (metrics->os == TargetOs_windows || metrics->os == TargetOs_darwin || - metrics->os == TargetOs_linux || metrics->os == TargetOs_freebsd || metrics->os == TargetOs_openbsd || metrics->os == TargetOs_netbsd) { From 3598e351a46e449e960bade194dc0a9ee895aa45 Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Fri, 12 Jun 2026 23:56:55 -0400 Subject: [PATCH 160/228] [stack-canaries] restricted to only non-arm --- src/build_settings.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index ff184ff63..7af3e008b 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -1952,13 +1952,13 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta } } - // note: there are some stack protection toolchain issues on non-intel + // note: there are some stack protection toolchain issues on arm // platforms that will clash with PIC/PIE: // `unresolvable R_AARCH64_ADR_PREL_PG_HI21 relocation against symbol` - if (metrics->os == TargetOs_linux && ( - metrics->arch == TargetArch_amd64 || - metrics->arch == TargetArch_i386 - )) { + if (metrics->os == TargetOs_linux && + metrics->arch != TargetArch_arm32 && + metrics->arch != TargetArch_arm64 + ) { if (bc->stack_protector == StackProtector_Default) { bc->stack_protector = StackProtector_Ssp; } From 8bd95d40826edfaa0e88be5df96fe918db962f7f Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Sat, 13 Jun 2026 01:52:19 -0400 Subject: [PATCH 161/228] [stack-canaries] fixed stack canaries on arm linux --- src/build_settings.cpp | 13 ++----------- src/llvm_backend.cpp | 22 +--------------------- src/llvm_backend_general.cpp | 29 +++++++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 7af3e008b..6a1b296d0 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -1952,18 +1952,9 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta } } - // note: there are some stack protection toolchain issues on arm - // platforms that will clash with PIC/PIE: - // `unresolvable R_AARCH64_ADR_PREL_PG_HI21 relocation against symbol` - if (metrics->os == TargetOs_linux && - metrics->arch != TargetArch_arm32 && - metrics->arch != TargetArch_arm64 - ) { - if (bc->stack_protector == StackProtector_Default) { - bc->stack_protector = StackProtector_Ssp; - } - } else if (metrics->os == TargetOs_windows || + if (metrics->os == TargetOs_windows || metrics->os == TargetOs_darwin || + metrics->os == TargetOs_linux || metrics->os == TargetOs_freebsd || metrics->os == TargetOs_openbsd || metrics->os == TargetOs_netbsd) { diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 15ff125d4..1b0f32fe9 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -3154,32 +3154,12 @@ gb_internal bool lb_generate_code(lbGenerator *gen) { // NOTE(bill, 2021-05-04): Target machines must be unique to each module because they are not thread safe auto target_machines = array_make(permanent_allocator(), 0, gen->modules.count); - // NOTE(dweiler): Dynamic libraries require position-independent code. - LLVMRelocMode reloc_mode = LLVMRelocDefault; - if (build_context.build_mode == BuildMode_DynamicLibrary) { - reloc_mode = LLVMRelocPIC; - } - - switch (build_context.reloc_mode) { - case RelocMode_Default: - break; - case RelocMode_Static: - reloc_mode = LLVMRelocStatic; - break; - case RelocMode_PIC: - reloc_mode = LLVMRelocPIC; - break; - case RelocMode_DynamicNoPIC: - reloc_mode = LLVMRelocDynamicNoPic; - break; - } - for (auto const &entry : gen->modules) { LLVMTargetMachineRef target_machine = LLVMCreateTargetMachine( target, target_triple, (const char *)llvm_cpu.text, llvm_features, code_gen_level, - reloc_mode, + get_reloc_mode(), code_mode); lbModule *m = entry.value; m->target_machine = target_machine; diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 27a8c66e3..64829d4c4 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -1,5 +1,6 @@ gb_internal void lb_add_debug_local_variable(lbProcedure *p, LLVMValueRef ptr, Type *type, Token const &token); gb_internal LLVMValueRef llvm_const_string_internal(lbModule *m, Type *t, LLVMValueRef data, LLVMValueRef len); +gb_internal LLVMRelocMode get_reloc_mode(); gb_global Entity *lb_global_type_info_data_entity = {}; gb_global lbAddr lb_global_type_info_member_types = {}; @@ -65,6 +66,12 @@ gb_internal WORKER_TASK_PROC(lb_init_module_worker_proc) { "RtLibUseGOT", 11, LLVMValueAsMetadata(LLVMConstInt(LLVMInt32TypeInContext(m->ctx), 1, true))); } + + LLVMAddModuleFlag(m->mod, + LLVMModuleFlagBehaviorWarning, + "PIC Level", 9, + LLVMValueAsMetadata(LLVMConstInt(LLVMInt32TypeInContext(m->ctx), get_reloc_mode(), true))); + if (build_context.ODIN_DEBUG) { enum {DEBUG_METADATA_VERSION = 3}; @@ -3667,3 +3674,25 @@ gb_internal void lb_set_linkage_from_entity_flags(lbModule *m, LLVMValueRef valu LLVMSetLinkage(value, LLVMLinkOnceAnyLinkage); } } + +LLVMRelocMode get_reloc_mode() { + // NOTE(dweiler): Dynamic libraries require position-independent code. + LLVMRelocMode reloc_mode = LLVMRelocDefault; + if (build_context.build_mode == BuildMode_DynamicLibrary) { + reloc_mode = LLVMRelocPIC; + } + switch (build_context.reloc_mode) { + case RelocMode_Default: + break; + case RelocMode_Static: + reloc_mode = LLVMRelocStatic; + break; + case RelocMode_PIC: + reloc_mode = LLVMRelocPIC; + break; + case RelocMode_DynamicNoPIC: + reloc_mode = LLVMRelocDynamicNoPic; + break; + } + return reloc_mode; +} From 15deb7a118dc3bb21f494b36126b271b3d2fdaed Mon Sep 17 00:00:00 2001 From: Krzysztof Furman Date: Sat, 13 Jun 2026 09:53:43 +0100 Subject: [PATCH 162/228] Commented the workaround with links to issues, and put it behind a build flag. --- src/build_settings.cpp | 2 ++ src/main.cpp | 10 ++++++++++ src/name_canonicalization.cpp | 13 +++++++++++-- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index f31830598..509d4bf57 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -539,6 +539,8 @@ struct BuildContext { bool disallow_do; bool show_import_graph; + bool webkit_switch_workaround; + IntegerDivisionByZeroKind integer_division_by_zero_behaviour; LinkerChoice linker_choice; diff --git a/src/main.cpp b/src/main.cpp index a63cee5e0..6589efb54 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -312,6 +312,7 @@ enum BuildFlagKind { BuildFlag_Debug, BuildFlag_DisableAssert, BuildFlag_NoBoundsCheck, + BuildFlag_WebkitSwitchWorkaround, BuildFlag_NoTypeAssert, BuildFlag_NoDynamicLiterals, BuildFlag_DynamicLiterals, @@ -545,6 +546,7 @@ gb_internal bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_Debug, str_lit("debug"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_DisableAssert, str_lit("disable-assert"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_NoBoundsCheck, str_lit("no-bounds-check"), BuildFlagParam_None, Command__does_check); + add_flag(&build_flags, BuildFlag_WebkitSwitchWorkaround, str_lit("webkit-switch-workaround"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_NoTypeAssert, str_lit("no-type-assert"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_NoThreadLocal, str_lit("no-thread-local"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_NoDynamicLiterals, str_lit("no-dynamic-literals"), BuildFlagParam_None, Command__does_check); @@ -1235,6 +1237,9 @@ gb_internal bool parse_build_flags(Array args) { case BuildFlag_NoBoundsCheck: build_context.no_bounds_check = true; break; + case BuildFlag_WebkitSwitchWorkaround: + build_context.webkit_switch_workaround = true; + break; case BuildFlag_NoTypeAssert: build_context.no_type_assert = true; break; @@ -2891,6 +2896,11 @@ gb_internal int print_show_help(String const arg0, String command, String option print_usage_line(2, "Disables bounds checking program wide."); } + if (print_flag("-webkit-switch-workaround")) { + print_usage_line(2, "Constrains 'typeid' values to 63 bits to avoid an OMG JIT crash in WebKit when running WASM builds."); + print_usage_line(2, "Only needed for 'js_wasm32'/'js_wasm64p32' targets run in Safari/WebKit. See: https://github.com/odin-lang/Odin/issues/6810"); + } + if (print_flag("-no-crt")) { print_usage_line(2, "Disables automatic linking with the C Run Time."); } diff --git a/src/name_canonicalization.cpp b/src/name_canonicalization.cpp index ccd65e610..67ca9e278 100644 --- a/src/name_canonicalization.cpp +++ b/src/name_canonicalization.cpp @@ -520,8 +520,17 @@ gb_internal u64 type_hash_canonical_type(Type *type) { type_writer_make_hasher(&w, &w.hash_ctx); write_type_to_canonical_string(&w, type); u64 hash = typeid_hash_context_fini(&w.hash_ctx); - hash &= 0x7fffffffffffffffull; - hash = hash ? hash : 1; + if (build_context.webkit_switch_workaround) { + // Clear the top bit so every `typeid` is in [1, 2^63). A `switch` over a + // typeid (e.g. a type switch over `any` in core:fmt) then has a case-value + // span < 2^63. WebKit's B3/OMG wasm JIT computes a switch's value range as + // a signed i64 (max - min); a span >= 2^63 overflows and makes it build a + // pathologically-sized jump table, OOM-crashing the tab. + // WebKit bug: https://bugs.webkit.org/show_bug.cgi?id=317022 + // Odin issue/PR: https://github.com/odin-lang/Odin/issues/6810 + hash &= 0x7fffffffffffffffull; + hash = hash ? hash : 1; + } type->canonical_hash.store(hash, std::memory_order_relaxed); From b3dc3278a44b1c68cea52cb76844f088af17eab6 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Sat, 13 Jun 2026 18:51:15 +0200 Subject: [PATCH 163/228] Remove -sanitize:memory from `tests/core/speed.odin` They turn a 1.5s test into a 7.5m wait on the CI. That's a bit too much for the benefit. Normal tests are fine if they take a bit longer with ASAN. --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8876d4f02..31ce36826 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -138,7 +138,7 @@ jobs: - name: Normal Core library tests run: ./odin test tests/core/normal.odin -file -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address - name: Optimized Core library tests - run: ./odin test tests/core/speed.odin -o:speed -file -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address + run: ./odin test tests/core/speed.odin -o:speed -file -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true - name: Wycheproof tests run: ./odin test tests/core/crypto/wycheproof -vet -vet-tabs -strict-style -vet-style -vet-cast -warnings-as-errors -disallow-do -o:speed - name: Noise Protocol Framework tests @@ -239,7 +239,7 @@ jobs: shell: cmd run: | call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" - odin test tests/core/speed.odin -o:speed -file -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true -sanitize:address + odin test tests/core/speed.odin -o:speed -file -all-packages -vet -vet-tabs -strict-style -vet-style -warnings-as-errors -disallow-do -define:ODIN_TEST_FANCY=false -define:ODIN_TEST_FAIL_ON_BAD_MEMORY=true - name: Wycheproof tests shell: cmd run: | From 0aa85a035f4a673084506f66953deac8e585cf9a Mon Sep 17 00:00:00 2001 From: Sylphrena Date: Sat, 13 Jun 2026 19:55:13 +0200 Subject: [PATCH 164/228] Added optional allocator error to `map_insert` --- base/runtime/core_builtin.odin | 5 +++-- base/runtime/dynamic_map_internal.odin | 16 ++++++++-------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index 34e3d4f32..e2e4e693a 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -1471,9 +1471,10 @@ _shrink_dynamic_array :: proc(a: ^Raw_Dynamic_Array, size_of_elem, align_of_elem } @builtin -map_insert :: proc(m: ^$T/map[$K]$V, key: K, value: V, loc := #caller_location) -> (ptr: ^V) { +map_insert :: proc(m: ^$T/map[$K]$V, key: K, value: V, loc := #caller_location) -> (value_ptr: ^V, err: Allocator_Error) #optional_allocator_error { key, value := key, value - return (^V)(__dynamic_map_set_without_hash((^Raw_Map)(m), map_info(T), rawptr(&key), rawptr(&value), loc)) + value_ptr_raw, err_set :=__dynamic_map_set_without_hash((^Raw_Map)(m), map_info(T), rawptr(&key), rawptr(&value), loc) + return (^V)(value_ptr_raw), err_set } // Explicitly inserts a key and value into a map `m`, the same as `map_insert`, but the return values differ. diff --git a/base/runtime/dynamic_map_internal.odin b/base/runtime/dynamic_map_internal.odin index 73a152845..cc38da598 100644 --- a/base/runtime/dynamic_map_internal.odin +++ b/base/runtime/dynamic_map_internal.odin @@ -905,22 +905,22 @@ __dynamic_map_check_grow :: proc "odin" (#no_alias m: ^Raw_Map, #no_alias info: return nil, false } -__dynamic_map_set_without_hash :: proc "odin" (#no_alias m: ^Raw_Map, #no_alias info: ^Map_Info, key, value: rawptr, loc := #caller_location) -> rawptr { +__dynamic_map_set_without_hash :: proc "odin" (#no_alias m: ^Raw_Map, #no_alias info: ^Map_Info, key, value: rawptr, loc := #caller_location) -> (value_ptr: rawptr, err: Allocator_Error) #optional_allocator_error { return __dynamic_map_set(m, info, info.key_hasher(key, map_seed(m^)), key, value, loc) } // IMPORTANT: USED WITHIN THE COMPILER -__dynamic_map_set :: proc "odin" (#no_alias m: ^Raw_Map, #no_alias info: ^Map_Info, hash: Map_Hash, key, value: rawptr, loc := #caller_location) -> rawptr { +__dynamic_map_set :: proc "odin" (#no_alias m: ^Raw_Map, #no_alias info: ^Map_Info, hash: Map_Hash, key, value: rawptr, loc := #caller_location) -> (value_ptr: rawptr, err: Allocator_Error) #optional_allocator_error { if found := __dynamic_map_get(m, info, hash, key); found != nil { intrinsics.mem_copy_non_overlapping(found, value, info.vs.size_of_type) - return found + return found, nil } hash := hash - err, has_grown := __dynamic_map_check_grow(m, info, loc) - if err != nil { - return nil + err_grow, has_grown := __dynamic_map_check_grow(m, info, loc) + if err_grow != nil { + return nil, err_grow } if has_grown { hash = info.key_hasher(key, map_seed(m^)) @@ -930,7 +930,7 @@ __dynamic_map_set :: proc "odin" (#no_alias m: ^Raw_Map, #no_alias info: ^Map_In if result != 0 { m.len += 1 } - return rawptr(result) + return rawptr(result), nil } __dynamic_map_set_extra_without_hash :: proc "odin" (#no_alias m: ^Raw_Map, #no_alias info: ^Map_Info, key, value: rawptr, loc := #caller_location) -> (prev_key_ptr, value_ptr: rawptr) { return __dynamic_map_set_extra(m, info, info.key_hasher(key, map_seed(m^)), key, value, loc) @@ -1060,4 +1060,4 @@ default_hasher_quaternion256 :: proc "contextless" (x, y, z, w: f64, seed: uintp seed = default_hasher_f64(z, seed) seed = default_hasher_f64(w, seed) return seed -} \ No newline at end of file +} From 863b2aea800598102d4140fe96adb4b28b0bd672 Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Sun, 14 Jun 2026 13:36:55 -0400 Subject: [PATCH 165/228] [stack-canaries] default to sspstrong --- src/build_settings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 6a1b296d0..2c6008515 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -1959,7 +1959,7 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta metrics->os == TargetOs_openbsd || metrics->os == TargetOs_netbsd) { if (bc->stack_protector == StackProtector_Default) { - bc->stack_protector = StackProtector_Ssp; + bc->stack_protector = StackProtector_SspStrong; } } else { if (bc->stack_protector == StackProtector_Default) { From 8b52acb7dc82899d1a7bdd22d6ab3bb51450cd07 Mon Sep 17 00:00:00 2001 From: Andreas Stenmark Date: Sun, 14 Jun 2026 21:52:22 +0200 Subject: [PATCH 166/228] Fix #6818: Remove dependency on mbedx509, mbedcrypto for Darwin. --- vendor/curl/curl.odin | 2 -- 1 file changed, 2 deletions(-) diff --git a/vendor/curl/curl.odin b/vendor/curl/curl.odin index 41ecbcb75..6ecc8030f 100644 --- a/vendor/curl/curl.odin +++ b/vendor/curl/curl.odin @@ -18,8 +18,6 @@ when ODIN_OS == .Windows { @(export) foreign import lib { "system:curl", - "system:mbedx509", - "system:mbedcrypto", "system:z", "system:SystemConfiguration.framework", } From d08c9534118874e1032822c1c67374f8ee0e1ada Mon Sep 17 00:00:00 2001 From: Andreas Stenmark Date: Sun, 14 Jun 2026 23:10:36 +0200 Subject: [PATCH 167/228] Fix #6811: collect @(test) procs from #+private file by iterating c->info.entities instead of pkg->scope->elements. --- src/checker.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/checker.cpp b/src/checker.cpp index 539be0666..2f66d3e60 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -2875,9 +2875,11 @@ gb_internal void collect_testing_procedures_of_package(Checker *c, AstPackage *p InternedString interned = string_interner_insert(str_lit("Test_Signature"), 0, &hash); Entity *test_signature = scope_lookup_current(testing_scope, interned, hash); - Scope *s = pkg->scope; - for (auto const &entry : s->elements) { - Entity *e = entry.value; + for_array(i, c->info.entities) { + Entity *e = c->info.entities[i]; + if (e->pkg != pkg) { + continue; + } if (e->kind != Entity_Procedure) { continue; } From bc5adb070f53d69fda2be0d4bd67a5cd687b939b Mon Sep 17 00:00:00 2001 From: Andreas Stenmark Date: Mon, 15 Jun 2026 00:51:36 +0200 Subject: [PATCH 168/228] Fix #6814: reject transitive #subtype-only implicit conversion in checker --- src/types.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/types.cpp b/src/types.cpp index 260dd4918..759f90ca6 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -5030,9 +5030,15 @@ gb_internal isize check_is_assignable_to_using_subtype(Type *src, Type *dst, isi return level+1; } } - isize nested_level = check_is_assignable_to_using_subtype(f->type, dst, level+1, src_is_ptr, allow_polymorphic); - if (nested_level > 0) { - return nested_level; + // Only follow the chain transitively when the field also has `using`, which is + // what the backend's lookup_subtype_polymorphic_selection requires (it gates + // recursion on EntityFlag_Using). A plain `#subtype`-only field enables a + // single-hop conversion but not a two-or-more hop transitive one. + if (f->flags & EntityFlag_Using) { + isize nested_level = check_is_assignable_to_using_subtype(f->type, dst, level+1, src_is_ptr, allow_polymorphic); + if (nested_level > 0) { + return nested_level; + } } } From 32f1a09909872f7b59172a1f6462e02cdf753e79 Mon Sep 17 00:00:00 2001 From: Franz Date: Mon, 15 Jun 2026 11:38:43 +0200 Subject: [PATCH 169/228] Add suggestion to use 'typeid_of(type)' when trying to do `typeid(type)` --- src/check_expr.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 39c47ae03..cbaea1483 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -3808,7 +3808,14 @@ gb_internal bool check_cast_internal(CheckerContext *c, Operand *x, Type *type) gb_internal void check_cast(CheckerContext *c, Operand *x, Type *type, bool forbid_identical = false) { if (!is_operand_value(*x)) { + ERROR_BLOCK(); error(x->expr, "Only values can be casted"); + if (is_type_typeid(type)) { + gbString expr_str = expr_to_string(x->expr); + defer (gb_string_free(expr_str)); + + error_line("\tSuggestion: 'typeid_of(%s)'", expr_str); + } x->mode = Addressing_Invalid; return; } From 3bf48e29d2919b98ffdf0d939c89c640b96c0e96 Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Sun, 14 Jun 2026 23:55:36 -0400 Subject: [PATCH 170/228] [subprocess] move away from `system` for `odin run` --- src/main.cpp | 62 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 53 insertions(+), 9 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 6589efb54..a4acf1481 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -178,11 +178,41 @@ gb_internal i32 system_exec_command_line_app(char const *name, char const *fmt, return exit_code; } -gb_internal void system_must_exec_command_line_app(char const *name, char const *fmt, ...) { - va_list va; - va_start(va, fmt); - system_exec_command_line_app_internal(/* exit_on_err= */ true, name, fmt, va); - va_end(va); +#if defined(GB_SYSTEM_WINDOWS) +#include +#else +#include +extern char **environ; +#endif + +int run_subprocess(const char *name, const char **args) { +#if defined(GB_SYSTEM_WINDOWS) + return (int)_spawnvp(_P_WAIT, name, args); +#else + pid_t pid; + int status; + status = posix_spawn(&pid, name, NULL, NULL, (char *const *)args, environ); + if (status != 0) { + gb_printf_err("Could not spawn subprocess: %s\n", strerror(errno)); + return -1; + } + + for (;;) { + if (waitpid(pid, &status, WUNTRACED) < 0) { + gb_printf_err("Could not wait on subprocess: (pid: %d): %s\n", pid, strerror(errno)); + return -1; + } + + if (WIFEXITED(status)) { + return WEXITSTATUS(status); + } else if (WIFSIGNALED(status)) { + return -1; + } else if (WIFSTOPPED(status)) { + return -1; + } + } + GB_PANIC("Subprocess failure"); +#endif } #if defined(GB_SYSTEM_WINDOWS) @@ -3621,6 +3651,8 @@ int main(int arg_count, char const **arg_ptr) { init_build_context_error_pos_style(); Array args = setup_args(arg_count, arg_ptr); + Array run_args = array_make(heap_allocator(), 0, arg_count); + defer (array_free(&run_args)); String command = args[1]; String init_filename = {}; @@ -3648,9 +3680,6 @@ int main(int arg_count, char const **arg_ptr) { build_context.command_kind = Command_test; } - Array run_args = array_make(heap_allocator(), 0, arg_count); - defer (array_free(&run_args)); - isize run_args_start_idx = -1; for_array(i, args) { if (args[i] == "--") { @@ -4261,8 +4290,23 @@ end_of_code_gen:; String exe_name = path_to_string(heap_allocator(), build_context.build_paths[BuildPath_Output]); defer (gb_free(heap_allocator(), exe_name.text)); - system_must_exec_command_line_app("odin run", "\"%.*s\" %.*s", LIT(exe_name), LIT(run_args_string)); + const char* exe_name_cstring = alloc_cstring(heap_allocator(), exe_name); + Array run_args_cstring = array_make(heap_allocator(), 0, run_args.count); + defer({ + for_array(i, run_args_cstring) { gb_free(heap_allocator(), (void*)run_args_cstring[i]); } + array_free(&run_args_cstring); + }); + array_add(&run_args_cstring, exe_name_cstring); + for_array(i, run_args) { + array_add(&run_args_cstring, alloc_cstring(heap_allocator(), run_args[i])); + } + array_add(&run_args_cstring, NULL); + + int subprocess_res = run_subprocess(exe_name_cstring, run_args_cstring.data); + if (subprocess_res) { + gb_exit(subprocess_res); + } if (!build_context.keep_executable) { char const *filename = cast(char const *)exe_name.text; gb_file_remove(filename); From 5fdfbf7c06c1ae733c05f86e5a2803bbae042629 Mon Sep 17 00:00:00 2001 From: Franz Date: Tue, 16 Jun 2026 00:24:47 +0200 Subject: [PATCH 171/228] Fix initialization of global `any`s --- src/llvm_backend.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 15ff125d4..7a1f99955 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -2043,7 +2043,8 @@ gb_internal bool lb_init_global_var(lbModule *m, lbProcedure *p, Entity *e, Ast GB_ASSERT(!var.is_initialized); Type *t = type_deref(var.var.type); - if (is_type_any(t)) { + // NOTE: 'any' literals or 'any's that point to other variables can be handled by the generic path + if (is_type_any(t) && !is_type_any(var.init.type) && init_expr->tav.mode != Addressing_Variable) { // NOTE(bill): Edge case for 'any' type Type *var_type = default_type(var.init.type); gbString var_name = gb_string_make(permanent_allocator(), "__$global_any::"); From 1b4e277f585072672006fc0c3dac923c83bb9f0e Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Mon, 15 Jun 2026 22:59:58 -0400 Subject: [PATCH 172/228] [subprocess] removed unused variable --- src/main.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index a4acf1481..631ace841 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3656,7 +3656,6 @@ int main(int arg_count, char const **arg_ptr) { String command = args[1]; String init_filename = {}; - String run_args_string = {}; isize last_non_run_arg = args.count; for_array(i, args) { @@ -3701,7 +3700,6 @@ int main(int arg_count, char const **arg_ptr) { } } args = array_slice(args, 0, last_non_run_arg); - run_args_string = string_join_and_quote(heap_allocator(), run_args); init_filename = args[2]; run_output = true; From 32db7d8d562e4e9846f1d781aef1cbcb2415b5c8 Mon Sep 17 00:00:00 2001 From: A1029384756 Date: Wed, 17 Jun 2026 00:12:36 -0400 Subject: [PATCH 173/228] [subprocess] remove `p` as `PATH` is not needed to find executable --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 631ace841..9b85fd3b7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -187,7 +187,7 @@ extern char **environ; int run_subprocess(const char *name, const char **args) { #if defined(GB_SYSTEM_WINDOWS) - return (int)_spawnvp(_P_WAIT, name, args); + return (int)_spawnv(_P_WAIT, name, args); #else pid_t pid; int status; From c3b2c9a9b388c355eaa9faa5dfb33e80158966ca Mon Sep 17 00:00:00 2001 From: ARay Date: Thu, 18 Jun 2026 18:05:54 +0300 Subject: [PATCH 174/228] add test for the pr --- tests/issues/test_issue_6853.odin | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 tests/issues/test_issue_6853.odin diff --git a/tests/issues/test_issue_6853.odin b/tests/issues/test_issue_6853.odin new file mode 100644 index 000000000..af0bcebe5 --- /dev/null +++ b/tests/issues/test_issue_6853.odin @@ -0,0 +1,25 @@ +package test_issues + +import "core:testing" + +@(test) +test_issue_6853 :: proc(t: ^testing.T) { + + test_s :: struct { + a, b, c, d, e: u64, + } + + expected := test_s{1, 2, 3, 4, 5} + + case0 :: proc() -> (u64, u64) {return 1, 2} + test0 := test_s{case0(), 3, 4, 5} + testing.expect_value(t, test0, expected) + + case1 :: proc() -> (u64, u64, u64) {return 1, 2, 3} + test1 := test_s{case1(), 4, 5} + testing.expect_value(t, test1, expected) + + case2 :: proc() -> (u64, u64) {return 2, 3} + test2 := test_s{1, case2(), 4, 5} + testing.expect_value(t, test2, expected) +} From 417aa0ea9edee8574277ec57d6efbead1c2b4ec2 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 19 Jun 2026 09:08:52 +0100 Subject: [PATCH 175/228] Remove `0h` float panic which will have been caught previously by the tokenizer --- src/exact_value.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/exact_value.cpp b/src/exact_value.cpp index 525b8cb91..fa26ec4b0 100644 --- a/src/exact_value.cpp +++ b/src/exact_value.cpp @@ -337,7 +337,10 @@ gb_internal ExactValue exact_value_float_from_string(String string) { f64 f = bit_cast(u); return exact_value_float(f); } else { - GB_PANIC("Invalid hexadecimal float, expected 8 or 16 digits, got %td", digit_count); + // GB_PANIC("Invalid hexadecimal float, expected 4, 8, or 16 digits, got %td", digit_count); + // NOTE(bill): This should be caught by the tokenizer, so just pretend it's an f64 + f64 f = bit_cast(u); + return exact_value_float(f); } } From 11e7cff116ad82f4410885345586b027ff24f03f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 19 Jun 2026 09:12:57 +0100 Subject: [PATCH 176/228] Change `-stack-protector:` default to `none` --- src/build_settings.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 7ec081ff4..d67c53f25 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -1961,12 +1961,11 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta metrics->os == TargetOs_openbsd || metrics->os == TargetOs_netbsd) { if (bc->stack_protector == StackProtector_Default) { - bc->stack_protector = StackProtector_SspStrong; + bc->stack_protector = StackProtector_None; } } else { - if (bc->stack_protector == StackProtector_Default) { - bc->stack_protector = StackProtector_None; - } else { + if (bc->stack_protector != StackProtector_Default && + bc->stack_protector != StackProtector_None) { gb_printf_err("-stack-protector is not supported on this target\n"); gb_exit(1); } From 85db8c68a9d76ec45aa68f293123fa789a6f05f5 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 19 Jun 2026 09:14:11 +0100 Subject: [PATCH 177/228] Remove `-stack-protector:default` as `none` is now the default --- src/build_settings.cpp | 18 +++++++----------- src/main.cpp | 5 +---- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index d67c53f25..2a40d0cf5 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -279,7 +279,6 @@ enum RelocMode : u8 { }; enum StackProtector : u8 { - StackProtector_Default, StackProtector_None, StackProtector_Ssp, StackProtector_SspReq, @@ -1955,17 +1954,14 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta } if (metrics->os == TargetOs_windows || - metrics->os == TargetOs_darwin || - metrics->os == TargetOs_linux || - metrics->os == TargetOs_freebsd || - metrics->os == TargetOs_openbsd || - metrics->os == TargetOs_netbsd) { - if (bc->stack_protector == StackProtector_Default) { - bc->stack_protector = StackProtector_None; - } + metrics->os == TargetOs_darwin || + metrics->os == TargetOs_linux || + metrics->os == TargetOs_freebsd || + metrics->os == TargetOs_openbsd || + metrics->os == TargetOs_netbsd) { + // -stack-protector is supported } else { - if (bc->stack_protector != StackProtector_Default && - bc->stack_protector != StackProtector_None) { + if (bc->stack_protector != StackProtector_None) { gb_printf_err("-stack-protector is not supported on this target\n"); gb_exit(1); } diff --git a/src/main.cpp b/src/main.cpp index b38220c93..b32cbca65 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1441,9 +1441,7 @@ gb_internal bool parse_build_flags(Array args) { case BuildFlag_StackProtector: { GB_ASSERT(value.kind == ExactValue_String); String v = value.value_string; - if (v == "default") { - build_context.stack_protector = StackProtector_Default; - } else if (v == "none") { + if (v == "none") { build_context.stack_protector = StackProtector_None; } else if (v == "base") { build_context.stack_protector = StackProtector_Ssp; @@ -1453,7 +1451,6 @@ gb_internal bool parse_build_flags(Array args) { build_context.stack_protector = StackProtector_SspStrong; } else { gb_printf_err("-stack-protector flag expected one of the following\n"); - gb_printf_err("\tdefault\n"); gb_printf_err("\tnone\n"); gb_printf_err("\tbase\n"); gb_printf_err("\tall\n"); From abbfe793e033b04e935e64c330a37e2a773f624e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 19 Jun 2026 09:20:26 +0100 Subject: [PATCH 178/228] `fmt` on `h'` floats: force the width to always be bit_size/4 to accurately represent the number --- core/fmt/fmt.odin | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/fmt/fmt.odin b/core/fmt/fmt.odin index 3118e7e5e..3ef5a13e6 100644 --- a/core/fmt/fmt.odin +++ b/core/fmt/fmt.odin @@ -1456,9 +1456,11 @@ fmt_float :: proc(fi: ^Info, v: f64, bit_size: int, verb: rune) { prev_fi := fi^ defer fi^ = prev_fi fi.hash = false - fi.width = bit_size fi.zero = true fi.plus = false + // force the width to always be bit_size/4 to accurately represent the number + fi.width = bit_size/4 + fi.width_set = true u: u64 switch bit_size { From 3db074900fac9341a6df40824b310a9f1c9152bf Mon Sep 17 00:00:00 2001 From: ARay Date: Fri, 19 Jun 2026 15:05:23 +0300 Subject: [PATCH 179/228] comment out dead code: val is not used anywhere else in that scope --- src/llvm_backend_const.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index 0f0d458dc..20df5fdd0 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -1970,10 +1970,13 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, Ty for_array(i, cl->elems) { Entity *f = type->Struct.fields[i]; TypeAndValue tav = cl->elems[i]->tav; - ExactValue val = {}; - if (tav.mode != Addressing_Invalid) { - val = tav.value; - } + + // INFO: dead code: + + // ExactValue val = {}; + // if (tav.mode != Addressing_Invalid) { + // val = tav.value; + // } i32 index = field_remapping[f->Variable.field_index]; if (elem_type_can_be_constant(f->type)) { From 912a45769bc95f248fd9b1dda14535f4eca9463c Mon Sep 17 00:00:00 2001 From: ARay Date: Fri, 19 Jun 2026 15:39:24 +0300 Subject: [PATCH 180/228] fix issue 6853: when iterating the values of an array literal,if one of the values is a function with multiple returns, it doesn't offset the struct field index by the number of values. --- src/llvm_backend_const.cpp | 13 +++++++++++-- tests/issues/test_issue_6853.odin | 5 +++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index 20df5fdd0..a59ed4401 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -1967,8 +1967,9 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, Ty } } } else { + isize multiple_return_offset = 0; for_array(i, cl->elems) { - Entity *f = type->Struct.fields[i]; + Entity *f = type->Struct.fields[i+multiple_return_offset]; TypeAndValue tav = cl->elems[i]->tav; // INFO: dead code: @@ -1978,11 +1979,19 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, Ty // val = tav.value; // } + if (is_type_tuple(tav.type)){ + multiple_return_offset += tav.type->Tuple.variables.count-1; + } + i32 index = field_remapping[f->Variable.field_index]; + + if (elem_type_can_be_constant(f->type)) { lbValue value = lb_const_value(m, f->type, tav.value, tav.type, cc); LLVMTypeRef value_type = LLVMTypeOf(value.value); - GB_ASSERT_MSG(lb_sizeof(value_type) == type_size_of(f->type), "%s vs %s", LLVMPrintTypeToString(value_type), type_to_string(f->type)); + isize lb_sizeof_value_type = lb_sizeof(value_type); + isize type_size_of_f_type = type_size_of(f->type); + GB_ASSERT_MSG(lb_sizeof_value_type ==type_size_of_f_type, "%s vs %s", LLVMPrintTypeToString(value_type), type_to_string(f->type)); values[index] = value.value; visited[index] = true; } diff --git a/tests/issues/test_issue_6853.odin b/tests/issues/test_issue_6853.odin index af0bcebe5..fec4951a5 100644 --- a/tests/issues/test_issue_6853.odin +++ b/tests/issues/test_issue_6853.odin @@ -22,4 +22,9 @@ test_issue_6853 :: proc(t: ^testing.T) { case2 :: proc() -> (u64, u64) {return 2, 3} test2 := test_s{1, case2(), 4, 5} testing.expect_value(t, test2, expected) + + case3_1 :: proc() -> (u64, u64) {return 1, 2} + case3_2 :: proc() -> (u64, u64) {return 3, 4} + test3 := test_s{case3_1(), case3_2(), 5} + testing.expect_value(t, test3, expected) } From 76fb0aa975cfab74a55cea3e556336657b778b29 Mon Sep 17 00:00:00 2001 From: Brad Lewis <22850972+BradLewis@users.noreply.github.com> Date: Sun, 17 May 2026 12:01:01 +1000 Subject: [PATCH 181/228] Correct divergence with expr levels causing failures with the odin parser --- core/odin/parser/parser.odin | 27 +++++++++++++++-------- tests/core/odin/test_parser.odin | 37 ++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 9 deletions(-) diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin index e213f900e..eb2a3e1b2 100644 --- a/core/odin/parser/parser.odin +++ b/core/odin/parser/parser.odin @@ -378,7 +378,14 @@ advance_token :: proc(p: ^Parser) -> tokenizer.Token { prev := p.prev_tok if next_token0(p) { - consume_comment_groups(p, prev) + #partial switch p.curr_tok.kind { + case .Comment: + consume_comment_groups(p, prev) + case .Semicolon: + if p.expr_level > 0 && p.curr_tok.text == "\n" { + advance_token(p) + } + } } return prev } @@ -2366,10 +2373,10 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { case .Open_Paren: open := expect_token(p, .Open_Paren) - p.expr_level += 1 + prev_expr_level := p.expr_level + p.expr_level = max(p.expr_level, 0) + 1 expr := parse_expr(p, false) - skip_possible_newline(p) - p.expr_level -= 1 + p.expr_level = prev_expr_level close := expect_token(p, .Close_Paren) pe := ast.new(ast.Paren_Expr, open.pos, end_pos(close)) @@ -3208,11 +3215,12 @@ parse_elem_list :: proc(p: ^Parser) -> []^ast.Expr { parse_literal_value :: proc(p: ^Parser, type: ^ast.Expr) -> ^ast.Comp_Lit { elems: []^ast.Expr open := expect_token(p, .Open_Brace) - p.expr_level += 1 + prev_expr_level := p.expr_level + p.expr_level = 0 if p.curr_tok.kind != .Close_Brace { elems = parse_elem_list(p) } - p.expr_level -= 1 + p.expr_level = prev_expr_level skip_possible_newline(p) close := expect_closing_brace_of_field_list(p) @@ -3231,7 +3239,8 @@ parse_call_expr :: proc(p: ^Parser, operand: ^ast.Expr) -> ^ast.Expr { ellipsis: tokenizer.Token - p.expr_level += 1 + prev_expr_level := p.expr_level + p.expr_level = 0 open := expect_token(p, .Open_Paren) seen_ellipsis := false @@ -3278,8 +3287,8 @@ parse_call_expr :: proc(p: ^Parser, operand: ^ast.Expr) -> ^ast.Expr { allow_token(p, .Comma) or_break } + p.expr_level = prev_expr_level close := expect_closing_token_of_field_list(p, .Close_Paren, "argument list") - p.expr_level -= 1 ce := ast.new(ast.Call_Expr, operand.pos, end_pos(close)) ce.expr = operand @@ -3365,8 +3374,8 @@ parse_atom_expr :: proc(p: ^Parser, value: ^ast.Expr, lhs: bool) -> (operand: ^a } } - close := expect_token(p, .Close_Bracket) p.expr_level -= 1 + close := expect_token(p, .Close_Bracket) if is_slice_op { if interval.kind == .Comma { diff --git a/tests/core/odin/test_parser.odin b/tests/core/odin/test_parser.odin index cc180f9af..3fb15d893 100644 --- a/tests/core/odin/test_parser.odin +++ b/tests/core/odin/test_parser.odin @@ -94,3 +94,40 @@ test_parse_stb_image :: proc(t: ^testing.T) { testing.expectf(t, value.syntax_error_count == 0, "%v should contain zero errors", key) } } + +@test +test_parse_multiline_ternary :: proc(t: ^testing.T) { + context.allocator = context.temp_allocator + runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD() + file := ast.File{ + fullpath = "test.odin", + src = ` +package main + +my_func :: proc (cond: bool, a: string, b: string) -> string { + out := ( + cond + ? a + : b + ) + return out +} + `, + } + + p := parser.default_parser() + + p.err = proc(pos: tokenizer.Pos, format: string, args: ..any) { + message := fmt.tprintf(format, ..args) + log.errorf("%s(%d:%d): %s", pos.file, pos.line, pos.column, message) + } + + p.warn = proc(pos: tokenizer.Pos, format: string, args: ..any) { + message := fmt.tprintf(format, ..args) + log.warnf("%s(%d:%d): %s", pos.file, pos.line, pos.column, message) + } + + ok := parser.parse_file(&p, &file) + testing.expect(t, ok, "bad parse") + testing.expect(t, file.syntax_error_count == 0, "should contain zero errors") +} From 5dd0041eb2372abb35527c41cd23f27e65255ee4 Mon Sep 17 00:00:00 2001 From: Franz Date: Mon, 22 Jun 2026 12:32:39 +0200 Subject: [PATCH 182/228] Raise child process error signal if `odin run` child gets terminated. Previously one would get a nice `$ pid segmentation fault (core dumped) odin run .` message, but this behaviour was (probably unintentionally) removed in #6848. --- src/main.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main.cpp b/src/main.cpp index 89b2654d4..3a72c2a9c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -206,6 +206,9 @@ int run_subprocess(const char *name, const char **args) { if (WIFEXITED(status)) { return WEXITSTATUS(status); } else if (WIFSIGNALED(status)) { + struct rlimit limit = { 0, 0, }; + setrlimit(RLIMIT_CORE, &limit); + raise(WTERMSIG(status)); return -1; } else if (WIFSTOPPED(status)) { return -1; From 67cd4669749a9d5fe3292bad52308da1001d0275 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 22 Jun 2026 12:45:44 +0100 Subject: [PATCH 183/228] Fix the mistake caused by #6845 --- src/types.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/types.cpp b/src/types.cpp index 759f90ca6..66de402f8 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -3094,7 +3094,7 @@ gb_internal bool lookup_subtype_polymorphic_selection(Type *dst, Type *src, Sele return true; } } - if ((f->flags & EntityFlag_Using) != 0 && is_type_struct(f->type)) { + if ((f->flags & EntityFlags_IsSubtype) != 0 && is_type_struct(f->type)) { String name = lookup_subtype_polymorphic_field(dst, f->type); if (name.len > 0) { array_add(&sel->index, cast(i32)i); @@ -5030,11 +5030,7 @@ gb_internal isize check_is_assignable_to_using_subtype(Type *src, Type *dst, isi return level+1; } } - // Only follow the chain transitively when the field also has `using`, which is - // what the backend's lookup_subtype_polymorphic_selection requires (it gates - // recursion on EntityFlag_Using). A plain `#subtype`-only field enables a - // single-hop conversion but not a two-or-more hop transitive one. - if (f->flags & EntityFlag_Using) { + if (f->flags & EntityFlags_IsSubtype) { isize nested_level = check_is_assignable_to_using_subtype(f->type, dst, level+1, src_is_ptr, allow_polymorphic); if (nested_level > 0) { return nested_level; From baef272bbd08c365fe961abd76084227fc91c0d4 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 14 Jun 2026 15:51:27 +0100 Subject: [PATCH 184/228] Support constant compound literals --- src/check_expr.cpp | 20 ++-- src/llvm_backend_const.cpp | 186 ++++++++++++++++++++++++++++++++++++- src/llvm_backend_expr.cpp | 10 -- src/types.cpp | 17 +++- 4 files changed, 212 insertions(+), 21 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index cbaea1483..ad088b00c 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -10175,7 +10175,7 @@ gb_internal void check_compound_literal_field_values(CheckerContext *c, Slicekind == Type_BitField) { - assignment_str = str_lit("bit_field literal"); + assignment_str = str_lit("'bit_field' literal"); } for (Ast *elem : elems) { @@ -10187,14 +10187,14 @@ gb_internal void check_compound_literal_field_values(CheckerContext *c, Slicefield; if (ident->kind == Ast_ImplicitSelectorExpr) { gbString expr_str = expr_to_string(ident); - error(ident, "Field names do not start with a '.', remove the '.' in structure literal", expr_str); + error(ident, "Field names do not start with a '.', remove the '.' in %.*s", expr_str, LIT(assignment_str)); gb_string_free(expr_str); ident = ident->ImplicitSelectorExpr.selector; } if (ident->kind != Ast_Ident) { gbString expr_str = expr_to_string(ident); - error(elem, "Invalid field name '%s' in structure literal", expr_str); + error(elem, "Invalid field name '%s' in %.*s", expr_str, LIT(assignment_str)); gb_string_free(expr_str); continue; } @@ -10204,7 +10204,9 @@ gb_internal void check_compound_literal_field_values(CheckerContext *c, Slicemode == Addressing_Type); bool is_unknown = sel.entity == nullptr; if (is_unknown) { - error(ident, "Unknown field '%.*s' in structure literal", LIT(name)); + gbString s = type_to_string(type); + error(ident, "Unknown field '%.*s' in %.*s", LIT(name), LIT(assignment_str)); + gb_string_free(s); continue; } @@ -10258,7 +10260,7 @@ gb_internal void check_compound_literal_field_values(CheckerContext *c, SliceArray.elem; break; case Type_BitField: - is_constant = false; + // is_constant = false; ft = bt->BitField.fields[index]->type; break; default: @@ -10307,6 +10309,12 @@ gb_internal void check_compound_literal_field_values(CheckerContext *c, Slicetype); } + if (bt->kind == Type_BitField) { + if (is_type_different_to_arch_endianness(field->type)) { + is_constant = false; + } + } + u8 prev_bit_field_bit_size = c->bit_field_bit_size; if (field->kind == Entity_Variable && field->Variable.bit_field_bit_size) { @@ -11358,7 +11366,7 @@ gb_internal ExprKind check_compound_literal(CheckerContext *c, Operand *o, Ast * if (cl->elems.count == 0) { break; // NOTE(bill): No need to init } - is_constant = false; + // is_constant = false; if (cl->elems[0]->kind != Ast_FieldValue) { gbString type_str = type_to_string(type); error(node, "%s ('bit_field') compound literals are only allowed to contain 'field = value' elements", type_str); diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index a59ed4401..73e927e08 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -1,3 +1,12 @@ +gb_internal LLVMValueRef lb_const_low_bits_mask(LLVMTypeRef type, u64 bit_count) { + GB_ASSERT(bit_count <= 64); + if (bit_count == 0) { + return LLVMConstInt(type, 0, false); + } + u64 mask = bit_count == 64 ? ~0ull : (1ull<BitField.backing_type); + + struct FieldData { + Type *field_type; + u64 bit_offset; + u64 bit_size; + }; + auto values = array_make(temporary_allocator(), 0, cl->elems.count); + auto fields = array_make(temporary_allocator(), 0, cl->elems.count); + + for (Ast *elem : cl->elems) { + ast_node(fv, FieldValue, elem); + InternedString interned = fv->field->Ident.interned; + Selection sel = lookup_field(bt, interned, false); + GB_ASSERT(sel.is_bit_field); + GB_ASSERT(!sel.indirect); + GB_ASSERT(sel.index.count == 1); + GB_ASSERT(sel.entity != nullptr); + + i64 index = sel.index[0]; + Entity *f = bt->BitField.fields[index]; + GB_ASSERT(f == sel.entity); + i64 bit_offset = bt->BitField.bit_offsets[index]; + i64 bit_size = bt->BitField.bit_sizes[index]; + GB_ASSERT(bit_size > 0); + + Type *field_type = sel.entity->type; + if (fv->value->tav.mode != Addressing_Constant) { + continue; + } + lbValue field_expr = lb_const_value(m, field_type, fv->value->tav.value, field_type); + array_add(&values, field_expr); + array_add(&fields, FieldData{field_type, cast(u64)bit_offset, cast(u64)bit_size}); + } + + // NOTE(bill): inline insertion sort should be good enough, right? + for (isize i = 1; i < values.count; i++) { + for (isize j = i; + j > 0 && fields[i].bit_offset < fields[j].bit_offset; + j--) { + auto vtmp = values[j]; + values[j] = values[j-1]; + values[j-1] = vtmp; + + auto ftmp = fields[j]; + fields[j] = fields[j-1]; + fields[j-1] = ftmp; + } + } + + bool any_fields_different_endian = false; + for (auto const &f : fields) { + if (is_type_different_to_arch_endianness(f.field_type)) { + // NOTE(bill): Just be slow for this, to be correct + any_fields_different_endian = true; + break; + } + } + GB_ASSERT(!any_fields_different_endian); + + + Type *backing_type = core_type(bt->BitField.backing_type); + GB_ASSERT(is_type_integer(backing_type) || + (is_type_array(backing_type) && is_type_integer(backing_type->Array.elem))); + + if (is_type_integer(backing_type)) { + // SINGLE INTEGER BACKING ONLY + + LLVMTypeRef lit = lb_type(m, backing_type); + + LLVMValueRef res = LLVMConstInt(lit, 0, false); + + for (isize i = 0; i < fields.count; i++) { + auto const &f = fields[i]; + + LLVMValueRef mask = lb_const_low_bits_mask(lit, f.bit_size); + + LLVMValueRef elem = values[i].value; + if (lb_sizeof(lit) < lb_sizeof(LLVMTypeOf(elem))) { + elem = LLVMBuildTrunc(m->const_dummy_builder, elem, lit, ""); + } else { + elem = LLVMBuildZExt(m->const_dummy_builder, elem, lit, ""); + } + elem = LLVMBuildAnd(m->const_dummy_builder, elem, mask, ""); + + elem = LLVMBuildShl(m->const_dummy_builder, elem, LLVMConstInt(lit, f.bit_offset, false), ""); + + res = LLVMBuildOr(m->const_dummy_builder, res, elem, ""); + } + + return {res, type}; + } else if (is_type_array(backing_type)) { + // ARRAY OF INTEGER BACKING + + i64 array_count = backing_type->Array.count; + LLVMTypeRef lit = lb_type(m, core_type(backing_type->Array.elem)); + + LLVMValueRef *elems = gb_alloc_array(temporary_allocator(), LLVMValueRef, array_count); + for (i64 i = 0; i < array_count; i++) { + elems[i] = LLVMConstInt(lit, 0, false); + } + + u64 elem_bit_size = cast(u64)(8*type_size_of(backing_type->Array.elem)); + u64 curr_bit_offset = 0; + for (isize i = 0; i < fields.count; i++) { + auto const &f = fields[i]; + + LLVMValueRef val = values[i].value; + LLVMTypeRef vt = lb_type(m, values[i].type); + + curr_bit_offset = f.bit_offset; + + for (u64 bits_to_set = f.bit_size; + bits_to_set > 0; + /**/) { + i64 elem_idx = curr_bit_offset/elem_bit_size; + u64 elem_bit_offset = curr_bit_offset%elem_bit_size; + + u64 mask_width = gb_min(bits_to_set, elem_bit_size-elem_bit_offset); + GB_ASSERT(mask_width > 0); + bits_to_set -= mask_width; + + LLVMValueRef mask = lb_const_low_bits_mask(vt, mask_width); + + LLVMValueRef to_set = LLVMBuildAnd(m->const_dummy_builder, val, mask, ""); + + if (elem_bit_offset != 0) { + to_set = LLVMBuildShl(m->const_dummy_builder, to_set, LLVMConstInt(vt, elem_bit_offset, false), ""); + } + to_set = LLVMBuildTrunc(m->const_dummy_builder, to_set, lit, ""); + + if (LLVMIsNull(elems[elem_idx])) { + elems[elem_idx] = to_set; // don't even bother doing `0 | to_set` + } else { + elems[elem_idx] = LLVMBuildOr(m->const_dummy_builder, elems[elem_idx], to_set, ""); + } + + if (mask_width != 0) { + val = LLVMBuildLShr(m->const_dummy_builder, val, LLVMConstInt(vt, mask_width, false), ""); + } + curr_bit_offset += mask_width; + } + + GB_ASSERT_MSG(curr_bit_offset == f.bit_offset + f.bit_size, "%llu == %llu + %llu", + cast(unsigned long long)curr_bit_offset, + cast(unsigned long long)f.bit_offset, + cast(unsigned long long)f.bit_size + ); + } + + LLVMValueRef res = LLVMConstArray(lit, elems, cast(unsigned)array_count); + return {res, type}; + } else { + // SLOW STORAGE + GB_PANIC("TODO(bill): bit_field storage of an unknown kind"); + return {}; + } +} + + gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, Type *value_type, lbConstContext cc) { if (cc.allow_local) { cc.is_rodata = false; @@ -728,8 +904,10 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, Ty lbValue res = {}; res.type = original_type; - type = core_type(type); - value = convert_exact_value_for_type(value, type); + if (!is_type_bit_field(original_type)) { + type = core_type(type); + value = convert_exact_value_for_type(value, type); + } bool is_local = cc.allow_local && m->curr_procedure != nullptr; @@ -1278,7 +1456,9 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, Ty return res; case ExactValue_Compound: - if (is_type_slice(type)) { + if (is_type_bit_field(original_type)) { + return lb_const_value_bit_field(m, original_type, value.value_compound); + } else if (is_type_slice(type)) { return lb_const_value(m, type, value, value_type, cc); } else if (is_type_soa_struct(type)) { GB_ASSERT(type->kind == Type_Struct); diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 554ac79b7..e02f743ca 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -2,15 +2,6 @@ gb_internal lbValue lb_emit_arith_matrix(lbProcedure *p, TokenKind op, lbValue l gb_internal lbValue lb_build_slice_expr_value(lbProcedure *p, Ast *expr); gb_internal lbValue lb_expand_values(lbProcedure *p, lbValue val, Type *type); -gb_internal LLVMValueRef lb_const_low_bits_mask(LLVMTypeRef type, u64 bit_count) { - GB_ASSERT(bit_count <= 64); - if (bit_count == 0) { - return LLVMConstInt(type, 0, false); - } - u64 mask = bit_count == 64 ? ~0ull : (1ull<module; @@ -4422,7 +4413,6 @@ gb_internal lbValue lb_build_expr_internal(lbProcedure *p, Ast *expr) { GB_ASSERT_MSG(tv.mode != Addressing_Invalid, "invalid expression '%s' (tv.mode = %d, tv.type = %s) @ %s\n Current Proc: %.*s : %s", expr_to_string(expr), tv.mode, type_to_string(tv.type), token_pos_to_string(expr_pos), LIT(p->name), type_to_string(p->type)); - if (tv.value.kind != ExactValue_Invalid) { Type *original_type = lb_build_expr_original_const_type(expr); // NOTE(bill): Short on constant values diff --git a/src/types.cpp b/src/types.cpp index 66de402f8..45486e6bb 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -3829,8 +3829,22 @@ gb_internal Selection lookup_field_with_selection(Type *type_, InternedString fi } } else if (type->kind == Type_BitSet) { return lookup_field_with_selection(type->BitSet.elem, field_name, true, sel, allow_blank_ident); - } + } else if (type->kind == Type_BitField) { + for_array(i, type->BitField.fields) { + Entity *f = type->BitField.fields[i]; + if (f->kind != Entity_Variable || (f->flags & EntityFlag_Field) == 0) { + continue; + } + auto str = entity_interned_name(f); + if (field_name == str) { + selection_add_index(&sel, i); // HACK(bill): Leaky memory + sel.entity = f; + sel.is_bit_field = true; + return sel; + } + } + } if (type->kind == Type_Generic && type->Generic.specialized != nullptr) { Type *specialized = type->Generic.specialized; @@ -3929,7 +3943,6 @@ gb_internal Selection lookup_field_with_selection(Type *type_, InternedString fi return sel; } } - } else if (type->kind == Type_Basic) { switch (type->Basic.kind) { case Basic_any: { From a7186b8af00b26edc3893b02eb1aa5b6e156e8fb Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 14 Jun 2026 18:55:26 +0100 Subject: [PATCH 185/228] Minimize error propagation of `map[key]` indexing --- src/check_expr.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index ad088b00c..46fbc6717 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -11768,11 +11768,11 @@ gb_internal ExprKind check_index_expr(CheckerContext *c, Operand *o, Ast *node, check_expr_with_type_hint(c, &key, ie->index, t->Map.key); } check_assignment(c, &key, t->Map.key, str_lit("map index")); - if (key.mode == Addressing_Invalid) { - o->mode = Addressing_Invalid; - o->expr = node; - return kind; - } + // if (key.mode == Addressing_Invalid) { + // o->mode = Addressing_Invalid; + // o->expr = node; + // return kind; + // } o->mode = Addressing_MapIndex; o->type = t->Map.value; o->expr = node; From 6af1fe3e22db92a05dc665d14bf2f85073e07858 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 15 Jun 2026 11:44:00 +0100 Subject: [PATCH 186/228] doc writer: Use string interning and minimize the size of the compound literal generation when it is HUGE --- src/docs_writer.cpp | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index e0b0a05c1..6b700a3bf 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -370,7 +370,7 @@ gb_internal OdinDocString odin_doc_pkg_doc_string(OdinDocWriter *w, AstPackage * if (pkg == nullptr) { return {}; } - auto buf = array_make(permanent_allocator(), 0, 0); // Minor leak + auto buf = array_make(heap_allocator(), 0, 0); for_array(i, pkg->files) { AstFile *f = pkg->files[i]; @@ -380,31 +380,37 @@ gb_internal OdinDocString odin_doc_pkg_doc_string(OdinDocWriter *w, AstPackage * } } - return odin_doc_write_string_without_cache(w, make_string(buf.data, buf.count)); + String str = string_intern_string(make_string(buf.data, buf.count)); + array_free(&buf); + return odin_doc_write_string_without_cache(w, str); } gb_internal OdinDocString odin_doc_comment_group_string(OdinDocWriter *w, CommentGroup *g) { if (g == nullptr) { return {}; } - auto buf = array_make(permanent_allocator(), 0, 0); // Minor leak + auto buf = array_make(heap_allocator(), 0, 0); odin_doc_append_comment_group_string(&buf, g); - return odin_doc_write_string_without_cache(w, make_string(buf.data, buf.count)); + String str = string_intern_string(make_string(buf.data, buf.count)); + array_free(&buf); + return odin_doc_write_string_without_cache(w, str); } -gb_internal OdinDocString odin_doc_expr_string(OdinDocWriter *w, Ast *expr) { +gb_internal OdinDocString odin_doc_expr_string(OdinDocWriter *w, Ast *expr, bool use_shorthand=false) { if (expr == nullptr) { return {}; } - gbString s = write_expr_to_string( // Minor leak - gb_string_make(permanent_allocator(), ""), + gbString s = write_expr_to_string( + gb_string_make(heap_allocator(), ""), expr, - build_context.cmd_doc_flags & CmdDocFlag_Short + use_shorthand || (build_context.cmd_doc_flags & CmdDocFlag_Short) ); + String str = string_intern_string(make_string(cast(u8 *)s, gb_string_length(s))); + gb_string_free(s); - return odin_doc_write_string(w, make_string(cast(u8 *)s, gb_string_length(s))); + return odin_doc_write_string(w, str); } gb_internal OdinDocArray odin_doc_attributes(OdinDocWriter *w, Array const &attributes) { @@ -920,7 +926,16 @@ gb_internal OdinDocEntityIndex odin_doc_add_entity(OdinDocWriter *w, Entity *e) OdinDocString init_string = {}; if (init_expr) { - init_string = odin_doc_expr_string(w, init_expr); + bool use_shorthand = false; + if (e->kind == Entity_Variable) { + Ast *expr = init_expr; + if (expr->kind == Ast_CompoundLit) { + if (expr->CompoundLit.elems.count > 512) { + use_shorthand = true; + } + } + } + init_string = odin_doc_expr_string(w, init_expr, use_shorthand); } else { if (e->kind == Entity_Constant) { if (e->Constant.flags & EntityConstantFlag_ImplicitEnumValue) { From b3f6d9ce9b800dca43b321bf4665c56b900c2c75 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 15 Jun 2026 11:46:26 +0100 Subject: [PATCH 187/228] doc_writer: String intern constant values expressions --- src/docs_writer.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index 6b700a3bf..7a12d0875 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -943,7 +943,10 @@ gb_internal OdinDocEntityIndex odin_doc_add_entity(OdinDocWriter *w, Entity *e) } else if (e->Constant.param_value.original_ast_expr) { init_string = odin_doc_expr_string(w, e->Constant.param_value.original_ast_expr); } else { - init_string = odin_doc_write_string(w, make_string_c(exact_value_to_string(e->Constant.value))); + gbString s = exact_value_to_string(e->Constant.value); + String str = string_intern_string(make_string(cast(u8 *)s, gb_string_length(s))); + gb_string_free(s); + init_string = odin_doc_write_string(w, str); } } else if (e->kind == Entity_Variable) { if (e->Variable.param_value.original_ast_expr) { From 244430bd4ac57d5f1cc122ce0ce1d465b5731c86 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 15 Jun 2026 14:42:38 +0100 Subject: [PATCH 188/228] Allow for `struct #raw_union #packed` --- core/odin/parser/parser.odin | 5 ----- src/parser.cpp | 4 ---- 2 files changed, 9 deletions(-) diff --git a/core/odin/parser/parser.odin b/core/odin/parser/parser.odin index eb2a3e1b2..2339e0d6e 100644 --- a/core/odin/parser/parser.odin +++ b/core/odin/parser/parser.odin @@ -2812,11 +2812,6 @@ parse_operand :: proc(p: ^Parser, lhs: bool) -> ^ast.Expr { } p.expr_level = prev_level - if is_raw_union && is_packed { - is_packed = false - error(p, tok.pos, "'#raw_union' cannot also be '#packed") - } - if is_raw_union && is_all_or_none { is_all_or_none = false error(p, tok.pos, "'#raw_union' cannot also be '#all_or_none") diff --git a/src/parser.cpp b/src/parser.cpp index 60e5ac9e1..14258b5c6 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -2894,10 +2894,6 @@ gb_internal Ast *parse_operand(AstFile *f, bool lhs) { f->expr_level = prev_level; - if (is_raw_union && is_packed) { - is_packed = false; - syntax_error(token, "'#raw_union' cannot also be '#packed'"); - } if (is_raw_union && is_all_or_none) { is_all_or_none = false; syntax_error(token, "'#raw_union' cannot also be '#all_or_none'"); From 900ebd6b5bee9f7c257eed5c8b01f1229b298dc5 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 15 Jun 2026 16:53:15 +0100 Subject: [PATCH 189/228] Heavily improve reading and writing to bit fields --- base/runtime/internal.odin | 97 ++++++++++++----- src/llvm_backend_general.cpp | 203 +++++++++++++++++++++++++---------- 2 files changed, 217 insertions(+), 83 deletions(-) diff --git a/base/runtime/internal.odin b/base/runtime/internal.odin index bb9fc4b36..091feece7 100644 --- a/base/runtime/internal.odin +++ b/base/runtime/internal.odin @@ -8,10 +8,10 @@ IS_WASM :: ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 @(private) RUNTIME_LINKAGE :: "strong" when ODIN_USE_SEPARATE_MODULES else - "internal" when ODIN_NO_ENTRY_POINT && (ODIN_BUILD_MODE == .Static || ODIN_BUILD_MODE == .Dynamic || ODIN_BUILD_MODE == .Object) else - "strong" when ODIN_BUILD_MODE == .Dynamic else - "strong" when !ODIN_NO_CRT else - "internal" + "internal" when ODIN_NO_ENTRY_POINT && (ODIN_BUILD_MODE == .Static || ODIN_BUILD_MODE == .Dynamic || ODIN_BUILD_MODE == .Object) else + "strong" when ODIN_BUILD_MODE == .Dynamic else + "strong" when !ODIN_NO_CRT else + "internal" RUNTIME_REQUIRE :: false // !ODIN_TILDE @(private) @@ -24,7 +24,7 @@ HAS_HARDWARE_SIMD :: false when (ODIN_ARCH == .amd64 || ODIN_ARCH == .i386) && ! true // Size of a native SIMD register for the current compilation target -NATIVE_SIMD_BIT_WIDTH :: +NATIVE_SIMD_BIT_WIDTH :: 512 when (ODIN_ARCH == .amd64) && intrinsics.has_target_feature("avx512f") else 256 when (ODIN_ARCH == .amd64) && (intrinsics.has_target_feature("avx2") || intrinsics.has_target_feature("avx")) else // Fallback for no hardware SIMD, but also SSE, NEON, SVE, RVV and WASM SIMD128. @@ -1186,7 +1186,7 @@ floattidf :: proc "c" (a: i128) -> f64 { // okay case: a = i128(u128(a) >> u128(sd - (DBL_MANT_DIG+2))) | - i128(u128(a) & (~u128(0) >> u128(N + DBL_MANT_DIG+2 - sd)) != 0) + i128(u128(a) & (~u128(0) >> u128(N + DBL_MANT_DIG+2 - sd)) != 0) } a |= i128((a & 4) != 0) @@ -1202,8 +1202,8 @@ floattidf :: proc "c" (a: i128) -> f64 { } fb: [2]u32 fb[1] = (u32(s) & 0x80000000) | // sign - (u32(e + 1023) << 20) | // exponent - u32((u64(a) >> 32) & 0x000FFFFF) // mantissa-high + (u32(e + 1023) << 20) | // exponent + u32((u64(a) >> 32) & 0x000FFFFF) // mantissa-high fb[0] = u32(a) // mantissa-low return transmute(f64)fb } @@ -1243,8 +1243,8 @@ floattidf_unsigned :: proc "c" (a: u128) -> f64 { } fb: [2]u32 fb[1] = (0) | // sign - u32((e + 1023) << 20) | // exponent - u32((u64(a) >> 32) & 0x000FFFFF) // mantissa-high + u32((e + 1023) << 20) | // exponent + u32((u64(a) >> 32) & 0x000FFFFF) // mantissa-high fb[0] = u32(a) // mantissa-low return transmute(f64)fb } @@ -1374,24 +1374,71 @@ fixdfti :: proc "c" (a: u64) -> i128 { } - - -__write_bits :: proc "contextless" (dst, src: [^]byte, offset: uintptr, size: uintptr) { - for i in 0..>3]) & (1<<(i&7)) != 0) - dst[j>>3] &~= 1<<(j&7) - dst[j>>3] |= the_bit<<(j&7) +__copy_bits :: #force_inline proc "contextless" ( + dst: [^]byte, + src: [^]byte, + buf_bytes: uintptr, + dst_bit: uintptr, + src_bit: uintptr, + size_bits: uintptr, +) #no_bounds_check { + src_byte := src_bit >> 3 + dst_byte := dst_bit >> 3 + src_shift := src_bit & 7 + dst_shift := dst_bit & 7 + src_need_bytes := ((src_shift + size_bits + 7) >> 3) + a, b: u64 + if src_need_bytes <= 4 { + a = u64(intrinsics.unaligned_load((^u32)(&src[src_byte]))) + } else { + a = intrinsics.unaligned_load((^u64)(&src[src_byte])) + b = intrinsics.unaligned_load((^u64)(&src[src_byte + 8])) + } + bits := (a >> src_shift) | (b << (64 - src_shift)) + mask := ~u64(0) + if size_bits < 64 { + mask = (u64(1) << size_bits) - 1 + } + bits &= mask + dst_need_bytes := ((dst_shift + size_bits + 7) >> 3) + if dst_shift == 0 { + if dst_need_bytes <= 4 { + v := u64(intrinsics.unaligned_load((^u32)(&dst[dst_byte]))) + v = (v & ~mask) | bits + intrinsics.unaligned_store((^u32)(&dst[dst_byte]), u32(v)) + } else { + v := intrinsics.unaligned_load((^u64)(&dst[dst_byte])) + v = (v & ~mask) | bits + intrinsics.unaligned_store((^u64)(&dst[dst_byte]), v) + } + } else { + v0 := intrinsics.unaligned_load((^u64)(&dst[dst_byte])) + v1 := intrinsics.unaligned_load((^u64)(&dst[dst_byte + 8])) + v0 = (v0 & ~(mask << dst_shift)) | (bits << dst_shift) + v1 = (v1 & ~(mask >> (64 - dst_shift))) | (bits >> (64 - dst_shift)) + intrinsics.unaligned_store((^u64)(&dst[dst_byte]), v0) + intrinsics.unaligned_store((^u64)(&dst[dst_byte + 8]), v1) } } -__read_bits :: proc "contextless" (dst, src: [^]byte, offset: uintptr, size: uintptr) { - for j in 0..>3]) & (1<<(i&7)) != 0) - dst[j>>3] &~= 1<<(j&7) - dst[j>>3] |= the_bit<<(j&7) - } +__write_bits :: proc "contextless" (dst, src: [^]byte, dst_size_bytes: uintptr, offset_bits: uintptr, size_bits: uintptr) { + __copy_bits(dst, src, dst_size_bytes, offset_bits, 0, size_bits) + // for i in 0..>3]) & (1<<(i&7)) != 0) + // dst[j>>3] &~= 1<<(j&7) + // dst[j>>3] |= the_bit<<(j&7) + // } +} + +__read_bits :: proc "contextless" (dst, src: [^]byte, src_size_bytes: uintptr, offset_bits: uintptr, size_bits: uintptr) { + __copy_bits(dst, src, src_size_bytes, 0, offset_bits, size_bits) + // for j in 0..>3]) & (1<<(i&7)) != 0) + // dst[j>>3] &~= 1<<(j&7) + // dst[j>>3] |= the_bit<<(j&7) + // } } when .Address in ODIN_SANITIZER_FLAGS { diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 64829d4c4..00bbc77c0 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -964,6 +964,133 @@ gb_internal LLVMValueRef OdinLLVMBuildLoadAligned(lbProcedure *p, LLVMTypeRef ty return result; } +// gb_internal void OdinLLVMBuildUnalignedStore(lbProcedure *p, LLVMValueRef dst, LLVMValueRef src, Type *ptr_type) { +// Type *t = type_deref(ptr_type); + +// if (is_type_simd_vector(t)) { +// LLVMValueRef store = LLVMBuildStore(p->builder, src, dst); +// LLVMSetAlignment(store, 1); +// } else { +// lb_mem_copy_non_overlapping(p, {dst, ptr_type}, {src, ptr_type}, lb_const_int(p->module, t_int, type_size_of(t)), false); +// } + +// } +gb_internal LLVMValueRef OdinLLVMBuildUnalignedLoad(lbProcedure *p, LLVMValueRef src, Type *ptr_type) { + LLVMTypeRef type = lb_type(p->module, type_deref(ptr_type)); + + src = LLVMBuildPointerCast(p->builder, src, lb_type(p->module, ptr_type), ""); + LLVMValueRef load = LLVMBuildLoad2(p->builder, type, src, ""); + LLVMSetAlignment(load, 1); + return load; +} + +gb_internal void lb_copy_bits(lbProcedure *p, + LLVMValueRef dst, + LLVMValueRef src, + u64 buf_bytes, + u64 dst_bit, + u64 src_bit, + u64 size_bits +) { + auto ptr_offset = [](lbProcedure *p, LLVMValueRef ptr, u64 offset) -> LLVMValueRef { + LLVMValueRef indices[1] = {LLVMConstInt(lb_type(p->module, t_u64), offset, false)}; + ptr = LLVMBuildPointerCast(p->builder, ptr, lb_type(p->module, t_u8_ptr), ""); + return LLVMBuildGEP2(p->builder, lb_type(p->module, t_u8), ptr, indices, 1, ""); + }; + + Type *t_u32_ptr = alloc_type_pointer(t_u32); + Type *t_u64_ptr = alloc_type_pointer(t_u64); + LLVMTypeRef llvm_u32 = lb_type(p->module, t_u32); + LLVMTypeRef llvm_u64 = lb_type(p->module, t_u64); + LLVMTypeRef llvm_u32_ptr = lb_type(p->module, t_u32_ptr); + LLVMTypeRef llvm_u64_ptr = lb_type(p->module, t_u64_ptr); + + dst = LLVMBuildPointerCast(p->builder, dst, lb_type(p->module, t_u8_ptr), ""); + src = LLVMBuildPointerCast(p->builder, src, lb_type(p->module, t_u8_ptr), ""); + + u64 src_byte = src_bit>>3; + u64 dst_byte = dst_bit>>3; + u64 src_shift = src_bit&7; + u64 dst_shift = dst_bit&7; + u64 src_need_bytes = (src_shift + size_bits + 7)>>3; + + LLVMValueRef a = LLVMConstInt(llvm_u64, 0, false); + LLVMValueRef b = LLVMConstInt(llvm_u64, 0, false); + if (src_need_bytes <= 4) { + // a = u64(intrinsics.unaligned_load((^u32)(&src[src_byte]))) + a = OdinLLVMBuildUnalignedLoad(p, ptr_offset(p, src, src_byte), t_u32_ptr); + a = LLVMBuildZExt(p->builder, a, llvm_u64, ""); + } else { + // a = intrinsics.unaligned_load((^u64)(&src[src_byte])) + a = OdinLLVMBuildUnalignedLoad(p, ptr_offset(p, src, src_byte), t_u64_ptr); + // b = intrinsics.unaligned_load((^u64)(&src[src_byte + 8])) + b = OdinLLVMBuildUnalignedLoad(p, ptr_offset(p, src, src_byte + 8), t_u64_ptr); + } + + // bits := (a >> src_shift) | (b << (64 - src_shift)) + LLVMValueRef bits = LLVMBuildOr(p->builder, + LLVMBuildLShr(p->builder, a, LLVMConstInt(llvm_u64, src_shift, false), ""), + LLVMBuildShl (p->builder, b, LLVMConstInt(llvm_u64, 64 - src_shift, false), ""), + "" + ); + u64 mask = ~cast(u64)0; + if (size_bits < 64) { + mask = ((cast(u64)1)<builder, bits, LLVMConstInt(llvm_u64, mask, false), ""); + + u64 dst_need_bytes = (dst_shift + size_bits + 7) >> 3; + if (dst_shift == 0) { + if (dst_need_bytes <= 4) { + // v := u64(intrinsics.unaligned_load((^u32)(&dst[dst_byte]))) + LLVMValueRef v = OdinLLVMBuildUnalignedLoad(p, ptr_offset(p, dst, dst_byte), t_u32_ptr); + v = LLVMBuildZExt(p->builder, v, llvm_u64, ""); + + // v = (v & ~mask) | bits + v = LLVMBuildAnd(p->builder, v, LLVMConstInt(llvm_u64, ~mask, false), ""); + v = LLVMBuildOr(p->builder, v, bits, ""); + + // intrinsics.unaligned_store((^u32)(&dst[dst_byte]), u32(v)) + v = LLVMBuildTrunc(p->builder, v, llvm_u32, ""); + LLVMValueRef store = LLVMBuildStore(p->builder, v, LLVMBuildPointerCast(p->builder, ptr_offset(p, dst, dst_byte), llvm_u32_ptr, "")); + LLVMSetAlignment(store, 1); + } else { + // v := intrinsics.unaligned_load((^u64)(&dst[dst_byte])) + LLVMValueRef v = OdinLLVMBuildUnalignedLoad(p, ptr_offset(p, dst, dst_byte), t_u64_ptr); + + // v = (v & ~mask) | bits + v = LLVMBuildAnd(p->builder, v, LLVMConstInt(llvm_u64, ~mask, false), ""); + v = LLVMBuildOr(p->builder, v, bits, ""); + + // intrinsics.unaligned_store((^u64)(&dst[dst_byte]), v) + LLVMValueRef store = LLVMBuildStore(p->builder, v, LLVMBuildPointerCast(p->builder, ptr_offset(p, dst, dst_byte), llvm_u64_ptr, "")); + LLVMSetAlignment(store, 1); + } + } else { + // v0 := intrinsics.unaligned_load((^u64)(&dst[dst_byte])) + // v1 := intrinsics.unaligned_load((^u64)(&dst[dst_byte + 8])) + LLVMValueRef v0 = OdinLLVMBuildUnalignedLoad(p, ptr_offset(p, dst, dst_byte+0), t_u64_ptr); + LLVMValueRef v1 = OdinLLVMBuildUnalignedLoad(p, ptr_offset(p, dst, dst_byte+8), t_u64_ptr); + + // v0 = (v0 & ~(mask << dst_shift)) | (bits << dst_shift) + v0 = LLVMBuildAnd(p->builder, v0, LLVMConstInt(llvm_u64, ~(mask << dst_shift), false), ""); + v0 = LLVMBuildOr (p->builder, v0, LLVMBuildShl(p->builder, bits, LLVMConstInt(llvm_u64, dst_shift, false), ""), ""); + + // v1 = (v1 & ~(mask >> (64 - dst_shift))) | (bits >> (64 - dst_shift)) + v1 = LLVMBuildAnd(p->builder, v1, LLVMConstInt(llvm_u64, ~(mask >> (64 - dst_shift)), false), ""); + v1 = LLVMBuildOr (p->builder, v1, LLVMBuildLShr(p->builder, bits, LLVMConstInt(llvm_u64, (64 - dst_shift), false), ""), ""); + + // intrinsics.unaligned_store((^u64)(&dst[dst_byte]), v0) + // intrinsics.unaligned_store((^u64)(&dst[dst_byte + 8]), v1) + LLVMValueRef s0 = LLVMBuildStore(p->builder, v0, LLVMBuildPointerCast(p->builder, ptr_offset(p, dst, dst_byte+0), llvm_u64_ptr, "")); + LLVMValueRef s1 = LLVMBuildStore(p->builder, v1, LLVMBuildPointerCast(p->builder, ptr_offset(p, dst, dst_byte+8), llvm_u64_ptr, "")); + LLVMSetAlignment(s0, 1); + LLVMSetAlignment(s1, 1); + } +} + + gb_internal void lb_addr_store(lbProcedure *p, lbAddr addr, lbValue value) { if (addr.addr.value == nullptr) { return; @@ -981,6 +1108,7 @@ gb_internal void lb_addr_store(lbProcedure *p, lbAddr addr, lbValue value) { if (addr.kind == lbAddr_BitField) { lbValue dst = addr.addr; + lbValue src = {}; if (is_type_endian_big(addr.bitfield.type)) { i64 shift_amount = 8*type_size_of(value.type) - addr.bitfield.bit_size; lbValue shifted_value = value; @@ -988,33 +1116,17 @@ gb_internal void lb_addr_store(lbProcedure *p, lbAddr addr, lbValue value) { shifted_value.value, LLVMConstInt(LLVMTypeOf(shifted_value.value), shift_amount, false), ""); - lbValue src = lb_address_from_load_or_generate_local(p, shifted_value); - - auto args = array_make(temporary_allocator(), 4); - args[0] = dst; - args[1] = src; - args[2] = lb_const_int(p->module, t_uintptr, addr.bitfield.bit_offset); - args[3] = lb_const_int(p->module, t_uintptr, addr.bitfield.bit_size); - lb_emit_runtime_call(p, "__write_bits", args); - } else if ((addr.bitfield.bit_offset % 8) == 0 && - (addr.bitfield.bit_size % 8) == 0) { - lbValue src = lb_address_from_load_or_generate_local(p, value); - - lbValue byte_offset = lb_const_int(p->module, t_uintptr, addr.bitfield.bit_offset/8); - lbValue byte_size = lb_const_int(p->module, t_uintptr, addr.bitfield.bit_size/8); - lbValue dst_offset = lb_emit_conv(p, dst, t_u8_ptr); - dst_offset = lb_emit_ptr_offset(p, dst_offset, byte_offset); - lb_mem_copy_non_overlapping(p, dst_offset, src, byte_size); + src = lb_address_from_load_or_generate_local(p, shifted_value); } else { - lbValue src = lb_address_from_load_or_generate_local(p, value); - - auto args = array_make(temporary_allocator(), 4); - args[0] = dst; - args[1] = src; - args[2] = lb_const_int(p->module, t_uintptr, addr.bitfield.bit_offset); - args[3] = lb_const_int(p->module, t_uintptr, addr.bitfield.bit_size); - lb_emit_runtime_call(p, "__write_bits", args); + src = lb_address_from_load_or_generate_local(p, value); } + + u64 buf_bytes = cast(u64)type_size_of(type_deref(dst.type)); + u64 dst_bit = cast(u64)addr.bitfield.bit_offset; + u64 src_bit = cast(u64)0; + u64 size_bits = cast(u64)addr.bitfield.bit_size; + + lb_copy_bits(p, dst.value, src.value, buf_bytes, dst_bit, src_bit, size_bits); return; } else if (addr.kind == lbAddr_Map) { lb_internal_dynamic_map_set(p, addr.addr, addr.map.type, addr.map.key, value, p->curr_stmt); @@ -1296,53 +1408,28 @@ gb_internal lbValue lb_addr_load(lbProcedure *p, lbAddr const &addr) { } } - i64 total_bitfield_bit_size = 8*type_size_of(lb_addr_type(addr)); i64 dst_byte_size = type_size_of(addr.bitfield.type); lbAddr dst = lb_add_local_generated(p, addr.bitfield.type, true); lbValue src = addr.addr; - lbValue bit_offset = lb_const_int(p->module, t_uintptr, addr.bitfield.bit_offset); - lbValue bit_size = lb_const_int(p->module, t_uintptr, addr.bitfield.bit_size); - lbValue byte_offset = lb_const_int(p->module, t_uintptr, (addr.bitfield.bit_offset+7)/8); - lbValue byte_size = lb_const_int(p->module, t_uintptr, (addr.bitfield.bit_size+7)/8); - GB_ASSERT(type_size_of(addr.bitfield.type) >= ((addr.bitfield.bit_size+7)/8)); lbValue r = {}; - if (is_type_endian_big(addr.bitfield.type)) { - auto args = array_make(temporary_allocator(), 4); - args[0] = dst.addr; - args[1] = src; - args[2] = bit_offset; - args[3] = bit_size; - lb_emit_runtime_call(p, "__read_bits", args); + u64 buf_bytes = cast(u64)type_size_of(type_deref(src.type)); + u64 dst_bit = cast(u64)0; + u64 src_bit = cast(u64)addr.bitfield.bit_offset; + u64 size_bits = cast(u64)addr.bitfield.bit_size; + + lb_copy_bits(p, dst.addr.value, src.value, buf_bytes, dst_bit, src_bit, size_bits); + r = lb_addr_load(p, dst); + if (is_type_endian_big(addr.bitfield.type)) { LLVMValueRef shift_amount = LLVMConstInt( lb_type(p->module, lb_addr_type(dst)), 8*dst_byte_size - addr.bitfield.bit_size, false ); - r = lb_addr_load(p, dst); r.value = LLVMBuildShl(p->builder, r.value, shift_amount, ""); - } else if ((addr.bitfield.bit_offset % 8) == 0) { - do_mask = 8*dst_byte_size != addr.bitfield.bit_size; - - lbValue copy_size = byte_size; - lbValue src_offset = lb_emit_conv(p, src, t_u8_ptr); - src_offset = lb_emit_ptr_offset(p, src_offset, byte_offset); - if (addr.bitfield.bit_offset + 8*dst_byte_size <= total_bitfield_bit_size) { - copy_size = lb_const_int(p->module, t_uintptr, dst_byte_size); - } - lb_mem_copy_non_overlapping(p, dst.addr, src_offset, copy_size, false); - r = lb_addr_load(p, dst); - } else { - auto args = array_make(temporary_allocator(), 4); - args[0] = dst.addr; - args[1] = src; - args[2] = bit_offset; - args[3] = bit_size; - lb_emit_runtime_call(p, "__read_bits", args); - r = lb_addr_load(p, dst); } Type *t = addr.bitfield.type; From 588a8148f2e8fac5da7ba871847e11cb9d5e6a51 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 15 Jun 2026 16:57:27 +0100 Subject: [PATCH 190/228] Remove the now defunct `__write_bits` and `__read_bits` --- base/runtime/internal.odin | 21 +-------------------- src/check_expr.cpp | 5 ----- 2 files changed, 1 insertion(+), 25 deletions(-) diff --git a/base/runtime/internal.odin b/base/runtime/internal.odin index 091feece7..3847ce046 100644 --- a/base/runtime/internal.odin +++ b/base/runtime/internal.odin @@ -1374,7 +1374,7 @@ fixdfti :: proc "c" (a: u64) -> i128 { } -__copy_bits :: #force_inline proc "contextless" ( +__copy_bits :: proc "contextless" ( dst: [^]byte, src: [^]byte, buf_bytes: uintptr, @@ -1421,25 +1421,6 @@ __copy_bits :: #force_inline proc "contextless" ( } } -__write_bits :: proc "contextless" (dst, src: [^]byte, dst_size_bytes: uintptr, offset_bits: uintptr, size_bits: uintptr) { - __copy_bits(dst, src, dst_size_bytes, offset_bits, 0, size_bits) - // for i in 0..>3]) & (1<<(i&7)) != 0) - // dst[j>>3] &~= 1<<(j&7) - // dst[j>>3] |= the_bit<<(j&7) - // } -} - -__read_bits :: proc "contextless" (dst, src: [^]byte, src_size_bytes: uintptr, offset_bits: uintptr, size_bits: uintptr) { - __copy_bits(dst, src, src_size_bytes, 0, offset_bits, size_bits) - // for j in 0..>3]) & (1<<(i&7)) != 0) - // dst[j>>3] &~= 1<<(j&7) - // dst[j>>3] |= the_bit<<(j&7) - // } -} when .Address in ODIN_SANITIZER_FLAGS { foreign { diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 46fbc6717..53d72f35b 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -6131,11 +6131,6 @@ gb_internal Entity *check_selector(CheckerContext *c, Operand *operand, Ast *nod operand->type = entity->type; operand->expr = node; - if (entity->flags & EntityFlag_BitFieldField) { - add_package_dependency(c, "runtime", "__write_bits"); - add_package_dependency(c, "runtime", "__read_bits"); - } - switch (entity->kind) { case Entity_Constant: operand->value = entity->Constant.value; From 8971e0f1ec59346be463721797335cde28519483 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 15 Jun 2026 17:13:33 +0100 Subject: [PATCH 191/228] Fix shifting buf in lb_copy_bits --- src/llvm_backend_general.cpp | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 00bbc77c0..c3d89b583 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -1023,16 +1023,28 @@ gb_internal void lb_copy_bits(lbProcedure *p, } else { // a = intrinsics.unaligned_load((^u64)(&src[src_byte])) a = OdinLLVMBuildUnalignedLoad(p, ptr_offset(p, src, src_byte), t_u64_ptr); - // b = intrinsics.unaligned_load((^u64)(&src[src_byte + 8])) - b = OdinLLVMBuildUnalignedLoad(p, ptr_offset(p, src, src_byte + 8), t_u64_ptr); + if (src_need_bytes > 8) { + // b = intrinsics.unaligned_load((^u64)(&src[src_byte + 8])) + b = OdinLLVMBuildUnalignedLoad(p, ptr_offset(p, src, src_byte + 8), t_u64_ptr); + } } - // bits := (a >> src_shift) | (b << (64 - src_shift)) + LLVMValueRef hi; + if (src_shift == 0) { + hi = LLVMConstInt(llvm_u64, 0, false); + } else { + hi = LLVMBuildShl(p->builder, b, LLVMConstInt(llvm_u64, 64 - src_shift, false), ""); + } LLVMValueRef bits = LLVMBuildOr(p->builder, - LLVMBuildLShr(p->builder, a, LLVMConstInt(llvm_u64, src_shift, false), ""), - LLVMBuildShl (p->builder, b, LLVMConstInt(llvm_u64, 64 - src_shift, false), ""), - "" - ); + LLVMBuildLShr(p->builder, a, LLVMConstInt(llvm_u64, src_shift, false), ""), + hi, ""); + + // // bits := (a >> src_shift) | (b << (64 - src_shift)) + // LLVMValueRef bits = LLVMBuildOr(p->builder, + // LLVMBuildLShr(p->builder, a, LLVMConstInt(llvm_u64, src_shift, false), ""), + // LLVMBuildShl (p->builder, b, LLVMConstInt(llvm_u64, 64 - src_shift, false), ""), + // "" + // ); u64 mask = ~cast(u64)0; if (size_bits < 64) { mask = ((cast(u64)1)< Date: Mon, 15 Jun 2026 17:46:54 +0100 Subject: [PATCH 192/228] Improve `lb_copy_bits` --- src/llvm_backend_general.cpp | 136 ++++++++++++++--------------------- 1 file changed, 52 insertions(+), 84 deletions(-) diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index c3d89b583..d0249172c 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -992,117 +992,85 @@ gb_internal void lb_copy_bits(lbProcedure *p, u64 src_bit, u64 size_bits ) { + if (size_bits == 0) { + return; + } + GB_ASSERT(size_bits <= 64); // this routine assembles the field in a single u64 + auto ptr_offset = [](lbProcedure *p, LLVMValueRef ptr, u64 offset) -> LLVMValueRef { LLVMValueRef indices[1] = {LLVMConstInt(lb_type(p->module, t_u64), offset, false)}; ptr = LLVMBuildPointerCast(p->builder, ptr, lb_type(p->module, t_u8_ptr), ""); return LLVMBuildGEP2(p->builder, lb_type(p->module, t_u8), ptr, indices, 1, ""); }; - Type *t_u32_ptr = alloc_type_pointer(t_u32); - Type *t_u64_ptr = alloc_type_pointer(t_u64); - LLVMTypeRef llvm_u32 = lb_type(p->module, t_u32); + LLVMTypeRef llvm_u8 = lb_type(p->module, t_u8); LLVMTypeRef llvm_u64 = lb_type(p->module, t_u64); - LLVMTypeRef llvm_u32_ptr = lb_type(p->module, t_u32_ptr); - LLVMTypeRef llvm_u64_ptr = lb_type(p->module, t_u64_ptr); dst = LLVMBuildPointerCast(p->builder, dst, lb_type(p->module, t_u8_ptr), ""); src = LLVMBuildPointerCast(p->builder, src, lb_type(p->module, t_u8_ptr), ""); - u64 src_byte = src_bit>>3; - u64 dst_byte = dst_bit>>3; - u64 src_shift = src_bit&7; - u64 dst_shift = dst_bit&7; - u64 src_need_bytes = (src_shift + size_bits + 7)>>3; + u64 src_byte = src_bit >> 3; + u64 dst_byte = dst_bit >> 3; + u64 src_shift = src_bit & 7; + u64 dst_shift = dst_bit & 7; - LLVMValueRef a = LLVMConstInt(llvm_u64, 0, false); - LLVMValueRef b = LLVMConstInt(llvm_u64, 0, false); - if (src_need_bytes <= 4) { - // a = u64(intrinsics.unaligned_load((^u32)(&src[src_byte]))) - a = OdinLLVMBuildUnalignedLoad(p, ptr_offset(p, src, src_byte), t_u32_ptr); - a = LLVMBuildZExt(p->builder, a, llvm_u64, ""); - } else { - // a = intrinsics.unaligned_load((^u64)(&src[src_byte])) - a = OdinLLVMBuildUnalignedLoad(p, ptr_offset(p, src, src_byte), t_u64_ptr); - if (src_need_bytes > 8) { - // b = intrinsics.unaligned_load((^u64)(&src[src_byte + 8])) - b = OdinLLVMBuildUnalignedLoad(p, ptr_offset(p, src, src_byte + 8), t_u64_ptr); - } - } + u64 src_need_bytes = (src_shift + size_bits + 7) >> 3; // 1..9, exact span of the field + u64 dst_need_bytes = (dst_shift + size_bits + 7) >> 3; // 1..9, exact span of the field - LLVMValueRef hi; - if (src_shift == 0) { - hi = LLVMConstInt(llvm_u64, 0, false); - } else { - hi = LLVMBuildShl(p->builder, b, LLVMConstInt(llvm_u64, 64 - src_shift, false), ""); - } - LLVMValueRef bits = LLVMBuildOr(p->builder, - LLVMBuildLShr(p->builder, a, LLVMConstInt(llvm_u64, src_shift, false), ""), - hi, ""); + // These spans are exactly the bytes the field occupies, so they are in bounds + // whenever the field is. (buf_bytes must bound the buffer each pointer refers to.) + GB_ASSERT(src_byte + src_need_bytes <= buf_bytes); + GB_ASSERT(dst_byte + dst_need_bytes <= buf_bytes); - // // bits := (a >> src_shift) | (b << (64 - src_shift)) - // LLVMValueRef bits = LLVMBuildOr(p->builder, - // LLVMBuildLShr(p->builder, a, LLVMConstInt(llvm_u64, src_shift, false), ""), - // LLVMBuildShl (p->builder, b, LLVMConstInt(llvm_u64, 64 - src_shift, false), ""), - // "" - // ); u64 mask = ~cast(u64)0; if (size_bits < 64) { - mask = ((cast(u64)1)<builder, byte, llvm_u64, ""); + + // byte i sits at frame bit i*8; the field starts at frame bit src_shift + if (i*8 >= src_shift) { + u64 sh = i*8 - src_shift; // 0..63 (sh==64 only needs i==8, which requires src_shift>=1) + byte = LLVMBuildShl (p->builder, byte, LLVMConstInt(llvm_u64, sh, false), ""); + } else { + u64 sh = src_shift - i*8; // 1..7 + byte = LLVMBuildLShr(p->builder, byte, LLVMConstInt(llvm_u64, sh, false), ""); + } + bits = LLVMBuildOr(p->builder, bits, byte, ""); } - // bits &= mask bits = LLVMBuildAnd(p->builder, bits, LLVMConstInt(llvm_u64, mask, false), ""); - u64 dst_need_bytes = (dst_shift + size_bits + 7) >> 3; - if (dst_shift == 0) { - if (dst_need_bytes <= 4) { - // v := u64(intrinsics.unaligned_load((^u32)(&dst[dst_byte]))) - LLVMValueRef v = OdinLLVMBuildUnalignedLoad(p, ptr_offset(p, dst, dst_byte), t_u32_ptr); - v = LLVMBuildZExt(p->builder, v, llvm_u64, ""); + // Scatter: write exactly dst_need_bytes bytes, each a masked read-modify-write --- + for (u64 i = 0; i < dst_need_bytes; i++) { + LLVMValueRef contrib = nullptr; + u64 byte_mask = 0; // which bits (0..7) of this byte belong to the field - // v = (v & ~mask) | bits - v = LLVMBuildAnd(p->builder, v, LLVMConstInt(llvm_u64, ~mask, false), ""); - v = LLVMBuildOr(p->builder, v, bits, ""); - - // intrinsics.unaligned_store((^u32)(&dst[dst_byte]), u32(v)) - v = LLVMBuildTrunc(p->builder, v, llvm_u32, ""); - LLVMValueRef store = LLVMBuildStore(p->builder, v, LLVMBuildPointerCast(p->builder, ptr_offset(p, dst, dst_byte), llvm_u32_ptr, "")); - LLVMSetAlignment(store, 1); + if (i*8 >= dst_shift) { + u64 sh = i*8 - dst_shift; + contrib = LLVMBuildLShr(p->builder, bits, LLVMConstInt(llvm_u64, sh, false), ""); + byte_mask = (mask >> sh) & 0xff; } else { - // v := intrinsics.unaligned_load((^u64)(&dst[dst_byte])) - LLVMValueRef v = OdinLLVMBuildUnalignedLoad(p, ptr_offset(p, dst, dst_byte), t_u64_ptr); - - // v = (v & ~mask) | bits - v = LLVMBuildAnd(p->builder, v, LLVMConstInt(llvm_u64, ~mask, false), ""); - v = LLVMBuildOr(p->builder, v, bits, ""); - - // intrinsics.unaligned_store((^u64)(&dst[dst_byte]), v) - LLVMValueRef store = LLVMBuildStore(p->builder, v, LLVMBuildPointerCast(p->builder, ptr_offset(p, dst, dst_byte), llvm_u64_ptr, "")); - LLVMSetAlignment(store, 1); + u64 sh = dst_shift - i*8; // 1..7 + contrib = LLVMBuildShl(p->builder, bits, LLVMConstInt(llvm_u64, sh, false), ""); + byte_mask = (mask << sh) & 0xff; } - } else { - // v0 := intrinsics.unaligned_load((^u64)(&dst[dst_byte])) - // v1 := intrinsics.unaligned_load((^u64)(&dst[dst_byte + 8])) - LLVMValueRef v0 = OdinLLVMBuildUnalignedLoad(p, ptr_offset(p, dst, dst_byte+0), t_u64_ptr); - LLVMValueRef v1 = OdinLLVMBuildUnalignedLoad(p, ptr_offset(p, dst, dst_byte+8), t_u64_ptr); + contrib = LLVMBuildTrunc(p->builder, contrib, llvm_u8, ""); + contrib = LLVMBuildAnd(p->builder, contrib, LLVMConstInt(llvm_u8, byte_mask, false), ""); - // v0 = (v0 & ~(mask << dst_shift)) | (bits << dst_shift) - v0 = LLVMBuildAnd(p->builder, v0, LLVMConstInt(llvm_u64, ~(mask << dst_shift), false), ""); - v0 = LLVMBuildOr (p->builder, v0, LLVMBuildShl(p->builder, bits, LLVMConstInt(llvm_u64, dst_shift, false), ""), ""); + LLVMValueRef old = OdinLLVMBuildUnalignedLoad(p, ptr_offset(p, dst, dst_byte + i), t_u8_ptr); + old = LLVMBuildAnd(p->builder, old, LLVMConstInt(llvm_u8, (~byte_mask) & 0xff, false), ""); - // v1 = (v1 & ~(mask >> (64 - dst_shift))) | (bits >> (64 - dst_shift)) - v1 = LLVMBuildAnd(p->builder, v1, LLVMConstInt(llvm_u64, ~(mask >> (64 - dst_shift)), false), ""); - v1 = LLVMBuildOr (p->builder, v1, LLVMBuildLShr(p->builder, bits, LLVMConstInt(llvm_u64, (64 - dst_shift), false), ""), ""); - - // intrinsics.unaligned_store((^u64)(&dst[dst_byte]), v0) - // intrinsics.unaligned_store((^u64)(&dst[dst_byte + 8]), v1) - LLVMValueRef s0 = LLVMBuildStore(p->builder, v0, LLVMBuildPointerCast(p->builder, ptr_offset(p, dst, dst_byte+0), llvm_u64_ptr, "")); - LLVMValueRef s1 = LLVMBuildStore(p->builder, v1, LLVMBuildPointerCast(p->builder, ptr_offset(p, dst, dst_byte+8), llvm_u64_ptr, "")); - LLVMSetAlignment(s0, 1); - LLVMSetAlignment(s1, 1); + LLVMValueRef merged = LLVMBuildOr(p->builder, old, contrib, ""); + LLVMValueRef store = LLVMBuildStore(p->builder, merged, ptr_offset(p, dst, dst_byte + i)); + LLVMSetAlignment(store, 1); } } - gb_internal void lb_addr_store(lbProcedure *p, lbAddr addr, lbValue value) { if (addr.addr.value == nullptr) { return; From 233242f4eade3a0e0085700236ed13bd8919de02 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 15 Jun 2026 17:48:33 +0100 Subject: [PATCH 193/228] Remove `__copy_bits` --- base/runtime/internal.odin | 47 -------------------------------------- 1 file changed, 47 deletions(-) diff --git a/base/runtime/internal.odin b/base/runtime/internal.odin index 3847ce046..2b9cdae62 100644 --- a/base/runtime/internal.odin +++ b/base/runtime/internal.odin @@ -1374,53 +1374,6 @@ fixdfti :: proc "c" (a: u64) -> i128 { } -__copy_bits :: proc "contextless" ( - dst: [^]byte, - src: [^]byte, - buf_bytes: uintptr, - dst_bit: uintptr, - src_bit: uintptr, - size_bits: uintptr, -) #no_bounds_check { - src_byte := src_bit >> 3 - dst_byte := dst_bit >> 3 - src_shift := src_bit & 7 - dst_shift := dst_bit & 7 - src_need_bytes := ((src_shift + size_bits + 7) >> 3) - a, b: u64 - if src_need_bytes <= 4 { - a = u64(intrinsics.unaligned_load((^u32)(&src[src_byte]))) - } else { - a = intrinsics.unaligned_load((^u64)(&src[src_byte])) - b = intrinsics.unaligned_load((^u64)(&src[src_byte + 8])) - } - bits := (a >> src_shift) | (b << (64 - src_shift)) - mask := ~u64(0) - if size_bits < 64 { - mask = (u64(1) << size_bits) - 1 - } - bits &= mask - dst_need_bytes := ((dst_shift + size_bits + 7) >> 3) - if dst_shift == 0 { - if dst_need_bytes <= 4 { - v := u64(intrinsics.unaligned_load((^u32)(&dst[dst_byte]))) - v = (v & ~mask) | bits - intrinsics.unaligned_store((^u32)(&dst[dst_byte]), u32(v)) - } else { - v := intrinsics.unaligned_load((^u64)(&dst[dst_byte])) - v = (v & ~mask) | bits - intrinsics.unaligned_store((^u64)(&dst[dst_byte]), v) - } - } else { - v0 := intrinsics.unaligned_load((^u64)(&dst[dst_byte])) - v1 := intrinsics.unaligned_load((^u64)(&dst[dst_byte + 8])) - v0 = (v0 & ~(mask << dst_shift)) | (bits << dst_shift) - v1 = (v1 & ~(mask >> (64 - dst_shift))) | (bits >> (64 - dst_shift)) - intrinsics.unaligned_store((^u64)(&dst[dst_byte]), v0) - intrinsics.unaligned_store((^u64)(&dst[dst_byte + 8]), v1) - } -} - when .Address in ODIN_SANITIZER_FLAGS { foreign { From 3834aeec49fb0b17bb975ad9c2ac24546e1e48cf Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 16 Jun 2026 15:26:01 +0100 Subject: [PATCH 194/228] Compiler: Improve error propagation when all of the overloads have the same return values --- src/check_expr.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 53d72f35b..24ee86810 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -7818,6 +7818,30 @@ gb_internal CallArgumentData check_call_arguments_proc_group(CheckerContext *c, } data.result_type = t_invalid; + if (procs.count > 0) { + Type *first_type = base_type(procs[0]->type); + GB_ASSERT(first_type->kind == Type_Proc); + Type *first_results = first_type->Proc.results; + bool all_the_same = true; + for (isize i = 1; i < procs.count; i++) { + Type *type = base_type(procs[i]->type); + if (type->kind != Type_Proc) { + all_the_same = false; + break; + } + Type *results = type->Proc.results; + if (!are_types_identical(first_results, results)) { + all_the_same = false; + break; + } + } + if (all_the_same) { + GB_ASSERT_MSG(is_type_tuple(first_results), "%s", type_to_string(first_results)); + data.result_type = first_results; + } + } + + } else if (valids.count > 1) { ERROR_BLOCK(); From c843f3bb651cea525069af188940aa84e35ff753 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 19 Jun 2026 11:19:16 +0100 Subject: [PATCH 195/228] Optimize `append_elem` for different optimization levels * For `-o:size` and below, uses the type erased approach * For `-o:speed` and above, the inlined form is used This is necessary because a generic `mem_copy_non_overlapping` cannot be optimized when type erasure is used, meaning in a hot path where `append_elem` is used a lot; thus `mem_copy_non_overlapping` becomes a bottleneck. --- base/runtime/core_builtin.odin | 61 ++++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 3 deletions(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index e2e4e693a..cdf0fbcab 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -715,10 +715,10 @@ _append_elem :: #force_no_inline proc(array: ^Raw_Dynamic_Array, size_of_elem, a if array.cap < array.len+1 { // Same behavior as _append_elems but there's only one arg, so we always just add DEFAULT_DYNAMIC_ARRAY_CAPACITY. - cap := 2 * array.cap + DEFAULT_DYNAMIC_ARRAY_CAPACITY + cap := max(2 * array.cap, DEFAULT_DYNAMIC_ARRAY_CAPACITY) // do not 'or_return' here as it could be a partial success - err = _reserve_dynamic_array(array, size_of_elem, align_of_elem, cap, should_zero, loc) + err = _reserve_dynamic_array_unsafe(array, size_of_elem, align_of_elem, cap, should_zero, loc) } if array.cap-array.len > 0 { data := ([^]byte)(array.data) @@ -735,11 +735,37 @@ _append_elem :: #force_no_inline proc(array: ^Raw_Dynamic_Array, size_of_elem, a @builtin append_elem :: proc(array: ^$T/[dynamic]$E, #no_broadcast arg: E, loc := #caller_location) -> (num_appended: int, err: Allocator_Error) #optional_allocator_error { when size_of(E) == 0 { + if array == nil { + return + } (^Raw_Dynamic_Array)(array).len += 1 return 1, nil - } else { + } else when ODIN_OPTIMIZATION_MODE <= .Size { arg := arg return _append_elem((^Raw_Dynamic_Array)(array), size_of(E), align_of(E), &arg, true, loc=loc) + } else { + if array == nil { + return + } + arg := arg + arr := (^Raw_Dynamic_Array)(array) + if arr.cap < arr.len+1 { + // Same behavior as _append_elems but there's only one arg, so we always just add DEFAULT_DYNAMIC_ARRAY_CAPACITY. + cap := max(2 * arr.cap, DEFAULT_DYNAMIC_ARRAY_CAPACITY) + + // do not 'or_return' here as it could be a partial success + err = _reserve_dynamic_array_unsafe(arr, size_of(E), align_of(E), cap, true, loc) + } + if arr.cap-arr.len > 0 { + // NOTE(bill, 2026-06-19): When this is in the hot path with -o:speed or -o:aggressive enabled, + // this code path cannot rely on type erasure and `mem_copy_non_overlapping`. + // So directly inlining the call and storing the argument like this helps the optimize a lot + assert(arr.data != nil, loc=loc) + ([^]E)(arr.data)[arr.len] = arg + arr.len += 1 + num_appended = 1 + } + return } } @@ -1311,6 +1337,35 @@ _reserve_dynamic_array :: #force_no_inline proc(a: ^Raw_Dynamic_Array, size_of_e return nil } +_reserve_dynamic_array_unsafe :: #force_no_inline proc(a: ^Raw_Dynamic_Array, size_of_elem, align_of_elem: int, capacity: int, should_zero: bool, loc := #caller_location) -> Allocator_Error { + if capacity <= a.cap { + return nil + } + + if a.allocator.procedure == nil { + a.allocator = context.allocator + assert(a.allocator.procedure != nil) + } + + old_size := a.cap * size_of_elem + new_size := capacity * size_of_elem + allocator := a.allocator + + new_data: []byte + if should_zero { + new_data = mem_resize(a.data, old_size, new_size, align_of_elem, allocator, loc) or_return + } else { + new_data = non_zero_mem_resize(a.data, old_size, new_size, align_of_elem, allocator, loc) or_return + } + if new_data == nil && new_size > 0 { + return .Out_Of_Memory + } + + a.data = raw_data(new_data) + a.cap = capacity + return nil +} + // `reserve_dynamic_array` will try to reserve memory of a passed dynamic array or map to the requested element count (setting the `cap`). // // When a memory resize allocation is required, the memory will be asked to be zeroed (i.e. it calls `mem_resize`). From 6cf57c1eaa8e7148a57c88c545d27de78e5faf43 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 22 Jun 2026 13:17:43 +0100 Subject: [PATCH 196/228] Fix #6863 --- src/check_expr.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 24ee86810..cd38ff69a 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -10179,6 +10179,10 @@ gb_internal ExprKind check_or_branch_expr(CheckerContext *c, Operand *o, Ast *no } } + if (c->in_defer) { + error(node, "'%.*s' cannot be used within a 'defer'", LIT(name)); + } + return Expr_Expr; } From 778d3b97b68fd06dc165986a79c1eba298374fdf Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 22 Jun 2026 15:40:21 +0200 Subject: [PATCH 197/228] Add comment to `odin root` about why there's no newline Add comment to `odin root` about why there's no newline, and why we closed #6834 and #6871. Future such pull requests will be closed without comment. --- src/main.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main.cpp b/src/main.cpp index 3a72c2a9c..75640809e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3842,6 +3842,10 @@ int main(int arg_count, char const **arg_ptr) { usage(args[0]); return 1; } + // NOTE(Jeroen): `odin root` omits it on purpose so that it can be used in scripts. + // e.g. `ODIN_CORE="$(odin root)core"`. + // Human convenience is not a consideration. + // Further pull requests to a newline will be closed without comment. gb_printf("%.*s", LIT(odin_root_dir())); return 0; } else if (command == "clear-cache") { From 8148b04a6cc12d0b0bfffcdabce4f03962662535 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 22 Jun 2026 15:44:11 +0200 Subject: [PATCH 198/228] Add missing word. --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 75640809e..6932d029f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3845,7 +3845,7 @@ int main(int arg_count, char const **arg_ptr) { // NOTE(Jeroen): `odin root` omits it on purpose so that it can be used in scripts. // e.g. `ODIN_CORE="$(odin root)core"`. // Human convenience is not a consideration. - // Further pull requests to a newline will be closed without comment. + // Further pull requests to add a newline will be closed without comment. gb_printf("%.*s", LIT(odin_root_dir())); return 0; } else if (command == "clear-cache") { From 6bae6eb3f1f8f2b62f1e763814888657ac25d2f2 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 22 Jun 2026 15:46:02 +0200 Subject: [PATCH 199/228] Clarify "it" --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 6932d029f..51dade656 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3842,7 +3842,7 @@ int main(int arg_count, char const **arg_ptr) { usage(args[0]); return 1; } - // NOTE(Jeroen): `odin root` omits it on purpose so that it can be used in scripts. + // NOTE(Jeroen): `odin root` omits a newline on purpose so that it can be used in scripts. // e.g. `ODIN_CORE="$(odin root)core"`. // Human convenience is not a consideration. // Further pull requests to add a newline will be closed without comment. From d16a37e649a332ddd980effc332b2da3f4a15275 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 22 Jun 2026 15:41:43 +0100 Subject: [PATCH 200/228] Add warning to help very large return values (partially fixes #6568) --- src/checker.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/checker.cpp b/src/checker.cpp index 2f66d3e60..0624c65ac 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -791,7 +791,10 @@ gb_internal void check_scope_usage_internal(Checker *c, Scope *scope, u64 vet_fl array_add(&vetted_entities, ve_unused); } else if (is_shadowed) { array_add(&vetted_entities, ve_shadowed); - } else if (e->kind == Entity_Variable && (e->flags & (EntityFlag_Param|EntityFlag_Using|EntityFlag_Static|EntityFlag_Field)) == 0 && !e->Variable.is_global) { + } else if (e->kind == Entity_Variable && + ((e->flags & (EntityFlag_Param|EntityFlag_Using|EntityFlag_Static|EntityFlag_Field)) == 0 || + (e->flags & EntityFlag_Result) != 0) && + !e->Variable.is_global) { i64 sz = type_size_of(e->type); // TODO(bill): When is a good size warn? // Is >256 KiB good enough? From 13832011fae05adc437022e7152f4a5658b56c3a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 22 Jun 2026 16:12:44 +0100 Subject: [PATCH 201/228] Add `core:time/tzdata` to `examples/all` --- examples/all/all_main.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/all/all_main.odin b/examples/all/all_main.odin index b8655a89e..bb647932b 100644 --- a/examples/all/all_main.odin +++ b/examples/all/all_main.odin @@ -157,6 +157,7 @@ package all @(require) import "core:time" @(require) import "core:time/datetime" @(require) import "core:time/timezone" +@(require) import "core:time/tzdata" @(require) import "core:flags" @(require) import "core:sys/orca" From 8afac0f32f3024ae0c19026a86fd60d465e149ae Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 22 Jun 2026 16:15:26 +0100 Subject: [PATCH 202/228] Ignore the previous commit :D --- examples/all/all_main.odin | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/all/all_main.odin b/examples/all/all_main.odin index bb647932b..b8655a89e 100644 --- a/examples/all/all_main.odin +++ b/examples/all/all_main.odin @@ -157,7 +157,6 @@ package all @(require) import "core:time" @(require) import "core:time/datetime" @(require) import "core:time/timezone" -@(require) import "core:time/tzdata" @(require) import "core:flags" @(require) import "core:sys/orca" From 7bbfc50430e4d8220e8594f1000c1cb5498e717f Mon Sep 17 00:00:00 2001 From: bennyyip Date: Tue, 23 Jun 2026 09:36:27 +0800 Subject: [PATCH 203/228] core:text/regex: improve compiler performance --- core/text/regex/compiler/compiler.odin | 99 +++++++++---------- .../virtual_machine/virtual_machine.odin | 29 ++++++ 2 files changed, 74 insertions(+), 54 deletions(-) diff --git a/core/text/regex/compiler/compiler.odin b/core/text/regex/compiler/compiler.odin index dbfe3fe1c..404660e57 100644 --- a/core/text/regex/compiler/compiler.odin +++ b/core/text/regex/compiler/compiler.odin @@ -43,9 +43,16 @@ Node_Match_All_And_Escape :: parser.Node_Match_All_And_Escape Opcode :: virtual_machine.Opcode Program :: [dynamic]Opcode -JUMP_SIZE :: size_of(Opcode) + 1 * size_of(u16) -SPLIT_SIZE :: size_of(Opcode) + 2 * size_of(u16) +Jump :: virtual_machine.Jump +Split :: virtual_machine.Split +Wait_For_Byte :: virtual_machine.Wait_For_Byte +Wait_For_Rune :: virtual_machine.Wait_For_Rune +Wait_For_Rune_Class :: virtual_machine.Wait_For_Rune_Class +Wait_For_Rune_Class_Negated :: virtual_machine.Wait_For_Rune_Class_Negated +Save :: virtual_machine.Save +JUMP_SIZE :: size_of(Jump) +SPLIT_SIZE :: size_of(Split) Compiler :: struct { flags: common.Flags, @@ -141,15 +148,13 @@ map_all_classes :: proc(tree: Node, collection: ^[dynamic]Rune_Class_Data) { append_raw :: #force_inline proc(code: ^Program, data: $T) { // NOTE: This is system-dependent endian. - for b in transmute([size_of(T)]byte)data { - append(code, cast(Opcode)b) - } + data := transmute([size_of(T)]Opcode)data + append(code, ..data[:]) } inject_raw :: #force_inline proc(code: ^Program, start: int, data: $T) { // NOTE: This is system-dependent endian. - for b, i in transmute([size_of(T)]byte)data { - inject_at(code, start + i, cast(Opcode)b) - } + data := transmute([size_of(T)]Opcode)data + inject_at(code, start, ..data[:]) } @require_results @@ -220,8 +225,8 @@ generate_code :: proc(c: ^Compiler, node: Node) -> (code: Program) { code = generate_code(c, specific.inner) if specific.capture && .No_Capture not_in c.flags { - inject_at(&code, 0, Opcode.Save) - inject_at(&code, 1, Opcode(2 * specific.capture_id)) + save := Save{.Save, Opcode(2 * specific.capture_id)} + inject_raw(&code, 0, save) append(&code, Opcode.Save) append(&code, Opcode(2 * specific.capture_id + 1)) @@ -236,9 +241,8 @@ generate_code :: proc(c: ^Compiler, node: Node) -> (code: Program) { // Avoiding duplicate allocation by reusing `left`. code = left - inject_at(&code, 0, Opcode.Split) - inject_raw(&code, size_of(byte) , i16(SPLIT_SIZE)) - inject_raw(&code, size_of(byte) + size_of(i16), i16(SPLIT_SIZE + left_len + JUMP_SIZE)) + split := Split{.Split, i16(SPLIT_SIZE), i16(SPLIT_SIZE + left_len + JUMP_SIZE)} + inject_raw(&code, 0, split) append(&code, Opcode.Jump) append_raw(&code, i16(len(right) + JUMP_SIZE)) @@ -259,9 +263,8 @@ generate_code :: proc(c: ^Compiler, node: Node) -> (code: Program) { code = generate_code(c, specific.inner) original_len := len(code) - inject_at(&code, 0, Opcode.Split) - inject_raw(&code, size_of(byte) , i16(SPLIT_SIZE)) - inject_raw(&code, size_of(byte) + size_of(i16), i16(SPLIT_SIZE + original_len + JUMP_SIZE)) + split := Split{.Split, i16(SPLIT_SIZE), i16(SPLIT_SIZE + original_len + JUMP_SIZE)} + inject_raw(&code, 0, split) append(&code, Opcode.Jump) append_raw(&code, i16(-original_len - SPLIT_SIZE)) @@ -270,9 +273,8 @@ generate_code :: proc(c: ^Compiler, node: Node) -> (code: Program) { code = generate_code(c, specific.inner) original_len := len(code) - inject_at(&code, 0, Opcode.Split) - inject_raw(&code, size_of(byte) , i16(SPLIT_SIZE + original_len + JUMP_SIZE)) - inject_raw(&code, size_of(byte) + size_of(i16), i16(SPLIT_SIZE)) + split := Split{.Split, i16(SPLIT_SIZE + original_len + JUMP_SIZE), i16(SPLIT_SIZE)} + inject_raw(&code, 0, split) append(&code, Opcode.Jump) append_raw(&code, i16(-original_len - SPLIT_SIZE)) @@ -359,17 +361,15 @@ generate_code :: proc(c: ^Compiler, node: Node) -> (code: Program) { code = generate_code(c, specific.inner) original_len := len(code) - inject_at(&code, 0, Opcode.Split) - inject_raw(&code, size_of(byte) , i16(SPLIT_SIZE)) - inject_raw(&code, size_of(byte) + size_of(i16), i16(SPLIT_SIZE + original_len)) + split := Split{.Split, i16(SPLIT_SIZE), i16(SPLIT_SIZE + original_len)} + inject_raw(&code, 0, split) case ^Node_Optional_Non_Greedy: code = generate_code(c, specific.inner) original_len := len(code) - inject_at(&code, 0, Opcode.Split) - inject_raw(&code, size_of(byte) , i16(SPLIT_SIZE + original_len)) - inject_raw(&code, size_of(byte) + size_of(i16), i16(SPLIT_SIZE)) + split := Split{.Split, i16(SPLIT_SIZE + original_len), i16(SPLIT_SIZE)} + inject_raw(&code, 0, split) case ^Node_Match_All_And_Escape: append(&code, Opcode.Match_All_And_Escape) @@ -412,32 +412,28 @@ compile :: proc(tree: Node, flags: common.Flags) -> (code: Program, class_data: seek_loop: for opcode, pc in virtual_machine.iterate_opcodes(&iter) { #partial switch opcode { case .Byte: - inject_at(&code, pc_open, Opcode.Wait_For_Byte) - pc_open += size_of(Opcode) - inject_at(&code, pc_open, Opcode(code[pc + size_of(Opcode) + pc_open])) - pc_open += size_of(u8) + wait := Wait_For_Byte{.Wait_For_Byte, code[pc + size_of(Opcode) + pc_open]} + inject_raw(&code, pc_open, wait) + pc_open += size_of(Wait_For_Byte) break optimize_opening case .Rune: operand := intrinsics.unaligned_load(cast(^rune)&code[pc+1]) - inject_at(&code, pc_open, Opcode.Wait_For_Rune) - pc_open += size_of(Opcode) - inject_raw(&code, pc_open, operand) - pc_open += size_of(rune) + wait := Wait_For_Rune{.Wait_For_Rune, operand} + inject_raw(&code, pc_open, wait) + pc_open += size_of(Wait_For_Rune) break optimize_opening case .Rune_Class: - inject_at(&code, pc_open, Opcode.Wait_For_Rune_Class) - pc_open += size_of(Opcode) - inject_at(&code, pc_open, Opcode(code[pc + size_of(Opcode) + pc_open])) - pc_open += size_of(u8) + wait := Wait_For_Rune_Class{.Wait_For_Rune_Class, code[pc + size_of(Opcode) + pc_open]} + inject_raw(&code, pc_open, wait) + pc_open += size_of(Wait_For_Rune_Class) break optimize_opening case .Rune_Class_Negated: - inject_at(&code, pc_open, Opcode.Wait_For_Rune_Class_Negated) - pc_open += size_of(Opcode) - inject_at(&code, pc_open, Opcode(code[pc + size_of(Opcode) + pc_open])) - pc_open += size_of(u8) + wait := Wait_For_Rune_Class_Negated{.Wait_For_Rune_Class_Negated, code[pc + size_of(Opcode) + pc_open]} + inject_raw(&code, pc_open, wait) + pc_open += size_of(Wait_For_Rune_Class_Negated) break optimize_opening case .Save: @@ -452,27 +448,22 @@ compile :: proc(tree: Node, flags: common.Flags) -> (code: Program, class_data: } // `.*?` - inject_at(&code, pc_open, Opcode.Split) - pc_open += size_of(byte) - inject_raw(&code, pc_open, i16(SPLIT_SIZE + size_of(byte) + JUMP_SIZE)) - pc_open += size_of(i16) - inject_raw(&code, pc_open, i16(SPLIT_SIZE)) - pc_open += size_of(i16) + split := Split{.Split, i16(SPLIT_SIZE + size_of(byte) + JUMP_SIZE), i16(SPLIT_SIZE)} + inject_raw(&code, pc_open, split) + pc_open += size_of(Split) inject_at(&code, pc_open, Opcode.Wildcard) pc_open += size_of(byte) - inject_at(&code, pc_open, Opcode.Jump) - pc_open += size_of(byte) - inject_raw(&code, pc_open, i16(-size_of(byte) - SPLIT_SIZE)) - pc_open += size_of(i16) - + jump := Jump{.Jump, i16(-size_of(byte) - SPLIT_SIZE)} + inject_raw(&code, pc_open, jump) + pc_open += size_of(Jump) } if .No_Capture not_in flags { // `(` - inject_at(&code, pc_open, Opcode.Save) - inject_at(&code, pc_open + size_of(byte), Opcode(0x00)) + save := Save{.Save, Opcode(0x00)} + inject_raw(&code, pc_open, save) // `)` append(&code, Opcode.Save); append(&code, Opcode(0x01)) diff --git a/core/text/regex/virtual_machine/virtual_machine.odin b/core/text/regex/virtual_machine/virtual_machine.odin index ab2e9515c..5b503290a 100644 --- a/core/text/regex/virtual_machine/virtual_machine.odin +++ b/core/text/regex/virtual_machine/virtual_machine.odin @@ -49,6 +49,35 @@ Opcode :: enum u8 { Wait_For_Rune_Class_Negated = 0x14, // | u8 Match_All_And_Escape = 0x15, // | } +Jump :: struct #packed { + opcode: Opcode, + target: i16, +} +Split :: struct #packed { + opcode: Opcode, + left: i16, + right: i16, +} +Wait_For_Byte :: struct #packed { + opcode: Opcode, + operand: Opcode, +} +Wait_For_Rune :: struct #packed { + opcode: Opcode, + operand: rune, +} +Wait_For_Rune_Class :: struct #packed { + opcode: Opcode, + operand: Opcode, +} +Wait_For_Rune_Class_Negated :: struct #packed { + opcode: Opcode, + operand: Opcode, +} +Save :: struct #packed { + opcode: Opcode, + operand: Opcode, +} Thread :: struct { pc: int, From 003c05dbb4227c3c97ba0a7c32a5195982f05e7e Mon Sep 17 00:00:00 2001 From: 0cch0 <89780085+0cch0@users.noreply.github.com> Date: Tue, 23 Jun 2026 15:39:22 +0700 Subject: [PATCH 204/228] Update Xlib documentation link to current PDF --- vendor/x11/xlib/xlib.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/x11/xlib/xlib.odin b/vendor/x11/xlib/xlib.odin index a2d51c401..c4071055a 100644 --- a/vendor/x11/xlib/xlib.odin +++ b/vendor/x11/xlib/xlib.odin @@ -1,4 +1,4 @@ -// Bindings for [[ X11's Xlib (PDF) ; https://www.x.org/docs/X11/xlib.pdf ]]. +// Bindings for [[ X11's Xlib (PDF) ; https://xorg.freedesktop.org/archive/current/doc/libX11/libX11/libX11.pdf ]]. package xlib // Value, specifying whether `vendor:x11/xlib` is available on the current platform. From 38fa18023d9f4aba682aaac4ef1e3359dcc2ed17 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 23 Jun 2026 11:39:19 +0100 Subject: [PATCH 205/228] Use `intrinsics.count_leading_zeros` internally for `math.next_power_of_two` --- core/math/math.odin | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/core/math/math.odin b/core/math/math.odin index 1ecb1da00..6fe872907 100644 --- a/core/math/math.odin +++ b/core/math/math.odin @@ -1613,17 +1613,11 @@ is_power_of_two :: proc "contextless" (x: int) -> bool { @(require_results) next_power_of_two :: proc "contextless" (x: int) -> int { - k := x -1 - when size_of(int) == 8 { - k = k | (k >> 32) + if x <= 1 { + return 1 } - k = k | (k >> 16) - k = k | (k >> 8) - k = k | (k >> 4) - k = k | (k >> 2) - k = k | (k >> 1) - k += 1 + int(x <= 0) - return k + n := uint(size_of(x) * 8) - uint(intrinsics.count_leading_zeros(uint(x) - 1)) + return int(1) << n } @(require_results) From a20363c2bff5a097d0b7adeb2ea8e04774749609 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 23 Jun 2026 11:46:37 +0100 Subject: [PATCH 206/228] Add `windows.GetConsoleScreenBufferInfoEx` --- core/sys/windows/kernel32.odin | 23 ++++++++++++----------- core/sys/windows/types.odin | 15 +++++++++++++-- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/core/sys/windows/kernel32.odin b/core/sys/windows/kernel32.odin index 24205c53c..9b08d7ba6 100644 --- a/core/sys/windows/kernel32.odin +++ b/core/sys/windows/kernel32.odin @@ -571,17 +571,18 @@ foreign kernel32 { DisconnectNamedPipe :: proc(hNamedPipe: HANDLE) -> BOOL --- WaitNamedPipeW :: proc(lpNamedPipeName: LPCWSTR, nTimeOut: DWORD) -> BOOL --- - AllocConsole :: proc() -> BOOL --- - AttachConsole :: proc(dwProcessId: DWORD) -> BOOL --- - SetConsoleCtrlHandler :: proc(HandlerRoutine: PHANDLER_ROUTINE, Add: BOOL) -> BOOL --- - GenerateConsoleCtrlEvent :: proc(dwCtrlEvent: DWORD, dwProcessGroupId: DWORD) -> BOOL --- - FreeConsole :: proc() -> BOOL --- - GetConsoleWindow :: proc() -> HWND --- - GetConsoleScreenBufferInfo :: proc(hConsoleOutput: HANDLE, lpConsoleScreenBufferInfo: PCONSOLE_SCREEN_BUFFER_INFO) -> BOOL --- - SetConsoleScreenBufferSize :: proc(hConsoleOutput: HANDLE, dwSize: COORD) -> BOOL --- - SetConsoleWindowInfo :: proc(hConsoleOutput: HANDLE, bAbsolute: BOOL, lpConsoleWindow: ^SMALL_RECT) -> BOOL --- - GetConsoleCursorInfo :: proc(hConsoleOutput: HANDLE, lpConsoleCursorInfo: PCONSOLE_CURSOR_INFO) -> BOOL --- - SetConsoleCursorInfo :: proc(hConsoleOutput: HANDLE, lpConsoleCursorInfo: PCONSOLE_CURSOR_INFO) -> BOOL --- + AllocConsole :: proc() -> BOOL --- + AttachConsole :: proc(dwProcessId: DWORD) -> BOOL --- + SetConsoleCtrlHandler :: proc(HandlerRoutine: PHANDLER_ROUTINE, Add: BOOL) -> BOOL --- + GenerateConsoleCtrlEvent :: proc(dwCtrlEvent: DWORD, dwProcessGroupId: DWORD) -> BOOL --- + FreeConsole :: proc() -> BOOL --- + GetConsoleWindow :: proc() -> HWND --- + GetConsoleScreenBufferInfo :: proc(hConsoleOutput: HANDLE, lpConsoleScreenBufferInfo: PCONSOLE_SCREEN_BUFFER_INFO) -> BOOL --- + GetConsoleScreenBufferInfoEx :: proc(hConsoleOutput: HANDLE, lpConsoleScreenBufferInfoEx: PCONSOLE_SCREEN_BUFFER_INFOEX) -> BOOL --- + SetConsoleScreenBufferSize :: proc(hConsoleOutput: HANDLE, dwSize: COORD) -> BOOL --- + SetConsoleWindowInfo :: proc(hConsoleOutput: HANDLE, bAbsolute: BOOL, lpConsoleWindow: ^SMALL_RECT) -> BOOL --- + GetConsoleCursorInfo :: proc(hConsoleOutput: HANDLE, lpConsoleCursorInfo: PCONSOLE_CURSOR_INFO) -> BOOL --- + SetConsoleCursorInfo :: proc(hConsoleOutput: HANDLE, lpConsoleCursorInfo: PCONSOLE_CURSOR_INFO) -> BOOL --- GetDiskFreeSpaceExW :: proc( lpDirectoryName: LPCWSTR, diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin index ab707e43a..0f80e0b18 100644 --- a/core/sys/windows/types.odin +++ b/core/sys/windows/types.odin @@ -3411,9 +3411,21 @@ CONSOLE_READCONSOLE_CONTROL :: struct { dwCtrlWakeupMask: ULONG, dwControlKeyState: ULONG, } - PCONSOLE_READCONSOLE_CONTROL :: ^CONSOLE_READCONSOLE_CONTROL +CONSOLE_SCREEN_BUFFER_INFOEX :: struct { + cbSize: ULONG, + dwSize: COORD, + dwCursorPosition: COORD, + wAttributes: WORD, + srWindow: SMALL_RECT, + dwMaximumWindowSize: COORD, + wPopupAttributes: WORD, + bFullscreenSupported: BOOL, + ColorTable: [16]COLORREF, +} +PCONSOLE_SCREEN_BUFFER_INFOEX :: ^CONSOLE_SCREEN_BUFFER_INFOEX + BY_HANDLE_FILE_INFORMATION :: struct { dwFileAttributes: DWORD, ftCreationTime: FILETIME, @@ -3426,7 +3438,6 @@ BY_HANDLE_FILE_INFORMATION :: struct { nFileIndexHigh: DWORD, nFileIndexLow: DWORD, } - LPBY_HANDLE_FILE_INFORMATION :: ^BY_HANDLE_FILE_INFORMATION FILE_STANDARD_INFO :: struct { From 5ba39f42eac2823b6902ce85ab19b457fe6f03cd Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 23 Jun 2026 11:49:00 +0100 Subject: [PATCH 207/228] Improve error message on calls with varying argument count --- src/check_expr.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index cd38ff69a..dd5e99128 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -6595,11 +6595,16 @@ gb_internal CallArgumentError check_call_arguments_internal(CheckerContext *c, A positional_operand_count = gb_min(positional_operands.count, pt->variadic_index); } else if (positional_operand_count > pt->param_count) { err = CallArgumentError_TooManyArguments; - char const *err_fmt = "Too many arguments for '%s', expected %td arguments, got %td"; if (show_error) { gbString proc_str = expr_to_string(ce->proc); defer (gb_string_free(proc_str)); - error(call, err_fmt, proc_str, param_count_excluding_defaults, positional_operands.count); + if (param_count_excluding_defaults != pt->param_count) { + char const *err_fmt = "Too many arguments for '%s', expected %td..=%td arguments, got %td"; + error(call, err_fmt, proc_str, param_count_excluding_defaults, pt->param_count, positional_operands.count); + } else { + char const *err_fmt = "Too many arguments for '%s', expected %td arguments, got %td"; + error(call, err_fmt, proc_str, pt->param_count, positional_operands.count); + } } return err; } From e3729aefc31d4faa07fdebe86109aa826c3b7739 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 23 Jun 2026 11:50:33 +0100 Subject: [PATCH 208/228] Add Maybe to SDL3 RenderGeometry --- vendor/sdl3/sdl3_render.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vendor/sdl3/sdl3_render.odin b/vendor/sdl3/sdl3_render.odin index fd5b0705e..816fcb558 100644 --- a/vendor/sdl3/sdl3_render.odin +++ b/vendor/sdl3/sdl3_render.odin @@ -240,8 +240,8 @@ foreign lib { RenderTextureTiled :: proc(renderer: ^Renderer, texture: ^Texture, srcrect: Maybe(^FRect), scale: f32, dstrect: Maybe(^FRect)) -> bool --- RenderTexture9Grid :: proc(renderer: ^Renderer, texture: ^Texture, srcrect: Maybe(^FRect), left_width, right_width, top_height, bottom_height: f32, scale: f32, dstrect: Maybe(^FRect)) -> bool --- RenderTexture9GridTiled :: proc(renderer: ^Renderer, texture: ^Texture, srcrect: Maybe(^FRect), left_width, right_width, top_height, bottom_height: f32, scale: f32, dstrect: Maybe(^FRect), tileScale: f32) -> bool --- - RenderGeometry :: proc(renderer: ^Renderer, texture: ^Texture, vertices: [^]Vertex, num_vertices: c.int, indices: [^]c.int, num_indices: c.int) -> bool --- - RenderGeometryRaw :: proc(renderer: ^Renderer, texture: ^Texture, xy: [^]f32, xy_stride: c.int, color: [^]FColor, color_stride: c.int, uv: [^]f32, uv_stride: c.int, num_vertices: c.int, indices: rawptr, num_indices: c.int, size_indices: c.int) -> bool --- + RenderGeometry :: proc(renderer: ^Renderer, texture: Maybe(^Texture), vertices: [^]Vertex, num_vertices: c.int, indices: [^]c.int, num_indices: c.int) -> bool --- + RenderGeometryRaw :: proc(renderer: ^Renderer, texture: Maybe(^Texture), xy: [^]f32, xy_stride: c.int, color: [^]FColor, color_stride: c.int, uv: [^]f32, uv_stride: c.int, num_vertices: c.int, indices: rawptr, num_indices: c.int, size_indices: c.int) -> bool --- SetRenderTextureAddressMode :: proc(renderer: ^Renderer, u_mode, v_mode: TextureAddressMode) -> bool --- GetRenderTextureAddressMode :: proc(renderer: ^Renderer, u_mode, v_mode: ^TextureAddressMode) -> bool --- RenderPresent :: proc(renderer: ^Renderer) -> bool --- From 8f835987501fca55dd466280ace7c7352bea983d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 23 Jun 2026 12:03:36 +0100 Subject: [PATCH 209/228] Correct numerous issues with SDL3 and add missing procedures --- vendor/sdl3/sdl3_audio.odin | 18 ++++++------- vendor/sdl3/sdl3_hints.odin | 4 +++ vendor/sdl3/sdl3_main.odin | 2 +- vendor/sdl3/sdl3_mutex.odin | 27 +++++++++++++++++++ vendor/sdl3/sdl3_pixels.odin | 50 ++++++++++++++++++------------------ vendor/sdl3/sdl3_rect.odin | 25 +++++++++++++----- vendor/sdl3/sdl3_render.odin | 2 +- vendor/sdl3/sdl3_system.odin | 9 +++++-- vendor/sdl3/sdl3_video.odin | 5 +++- 9 files changed, 97 insertions(+), 45 deletions(-) diff --git a/vendor/sdl3/sdl3_audio.odin b/vendor/sdl3/sdl3_audio.odin index 277aefde7..72afd8c98 100644 --- a/vendor/sdl3/sdl3_audio.odin +++ b/vendor/sdl3/sdl3_audio.odin @@ -38,14 +38,14 @@ AudioFormat :: enum c.int { F32 = F32LE when BYTEORDER == LIL_ENDIAN else F32BE, } -@(require_results) AUDIO_BITSIZE :: proc "c" (x: AudioFormat) -> Uint16 { return (Uint16(x) & AUDIO_MASK_BITSIZE) } -@(require_results) AUDIO_BYTESIZE :: proc "c" (x: AudioFormat) -> Uint16 { return AUDIO_BITSIZE(x) / 8 } -@(require_results) AUDIO_ISFLOAT :: proc "c" (x: AudioFormat) -> bool { return (Uint16(x) & AUDIO_MASK_FLOAT) != 0 } -@(require_results) AUDIO_ISBIGENDIAN :: proc "c" (x: AudioFormat) -> bool { return (Uint16(x) & AUDIO_MASK_BIG_ENDIAN) != 0 } -@(require_results) AUDIO_ISLITTLEENDIAN :: proc "c" (x: AudioFormat) -> bool { return !AUDIO_ISBIGENDIAN(x) } -@(require_results) AUDIO_ISSIGNED :: proc "c" (x: AudioFormat) -> bool { return (Uint16(x) & AUDIO_MASK_SIGNED) != 0 } -@(require_results) AUDIO_ISINT :: proc "c" (x: AudioFormat) -> bool { return !AUDIO_ISFLOAT(x) } -@(require_results) AUDIO_ISUNSIGNED :: proc "c" (x: AudioFormat) -> bool { return !AUDIO_ISSIGNED(x) } +@(require_results) AUDIO_BITSIZE :: #force_inline proc "c" (x: AudioFormat) -> Uint16 { return (Uint16(x) & AUDIO_MASK_BITSIZE) } +@(require_results) AUDIO_BYTESIZE :: #force_inline proc "c" (x: AudioFormat) -> Uint16 { return AUDIO_BITSIZE(x) / 8 } +@(require_results) AUDIO_ISFLOAT :: #force_inline proc "c" (x: AudioFormat) -> bool { return (Uint16(x) & AUDIO_MASK_FLOAT) != 0 } +@(require_results) AUDIO_ISBIGENDIAN :: #force_inline proc "c" (x: AudioFormat) -> bool { return (Uint16(x) & AUDIO_MASK_BIG_ENDIAN) != 0 } +@(require_results) AUDIO_ISLITTLEENDIAN :: #force_inline proc "c" (x: AudioFormat) -> bool { return !AUDIO_ISBIGENDIAN(x) } +@(require_results) AUDIO_ISSIGNED :: #force_inline proc "c" (x: AudioFormat) -> bool { return (Uint16(x) & AUDIO_MASK_SIGNED) != 0 } +@(require_results) AUDIO_ISINT :: #force_inline proc "c" (x: AudioFormat) -> bool { return !AUDIO_ISFLOAT(x) } +@(require_results) AUDIO_ISUNSIGNED :: #force_inline proc "c" (x: AudioFormat) -> bool { return !AUDIO_ISSIGNED(x) } AudioDeviceID :: distinct Uint32 @@ -60,7 +60,7 @@ AudioSpec :: struct { } @(require_results) -AUDIO_FRAMESIZE :: proc "c" (x: AudioSpec) -> c.int { +AUDIO_FRAMESIZE :: #force_inline proc "c" (x: AudioSpec) -> c.int { return c.int(AUDIO_BYTESIZE(x.format)) * x.channels } diff --git a/vendor/sdl3/sdl3_hints.odin b/vendor/sdl3/sdl3_hints.odin index ba7e55d3d..64fe486a1 100644 --- a/vendor/sdl3/sdl3_hints.odin +++ b/vendor/sdl3/sdl3_hints.odin @@ -20,6 +20,7 @@ HINT_AUDIO_DEVICE_APP_ICON_NAME :: "SDL_AUDIO_DEVICE_APP_ICON_NAME" HINT_AUDIO_DEVICE_SAMPLE_FRAMES :: "SDL_AUDIO_DEVICE_SAMPLE_FRAMES" HINT_AUDIO_DEVICE_STREAM_NAME :: "SDL_AUDIO_DEVICE_STREAM_NAME" HINT_AUDIO_DEVICE_STREAM_ROLE :: "SDL_AUDIO_DEVICE_STREAM_ROLE" +HINT_AUDIO_DEVICE_RAW_STREAM :: "SDL_AUDIO_DEVICE_RAW_STREAM" HINT_AUDIO_DISK_INPUT_FILE :: "SDL_AUDIO_DISK_INPUT_FILE" HINT_AUDIO_DISK_OUTPUT_FILE :: "SDL_AUDIO_DISK_OUTPUT_FILE" HINT_AUDIO_DISK_TIMESCALE :: "SDL_AUDIO_DISK_TIMESCALE" @@ -36,6 +37,7 @@ HINT_CPU_FEATURE_MASK :: "SDL_CPU_FEATURE_MASK" HINT_JOYSTICK_DIRECTINPUT :: "SDL_JOYSTICK_DIRECTINPUT" HINT_FILE_DIALOG_DRIVER :: "SDL_FILE_DIALOG_DRIVER" HINT_DISPLAY_USABLE_BOUNDS :: "SDL_DISPLAY_USABLE_BOUNDS" +HINT_INVALID_PARAM_CHECKS :: "SDL_INVALID_PARAM_CHECKS" HINT_EMSCRIPTEN_ASYNCIFY :: "SDL_EMSCRIPTEN_ASYNCIFY" HINT_EMSCRIPTEN_CANVAS_SELECTOR :: "SDL_EMSCRIPTEN_CANVAS_SELECTOR" HINT_EMSCRIPTEN_KEYBOARD_ELEMENT :: "SDL_EMSCRIPTEN_KEYBOARD_ELEMENT" @@ -56,6 +58,7 @@ HINT_GDK_TEXTINPUT_MAX_LENGTH :: "SDL_GDK_TEXTINPUT_MAX_LENGTH" HINT_GDK_TEXTINPUT_SCOPE :: "SDL_GDK_TEXTINPUT_SCOPE" HINT_GDK_TEXTINPUT_TITLE :: "SDL_GDK_TEXTINPUT_TITLE" HINT_HIDAPI_LIBUSB :: "SDL_HIDAPI_LIBUSB" +HINT_HIDAPI_LIBUSB_GAMECUBE :: "SDL_HIDAPI_LIBUSB_GAMECUBE" HINT_HIDAPI_LIBUSB_WHITELIST :: "SDL_HIDAPI_LIBUSB_WHITELIST" HINT_HIDAPI_UDEV :: "SDL_HIDAPI_UDEV" HINT_GPU_DRIVER :: "SDL_GPU_DRIVER" @@ -247,6 +250,7 @@ HINT_WINDOWS_ENABLE_MENU_MNEMONICS :: "SDL_WINDOWS_ENABLE_MENU_MNEMONI HINT_WINDOWS_ENABLE_MESSAGELOOP :: "SDL_WINDOWS_ENABLE_MESSAGELOOP" HINT_WINDOWS_GAMEINPUT :: "SDL_WINDOWS_GAMEINPUT" HINT_WINDOWS_RAW_KEYBOARD :: "SDL_WINDOWS_RAW_KEYBOARD" +HINT_WINDOWS_RAW_KEYBOARD_EXCLUDE_HOTKEYS :: "SDL_WINDOWS_RAW_KEYBOARD_EXCLUDE_HOTKEYS" HINT_WINDOWS_FORCE_SEMAPHORE_KERNEL :: "SDL_WINDOWS_FORCE_SEMAPHORE_KERNEL" HINT_WINDOWS_INTRESOURCE_ICON :: "SDL_WINDOWS_INTRESOURCE_ICON" HINT_WINDOWS_INTRESOURCE_ICON_SMALL :: "SDL_WINDOWS_INTRESOURCE_ICON_SMALL" diff --git a/vendor/sdl3/sdl3_main.odin b/vendor/sdl3/sdl3_main.odin index 103372bed..8c737b5b8 100644 --- a/vendor/sdl3/sdl3_main.odin +++ b/vendor/sdl3/sdl3_main.odin @@ -3,7 +3,7 @@ package sdl3 import "core:c" -main_func :: #type proc(argc: c.int, argv: [^]cstring) +main_func :: #type proc "c" (argc: c.int, argv: [^]cstring) -> c.int @(default_calling_convention="c", link_prefix="SDL_") foreign lib { diff --git a/vendor/sdl3/sdl3_mutex.odin b/vendor/sdl3/sdl3_mutex.odin index 8067473f3..7d48c0b5d 100644 --- a/vendor/sdl3/sdl3_mutex.odin +++ b/vendor/sdl3/sdl3_mutex.odin @@ -1,8 +1,24 @@ package sdl3 +import "core:c" + Mutex :: struct {} RWLock :: struct {} Semaphore :: struct {} +Condition :: struct {} + +InitStatus :: enum c.int { + UNINITIALIZED, + INITIALIZING, + INITIALIZED, + UNINITIALIZING, +} + +InitState :: struct { + status: AtomicInt, + thread: ThreadID, + reserved: rawptr, +} @(default_calling_convention="c", link_prefix="SDL_", require_results) foreign lib { @@ -27,4 +43,15 @@ foreign lib { TryWaitSemaphore :: proc(sem: ^Semaphore) -> bool --- WaitSemaphore :: proc(sem: ^Semaphore) --- WaitSemaphoreTimeout :: proc(sem: ^Semaphore, timeout_ms: Sint32) --- + + CreateCondition :: proc() -> ^Condition --- + DestroyCondition :: proc(cond: ^Condition) --- + SignalCondition :: proc(cond: ^Condition) --- + BroadcastCondition :: proc(cond: ^Condition) --- + WaitCondition :: proc(cond: ^Condition, mutex: ^Mutex) --- + WaitConditionTimeout :: proc(cond: ^Condition, mutex: ^Mutex, timeout_ms: Sint32) -> bool --- + + ShouldInit :: proc(state: ^InitState) -> bool --- + ShouldQuit :: proc(state: ^InitState) -> bool --- + SetInitialized :: proc(state: ^InitState, initialized: bool) --- } diff --git a/vendor/sdl3/sdl3_pixels.odin b/vendor/sdl3/sdl3_pixels.odin index e3a1c1537..af6541757 100644 --- a/vendor/sdl3/sdl3_pixels.odin +++ b/vendor/sdl3/sdl3_pixels.odin @@ -75,20 +75,20 @@ DEFINE_PIXELFORMAT :: #force_inline proc "c" (type: PixelType, order: PackedOrde return PixelFormat(((1 << 28) | (Uint32(type) << 24) | (Uint32(order) << 20) | (Uint32(layout) << 16) | (Uint32(bits) << 8) | (Uint32(bytes) << 0))) } -@(require_results) PIXELFLAG :: proc "c" (format: PixelFormat) -> Uint32 { return ((Uint32(format) >> 28) & 0x0F) } -@(require_results) PIXELTYPE :: proc "c" (format: PixelFormat) -> PixelType { return PixelType((Uint32(format) >> 24) & 0x0F) } -@(require_results) PIXELORDER :: proc "c" (format: PixelFormat) -> PackedOrder { return PackedOrder((Uint32(format) >> 20) & 0x0F) } -@(require_results) PIXELLAYOUT :: proc "c" (format: PixelFormat) -> PackedLayout { return PackedLayout((Uint32(format) >> 16) & 0x0F) } -@(require_results) PIXELARRAYORDER :: proc "c" (format: PixelFormat) -> ArrayOrder { return ArrayOrder((Uint32(format) >> 20) & 0x0F) } +@(require_results) PIXELFLAG :: #force_inline proc "c" (format: PixelFormat) -> Uint32 { return ((Uint32(format) >> 28) & 0x0F) } +@(require_results) PIXELTYPE :: #force_inline proc "c" (format: PixelFormat) -> PixelType { return PixelType((Uint32(format) >> 24) & 0x0F) } +@(require_results) PIXELORDER :: #force_inline proc "c" (format: PixelFormat) -> PackedOrder { return PackedOrder((Uint32(format) >> 20) & 0x0F) } +@(require_results) PIXELLAYOUT :: #force_inline proc "c" (format: PixelFormat) -> PackedLayout { return PackedLayout((Uint32(format) >> 16) & 0x0F) } +@(require_results) PIXELARRAYORDER :: #force_inline proc "c" (format: PixelFormat) -> ArrayOrder { return ArrayOrder((Uint32(format) >> 20) & 0x0F) } @(require_results) -BITSPERPIXEL :: proc "c" (format: PixelFormat) -> Uint32 { +BITSPERPIXEL :: #force_inline proc "c" (format: PixelFormat) -> Uint32 { return ISPIXELFORMAT_FOURCC(format) ? 0 : ((Uint32(format) >> 8) & 0xFF) } @(require_results) -ISPIXELFORMAT_INDEXED :: proc "c" (format: PixelFormat) -> bool { +ISPIXELFORMAT_INDEXED :: #force_inline proc "c" (format: PixelFormat) -> bool { return (!ISPIXELFORMAT_FOURCC(format) && ((PIXELTYPE(format) == .INDEX1) || (PIXELTYPE(format) == .INDEX2) || @@ -98,7 +98,7 @@ ISPIXELFORMAT_INDEXED :: proc "c" (format: PixelFormat) -> bool { @(require_results) -ISPIXELFORMAT_PACKED :: proc "c" (format: PixelFormat) -> bool { +ISPIXELFORMAT_PACKED :: #force_inline proc "c" (format: PixelFormat) -> bool { return (!ISPIXELFORMAT_FOURCC(format) && ((PIXELTYPE(format) == .PACKED8) || (PIXELTYPE(format) == .PACKED16) || @@ -106,7 +106,7 @@ ISPIXELFORMAT_PACKED :: proc "c" (format: PixelFormat) -> bool { } @(require_results) -ISPIXELFORMAT_ARRAY :: proc "c" (format: PixelFormat) -> bool { +ISPIXELFORMAT_ARRAY :: #force_inline proc "c" (format: PixelFormat) -> bool { return (!ISPIXELFORMAT_FOURCC(format) && ((PIXELTYPE(format) == .ARRAYU8) || (PIXELTYPE(format) == .ARRAYU16) || @@ -116,21 +116,21 @@ ISPIXELFORMAT_ARRAY :: proc "c" (format: PixelFormat) -> bool { } @(require_results) -ISPIXELFORMAT_10BIT :: proc "c" (format: PixelFormat) -> bool { +ISPIXELFORMAT_10BIT :: #force_inline proc "c" (format: PixelFormat) -> bool { return (!ISPIXELFORMAT_FOURCC(format) && ((PIXELTYPE(format) == .PACKED32) && (PIXELLAYOUT(format) == .LAYOUT_2101010))) } @(require_results) -ISPIXELFORMAT_FLOAT :: proc "c" (format: PixelFormat) -> bool { +ISPIXELFORMAT_FLOAT :: #force_inline proc "c" (format: PixelFormat) -> bool { return (!ISPIXELFORMAT_FOURCC(format) && ((PIXELTYPE(format) == .ARRAYF16) || (PIXELTYPE(format) == .ARRAYF32))) } @(require_results) -ISPIXELFORMAT_ALPHA :: proc "c" (format: PixelFormat) -> bool { +ISPIXELFORMAT_ALPHA :: #force_inline proc "c" (format: PixelFormat) -> bool { return ((ISPIXELFORMAT_PACKED(format) && ((PIXELORDER(format) == .ARGB) || (PIXELORDER(format) == .RGBA) || @@ -144,7 +144,7 @@ ISPIXELFORMAT_ALPHA :: proc "c" (format: PixelFormat) -> bool { } @(require_results) -ISPIXELFORMAT_FOURCC :: proc "c" (format: PixelFormat) -> bool { +ISPIXELFORMAT_FOURCC :: #force_inline proc "c" (format: PixelFormat) -> bool { return format != nil && PIXELFLAG(format) != 1 } @@ -369,63 +369,63 @@ ChromaLocation :: enum c.int { @(require_results) -DEFINE_COLORSPACE :: proc "c" (type: ColorType, range: ColorRange, primaries: ColorPrimaries, transfer: TransferCharacteristics, matrix_: MatrixCoefficients, chroma: ChromaLocation) -> Colorspace { +DEFINE_COLORSPACE :: #force_inline proc "c" (type: ColorType, range: ColorRange, primaries: ColorPrimaries, transfer: TransferCharacteristics, matrix_: MatrixCoefficients, chroma: ChromaLocation) -> Colorspace { return Colorspace((Uint32(type) << 28) | (Uint32(range) << 24) | (Uint32(chroma) << 20) | (Uint32(primaries) << 10) | (Uint32(transfer) << 5) | (Uint32(matrix_) << 0)) } @(require_results) -COLORSPACETYPE :: proc "c" (cspace: Colorspace) -> ColorType { +COLORSPACETYPE :: #force_inline proc "c" (cspace: Colorspace) -> ColorType { return ColorType((Uint32(cspace) >> 28) & 0x0F) } @(require_results) -COLORSPACERANGE :: proc "c" (cspace: Colorspace) -> ColorRange { +COLORSPACERANGE :: #force_inline proc "c" (cspace: Colorspace) -> ColorRange { return ColorRange((Uint32(cspace) >> 24) & 0x0F) } @(require_results) -COLORSPACECHROMA :: proc "c" (cspace: Colorspace) -> ChromaLocation { +COLORSPACECHROMA :: #force_inline proc "c" (cspace: Colorspace) -> ChromaLocation { return ChromaLocation((Uint32(cspace) >> 20) & 0x0F) } @(require_results) -COLORSPACEPRIMARIES :: proc "c" (cspace: Colorspace) -> ColorPrimaries { +COLORSPACEPRIMARIES :: #force_inline proc "c" (cspace: Colorspace) -> ColorPrimaries { return ColorPrimaries((Uint32(cspace) >> 10) & 0x1F) } @(require_results) -COLORSPACETRANSFER :: proc "c" (cspace: Colorspace) -> TransferCharacteristics { +COLORSPACETRANSFER :: #force_inline proc "c" (cspace: Colorspace) -> TransferCharacteristics { return TransferCharacteristics((Uint32(cspace) >> 5) & 0x1F) } @(require_results) -COLORSPACEMATRIX :: proc "c" (cspace: Colorspace) -> MatrixCoefficients { +COLORSPACEMATRIX :: #force_inline proc "c" (cspace: Colorspace) -> MatrixCoefficients { return MatrixCoefficients(Uint32(cspace) & 0x1F) } @(require_results) -ISCOLORSPACE_MATRIX_BT601 :: proc "c" (cspace: Colorspace) -> bool { +ISCOLORSPACE_MATRIX_BT601 :: #force_inline proc "c" (cspace: Colorspace) -> bool { return COLORSPACEMATRIX(cspace) == .BT601 || COLORSPACEMATRIX(cspace) == .BT470BG } @(require_results) -ISCOLORSPACE_MATRIX_BT709 :: proc "c" (cspace: Colorspace) -> bool { +ISCOLORSPACE_MATRIX_BT709 :: #force_inline proc "c" (cspace: Colorspace) -> bool { return COLORSPACEMATRIX(cspace) == .BT709 } @(require_results) -ISCOLORSPACE_MATRIX_BT2020_NCL :: proc "c" (cspace: Colorspace) -> bool { +ISCOLORSPACE_MATRIX_BT2020_NCL :: #force_inline proc "c" (cspace: Colorspace) -> bool { return COLORSPACEMATRIX(cspace) == .BT2020_NCL } @(require_results) -ISCOLORSPACE_LIMITED_RANGE :: proc "c" (cspace: Colorspace) -> bool { +ISCOLORSPACE_LIMITED_RANGE :: #force_inline proc "c" (cspace: Colorspace) -> bool { return COLORSPACERANGE(cspace) != .FULL } @(require_results) -ISCOLORSPACE_FULL_RANGE :: proc "c" (cspace: Colorspace) -> bool { +ISCOLORSPACE_FULL_RANGE :: #force_inline proc "c" (cspace: Colorspace) -> bool { return COLORSPACERANGE(cspace) == .FULL } diff --git a/vendor/sdl3/sdl3_rect.odin b/vendor/sdl3/sdl3_rect.odin index 6af9dc937..be082119e 100644 --- a/vendor/sdl3/sdl3_rect.odin +++ b/vendor/sdl3/sdl3_rect.odin @@ -24,38 +24,51 @@ RectToFRect :: #force_inline proc "c" (rect: Rect, frect: ^FRect) { @(require_results) -PointInRect :: proc "c" (p: Point, r: Rect) -> bool { +PointInRect :: #force_inline proc "c" (p: Point, r: Rect) -> bool { return ( (p.x >= r.x) && (p.x < (r.x + r.w)) && (p.y >= r.y) && (p.y < (r.y + r.h)) ) } @(require_results) -PointInRectFloat :: proc "c" (p: FPoint, r: FRect) -> bool { +PointInRectFloat :: #force_inline proc "c" (p: FPoint, r: FRect) -> bool { return ( (p.x >= r.x) && (p.x <= (r.x + r.w)) && (p.y >= r.y) && (p.y <= (r.y + r.h)) ) } @(require_results) -RectEmpty :: proc "c" (r: Rect) -> bool { +RectEmpty :: #force_inline proc "c" (r: Rect) -> bool { return r.w <= 0 || r.h <= 0 } @(require_results) -RectEqual :: proc "c" (a, b: Rect) -> bool { +RectEqual :: #force_inline proc "c" (a, b: Rect) -> bool { return a == b } +@(require_results) +RectsEqualEpsilon :: #force_inline proc "c" (a, b: FRect, epsilon: f32) -> bool { + return abs(a.x - b.x) <= epsilon && + abs(a.y - b.y) <= epsilon && + abs(a.w - b.w) <= epsilon && + abs(a.h - b.h) <= epsilon +} + +@(require_results) +RectsEqualFloat :: #force_inline proc "c" (a, b: FRect) -> bool { + return RectsEqualEpsilon(a, b, FLT_EPSILON) +} + @(default_calling_convention="c", link_prefix="SDL_", require_results) foreign lib { HasRectIntersection :: proc(#by_ptr A, B: Rect) -> bool --- GetRectIntersection :: proc(#by_ptr A, B: Rect, result: ^Rect) -> bool --- GetRectUnion :: proc(#by_ptr A, B: Rect, result: ^Rect) -> bool --- - GetRectEnclosingPoints :: proc(points: [^]Point, count: c.int, #by_ptr clip: Rect, result: ^Rect) -> bool --- + GetRectEnclosingPoints :: proc(points: [^]Point, count: c.int, clip: Maybe(^Rect), result: ^Rect) -> bool --- GetRectAndLineIntersection :: proc(#by_ptr rect: Rect, X1, Y1, X2, Y2: ^c.int) -> bool --- HasRectIntersectionFloat :: proc(#by_ptr A, B: FRect) -> bool --- GetRectIntersectionFloat :: proc(#by_ptr A, B: FRect, result: ^FRect) -> bool --- GetRectUnionFloat :: proc(#by_ptr A, B: FRect, result: ^FRect) -> bool --- - GetRectEnclosingPointsFloat :: proc(points: [^]FPoint, count: c.int, #by_ptr clip: FRect, result: ^FRect) -> bool --- + GetRectEnclosingPointsFloat :: proc(points: [^]FPoint, count: c.int, clip: Maybe(^FRect), result: ^FRect) -> bool --- GetRectAndLineIntersectionFloat :: proc(#by_ptr rect: FRect, X1, Y1, X2, Y2: ^f32) -> bool --- } \ No newline at end of file diff --git a/vendor/sdl3/sdl3_render.odin b/vendor/sdl3/sdl3_render.odin index 816fcb558..160f8fa69 100644 --- a/vendor/sdl3/sdl3_render.odin +++ b/vendor/sdl3/sdl3_render.odin @@ -276,5 +276,5 @@ foreign lib { CreateGPURenderState :: proc(renderer: ^Renderer, #by_ptr createinfo: GPURenderStateCreateInfo) -> ^GPURenderState --- SetGPURenderStateFragmentUniforms :: proc(state: ^GPURenderState, slot_index: Uint32, data: rawptr, length: Uint32) -> bool --- SetGPURenderState :: proc(renderer: ^Renderer, state: ^GPURenderState) -> bool --- - DestroyGPURenderState :: proc(renderer: ^Renderer) --- + DestroyGPURenderState :: proc(renderer: ^GPURenderer) --- } diff --git a/vendor/sdl3/sdl3_system.odin b/vendor/sdl3/sdl3_system.odin index 44c026e82..63b0637d7 100644 --- a/vendor/sdl3/sdl3_system.odin +++ b/vendor/sdl3/sdl3_system.odin @@ -6,7 +6,7 @@ import "core:c" import win32 "core:sys/windows" -WindowsMessageHook :: #type proc(userdata: rawptr, msg: ^win32.MSG) -> bool +WindowsMessageHook :: #type proc "c" (userdata: rawptr, msg: ^win32.MSG) -> bool @(default_calling_convention="c", link_prefix="SDL_") foreign lib { @@ -46,6 +46,11 @@ foreign lib { RequestAndroidPermissionCallback :: #type proc "c" (userdata: rawptr, permission: cstring, granted: bool) +AndroidExternalStorageFlags :: distinct bit_set[AndroidExternalStorageFlag; Uint32] +AndroidExternalStorageFlag :: enum Uint32 { + Read, + Write, +} @(default_calling_convention="c", link_prefix="SDL_", require_results) foreign lib { @@ -56,7 +61,7 @@ foreign lib { IsDeXMode :: proc() -> bool --- SendAndroidBackButton :: proc() --- GetAndroidInternalStoragePath :: proc() -> cstring --- - GetAndroidExternalStorageState :: proc() -> Uint32 --- + GetAndroidExternalStorageState :: proc() -> AndroidExternalStorageFlags --- GetAndroidExternalStoragePath :: proc() -> cstring --- GetAndroidCachePath :: proc() -> cstring --- RequestAndroidPermission :: proc(permission: cstring, cb: RequestAndroidPermissionCallback, userdata: rawptr) -> bool --- diff --git a/vendor/sdl3/sdl3_video.odin b/vendor/sdl3/sdl3_video.odin index e4547d991..3ddcfedc6 100644 --- a/vendor/sdl3/sdl3_video.odin +++ b/vendor/sdl3/sdl3_video.odin @@ -151,7 +151,7 @@ EGLSurface :: distinct rawptr EGLAttrib :: distinct uintptr EGLint :: distinct c.int -EGLAttribArrayCallback :: #type proc "c" (userdata: rawptr) -> ^EGLint +EGLAttribArrayCallback :: #type proc "c" (userdata: rawptr) -> [^]EGLint EGLIntArrayCallback :: #type proc "c" (userdata: rawptr, display: EGLDisplay, config: EGLConfig) -> [^]EGLint GLAttr :: enum c.int { @@ -256,9 +256,12 @@ GL_CONTEXT_RESET_LOSE_CONTEXT :: GLContextResetNotification{.LOSE_CONTEXT} PROP_DISPLAY_HDR_ENABLED_BOOLEAN :: "SDL.display.HDR_enabled" PROP_DISPLAY_KMSDRM_PANEL_ORIENTATION_NUMBER :: "SDL.display.KMSDRM.panel_orientation" +PROP_DISPLAY_WAYLAND_WL_OUTPUT_POINTER :: "SDL.display.wayland.wl_output" +PROP_DISPLAY_WINDOWS_HMONITOR_POINTER :: "SDL.display.windows.hmonitor" PROP_WINDOW_CREATE_ALWAYS_ON_TOP_BOOLEAN :: "SDL.window.create.always_on_top" PROP_WINDOW_CREATE_BORDERLESS_BOOLEAN :: "SDL.window.create.borderless" +PROP_WINDOW_CREATE_CONSTRAIN_POPUP_BOOLEAN :: "SDL.window.create.constrain_popup" PROP_WINDOW_CREATE_FOCUSABLE_BOOLEAN :: "SDL.window.create.focusable" PROP_WINDOW_CREATE_EXTERNAL_GRAPHICS_CONTEXT_BOOLEAN :: "SDL.window.create.external_graphics_context" PROP_WINDOW_CREATE_FLAGS_NUMBER :: "SDL.window.create.flags" From a95d45e913bb8df6771d6b8fa945c7efe4cd8e37 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 23 Jun 2026 12:09:36 +0100 Subject: [PATCH 210/228] Fix typo --- vendor/sdl3/sdl3_render.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/sdl3/sdl3_render.odin b/vendor/sdl3/sdl3_render.odin index 160f8fa69..759683dfe 100644 --- a/vendor/sdl3/sdl3_render.odin +++ b/vendor/sdl3/sdl3_render.odin @@ -276,5 +276,5 @@ foreign lib { CreateGPURenderState :: proc(renderer: ^Renderer, #by_ptr createinfo: GPURenderStateCreateInfo) -> ^GPURenderState --- SetGPURenderStateFragmentUniforms :: proc(state: ^GPURenderState, slot_index: Uint32, data: rawptr, length: Uint32) -> bool --- SetGPURenderState :: proc(renderer: ^Renderer, state: ^GPURenderState) -> bool --- - DestroyGPURenderState :: proc(renderer: ^GPURenderer) --- + DestroyGPURenderState :: proc(renderer: ^GPURenderState) --- } From e30da0beb3f570c31d7b08e570f4cdf926a2d412 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 23 Jun 2026 12:10:26 +0100 Subject: [PATCH 211/228] Remove old `dynamic_pool_` aliases --- core/mem/allocators.odin | 30 ++++++++---------------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index 68b6102b6..7257f3894 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -1621,20 +1621,6 @@ small_stack_allocator_proc :: proc( return nil, nil } - -/* Preserved for compatibility */ -Dynamic_Pool :: Dynamic_Arena -DYNAMIC_POOL_BLOCK_SIZE_DEFAULT :: DYNAMIC_ARENA_BLOCK_SIZE_DEFAULT -DYNAMIC_POOL_OUT_OF_BAND_SIZE_DEFAULT :: DYNAMIC_ARENA_OUT_OF_BAND_SIZE_DEFAULT -dynamic_pool_allocator_proc :: dynamic_arena_allocator_proc -dynamic_pool_free_all :: dynamic_arena_free_all -dynamic_pool_reset :: dynamic_arena_reset -dynamic_pool_alloc_bytes :: dynamic_arena_alloc_bytes -dynamic_pool_alloc :: dynamic_arena_alloc -dynamic_pool_init :: dynamic_arena_init -dynamic_pool_allocator :: dynamic_arena_allocator -dynamic_pool_destroy :: dynamic_arena_destroy - /* Default block size for dynamic arena. */ @@ -1671,20 +1657,20 @@ arrays of blocks and out-band blocks. The blocks have the default size of will be aligned to a boundary specified by `alignment`. */ dynamic_arena_init :: proc( - pool: ^Dynamic_Arena, + arena: ^Dynamic_Arena, block_allocator := context.allocator, array_allocator := context.allocator, block_size := DYNAMIC_ARENA_BLOCK_SIZE_DEFAULT, out_band_size := DYNAMIC_ARENA_OUT_OF_BAND_SIZE_DEFAULT, alignment := DEFAULT_ALIGNMENT, ) { - pool.block_size = block_size - pool.out_band_size = out_band_size - pool.alignment = alignment - pool.block_allocator = block_allocator - pool.out_band_allocations.allocator = array_allocator - pool.unused_blocks.allocator = array_allocator - pool.used_blocks.allocator = array_allocator + arena.block_size = block_size + arena.out_band_size = out_band_size + arena.alignment = alignment + arena.block_allocator = block_allocator + arena.out_band_allocations.allocator = array_allocator + arena.unused_blocks.allocator = array_allocator + arena.used_blocks.allocator = array_allocator } /* From 1b75c44508220a1dbb065d23b436ce21d6e7e6fe Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 23 Jun 2026 12:18:15 +0100 Subject: [PATCH 212/228] Change `mem.Dynamic_Arena`'s `alignment` to be `minimum_alignment` --- core/mem/allocators.odin | 74 ++++++++++--------- ..._pool.odin => test_mem_dynamic_arena.odin} | 21 +++--- 2 files changed, 50 insertions(+), 45 deletions(-) rename tests/core/mem/{test_mem_dynamic_pool.odin => test_mem_dynamic_arena.odin} (87%) diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index 7257f3894..40c320115 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -1637,7 +1637,7 @@ Dynamic arena allocator data. Dynamic_Arena :: struct { block_size: int, out_band_size: int, - alignment: int, + minimum_alignment: int, unused_blocks: [dynamic]rawptr, used_blocks: [dynamic]rawptr, out_band_allocations: [dynamic]rawptr, @@ -1654,19 +1654,19 @@ This procedure initializes a dynamic arena. The specified `block_allocator` will be used to allocate arena blocks, and `array_allocator` to allocate arrays of blocks and out-band blocks. The blocks have the default size of `block_size` and out-band threshold will be `out_band_size`. All allocations -will be aligned to a boundary specified by `alignment`. +will be aligned at a minimum to a boundary specified by `minimum_alignment`. */ dynamic_arena_init :: proc( arena: ^Dynamic_Arena, - block_allocator := context.allocator, - array_allocator := context.allocator, - block_size := DYNAMIC_ARENA_BLOCK_SIZE_DEFAULT, - out_band_size := DYNAMIC_ARENA_OUT_OF_BAND_SIZE_DEFAULT, - alignment := DEFAULT_ALIGNMENT, + block_allocator := context.allocator, + array_allocator := context.allocator, + block_size := DYNAMIC_ARENA_BLOCK_SIZE_DEFAULT, + out_band_size := DYNAMIC_ARENA_OUT_OF_BAND_SIZE_DEFAULT, + minimum_alignment := DEFAULT_ALIGNMENT, ) { arena.block_size = block_size arena.out_band_size = out_band_size - arena.alignment = alignment + arena.minimum_alignment = minimum_alignment arena.block_allocator = block_allocator arena.out_band_allocations.allocator = array_allocator arena.unused_blocks.allocator = array_allocator @@ -1714,7 +1714,7 @@ dynamic_arena_destroy :: proc(a: ^Dynamic_Arena) { } @(private="file") -_dynamic_arena_cycle_new_block :: proc(a: ^Dynamic_Arena, loc := #caller_location) -> (err: Allocator_Error) { +_dynamic_arena_cycle_new_block :: proc(a: ^Dynamic_Arena, alignment: int, loc := #caller_location) -> (err: Allocator_Error) { if a.block_allocator.procedure == nil { panic("You must call `dynamic_arena_init` on a Dynamic Arena before using it.", loc) } @@ -1730,7 +1730,7 @@ _dynamic_arena_cycle_new_block :: proc(a: ^Dynamic_Arena, loc := #caller_locatio a.block_allocator.data, Allocator_Mode.Alloc, a.block_size, - a.alignment, + max(a.minimum_alignment, alignment), nil, 0, ) @@ -1752,8 +1752,8 @@ zero-initialized. This procedure returns a pointer to the newly allocated memory region. */ @(require_results) -dynamic_arena_alloc :: proc(a: ^Dynamic_Arena, size: int, loc := #caller_location) -> (rawptr, Allocator_Error) { - data, err := dynamic_arena_alloc_bytes(a, size, loc) +dynamic_arena_alloc :: proc(a: ^Dynamic_Arena, size: int, alignment: int = DEFAULT_ALIGNMENT, loc := #caller_location) -> (rawptr, Allocator_Error) { + data, err := dynamic_arena_alloc_bytes(a, size, alignment, loc) return raw_data(data), err } @@ -1766,8 +1766,8 @@ zero-initialized. This procedure returns a slice of the newly allocated memory region. */ @(require_results) -dynamic_arena_alloc_bytes :: proc(a: ^Dynamic_Arena, size: int, loc := #caller_location) -> ([]byte, Allocator_Error) { - bytes, err := dynamic_arena_alloc_bytes_non_zeroed(a, size, loc) +dynamic_arena_alloc_bytes :: proc(a: ^Dynamic_Arena, size: int, alignment: int = DEFAULT_ALIGNMENT, loc := #caller_location) -> ([]byte, Allocator_Error) { + bytes, err := dynamic_arena_alloc_bytes_non_zeroed(a, size, alignment, loc) if bytes != nil { zero_slice(bytes) } @@ -1783,8 +1783,8 @@ zero-initialized. This procedure returns a pointer to the newly allocated memory region. */ @(require_results) -dynamic_arena_alloc_non_zeroed :: proc(a: ^Dynamic_Arena, size: int, loc := #caller_location) -> (rawptr, Allocator_Error) { - data, err := dynamic_arena_alloc_bytes_non_zeroed(a, size, loc) +dynamic_arena_alloc_non_zeroed :: proc(a: ^Dynamic_Arena, size: int, alignment: int = DEFAULT_ALIGNMENT, loc := #caller_location) -> (rawptr, Allocator_Error) { + data, err := dynamic_arena_alloc_bytes_non_zeroed(a, size, alignment, loc) return raw_data(data), err } @@ -1797,21 +1797,21 @@ zero-initialized. This procedure returns a slice of the newly allocated memory region. */ @(require_results) -dynamic_arena_alloc_bytes_non_zeroed :: proc(a: ^Dynamic_Arena, size: int, loc := #caller_location) -> ([]byte, Allocator_Error) { +dynamic_arena_alloc_bytes_non_zeroed :: proc(a: ^Dynamic_Arena, size: int, alignment: int = DEFAULT_ALIGNMENT, loc := #caller_location) -> ([]byte, Allocator_Error) { if size >= a.out_band_size { assert(a.out_band_allocations.allocator.procedure != nil, "Backing array allocator must be initialized", loc=loc) - memory, err := alloc_bytes_non_zeroed(size, a.alignment, a.out_band_allocations.allocator, loc) + memory, err := alloc_bytes_non_zeroed(size, alignment, a.out_band_allocations.allocator, loc) if memory != nil { append(&a.out_band_allocations, raw_data(memory), loc = loc) } return memory, err } - n := align_formula(size, a.alignment) + n := align_formula(size, max(a.minimum_alignment, alignment)) if n > a.block_size { return nil, .Invalid_Argument } if a.bytes_left < n { - err := _dynamic_arena_cycle_new_block(a, loc) + err := _dynamic_arena_cycle_new_block(a, alignment, loc) if err != nil { return nil, err } @@ -1886,9 +1886,10 @@ dynamic_arena_resize :: proc( old_memory: rawptr, old_size: int, size: int, + alignment: int = DEFAULT_ALIGNMENT, loc := #caller_location, ) -> (rawptr, Allocator_Error) { - bytes, err := dynamic_arena_resize_bytes(a, byte_slice(old_memory, old_size), size, loc) + bytes, err := dynamic_arena_resize_bytes(a, byte_slice(old_memory, old_size), size, alignment, loc) return raw_data(bytes), err } @@ -1907,16 +1908,17 @@ This procedure returns the slice of the resized memory region. */ @(require_results) dynamic_arena_resize_bytes :: proc( - a: ^Dynamic_Arena, - old_data: []byte, - size: int, + a: ^Dynamic_Arena, + old_data: []byte, + size: int, + alignment: int = DEFAULT_ALIGNMENT, loc := #caller_location, ) -> ([]byte, Allocator_Error) { if size == 0 { // NOTE: This allocator has no Free mode. return nil, nil } - bytes, err := dynamic_arena_resize_bytes_non_zeroed(a, old_data, size, loc) + bytes, err := dynamic_arena_resize_bytes_non_zeroed(a, old_data, size, alignment, loc) if bytes != nil { if old_data == nil { zero_slice(bytes) @@ -1946,9 +1948,10 @@ dynamic_arena_resize_non_zeroed :: proc( old_memory: rawptr, old_size: int, size: int, + alignment: int = DEFAULT_ALIGNMENT, loc := #caller_location, ) -> (rawptr, Allocator_Error) { - bytes, err := dynamic_arena_resize_bytes_non_zeroed(a, byte_slice(old_memory, old_size), size, loc) + bytes, err := dynamic_arena_resize_bytes_non_zeroed(a, byte_slice(old_memory, old_size), size, alignment, loc) return raw_data(bytes), err } @@ -1967,9 +1970,10 @@ This procedure returns the slice of the resized memory region. */ @(require_results) dynamic_arena_resize_bytes_non_zeroed :: proc( - a: ^Dynamic_Arena, - old_data: []byte, - size: int, + a: ^Dynamic_Arena, + old_data: []byte, + size: int, + alignment: int = DEFAULT_ALIGNMENT, loc := #caller_location, ) -> ([]byte, Allocator_Error) { if size == 0 { @@ -1984,7 +1988,7 @@ dynamic_arena_resize_bytes_non_zeroed :: proc( } // No information is kept about allocations in this allocator, thus we // cannot truly resize anything and must reallocate. - data, err := dynamic_arena_alloc_bytes_non_zeroed(a, size, loc) + data, err := dynamic_arena_alloc_bytes_non_zeroed(a, size, alignment, loc) if err == nil { runtime.copy(data, byte_slice(old_memory, old_size)) } @@ -2003,17 +2007,17 @@ dynamic_arena_allocator_proc :: proc( arena := (^Dynamic_Arena)(allocator_data) switch mode { case .Alloc: - return dynamic_arena_alloc_bytes(arena, size, loc) + return dynamic_arena_alloc_bytes(arena, size, alignment, loc) case .Alloc_Non_Zeroed: - return dynamic_arena_alloc_bytes_non_zeroed(arena, size, loc) + return dynamic_arena_alloc_bytes_non_zeroed(arena, size, alignment, loc) case .Free: return nil, .Mode_Not_Implemented case .Free_All: dynamic_arena_free_all(arena, loc) case .Resize: - return dynamic_arena_resize_bytes(arena, byte_slice(old_memory, old_size), size, loc) + return dynamic_arena_resize_bytes(arena, byte_slice(old_memory, old_size), size, alignment, loc) case .Resize_Non_Zeroed: - return dynamic_arena_resize_bytes_non_zeroed(arena, byte_slice(old_memory, old_size), size, loc) + return dynamic_arena_resize_bytes_non_zeroed(arena, byte_slice(old_memory, old_size), size, alignment, loc) case .Query_Features: set := (^Allocator_Mode_Set)(old_memory) if set != nil { @@ -2024,7 +2028,7 @@ dynamic_arena_allocator_proc :: proc( info := (^Allocator_Query_Info)(old_memory) if info != nil && info.pointer != nil { info.size = arena.block_size - info.alignment = arena.alignment + info.alignment = arena.minimum_alignment return byte_slice(info, size_of(info^)), nil } return nil, nil diff --git a/tests/core/mem/test_mem_dynamic_pool.odin b/tests/core/mem/test_mem_dynamic_arena.odin similarity index 87% rename from tests/core/mem/test_mem_dynamic_pool.odin rename to tests/core/mem/test_mem_dynamic_arena.odin index 82cee89af..20853c9cf 100644 --- a/tests/core/mem/test_mem_dynamic_pool.odin +++ b/tests/core/mem/test_mem_dynamic_arena.odin @@ -6,7 +6,7 @@ import "core:mem" expect_pool_allocation :: proc(t: ^testing.T, expected_used_bytes, num_bytes, alignment: int) { pool: mem.Dynamic_Pool - mem.dynamic_pool_init(&pool, alignment = alignment) + mem.dynamic_pool_init(&pool, minimum_alignment = alignment) pool_allocator := mem.dynamic_pool_allocator(&pool) element, err := mem.alloc(num_bytes, alignment, pool_allocator) @@ -18,20 +18,20 @@ expect_pool_allocation :: proc(t: ^testing.T, expected_used_bytes, num_bytes, al ` Allocated data with size %v bytes, expected %v bytes left, got %v bytes left, off by %v bytes. Pool: - block_size = %v - out_band_size = %v - alignment = %v - unused_blocks = %v - used_blocks = %v + block_size = %v + out_band_size = %v + minimum_alignment = %v + unused_blocks = %v + used_blocks = %v out_band_allocations = %v - current_block = %v - current_pos = %v - bytes_left = %v + current_block = %v + current_pos = %v + bytes_left = %v `, num_bytes, expected_bytes_left, pool.bytes_left, expected_bytes_left - pool.bytes_left, pool.block_size, pool.out_band_size, - pool.alignment, + pool.minimum_alignment, pool.unused_blocks, pool.used_blocks, pool.out_band_allocations, @@ -39,6 +39,7 @@ expect_pool_allocation :: proc(t: ^testing.T, expected_used_bytes, num_bytes, al pool.current_pos, pool.bytes_left, ) + testing.expectf(t, uintptr(element) % uint(alignment) == 0, "Expected allocation to be aligned to %d byte boundary, got %v", alignment, element) mem.dynamic_pool_destroy(&pool) testing.expect(t, pool.used_blocks == nil) From 7d36866fe9b4a03ead7383de4ee8b95e61fdfaa2 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 23 Jun 2026 12:21:29 +0100 Subject: [PATCH 213/228] `pool` -> `arena` --- tests/core/mem/test_mem_dynamic_arena.odin | 74 +++++++++++----------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/tests/core/mem/test_mem_dynamic_arena.odin b/tests/core/mem/test_mem_dynamic_arena.odin index 20853c9cf..b3cfc48f8 100644 --- a/tests/core/mem/test_mem_dynamic_arena.odin +++ b/tests/core/mem/test_mem_dynamic_arena.odin @@ -4,17 +4,17 @@ import "core:testing" import "core:mem" -expect_pool_allocation :: proc(t: ^testing.T, expected_used_bytes, num_bytes, alignment: int) { - pool: mem.Dynamic_Pool - mem.dynamic_pool_init(&pool, minimum_alignment = alignment) - pool_allocator := mem.dynamic_pool_allocator(&pool) +expect_arena_allocation :: proc(t: ^testing.T, expected_used_bytes, num_bytes, alignment: int) { + arena: mem.Dynamic_Arena + mem.dynamic_arena_init(&arena, minimum_alignment = alignment) + arena_allocator := mem.dynamic_arena_allocator(&arena) - element, err := mem.alloc(num_bytes, alignment, pool_allocator) + element, err := mem.alloc(num_bytes, alignment, arena_allocator) testing.expect(t, err == .None) testing.expect(t, element != nil) - expected_bytes_left := pool.block_size - expected_used_bytes - testing.expectf(t, pool.bytes_left == expected_bytes_left, + expected_bytes_left := arena.block_size - expected_used_bytes + testing.expectf(t, arena.bytes_left == expected_bytes_left, ` Allocated data with size %v bytes, expected %v bytes left, got %v bytes left, off by %v bytes. Pool: @@ -28,57 +28,57 @@ expect_pool_allocation :: proc(t: ^testing.T, expected_used_bytes, num_bytes, al current_pos = %v bytes_left = %v `, - num_bytes, expected_bytes_left, pool.bytes_left, expected_bytes_left - pool.bytes_left, - pool.block_size, - pool.out_band_size, - pool.minimum_alignment, - pool.unused_blocks, - pool.used_blocks, - pool.out_band_allocations, - pool.current_block, - pool.current_pos, - pool.bytes_left, + num_bytes, expected_bytes_left, arena.bytes_left, expected_bytes_left - arena.bytes_left, + arena.block_size, + arena.out_band_size, + arena.minimum_alignment, + arena.unused_blocks, + arena.used_blocks, + arena.out_band_allocations, + arena.current_block, + arena.current_pos, + arena.bytes_left, ) testing.expectf(t, uintptr(element) % uint(alignment) == 0, "Expected allocation to be aligned to %d byte boundary, got %v", alignment, element) - mem.dynamic_pool_destroy(&pool) - testing.expect(t, pool.used_blocks == nil) + mem.dynamic_arena_destroy(&arena) + testing.expect(t, arena.used_blocks == nil) } -expect_pool_allocation_out_of_band :: proc(t: ^testing.T, num_bytes, block_size, out_band_size: int) { +expect_arena_allocation_out_of_band :: proc(t: ^testing.T, num_bytes, block_size, out_band_size: int) { testing.expect(t, num_bytes >= out_band_size, "Sanity check failed, your test call is flawed! Make sure that num_bytes >= out_band_size!") - pool: mem.Dynamic_Pool - mem.dynamic_pool_init(&pool, block_size = block_size, out_band_size = out_band_size) - pool_allocator := mem.dynamic_pool_allocator(&pool) + arena: mem.Dynamic_Arena + mem.dynamic_arena_init(&arena, block_size = block_size, out_band_size = out_band_size) + arena_allocator := mem.dynamic_arena_allocator(&arena) - element, err := mem.alloc(num_bytes, allocator = pool_allocator) + element, err := mem.alloc(num_bytes, allocator = arena_allocator) testing.expect(t, err == .None) testing.expect(t, element != nil) - testing.expectf(t, pool.out_band_allocations != nil, - "Allocated data with size %v bytes, which is >= out_of_band_size and it should be in pool.out_band_allocations, but isn't!", + testing.expectf(t, arena.out_band_allocations != nil, + "Allocated data with size %v bytes, which is >= out_of_band_size and it should be in arena.out_band_allocations, but isn't!", ) - mem.dynamic_pool_destroy(&pool) - testing.expect(t, pool.out_band_allocations == nil) + mem.dynamic_arena_destroy(&arena) + testing.expect(t, arena.out_band_allocations == nil) } @(test) -test_dynamic_pool_alloc_aligned :: proc(t: ^testing.T) { - expect_pool_allocation(t, expected_used_bytes = 16, num_bytes = 16, alignment=8) +test_dynamic_arena_alloc_aligned :: proc(t: ^testing.T) { + expect_arena_allocation(t, expected_used_bytes = 16, num_bytes = 16, alignment=8) } @(test) -test_dynamic_pool_alloc_unaligned :: proc(t: ^testing.T) { - expect_pool_allocation(t, expected_used_bytes = 8, num_bytes = 1, alignment = 8) - expect_pool_allocation(t, expected_used_bytes = 16, num_bytes = 9, alignment = 8) +test_dynamic_arena_alloc_unaligned :: proc(t: ^testing.T) { + expect_arena_allocation(t, expected_used_bytes = 8, num_bytes = 1, alignment = 8) + expect_arena_allocation(t, expected_used_bytes = 16, num_bytes = 9, alignment = 8) } @(test) -test_dynamic_pool_alloc_out_of_band :: proc(t: ^testing.T) { - expect_pool_allocation_out_of_band(t, num_bytes = 128, block_size = 512, out_band_size = 128) - expect_pool_allocation_out_of_band(t, num_bytes = 129, block_size = 512, out_band_size = 128) - expect_pool_allocation_out_of_band(t, num_bytes = 513, block_size = 512, out_band_size = 128) +test_dynamic_arena_alloc_out_of_band :: proc(t: ^testing.T) { + expect_arena_allocation_out_of_band(t, num_bytes = 128, block_size = 512, out_band_size = 128) + expect_arena_allocation_out_of_band(t, num_bytes = 129, block_size = 512, out_band_size = 128) + expect_arena_allocation_out_of_band(t, num_bytes = 513, block_size = 512, out_band_size = 128) } @(test) From 28df94927985229ce81f568ba7ca99d54d881cc2 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 23 Jun 2026 12:25:36 +0100 Subject: [PATCH 214/228] Fix typo --- tests/core/mem/test_mem_dynamic_arena.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/core/mem/test_mem_dynamic_arena.odin b/tests/core/mem/test_mem_dynamic_arena.odin index b3cfc48f8..7d2b32f1a 100644 --- a/tests/core/mem/test_mem_dynamic_arena.odin +++ b/tests/core/mem/test_mem_dynamic_arena.odin @@ -39,7 +39,7 @@ expect_arena_allocation :: proc(t: ^testing.T, expected_used_bytes, num_bytes, a arena.current_pos, arena.bytes_left, ) - testing.expectf(t, uintptr(element) % uint(alignment) == 0, "Expected allocation to be aligned to %d byte boundary, got %v", alignment, element) + testing.expectf(t, uintptr(element) % uintptr(alignment) == 0, "Expected allocation to be aligned to %d byte boundary, got %v", alignment, element) mem.dynamic_arena_destroy(&arena) testing.expect(t, arena.used_blocks == nil) From a1fe7222bb036e7b53b5ea668c4220a7b6f48989 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 23 Jun 2026 12:28:27 +0100 Subject: [PATCH 215/228] Remove `using fmt` for example docs --- core/text/i18n/doc.odin | 50 +++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 27 deletions(-) diff --git a/core/text/i18n/doc.odin b/core/text/i18n/doc.odin index f316c5a6d..14a095229 100644 --- a/core/text/i18n/doc.odin +++ b/core/text/i18n/doc.odin @@ -51,8 +51,6 @@ Example: Tn :: i18n.get_n mo :: proc() { - using fmt - err: i18n.Error // Parse MO file and set it as the active translation so we can omit `get`'s "catalog" parameter. @@ -62,26 +60,24 @@ Example: if err != .None { return } // These are in the .MO catalog. - println("-----") - println(T("")) - println("-----") - println(T("There are 69,105 leaves here.")) - println("-----") - println(T("Hellope, World!")) - println("-----") + fmt.println("-----") + fmt.println(T("")) + fmt.println("-----") + fmt.println(T("There are 69,105 leaves here.")) + fmt.println("-----") + fmt.println(T("Hellope, World!")) + fmt.println("-----") // We pass 1 into `T` to get the singular format string, then 1 again into printf. - printf(Tn("There is %d leaf.\n", 1), 1) + fmt.printf(Tn("There is %d leaf.\n", 1), 1) // We pass 42 into `T` to get the plural format string, then 42 again into printf. - printf(Tn("There is %d leaf.\n", 42), 42) + fmt.printf(Tn("There is %d leaf.\n", 42), 42) // This isn't in the translation catalog, so the key is passed back untranslated. - println("-----") - println(T("Come visit us on Discord!")) + fmt.println("-----") + fmt.println(T("Come visit us on Discord!")) } qt :: proc() { - using fmt - err: i18n.Error // Parse QT file and set it as the active translation so we can omit `get`'s "catalog" parameter. @@ -91,18 +87,18 @@ Example: if err != .None { return } // These are in the .TS catalog. As you can see they have sections. - println("--- Page section ---") - println("Page:Text for translation =", T("Page", "Text for translation")) - println("-----") - println("Page:Also text to translate =", T("Page", "Also text to translate")) - println("-----") - println("--- installscript section ---") - println("installscript:99 bottles of beer on the wall =", T("installscript", "99 bottles of beer on the wall")) - println("-----") - println("--- apple_count section ---") - println("apple_count:%d apple(s) =") - println("\t 1 =", Tn("apple_count", "%d apple(s)", 1)) - println("\t 42 =", Tn("apple_count", "%d apple(s)", 42)) + fmt.println("--- Page section ---") + fmt.println("Page:Text for translation =", T("Page", "Text for translation")) + fmt.println("-----") + fmt.println("Page:Also text to translate =", T("Page", "Also text to translate")) + fmt.println("-----") + fmt.println("--- installscript section ---") + fmt.println("installscript:99 bottles of beer on the wall =", T("installscript", "99 bottles of beer on the wall")) + fmt.println("-----") + fmt.println("--- apple_count section ---") + fmt.println("apple_count:%d apple(s) =") + fmt.println("\t 1 =", Tn("apple_count", "%d apple(s)", 1)) + fmt.println("\t 42 =", Tn("apple_count", "%d apple(s)", 42)) } */ package i18n From 6698ebacb1e0ef7cfd0b1988204bb83dc1512aca Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 23 Jun 2026 12:35:58 +0100 Subject: [PATCH 216/228] Integrate docs from PR #5119 --- core/log/doc.odin | 68 +++++++ core/log/file_console_logger.odin | 78 +++++++- core/log/log.odin | 292 +++++++++++++++++++++++++++--- core/log/log_allocator.odin | 28 ++- core/log/multi_logger.odin | 25 +++ 5 files changed, 458 insertions(+), 33 deletions(-) create mode 100644 core/log/doc.odin diff --git a/core/log/doc.odin b/core/log/doc.odin new file mode 100644 index 000000000..d0e45bd93 --- /dev/null +++ b/core/log/doc.odin @@ -0,0 +1,68 @@ +/* +Implementation of logging facilities. + +Odin has builtin support for logging using procedure `context`. After a logger is created it can then be assigned to +`context.logger` and used implicitly in future log calls. + +While it is ok for simple apps to use the `core:fmt` package, libraries and complex apps should prefer the `core:log` +package. By using the implicit logger library and application authors allow the caller to decide how to process log +messages. + +When starting out you can easily just init the logger with a single line. +Example: + + package main + + import "core:log" + + main :: proc() { + context.logger = log.create_console_logger() + log.info("Hello World!") + } + +However when the application gets more involved you might want to try a more complex setup. +Example: + + package main + + import "core:log" + import "core:os" + + main :: proc() { + handle, err := os.open("logs.txt", os.O_RDWR | os.O_APPEND | os.O_CREATE, 0o666) + assert(err == nil, "Cannot open log file") + + file_logger := log.create_file_logger(handle) + // This closes the file handle + defer log.destroy_file_logger(file_logger) + + console_logger := log.create_console_logger() + defer log.destroy_console_logger(console_logger) + + multi_logger := log.create_multi_logger(console_logger, file_logger) + defer log.destroy_multi_logger(multi_logger) + + context.logger = multi_logger + + log.info("Application started!") + } + +It is also possible to create an allocator that logs all allocations. +Example: + + package main + + import "core:log" + + main :: proc() { + context.logger = log.create_console_logger() + + alloc: log.Log_Allocator + log.log_allocator_init(&alloc, .Debug) + context.allocator = log.log_allocator(&alloc) + + a := new(i32) + free(a) + } +*/ +package log \ No newline at end of file diff --git a/core/log/file_console_logger.odin b/core/log/file_console_logger.odin index 47174719f..b7220ad30 100644 --- a/core/log/file_console_logger.odin +++ b/core/log/file_console_logger.odin @@ -11,6 +11,7 @@ import "core:terminal" import "core:terminal/ansi" import "core:time" +// Strings to output when `.Level` is included in the logger options. Level_Headers := [?]string{ 0..<10 = "[DEBUG] --- ", 10..<20 = "[INFO ] --- ", @@ -19,22 +20,49 @@ Level_Headers := [?]string{ 40..<50 = "[FATAL] --- ", } +/* +The default option set for a console logger. + +It is similar to the file logger default option set, but the output includes colors. + +When you use this set of options you can expect the following output: + + [LEVEL] --- [YYYY-MM-DD HH:MM:SS] [file.odin:L:proc()] Message + +For example: + + [INFO ] --- [2025-01-02 12:34:56] [main.odin:8:main()] Hello World! +*/ Default_Console_Logger_Opts :: Options{ .Level, .Terminal_Color, .Short_File_Path, .Line, .Procedure, -} | Full_Timestamp_Opts +} + Full_Timestamp_Opts +/* +The default option set for a file logger. + +It is similar to the console logger default option set, but the output is not colored. + +When you use this set of options you can expect the following output: + + [LEVEL] --- [YYYY-MM-DD HH:MM:SS] [file.odin:L:proc()] Message + +For example: + + [INFO ] --- [2025-01-02 12:34:56] [main.odin:8:main()] Hello World! +*/ Default_File_Logger_Opts :: Options{ .Level, .Short_File_Path, .Line, .Procedure, -} | Full_Timestamp_Opts +} + Full_Timestamp_Opts +//Data backing a file or console logger. File_Console_Logger_Data :: struct { file_handle: ^os.File, ident: string, @@ -67,6 +95,21 @@ init_standard_stream_status :: proc "contextless" () { } } + +/* +Create a logger that outputs to a file. + +*Allocates Using Provided Allocator* + +When no longer needed can be destroyed with `destroy_file_logger`. + +Inputs: +- `h`: A handle to the output file +- `lowest`: Log level to use (default is `.Debug`) +- `opt`: Specifies additional data present in the log output (default is `log.Default_File_Logger_Opts`) +- `ident`: Identifier to include in the output (default is `""`) +- `allocator`: Allocator to use for data backing the logger (default is `context.allocator`) +*/ create_file_logger :: proc(f: ^os.File, lowest := Level.Debug, opt := Default_File_Logger_Opts, ident := "", allocator := context.allocator) -> Logger { data := new(File_Console_Logger_Data, allocator) data.file_handle = f @@ -74,6 +117,13 @@ create_file_logger :: proc(f: ^os.File, lowest := Level.Debug, opt := Default_Fi return Logger{file_logger_proc, data, lowest, opt} } +/* +Free the state allocated with `create_file_logger` and close the file handle. + +Inputs: +- `log`: Logger created with `create_file_logger` +- `allocator`: Allocator passed to `create_file_logger` (default is `context.allocator`) +*/ destroy_file_logger :: proc(log: Logger, allocator := context.allocator) { data := cast(^File_Console_Logger_Data)log.data if data.file_handle != nil { @@ -82,6 +132,19 @@ destroy_file_logger :: proc(log: Logger, allocator := context.allocator) { free(data, allocator) } +/* +Create a logger that outputs to the terminal. + +*Allocates Using Provided Allocator* + +When no longer needed can be destroyed with `destroy_console_logger`. + +Inputs: +- `lowest`: Log level to use (default is `.Debug`) +- `opt`: Specifies additional data present in the log output (default is `log.Default_Console_Logger_Opts`) +- `ident`: Identifier to include in the output (default is `""`) +- `allocator`: Allocator to use for data backing the logger (default is `context.allocator`) +*/ create_console_logger :: proc(lowest := Level.Debug, opt := Default_Console_Logger_Opts, ident := "", allocator := context.allocator) -> Logger { data := new(File_Console_Logger_Data, allocator) data.file_handle = nil @@ -89,6 +152,13 @@ create_console_logger :: proc(lowest := Level.Debug, opt := Default_Console_Logg return Logger{console_logger_proc, data, lowest, opt} } +/* +Free the state allocated with `create_console_logger`. + +Inputs: +- `log`: Logger created with `create_console_logger` +- `allocator`: Allocator passed to `create_console_logger` (default is `context.allocator`) +*/ destroy_console_logger :: proc(log: Logger, allocator := context.allocator) { free(log.data, allocator) } @@ -117,6 +187,7 @@ _file_console_logger_proc :: proc(h: ^os.File, ident: string, level: Level, text fmt.fprintf(h, "%s%s\n", strings.to_string(buf), text) } + file_logger_proc :: proc(logger_data: rawptr, level: Level, text: string, options: Options, location := #caller_location) { data := cast(^File_Console_Logger_Data)logger_data _file_console_logger_proc(data.file_handle, data.ident, level, text, options, location) @@ -136,6 +207,7 @@ console_logger_proc :: proc(logger_data: rawptr, level: Level, text: string, opt _file_console_logger_proc(h, data.ident, level, text, options, location) } +// Helper used to build the part of the message including the log level. do_level_header :: proc(opts: Options, str: ^strings.Builder, level: Level) { RESET :: ansi.CSI + ansi.RESET + ansi.SGR @@ -162,6 +234,7 @@ do_level_header :: proc(opts: Options, str: ^strings.Builder, level: Level) { } } +// Helper used to build the part of the message including the data and time. do_time_header :: proc(opts: Options, buf: ^strings.Builder, t: time.Time) { when time.IS_SUPPORTED { if Full_Timestamp_Opts & opts != nil { @@ -180,6 +253,7 @@ do_time_header :: proc(opts: Options, buf: ^strings.Builder, t: time.Time) { } } +// Helper used to build the part of the message including the file location. do_location_header :: proc(opts: Options, buf: ^strings.Builder, location := #caller_location) { if Location_Header_Opts & opts == nil { return diff --git a/core/log/log.odin b/core/log/log.odin index 4209a2850..ce0f49124 100644 --- a/core/log/log.odin +++ b/core/log/log.odin @@ -1,52 +1,102 @@ -// Implementations of the `context.Logger` interface. package log import "base:runtime" import "core:fmt" -// NOTE(bill, 2019-12-31): These are defined in `package runtime` as they are used in the `context`. This is to prevent an import definition cycle. +//These are defined in package `base:runtime` as they are used in the `context`. This is to prevent an import definition cycle. /* -Logger_Level :: enum { - Debug = 0, - Info = 10, - Warning = 20, - Error = 30, - Fatal = 40, -} + Logger_Level :: enum { + Debug = 0, + Info = 10, + Warning = 20, + Error = 30, + Fatal = 40, + } */ Level :: runtime.Logger_Level /* -Option :: enum { - Level, - Date, - Time, - Short_File_Path, - Long_File_Path, - Line, - Procedure, - Terminal_Color -} +Specifies additional data present in the log output. + +Defined in `package runtime` as it is used in the `context`. This is to prevent an import definition cycle. + + Option :: enum { + // The log level, e.g. "[DEBUG] ---" + Level, + // The date, e.g. [2025-01-02] + Date, + // The time, e.g. [12:34:56] + Time, + // Just the filename, e.g. [main.odin] + Short_File_Path, + // Full file path, e.g. [/tmp/project/main.odin] + Long_File_Path, + // File line of the log statement, e.g. [8] + Line, + // Calling procedure, e.g. [main()] + Procedure, + // Enables colored output + Terminal_Color + } */ Option :: runtime.Logger_Option /* -Options :: bit_set[Option]; +Specifies additional data present in the log output. + +Defined in `package runtime` as it is used in the `context`. This is to prevent an import definition cycle. + + Options :: bit_set[Option]; */ Options :: runtime.Logger_Options +/* +A preset option set for a logger. + +When you use this set of options you can expect the following output: + + [YYYY-MM-DD HH:MM:SS] Message + +For example: + + [2025-01-02 12:34:56] Hello World! +*/ Full_Timestamp_Opts :: Options{ .Date, .Time, } + +/* +A preset option set for a logger. + +When you use this set of options you can expect the following output: + + [file.odin:L:proc()] Message + +For example: + + [main.odin:8:main()] Hello World! +*/ Location_Header_Opts :: Options{ .Short_File_Path, .Long_File_Path, .Line, .Procedure, } + +/* +A preset option set for a logger. + +When you use this set of options you can expect the following output: + + [file.odin] Message + +For example: + + [main.odin] Hello World! +*/ Location_File_Opts :: Options{ .Short_File_Path, .Long_File_Path, @@ -54,67 +104,206 @@ Location_File_Opts :: Options{ /* -Logger_Proc :: #type proc(data: rawptr, level: Level, text: string, options: Options, location := #caller_location); +Implementation of the logger. + +Defined in `package runtime` as it is used in the `context`. This is to prevent an import definition cycle. + + Logger_Proc :: #type proc(data: rawptr, level: Level, text: string, options: Options, location := #caller_location); + */ Logger_Proc :: runtime.Logger_Proc /* -Logger :: struct { - procedure: Logger_Proc, - data: rawptr, - lowest_level: Level, - options: Logger_Options, -} +Data backing the logger. + +Defined in `package runtime` as it is used in the `context`. This is to prevent an import definition cycle. + + Logger :: struct { + // Implementation + procedure: Logger_Proc, + // Configuration data passed to the implementation + data: rawptr, + // Minimum level for messages passed to the implementation + lowest_level: Level, + // Additional data present in the log output + options: Logger_Options, + } */ Logger :: runtime.Logger +/* +Do nothing. + +Defined in `package runtime` as it is used in the `context`. This is to prevent an import definition cycle. +*/ nil_logger_proc :: runtime.default_logger_proc +/* +Create a logger that does nothing. + +Returns: +- A logger that does nothing +*/ nil_logger :: proc() -> Logger { return Logger{nil_logger_proc, nil, Level.Debug, nil} } + +/* +Log a formatted message at the `Debug` level. + +Inputs: +- `fmt_str`: A format string, e.g. `"a: %v, b: %v" +- `args`: Arguments for the format string +- `location`: Location of the caller (default is #caller_location) +*/ debugf :: proc(fmt_str: string, args: ..any, location := #caller_location) { logf(.Debug, fmt_str, ..args, location=location) } + +/* +Log a formatted message at the `Info` level. + +Inputs: +- `fmt_str`: A format string, e.g. `"a: %v, b: %v" +- `args`: Arguments for the format string +- `location`: Location of the caller (default is #caller_location) +*/ infof :: proc(fmt_str: string, args: ..any, location := #caller_location) { logf(.Info, fmt_str, ..args, location=location) } + +/* +Log a formatted message at the `Warn` level. + +Inputs: +- `fmt_str`: A format string, e.g. `"a: %v, b: %v" +- `args`: Arguments for the format string +- `location`: Location of the caller (default is #caller_location) +*/ warnf :: proc(fmt_str: string, args: ..any, location := #caller_location) { logf(.Warning, fmt_str, ..args, location=location) } + +/* +Log a formatted message at the `Error` level. + +Inputs: +- `fmt_str`: A format string, e.g. `"a: %v, b: %v" +- `args`: Arguments for the format string +- `location`: Location of the caller (default is #caller_location) +*/ errorf :: proc(fmt_str: string, args: ..any, location := #caller_location) { logf(.Error, fmt_str, ..args, location=location) } + +/* +Log a formatted message at the `Fatal` level. + +Inputs: +- `fmt_str`: A format string, e.g. `"a: %v, b: %v" +- `args`: Arguments for the format string +- `location`: Location of the caller (default is #caller_location) +*/ fatalf :: proc(fmt_str: string, args: ..any, location := #caller_location) { logf(.Fatal, fmt_str, ..args, location=location) } +/* +Log a message at the `Debug` level. + +Inputs: +- `args`: values to be concatenated into the output +- `sep`: separator to use when concatenating (default is `" "`) +- `location`: Location of the caller (default is #caller_location) +*/ debug :: proc(args: ..any, sep := " ", location := #caller_location) { log(.Debug, ..args, sep=sep, location=location) } + +/* +Log a message at the `Info` level. + +Inputs: +- `args`: values to be concatenated into the output +- `sep`: separator to use when concatenating (default is `" "`) +- `location`: Location of the caller (default is #caller_location) +*/ info :: proc(args: ..any, sep := " ", location := #caller_location) { log(.Info, ..args, sep=sep, location=location) } + +/* +Log a message at the `Warn` level. + +Inputs: +- `args`: values to be concatenated into the output +- `sep`: separator to use when concatenating (default is `" "`) +- `location`: Location of the caller (default is #caller_location) +*/ warn :: proc(args: ..any, sep := " ", location := #caller_location) { log(.Warning, ..args, sep=sep, location=location) } + +/* +Log a message at the `Error` level. + +Inputs: +- `args`: values to be concatenated into the output +- `sep`: separator to use when concatenating (default is `" "`) +- `location`: Location of the caller (default is #caller_location) +*/ error :: proc(args: ..any, sep := " ", location := #caller_location) { log(.Error, ..args, sep=sep, location=location) } + +/* +Log a message at the `Fatal` level. + +Inputs: +- `args`: values to be concatenated into the output +- `sep`: separator to use when concatenating (default is `" "`) +- `location`: Location of the caller (default is #caller_location) +*/ fatal :: proc(args: ..any, sep := " ", location := #caller_location) { log(.Fatal, ..args, sep=sep, location=location) } +/* +Log a message at the `Fatal` level and abort the program. + +Inputs: +- `args`: values to be concatenated into the output +- `location`: Location of the caller (default is #caller_location) +*/ panic :: proc(args: ..any, location := #caller_location) -> ! { log(.Fatal, ..args, location=location) runtime.panic("log.panic", location) } + +/* +Log a formatted message at the `Fatal` level and abort the program. + +Inputs: +- `fmt_str`: A format string, e.g. `"a: %v, b: %v" +- `args`: Arguments for the format string +- `location`: Location of the caller (default is #caller_location) +*/ panicf :: proc(fmt_str: string, args: ..any, location := #caller_location) -> ! { logf(.Fatal, fmt_str, ..args, location=location) runtime.panic("log.panicf", location) } +/* +When condition is `false` log a message at the `Fatal` level and abort the program. + +Can be disabled using `ODIN_DISABLE_ASSERT`. + +Inputs: +- `condition`: A boolean to check +- `message`: Message to log when condition is false (a default is provided) +- `loc`: Location of the caller (default is #caller_location) +*/ @(disabled=ODIN_DISABLE_ASSERT) assert :: proc(condition: bool, message := #caller_expression(condition), loc := #caller_location) { if !condition { @@ -131,6 +320,17 @@ assert :: proc(condition: bool, message := #caller_expression(condition), loc := } } +/* +When condition is `false` log a formatted message at the `Fatal` level and abort the program. + +Can be disabled using `ODIN_DISABLE_ASSERT`. + +Inputs: +- `condition`: A boolean to check +- `fmt_str`: A format string to use when condition is false, e.g. `"a: %v, b: %v" +- `args`: Arguments for the format string +- `loc`: Location of the caller (default is #caller_location) +*/ @(disabled=ODIN_DISABLE_ASSERT) assertf :: proc(condition: bool, fmt_str: string, args: ..any, loc := #caller_location) { if !condition { @@ -152,6 +352,16 @@ assertf :: proc(condition: bool, fmt_str: string, args: ..any, loc := #caller_lo } } +/* +When condition is `false` log a message at the `Fatal` level and abort the program. + +Unlike `assert` this procedure cannot be disabled with `ODIN_DISABLE_ASSERT` and will always execute. + +Inputs: +- `condition`: A boolean to check +- `message`: Message to log when condition is false (a default is provided) +- `loc`: Location of the caller (default is #caller_location) +*/ ensure :: proc(condition: bool, message := #caller_expression(condition), loc := #caller_location) { if !condition { @(cold) @@ -167,6 +377,17 @@ ensure :: proc(condition: bool, message := #caller_expression(condition), loc := } } +/* +When condition is `false` log a formatted message at the `Fatal` level and abort the program. + +Unlike `assertf` this procedure cannot be disabled with `ODIN_DISABLE_ASSERT` and will always execute. + +Inputs: +- `condition`: A boolean to check +- `fmt_str`: A format string to use when condition is false, e.g. `"a: %v, b: %v" +- `args`: Arguments for the format string +- `loc`: Location of the caller (default is #caller_location) +*/ ensuref :: proc(condition: bool, fmt_str: string, args: ..any, loc := #caller_location) { if !condition { @(cold) @@ -184,7 +405,15 @@ ensuref :: proc(condition: bool, fmt_str: string, args: ..any, loc := #caller_lo } +/* +Log a message at the desired level. +Inputs: +- `level`: The level of the message +- `args`: values to be concatenated into the output +- `sep`: separator to use when concatenating (default is `" "`) +- `location`: Location of the caller (default is #caller_location) +*/ log :: proc(level: Level, args: ..any, sep := " ", location := #caller_location) { logger := context.logger if logger.procedure == nil || logger.procedure == nil_logger_proc { @@ -198,6 +427,15 @@ log :: proc(level: Level, args: ..any, sep := " ", location := #caller_location) logger.procedure(logger.data, level, str, logger.options, location) } +/* +Log a formatted message at the desired level. + +Inputs: +- `level`: The level of the message +- `fmt_str`: A format string, e.g. `"a: %v, b: %v" +- `args`: Arguments for the format string +- `location`: Location of the caller (default is #caller_location) +*/ logf :: proc(level: Level, fmt_str: string, args: ..any, location := #caller_location) { logger := context.logger if logger.procedure == nil || logger.procedure == nil_logger_proc { diff --git a/core/log/log_allocator.odin b/core/log/log_allocator.odin index c4c54f38f..a6784133b 100644 --- a/core/log/log_allocator.odin +++ b/core/log/log_allocator.odin @@ -6,6 +6,7 @@ import "base:runtime" import "core:fmt" import "core:sync" +// Format to use when logging allocations. Log_Allocator_Format :: enum { Bytes, // Actual number of bytes. Human, // Bytes in human units like bytes, kibibytes, etc. as appropriate. @@ -15,13 +16,23 @@ Log_Allocator_Format :: enum { // Log_Allocator is an allocator which calls `context.logger` on each of its allocations operations. // The format can be changed by setting the `size_fmt: Log_Allocator_Format` field to either `Bytes` or `Human`. Log_Allocator :: struct { - allocator: runtime.Allocator, - level: Level, - prefix: string, + allocator: runtime.Allocator, // Wrapped allocator + level: Level, // Log Level used for allocations + prefix: string, // Prefix to use in log messages lock: sync.Mutex, - size_fmt: Log_Allocator_Format, + size_fmt: Log_Allocator_Format, // Format to use when logging allocations } +/* +Initialize the backing data for the allocator that logs all allocations. + +Inputs: +- `la`: Pointer to the data structure to initialize +- `level`: Log level to use for allocations +- `size_fmt`: Format to use when logging allocations (default is `.Bytes`) +- `allocator`: Wrapped allocator (default is `context.allocator`) +- `prefix`: Prefix to use in log messages (default is `""`) +*/ log_allocator_init :: proc(la: ^Log_Allocator, level: Level, size_fmt := Log_Allocator_Format.Bytes, allocator := context.allocator, prefix := "") { la.allocator = allocator @@ -31,7 +42,15 @@ log_allocator_init :: proc(la: ^Log_Allocator, level: Level, size_fmt := Log_All la.size_fmt = size_fmt } +/* +Create an allocator that logs all allocations. +Inputs: +- `la`: Pointer to the data structure backing the allocator + +Returns: +- An allocator that logs all allocations +*/ log_allocator :: proc(la: ^Log_Allocator) -> runtime.Allocator { return runtime.Allocator{ procedure = log_allocator_proc, @@ -39,6 +58,7 @@ log_allocator :: proc(la: ^Log_Allocator) -> runtime.Allocator { } } +// Backing procedure for allocator that logs all allocations. log_allocator_proc :: proc(allocator_data: rawptr, mode: runtime.Allocator_Mode, size, alignment: int, old_memory: rawptr, old_size: int, location := #caller_location) -> ([]byte, runtime.Allocator_Error) { diff --git a/core/log/multi_logger.odin b/core/log/multi_logger.odin index 6122554bb..99d7377db 100644 --- a/core/log/multi_logger.odin +++ b/core/log/multi_logger.odin @@ -1,10 +1,27 @@ package log +// A container backing for multiple loggers. Multi_Logger_Data :: struct { loggers: []Logger, } +/* +Create a logger that logs to all backing loggers. + +*Allocates Using Provided Allocator* + +When no longer needed can be destroyed with `destroy_multi_logger`. + +Note: Logs using a multi logger take both the multi logger and the backing loggers' log levels into account. + +Inputs: +- `logs` - Backing loggers passed as multiple arguments +- `allocator` - An allocator used to allocate data to store backing loggers (default is `context.allocator`) + +Returns: +- A multi logger +*/ create_multi_logger :: proc(logs: ..Logger, allocator := context.allocator) -> Logger { data := new(Multi_Logger_Data, allocator) data.loggers = make([]Logger, len(logs), allocator) @@ -12,12 +29,20 @@ create_multi_logger :: proc(logs: ..Logger, allocator := context.allocator) -> L return Logger{multi_logger_proc, data, Level.Debug, nil} } +/* +Free the state allocated with `create_multi_logger`. + +Inputs: +- `log`: Logger created with `create_multi_logger` +- `allocator`: Allocator passed to `create_multi_logger` (default is `context.allocator`) +*/ destroy_multi_logger :: proc(log: Logger, allocator := context.allocator) { data := (^Multi_Logger_Data)(log.data) delete(data.loggers, allocator) free(data, allocator) } +// Backing procedure for the multi logger. multi_logger_proc :: proc(logger_data: rawptr, level: Level, text: string, options: Options, location := #caller_location) { data := cast(^Multi_Logger_Data)logger_data From 2b684ed1ece604092d9b9e5a90074d7044b37d44 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 23 Jun 2026 12:47:38 +0100 Subject: [PATCH 217/228] Add `json.unparse` allowing for `json.Value` to `io.Writer` without the need for RTTI --- core/encoding/json/unparse.odin | 89 +++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 core/encoding/json/unparse.odin diff --git a/core/encoding/json/unparse.odin b/core/encoding/json/unparse.odin new file mode 100644 index 000000000..bff85c0da --- /dev/null +++ b/core/encoding/json/unparse.odin @@ -0,0 +1,89 @@ +package encoding_json + +import "base:runtime" +import "core:strings" +import "core:io" +import "core:slice" + +Unparse_Error :: union #shared_nil { + io.Error, + runtime.Allocator_Error, +} + +@(require_results) +unparse :: proc(v: Value, opt: Marshal_Options = {}, allocator := context.allocator, loc := #caller_location) -> (data: string, err: Unparse_Error) { + b := strings.builder_make(allocator, loc) + defer if err != nil { + strings.builder_destroy(&b) + } + + // temp guard in case we are sorting map keys, which will use temp allocations + runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD(ignore = allocator == context.temp_allocator) + + opt := opt + unparse_to_builder(&b, v, &opt) or_return + data = string(b.buf[:]) + return +} + +@(require_results) +unparse_to_builder :: proc(b: ^strings.Builder, v: Value, opt: ^Marshal_Options) -> Unparse_Error { + return unparse_to_writer(strings.to_writer(b), v, opt) +} + +@(require_results) +unparse_to_writer :: proc(w: io.Writer, value: Value, opt: ^Marshal_Options) -> Unparse_Error { + switch v in value { + case nil, Null: + io.write_string(w, "null") or_return + case Integer: + base := 16 if opt.write_uint_as_hex && (opt.spec == .JSON5 || opt.spec == .MJSON) else 10 + io.write_i64(w, v, base) or_return + case Float: + io.write_f64(w, v) or_return + case Boolean: + io.write_string(w, "true" if v else "false") or_return + case String: + io.write_quoted_string(w, v, '"', nil, true) or_return + case Array: + opt_write_start(w, opt, '[') or_return + for e, i in v { + opt_write_iteration(w, opt, i == 0) or_return + unparse_to_writer (w, e, opt) or_return + } + opt_write_end(w, opt, ']') or_return + case Object: + if !opt.sort_maps_by_key { + opt_write_start(w, opt, '{') or_return + for first_iteration := true; key, val in v { + opt_write_iteration(w, opt, first_iteration) or_return + opt_write_key (w, opt, key) or_return + unparse_to_writer (w, val, opt) or_return + first_iteration = false + } + opt_write_end(w, opt, '}') or_return + } else { + Map_Entry :: struct { + key: string, + value: Value, + } + + entries := make([dynamic]Map_Entry, 0, len(v), context.temp_allocator) or_return + for key, val in v { + _, _ = append(&entries, Map_Entry{key, val}) + } + + slice.sort_by(entries[:], proc(i, j: Map_Entry) -> bool { return i.key < j.key }) + + opt_write_start(w, opt, '{') or_return + for e, i in entries { + opt_write_iteration(w, opt, i == 0) or_return + opt_write_key (w, opt, e.key) or_return + unparse_to_writer (w, e.value, opt) or_return + } + opt_write_end(w, opt, '}') or_return + } + return nil + } + return nil +} From 8c63a70aad105afc11521f8595bcb520915a9bdd Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 23 Jun 2026 13:14:56 +0100 Subject: [PATCH 218/228] Fix identation --- core/encoding/json/unparse.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/encoding/json/unparse.odin b/core/encoding/json/unparse.odin index bff85c0da..1b00f1b0e 100644 --- a/core/encoding/json/unparse.odin +++ b/core/encoding/json/unparse.odin @@ -42,7 +42,7 @@ unparse_to_writer :: proc(w: io.Writer, value: Value, opt: ^Marshal_Options) -> case Float: io.write_f64(w, v) or_return case Boolean: - io.write_string(w, "true" if v else "false") or_return + io.write_string(w, "true" if v else "false") or_return case String: io.write_quoted_string(w, v, '"', nil, true) or_return case Array: From 55e513fbd7fe0ce5904e75d27cbe17d15b61c06b Mon Sep 17 00:00:00 2001 From: bennyyip Date: Tue, 23 Jun 2026 22:19:26 +0800 Subject: [PATCH 219/228] align struct fields --- core/text/regex/virtual_machine/virtual_machine.odin | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/text/regex/virtual_machine/virtual_machine.odin b/core/text/regex/virtual_machine/virtual_machine.odin index 5b503290a..3751e0974 100644 --- a/core/text/regex/virtual_machine/virtual_machine.odin +++ b/core/text/regex/virtual_machine/virtual_machine.odin @@ -59,23 +59,23 @@ Split :: struct #packed { right: i16, } Wait_For_Byte :: struct #packed { - opcode: Opcode, + opcode: Opcode, operand: Opcode, } Wait_For_Rune :: struct #packed { - opcode: Opcode, + opcode: Opcode, operand: rune, } Wait_For_Rune_Class :: struct #packed { - opcode: Opcode, + opcode: Opcode, operand: Opcode, } Wait_For_Rune_Class_Negated :: struct #packed { - opcode: Opcode, + opcode: Opcode, operand: Opcode, } Save :: struct #packed { - opcode: Opcode, + opcode: Opcode, operand: Opcode, } From f58d7edb399fd679f923fea15c0892acb5163588 Mon Sep 17 00:00:00 2001 From: bennyyip Date: Tue, 23 Jun 2026 22:19:59 +0800 Subject: [PATCH 220/228] pack consecutive inject --- core/text/regex/compiler/compiler.odin | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/core/text/regex/compiler/compiler.odin b/core/text/regex/compiler/compiler.odin index 404660e57..3b38cc1b8 100644 --- a/core/text/regex/compiler/compiler.odin +++ b/core/text/regex/compiler/compiler.odin @@ -449,15 +449,14 @@ compile :: proc(tree: Node, flags: common.Flags) -> (code: Program, class_data: // `.*?` split := Split{.Split, i16(SPLIT_SIZE + size_of(byte) + JUMP_SIZE), i16(SPLIT_SIZE)} - inject_raw(&code, pc_open, split) - pc_open += size_of(Split) - - inject_at(&code, pc_open, Opcode.Wildcard) - pc_open += size_of(byte) - jump := Jump{.Jump, i16(-size_of(byte) - SPLIT_SIZE)} - inject_raw(&code, pc_open, jump) - pc_open += size_of(Jump) + pack := struct { + a: Split, + b: Opcode, + c: Jump, + } { split, Opcode.Wildcard, jump } + inject_raw(&code, pc_open, pack) + pc_open += size_of(Split) + size_of(byte) + size_of(Jump) } if .No_Capture not_in flags { From 07fee344199870d2814a66a028bdd9143ad290b0 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 23 Jun 2026 17:27:17 +0100 Subject: [PATCH 221/228] Allow for both `odin command path -flags` and `odin command -flags path` To do this, if the first argument after the command and last argument is NOT a flag, then put that last parameter first. --- src/array.cpp | 14 ++++++++++++++ src/main.cpp | 25 +++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/src/array.cpp b/src/array.cpp index ec2c97d0e..9cf7c6ce3 100644 --- a/src/array.cpp +++ b/src/array.cpp @@ -449,6 +449,20 @@ gb_internal void array_unordered_remove(Array *array, isize index) { array_pop(array); } +template +gb_internal void array_inject_at(Array *array, isize index, T value) { + GB_ASSERT(0 <= index); + + isize n = gb_max(array->count, index); + isize new_size = n+1; + array_resize(array, new_size); + + gb_memmove(array->data+index+1, array->data+index, gb_size_of(T)*(array->count-index-1)); + array->data[index] = value; +} + + + template diff --git a/src/main.cpp b/src/main.cpp index 51dade656..4dccd8f9c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3693,16 +3693,41 @@ int main(int arg_count, char const **arg_ptr) { String init_filename = {}; isize last_non_run_arg = args.count; + isize double_dash_pos = -1; for_array(i, args) { if (args[i] == "--") { + double_dash_pos = i; break; } + if (args[i] == "-help" || args[i] == "--help") { build_context.show_help = true; return print_show_help(args[0], command); } } + if (args.count > 2) { + // NOTE(bill): Allow for both `odin command path -flags` and `odin command -flags path` + // To do this, if the first argument after the command and last argument is NOT a flag, + // then put that last parameter first + isize end_arg = double_dash_pos >= 0 ? double_dash_pos : args.count-1; + if (args[1] == "bundle" && args.count > 4) { + if (string_starts_with(args[3], str_lit("-")) && + !string_starts_with(args[end_arg], str_lit("-"))) { + String possible_path = args[end_arg]; + array_ordered_remove(&args, end_arg); + array_inject_at(&args, 3, possible_path); + } + } else if (args.count > 3) { + if (string_starts_with(args[2], str_lit("-")) && + !string_starts_with(args[end_arg], str_lit("-"))) { + String possible_path = args[end_arg]; + array_ordered_remove(&args, end_arg); + array_inject_at(&args, 2, possible_path); + } + } + } + bool run_output = false; if (command == "run" || command == "test") { if (args.count < 3) { From 583a397e1dc17b39b150008f4b4aff0f50b4552c Mon Sep 17 00:00:00 2001 From: Barinzaya Date: Wed, 24 Jun 2026 00:50:52 -0400 Subject: [PATCH 222/228] Fixed alignment handling in mem.Dynamic_Arena. --- core/mem/allocators.odin | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index 40c320115..dcd126230 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -1806,11 +1806,14 @@ dynamic_arena_alloc_bytes_non_zeroed :: proc(a: ^Dynamic_Arena, size: int, align } return memory, err } - n := align_formula(size, max(a.minimum_alignment, alignment)) + actual_alignment := max(a.minimum_alignment, alignment) + n := align_formula(size, actual_alignment) if n > a.block_size { return nil, .Invalid_Argument } - if a.bytes_left < n { + memory := align_forward(a.current_pos, uintptr(actual_alignment)) + margin := int(uintptr(memory) - uintptr(a.current_pos)) + if a.bytes_left < margin + n { err := _dynamic_arena_cycle_new_block(a, alignment, loc) if err != nil { return nil, err @@ -1818,10 +1821,11 @@ dynamic_arena_alloc_bytes_non_zeroed :: proc(a: ^Dynamic_Arena, size: int, align if a.current_block == nil { return nil, .Out_Of_Memory } + margin = 0 + memory = a.current_pos } - memory := a.current_pos - a.current_pos = ([^]byte)(a.current_pos)[n:] - a.bytes_left -= n + a.current_pos = ([^]byte)(memory)[n:] + a.bytes_left -= margin + n result := ([^]byte)(memory)[:size] // ensure_poisoned(result) // sanitizer.address_unpoison(result) From 3883d079c8cf78ad49c6b140cf37b943c27c27c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A4rtschi=20Robin?= Date: Wed, 24 Jun 2026 08:04:17 +0200 Subject: [PATCH 223/228] Fix #6874 --- core/encoding/json/types.odin | 1 + src/check_stmt.cpp | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/core/encoding/json/types.odin b/core/encoding/json/types.odin index 77cc7db85..6b6d8aae9 100644 --- a/core/encoding/json/types.odin +++ b/core/encoding/json/types.odin @@ -113,6 +113,7 @@ destroy_value :: proc(value: Value, allocator := context.allocator, loc := #call } clone_value :: proc(value: Value, allocator := context.allocator) -> Value { + value := value context.allocator = allocator #partial switch &v in value { diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index 53dae5fd5..222222559 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -1476,6 +1476,14 @@ gb_internal void check_type_switch_stmt(CheckerContext *ctx, Ast *node, u32 mod_ return; } + if (switch_kind == TypeSwitch_Union) { + if (is_addressed) { + if (x.mode != Addressing_Variable && !is_type_pointer(x.type)) { + error(lhs->Ident.token, "The element variable '%.*s' cannot be made addressable", LIT(lhs->Ident.token.string)); + } + } + } + Ast *nil_seen = nullptr; TypeSet seen = {}; From 640a0f2ef49b347f0a10dd6b1c2034306352a9df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A4rtschi=20Robin?= Date: Wed, 24 Jun 2026 08:31:46 +0200 Subject: [PATCH 224/228] add test for #6874 --- tests/issues/run.bat | 1 + tests/issues/run.sh | 6 ++++++ tests/issues/test_issue_6874.odin | 35 +++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+) create mode 100644 tests/issues/test_issue_6874.odin diff --git a/tests/issues/run.bat b/tests/issues/run.bat index 0b92f07ff..43a7136b7 100644 --- a/tests/issues/run.bat +++ b/tests/issues/run.bat @@ -36,6 +36,7 @@ set COMMON=-define:ODIN_TEST_FANCY=false -file -vet -strict-style -ignore-unused ..\..\..\odin test ..\test_pr_6470.odin -define:TEST_EXPECT_FAILURE=true %COMMON% 2>&1 | find /c "Error:" | findstr /x "1" || exit /b ..\..\..\odin test ..\test_pr_6476.odin %COMMON% || exit /b ..\..\..\odin check ..\test_issue_6484.odin -no-entry-point %COMMON% || exit /b +..\..\..\odin check ..\test_issue_6874.odin %COMMON% 2>&1 | find /c "Error:" | findstr /x "1" || exit /b @echo off diff --git a/tests/issues/run.sh b/tests/issues/run.sh index f630738f9..3633a7606 100755 --- a/tests/issues/run.sh +++ b/tests/issues/run.sh @@ -73,6 +73,12 @@ else exit 1 fi $ODIN check ../test_issue_6484.odin -no-entry-point $COMMON +if [[ $($ODIN check ../test_issue_6874.odin $COMMON 2>&1 >/dev/null | grep -c "Error:") -eq 1 ]] ; then + echo "SUCCESSFUL 1/1" +else + echo "SUCCESSFUL 0/1" + exit 1 +fi set +x diff --git a/tests/issues/test_issue_6874.odin b/tests/issues/test_issue_6874.odin new file mode 100644 index 000000000..751e12ebe --- /dev/null +++ b/tests/issues/test_issue_6874.odin @@ -0,0 +1,35 @@ +// Test for issue #6874 https://github.com/odin-lang/Odin/issues/6874 + +package test_issues + +import "core:fmt" + +PersonData :: struct { + health: int, + age: int, +} + +MyUnion :: union { + f32, + int, + PersonData, +} + +change_union_data :: proc(data: MyUnion) { + switch &v in data { + case int: + v = 10 + case f32: + fmt.println("f32") + case PersonData: + fmt.println("PersonData") + fmt.println(v) + } +} + +main :: proc() { + val: MyUnion = int(12) + fmt.printfln("Before the call: %v", val) + change_union_data(val) + fmt.printfln("After the call: %v", val) +} \ No newline at end of file From 212004b3ad147b0e765db281d1f3cb394eac6efa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A4rtschi=20Robin?= Date: Wed, 24 Jun 2026 08:41:29 +0200 Subject: [PATCH 225/228] test_issue_6874: fix formatting --- tests/issues/test_issue_6874.odin | 38 +++++++++++++++---------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/tests/issues/test_issue_6874.odin b/tests/issues/test_issue_6874.odin index 751e12ebe..946fef39d 100644 --- a/tests/issues/test_issue_6874.odin +++ b/tests/issues/test_issue_6874.odin @@ -5,31 +5,31 @@ package test_issues import "core:fmt" PersonData :: struct { - health: int, - age: int, + health: int, + age: int, } MyUnion :: union { - f32, - int, - PersonData, + f32, + int, + PersonData, } change_union_data :: proc(data: MyUnion) { - switch &v in data { - case int: - v = 10 - case f32: - fmt.println("f32") - case PersonData: - fmt.println("PersonData") - fmt.println(v) - } + switch &v in data { + case int: + v = 10 + case f32: + fmt.println("f32") + case PersonData: + fmt.println("PersonData") + fmt.println(v) + } } main :: proc() { - val: MyUnion = int(12) - fmt.printfln("Before the call: %v", val) - change_union_data(val) - fmt.printfln("After the call: %v", val) -} \ No newline at end of file + val: MyUnion = int(12) + fmt.printfln("Before the call: %v", val) + change_union_data(val) + fmt.printfln("After the call: %v", val) +} From 55b63099a8175f5a5e6f50eb4f789bca0eceda7f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 24 Jun 2026 10:35:36 +0100 Subject: [PATCH 226/228] Fix constant `x %% y` evaluation --- src/big_int.cpp | 8 ++++++++ src/exact_value.cpp | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/big_int.cpp b/src/big_int.cpp index e2ebb5c76..4f20f2ad9 100644 --- a/src/big_int.cpp +++ b/src/big_int.cpp @@ -432,6 +432,14 @@ gb_internal void big_int_rem(BigInt *z, BigInt const *x, BigInt const *y) { big_int_quo_rem(x, y, &q, z); big_int_dealloc(&q); } +gb_internal void big_int_mod_mod(BigInt *z, BigInt const *x, BigInt const *y) { + BigInt q = {}; + big_int_rem(&q, x, y); + big_int_add(&q, &q, y); + big_int_rem(z, &q, y); + big_int_dealloc(&q); + +} gb_internal void big_int_euclidean_mod(BigInt *z, BigInt const *x, BigInt const *y) { BigInt y0 = {}; diff --git a/src/exact_value.cpp b/src/exact_value.cpp index fa26ec4b0..f232f95e0 100644 --- a/src/exact_value.cpp +++ b/src/exact_value.cpp @@ -780,7 +780,7 @@ gb_internal ExactValue exact_binary_operator_value(TokenKind op, ExactValue x, E case Token_Quo: return exact_value_float(fmod(big_int_to_f64(a), big_int_to_f64(b))); case Token_QuoEq: big_int_quo(&c, a, b); break; // NOTE(bill): Integer division case Token_Mod: big_int_rem(&c, a, b); break; - case Token_ModMod: big_int_euclidean_mod(&c, a, b); break; + case Token_ModMod: big_int_mod_mod(&c, a, b); break; case Token_And: big_int_and(&c, a, b); break; case Token_Or: big_int_or(&c, a, b); break; case Token_Xor: big_int_xor(&c, a, b); break; From f602a6acd734c61254d7887665d4a53960b7958a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 24 Jun 2026 10:38:21 +0100 Subject: [PATCH 227/228] Fix #6725 #6798 #4943 --- src/llvm_backend_expr.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index e02f743ca..7eb32279e 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -6571,11 +6571,12 @@ gb_internal lbAddr lb_build_addr_internal(lbProcedure *p, Ast *expr) { } else { item = lb_emit_ptr_offset(p, lb_emit_load(p, arr), index); } + + // make sure it's ^T and not [^]T + item.type = alloc_type_multi_pointer_to_pointer(item.type); if (sub_sel.index.count > 0) { item = lb_emit_deep_field_gep(p, item, sub_sel); } - // make sure it's ^T and not [^]T - item.type = alloc_type_multi_pointer_to_pointer(item.type); return lb_addr(item); } else if (addr.kind == lbAddr_Swizzle) { From ade003e12819849e6b167eeccfe44bca147ed0a5 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 24 Jun 2026 10:51:28 +0100 Subject: [PATCH 228/228] Allow for `-> (#simd[N]T)` style return types --- src/parser.cpp | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index 14258b5c6..36645d2b6 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -4214,18 +4214,33 @@ gb_internal FieldFlag is_token_field_prefix(AstFile *f) { return FieldFlag_using; case Token_Hash: - advance_token(f); - switch (f->curr_token.kind) { - case Token_Ident: - for (i32 i = 0; i < gb_count_of(parse_field_prefix_mappings); i++) { - auto const &mapping = parse_field_prefix_mappings[i]; - if (mapping.token_kind == Token_Hash) { - if (f->curr_token.string == mapping.name) { - return mapping.flag; - } + { + // Check for types first before fields + Token tok = peek_token(f); + if (tok.kind == Token_Ident) { + if (tok.string == "simd" || + tok.string == "type" || + tok.string == "row_major" || + tok.string == "column_major" || + tok.string == "sparse" || + tok.string == "soa") { + return FieldFlag_Invalid; } } - break; + + advance_token(f); + switch (f->curr_token.kind) { + case Token_Ident: + for (i32 i = 0; i < gb_count_of(parse_field_prefix_mappings); i++) { + auto const &mapping = parse_field_prefix_mappings[i]; + if (mapping.token_kind == Token_Hash) { + if (f->curr_token.string == mapping.name) { + return mapping.flag; + } + } + } + break; + } } return FieldFlag_Unknown; }