From 6dffd412f99e1b6f51c5cd448b14e3920b3936f8 Mon Sep 17 00:00:00 2001 From: mfalk Date: Thu, 9 Nov 2023 16:46:07 +0100 Subject: [PATCH 001/431] Adding IUserDefinedAnnotation to D3D11 for better debugging. --- vendor/directx/d3d11/d3d11.odin | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/vendor/directx/d3d11/d3d11.odin b/vendor/directx/d3d11/d3d11.odin index d94c05d06..c6be7bce5 100644 --- a/vendor/directx/d3d11/d3d11.odin +++ b/vendor/directx/d3d11/d3d11.odin @@ -24,6 +24,8 @@ IModuleInstance :: d3d_compiler.ID3D11ModuleInstance IBlob :: d3d_compiler.ID3DBlob IModule :: d3d_compiler.ID3D11Module +LPCWSTR :: ^u16 + @(default_calling_convention="stdcall", link_prefix="D3D11") foreign d3d11 { CreateDevice :: proc( @@ -3280,7 +3282,19 @@ IVideoContext_VTable :: struct { VideoProcessorGetStreamRotation: proc "stdcall" (this: ^IVideoContext, pVideoProcessor: ^IVideoProcessor, StreamIndex: u32, pEnable: ^BOOL, pRotation: ^VIDEO_PROCESSOR_ROTATION), } - +IUserDefinedAnnotation_UUID_STRING :: "B2DAAD8B-03D4-4DBF-95EB-32AB4B63D0AB" +IUserDefinedAnnotation_UUID := &IID{0xB2DAAD8B, 0x03D4, 0x4DBF, {0x95, 0xEB, 0x32, 0xAB, 0x4B, 0x63, 0xD0, 0xAB}} +IUserDefinedAnnotation :: struct #raw_union{ +#subtype iunknown : IUnknown, +using id3d11userdefinedannotation_vtable : ^IUserDefinedAnnotation_VTable, +} +IUserDefinedAnnotation_VTable :: struct { + using iunknown_vtable : IUnknown_VTable, + BeginEvent: proc "stdcall" (this: ^IUserDefinedAnnotation, Name: LPCWSTR) -> i32, + EndEvent: proc "stdcall" (this: ^IUserDefinedAnnotation) -> i32, + GetStatus: proc "stdcall" (this: ^IUserDefinedAnnotation) -> i32, + SetMarker: proc "stdcall" (this: ^IUserDefinedAnnotation, Name: LPCWSTR), +} IVideoDevice_UUID_STRING :: "10EC4D5B-975A-4689-B9E4-D0AAC30FE333" IVideoDevice_UUID := &IID{0x10EC4D5B, 0x975A, 0x4689, {0xB9, 0xE4, 0xD0, 0xAA, 0xC3, 0x0F, 0xE3, 0x33}} From bd96cd0af761994210018ca647eb843dfeb71494 Mon Sep 17 00:00:00 2001 From: mfalk Date: Mon, 4 Dec 2023 05:49:42 +0100 Subject: [PATCH 002/431] Fixed indentation and : binding --- vendor/directx/d3d11/d3d11.odin | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vendor/directx/d3d11/d3d11.odin b/vendor/directx/d3d11/d3d11.odin index c6be7bce5..5e52fa4b4 100644 --- a/vendor/directx/d3d11/d3d11.odin +++ b/vendor/directx/d3d11/d3d11.odin @@ -3284,9 +3284,9 @@ IVideoContext_VTable :: struct { IUserDefinedAnnotation_UUID_STRING :: "B2DAAD8B-03D4-4DBF-95EB-32AB4B63D0AB" IUserDefinedAnnotation_UUID := &IID{0xB2DAAD8B, 0x03D4, 0x4DBF, {0x95, 0xEB, 0x32, 0xAB, 0x4B, 0x63, 0xD0, 0xAB}} -IUserDefinedAnnotation :: struct #raw_union{ -#subtype iunknown : IUnknown, -using id3d11userdefinedannotation_vtable : ^IUserDefinedAnnotation_VTable, +IUserDefinedAnnotation :: struct #raw_union { + #subtype iunknown: IUnknown, + using id3d11userdefinedannotation_vtable: ^IUserDefinedAnnotation_VTable, } IUserDefinedAnnotation_VTable :: struct { using iunknown_vtable : IUnknown_VTable, From d380e431660f8a18d311641b962743b5839f8136 Mon Sep 17 00:00:00 2001 From: Ali Salehi Date: Sun, 18 Feb 2024 21:28:30 +0100 Subject: [PATCH 003/431] Add xinput bindings to core:sys/windows --- core/sys/windows/xinput.odin | 227 +++++++++++++++++++++++++++++++++++ 1 file changed, 227 insertions(+) create mode 100644 core/sys/windows/xinput.odin diff --git a/core/sys/windows/xinput.odin b/core/sys/windows/xinput.odin new file mode 100644 index 000000000..2b1303e0d --- /dev/null +++ b/core/sys/windows/xinput.odin @@ -0,0 +1,227 @@ +// +build windows +package sys_windows + +foreign import "system:xinput.lib" + +// Device types available in XINPUT_CAPABILITIES +// Correspond to XINPUT_DEVTYPE_... +XINPUT_DEVTYPE :: enum BYTE { + GAMEPAD = 0x01, +} + +// Device subtypes available in XINPUT_CAPABILITIES +// Correspond to XINPUT_DEVSUBTYPE_... +XINPUT_DEVSUBTYPE :: enum BYTE { + UNKNOWN = 0x00, + GAMEPAD = 0x01, + WHEEL = 0x02, + ARCADE_STICK = 0x03, + FLIGHT_STICK = 0x04, + DANCE_PAD = 0x05, + GUITAR = 0x06, + GUITAR_ALTERNATE = 0x07, + DRUM_KIT = 0x08, + GUITAR_BASS = 0x0B, + ARCADE_PAD = 0x13, +} + +// Flags for XINPUT_CAPABILITIES +// Correspond to log2(XINPUT_CAPS_...) +XINPUT_CAP :: enum { + FFB_SUPPORTED = 0, + WIRELESS = 1, + VOICE_SUPPORTED = 2, + PMD_SUPPORTED = 3, + NO_NAVIGATION = 4, +} +XINPUT_CAPS :: bit_set[XINPUT_CAP;WORD] + +// Constants for gamepad buttons +// Correspond to log2(XINPUT_GAMEPAD_...) +XINPUT_GAMEPAD_BUTTON_BIT :: enum { + DPAD_UP = 0, + DPAD_DOWN = 1, + DPAD_LEFT = 2, + DPAD_RIGHT = 3, + START = 4, + BACK = 5, + LEFT_THUMB = 6, + RIGHT_THUMB = 7, + LEFT_SHOULDER = 8, + RIGHT_SHOULDER = 9, + A = 12, + B = 13, + X = 14, + Y = 15, +} +XINPUT_GAMEPAD_BUTTON :: bit_set[XINPUT_GAMEPAD_BUTTON_BIT;WORD] + +// Gamepad thresholds +XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE: SHORT : 7849 +XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE: SHORT : 8689 +XINPUT_GAMEPAD_TRIGGER_THRESHOLD: SHORT : 30 + +// Flags to pass to XInputGetCapabilities +// Corresponds to log2(XINPUT_FLAG_...) +XINPUT_FLAG_BIT :: enum { + GAMEPAD = 0, +} +XINPUT_FLAG :: bit_set[XINPUT_FLAG_BIT;DWORD] + +// Devices that support batteries +// Corresponds to BATTERY_DEVTYPE_... +BATTERY_DEVTYPE :: enum BYTE { + GAMEPAD = 0x00, + HEADSET = 0x01, +} + +// Flags for battery status level +// Correspond to BATTERY_TYPE_... +BATTERY_TYPE :: enum BYTE { + DISCONNECTED = 0x00, // This device is not connected + WIRED = 0x01, // Wired device, no battery + ALKALINE = 0x02, // Alkaline battery source + NIMH = 0x03, // Nickel Metal Hydride battery source + UNKNOWN = 0xFF, // Cannot determine the battery type +} + +// These are only valid for wireless, connected devices, with known battery types +// The amount of use time remaining depends on the type of device. +// Correspond to BATTERY_LEVEL_... +BATTERY_LEVEL :: enum BYTE { + EMPTY = 0x00, + LOW = 0x01, + MEDIUM = 0x02, + FULL = 0x03, +} + +// User index definitions + +// Index of the gamer associated with the device +XUSER :: enum DWORD { + One = 0, + Two = 1, + Three = 2, + Four = 3, + Any = 0x000000FF, // Can be only used with XInputGetKeystroke +} + +XUSER_MAX_COUNT :: 4 + +// Codes returned for the gamepad keystroke +// Corresponds to VK_PAD_... +VK_PAD :: enum WORD { + A = 0x5800, + B = 0x5801, + X = 0x5802, + Y = 0x5803, + RSHOULDER = 0x5804, + LSHOULDER = 0x5805, + LTRIGGER = 0x5806, + RTRIGGER = 0x5807, + DPAD_UP = 0x5810, + DPAD_DOWN = 0x5811, + DPAD_LEFT = 0x5812, + DPAD_RIGHT = 0x5813, + START = 0x5814, + BACK = 0x5815, + LTHUMB_PRESS = 0x5816, + RTHUMB_PRESS = 0x5817, + LTHUMB_UP = 0x5820, + LTHUMB_DOWN = 0x5821, + LTHUMB_RIGHT = 0x5822, + LTHUMB_LEFT = 0x5823, + LTHUMB_UPLEFT = 0x5824, + LTHUMB_UPRIGHT = 0x5825, + LTHUMB_DOWNRIGHT = 0x5826, + LTHUMB_DOWNLEFT = 0x5827, + RTHUMB_UP = 0x5830, + RTHUMB_DOWN = 0x5831, + RTHUMB_RIGHT = 0x5832, + RTHUMB_LEFT = 0x5833, + RTHUMB_UPLEFT = 0x5834, + RTHUMB_UPRIGHT = 0x5835, + RTHUMB_DOWNRIGHT = 0x5836, + RTHUMB_DOWNLEFT = 0x5837, +} + +// Flags used in XINPUT_KEYSTROKE +// Correspond to log2(XINPUT_KEYSTROKE_...) +XINPUT_KEYSTROKE_BIT :: enum { + KEYDOWN = 0, + KEYUP = 1, + REPEAT = 2, +} +XINPUT_KEYSTROKES :: bit_set[XINPUT_KEYSTROKE_BIT;WORD] + +// Structures used by XInput APIs +XINPUT_GAMEPAD :: struct { + wButtons: XINPUT_GAMEPAD_BUTTON, + bLeftTrigger: BYTE, + bRightTrigger: BYTE, + sThumbLX: SHORT, + sThumbLY: SHORT, + sThumbRX: SHORT, + sThumbRY: SHORT, +} + +XINPUT_STATE :: struct { + dwPacketNumber: DWORD, + Gamepad: XINPUT_GAMEPAD, +} + +XINPUT_VIBRATION :: struct { + wLeftMotorSpeed: WORD, + wRightMotorSpeed: WORD, +} + +XINPUT_CAPABILITIES :: struct { + Type: XINPUT_DEVTYPE, + SubType: XINPUT_DEVSUBTYPE, + Flags: XINPUT_CAPS, + Gamepad: XINPUT_GAMEPAD, + Vibration: XINPUT_VIBRATION, +} + +XINPUT_BATTERY_INFORMATION :: struct { + BatteryType: BATTERY_TYPE, + BatteryLevel: BATTERY_LEVEL, +} + +XINPUT_KEYSTROKE :: struct { + VirtualKey: VK_PAD, + Unicode: WCHAR, + Flags: XINPUT_KEYSTROKES, + UserIndex: XUSER, + HidCode: BYTE, +} + +// XInput APIs +@(default_calling_convention = "system") +foreign xinput { + + @(link_name = "XInputGetState") + XInputGetState :: proc(user: XUSER, pState: ^XINPUT_STATE) -> System_Error --- + + @(link_name = "XInputSetState") + XInputSetState :: proc(user: XUSER, pVibration: ^XINPUT_VIBRATION) -> System_Error --- + + @(link_name = "XInputGetCapabilities") + XInputGetCapabilities :: proc(user: XUSER, dwFlags: XINPUT_FLAG, pCapabilities: ^XINPUT_CAPABILITIES) -> System_Error --- + + @(link_name = "XInputEnable") + XInputEnable :: proc(enable: BOOL) --- + + @(link_name = "XInputGetAudioDeviceIds") + XInputGetAudioDeviceIds :: proc(user: XUSER, pRenderDeviceId: LPWSTR, pRenderCount: ^UINT, pCaptureDeviceId: LPWSTR, pCaptureCount: ^UINT) -> System_Error --- + + @(link_name = "XInputGetBatteryInformation") + XInputGetBatteryInformation :: proc(user: XUSER, devType: BATTERY_DEVTYPE, pBatteryInformation: ^XINPUT_BATTERY_INFORMATION) -> System_Error --- + + @(link_name = "XInputGetKeystroke") + XInputGetKeystroke :: proc(user: XUSER, dwReserved: DWORD, pKeystroke: ^XINPUT_KEYSTROKE) -> System_Error --- + + @(link_name = "XInputGetDSoundAudioDeviceGuids") + XInputGetDSoundAudioDeviceGuids :: proc(user: XUSER, pDSoundRenderGuid: ^GUID, pDSoundCaptureGuid: ^GUID) -> System_Error --- + +} From 8aab0f9e34ab8818b7599c285799819b22319cad Mon Sep 17 00:00:00 2001 From: Ali Salehi Date: Mon, 19 Feb 2024 15:55:57 +0100 Subject: [PATCH 004/431] Add distinct and remove unnecessary link_names --- core/sys/windows/xinput.odin | 33 ++++++++------------------------- 1 file changed, 8 insertions(+), 25 deletions(-) diff --git a/core/sys/windows/xinput.odin b/core/sys/windows/xinput.odin index 2b1303e0d..014d2573a 100644 --- a/core/sys/windows/xinput.odin +++ b/core/sys/windows/xinput.odin @@ -27,18 +27,18 @@ XINPUT_DEVSUBTYPE :: enum BYTE { // Flags for XINPUT_CAPABILITIES // Correspond to log2(XINPUT_CAPS_...) -XINPUT_CAP :: enum { +XINPUT_CAP :: enum WORD { FFB_SUPPORTED = 0, WIRELESS = 1, VOICE_SUPPORTED = 2, PMD_SUPPORTED = 3, NO_NAVIGATION = 4, } -XINPUT_CAPS :: bit_set[XINPUT_CAP;WORD] +XINPUT_CAPS :: distinct bit_set[XINPUT_CAP;WORD] // Constants for gamepad buttons // Correspond to log2(XINPUT_GAMEPAD_...) -XINPUT_GAMEPAD_BUTTON_BIT :: enum { +XINPUT_GAMEPAD_BUTTON_BIT :: enum WORD { DPAD_UP = 0, DPAD_DOWN = 1, DPAD_LEFT = 2, @@ -54,7 +54,7 @@ XINPUT_GAMEPAD_BUTTON_BIT :: enum { X = 14, Y = 15, } -XINPUT_GAMEPAD_BUTTON :: bit_set[XINPUT_GAMEPAD_BUTTON_BIT;WORD] +XINPUT_GAMEPAD_BUTTON :: distinct bit_set[XINPUT_GAMEPAD_BUTTON_BIT;WORD] // Gamepad thresholds XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE: SHORT : 7849 @@ -63,10 +63,10 @@ XINPUT_GAMEPAD_TRIGGER_THRESHOLD: SHORT : 30 // Flags to pass to XInputGetCapabilities // Corresponds to log2(XINPUT_FLAG_...) -XINPUT_FLAG_BIT :: enum { +XINPUT_FLAG_BIT :: enum WORD { GAMEPAD = 0, } -XINPUT_FLAG :: bit_set[XINPUT_FLAG_BIT;DWORD] +XINPUT_FLAG :: distinct bit_set[XINPUT_FLAG_BIT;DWORD] // Devices that support batteries // Corresponds to BATTERY_DEVTYPE_... @@ -147,12 +147,12 @@ VK_PAD :: enum WORD { // Flags used in XINPUT_KEYSTROKE // Correspond to log2(XINPUT_KEYSTROKE_...) -XINPUT_KEYSTROKE_BIT :: enum { +XINPUT_KEYSTROKE_BIT :: enum WORD { KEYDOWN = 0, KEYUP = 1, REPEAT = 2, } -XINPUT_KEYSTROKES :: bit_set[XINPUT_KEYSTROKE_BIT;WORD] +XINPUT_KEYSTROKES :: distinct bit_set[XINPUT_KEYSTROKE_BIT;WORD] // Structures used by XInput APIs XINPUT_GAMEPAD :: struct { @@ -199,29 +199,12 @@ XINPUT_KEYSTROKE :: struct { // XInput APIs @(default_calling_convention = "system") foreign xinput { - - @(link_name = "XInputGetState") XInputGetState :: proc(user: XUSER, pState: ^XINPUT_STATE) -> System_Error --- - - @(link_name = "XInputSetState") XInputSetState :: proc(user: XUSER, pVibration: ^XINPUT_VIBRATION) -> System_Error --- - - @(link_name = "XInputGetCapabilities") XInputGetCapabilities :: proc(user: XUSER, dwFlags: XINPUT_FLAG, pCapabilities: ^XINPUT_CAPABILITIES) -> System_Error --- - - @(link_name = "XInputEnable") XInputEnable :: proc(enable: BOOL) --- - - @(link_name = "XInputGetAudioDeviceIds") XInputGetAudioDeviceIds :: proc(user: XUSER, pRenderDeviceId: LPWSTR, pRenderCount: ^UINT, pCaptureDeviceId: LPWSTR, pCaptureCount: ^UINT) -> System_Error --- - - @(link_name = "XInputGetBatteryInformation") XInputGetBatteryInformation :: proc(user: XUSER, devType: BATTERY_DEVTYPE, pBatteryInformation: ^XINPUT_BATTERY_INFORMATION) -> System_Error --- - - @(link_name = "XInputGetKeystroke") XInputGetKeystroke :: proc(user: XUSER, dwReserved: DWORD, pKeystroke: ^XINPUT_KEYSTROKE) -> System_Error --- - - @(link_name = "XInputGetDSoundAudioDeviceGuids") XInputGetDSoundAudioDeviceGuids :: proc(user: XUSER, pDSoundRenderGuid: ^GUID, pDSoundCaptureGuid: ^GUID) -> System_Error --- - } From 8050622fe62522b694f212f06ee902de99c42363 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Thu, 28 Nov 2024 20:07:54 +0100 Subject: [PATCH 005/431] add `map_entry` procedure --- base/runtime/core_builtin.odin | 26 ++++++++++++++++++++++++++ base/runtime/dynamic_map_internal.odin | 23 +++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index d28dadd02..e7c2c0b1f 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -936,6 +936,32 @@ map_upsert :: proc(m: ^$T/map[$K]$V, key: K, value: V, loc := #caller_location) return } +/* +Retrieves a pointer to the key and value for a possibly just inserted entry into the map. + +If the `key` was not in the map `m`, an entry is inserted with the zero value and `just_inserted` will be `true`. +Otherwise the existing entry is left untouched and pointers to its key and value are returned. + +If the map has to grow in order to insert the entry and the allocation fails, `err` is set and returned. + +If `err` is `nil`, `key_ptr` and `value_ptr` are valid pointers and will not be `nil`. + +WARN: User modification of the key pointed at by `key_ptr` should only be done if the new key is equal to (in hash) the old key. +If that is not the case you will corrupt the map. +*/ +@(builtin, require_results) +map_entry :: proc(m: ^$T/map[$K]$V, key: K, loc := #caller_location) -> (key_ptr: ^K, value_ptr: ^V, just_inserted: bool, err: Allocator_Error) { + key := key + zero: V + + _key_ptr, _value_ptr: rawptr + _key_ptr, _value_ptr, just_inserted, err = __dynamic_map_entry((^Raw_Map)(m), map_info(T), &key, &zero, loc) + + key_ptr = (^K)(_key_ptr) + value_ptr = (^V)(_value_ptr) + return +} + @builtin card :: proc "contextless" (s: $S/bit_set[$E; $U]) -> int { diff --git a/base/runtime/dynamic_map_internal.odin b/base/runtime/dynamic_map_internal.odin index 3dded7716..c9d264c6a 100644 --- a/base/runtime/dynamic_map_internal.odin +++ b/base/runtime/dynamic_map_internal.odin @@ -941,6 +941,29 @@ __dynamic_map_set_extra :: proc "odin" (#no_alias m: ^Raw_Map, #no_alias info: ^ return nil, rawptr(result) } +__dynamic_map_entry :: proc "odin" (#no_alias m: ^Raw_Map, #no_alias info: ^Map_Info, key: rawptr, zero: rawptr, loc := #caller_location) -> (key_ptr: rawptr, value_ptr: rawptr, just_inserted: bool, err: Allocator_Error) { + hash := info.key_hasher(key, map_seed(m^)) + + if key_ptr, value_ptr = __dynamic_map_get_key_and_value(m, info, hash, key); value_ptr != nil { + return + } + + has_grown: bool + if err, has_grown = __dynamic_map_check_grow(m, info, loc); err != nil { + return + } else if has_grown { + hash = info.key_hasher(key, map_seed(m^)) + } + + value_ptr = rawptr(map_insert_hash_dynamic(m, info, hash, uintptr(key), uintptr(zero))) + assert(value_ptr != nil) + key_ptr = rawptr(map_cell_index_dynamic(map_data(m^), info.ks, map_desired_position(m^, hash))) + + m.len += 1 + just_inserted = true + return +} + // IMPORTANT: USED WITHIN THE COMPILER @(private) From 8a27042d2473ecb9fc1432ae7dd21e2cd546a9c7 Mon Sep 17 00:00:00 2001 From: Waqar Ahmed Date: Sat, 30 Nov 2024 22:23:56 +0500 Subject: [PATCH 006/431] Use a proper Queue in thread.Pool With lots of tasks the dynamic array takes a big performance hit as its allocating all the time on pop_front --- core/thread/thread_pool.odin | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/core/thread/thread_pool.odin b/core/thread/thread_pool.odin index d9166b450..59bf90620 100644 --- a/core/thread/thread_pool.odin +++ b/core/thread/thread_pool.odin @@ -9,6 +9,7 @@ package thread import "base:intrinsics" import "core:sync" import "core:mem" +import "core:container/queue" Task_Proc :: #type proc(task: Task) @@ -40,7 +41,7 @@ Pool :: struct { threads: []^Thread, - tasks: [dynamic]Task, + tasks: queue.Queue(Task), tasks_done: [dynamic]Task, } @@ -69,13 +70,13 @@ pool_thread_runner :: proc(t: ^Thread) { } // Once initialized, the pool's memory address is not allowed to change until -// it is destroyed. +// it is destroyed. // // The thread pool requires an allocator which it either owns, or which is thread safe. pool_init :: proc(pool: ^Pool, allocator: mem.Allocator, thread_count: int) { context.allocator = allocator pool.allocator = allocator - pool.tasks = make([dynamic]Task) + queue.init(&pool.tasks) pool.tasks_done = make([dynamic]Task) pool.threads = make([]^Thread, max(thread_count, 1)) @@ -92,7 +93,7 @@ pool_init :: proc(pool: ^Pool, allocator: mem.Allocator, thread_count: int) { } pool_destroy :: proc(pool: ^Pool) { - delete(pool.tasks) + queue.destroy(&pool.tasks) delete(pool.tasks_done) for &t in pool.threads { @@ -140,11 +141,11 @@ pool_join :: proc(pool: ^Pool) { // the thread pool. You can even add tasks from inside other tasks. // // Each task also needs an allocator which it either owns, or which is thread -// safe. +// safe. pool_add_task :: proc(pool: ^Pool, allocator: mem.Allocator, procedure: Task_Proc, data: rawptr, user_index: int = 0) { sync.guard(&pool.mutex) - append(&pool.tasks, Task{ + queue.push_back(&pool.tasks, Task{ procedure = procedure, data = data, user_index = user_index, @@ -288,10 +289,10 @@ pool_is_empty :: #force_inline proc(pool: ^Pool) -> bool { pool_pop_waiting :: proc(pool: ^Pool) -> (task: Task, got_task: bool) { sync.guard(&pool.mutex) - if len(pool.tasks) != 0 { + if queue.len(pool.tasks) != 0 { intrinsics.atomic_sub(&pool.num_waiting, 1) intrinsics.atomic_add(&pool.num_in_processing, 1) - task = pop_front(&pool.tasks) + task = queue.pop_front(&pool.tasks) got_task = true } From f9dc848926142ed4ecf6db780b4d2130bd0795ec Mon Sep 17 00:00:00 2001 From: FourteenBrush <74827262+FourteenBrush@users.noreply.github.com> Date: Sat, 30 Nov 2024 23:43:39 +0100 Subject: [PATCH 007/431] Pass allocator to implicitly (de)allocating procs in `core:log` --- core/log/file_console_logger.odin | 16 ++++++++-------- core/log/multi_logger.odin | 12 ++++++------ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/core/log/file_console_logger.odin b/core/log/file_console_logger.odin index e45f99523..6d93fb879 100644 --- a/core/log/file_console_logger.odin +++ b/core/log/file_console_logger.odin @@ -37,30 +37,30 @@ File_Console_Logger_Data :: struct { ident: string, } -create_file_logger :: proc(h: os.Handle, lowest := Level.Debug, opt := Default_File_Logger_Opts, ident := "") -> Logger { - data := new(File_Console_Logger_Data) +create_file_logger :: proc(h: os.Handle, lowest := Level.Debug, opt := Default_File_Logger_Opts, ident := "", allocator := context.allocator) -> Logger { + data := new(File_Console_Logger_Data, allocator) data.file_handle = h data.ident = ident return Logger{file_console_logger_proc, data, lowest, opt} } -destroy_file_logger :: proc(log: Logger) { +destroy_file_logger :: proc(log: Logger, allocator := context.allocator) { data := cast(^File_Console_Logger_Data)log.data if data.file_handle != os.INVALID_HANDLE { os.close(data.file_handle) } - free(data) + free(data, allocator) } -create_console_logger :: proc(lowest := Level.Debug, opt := Default_Console_Logger_Opts, ident := "") -> Logger { - data := new(File_Console_Logger_Data) +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 = os.INVALID_HANDLE data.ident = ident return Logger{file_console_logger_proc, data, lowest, opt} } -destroy_console_logger :: proc(log: Logger) { - free(log.data) +destroy_console_logger :: proc(log: Logger, allocator := context.allocator) { + free(log.data, allocator) } file_console_logger_proc :: proc(logger_data: rawptr, level: Level, text: string, options: Options, location := #caller_location) { diff --git a/core/log/multi_logger.odin b/core/log/multi_logger.odin index 96d0f3dbd..6122554bb 100644 --- a/core/log/multi_logger.odin +++ b/core/log/multi_logger.odin @@ -5,17 +5,17 @@ Multi_Logger_Data :: struct { loggers: []Logger, } -create_multi_logger :: proc(logs: ..Logger) -> Logger { - data := new(Multi_Logger_Data) - data.loggers = make([]Logger, len(logs)) +create_multi_logger :: proc(logs: ..Logger, allocator := context.allocator) -> Logger { + data := new(Multi_Logger_Data, allocator) + data.loggers = make([]Logger, len(logs), allocator) copy(data.loggers, logs) return Logger{multi_logger_proc, data, Level.Debug, nil} } -destroy_multi_logger :: proc(log: Logger) { +destroy_multi_logger :: proc(log: Logger, allocator := context.allocator) { data := (^Multi_Logger_Data)(log.data) - delete(data.loggers) - free(data) + delete(data.loggers, allocator) + free(data, allocator) } multi_logger_proc :: proc(logger_data: rawptr, level: Level, text: string, From 26415bcb0e7941fdeb53721c991c0c80104e1efe Mon Sep 17 00:00:00 2001 From: Damian Tarnawski Date: Sun, 1 Dec 2024 18:21:26 +0100 Subject: [PATCH 008/431] Correct handling newlines between build tags in `core:odin` Previously I thought that each newline worked as `OR` basically the same as `,`. This corrects this to work as `AND` instead. --- core/odin/parser/file_tags.odin | 24 +++++++++++++++++++++--- tests/core/odin/test_file_tags.odin | 21 +++++++++------------ 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/core/odin/parser/file_tags.odin b/core/odin/parser/file_tags.odin index 84b172148..c5c6637c3 100644 --- a/core/odin/parser/file_tags.odin +++ b/core/odin/parser/file_tags.odin @@ -17,6 +17,9 @@ Build_Kind :: struct { arch: runtime.Odin_Arch_Types, } +// empty build kind acts as a marker for separating multiple lines with build tags +BUILD_KIND_NEWLINE_MARKER :: Build_Kind{} + File_Tags :: struct { build_project_name: [][]string, build: []Build_Kind, @@ -147,6 +150,11 @@ parse_file_tags :: proc(file: ast.File, allocator := context.allocator) -> (tags append(build_project_names, build_project_name_strings[index_start:]) } case "build": + + if len(build_kinds) > 0 { + append(build_kinds, BUILD_KIND_NEWLINE_MARKER) + } + kinds_loop: for { os_positive: runtime.Odin_OS_Types os_negative: runtime.Odin_OS_Types @@ -248,10 +256,20 @@ match_build_tags :: proc(file_tags: File_Tags, target: Build_Target) -> bool { project_name_correct ||= group_correct } - os_and_arch_correct := len(file_tags.build) == 0 + os_and_arch_correct := true - for kind in file_tags.build { - os_and_arch_correct ||= target.os in kind.os && target.arch in kind.arch + if len(file_tags.build) > 0 { + os_and_arch_correct_line := false + + for kind in file_tags.build { + if kind == BUILD_KIND_NEWLINE_MARKER { + os_and_arch_correct &&= os_and_arch_correct_line + os_and_arch_correct_line = false + } else { + os_and_arch_correct_line ||= target.os in kind.os && target.arch in kind.arch + } + } + os_and_arch_correct &&= os_and_arch_correct_line } return !file_tags.ignore && project_name_correct && os_and_arch_correct diff --git a/tests/core/odin/test_file_tags.odin b/tests/core/odin/test_file_tags.odin index ec686f279..99a995be5 100644 --- a/tests/core/odin/test_file_tags.odin +++ b/tests/core/odin/test_file_tags.odin @@ -46,14 +46,16 @@ package main {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}}, }, }, matching_targets = { - {{.Linux, .amd64, "foo"}, true}, - {{.Windows, .arm64, "foo"}, true}, + {{.Linux, .amd64, "foo"}, false}, + {{.Linux, .arm64, "foo"}, true}, {{.Windows, .amd64, "foo"}, false}, + {{.Windows, .arm64, "foo"}, false}, }, }, {// [3] src = ` @@ -82,17 +84,12 @@ package main tags = { build_project_name = {{"foo", "!bar"}, {"baz"}}, build = { - { - os = {.JS}, - arch = {.wasm32}, - }, { - os = {.JS}, - arch = {.wasm64p32}, - }, + {os = {.JS}, arch = {.wasm32}}, + {os = {.JS}, arch = {.wasm64p32}}, }, }, matching_targets = { - {{.JS, .wasm32, "foo"}, true}, + {{.JS, .wasm32, "foo"}, true}, {{.JS, .wasm64p32, "baz"}, true}, {{.JS, .wasm64p32, "bar"}, false}, }, @@ -108,9 +105,9 @@ package main`, }, }, matching_targets = { - {{.Freestanding, .wasm32, ""}, true}, + {{.Freestanding, .wasm32, ""}, true}, {{.Freestanding, .wasm64p32, ""}, true}, - {{.Freestanding, .arm64, ""}, false}, + {{.Freestanding, .arm64, ""}, false}, }, }, } From 4b76568596236e3a03047c39ebfe216403ef3737 Mon Sep 17 00:00:00 2001 From: Bazzagibbs Date: Mon, 2 Dec 2024 11:58:36 +1100 Subject: [PATCH 009/431] Add `linalg.clamp_length(vector, max_length) -> clamped_vector` --- core/math/linalg/general.odin | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/core/math/linalg/general.odin b/core/math/linalg/general.odin index f82d75bff..8c4f2954a 100644 --- a/core/math/linalg/general.odin +++ b/core/math/linalg/general.odin @@ -167,6 +167,18 @@ vector_triple_product :: proc "contextless" (a, b, c: $T/[$N]$E) -> T where IS_N length :: proc{vector_length, quaternion_length} length2 :: proc{vector_length2, quaternion_length2} + +@(require_results) +clamp_length :: proc "contextless" (v: $T/[$N]$E, a: E) -> T where IS_FLOAT(E) { + if a <= 0 { + return 0 + } + + m2 := length2(v) + return v if (m2 <= a*a) else (v / sqrt(m2) * a) // returns original when m2 is 0 +} + + @(require_results) projection :: proc "contextless" (x, normal: $T/[$N]$E) -> T where IS_NUMERIC(E) { return dot(x, normal) / dot(normal, normal) * normal From d0f87913e2133b8101faef6ea76e0853d4da524b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 2 Dec 2024 10:49:49 +0000 Subject: [PATCH 010/431] Fix #4549 --- core/encoding/json/tokenizer.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/encoding/json/tokenizer.odin b/core/encoding/json/tokenizer.odin index 5c20a2cc3..1a57ba6f0 100644 --- a/core/encoding/json/tokenizer.odin +++ b/core/encoding/json/tokenizer.odin @@ -485,7 +485,7 @@ is_valid_string_literal :: proc(str: string, spec: Specification) -> bool { case '"': // okay case '\'': - if spec != .JSON { + if spec == .JSON { return false } // okay From e2ba8ff6e6fdbd23a10dcaf8b04f85960b8aa7c3 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 2 Dec 2024 11:23:55 +0000 Subject: [PATCH 011/431] Fix #4530 --- src/exact_value.cpp | 6 +++++- src/string.cpp | 10 +++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/exact_value.cpp b/src/exact_value.cpp index 5d6016ecc..ceaed84c1 100644 --- a/src/exact_value.cpp +++ b/src/exact_value.cpp @@ -370,7 +370,11 @@ gb_internal ExactValue exact_value_from_basic_literal(TokenKind kind, String con } case Token_Rune: { Rune r = GB_RUNE_INVALID; - utf8_decode(string.text, string.len, &r); + if (string.len == 1) { + r = cast(Rune)string.text[0]; + } else { + utf8_decode(string.text, string.len, &r); + } return exact_value_i64(r); } } diff --git a/src/string.cpp b/src/string.cpp index f8ee6c53e..b001adf0e 100644 --- a/src/string.cpp +++ b/src/string.cpp @@ -718,12 +718,12 @@ gb_internal bool unquote_char(String s, u8 quote, Rune *rune, bool *multiple_byt Rune r = -1; isize size = utf8_decode(s.text, s.len, &r); *rune = r; - *multiple_bytes = true; - *tail_string = make_string(s.text+size, s.len-size); + if (multiple_bytes) *multiple_bytes = true; + if (tail_string) *tail_string = make_string(s.text+size, s.len-size); return true; } else if (s[0] != '\\') { *rune = s[0]; - *tail_string = make_string(s.text+1, s.len-1); + if (tail_string) *tail_string = make_string(s.text+1, s.len-1); return true; } @@ -809,10 +809,10 @@ gb_internal bool unquote_char(String s, u8 quote, Rune *rune, bool *multiple_byt return false; } *rune = r; - *multiple_bytes = true; + if (multiple_bytes) *multiple_bytes = true; } break; } - *tail_string = s; + if (tail_string) *tail_string = s; return true; } From 65de0256ce173b92ff90c9ea9629aeadc9bb8538 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 2 Dec 2024 15:57:08 +0000 Subject: [PATCH 012/431] Fix #4535 --- src/check_expr.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index dd0820fee..cc9483187 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -4980,8 +4980,12 @@ gb_internal ExactValue get_constant_field_single(CheckerContext *c, ExactValue v if (success_) *success_ = true; if (finish_) *finish_ = false; return tav.value; + } else if (is_type_proc(tav.type)) { + if (success_) *success_ = true; + if (finish_) *finish_ = false; + return tav.value; } else { - GB_ASSERT(is_type_untyped_nil(tav.type)); + GB_ASSERT_MSG(is_type_untyped_nil(tav.type), "%s", type_to_string(tav.type)); if (success_) *success_ = true; if (finish_) *finish_ = false; return tav.value; From b94247988658f875bfaed6717b3f888d75d5e660 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 2 Dec 2024 15:57:20 +0000 Subject: [PATCH 013/431] Minor improvement to type handing on failures --- src/types.cpp | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/types.cpp b/src/types.cpp index 4b43662f5..233f903a3 100644 --- a/src/types.cpp +++ b/src/types.cpp @@ -3888,6 +3888,10 @@ gb_internal i64 *type_set_offsets_of(Slice const &fields, bool is_pack min_field_align = 1; } + TypePath path{}; + type_path_init(&path); + defer (type_path_free(&path)); + if (is_raw_union) { for_array(i, fields) { offsets[i] = 0; @@ -3897,7 +3901,7 @@ gb_internal i64 *type_set_offsets_of(Slice const &fields, bool is_pack if (fields[i]->kind != Entity_Variable) { offsets[i] = -1; } else { - i64 size = type_size_of(fields[i]->type); + i64 size = type_size_of_internal(fields[i]->type, &path); offsets[i] = curr_offset; curr_offset += size; } @@ -3908,11 +3912,11 @@ gb_internal i64 *type_set_offsets_of(Slice const &fields, bool is_pack offsets[i] = -1; } else { Type *t = fields[i]->type; - i64 align = gb_max(type_align_of(t), min_field_align); + i64 align = gb_max(type_align_of_internal(t, &path), min_field_align); if (max_field_align > min_field_align) { align = gb_min(align, max_field_align); } - i64 size = gb_max(type_size_of( t), 0); + i64 size = gb_max(type_size_of_internal(t, &path), 0); curr_offset = align_formula(curr_offset, align); offsets[i] = curr_offset; curr_offset += size; @@ -3925,15 +3929,13 @@ gb_internal i64 *type_set_offsets_of(Slice const &fields, bool is_pack gb_internal bool type_set_offsets(Type *t) { t = base_type(t); if (t->kind == Type_Struct) { - if (mutex_try_lock(&t->Struct.offset_mutex)) { - defer (mutex_unlock(&t->Struct.offset_mutex)); - if (!t->Struct.are_offsets_set) { - t->Struct.are_offsets_being_processed = true; - t->Struct.offsets = type_set_offsets_of(t->Struct.fields, t->Struct.is_packed, t->Struct.is_raw_union, t->Struct.custom_min_field_align, t->Struct.custom_max_field_align); - t->Struct.are_offsets_being_processed = false; - t->Struct.are_offsets_set = true; - return true; - } + MUTEX_GUARD(&t->Struct.offset_mutex); + if (!t->Struct.are_offsets_set) { + t->Struct.are_offsets_being_processed = true; + t->Struct.offsets = type_set_offsets_of(t->Struct.fields, t->Struct.is_packed, t->Struct.is_raw_union, t->Struct.custom_min_field_align, t->Struct.custom_max_field_align); + t->Struct.are_offsets_being_processed = false; + t->Struct.are_offsets_set = true; + return true; } } else if (is_type_tuple(t)) { MUTEX_GUARD(&t->Tuple.mutex); From 08f14db8e8d1489599c1cdb7ffee3d88420457cb Mon Sep 17 00:00:00 2001 From: wrapperup Date: Mon, 2 Dec 2024 17:48:32 -0500 Subject: [PATCH 014/431] regenerate vulkan vendor bindings (1.4.303) --- .../vulkan/_gen/create_vulkan_odin_wrapper.py | 15 +- vendor/vulkan/_gen/vulkan_core.h | 2308 +++++++++++------ .../vulkan/_gen/vulkan_video_codec_av1std.h | 4 +- .../_gen/vulkan_video_codec_av1std_encode.h | 143 + vendor/vulkan/core.odin | 32 +- vendor/vulkan/enums.odin | 678 +++-- vendor/vulkan/procedures.odin | 906 ++++--- vendor/vulkan/structs.odin | 1692 +++++++----- 8 files changed, 3841 insertions(+), 1937 deletions(-) create mode 100644 vendor/vulkan/_gen/vulkan_video_codec_av1std_encode.h diff --git a/vendor/vulkan/_gen/create_vulkan_odin_wrapper.py b/vendor/vulkan/_gen/create_vulkan_odin_wrapper.py index 87b221457..83c021b16 100644 --- a/vendor/vulkan/_gen/create_vulkan_odin_wrapper.py +++ b/vendor/vulkan/_gen/create_vulkan_odin_wrapper.py @@ -17,13 +17,14 @@ file_and_urls = [ ("vulkan_ios.h", 'https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/main/include/vulkan/vulkan_ios.h', False), ("vulkan_wayland.h", 'https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/main/include/vulkan/vulkan_wayland.h', False), # Vulkan Video - ("vulkan_video_codec_av1std.h", 'https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/main/include/vk_video/vulkan_video_codec_av1std.h', False), - ("vulkan_video_codec_h264std.h", 'https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/main/include/vk_video/vulkan_video_codec_h264std.h', False), - ("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_av1std_decode.h", 'https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/main/include/vk_video/vulkan_video_codec_av1std_decode.h', False), + ("vulkan_video_codec_av1std.h", 'https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/main/include/vk_video/vulkan_video_codec_av1std.h', False), + ("vulkan_video_codec_av1std_decode.h", 'https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/main/include/vk_video/vulkan_video_codec_av1std_decode.h', False), + ("vulkan_video_codec_av1std_encode.h", 'https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/main/include/vk_video/vulkan_video_codec_av1std_encode.h', False), + ("vulkan_video_codec_h264std.h", 'https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/main/include/vk_video/vulkan_video_codec_h264std.h', False), ("vulkan_video_codec_h264std_decode.h", 'https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/main/include/vk_video/vulkan_video_codec_h264std_decode.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_h264std_encode.h", 'https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/main/include/vk_video/vulkan_video_codec_h264std_encode.h', False), + ("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), ] @@ -801,6 +802,7 @@ API_VERSION_1_0 :: (1<<22) | (0<<12) | (0) API_VERSION_1_1 :: (1<<22) | (1<<12) | (0) API_VERSION_1_2 :: (1<<22) | (2<<12) | (0) API_VERSION_1_3 :: (1<<22) | (3<<12) | (0) +API_VERSION_1_4 :: (1<<22) | (4<<12) | (0) MAKE_VERSION :: proc(major, minor, patch: u32) -> u32 { \treturn (major<<22) | (minor<<12) | (patch) @@ -842,7 +844,8 @@ MAX_DEVICE_GROUP_SIZE :: 32 LUID_SIZE_KHX :: 8 LUID_SIZE :: 8 MAX_QUEUE_FAMILY_EXTERNAL :: ~u32(1) -MAX_GLOBAL_PRIORITY_SIZE_EXT :: 16 +MAX_GLOBAL_PRIORITY_SIZE :: 16 +MAX_GLOBAL_PRIORITY_SIZE_EXT :: MAX_GLOBAL_PRIORITY_SIZE QUEUE_FAMILY_EXTERNAL :: MAX_QUEUE_FAMILY_EXTERNAL """[1::]) diff --git a/vendor/vulkan/_gen/vulkan_core.h b/vendor/vulkan/_gen/vulkan_core.h index e6c16498a..4e716da03 100644 --- a/vendor/vulkan/_gen/vulkan_core.h +++ b/vendor/vulkan/_gen/vulkan_core.h @@ -69,10 +69,10 @@ extern "C" { #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 296 +#define VK_HEADER_VERSION 303 // Complete version of this file -#define VK_HEADER_VERSION_COMPLETE VK_MAKE_API_VERSION(0, 1, 3, VK_HEADER_VERSION) +#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. @@ -166,6 +166,7 @@ typedef enum VkResult { VK_ERROR_FRAGMENTATION = -1000161000, VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS = -1000257000, VK_PIPELINE_COMPILE_REQUIRED = 1000297000, + VK_ERROR_NOT_PERMITTED = -1000174001, VK_ERROR_SURFACE_LOST_KHR = -1000000000, VK_ERROR_NATIVE_WINDOW_IN_USE_KHR = -1000000001, VK_SUBOPTIMAL_KHR = 1000001003, @@ -180,7 +181,6 @@ 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_NOT_PERMITTED_KHR = -1000174001, VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT = -1000255000, VK_THREAD_IDLE_KHR = 1000268000, VK_THREAD_DONE_KHR = 1000268001, @@ -194,7 +194,8 @@ typedef enum VkResult { 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, - VK_ERROR_NOT_PERMITTED_EXT = VK_ERROR_NOT_PERMITTED_KHR, + VK_ERROR_NOT_PERMITTED_EXT = VK_ERROR_NOT_PERMITTED, + VK_ERROR_NOT_PERMITTED_KHR = VK_ERROR_NOT_PERMITTED, VK_ERROR_INVALID_DEVICE_ADDRESS_EXT = VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS, VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR = VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS, VK_PIPELINE_COMPILE_REQUIRED_EXT = VK_PIPELINE_COMPILE_REQUIRED, @@ -421,6 +422,56 @@ typedef enum VkStructureType { 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, + VK_STRUCTURE_TYPE_IMAGE_TO_MEMORY_COPY = 1000270003, + VK_STRUCTURE_TYPE_COPY_IMAGE_TO_MEMORY_INFO = 1000270004, + VK_STRUCTURE_TYPE_COPY_MEMORY_TO_IMAGE_INFO = 1000270005, + VK_STRUCTURE_TYPE_HOST_IMAGE_LAYOUT_TRANSITION_INFO = 1000270006, + 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_SWAPCHAIN_CREATE_INFO_KHR = 1000001000, VK_STRUCTURE_TYPE_PRESENT_INFO_KHR = 1000001001, VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHR = 1000060007, @@ -471,6 +522,7 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_CU_MODULE_CREATE_INFO_NVX = 1000029000, VK_STRUCTURE_TYPE_CU_FUNCTION_CREATE_INFO_NVX = 1000029001, VK_STRUCTURE_TYPE_CU_LAUNCH_INFO_NVX = 1000029002, + VK_STRUCTURE_TYPE_CU_MODULE_TEXTURING_MODE_CREATE_INFO_NVX = 1000029004, VK_STRUCTURE_TYPE_IMAGE_VIEW_HANDLE_INFO_NVX = 1000030000, VK_STRUCTURE_TYPE_IMAGE_VIEW_ADDRESS_PROPERTIES_NVX = 1000030001, VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_KHR = 1000038000, @@ -508,10 +560,6 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR = 1000040005, VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_KHR = 1000040006, VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD = 1000041000, - VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR = 1000044006, - VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT = 1000044007, - VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD = 1000044008, - VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX = 1000044009, VK_STRUCTURE_TYPE_STREAM_DESCRIPTOR_SURFACE_CREATE_INFO_GGP = 1000049000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV = 1000050000, VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV = 1000056000, @@ -523,9 +571,6 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_VI_SURFACE_CREATE_INFO_NN = 1000062000, VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT = 1000067000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT = 1000067001, - VK_STRUCTURE_TYPE_PIPELINE_ROBUSTNESS_CREATE_INFO_EXT = 1000068000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES_EXT = 1000068001, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES_EXT = 1000068002, VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR = 1000073000, VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR = 1000073001, VK_STRUCTURE_TYPE_MEMORY_WIN32_HANDLE_PROPERTIES_KHR = 1000073002, @@ -540,7 +585,6 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR = 1000078003, VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR = 1000079000, VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR = 1000079001, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR = 1000080000, VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT = 1000081000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT = 1000081001, VK_STRUCTURE_TYPE_CONDITIONAL_RENDERING_BEGIN_INFO_EXT = 1000081002, @@ -553,6 +597,7 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT = 1000091003, VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE = 1000092000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX = 1000097000, + VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX = 1000044009, VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV = 1000098000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT = 1000099000, VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT = 1000099001, @@ -612,6 +657,7 @@ typedef enum VkStructureType { #ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_NODE_CREATE_INFO_AMDX = 1000134004, #endif + VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD = 1000044008, 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, @@ -690,9 +736,6 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_KHR = 1000187003, VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_KHR = 1000187004, VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_KHR = 1000187005, - VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_KHR = 1000174000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_KHR = 1000388000, - VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_KHR = 1000388001, VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD = 1000189000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT = 1000190000, VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP = 1000191000, @@ -703,6 +746,8 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV = 1000205002, VK_STRUCTURE_TYPE_CHECKPOINT_DATA_NV = 1000206000, 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_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, @@ -718,16 +763,15 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT = 1000218000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT = 1000218001, VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT = 1000218002, + VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT = 1000044007, VK_STRUCTURE_TYPE_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR = 1000226000, VK_STRUCTURE_TYPE_PIPELINE_FRAGMENT_SHADING_RATE_STATE_CREATE_INFO_KHR = 1000226001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR = 1000226002, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR = 1000226003, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_KHR = 1000226004, + 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_DYNAMIC_RENDERING_LOCAL_READ_FEATURES_KHR = 1000232000, - VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_LOCATION_INFO_KHR = 1000232001, - VK_STRUCTURE_TYPE_RENDERING_INPUT_ATTACHMENT_INDEX_INFO_KHR = 1000232002, 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, @@ -762,18 +806,6 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INFO_KHR = 1000269003, VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_STATISTIC_KHR = 1000269004, VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INTERNAL_REPRESENTATION_KHR = 1000269005, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES_EXT = 1000270000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_PROPERTIES_EXT = 1000270001, - VK_STRUCTURE_TYPE_MEMORY_TO_IMAGE_COPY_EXT = 1000270002, - VK_STRUCTURE_TYPE_IMAGE_TO_MEMORY_COPY_EXT = 1000270003, - VK_STRUCTURE_TYPE_COPY_IMAGE_TO_MEMORY_INFO_EXT = 1000270004, - VK_STRUCTURE_TYPE_COPY_MEMORY_TO_IMAGE_INFO_EXT = 1000270005, - VK_STRUCTURE_TYPE_HOST_IMAGE_LAYOUT_TRANSITION_INFO_EXT = 1000270006, - VK_STRUCTURE_TYPE_COPY_IMAGE_TO_IMAGE_INFO_EXT = 1000270007, - VK_STRUCTURE_TYPE_SUBRESOURCE_HOST_MEMCPY_SIZE_EXT = 1000270008, - VK_STRUCTURE_TYPE_HOST_IMAGE_COPY_DEVICE_PERFORMANCE_QUERY_EXT = 1000270009, - VK_STRUCTURE_TYPE_MEMORY_MAP_INFO_KHR = 1000271000, - VK_STRUCTURE_TYPE_MEMORY_UNMAP_INFO_KHR = 1000271001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAP_MEMORY_PLACED_FEATURES_EXT = 1000272000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAP_MEMORY_PLACED_PROPERTIES_EXT = 1000272001, VK_STRUCTURE_TYPE_MEMORY_MAP_PLACED_INFO_EXT = 1000272002, @@ -848,8 +880,6 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_IMPORT_METAL_IO_SURFACE_INFO_EXT = 1000311009, VK_STRUCTURE_TYPE_EXPORT_METAL_SHARED_EVENT_INFO_EXT = 1000311010, VK_STRUCTURE_TYPE_IMPORT_METAL_SHARED_EVENT_INFO_EXT = 1000311011, - VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV = 1000314008, - VK_STRUCTURE_TYPE_CHECKPOINT_DATA_2_NV = 1000314009, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_PROPERTIES_EXT = 1000316000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_DENSITY_MAP_PROPERTIES_EXT = 1000316001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT = 1000316002, @@ -902,6 +932,7 @@ 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, @@ -969,7 +1000,6 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT = 1000411001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT = 1000412000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_ARM = 1000415000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES_KHR = 1000416000, 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, @@ -1025,18 +1055,9 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_OPTICAL_FLOW_EXECUTE_INFO_NV = 1000464005, VK_STRUCTURE_TYPE_OPTICAL_FLOW_SESSION_CREATE_PRIVATE_DATA_INFO_NV = 1000464010, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_DITHERING_FEATURES_EXT = 1000465000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES_EXT = 1000466000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FORMAT_RESOLVE_FEATURES_ANDROID = 1000468000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FORMAT_RESOLVE_PROPERTIES_ANDROID = 1000468001, VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_RESOLVE_PROPERTIES_ANDROID = 1000468002, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES_KHR = 1000470000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES_KHR = 1000470001, - VK_STRUCTURE_TYPE_RENDERING_AREA_INFO_KHR = 1000470003, - VK_STRUCTURE_TYPE_DEVICE_IMAGE_SUBRESOURCE_INFO_KHR = 1000470004, - VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2_KHR = 1000338002, - VK_STRUCTURE_TYPE_IMAGE_SUBRESOURCE_2_KHR = 1000338003, - VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR = 1000470005, - VK_STRUCTURE_TYPE_BUFFER_USAGE_FLAGS_2_CREATE_INFO_KHR = 1000470006, 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, @@ -1093,6 +1114,17 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_PROFILE_INFO_KHR = 1000512003, VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000512004, VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_DPB_SLOT_INFO_KHR = 1000512005, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_CAPABILITIES_KHR = 1000513000, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000513001, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_PICTURE_INFO_KHR = 1000513002, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_DPB_SLOT_INFO_KHR = 1000513003, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_AV1_FEATURES_KHR = 1000513004, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_PROFILE_INFO_KHR = 1000513005, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_RATE_CONTROL_INFO_KHR = 1000513006, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_AV1_RATE_CONTROL_LAYER_INFO_KHR = 1000513007, + 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_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, @@ -1106,32 +1138,28 @@ 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_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_KHR = 1000525000, - VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_KHR = 1000190001, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR = 1000190002, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT_CONTROLS_2_FEATURES_KHR = 1000528000, 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, VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_QNX = 1000529003, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_SCREEN_BUFFER_FEATURES_QNX = 1000529004, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LAYERED_DRIVER_PROPERTIES_MSFT = 1000530000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_KHR = 1000265000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_KHR = 1000259000, - VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_KHR = 1000259001, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_KHR = 1000259002, VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_KHR = 1000184000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES_KHR = 1000544000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_FEATURES_KHR = 1000545000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_PROPERTIES_KHR = 1000545001, - VK_STRUCTURE_TYPE_BIND_MEMORY_STATUS_KHR = 1000545002, - VK_STRUCTURE_TYPE_BIND_DESCRIPTOR_SETS_INFO_KHR = 1000545003, - VK_STRUCTURE_TYPE_PUSH_CONSTANTS_INFO_KHR = 1000545004, - VK_STRUCTURE_TYPE_PUSH_DESCRIPTOR_SET_INFO_KHR = 1000545005, - VK_STRUCTURE_TYPE_PUSH_DESCRIPTOR_SET_WITH_TEMPLATE_INFO_KHR = 1000545006, 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_DISPLAY_SURFACE_STEREO_CREATE_INFO_NV = 1000551000, + VK_STRUCTURE_TYPE_DISPLAY_MODE_STEREO_PROPERTIES_NV = 1000551001, + 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, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUANTIZATION_MAP_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000553005, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_QUANTIZATION_MAP_FEATURES_KHR = 1000553009, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_QUANTIZATION_MAP_CAPABILITIES_KHR = 1000553003, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_QUANTIZATION_MAP_CAPABILITIES_KHR = 1000553004, + VK_STRUCTURE_TYPE_VIDEO_FORMAT_H265_QUANTIZATION_MAP_PROPERTIES_KHR = 1000553006, + 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_PHYSICAL_DEVICE_SHADER_RELAXED_EXTENDED_INSTRUCTION_FEATURES_KHR = 1000558000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMMAND_BUFFER_INHERITANCE_FEATURES_NV = 1000559000, @@ -1162,6 +1190,12 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_IMAGE_ALIGNMENT_CONTROL_CREATE_INFO_MESA = 1000575002, 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_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_VERTEX_ATTRIBUTE_ROBUSTNESS_FEATURES_EXT = 1000608000, 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 @@ -1171,7 +1205,6 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES, VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO_KHR = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDERING_INFO, - VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_NV = VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD, VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, @@ -1192,6 +1225,9 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO_KHR = VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO, VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO_KHR = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES, + VK_STRUCTURE_TYPE_PIPELINE_ROBUSTNESS_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_PIPELINE_ROBUSTNESS_CREATE_INFO, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES, VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO, @@ -1205,6 +1241,7 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO, VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES_KHR = VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES, VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES, 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, @@ -1245,6 +1282,7 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2, VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2_KHR = VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2, VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO, + VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_NV = VK_STRUCTURE_TYPE_ATTACHMENT_SAMPLE_COUNT_INFO_AMD, VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO, VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO_KHR = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO, VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO_KHR = VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO, @@ -1260,13 +1298,16 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES, VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT_KHR = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT, - VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_KHR, + VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES, VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT = VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_KHR, - VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_KHR, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR, + VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES, + VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_KHR = VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES, + VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES, VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES, @@ -1288,6 +1329,9 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES, VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_LOCAL_READ_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_LOCAL_READ_FEATURES, + VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_LOCATION_INFO_KHR = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_LOCATION_INFO, + VK_STRUCTURE_TYPE_RENDERING_INPUT_ATTACHMENT_INDEX_INFO_KHR = VK_STRUCTURE_TYPE_RENDERING_INPUT_ATTACHMENT_INDEX_INFO, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES, VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT_KHR = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT, VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT_KHR = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT, @@ -1301,11 +1345,23 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO, VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO_KHR = VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO, VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO_KHR = VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_KHR, - VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_KHR, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES, + VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_KHR, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_PROPERTIES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_PROPERTIES, + VK_STRUCTURE_TYPE_MEMORY_TO_IMAGE_COPY_EXT = VK_STRUCTURE_TYPE_MEMORY_TO_IMAGE_COPY, + VK_STRUCTURE_TYPE_IMAGE_TO_MEMORY_COPY_EXT = VK_STRUCTURE_TYPE_IMAGE_TO_MEMORY_COPY, + VK_STRUCTURE_TYPE_COPY_IMAGE_TO_MEMORY_INFO_EXT = VK_STRUCTURE_TYPE_COPY_IMAGE_TO_MEMORY_INFO, + VK_STRUCTURE_TYPE_COPY_MEMORY_TO_IMAGE_INFO_EXT = VK_STRUCTURE_TYPE_COPY_MEMORY_TO_IMAGE_INFO, + VK_STRUCTURE_TYPE_HOST_IMAGE_LAYOUT_TRANSITION_INFO_EXT = VK_STRUCTURE_TYPE_HOST_IMAGE_LAYOUT_TRANSITION_INFO, + VK_STRUCTURE_TYPE_COPY_IMAGE_TO_IMAGE_INFO_EXT = VK_STRUCTURE_TYPE_COPY_IMAGE_TO_IMAGE_INFO, + VK_STRUCTURE_TYPE_SUBRESOURCE_HOST_MEMCPY_SIZE_EXT = VK_STRUCTURE_TYPE_SUBRESOURCE_HOST_MEMCPY_SIZE, + 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_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, @@ -1335,20 +1391,46 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_IMAGE_BLIT_2_KHR = VK_STRUCTURE_TYPE_IMAGE_BLIT_2, VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR = VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2, VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR = VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2, - VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2_EXT = VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2_KHR, - VK_STRUCTURE_TYPE_IMAGE_SUBRESOURCE_2_EXT = VK_STRUCTURE_TYPE_IMAGE_SUBRESOURCE_2_KHR, + VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2_EXT = VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2, + VK_STRUCTURE_TYPE_IMAGE_SUBRESOURCE_2_EXT = VK_STRUCTURE_TYPE_IMAGE_SUBRESOURCE_2, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_ARM = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT, 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_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_KHR, - VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT = VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_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, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES, VK_STRUCTURE_TYPE_DEVICE_BUFFER_MEMORY_REQUIREMENTS_KHR = VK_STRUCTURE_TYPE_DEVICE_BUFFER_MEMORY_REQUIREMENTS, 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_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, + VK_STRUCTURE_TYPE_RENDERING_AREA_INFO_KHR = VK_STRUCTURE_TYPE_RENDERING_AREA_INFO, + VK_STRUCTURE_TYPE_DEVICE_IMAGE_SUBRESOURCE_INFO_KHR = VK_STRUCTURE_TYPE_DEVICE_IMAGE_SUBRESOURCE_INFO, + VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2_KHR = VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2, + VK_STRUCTURE_TYPE_IMAGE_SUBRESOURCE_2_KHR = VK_STRUCTURE_TYPE_IMAGE_SUBRESOURCE_2, + VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO, + VK_STRUCTURE_TYPE_BUFFER_USAGE_FLAGS_2_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_BUFFER_USAGE_FLAGS_2_CREATE_INFO, VK_STRUCTURE_TYPE_SHADER_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES, + VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT_CONTROLS_2_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT_CONTROLS_2_FEATURES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES, + VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_FEATURES, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_PROPERTIES, + VK_STRUCTURE_TYPE_BIND_MEMORY_STATUS_KHR = VK_STRUCTURE_TYPE_BIND_MEMORY_STATUS, + VK_STRUCTURE_TYPE_BIND_DESCRIPTOR_SETS_INFO_KHR = VK_STRUCTURE_TYPE_BIND_DESCRIPTOR_SETS_INFO, + 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_MAX_ENUM = 0x7FFFFFFF } VkStructureType; @@ -1375,6 +1457,7 @@ typedef enum VkImageLayout { 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, @@ -1382,14 +1465,15 @@ typedef enum VkImageLayout { 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_RENDERING_LOCAL_READ_KHR = 1000232000, 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, @@ -1726,6 +1810,8 @@ typedef enum VkFormat { VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK = 1000066011, VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK = 1000066012, VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK = 1000066013, + VK_FORMAT_A1B5G5R5_UNORM_PACK16 = 1000470000, + VK_FORMAT_A8_UNORM = 1000470001, VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG = 1000054000, VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG = 1000054001, VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG = 1000054002, @@ -1735,8 +1821,6 @@ typedef enum VkFormat { VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG = 1000054006, VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG = 1000054007, VK_FORMAT_R16G16_SFIXED5_NV = 1000464000, - VK_FORMAT_A1B5G5R5_UNORM_PACK16_KHR = 1000470000, - VK_FORMAT_A8_UNORM_KHR = 1000470001, 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, @@ -1793,6 +1877,8 @@ typedef enum VkFormat { 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 = 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, VK_FORMAT_MAX_ENUM = 0x7FFFFFFF } VkFormat; @@ -1983,6 +2069,7 @@ typedef enum VkDynamicState { VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE = 1000377001, VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE = 1000377002, VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE = 1000377004, + VK_DYNAMIC_STATE_LINE_STIPPLE = 1000259000, VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV = 1000087000, VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT = 1000099000, VK_DYNAMIC_STATE_DISCARD_RECTANGLE_ENABLE_EXT = 1000099001, @@ -2030,9 +2117,8 @@ typedef enum VkDynamicState { VK_DYNAMIC_STATE_REPRESENTATIVE_FRAGMENT_TEST_ENABLE_NV = 1000455031, VK_DYNAMIC_STATE_COVERAGE_REDUCTION_MODE_NV = 1000455032, VK_DYNAMIC_STATE_ATTACHMENT_FEEDBACK_LOOP_ENABLE_EXT = 1000524000, - VK_DYNAMIC_STATE_LINE_STIPPLE_KHR = 1000259000, VK_DYNAMIC_STATE_DEPTH_CLAMP_RANGE_EXT = 1000582000, - VK_DYNAMIC_STATE_LINE_STIPPLE_EXT = VK_DYNAMIC_STATE_LINE_STIPPLE_KHR, + VK_DYNAMIC_STATE_LINE_STIPPLE_EXT = VK_DYNAMIC_STATE_LINE_STIPPLE, VK_DYNAMIC_STATE_CULL_MODE_EXT = VK_DYNAMIC_STATE_CULL_MODE, VK_DYNAMIC_STATE_FRONT_FACE_EXT = VK_DYNAMIC_STATE_FRONT_FACE, VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT = VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY, @@ -2048,6 +2134,7 @@ typedef enum VkDynamicState { VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE_EXT = VK_DYNAMIC_STATE_RASTERIZER_DISCARD_ENABLE, VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE_EXT = VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE, VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE_EXT = VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE, + VK_DYNAMIC_STATE_LINE_STIPPLE_KHR = VK_DYNAMIC_STATE_LINE_STIPPLE, VK_DYNAMIC_STATE_MAX_ENUM = 0x7FFFFFFF } VkDynamicState; @@ -2182,8 +2269,9 @@ typedef enum VkAttachmentLoadOp { VK_ATTACHMENT_LOAD_OP_LOAD = 0, VK_ATTACHMENT_LOAD_OP_CLEAR = 1, VK_ATTACHMENT_LOAD_OP_DONT_CARE = 2, - VK_ATTACHMENT_LOAD_OP_NONE_KHR = 1000400000, - VK_ATTACHMENT_LOAD_OP_NONE_EXT = VK_ATTACHMENT_LOAD_OP_NONE_KHR, + VK_ATTACHMENT_LOAD_OP_NONE = 1000400000, + VK_ATTACHMENT_LOAD_OP_NONE_EXT = VK_ATTACHMENT_LOAD_OP_NONE, + VK_ATTACHMENT_LOAD_OP_NONE_KHR = VK_ATTACHMENT_LOAD_OP_NONE, VK_ATTACHMENT_LOAD_OP_MAX_ENUM = 0x7FFFFFFF } VkAttachmentLoadOp; @@ -2218,10 +2306,11 @@ typedef enum 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_UINT8_KHR = 1000265000, VK_INDEX_TYPE_NONE_NV = VK_INDEX_TYPE_NONE_KHR, - VK_INDEX_TYPE_UINT8_EXT = VK_INDEX_TYPE_UINT8_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; @@ -2393,12 +2482,12 @@ typedef enum VkImageUsageFlagBits { VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT = 0x00000020, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT = 0x00000040, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT = 0x00000080, + VK_IMAGE_USAGE_HOST_TRANSFER_BIT = 0x00400000, VK_IMAGE_USAGE_VIDEO_DECODE_DST_BIT_KHR = 0x00000400, VK_IMAGE_USAGE_VIDEO_DECODE_SRC_BIT_KHR = 0x00000800, VK_IMAGE_USAGE_VIDEO_DECODE_DPB_BIT_KHR = 0x00001000, VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT = 0x00000200, VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x00000100, - VK_IMAGE_USAGE_HOST_TRANSFER_BIT_EXT = 0x00400000, VK_IMAGE_USAGE_VIDEO_ENCODE_DST_BIT_KHR = 0x00002000, VK_IMAGE_USAGE_VIDEO_ENCODE_SRC_BIT_KHR = 0x00004000, VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR = 0x00008000, @@ -2406,7 +2495,10 @@ 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_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, + VK_IMAGE_USAGE_HOST_TRANSFER_BIT_EXT = VK_IMAGE_USAGE_HOST_TRANSFER_BIT, VK_IMAGE_USAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkImageUsageFlagBits; typedef VkFlags VkImageUsageFlags; @@ -2646,8 +2738,8 @@ typedef enum VkPipelineCreateFlagBits { VK_PIPELINE_CREATE_DISPATCH_BASE_BIT = 0x00000010, VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT = 0x00000100, VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT = 0x00000200, - VK_PIPELINE_CREATE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x00200000, - VK_PIPELINE_CREATE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT = 0x00400000, + VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BIT = 0x08000000, + VK_PIPELINE_CREATE_PROTECTED_ACCESS_ONLY_BIT = 0x40000000, VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR = 0x00004000, VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR = 0x00008000, VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR = 0x00010000, @@ -2656,6 +2748,8 @@ typedef enum VkPipelineCreateFlagBits { VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR = 0x00002000, VK_PIPELINE_CREATE_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR = 0x00080000, VK_PIPELINE_CREATE_DEFER_COMPILE_BIT_NV = 0x00000020, + VK_PIPELINE_CREATE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT = 0x00400000, + VK_PIPELINE_CREATE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x00200000, VK_PIPELINE_CREATE_CAPTURE_STATISTICS_BIT_KHR = 0x00000040, VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR = 0x00000080, VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV = 0x00040000, @@ -2670,17 +2764,17 @@ typedef enum VkPipelineCreateFlagBits { #ifdef VK_ENABLE_BETA_EXTENSIONS VK_PIPELINE_CREATE_RAY_TRACING_DISPLACEMENT_MICROMAP_BIT_NV = 0x10000000, #endif - VK_PIPELINE_CREATE_NO_PROTECTED_ACCESS_BIT_EXT = 0x08000000, - VK_PIPELINE_CREATE_PROTECTED_ACCESS_ONLY_BIT_EXT = 0x40000000, VK_PIPELINE_CREATE_DISPATCH_BASE = VK_PIPELINE_CREATE_DISPATCH_BASE_BIT, - // 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 = VK_PIPELINE_CREATE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR, - // VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT is a deprecated alias - VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT = VK_PIPELINE_CREATE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT, 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_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 = 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_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; @@ -2788,12 +2882,13 @@ typedef VkFlags VkDescriptorPoolResetFlags; typedef enum VkDescriptorSetLayoutCreateFlagBits { VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT = 0x00000002, - VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR = 0x00000001, + VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT = 0x00000001, VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT = 0x00000010, VK_DESCRIPTOR_SET_LAYOUT_CREATE_EMBEDDED_IMMUTABLE_SAMPLERS_BIT_EXT = 0x00000020, VK_DESCRIPTOR_SET_LAYOUT_CREATE_INDIRECT_BINDABLE_BIT_NV = 0x00000080, VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_EXT = 0x00000004, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PER_STAGE_BIT_NV = 0x00000040, + VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR = VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT, VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT, VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE = VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_EXT, VK_DESCRIPTOR_SET_LAYOUT_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF @@ -5011,7 +5106,8 @@ typedef enum VkChromaLocation { typedef enum VkDescriptorUpdateTemplateType { VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET = 0, - VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR = 1, + 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; @@ -5025,9 +5121,11 @@ typedef enum VkSubgroupFeatureFlagBits { VK_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT = 0x00000020, VK_SUBGROUP_FEATURE_CLUSTERED_BIT = 0x00000040, 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_ROTATE_BIT_KHR = 0x00000200, - VK_SUBGROUP_FEATURE_ROTATE_CLUSTERED_BIT_KHR = 0x00000400, + 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 } VkSubgroupFeatureFlagBits; typedef VkFlags VkSubgroupFeatureFlags; @@ -6621,59 +6719,59 @@ typedef VkFlags64 VkPipelineStageFlags2; // Flag bits for VkPipelineStageFlagBits2 typedef VkFlags64 VkPipelineStageFlagBits2; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_NONE = 0ULL; -static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_NONE_KHR = 0ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT = 0x00000001ULL; -static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT_KHR = 0x00000001ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT = 0x00000002ULL; -static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT_KHR = 0x00000002ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT = 0x00000004ULL; -static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT_KHR = 0x00000004ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT = 0x00000008ULL; -static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT_KHR = 0x00000008ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT = 0x00000010ULL; -static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT_KHR = 0x00000010ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT = 0x00000020ULL; -static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT_KHR = 0x00000020ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT = 0x00000040ULL; -static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT_KHR = 0x00000040ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT = 0x00000080ULL; -static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT_KHR = 0x00000080ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT = 0x00000100ULL; -static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT_KHR = 0x00000100ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT = 0x00000200ULL; -static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT_KHR = 0x00000200ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT = 0x00000400ULL; -static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT_KHR = 0x00000400ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT = 0x00000800ULL; -static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT_KHR = 0x00000800ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT = 0x00001000ULL; -static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT_KHR = 0x00001000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TRANSFER_BIT = 0x00001000ULL; -static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TRANSFER_BIT_KHR = 0x00001000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT = 0x00002000ULL; -static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT_KHR = 0x00002000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_HOST_BIT = 0x00004000ULL; -static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_HOST_BIT_KHR = 0x00004000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT = 0x00008000ULL; -static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR = 0x00008000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT = 0x00010000ULL; -static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR = 0x00010000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_COPY_BIT = 0x100000000ULL; -static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_COPY_BIT_KHR = 0x100000000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_RESOLVE_BIT = 0x200000000ULL; -static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_RESOLVE_BIT_KHR = 0x200000000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_BLIT_BIT = 0x400000000ULL; -static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_BLIT_BIT_KHR = 0x400000000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_CLEAR_BIT = 0x800000000ULL; -static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_CLEAR_BIT_KHR = 0x800000000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT = 0x1000000000ULL; -static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT_KHR = 0x1000000000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT = 0x2000000000ULL; -static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT_KHR = 0x2000000000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_PRE_RASTERIZATION_SHADERS_BIT = 0x4000000000ULL; -static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_PRE_RASTERIZATION_SHADERS_BIT_KHR = 0x4000000000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VIDEO_DECODE_BIT_KHR = 0x04000000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VIDEO_ENCODE_BIT_KHR = 0x08000000ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_NONE_KHR = 0ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TOP_OF_PIPE_BIT_KHR = 0x00000001ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_DRAW_INDIRECT_BIT_KHR = 0x00000002ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VERTEX_INPUT_BIT_KHR = 0x00000004ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VERTEX_SHADER_BIT_KHR = 0x00000008ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BIT_KHR = 0x00000010ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT_KHR = 0x00000020ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT_KHR = 0x00000040ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT_KHR = 0x00000080ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_EARLY_FRAGMENT_TESTS_BIT_KHR = 0x00000100ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT_KHR = 0x00000200ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT_KHR = 0x00000400ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT_KHR = 0x00000800ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ALL_TRANSFER_BIT_KHR = 0x00001000ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TRANSFER_BIT_KHR = 0x00001000ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT_KHR = 0x00002000ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_HOST_BIT_KHR = 0x00004000ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT_KHR = 0x00008000ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT_KHR = 0x00010000ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_COPY_BIT_KHR = 0x100000000ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_RESOLVE_BIT_KHR = 0x200000000ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_BLIT_BIT_KHR = 0x400000000ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_CLEAR_BIT_KHR = 0x800000000ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_INDEX_INPUT_BIT_KHR = 0x1000000000ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_VERTEX_ATTRIBUTE_INPUT_BIT_KHR = 0x2000000000ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_PRE_RASTERIZATION_SHADERS_BIT_KHR = 0x4000000000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT = 0x01000000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT = 0x00040000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_COMMAND_PREPROCESS_BIT_NV = 0x00020000ULL; @@ -6703,51 +6801,51 @@ typedef VkFlags64 VkAccessFlags2; // Flag bits for VkAccessFlagBits2 typedef VkFlags64 VkAccessFlagBits2; static const VkAccessFlagBits2 VK_ACCESS_2_NONE = 0ULL; -static const VkAccessFlagBits2 VK_ACCESS_2_NONE_KHR = 0ULL; static const VkAccessFlagBits2 VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT = 0x00000001ULL; -static const VkAccessFlagBits2 VK_ACCESS_2_INDIRECT_COMMAND_READ_BIT_KHR = 0x00000001ULL; static const VkAccessFlagBits2 VK_ACCESS_2_INDEX_READ_BIT = 0x00000002ULL; -static const VkAccessFlagBits2 VK_ACCESS_2_INDEX_READ_BIT_KHR = 0x00000002ULL; static const VkAccessFlagBits2 VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT = 0x00000004ULL; -static const VkAccessFlagBits2 VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT_KHR = 0x00000004ULL; static const VkAccessFlagBits2 VK_ACCESS_2_UNIFORM_READ_BIT = 0x00000008ULL; -static const VkAccessFlagBits2 VK_ACCESS_2_UNIFORM_READ_BIT_KHR = 0x00000008ULL; static const VkAccessFlagBits2 VK_ACCESS_2_INPUT_ATTACHMENT_READ_BIT = 0x00000010ULL; -static const VkAccessFlagBits2 VK_ACCESS_2_INPUT_ATTACHMENT_READ_BIT_KHR = 0x00000010ULL; static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_READ_BIT = 0x00000020ULL; -static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_READ_BIT_KHR = 0x00000020ULL; static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_WRITE_BIT = 0x00000040ULL; -static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_WRITE_BIT_KHR = 0x00000040ULL; static const VkAccessFlagBits2 VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT = 0x00000080ULL; -static const VkAccessFlagBits2 VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT_KHR = 0x00000080ULL; static const VkAccessFlagBits2 VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT = 0x00000100ULL; -static const VkAccessFlagBits2 VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT_KHR = 0x00000100ULL; static const VkAccessFlagBits2 VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BIT = 0x00000200ULL; -static const VkAccessFlagBits2 VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BIT_KHR = 0x00000200ULL; static const VkAccessFlagBits2 VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT = 0x00000400ULL; -static const VkAccessFlagBits2 VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT_KHR = 0x00000400ULL; static const VkAccessFlagBits2 VK_ACCESS_2_TRANSFER_READ_BIT = 0x00000800ULL; -static const VkAccessFlagBits2 VK_ACCESS_2_TRANSFER_READ_BIT_KHR = 0x00000800ULL; static const VkAccessFlagBits2 VK_ACCESS_2_TRANSFER_WRITE_BIT = 0x00001000ULL; -static const VkAccessFlagBits2 VK_ACCESS_2_TRANSFER_WRITE_BIT_KHR = 0x00001000ULL; static const VkAccessFlagBits2 VK_ACCESS_2_HOST_READ_BIT = 0x00002000ULL; -static const VkAccessFlagBits2 VK_ACCESS_2_HOST_READ_BIT_KHR = 0x00002000ULL; static const VkAccessFlagBits2 VK_ACCESS_2_HOST_WRITE_BIT = 0x00004000ULL; -static const VkAccessFlagBits2 VK_ACCESS_2_HOST_WRITE_BIT_KHR = 0x00004000ULL; static const VkAccessFlagBits2 VK_ACCESS_2_MEMORY_READ_BIT = 0x00008000ULL; -static const VkAccessFlagBits2 VK_ACCESS_2_MEMORY_READ_BIT_KHR = 0x00008000ULL; static const VkAccessFlagBits2 VK_ACCESS_2_MEMORY_WRITE_BIT = 0x00010000ULL; -static const VkAccessFlagBits2 VK_ACCESS_2_MEMORY_WRITE_BIT_KHR = 0x00010000ULL; static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_SAMPLED_READ_BIT = 0x100000000ULL; -static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_SAMPLED_READ_BIT_KHR = 0x100000000ULL; static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_STORAGE_READ_BIT = 0x200000000ULL; -static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_STORAGE_READ_BIT_KHR = 0x200000000ULL; static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT = 0x400000000ULL; -static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT_KHR = 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_VIDEO_ENCODE_READ_BIT_KHR = 0x2000000000ULL; static const VkAccessFlagBits2 VK_ACCESS_2_VIDEO_ENCODE_WRITE_BIT_KHR = 0x4000000000ULL; +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; +static const VkAccessFlagBits2 VK_ACCESS_2_VERTEX_ATTRIBUTE_READ_BIT_KHR = 0x00000004ULL; +static const VkAccessFlagBits2 VK_ACCESS_2_UNIFORM_READ_BIT_KHR = 0x00000008ULL; +static const VkAccessFlagBits2 VK_ACCESS_2_INPUT_ATTACHMENT_READ_BIT_KHR = 0x00000010ULL; +static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_READ_BIT_KHR = 0x00000020ULL; +static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_WRITE_BIT_KHR = 0x00000040ULL; +static const VkAccessFlagBits2 VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT_KHR = 0x00000080ULL; +static const VkAccessFlagBits2 VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT_KHR = 0x00000100ULL; +static const VkAccessFlagBits2 VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_READ_BIT_KHR = 0x00000200ULL; +static const VkAccessFlagBits2 VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT_KHR = 0x00000400ULL; +static const VkAccessFlagBits2 VK_ACCESS_2_TRANSFER_READ_BIT_KHR = 0x00000800ULL; +static const VkAccessFlagBits2 VK_ACCESS_2_TRANSFER_WRITE_BIT_KHR = 0x00001000ULL; +static const VkAccessFlagBits2 VK_ACCESS_2_HOST_READ_BIT_KHR = 0x00002000ULL; +static const VkAccessFlagBits2 VK_ACCESS_2_HOST_WRITE_BIT_KHR = 0x00004000ULL; +static const VkAccessFlagBits2 VK_ACCESS_2_MEMORY_READ_BIT_KHR = 0x00008000ULL; +static const VkAccessFlagBits2 VK_ACCESS_2_MEMORY_WRITE_BIT_KHR = 0x00010000ULL; +static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_SAMPLED_READ_BIT_KHR = 0x100000000ULL; +static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_STORAGE_READ_BIT_KHR = 0x200000000ULL; +static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_STORAGE_WRITE_BIT_KHR = 0x400000000ULL; static const VkAccessFlagBits2 VK_ACCESS_2_TRANSFORM_FEEDBACK_WRITE_BIT_EXT = 0x02000000ULL; static const VkAccessFlagBits2 VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT = 0x04000000ULL; static const VkAccessFlagBits2 VK_ACCESS_2_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT = 0x08000000ULL; @@ -6798,59 +6896,33 @@ typedef VkFlags64 VkFormatFeatureFlags2; // Flag bits for VkFormatFeatureFlagBits2 typedef VkFlags64 VkFormatFeatureFlagBits2; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT = 0x00000001ULL; -static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_BIT_KHR = 0x00000001ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT = 0x00000002ULL; -static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_IMAGE_BIT_KHR = 0x00000002ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_IMAGE_ATOMIC_BIT = 0x00000004ULL; -static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_IMAGE_ATOMIC_BIT_KHR = 0x00000004ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_UNIFORM_TEXEL_BUFFER_BIT = 0x00000008ULL; -static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_UNIFORM_TEXEL_BUFFER_BIT_KHR = 0x00000008ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_BIT = 0x00000010ULL; -static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_BIT_KHR = 0x00000010ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_ATOMIC_BIT = 0x00000020ULL; -static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_ATOMIC_BIT_KHR = 0x00000020ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_VERTEX_BUFFER_BIT = 0x00000040ULL; -static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_VERTEX_BUFFER_BIT_KHR = 0x00000040ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT = 0x00000080ULL; -static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT_KHR = 0x00000080ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BLEND_BIT = 0x00000100ULL; -static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BLEND_BIT_KHR = 0x00000100ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT = 0x00000200ULL; -static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT_KHR = 0x00000200ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_BLIT_SRC_BIT = 0x00000400ULL; -static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_BLIT_SRC_BIT_KHR = 0x00000400ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_BLIT_DST_BIT = 0x00000800ULL; -static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_BLIT_DST_BIT_KHR = 0x00000800ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_BIT = 0x00001000ULL; -static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_BIT_KHR = 0x00001000ULL; -static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_CUBIC_BIT = 0x00002000ULL; -static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT = 0x00002000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT = 0x00004000ULL; -static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT_KHR = 0x00004000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT = 0x00008000ULL; -static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT_KHR = 0x00008000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT = 0x00010000ULL; -static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT_KHR = 0x00010000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_MIDPOINT_CHROMA_SAMPLES_BIT = 0x00020000ULL; -static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_MIDPOINT_CHROMA_SAMPLES_BIT_KHR = 0x00020000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT = 0x00040000ULL; -static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT_KHR = 0x00040000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT = 0x00080000ULL; -static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT_KHR = 0x00080000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT = 0x00100000ULL; -static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT_KHR = 0x00100000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT = 0x00200000ULL; -static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT_KHR = 0x00200000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_DISJOINT_BIT = 0x00400000ULL; -static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_DISJOINT_BIT_KHR = 0x00400000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_COSITED_CHROMA_SAMPLES_BIT = 0x00800000ULL; -static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_COSITED_CHROMA_SAMPLES_BIT_KHR = 0x00800000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT = 0x80000000ULL; -static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT_KHR = 0x80000000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT = 0x100000000ULL; -static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT_KHR = 0x100000000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT = 0x200000000ULL; -static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT_KHR = 0x200000000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_CUBIC_BIT = 0x00002000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_HOST_IMAGE_TRANSFER_BIT = 0x400000000000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_VIDEO_DECODE_OUTPUT_BIT_KHR = 0x02000000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_VIDEO_DECODE_DPB_BIT_KHR = 0x04000000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR = 0x20000000ULL; @@ -6859,6 +6931,33 @@ 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_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; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_UNIFORM_TEXEL_BUFFER_BIT_KHR = 0x00000008ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_BIT_KHR = 0x00000010ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_TEXEL_BUFFER_ATOMIC_BIT_KHR = 0x00000020ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_VERTEX_BUFFER_BIT_KHR = 0x00000040ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT_KHR = 0x00000080ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BLEND_BIT_KHR = 0x00000100ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT_KHR = 0x00000200ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_BLIT_SRC_BIT_KHR = 0x00000400ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_BLIT_DST_BIT_KHR = 0x00000800ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_LINEAR_BIT_KHR = 0x00001000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_TRANSFER_SRC_BIT_KHR = 0x00004000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_TRANSFER_DST_BIT_KHR = 0x00008000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_MIDPOINT_CHROMA_SAMPLES_BIT_KHR = 0x00020000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT_KHR = 0x00040000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT_KHR = 0x00080000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT_KHR = 0x00100000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT_KHR = 0x00200000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_DISJOINT_BIT_KHR = 0x00400000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_COSITED_CHROMA_SAMPLES_BIT_KHR = 0x00800000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_READ_WITHOUT_FORMAT_BIT_KHR = 0x80000000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_STORAGE_WRITE_WITHOUT_FORMAT_BIT_KHR = 0x100000000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_DEPTH_COMPARISON_BIT_KHR = 0x200000000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_MINMAX_BIT_KHR = 0x00010000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT = 0x00002000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_LINEAR_COLOR_ATTACHMENT_BIT_NV = 0x4000000000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_WEIGHT_IMAGE_BIT_QCOM = 0x400000000ULL; static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_WEIGHT_SAMPLED_IMAGE_BIT_QCOM = 0x800000000ULL; @@ -6867,6 +6966,8 @@ static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_BOX_FILTER_SAMPLED_BIT 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_VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR = 0x2000000000000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_VIDEO_ENCODE_EMPHASIS_MAP_BIT_KHR = 0x4000000000000ULL; typedef struct VkPhysicalDeviceVulkan13Features { VkStructureType sType; @@ -7620,6 +7721,731 @@ VKAPI_ATTR void VKAPI_CALL vkGetDeviceImageSparseMemoryRequirements( #endif +// VK_VERSION_1_4 is a preprocessor guard. Do not pass it to API calls. +#define VK_VERSION_1_4 1 +// Vulkan 1.4 version number +#define VK_API_VERSION_1_4 VK_MAKE_API_VERSION(0, 1, 4, 0)// Patch version should always be set to 0 + +#define VK_MAX_GLOBAL_PRIORITY_SIZE 16U + +typedef enum VkPipelineRobustnessBufferBehavior { + VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT = 0, + VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED = 1, + VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS = 2, + VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2 = 3, + VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT_EXT = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT, + VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED_EXT = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED, + VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_EXT = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS, + VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2_EXT = VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2, + VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_MAX_ENUM = 0x7FFFFFFF +} VkPipelineRobustnessBufferBehavior; + +typedef enum VkPipelineRobustnessImageBehavior { + VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DEVICE_DEFAULT = 0, + VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DISABLED = 1, + VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS = 2, + VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2 = 3, + VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DEVICE_DEFAULT_EXT = VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DEVICE_DEFAULT, + VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DISABLED_EXT = VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DISABLED, + VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_EXT = VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS, + VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2_EXT = VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2, + VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_MAX_ENUM = 0x7FFFFFFF +} VkPipelineRobustnessImageBehavior; + +typedef enum VkQueueGlobalPriority { + VK_QUEUE_GLOBAL_PRIORITY_LOW = 128, + VK_QUEUE_GLOBAL_PRIORITY_MEDIUM = 256, + VK_QUEUE_GLOBAL_PRIORITY_HIGH = 512, + VK_QUEUE_GLOBAL_PRIORITY_REALTIME = 1024, + VK_QUEUE_GLOBAL_PRIORITY_LOW_EXT = VK_QUEUE_GLOBAL_PRIORITY_LOW, + VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_EXT = VK_QUEUE_GLOBAL_PRIORITY_MEDIUM, + VK_QUEUE_GLOBAL_PRIORITY_HIGH_EXT = VK_QUEUE_GLOBAL_PRIORITY_HIGH, + VK_QUEUE_GLOBAL_PRIORITY_REALTIME_EXT = VK_QUEUE_GLOBAL_PRIORITY_REALTIME, + VK_QUEUE_GLOBAL_PRIORITY_LOW_KHR = VK_QUEUE_GLOBAL_PRIORITY_LOW, + VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR = VK_QUEUE_GLOBAL_PRIORITY_MEDIUM, + VK_QUEUE_GLOBAL_PRIORITY_HIGH_KHR = VK_QUEUE_GLOBAL_PRIORITY_HIGH, + VK_QUEUE_GLOBAL_PRIORITY_REALTIME_KHR = VK_QUEUE_GLOBAL_PRIORITY_REALTIME, + VK_QUEUE_GLOBAL_PRIORITY_MAX_ENUM = 0x7FFFFFFF +} VkQueueGlobalPriority; + +typedef enum VkLineRasterizationMode { + VK_LINE_RASTERIZATION_MODE_DEFAULT = 0, + VK_LINE_RASTERIZATION_MODE_RECTANGULAR = 1, + VK_LINE_RASTERIZATION_MODE_BRESENHAM = 2, + VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH = 3, + VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT = VK_LINE_RASTERIZATION_MODE_DEFAULT, + VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT = VK_LINE_RASTERIZATION_MODE_RECTANGULAR, + VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT = VK_LINE_RASTERIZATION_MODE_BRESENHAM, + VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT = VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH, + VK_LINE_RASTERIZATION_MODE_DEFAULT_KHR = VK_LINE_RASTERIZATION_MODE_DEFAULT, + VK_LINE_RASTERIZATION_MODE_RECTANGULAR_KHR = VK_LINE_RASTERIZATION_MODE_RECTANGULAR, + VK_LINE_RASTERIZATION_MODE_BRESENHAM_KHR = VK_LINE_RASTERIZATION_MODE_BRESENHAM, + VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_KHR = VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH, + VK_LINE_RASTERIZATION_MODE_MAX_ENUM = 0x7FFFFFFF +} VkLineRasterizationMode; + +typedef enum VkMemoryUnmapFlagBits { + VK_MEMORY_UNMAP_RESERVE_BIT_EXT = 0x00000001, + VK_MEMORY_UNMAP_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkMemoryUnmapFlagBits; +typedef VkFlags VkMemoryUnmapFlags; +typedef VkFlags64 VkPipelineCreateFlags2; + +// Flag bits for VkPipelineCreateFlagBits2 +typedef VkFlags64 VkPipelineCreateFlagBits2; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DISABLE_OPTIMIZATION_BIT = 0x00000001ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_ALLOW_DERIVATIVES_BIT = 0x00000002ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DERIVATIVE_BIT = 0x00000004ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_VIEW_INDEX_FROM_DEVICE_INDEX_BIT = 0x00000008ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DISPATCH_BASE_BIT = 0x00000010ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT = 0x00000100ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_EARLY_RETURN_ON_FAILURE_BIT = 0x00000200ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_NO_PROTECTED_ACCESS_BIT = 0x08000000ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_PROTECTED_ACCESS_ONLY_BIT = 0x40000000ULL; +#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_ENABLE_LEGACY_DITHERING_BIT_EXT = 0x400000000ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DISABLE_OPTIMIZATION_BIT_KHR = 0x00000001ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_ALLOW_DERIVATIVES_BIT_KHR = 0x00000002ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DERIVATIVE_BIT_KHR = 0x00000004ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_VIEW_INDEX_FROM_DEVICE_INDEX_BIT_KHR = 0x00000008ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DISPATCH_BASE_BIT_KHR = 0x00000010ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DEFER_COMPILE_BIT_NV = 0x00000020ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_CAPTURE_STATISTICS_BIT_KHR = 0x00000040ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR = 0x00000080ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_KHR = 0x00000100ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_EARLY_RETURN_ON_FAILURE_BIT_KHR = 0x00000200ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_LINK_TIME_OPTIMIZATION_BIT_EXT = 0x00000400ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT = 0x00800000ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_LIBRARY_BIT_KHR = 0x00000800ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR = 0x00001000ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_SKIP_AABBS_BIT_KHR = 0x00002000ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR = 0x00004000ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR = 0x00008000ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR = 0x00010000ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR = 0x00020000ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR = 0x00080000ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_INDIRECT_BINDABLE_BIT_NV = 0x00040000ULL; +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; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_RAY_TRACING_DISPLACEMENT_MICROMAP_BIT_NV = 0x10000000ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_DESCRIPTOR_BUFFER_BIT_EXT = 0x20000000ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_CAPTURE_DATA_BIT_KHR = 0x80000000ULL; +static const VkPipelineCreateFlagBits2 VK_PIPELINE_CREATE_2_INDIRECT_BINDABLE_BIT_EXT = 0x4000000000ULL; + +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; + VkBool32 globalPriorityQuery; + VkBool32 shaderSubgroupRotate; + VkBool32 shaderSubgroupRotateClustered; + VkBool32 shaderFloatControls2; + VkBool32 shaderExpectAssume; + VkBool32 rectangularLines; + VkBool32 bresenhamLines; + VkBool32 smoothLines; + VkBool32 stippledRectangularLines; + VkBool32 stippledBresenhamLines; + VkBool32 stippledSmoothLines; + VkBool32 vertexAttributeInstanceRateDivisor; + VkBool32 vertexAttributeInstanceRateZeroDivisor; + VkBool32 indexTypeUint8; + VkBool32 dynamicRenderingLocalRead; + VkBool32 maintenance5; + VkBool32 maintenance6; + VkBool32 pipelineProtectedAccess; + VkBool32 pipelineRobustness; + VkBool32 hostImageCopy; + VkBool32 pushDescriptor; +} VkPhysicalDeviceVulkan14Features; + +typedef struct VkPhysicalDeviceVulkan14Properties { + VkStructureType sType; + void* pNext; + uint32_t lineSubPixelPrecisionBits; + uint32_t maxVertexAttribDivisor; + VkBool32 supportsNonZeroFirstInstance; + uint32_t maxPushDescriptors; + VkBool32 dynamicRenderingLocalReadDepthStencilAttachments; + VkBool32 dynamicRenderingLocalReadMultisampledAttachments; + VkBool32 earlyFragmentMultisampleCoverageAfterSampleCounting; + VkBool32 earlyFragmentSampleMaskTestBeforeSampleCounting; + VkBool32 depthStencilSwizzleOneSupport; + VkBool32 polygonModePointSize; + VkBool32 nonStrictSinglePixelWideLinesUseParallelogram; + VkBool32 nonStrictWideLinesUseParallelogram; + VkBool32 blockTexelViewCompatibleMultipleLayers; + uint32_t maxCombinedImageSamplerDescriptorCount; + VkBool32 fragmentShadingRateClampCombinerInputs; + VkPipelineRobustnessBufferBehavior defaultRobustnessStorageBuffers; + VkPipelineRobustnessBufferBehavior defaultRobustnessUniformBuffers; + VkPipelineRobustnessBufferBehavior defaultRobustnessVertexInputs; + VkPipelineRobustnessImageBehavior defaultRobustnessImages; + uint32_t copySrcLayoutCount; + VkImageLayout* pCopySrcLayouts; + uint32_t copyDstLayoutCount; + VkImageLayout* pCopyDstLayouts; + uint8_t optimalTilingLayoutUUID[VK_UUID_SIZE]; + VkBool32 identicalMemoryTypeRequirements; +} VkPhysicalDeviceVulkan14Properties; + +typedef struct VkDeviceQueueGlobalPriorityCreateInfo { + VkStructureType sType; + const void* pNext; + VkQueueGlobalPriority globalPriority; +} VkDeviceQueueGlobalPriorityCreateInfo; + +typedef struct VkPhysicalDeviceGlobalPriorityQueryFeatures { + VkStructureType sType; + void* pNext; + VkBool32 globalPriorityQuery; +} VkPhysicalDeviceGlobalPriorityQueryFeatures; + +typedef struct VkQueueFamilyGlobalPriorityProperties { + VkStructureType sType; + void* pNext; + uint32_t priorityCount; + 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; + VkBool32 indexTypeUint8; +} VkPhysicalDeviceIndexTypeUint8Features; + +typedef struct VkMemoryMapInfo { + VkStructureType sType; + const void* pNext; + VkMemoryMapFlags flags; + VkDeviceMemory memory; + VkDeviceSize offset; + VkDeviceSize size; +} VkMemoryMapInfo; + +typedef struct VkMemoryUnmapInfo { + VkStructureType sType; + const void* pNext; + VkMemoryUnmapFlags flags; + VkDeviceMemory memory; +} VkMemoryUnmapInfo; + +typedef struct VkPhysicalDeviceMaintenance5Features { + VkStructureType sType; + void* pNext; + VkBool32 maintenance5; +} VkPhysicalDeviceMaintenance5Features; + +typedef struct VkPhysicalDeviceMaintenance5Properties { + VkStructureType sType; + void* pNext; + VkBool32 earlyFragmentMultisampleCoverageAfterSampleCounting; + VkBool32 earlyFragmentSampleMaskTestBeforeSampleCounting; + VkBool32 depthStencilSwizzleOneSupport; + VkBool32 polygonModePointSize; + VkBool32 nonStrictSinglePixelWideLinesUseParallelogram; + 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 VkImageSubresource2 { + VkStructureType sType; + void* pNext; + VkImageSubresource imageSubresource; +} VkImageSubresource2; + +typedef struct VkDeviceImageSubresourceInfo { + VkStructureType sType; + const void* pNext; + const VkImageCreateInfo* pCreateInfo; + 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; + VkBool32 maintenance6; +} VkPhysicalDeviceMaintenance6Features; + +typedef struct VkPhysicalDeviceMaintenance6Properties { + VkStructureType sType; + void* pNext; + VkBool32 blockTexelViewCompatibleMultipleLayers; + uint32_t maxCombinedImageSamplerDescriptorCount; + VkBool32 fragmentShadingRateClampCombinerInputs; +} VkPhysicalDeviceMaintenance6Properties; + +typedef struct VkBindMemoryStatus { + VkStructureType sType; + const void* pNext; + 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; + VkBool32 hostImageCopy; +} VkPhysicalDeviceHostImageCopyFeatures; + +typedef struct VkPhysicalDeviceHostImageCopyProperties { + VkStructureType sType; + void* pNext; + uint32_t copySrcLayoutCount; + VkImageLayout* pCopySrcLayouts; + uint32_t copyDstLayoutCount; + VkImageLayout* pCopyDstLayouts; + uint8_t optimalTilingLayoutUUID[VK_UUID_SIZE]; + VkBool32 identicalMemoryTypeRequirements; +} VkPhysicalDeviceHostImageCopyProperties; + +typedef struct VkMemoryToImageCopy { + VkStructureType sType; + const void* pNext; + const void* pHostPointer; + uint32_t memoryRowLength; + uint32_t memoryImageHeight; + VkImageSubresourceLayers imageSubresource; + VkOffset3D imageOffset; + VkExtent3D imageExtent; +} VkMemoryToImageCopy; + +typedef struct VkImageToMemoryCopy { + VkStructureType sType; + const void* pNext; + void* pHostPointer; + uint32_t memoryRowLength; + uint32_t memoryImageHeight; + VkImageSubresourceLayers imageSubresource; + VkOffset3D imageOffset; + VkExtent3D imageExtent; +} VkImageToMemoryCopy; + +typedef struct VkCopyMemoryToImageInfo { + VkStructureType sType; + const void* pNext; + VkHostImageCopyFlags flags; + VkImage dstImage; + VkImageLayout dstImageLayout; + uint32_t regionCount; + const VkMemoryToImageCopy* pRegions; +} VkCopyMemoryToImageInfo; + +typedef struct VkCopyImageToMemoryInfo { + VkStructureType sType; + const void* pNext; + VkHostImageCopyFlags flags; + VkImage srcImage; + VkImageLayout srcImageLayout; + uint32_t regionCount; + const VkImageToMemoryCopy* pRegions; +} VkCopyImageToMemoryInfo; + +typedef struct VkCopyImageToImageInfo { + VkStructureType sType; + const void* pNext; + VkHostImageCopyFlags flags; + VkImage srcImage; + VkImageLayout srcImageLayout; + VkImage dstImage; + VkImageLayout dstImageLayout; + uint32_t regionCount; + const VkImageCopy2* pRegions; +} VkCopyImageToImageInfo; + +typedef struct VkHostImageLayoutTransitionInfo { + VkStructureType sType; + const void* pNext; + VkImage image; + VkImageLayout oldLayout; + VkImageLayout newLayout; + VkImageSubresourceRange subresourceRange; +} VkHostImageLayoutTransitionInfo; + +typedef struct VkSubresourceHostMemcpySize { + VkStructureType sType; + void* pNext; + VkDeviceSize size; +} VkSubresourceHostMemcpySize; + +typedef struct VkHostImageCopyDevicePerformanceQuery { + VkStructureType sType; + void* pNext; + VkBool32 optimalDeviceAccess; + VkBool32 identicalMemoryLayout; +} VkHostImageCopyDevicePerformanceQuery; + +typedef void (VKAPI_PTR *PFN_vkCmdSetLineStipple)(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor, uint16_t lineStipplePattern); +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); + +#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, + void** ppData); + +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, + VkSubresourceLayout2* pLayout); + +VKAPI_ATTR void VKAPI_CALL vkGetImageSubresourceLayout2( + VkDevice device, + VkImage image, + 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); + +VKAPI_ATTR VkResult VKAPI_CALL vkCopyImageToMemory( + VkDevice device, + const VkCopyImageToMemoryInfo* pCopyImageToMemoryInfo); + +VKAPI_ATTR VkResult VKAPI_CALL vkCopyImageToImage( + VkDevice device, + const VkCopyImageToImageInfo* pCopyImageToImageInfo); + +VKAPI_ATTR VkResult VKAPI_CALL vkTransitionImageLayout( + VkDevice device, + uint32_t transitionCount, + const VkHostImageLayoutTransitionInfo* pTransitions); +#endif + + // VK_KHR_surface is a preprocessor guard. Do not pass it to API calls. #define VK_KHR_surface 1 VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSurfaceKHR) @@ -7633,6 +8459,7 @@ 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_MAX_ENUM_KHR = 0x7FFFFFFF } VkPresentModeKHR; @@ -8077,6 +8904,7 @@ typedef enum VkVideoCodecOperationFlagBitsKHR { VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR = 0x00000001, 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_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF } VkVideoCodecOperationFlagBitsKHR; typedef VkFlags VkVideoCodecOperationFlagsKHR; @@ -8111,9 +8939,16 @@ typedef enum VkVideoSessionCreateFlagBitsKHR { VK_VIDEO_SESSION_CREATE_PROTECTED_CONTENT_BIT_KHR = 0x00000001, VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_PARAMETER_OPTIMIZATIONS_BIT_KHR = 0x00000002, VK_VIDEO_SESSION_CREATE_INLINE_QUERIES_BIT_KHR = 0x00000004, + VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_QUANTIZATION_DELTA_MAP_BIT_KHR = 0x00000008, + VK_VIDEO_SESSION_CREATE_ALLOW_ENCODE_EMPHASIS_MAP_BIT_KHR = 0x00000010, VK_VIDEO_SESSION_CREATE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF } VkVideoSessionCreateFlagBitsKHR; typedef VkFlags VkVideoSessionCreateFlagsKHR; + +typedef enum VkVideoSessionParametersCreateFlagBitsKHR { + VK_VIDEO_SESSION_PARAMETERS_CREATE_QUANTIZATION_MAP_COMPATIBLE_BIT_KHR = 0x00000001, + VK_VIDEO_SESSION_PARAMETERS_CREATE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkVideoSessionParametersCreateFlagBitsKHR; typedef VkFlags VkVideoSessionParametersCreateFlagsKHR; typedef VkFlags VkVideoBeginCodingFlagsKHR; typedef VkFlags VkVideoEndCodingFlagsKHR; @@ -8416,6 +9251,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_MB_QP_DIFF_WRAPAROUND_BIT_KHR = 0x00000200, VK_VIDEO_ENCODE_H264_CAPABILITY_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF } VkVideoEncodeH264CapabilityFlagBitsKHR; typedef VkFlags VkVideoEncodeH264CapabilityFlagsKHR; @@ -8616,6 +9452,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_CU_QP_DIFF_WRAPAROUND_BIT_KHR = 0x00000400, VK_VIDEO_ENCODE_H265_CAPABILITY_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF } VkVideoEncodeH265CapabilityFlagBitsKHR; typedef VkFlags VkVideoEncodeH265CapabilityFlagsKHR; @@ -8901,38 +9738,6 @@ typedef VkPhysicalDeviceDynamicRenderingFeatures VkPhysicalDeviceDynamicRenderin typedef VkCommandBufferInheritanceRenderingInfo VkCommandBufferInheritanceRenderingInfoKHR; -typedef struct VkRenderingFragmentShadingRateAttachmentInfoKHR { - VkStructureType sType; - const void* pNext; - VkImageView imageView; - VkImageLayout imageLayout; - VkExtent2D shadingRateAttachmentTexelSize; -} VkRenderingFragmentShadingRateAttachmentInfoKHR; - -typedef struct VkRenderingFragmentDensityMapAttachmentInfoEXT { - VkStructureType sType; - const void* pNext; - VkImageView imageView; - VkImageLayout imageLayout; -} VkRenderingFragmentDensityMapAttachmentInfoEXT; - -typedef struct VkAttachmentSampleCountInfoAMD { - VkStructureType sType; - const void* pNext; - uint32_t colorAttachmentCount; - const VkSampleCountFlagBits* pColorAttachmentSamples; - VkSampleCountFlagBits depthStencilAttachmentSamples; -} VkAttachmentSampleCountInfoAMD; - -typedef VkAttachmentSampleCountInfoAMD VkAttachmentSampleCountInfoNV; - -typedef struct VkMultiviewPerViewAttributesInfoNVX { - VkStructureType sType; - const void* pNext; - VkBool32 perViewAttributes; - VkBool32 perViewAttributesPositionXOnly; -} VkMultiviewPerViewAttributesInfoNVX; - typedef void (VKAPI_PTR *PFN_vkCmdBeginRenderingKHR)(VkCommandBuffer commandBuffer, const VkRenderingInfo* pRenderingInfo); typedef void (VKAPI_PTR *PFN_vkCmdEndRenderingKHR)(VkCommandBuffer commandBuffer); @@ -9288,11 +10093,7 @@ VKAPI_ATTR VkResult VKAPI_CALL vkGetSemaphoreFdKHR( #define VK_KHR_push_descriptor 1 #define VK_KHR_PUSH_DESCRIPTOR_SPEC_VERSION 2 #define VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME "VK_KHR_push_descriptor" -typedef struct VkPhysicalDevicePushDescriptorPropertiesKHR { - VkStructureType sType; - void* pNext; - uint32_t maxPushDescriptors; -} VkPhysicalDevicePushDescriptorPropertiesKHR; +typedef VkPhysicalDevicePushDescriptorProperties VkPhysicalDevicePushDescriptorPropertiesKHR; typedef void (VKAPI_PTR *PFN_vkCmdPushDescriptorSetKHR)(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipelineLayout layout, uint32_t set, uint32_t descriptorWriteCount, const VkWriteDescriptorSet* pDescriptorWrites); typedef void (VKAPI_PTR *PFN_vkCmdPushDescriptorSetWithTemplateKHR)(VkCommandBuffer commandBuffer, VkDescriptorUpdateTemplate descriptorUpdateTemplate, VkPipelineLayout layout, uint32_t set, const void* pData); @@ -10104,39 +10905,16 @@ typedef struct VkVideoDecodeH265DpbSlotInfoKHR { // VK_KHR_global_priority is a preprocessor guard. Do not pass it to API calls. #define VK_KHR_global_priority 1 -#define VK_MAX_GLOBAL_PRIORITY_SIZE_KHR 16U #define VK_KHR_GLOBAL_PRIORITY_SPEC_VERSION 1 #define VK_KHR_GLOBAL_PRIORITY_EXTENSION_NAME "VK_KHR_global_priority" +#define VK_MAX_GLOBAL_PRIORITY_SIZE_KHR VK_MAX_GLOBAL_PRIORITY_SIZE +typedef VkQueueGlobalPriority VkQueueGlobalPriorityKHR; -typedef enum VkQueueGlobalPriorityKHR { - VK_QUEUE_GLOBAL_PRIORITY_LOW_KHR = 128, - VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR = 256, - VK_QUEUE_GLOBAL_PRIORITY_HIGH_KHR = 512, - VK_QUEUE_GLOBAL_PRIORITY_REALTIME_KHR = 1024, - VK_QUEUE_GLOBAL_PRIORITY_LOW_EXT = VK_QUEUE_GLOBAL_PRIORITY_LOW_KHR, - VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_EXT = VK_QUEUE_GLOBAL_PRIORITY_MEDIUM_KHR, - VK_QUEUE_GLOBAL_PRIORITY_HIGH_EXT = VK_QUEUE_GLOBAL_PRIORITY_HIGH_KHR, - VK_QUEUE_GLOBAL_PRIORITY_REALTIME_EXT = VK_QUEUE_GLOBAL_PRIORITY_REALTIME_KHR, - VK_QUEUE_GLOBAL_PRIORITY_MAX_ENUM_KHR = 0x7FFFFFFF -} VkQueueGlobalPriorityKHR; -typedef struct VkDeviceQueueGlobalPriorityCreateInfoKHR { - VkStructureType sType; - const void* pNext; - VkQueueGlobalPriorityKHR globalPriority; -} VkDeviceQueueGlobalPriorityCreateInfoKHR; +typedef VkDeviceQueueGlobalPriorityCreateInfo VkDeviceQueueGlobalPriorityCreateInfoKHR; -typedef struct VkPhysicalDeviceGlobalPriorityQueryFeaturesKHR { - VkStructureType sType; - void* pNext; - VkBool32 globalPriorityQuery; -} VkPhysicalDeviceGlobalPriorityQueryFeaturesKHR; +typedef VkPhysicalDeviceGlobalPriorityQueryFeatures VkPhysicalDeviceGlobalPriorityQueryFeaturesKHR; -typedef struct VkQueueFamilyGlobalPriorityPropertiesKHR { - VkStructureType sType; - void* pNext; - uint32_t priorityCount; - VkQueueGlobalPriorityKHR priorities[VK_MAX_GLOBAL_PRIORITY_SIZE_KHR]; -} VkQueueFamilyGlobalPriorityPropertiesKHR; +typedef VkQueueFamilyGlobalPriorityProperties VkQueueFamilyGlobalPriorityPropertiesKHR; @@ -10307,6 +11085,14 @@ typedef struct VkPhysicalDeviceFragmentShadingRateKHR { VkExtent2D fragmentSize; } VkPhysicalDeviceFragmentShadingRateKHR; +typedef struct VkRenderingFragmentShadingRateAttachmentInfoKHR { + VkStructureType sType; + const void* pNext; + VkImageView imageView; + VkImageLayout imageLayout; + VkExtent2D shadingRateAttachmentTexelSize; +} VkRenderingFragmentShadingRateAttachmentInfoKHR; + typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceFragmentShadingRatesKHR)(VkPhysicalDevice physicalDevice, uint32_t* pFragmentShadingRateCount, VkPhysicalDeviceFragmentShadingRateKHR* pFragmentShadingRates); typedef void (VKAPI_PTR *PFN_vkCmdSetFragmentShadingRateKHR)(VkCommandBuffer commandBuffer, const VkExtent2D* pFragmentSize, const VkFragmentShadingRateCombinerOpKHR combinerOps[2]); @@ -10327,39 +11113,23 @@ VKAPI_ATTR void VKAPI_CALL vkCmdSetFragmentShadingRateKHR( #define VK_KHR_dynamic_rendering_local_read 1 #define VK_KHR_DYNAMIC_RENDERING_LOCAL_READ_SPEC_VERSION 1 #define VK_KHR_DYNAMIC_RENDERING_LOCAL_READ_EXTENSION_NAME "VK_KHR_dynamic_rendering_local_read" -typedef struct VkPhysicalDeviceDynamicRenderingLocalReadFeaturesKHR { - VkStructureType sType; - void* pNext; - VkBool32 dynamicRenderingLocalRead; -} VkPhysicalDeviceDynamicRenderingLocalReadFeaturesKHR; +typedef VkPhysicalDeviceDynamicRenderingLocalReadFeatures VkPhysicalDeviceDynamicRenderingLocalReadFeaturesKHR; -typedef struct VkRenderingAttachmentLocationInfoKHR { - VkStructureType sType; - const void* pNext; - uint32_t colorAttachmentCount; - const uint32_t* pColorAttachmentLocations; -} VkRenderingAttachmentLocationInfoKHR; +typedef VkRenderingAttachmentLocationInfo VkRenderingAttachmentLocationInfoKHR; -typedef struct VkRenderingInputAttachmentIndexInfoKHR { - VkStructureType sType; - const void* pNext; - uint32_t colorAttachmentCount; - const uint32_t* pColorAttachmentInputIndices; - const uint32_t* pDepthInputAttachmentIndex; - const uint32_t* pStencilInputAttachmentIndex; -} VkRenderingInputAttachmentIndexInfoKHR; +typedef VkRenderingInputAttachmentIndexInfo VkRenderingInputAttachmentIndexInfoKHR; -typedef void (VKAPI_PTR *PFN_vkCmdSetRenderingAttachmentLocationsKHR)(VkCommandBuffer commandBuffer, const VkRenderingAttachmentLocationInfoKHR* pLocationInfo); -typedef void (VKAPI_PTR *PFN_vkCmdSetRenderingInputAttachmentIndicesKHR)(VkCommandBuffer commandBuffer, const VkRenderingInputAttachmentIndexInfoKHR* pInputAttachmentIndexInfo); +typedef void (VKAPI_PTR *PFN_vkCmdSetRenderingAttachmentLocationsKHR)(VkCommandBuffer commandBuffer, const VkRenderingAttachmentLocationInfo* pLocationInfo); +typedef void (VKAPI_PTR *PFN_vkCmdSetRenderingInputAttachmentIndicesKHR)(VkCommandBuffer commandBuffer, const VkRenderingInputAttachmentIndexInfo* pInputAttachmentIndexInfo); #ifndef VK_NO_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetRenderingAttachmentLocationsKHR( VkCommandBuffer commandBuffer, - const VkRenderingAttachmentLocationInfoKHR* pLocationInfo); + const VkRenderingAttachmentLocationInfo* pLocationInfo); VKAPI_ATTR void VKAPI_CALL vkCmdSetRenderingInputAttachmentIndicesKHR( VkCommandBuffer commandBuffer, - const VkRenderingInputAttachmentIndexInfoKHR* pInputAttachmentIndexInfo); + const VkRenderingInputAttachmentIndexInfo* pInputAttachmentIndexInfo); #endif @@ -10598,40 +11368,26 @@ VKAPI_ATTR VkResult VKAPI_CALL vkGetPipelineExecutableInternalRepresentationsKHR #define VK_KHR_map_memory2 1 #define VK_KHR_MAP_MEMORY_2_SPEC_VERSION 1 #define VK_KHR_MAP_MEMORY_2_EXTENSION_NAME "VK_KHR_map_memory2" +typedef VkMemoryUnmapFlagBits VkMemoryUnmapFlagBitsKHR; -typedef enum VkMemoryUnmapFlagBitsKHR { - VK_MEMORY_UNMAP_RESERVE_BIT_EXT = 0x00000001, - VK_MEMORY_UNMAP_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF -} VkMemoryUnmapFlagBitsKHR; -typedef VkFlags VkMemoryUnmapFlagsKHR; -typedef struct VkMemoryMapInfoKHR { - VkStructureType sType; - const void* pNext; - VkMemoryMapFlags flags; - VkDeviceMemory memory; - VkDeviceSize offset; - VkDeviceSize size; -} VkMemoryMapInfoKHR; +typedef VkMemoryUnmapFlags VkMemoryUnmapFlagsKHR; -typedef struct VkMemoryUnmapInfoKHR { - VkStructureType sType; - const void* pNext; - VkMemoryUnmapFlagsKHR flags; - VkDeviceMemory memory; -} VkMemoryUnmapInfoKHR; +typedef VkMemoryMapInfo VkMemoryMapInfoKHR; -typedef VkResult (VKAPI_PTR *PFN_vkMapMemory2KHR)(VkDevice device, const VkMemoryMapInfoKHR* pMemoryMapInfo, void** ppData); -typedef VkResult (VKAPI_PTR *PFN_vkUnmapMemory2KHR)(VkDevice device, const VkMemoryUnmapInfoKHR* pMemoryUnmapInfo); +typedef VkMemoryUnmapInfo VkMemoryUnmapInfoKHR; + +typedef VkResult (VKAPI_PTR *PFN_vkMapMemory2KHR)(VkDevice device, const VkMemoryMapInfo* pMemoryMapInfo, void** ppData); +typedef VkResult (VKAPI_PTR *PFN_vkUnmapMemory2KHR)(VkDevice device, const VkMemoryUnmapInfo* pMemoryUnmapInfo); #ifndef VK_NO_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkMapMemory2KHR( VkDevice device, - const VkMemoryMapInfoKHR* pMemoryMapInfo, + const VkMemoryMapInfo* pMemoryMapInfo, void** ppData); VKAPI_ATTR VkResult VKAPI_CALL vkUnmapMemory2KHR( VkDevice device, - const VkMemoryUnmapInfoKHR* pMemoryUnmapInfo); + const VkMemoryUnmapInfo* pMemoryUnmapInfo); #endif @@ -10696,11 +11452,19 @@ typedef enum VkVideoEncodeTuningModeKHR { VK_VIDEO_ENCODE_TUNING_MODE_LOSSLESS_KHR = 4, VK_VIDEO_ENCODE_TUNING_MODE_MAX_ENUM_KHR = 0x7FFFFFFF } VkVideoEncodeTuningModeKHR; + +typedef enum VkVideoEncodeFlagBitsKHR { + 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 +} VkVideoEncodeFlagBitsKHR; typedef VkFlags VkVideoEncodeFlagsKHR; typedef enum VkVideoEncodeCapabilityFlagBitsKHR { VK_VIDEO_ENCODE_CAPABILITY_PRECEDING_EXTERNALLY_ENCODED_BYTES_BIT_KHR = 0x00000001, VK_VIDEO_ENCODE_CAPABILITY_INSUFFICIENT_BITSTREAM_BUFFER_RANGE_DETECTION_BIT_KHR = 0x00000002, + VK_VIDEO_ENCODE_CAPABILITY_QUANTIZATION_DELTA_MAP_BIT_KHR = 0x00000004, + VK_VIDEO_ENCODE_CAPABILITY_EMPHASIS_MAP_BIT_KHR = 0x00000008, VK_VIDEO_ENCODE_CAPABILITY_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF } VkVideoEncodeCapabilityFlagBitsKHR; typedef VkFlags VkVideoEncodeCapabilityFlagsKHR; @@ -10888,27 +11652,12 @@ typedef VkCommandBufferSubmitInfo VkCommandBufferSubmitInfoKHR; typedef VkPhysicalDeviceSynchronization2Features VkPhysicalDeviceSynchronization2FeaturesKHR; -typedef struct VkQueueFamilyCheckpointProperties2NV { - VkStructureType sType; - void* pNext; - VkPipelineStageFlags2 checkpointExecutionStageMask; -} VkQueueFamilyCheckpointProperties2NV; - -typedef struct VkCheckpointData2NV { - VkStructureType sType; - void* pNext; - VkPipelineStageFlags2 stage; - void* pCheckpointMarker; -} VkCheckpointData2NV; - typedef void (VKAPI_PTR *PFN_vkCmdSetEvent2KHR)(VkCommandBuffer commandBuffer, VkEvent event, const VkDependencyInfo* pDependencyInfo); typedef void (VKAPI_PTR *PFN_vkCmdResetEvent2KHR)(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags2 stageMask); 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 void (VKAPI_PTR *PFN_vkCmdWriteBufferMarker2AMD)(VkCommandBuffer commandBuffer, VkPipelineStageFlags2 stage, VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker); -typedef void (VKAPI_PTR *PFN_vkGetQueueCheckpointData2NV)(VkQueue queue, uint32_t* pCheckpointDataCount, VkCheckpointData2NV* pCheckpointData); #ifndef VK_NO_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetEvent2KHR( @@ -10942,18 +11691,6 @@ VKAPI_ATTR VkResult VKAPI_CALL vkQueueSubmit2KHR( uint32_t submitCount, const VkSubmitInfo2* pSubmits, VkFence fence); - -VKAPI_ATTR void VKAPI_CALL vkCmdWriteBufferMarker2AMD( - VkCommandBuffer commandBuffer, - VkPipelineStageFlags2 stage, - VkBuffer dstBuffer, - VkDeviceSize dstOffset, - uint32_t marker); - -VKAPI_ATTR void VKAPI_CALL vkGetQueueCheckpointData2NV( - VkQueue queue, - uint32_t* pCheckpointDataCount, - VkCheckpointData2NV* pCheckpointData); #endif @@ -11164,12 +11901,7 @@ VKAPI_ATTR void VKAPI_CALL vkGetDeviceImageSparseMemoryRequirementsKHR( #define VK_KHR_shader_subgroup_rotate 1 #define VK_KHR_SHADER_SUBGROUP_ROTATE_SPEC_VERSION 2 #define VK_KHR_SHADER_SUBGROUP_ROTATE_EXTENSION_NAME "VK_KHR_shader_subgroup_rotate" -typedef struct VkPhysicalDeviceShaderSubgroupRotateFeaturesKHR { - VkStructureType sType; - void* pNext; - VkBool32 shaderSubgroupRotate; - VkBool32 shaderSubgroupRotateClustered; -} VkPhysicalDeviceShaderSubgroupRotateFeaturesKHR; +typedef VkPhysicalDeviceShaderSubgroupRotateFeatures VkPhysicalDeviceShaderSubgroupRotateFeaturesKHR; @@ -11189,140 +11921,34 @@ typedef struct VkPhysicalDeviceShaderMaximalReconvergenceFeaturesKHR { #define VK_KHR_maintenance5 1 #define VK_KHR_MAINTENANCE_5_SPEC_VERSION 1 #define VK_KHR_MAINTENANCE_5_EXTENSION_NAME "VK_KHR_maintenance5" -typedef VkFlags64 VkPipelineCreateFlags2KHR; +typedef VkPipelineCreateFlags2 VkPipelineCreateFlags2KHR; -// Flag bits for VkPipelineCreateFlagBits2KHR -typedef VkFlags64 VkPipelineCreateFlagBits2KHR; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_DISABLE_OPTIMIZATION_BIT_KHR = 0x00000001ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_ALLOW_DERIVATIVES_BIT_KHR = 0x00000002ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_DERIVATIVE_BIT_KHR = 0x00000004ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_ENABLE_LEGACY_DITHERING_BIT_EXT = 0x400000000ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_VIEW_INDEX_FROM_DEVICE_INDEX_BIT_KHR = 0x00000008ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_DISPATCH_BASE_BIT_KHR = 0x00000010ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_DEFER_COMPILE_BIT_NV = 0x00000020ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_CAPTURE_STATISTICS_BIT_KHR = 0x00000040ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR = 0x00000080ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_KHR = 0x00000100ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_EARLY_RETURN_ON_FAILURE_BIT_KHR = 0x00000200ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_LINK_TIME_OPTIMIZATION_BIT_EXT = 0x00000400ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT = 0x00800000ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_LIBRARY_BIT_KHR = 0x00000800ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR = 0x00001000ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_RAY_TRACING_SKIP_AABBS_BIT_KHR = 0x00002000ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR = 0x00004000ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR = 0x00008000ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR = 0x00010000ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR = 0x00020000ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_BIT_KHR = 0x00080000ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_INDIRECT_BINDABLE_BIT_NV = 0x00040000ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_RAY_TRACING_ALLOW_MOTION_BIT_NV = 0x00100000ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x00200000ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT = 0x00400000ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_RAY_TRACING_OPACITY_MICROMAP_BIT_EXT = 0x01000000ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_COLOR_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT = 0x02000000ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT = 0x04000000ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_NO_PROTECTED_ACCESS_BIT_EXT = 0x08000000ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_PROTECTED_ACCESS_ONLY_BIT_EXT = 0x40000000ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_RAY_TRACING_DISPLACEMENT_MICROMAP_BIT_NV = 0x10000000ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_DESCRIPTOR_BUFFER_BIT_EXT = 0x20000000ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_CAPTURE_DATA_BIT_KHR = 0x80000000ULL; -static const VkPipelineCreateFlagBits2KHR VK_PIPELINE_CREATE_2_INDIRECT_BINDABLE_BIT_EXT = 0x4000000000ULL; +typedef VkPipelineCreateFlagBits2 VkPipelineCreateFlagBits2KHR; -typedef VkFlags64 VkBufferUsageFlags2KHR; +typedef VkBufferUsageFlags2 VkBufferUsageFlags2KHR; -// Flag bits for VkBufferUsageFlagBits2KHR -typedef VkFlags64 VkBufferUsageFlagBits2KHR; -static const VkBufferUsageFlagBits2KHR VK_BUFFER_USAGE_2_TRANSFER_SRC_BIT_KHR = 0x00000001ULL; -static const VkBufferUsageFlagBits2KHR VK_BUFFER_USAGE_2_TRANSFER_DST_BIT_KHR = 0x00000002ULL; -static const VkBufferUsageFlagBits2KHR VK_BUFFER_USAGE_2_UNIFORM_TEXEL_BUFFER_BIT_KHR = 0x00000004ULL; -static const VkBufferUsageFlagBits2KHR VK_BUFFER_USAGE_2_STORAGE_TEXEL_BUFFER_BIT_KHR = 0x00000008ULL; -static const VkBufferUsageFlagBits2KHR VK_BUFFER_USAGE_2_UNIFORM_BUFFER_BIT_KHR = 0x00000010ULL; -static const VkBufferUsageFlagBits2KHR VK_BUFFER_USAGE_2_STORAGE_BUFFER_BIT_KHR = 0x00000020ULL; -static const VkBufferUsageFlagBits2KHR VK_BUFFER_USAGE_2_INDEX_BUFFER_BIT_KHR = 0x00000040ULL; -static const VkBufferUsageFlagBits2KHR VK_BUFFER_USAGE_2_VERTEX_BUFFER_BIT_KHR = 0x00000080ULL; -static const VkBufferUsageFlagBits2KHR VK_BUFFER_USAGE_2_INDIRECT_BUFFER_BIT_KHR = 0x00000100ULL; -static const VkBufferUsageFlagBits2KHR VK_BUFFER_USAGE_2_EXECUTION_GRAPH_SCRATCH_BIT_AMDX = 0x02000000ULL; -static const VkBufferUsageFlagBits2KHR VK_BUFFER_USAGE_2_CONDITIONAL_RENDERING_BIT_EXT = 0x00000200ULL; -static const VkBufferUsageFlagBits2KHR VK_BUFFER_USAGE_2_SHADER_BINDING_TABLE_BIT_KHR = 0x00000400ULL; -static const VkBufferUsageFlagBits2KHR VK_BUFFER_USAGE_2_RAY_TRACING_BIT_NV = 0x00000400ULL; -static const VkBufferUsageFlagBits2KHR VK_BUFFER_USAGE_2_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT = 0x00000800ULL; -static const VkBufferUsageFlagBits2KHR VK_BUFFER_USAGE_2_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT = 0x00001000ULL; -static const VkBufferUsageFlagBits2KHR VK_BUFFER_USAGE_2_VIDEO_DECODE_SRC_BIT_KHR = 0x00002000ULL; -static const VkBufferUsageFlagBits2KHR VK_BUFFER_USAGE_2_VIDEO_DECODE_DST_BIT_KHR = 0x00004000ULL; -static const VkBufferUsageFlagBits2KHR VK_BUFFER_USAGE_2_VIDEO_ENCODE_DST_BIT_KHR = 0x00008000ULL; -static const VkBufferUsageFlagBits2KHR VK_BUFFER_USAGE_2_VIDEO_ENCODE_SRC_BIT_KHR = 0x00010000ULL; -static const VkBufferUsageFlagBits2KHR VK_BUFFER_USAGE_2_SHADER_DEVICE_ADDRESS_BIT_KHR = 0x00020000ULL; -static const VkBufferUsageFlagBits2KHR VK_BUFFER_USAGE_2_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR = 0x00080000ULL; -static const VkBufferUsageFlagBits2KHR VK_BUFFER_USAGE_2_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR = 0x00100000ULL; -static const VkBufferUsageFlagBits2KHR VK_BUFFER_USAGE_2_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT = 0x00200000ULL; -static const VkBufferUsageFlagBits2KHR VK_BUFFER_USAGE_2_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT = 0x00400000ULL; -static const VkBufferUsageFlagBits2KHR VK_BUFFER_USAGE_2_PUSH_DESCRIPTORS_DESCRIPTOR_BUFFER_BIT_EXT = 0x04000000ULL; -static const VkBufferUsageFlagBits2KHR VK_BUFFER_USAGE_2_MICROMAP_BUILD_INPUT_READ_ONLY_BIT_EXT = 0x00800000ULL; -static const VkBufferUsageFlagBits2KHR VK_BUFFER_USAGE_2_MICROMAP_STORAGE_BIT_EXT = 0x01000000ULL; -static const VkBufferUsageFlagBits2KHR VK_BUFFER_USAGE_2_PREPROCESS_BUFFER_BIT_EXT = 0x80000000ULL; +typedef VkBufferUsageFlagBits2 VkBufferUsageFlagBits2KHR; -typedef struct VkPhysicalDeviceMaintenance5FeaturesKHR { - VkStructureType sType; - void* pNext; - VkBool32 maintenance5; -} VkPhysicalDeviceMaintenance5FeaturesKHR; +typedef VkPhysicalDeviceMaintenance5Features VkPhysicalDeviceMaintenance5FeaturesKHR; -typedef struct VkPhysicalDeviceMaintenance5PropertiesKHR { - VkStructureType sType; - void* pNext; - VkBool32 earlyFragmentMultisampleCoverageAfterSampleCounting; - VkBool32 earlyFragmentSampleMaskTestBeforeSampleCounting; - VkBool32 depthStencilSwizzleOneSupport; - VkBool32 polygonModePointSize; - VkBool32 nonStrictSinglePixelWideLinesUseParallelogram; - VkBool32 nonStrictWideLinesUseParallelogram; -} VkPhysicalDeviceMaintenance5PropertiesKHR; +typedef VkPhysicalDeviceMaintenance5Properties VkPhysicalDeviceMaintenance5PropertiesKHR; -typedef struct VkRenderingAreaInfoKHR { - VkStructureType sType; - const void* pNext; - uint32_t viewMask; - uint32_t colorAttachmentCount; - const VkFormat* pColorAttachmentFormats; - VkFormat depthAttachmentFormat; - VkFormat stencilAttachmentFormat; -} VkRenderingAreaInfoKHR; +typedef VkRenderingAreaInfo VkRenderingAreaInfoKHR; -typedef struct VkImageSubresource2KHR { - VkStructureType sType; - void* pNext; - VkImageSubresource imageSubresource; -} VkImageSubresource2KHR; +typedef VkDeviceImageSubresourceInfo VkDeviceImageSubresourceInfoKHR; -typedef struct VkDeviceImageSubresourceInfoKHR { - VkStructureType sType; - const void* pNext; - const VkImageCreateInfo* pCreateInfo; - const VkImageSubresource2KHR* pSubresource; -} VkDeviceImageSubresourceInfoKHR; +typedef VkImageSubresource2 VkImageSubresource2KHR; -typedef struct VkSubresourceLayout2KHR { - VkStructureType sType; - void* pNext; - VkSubresourceLayout subresourceLayout; -} VkSubresourceLayout2KHR; +typedef VkSubresourceLayout2 VkSubresourceLayout2KHR; -typedef struct VkPipelineCreateFlags2CreateInfoKHR { - VkStructureType sType; - const void* pNext; - VkPipelineCreateFlags2KHR flags; -} VkPipelineCreateFlags2CreateInfoKHR; +typedef VkPipelineCreateFlags2CreateInfo VkPipelineCreateFlags2CreateInfoKHR; -typedef struct VkBufferUsageFlags2CreateInfoKHR { - VkStructureType sType; - const void* pNext; - VkBufferUsageFlags2KHR usage; -} VkBufferUsageFlags2CreateInfoKHR; +typedef VkBufferUsageFlags2CreateInfo VkBufferUsageFlags2CreateInfoKHR; typedef void (VKAPI_PTR *PFN_vkCmdBindIndexBuffer2KHR)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkDeviceSize size, VkIndexType indexType); -typedef void (VKAPI_PTR *PFN_vkGetRenderingAreaGranularityKHR)(VkDevice device, const VkRenderingAreaInfoKHR* pRenderingAreaInfo, VkExtent2D* pGranularity); -typedef void (VKAPI_PTR *PFN_vkGetDeviceImageSubresourceLayoutKHR)(VkDevice device, const VkDeviceImageSubresourceInfoKHR* pInfo, VkSubresourceLayout2KHR* pLayout); -typedef void (VKAPI_PTR *PFN_vkGetImageSubresourceLayout2KHR)(VkDevice device, VkImage image, const VkImageSubresource2KHR* pSubresource, VkSubresourceLayout2KHR* pLayout); +typedef void (VKAPI_PTR *PFN_vkGetRenderingAreaGranularityKHR)(VkDevice device, const VkRenderingAreaInfo* pRenderingAreaInfo, VkExtent2D* pGranularity); +typedef void (VKAPI_PTR *PFN_vkGetDeviceImageSubresourceLayoutKHR)(VkDevice device, const VkDeviceImageSubresourceInfo* pInfo, VkSubresourceLayout2* pLayout); +typedef void (VKAPI_PTR *PFN_vkGetImageSubresourceLayout2KHR)(VkDevice device, VkImage image, const VkImageSubresource2* pSubresource, VkSubresourceLayout2* pLayout); #ifndef VK_NO_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdBindIndexBuffer2KHR( @@ -11334,19 +11960,19 @@ VKAPI_ATTR void VKAPI_CALL vkCmdBindIndexBuffer2KHR( VKAPI_ATTR void VKAPI_CALL vkGetRenderingAreaGranularityKHR( VkDevice device, - const VkRenderingAreaInfoKHR* pRenderingAreaInfo, + const VkRenderingAreaInfo* pRenderingAreaInfo, VkExtent2D* pGranularity); VKAPI_ATTR void VKAPI_CALL vkGetDeviceImageSubresourceLayoutKHR( VkDevice device, - const VkDeviceImageSubresourceInfoKHR* pInfo, - VkSubresourceLayout2KHR* pLayout); + const VkDeviceImageSubresourceInfo* pInfo, + VkSubresourceLayout2* pLayout); VKAPI_ATTR void VKAPI_CALL vkGetImageSubresourceLayout2KHR( VkDevice device, VkImage image, - const VkImageSubresource2KHR* pSubresource, - VkSubresourceLayout2KHR* pLayout); + const VkImageSubresource2* pSubresource, + VkSubresourceLayout2* pLayout); #endif @@ -11627,6 +12253,200 @@ typedef struct VkVideoDecodeAV1DpbSlotInfoKHR { +// VK_KHR_video_encode_av1 is a preprocessor guard. Do not pass it to API calls. +#define VK_KHR_video_encode_av1 1 +#include "vk_video/vulkan_video_codec_av1std_encode.h" +#define VK_KHR_VIDEO_ENCODE_AV1_SPEC_VERSION 1 +#define VK_KHR_VIDEO_ENCODE_AV1_EXTENSION_NAME "VK_KHR_video_encode_av1" + +typedef enum VkVideoEncodeAV1PredictionModeKHR { + VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_INTRA_ONLY_KHR = 0, + VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_SINGLE_REFERENCE_KHR = 1, + VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_UNIDIRECTIONAL_COMPOUND_KHR = 2, + VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_BIDIRECTIONAL_COMPOUND_KHR = 3, + VK_VIDEO_ENCODE_AV1_PREDICTION_MODE_MAX_ENUM_KHR = 0x7FFFFFFF +} VkVideoEncodeAV1PredictionModeKHR; + +typedef enum VkVideoEncodeAV1RateControlGroupKHR { + VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_INTRA_KHR = 0, + VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_PREDICTIVE_KHR = 1, + VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_BIPREDICTIVE_KHR = 2, + VK_VIDEO_ENCODE_AV1_RATE_CONTROL_GROUP_MAX_ENUM_KHR = 0x7FFFFFFF +} VkVideoEncodeAV1RateControlGroupKHR; + +typedef enum VkVideoEncodeAV1CapabilityFlagBitsKHR { + VK_VIDEO_ENCODE_AV1_CAPABILITY_PER_RATE_CONTROL_GROUP_MIN_MAX_Q_INDEX_BIT_KHR = 0x00000001, + VK_VIDEO_ENCODE_AV1_CAPABILITY_GENERATE_OBU_EXTENSION_HEADER_BIT_KHR = 0x00000002, + 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_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkVideoEncodeAV1CapabilityFlagBitsKHR; +typedef VkFlags VkVideoEncodeAV1CapabilityFlagsKHR; + +typedef enum VkVideoEncodeAV1StdFlagBitsKHR { + VK_VIDEO_ENCODE_AV1_STD_UNIFORM_TILE_SPACING_FLAG_SET_BIT_KHR = 0x00000001, + VK_VIDEO_ENCODE_AV1_STD_SKIP_MODE_PRESENT_UNSET_BIT_KHR = 0x00000002, + VK_VIDEO_ENCODE_AV1_STD_PRIMARY_REF_FRAME_BIT_KHR = 0x00000004, + VK_VIDEO_ENCODE_AV1_STD_DELTA_Q_BIT_KHR = 0x00000008, + VK_VIDEO_ENCODE_AV1_STD_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkVideoEncodeAV1StdFlagBitsKHR; +typedef VkFlags VkVideoEncodeAV1StdFlagsKHR; + +typedef enum VkVideoEncodeAV1SuperblockSizeFlagBitsKHR { + VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_64_BIT_KHR = 0x00000001, + VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_128_BIT_KHR = 0x00000002, + VK_VIDEO_ENCODE_AV1_SUPERBLOCK_SIZE_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkVideoEncodeAV1SuperblockSizeFlagBitsKHR; +typedef VkFlags VkVideoEncodeAV1SuperblockSizeFlagsKHR; + +typedef enum VkVideoEncodeAV1RateControlFlagBitsKHR { + VK_VIDEO_ENCODE_AV1_RATE_CONTROL_REGULAR_GOP_BIT_KHR = 0x00000001, + VK_VIDEO_ENCODE_AV1_RATE_CONTROL_TEMPORAL_LAYER_PATTERN_DYADIC_BIT_KHR = 0x00000002, + VK_VIDEO_ENCODE_AV1_RATE_CONTROL_REFERENCE_PATTERN_FLAT_BIT_KHR = 0x00000004, + VK_VIDEO_ENCODE_AV1_RATE_CONTROL_REFERENCE_PATTERN_DYADIC_BIT_KHR = 0x00000008, + VK_VIDEO_ENCODE_AV1_RATE_CONTROL_FLAG_BITS_MAX_ENUM_KHR = 0x7FFFFFFF +} VkVideoEncodeAV1RateControlFlagBitsKHR; +typedef VkFlags VkVideoEncodeAV1RateControlFlagsKHR; +typedef struct VkPhysicalDeviceVideoEncodeAV1FeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 videoEncodeAV1; +} VkPhysicalDeviceVideoEncodeAV1FeaturesKHR; + +typedef struct VkVideoEncodeAV1CapabilitiesKHR { + VkStructureType sType; + void* pNext; + VkVideoEncodeAV1CapabilityFlagsKHR flags; + StdVideoAV1Level maxLevel; + VkExtent2D codedPictureAlignment; + VkExtent2D maxTiles; + VkExtent2D minTileSize; + VkExtent2D maxTileSize; + VkVideoEncodeAV1SuperblockSizeFlagsKHR superblockSizes; + uint32_t maxSingleReferenceCount; + uint32_t singleReferenceNameMask; + uint32_t maxUnidirectionalCompoundReferenceCount; + uint32_t maxUnidirectionalCompoundGroup1ReferenceCount; + uint32_t unidirectionalCompoundReferenceNameMask; + uint32_t maxBidirectionalCompoundReferenceCount; + uint32_t maxBidirectionalCompoundGroup1ReferenceCount; + uint32_t maxBidirectionalCompoundGroup2ReferenceCount; + uint32_t bidirectionalCompoundReferenceNameMask; + uint32_t maxTemporalLayerCount; + uint32_t maxSpatialLayerCount; + uint32_t maxOperatingPoints; + uint32_t minQIndex; + uint32_t maxQIndex; + VkBool32 prefersGopRemainingFrames; + VkBool32 requiresGopRemainingFrames; + VkVideoEncodeAV1StdFlagsKHR stdSyntaxFlags; +} VkVideoEncodeAV1CapabilitiesKHR; + +typedef struct VkVideoEncodeAV1QIndexKHR { + uint32_t intraQIndex; + uint32_t predictiveQIndex; + uint32_t bipredictiveQIndex; +} VkVideoEncodeAV1QIndexKHR; + +typedef struct VkVideoEncodeAV1QualityLevelPropertiesKHR { + VkStructureType sType; + void* pNext; + VkVideoEncodeAV1RateControlFlagsKHR preferredRateControlFlags; + uint32_t preferredGopFrameCount; + uint32_t preferredKeyFramePeriod; + uint32_t preferredConsecutiveBipredictiveFrameCount; + uint32_t preferredTemporalLayerCount; + VkVideoEncodeAV1QIndexKHR preferredConstantQIndex; + uint32_t preferredMaxSingleReferenceCount; + uint32_t preferredSingleReferenceNameMask; + uint32_t preferredMaxUnidirectionalCompoundReferenceCount; + uint32_t preferredMaxUnidirectionalCompoundGroup1ReferenceCount; + uint32_t preferredUnidirectionalCompoundReferenceNameMask; + uint32_t preferredMaxBidirectionalCompoundReferenceCount; + uint32_t preferredMaxBidirectionalCompoundGroup1ReferenceCount; + uint32_t preferredMaxBidirectionalCompoundGroup2ReferenceCount; + uint32_t preferredBidirectionalCompoundReferenceNameMask; +} VkVideoEncodeAV1QualityLevelPropertiesKHR; + +typedef struct VkVideoEncodeAV1SessionCreateInfoKHR { + VkStructureType sType; + const void* pNext; + VkBool32 useMaxLevel; + StdVideoAV1Level maxLevel; +} VkVideoEncodeAV1SessionCreateInfoKHR; + +typedef struct VkVideoEncodeAV1SessionParametersCreateInfoKHR { + VkStructureType sType; + const void* pNext; + const StdVideoAV1SequenceHeader* pStdSequenceHeader; + const StdVideoEncodeAV1DecoderModelInfo* pStdDecoderModelInfo; + uint32_t stdOperatingPointCount; + const StdVideoEncodeAV1OperatingPointInfo* pStdOperatingPoints; +} VkVideoEncodeAV1SessionParametersCreateInfoKHR; + +typedef struct VkVideoEncodeAV1PictureInfoKHR { + VkStructureType sType; + const void* pNext; + VkVideoEncodeAV1PredictionModeKHR predictionMode; + VkVideoEncodeAV1RateControlGroupKHR rateControlGroup; + uint32_t constantQIndex; + const StdVideoEncodeAV1PictureInfo* pStdPictureInfo; + int32_t referenceNameSlotIndices[VK_MAX_VIDEO_AV1_REFERENCES_PER_FRAME_KHR]; + VkBool32 primaryReferenceCdfOnly; + VkBool32 generateObuExtensionHeader; +} VkVideoEncodeAV1PictureInfoKHR; + +typedef struct VkVideoEncodeAV1DpbSlotInfoKHR { + VkStructureType sType; + const void* pNext; + const StdVideoEncodeAV1ReferenceInfo* pStdReferenceInfo; +} VkVideoEncodeAV1DpbSlotInfoKHR; + +typedef struct VkVideoEncodeAV1ProfileInfoKHR { + VkStructureType sType; + const void* pNext; + StdVideoAV1Profile stdProfile; +} VkVideoEncodeAV1ProfileInfoKHR; + +typedef struct VkVideoEncodeAV1FrameSizeKHR { + uint32_t intraFrameSize; + uint32_t predictiveFrameSize; + uint32_t bipredictiveFrameSize; +} VkVideoEncodeAV1FrameSizeKHR; + +typedef struct VkVideoEncodeAV1GopRemainingFrameInfoKHR { + VkStructureType sType; + const void* pNext; + VkBool32 useGopRemainingFrames; + uint32_t gopRemainingIntra; + uint32_t gopRemainingPredictive; + uint32_t gopRemainingBipredictive; +} VkVideoEncodeAV1GopRemainingFrameInfoKHR; + +typedef struct VkVideoEncodeAV1RateControlInfoKHR { + VkStructureType sType; + const void* pNext; + VkVideoEncodeAV1RateControlFlagsKHR flags; + uint32_t gopFrameCount; + uint32_t keyFramePeriod; + uint32_t consecutiveBipredictiveFrameCount; + uint32_t temporalLayerCount; +} VkVideoEncodeAV1RateControlInfoKHR; + +typedef struct VkVideoEncodeAV1RateControlLayerInfoKHR { + VkStructureType sType; + const void* pNext; + VkBool32 useMinQIndex; + VkVideoEncodeAV1QIndexKHR minQIndex; + VkBool32 useMaxQIndex; + VkVideoEncodeAV1QIndexKHR maxQIndex; + VkBool32 useMaxFrameSize; + VkVideoEncodeAV1FrameSizeKHR maxFrameSize; +} VkVideoEncodeAV1RateControlLayerInfoKHR; + + + // 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 @@ -11651,31 +12471,13 @@ typedef struct VkVideoInlineQueryInfoKHR { #define VK_KHR_vertex_attribute_divisor 1 #define VK_KHR_VERTEX_ATTRIBUTE_DIVISOR_SPEC_VERSION 1 #define VK_KHR_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME "VK_KHR_vertex_attribute_divisor" -typedef struct VkPhysicalDeviceVertexAttributeDivisorPropertiesKHR { - VkStructureType sType; - void* pNext; - uint32_t maxVertexAttribDivisor; - VkBool32 supportsNonZeroFirstInstance; -} VkPhysicalDeviceVertexAttributeDivisorPropertiesKHR; +typedef VkPhysicalDeviceVertexAttributeDivisorProperties VkPhysicalDeviceVertexAttributeDivisorPropertiesKHR; -typedef struct VkVertexInputBindingDivisorDescriptionKHR { - uint32_t binding; - uint32_t divisor; -} VkVertexInputBindingDivisorDescriptionKHR; +typedef VkVertexInputBindingDivisorDescription VkVertexInputBindingDivisorDescriptionKHR; -typedef struct VkPipelineVertexInputDivisorStateCreateInfoKHR { - VkStructureType sType; - const void* pNext; - uint32_t vertexBindingDivisorCount; - const VkVertexInputBindingDivisorDescriptionKHR* pVertexBindingDivisors; -} VkPipelineVertexInputDivisorStateCreateInfoKHR; +typedef VkPipelineVertexInputDivisorStateCreateInfo VkPipelineVertexInputDivisorStateCreateInfoKHR; -typedef struct VkPhysicalDeviceVertexAttributeDivisorFeaturesKHR { - VkStructureType sType; - void* pNext; - VkBool32 vertexAttributeInstanceRateDivisor; - VkBool32 vertexAttributeInstanceRateZeroDivisor; -} VkPhysicalDeviceVertexAttributeDivisorFeaturesKHR; +typedef VkPhysicalDeviceVertexAttributeDivisorFeatures VkPhysicalDeviceVertexAttributeDivisorFeaturesKHR; @@ -11689,11 +12491,7 @@ typedef struct VkPhysicalDeviceVertexAttributeDivisorFeaturesKHR { #define VK_KHR_shader_float_controls2 1 #define VK_KHR_SHADER_FLOAT_CONTROLS_2_SPEC_VERSION 1 #define VK_KHR_SHADER_FLOAT_CONTROLS_2_EXTENSION_NAME "VK_KHR_shader_float_controls2" -typedef struct VkPhysicalDeviceShaderFloatControls2FeaturesKHR { - VkStructureType sType; - void* pNext; - VkBool32 shaderFloatControls2; -} VkPhysicalDeviceShaderFloatControls2FeaturesKHR; +typedef VkPhysicalDeviceShaderFloatControls2Features VkPhysicalDeviceShaderFloatControls2FeaturesKHR; @@ -11701,11 +12499,7 @@ typedef struct VkPhysicalDeviceShaderFloatControls2FeaturesKHR { #define VK_KHR_index_type_uint8 1 #define VK_KHR_INDEX_TYPE_UINT8_SPEC_VERSION 1 #define VK_KHR_INDEX_TYPE_UINT8_EXTENSION_NAME "VK_KHR_index_type_uint8" -typedef struct VkPhysicalDeviceIndexTypeUint8FeaturesKHR { - VkStructureType sType; - void* pNext; - VkBool32 indexTypeUint8; -} VkPhysicalDeviceIndexTypeUint8FeaturesKHR; +typedef VkPhysicalDeviceIndexTypeUint8Features VkPhysicalDeviceIndexTypeUint8FeaturesKHR; @@ -11713,43 +12507,13 @@ typedef struct VkPhysicalDeviceIndexTypeUint8FeaturesKHR { #define VK_KHR_line_rasterization 1 #define VK_KHR_LINE_RASTERIZATION_SPEC_VERSION 1 #define VK_KHR_LINE_RASTERIZATION_EXTENSION_NAME "VK_KHR_line_rasterization" +typedef VkLineRasterizationMode VkLineRasterizationModeKHR; -typedef enum VkLineRasterizationModeKHR { - VK_LINE_RASTERIZATION_MODE_DEFAULT_KHR = 0, - VK_LINE_RASTERIZATION_MODE_RECTANGULAR_KHR = 1, - VK_LINE_RASTERIZATION_MODE_BRESENHAM_KHR = 2, - VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_KHR = 3, - VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT = VK_LINE_RASTERIZATION_MODE_DEFAULT_KHR, - VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT = VK_LINE_RASTERIZATION_MODE_RECTANGULAR_KHR, - VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT = VK_LINE_RASTERIZATION_MODE_BRESENHAM_KHR, - VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT = VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_KHR, - VK_LINE_RASTERIZATION_MODE_MAX_ENUM_KHR = 0x7FFFFFFF -} VkLineRasterizationModeKHR; -typedef struct VkPhysicalDeviceLineRasterizationFeaturesKHR { - VkStructureType sType; - void* pNext; - VkBool32 rectangularLines; - VkBool32 bresenhamLines; - VkBool32 smoothLines; - VkBool32 stippledRectangularLines; - VkBool32 stippledBresenhamLines; - VkBool32 stippledSmoothLines; -} VkPhysicalDeviceLineRasterizationFeaturesKHR; +typedef VkPhysicalDeviceLineRasterizationFeatures VkPhysicalDeviceLineRasterizationFeaturesKHR; -typedef struct VkPhysicalDeviceLineRasterizationPropertiesKHR { - VkStructureType sType; - void* pNext; - uint32_t lineSubPixelPrecisionBits; -} VkPhysicalDeviceLineRasterizationPropertiesKHR; +typedef VkPhysicalDeviceLineRasterizationProperties VkPhysicalDeviceLineRasterizationPropertiesKHR; -typedef struct VkPipelineRasterizationLineStateCreateInfoKHR { - VkStructureType sType; - const void* pNext; - VkLineRasterizationModeKHR lineRasterizationMode; - VkBool32 stippledLineEnable; - uint32_t lineStippleFactor; - uint16_t lineStipplePattern; -} VkPipelineRasterizationLineStateCreateInfoKHR; +typedef VkPipelineRasterizationLineStateCreateInfo VkPipelineRasterizationLineStateCreateInfoKHR; typedef void (VKAPI_PTR *PFN_vkCmdSetLineStippleKHR)(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor, uint16_t lineStipplePattern); @@ -11805,11 +12569,7 @@ VKAPI_ATTR VkResult VKAPI_CALL vkGetCalibratedTimestampsKHR( #define VK_KHR_shader_expect_assume 1 #define VK_KHR_SHADER_EXPECT_ASSUME_SPEC_VERSION 1 #define VK_KHR_SHADER_EXPECT_ASSUME_EXTENSION_NAME "VK_KHR_shader_expect_assume" -typedef struct VkPhysicalDeviceShaderExpectAssumeFeaturesKHR { - VkStructureType sType; - void* pNext; - VkBool32 shaderExpectAssume; -} VkPhysicalDeviceShaderExpectAssumeFeaturesKHR; +typedef VkPhysicalDeviceShaderExpectAssumeFeatures VkPhysicalDeviceShaderExpectAssumeFeaturesKHR; @@ -11817,66 +12577,19 @@ typedef struct VkPhysicalDeviceShaderExpectAssumeFeaturesKHR { #define VK_KHR_maintenance6 1 #define VK_KHR_MAINTENANCE_6_SPEC_VERSION 1 #define VK_KHR_MAINTENANCE_6_EXTENSION_NAME "VK_KHR_maintenance6" -typedef struct VkPhysicalDeviceMaintenance6FeaturesKHR { - VkStructureType sType; - void* pNext; - VkBool32 maintenance6; -} VkPhysicalDeviceMaintenance6FeaturesKHR; +typedef VkPhysicalDeviceMaintenance6Features VkPhysicalDeviceMaintenance6FeaturesKHR; -typedef struct VkPhysicalDeviceMaintenance6PropertiesKHR { - VkStructureType sType; - void* pNext; - VkBool32 blockTexelViewCompatibleMultipleLayers; - uint32_t maxCombinedImageSamplerDescriptorCount; - VkBool32 fragmentShadingRateClampCombinerInputs; -} VkPhysicalDeviceMaintenance6PropertiesKHR; +typedef VkPhysicalDeviceMaintenance6Properties VkPhysicalDeviceMaintenance6PropertiesKHR; -typedef struct VkBindMemoryStatusKHR { - VkStructureType sType; - const void* pNext; - VkResult* pResult; -} VkBindMemoryStatusKHR; +typedef VkBindMemoryStatus VkBindMemoryStatusKHR; -typedef struct VkBindDescriptorSetsInfoKHR { - 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; -} VkBindDescriptorSetsInfoKHR; +typedef VkBindDescriptorSetsInfo VkBindDescriptorSetsInfoKHR; -typedef struct VkPushConstantsInfoKHR { - VkStructureType sType; - const void* pNext; - VkPipelineLayout layout; - VkShaderStageFlags stageFlags; - uint32_t offset; - uint32_t size; - const void* pValues; -} VkPushConstantsInfoKHR; +typedef VkPushConstantsInfo VkPushConstantsInfoKHR; -typedef struct VkPushDescriptorSetInfoKHR { - VkStructureType sType; - const void* pNext; - VkShaderStageFlags stageFlags; - VkPipelineLayout layout; - uint32_t set; - uint32_t descriptorWriteCount; - const VkWriteDescriptorSet* pDescriptorWrites; -} VkPushDescriptorSetInfoKHR; +typedef VkPushDescriptorSetInfo VkPushDescriptorSetInfoKHR; -typedef struct VkPushDescriptorSetWithTemplateInfoKHR { - VkStructureType sType; - const void* pNext; - VkDescriptorUpdateTemplate descriptorUpdateTemplate; - VkPipelineLayout layout; - uint32_t set; - const void* pData; -} VkPushDescriptorSetWithTemplateInfoKHR; +typedef VkPushDescriptorSetWithTemplateInfo VkPushDescriptorSetWithTemplateInfoKHR; typedef struct VkSetDescriptorBufferOffsetsInfoEXT { VkStructureType sType; @@ -11897,29 +12610,29 @@ typedef struct VkBindDescriptorBufferEmbeddedSamplersInfoEXT { uint32_t set; } VkBindDescriptorBufferEmbeddedSamplersInfoEXT; -typedef void (VKAPI_PTR *PFN_vkCmdBindDescriptorSets2KHR)(VkCommandBuffer commandBuffer, const VkBindDescriptorSetsInfoKHR* pBindDescriptorSetsInfo); -typedef void (VKAPI_PTR *PFN_vkCmdPushConstants2KHR)(VkCommandBuffer commandBuffer, const VkPushConstantsInfoKHR* pPushConstantsInfo); -typedef void (VKAPI_PTR *PFN_vkCmdPushDescriptorSet2KHR)(VkCommandBuffer commandBuffer, const VkPushDescriptorSetInfoKHR* pPushDescriptorSetInfo); -typedef void (VKAPI_PTR *PFN_vkCmdPushDescriptorSetWithTemplate2KHR)(VkCommandBuffer commandBuffer, const VkPushDescriptorSetWithTemplateInfoKHR* pPushDescriptorSetWithTemplateInfo); +typedef void (VKAPI_PTR *PFN_vkCmdBindDescriptorSets2KHR)(VkCommandBuffer commandBuffer, const VkBindDescriptorSetsInfo* pBindDescriptorSetsInfo); +typedef void (VKAPI_PTR *PFN_vkCmdPushConstants2KHR)(VkCommandBuffer commandBuffer, const VkPushConstantsInfo* pPushConstantsInfo); +typedef void (VKAPI_PTR *PFN_vkCmdPushDescriptorSet2KHR)(VkCommandBuffer commandBuffer, const VkPushDescriptorSetInfo* pPushDescriptorSetInfo); +typedef void (VKAPI_PTR *PFN_vkCmdPushDescriptorSetWithTemplate2KHR)(VkCommandBuffer commandBuffer, const VkPushDescriptorSetWithTemplateInfo* pPushDescriptorSetWithTemplateInfo); typedef void (VKAPI_PTR *PFN_vkCmdSetDescriptorBufferOffsets2EXT)(VkCommandBuffer commandBuffer, const VkSetDescriptorBufferOffsetsInfoEXT* pSetDescriptorBufferOffsetsInfo); typedef void (VKAPI_PTR *PFN_vkCmdBindDescriptorBufferEmbeddedSamplers2EXT)(VkCommandBuffer commandBuffer, const VkBindDescriptorBufferEmbeddedSamplersInfoEXT* pBindDescriptorBufferEmbeddedSamplersInfo); #ifndef VK_NO_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdBindDescriptorSets2KHR( VkCommandBuffer commandBuffer, - const VkBindDescriptorSetsInfoKHR* pBindDescriptorSetsInfo); + const VkBindDescriptorSetsInfo* pBindDescriptorSetsInfo); VKAPI_ATTR void VKAPI_CALL vkCmdPushConstants2KHR( VkCommandBuffer commandBuffer, - const VkPushConstantsInfoKHR* pPushConstantsInfo); + const VkPushConstantsInfo* pPushConstantsInfo); VKAPI_ATTR void VKAPI_CALL vkCmdPushDescriptorSet2KHR( VkCommandBuffer commandBuffer, - const VkPushDescriptorSetInfoKHR* pPushDescriptorSetInfo); + const VkPushDescriptorSetInfo* pPushDescriptorSetInfo); VKAPI_ATTR void VKAPI_CALL vkCmdPushDescriptorSetWithTemplate2KHR( VkCommandBuffer commandBuffer, - const VkPushDescriptorSetWithTemplateInfoKHR* pPushDescriptorSetWithTemplateInfo); + const VkPushDescriptorSetWithTemplateInfo* pPushDescriptorSetWithTemplateInfo); VKAPI_ATTR void VKAPI_CALL vkCmdSetDescriptorBufferOffsets2EXT( VkCommandBuffer commandBuffer, @@ -11931,6 +12644,76 @@ VKAPI_ATTR void VKAPI_CALL vkCmdBindDescriptorBufferEmbeddedSamplers2EXT( #endif +// VK_KHR_video_encode_quantization_map is a preprocessor guard. Do not pass it to API calls. +#define VK_KHR_video_encode_quantization_map 1 +#define VK_KHR_VIDEO_ENCODE_QUANTIZATION_MAP_SPEC_VERSION 2 +#define VK_KHR_VIDEO_ENCODE_QUANTIZATION_MAP_EXTENSION_NAME "VK_KHR_video_encode_quantization_map" +typedef struct VkVideoEncodeQuantizationMapCapabilitiesKHR { + VkStructureType sType; + void* pNext; + VkExtent2D maxQuantizationMapExtent; +} VkVideoEncodeQuantizationMapCapabilitiesKHR; + +typedef struct VkVideoFormatQuantizationMapPropertiesKHR { + VkStructureType sType; + void* pNext; + VkExtent2D quantizationMapTexelSize; +} VkVideoFormatQuantizationMapPropertiesKHR; + +typedef struct VkVideoEncodeQuantizationMapInfoKHR { + VkStructureType sType; + const void* pNext; + VkImageView quantizationMap; + VkExtent2D quantizationMapExtent; +} VkVideoEncodeQuantizationMapInfoKHR; + +typedef struct VkVideoEncodeQuantizationMapSessionParametersCreateInfoKHR { + VkStructureType sType; + const void* pNext; + VkExtent2D quantizationMapTexelSize; +} VkVideoEncodeQuantizationMapSessionParametersCreateInfoKHR; + +typedef struct VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 videoEncodeQuantizationMap; +} VkPhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR; + +typedef struct VkVideoEncodeH264QuantizationMapCapabilitiesKHR { + VkStructureType sType; + void* pNext; + int32_t minQpDelta; + int32_t maxQpDelta; +} VkVideoEncodeH264QuantizationMapCapabilitiesKHR; + +typedef struct VkVideoEncodeH265QuantizationMapCapabilitiesKHR { + VkStructureType sType; + void* pNext; + int32_t minQpDelta; + int32_t maxQpDelta; +} VkVideoEncodeH265QuantizationMapCapabilitiesKHR; + +typedef struct VkVideoFormatH265QuantizationMapPropertiesKHR { + VkStructureType sType; + void* pNext; + VkVideoEncodeH265CtbSizeFlagsKHR compatibleCtbSizes; +} VkVideoFormatH265QuantizationMapPropertiesKHR; + +typedef struct VkVideoEncodeAV1QuantizationMapCapabilitiesKHR { + VkStructureType sType; + void* pNext; + int32_t minQIndexDelta; + int32_t maxQIndexDelta; +} VkVideoEncodeAV1QuantizationMapCapabilitiesKHR; + +typedef struct VkVideoFormatAV1QuantizationMapPropertiesKHR { + VkStructureType sType; + void* pNext; + VkVideoEncodeAV1SuperblockSizeFlagsKHR compatibleSuperblockSizes; +} VkVideoFormatAV1QuantizationMapPropertiesKHR; + + + // VK_KHR_shader_relaxed_extended_instruction is a preprocessor guard. Do not pass it to API calls. #define VK_KHR_shader_relaxed_extended_instruction 1 #define VK_KHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_SPEC_VERSION 1 @@ -12339,7 +13122,7 @@ VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirectByteCountEXT( #define VK_NVX_binary_import 1 VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkCuModuleNVX) VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkCuFunctionNVX) -#define VK_NVX_BINARY_IMPORT_SPEC_VERSION 1 +#define VK_NVX_BINARY_IMPORT_SPEC_VERSION 2 #define VK_NVX_BINARY_IMPORT_EXTENSION_NAME "VK_NVX_binary_import" typedef struct VkCuModuleCreateInfoNVX { VkStructureType sType; @@ -12348,6 +13131,12 @@ typedef struct VkCuModuleCreateInfoNVX { const void* pData; } VkCuModuleCreateInfoNVX; +typedef struct VkCuModuleTexturingModeCreateInfoNVX { + VkStructureType sType; + const void* pNext; + VkBool32 use64bitTexturing; +} VkCuModuleTexturingModeCreateInfoNVX; + typedef struct VkCuFunctionCreateInfoNVX { VkStructureType sType; const void* pNext; @@ -12409,7 +13198,7 @@ VKAPI_ATTR void VKAPI_CALL vkCmdCuLaunchKernelNVX( // 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 2 +#define VK_NVX_IMAGE_VIEW_HANDLE_SPEC_VERSION 3 #define VK_NVX_IMAGE_VIEW_HANDLE_EXTENSION_NAME "VK_NVX_image_view_handle" typedef struct VkImageViewHandleInfoNVX { VkStructureType sType; @@ -12427,6 +13216,7 @@ typedef struct VkImageViewAddressPropertiesNVX { } 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); #ifndef VK_NO_PROTOTYPES @@ -12434,6 +13224,10 @@ VKAPI_ATTR uint32_t VKAPI_CALL vkGetImageViewHandleNVX( VkDevice device, const VkImageViewHandleInfoNVX* pInfo); +VKAPI_ATTR uint64_t VKAPI_CALL vkGetImageViewHandle64NVX( + VkDevice device, + const VkImageViewHandleInfoNVX* pInfo); + VKAPI_ATTR VkResult VKAPI_CALL vkGetImageViewAddressNVX( VkDevice device, VkImageView imageView, @@ -12687,45 +13481,15 @@ typedef struct VkPhysicalDeviceASTCDecodeFeaturesEXT { #define VK_EXT_pipeline_robustness 1 #define VK_EXT_PIPELINE_ROBUSTNESS_SPEC_VERSION 1 #define VK_EXT_PIPELINE_ROBUSTNESS_EXTENSION_NAME "VK_EXT_pipeline_robustness" +typedef VkPipelineRobustnessBufferBehavior VkPipelineRobustnessBufferBehaviorEXT; -typedef enum VkPipelineRobustnessBufferBehaviorEXT { - VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT_EXT = 0, - VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED_EXT = 1, - VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_EXT = 2, - VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2_EXT = 3, - VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_MAX_ENUM_EXT = 0x7FFFFFFF -} VkPipelineRobustnessBufferBehaviorEXT; +typedef VkPipelineRobustnessImageBehavior VkPipelineRobustnessImageBehaviorEXT; -typedef enum VkPipelineRobustnessImageBehaviorEXT { - VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DEVICE_DEFAULT_EXT = 0, - VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DISABLED_EXT = 1, - VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_EXT = 2, - VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2_EXT = 3, - VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_MAX_ENUM_EXT = 0x7FFFFFFF -} VkPipelineRobustnessImageBehaviorEXT; -typedef struct VkPhysicalDevicePipelineRobustnessFeaturesEXT { - VkStructureType sType; - void* pNext; - VkBool32 pipelineRobustness; -} VkPhysicalDevicePipelineRobustnessFeaturesEXT; +typedef VkPhysicalDevicePipelineRobustnessFeatures VkPhysicalDevicePipelineRobustnessFeaturesEXT; -typedef struct VkPhysicalDevicePipelineRobustnessPropertiesEXT { - VkStructureType sType; - void* pNext; - VkPipelineRobustnessBufferBehaviorEXT defaultRobustnessStorageBuffers; - VkPipelineRobustnessBufferBehaviorEXT defaultRobustnessUniformBuffers; - VkPipelineRobustnessBufferBehaviorEXT defaultRobustnessVertexInputs; - VkPipelineRobustnessImageBehaviorEXT defaultRobustnessImages; -} VkPhysicalDevicePipelineRobustnessPropertiesEXT; +typedef VkPhysicalDevicePipelineRobustnessProperties VkPhysicalDevicePipelineRobustnessPropertiesEXT; -typedef struct VkPipelineRobustnessCreateInfoEXT { - VkStructureType sType; - const void* pNext; - VkPipelineRobustnessBufferBehaviorEXT storageBuffers; - VkPipelineRobustnessBufferBehaviorEXT uniformBuffers; - VkPipelineRobustnessBufferBehaviorEXT vertexInputs; - VkPipelineRobustnessImageBehaviorEXT images; -} VkPipelineRobustnessCreateInfoEXT; +typedef VkPipelineRobustnessCreateInfo VkPipelineRobustnessCreateInfoEXT; @@ -13006,6 +13770,13 @@ typedef struct VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX { VkBool32 perViewPositionAllComponents; } VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX; +typedef struct VkMultiviewPerViewAttributesInfoNVX { + VkStructureType sType; + const void* pNext; + VkBool32 perViewAttributes; + VkBool32 perViewAttributesPositionXOnly; +} VkMultiviewPerViewAttributesInfoNVX; + // VK_NV_viewport_swizzle is a preprocessor guard. Do not pass it to API calls. @@ -13374,6 +14145,14 @@ typedef VkPhysicalDeviceSamplerFilterMinmaxProperties VkPhysicalDeviceSamplerFil #define VK_AMD_mixed_attachment_samples 1 #define VK_AMD_MIXED_ATTACHMENT_SAMPLES_SPEC_VERSION 1 #define VK_AMD_MIXED_ATTACHMENT_SAMPLES_EXTENSION_NAME "VK_AMD_mixed_attachment_samples" +typedef struct VkAttachmentSampleCountInfoAMD { + VkStructureType sType; + const void* pNext; + uint32_t colorAttachmentCount; + const VkSampleCountFlagBits* pColorAttachmentSamples; + VkSampleCountFlagBits depthStencilAttachmentSamples; +} VkAttachmentSampleCountInfoAMD; + // VK_AMD_shader_fragment_mask is a preprocessor guard. Do not pass it to API calls. @@ -13553,6 +14332,8 @@ typedef struct VkPipelineCoverageModulationStateCreateInfoNV { const float* pCoverageModulationTable; } VkPipelineCoverageModulationStateCreateInfoNV; +typedef VkAttachmentSampleCountInfoAMD VkAttachmentSampleCountInfoNV; + // VK_NV_fill_rectangle is a preprocessor guard. Do not pass it to API calls. @@ -14265,9 +15046,9 @@ typedef struct VkFilterCubicImageViewImageFormatPropertiesEXT { #define VK_EXT_global_priority 1 #define VK_EXT_GLOBAL_PRIORITY_SPEC_VERSION 2 #define VK_EXT_GLOBAL_PRIORITY_EXTENSION_NAME "VK_EXT_global_priority" -typedef VkQueueGlobalPriorityKHR VkQueueGlobalPriorityEXT; +typedef VkQueueGlobalPriority VkQueueGlobalPriorityEXT; -typedef VkDeviceQueueGlobalPriorityCreateInfoKHR VkDeviceQueueGlobalPriorityCreateInfoEXT; +typedef VkDeviceQueueGlobalPriorityCreateInfo VkDeviceQueueGlobalPriorityCreateInfoEXT; @@ -14310,6 +15091,7 @@ VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryHostPointerPropertiesEXT( #define VK_AMD_BUFFER_MARKER_SPEC_VERSION 1 #define VK_AMD_BUFFER_MARKER_EXTENSION_NAME "VK_AMD_buffer_marker" typedef void (VKAPI_PTR *PFN_vkCmdWriteBufferMarkerAMD)(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage, VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker); +typedef void (VKAPI_PTR *PFN_vkCmdWriteBufferMarker2AMD)(VkCommandBuffer commandBuffer, VkPipelineStageFlags2 stage, VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker); #ifndef VK_NO_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdWriteBufferMarkerAMD( @@ -14318,6 +15100,13 @@ VKAPI_ATTR void VKAPI_CALL vkCmdWriteBufferMarkerAMD( VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker); + +VKAPI_ATTR void VKAPI_CALL vkCmdWriteBufferMarker2AMD( + VkCommandBuffer commandBuffer, + VkPipelineStageFlags2 stage, + VkBuffer dstBuffer, + VkDeviceSize dstOffset, + uint32_t marker); #endif @@ -14418,11 +15207,11 @@ typedef struct VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT { uint32_t maxVertexAttribDivisor; } VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT; -typedef VkVertexInputBindingDivisorDescriptionKHR VkVertexInputBindingDivisorDescriptionEXT; +typedef VkVertexInputBindingDivisorDescription VkVertexInputBindingDivisorDescriptionEXT; -typedef VkPipelineVertexInputDivisorStateCreateInfoKHR VkPipelineVertexInputDivisorStateCreateInfoEXT; +typedef VkPipelineVertexInputDivisorStateCreateInfo VkPipelineVertexInputDivisorStateCreateInfoEXT; -typedef VkPhysicalDeviceVertexAttributeDivisorFeaturesKHR VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT; +typedef VkPhysicalDeviceVertexAttributeDivisorFeatures VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT; @@ -14588,8 +15377,22 @@ typedef struct VkCheckpointDataNV { void* pCheckpointMarker; } VkCheckpointDataNV; +typedef struct VkQueueFamilyCheckpointProperties2NV { + VkStructureType sType; + void* pNext; + VkPipelineStageFlags2 checkpointExecutionStageMask; +} VkQueueFamilyCheckpointProperties2NV; + +typedef struct VkCheckpointData2NV { + VkStructureType sType; + void* pNext; + VkPipelineStageFlags2 stage; + void* pCheckpointMarker; +} VkCheckpointData2NV; + typedef void (VKAPI_PTR *PFN_vkCmdSetCheckpointNV)(VkCommandBuffer commandBuffer, const void* pCheckpointMarker); typedef void (VKAPI_PTR *PFN_vkGetQueueCheckpointDataNV)(VkQueue queue, uint32_t* pCheckpointDataCount, VkCheckpointDataNV* pCheckpointData); +typedef void (VKAPI_PTR *PFN_vkGetQueueCheckpointData2NV)(VkQueue queue, uint32_t* pCheckpointDataCount, VkCheckpointData2NV* pCheckpointData); #ifndef VK_NO_PROTOTYPES VKAPI_ATTR void VKAPI_CALL vkCmdSetCheckpointNV( @@ -14600,6 +15403,11 @@ VKAPI_ATTR void VKAPI_CALL vkGetQueueCheckpointDataNV( VkQueue queue, uint32_t* pCheckpointDataCount, VkCheckpointDataNV* pCheckpointData); + +VKAPI_ATTR void VKAPI_CALL vkGetQueueCheckpointData2NV( + VkQueue queue, + uint32_t* pCheckpointDataCount, + VkCheckpointData2NV* pCheckpointData); #endif @@ -14821,6 +15629,13 @@ typedef struct VkRenderPassFragmentDensityMapCreateInfoEXT { VkAttachmentReference fragmentDensityMapAttachment; } VkRenderPassFragmentDensityMapCreateInfoEXT; +typedef struct VkRenderingFragmentDensityMapAttachmentInfoEXT { + VkStructureType sType; + const void* pNext; + VkImageView imageView; + VkImageLayout imageLayout; +} VkRenderingFragmentDensityMapAttachmentInfoEXT; + // VK_EXT_scalar_block_layout is a preprocessor guard. Do not pass it to API calls. @@ -15211,13 +16026,13 @@ VKAPI_ATTR VkResult VKAPI_CALL vkCreateHeadlessSurfaceEXT( #define VK_EXT_line_rasterization 1 #define VK_EXT_LINE_RASTERIZATION_SPEC_VERSION 1 #define VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME "VK_EXT_line_rasterization" -typedef VkLineRasterizationModeKHR VkLineRasterizationModeEXT; +typedef VkLineRasterizationMode VkLineRasterizationModeEXT; -typedef VkPhysicalDeviceLineRasterizationFeaturesKHR VkPhysicalDeviceLineRasterizationFeaturesEXT; +typedef VkPhysicalDeviceLineRasterizationFeatures VkPhysicalDeviceLineRasterizationFeaturesEXT; -typedef VkPhysicalDeviceLineRasterizationPropertiesKHR VkPhysicalDeviceLineRasterizationPropertiesEXT; +typedef VkPhysicalDeviceLineRasterizationProperties VkPhysicalDeviceLineRasterizationPropertiesEXT; -typedef VkPipelineRasterizationLineStateCreateInfoKHR VkPipelineRasterizationLineStateCreateInfoEXT; +typedef VkPipelineRasterizationLineStateCreateInfo VkPipelineRasterizationLineStateCreateInfoEXT; typedef void (VKAPI_PTR *PFN_vkCmdSetLineStippleEXT)(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor, uint16_t lineStipplePattern); @@ -15273,7 +16088,7 @@ VKAPI_ATTR void VKAPI_CALL vkResetQueryPoolEXT( #define VK_EXT_index_type_uint8 1 #define VK_EXT_INDEX_TYPE_UINT8_SPEC_VERSION 1 #define VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME "VK_EXT_index_type_uint8" -typedef VkPhysicalDeviceIndexTypeUint8FeaturesKHR VkPhysicalDeviceIndexTypeUint8FeaturesEXT; +typedef VkPhysicalDeviceIndexTypeUint8Features VkPhysicalDeviceIndexTypeUint8FeaturesEXT; @@ -15366,138 +16181,63 @@ VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilOpEXT( #define VK_EXT_host_image_copy 1 #define VK_EXT_HOST_IMAGE_COPY_SPEC_VERSION 1 #define VK_EXT_HOST_IMAGE_COPY_EXTENSION_NAME "VK_EXT_host_image_copy" +typedef VkHostImageCopyFlagBits VkHostImageCopyFlagBitsEXT; -typedef enum VkHostImageCopyFlagBitsEXT { - VK_HOST_IMAGE_COPY_MEMCPY_EXT = 0x00000001, - VK_HOST_IMAGE_COPY_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF -} VkHostImageCopyFlagBitsEXT; -typedef VkFlags VkHostImageCopyFlagsEXT; -typedef struct VkPhysicalDeviceHostImageCopyFeaturesEXT { - VkStructureType sType; - void* pNext; - VkBool32 hostImageCopy; -} VkPhysicalDeviceHostImageCopyFeaturesEXT; +typedef VkHostImageCopyFlags VkHostImageCopyFlagsEXT; -typedef struct VkPhysicalDeviceHostImageCopyPropertiesEXT { - VkStructureType sType; - void* pNext; - uint32_t copySrcLayoutCount; - VkImageLayout* pCopySrcLayouts; - uint32_t copyDstLayoutCount; - VkImageLayout* pCopyDstLayouts; - uint8_t optimalTilingLayoutUUID[VK_UUID_SIZE]; - VkBool32 identicalMemoryTypeRequirements; -} VkPhysicalDeviceHostImageCopyPropertiesEXT; +typedef VkPhysicalDeviceHostImageCopyFeatures VkPhysicalDeviceHostImageCopyFeaturesEXT; -typedef struct VkMemoryToImageCopyEXT { - VkStructureType sType; - const void* pNext; - const void* pHostPointer; - uint32_t memoryRowLength; - uint32_t memoryImageHeight; - VkImageSubresourceLayers imageSubresource; - VkOffset3D imageOffset; - VkExtent3D imageExtent; -} VkMemoryToImageCopyEXT; +typedef VkPhysicalDeviceHostImageCopyProperties VkPhysicalDeviceHostImageCopyPropertiesEXT; -typedef struct VkImageToMemoryCopyEXT { - VkStructureType sType; - const void* pNext; - void* pHostPointer; - uint32_t memoryRowLength; - uint32_t memoryImageHeight; - VkImageSubresourceLayers imageSubresource; - VkOffset3D imageOffset; - VkExtent3D imageExtent; -} VkImageToMemoryCopyEXT; +typedef VkMemoryToImageCopy VkMemoryToImageCopyEXT; -typedef struct VkCopyMemoryToImageInfoEXT { - VkStructureType sType; - const void* pNext; - VkHostImageCopyFlagsEXT flags; - VkImage dstImage; - VkImageLayout dstImageLayout; - uint32_t regionCount; - const VkMemoryToImageCopyEXT* pRegions; -} VkCopyMemoryToImageInfoEXT; +typedef VkImageToMemoryCopy VkImageToMemoryCopyEXT; -typedef struct VkCopyImageToMemoryInfoEXT { - VkStructureType sType; - const void* pNext; - VkHostImageCopyFlagsEXT flags; - VkImage srcImage; - VkImageLayout srcImageLayout; - uint32_t regionCount; - const VkImageToMemoryCopyEXT* pRegions; -} VkCopyImageToMemoryInfoEXT; +typedef VkCopyMemoryToImageInfo VkCopyMemoryToImageInfoEXT; -typedef struct VkCopyImageToImageInfoEXT { - VkStructureType sType; - const void* pNext; - VkHostImageCopyFlagsEXT flags; - VkImage srcImage; - VkImageLayout srcImageLayout; - VkImage dstImage; - VkImageLayout dstImageLayout; - uint32_t regionCount; - const VkImageCopy2* pRegions; -} VkCopyImageToImageInfoEXT; +typedef VkCopyImageToMemoryInfo VkCopyImageToMemoryInfoEXT; -typedef struct VkHostImageLayoutTransitionInfoEXT { - VkStructureType sType; - const void* pNext; - VkImage image; - VkImageLayout oldLayout; - VkImageLayout newLayout; - VkImageSubresourceRange subresourceRange; -} VkHostImageLayoutTransitionInfoEXT; +typedef VkCopyImageToImageInfo VkCopyImageToImageInfoEXT; -typedef struct VkSubresourceHostMemcpySizeEXT { - VkStructureType sType; - void* pNext; - VkDeviceSize size; -} VkSubresourceHostMemcpySizeEXT; +typedef VkHostImageLayoutTransitionInfo VkHostImageLayoutTransitionInfoEXT; -typedef struct VkHostImageCopyDevicePerformanceQueryEXT { - VkStructureType sType; - void* pNext; - VkBool32 optimalDeviceAccess; - VkBool32 identicalMemoryLayout; -} VkHostImageCopyDevicePerformanceQueryEXT; +typedef VkSubresourceHostMemcpySize VkSubresourceHostMemcpySizeEXT; -typedef VkSubresourceLayout2KHR VkSubresourceLayout2EXT; +typedef VkHostImageCopyDevicePerformanceQuery VkHostImageCopyDevicePerformanceQueryEXT; -typedef VkImageSubresource2KHR VkImageSubresource2EXT; +typedef VkSubresourceLayout2 VkSubresourceLayout2EXT; -typedef VkResult (VKAPI_PTR *PFN_vkCopyMemoryToImageEXT)(VkDevice device, const VkCopyMemoryToImageInfoEXT* pCopyMemoryToImageInfo); -typedef VkResult (VKAPI_PTR *PFN_vkCopyImageToMemoryEXT)(VkDevice device, const VkCopyImageToMemoryInfoEXT* pCopyImageToMemoryInfo); -typedef VkResult (VKAPI_PTR *PFN_vkCopyImageToImageEXT)(VkDevice device, const VkCopyImageToImageInfoEXT* pCopyImageToImageInfo); -typedef VkResult (VKAPI_PTR *PFN_vkTransitionImageLayoutEXT)(VkDevice device, uint32_t transitionCount, const VkHostImageLayoutTransitionInfoEXT* pTransitions); -typedef void (VKAPI_PTR *PFN_vkGetImageSubresourceLayout2EXT)(VkDevice device, VkImage image, const VkImageSubresource2KHR* pSubresource, VkSubresourceLayout2KHR* pLayout); +typedef VkImageSubresource2 VkImageSubresource2EXT; + +typedef VkResult (VKAPI_PTR *PFN_vkCopyMemoryToImageEXT)(VkDevice device, const VkCopyMemoryToImageInfo* pCopyMemoryToImageInfo); +typedef VkResult (VKAPI_PTR *PFN_vkCopyImageToMemoryEXT)(VkDevice device, const VkCopyImageToMemoryInfo* pCopyImageToMemoryInfo); +typedef VkResult (VKAPI_PTR *PFN_vkCopyImageToImageEXT)(VkDevice device, const VkCopyImageToImageInfo* pCopyImageToImageInfo); +typedef VkResult (VKAPI_PTR *PFN_vkTransitionImageLayoutEXT)(VkDevice device, uint32_t transitionCount, const VkHostImageLayoutTransitionInfo* pTransitions); +typedef void (VKAPI_PTR *PFN_vkGetImageSubresourceLayout2EXT)(VkDevice device, VkImage image, const VkImageSubresource2* pSubresource, VkSubresourceLayout2* pLayout); #ifndef VK_NO_PROTOTYPES VKAPI_ATTR VkResult VKAPI_CALL vkCopyMemoryToImageEXT( VkDevice device, - const VkCopyMemoryToImageInfoEXT* pCopyMemoryToImageInfo); + const VkCopyMemoryToImageInfo* pCopyMemoryToImageInfo); VKAPI_ATTR VkResult VKAPI_CALL vkCopyImageToMemoryEXT( VkDevice device, - const VkCopyImageToMemoryInfoEXT* pCopyImageToMemoryInfo); + const VkCopyImageToMemoryInfo* pCopyImageToMemoryInfo); VKAPI_ATTR VkResult VKAPI_CALL vkCopyImageToImageEXT( VkDevice device, - const VkCopyImageToImageInfoEXT* pCopyImageToImageInfo); + const VkCopyImageToImageInfo* pCopyImageToImageInfo); VKAPI_ATTR VkResult VKAPI_CALL vkTransitionImageLayoutEXT( VkDevice device, uint32_t transitionCount, - const VkHostImageLayoutTransitionInfoEXT* pTransitions); + const VkHostImageLayoutTransitionInfo* pTransitions); VKAPI_ATTR void VKAPI_CALL vkGetImageSubresourceLayout2EXT( VkDevice device, VkImage image, - const VkImageSubresource2KHR* pSubresource, - VkSubresourceLayout2KHR* pLayout); + const VkImageSubresource2* pSubresource, + VkSubresourceLayout2* pLayout); #endif @@ -17097,6 +17837,18 @@ typedef struct VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT { +// VK_EXT_present_mode_fifo_latest_ready is a preprocessor guard. Do not pass it to API calls. +#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; + + + // VK_HUAWEI_subpass_shading is a preprocessor guard. Do not pass it to API calls. #define VK_HUAWEI_subpass_shading 1 #define VK_HUAWEI_SUBPASS_SHADING_SPEC_VERSION 3 @@ -17353,10 +18105,10 @@ typedef struct VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT { #define VK_EXT_global_priority_query 1 #define VK_EXT_GLOBAL_PRIORITY_QUERY_SPEC_VERSION 1 #define VK_EXT_GLOBAL_PRIORITY_QUERY_EXTENSION_NAME "VK_EXT_global_priority_query" -#define VK_MAX_GLOBAL_PRIORITY_SIZE_EXT VK_MAX_GLOBAL_PRIORITY_SIZE_KHR -typedef VkPhysicalDeviceGlobalPriorityQueryFeaturesKHR VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT; +#define VK_MAX_GLOBAL_PRIORITY_SIZE_EXT VK_MAX_GLOBAL_PRIORITY_SIZE +typedef VkPhysicalDeviceGlobalPriorityQueryFeatures VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT; -typedef VkQueueFamilyGlobalPriorityPropertiesKHR VkQueueFamilyGlobalPriorityPropertiesEXT; +typedef VkQueueFamilyGlobalPriorityProperties VkQueueFamilyGlobalPriorityPropertiesEXT; @@ -18818,11 +19570,7 @@ typedef struct VkPhysicalDeviceLegacyDitheringFeaturesEXT { #define VK_EXT_pipeline_protected_access 1 #define VK_EXT_PIPELINE_PROTECTED_ACCESS_SPEC_VERSION 1 #define VK_EXT_PIPELINE_PROTECTED_ACCESS_EXTENSION_NAME "VK_EXT_pipeline_protected_access" -typedef struct VkPhysicalDevicePipelineProtectedAccessFeaturesEXT { - VkStructureType sType; - void* pNext; - VkBool32 pipelineProtectedAccess; -} VkPhysicalDevicePipelineProtectedAccessFeaturesEXT; +typedef VkPhysicalDevicePipelineProtectedAccessFeatures VkPhysicalDevicePipelineProtectedAccessFeaturesEXT; @@ -19496,6 +20244,32 @@ typedef struct VkPhysicalDeviceDescriptorPoolOverallocationFeaturesNV { +// 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 +#define VK_NV_DISPLAY_STEREO_EXTENSION_NAME "VK_NV_display_stereo" + +typedef enum VkDisplaySurfaceStereoTypeNV { + VK_DISPLAY_SURFACE_STEREO_TYPE_NONE_NV = 0, + VK_DISPLAY_SURFACE_STEREO_TYPE_ONBOARD_DIN_NV = 1, + VK_DISPLAY_SURFACE_STEREO_TYPE_HDMI_3D_NV = 2, + VK_DISPLAY_SURFACE_STEREO_TYPE_INBAND_DISPLAYPORT_NV = 3, + VK_DISPLAY_SURFACE_STEREO_TYPE_MAX_ENUM_NV = 0x7FFFFFFF +} VkDisplaySurfaceStereoTypeNV; +typedef struct VkDisplaySurfaceStereoCreateInfoNV { + VkStructureType sType; + const void* pNext; + VkDisplaySurfaceStereoTypeNV stereoType; +} VkDisplaySurfaceStereoCreateInfoNV; + +typedef struct VkDisplayModeStereoPropertiesNV { + VkStructureType sType; + const void* pNext; + VkBool32 hdmi3DSupported; +} VkDisplayModeStereoPropertiesNV; + + + // VK_NV_raw_access_chains is a preprocessor guard. Do not pass it to API calls. #define VK_NV_raw_access_chains 1 #define VK_NV_RAW_ACCESS_CHAINS_SPEC_VERSION 1 @@ -19627,7 +20401,7 @@ typedef struct VkPhysicalDeviceDeviceGeneratedCommandsPropertiesEXT { typedef struct VkGeneratedCommandsMemoryRequirementsInfoEXT { VkStructureType sType; - void* pNext; + const void* pNext; VkIndirectExecutionSetEXT indirectExecutionSet; VkIndirectCommandsLayoutEXT indirectCommandsLayout; uint32_t maxSequenceCount; @@ -19879,6 +20653,86 @@ typedef struct VkPipelineViewportDepthClampControlCreateInfoEXT { +// VK_HUAWEI_hdr_vivid is a preprocessor guard. Do not pass it to API calls. +#define VK_HUAWEI_hdr_vivid 1 +#define VK_HUAWEI_HDR_VIVID_SPEC_VERSION 1 +#define VK_HUAWEI_HDR_VIVID_EXTENSION_NAME "VK_HUAWEI_hdr_vivid" +typedef struct VkPhysicalDeviceHdrVividFeaturesHUAWEI { + VkStructureType sType; + void* pNext; + VkBool32 hdrVivid; +} VkPhysicalDeviceHdrVividFeaturesHUAWEI; + +typedef struct VkHdrVividDynamicMetadataHUAWEI { + VkStructureType sType; + const void* pNext; + size_t dynamicMetadataSize; + const void* pDynamicMetadata; +} VkHdrVividDynamicMetadataHUAWEI; + + + +// VK_NV_cooperative_matrix2 is a preprocessor guard. Do not pass it to API calls. +#define VK_NV_cooperative_matrix2 1 +#define VK_NV_COOPERATIVE_MATRIX_2_SPEC_VERSION 1 +#define VK_NV_COOPERATIVE_MATRIX_2_EXTENSION_NAME "VK_NV_cooperative_matrix2" +typedef struct VkCooperativeMatrixFlexibleDimensionsPropertiesNV { + VkStructureType sType; + void* pNext; + uint32_t MGranularity; + uint32_t NGranularity; + uint32_t KGranularity; + VkComponentTypeKHR AType; + VkComponentTypeKHR BType; + VkComponentTypeKHR CType; + VkComponentTypeKHR ResultType; + VkBool32 saturatingAccumulation; + VkScopeKHR scope; + uint32_t workgroupInvocations; +} VkCooperativeMatrixFlexibleDimensionsPropertiesNV; + +typedef struct VkPhysicalDeviceCooperativeMatrix2FeaturesNV { + VkStructureType sType; + void* pNext; + VkBool32 cooperativeMatrixWorkgroupScope; + VkBool32 cooperativeMatrixFlexibleDimensions; + VkBool32 cooperativeMatrixReductions; + VkBool32 cooperativeMatrixConversions; + VkBool32 cooperativeMatrixPerElementOperations; + VkBool32 cooperativeMatrixTensorAddressing; + VkBool32 cooperativeMatrixBlockLoads; +} VkPhysicalDeviceCooperativeMatrix2FeaturesNV; + +typedef struct VkPhysicalDeviceCooperativeMatrix2PropertiesNV { + VkStructureType sType; + void* pNext; + uint32_t cooperativeMatrixWorkgroupScopeMaxWorkgroupSize; + uint32_t cooperativeMatrixFlexibleDimensionsMaxDimension; + uint32_t cooperativeMatrixWorkgroupScopeReservedSharedMemory; +} VkPhysicalDeviceCooperativeMatrix2PropertiesNV; + +typedef VkResult (VKAPI_PTR *PFN_vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV)(VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount, VkCooperativeMatrixFlexibleDimensionsPropertiesNV* pProperties); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetPhysicalDeviceCooperativeMatrixFlexibleDimensionsPropertiesNV( + VkPhysicalDevice physicalDevice, + uint32_t* pPropertyCount, + VkCooperativeMatrixFlexibleDimensionsPropertiesNV* pProperties); +#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 +#define VK_EXT_VERTEX_ATTRIBUTE_ROBUSTNESS_EXTENSION_NAME "VK_EXT_vertex_attribute_robustness" +typedef struct VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 vertexAttributeRobustness; +} VkPhysicalDeviceVertexAttributeRobustnessFeaturesEXT; + + + // 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 diff --git a/vendor/vulkan/_gen/vulkan_video_codec_av1std.h b/vendor/vulkan/_gen/vulkan_video_codec_av1std.h index 8ce283e8a..4fdced78e 100644 --- a/vendor/vulkan/_gen/vulkan_video_codec_av1std.h +++ b/vendor/vulkan/_gen/vulkan_video_codec_av1std.h @@ -132,7 +132,7 @@ typedef enum StdVideoAV1FrameRestorationType { typedef enum StdVideoAV1ColorPrimaries { STD_VIDEO_AV1_COLOR_PRIMARIES_BT_709 = 1, - STD_VIDEO_AV1_COLOR_PRIMARIES_BT_UNSPECIFIED = 2, + STD_VIDEO_AV1_COLOR_PRIMARIES_UNSPECIFIED = 2, STD_VIDEO_AV1_COLOR_PRIMARIES_BT_470_M = 4, STD_VIDEO_AV1_COLOR_PRIMARIES_BT_470_B_G = 5, STD_VIDEO_AV1_COLOR_PRIMARIES_BT_601 = 6, @@ -144,6 +144,8 @@ 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 = 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_encode.h b/vendor/vulkan/_gen/vulkan_video_codec_av1std_encode.h new file mode 100644 index 000000000..87fc093b5 --- /dev/null +++ b/vendor/vulkan/_gen/vulkan_video_codec_av1std_encode.h @@ -0,0 +1,143 @@ +#ifndef VULKAN_VIDEO_CODEC_AV1STD_ENCODE_H_ +#define VULKAN_VIDEO_CODEC_AV1STD_ENCODE_H_ 1 + +/* +** Copyright 2015-2024 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_av1std_encode is a preprocessor guard. Do not pass it to API calls. +#define vulkan_video_codec_av1std_encode 1 +#include "vulkan_video_codec_av1std.h" + +#define VK_STD_VULKAN_VIDEO_CODEC_AV1_ENCODE_API_VERSION_1_0_0 VK_MAKE_VIDEO_STD_VERSION(1, 0, 0) + +#define VK_STD_VULKAN_VIDEO_CODEC_AV1_ENCODE_SPEC_VERSION VK_STD_VULKAN_VIDEO_CODEC_AV1_ENCODE_API_VERSION_1_0_0 +#define VK_STD_VULKAN_VIDEO_CODEC_AV1_ENCODE_EXTENSION_NAME "VK_STD_vulkan_video_codec_av1_encode" +typedef struct StdVideoEncodeAV1DecoderModelInfo { + uint8_t buffer_delay_length_minus_1; + uint8_t buffer_removal_time_length_minus_1; + uint8_t frame_presentation_time_length_minus_1; + uint8_t reserved1; + uint32_t num_units_in_decoding_tick; +} StdVideoEncodeAV1DecoderModelInfo; + +typedef struct StdVideoEncodeAV1ExtensionHeader { + uint8_t temporal_id; + uint8_t spatial_id; +} StdVideoEncodeAV1ExtensionHeader; + +typedef struct StdVideoEncodeAV1OperatingPointInfoFlags { + uint32_t decoder_model_present_for_this_op : 1; + uint32_t low_delay_mode_flag : 1; + uint32_t initial_display_delay_present_for_this_op : 1; + uint32_t reserved : 29; +} StdVideoEncodeAV1OperatingPointInfoFlags; + +typedef struct StdVideoEncodeAV1OperatingPointInfo { + StdVideoEncodeAV1OperatingPointInfoFlags flags; + uint16_t operating_point_idc; + uint8_t seq_level_idx; + uint8_t seq_tier; + uint32_t decoder_buffer_delay; + uint32_t encoder_buffer_delay; + uint8_t initial_display_delay_minus_1; +} StdVideoEncodeAV1OperatingPointInfo; + +typedef struct StdVideoEncodeAV1PictureInfoFlags { + uint32_t error_resilient_mode : 1; + uint32_t disable_cdf_update : 1; + uint32_t use_superres : 1; + uint32_t render_and_frame_size_different : 1; + uint32_t allow_screen_content_tools : 1; + uint32_t is_filter_switchable : 1; + uint32_t force_integer_mv : 1; + uint32_t frame_size_override_flag : 1; + uint32_t buffer_removal_time_present_flag : 1; + uint32_t allow_intrabc : 1; + uint32_t frame_refs_short_signaling : 1; + uint32_t allow_high_precision_mv : 1; + uint32_t is_motion_mode_switchable : 1; + uint32_t use_ref_frame_mvs : 1; + uint32_t disable_frame_end_update_cdf : 1; + uint32_t allow_warped_motion : 1; + uint32_t reduced_tx_set : 1; + uint32_t skip_mode_present : 1; + uint32_t delta_q_present : 1; + uint32_t delta_lf_present : 1; + uint32_t delta_lf_multi : 1; + uint32_t segmentation_enabled : 1; + uint32_t segmentation_update_map : 1; + uint32_t segmentation_temporal_update : 1; + uint32_t segmentation_update_data : 1; + uint32_t UsesLr : 1; + uint32_t usesChromaLr : 1; + uint32_t show_frame : 1; + uint32_t showable_frame : 1; + uint32_t reserved : 3; +} StdVideoEncodeAV1PictureInfoFlags; + +typedef struct StdVideoEncodeAV1PictureInfo { + StdVideoEncodeAV1PictureInfoFlags flags; + StdVideoAV1FrameType frame_type; + uint32_t frame_presentation_time; + uint32_t current_frame_id; + uint8_t order_hint; + uint8_t primary_ref_frame; + uint8_t refresh_frame_flags; + uint8_t coded_denom; + uint16_t render_width_minus_1; + uint16_t render_height_minus_1; + StdVideoAV1InterpolationFilter interpolation_filter; + StdVideoAV1TxMode TxMode; + uint8_t delta_q_res; + uint8_t delta_lf_res; + uint8_t ref_order_hint[STD_VIDEO_AV1_NUM_REF_FRAMES]; + int8_t ref_frame_idx[STD_VIDEO_AV1_REFS_PER_FRAME]; + uint8_t reserved1[3]; + uint32_t delta_frame_id_minus_1[STD_VIDEO_AV1_REFS_PER_FRAME]; + const StdVideoAV1TileInfo* pTileInfo; + const StdVideoAV1Quantization* pQuantization; + const StdVideoAV1Segmentation* pSegmentation; + const StdVideoAV1LoopFilter* pLoopFilter; + const StdVideoAV1CDEF* pCDEF; + const StdVideoAV1LoopRestoration* pLoopRestoration; + const StdVideoAV1GlobalMotion* pGlobalMotion; + const StdVideoEncodeAV1ExtensionHeader* pExtensionHeader; + const uint32_t* pBufferRemovalTimes; +} StdVideoEncodeAV1PictureInfo; + +typedef struct StdVideoEncodeAV1ReferenceInfoFlags { + uint32_t disable_frame_end_update_cdf : 1; + uint32_t segmentation_enabled : 1; + uint32_t reserved : 30; +} StdVideoEncodeAV1ReferenceInfoFlags; + +typedef struct StdVideoEncodeAV1ReferenceInfo { + StdVideoEncodeAV1ReferenceInfoFlags flags; + uint32_t RefFrameId; + StdVideoAV1FrameType frame_type; + uint8_t OrderHint; + uint8_t reserved1[3]; + const StdVideoEncodeAV1ExtensionHeader* pExtensionHeader; +} StdVideoEncodeAV1ReferenceInfo; + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/vulkan/core.odin b/vendor/vulkan/core.odin index 2f788db13..3058e9e1f 100644 --- a/vendor/vulkan/core.odin +++ b/vendor/vulkan/core.odin @@ -6,6 +6,7 @@ API_VERSION_1_0 :: (1<<22) | (0<<12) | (0) API_VERSION_1_1 :: (1<<22) | (1<<12) | (0) API_VERSION_1_2 :: (1<<22) | (2<<12) | (0) API_VERSION_1_3 :: (1<<22) | (3<<12) | (0) +API_VERSION_1_4 :: (1<<22) | (4<<12) | (0) MAKE_VERSION :: proc(major, minor, patch: u32) -> u32 { return (major<<22) | (minor<<12) | (patch) @@ -47,11 +48,12 @@ MAX_DEVICE_GROUP_SIZE :: 32 LUID_SIZE_KHX :: 8 LUID_SIZE :: 8 MAX_QUEUE_FAMILY_EXTERNAL :: ~u32(1) -MAX_GLOBAL_PRIORITY_SIZE_EXT :: 16 +MAX_GLOBAL_PRIORITY_SIZE :: 16 +MAX_GLOBAL_PRIORITY_SIZE_EXT :: MAX_GLOBAL_PRIORITY_SIZE QUEUE_FAMILY_EXTERNAL :: MAX_QUEUE_FAMILY_EXTERNAL // General Constants -HEADER_VERSION :: 296 +HEADER_VERSION :: 303 MAX_DRIVER_NAME_SIZE :: 256 MAX_DRIVER_INFO_SIZE :: 256 @@ -85,6 +87,7 @@ VIDEO_H264_SCALING_LIST_8X8_NUM_ELEMENTS :: 64 VIDEO_H264_MAX_NUM_LIST_REF :: 32 VIDEO_H264_MAX_CHROMA_PLANES :: 2 VIDEO_H264_NO_REFERENCE_PICTURE :: 0xFF +VIDEO_DECODE_H264_FIELD_ORDER_COUNT_LIST_SIZE :: 2 VIDEO_H265_CPB_CNT_LIST_SIZE :: 32 VIDEO_H265_SUBLAYERS_LIST_SIZE :: 7 VIDEO_H265_SCALING_LIST_4X4_NUM_LISTS :: 6 @@ -108,7 +111,6 @@ VIDEO_H265_MAX_LONG_TERM_REF_PICS_SPS :: 32 VIDEO_H265_MAX_LONG_TERM_PICS :: 16 VIDEO_H265_MAX_DELTA_POC :: 48 VIDEO_H265_NO_REFERENCE_PICTURE :: 0xFF -VIDEO_DECODE_H264_FIELD_ORDER_COUNT_LIST_SIZE :: 2 VIDEO_DECODE_H265_REF_PIC_SET_LIST_SIZE :: 8 // Vendor Constants @@ -281,9 +283,9 @@ KHR_video_decode_h265 :: 1 KHR_VIDEO_DECODE_H265_SPEC_VERSION :: 8 KHR_VIDEO_DECODE_H265_EXTENSION_NAME :: "VK_KHR_video_decode_h265" KHR_global_priority :: 1 -MAX_GLOBAL_PRIORITY_SIZE_KHR :: 16 KHR_GLOBAL_PRIORITY_SPEC_VERSION :: 1 KHR_GLOBAL_PRIORITY_EXTENSION_NAME :: "VK_KHR_global_priority" +MAX_GLOBAL_PRIORITY_SIZE_KHR :: MAX_GLOBAL_PRIORITY_SIZE KHR_driver_properties :: 1 KHR_DRIVER_PROPERTIES_SPEC_VERSION :: 1 KHR_DRIVER_PROPERTIES_EXTENSION_NAME :: "VK_KHR_driver_properties" @@ -414,6 +416,9 @@ KHR_video_decode_av1 :: 1 MAX_VIDEO_AV1_REFERENCES_PER_FRAME_KHR :: 7 KHR_VIDEO_DECODE_AV1_SPEC_VERSION :: 1 KHR_VIDEO_DECODE_AV1_EXTENSION_NAME :: "VK_KHR_video_decode_av1" +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_maintenance1 :: 1 KHR_VIDEO_MAINTENANCE_1_SPEC_VERSION :: 1 KHR_VIDEO_MAINTENANCE_1_EXTENSION_NAME :: "VK_KHR_video_maintenance1" @@ -441,6 +446,9 @@ KHR_SHADER_EXPECT_ASSUME_EXTENSION_NAME :: "VK_KHR_shader_expe KHR_maintenance6 :: 1 KHR_MAINTENANCE_6_SPEC_VERSION :: 1 KHR_MAINTENANCE_6_EXTENSION_NAME :: "VK_KHR_maintenance6" +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" KHR_shader_relaxed_extended_instruction :: 1 KHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_SPEC_VERSION :: 1 KHR_SHADER_RELAXED_EXTENDED_INSTRUCTION_EXTENSION_NAME :: "VK_KHR_shader_relaxed_extended_instruction" @@ -478,10 +486,10 @@ EXT_transform_feedback :: 1 EXT_TRANSFORM_FEEDBACK_SPEC_VERSION :: 1 EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME :: "VK_EXT_transform_feedback" NVX_binary_import :: 1 -NVX_BINARY_IMPORT_SPEC_VERSION :: 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 :: 2 +NVX_IMAGE_VIEW_HANDLE_SPEC_VERSION :: 3 NVX_IMAGE_VIEW_HANDLE_EXTENSION_NAME :: "VK_NVX_image_view_handle" AMD_draw_indirect_count :: 1 AMD_DRAW_INDIRECT_COUNT_SPEC_VERSION :: 2 @@ -905,6 +913,9 @@ EXT_DEPTH_CLIP_CONTROL_EXTENSION_NAME :: "VK_EXT_depth_clip_ EXT_primitive_topology_list_restart :: 1 EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_SPEC_VERSION :: 1 EXT_PRIMITIVE_TOPOLOGY_LIST_RESTART_EXTENSION_NAME :: "VK_EXT_primitive_topology_list_restart" +EXT_present_mode_fifo_latest_ready :: 1 +EXT_PRESENT_MODE_FIFO_LATEST_READY_SPEC_VERSION :: 1 +EXT_PRESENT_MODE_FIFO_LATEST_READY_EXTENSION_NAME :: "VK_EXT_present_mode_fifo_latest_ready" NV_external_memory_rdma :: 1 NV_EXTERNAL_MEMORY_RDMA_SPEC_VERSION :: 1 NV_EXTERNAL_MEMORY_RDMA_EXTENSION_NAME :: "VK_NV_external_memory_rdma" @@ -1046,6 +1057,9 @@ EXT_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_EXTENSION_NAME :: "VK_EXT_attachment_ NV_descriptor_pool_overallocation :: 1 NV_DESCRIPTOR_POOL_OVERALLOCATION_SPEC_VERSION :: 1 NV_DESCRIPTOR_POOL_OVERALLOCATION_EXTENSION_NAME :: "VK_NV_descriptor_pool_overallocation" +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" @@ -1067,6 +1081,12 @@ EXT_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME :: "VK_EXT_device_gene 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" +EXT_vertex_attribute_robustness :: 1 +EXT_VERTEX_ATTRIBUTE_ROBUSTNESS_SPEC_VERSION :: 1 +EXT_VERTEX_ATTRIBUTE_ROBUSTNESS_EXTENSION_NAME :: "VK_EXT_vertex_attribute_robustness" KHR_acceleration_structure :: 1 KHR_ACCELERATION_STRUCTURE_SPEC_VERSION :: 13 KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME :: "VK_KHR_acceleration_structure" diff --git a/vendor/vulkan/enums.odin b/vendor/vulkan/enums.odin index 7edea0231..5ac8d1612 100644 --- a/vendor/vulkan/enums.odin +++ b/vendor/vulkan/enums.odin @@ -108,8 +108,7 @@ AttachmentLoadOp :: enum c.int { LOAD = 0, CLEAR = 1, DONT_CARE = 2, - NONE_KHR = 1000400000, - NONE_EXT = NONE_KHR, + NONE = 1000400000, } AttachmentStoreOp :: enum c.int { @@ -600,12 +599,13 @@ DescriptorPoolCreateFlag :: enum Flags { DescriptorSetLayoutCreateFlags :: distinct bit_set[DescriptorSetLayoutCreateFlag; Flags] DescriptorSetLayoutCreateFlag :: enum Flags { UPDATE_AFTER_BIND_POOL = 1, - PUSH_DESCRIPTOR_KHR = 0, + PUSH_DESCRIPTOR = 0, DESCRIPTOR_BUFFER_EXT = 4, EMBEDDED_IMMUTABLE_SAMPLERS_EXT = 5, INDIRECT_BINDABLE_NV = 7, HOST_ONLY_POOL_EXT = 2, PER_STAGE_NV = 6, + PUSH_DESCRIPTOR_KHR = PUSH_DESCRIPTOR, UPDATE_AFTER_BIND_POOL_EXT = UPDATE_AFTER_BIND_POOL, HOST_ONLY_POOL_VALVE = HOST_ONLY_POOL_EXT, } @@ -634,7 +634,8 @@ DescriptorType :: enum c.int { DescriptorUpdateTemplateType :: enum c.int { DESCRIPTOR_SET = 0, - PUSH_DESCRIPTORS_KHR = 1, + PUSH_DESCRIPTORS = 1, + PUSH_DESCRIPTORS_KHR = PUSH_DESCRIPTORS, DESCRIPTOR_SET_KHR = DESCRIPTOR_SET, } @@ -723,6 +724,13 @@ DisplayPowerStateEXT :: enum c.int { ON = 2, } +DisplaySurfaceStereoTypeNV :: enum c.int { + NONE = 0, + ONBOARD_DIN = 1, + HDMI_3D = 2, + INBAND_DISPLAYPORT = 3, +} + DriverId :: enum c.int { AMD_PROPRIETARY = 1, AMD_OPEN_SOURCE = 2, @@ -790,6 +798,7 @@ DynamicState :: enum c.int { RASTERIZER_DISCARD_ENABLE = 1000377001, DEPTH_BIAS_ENABLE = 1000377002, PRIMITIVE_RESTART_ENABLE = 1000377004, + LINE_STIPPLE = 1000259000, VIEWPORT_W_SCALING_NV = 1000087000, DISCARD_RECTANGLE_EXT = 1000099000, DISCARD_RECTANGLE_ENABLE_EXT = 1000099001, @@ -837,9 +846,8 @@ DynamicState :: enum c.int { REPRESENTATIVE_FRAGMENT_TEST_ENABLE_NV = 1000455031, COVERAGE_REDUCTION_MODE_NV = 1000455032, ATTACHMENT_FEEDBACK_LOOP_ENABLE_EXT = 1000524000, - LINE_STIPPLE_KHR = 1000259000, DEPTH_CLAMP_RANGE_EXT = 1000582000, - LINE_STIPPLE_EXT = LINE_STIPPLE_KHR, + LINE_STIPPLE_EXT = LINE_STIPPLE, CULL_MODE_EXT = CULL_MODE, FRONT_FACE_EXT = FRONT_FACE, PRIMITIVE_TOPOLOGY_EXT = PRIMITIVE_TOPOLOGY, @@ -855,6 +863,7 @@ DynamicState :: enum c.int { RASTERIZER_DISCARD_ENABLE_EXT = RASTERIZER_DISCARD_ENABLE, DEPTH_BIAS_ENABLE_EXT = DEPTH_BIAS_ENABLE, PRIMITIVE_RESTART_ENABLE_EXT = PRIMITIVE_RESTART_ENABLE, + LINE_STIPPLE_KHR = LINE_STIPPLE, } EventCreateFlags :: distinct bit_set[EventCreateFlag; Flags] @@ -1225,6 +1234,8 @@ Format :: enum c.int { ASTC_10x10_SFLOAT_BLOCK = 1000066011, ASTC_12x10_SFLOAT_BLOCK = 1000066012, ASTC_12x12_SFLOAT_BLOCK = 1000066013, + A1B5G5R5_UNORM_PACK16 = 1000470000, + A8_UNORM = 1000470001, PVRTC1_2BPP_UNORM_BLOCK_IMG = 1000054000, PVRTC1_4BPP_UNORM_BLOCK_IMG = 1000054001, PVRTC2_2BPP_UNORM_BLOCK_IMG = 1000054002, @@ -1234,8 +1245,6 @@ Format :: enum c.int { PVRTC2_2BPP_SRGB_BLOCK_IMG = 1000054006, PVRTC2_4BPP_SRGB_BLOCK_IMG = 1000054007, R16G16_SFIXED5_NV = 1000464000, - A1B5G5R5_UNORM_PACK16_KHR = 1000470000, - A8_UNORM_KHR = 1000470001, 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, @@ -1291,6 +1300,8 @@ Format :: enum c.int { A4R4G4B4_UNORM_PACK16_EXT = A4R4G4B4_UNORM_PACK16, A4B4G4R4_UNORM_PACK16_EXT = A4B4G4R4_UNORM_PACK16, R16G16_S10_5_NV = R16G16_SFIXED5_NV, + A1B5G5R5_UNORM_PACK16_KHR = A1B5G5R5_UNORM_PACK16, + A8_UNORM_KHR = A8_UNORM, } FormatFeatureFlags :: distinct bit_set[FormatFeatureFlag; Flags] @@ -1429,9 +1440,10 @@ GraphicsPipelineLibraryFlagEXT :: enum Flags { FRAGMENT_OUTPUT_INTERFACE = 3, } -HostImageCopyFlagsEXT :: distinct bit_set[HostImageCopyFlagEXT; Flags] -HostImageCopyFlagEXT :: enum Flags { - MEMCPY = 0, +HostImageCopyFlags :: distinct bit_set[HostImageCopyFlag; Flags] +HostImageCopyFlag :: enum Flags { + MEMCPY = 0, + MEMCPY_EXT = MEMCPY, } ImageAspectFlags :: distinct bit_set[ImageAspectFlag; Flags] @@ -1544,6 +1556,7 @@ ImageLayout :: enum c.int { STENCIL_READ_ONLY_OPTIMAL = 1000241003, READ_ONLY_OPTIMAL = 1000314000, ATTACHMENT_OPTIMAL = 1000314001, + RENDERING_LOCAL_READ = 1000232000, PRESENT_SRC_KHR = 1000001002, VIDEO_DECODE_DST_KHR = 1000024000, VIDEO_DECODE_SRC_KHR = 1000024001, @@ -1551,14 +1564,15 @@ ImageLayout :: enum c.int { SHARED_PRESENT_KHR = 1000111000, FRAGMENT_DENSITY_MAP_OPTIMAL_EXT = 1000218000, FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR = 1000164003, - RENDERING_LOCAL_READ_KHR = 1000232000, VIDEO_ENCODE_DST_KHR = 1000299000, VIDEO_ENCODE_SRC_KHR = 1000299001, VIDEO_ENCODE_DPB_KHR = 1000299002, ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT = 1000339000, + VIDEO_ENCODE_QUANTIZATION_MAP_KHR = 1000553000, 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, + RENDERING_LOCAL_READ_KHR = RENDERING_LOCAL_READ, DEPTH_ATTACHMENT_OPTIMAL_KHR = DEPTH_ATTACHMENT_OPTIMAL, DEPTH_READ_ONLY_OPTIMAL_KHR = DEPTH_READ_ONLY_OPTIMAL, STENCIL_ATTACHMENT_OPTIMAL_KHR = STENCIL_ATTACHMENT_OPTIMAL, @@ -1581,28 +1595,31 @@ ImageType :: enum c.int { ImageUsageFlags :: distinct bit_set[ImageUsageFlag; Flags] ImageUsageFlag :: enum Flags { - TRANSFER_SRC = 0, - TRANSFER_DST = 1, - SAMPLED = 2, - STORAGE = 3, - COLOR_ATTACHMENT = 4, - DEPTH_STENCIL_ATTACHMENT = 5, - TRANSIENT_ATTACHMENT = 6, - INPUT_ATTACHMENT = 7, - VIDEO_DECODE_DST_KHR = 10, - VIDEO_DECODE_SRC_KHR = 11, - VIDEO_DECODE_DPB_KHR = 12, - FRAGMENT_DENSITY_MAP_EXT = 9, - FRAGMENT_SHADING_RATE_ATTACHMENT_KHR = 8, - HOST_TRANSFER_EXT = 22, - VIDEO_ENCODE_DST_KHR = 13, - VIDEO_ENCODE_SRC_KHR = 14, - VIDEO_ENCODE_DPB_KHR = 15, - ATTACHMENT_FEEDBACK_LOOP_EXT = 19, - INVOCATION_MASK_HUAWEI = 18, - SAMPLE_WEIGHT_QCOM = 20, - SAMPLE_BLOCK_MATCH_QCOM = 21, - SHADING_RATE_IMAGE_NV = FRAGMENT_SHADING_RATE_ATTACHMENT_KHR, + TRANSFER_SRC = 0, + TRANSFER_DST = 1, + SAMPLED = 2, + STORAGE = 3, + COLOR_ATTACHMENT = 4, + DEPTH_STENCIL_ATTACHMENT = 5, + TRANSIENT_ATTACHMENT = 6, + INPUT_ATTACHMENT = 7, + HOST_TRANSFER = 22, + VIDEO_DECODE_DST_KHR = 10, + VIDEO_DECODE_SRC_KHR = 11, + VIDEO_DECODE_DPB_KHR = 12, + FRAGMENT_DENSITY_MAP_EXT = 9, + FRAGMENT_SHADING_RATE_ATTACHMENT_KHR = 8, + VIDEO_ENCODE_DST_KHR = 13, + VIDEO_ENCODE_SRC_KHR = 14, + VIDEO_ENCODE_DPB_KHR = 15, + ATTACHMENT_FEEDBACK_LOOP_EXT = 19, + INVOCATION_MASK_HUAWEI = 18, + SAMPLE_WEIGHT_QCOM = 20, + SAMPLE_BLOCK_MATCH_QCOM = 21, + VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_KHR = 25, + VIDEO_ENCODE_EMPHASIS_MAP_KHR = 26, + SHADING_RATE_IMAGE_NV = FRAGMENT_SHADING_RATE_ATTACHMENT_KHR, + HOST_TRANSFER_EXT = HOST_TRANSFER, } ImageViewCreateFlags :: distinct bit_set[ImageViewCreateFlag; Flags] @@ -1625,10 +1642,11 @@ ImageViewType :: enum c.int { IndexType :: enum c.int { UINT16 = 0, UINT32 = 1, + UINT8 = 1000265000, NONE_KHR = 1000165000, - UINT8_KHR = 1000265000, NONE_NV = NONE_KHR, - UINT8_EXT = UINT8_KHR, + UINT8_EXT = UINT8, + UINT8_KHR = UINT8, } IndirectCommandsInputModeFlagsEXT :: distinct bit_set[IndirectCommandsInputModeFlagEXT; Flags] @@ -1732,7 +1750,7 @@ LayeredDriverUnderlyingApiMSFT :: enum c.int { LAYERED_DRIVER_UNDERLYING_API_D3D12_MSFT = 1, } -LineRasterizationModeKHR :: enum c.int { +LineRasterizationMode :: enum c.int { DEFAULT = 0, RECTANGULAR = 1, BRESENHAM = 2, @@ -1741,6 +1759,10 @@ LineRasterizationModeKHR :: enum c.int { RECTANGULAR_EXT = RECTANGULAR, BRESENHAM_EXT = BRESENHAM, RECTANGULAR_SMOOTH_EXT = RECTANGULAR_SMOOTH, + DEFAULT_KHR = DEFAULT, + RECTANGULAR_KHR = RECTANGULAR, + BRESENHAM_KHR = BRESENHAM, + RECTANGULAR_SMOOTH_KHR = RECTANGULAR_SMOOTH, } LogicOp :: enum c.int { @@ -1803,8 +1825,8 @@ MemoryPropertyFlag :: enum Flags { RDMA_CAPABLE_NV = 8, } -MemoryUnmapFlagsKHR :: distinct bit_set[MemoryUnmapFlagKHR; Flags] -MemoryUnmapFlagKHR :: enum Flags { +MemoryUnmapFlags :: distinct bit_set[MemoryUnmapFlag; Flags] +MemoryUnmapFlag :: enum Flags { RESERVE_EXT = 0, } @@ -2077,8 +2099,8 @@ PipelineCreateFlag :: enum Flags { DISPATCH_BASE = 4, FAIL_ON_PIPELINE_COMPILE_REQUIRED = 8, EARLY_RETURN_ON_FAILURE = 9, - RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_KHR = 21, - RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_EXT = 22, + NO_PROTECTED_ACCESS = 27, + PROTECTED_ACCESS_ONLY = 30, RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_KHR = 14, RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_KHR = 15, RAY_TRACING_NO_NULL_MISS_SHADERS_KHR = 16, @@ -2087,6 +2109,8 @@ PipelineCreateFlag :: enum Flags { RAY_TRACING_SKIP_AABBS_KHR = 13, RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_KHR = 19, DEFER_COMPILE_NV = 5, + RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_EXT = 22, + RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_KHR = 21, CAPTURE_STATISTICS_KHR = 6, CAPTURE_INTERNAL_REPRESENTATIONS_KHR = 7, INDIRECT_BINDABLE_NV = 18, @@ -2099,14 +2123,14 @@ PipelineCreateFlag :: enum Flags { DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_EXT = 26, RAY_TRACING_OPACITY_MICROMAP_EXT = 24, RAY_TRACING_DISPLACEMENT_MICROMAP_NV = 28, - NO_PROTECTED_ACCESS_EXT = 27, - PROTECTED_ACCESS_ONLY_EXT = 30, - PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_KHR = RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_KHR, - PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_EXT = RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_EXT, 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, + NO_PROTECTED_ACCESS_EXT = NO_PROTECTED_ACCESS, + PROTECTED_ACCESS_ONLY_EXT = PROTECTED_ACCESS_ONLY, } PipelineCreationFeedbackFlags :: distinct bit_set[PipelineCreationFeedbackFlag; Flags] @@ -2139,18 +2163,26 @@ PipelineLayoutCreateFlag :: enum Flags { INDEPENDENT_SETS_EXT = 1, } -PipelineRobustnessBufferBehaviorEXT :: enum c.int { - DEVICE_DEFAULT = 0, - DISABLED = 1, - ROBUST_BUFFER_ACCESS = 2, - ROBUST_BUFFER_ACCESS_2 = 3, +PipelineRobustnessBufferBehavior :: enum c.int { + DEVICE_DEFAULT = 0, + DISABLED = 1, + ROBUST_BUFFER_ACCESS = 2, + ROBUST_BUFFER_ACCESS_2 = 3, + DEVICE_DEFAULT_EXT = DEVICE_DEFAULT, + DISABLED_EXT = DISABLED, + ROBUST_BUFFER_ACCESS_EXT = ROBUST_BUFFER_ACCESS, + ROBUST_BUFFER_ACCESS_2_EXT = ROBUST_BUFFER_ACCESS_2, } -PipelineRobustnessImageBehaviorEXT :: enum c.int { - DEVICE_DEFAULT = 0, - DISABLED = 1, - ROBUST_IMAGE_ACCESS = 2, - ROBUST_IMAGE_ACCESS_2 = 3, +PipelineRobustnessImageBehavior :: enum c.int { + DEVICE_DEFAULT = 0, + DISABLED = 1, + ROBUST_IMAGE_ACCESS = 2, + ROBUST_IMAGE_ACCESS_2 = 3, + DEVICE_DEFAULT_EXT = DEVICE_DEFAULT, + DISABLED_EXT = DISABLED, + ROBUST_IMAGE_ACCESS_EXT = ROBUST_IMAGE_ACCESS, + ROBUST_IMAGE_ACCESS_2_EXT = ROBUST_IMAGE_ACCESS_2, } PipelineShaderStageCreateFlags :: distinct bit_set[PipelineShaderStageCreateFlag; Flags] @@ -2228,6 +2260,7 @@ PresentModeKHR :: enum c.int { FIFO_RELAXED = 3, SHARED_DEMAND_REFRESH = 1000111000, SHARED_CONTINUOUS_REFRESH = 1000111001, + FIFO_LATEST_READY_EXT = 1000361000, } PresentScalingFlagsEXT :: distinct bit_set[PresentScalingFlagEXT; Flags] @@ -2331,7 +2364,7 @@ QueueFlag :: enum Flags { OPTICAL_FLOW_NV = 8, } -QueueGlobalPriorityKHR :: enum c.int { +QueueGlobalPriority :: enum c.int { LOW = 128, MEDIUM = 256, HIGH = 512, @@ -2340,6 +2373,10 @@ QueueGlobalPriorityKHR :: enum c.int { MEDIUM_EXT = MEDIUM, HIGH_EXT = HIGH, REALTIME_EXT = REALTIME, + LOW_KHR = LOW, + MEDIUM_KHR = MEDIUM, + HIGH_KHR = HIGH, + REALTIME_KHR = REALTIME, } RasterizationOrderAMD :: enum c.int { @@ -2420,6 +2457,7 @@ Result :: enum c.int { ERROR_FRAGMENTATION = -1000161000, ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS = -1000257000, PIPELINE_COMPILE_REQUIRED = 1000297000, + ERROR_NOT_PERMITTED = -1000174001, ERROR_SURFACE_LOST_KHR = -1000000000, ERROR_NATIVE_WINDOW_IN_USE_KHR = -1000000001, SUBOPTIMAL_KHR = 1000001003, @@ -2434,7 +2472,6 @@ 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_NOT_PERMITTED_KHR = -1000174001, ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT = -1000255000, THREAD_IDLE_KHR = 1000268000, THREAD_DONE_KHR = 1000268001, @@ -2448,7 +2485,8 @@ Result :: enum c.int { 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, - ERROR_NOT_PERMITTED_EXT = ERROR_NOT_PERMITTED_KHR, + ERROR_NOT_PERMITTED_EXT = ERROR_NOT_PERMITTED, + ERROR_NOT_PERMITTED_KHR = ERROR_NOT_PERMITTED, ERROR_INVALID_DEVICE_ADDRESS_EXT = ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS, ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR = ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS, PIPELINE_COMPILE_REQUIRED_EXT = PIPELINE_COMPILE_REQUIRED, @@ -2894,6 +2932,56 @@ StructureType :: enum c.int { 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, @@ -2944,6 +3032,7 @@ StructureType :: enum c.int { 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, @@ -2981,10 +3070,6 @@ StructureType :: enum c.int { VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR = 1000040005, VIDEO_DECODE_H264_DPB_SLOT_INFO_KHR = 1000040006, TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD = 1000041000, - RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR = 1000044006, - RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT = 1000044007, - ATTACHMENT_SAMPLE_COUNT_INFO_AMD = 1000044008, - MULTIVIEW_PER_VIEW_ATTRIBUTES_INFO_NVX = 1000044009, STREAM_DESCRIPTOR_SURFACE_CREATE_INFO_GGP = 1000049000, PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV = 1000050000, EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV = 1000056000, @@ -2996,9 +3081,6 @@ StructureType :: enum c.int { VI_SURFACE_CREATE_INFO_NN = 1000062000, IMAGE_VIEW_ASTC_DECODE_MODE_EXT = 1000067000, PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT = 1000067001, - PIPELINE_ROBUSTNESS_CREATE_INFO_EXT = 1000068000, - PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES_EXT = 1000068001, - PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES_EXT = 1000068002, IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR = 1000073000, EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR = 1000073001, MEMORY_WIN32_HANDLE_PROPERTIES_KHR = 1000073002, @@ -3013,7 +3095,6 @@ StructureType :: enum c.int { SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR = 1000078003, IMPORT_SEMAPHORE_FD_INFO_KHR = 1000079000, SEMAPHORE_GET_FD_INFO_KHR = 1000079001, - PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR = 1000080000, COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT = 1000081000, PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT = 1000081001, CONDITIONAL_RENDERING_BEGIN_INFO_EXT = 1000081002, @@ -3026,6 +3107,7 @@ StructureType :: enum c.int { 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, @@ -3075,6 +3157,7 @@ StructureType :: enum c.int { 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, @@ -3149,9 +3232,6 @@ StructureType :: enum c.int { VIDEO_DECODE_H265_PROFILE_INFO_KHR = 1000187003, VIDEO_DECODE_H265_PICTURE_INFO_KHR = 1000187004, VIDEO_DECODE_H265_DPB_SLOT_INFO_KHR = 1000187005, - DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_KHR = 1000174000, - PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_KHR = 1000388000, - QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_KHR = 1000388001, DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD = 1000189000, PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT = 1000190000, PRESENT_FRAME_TOKEN_GGP = 1000191000, @@ -3162,6 +3242,8 @@ StructureType :: enum c.int { 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, @@ -3177,16 +3259,15 @@ StructureType :: enum c.int { 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_DYNAMIC_RENDERING_LOCAL_READ_FEATURES_KHR = 1000232000, - RENDERING_ATTACHMENT_LOCATION_INFO_KHR = 1000232001, - RENDERING_INPUT_ATTACHMENT_INDEX_INFO_KHR = 1000232002, PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT = 1000234000, PHYSICAL_DEVICE_SHADER_QUAD_CONTROL_FEATURES_KHR = 1000235000, PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT = 1000237000, @@ -3221,18 +3302,6 @@ StructureType :: enum c.int { PIPELINE_EXECUTABLE_INFO_KHR = 1000269003, PIPELINE_EXECUTABLE_STATISTIC_KHR = 1000269004, PIPELINE_EXECUTABLE_INTERNAL_REPRESENTATION_KHR = 1000269005, - PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES_EXT = 1000270000, - PHYSICAL_DEVICE_HOST_IMAGE_COPY_PROPERTIES_EXT = 1000270001, - MEMORY_TO_IMAGE_COPY_EXT = 1000270002, - IMAGE_TO_MEMORY_COPY_EXT = 1000270003, - COPY_IMAGE_TO_MEMORY_INFO_EXT = 1000270004, - COPY_MEMORY_TO_IMAGE_INFO_EXT = 1000270005, - HOST_IMAGE_LAYOUT_TRANSITION_INFO_EXT = 1000270006, - COPY_IMAGE_TO_IMAGE_INFO_EXT = 1000270007, - SUBRESOURCE_HOST_MEMCPY_SIZE_EXT = 1000270008, - HOST_IMAGE_COPY_DEVICE_PERFORMANCE_QUERY_EXT = 1000270009, - MEMORY_MAP_INFO_KHR = 1000271000, - MEMORY_UNMAP_INFO_KHR = 1000271001, PHYSICAL_DEVICE_MAP_MEMORY_PLACED_FEATURES_EXT = 1000272000, PHYSICAL_DEVICE_MAP_MEMORY_PLACED_PROPERTIES_EXT = 1000272001, MEMORY_MAP_PLACED_INFO_EXT = 1000272002, @@ -3307,8 +3376,6 @@ StructureType :: enum c.int { IMPORT_METAL_IO_SURFACE_INFO_EXT = 1000311009, EXPORT_METAL_SHARED_EVENT_INFO_EXT = 1000311010, IMPORT_METAL_SHARED_EVENT_INFO_EXT = 1000311011, - QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV = 1000314008, - CHECKPOINT_DATA_2_NV = 1000314009, PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_PROPERTIES_EXT = 1000316000, PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_DENSITY_MAP_PROPERTIES_EXT = 1000316001, PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT = 1000316002, @@ -3361,6 +3428,7 @@ StructureType :: enum c.int { 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, @@ -3422,7 +3490,6 @@ StructureType :: enum c.int { 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, - PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES_KHR = 1000416000, DEVICE_QUEUE_SHADER_CORE_CONTROL_CREATE_INFO_ARM = 1000417000, PHYSICAL_DEVICE_SCHEDULING_CONTROLS_FEATURES_ARM = 1000417001, PHYSICAL_DEVICE_SCHEDULING_CONTROLS_PROPERTIES_ARM = 1000417002, @@ -3478,18 +3545,9 @@ StructureType :: enum c.int { OPTICAL_FLOW_EXECUTE_INFO_NV = 1000464005, OPTICAL_FLOW_SESSION_CREATE_PRIVATE_DATA_INFO_NV = 1000464010, PHYSICAL_DEVICE_LEGACY_DITHERING_FEATURES_EXT = 1000465000, - PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES_EXT = 1000466000, 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_MAINTENANCE_5_FEATURES_KHR = 1000470000, - PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES_KHR = 1000470001, - RENDERING_AREA_INFO_KHR = 1000470003, - DEVICE_IMAGE_SUBRESOURCE_INFO_KHR = 1000470004, - SUBRESOURCE_LAYOUT_2_KHR = 1000338002, - IMAGE_SUBRESOURCE_2_KHR = 1000338003, - PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR = 1000470005, - BUFFER_USAGE_FLAGS_2_CREATE_INFO_KHR = 1000470006, PHYSICAL_DEVICE_ANTI_LAG_FEATURES_AMD = 1000476000, ANTI_LAG_DATA_AMD = 1000476001, ANTI_LAG_PRESENTATION_INFO_AMD = 1000476002, @@ -3546,6 +3604,17 @@ StructureType :: enum c.int { 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, @@ -3559,32 +3628,28 @@ StructureType :: enum c.int { 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_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_KHR = 1000525000, - PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_KHR = 1000190001, - PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR = 1000190002, - PHYSICAL_DEVICE_SHADER_FLOAT_CONTROLS_2_FEATURES_KHR = 1000528000, 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, - PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_KHR = 1000265000, - PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_KHR = 1000259000, - PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_KHR = 1000259001, - PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_KHR = 1000259002, CALIBRATED_TIMESTAMP_INFO_KHR = 1000184000, - PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES_KHR = 1000544000, - PHYSICAL_DEVICE_MAINTENANCE_6_FEATURES_KHR = 1000545000, - PHYSICAL_DEVICE_MAINTENANCE_6_PROPERTIES_KHR = 1000545001, - BIND_MEMORY_STATUS_KHR = 1000545002, - BIND_DESCRIPTOR_SETS_INFO_KHR = 1000545003, - PUSH_CONSTANTS_INFO_KHR = 1000545004, - PUSH_DESCRIPTOR_SET_INFO_KHR = 1000545005, - PUSH_DESCRIPTOR_SET_WITH_TEMPLATE_INFO_KHR = 1000545006, 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, @@ -3615,6 +3680,12 @@ StructureType :: enum c.int { 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_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_VERTEX_ATTRIBUTE_ROBUSTNESS_FEATURES_EXT = 1000608000, 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, @@ -3623,7 +3694,6 @@ StructureType :: enum c.int { 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, - ATTACHMENT_SAMPLE_COUNT_INFO_NV = ATTACHMENT_SAMPLE_COUNT_INFO_AMD, 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, @@ -3644,6 +3714,9 @@ StructureType :: enum c.int { 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, @@ -3657,6 +3730,7 @@ StructureType :: enum c.int { 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, @@ -3696,6 +3770,7 @@ StructureType :: enum c.int { 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, @@ -3711,13 +3786,16 @@ StructureType :: enum c.int { 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_KHR, + 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, - PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT = PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_KHR, - PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT = PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_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, @@ -3738,6 +3816,9 @@ StructureType :: enum c.int { 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, @@ -3751,11 +3832,23 @@ StructureType :: enum c.int { 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_KHR, - PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT = PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_KHR, - PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT = PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_KHR, + 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_KHR, + 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, @@ -3785,20 +3878,46 @@ StructureType :: enum c.int { 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_KHR, - IMAGE_SUBRESOURCE_2_EXT = IMAGE_SUBRESOURCE_2_KHR, + 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_KHR, - QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT = QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_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_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, } SubgroupFeatureFlags :: distinct bit_set[SubgroupFeatureFlag; Flags] @@ -3811,9 +3930,11 @@ SubgroupFeatureFlag :: enum Flags { SHUFFLE_RELATIVE = 5, CLUSTERED = 6, QUAD = 7, + ROTATE = 9, + ROTATE_CLUSTERED = 10, PARTITIONED_NV = 8, - ROTATE_KHR = 9, - ROTATE_CLUSTERED_KHR = 10, + ROTATE_KHR = ROTATE, + ROTATE_CLUSTERED_KHR = ROTATE_CLUSTERED, } SubmitFlags :: distinct bit_set[SubmitFlag; Flags] @@ -4030,6 +4151,7 @@ VideoCodecOperationFlagKHR :: enum Flags { DECODE_H264 = 0, DECODE_H265 = 1, DECODE_AV1 = 2, + ENCODE_AV1 = 18, } VideoCodecOperationFlagsKHR_NONE :: VideoCodecOperationFlagsKHR{} @@ -4080,10 +4202,56 @@ VideoDecodeUsageFlagKHR :: enum Flags { VideoDecodeUsageFlagsKHR_DEFAULT :: VideoDecodeUsageFlagsKHR{} +VideoEncodeAV1CapabilityFlagsKHR :: distinct bit_set[VideoEncodeAV1CapabilityFlagKHR; Flags] +VideoEncodeAV1CapabilityFlagKHR :: enum Flags { + PER_RATE_CONTROL_GROUP_MIN_MAX_Q_INDEX = 0, + GENERATE_OBU_EXTENSION_HEADER = 1, + PRIMARY_REFERENCE_CDF_ONLY = 2, + FRAME_SIZE_OVERRIDE = 3, + MOTION_VECTOR_SCALING = 4, +} + +VideoEncodeAV1PredictionModeKHR :: enum c.int { + INTRA_ONLY = 0, + SINGLE_REFERENCE = 1, + UNIDIRECTIONAL_COMPOUND = 2, + BIDIRECTIONAL_COMPOUND = 3, +} + +VideoEncodeAV1RateControlFlagsKHR :: distinct bit_set[VideoEncodeAV1RateControlFlagKHR; Flags] +VideoEncodeAV1RateControlFlagKHR :: enum Flags { + REGULAR_GOP = 0, + TEMPORAL_LAYER_PATTERN_DYADIC = 1, + REFERENCE_PATTERN_FLAT = 2, + REFERENCE_PATTERN_DYADIC = 3, +} + +VideoEncodeAV1RateControlGroupKHR :: enum c.int { + INTRA = 0, + PREDICTIVE = 1, + BIPREDICTIVE = 2, +} + +VideoEncodeAV1StdFlagsKHR :: distinct bit_set[VideoEncodeAV1StdFlagKHR; Flags] +VideoEncodeAV1StdFlagKHR :: enum Flags { + UNIFORM_TILE_SPACING_FLAG_SET = 0, + SKIP_MODE_PRESENT_UNSET = 1, + PRIMARY_REF_FRAME = 2, + DELTA_Q = 3, +} + +VideoEncodeAV1SuperblockSizeFlagsKHR :: distinct bit_set[VideoEncodeAV1SuperblockSizeFlagKHR; Flags] +VideoEncodeAV1SuperblockSizeFlagKHR :: enum Flags { + _64 = 0, + _128 = 1, +} + VideoEncodeCapabilityFlagsKHR :: distinct bit_set[VideoEncodeCapabilityFlagKHR; Flags] VideoEncodeCapabilityFlagKHR :: enum Flags { PRECEDING_EXTERNALLY_ENCODED_BYTES = 0, INSUFFICIENTSTREAM_BUFFER_RANGE_DETECTION = 1, + QUANTIZATION_DELTA_MAP = 2, + EMPHASIS_MAP = 3, } VideoEncodeContentFlagsKHR :: distinct bit_set[VideoEncodeContentFlagKHR; Flags] @@ -4103,6 +4271,12 @@ VideoEncodeFeedbackFlagKHR :: enum Flags { BITSTREAM_HAS_OVERRIDES = 2, } +VideoEncodeFlagsKHR :: distinct bit_set[VideoEncodeFlagKHR; Flags] +VideoEncodeFlagKHR :: enum Flags { + WITH_QUANTIZATION_DELTA_MAP = 0, + WITH_EMPHASIS_MAP = 1, +} + VideoEncodeH264CapabilityFlagsKHR :: distinct bit_set[VideoEncodeH264CapabilityFlagKHR; Flags] VideoEncodeH264CapabilityFlagKHR :: enum Flags { HRD_COMPLIANCE = 0, @@ -4114,6 +4288,7 @@ VideoEncodeH264CapabilityFlagKHR :: enum Flags { PER_PICTURE_TYPE_MIN_MAX_QP = 6, PER_SLICE_CONSTANT_QP = 7, GENERATE_PREFIX_NALU = 8, + MB_QP_DIFF_WRAPAROUND = 9, } VideoEncodeH264RateControlFlagsKHR :: distinct bit_set[VideoEncodeH264RateControlFlagKHR; Flags] @@ -4161,6 +4336,7 @@ VideoEncodeH265CapabilityFlagKHR :: enum Flags { PER_SLICE_SEGMENT_CONSTANT_QP = 7, MULTIPLE_TILES_PER_SLICE_SEGMENT = 8, MULTIPLE_SLICE_SEGMENTS_PER_TILE = 9, + CU_QP_DIFF_WRAPAROUND = 10, } VideoEncodeH265CtbSizeFlagsKHR :: distinct bit_set[VideoEncodeH265CtbSizeFlagKHR; Flags] @@ -4303,6 +4479,13 @@ VideoSessionCreateFlagKHR :: enum Flags { PROTECTED_CONTENT = 0, ALLOW_ENCODE_PARAMETER_OPTIMIZATIONS = 1, INLINE_QUERIES = 2, + ALLOW_ENCODE_QUANTIZATION_DELTA_MAP = 3, + ALLOW_ENCODE_EMPHASIS_MAP = 4, +} + +VideoSessionParametersCreateFlagsKHR :: distinct bit_set[VideoSessionParametersCreateFlagKHR; Flags] +VideoSessionParametersCreateFlagKHR :: enum Flags { + QUANTIZATION_MAP_COMPATIBLE = 0, } ViewportCoordinateSwizzleNV :: enum c.int { @@ -4394,14 +4577,10 @@ VideoBeginCodingFlagsKHR :: distinct bit_set[VideoBe VideoBeginCodingFlagKHR :: enum u32 {} VideoDecodeFlagsKHR :: distinct bit_set[VideoDecodeFlagKHR; Flags] VideoDecodeFlagKHR :: enum u32 {} -VideoEncodeFlagsKHR :: distinct bit_set[VideoEncodeFlagKHR; Flags] -VideoEncodeFlagKHR :: enum u32 {} VideoEncodeRateControlFlagsKHR :: distinct bit_set[VideoEncodeRateControlFlagKHR; Flags] VideoEncodeRateControlFlagKHR :: enum u32 {} VideoEndCodingFlagsKHR :: distinct bit_set[VideoEndCodingFlagKHR; Flags] VideoEndCodingFlagKHR :: enum u32 {} -VideoSessionParametersCreateFlagsKHR :: distinct bit_set[VideoSessionParametersCreateFlagKHR; Flags] -VideoSessionParametersCreateFlagKHR :: enum u32 {} WaylandSurfaceCreateFlagsKHR :: distinct bit_set[WaylandSurfaceCreateFlagKHR; Flags] WaylandSurfaceCreateFlagKHR :: enum u32 {} Win32SurfaceCreateFlagsKHR :: distinct bit_set[Win32SurfaceCreateFlagKHR; Flags] @@ -4409,49 +4588,49 @@ Win32SurfaceCreateFlagKHR :: enum u32 {} AccessFlags2 :: distinct bit_set[AccessFlag2; Flags64] AccessFlag2 :: enum Flags64 { INDIRECT_COMMAND_READ = 0, - INDIRECT_COMMAND_READ_KHR = 0, INDEX_READ = 1, - INDEX_READ_KHR = 1, VERTEX_ATTRIBUTE_READ = 2, - VERTEX_ATTRIBUTE_READ_KHR = 2, UNIFORM_READ = 3, - UNIFORM_READ_KHR = 3, INPUT_ATTACHMENT_READ = 4, - INPUT_ATTACHMENT_READ_KHR = 4, SHADER_READ = 5, - SHADER_READ_KHR = 5, SHADER_WRITE = 6, - SHADER_WRITE_KHR = 6, COLOR_ATTACHMENT_READ = 7, - COLOR_ATTACHMENT_READ_KHR = 7, COLOR_ATTACHMENT_WRITE = 8, - COLOR_ATTACHMENT_WRITE_KHR = 8, DEPTH_STENCIL_ATTACHMENT_READ = 9, - DEPTH_STENCIL_ATTACHMENT_READ_KHR = 9, DEPTH_STENCIL_ATTACHMENT_WRITE = 10, - DEPTH_STENCIL_ATTACHMENT_WRITE_KHR = 10, TRANSFER_READ = 11, - TRANSFER_READ_KHR = 11, TRANSFER_WRITE = 12, - TRANSFER_WRITE_KHR = 12, HOST_READ = 13, - HOST_READ_KHR = 13, HOST_WRITE = 14, - HOST_WRITE_KHR = 14, MEMORY_READ = 15, - MEMORY_READ_KHR = 15, MEMORY_WRITE = 16, - MEMORY_WRITE_KHR = 16, SHADER_SAMPLED_READ = 32, - SHADER_SAMPLED_READ_KHR = 32, SHADER_STORAGE_READ = 33, - SHADER_STORAGE_READ_KHR = 33, SHADER_STORAGE_WRITE = 34, - SHADER_STORAGE_WRITE_KHR = 34, VIDEO_DECODE_READ_KHR = 35, VIDEO_DECODE_WRITE_KHR = 36, VIDEO_ENCODE_READ_KHR = 37, VIDEO_ENCODE_WRITE_KHR = 38, + INDIRECT_COMMAND_READ_KHR = 0, + INDEX_READ_KHR = 1, + VERTEX_ATTRIBUTE_READ_KHR = 2, + UNIFORM_READ_KHR = 3, + INPUT_ATTACHMENT_READ_KHR = 4, + SHADER_READ_KHR = 5, + SHADER_WRITE_KHR = 6, + COLOR_ATTACHMENT_READ_KHR = 7, + COLOR_ATTACHMENT_WRITE_KHR = 8, + DEPTH_STENCIL_ATTACHMENT_READ_KHR = 9, + DEPTH_STENCIL_ATTACHMENT_WRITE_KHR = 10, + TRANSFER_READ_KHR = 11, + TRANSFER_WRITE_KHR = 12, + HOST_READ_KHR = 13, + HOST_WRITE_KHR = 14, + MEMORY_READ_KHR = 15, + MEMORY_WRITE_KHR = 16, + SHADER_SAMPLED_READ_KHR = 32, + SHADER_STORAGE_READ_KHR = 33, + SHADER_STORAGE_WRITE_KHR = 34, TRANSFORM_FEEDBACK_WRITE_EXT = 25, TRANSFORM_FEEDBACK_COUNTER_READ_EXT = 26, TRANSFORM_FEEDBACK_COUNTER_WRITE_EXT = 27, @@ -4477,62 +4656,78 @@ AccessFlag2 :: enum Flags64 { OPTICAL_FLOW_WRITE_NV = 43, } +BufferUsageFlags2 :: distinct bit_set[BufferUsageFlag2; Flags64] +BufferUsageFlag2 :: enum Flags64 { + TRANSFER_SRC = 0, + TRANSFER_DST = 1, + UNIFORM_TEXEL_BUFFER = 2, + STORAGE_TEXEL_BUFFER = 3, + UNIFORM_BUFFER = 4, + STORAGE_BUFFER = 5, + INDEX_BUFFER = 6, + VERTEX_BUFFER = 7, + INDIRECT_BUFFER = 8, + SHADER_DEVICE_ADDRESS = 17, + EXECUTION_GRAPH_SCRATCH_AMDX = 25, + TRANSFER_SRC_KHR = 0, + TRANSFER_DST_KHR = 1, + UNIFORM_TEXEL_BUFFER_KHR = 2, + STORAGE_TEXEL_BUFFER_KHR = 3, + UNIFORM_BUFFER_KHR = 4, + STORAGE_BUFFER_KHR = 5, + INDEX_BUFFER_KHR = 6, + VERTEX_BUFFER_KHR = 7, + INDIRECT_BUFFER_KHR = 8, + CONDITIONAL_RENDERING_EXT = 9, + SHADER_BINDING_TABLE_KHR = 10, + RAY_TRACING_NV = 10, + TRANSFORM_FEEDBACK_BUFFER_EXT = 11, + TRANSFORM_FEEDBACK_COUNTER_BUFFER_EXT = 12, + VIDEO_DECODE_SRC_KHR = 13, + VIDEO_DECODE_DST_KHR = 14, + VIDEO_ENCODE_DST_KHR = 15, + VIDEO_ENCODE_SRC_KHR = 16, + SHADER_DEVICE_ADDRESS_KHR = 17, + ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_KHR = 19, + ACCELERATION_STRUCTURE_STORAGE_KHR = 20, + 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, + PREPROCESS_BUFFER_EXT = 31, +} + FormatFeatureFlags2 :: distinct bit_set[FormatFeatureFlag2; Flags64] FormatFeatureFlag2 :: enum Flags64 { SAMPLED_IMAGE = 0, - SAMPLED_IMAGE_KHR = 0, STORAGE_IMAGE = 1, - STORAGE_IMAGE_KHR = 1, STORAGE_IMAGE_ATOMIC = 2, - STORAGE_IMAGE_ATOMIC_KHR = 2, UNIFORM_TEXEL_BUFFER = 3, - UNIFORM_TEXEL_BUFFER_KHR = 3, STORAGE_TEXEL_BUFFER = 4, - STORAGE_TEXEL_BUFFER_KHR = 4, STORAGE_TEXEL_BUFFER_ATOMIC = 5, - STORAGE_TEXEL_BUFFER_ATOMIC_KHR = 5, VERTEX_BUFFER = 6, - VERTEX_BUFFER_KHR = 6, COLOR_ATTACHMENT = 7, - COLOR_ATTACHMENT_KHR = 7, COLOR_ATTACHMENT_BLEND = 8, - COLOR_ATTACHMENT_BLEND_KHR = 8, DEPTH_STENCIL_ATTACHMENT = 9, - DEPTH_STENCIL_ATTACHMENT_KHR = 9, BLIT_SRC = 10, - BLIT_SRC_KHR = 10, BLIT_DST = 11, - BLIT_DST_KHR = 11, SAMPLED_IMAGE_FILTER_LINEAR = 12, - SAMPLED_IMAGE_FILTER_LINEAR_KHR = 12, - SAMPLED_IMAGE_FILTER_CUBIC = 13, - SAMPLED_IMAGE_FILTER_CUBIC_EXT = 13, TRANSFER_SRC = 14, - TRANSFER_SRC_KHR = 14, TRANSFER_DST = 15, - TRANSFER_DST_KHR = 15, SAMPLED_IMAGE_FILTER_MINMAX = 16, - SAMPLED_IMAGE_FILTER_MINMAX_KHR = 16, MIDPOINT_CHROMA_SAMPLES = 17, - MIDPOINT_CHROMA_SAMPLES_KHR = 17, SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER = 18, - SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_KHR = 18, SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER = 19, - SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_KHR = 19, SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT = 20, - SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_KHR = 20, SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE = 21, - SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_KHR = 21, DISJOINT = 22, - DISJOINT_KHR = 22, COSITED_CHROMA_SAMPLES = 23, - COSITED_CHROMA_SAMPLES_KHR = 23, STORAGE_READ_WITHOUT_FORMAT = 31, - STORAGE_READ_WITHOUT_FORMAT_KHR = 31, STORAGE_WRITE_WITHOUT_FORMAT = 32, - STORAGE_WRITE_WITHOUT_FORMAT_KHR = 32, SAMPLED_IMAGE_DEPTH_COMPARISON = 33, - SAMPLED_IMAGE_DEPTH_COMPARISON_KHR = 33, + SAMPLED_IMAGE_FILTER_CUBIC = 13, + HOST_IMAGE_TRANSFER = 46, VIDEO_DECODE_OUTPUT_KHR = 25, VIDEO_DECODE_DPB_KHR = 26, ACCELERATION_STRUCTURE_VERTEX_BUFFER_KHR = 29, @@ -4541,6 +4736,33 @@ FormatFeatureFlag2 :: enum Flags64 { HOST_IMAGE_TRANSFER_EXT = 46, VIDEO_ENCODE_INPUT_KHR = 27, VIDEO_ENCODE_DPB_KHR = 28, + SAMPLED_IMAGE_KHR = 0, + STORAGE_IMAGE_KHR = 1, + STORAGE_IMAGE_ATOMIC_KHR = 2, + UNIFORM_TEXEL_BUFFER_KHR = 3, + STORAGE_TEXEL_BUFFER_KHR = 4, + STORAGE_TEXEL_BUFFER_ATOMIC_KHR = 5, + VERTEX_BUFFER_KHR = 6, + COLOR_ATTACHMENT_KHR = 7, + COLOR_ATTACHMENT_BLEND_KHR = 8, + DEPTH_STENCIL_ATTACHMENT_KHR = 9, + BLIT_SRC_KHR = 10, + BLIT_DST_KHR = 11, + SAMPLED_IMAGE_FILTER_LINEAR_KHR = 12, + TRANSFER_SRC_KHR = 14, + TRANSFER_DST_KHR = 15, + MIDPOINT_CHROMA_SAMPLES_KHR = 17, + SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_KHR = 18, + SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_KHR = 19, + SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_KHR = 20, + SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_KHR = 21, + DISJOINT_KHR = 22, + COSITED_CHROMA_SAMPLES_KHR = 23, + STORAGE_READ_WITHOUT_FORMAT_KHR = 31, + STORAGE_WRITE_WITHOUT_FORMAT_KHR = 32, + SAMPLED_IMAGE_DEPTH_COMPARISON_KHR = 33, + SAMPLED_IMAGE_FILTER_MINMAX_KHR = 16, + SAMPLED_IMAGE_FILTER_CUBIC_EXT = 13, LINEAR_COLOR_ATTACHMENT_NV = 38, WEIGHT_IMAGE_QCOM = 34, WEIGHT_SAMPLED_IMAGE_QCOM = 35, @@ -4549,62 +4771,112 @@ FormatFeatureFlag2 :: enum Flags64 { OPTICAL_FLOW_IMAGE_NV = 40, OPTICAL_FLOW_VECTOR_NV = 41, OPTICAL_FLOW_COST_NV = 42, + VIDEO_ENCODE_QUANTIZATION_DELTA_MAP_KHR = 49, + VIDEO_ENCODE_EMPHASIS_MAP_KHR = 50, +} + +PipelineCreateFlags2 :: distinct bit_set[PipelineCreateFlag2; Flags64] +PipelineCreateFlag2 :: enum Flags64 { + DISABLE_OPTIMIZATION = 0, + ALLOW_DERIVATIVES = 1, + DERIVATIVE = 2, + VIEW_INDEX_FROM_DEVICE_INDEX = 3, + DISPATCH_BASE = 4, + FAIL_ON_PIPELINE_COMPILE_REQUIRED = 8, + EARLY_RETURN_ON_FAILURE = 9, + NO_PROTECTED_ACCESS = 27, + PROTECTED_ACCESS_ONLY = 30, + EXECUTION_GRAPH_AMDX = 32, + ENABLE_LEGACY_DITHERING_EXT = 34, + DISABLE_OPTIMIZATION_KHR = 0, + ALLOW_DERIVATIVES_KHR = 1, + DERIVATIVE_KHR = 2, + VIEW_INDEX_FROM_DEVICE_INDEX_KHR = 3, + DISPATCH_BASE_KHR = 4, + DEFER_COMPILE_NV = 5, + CAPTURE_STATISTICS_KHR = 6, + CAPTURE_INTERNAL_REPRESENTATIONS_KHR = 7, + FAIL_ON_PIPELINE_COMPILE_REQUIRED_KHR = 8, + EARLY_RETURN_ON_FAILURE_KHR = 9, + LINK_TIME_OPTIMIZATION_EXT = 10, + RETAIN_LINK_TIME_OPTIMIZATION_INFO_EXT = 23, + LIBRARY_KHR = 11, + RAY_TRACING_SKIP_TRIANGLES_KHR = 12, + RAY_TRACING_SKIP_AABBS_KHR = 13, + RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_KHR = 14, + RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_KHR = 15, + RAY_TRACING_NO_NULL_MISS_SHADERS_KHR = 16, + RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_KHR = 17, + RAY_TRACING_SHADER_GROUP_HANDLE_CAPTURE_REPLAY_KHR = 19, + INDIRECT_BINDABLE_NV = 18, + 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, + PROTECTED_ACCESS_ONLY_EXT = 30, + RAY_TRACING_DISPLACEMENT_MICROMAP_NV = 28, + DESCRIPTOR_BUFFER_EXT = 29, + CAPTURE_DATA_KHR = 31, + INDIRECT_BINDABLE_EXT = 38, } PipelineStageFlags2 :: distinct bit_set[PipelineStageFlag2; Flags64] PipelineStageFlag2 :: enum Flags64 { TOP_OF_PIPE = 0, - TOP_OF_PIPE_KHR = 0, DRAW_INDIRECT = 1, - DRAW_INDIRECT_KHR = 1, VERTEX_INPUT = 2, - VERTEX_INPUT_KHR = 2, VERTEX_SHADER = 3, - VERTEX_SHADER_KHR = 3, TESSELLATION_CONTROL_SHADER = 4, - TESSELLATION_CONTROL_SHADER_KHR = 4, TESSELLATION_EVALUATION_SHADER = 5, - TESSELLATION_EVALUATION_SHADER_KHR = 5, GEOMETRY_SHADER = 6, - GEOMETRY_SHADER_KHR = 6, FRAGMENT_SHADER = 7, - FRAGMENT_SHADER_KHR = 7, EARLY_FRAGMENT_TESTS = 8, - EARLY_FRAGMENT_TESTS_KHR = 8, LATE_FRAGMENT_TESTS = 9, - LATE_FRAGMENT_TESTS_KHR = 9, COLOR_ATTACHMENT_OUTPUT = 10, - COLOR_ATTACHMENT_OUTPUT_KHR = 10, COMPUTE_SHADER = 11, - COMPUTE_SHADER_KHR = 11, ALL_TRANSFER = 12, - ALL_TRANSFER_KHR = 12, TRANSFER = 12, - TRANSFER_KHR = 12, BOTTOM_OF_PIPE = 13, - BOTTOM_OF_PIPE_KHR = 13, HOST = 14, - HOST_KHR = 14, ALL_GRAPHICS = 15, - ALL_GRAPHICS_KHR = 15, ALL_COMMANDS = 16, - ALL_COMMANDS_KHR = 16, COPY = 32, - COPY_KHR = 32, RESOLVE = 33, - RESOLVE_KHR = 33, BLIT = 34, - BLIT_KHR = 34, CLEAR = 35, - CLEAR_KHR = 35, INDEX_INPUT = 36, - INDEX_INPUT_KHR = 36, VERTEX_ATTRIBUTE_INPUT = 37, - VERTEX_ATTRIBUTE_INPUT_KHR = 37, PRE_RASTERIZATION_SHADERS = 38, - PRE_RASTERIZATION_SHADERS_KHR = 38, VIDEO_DECODE_KHR = 26, VIDEO_ENCODE_KHR = 27, + TOP_OF_PIPE_KHR = 0, + DRAW_INDIRECT_KHR = 1, + VERTEX_INPUT_KHR = 2, + VERTEX_SHADER_KHR = 3, + TESSELLATION_CONTROL_SHADER_KHR = 4, + TESSELLATION_EVALUATION_SHADER_KHR = 5, + GEOMETRY_SHADER_KHR = 6, + FRAGMENT_SHADER_KHR = 7, + EARLY_FRAGMENT_TESTS_KHR = 8, + LATE_FRAGMENT_TESTS_KHR = 9, + COLOR_ATTACHMENT_OUTPUT_KHR = 10, + COMPUTE_SHADER_KHR = 11, + ALL_TRANSFER_KHR = 12, + TRANSFER_KHR = 12, + BOTTOM_OF_PIPE_KHR = 13, + HOST_KHR = 14, + ALL_GRAPHICS_KHR = 15, + ALL_COMMANDS_KHR = 16, + COPY_KHR = 32, + RESOLVE_KHR = 33, + BLIT_KHR = 34, + CLEAR_KHR = 35, + INDEX_INPUT_KHR = 36, + VERTEX_ATTRIBUTE_INPUT_KHR = 37, + PRE_RASTERIZATION_SHADERS_KHR = 38, TRANSFORM_FEEDBACK_EXT = 24, CONDITIONAL_RENDERING_EXT = 18, COMMAND_PREPROCESS_NV = 17, diff --git a/vendor/vulkan/procedures.odin b/vendor/vulkan/procedures.odin index 813827c83..dc03275a2 100644 --- a/vendor/vulkan/procedures.odin +++ b/vendor/vulkan/procedures.odin @@ -23,98 +23,99 @@ 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 -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 -ProcGetPhysicalDeviceCooperativeMatrixPropertiesKHR :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]CooperativeMatrixPropertiesKHR) -> Result -ProcGetPhysicalDeviceCooperativeMatrixPropertiesNV :: #type proc "system" (physicalDevice: PhysicalDevice, pPropertyCount: ^u32, pProperties: [^]CooperativeMatrixPropertiesNV) -> 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 -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 +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 +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 +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 @@ -153,8 +154,10 @@ ProcCmdBindDescriptorBufferEmbeddedSamplers2EXT :: #type proc "system ProcCmdBindDescriptorBufferEmbeddedSamplersEXT :: #type proc "system" (commandBuffer: CommandBuffer, pipelineBindPoint: PipelineBindPoint, layout: PipelineLayout, set: u32) ProcCmdBindDescriptorBuffersEXT :: #type proc "system" (commandBuffer: CommandBuffer, bufferCount: u32, pBindingInfos: [^]DescriptorBufferBindingInfoEXT) ProcCmdBindDescriptorSets :: #type proc "system" (commandBuffer: CommandBuffer, pipelineBindPoint: PipelineBindPoint, layout: PipelineLayout, firstSet: u32, descriptorSetCount: u32, pDescriptorSets: [^]DescriptorSet, dynamicOffsetCount: u32, pDynamicOffsets: [^]u32) -ProcCmdBindDescriptorSets2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pBindDescriptorSetsInfo: ^BindDescriptorSetsInfoKHR) +ProcCmdBindDescriptorSets2 :: #type proc "system" (commandBuffer: CommandBuffer, pBindDescriptorSetsInfo: ^BindDescriptorSetsInfo) +ProcCmdBindDescriptorSets2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pBindDescriptorSetsInfo: ^BindDescriptorSetsInfo) 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) ProcCmdBindInvocationMaskHUAWEI :: #type proc "system" (commandBuffer: CommandBuffer, imageView: ImageView, imageLayout: ImageLayout) ProcCmdBindPipeline :: #type proc "system" (commandBuffer: CommandBuffer, pipelineBindPoint: PipelineBindPoint, pipeline: Pipeline) @@ -258,10 +261,15 @@ ProcCmdPipelineBarrier2KHR :: #type proc "system ProcCmdPreprocessGeneratedCommandsEXT :: #type proc "system" (commandBuffer: CommandBuffer, pGeneratedCommandsInfo: ^GeneratedCommandsInfoEXT, stateCommandBuffer: CommandBuffer) ProcCmdPreprocessGeneratedCommandsNV :: #type proc "system" (commandBuffer: CommandBuffer, pGeneratedCommandsInfo: ^GeneratedCommandsInfoNV) ProcCmdPushConstants :: #type proc "system" (commandBuffer: CommandBuffer, layout: PipelineLayout, stageFlags: ShaderStageFlags, offset: u32, size: u32, pValues: rawptr) -ProcCmdPushConstants2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pPushConstantsInfo: ^PushConstantsInfoKHR) -ProcCmdPushDescriptorSet2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pPushDescriptorSetInfo: ^PushDescriptorSetInfoKHR) +ProcCmdPushConstants2 :: #type proc "system" (commandBuffer: CommandBuffer, pPushConstantsInfo: ^PushConstantsInfo) +ProcCmdPushConstants2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pPushConstantsInfo: ^PushConstantsInfo) +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) ProcCmdPushDescriptorSetKHR :: #type proc "system" (commandBuffer: CommandBuffer, pipelineBindPoint: PipelineBindPoint, layout: PipelineLayout, set: u32, descriptorWriteCount: u32, pDescriptorWrites: [^]WriteDescriptorSet) -ProcCmdPushDescriptorSetWithTemplate2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pPushDescriptorSetWithTemplateInfo: ^PushDescriptorSetWithTemplateInfoKHR) +ProcCmdPushDescriptorSetWithTemplate :: #type proc "system" (commandBuffer: CommandBuffer, descriptorUpdateTemplate: DescriptorUpdateTemplate, layout: PipelineLayout, set: u32, pData: rawptr) +ProcCmdPushDescriptorSetWithTemplate2 :: #type proc "system" (commandBuffer: CommandBuffer, pPushDescriptorSetWithTemplateInfo: ^PushDescriptorSetWithTemplateInfo) +ProcCmdPushDescriptorSetWithTemplate2KHR :: #type proc "system" (commandBuffer: CommandBuffer, pPushDescriptorSetWithTemplateInfo: ^PushDescriptorSetWithTemplateInfo) ProcCmdPushDescriptorSetWithTemplateKHR :: #type proc "system" (commandBuffer: CommandBuffer, descriptorUpdateTemplate: DescriptorUpdateTemplate, layout: PipelineLayout, set: u32, pData: rawptr) ProcCmdResetEvent :: #type proc "system" (commandBuffer: CommandBuffer, event: Event, stageMask: PipelineStageFlags) ProcCmdResetEvent2 :: #type proc "system" (commandBuffer: CommandBuffer, event: Event, stageMask: PipelineStageFlags2) @@ -324,6 +332,7 @@ ProcCmdSetFragmentShadingRateKHR :: #type proc "system ProcCmdSetFrontFace :: #type proc "system" (commandBuffer: CommandBuffer, frontFace: FrontFace) ProcCmdSetFrontFaceEXT :: #type proc "system" (commandBuffer: CommandBuffer, frontFace: FrontFace) ProcCmdSetLineRasterizationModeEXT :: #type proc "system" (commandBuffer: CommandBuffer, lineRasterizationMode: LineRasterizationModeEXT) +ProcCmdSetLineStipple :: #type proc "system" (commandBuffer: CommandBuffer, lineStippleFactor: u32, lineStipplePattern: u16) ProcCmdSetLineStippleEXT :: #type proc "system" (commandBuffer: CommandBuffer, lineStippleFactor: u32, lineStipplePattern: u16) ProcCmdSetLineStippleEnableEXT :: #type proc "system" (commandBuffer: CommandBuffer, stippledLineEnable: b32) ProcCmdSetLineStippleKHR :: #type proc "system" (commandBuffer: CommandBuffer, lineStippleFactor: u32, lineStipplePattern: u16) @@ -345,8 +354,10 @@ ProcCmdSetRasterizationStreamEXT :: #type proc "system ProcCmdSetRasterizerDiscardEnable :: #type proc "system" (commandBuffer: CommandBuffer, rasterizerDiscardEnable: b32) ProcCmdSetRasterizerDiscardEnableEXT :: #type proc "system" (commandBuffer: CommandBuffer, rasterizerDiscardEnable: b32) ProcCmdSetRayTracingPipelineStackSizeKHR :: #type proc "system" (commandBuffer: CommandBuffer, pipelineStackSize: u32) -ProcCmdSetRenderingAttachmentLocationsKHR :: #type proc "system" (commandBuffer: CommandBuffer, pLocationInfo: ^RenderingAttachmentLocationInfoKHR) -ProcCmdSetRenderingInputAttachmentIndicesKHR :: #type proc "system" (commandBuffer: CommandBuffer, pInputAttachmentIndexInfo: ^RenderingInputAttachmentIndexInfoKHR) +ProcCmdSetRenderingAttachmentLocations :: #type proc "system" (commandBuffer: CommandBuffer, pLocationInfo: ^RenderingAttachmentLocationInfo) +ProcCmdSetRenderingAttachmentLocationsKHR :: #type proc "system" (commandBuffer: CommandBuffer, pLocationInfo: ^RenderingAttachmentLocationInfo) +ProcCmdSetRenderingInputAttachmentIndices :: #type proc "system" (commandBuffer: CommandBuffer, pInputAttachmentIndexInfo: ^RenderingInputAttachmentIndexInfo) +ProcCmdSetRenderingInputAttachmentIndicesKHR :: #type proc "system" (commandBuffer: CommandBuffer, pInputAttachmentIndexInfo: ^RenderingInputAttachmentIndexInfo) ProcCmdSetRepresentativeFragmentTestEnableNV :: #type proc "system" (commandBuffer: CommandBuffer, representativeFragmentTestEnable: b32) ProcCmdSetSampleLocationsEXT :: #type proc "system" (commandBuffer: CommandBuffer, pSampleLocationsInfo: ^SampleLocationsInfoEXT) ProcCmdSetSampleLocationsEnableEXT :: #type proc "system" (commandBuffer: CommandBuffer, sampleLocationsEnable: b32) @@ -392,10 +403,13 @@ ProcCmdWriteTimestamp2KHR :: #type proc "system ProcCompileDeferredNV :: #type proc "system" (device: Device, pipeline: Pipeline, shader: u32) -> Result ProcCopyAccelerationStructureKHR :: #type proc "system" (device: Device, deferredOperation: DeferredOperationKHR, pInfo: ^CopyAccelerationStructureInfoKHR) -> Result ProcCopyAccelerationStructureToMemoryKHR :: #type proc "system" (device: Device, deferredOperation: DeferredOperationKHR, pInfo: ^CopyAccelerationStructureToMemoryInfoKHR) -> Result -ProcCopyImageToImageEXT :: #type proc "system" (device: Device, pCopyImageToImageInfo: ^CopyImageToImageInfoEXT) -> Result -ProcCopyImageToMemoryEXT :: #type proc "system" (device: Device, pCopyImageToMemoryInfo: ^CopyImageToMemoryInfoEXT) -> Result +ProcCopyImageToImage :: #type proc "system" (device: Device, pCopyImageToImageInfo: ^CopyImageToImageInfo) -> Result +ProcCopyImageToImageEXT :: #type proc "system" (device: Device, pCopyImageToImageInfo: ^CopyImageToImageInfo) -> Result +ProcCopyImageToMemory :: #type proc "system" (device: Device, pCopyImageToMemoryInfo: ^CopyImageToMemoryInfo) -> Result +ProcCopyImageToMemoryEXT :: #type proc "system" (device: Device, pCopyImageToMemoryInfo: ^CopyImageToMemoryInfo) -> Result ProcCopyMemoryToAccelerationStructureKHR :: #type proc "system" (device: Device, deferredOperation: DeferredOperationKHR, pInfo: ^CopyMemoryToAccelerationStructureInfoKHR) -> Result -ProcCopyMemoryToImageEXT :: #type proc "system" (device: Device, pCopyMemoryToImageInfo: ^CopyMemoryToImageInfoEXT) -> Result +ProcCopyMemoryToImage :: #type proc "system" (device: Device, pCopyMemoryToImageInfo: ^CopyMemoryToImageInfo) -> Result +ProcCopyMemoryToImageEXT :: #type proc "system" (device: Device, pCopyMemoryToImageInfo: ^CopyMemoryToImageInfo) -> Result 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 @@ -540,7 +554,8 @@ ProcGetDeviceImageMemoryRequirements :: #type proc "system ProcGetDeviceImageMemoryRequirementsKHR :: #type proc "system" (device: Device, pInfo: ^DeviceImageMemoryRequirements, pMemoryRequirements: [^]MemoryRequirements2) ProcGetDeviceImageSparseMemoryRequirements :: #type proc "system" (device: Device, pInfo: ^DeviceImageMemoryRequirements, pSparseMemoryRequirementCount: ^u32, pSparseMemoryRequirements: [^]SparseImageMemoryRequirements2) ProcGetDeviceImageSparseMemoryRequirementsKHR :: #type proc "system" (device: Device, pInfo: ^DeviceImageMemoryRequirements, pSparseMemoryRequirementCount: ^u32, pSparseMemoryRequirements: [^]SparseImageMemoryRequirements2) -ProcGetDeviceImageSubresourceLayoutKHR :: #type proc "system" (device: Device, pInfo: ^DeviceImageSubresourceInfoKHR, pLayout: ^SubresourceLayout2KHR) +ProcGetDeviceImageSubresourceLayout :: #type proc "system" (device: Device, pInfo: ^DeviceImageSubresourceInfo, pLayout: ^SubresourceLayout2) +ProcGetDeviceImageSubresourceLayoutKHR :: #type proc "system" (device: Device, pInfo: ^DeviceImageSubresourceInfo, pLayout: ^SubresourceLayout2) ProcGetDeviceMemoryCommitment :: #type proc "system" (device: Device, memory: DeviceMemory, pCommittedMemoryInBytes: [^]DeviceSize) ProcGetDeviceMemoryOpaqueCaptureAddress :: #type proc "system" (device: Device, pInfo: ^DeviceMemoryOpaqueCaptureAddressInfo) -> u64 ProcGetDeviceMemoryOpaqueCaptureAddressKHR :: #type proc "system" (device: Device, pInfo: ^DeviceMemoryOpaqueCaptureAddressInfo) -> u64 @@ -567,9 +582,11 @@ ProcGetImageSparseMemoryRequirements :: #type proc "system ProcGetImageSparseMemoryRequirements2 :: #type proc "system" (device: Device, pInfo: ^ImageSparseMemoryRequirementsInfo2, pSparseMemoryRequirementCount: ^u32, pSparseMemoryRequirements: [^]SparseImageMemoryRequirements2) ProcGetImageSparseMemoryRequirements2KHR :: #type proc "system" (device: Device, pInfo: ^ImageSparseMemoryRequirementsInfo2, pSparseMemoryRequirementCount: ^u32, pSparseMemoryRequirements: [^]SparseImageMemoryRequirements2) ProcGetImageSubresourceLayout :: #type proc "system" (device: Device, image: Image, pSubresource: ^ImageSubresource, pLayout: ^SubresourceLayout) -ProcGetImageSubresourceLayout2EXT :: #type proc "system" (device: Device, image: Image, pSubresource: ^ImageSubresource2KHR, pLayout: ^SubresourceLayout2KHR) -ProcGetImageSubresourceLayout2KHR :: #type proc "system" (device: Device, image: Image, pSubresource: ^ImageSubresource2KHR, pLayout: ^SubresourceLayout2KHR) +ProcGetImageSubresourceLayout2 :: #type proc "system" (device: Device, image: Image, pSubresource: ^ImageSubresource2, pLayout: ^SubresourceLayout2) +ProcGetImageSubresourceLayout2EXT :: #type proc "system" (device: Device, image: Image, pSubresource: ^ImageSubresource2, pLayout: ^SubresourceLayout2) +ProcGetImageSubresourceLayout2KHR :: #type proc "system" (device: Device, image: Image, pSubresource: ^ImageSubresource2, pLayout: ^SubresourceLayout2) ProcGetImageViewAddressNVX :: #type proc "system" (device: Device, imageView: ImageView, pProperties: [^]ImageViewAddressPropertiesNVX) -> Result +ProcGetImageViewHandle64NVX :: #type proc "system" (device: Device, pInfo: ^ImageViewHandleInfoNVX) -> u64 ProcGetImageViewHandleNVX :: #type proc "system" (device: Device, pInfo: ^ImageViewHandleInfoNVX) -> u32 ProcGetImageViewOpaqueCaptureDescriptorDataEXT :: #type proc "system" (device: Device, pInfo: ^ImageViewCaptureDescriptorDataInfoEXT, pData: rawptr) -> Result ProcGetLatencyTimingsNV :: #type proc "system" (device: Device, swapchain: SwapchainKHR, pLatencyMarkerInfo: ^GetLatencyMarkerInfoNV) @@ -603,7 +620,8 @@ ProcGetRayTracingShaderGroupHandlesNV :: #type proc "system ProcGetRayTracingShaderGroupStackSizeKHR :: #type proc "system" (device: Device, pipeline: Pipeline, group: u32, groupShader: ShaderGroupShaderKHR) -> DeviceSize ProcGetRefreshCycleDurationGOOGLE :: #type proc "system" (device: Device, swapchain: SwapchainKHR, pDisplayTimingProperties: [^]RefreshCycleDurationGOOGLE) -> Result ProcGetRenderAreaGranularity :: #type proc "system" (device: Device, renderPass: RenderPass, pGranularity: ^Extent2D) -ProcGetRenderingAreaGranularityKHR :: #type proc "system" (device: Device, pRenderingAreaInfo: ^RenderingAreaInfoKHR, pGranularity: ^Extent2D) +ProcGetRenderingAreaGranularity :: #type proc "system" (device: Device, pRenderingAreaInfo: ^RenderingAreaInfo, pGranularity: ^Extent2D) +ProcGetRenderingAreaGranularityKHR :: #type proc "system" (device: Device, pRenderingAreaInfo: ^RenderingAreaInfo, pGranularity: ^Extent2D) ProcGetSamplerOpaqueCaptureDescriptorDataEXT :: #type proc "system" (device: Device, pInfo: ^SamplerCaptureDescriptorDataInfoEXT, pData: rawptr) -> Result ProcGetSemaphoreCounterValue :: #type proc "system" (device: Device, semaphore: Semaphore, pValue: ^u64) -> Result ProcGetSemaphoreCounterValueKHR :: #type proc "system" (device: Device, semaphore: Semaphore, pValue: ^u64) -> Result @@ -626,7 +644,8 @@ ProcInitializePerformanceApiINTEL :: #type proc "system ProcInvalidateMappedMemoryRanges :: #type proc "system" (device: Device, memoryRangeCount: u32, pMemoryRanges: [^]MappedMemoryRange) -> Result ProcLatencySleepNV :: #type proc "system" (device: Device, swapchain: SwapchainKHR, pSleepInfo: ^LatencySleepInfoNV) -> Result ProcMapMemory :: #type proc "system" (device: Device, memory: DeviceMemory, offset: DeviceSize, size: DeviceSize, flags: MemoryMapFlags, ppData: ^rawptr) -> Result -ProcMapMemory2KHR :: #type proc "system" (device: Device, pMemoryMapInfo: ^MemoryMapInfoKHR, ppData: ^rawptr) -> Result +ProcMapMemory2 :: #type proc "system" (device: Device, pMemoryMapInfo: ^MemoryMapInfo, ppData: ^rawptr) -> Result +ProcMapMemory2KHR :: #type proc "system" (device: Device, pMemoryMapInfo: ^MemoryMapInfo, ppData: ^rawptr) -> Result ProcMergePipelineCaches :: #type proc "system" (device: Device, dstCache: PipelineCache, srcCacheCount: u32, pSrcCaches: [^]PipelineCache) -> Result ProcMergeValidationCachesEXT :: #type proc "system" (device: Device, dstCache: ValidationCacheEXT, srcCacheCount: u32, pSrcCaches: [^]ValidationCacheEXT) -> Result ProcQueueBeginDebugUtilsLabelEXT :: #type proc "system" (queue: Queue, pLabelInfo: ^DebugUtilsLabelEXT) @@ -666,12 +685,14 @@ ProcSetPrivateData :: #type proc "system ProcSetPrivateDataEXT :: #type proc "system" (device: Device, objectType: ObjectType, objectHandle: u64, privateDataSlot: PrivateDataSlot, data: u64) -> Result ProcSignalSemaphore :: #type proc "system" (device: Device, pSignalInfo: ^SemaphoreSignalInfo) -> Result ProcSignalSemaphoreKHR :: #type proc "system" (device: Device, pSignalInfo: ^SemaphoreSignalInfo) -> Result -ProcTransitionImageLayoutEXT :: #type proc "system" (device: Device, transitionCount: u32, pTransitions: [^]HostImageLayoutTransitionInfoEXT) -> Result +ProcTransitionImageLayout :: #type proc "system" (device: Device, transitionCount: u32, pTransitions: [^]HostImageLayoutTransitionInfo) -> Result +ProcTransitionImageLayoutEXT :: #type proc "system" (device: Device, transitionCount: u32, pTransitions: [^]HostImageLayoutTransitionInfo) -> Result ProcTrimCommandPool :: #type proc "system" (device: Device, commandPool: CommandPool, flags: CommandPoolTrimFlags) ProcTrimCommandPoolKHR :: #type proc "system" (device: Device, commandPool: CommandPool, flags: CommandPoolTrimFlags) ProcUninitializePerformanceApiINTEL :: #type proc "system" (device: Device) ProcUnmapMemory :: #type proc "system" (device: Device, memory: DeviceMemory) -ProcUnmapMemory2KHR :: #type proc "system" (device: Device, pMemoryUnmapInfo: ^MemoryUnmapInfoKHR) -> Result +ProcUnmapMemory2 :: #type proc "system" (device: Device, pMemoryUnmapInfo: ^MemoryUnmapInfo) -> Result +ProcUnmapMemory2KHR :: #type proc "system" (device: Device, pMemoryUnmapInfo: ^MemoryUnmapInfo) -> Result 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) @@ -696,97 +717,98 @@ EnumerateInstanceVersion: ProcEnumerateInstanceVersion 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 -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 -GetPhysicalDeviceCooperativeMatrixPropertiesKHR: ProcGetPhysicalDeviceCooperativeMatrixPropertiesKHR -GetPhysicalDeviceCooperativeMatrixPropertiesNV: ProcGetPhysicalDeviceCooperativeMatrixPropertiesNV -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 -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 +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 +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 +GetWinrtDisplayNV: ProcGetWinrtDisplayNV +ReleaseDisplayEXT: ProcReleaseDisplayEXT +SubmitDebugUtilsMessageEXT: ProcSubmitDebugUtilsMessageEXT // Device Procedures AcquireFullScreenExclusiveModeEXT: ProcAcquireFullScreenExclusiveModeEXT @@ -825,8 +847,10 @@ CmdBindDescriptorBufferEmbeddedSamplers2EXT: ProcCmdBindDescriptorBuf CmdBindDescriptorBufferEmbeddedSamplersEXT: ProcCmdBindDescriptorBufferEmbeddedSamplersEXT CmdBindDescriptorBuffersEXT: ProcCmdBindDescriptorBuffersEXT CmdBindDescriptorSets: ProcCmdBindDescriptorSets +CmdBindDescriptorSets2: ProcCmdBindDescriptorSets2 CmdBindDescriptorSets2KHR: ProcCmdBindDescriptorSets2KHR CmdBindIndexBuffer: ProcCmdBindIndexBuffer +CmdBindIndexBuffer2: ProcCmdBindIndexBuffer2 CmdBindIndexBuffer2KHR: ProcCmdBindIndexBuffer2KHR CmdBindInvocationMaskHUAWEI: ProcCmdBindInvocationMaskHUAWEI CmdBindPipeline: ProcCmdBindPipeline @@ -930,9 +954,14 @@ CmdPipelineBarrier2KHR: ProcCmdPipelineBarrier2K CmdPreprocessGeneratedCommandsEXT: ProcCmdPreprocessGeneratedCommandsEXT CmdPreprocessGeneratedCommandsNV: ProcCmdPreprocessGeneratedCommandsNV CmdPushConstants: ProcCmdPushConstants +CmdPushConstants2: ProcCmdPushConstants2 CmdPushConstants2KHR: ProcCmdPushConstants2KHR +CmdPushDescriptorSet: ProcCmdPushDescriptorSet +CmdPushDescriptorSet2: ProcCmdPushDescriptorSet2 CmdPushDescriptorSet2KHR: ProcCmdPushDescriptorSet2KHR CmdPushDescriptorSetKHR: ProcCmdPushDescriptorSetKHR +CmdPushDescriptorSetWithTemplate: ProcCmdPushDescriptorSetWithTemplate +CmdPushDescriptorSetWithTemplate2: ProcCmdPushDescriptorSetWithTemplate2 CmdPushDescriptorSetWithTemplate2KHR: ProcCmdPushDescriptorSetWithTemplate2KHR CmdPushDescriptorSetWithTemplateKHR: ProcCmdPushDescriptorSetWithTemplateKHR CmdResetEvent: ProcCmdResetEvent @@ -996,6 +1025,7 @@ CmdSetFragmentShadingRateKHR: ProcCmdSetFragmentShadin CmdSetFrontFace: ProcCmdSetFrontFace CmdSetFrontFaceEXT: ProcCmdSetFrontFaceEXT CmdSetLineRasterizationModeEXT: ProcCmdSetLineRasterizationModeEXT +CmdSetLineStipple: ProcCmdSetLineStipple CmdSetLineStippleEXT: ProcCmdSetLineStippleEXT CmdSetLineStippleEnableEXT: ProcCmdSetLineStippleEnableEXT CmdSetLineStippleKHR: ProcCmdSetLineStippleKHR @@ -1017,7 +1047,9 @@ CmdSetRasterizationStreamEXT: ProcCmdSetRasterizationS CmdSetRasterizerDiscardEnable: ProcCmdSetRasterizerDiscardEnable CmdSetRasterizerDiscardEnableEXT: ProcCmdSetRasterizerDiscardEnableEXT CmdSetRayTracingPipelineStackSizeKHR: ProcCmdSetRayTracingPipelineStackSizeKHR +CmdSetRenderingAttachmentLocations: ProcCmdSetRenderingAttachmentLocations CmdSetRenderingAttachmentLocationsKHR: ProcCmdSetRenderingAttachmentLocationsKHR +CmdSetRenderingInputAttachmentIndices: ProcCmdSetRenderingInputAttachmentIndices CmdSetRenderingInputAttachmentIndicesKHR: ProcCmdSetRenderingInputAttachmentIndicesKHR CmdSetRepresentativeFragmentTestEnableNV: ProcCmdSetRepresentativeFragmentTestEnableNV CmdSetSampleLocationsEXT: ProcCmdSetSampleLocationsEXT @@ -1064,9 +1096,12 @@ CmdWriteTimestamp2KHR: ProcCmdWriteTimestamp2KH CompileDeferredNV: ProcCompileDeferredNV CopyAccelerationStructureKHR: ProcCopyAccelerationStructureKHR CopyAccelerationStructureToMemoryKHR: ProcCopyAccelerationStructureToMemoryKHR +CopyImageToImage: ProcCopyImageToImage CopyImageToImageEXT: ProcCopyImageToImageEXT +CopyImageToMemory: ProcCopyImageToMemory CopyImageToMemoryEXT: ProcCopyImageToMemoryEXT CopyMemoryToAccelerationStructureKHR: ProcCopyMemoryToAccelerationStructureKHR +CopyMemoryToImage: ProcCopyMemoryToImage CopyMemoryToImageEXT: ProcCopyMemoryToImageEXT CopyMemoryToMicromapEXT: ProcCopyMemoryToMicromapEXT CopyMicromapEXT: ProcCopyMicromapEXT @@ -1212,6 +1247,7 @@ GetDeviceImageMemoryRequirements: ProcGetDeviceImageMemory GetDeviceImageMemoryRequirementsKHR: ProcGetDeviceImageMemoryRequirementsKHR GetDeviceImageSparseMemoryRequirements: ProcGetDeviceImageSparseMemoryRequirements GetDeviceImageSparseMemoryRequirementsKHR: ProcGetDeviceImageSparseMemoryRequirementsKHR +GetDeviceImageSubresourceLayout: ProcGetDeviceImageSubresourceLayout GetDeviceImageSubresourceLayoutKHR: ProcGetDeviceImageSubresourceLayoutKHR GetDeviceMemoryCommitment: ProcGetDeviceMemoryCommitment GetDeviceMemoryOpaqueCaptureAddress: ProcGetDeviceMemoryOpaqueCaptureAddress @@ -1239,9 +1275,11 @@ GetImageSparseMemoryRequirements: ProcGetImageSparseMemory GetImageSparseMemoryRequirements2: ProcGetImageSparseMemoryRequirements2 GetImageSparseMemoryRequirements2KHR: ProcGetImageSparseMemoryRequirements2KHR GetImageSubresourceLayout: ProcGetImageSubresourceLayout +GetImageSubresourceLayout2: ProcGetImageSubresourceLayout2 GetImageSubresourceLayout2EXT: ProcGetImageSubresourceLayout2EXT GetImageSubresourceLayout2KHR: ProcGetImageSubresourceLayout2KHR GetImageViewAddressNVX: ProcGetImageViewAddressNVX +GetImageViewHandle64NVX: ProcGetImageViewHandle64NVX GetImageViewHandleNVX: ProcGetImageViewHandleNVX GetImageViewOpaqueCaptureDescriptorDataEXT: ProcGetImageViewOpaqueCaptureDescriptorDataEXT GetLatencyTimingsNV: ProcGetLatencyTimingsNV @@ -1275,6 +1313,7 @@ GetRayTracingShaderGroupHandlesNV: ProcGetRayTracingShaderG GetRayTracingShaderGroupStackSizeKHR: ProcGetRayTracingShaderGroupStackSizeKHR GetRefreshCycleDurationGOOGLE: ProcGetRefreshCycleDurationGOOGLE GetRenderAreaGranularity: ProcGetRenderAreaGranularity +GetRenderingAreaGranularity: ProcGetRenderingAreaGranularity GetRenderingAreaGranularityKHR: ProcGetRenderingAreaGranularityKHR GetSamplerOpaqueCaptureDescriptorDataEXT: ProcGetSamplerOpaqueCaptureDescriptorDataEXT GetSemaphoreCounterValue: ProcGetSemaphoreCounterValue @@ -1298,6 +1337,7 @@ InitializePerformanceApiINTEL: ProcInitializePerformanc InvalidateMappedMemoryRanges: ProcInvalidateMappedMemoryRanges LatencySleepNV: ProcLatencySleepNV MapMemory: ProcMapMemory +MapMemory2: ProcMapMemory2 MapMemory2KHR: ProcMapMemory2KHR MergePipelineCaches: ProcMergePipelineCaches MergeValidationCachesEXT: ProcMergeValidationCachesEXT @@ -1338,11 +1378,13 @@ SetPrivateData: ProcSetPrivateData SetPrivateDataEXT: ProcSetPrivateDataEXT SignalSemaphore: ProcSignalSemaphore SignalSemaphoreKHR: ProcSignalSemaphoreKHR +TransitionImageLayout: ProcTransitionImageLayout TransitionImageLayoutEXT: ProcTransitionImageLayoutEXT TrimCommandPool: ProcTrimCommandPool TrimCommandPoolKHR: ProcTrimCommandPoolKHR UninitializePerformanceApiINTEL: ProcUninitializePerformanceApiINTEL UnmapMemory: ProcUnmapMemory +UnmapMemory2: ProcUnmapMemory2 UnmapMemory2KHR: ProcUnmapMemory2KHR UpdateDescriptorSetWithTemplate: ProcUpdateDescriptorSetWithTemplate UpdateDescriptorSetWithTemplateKHR: ProcUpdateDescriptorSetWithTemplateKHR @@ -1368,97 +1410,98 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { 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(&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(&GetPhysicalDeviceCooperativeMatrixPropertiesKHR, "vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR") - set_proc_address(&GetPhysicalDeviceCooperativeMatrixPropertiesNV, "vkGetPhysicalDeviceCooperativeMatrixPropertiesNV") - 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(&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(&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(&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(&GetWinrtDisplayNV, "vkGetWinrtDisplayNV") + set_proc_address(&ReleaseDisplayEXT, "vkReleaseDisplayEXT") + set_proc_address(&SubmitDebugUtilsMessageEXT, "vkSubmitDebugUtilsMessageEXT") // Device Procedures set_proc_address(&AcquireFullScreenExclusiveModeEXT, "vkAcquireFullScreenExclusiveModeEXT") @@ -1497,8 +1540,10 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&CmdBindDescriptorBufferEmbeddedSamplersEXT, "vkCmdBindDescriptorBufferEmbeddedSamplersEXT") set_proc_address(&CmdBindDescriptorBuffersEXT, "vkCmdBindDescriptorBuffersEXT") set_proc_address(&CmdBindDescriptorSets, "vkCmdBindDescriptorSets") + set_proc_address(&CmdBindDescriptorSets2, "vkCmdBindDescriptorSets2") set_proc_address(&CmdBindDescriptorSets2KHR, "vkCmdBindDescriptorSets2KHR") set_proc_address(&CmdBindIndexBuffer, "vkCmdBindIndexBuffer") + set_proc_address(&CmdBindIndexBuffer2, "vkCmdBindIndexBuffer2") set_proc_address(&CmdBindIndexBuffer2KHR, "vkCmdBindIndexBuffer2KHR") set_proc_address(&CmdBindInvocationMaskHUAWEI, "vkCmdBindInvocationMaskHUAWEI") set_proc_address(&CmdBindPipeline, "vkCmdBindPipeline") @@ -1602,9 +1647,14 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&CmdPreprocessGeneratedCommandsEXT, "vkCmdPreprocessGeneratedCommandsEXT") set_proc_address(&CmdPreprocessGeneratedCommandsNV, "vkCmdPreprocessGeneratedCommandsNV") set_proc_address(&CmdPushConstants, "vkCmdPushConstants") + set_proc_address(&CmdPushConstants2, "vkCmdPushConstants2") set_proc_address(&CmdPushConstants2KHR, "vkCmdPushConstants2KHR") + set_proc_address(&CmdPushDescriptorSet, "vkCmdPushDescriptorSet") + set_proc_address(&CmdPushDescriptorSet2, "vkCmdPushDescriptorSet2") set_proc_address(&CmdPushDescriptorSet2KHR, "vkCmdPushDescriptorSet2KHR") set_proc_address(&CmdPushDescriptorSetKHR, "vkCmdPushDescriptorSetKHR") + set_proc_address(&CmdPushDescriptorSetWithTemplate, "vkCmdPushDescriptorSetWithTemplate") + set_proc_address(&CmdPushDescriptorSetWithTemplate2, "vkCmdPushDescriptorSetWithTemplate2") set_proc_address(&CmdPushDescriptorSetWithTemplate2KHR, "vkCmdPushDescriptorSetWithTemplate2KHR") set_proc_address(&CmdPushDescriptorSetWithTemplateKHR, "vkCmdPushDescriptorSetWithTemplateKHR") set_proc_address(&CmdResetEvent, "vkCmdResetEvent") @@ -1668,6 +1718,7 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&CmdSetFrontFace, "vkCmdSetFrontFace") set_proc_address(&CmdSetFrontFaceEXT, "vkCmdSetFrontFaceEXT") set_proc_address(&CmdSetLineRasterizationModeEXT, "vkCmdSetLineRasterizationModeEXT") + set_proc_address(&CmdSetLineStipple, "vkCmdSetLineStipple") set_proc_address(&CmdSetLineStippleEXT, "vkCmdSetLineStippleEXT") set_proc_address(&CmdSetLineStippleEnableEXT, "vkCmdSetLineStippleEnableEXT") set_proc_address(&CmdSetLineStippleKHR, "vkCmdSetLineStippleKHR") @@ -1689,7 +1740,9 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&CmdSetRasterizerDiscardEnable, "vkCmdSetRasterizerDiscardEnable") set_proc_address(&CmdSetRasterizerDiscardEnableEXT, "vkCmdSetRasterizerDiscardEnableEXT") set_proc_address(&CmdSetRayTracingPipelineStackSizeKHR, "vkCmdSetRayTracingPipelineStackSizeKHR") + set_proc_address(&CmdSetRenderingAttachmentLocations, "vkCmdSetRenderingAttachmentLocations") set_proc_address(&CmdSetRenderingAttachmentLocationsKHR, "vkCmdSetRenderingAttachmentLocationsKHR") + set_proc_address(&CmdSetRenderingInputAttachmentIndices, "vkCmdSetRenderingInputAttachmentIndices") set_proc_address(&CmdSetRenderingInputAttachmentIndicesKHR, "vkCmdSetRenderingInputAttachmentIndicesKHR") set_proc_address(&CmdSetRepresentativeFragmentTestEnableNV, "vkCmdSetRepresentativeFragmentTestEnableNV") set_proc_address(&CmdSetSampleLocationsEXT, "vkCmdSetSampleLocationsEXT") @@ -1736,9 +1789,12 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&CompileDeferredNV, "vkCompileDeferredNV") set_proc_address(&CopyAccelerationStructureKHR, "vkCopyAccelerationStructureKHR") set_proc_address(&CopyAccelerationStructureToMemoryKHR, "vkCopyAccelerationStructureToMemoryKHR") + set_proc_address(&CopyImageToImage, "vkCopyImageToImage") set_proc_address(&CopyImageToImageEXT, "vkCopyImageToImageEXT") + set_proc_address(&CopyImageToMemory, "vkCopyImageToMemory") set_proc_address(&CopyImageToMemoryEXT, "vkCopyImageToMemoryEXT") set_proc_address(&CopyMemoryToAccelerationStructureKHR, "vkCopyMemoryToAccelerationStructureKHR") + set_proc_address(&CopyMemoryToImage, "vkCopyMemoryToImage") set_proc_address(&CopyMemoryToImageEXT, "vkCopyMemoryToImageEXT") set_proc_address(&CopyMemoryToMicromapEXT, "vkCopyMemoryToMicromapEXT") set_proc_address(&CopyMicromapEXT, "vkCopyMicromapEXT") @@ -1884,6 +1940,7 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&GetDeviceImageMemoryRequirementsKHR, "vkGetDeviceImageMemoryRequirementsKHR") set_proc_address(&GetDeviceImageSparseMemoryRequirements, "vkGetDeviceImageSparseMemoryRequirements") set_proc_address(&GetDeviceImageSparseMemoryRequirementsKHR, "vkGetDeviceImageSparseMemoryRequirementsKHR") + set_proc_address(&GetDeviceImageSubresourceLayout, "vkGetDeviceImageSubresourceLayout") set_proc_address(&GetDeviceImageSubresourceLayoutKHR, "vkGetDeviceImageSubresourceLayoutKHR") set_proc_address(&GetDeviceMemoryCommitment, "vkGetDeviceMemoryCommitment") set_proc_address(&GetDeviceMemoryOpaqueCaptureAddress, "vkGetDeviceMemoryOpaqueCaptureAddress") @@ -1911,9 +1968,11 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&GetImageSparseMemoryRequirements2, "vkGetImageSparseMemoryRequirements2") set_proc_address(&GetImageSparseMemoryRequirements2KHR, "vkGetImageSparseMemoryRequirements2KHR") set_proc_address(&GetImageSubresourceLayout, "vkGetImageSubresourceLayout") + set_proc_address(&GetImageSubresourceLayout2, "vkGetImageSubresourceLayout2") set_proc_address(&GetImageSubresourceLayout2EXT, "vkGetImageSubresourceLayout2EXT") set_proc_address(&GetImageSubresourceLayout2KHR, "vkGetImageSubresourceLayout2KHR") set_proc_address(&GetImageViewAddressNVX, "vkGetImageViewAddressNVX") + set_proc_address(&GetImageViewHandle64NVX, "vkGetImageViewHandle64NVX") set_proc_address(&GetImageViewHandleNVX, "vkGetImageViewHandleNVX") set_proc_address(&GetImageViewOpaqueCaptureDescriptorDataEXT, "vkGetImageViewOpaqueCaptureDescriptorDataEXT") set_proc_address(&GetLatencyTimingsNV, "vkGetLatencyTimingsNV") @@ -1947,6 +2006,7 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&GetRayTracingShaderGroupStackSizeKHR, "vkGetRayTracingShaderGroupStackSizeKHR") set_proc_address(&GetRefreshCycleDurationGOOGLE, "vkGetRefreshCycleDurationGOOGLE") set_proc_address(&GetRenderAreaGranularity, "vkGetRenderAreaGranularity") + set_proc_address(&GetRenderingAreaGranularity, "vkGetRenderingAreaGranularity") set_proc_address(&GetRenderingAreaGranularityKHR, "vkGetRenderingAreaGranularityKHR") set_proc_address(&GetSamplerOpaqueCaptureDescriptorDataEXT, "vkGetSamplerOpaqueCaptureDescriptorDataEXT") set_proc_address(&GetSemaphoreCounterValue, "vkGetSemaphoreCounterValue") @@ -1970,6 +2030,7 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&InvalidateMappedMemoryRanges, "vkInvalidateMappedMemoryRanges") set_proc_address(&LatencySleepNV, "vkLatencySleepNV") set_proc_address(&MapMemory, "vkMapMemory") + set_proc_address(&MapMemory2, "vkMapMemory2") set_proc_address(&MapMemory2KHR, "vkMapMemory2KHR") set_proc_address(&MergePipelineCaches, "vkMergePipelineCaches") set_proc_address(&MergeValidationCachesEXT, "vkMergeValidationCachesEXT") @@ -2010,11 +2071,13 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { set_proc_address(&SetPrivateDataEXT, "vkSetPrivateDataEXT") set_proc_address(&SignalSemaphore, "vkSignalSemaphore") set_proc_address(&SignalSemaphoreKHR, "vkSignalSemaphoreKHR") + set_proc_address(&TransitionImageLayout, "vkTransitionImageLayout") set_proc_address(&TransitionImageLayoutEXT, "vkTransitionImageLayoutEXT") set_proc_address(&TrimCommandPool, "vkTrimCommandPool") set_proc_address(&TrimCommandPoolKHR, "vkTrimCommandPoolKHR") set_proc_address(&UninitializePerformanceApiINTEL, "vkUninitializePerformanceApiINTEL") set_proc_address(&UnmapMemory, "vkUnmapMemory") + set_proc_address(&UnmapMemory2, "vkUnmapMemory2") set_proc_address(&UnmapMemory2KHR, "vkUnmapMemory2KHR") set_proc_address(&UpdateDescriptorSetWithTemplate, "vkUpdateDescriptorSetWithTemplate") set_proc_address(&UpdateDescriptorSetWithTemplateKHR, "vkUpdateDescriptorSetWithTemplateKHR") @@ -2069,8 +2132,10 @@ Device_VTable :: struct { CmdBindDescriptorBufferEmbeddedSamplersEXT: ProcCmdBindDescriptorBufferEmbeddedSamplersEXT, CmdBindDescriptorBuffersEXT: ProcCmdBindDescriptorBuffersEXT, CmdBindDescriptorSets: ProcCmdBindDescriptorSets, + CmdBindDescriptorSets2: ProcCmdBindDescriptorSets2, CmdBindDescriptorSets2KHR: ProcCmdBindDescriptorSets2KHR, CmdBindIndexBuffer: ProcCmdBindIndexBuffer, + CmdBindIndexBuffer2: ProcCmdBindIndexBuffer2, CmdBindIndexBuffer2KHR: ProcCmdBindIndexBuffer2KHR, CmdBindInvocationMaskHUAWEI: ProcCmdBindInvocationMaskHUAWEI, CmdBindPipeline: ProcCmdBindPipeline, @@ -2174,9 +2239,14 @@ Device_VTable :: struct { CmdPreprocessGeneratedCommandsEXT: ProcCmdPreprocessGeneratedCommandsEXT, CmdPreprocessGeneratedCommandsNV: ProcCmdPreprocessGeneratedCommandsNV, CmdPushConstants: ProcCmdPushConstants, + CmdPushConstants2: ProcCmdPushConstants2, CmdPushConstants2KHR: ProcCmdPushConstants2KHR, + CmdPushDescriptorSet: ProcCmdPushDescriptorSet, + CmdPushDescriptorSet2: ProcCmdPushDescriptorSet2, CmdPushDescriptorSet2KHR: ProcCmdPushDescriptorSet2KHR, CmdPushDescriptorSetKHR: ProcCmdPushDescriptorSetKHR, + CmdPushDescriptorSetWithTemplate: ProcCmdPushDescriptorSetWithTemplate, + CmdPushDescriptorSetWithTemplate2: ProcCmdPushDescriptorSetWithTemplate2, CmdPushDescriptorSetWithTemplate2KHR: ProcCmdPushDescriptorSetWithTemplate2KHR, CmdPushDescriptorSetWithTemplateKHR: ProcCmdPushDescriptorSetWithTemplateKHR, CmdResetEvent: ProcCmdResetEvent, @@ -2240,6 +2310,7 @@ Device_VTable :: struct { CmdSetFrontFace: ProcCmdSetFrontFace, CmdSetFrontFaceEXT: ProcCmdSetFrontFaceEXT, CmdSetLineRasterizationModeEXT: ProcCmdSetLineRasterizationModeEXT, + CmdSetLineStipple: ProcCmdSetLineStipple, CmdSetLineStippleEXT: ProcCmdSetLineStippleEXT, CmdSetLineStippleEnableEXT: ProcCmdSetLineStippleEnableEXT, CmdSetLineStippleKHR: ProcCmdSetLineStippleKHR, @@ -2261,7 +2332,9 @@ Device_VTable :: struct { CmdSetRasterizerDiscardEnable: ProcCmdSetRasterizerDiscardEnable, CmdSetRasterizerDiscardEnableEXT: ProcCmdSetRasterizerDiscardEnableEXT, CmdSetRayTracingPipelineStackSizeKHR: ProcCmdSetRayTracingPipelineStackSizeKHR, + CmdSetRenderingAttachmentLocations: ProcCmdSetRenderingAttachmentLocations, CmdSetRenderingAttachmentLocationsKHR: ProcCmdSetRenderingAttachmentLocationsKHR, + CmdSetRenderingInputAttachmentIndices: ProcCmdSetRenderingInputAttachmentIndices, CmdSetRenderingInputAttachmentIndicesKHR: ProcCmdSetRenderingInputAttachmentIndicesKHR, CmdSetRepresentativeFragmentTestEnableNV: ProcCmdSetRepresentativeFragmentTestEnableNV, CmdSetSampleLocationsEXT: ProcCmdSetSampleLocationsEXT, @@ -2308,9 +2381,12 @@ Device_VTable :: struct { CompileDeferredNV: ProcCompileDeferredNV, CopyAccelerationStructureKHR: ProcCopyAccelerationStructureKHR, CopyAccelerationStructureToMemoryKHR: ProcCopyAccelerationStructureToMemoryKHR, + CopyImageToImage: ProcCopyImageToImage, CopyImageToImageEXT: ProcCopyImageToImageEXT, + CopyImageToMemory: ProcCopyImageToMemory, CopyImageToMemoryEXT: ProcCopyImageToMemoryEXT, CopyMemoryToAccelerationStructureKHR: ProcCopyMemoryToAccelerationStructureKHR, + CopyMemoryToImage: ProcCopyMemoryToImage, CopyMemoryToImageEXT: ProcCopyMemoryToImageEXT, CopyMemoryToMicromapEXT: ProcCopyMemoryToMicromapEXT, CopyMicromapEXT: ProcCopyMicromapEXT, @@ -2456,6 +2532,7 @@ Device_VTable :: struct { GetDeviceImageMemoryRequirementsKHR: ProcGetDeviceImageMemoryRequirementsKHR, GetDeviceImageSparseMemoryRequirements: ProcGetDeviceImageSparseMemoryRequirements, GetDeviceImageSparseMemoryRequirementsKHR: ProcGetDeviceImageSparseMemoryRequirementsKHR, + GetDeviceImageSubresourceLayout: ProcGetDeviceImageSubresourceLayout, GetDeviceImageSubresourceLayoutKHR: ProcGetDeviceImageSubresourceLayoutKHR, GetDeviceMemoryCommitment: ProcGetDeviceMemoryCommitment, GetDeviceMemoryOpaqueCaptureAddress: ProcGetDeviceMemoryOpaqueCaptureAddress, @@ -2483,9 +2560,11 @@ Device_VTable :: struct { GetImageSparseMemoryRequirements2: ProcGetImageSparseMemoryRequirements2, GetImageSparseMemoryRequirements2KHR: ProcGetImageSparseMemoryRequirements2KHR, GetImageSubresourceLayout: ProcGetImageSubresourceLayout, + GetImageSubresourceLayout2: ProcGetImageSubresourceLayout2, GetImageSubresourceLayout2EXT: ProcGetImageSubresourceLayout2EXT, GetImageSubresourceLayout2KHR: ProcGetImageSubresourceLayout2KHR, GetImageViewAddressNVX: ProcGetImageViewAddressNVX, + GetImageViewHandle64NVX: ProcGetImageViewHandle64NVX, GetImageViewHandleNVX: ProcGetImageViewHandleNVX, GetImageViewOpaqueCaptureDescriptorDataEXT: ProcGetImageViewOpaqueCaptureDescriptorDataEXT, GetLatencyTimingsNV: ProcGetLatencyTimingsNV, @@ -2519,6 +2598,7 @@ Device_VTable :: struct { GetRayTracingShaderGroupStackSizeKHR: ProcGetRayTracingShaderGroupStackSizeKHR, GetRefreshCycleDurationGOOGLE: ProcGetRefreshCycleDurationGOOGLE, GetRenderAreaGranularity: ProcGetRenderAreaGranularity, + GetRenderingAreaGranularity: ProcGetRenderingAreaGranularity, GetRenderingAreaGranularityKHR: ProcGetRenderingAreaGranularityKHR, GetSamplerOpaqueCaptureDescriptorDataEXT: ProcGetSamplerOpaqueCaptureDescriptorDataEXT, GetSemaphoreCounterValue: ProcGetSemaphoreCounterValue, @@ -2542,6 +2622,7 @@ Device_VTable :: struct { InvalidateMappedMemoryRanges: ProcInvalidateMappedMemoryRanges, LatencySleepNV: ProcLatencySleepNV, MapMemory: ProcMapMemory, + MapMemory2: ProcMapMemory2, MapMemory2KHR: ProcMapMemory2KHR, MergePipelineCaches: ProcMergePipelineCaches, MergeValidationCachesEXT: ProcMergeValidationCachesEXT, @@ -2582,11 +2663,13 @@ Device_VTable :: struct { SetPrivateDataEXT: ProcSetPrivateDataEXT, SignalSemaphore: ProcSignalSemaphore, SignalSemaphoreKHR: ProcSignalSemaphoreKHR, + TransitionImageLayout: ProcTransitionImageLayout, TransitionImageLayoutEXT: ProcTransitionImageLayoutEXT, TrimCommandPool: ProcTrimCommandPool, TrimCommandPoolKHR: ProcTrimCommandPoolKHR, UninitializePerformanceApiINTEL: ProcUninitializePerformanceApiINTEL, UnmapMemory: ProcUnmapMemory, + UnmapMemory2: ProcUnmapMemory2, UnmapMemory2KHR: ProcUnmapMemory2KHR, UpdateDescriptorSetWithTemplate: ProcUpdateDescriptorSetWithTemplate, UpdateDescriptorSetWithTemplateKHR: ProcUpdateDescriptorSetWithTemplateKHR, @@ -2639,8 +2722,10 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.CmdBindDescriptorBufferEmbeddedSamplersEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBindDescriptorBufferEmbeddedSamplersEXT") vtable.CmdBindDescriptorBuffersEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBindDescriptorBuffersEXT") vtable.CmdBindDescriptorSets = auto_cast GetDeviceProcAddr(device, "vkCmdBindDescriptorSets") + vtable.CmdBindDescriptorSets2 = auto_cast GetDeviceProcAddr(device, "vkCmdBindDescriptorSets2") vtable.CmdBindDescriptorSets2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdBindDescriptorSets2KHR") vtable.CmdBindIndexBuffer = auto_cast GetDeviceProcAddr(device, "vkCmdBindIndexBuffer") + vtable.CmdBindIndexBuffer2 = auto_cast GetDeviceProcAddr(device, "vkCmdBindIndexBuffer2") vtable.CmdBindIndexBuffer2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdBindIndexBuffer2KHR") vtable.CmdBindInvocationMaskHUAWEI = auto_cast GetDeviceProcAddr(device, "vkCmdBindInvocationMaskHUAWEI") vtable.CmdBindPipeline = auto_cast GetDeviceProcAddr(device, "vkCmdBindPipeline") @@ -2744,9 +2829,14 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.CmdPreprocessGeneratedCommandsEXT = auto_cast GetDeviceProcAddr(device, "vkCmdPreprocessGeneratedCommandsEXT") vtable.CmdPreprocessGeneratedCommandsNV = auto_cast GetDeviceProcAddr(device, "vkCmdPreprocessGeneratedCommandsNV") vtable.CmdPushConstants = auto_cast GetDeviceProcAddr(device, "vkCmdPushConstants") + vtable.CmdPushConstants2 = auto_cast GetDeviceProcAddr(device, "vkCmdPushConstants2") vtable.CmdPushConstants2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdPushConstants2KHR") + vtable.CmdPushDescriptorSet = auto_cast GetDeviceProcAddr(device, "vkCmdPushDescriptorSet") + vtable.CmdPushDescriptorSet2 = auto_cast GetDeviceProcAddr(device, "vkCmdPushDescriptorSet2") vtable.CmdPushDescriptorSet2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdPushDescriptorSet2KHR") vtable.CmdPushDescriptorSetKHR = auto_cast GetDeviceProcAddr(device, "vkCmdPushDescriptorSetKHR") + vtable.CmdPushDescriptorSetWithTemplate = auto_cast GetDeviceProcAddr(device, "vkCmdPushDescriptorSetWithTemplate") + vtable.CmdPushDescriptorSetWithTemplate2 = auto_cast GetDeviceProcAddr(device, "vkCmdPushDescriptorSetWithTemplate2") vtable.CmdPushDescriptorSetWithTemplate2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdPushDescriptorSetWithTemplate2KHR") vtable.CmdPushDescriptorSetWithTemplateKHR = auto_cast GetDeviceProcAddr(device, "vkCmdPushDescriptorSetWithTemplateKHR") vtable.CmdResetEvent = auto_cast GetDeviceProcAddr(device, "vkCmdResetEvent") @@ -2810,6 +2900,7 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.CmdSetFrontFace = auto_cast GetDeviceProcAddr(device, "vkCmdSetFrontFace") vtable.CmdSetFrontFaceEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetFrontFaceEXT") vtable.CmdSetLineRasterizationModeEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetLineRasterizationModeEXT") + vtable.CmdSetLineStipple = auto_cast GetDeviceProcAddr(device, "vkCmdSetLineStipple") vtable.CmdSetLineStippleEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetLineStippleEXT") vtable.CmdSetLineStippleEnableEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetLineStippleEnableEXT") vtable.CmdSetLineStippleKHR = auto_cast GetDeviceProcAddr(device, "vkCmdSetLineStippleKHR") @@ -2831,7 +2922,9 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.CmdSetRasterizerDiscardEnable = auto_cast GetDeviceProcAddr(device, "vkCmdSetRasterizerDiscardEnable") vtable.CmdSetRasterizerDiscardEnableEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetRasterizerDiscardEnableEXT") vtable.CmdSetRayTracingPipelineStackSizeKHR = auto_cast GetDeviceProcAddr(device, "vkCmdSetRayTracingPipelineStackSizeKHR") + vtable.CmdSetRenderingAttachmentLocations = auto_cast GetDeviceProcAddr(device, "vkCmdSetRenderingAttachmentLocations") vtable.CmdSetRenderingAttachmentLocationsKHR = auto_cast GetDeviceProcAddr(device, "vkCmdSetRenderingAttachmentLocationsKHR") + vtable.CmdSetRenderingInputAttachmentIndices = auto_cast GetDeviceProcAddr(device, "vkCmdSetRenderingInputAttachmentIndices") vtable.CmdSetRenderingInputAttachmentIndicesKHR = auto_cast GetDeviceProcAddr(device, "vkCmdSetRenderingInputAttachmentIndicesKHR") vtable.CmdSetRepresentativeFragmentTestEnableNV = auto_cast GetDeviceProcAddr(device, "vkCmdSetRepresentativeFragmentTestEnableNV") vtable.CmdSetSampleLocationsEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetSampleLocationsEXT") @@ -2878,9 +2971,12 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.CompileDeferredNV = auto_cast GetDeviceProcAddr(device, "vkCompileDeferredNV") vtable.CopyAccelerationStructureKHR = auto_cast GetDeviceProcAddr(device, "vkCopyAccelerationStructureKHR") vtable.CopyAccelerationStructureToMemoryKHR = auto_cast GetDeviceProcAddr(device, "vkCopyAccelerationStructureToMemoryKHR") + vtable.CopyImageToImage = auto_cast GetDeviceProcAddr(device, "vkCopyImageToImage") vtable.CopyImageToImageEXT = auto_cast GetDeviceProcAddr(device, "vkCopyImageToImageEXT") + vtable.CopyImageToMemory = auto_cast GetDeviceProcAddr(device, "vkCopyImageToMemory") vtable.CopyImageToMemoryEXT = auto_cast GetDeviceProcAddr(device, "vkCopyImageToMemoryEXT") vtable.CopyMemoryToAccelerationStructureKHR = auto_cast GetDeviceProcAddr(device, "vkCopyMemoryToAccelerationStructureKHR") + vtable.CopyMemoryToImage = auto_cast GetDeviceProcAddr(device, "vkCopyMemoryToImage") vtable.CopyMemoryToImageEXT = auto_cast GetDeviceProcAddr(device, "vkCopyMemoryToImageEXT") vtable.CopyMemoryToMicromapEXT = auto_cast GetDeviceProcAddr(device, "vkCopyMemoryToMicromapEXT") vtable.CopyMicromapEXT = auto_cast GetDeviceProcAddr(device, "vkCopyMicromapEXT") @@ -3026,6 +3122,7 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.GetDeviceImageMemoryRequirementsKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeviceImageMemoryRequirementsKHR") vtable.GetDeviceImageSparseMemoryRequirements = auto_cast GetDeviceProcAddr(device, "vkGetDeviceImageSparseMemoryRequirements") vtable.GetDeviceImageSparseMemoryRequirementsKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeviceImageSparseMemoryRequirementsKHR") + vtable.GetDeviceImageSubresourceLayout = auto_cast GetDeviceProcAddr(device, "vkGetDeviceImageSubresourceLayout") vtable.GetDeviceImageSubresourceLayoutKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeviceImageSubresourceLayoutKHR") vtable.GetDeviceMemoryCommitment = auto_cast GetDeviceProcAddr(device, "vkGetDeviceMemoryCommitment") vtable.GetDeviceMemoryOpaqueCaptureAddress = auto_cast GetDeviceProcAddr(device, "vkGetDeviceMemoryOpaqueCaptureAddress") @@ -3053,9 +3150,11 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.GetImageSparseMemoryRequirements2 = auto_cast GetDeviceProcAddr(device, "vkGetImageSparseMemoryRequirements2") vtable.GetImageSparseMemoryRequirements2KHR = auto_cast GetDeviceProcAddr(device, "vkGetImageSparseMemoryRequirements2KHR") vtable.GetImageSubresourceLayout = auto_cast GetDeviceProcAddr(device, "vkGetImageSubresourceLayout") + vtable.GetImageSubresourceLayout2 = auto_cast GetDeviceProcAddr(device, "vkGetImageSubresourceLayout2") vtable.GetImageSubresourceLayout2EXT = auto_cast GetDeviceProcAddr(device, "vkGetImageSubresourceLayout2EXT") vtable.GetImageSubresourceLayout2KHR = auto_cast GetDeviceProcAddr(device, "vkGetImageSubresourceLayout2KHR") vtable.GetImageViewAddressNVX = auto_cast GetDeviceProcAddr(device, "vkGetImageViewAddressNVX") + vtable.GetImageViewHandle64NVX = auto_cast GetDeviceProcAddr(device, "vkGetImageViewHandle64NVX") vtable.GetImageViewHandleNVX = auto_cast GetDeviceProcAddr(device, "vkGetImageViewHandleNVX") vtable.GetImageViewOpaqueCaptureDescriptorDataEXT = auto_cast GetDeviceProcAddr(device, "vkGetImageViewOpaqueCaptureDescriptorDataEXT") vtable.GetLatencyTimingsNV = auto_cast GetDeviceProcAddr(device, "vkGetLatencyTimingsNV") @@ -3089,6 +3188,7 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.GetRayTracingShaderGroupStackSizeKHR = auto_cast GetDeviceProcAddr(device, "vkGetRayTracingShaderGroupStackSizeKHR") vtable.GetRefreshCycleDurationGOOGLE = auto_cast GetDeviceProcAddr(device, "vkGetRefreshCycleDurationGOOGLE") vtable.GetRenderAreaGranularity = auto_cast GetDeviceProcAddr(device, "vkGetRenderAreaGranularity") + vtable.GetRenderingAreaGranularity = auto_cast GetDeviceProcAddr(device, "vkGetRenderingAreaGranularity") vtable.GetRenderingAreaGranularityKHR = auto_cast GetDeviceProcAddr(device, "vkGetRenderingAreaGranularityKHR") vtable.GetSamplerOpaqueCaptureDescriptorDataEXT = auto_cast GetDeviceProcAddr(device, "vkGetSamplerOpaqueCaptureDescriptorDataEXT") vtable.GetSemaphoreCounterValue = auto_cast GetDeviceProcAddr(device, "vkGetSemaphoreCounterValue") @@ -3112,6 +3212,7 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.InvalidateMappedMemoryRanges = auto_cast GetDeviceProcAddr(device, "vkInvalidateMappedMemoryRanges") vtable.LatencySleepNV = auto_cast GetDeviceProcAddr(device, "vkLatencySleepNV") vtable.MapMemory = auto_cast GetDeviceProcAddr(device, "vkMapMemory") + vtable.MapMemory2 = auto_cast GetDeviceProcAddr(device, "vkMapMemory2") vtable.MapMemory2KHR = auto_cast GetDeviceProcAddr(device, "vkMapMemory2KHR") vtable.MergePipelineCaches = auto_cast GetDeviceProcAddr(device, "vkMergePipelineCaches") vtable.MergeValidationCachesEXT = auto_cast GetDeviceProcAddr(device, "vkMergeValidationCachesEXT") @@ -3152,11 +3253,13 @@ load_proc_addresses_device_vtable :: proc(device: Device, vtable: ^Device_VTable vtable.SetPrivateDataEXT = auto_cast GetDeviceProcAddr(device, "vkSetPrivateDataEXT") vtable.SignalSemaphore = auto_cast GetDeviceProcAddr(device, "vkSignalSemaphore") vtable.SignalSemaphoreKHR = auto_cast GetDeviceProcAddr(device, "vkSignalSemaphoreKHR") + vtable.TransitionImageLayout = auto_cast GetDeviceProcAddr(device, "vkTransitionImageLayout") vtable.TransitionImageLayoutEXT = auto_cast GetDeviceProcAddr(device, "vkTransitionImageLayoutEXT") vtable.TrimCommandPool = auto_cast GetDeviceProcAddr(device, "vkTrimCommandPool") vtable.TrimCommandPoolKHR = auto_cast GetDeviceProcAddr(device, "vkTrimCommandPoolKHR") vtable.UninitializePerformanceApiINTEL = auto_cast GetDeviceProcAddr(device, "vkUninitializePerformanceApiINTEL") vtable.UnmapMemory = auto_cast GetDeviceProcAddr(device, "vkUnmapMemory") + vtable.UnmapMemory2 = auto_cast GetDeviceProcAddr(device, "vkUnmapMemory2") vtable.UnmapMemory2KHR = auto_cast GetDeviceProcAddr(device, "vkUnmapMemory2KHR") vtable.UpdateDescriptorSetWithTemplate = auto_cast GetDeviceProcAddr(device, "vkUpdateDescriptorSetWithTemplate") vtable.UpdateDescriptorSetWithTemplateKHR = auto_cast GetDeviceProcAddr(device, "vkUpdateDescriptorSetWithTemplateKHR") @@ -3209,8 +3312,10 @@ load_proc_addresses_device :: proc(device: Device) { CmdBindDescriptorBufferEmbeddedSamplersEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBindDescriptorBufferEmbeddedSamplersEXT") CmdBindDescriptorBuffersEXT = auto_cast GetDeviceProcAddr(device, "vkCmdBindDescriptorBuffersEXT") CmdBindDescriptorSets = auto_cast GetDeviceProcAddr(device, "vkCmdBindDescriptorSets") + CmdBindDescriptorSets2 = auto_cast GetDeviceProcAddr(device, "vkCmdBindDescriptorSets2") CmdBindDescriptorSets2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdBindDescriptorSets2KHR") CmdBindIndexBuffer = auto_cast GetDeviceProcAddr(device, "vkCmdBindIndexBuffer") + CmdBindIndexBuffer2 = auto_cast GetDeviceProcAddr(device, "vkCmdBindIndexBuffer2") CmdBindIndexBuffer2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdBindIndexBuffer2KHR") CmdBindInvocationMaskHUAWEI = auto_cast GetDeviceProcAddr(device, "vkCmdBindInvocationMaskHUAWEI") CmdBindPipeline = auto_cast GetDeviceProcAddr(device, "vkCmdBindPipeline") @@ -3314,9 +3419,14 @@ load_proc_addresses_device :: proc(device: Device) { CmdPreprocessGeneratedCommandsEXT = auto_cast GetDeviceProcAddr(device, "vkCmdPreprocessGeneratedCommandsEXT") CmdPreprocessGeneratedCommandsNV = auto_cast GetDeviceProcAddr(device, "vkCmdPreprocessGeneratedCommandsNV") CmdPushConstants = auto_cast GetDeviceProcAddr(device, "vkCmdPushConstants") + CmdPushConstants2 = auto_cast GetDeviceProcAddr(device, "vkCmdPushConstants2") CmdPushConstants2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdPushConstants2KHR") + CmdPushDescriptorSet = auto_cast GetDeviceProcAddr(device, "vkCmdPushDescriptorSet") + CmdPushDescriptorSet2 = auto_cast GetDeviceProcAddr(device, "vkCmdPushDescriptorSet2") CmdPushDescriptorSet2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdPushDescriptorSet2KHR") CmdPushDescriptorSetKHR = auto_cast GetDeviceProcAddr(device, "vkCmdPushDescriptorSetKHR") + CmdPushDescriptorSetWithTemplate = auto_cast GetDeviceProcAddr(device, "vkCmdPushDescriptorSetWithTemplate") + CmdPushDescriptorSetWithTemplate2 = auto_cast GetDeviceProcAddr(device, "vkCmdPushDescriptorSetWithTemplate2") CmdPushDescriptorSetWithTemplate2KHR = auto_cast GetDeviceProcAddr(device, "vkCmdPushDescriptorSetWithTemplate2KHR") CmdPushDescriptorSetWithTemplateKHR = auto_cast GetDeviceProcAddr(device, "vkCmdPushDescriptorSetWithTemplateKHR") CmdResetEvent = auto_cast GetDeviceProcAddr(device, "vkCmdResetEvent") @@ -3380,6 +3490,7 @@ load_proc_addresses_device :: proc(device: Device) { CmdSetFrontFace = auto_cast GetDeviceProcAddr(device, "vkCmdSetFrontFace") CmdSetFrontFaceEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetFrontFaceEXT") CmdSetLineRasterizationModeEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetLineRasterizationModeEXT") + CmdSetLineStipple = auto_cast GetDeviceProcAddr(device, "vkCmdSetLineStipple") CmdSetLineStippleEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetLineStippleEXT") CmdSetLineStippleEnableEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetLineStippleEnableEXT") CmdSetLineStippleKHR = auto_cast GetDeviceProcAddr(device, "vkCmdSetLineStippleKHR") @@ -3401,7 +3512,9 @@ load_proc_addresses_device :: proc(device: Device) { CmdSetRasterizerDiscardEnable = auto_cast GetDeviceProcAddr(device, "vkCmdSetRasterizerDiscardEnable") CmdSetRasterizerDiscardEnableEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetRasterizerDiscardEnableEXT") CmdSetRayTracingPipelineStackSizeKHR = auto_cast GetDeviceProcAddr(device, "vkCmdSetRayTracingPipelineStackSizeKHR") + CmdSetRenderingAttachmentLocations = auto_cast GetDeviceProcAddr(device, "vkCmdSetRenderingAttachmentLocations") CmdSetRenderingAttachmentLocationsKHR = auto_cast GetDeviceProcAddr(device, "vkCmdSetRenderingAttachmentLocationsKHR") + CmdSetRenderingInputAttachmentIndices = auto_cast GetDeviceProcAddr(device, "vkCmdSetRenderingInputAttachmentIndices") CmdSetRenderingInputAttachmentIndicesKHR = auto_cast GetDeviceProcAddr(device, "vkCmdSetRenderingInputAttachmentIndicesKHR") CmdSetRepresentativeFragmentTestEnableNV = auto_cast GetDeviceProcAddr(device, "vkCmdSetRepresentativeFragmentTestEnableNV") CmdSetSampleLocationsEXT = auto_cast GetDeviceProcAddr(device, "vkCmdSetSampleLocationsEXT") @@ -3448,9 +3561,12 @@ load_proc_addresses_device :: proc(device: Device) { CompileDeferredNV = auto_cast GetDeviceProcAddr(device, "vkCompileDeferredNV") CopyAccelerationStructureKHR = auto_cast GetDeviceProcAddr(device, "vkCopyAccelerationStructureKHR") CopyAccelerationStructureToMemoryKHR = auto_cast GetDeviceProcAddr(device, "vkCopyAccelerationStructureToMemoryKHR") + CopyImageToImage = auto_cast GetDeviceProcAddr(device, "vkCopyImageToImage") CopyImageToImageEXT = auto_cast GetDeviceProcAddr(device, "vkCopyImageToImageEXT") + CopyImageToMemory = auto_cast GetDeviceProcAddr(device, "vkCopyImageToMemory") CopyImageToMemoryEXT = auto_cast GetDeviceProcAddr(device, "vkCopyImageToMemoryEXT") CopyMemoryToAccelerationStructureKHR = auto_cast GetDeviceProcAddr(device, "vkCopyMemoryToAccelerationStructureKHR") + CopyMemoryToImage = auto_cast GetDeviceProcAddr(device, "vkCopyMemoryToImage") CopyMemoryToImageEXT = auto_cast GetDeviceProcAddr(device, "vkCopyMemoryToImageEXT") CopyMemoryToMicromapEXT = auto_cast GetDeviceProcAddr(device, "vkCopyMemoryToMicromapEXT") CopyMicromapEXT = auto_cast GetDeviceProcAddr(device, "vkCopyMicromapEXT") @@ -3596,6 +3712,7 @@ load_proc_addresses_device :: proc(device: Device) { GetDeviceImageMemoryRequirementsKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeviceImageMemoryRequirementsKHR") GetDeviceImageSparseMemoryRequirements = auto_cast GetDeviceProcAddr(device, "vkGetDeviceImageSparseMemoryRequirements") GetDeviceImageSparseMemoryRequirementsKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeviceImageSparseMemoryRequirementsKHR") + GetDeviceImageSubresourceLayout = auto_cast GetDeviceProcAddr(device, "vkGetDeviceImageSubresourceLayout") GetDeviceImageSubresourceLayoutKHR = auto_cast GetDeviceProcAddr(device, "vkGetDeviceImageSubresourceLayoutKHR") GetDeviceMemoryCommitment = auto_cast GetDeviceProcAddr(device, "vkGetDeviceMemoryCommitment") GetDeviceMemoryOpaqueCaptureAddress = auto_cast GetDeviceProcAddr(device, "vkGetDeviceMemoryOpaqueCaptureAddress") @@ -3623,9 +3740,11 @@ load_proc_addresses_device :: proc(device: Device) { GetImageSparseMemoryRequirements2 = auto_cast GetDeviceProcAddr(device, "vkGetImageSparseMemoryRequirements2") GetImageSparseMemoryRequirements2KHR = auto_cast GetDeviceProcAddr(device, "vkGetImageSparseMemoryRequirements2KHR") GetImageSubresourceLayout = auto_cast GetDeviceProcAddr(device, "vkGetImageSubresourceLayout") + GetImageSubresourceLayout2 = auto_cast GetDeviceProcAddr(device, "vkGetImageSubresourceLayout2") GetImageSubresourceLayout2EXT = auto_cast GetDeviceProcAddr(device, "vkGetImageSubresourceLayout2EXT") GetImageSubresourceLayout2KHR = auto_cast GetDeviceProcAddr(device, "vkGetImageSubresourceLayout2KHR") GetImageViewAddressNVX = auto_cast GetDeviceProcAddr(device, "vkGetImageViewAddressNVX") + GetImageViewHandle64NVX = auto_cast GetDeviceProcAddr(device, "vkGetImageViewHandle64NVX") GetImageViewHandleNVX = auto_cast GetDeviceProcAddr(device, "vkGetImageViewHandleNVX") GetImageViewOpaqueCaptureDescriptorDataEXT = auto_cast GetDeviceProcAddr(device, "vkGetImageViewOpaqueCaptureDescriptorDataEXT") GetLatencyTimingsNV = auto_cast GetDeviceProcAddr(device, "vkGetLatencyTimingsNV") @@ -3659,6 +3778,7 @@ load_proc_addresses_device :: proc(device: Device) { GetRayTracingShaderGroupStackSizeKHR = auto_cast GetDeviceProcAddr(device, "vkGetRayTracingShaderGroupStackSizeKHR") GetRefreshCycleDurationGOOGLE = auto_cast GetDeviceProcAddr(device, "vkGetRefreshCycleDurationGOOGLE") GetRenderAreaGranularity = auto_cast GetDeviceProcAddr(device, "vkGetRenderAreaGranularity") + GetRenderingAreaGranularity = auto_cast GetDeviceProcAddr(device, "vkGetRenderingAreaGranularity") GetRenderingAreaGranularityKHR = auto_cast GetDeviceProcAddr(device, "vkGetRenderingAreaGranularityKHR") GetSamplerOpaqueCaptureDescriptorDataEXT = auto_cast GetDeviceProcAddr(device, "vkGetSamplerOpaqueCaptureDescriptorDataEXT") GetSemaphoreCounterValue = auto_cast GetDeviceProcAddr(device, "vkGetSemaphoreCounterValue") @@ -3682,6 +3802,7 @@ load_proc_addresses_device :: proc(device: Device) { InvalidateMappedMemoryRanges = auto_cast GetDeviceProcAddr(device, "vkInvalidateMappedMemoryRanges") LatencySleepNV = auto_cast GetDeviceProcAddr(device, "vkLatencySleepNV") MapMemory = auto_cast GetDeviceProcAddr(device, "vkMapMemory") + MapMemory2 = auto_cast GetDeviceProcAddr(device, "vkMapMemory2") MapMemory2KHR = auto_cast GetDeviceProcAddr(device, "vkMapMemory2KHR") MergePipelineCaches = auto_cast GetDeviceProcAddr(device, "vkMergePipelineCaches") MergeValidationCachesEXT = auto_cast GetDeviceProcAddr(device, "vkMergeValidationCachesEXT") @@ -3722,11 +3843,13 @@ load_proc_addresses_device :: proc(device: Device) { SetPrivateDataEXT = auto_cast GetDeviceProcAddr(device, "vkSetPrivateDataEXT") SignalSemaphore = auto_cast GetDeviceProcAddr(device, "vkSignalSemaphore") SignalSemaphoreKHR = auto_cast GetDeviceProcAddr(device, "vkSignalSemaphoreKHR") + TransitionImageLayout = auto_cast GetDeviceProcAddr(device, "vkTransitionImageLayout") TransitionImageLayoutEXT = auto_cast GetDeviceProcAddr(device, "vkTransitionImageLayoutEXT") TrimCommandPool = auto_cast GetDeviceProcAddr(device, "vkTrimCommandPool") TrimCommandPoolKHR = auto_cast GetDeviceProcAddr(device, "vkTrimCommandPoolKHR") UninitializePerformanceApiINTEL = auto_cast GetDeviceProcAddr(device, "vkUninitializePerformanceApiINTEL") UnmapMemory = auto_cast GetDeviceProcAddr(device, "vkUnmapMemory") + UnmapMemory2 = auto_cast GetDeviceProcAddr(device, "vkUnmapMemory2") UnmapMemory2KHR = auto_cast GetDeviceProcAddr(device, "vkUnmapMemory2KHR") UpdateDescriptorSetWithTemplate = auto_cast GetDeviceProcAddr(device, "vkUpdateDescriptorSetWithTemplate") UpdateDescriptorSetWithTemplateKHR = auto_cast GetDeviceProcAddr(device, "vkUpdateDescriptorSetWithTemplateKHR") @@ -3743,97 +3866,98 @@ load_proc_addresses_device :: proc(device: Device) { } 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") - 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") - GetPhysicalDeviceCooperativeMatrixPropertiesKHR = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR") - GetPhysicalDeviceCooperativeMatrixPropertiesNV = auto_cast GetInstanceProcAddr(instance, "vkGetPhysicalDeviceCooperativeMatrixPropertiesNV") - 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") - 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") + 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") + 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") + 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") @@ -3872,8 +3996,10 @@ load_proc_addresses_instance :: proc(instance: Instance) { CmdBindDescriptorBufferEmbeddedSamplersEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdBindDescriptorBufferEmbeddedSamplersEXT") CmdBindDescriptorBuffersEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdBindDescriptorBuffersEXT") CmdBindDescriptorSets = auto_cast GetInstanceProcAddr(instance, "vkCmdBindDescriptorSets") + CmdBindDescriptorSets2 = auto_cast GetInstanceProcAddr(instance, "vkCmdBindDescriptorSets2") CmdBindDescriptorSets2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdBindDescriptorSets2KHR") CmdBindIndexBuffer = auto_cast GetInstanceProcAddr(instance, "vkCmdBindIndexBuffer") + CmdBindIndexBuffer2 = auto_cast GetInstanceProcAddr(instance, "vkCmdBindIndexBuffer2") CmdBindIndexBuffer2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdBindIndexBuffer2KHR") CmdBindInvocationMaskHUAWEI = auto_cast GetInstanceProcAddr(instance, "vkCmdBindInvocationMaskHUAWEI") CmdBindPipeline = auto_cast GetInstanceProcAddr(instance, "vkCmdBindPipeline") @@ -3977,9 +4103,14 @@ load_proc_addresses_instance :: proc(instance: Instance) { CmdPreprocessGeneratedCommandsEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdPreprocessGeneratedCommandsEXT") CmdPreprocessGeneratedCommandsNV = auto_cast GetInstanceProcAddr(instance, "vkCmdPreprocessGeneratedCommandsNV") CmdPushConstants = auto_cast GetInstanceProcAddr(instance, "vkCmdPushConstants") + CmdPushConstants2 = auto_cast GetInstanceProcAddr(instance, "vkCmdPushConstants2") CmdPushConstants2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdPushConstants2KHR") + CmdPushDescriptorSet = auto_cast GetInstanceProcAddr(instance, "vkCmdPushDescriptorSet") + CmdPushDescriptorSet2 = auto_cast GetInstanceProcAddr(instance, "vkCmdPushDescriptorSet2") CmdPushDescriptorSet2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdPushDescriptorSet2KHR") CmdPushDescriptorSetKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdPushDescriptorSetKHR") + CmdPushDescriptorSetWithTemplate = auto_cast GetInstanceProcAddr(instance, "vkCmdPushDescriptorSetWithTemplate") + CmdPushDescriptorSetWithTemplate2 = auto_cast GetInstanceProcAddr(instance, "vkCmdPushDescriptorSetWithTemplate2") CmdPushDescriptorSetWithTemplate2KHR = auto_cast GetInstanceProcAddr(instance, "vkCmdPushDescriptorSetWithTemplate2KHR") CmdPushDescriptorSetWithTemplateKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdPushDescriptorSetWithTemplateKHR") CmdResetEvent = auto_cast GetInstanceProcAddr(instance, "vkCmdResetEvent") @@ -4043,6 +4174,7 @@ load_proc_addresses_instance :: proc(instance: Instance) { CmdSetFrontFace = auto_cast GetInstanceProcAddr(instance, "vkCmdSetFrontFace") CmdSetFrontFaceEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetFrontFaceEXT") CmdSetLineRasterizationModeEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetLineRasterizationModeEXT") + CmdSetLineStipple = auto_cast GetInstanceProcAddr(instance, "vkCmdSetLineStipple") CmdSetLineStippleEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetLineStippleEXT") CmdSetLineStippleEnableEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetLineStippleEnableEXT") CmdSetLineStippleKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdSetLineStippleKHR") @@ -4064,7 +4196,9 @@ load_proc_addresses_instance :: proc(instance: Instance) { CmdSetRasterizerDiscardEnable = auto_cast GetInstanceProcAddr(instance, "vkCmdSetRasterizerDiscardEnable") CmdSetRasterizerDiscardEnableEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetRasterizerDiscardEnableEXT") CmdSetRayTracingPipelineStackSizeKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdSetRayTracingPipelineStackSizeKHR") + CmdSetRenderingAttachmentLocations = auto_cast GetInstanceProcAddr(instance, "vkCmdSetRenderingAttachmentLocations") CmdSetRenderingAttachmentLocationsKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdSetRenderingAttachmentLocationsKHR") + CmdSetRenderingInputAttachmentIndices = auto_cast GetInstanceProcAddr(instance, "vkCmdSetRenderingInputAttachmentIndices") CmdSetRenderingInputAttachmentIndicesKHR = auto_cast GetInstanceProcAddr(instance, "vkCmdSetRenderingInputAttachmentIndicesKHR") CmdSetRepresentativeFragmentTestEnableNV = auto_cast GetInstanceProcAddr(instance, "vkCmdSetRepresentativeFragmentTestEnableNV") CmdSetSampleLocationsEXT = auto_cast GetInstanceProcAddr(instance, "vkCmdSetSampleLocationsEXT") @@ -4111,9 +4245,12 @@ load_proc_addresses_instance :: proc(instance: Instance) { CompileDeferredNV = auto_cast GetInstanceProcAddr(instance, "vkCompileDeferredNV") CopyAccelerationStructureKHR = auto_cast GetInstanceProcAddr(instance, "vkCopyAccelerationStructureKHR") CopyAccelerationStructureToMemoryKHR = auto_cast GetInstanceProcAddr(instance, "vkCopyAccelerationStructureToMemoryKHR") + CopyImageToImage = auto_cast GetInstanceProcAddr(instance, "vkCopyImageToImage") CopyImageToImageEXT = auto_cast GetInstanceProcAddr(instance, "vkCopyImageToImageEXT") + CopyImageToMemory = auto_cast GetInstanceProcAddr(instance, "vkCopyImageToMemory") CopyImageToMemoryEXT = auto_cast GetInstanceProcAddr(instance, "vkCopyImageToMemoryEXT") CopyMemoryToAccelerationStructureKHR = auto_cast GetInstanceProcAddr(instance, "vkCopyMemoryToAccelerationStructureKHR") + CopyMemoryToImage = auto_cast GetInstanceProcAddr(instance, "vkCopyMemoryToImage") CopyMemoryToImageEXT = auto_cast GetInstanceProcAddr(instance, "vkCopyMemoryToImageEXT") CopyMemoryToMicromapEXT = auto_cast GetInstanceProcAddr(instance, "vkCopyMemoryToMicromapEXT") CopyMicromapEXT = auto_cast GetInstanceProcAddr(instance, "vkCopyMicromapEXT") @@ -4259,6 +4396,7 @@ load_proc_addresses_instance :: proc(instance: Instance) { GetDeviceImageMemoryRequirementsKHR = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceImageMemoryRequirementsKHR") GetDeviceImageSparseMemoryRequirements = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceImageSparseMemoryRequirements") GetDeviceImageSparseMemoryRequirementsKHR = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceImageSparseMemoryRequirementsKHR") + GetDeviceImageSubresourceLayout = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceImageSubresourceLayout") GetDeviceImageSubresourceLayoutKHR = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceImageSubresourceLayoutKHR") GetDeviceMemoryCommitment = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceMemoryCommitment") GetDeviceMemoryOpaqueCaptureAddress = auto_cast GetInstanceProcAddr(instance, "vkGetDeviceMemoryOpaqueCaptureAddress") @@ -4286,9 +4424,11 @@ load_proc_addresses_instance :: proc(instance: Instance) { GetImageSparseMemoryRequirements2 = auto_cast GetInstanceProcAddr(instance, "vkGetImageSparseMemoryRequirements2") GetImageSparseMemoryRequirements2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetImageSparseMemoryRequirements2KHR") GetImageSubresourceLayout = auto_cast GetInstanceProcAddr(instance, "vkGetImageSubresourceLayout") + GetImageSubresourceLayout2 = auto_cast GetInstanceProcAddr(instance, "vkGetImageSubresourceLayout2") GetImageSubresourceLayout2EXT = auto_cast GetInstanceProcAddr(instance, "vkGetImageSubresourceLayout2EXT") GetImageSubresourceLayout2KHR = auto_cast GetInstanceProcAddr(instance, "vkGetImageSubresourceLayout2KHR") GetImageViewAddressNVX = auto_cast GetInstanceProcAddr(instance, "vkGetImageViewAddressNVX") + GetImageViewHandle64NVX = auto_cast GetInstanceProcAddr(instance, "vkGetImageViewHandle64NVX") GetImageViewHandleNVX = auto_cast GetInstanceProcAddr(instance, "vkGetImageViewHandleNVX") GetImageViewOpaqueCaptureDescriptorDataEXT = auto_cast GetInstanceProcAddr(instance, "vkGetImageViewOpaqueCaptureDescriptorDataEXT") GetLatencyTimingsNV = auto_cast GetInstanceProcAddr(instance, "vkGetLatencyTimingsNV") @@ -4322,6 +4462,7 @@ load_proc_addresses_instance :: proc(instance: Instance) { GetRayTracingShaderGroupStackSizeKHR = auto_cast GetInstanceProcAddr(instance, "vkGetRayTracingShaderGroupStackSizeKHR") GetRefreshCycleDurationGOOGLE = auto_cast GetInstanceProcAddr(instance, "vkGetRefreshCycleDurationGOOGLE") GetRenderAreaGranularity = auto_cast GetInstanceProcAddr(instance, "vkGetRenderAreaGranularity") + GetRenderingAreaGranularity = auto_cast GetInstanceProcAddr(instance, "vkGetRenderingAreaGranularity") GetRenderingAreaGranularityKHR = auto_cast GetInstanceProcAddr(instance, "vkGetRenderingAreaGranularityKHR") GetSamplerOpaqueCaptureDescriptorDataEXT = auto_cast GetInstanceProcAddr(instance, "vkGetSamplerOpaqueCaptureDescriptorDataEXT") GetSemaphoreCounterValue = auto_cast GetInstanceProcAddr(instance, "vkGetSemaphoreCounterValue") @@ -4345,6 +4486,7 @@ load_proc_addresses_instance :: proc(instance: Instance) { InvalidateMappedMemoryRanges = auto_cast GetInstanceProcAddr(instance, "vkInvalidateMappedMemoryRanges") LatencySleepNV = auto_cast GetInstanceProcAddr(instance, "vkLatencySleepNV") MapMemory = auto_cast GetInstanceProcAddr(instance, "vkMapMemory") + MapMemory2 = auto_cast GetInstanceProcAddr(instance, "vkMapMemory2") MapMemory2KHR = auto_cast GetInstanceProcAddr(instance, "vkMapMemory2KHR") MergePipelineCaches = auto_cast GetInstanceProcAddr(instance, "vkMergePipelineCaches") MergeValidationCachesEXT = auto_cast GetInstanceProcAddr(instance, "vkMergeValidationCachesEXT") @@ -4385,11 +4527,13 @@ load_proc_addresses_instance :: proc(instance: Instance) { SetPrivateDataEXT = auto_cast GetInstanceProcAddr(instance, "vkSetPrivateDataEXT") SignalSemaphore = auto_cast GetInstanceProcAddr(instance, "vkSignalSemaphore") SignalSemaphoreKHR = auto_cast GetInstanceProcAddr(instance, "vkSignalSemaphoreKHR") + TransitionImageLayout = auto_cast GetInstanceProcAddr(instance, "vkTransitionImageLayout") TransitionImageLayoutEXT = auto_cast GetInstanceProcAddr(instance, "vkTransitionImageLayoutEXT") TrimCommandPool = auto_cast GetInstanceProcAddr(instance, "vkTrimCommandPool") TrimCommandPoolKHR = auto_cast GetInstanceProcAddr(instance, "vkTrimCommandPoolKHR") UninitializePerformanceApiINTEL = auto_cast GetInstanceProcAddr(instance, "vkUninitializePerformanceApiINTEL") UnmapMemory = auto_cast GetInstanceProcAddr(instance, "vkUnmapMemory") + UnmapMemory2 = auto_cast GetInstanceProcAddr(instance, "vkUnmapMemory2") UnmapMemory2KHR = auto_cast GetInstanceProcAddr(instance, "vkUnmapMemory2KHR") UpdateDescriptorSetWithTemplate = auto_cast GetInstanceProcAddr(instance, "vkUpdateDescriptorSetWithTemplate") UpdateDescriptorSetWithTemplateKHR = auto_cast GetInstanceProcAddr(instance, "vkUpdateDescriptorSetWithTemplateKHR") diff --git a/vendor/vulkan/structs.odin b/vendor/vulkan/structs.odin index 15c1a527a..3c41d1923 100644 --- a/vendor/vulkan/structs.odin +++ b/vendor/vulkan/structs.odin @@ -2707,6 +2707,444 @@ DeviceImageMemoryRequirements :: struct { planeAspect: ImageAspectFlags, } +PhysicalDeviceVulkan14Features :: struct { + sType: StructureType, + pNext: rawptr, + globalPriorityQuery: b32, + shaderSubgroupRotate: b32, + shaderSubgroupRotateClustered: b32, + shaderFloatControls2: b32, + shaderExpectAssume: b32, + rectangularLines: b32, + bresenhamLines: b32, + smoothLines: b32, + stippledRectangularLines: b32, + stippledBresenhamLines: b32, + stippledSmoothLines: b32, + vertexAttributeInstanceRateDivisor: b32, + vertexAttributeInstanceRateZeroDivisor: b32, + indexTypeUint8: b32, + dynamicRenderingLocalRead: b32, + maintenance5: b32, + maintenance6: b32, + pipelineProtectedAccess: b32, + pipelineRobustness: b32, + hostImageCopy: b32, + pushDescriptor: b32, +} + +PhysicalDeviceVulkan14Properties :: struct { + sType: StructureType, + pNext: rawptr, + lineSubPixelPrecisionBits: u32, + maxVertexAttribDivisor: u32, + supportsNonZeroFirstInstance: b32, + maxPushDescriptors: u32, + dynamicRenderingLocalReadDepthStencilAttachments: b32, + dynamicRenderingLocalReadMultisampledAttachments: b32, + earlyFragmentMultisampleCoverageAfterSampleCounting: b32, + earlyFragmentSampleMaskTestBeforeSampleCounting: b32, + depthStencilSwizzleOneSupport: b32, + polygonModePointSize: b32, + nonStrictSinglePixelWideLinesUseParallelogram: b32, + nonStrictWideLinesUseParallelogram: b32, + blockTexelViewCompatibleMultipleLayers: b32, + maxCombinedImageSamplerDescriptorCount: u32, + fragmentShadingRateClampCombinerInputs: b32, + defaultRobustnessStorageBuffers: PipelineRobustnessBufferBehavior, + defaultRobustnessUniformBuffers: PipelineRobustnessBufferBehavior, + defaultRobustnessVertexInputs: PipelineRobustnessBufferBehavior, + defaultRobustnessImages: PipelineRobustnessImageBehavior, + copySrcLayoutCount: u32, + pCopySrcLayouts: [^]ImageLayout, + copyDstLayoutCount: u32, + pCopyDstLayouts: [^]ImageLayout, + optimalTilingLayoutUUID: [UUID_SIZE]u8, + identicalMemoryTypeRequirements: b32, +} + +DeviceQueueGlobalPriorityCreateInfo :: struct { + sType: StructureType, + pNext: rawptr, + globalPriority: QueueGlobalPriority, +} + +PhysicalDeviceGlobalPriorityQueryFeatures :: struct { + sType: StructureType, + pNext: rawptr, + globalPriorityQuery: b32, +} + +QueueFamilyGlobalPriorityProperties :: struct { + sType: StructureType, + pNext: rawptr, + priorityCount: u32, + 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, + indexTypeUint8: b32, +} + +MemoryMapInfo :: struct { + sType: StructureType, + pNext: rawptr, + flags: MemoryMapFlags, + memory: DeviceMemory, + offset: DeviceSize, + size: DeviceSize, +} + +MemoryUnmapInfo :: struct { + sType: StructureType, + pNext: rawptr, + flags: MemoryUnmapFlags, + memory: DeviceMemory, +} + +PhysicalDeviceMaintenance5Features :: struct { + sType: StructureType, + pNext: rawptr, + maintenance5: b32, +} + +PhysicalDeviceMaintenance5Properties :: struct { + sType: StructureType, + pNext: rawptr, + earlyFragmentMultisampleCoverageAfterSampleCounting: b32, + earlyFragmentSampleMaskTestBeforeSampleCounting: b32, + depthStencilSwizzleOneSupport: b32, + polygonModePointSize: b32, + nonStrictSinglePixelWideLinesUseParallelogram: b32, + nonStrictWideLinesUseParallelogram: b32, +} + +RenderingAreaInfo :: struct { + sType: StructureType, + pNext: rawptr, + viewMask: u32, + colorAttachmentCount: u32, + pColorAttachmentFormats: [^]Format, + depthAttachmentFormat: Format, + stencilAttachmentFormat: Format, +} + +ImageSubresource2 :: struct { + sType: StructureType, + pNext: rawptr, + imageSubresource: ImageSubresource, +} + +DeviceImageSubresourceInfo :: struct { + sType: StructureType, + pNext: rawptr, + pCreateInfo: ^ImageCreateInfo, + 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, + maintenance6: b32, +} + +PhysicalDeviceMaintenance6Properties :: struct { + sType: StructureType, + pNext: rawptr, + blockTexelViewCompatibleMultipleLayers: b32, + maxCombinedImageSamplerDescriptorCount: u32, + fragmentShadingRateClampCombinerInputs: b32, +} + +BindMemoryStatus :: struct { + sType: StructureType, + pNext: rawptr, + 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, + hostImageCopy: b32, +} + +PhysicalDeviceHostImageCopyProperties :: struct { + sType: StructureType, + pNext: rawptr, + copySrcLayoutCount: u32, + pCopySrcLayouts: [^]ImageLayout, + copyDstLayoutCount: u32, + pCopyDstLayouts: [^]ImageLayout, + optimalTilingLayoutUUID: [UUID_SIZE]u8, + identicalMemoryTypeRequirements: b32, +} + +MemoryToImageCopy :: struct { + sType: StructureType, + pNext: rawptr, + pHostPointer: rawptr, + memoryRowLength: u32, + memoryImageHeight: u32, + imageSubresource: ImageSubresourceLayers, + imageOffset: Offset3D, + imageExtent: Extent3D, +} + +ImageToMemoryCopy :: struct { + sType: StructureType, + pNext: rawptr, + pHostPointer: rawptr, + memoryRowLength: u32, + memoryImageHeight: u32, + imageSubresource: ImageSubresourceLayers, + imageOffset: Offset3D, + imageExtent: Extent3D, +} + +CopyMemoryToImageInfo :: struct { + sType: StructureType, + pNext: rawptr, + flags: HostImageCopyFlags, + dstImage: Image, + dstImageLayout: ImageLayout, + regionCount: u32, + pRegions: [^]MemoryToImageCopy, +} + +CopyImageToMemoryInfo :: struct { + sType: StructureType, + pNext: rawptr, + flags: HostImageCopyFlags, + srcImage: Image, + srcImageLayout: ImageLayout, + regionCount: u32, + pRegions: [^]ImageToMemoryCopy, +} + +CopyImageToImageInfo :: struct { + sType: StructureType, + pNext: rawptr, + flags: HostImageCopyFlags, + srcImage: Image, + srcImageLayout: ImageLayout, + dstImage: Image, + dstImageLayout: ImageLayout, + regionCount: u32, + pRegions: [^]ImageCopy2, +} + +HostImageLayoutTransitionInfo :: struct { + sType: StructureType, + pNext: rawptr, + image: Image, + oldLayout: ImageLayout, + newLayout: ImageLayout, + subresourceRange: ImageSubresourceRange, +} + +SubresourceHostMemcpySize :: struct { + sType: StructureType, + pNext: rawptr, + size: DeviceSize, +} + +HostImageCopyDevicePerformanceQuery :: struct { + sType: StructureType, + pNext: rawptr, + optimalDeviceAccess: b32, + identicalMemoryLayout: b32, +} + SurfaceCapabilitiesKHR :: struct { minImageCount: u32, maxImageCount: u32, @@ -3368,36 +3806,6 @@ VideoDecodeH264DpbSlotInfoKHR :: struct { pStdReferenceInfo: ^VideoDecodeH264ReferenceInfo, } -RenderingFragmentShadingRateAttachmentInfoKHR :: struct { - sType: StructureType, - pNext: rawptr, - imageView: ImageView, - imageLayout: ImageLayout, - shadingRateAttachmentTexelSize: Extent2D, -} - -RenderingFragmentDensityMapAttachmentInfoEXT :: struct { - sType: StructureType, - pNext: rawptr, - imageView: ImageView, - imageLayout: ImageLayout, -} - -AttachmentSampleCountInfoAMD :: struct { - sType: StructureType, - pNext: rawptr, - colorAttachmentCount: u32, - pColorAttachmentSamples: [^]SampleCountFlags, - depthStencilAttachmentSamples: SampleCountFlags, -} - -MultiviewPerViewAttributesInfoNVX :: struct { - sType: StructureType, - pNext: rawptr, - perViewAttributes: b32, - perViewAttributesPositionXOnly: b32, -} - ImportMemoryFdInfoKHR :: struct { sType: StructureType, pNext: rawptr, @@ -3434,12 +3842,6 @@ SemaphoreGetFdInfoKHR :: struct { handleType: ExternalSemaphoreHandleTypeFlags, } -PhysicalDevicePushDescriptorPropertiesKHR :: struct { - sType: StructureType, - pNext: rawptr, - maxPushDescriptors: u32, -} - RectLayerKHR :: struct { offset: Offset2D, extent: Extent2D, @@ -3643,25 +4045,6 @@ VideoDecodeH265DpbSlotInfoKHR :: struct { pStdReferenceInfo: ^VideoDecodeH265ReferenceInfo, } -DeviceQueueGlobalPriorityCreateInfoKHR :: struct { - sType: StructureType, - pNext: rawptr, - globalPriority: QueueGlobalPriorityKHR, -} - -PhysicalDeviceGlobalPriorityQueryFeaturesKHR :: struct { - sType: StructureType, - pNext: rawptr, - globalPriorityQuery: b32, -} - -QueueFamilyGlobalPriorityPropertiesKHR :: struct { - sType: StructureType, - pNext: rawptr, - priorityCount: u32, - priorities: [MAX_GLOBAL_PRIORITY_SIZE_KHR]QueueGlobalPriorityKHR, -} - FragmentShadingRateAttachmentInfoKHR :: struct { sType: StructureType, pNext: rawptr, @@ -3713,26 +4096,12 @@ PhysicalDeviceFragmentShadingRateKHR :: struct { fragmentSize: Extent2D, } -PhysicalDeviceDynamicRenderingLocalReadFeaturesKHR :: struct { - sType: StructureType, - pNext: rawptr, - dynamicRenderingLocalRead: b32, -} - -RenderingAttachmentLocationInfoKHR :: struct { - sType: StructureType, - pNext: rawptr, - colorAttachmentCount: u32, - pColorAttachmentLocations: [^]u32, -} - -RenderingInputAttachmentIndexInfoKHR :: struct { - sType: StructureType, - pNext: rawptr, - colorAttachmentCount: u32, - pColorAttachmentInputIndices: [^]u32, - pDepthInputAttachmentIndex: ^u32, - pStencilInputAttachmentIndex: ^u32, +RenderingFragmentShadingRateAttachmentInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + imageView: ImageView, + imageLayout: ImageLayout, + shadingRateAttachmentTexelSize: Extent2D, } PhysicalDeviceShaderQuadControlFeaturesKHR :: struct { @@ -3807,22 +4176,6 @@ PipelineExecutableInternalRepresentationKHR :: struct { pData: rawptr, } -MemoryMapInfoKHR :: struct { - sType: StructureType, - pNext: rawptr, - flags: MemoryMapFlags, - memory: DeviceMemory, - offset: DeviceSize, - size: DeviceSize, -} - -MemoryUnmapInfoKHR :: struct { - sType: StructureType, - pNext: rawptr, - flags: MemoryUnmapFlagsKHR, - memory: DeviceMemory, -} - PipelineLibraryCreateInfoKHR :: struct { sType: StructureType, pNext: rawptr, @@ -3935,19 +4288,6 @@ VideoEncodeSessionParametersFeedbackInfoKHR :: struct { hasOverrides: b32, } -QueueFamilyCheckpointProperties2NV :: struct { - sType: StructureType, - pNext: rawptr, - checkpointExecutionStageMask: PipelineStageFlags2, -} - -CheckpointData2NV :: struct { - sType: StructureType, - pNext: rawptr, - stage: PipelineStageFlags2, - pCheckpointMarker: rawptr, -} - PhysicalDeviceFragmentShaderBarycentricFeaturesKHR :: struct { sType: StructureType, pNext: rawptr, @@ -3999,77 +4339,12 @@ TraceRaysIndirectCommand2KHR :: struct { depth: u32, } -PhysicalDeviceShaderSubgroupRotateFeaturesKHR :: struct { - sType: StructureType, - pNext: rawptr, - shaderSubgroupRotate: b32, - shaderSubgroupRotateClustered: b32, -} - PhysicalDeviceShaderMaximalReconvergenceFeaturesKHR :: struct { sType: StructureType, pNext: rawptr, shaderMaximalReconvergence: b32, } -PhysicalDeviceMaintenance5FeaturesKHR :: struct { - sType: StructureType, - pNext: rawptr, - maintenance5: b32, -} - -PhysicalDeviceMaintenance5PropertiesKHR :: struct { - sType: StructureType, - pNext: rawptr, - earlyFragmentMultisampleCoverageAfterSampleCounting: b32, - earlyFragmentSampleMaskTestBeforeSampleCounting: b32, - depthStencilSwizzleOneSupport: b32, - polygonModePointSize: b32, - nonStrictSinglePixelWideLinesUseParallelogram: b32, - nonStrictWideLinesUseParallelogram: b32, -} - -RenderingAreaInfoKHR :: struct { - sType: StructureType, - pNext: rawptr, - viewMask: u32, - colorAttachmentCount: u32, - pColorAttachmentFormats: [^]Format, - depthAttachmentFormat: Format, - stencilAttachmentFormat: Format, -} - -ImageSubresource2KHR :: struct { - sType: StructureType, - pNext: rawptr, - imageSubresource: ImageSubresource, -} - -DeviceImageSubresourceInfoKHR :: struct { - sType: StructureType, - pNext: rawptr, - pCreateInfo: ^ImageCreateInfo, - pSubresource: ^ImageSubresource2KHR, -} - -SubresourceLayout2KHR :: struct { - sType: StructureType, - pNext: rawptr, - subresourceLayout: SubresourceLayout, -} - -PipelineCreateFlags2CreateInfoKHR :: struct { - sType: StructureType, - pNext: rawptr, - flags: PipelineCreateFlags2KHR, -} - -BufferUsageFlags2CreateInfoKHR :: struct { - sType: StructureType, - pNext: rawptr, - usage: BufferUsageFlags2KHR, -} - PhysicalDeviceRayTracingPositionFetchFeaturesKHR :: struct { sType: StructureType, pNext: rawptr, @@ -4231,6 +4506,143 @@ VideoDecodeAV1DpbSlotInfoKHR :: struct { pStdReferenceInfo: ^VideoDecodeAV1ReferenceInfo, } +PhysicalDeviceVideoEncodeAV1FeaturesKHR :: struct { + sType: StructureType, + pNext: rawptr, + videoEncodeAV1: b32, +} + +VideoEncodeAV1CapabilitiesKHR :: struct { + sType: StructureType, + pNext: rawptr, + flags: VideoEncodeAV1CapabilityFlagsKHR, + maxLevel: VideoAV1Level, + codedPictureAlignment: Extent2D, + maxTiles: Extent2D, + minTileSize: Extent2D, + maxTileSize: Extent2D, + superblockSizes: VideoEncodeAV1SuperblockSizeFlagsKHR, + maxSingleReferenceCount: u32, + singleReferenceNameMask: u32, + maxUnidirectionalCompoundReferenceCount: u32, + maxUnidirectionalCompoundGroup1ReferenceCount: u32, + unidirectionalCompoundReferenceNameMask: u32, + maxBidirectionalCompoundReferenceCount: u32, + maxBidirectionalCompoundGroup1ReferenceCount: u32, + maxBidirectionalCompoundGroup2ReferenceCount: u32, + bidirectionalCompoundReferenceNameMask: u32, + maxTemporalLayerCount: u32, + maxSpatialLayerCount: u32, + maxOperatingPoints: u32, + minQIndex: u32, + maxQIndex: u32, + prefersGopRemainingFrames: b32, + requiresGopRemainingFrames: b32, + stdSyntaxFlags: VideoEncodeAV1StdFlagsKHR, +} + +VideoEncodeAV1QIndexKHR :: struct { + intraQIndex: u32, + predictiveQIndex: u32, + bipredictiveQIndex: u32, +} + +VideoEncodeAV1QualityLevelPropertiesKHR :: struct { + sType: StructureType, + pNext: rawptr, + preferredRateControlFlags: VideoEncodeAV1RateControlFlagsKHR, + preferredGopFrameCount: u32, + preferredKeyFramePeriod: u32, + preferredConsecutiveBipredictiveFrameCount: u32, + preferredTemporalLayerCount: u32, + preferredConstantQIndex: VideoEncodeAV1QIndexKHR, + preferredMaxSingleReferenceCount: u32, + preferredSingleReferenceNameMask: u32, + preferredMaxUnidirectionalCompoundReferenceCount: u32, + preferredMaxUnidirectionalCompoundGroup1ReferenceCount: u32, + preferredUnidirectionalCompoundReferenceNameMask: u32, + preferredMaxBidirectionalCompoundReferenceCount: u32, + preferredMaxBidirectionalCompoundGroup1ReferenceCount: u32, + preferredMaxBidirectionalCompoundGroup2ReferenceCount: u32, + preferredBidirectionalCompoundReferenceNameMask: u32, +} + +VideoEncodeAV1SessionCreateInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + useMaxLevel: b32, + maxLevel: VideoAV1Level, +} + +VideoEncodeAV1SessionParametersCreateInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + pStdSequenceHeader: ^VideoAV1SequenceHeader, + pStdDecoderModelInfo: ^VideoEncodeAV1DecoderModelInfo, + stdOperatingPointCount: u32, + pStdOperatingPoints: [^]VideoEncodeAV1OperatingPointInfo, +} + +VideoEncodeAV1PictureInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + predictionMode: VideoEncodeAV1PredictionModeKHR, + rateControlGroup: VideoEncodeAV1RateControlGroupKHR, + constantQIndex: u32, + pStdPictureInfo: ^VideoEncodeAV1PictureInfo, + referenceNameSlotIndices: [MAX_VIDEO_AV1_REFERENCES_PER_FRAME_KHR]i32, + primaryReferenceCdfOnly: b32, + generateObuExtensionHeader: b32, +} + +VideoEncodeAV1DpbSlotInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + pStdReferenceInfo: ^VideoEncodeAV1ReferenceInfo, +} + +VideoEncodeAV1ProfileInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + stdProfile: VideoAV1Profile, +} + +VideoEncodeAV1FrameSizeKHR :: struct { + intraFrameSize: u32, + predictiveFrameSize: u32, + bipredictiveFrameSize: u32, +} + +VideoEncodeAV1GopRemainingFrameInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + useGopRemainingFrames: b32, + gopRemainingIntra: u32, + gopRemainingPredictive: u32, + gopRemainingBipredictive: u32, +} + +VideoEncodeAV1RateControlInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + flags: VideoEncodeAV1RateControlFlagsKHR, + gopFrameCount: u32, + keyFramePeriod: u32, + consecutiveBipredictiveFrameCount: u32, + temporalLayerCount: u32, +} + +VideoEncodeAV1RateControlLayerInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + useMinQIndex: b32, + minQIndex: VideoEncodeAV1QIndexKHR, + useMaxQIndex: b32, + maxQIndex: VideoEncodeAV1QIndexKHR, + useMaxFrameSize: b32, + maxFrameSize: VideoEncodeAV1FrameSizeKHR, +} + PhysicalDeviceVideoMaintenance1FeaturesKHR :: struct { sType: StructureType, pNext: rawptr, @@ -4245,143 +4657,12 @@ VideoInlineQueryInfoKHR :: struct { queryCount: u32, } -PhysicalDeviceVertexAttributeDivisorPropertiesKHR :: struct { - sType: StructureType, - pNext: rawptr, - maxVertexAttribDivisor: u32, - supportsNonZeroFirstInstance: b32, -} - -VertexInputBindingDivisorDescriptionKHR :: struct { - binding: u32, - divisor: u32, -} - -PipelineVertexInputDivisorStateCreateInfoKHR :: struct { - sType: StructureType, - pNext: rawptr, - vertexBindingDivisorCount: u32, - pVertexBindingDivisors: [^]VertexInputBindingDivisorDescriptionKHR, -} - -PhysicalDeviceVertexAttributeDivisorFeaturesKHR :: struct { - sType: StructureType, - pNext: rawptr, - vertexAttributeInstanceRateDivisor: b32, - vertexAttributeInstanceRateZeroDivisor: b32, -} - -PhysicalDeviceShaderFloatControls2FeaturesKHR :: struct { - sType: StructureType, - pNext: rawptr, - shaderFloatControls2: b32, -} - -PhysicalDeviceIndexTypeUint8FeaturesKHR :: struct { - sType: StructureType, - pNext: rawptr, - indexTypeUint8: b32, -} - -PhysicalDeviceLineRasterizationFeaturesKHR :: struct { - sType: StructureType, - pNext: rawptr, - rectangularLines: b32, - bresenhamLines: b32, - smoothLines: b32, - stippledRectangularLines: b32, - stippledBresenhamLines: b32, - stippledSmoothLines: b32, -} - -PhysicalDeviceLineRasterizationPropertiesKHR :: struct { - sType: StructureType, - pNext: rawptr, - lineSubPixelPrecisionBits: u32, -} - -PipelineRasterizationLineStateCreateInfoKHR :: struct { - sType: StructureType, - pNext: rawptr, - lineRasterizationMode: LineRasterizationModeKHR, - stippledLineEnable: b32, - lineStippleFactor: u32, - lineStipplePattern: u16, -} - CalibratedTimestampInfoKHR :: struct { sType: StructureType, pNext: rawptr, timeDomain: TimeDomainKHR, } -PhysicalDeviceShaderExpectAssumeFeaturesKHR :: struct { - sType: StructureType, - pNext: rawptr, - shaderExpectAssume: b32, -} - -PhysicalDeviceMaintenance6FeaturesKHR :: struct { - sType: StructureType, - pNext: rawptr, - maintenance6: b32, -} - -PhysicalDeviceMaintenance6PropertiesKHR :: struct { - sType: StructureType, - pNext: rawptr, - blockTexelViewCompatibleMultipleLayers: b32, - maxCombinedImageSamplerDescriptorCount: u32, - fragmentShadingRateClampCombinerInputs: b32, -} - -BindMemoryStatusKHR :: struct { - sType: StructureType, - pNext: rawptr, - pResult: ^Result, -} - -BindDescriptorSetsInfoKHR :: struct { - sType: StructureType, - pNext: rawptr, - stageFlags: ShaderStageFlags, - layout: PipelineLayout, - firstSet: u32, - descriptorSetCount: u32, - pDescriptorSets: [^]DescriptorSet, - dynamicOffsetCount: u32, - pDynamicOffsets: [^]u32, -} - -PushConstantsInfoKHR :: struct { - sType: StructureType, - pNext: rawptr, - layout: PipelineLayout, - stageFlags: ShaderStageFlags, - offset: u32, - size: u32, - pValues: rawptr, -} - -PushDescriptorSetInfoKHR :: struct { - sType: StructureType, - pNext: rawptr, - stageFlags: ShaderStageFlags, - layout: PipelineLayout, - set: u32, - descriptorWriteCount: u32, - pDescriptorWrites: [^]WriteDescriptorSet, -} - -PushDescriptorSetWithTemplateInfoKHR :: struct { - sType: StructureType, - pNext: rawptr, - descriptorUpdateTemplate: DescriptorUpdateTemplate, - layout: PipelineLayout, - set: u32, - pData: rawptr, -} - SetDescriptorBufferOffsetsInfoEXT :: struct { sType: StructureType, pNext: rawptr, @@ -4401,6 +4682,70 @@ BindDescriptorBufferEmbeddedSamplersInfoEXT :: struct { set: u32, } +VideoEncodeQuantizationMapCapabilitiesKHR :: struct { + sType: StructureType, + pNext: rawptr, + maxQuantizationMapExtent: Extent2D, +} + +VideoFormatQuantizationMapPropertiesKHR :: struct { + sType: StructureType, + pNext: rawptr, + quantizationMapTexelSize: Extent2D, +} + +VideoEncodeQuantizationMapInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + quantizationMap: ImageView, + quantizationMapExtent: Extent2D, +} + +VideoEncodeQuantizationMapSessionParametersCreateInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + quantizationMapTexelSize: Extent2D, +} + +PhysicalDeviceVideoEncodeQuantizationMapFeaturesKHR :: struct { + sType: StructureType, + pNext: rawptr, + videoEncodeQuantizationMap: b32, +} + +VideoEncodeH264QuantizationMapCapabilitiesKHR :: struct { + sType: StructureType, + pNext: rawptr, + minQpDelta: i32, + maxQpDelta: i32, +} + +VideoEncodeH265QuantizationMapCapabilitiesKHR :: struct { + sType: StructureType, + pNext: rawptr, + minQpDelta: i32, + maxQpDelta: i32, +} + +VideoFormatH265QuantizationMapPropertiesKHR :: struct { + sType: StructureType, + pNext: rawptr, + compatibleCtbSizes: VideoEncodeH265CtbSizeFlagsKHR, +} + +VideoEncodeAV1QuantizationMapCapabilitiesKHR :: struct { + sType: StructureType, + pNext: rawptr, + minQIndexDelta: i32, + maxQIndexDelta: i32, +} + +VideoFormatAV1QuantizationMapPropertiesKHR :: struct { + sType: StructureType, + pNext: rawptr, + compatibleSuperblockSizes: VideoEncodeAV1SuperblockSizeFlagsKHR, +} + PhysicalDeviceShaderRelaxedExtendedInstructionFeaturesKHR :: struct { sType: StructureType, pNext: rawptr, @@ -4542,6 +4887,12 @@ CuModuleCreateInfoNVX :: struct { pData: rawptr, } +CuModuleTexturingModeCreateInfoNVX :: struct { + sType: StructureType, + pNext: rawptr, + use64bitTexturing: b32, +} + CuFunctionCreateInfoNVX :: struct { sType: StructureType, pNext: rawptr, @@ -4649,30 +5000,6 @@ PhysicalDeviceASTCDecodeFeaturesEXT :: struct { decodeModeSharedExponent: b32, } -PhysicalDevicePipelineRobustnessFeaturesEXT :: struct { - sType: StructureType, - pNext: rawptr, - pipelineRobustness: b32, -} - -PhysicalDevicePipelineRobustnessPropertiesEXT :: struct { - sType: StructureType, - pNext: rawptr, - defaultRobustnessStorageBuffers: PipelineRobustnessBufferBehaviorEXT, - defaultRobustnessUniformBuffers: PipelineRobustnessBufferBehaviorEXT, - defaultRobustnessVertexInputs: PipelineRobustnessBufferBehaviorEXT, - defaultRobustnessImages: PipelineRobustnessImageBehaviorEXT, -} - -PipelineRobustnessCreateInfoEXT :: struct { - sType: StructureType, - pNext: rawptr, - storageBuffers: PipelineRobustnessBufferBehaviorEXT, - uniformBuffers: PipelineRobustnessBufferBehaviorEXT, - vertexInputs: PipelineRobustnessBufferBehaviorEXT, - images: PipelineRobustnessImageBehaviorEXT, -} - ConditionalRenderingBeginInfoEXT :: struct { sType: StructureType, pNext: rawptr, @@ -4777,6 +5104,13 @@ PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX :: struct { perViewPositionAllComponents: b32, } +MultiviewPerViewAttributesInfoNVX :: struct { + sType: StructureType, + pNext: rawptr, + perViewAttributes: b32, + perViewAttributesPositionXOnly: b32, +} + ViewportSwizzleNV :: struct { x: ViewportCoordinateSwizzleNV, y: ViewportCoordinateSwizzleNV, @@ -4916,6 +5250,14 @@ DebugUtilsObjectTagInfoEXT :: struct { pTag: rawptr, } +AttachmentSampleCountInfoAMD :: struct { + sType: StructureType, + pNext: rawptr, + colorAttachmentCount: u32, + pColorAttachmentSamples: [^]SampleCountFlags, + depthStencilAttachmentSamples: SampleCountFlags, +} + SampleLocationEXT :: struct { x: f32, y: f32, @@ -5426,6 +5768,19 @@ CheckpointDataNV :: struct { pCheckpointMarker: rawptr, } +QueueFamilyCheckpointProperties2NV :: struct { + sType: StructureType, + pNext: rawptr, + checkpointExecutionStageMask: PipelineStageFlags2, +} + +CheckpointData2NV :: struct { + sType: StructureType, + pNext: rawptr, + stage: PipelineStageFlags2, + pCheckpointMarker: rawptr, +} + PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL :: struct { sType: StructureType, pNext: rawptr, @@ -5526,6 +5881,13 @@ RenderPassFragmentDensityMapCreateInfoEXT :: struct { fragmentDensityMapAttachment: AttachmentReference, } +RenderingFragmentDensityMapAttachmentInfoEXT :: struct { + sType: StructureType, + pNext: rawptr, + imageView: ImageView, + imageLayout: ImageLayout, +} + PhysicalDeviceShaderCoreProperties2AMD :: struct { sType: StructureType, pNext: rawptr, @@ -5705,99 +6067,6 @@ PhysicalDeviceExtendedDynamicStateFeaturesEXT :: struct { extendedDynamicState: b32, } -PhysicalDeviceHostImageCopyFeaturesEXT :: struct { - sType: StructureType, - pNext: rawptr, - hostImageCopy: b32, -} - -PhysicalDeviceHostImageCopyPropertiesEXT :: struct { - sType: StructureType, - pNext: rawptr, - copySrcLayoutCount: u32, - pCopySrcLayouts: [^]ImageLayout, - copyDstLayoutCount: u32, - pCopyDstLayouts: [^]ImageLayout, - optimalTilingLayoutUUID: [UUID_SIZE]u8, - identicalMemoryTypeRequirements: b32, -} - -MemoryToImageCopyEXT :: struct { - sType: StructureType, - pNext: rawptr, - pHostPointer: rawptr, - memoryRowLength: u32, - memoryImageHeight: u32, - imageSubresource: ImageSubresourceLayers, - imageOffset: Offset3D, - imageExtent: Extent3D, -} - -ImageToMemoryCopyEXT :: struct { - sType: StructureType, - pNext: rawptr, - pHostPointer: rawptr, - memoryRowLength: u32, - memoryImageHeight: u32, - imageSubresource: ImageSubresourceLayers, - imageOffset: Offset3D, - imageExtent: Extent3D, -} - -CopyMemoryToImageInfoEXT :: struct { - sType: StructureType, - pNext: rawptr, - flags: HostImageCopyFlagsEXT, - dstImage: Image, - dstImageLayout: ImageLayout, - regionCount: u32, - pRegions: [^]MemoryToImageCopyEXT, -} - -CopyImageToMemoryInfoEXT :: struct { - sType: StructureType, - pNext: rawptr, - flags: HostImageCopyFlagsEXT, - srcImage: Image, - srcImageLayout: ImageLayout, - regionCount: u32, - pRegions: [^]ImageToMemoryCopyEXT, -} - -CopyImageToImageInfoEXT :: struct { - sType: StructureType, - pNext: rawptr, - flags: HostImageCopyFlagsEXT, - srcImage: Image, - srcImageLayout: ImageLayout, - dstImage: Image, - dstImageLayout: ImageLayout, - regionCount: u32, - pRegions: [^]ImageCopy2, -} - -HostImageLayoutTransitionInfoEXT :: struct { - sType: StructureType, - pNext: rawptr, - image: Image, - oldLayout: ImageLayout, - newLayout: ImageLayout, - subresourceRange: ImageSubresourceRange, -} - -SubresourceHostMemcpySizeEXT :: struct { - sType: StructureType, - pNext: rawptr, - size: DeviceSize, -} - -HostImageCopyDevicePerformanceQueryEXT :: struct { - sType: StructureType, - pNext: rawptr, - optimalDeviceAccess: b32, - identicalMemoryLayout: b32, -} - PhysicalDeviceMapMemoryPlacedFeaturesEXT :: struct { sType: StructureType, pNext: rawptr, @@ -6680,6 +6949,12 @@ PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT :: struct { primitiveTopologyPatchListRestart: b32, } +PhysicalDevicePresentModeFifoLatestReadyFeaturesEXT :: struct { + sType: StructureType, + pNext: rawptr, + presentModeFifoLatestReady: b32, +} + SubpassShadingPipelineCreateInfoHUAWEI :: struct { sType: StructureType, pNext: rawptr, @@ -7467,12 +7742,6 @@ PhysicalDeviceLegacyDitheringFeaturesEXT :: struct { legacyDithering: b32, } -PhysicalDevicePipelineProtectedAccessFeaturesEXT :: struct { - sType: StructureType, - pNext: rawptr, - pipelineProtectedAccess: b32, -} - PhysicalDeviceAntiLagFeaturesAMD :: struct { sType: StructureType, pNext: rawptr, @@ -7808,6 +8077,18 @@ PhysicalDeviceDescriptorPoolOverallocationFeaturesNV :: struct { descriptorPoolOverallocation: b32, } +DisplaySurfaceStereoCreateInfoNV :: struct { + sType: StructureType, + pNext: rawptr, + stereoType: DisplaySurfaceStereoTypeNV, +} + +DisplayModeStereoPropertiesNV :: struct { + sType: StructureType, + pNext: rawptr, + hdmi3DSupported: b32, +} + PhysicalDeviceRawAccessChainsFeaturesNV :: struct { sType: StructureType, pNext: rawptr, @@ -8042,6 +8323,60 @@ PipelineViewportDepthClampControlCreateInfoEXT :: struct { pDepthClampRange: ^DepthClampRangeEXT, } +PhysicalDeviceHdrVividFeaturesHUAWEI :: struct { + sType: StructureType, + pNext: rawptr, + hdrVivid: b32, +} + +HdrVividDynamicMetadataHUAWEI :: struct { + sType: StructureType, + pNext: rawptr, + dynamicMetadataSize: int, + pDynamicMetadata: rawptr, +} + +CooperativeMatrixFlexibleDimensionsPropertiesNV :: struct { + sType: StructureType, + pNext: rawptr, + MGranularity: u32, + NGranularity: u32, + KGranularity: u32, + AType: ComponentTypeKHR, + BType: ComponentTypeKHR, + CType: ComponentTypeKHR, + ResultType: ComponentTypeKHR, + saturatingAccumulation: b32, + scope: ScopeKHR, + workgroupInvocations: u32, +} + +PhysicalDeviceCooperativeMatrix2FeaturesNV :: struct { + sType: StructureType, + pNext: rawptr, + cooperativeMatrixWorkgroupScope: b32, + cooperativeMatrixFlexibleDimensions: b32, + cooperativeMatrixReductions: b32, + cooperativeMatrixConversions: b32, + cooperativeMatrixPerElementOperations: b32, + cooperativeMatrixTensorAddressing: b32, + cooperativeMatrixBlockLoads: b32, +} + +PhysicalDeviceCooperativeMatrix2PropertiesNV :: struct { + sType: StructureType, + pNext: rawptr, + cooperativeMatrixWorkgroupScopeMaxWorkgroupSize: u32, + cooperativeMatrixFlexibleDimensionsMaxDimension: u32, + cooperativeMatrixWorkgroupScopeReservedSharedMemory: u32, +} + +PhysicalDeviceVertexAttributeRobustnessFeaturesEXT :: struct { + sType: StructureType, + pNext: rawptr, + vertexAttributeRobustness: b32, +} + AccelerationStructureBuildRangeInfoKHR :: struct { primitiveCount: u32, primitiveOffset: u32, @@ -8727,6 +9062,123 @@ VideoAV1SequenceHeader :: struct { pTimingInfo: ^VideoAV1TimingInfo, } +VideoDecodeAV1PictureInfoFlags :: struct { + bitfield: u32, +} + +VideoDecodeAV1PictureInfo :: struct { + flags: VideoDecodeAV1PictureInfoFlags, + frame_type: VideoAV1FrameType, + current_frame_id: u32, + OrderHint: u8, + primary_ref_frame: u8, + refresh_frame_flags: u8, + reserved1: u8, + interpolation_filter: VideoAV1InterpolationFilter, + TxMode: VideoAV1TxMode, + delta_q_res: u8, + delta_lf_res: u8, + SkipModeFrame: [VIDEO_AV1_SKIP_MODE_FRAMES]u8, + coded_denom: u8, + reserved2: [3]u8, + OrderHints: [VIDEO_AV1_NUM_REF_FRAMES]u8, + expectedFrameId: [VIDEO_AV1_NUM_REF_FRAMES]u32, + pTileInfo: ^VideoAV1TileInfo, + pQuantization: ^VideoAV1Quantization, + pSegmentation: ^VideoAV1Segmentation, + pLoopFilter: ^VideoAV1LoopFilter, + pCDEF: ^VideoAV1CDEF, + pLoopRestoration: ^VideoAV1LoopRestoration, + pGlobalMotion: ^VideoAV1GlobalMotion, + pFilmGrain: ^VideoAV1FilmGrain, +} + +VideoDecodeAV1ReferenceInfoFlags :: struct { + bitfield: u32, +} + +VideoDecodeAV1ReferenceInfo :: struct { + flags: VideoDecodeAV1ReferenceInfoFlags, + frame_type: u8, + RefFrameSignBias: u8, + OrderHint: u8, + SavedOrderHints: [VIDEO_AV1_NUM_REF_FRAMES]u8, +} + +VideoEncodeAV1DecoderModelInfo :: struct { + buffer_delay_length_minus_1: u8, + buffer_removal_time_length_minus_1: u8, + frame_presentation_time_length_minus_1: u8, + reserved1: u8, + num_units_in_decoding_tick: u32, +} + +VideoEncodeAV1ExtensionHeader :: struct { + temporal_id: u8, + spatial_id: u8, +} + +VideoEncodeAV1OperatingPointInfoFlags :: struct { + bitfield: u32, +} + +VideoEncodeAV1OperatingPointInfo :: struct { + flags: VideoEncodeAV1OperatingPointInfoFlags, + operating_point_idc: u16, + seq_level_idx: u8, + seq_tier: u8, + decoder_buffer_delay: u32, + encoder_buffer_delay: u32, + initial_display_delay_minus_1: u8, +} + +VideoEncodeAV1PictureInfoFlags :: struct { + bitfield: u32, +} + +VideoEncodeAV1PictureInfo :: struct { + flags: VideoEncodeAV1PictureInfoFlags, + frame_type: VideoAV1FrameType, + frame_presentation_time: u32, + current_frame_id: u32, + order_hint: u8, + primary_ref_frame: u8, + refresh_frame_flags: u8, + coded_denom: u8, + render_width_minus_1: u16, + render_height_minus_1: u16, + interpolation_filter: VideoAV1InterpolationFilter, + TxMode: VideoAV1TxMode, + delta_q_res: u8, + delta_lf_res: u8, + ref_order_hint: [VIDEO_AV1_NUM_REF_FRAMES]u8, + ref_frame_idx: [VIDEO_AV1_REFS_PER_FRAME]i8, + reserved1: [3]u8, + delta_frame_id_minus_1: [VIDEO_AV1_REFS_PER_FRAME]u32, + pTileInfo: ^VideoAV1TileInfo, + pQuantization: ^VideoAV1Quantization, + pSegmentation: ^VideoAV1Segmentation, + pLoopFilter: ^VideoAV1LoopFilter, + pCDEF: ^VideoAV1CDEF, + pLoopRestoration: ^VideoAV1LoopRestoration, + pGlobalMotion: ^VideoAV1GlobalMotion, + pExtensionHeader: ^VideoEncodeAV1ExtensionHeader, + pBufferRemovalTimes: [^]u32, +} + +VideoEncodeAV1ReferenceInfoFlags :: struct { + bitfield: u32, +} + +VideoEncodeAV1ReferenceInfo :: struct { + flags: VideoEncodeAV1ReferenceInfoFlags, + RefFrameId: u32, + frame_type: VideoAV1FrameType, + OrderHint: u8, + reserved1: [3]u8, + pExtensionHeader: ^VideoEncodeAV1ExtensionHeader, +} + VideoH264SpsVuiFlags :: struct { bitfield: u32, } @@ -8821,6 +9273,134 @@ VideoH264PictureParameterSet :: struct { pScalingLists: [^]VideoH264ScalingLists, } +VideoDecodeH264PictureInfoFlags :: struct { + bitfield: u32, +} + +VideoDecodeH264PictureInfo :: struct { + flags: VideoDecodeH264PictureInfoFlags, + seq_parameter_set_id: u8, + pic_parameter_set_id: u8, + reserved1: u8, + reserved2: u8, + frame_num: u16, + idr_pic_id: u16, + PicOrderCnt: [VIDEO_DECODE_H264_FIELD_ORDER_COUNT_LIST_SIZE]i32, +} + +VideoDecodeH264ReferenceInfoFlags :: struct { + bitfield: u32, +} + +VideoDecodeH264ReferenceInfo :: struct { + flags: VideoDecodeH264ReferenceInfoFlags, + FrameNum: u16, + reserved: u16, + PicOrderCnt: [VIDEO_DECODE_H264_FIELD_ORDER_COUNT_LIST_SIZE]i32, +} + +VideoEncodeH264WeightTableFlags :: struct { + luma_weight_l0_flag: u32, + chroma_weight_l0_flag: u32, + luma_weight_l1_flag: u32, + chroma_weight_l1_flag: u32, +} + +VideoEncodeH264WeightTable :: struct { + flags: VideoEncodeH264WeightTableFlags, + luma_log2_weight_denom: u8, + chroma_log2_weight_denom: u8, + luma_weight_l0: [VIDEO_H264_MAX_NUM_LIST_REF]i8, + luma_offset_l0: [VIDEO_H264_MAX_NUM_LIST_REF]i8, + chroma_weight_l0: [VIDEO_H264_MAX_NUM_LIST_REF][VIDEO_H264_MAX_CHROMA_PLANES]i8, + chroma_offset_l0: [VIDEO_H264_MAX_NUM_LIST_REF][VIDEO_H264_MAX_CHROMA_PLANES]i8, + luma_weight_l1: [VIDEO_H264_MAX_NUM_LIST_REF]i8, + luma_offset_l1: [VIDEO_H264_MAX_NUM_LIST_REF]i8, + chroma_weight_l1: [VIDEO_H264_MAX_NUM_LIST_REF][VIDEO_H264_MAX_CHROMA_PLANES]i8, + chroma_offset_l1: [VIDEO_H264_MAX_NUM_LIST_REF][VIDEO_H264_MAX_CHROMA_PLANES]i8, +} + +VideoEncodeH264SliceHeaderFlags :: struct { + bitfield: u32, +} + +VideoEncodeH264PictureInfoFlags :: struct { + bitfield: u32, +} + +VideoEncodeH264ReferenceInfoFlags :: struct { + bitfield: u32, +} + +VideoEncodeH264ReferenceListsInfoFlags :: struct { + bitfield: u32, +} + +VideoEncodeH264RefListModEntry :: struct { + modification_of_pic_nums_idc: VideoH264ModificationOfPicNumsIdc, + abs_diff_pic_num_minus1: u16, + long_term_pic_num: u16, +} + +VideoEncodeH264RefPicMarkingEntry :: struct { + memory_management_control_operation: VideoH264MemMgmtControlOp, + difference_of_pic_nums_minus1: u16, + long_term_pic_num: u16, + long_term_frame_idx: u16, + max_long_term_frame_idx_plus1: u16, +} + +VideoEncodeH264ReferenceListsInfo :: struct { + flags: VideoEncodeH264ReferenceListsInfoFlags, + num_ref_idx_l0_active_minus1: u8, + num_ref_idx_l1_active_minus1: u8, + RefPicList0: [VIDEO_H264_MAX_NUM_LIST_REF]u8, + RefPicList1: [VIDEO_H264_MAX_NUM_LIST_REF]u8, + refList0ModOpCount: u8, + refList1ModOpCount: u8, + refPicMarkingOpCount: u8, + reserved1: [7]u8, + pRefList0ModOperations: [^]VideoEncodeH264RefListModEntry, + pRefList1ModOperations: [^]VideoEncodeH264RefListModEntry, + pRefPicMarkingOperations: [^]VideoEncodeH264RefPicMarkingEntry, +} + +VideoEncodeH264PictureInfo :: struct { + flags: VideoEncodeH264PictureInfoFlags, + seq_parameter_set_id: u8, + pic_parameter_set_id: u8, + idr_pic_id: u16, + primary_pic_type: VideoH264PictureType, + frame_num: u32, + PicOrderCnt: i32, + temporal_id: u8, + reserved1: [3]u8, + pRefLists: [^]VideoEncodeH264ReferenceListsInfo, +} + +VideoEncodeH264ReferenceInfo :: struct { + flags: VideoEncodeH264ReferenceInfoFlags, + primary_pic_type: VideoH264PictureType, + FrameNum: u32, + PicOrderCnt: i32, + long_term_pic_num: u16, + long_term_frame_idx: u16, + temporal_id: u8, +} + +VideoEncodeH264SliceHeader :: struct { + flags: VideoEncodeH264SliceHeaderFlags, + first_mb_in_slice: u32, + slice_type: VideoH264SliceType, + slice_alpha_c0_offset_div2: i8, + slice_beta_offset_div2: i8, + slice_qp_delta: i8, + reserved1: u8, + cabac_init_idc: VideoH264CabacInitIdc, + disable_deblocking_filter_idc: VideoH264DisableDeblockingFilterIdc, + pWeightTable: [^]VideoEncodeH264WeightTable, +} + VideoH265DecPicBufMgr :: struct { max_latency_increase_plus1: [VIDEO_H265_SUBLAYERS_LIST_SIZE]u32, max_dec_pic_buffering_minus1: [VIDEO_H265_SUBLAYERS_LIST_SIZE]u8, @@ -9047,75 +9627,6 @@ VideoH265PictureParameterSet :: struct { pPredictorPaletteEntries: [^]VideoH265PredictorPaletteEntries, } -VideoDecodeAV1PictureInfoFlags :: struct { - bitfield: u32, -} - -VideoDecodeAV1PictureInfo :: struct { - flags: VideoDecodeAV1PictureInfoFlags, - frame_type: VideoAV1FrameType, - current_frame_id: u32, - OrderHint: u8, - primary_ref_frame: u8, - refresh_frame_flags: u8, - reserved1: u8, - interpolation_filter: VideoAV1InterpolationFilter, - TxMode: VideoAV1TxMode, - delta_q_res: u8, - delta_lf_res: u8, - SkipModeFrame: [VIDEO_AV1_SKIP_MODE_FRAMES]u8, - coded_denom: u8, - reserved2: [3]u8, - OrderHints: [VIDEO_AV1_NUM_REF_FRAMES]u8, - expectedFrameId: [VIDEO_AV1_NUM_REF_FRAMES]u32, - pTileInfo: ^VideoAV1TileInfo, - pQuantization: ^VideoAV1Quantization, - pSegmentation: ^VideoAV1Segmentation, - pLoopFilter: ^VideoAV1LoopFilter, - pCDEF: ^VideoAV1CDEF, - pLoopRestoration: ^VideoAV1LoopRestoration, - pGlobalMotion: ^VideoAV1GlobalMotion, - pFilmGrain: ^VideoAV1FilmGrain, -} - -VideoDecodeAV1ReferenceInfoFlags :: struct { - bitfield: u32, -} - -VideoDecodeAV1ReferenceInfo :: struct { - flags: VideoDecodeAV1ReferenceInfoFlags, - frame_type: u8, - RefFrameSignBias: u8, - OrderHint: u8, - SavedOrderHints: [VIDEO_AV1_NUM_REF_FRAMES]u8, -} - -VideoDecodeH264PictureInfoFlags :: struct { - bitfield: u32, -} - -VideoDecodeH264PictureInfo :: struct { - flags: VideoDecodeH264PictureInfoFlags, - seq_parameter_set_id: u8, - pic_parameter_set_id: u8, - reserved1: u8, - reserved2: u8, - frame_num: u16, - idr_pic_id: u16, - PicOrderCnt: [VIDEO_DECODE_H264_FIELD_ORDER_COUNT_LIST_SIZE]i32, -} - -VideoDecodeH264ReferenceInfoFlags :: struct { - bitfield: u32, -} - -VideoDecodeH264ReferenceInfo :: struct { - flags: VideoDecodeH264ReferenceInfoFlags, - FrameNum: u16, - reserved: u16, - PicOrderCnt: [VIDEO_DECODE_H264_FIELD_ORDER_COUNT_LIST_SIZE]i32, -} - VideoDecodeH265PictureInfoFlags :: struct { bitfield: u32, } @@ -9143,108 +9654,6 @@ VideoDecodeH265ReferenceInfo :: struct { PicOrderCntVal: i32, } -VideoEncodeH264WeightTableFlags :: struct { - luma_weight_l0_flag: u32, - chroma_weight_l0_flag: u32, - luma_weight_l1_flag: u32, - chroma_weight_l1_flag: u32, -} - -VideoEncodeH264WeightTable :: struct { - flags: VideoEncodeH264WeightTableFlags, - luma_log2_weight_denom: u8, - chroma_log2_weight_denom: u8, - luma_weight_l0: [VIDEO_H264_MAX_NUM_LIST_REF]i8, - luma_offset_l0: [VIDEO_H264_MAX_NUM_LIST_REF]i8, - chroma_weight_l0: [VIDEO_H264_MAX_NUM_LIST_REF][VIDEO_H264_MAX_CHROMA_PLANES]i8, - chroma_offset_l0: [VIDEO_H264_MAX_NUM_LIST_REF][VIDEO_H264_MAX_CHROMA_PLANES]i8, - luma_weight_l1: [VIDEO_H264_MAX_NUM_LIST_REF]i8, - luma_offset_l1: [VIDEO_H264_MAX_NUM_LIST_REF]i8, - chroma_weight_l1: [VIDEO_H264_MAX_NUM_LIST_REF][VIDEO_H264_MAX_CHROMA_PLANES]i8, - chroma_offset_l1: [VIDEO_H264_MAX_NUM_LIST_REF][VIDEO_H264_MAX_CHROMA_PLANES]i8, -} - -VideoEncodeH264SliceHeaderFlags :: struct { - bitfield: u32, -} - -VideoEncodeH264PictureInfoFlags :: struct { - bitfield: u32, -} - -VideoEncodeH264ReferenceInfoFlags :: struct { - bitfield: u32, -} - -VideoEncodeH264ReferenceListsInfoFlags :: struct { - bitfield: u32, -} - -VideoEncodeH264RefListModEntry :: struct { - modification_of_pic_nums_idc: VideoH264ModificationOfPicNumsIdc, - abs_diff_pic_num_minus1: u16, - long_term_pic_num: u16, -} - -VideoEncodeH264RefPicMarkingEntry :: struct { - memory_management_control_operation: VideoH264MemMgmtControlOp, - difference_of_pic_nums_minus1: u16, - long_term_pic_num: u16, - long_term_frame_idx: u16, - max_long_term_frame_idx_plus1: u16, -} - -VideoEncodeH264ReferenceListsInfo :: struct { - flags: VideoEncodeH264ReferenceListsInfoFlags, - num_ref_idx_l0_active_minus1: u8, - num_ref_idx_l1_active_minus1: u8, - RefPicList0: [VIDEO_H264_MAX_NUM_LIST_REF]u8, - RefPicList1: [VIDEO_H264_MAX_NUM_LIST_REF]u8, - refList0ModOpCount: u8, - refList1ModOpCount: u8, - refPicMarkingOpCount: u8, - reserved1: [7]u8, - pRefList0ModOperations: [^]VideoEncodeH264RefListModEntry, - pRefList1ModOperations: [^]VideoEncodeH264RefListModEntry, - pRefPicMarkingOperations: [^]VideoEncodeH264RefPicMarkingEntry, -} - -VideoEncodeH264PictureInfo :: struct { - flags: VideoEncodeH264PictureInfoFlags, - seq_parameter_set_id: u8, - pic_parameter_set_id: u8, - idr_pic_id: u16, - primary_pic_type: VideoH264PictureType, - frame_num: u32, - PicOrderCnt: i32, - temporal_id: u8, - reserved1: [3]u8, - pRefLists: [^]VideoEncodeH264ReferenceListsInfo, -} - -VideoEncodeH264ReferenceInfo :: struct { - flags: VideoEncodeH264ReferenceInfoFlags, - primary_pic_type: VideoH264PictureType, - FrameNum: u32, - PicOrderCnt: i32, - long_term_pic_num: u16, - long_term_frame_idx: u16, - temporal_id: u8, -} - -VideoEncodeH264SliceHeader :: struct { - flags: VideoEncodeH264SliceHeaderFlags, - first_mb_in_slice: u32, - slice_type: VideoH264SliceType, - slice_alpha_c0_offset_div2: i8, - slice_beta_offset_div2: i8, - slice_qp_delta: i8, - reserved1: u8, - cabac_init_idc: VideoH264CabacInitIdc, - disable_deblocking_filter_idc: VideoH264DisableDeblockingFilterIdc, - pWeightTable: [^]VideoEncodeH264WeightTable, -} - VideoEncodeH265WeightTableFlags :: struct { luma_weight_l0_flag: u16, chroma_weight_l0_flag: u16, @@ -9357,7 +9766,6 @@ RenderingAttachmentInfoKHR :: RenderingAttachme PipelineRenderingCreateInfoKHR :: PipelineRenderingCreateInfo PhysicalDeviceDynamicRenderingFeaturesKHR :: PhysicalDeviceDynamicRenderingFeatures CommandBufferInheritanceRenderingInfoKHR :: CommandBufferInheritanceRenderingInfo -AttachmentSampleCountInfoNV :: AttachmentSampleCountInfoAMD RenderPassMultiviewCreateInfoKHR :: RenderPassMultiviewCreateInfo PhysicalDeviceMultiviewFeaturesKHR :: PhysicalDeviceMultiviewFeatures PhysicalDeviceMultiviewPropertiesKHR :: PhysicalDeviceMultiviewProperties @@ -9406,6 +9814,7 @@ ExternalSemaphorePropertiesKHR :: ExternalSemaphore SemaphoreImportFlagsKHR :: SemaphoreImportFlags SemaphoreImportFlagKHR :: SemaphoreImportFlag ExportSemaphoreCreateInfoKHR :: ExportSemaphoreCreateInfo +PhysicalDevicePushDescriptorPropertiesKHR :: PhysicalDevicePushDescriptorProperties PhysicalDeviceShaderFloat16Int8FeaturesKHR :: PhysicalDeviceShaderFloat16Int8Features PhysicalDeviceFloat16Int8FeaturesKHR :: PhysicalDeviceShaderFloat16Int8Features PhysicalDevice16BitStorageFeaturesKHR :: PhysicalDevice16BitStorageFeatures @@ -9468,6 +9877,10 @@ DescriptorSetLayoutSupportKHR :: DescriptorSetLayo PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR :: PhysicalDeviceShaderSubgroupExtendedTypesFeatures PhysicalDevice8BitStorageFeaturesKHR :: PhysicalDevice8BitStorageFeatures PhysicalDeviceShaderAtomicInt64FeaturesKHR :: PhysicalDeviceShaderAtomicInt64Features +QueueGlobalPriorityKHR :: QueueGlobalPriority +DeviceQueueGlobalPriorityCreateInfoKHR :: DeviceQueueGlobalPriorityCreateInfo +PhysicalDeviceGlobalPriorityQueryFeaturesKHR :: PhysicalDeviceGlobalPriorityQueryFeatures +QueueFamilyGlobalPriorityPropertiesKHR :: QueueFamilyGlobalPriorityProperties DriverIdKHR :: DriverId ConformanceVersionKHR :: ConformanceVersion PhysicalDeviceDriverPropertiesKHR :: PhysicalDeviceDriverProperties @@ -9488,6 +9901,9 @@ SemaphoreWaitInfoKHR :: SemaphoreWaitInfo SemaphoreSignalInfoKHR :: SemaphoreSignalInfo PhysicalDeviceVulkanMemoryModelFeaturesKHR :: PhysicalDeviceVulkanMemoryModelFeatures PhysicalDeviceShaderTerminateInvocationFeaturesKHR :: PhysicalDeviceShaderTerminateInvocationFeatures +PhysicalDeviceDynamicRenderingLocalReadFeaturesKHR :: PhysicalDeviceDynamicRenderingLocalReadFeatures +RenderingAttachmentLocationInfoKHR :: RenderingAttachmentLocationInfo +RenderingInputAttachmentIndexInfoKHR :: RenderingInputAttachmentIndexInfo PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR :: PhysicalDeviceSeparateDepthStencilLayoutsFeatures AttachmentReferenceStencilLayoutKHR :: AttachmentReferenceStencilLayout AttachmentDescriptionStencilLayoutKHR :: AttachmentDescriptionStencilLayout @@ -9497,6 +9913,10 @@ BufferDeviceAddressInfoKHR :: BufferDeviceAddre BufferOpaqueCaptureAddressCreateInfoKHR :: BufferOpaqueCaptureAddressCreateInfo MemoryOpaqueCaptureAddressAllocateInfoKHR :: MemoryOpaqueCaptureAddressAllocateInfo DeviceMemoryOpaqueCaptureAddressInfoKHR :: DeviceMemoryOpaqueCaptureAddressInfo +MemoryUnmapFlagKHR :: MemoryUnmapFlag +MemoryUnmapFlagsKHR :: MemoryUnmapFlags +MemoryMapInfoKHR :: MemoryMapInfo +MemoryUnmapInfoKHR :: MemoryUnmapInfo PhysicalDeviceShaderIntegerDotProductFeaturesKHR :: PhysicalDeviceShaderIntegerDotProductFeatures PhysicalDeviceShaderIntegerDotProductPropertiesKHR :: PhysicalDeviceShaderIntegerDotProductProperties PipelineStageFlags2KHR :: PipelineStageFlags2 @@ -9532,11 +9952,43 @@ PhysicalDeviceMaintenance4FeaturesKHR :: PhysicalDeviceMai PhysicalDeviceMaintenance4PropertiesKHR :: PhysicalDeviceMaintenance4Properties DeviceBufferMemoryRequirementsKHR :: DeviceBufferMemoryRequirements DeviceImageMemoryRequirementsKHR :: DeviceImageMemoryRequirements -PipelineCreateFlags2KHR :: Flags64 -PipelineCreateFlag2KHR :: Flags64 -BufferUsageFlags2KHR :: Flags64 -BufferUsageFlag2KHR :: Flags64 +PhysicalDeviceShaderSubgroupRotateFeaturesKHR :: PhysicalDeviceShaderSubgroupRotateFeatures +PipelineCreateFlags2KHR :: PipelineCreateFlags2 +PipelineCreateFlag2KHR :: PipelineCreateFlag2 +BufferUsageFlags2KHR :: BufferUsageFlags2 +BufferUsageFlag2KHR :: BufferUsageFlag2 +PhysicalDeviceMaintenance5FeaturesKHR :: PhysicalDeviceMaintenance5Features +PhysicalDeviceMaintenance5PropertiesKHR :: PhysicalDeviceMaintenance5Properties +RenderingAreaInfoKHR :: RenderingAreaInfo +DeviceImageSubresourceInfoKHR :: DeviceImageSubresourceInfo +ImageSubresource2KHR :: ImageSubresource2 +SubresourceLayout2KHR :: SubresourceLayout2 +PipelineCreateFlags2CreateInfoKHR :: PipelineCreateFlags2CreateInfo +BufferUsageFlags2CreateInfoKHR :: BufferUsageFlags2CreateInfo +PhysicalDeviceVertexAttributeDivisorPropertiesKHR :: PhysicalDeviceVertexAttributeDivisorProperties +VertexInputBindingDivisorDescriptionKHR :: VertexInputBindingDivisorDescription +PipelineVertexInputDivisorStateCreateInfoKHR :: PipelineVertexInputDivisorStateCreateInfo +PhysicalDeviceVertexAttributeDivisorFeaturesKHR :: PhysicalDeviceVertexAttributeDivisorFeatures +PhysicalDeviceShaderFloatControls2FeaturesKHR :: PhysicalDeviceShaderFloatControls2Features +PhysicalDeviceIndexTypeUint8FeaturesKHR :: PhysicalDeviceIndexTypeUint8Features +LineRasterizationModeKHR :: LineRasterizationMode +PhysicalDeviceLineRasterizationFeaturesKHR :: PhysicalDeviceLineRasterizationFeatures +PhysicalDeviceLineRasterizationPropertiesKHR :: PhysicalDeviceLineRasterizationProperties +PipelineRasterizationLineStateCreateInfoKHR :: PipelineRasterizationLineStateCreateInfo +PhysicalDeviceShaderExpectAssumeFeaturesKHR :: PhysicalDeviceShaderExpectAssumeFeatures +PhysicalDeviceMaintenance6FeaturesKHR :: PhysicalDeviceMaintenance6Features +PhysicalDeviceMaintenance6PropertiesKHR :: PhysicalDeviceMaintenance6Properties +BindMemoryStatusKHR :: BindMemoryStatus +BindDescriptorSetsInfoKHR :: BindDescriptorSetsInfo +PushConstantsInfoKHR :: PushConstantsInfo +PushDescriptorSetInfoKHR :: PushDescriptorSetInfo +PushDescriptorSetWithTemplateInfoKHR :: PushDescriptorSetWithTemplateInfo PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT :: PhysicalDeviceTextureCompressionASTCHDRFeatures +PipelineRobustnessBufferBehaviorEXT :: PipelineRobustnessBufferBehavior +PipelineRobustnessImageBehaviorEXT :: PipelineRobustnessImageBehavior +PhysicalDevicePipelineRobustnessFeaturesEXT :: PhysicalDevicePipelineRobustnessFeatures +PhysicalDevicePipelineRobustnessPropertiesEXT :: PhysicalDevicePipelineRobustnessProperties +PipelineRobustnessCreateInfoEXT :: PipelineRobustnessCreateInfo SamplerReductionModeEXT :: SamplerReductionMode SamplerReductionModeCreateInfoEXT :: SamplerReductionModeCreateInfo PhysicalDeviceSamplerFilterMinmaxPropertiesEXT :: PhysicalDeviceSamplerFilterMinmaxProperties @@ -9544,6 +9996,7 @@ PhysicalDeviceInlineUniformBlockFeaturesEXT :: PhysicalDeviceInl PhysicalDeviceInlineUniformBlockPropertiesEXT :: PhysicalDeviceInlineUniformBlockProperties WriteDescriptorSetInlineUniformBlockEXT :: WriteDescriptorSetInlineUniformBlock DescriptorPoolInlineUniformBlockCreateInfoEXT :: DescriptorPoolInlineUniformBlockCreateInfo +AttachmentSampleCountInfoNV :: AttachmentSampleCountInfoAMD DescriptorBindingFlagEXT :: DescriptorBindingFlag DescriptorBindingFlagsEXT :: DescriptorBindingFlags DescriptorSetLayoutBindingFlagsCreateInfoEXT :: DescriptorSetLayoutBindingFlagsCreateInfo @@ -9564,13 +10017,13 @@ BuildAccelerationStructureFlagNV :: BuildAcceleration TransformMatrixNV :: TransformMatrixKHR AabbPositionsNV :: AabbPositionsKHR AccelerationStructureInstanceNV :: AccelerationStructureInstanceKHR -QueueGlobalPriorityEXT :: QueueGlobalPriorityKHR -DeviceQueueGlobalPriorityCreateInfoEXT :: DeviceQueueGlobalPriorityCreateInfoKHR +QueueGlobalPriorityEXT :: QueueGlobalPriority +DeviceQueueGlobalPriorityCreateInfoEXT :: DeviceQueueGlobalPriorityCreateInfo TimeDomainEXT :: TimeDomainKHR CalibratedTimestampInfoEXT :: CalibratedTimestampInfoKHR -VertexInputBindingDivisorDescriptionEXT :: VertexInputBindingDivisorDescriptionKHR -PipelineVertexInputDivisorStateCreateInfoEXT :: PipelineVertexInputDivisorStateCreateInfoKHR -PhysicalDeviceVertexAttributeDivisorFeaturesEXT :: PhysicalDeviceVertexAttributeDivisorFeaturesKHR +VertexInputBindingDivisorDescriptionEXT :: VertexInputBindingDivisorDescription +PipelineVertexInputDivisorStateCreateInfoEXT :: PipelineVertexInputDivisorStateCreateInfo +PhysicalDeviceVertexAttributeDivisorFeaturesEXT :: PhysicalDeviceVertexAttributeDivisorFeatures PipelineCreationFeedbackFlagEXT :: PipelineCreationFeedbackFlag PipelineCreationFeedbackFlagsEXT :: PipelineCreationFeedbackFlags PipelineCreationFeedbackCreateInfoEXT :: PipelineCreationFeedbackCreateInfo @@ -9590,14 +10043,26 @@ PhysicalDeviceToolPropertiesEXT :: PhysicalDeviceToo ImageStencilUsageCreateInfoEXT :: ImageStencilUsageCreateInfo ComponentTypeNV :: ComponentTypeKHR ScopeNV :: ScopeKHR -LineRasterizationModeEXT :: LineRasterizationModeKHR -PhysicalDeviceLineRasterizationFeaturesEXT :: PhysicalDeviceLineRasterizationFeaturesKHR -PhysicalDeviceLineRasterizationPropertiesEXT :: PhysicalDeviceLineRasterizationPropertiesKHR -PipelineRasterizationLineStateCreateInfoEXT :: PipelineRasterizationLineStateCreateInfoKHR +LineRasterizationModeEXT :: LineRasterizationMode +PhysicalDeviceLineRasterizationFeaturesEXT :: PhysicalDeviceLineRasterizationFeatures +PhysicalDeviceLineRasterizationPropertiesEXT :: PhysicalDeviceLineRasterizationProperties +PipelineRasterizationLineStateCreateInfoEXT :: PipelineRasterizationLineStateCreateInfo PhysicalDeviceHostQueryResetFeaturesEXT :: PhysicalDeviceHostQueryResetFeatures -PhysicalDeviceIndexTypeUint8FeaturesEXT :: PhysicalDeviceIndexTypeUint8FeaturesKHR -SubresourceLayout2EXT :: SubresourceLayout2KHR -ImageSubresource2EXT :: ImageSubresource2KHR +PhysicalDeviceIndexTypeUint8FeaturesEXT :: PhysicalDeviceIndexTypeUint8Features +HostImageCopyFlagEXT :: HostImageCopyFlag +HostImageCopyFlagsEXT :: HostImageCopyFlags +PhysicalDeviceHostImageCopyFeaturesEXT :: PhysicalDeviceHostImageCopyFeatures +PhysicalDeviceHostImageCopyPropertiesEXT :: PhysicalDeviceHostImageCopyProperties +MemoryToImageCopyEXT :: MemoryToImageCopy +ImageToMemoryCopyEXT :: ImageToMemoryCopy +CopyMemoryToImageInfoEXT :: CopyMemoryToImageInfo +CopyImageToMemoryInfoEXT :: CopyImageToMemoryInfo +CopyImageToImageInfoEXT :: CopyImageToImageInfo +HostImageLayoutTransitionInfoEXT :: HostImageLayoutTransitionInfo +SubresourceHostMemcpySizeEXT :: SubresourceHostMemcpySize +HostImageCopyDevicePerformanceQueryEXT :: HostImageCopyDevicePerformanceQuery +SubresourceLayout2EXT :: SubresourceLayout2 +ImageSubresource2EXT :: ImageSubresource2 PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT :: PhysicalDeviceShaderDemoteToHelperInvocationFeatures PhysicalDeviceTexelBufferAlignmentPropertiesEXT :: PhysicalDeviceTexelBufferAlignmentProperties PrivateDataSlotEXT :: PrivateDataSlot @@ -9612,12 +10077,13 @@ PhysicalDeviceMutableDescriptorTypeFeaturesVALVE :: PhysicalDeviceMut MutableDescriptorTypeListVALVE :: MutableDescriptorTypeListEXT MutableDescriptorTypeCreateInfoVALVE :: MutableDescriptorTypeCreateInfoEXT PipelineInfoEXT :: PipelineInfoKHR -PhysicalDeviceGlobalPriorityQueryFeaturesEXT :: PhysicalDeviceGlobalPriorityQueryFeaturesKHR -QueueFamilyGlobalPriorityPropertiesEXT :: QueueFamilyGlobalPriorityPropertiesKHR +PhysicalDeviceGlobalPriorityQueryFeaturesEXT :: PhysicalDeviceGlobalPriorityQueryFeatures +QueueFamilyGlobalPriorityPropertiesEXT :: QueueFamilyGlobalPriorityProperties PhysicalDeviceSchedulingControlsFlagsARM :: Flags64 PhysicalDeviceSchedulingControlsFlagARM :: Flags64 MemoryDecompressionMethodFlagNV :: Flags64 MemoryDecompressionMethodFlagsNV :: Flags64 +PhysicalDevicePipelineProtectedAccessFeaturesEXT :: PhysicalDevicePipelineProtectedAccessFeatures ShaderRequiredSubgroupSizeCreateInfoEXT :: PipelineShaderStageRequiredSubgroupSizeCreateInfo From ef5546aea521d806dcdb5a6f3fd15481ae8e9a6e Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 3 Dec 2024 12:42:13 +0100 Subject: [PATCH 015/431] Add misc\get-date.c Prints the current date as YYYYMMDD without relying on PowerShell. Hopefully fixes #4540 --- build.bat | 7 +++++-- misc/get-date.c | 13 +++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 misc/get-date.c diff --git a/build.bat b/build.bat index 55c71ca9f..0d6d281b3 100644 --- a/build.bat +++ b/build.bat @@ -19,7 +19,11 @@ if "%VSCMD_ARG_TGT_ARCH%" neq "x64" ( ) ) -for /f %%i in ('powershell get-date -format "{yyyyMMdd}"') do ( +pushd misc +cl get-date.c +popd + +for /f %%i in ('misc\get-date') do ( set CURR_DATE_TIME=%%i ) set curr_year=%CURR_DATE_TIME:~0,4% @@ -58,7 +62,6 @@ set V4=0 set odin_version_full="%V1%.%V2%.%V3%.%V4%" set odin_version_raw="dev-%V1%-%V2%" - set compiler_flags= -nologo -Oi -TP -fp:precise -Gm- -MP -FC -EHsc- -GR- -GF rem Parse source code as utf-8 even on shift-jis and other codepages rem See https://learn.microsoft.com/en-us/cpp/build/reference/utf-8-set-source-and-executable-character-sets-to-utf-8?view=msvc-170 diff --git a/misc/get-date.c b/misc/get-date.c new file mode 100644 index 000000000..bf5b32738 --- /dev/null +++ b/misc/get-date.c @@ -0,0 +1,13 @@ +/* + Prints the current date as YYYYMMDD + + e.g. 2024-12-25 +*/ +#include +#include + +int main(int arg_count, char const **arg_ptr) { + time_t t = time(NULL); + struct tm* now = localtime(&t); + printf("%04d%02d%02d", now->tm_year + 1900, now->tm_mon + 1, now->tm_mday); +} \ No newline at end of file From 7edc46f1b945933ffd5dd41535e60a86b07d4539 Mon Sep 17 00:00:00 2001 From: Ycros <18012+ycros@users.noreply.github.com> Date: Wed, 4 Dec 2024 13:51:27 +1100 Subject: [PATCH 016/431] fix: regex's match_with_preallocated_capture returning num_groups --- core/text/regex/regex.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/core/text/regex/regex.odin b/core/text/regex/regex.odin index 3dc26b5c6..8f8efe252 100644 --- a/core/text/regex/regex.odin +++ b/core/text/regex/regex.odin @@ -381,6 +381,7 @@ match_with_preallocated_capture :: proc( capture.pos[n] = {a, b} n += 1 } + num_groups = n } return From bf63e9b09369e10ccee1a929be7e413fb81fa956 Mon Sep 17 00:00:00 2001 From: Ycros <18012+ycros@users.noreply.github.com> Date: Wed, 4 Dec 2024 14:35:53 +1100 Subject: [PATCH 017/431] Add test for regex preallocated captures. --- .../core/text/regex/test_core_text_regex.odin | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/tests/core/text/regex/test_core_text_regex.odin b/tests/core/text/regex/test_core_text_regex.odin index dfc9224a8..3e7145406 100644 --- a/tests/core/text/regex/test_core_text_regex.odin +++ b/tests/core/text/regex/test_core_text_regex.odin @@ -1043,3 +1043,40 @@ test_us_phone_number :: proc(t: ^testing.T) { EXPR :: `^[2-9]\d{2}-\d{3}-\d{4}$` check_expression(t, EXPR, "650-253-0001", "650-253-0001") } + +@test +test_preallocated_capture :: proc(t: ^testing.T) { + capture := regex.preallocate_capture() + defer regex.destroy(capture) + + for pos in capture.pos { + testing.expect_value(t, pos, [2]int{0, 0}) + } + for group in capture.groups { + testing.expect_value(t, group, "") + } + + rex, parse_err := regex.create(`f(o)ob(ar)`) + if !testing.expect_value(t, parse_err, nil) { + return + } + defer regex.destroy(rex) + + num_groups, success := regex.match_with_preallocated_capture(rex, "foobar", &capture) + testing.expect_value(t, num_groups, 3) + testing.expect_value(t, success, true) + + testing.expect_value(t, capture.pos[0], [2]int{0, 6}) + testing.expect_value(t, capture.pos[1], [2]int{1, 2}) + testing.expect_value(t, capture.pos[2], [2]int{4, 6}) + for pos in capture.pos[3:] { + testing.expect_value(t, pos, [2]int{0, 0}) + } + + testing.expect_value(t, capture.groups[0], "foobar") + testing.expect_value(t, capture.groups[1], "o") + testing.expect_value(t, capture.groups[2], "ar") + for groups in capture.groups[3:] { + testing.expect_value(t, groups, "") + } +} From 5dfc24882fb9ed40c79e60963dbfdbccd3c82450 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Zadro=C5=BCny?= Date: Wed, 4 Dec 2024 14:29:49 +0100 Subject: [PATCH 018/431] improve `strings.index_multi` There's no point searching for substrings after lowest_index, so let's not. This significantly improves performance on long strings. --- core/strings/strings.odin | 3 ++- tests/core/strings/test_core_strings.odin | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/core/strings/strings.odin b/core/strings/strings.odin index af93ff33c..c014d2b2b 100644 --- a/core/strings/strings.odin +++ b/core/strings/strings.odin @@ -1872,7 +1872,8 @@ index_multi :: proc(s: string, substrs: []string) -> (idx: int, width: int) { lowest_index := len(s) found := false for substr in substrs { - if i := index(s, substr); i >= 0 { + haystack := s[:min(len(s), lowest_index + len(substr))] + if i := index(haystack, substr); i >= 0 { if i < lowest_index { lowest_index = i width = len(substr) diff --git a/tests/core/strings/test_core_strings.odin b/tests/core/strings/test_core_strings.odin index 0d94b9c62..0304ec226 100644 --- a/tests/core/strings/test_core_strings.odin +++ b/tests/core/strings/test_core_strings.odin @@ -40,6 +40,25 @@ test_last_index_any_small_string_not_found :: proc(t: ^testing.T) { testing.expect(t, index == -1, "last_index_any should be -1") } +@test +test_index_multi_overlapping_substrs :: proc(t: ^testing.T) { + index, width := strings.index_multi("some example text", {"ample", "exam"}) + testing.expect_value(t, index, 5) + testing.expect_value(t, width, 4) +} + +@test +test_index_multi_not_found :: proc(t: ^testing.T) { + index, width := strings.index_multi("some example text", {"ey", "tey"}) + testing.expect_value(t, index, -1) +} + +@test +test_index_multi_with_empty_string :: proc(t: ^testing.T) { + index, width := strings.index_multi("some example text", {"ex", ""}) + testing.expect_value(t, index, -1) +} + Cut_Test :: struct { input: string, offset: int, From dc0e189e32d4a4d88b58e79bdf919fe865b4b702 Mon Sep 17 00:00:00 2001 From: Tina Colvin Date: Wed, 4 Dec 2024 11:49:24 -0700 Subject: [PATCH 019/431] add bindings for rCamera module in vendor/raylib/raylib.odin --- vendor/raylib/raylib.odin | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/vendor/raylib/raylib.odin b/vendor/raylib/raylib.odin index a5be660c6..9f51791ab 100644 --- a/vendor/raylib/raylib.odin +++ b/vendor/raylib/raylib.odin @@ -845,6 +845,17 @@ Gesture :: enum c.uint { } Gestures :: distinct bit_set[Gesture; c.uint] +// Camera speed values +CAMERA_MOVE_SPEED :: #config(CAMERA_MOVE_SPEED, 5.4) +CAMERA_ROTATION_SPEED :: #config(CAMERA_ROTATION_SPEED, 0.03) +CAMERA_PAN_SPEED :: #config(CAMERA_PAN_SPEED, 0.2) + +// Camera mouse movement sensitivity +CAMERA_MOUSE_MOVE_SENSITIVITY :: #config(CAMERA_MOUSE_MOVE_SENSITIVITY, 0.003) + +// Camera orbital speed in CAMERA_ORBITAL mode +CAMERA_ORBITAL_SPEED :: #config(CAMERA_ORBITAL_SPEED, 0.5) + // Camera system modes CameraMode :: enum c.int { CUSTOM = 0, // Camera custom, controlled by user (UpdateCamera() does nothing) @@ -1181,6 +1192,23 @@ foreign lib { UpdateCamera :: proc(camera: ^Camera, mode: CameraMode) --- // Set camera mode (multiple camera modes available) UpdateCameraPro :: proc(camera: ^Camera, movement: Vector3, rotation: Vector3, zoom: f32) --- // Update camera movement/rotation + GetCameraForward :: proc(camera: ^Camera) -> Vector3 --- // returns the camera's forward vector (normalized) + GetCameraUp :: proc(camera: ^Camera) -> Vector3 --- // returns the camera's up vector (normalized) - might not be perpendicular to forward vector + GetCameraRight :: proc(camera: ^Camera) -> Vector3 --- // returns the camera's right vector (normalized) + + // Camera Movement/Rotation. Angle is provided in radians + + CameraMoveForward :: proc(camera: ^Camera, distance: f32, moveInWorldPlane: bool) --- // move the camera in its forward direction + CameraMoveUp :: proc(camera: ^Camera, distance: f32) --- // move camera in its up direction + CameraMoveRight :: proc(camera: ^Camera, distance: f32, delta: f32) --- // move camera in it's current right direction + CameraMoveToTarget :: proc(camera: ^Camera, delta: f32) --- // moves the camera position closer/farther to/from the camera target + CameraYaw :: proc(camera: ^Camera, angle: f32, rotateAroundTarget: bool) --- // rotates the camera around its up vector (left and right) + CameraPitch :: proc(camera: ^Camera, angle: f32, lockView: bool, rotateAroundTarget: bool, rotateUp: bool) --- // rotates the camera around its right vector (up and down) + CameraRoll :: proc(camera: ^Camera, angle: f32) --- // rotates the camera around its forward vector (left and right) + + GetCameraViewMatrix :: proc(camera: ^Camera) -> Matrix --- // returns the camera view matrix + GetCameraProjectionMatrix :: proc(camera: ^Camera, aspect: f32) -> Matrix --- // returns the camera projection matrix + //------------------------------------------------------------------------------------ // Basic Shapes Drawing Functions (Module: shapes) //------------------------------------------------------------------------------------ From ce51b79a37f61b56c40cdac489c815a792ad445f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Zadro=C5=BCny?= Date: Wed, 4 Dec 2024 21:09:47 +0100 Subject: [PATCH 020/431] Fix the unused variable errors --- tests/core/strings/test_core_strings.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/core/strings/test_core_strings.odin b/tests/core/strings/test_core_strings.odin index 0304ec226..44c79ce73 100644 --- a/tests/core/strings/test_core_strings.odin +++ b/tests/core/strings/test_core_strings.odin @@ -49,13 +49,13 @@ test_index_multi_overlapping_substrs :: proc(t: ^testing.T) { @test test_index_multi_not_found :: proc(t: ^testing.T) { - index, width := strings.index_multi("some example text", {"ey", "tey"}) + index, _ := strings.index_multi("some example text", {"ey", "tey"}) testing.expect_value(t, index, -1) } @test test_index_multi_with_empty_string :: proc(t: ^testing.T) { - index, width := strings.index_multi("some example text", {"ex", ""}) + index, _ := strings.index_multi("some example text", {"ex", ""}) testing.expect_value(t, index, -1) } From 96691c364b51feaf04ef4a24dd9b8ec5b58fc01b Mon Sep 17 00:00:00 2001 From: Gavin Date: Wed, 4 Dec 2024 18:05:33 -0500 Subject: [PATCH 021/431] add which to shell.nix to build with --pure --- shell.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/shell.nix b/shell.nix index 21301b9d7..040c7696e 100644 --- a/shell.nix +++ b/shell.nix @@ -3,6 +3,7 @@ pkgs.mkShell { name = "odin"; nativeBuildInputs = with pkgs; [ git + which clang_17 llvmPackages_17.llvm llvmPackages_17.bintools From 52a7a3e5fce0f502f002d3e43b049b6bfc3403b7 Mon Sep 17 00:00:00 2001 From: Tina Colvin Date: Wed, 4 Dec 2024 16:44:00 -0700 Subject: [PATCH 022/431] change camera defines to constants --- vendor/raylib/raylib.odin | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/vendor/raylib/raylib.odin b/vendor/raylib/raylib.odin index 9f51791ab..34a803b99 100644 --- a/vendor/raylib/raylib.odin +++ b/vendor/raylib/raylib.odin @@ -846,15 +846,15 @@ Gesture :: enum c.uint { Gestures :: distinct bit_set[Gesture; c.uint] // Camera speed values -CAMERA_MOVE_SPEED :: #config(CAMERA_MOVE_SPEED, 5.4) -CAMERA_ROTATION_SPEED :: #config(CAMERA_ROTATION_SPEED, 0.03) -CAMERA_PAN_SPEED :: #config(CAMERA_PAN_SPEED, 0.2) +CAMERA_MOVE_SPEED :: 5.4 +CAMERA_ROTATION_SPEED :: 0.03 +CAMERA_PAN_SPEED :: 0.2 // Camera mouse movement sensitivity -CAMERA_MOUSE_MOVE_SENSITIVITY :: #config(CAMERA_MOUSE_MOVE_SENSITIVITY, 0.003) +CAMERA_MOUSE_MOVE_SENSITIVITY :: 0.003 // Camera orbital speed in CAMERA_ORBITAL mode -CAMERA_ORBITAL_SPEED :: #config(CAMERA_ORBITAL_SPEED, 0.5) +CAMERA_ORBITAL_SPEED :: 0.5 // Camera system modes CameraMode :: enum c.int { From b36a81ef535b55afa3630eda6ff0b94f77f6c11e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 5 Dec 2024 10:44:53 +0000 Subject: [PATCH 023/431] ABI change: for indirect parameters size_of <= 16, do callee stack copy --- src/build_settings.cpp | 1 + src/llvm_backend_proc.cpp | 19 +++++++++++++++++++ src/main.cpp | 5 +++++ 3 files changed, 25 insertions(+) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 50fae93b8..15cc4f71d 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -467,6 +467,7 @@ struct BuildContext { BuildCacheData build_cache_data; bool internal_no_inline; + bool internal_by_value; bool no_threaded_checker; diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 5aee5b639..fee825a2f 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -579,6 +579,8 @@ gb_internal void lb_begin_procedure_body(lbProcedure *p) { p->raw_input_parameters = array_make(permanent_allocator(), raw_input_parameters_count); LLVMGetParams(p->value, p->raw_input_parameters.data); + bool is_odin_cc = is_calling_convention_odin(ft->calling_convention); + unsigned param_index = 0; for_array(i, params->variables) { Entity *e = params->variables[i]; @@ -613,9 +615,26 @@ gb_internal void lb_begin_procedure_body(lbProcedure *p) { } } else if (arg_type->kind == lbArg_Indirect) { if (e->token.string.len != 0 && !is_blank_ident(e->token.string)) { + i64 sz = type_size_of(e->type); + bool do_callee_copy = false; + + if (is_odin_cc) { + do_callee_copy = sz <= 16; + if (build_context.internal_by_value) { + do_callee_copy = true; + } + } + lbValue ptr = {}; ptr.value = LLVMGetParam(p->value, param_offset+param_index); ptr.type = alloc_type_pointer(e->type); + + if (do_callee_copy) { + lbValue new_ptr = lb_add_local_generated(p, e->type, false).addr; + lb_mem_copy_non_overlapping(p, new_ptr, ptr, lb_const_int(p->module, t_uint, sz)); + ptr = new_ptr; + } + lb_add_entity(p->module, e, ptr); lb_add_debug_param_variable(p, ptr.value, e->type, e->token, param_index+1, p->decl_block); } diff --git a/src/main.cpp b/src/main.cpp index 015269438..4d85a9e72 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -401,6 +401,7 @@ enum BuildFlagKind { BuildFlag_InternalModulePerFile, BuildFlag_InternalCached, BuildFlag_InternalNoInline, + BuildFlag_InternalByValue, BuildFlag_Tilde, @@ -612,6 +613,7 @@ gb_internal bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_InternalModulePerFile, str_lit("internal-module-per-file"), BuildFlagParam_None, Command_all); add_flag(&build_flags, BuildFlag_InternalCached, str_lit("internal-cached"), BuildFlagParam_None, Command_all); add_flag(&build_flags, BuildFlag_InternalNoInline, str_lit("internal-no-inline"), BuildFlagParam_None, Command_all); + add_flag(&build_flags, BuildFlag_InternalByValue, str_lit("internal-by-value"), BuildFlagParam_None, Command_all); #if ALLOW_TILDE add_flag(&build_flags, BuildFlag_Tilde, str_lit("tilde"), BuildFlagParam_None, Command__does_build); @@ -1508,6 +1510,9 @@ gb_internal bool parse_build_flags(Array args) { case BuildFlag_InternalNoInline: build_context.internal_no_inline = true; break; + case BuildFlag_InternalByValue: + build_context.internal_by_value = true; + break; case BuildFlag_Tilde: build_context.tilde_backend = true; From a4b071e8641ddde2827bce6eaf1692871f656a43 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 5 Dec 2024 12:30:17 +0000 Subject: [PATCH 024/431] Add `/nologo` --- build.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.bat b/build.bat index 0d6d281b3..a788a8c04 100644 --- a/build.bat +++ b/build.bat @@ -20,7 +20,7 @@ if "%VSCMD_ARG_TGT_ARCH%" neq "x64" ( ) pushd misc -cl get-date.c +cl /nologo get-date.c popd for /f %%i in ('misc\get-date') do ( From f7761ebcc4dd22ae98335c3845e07e496c010ee4 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 5 Dec 2024 12:30:55 +0000 Subject: [PATCH 025/431] Make odin.rc terser --- misc/odin.rc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/misc/odin.rc b/misc/odin.rc index 9e605f6dc..70d395030 100644 --- a/misc/odin.rc +++ b/misc/odin.rc @@ -55,12 +55,12 @@ BEGIN BLOCK "0409FDE9" BEGIN VALUE "CompanyName", "https://odin-lang.org/" - VALUE "FileDescription", "Odin general-purpose programming language." // note this is shown in the task manager + VALUE "FileDescription", "Odin" // note this is shown in the task manager VALUE "FileVersion", QUOTE(VF) VALUE "InternalName", "odin.exe" VALUE "LegalCopyright", "Copyright (c) 2016-2024 Ginger Bill. All rights reserved." VALUE "OriginalFilename", "odin.exe" - VALUE "ProductName", "The Odin Programming Language" + VALUE "ProductName", "Odin Programming Language" VALUE "ProductVersion", QUOTE(VP) VALUE "Comments", QUOTE(git-sha: GIT_SHA) // custom values From 37fb2754a1d98cd3b8738717183543924c66524b Mon Sep 17 00:00:00 2001 From: dozn <16659513+dozn@users.noreply.github.com> Date: Thu, 5 Dec 2024 07:23:34 -0800 Subject: [PATCH 026/431] Move Struct Field Zipping Outside of JSON Token Loop --- core/encoding/json/unmarshal.odin | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/encoding/json/unmarshal.odin b/core/encoding/json/unmarshal.odin index 447397de4..33fd104b7 100644 --- a/core/encoding/json/unmarshal.odin +++ b/core/encoding/json/unmarshal.odin @@ -417,15 +417,15 @@ unmarshal_object :: proc(p: ^Parser, v: any, end_token: Token_Kind) -> (err: Unm if .raw_union in t.flags { return UNSUPPORTED_TYPE } - + + fields := reflect.struct_fields_zipped(ti.id) + struct_loop: for p.curr_token.kind != end_token { key := parse_object_key(p, p.allocator) or_return defer delete(key, p.allocator) unmarshal_expect_token(p, .Colon) - fields := reflect.struct_fields_zipped(ti.id) - field_test :: #force_inline proc "contextless" (field_used: [^]byte, offset: uintptr) -> bool { prev_set := field_used[offset/8] & byte(offset&7) != 0 field_used[offset/8] |= byte(offset&7) From f5b16aa42aae8dd53f6138cc8593f7937733dc90 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 5 Dec 2024 15:27:41 +0000 Subject: [PATCH 027/431] Fix #4561 --- src/check_stmt.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index 2418fcc5c..e2d6f68fa 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -2612,6 +2612,7 @@ gb_internal void check_for_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) { } else if (cond && cond->kind == Ast_BinaryExpr && cond->BinaryExpr.left && cond->BinaryExpr.right && cond->BinaryExpr.op.kind == Token_LtEq && + type_of_expr(cond->BinaryExpr.right) != nullptr && is_type_unsigned(type_of_expr(cond->BinaryExpr.right)) && cond->BinaryExpr.left->tav.value.kind == ExactValue_Integer && is_exact_value_zero(cond->BinaryExpr.left->tav.value)) { From dd8e6e884c181b6d6775eedcfc3bad1365405f4f Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 5 Dec 2024 15:45:01 +0000 Subject: [PATCH 028/431] Try to fix #4553 --- src/llvm_backend_general.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 9dc603993..bab330da7 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -2601,7 +2601,7 @@ general_end:; GB_ASSERT(p->decl_block != p->curr_block); i64 max_align = gb_max(lb_alignof(src_type), lb_alignof(dst_type)); - max_align = gb_max(max_align, 4); + max_align = gb_max(max_align, 16); LLVMValueRef ptr = llvm_alloca(p, dst_type, max_align); From e3b16464908f2d6e85b7569ad4da6a802e3283c3 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 5 Dec 2024 15:46:35 +0000 Subject: [PATCH 029/431] Fix #4552 --- src/check_stmt.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index e2d6f68fa..02ad72388 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -2605,6 +2605,7 @@ gb_internal void check_for_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags) { if (cond && cond->kind == Ast_BinaryExpr && cond->BinaryExpr.left && cond->BinaryExpr.right && cond->BinaryExpr.op.kind == Token_GtEq && + type_of_expr(cond->BinaryExpr.left) != nullptr && is_type_unsigned(type_of_expr(cond->BinaryExpr.left)) && cond->BinaryExpr.right->tav.value.kind == ExactValue_Integer && is_exact_value_zero(cond->BinaryExpr.right->tav.value)) { From d452d37b93cb3318f995adc74f84076c1b3103a5 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 5 Dec 2024 15:51:05 +0000 Subject: [PATCH 030/431] Fix #4537 --- core/encoding/json/tokenizer.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/core/encoding/json/tokenizer.odin b/core/encoding/json/tokenizer.odin index 1a57ba6f0..e46d879a7 100644 --- a/core/encoding/json/tokenizer.odin +++ b/core/encoding/json/tokenizer.odin @@ -259,6 +259,7 @@ get_token :: proc(t: ^Tokenizer) -> (token: Token, err: Error) { skip_digits(t) } if t.r == 'e' || t.r == 'E' { + token.kind = .Float switch r := next_rune(t); r { case '+', '-': next_rune(t) From ad438f418dca488438b769bb2a995b30bb8e50b8 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Thu, 5 Dec 2024 19:00:45 +0100 Subject: [PATCH 031/431] sync: fix futexes on wasm --- core/sync/futex_wasm.odin | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/core/sync/futex_wasm.odin b/core/sync/futex_wasm.odin index 0f9659a02..0bc8bcbf7 100644 --- a/core/sync/futex_wasm.odin +++ b/core/sync/futex_wasm.odin @@ -12,8 +12,8 @@ _futex_wait :: proc "contextless" (f: ^Futex, expected: u32) -> bool { when !intrinsics.has_target_feature("atomics") { panic_contextless("usage of `core:sync` requires the `-target-feature:\"atomics\"` or a `-microarch` that supports it") } else { - s := intrinsics.wasm_memory_atomic_wait32((^u32)(f), expected, -1) - return s != 0 + intrinsics.wasm_memory_atomic_wait32((^u32)(f), expected, -1) + return true } } @@ -22,7 +22,7 @@ _futex_wait_with_timeout :: proc "contextless" (f: ^Futex, expected: u32, durati panic_contextless("usage of `core:sync` requires the `-target-feature:\"atomics\"` or a `-microarch` that supports it") } else { s := intrinsics.wasm_memory_atomic_wait32((^u32)(f), expected, i64(duration)) - return s != 0 + return s != 2 } } @@ -30,12 +30,7 @@ _futex_signal :: proc "contextless" (f: ^Futex) { when !intrinsics.has_target_feature("atomics") { panic_contextless("usage of `core:sync` requires the `-target-feature:\"atomics\"` or a `-microarch` that supports it") } else { - loop: for { - s := intrinsics.wasm_memory_atomic_notify32((^u32)(f), 1) - if s >= 1 { - return - } - } + intrinsics.wasm_memory_atomic_notify32((^u32)(f), 1) } } @@ -43,12 +38,7 @@ _futex_broadcast :: proc "contextless" (f: ^Futex) { when !intrinsics.has_target_feature("atomics") { panic_contextless("usage of `core:sync` requires the `-target-feature:\"atomics\"` or a `-microarch` that supports it") } else { - loop: for { - s := intrinsics.wasm_memory_atomic_notify32((^u32)(f), ~u32(0)) - if s >= 0 { - return - } - } + intrinsics.wasm_memory_atomic_notify32((^u32)(f), max(u32)) } } From ac3a87c2cfbead5d7c10ec4197aebc8327ce584c Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Thu, 5 Dec 2024 19:04:45 +0100 Subject: [PATCH 032/431] sync: fix require results --- core/sync/futex_wasm.odin | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/sync/futex_wasm.odin b/core/sync/futex_wasm.odin index 0bc8bcbf7..8675203ae 100644 --- a/core/sync/futex_wasm.odin +++ b/core/sync/futex_wasm.odin @@ -12,7 +12,7 @@ _futex_wait :: proc "contextless" (f: ^Futex, expected: u32) -> bool { when !intrinsics.has_target_feature("atomics") { panic_contextless("usage of `core:sync` requires the `-target-feature:\"atomics\"` or a `-microarch` that supports it") } else { - intrinsics.wasm_memory_atomic_wait32((^u32)(f), expected, -1) + _ := intrinsics.wasm_memory_atomic_wait32((^u32)(f), expected, -1) return true } } @@ -30,7 +30,7 @@ _futex_signal :: proc "contextless" (f: ^Futex) { when !intrinsics.has_target_feature("atomics") { panic_contextless("usage of `core:sync` requires the `-target-feature:\"atomics\"` or a `-microarch` that supports it") } else { - intrinsics.wasm_memory_atomic_notify32((^u32)(f), 1) + _ := intrinsics.wasm_memory_atomic_notify32((^u32)(f), 1) } } @@ -38,7 +38,7 @@ _futex_broadcast :: proc "contextless" (f: ^Futex) { when !intrinsics.has_target_feature("atomics") { panic_contextless("usage of `core:sync` requires the `-target-feature:\"atomics\"` or a `-microarch` that supports it") } else { - intrinsics.wasm_memory_atomic_notify32((^u32)(f), max(u32)) + _ := intrinsics.wasm_memory_atomic_notify32((^u32)(f), max(u32)) } } From cf53404f5f1275d1de9770f0abf86973bf98573d Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Thu, 5 Dec 2024 20:05:19 +0100 Subject: [PATCH 033/431] sync: fix no new values --- core/sync/futex_wasm.odin | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/sync/futex_wasm.odin b/core/sync/futex_wasm.odin index 8675203ae..16e69ca74 100644 --- a/core/sync/futex_wasm.odin +++ b/core/sync/futex_wasm.odin @@ -12,7 +12,7 @@ _futex_wait :: proc "contextless" (f: ^Futex, expected: u32) -> bool { when !intrinsics.has_target_feature("atomics") { panic_contextless("usage of `core:sync` requires the `-target-feature:\"atomics\"` or a `-microarch` that supports it") } else { - _ := intrinsics.wasm_memory_atomic_wait32((^u32)(f), expected, -1) + _ = intrinsics.wasm_memory_atomic_wait32((^u32)(f), expected, -1) return true } } @@ -30,7 +30,7 @@ _futex_signal :: proc "contextless" (f: ^Futex) { when !intrinsics.has_target_feature("atomics") { panic_contextless("usage of `core:sync` requires the `-target-feature:\"atomics\"` or a `-microarch` that supports it") } else { - _ := intrinsics.wasm_memory_atomic_notify32((^u32)(f), 1) + _ = intrinsics.wasm_memory_atomic_notify32((^u32)(f), 1) } } @@ -38,7 +38,7 @@ _futex_broadcast :: proc "contextless" (f: ^Futex) { when !intrinsics.has_target_feature("atomics") { panic_contextless("usage of `core:sync` requires the `-target-feature:\"atomics\"` or a `-microarch` that supports it") } else { - _ := intrinsics.wasm_memory_atomic_notify32((^u32)(f), max(u32)) + _ = intrinsics.wasm_memory_atomic_notify32((^u32)(f), max(u32)) } } From 25ae3d078556034b24c50bea57792680a57fd6e9 Mon Sep 17 00:00:00 2001 From: Gavin Date: Thu, 5 Dec 2024 14:58:39 -0500 Subject: [PATCH 034/431] Add regression test for #4553 This test is definitely imperfect (should have no erroneous failures, only erroneous passes), but should serve as a good smoke test if matrix alignment is ever broken again. Looking at the generated LLVM, there is a bunch of weird choices for alignment chosen that might be worth looking into. It's also worth noting that the failure mode of this test is a #GP exception, which I don't know how well the test runner handles in a larger test corpus. --- tests/internal/test_4553_matrix_align.odin | 53 ++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 tests/internal/test_4553_matrix_align.odin diff --git a/tests/internal/test_4553_matrix_align.odin b/tests/internal/test_4553_matrix_align.odin new file mode 100644 index 000000000..66ce8021e --- /dev/null +++ b/tests/internal/test_4553_matrix_align.odin @@ -0,0 +1,53 @@ +package test_internal + +import "core:testing" + +// See: https://github.com/odin-lang/Odin/issues/4553 +// It would be great if Odin had the ability to test against LLVM output since +// this test erronously passing is dependent on alignment of the stack. +// +// Right now, I am manually checking LLVM ir + +@test +test_4553_matrix_align :: proc(t: ^testing.T) { + test_mat :: proc($T: typeid, $R: u32, $C: u32) { + when R * C <= 16 { + return_matrix :: proc() -> matrix[R, C]T { + ret : matrix[R, C]T + return ret + } + // the origin of the bug had to do with a temporary + // created by a function return being loaded with bad + // alignment. The bug only affected 4-element f32 + // matrices, but it would be prudent to test more than + // that + _ = return_matrix() * [C]T{} + } + } + + test_mat_set :: proc($T: typeid) { + test_mat_row :: proc($T: typeid, $R: u32) { + test_mat(T, R, 1) + test_mat(T, R, 2) + test_mat(T, R, 3) + test_mat(T, R, 4) + test_mat(T, R, 5) + test_mat(T, R, 6) + } + test_mat_row(T, 1) + test_mat_row(T, 2) + test_mat_row(T, 3) + test_mat_row(T, 4) + test_mat_row(T, 5) + test_mat_row(T, 6) + + } + test_mat_set(f16) + test_mat_set(f32) + test_mat_set(f64) + test_mat_set(i8) + test_mat_set(i16) + test_mat_set(i32) + test_mat_set(i64) + test_mat_set(i128) +} From 402f8dd576aefd4cabb34438ca8f36c5edd86f70 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Fri, 6 Dec 2024 18:53:51 +0100 Subject: [PATCH 035/431] raylib/rlgl: fix foreign imports after update to 5.5 --- vendor/raylib/rlgl/rlgl.odin | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/vendor/raylib/rlgl/rlgl.odin b/vendor/raylib/rlgl/rlgl.odin index 9d4682294..40913cd50 100644 --- a/vendor/raylib/rlgl/rlgl.odin +++ b/vendor/raylib/rlgl/rlgl.odin @@ -134,19 +134,17 @@ when ODIN_OS == .Windows { // multiple copies of raylib.so, but since these bindings are for // particular version of the library, I better specify it. Ideally, // though, it's best specified in terms of major (.so.4) - "../linux/libraylib.so.500" when RAYLIB_SHARED else "../linux/libraylib.a", + "../linux/libraylib.so.550" when RAYLIB_SHARED else "../linux/libraylib.a", "system:dl", "system:pthread", } } else when ODIN_OS == .Darwin { foreign import lib { - "../macos" + - ("-arm64" when ODIN_ARCH == .arm64 else "") + - "/libraylib" + (".500.dylib" when RAYLIB_SHARED else ".a"), + "../macos/libraylib.550.dylib" when RAYLIB_SHARED else "../macos/libraylib.a", "system:Cocoa.framework", "system:OpenGL.framework", "system:IOKit.framework", - } + } } else { foreign import lib "system:raylib" } From 676fe34863c9332a49e2b5e659960caa5aa4d325 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Fri, 6 Dec 2024 19:38:53 +0100 Subject: [PATCH 036/431] fix #4547 - wasm -out without file extension --- 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 15cc4f71d..4c3f4b782 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -2054,7 +2054,7 @@ gb_internal bool init_build_paths(String init_filename) { // Do we have an extension? We might not if the output filename was supplied. if (bc->build_paths[BuildPath_Output].ext.len == 0) { - if (build_context.metrics.os == TargetOs_windows || build_context.build_mode != BuildMode_Executable) { + if (build_context.metrics.os == TargetOs_windows || is_arch_wasm() || build_context.build_mode != BuildMode_Executable) { bc->build_paths[BuildPath_Output].ext = copy_string(ha, output_extension); } } From 7edd332993b485ebdd81ccce5af5dacb16e72156 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Fri, 6 Dec 2024 22:12:52 +0100 Subject: [PATCH 037/431] fix #4536 - stack buffer overflow for size_of 0 types in struct unmarshal --- core/encoding/json/unmarshal.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/encoding/json/unmarshal.odin b/core/encoding/json/unmarshal.odin index 33fd104b7..c70b8d39a 100644 --- a/core/encoding/json/unmarshal.odin +++ b/core/encoding/json/unmarshal.odin @@ -433,7 +433,7 @@ unmarshal_object :: proc(p: ^Parser, v: any, end_token: Token_Kind) -> (err: Unm } field_used_bytes := (reflect.size_of_typeid(ti.id)+7)/8 - field_used := intrinsics.alloca(field_used_bytes, 1) + field_used := intrinsics.alloca(field_used_bytes + 1, 1) // + 1 to not overflow on size_of 0 types. intrinsics.mem_zero(field_used, field_used_bytes) use_field_idx := -1 From f1cae8d844f1ee5903d490d8bf91a2502189571c Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Fri, 6 Dec 2024 23:08:47 +0100 Subject: [PATCH 038/431] fix #4496 - allow unlock of unlocked mutex (making it consistent with windows behaviour) --- core/sync/primitives_atomic.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sync/primitives_atomic.odin b/core/sync/primitives_atomic.odin index 3c4324eb7..a8a84b2bc 100644 --- a/core/sync/primitives_atomic.odin +++ b/core/sync/primitives_atomic.odin @@ -67,7 +67,7 @@ atomic_mutex_unlock :: proc "contextless" (m: ^Atomic_Mutex) { switch atomic_exchange_explicit(&m.state, .Unlocked, .Release) { case .Unlocked: - unreachable() + // Kind of okay - unlocking while already unlocked. case .Locked: // Okay case .Waiting: From 6e1d02886138964439a0c1611ab7e570d0fee9e2 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Fri, 6 Dec 2024 23:51:14 +0100 Subject: [PATCH 039/431] fix #4389 - retrieve file type by opening if other methods failed --- core/os/os2/stat_windows.odin | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/core/os/os2/stat_windows.odin b/core/os/os2/stat_windows.odin index 0a019e9da..31f5d9e88 100644 --- a/core/os/os2/stat_windows.odin +++ b/core/os/os2/stat_windows.odin @@ -72,7 +72,11 @@ internal_stat :: proc(name: string, create_file_attributes: u32, allocator: runt ok := win32.GetFileAttributesExW(wname, win32.GetFileExInfoStandard, &fa) if ok && fa.dwFileAttributes & win32.FILE_ATTRIBUTE_REPARSE_POINT == 0 { // Not a symlink - return _file_info_from_win32_file_attribute_data(&fa, name, allocator) + fi = _file_info_from_win32_file_attribute_data(&fa, name, allocator) or_return + if fi.type == .Undetermined { + fi.type = _file_type_from_create_file(wname, create_file_attributes) + } + return } err := 0 if ok else win32.GetLastError() @@ -86,7 +90,11 @@ internal_stat :: proc(name: string, create_file_attributes: u32, allocator: runt } win32.FindClose(sh) - return _file_info_from_win32_find_data(&fd, name, allocator) + fi = _file_info_from_win32_find_data(&fd, name, allocator) or_return + if fi.type == .Undetermined { + fi.type = _file_type_from_create_file(wname, create_file_attributes) + } + return } h := win32.CreateFileW(wname, 0, 0, nil, win32.OPEN_EXISTING, create_file_attributes, nil) @@ -194,6 +202,15 @@ file_type :: proc(h: win32.HANDLE) -> File_Type { return .Undetermined } +_file_type_from_create_file :: proc(wname: win32.wstring, create_file_attributes: u32) -> File_Type { + h := win32.CreateFileW(wname, 0, 0, nil, win32.OPEN_EXISTING, create_file_attributes, nil) + if h == win32.INVALID_HANDLE_VALUE { + return .Undetermined + } + defer win32.CloseHandle(h) + return file_type(h) +} + _file_type_mode_from_file_attributes :: proc(file_attributes: win32.DWORD, h: win32.HANDLE, ReparseTag: win32.DWORD) -> (type: File_Type, mode: int) { if file_attributes & win32.FILE_ATTRIBUTE_READONLY != 0 { mode |= 0o444 @@ -266,7 +283,7 @@ _file_info_from_get_file_information_by_handle :: proc(path: string, h: win32.HA fi.name = basename(path) fi.inode = u128(u64(d.nFileIndexHigh)<<32 + u64(d.nFileIndexLow)) fi.size = i64(d.nFileSizeHigh)<<32 + i64(d.nFileSizeLow) - type, mode := _file_type_mode_from_file_attributes(d.dwFileAttributes, nil, 0) + type, mode := _file_type_mode_from_file_attributes(d.dwFileAttributes, h, 0) fi.type = type fi.mode |= mode fi.creation_time = time.unix(0, win32.FILETIME_as_unix_nanoseconds(d.ftCreationTime)) From 59d88f2a22fc5f2ceec32bf0234ac5aa5990c5bd Mon Sep 17 00:00:00 2001 From: wrapperup Date: Sat, 7 Dec 2024 20:48:14 -0500 Subject: [PATCH 040/431] add missing vulkan video constants --- .../vulkan/_gen/create_vulkan_odin_wrapper.py | 32 +++++++++++++++++-- vendor/vulkan/core.odin | 26 +++++++++++++++ 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/vendor/vulkan/_gen/create_vulkan_odin_wrapper.py b/vendor/vulkan/_gen/create_vulkan_odin_wrapper.py index 83c021b16..1a4f96901 100644 --- a/vendor/vulkan/_gen/create_vulkan_odin_wrapper.py +++ b/vendor/vulkan/_gen/create_vulkan_odin_wrapper.py @@ -47,9 +47,9 @@ def no_vk(t): t = t.replace('PFN_', 'Proc') t = re.sub('(?:Vk|VK_)?(\w+)', '\\1', t) - # Vulkan Video - t = re.sub('(?:Std|STD_)?(\w+)', '\\1', t) + # Vulkan Video + t = re.sub('(?:Std|STD_|VK_STD)?(\w+)', '\\1', t) return t OPAQUE_STRUCTS = """ @@ -282,6 +282,16 @@ def parse_constants(f): for name, value in vulkan_video_data: f.write("{}{} :: {}\n".format(name, "".rjust(max_len-len(name)), value)) + f.write("\n// Vulkan Video Codec Constants\n") + vulkan_video_codec_allowed_suffixes = ( + "_EXTENSION_NAME", + ) + vulkan_video_codec_data = re.findall(r"#define VK_STD_(\w+)\s*(.*?)U?\n", src, re.S) + vulkan_video_codec_allowed_data = [nv for nv in vulkan_video_codec_data if nv[0].endswith(vulkan_video_codec_allowed_suffixes)] + max_len = max(len(name) for name, value in vulkan_video_codec_allowed_data) + for name, value in vulkan_video_codec_allowed_data: + f.write("{}{} :: {}\n".format(name, "".rjust(max_len-len(name)), value)) + f.write("\n// Vendor Constants\n") fixes = '|'.join(ext_suffixes) inner = r"((?:(?:" + fixes + r")\w+)|(?:\w+" + fixes + r"))" @@ -798,6 +808,7 @@ package vulkan with open("../core.odin", 'w', encoding='utf-8') as f: f.write(BASE) f.write(""" +// Core API API_VERSION_1_0 :: (1<<22) | (0<<12) | (0) API_VERSION_1_1 :: (1<<22) | (1<<12) | (0) API_VERSION_1_2 :: (1<<22) | (2<<12) | (0) @@ -848,6 +859,23 @@ MAX_GLOBAL_PRIORITY_SIZE :: 16 MAX_GLOBAL_PRIORITY_SIZE_EXT :: MAX_GLOBAL_PRIORITY_SIZE QUEUE_FAMILY_EXTERNAL :: MAX_QUEUE_FAMILY_EXTERNAL +// Vulkan Video API Constants +VULKAN_VIDEO_CODEC_AV1_DECODE_API_VERSION_1_0_0 :: (1<<22) | (0<<12) | (0) +VULKAN_VIDEO_CODEC_AV1_ENCODE_API_VERSION_1_0_0 :: (1<<22) | (0<<12) | (0) +VULKAN_VIDEO_CODEC_H264_ENCODE_API_VERSION_1_0_0 :: (1<<22) | (0<<12) | (0) +VULKAN_VIDEO_CODEC_H264_DECODE_API_VERSION_1_0_0 :: (1<<22) | (0<<12) | (0) +VULKAN_VIDEO_CODEC_H265_DECODE_API_VERSION_1_0_0 :: (1<<22) | (0<<12) | (0) +VULKAN_VIDEO_CODEC_H265_ENCODE_API_VERSION_1_0_0 :: (1<<22) | (0<<12) | (0) + +VULKAN_VIDEO_CODEC_AV1_DECODE_SPEC_VERSION :: VULKAN_VIDEO_CODEC_AV1_DECODE_API_VERSION_1_0_0 +VULKAN_VIDEO_CODEC_AV1_ENCODE_SPEC_VERSION :: VULKAN_VIDEO_CODEC_AV1_ENCODE_API_VERSION_1_0_0 +VULKAN_VIDEO_CODEC_H264_ENCODE_SPEC_VERSION :: VULKAN_VIDEO_CODEC_H264_ENCODE_API_VERSION_1_0_0 +VULKAN_VIDEO_CODEC_H264_DECODE_SPEC_VERSION :: VULKAN_VIDEO_CODEC_H264_DECODE_API_VERSION_1_0_0 +VULKAN_VIDEO_CODEC_H265_DECODE_SPEC_VERSION :: VULKAN_VIDEO_CODEC_H265_DECODE_API_VERSION_1_0_0 +VULKAN_VIDEO_CODEC_H265_ENCODE_SPEC_VERSION :: VULKAN_VIDEO_CODEC_H265_ENCODE_API_VERSION_1_0_0 + +MAKE_VIDEO_STD_VERSION :: MAKE_VERSION + """[1::]) parse_constants(f) parse_handles_def(f) diff --git a/vendor/vulkan/core.odin b/vendor/vulkan/core.odin index 3058e9e1f..a335018f9 100644 --- a/vendor/vulkan/core.odin +++ b/vendor/vulkan/core.odin @@ -2,6 +2,7 @@ // Vulkan wrapper generated from "https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/master/include/vulkan/vulkan_core.h" // package vulkan +// Core API API_VERSION_1_0 :: (1<<22) | (0<<12) | (0) API_VERSION_1_1 :: (1<<22) | (1<<12) | (0) API_VERSION_1_2 :: (1<<22) | (2<<12) | (0) @@ -52,6 +53,23 @@ MAX_GLOBAL_PRIORITY_SIZE :: 16 MAX_GLOBAL_PRIORITY_SIZE_EXT :: MAX_GLOBAL_PRIORITY_SIZE QUEUE_FAMILY_EXTERNAL :: MAX_QUEUE_FAMILY_EXTERNAL +// Vulkan Video API Constants +VULKAN_VIDEO_CODEC_AV1_DECODE_API_VERSION_1_0_0 :: (1<<22) | (0<<12) | (0) +VULKAN_VIDEO_CODEC_AV1_ENCODE_API_VERSION_1_0_0 :: (1<<22) | (0<<12) | (0) +VULKAN_VIDEO_CODEC_H264_ENCODE_API_VERSION_1_0_0 :: (1<<22) | (0<<12) | (0) +VULKAN_VIDEO_CODEC_H264_DECODE_API_VERSION_1_0_0 :: (1<<22) | (0<<12) | (0) +VULKAN_VIDEO_CODEC_H265_DECODE_API_VERSION_1_0_0 :: (1<<22) | (0<<12) | (0) +VULKAN_VIDEO_CODEC_H265_ENCODE_API_VERSION_1_0_0 :: (1<<22) | (0<<12) | (0) + +VULKAN_VIDEO_CODEC_AV1_DECODE_SPEC_VERSION :: VULKAN_VIDEO_CODEC_AV1_DECODE_API_VERSION_1_0_0 +VULKAN_VIDEO_CODEC_AV1_ENCODE_SPEC_VERSION :: VULKAN_VIDEO_CODEC_AV1_ENCODE_API_VERSION_1_0_0 +VULKAN_VIDEO_CODEC_H264_ENCODE_SPEC_VERSION :: VULKAN_VIDEO_CODEC_H264_ENCODE_API_VERSION_1_0_0 +VULKAN_VIDEO_CODEC_H264_DECODE_SPEC_VERSION :: VULKAN_VIDEO_CODEC_H264_DECODE_API_VERSION_1_0_0 +VULKAN_VIDEO_CODEC_H265_DECODE_SPEC_VERSION :: VULKAN_VIDEO_CODEC_H265_DECODE_API_VERSION_1_0_0 +VULKAN_VIDEO_CODEC_H265_ENCODE_SPEC_VERSION :: VULKAN_VIDEO_CODEC_H265_ENCODE_API_VERSION_1_0_0 + +MAKE_VIDEO_STD_VERSION :: MAKE_VERSION + // General Constants HEADER_VERSION :: 303 MAX_DRIVER_NAME_SIZE :: 256 @@ -113,6 +131,14 @@ VIDEO_H265_MAX_DELTA_POC :: 48 VIDEO_H265_NO_REFERENCE_PICTURE :: 0xFF VIDEO_DECODE_H265_REF_PIC_SET_LIST_SIZE :: 8 +// Vulkan Video Codec Constants +VULKAN_VIDEO_CODEC_AV1_DECODE_EXTENSION_NAME :: "VK_STD_vulkan_video_codec_av1_decode" +VULKAN_VIDEO_CODEC_AV1_ENCODE_EXTENSION_NAME :: "VK_STD_vulkan_video_codec_av1_encode" +VULKAN_VIDEO_CODEC_H264_DECODE_EXTENSION_NAME :: "VK_STD_vulkan_video_codec_h264_decode" +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" + // Vendor Constants KHR_surface :: 1 KHR_SURFACE_SPEC_VERSION :: 25 From d02f57556139674cb2d842c6b0fbf58ab9179904 Mon Sep 17 00:00:00 2001 From: shashank Date: Sun, 8 Dec 2024 21:41:01 +0530 Subject: [PATCH 041/431] change pointer arg to multipointer in GetDisplayModeList and GetDisplayModeList1 --- vendor/directx/dxgi/dxgi.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vendor/directx/dxgi/dxgi.odin b/vendor/directx/dxgi/dxgi.odin index 5b6137cee..66201c494 100644 --- a/vendor/directx/dxgi/dxgi.odin +++ b/vendor/directx/dxgi/dxgi.odin @@ -554,7 +554,7 @@ IOutput :: struct #raw_union { IOutput_VTable :: struct { using idxgiobject_vtable: IObject_VTable, GetDesc: proc "system" (this: ^IOutput, pDesc: ^OUTPUT_DESC) -> HRESULT, - GetDisplayModeList: proc "system" (this: ^IOutput, EnumFormat: FORMAT, Flags: ENUM_MODES, pNumModes: ^u32, pDesc: ^MODE_DESC) -> HRESULT, + GetDisplayModeList: proc "system" (this: ^IOutput, EnumFormat: FORMAT, Flags: ENUM_MODES, pNumModes: ^u32, pDesc: [^]MODE_DESC) -> HRESULT, FindClosestMatchingMode: proc "system" (this: ^IOutput, pModeToMatch: ^MODE_DESC, pClosestMatch: ^MODE_DESC, pConcernedDevice: ^IUnknown) -> HRESULT, WaitForVBlank: proc "system" (this: ^IOutput) -> HRESULT, TakeOwnership: proc "system" (this: ^IOutput, pDevice: ^IUnknown, Exclusive: BOOL) -> HRESULT, @@ -934,7 +934,7 @@ IOutput1 :: struct #raw_union { } IOutput1_VTable :: struct { using idxgioutput_vtable: IOutput_VTable, - GetDisplayModeList1: proc "system" (this: ^IOutput1, EnumFormat: FORMAT, Flags: ENUM_MODES, pNumModes: ^u32, pDesc: ^MODE_DESC1) -> HRESULT, + GetDisplayModeList1: proc "system" (this: ^IOutput1, EnumFormat: FORMAT, Flags: ENUM_MODES, pNumModes: ^u32, pDesc: [^]MODE_DESC1) -> HRESULT, FindClosestMatchingMode1: proc "system" (this: ^IOutput1, pModeToMatch: ^MODE_DESC1, pClosestMatch: ^MODE_DESC1, pConcernedDevice: ^IUnknown) -> HRESULT, GetDisplaySurfaceData1: proc "system" (this: ^IOutput1, pDestination: ^IResource) -> HRESULT, DuplicateOutput: proc "system" (this: ^IOutput1, pDevice: ^IUnknown, ppOutputDuplication: ^^IOutputDuplication) -> HRESULT, From c8f0d27ceecaaa4d9803ae7fd0fea69ca5aff227 Mon Sep 17 00:00:00 2001 From: Laytan Laats Date: Mon, 9 Dec 2024 19:12:42 +0100 Subject: [PATCH 042/431] compiler: remove viral `#force(_no)_inline` If a procedure was marked `#force_no_inline`, any procedure calls within it would also implicitly be. This is not expected for multiple reasons: 1. `#force(_no)_inline` on a call expr works differently than on a procedure literal. 2. Adding the attribute on it and every called proc blows up the amount of work for the inliner pass and may increase the time it takes. 3. Putting `#force_no_inline` on a procedure to keep executable size down (like we do for some map procedures), benchmark it, or find it in asm/ir has the added effect of slowing those procedures down significantly and not representing truth. --- src/llvm_backend_proc.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index fee825a2f..712e13592 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -1136,10 +1136,6 @@ gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array c } } - if (inlining == ProcInlining_none) { - inlining = p->inlining; - } - Type *rt = reduce_tuple_to_single_type(results); Type *original_rt = rt; if (split_returns) { From 6bcfafc3a8885966f5ae11983813698a1293e282 Mon Sep 17 00:00:00 2001 From: GonkieDev Date: Wed, 11 Dec 2024 21:02:43 +0000 Subject: [PATCH 043/431] typo fixed (MOUSE_ATTRIUBTTES_CHANGED -> MOUSE_ATTRIBUTES_CHANGED) --- core/sys/windows/user32.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index 4ae33cd32..957d6ab70 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -548,7 +548,7 @@ RI_KEY_TERMSRV_SHADOW :: 0x10 MOUSE_MOVE_RELATIVE :: 0x00 MOUSE_MOVE_ABSOLUTE :: 0x01 MOUSE_VIRTUAL_DESKTOP :: 0x02 -MOUSE_ATTRIUBTTES_CHANGED :: 0x04 +MOUSE_ATTRIBUTES_CHANGED :: 0x04 MOUSE_MOVE_NOCOALESCE :: 0x08 RI_MOUSE_BUTTON_1_DOWN :: 0x0001 From 0a29d36aa3ddaa9d56d2e31bfec1a6f65487b387 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Dec 2024 15:44:49 +0000 Subject: [PATCH 044/431] Fix bug with comparisons with big endian types --- src/llvm_backend_expr.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 1247eed76..9c325e088 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -2817,6 +2817,12 @@ gb_internal lbValue lb_emit_comp(lbProcedure *p, TokenKind op_kind, lbValue left Type *it = bit_set_to_int(a); lbValue lhs = lb_emit_transmute(p, left, it); lbValue rhs = lb_emit_transmute(p, right, it); + if (is_type_different_to_arch_endianness(it)) { + it = integer_endian_type_to_platform_type(it); + lhs = lb_emit_byte_swap(p, lhs, it); + rhs = lb_emit_byte_swap(p, rhs, it); + } + lbValue res = lb_emit_arith(p, Token_And, lhs, rhs, it); if (op_kind == Token_Lt || op_kind == Token_LtEq) { @@ -2914,6 +2920,12 @@ gb_internal lbValue lb_emit_comp(lbProcedure *p, TokenKind op_kind, lbValue left } } + if (is_type_different_to_arch_endianness(left.type)) { + Type *pt = integer_endian_type_to_platform_type(left.type); + lhs = lb_emit_byte_swap(p, {lhs, pt}, pt).value; + rhs = lb_emit_byte_swap(p, {rhs, pt}, pt).value; + } + res.value = LLVMBuildICmp(p->builder, pred, lhs, rhs, ""); } else if (is_type_float(a)) { LLVMRealPredicate pred = {}; @@ -2925,6 +2937,13 @@ gb_internal lbValue lb_emit_comp(lbProcedure *p, TokenKind op_kind, lbValue left case Token_LtEq: pred = LLVMRealOLE; break; case Token_NotEq: pred = LLVMRealONE; break; } + + if (is_type_different_to_arch_endianness(left.type)) { + Type *pt = integer_endian_type_to_platform_type(left.type); + left = lb_emit_byte_swap(p, left, pt); + right = lb_emit_byte_swap(p, right, pt); + } + res.value = LLVMBuildFCmp(p->builder, pred, left.value, right.value, ""); } else if (is_type_typeid(a)) { LLVMIntPredicate pred = {}; From 6785a485e3cdb330f1df4124b2ae9a1c48faff31 Mon Sep 17 00:00:00 2001 From: Giuliano Macedo Date: Sun, 8 Dec 2024 16:20:09 -0300 Subject: [PATCH 045/431] docs: improved reinterpret docstring --- core/slice/slice.odin | 47 ++++++++++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/core/slice/slice.odin b/core/slice/slice.odin index c31edf281..66166bddb 100644 --- a/core/slice/slice.odin +++ b/core/slice/slice.odin @@ -48,22 +48,41 @@ to_type :: proc(buf: []u8, $T: typeid) -> (T, bool) #optional_ok { } /* - Turn a slice of one type, into a slice of another type. +Turn a slice of one type, into a slice of another type. - Only converts the type and length of the slice itself. - The length is rounded down to the nearest whole number of items. +Only converts the type and length of the slice itself. +The length is rounded down to the nearest whole number of items. + +Example: + + import "core:fmt" + import "core:slice" + + i64s_as_i32s :: proc() { + large_items := []i64{1, 2, 3, 4} + small_items := slice.reinterpret([]i32, large_items) + assert(len(small_items) == 8) + fmt.println(large_items, "->", small_items) + } + + bytes_as_i64s :: proc() { + small_items := [12]byte{} + small_items[0] = 1 + small_items[8] = 2 + large_items := slice.reinterpret([]i64, small_items[:]) + assert(len(large_items) == 1) // only enough bytes to make 1 x i64; two would need at least 8 bytes. + fmt.println(small_items, "->", large_items) + } + + reinterpret_example :: proc() { + i64s_as_i32s() + bytes_as_i64s() + } + +Output: + [1, 2, 3, 4] -> [1, 0, 2, 0, 3, 0, 4, 0] + [1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0] -> [1] - ``` - large_items := []i64{1, 2, 3, 4} - small_items := slice.reinterpret([]i32, large_items) - assert(len(small_items) == 8) - ``` - ``` - small_items := []byte{1, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0} - large_items := slice.reinterpret([]i64, small_items) - assert(len(large_items) == 1) // only enough bytes to make 1 x i64; two would need at least 8 bytes. - ``` */ @(require_results) reinterpret :: proc "contextless" ($T: typeid/[]$U, s: []$V) -> []U { From c64f13a0eb9cf6f1af64efadc24a2d1bf4352bdd Mon Sep 17 00:00:00 2001 From: wrapperup Date: Mon, 16 Dec 2024 18:34:22 -0500 Subject: [PATCH 046/431] use bit sets in miniaudio for flags --- vendor/miniaudio/device_io_types.odin | 15 +++++--- vendor/miniaudio/engine.odin | 52 +++++++++++++------------- vendor/miniaudio/job_queue.odin | 14 ++++--- vendor/miniaudio/node_graph.odin | 24 ++++++++---- vendor/miniaudio/resource_manager.odin | 20 ++++++---- vendor/miniaudio/utilities.odin | 10 ++++- vendor/miniaudio/vfs.odin | 16 ++++---- 7 files changed, 90 insertions(+), 61 deletions(-) diff --git a/vendor/miniaudio/device_io_types.odin b/vendor/miniaudio/device_io_types.odin index eae804720..0571714d2 100644 --- a/vendor/miniaudio/device_io_types.odin +++ b/vendor/miniaudio/device_io_types.odin @@ -351,8 +351,13 @@ device_id :: struct #raw_union { nullbackend: c.int, /* The null backend uses an integer for device IDs. */ } +data_format_flag :: enum c.int { + EXCLUSIVE_MODE = 1, /* If set, this is supported in exclusive mode. Otherwise not natively supported by exclusive mode. */ +} -DATA_FORMAT_FLAG_EXCLUSIVE_MODE :: 1 << 1 /* If set, this is supported in exclusive mode. Otherwise not natively supported by exclusive mode. */ +data_format_flags :: bit_set[data_format_flag; u32] + +DATA_FORMAT_FLAG_EXCLUSIVE_MODE :: data_format_flags{.EXCLUSIVE_MODE} MAX_DEVICE_NAME_LENGTH :: 255 @@ -364,10 +369,10 @@ device_info :: struct { nativeDataFormatCount: u32, nativeDataFormats: [/*len(format_count) * standard_sample_rate.rate_count * MAX_CHANNELS*/ 64]struct { /* Not sure how big to make this. There can be *many* permutations for virtual devices which can support anything. */ - format: format, /* Sample format. If set to ma_format_unknown, all sample formats are supported. */ - channels: u32, /* If set to 0, all channels are supported. */ - sampleRate: u32, /* If set to 0, all sample rates are supported. */ - flags: u32, /* A combination of MA_DATA_FORMAT_FLAG_* flags. */ + format: format, /* Sample format. If set to ma_format_unknown, all sample formats are supported. */ + channels: u32, /* If set to 0, all channels are supported. */ + sampleRate: u32, /* If set to 0, all sample rates are supported. */ + flags: data_format_flags, /* A combination of MA_DATA_FORMAT_FLAG_* flags. */ }, } diff --git a/vendor/miniaudio/engine.odin b/vendor/miniaudio/engine.odin index ecd3fb39d..467bde583 100644 --- a/vendor/miniaudio/engine.odin +++ b/vendor/miniaudio/engine.odin @@ -11,20 +11,22 @@ Engine ************************************************************************************************************************************************************/ /* Sound flags. */ -sound_flags :: enum c.int { +sound_flag :: enum c.int { /* Resource manager flags. */ - STREAM = 0x00000001, /* MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM */ - DECODE = 0x00000002, /* MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_DECODE */ - ASYNC = 0x00000004, /* MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC */ - WAIT_INIT = 0x00000008, /* MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT */ - UNKNOWN_LENGTH = 0x00000010, /* MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_UNKNOWN_LENGTH */ + STREAM = 0, /* MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM */ + DECODE = 1, /* MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_DECODE */ + ASYNC = 2, /* MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC */ + WAIT_INIT = 3, /* MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT */ + UNKNOWN_LENGTH = 4, /* MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_UNKNOWN_LENGTH */ /* ma_sound specific flags. */ - NO_DEFAULT_ATTACHMENT = 0x00001000, /* Do not attach to the endpoint by default. Useful for when setting up nodes in a complex graph system. */ - NO_PITCH = 0x00002000, /* Disable pitch shifting with ma_sound_set_pitch() and ma_sound_group_set_pitch(). This is an optimization. */ - NO_SPATIALIZATION = 0x00004000, /* Disable spatialization. */ + NO_DEFAULT_ATTACHMENT = 12, /* Do not attach to the endpoint by default. Useful for when setting up nodes in a complex graph system. */ + NO_PITCH = 13, /* Disable pitch shifting with ma_sound_set_pitch() and ma_sound_group_set_pitch(). This is an optimization. */ + NO_SPATIALIZATION = 14, /* Disable spatialization. */ } +sound_flags :: bit_set[sound_flag; u32] + ENGINE_MAX_LISTENERS :: 4 LISTENER_INDEX_CLOSEST :: 255 @@ -81,7 +83,7 @@ engine_node :: struct { @(default_calling_convention="c", link_prefix="ma_") foreign lib { - engine_node_config_init :: proc(pEngine: ^engine, type: engine_node_type, flags: u32) -> engine_node_config --- + engine_node_config_init :: proc(pEngine: ^engine, type: engine_node_type, flags: sound_flags) -> engine_node_config --- engine_node_get_heap_size :: proc(pConfig: ^engine_node_config, pHeapSizeInBytes: ^c.size_t) -> result --- engine_node_init_preallocated :: proc(pConfig: ^engine_node_config, pHeap: rawptr, pEngineNode: ^engine_node) -> result --- @@ -96,17 +98,17 @@ SOUND_SOURCE_CHANNEL_COUNT :: 0xFFFFFFFF sound_end_proc :: #type proc "c" (pUserData: rawptr, pSound: ^sound) sound_config :: struct { - pFilePath: cstring, /* Set this to load from the resource manager. */ - pFilePathW: [^]c.wchar_t, /* Set this to load from the resource manager. */ - pDataSource: ^data_source, /* Set this to load from an existing data source. */ - pInitialAttachment: ^node, /* If set, the sound will be attached to an input of this node. This can be set to a ma_sound. If set to NULL, the sound will be attached directly to the endpoint unless MA_SOUND_FLAG_NO_DEFAULT_ATTACHMENT is set in `flags`. */ - initialAttachmentInputBusIndex: u32, /* The index of the input bus of pInitialAttachment to attach the sound to. */ - channelsIn: u32, /* Ignored if using a data source as input (the data source's channel count will be used always). Otherwise, setting to 0 will cause the engine's channel count to be used. */ - channelsOut: u32, /* Set this to 0 (default) to use the engine's channel count. Set to MA_SOUND_SOURCE_CHANNEL_COUNT to use the data source's channel count (only used if using a data source as input). */ + pFilePath: cstring, /* Set this to load from the resource manager. */ + pFilePathW: [^]c.wchar_t, /* Set this to load from the resource manager. */ + pDataSource: ^data_source, /* Set this to load from an existing data source. */ + pInitialAttachment: ^node, /* If set, the sound will be attached to an input of this node. This can be set to a ma_sound. If set to NULL, the sound will be attached directly to the endpoint unless MA_SOUND_FLAG_NO_DEFAULT_ATTACHMENT is set in `flags`. */ + initialAttachmentInputBusIndex: u32, /* The index of the input bus of pInitialAttachment to attach the sound to. */ + channelsIn: u32, /* Ignored if using a data source as input (the data source's channel count will be used always). Otherwise, setting to 0 will cause the engine's channel count to be used. */ + channelsOut: u32, /* Set this to 0 (default) to use the engine's channel count. Set to MA_SOUND_SOURCE_CHANNEL_COUNT to use the data source's channel count (only used if using a data source as input). */ monoExpansionMode: mono_expansion_mode, /* Controls how the mono channel should be expanded to other channels when spatialization is disabled on a sound. */ - flags: u32, /* A combination of MA_SOUND_FLAG_* flags. */ - volumeSmoothTimeInPCMFrames: u32, /* The number of frames to smooth over volume changes. Defaults to 0 in which case no smoothing is used. */ - initialSeekPointInPCMFrames: u64, /* Initializes the sound such that it's seeked to this location by default. */ + flags: sound_flags, /* A combination of MA_SOUND_FLAG_* flags. */ + volumeSmoothTimeInPCMFrames: u32, /* The number of frames to smooth over volume changes. Defaults to 0 in which case no smoothing is used. */ + initialSeekPointInPCMFrames: u64, /* Initializes the sound such that it's seeked to this location by default. */ rangeBegInPCMFrames: u64, rangeEndInPCMFrames: u64, loopPointBegInPCMFrames: u64, @@ -152,10 +154,10 @@ foreign lib { sound_config_init :: proc() -> sound_config --- sound_config_init2 :: proc(pEngine: ^engine) -> sound_config --- /* Will be renamed to sound_config_init() in version 0.12. */ - sound_init_from_file :: proc(pEngine: ^engine, pFilePath: cstring, flags: u32, pGroup: ^sound_group, pDoneFence: ^fence, pSound: ^sound) -> result --- - sound_init_from_file_w :: proc(pEngine: ^engine, pFilePath: [^]c.wchar_t, flags: u32, pGroup: ^sound_group, pDoneFence: ^fence, pSound: ^sound) -> result --- - sound_init_copy :: proc(pEngine: ^engine, pExistingSound: ^sound, flags: u32, pGroup: ^sound_group, pSound: ^sound) -> result --- - sound_init_from_data_source :: proc(pEngine: ^engine, pDataSource: ^data_source, flags: u32, pGroup: ^sound_group, pSound: ^sound) -> result --- + sound_init_from_file :: proc(pEngine: ^engine, pFilePath: cstring, flags: sound_flags, pGroup: ^sound_group, pDoneFence: ^fence, pSound: ^sound) -> result --- + sound_init_from_file_w :: proc(pEngine: ^engine, pFilePath: [^]c.wchar_t, flags: sound_flags, pGroup: ^sound_group, pDoneFence: ^fence, pSound: ^sound) -> result --- + sound_init_copy :: proc(pEngine: ^engine, pExistingSound: ^sound, flags: sound_flags, pGroup: ^sound_group, pSound: ^sound) -> result --- + sound_init_from_data_source :: proc(pEngine: ^engine, pDataSource: ^data_source, flags: sound_flags, pGroup: ^sound_group, pSound: ^sound) -> result --- sound_init_ex :: proc(pEngine: ^engine, pConfig: ^sound_config, pSound: ^sound) -> result --- sound_uninit :: proc(pSound: ^sound) --- sound_get_engine :: proc(pSound: ^sound) -> ^engine --- @@ -243,7 +245,7 @@ foreign lib { sound_group_config_init :: proc() -> sound_group_config --- sound_group_config_init2 :: proc(pEngine: ^engine) -> sound_group_config --- - sound_group_init :: proc(pEngine: ^engine, flags: u32, pParentGroup, pGroup: ^sound_group) -> result --- + sound_group_init :: proc(pEngine: ^engine, flags: sound_flags, pParentGroup, pGroup: ^sound_group) -> result --- sound_group_init_ex :: proc(pEngine: ^engine, pConfig: ^sound_group_config, pGroup: ^sound_group) -> result --- sound_group_uninit :: proc(pGroup: ^sound_group) --- sound_group_get_engine :: proc(pGroup: ^sound_group) -> ^engine --- diff --git a/vendor/miniaudio/job_queue.odin b/vendor/miniaudio/job_queue.odin index 01ee31216..b5816a95a 100644 --- a/vendor/miniaudio/job_queue.odin +++ b/vendor/miniaudio/job_queue.odin @@ -108,7 +108,7 @@ job :: struct { pDataBufferNode: rawptr /*ma_resource_manager_data_buffer_node**/, pFilePath: cstring, pFilePathW: [^]c.wchar_t, - flags: u32, /* Resource manager data source flags that were used when initializing the data buffer. */ + flags: resource_manager_data_source_flags, /* Resource manager data source flags that were used when initializing the data buffer. */ pInitNotification: ^async_notification, /* Signalled when the data buffer has been initialized and the format/channels/rate can be retrieved. */ pDoneNotification: ^async_notification, /* Signalled when the data buffer has been fully decoded. Will be passed through to MA_JOB_TYPE_RESOURCE_MANAGER_PAGE_DATA_BUFFER_NODE when decoding. */ pInitFence: ^fence, /* Released when initialization of the decoder is complete. */ @@ -194,19 +194,21 @@ ma_job_queue_post(). ma_job_queue_next() will return MA_NO_DATA_AVAILABLE if not This flag should always be used for platforms that do not support multithreading. */ -job_queue_flags :: enum c.int { - NON_BLOCKING = 0x00000001, +job_queue_flag :: enum c.int { + NON_BLOCKING = 0, } +job_queue_flags :: bit_set[job_queue_flag; u32] + job_queue_config :: struct { - flags: u32, + flags: job_queue_flags, capacity: u32, /* The maximum number of jobs that can fit in the queue at a time. */ } USE_EXPERIMENTAL_LOCK_FREE_JOB_QUEUE :: false job_queue :: struct { - flags: u32, /* Flags passed in at initialization time. */ + flags: job_queue_flags, /* Flags passed in at initialization time. */ capacity: u32, /* The maximum number of jobs that can fit in the queue at a time. Set by the config. */ head: u64, /*atomic*/ /* The first item in the list. Required for removing from the top of the list. */ tail: u64, /*atomic*/ /* The last item in the list. Required for appending to the end of the list. */ @@ -222,7 +224,7 @@ job_queue :: struct { @(default_calling_convention="c", link_prefix="ma_") foreign lib { - job_queue_config_init :: proc(flags, capacity: u32) -> job_queue_config --- + job_queue_config_init :: proc(flags: job_queue_flags, capacity: u32) -> job_queue_config --- job_queue_get_heap_size :: proc(pConfig: ^job_queue_config, pHeapSizeInBytes: ^c.size_t) -> result --- job_queue_init_preallocated :: proc(pConfig: ^job_queue_config, pHeap: rawptr, pQueue: ^job_queue) -> result --- diff --git a/vendor/miniaudio/node_graph.odin b/vendor/miniaudio/node_graph.odin index 63482413b..610ada7a8 100644 --- a/vendor/miniaudio/node_graph.odin +++ b/vendor/miniaudio/node_graph.odin @@ -22,14 +22,16 @@ NODE_BUS_COUNT_UNKNOWN :: 255 node :: struct {} /* Node flags. */ -node_flags :: enum c.int { - PASSTHROUGH = 0x00000001, - CONTINUOUS_PROCESSING = 0x00000002, - ALLOW_NULL_INPUT = 0x00000004, - DIFFERENT_PROCESSING_RATES = 0x00000008, - SILENT_OUTPUT = 0x00000010, +node_flag :: enum c.int { + PASSTHROUGH = 0, + CONTINUOUS_PROCESSING = 1, + ALLOW_NULL_INPUT = 2, + DIFFERENT_PROCESSING_RATES = 3, + SILENT_OUTPUT = 4, } +node_flags :: bit_set[node_flag; u32] + /* The playback state of a node. Either started or stopped. */ node_state :: enum c.int { started = 0, @@ -75,7 +77,7 @@ node_vtable :: struct { Flags describing characteristics of the node. This is currently just a placeholder for some ideas for later on. */ - flags: u32, + flags: node_flags, } node_config :: struct { @@ -87,6 +89,12 @@ node_config :: struct { pOutputChannels: ^u32, /* The number of elements are determined by the output bus count as determined by the vtable, or `outputBusCount` if the vtable specifies `MA_NODE_BUS_COUNT_UNKNOWN`. */ } +node_output_bus_flag :: enum c.int { + HAS_READ = 0, /* 0x01 */ +} + +node_output_bus_flags :: bit_set[node_output_bus_flag; u32] + /* A node has multiple output buses. An output bus is attached to an input bus as an item in a linked list. Think of the input bus as a linked list, with the output bus being an item in that list. @@ -99,7 +107,7 @@ node_output_bus :: struct { /* Mutable via multiple threads. Must be used atomically. The weird ordering here is for packing reasons. */ inputNodeInputBusIndex: u8, /* The index of the input bus on the input. Required for detaching. Will only be used in the spinlock so does not need to be atomic. */ - flags: u32, /*atomic*/ /* Some state flags for tracking the read state of the output buffer. A combination of MA_NODE_OUTPUT_BUS_FLAG_*. */ + flags: node_output_bus_flags, /*atomic*/ /* Some state flags for tracking the read state of the output buffer. A combination of MA_NODE_OUTPUT_BUS_FLAG_*. */ refCount: u32, /*atomic*/ /* Reference count for some thread-safety when detaching. */ isAttached: b32, /*atomic*/ /* This is used to prevent iteration of nodes that are in the middle of being detached. Used for thread safety. */ lock: spinlock, /*atomic*/ /* Unfortunate lock, but significantly simplifies the implementation. Required for thread-safe attaching and detaching. */ diff --git a/vendor/miniaudio/resource_manager.odin b/vendor/miniaudio/resource_manager.odin index 0284db86b..0c0a309d1 100644 --- a/vendor/miniaudio/resource_manager.odin +++ b/vendor/miniaudio/resource_manager.odin @@ -10,14 +10,16 @@ Resource Manager ************************************************************************************************************************************************************/ -resource_manager_data_source_flags :: enum c.int { - STREAM = 0x00000001, /* When set, does not load the entire data source in memory. Disk I/O will happen on job threads. */ - DECODE = 0x00000002, /* Decode data before storing in memory. When set, decoding is done at the resource manager level rather than the mixing thread. Results in faster mixing, but higher memory usage. */ - ASYNC = 0x00000004, /* When set, the resource manager will load the data source asynchronously. */ - WAIT_INIT = 0x00000008, /* When set, waits for initialization of the underlying data source before returning from ma_resource_manager_data_source_init(). */ - UNKNOWN_LENGTH = 0x00000010, /* Gives the resource manager a hint that the length of the data source is unknown and calling `ma_data_source_get_length_in_pcm_frames()` should be avoided. */ +resource_manager_data_source_flag :: enum c.int { + STREAM = 0, /* When set, does not load the entire data source in memory. Disk I/O will happen on job threads. */ + DECODE = 1, /* Decode data before storing in memory. When set, decoding is done at the resource manager level rather than the mixing thread. Results in faster mixing, but higher memory usage. */ + ASYNC = 2, /* When set, the resource manager will load the data source asynchronously. */ + WAIT_INIT = 3, /* When set, waits for initialization of the underlying data source before returning from ma_resource_manager_data_source_init(). */ + UNKNOWN_LENGTH = 4, /* Gives the resource manager a hint that the length of the data source is unknown and calling `ma_data_source_get_length_in_pcm_frames()` should be avoided. */ } +resource_manager_data_source_flags :: bit_set[resource_manager_data_source_flag; u32] + /* Pipeline notifications used by the resource manager. Made up of both an async notification and a fence, both of which are optional. */ @@ -58,7 +60,7 @@ resource_manager_job_queue_next :: job_queue_next /* Maximum job thread count will be restricted to this, but this may be removed later and replaced with a heap allocation thereby removing any limitation. */ RESOURCE_MANAGER_MAX_JOB_THREAD_COUNT :: 64 -resource_manager_flags :: enum c.int { +resource_manager_flag :: enum c.int { /* Indicates ma_resource_manager_next_job() should not block. Only valid when the job thread count is 0. */ NON_BLOCKING = 0x00000001, @@ -66,6 +68,8 @@ resource_manager_flags :: enum c.int { NO_THREADING = 0x00000002, } +resource_manager_flags :: bit_set[resource_manager_flag; u32] + resource_manager_data_source_config :: struct { pFilePath: cstring, pFilePathW: [^]c.wchar_t, @@ -126,7 +130,7 @@ resource_manager_data_buffer :: struct { ds: data_source_base, /* Base data source. A data buffer is a data source. */ pResourceManager: ^resource_manager, /* A pointer to the resource manager that owns this buffer. */ pNode: ^resource_manager_data_buffer_node, /* The data node. This is reference counted and is what supplies the data. */ - flags: u32, /* The flags that were passed used to initialize the buffer. */ + flags: resource_manager_flags, /* The flags that were passed used to initialize the buffer. */ executionCounter: u32, /*atomic*/ /* For allocating execution orders for jobs. */ executionPointer: u32, /*atomic*/ /* For managing the order of execution for asynchronous jobs relating to this object. Incremented as jobs complete processing. */ seekTargetInPCMFrames: u64, /* Only updated by the public API. Never written nor read from the job thread. */ diff --git a/vendor/miniaudio/utilities.odin b/vendor/miniaudio/utilities.odin index 8728f40dc..d9d23ad83 100644 --- a/vendor/miniaudio/utilities.odin +++ b/vendor/miniaudio/utilities.odin @@ -119,7 +119,13 @@ offset_pcm_frames_const_ptr_f32 :: #force_inline proc "c" (p: [^]f32, offsetInFr data_source :: struct {} -DATA_SOURCE_SELF_MANAGED_RANGE_AND_LOOP_POINT :: 0x00000001 +data_source_flag :: enum c.int { + SELF_MANAGED_RANGE_AND_LOOP_POINT = 0, +} + +data_source_flags :: bit_set[data_source_flag; u32] + +DATA_SOURCE_SELF_MANAGED_RANGE_AND_LOOP_POINT :: data_source_flags{.SELF_MANAGED_RANGE_AND_LOOP_POINT} data_source_vtable :: struct { onRead: proc "c" (pDataSource: ^data_source, pFramesOut: rawptr, frameCount: u64, pFramesRead: ^u64) -> result, @@ -128,7 +134,7 @@ data_source_vtable :: struct { onGetCursor: proc "c" (pDataSource: ^data_source, pCursor: ^u64) -> result, onGetLength: proc "c" (pDataSource: ^data_source, pLength: ^u64) -> result, onSetLooping: proc "c" (pDataSource: ^data_source, isLooping: b32) -> result, - flags: u32, + flags: data_source_flags, } data_source_get_next_proc :: proc "c" (pDataSource: ^data_source) -> ^data_source diff --git a/vendor/miniaudio/vfs.odin b/vendor/miniaudio/vfs.odin index b045a1501..2a538c6e3 100644 --- a/vendor/miniaudio/vfs.odin +++ b/vendor/miniaudio/vfs.odin @@ -16,11 +16,13 @@ appropriate for a given situation. vfs :: struct {} vfs_file :: distinct handle -open_mode_flags :: enum c.int { - READ = 0x00000001, - WRITE = 0x00000002, +open_mode_flag :: enum c.int { + READ = 0, + WRITE = 1, } +open_mode_flags :: bit_set[open_mode_flag; u32] + seek_origin :: enum c.int { start, current, @@ -32,8 +34,8 @@ file_info :: struct { } vfs_callbacks :: struct { - onOpen: proc "c" (pVFS: ^vfs, pFilePath: cstring, openMode: u32, pFile: ^vfs_file) -> result, - onOpenW: proc "c" (pVFS: ^vfs, pFilePath: [^]c.wchar_t, openMode: u32, pFile: ^vfs_file) -> result, + onOpen: proc "c" (pVFS: ^vfs, pFilePath: cstring, openMode: open_mode_flags, pFile: ^vfs_file) -> result, + onOpenW: proc "c" (pVFS: ^vfs, pFilePath: [^]c.wchar_t, openMode: open_mode_flags, pFile: ^vfs_file) -> result, onClose: proc "c" (pVFS: ^vfs, file: vfs_file) -> result, onRead: proc "c" (pVFS: ^vfs, file: vfs_file, pDst: rawptr, sizeInBytes: c.size_t, pBytesRead: ^c.size_t) -> result, onWrite: proc "c" (pVFS: ^vfs, file: vfs_file, pSrc: rawptr, sizeInBytes: c.size_t, pBytesWritten: ^c.size_t) -> result, @@ -54,8 +56,8 @@ ma_tell_proc :: proc "c" (pUserData: rawptr, pCursor: ^i64) -> result @(default_calling_convention="c", link_prefix="ma_") foreign lib { - vfs_open :: proc(pVFS: ^vfs, pFilePath: cstring, openMode: u32, pFile: ^vfs_file) -> result --- - vfs_open_w :: proc(pVFS: ^vfs, pFilePath: [^]c.wchar_t, openMode: u32, pFile: ^vfs_file) -> result --- + vfs_open :: proc(pVFS: ^vfs, pFilePath: cstring, openMode: open_mode_flags, pFile: ^vfs_file) -> result --- + vfs_open_w :: proc(pVFS: ^vfs, pFilePath: [^]c.wchar_t, openMode: open_mode_flags, pFile: ^vfs_file) -> result --- vfs_close :: proc(pVFS: ^vfs, file: vfs_file) -> result --- vfs_read :: proc(pVFS: ^vfs, file: vfs_file, pDst: rawptr, sizeInBytes: c.size_t, pBytesRead: ^c.size_t) -> result --- vfs_write :: proc(pVFS: ^vfs, file: vfs_file, pSrc: rawptr, sizeInBytes: c.size_t, pBytesWritten: ^c.size_t) -> result --- From 6753946b7a7e7259d7c49f2712761acde1b39123 Mon Sep 17 00:00:00 2001 From: wrapperup Date: Mon, 16 Dec 2024 22:12:20 -0500 Subject: [PATCH 047/431] fix resource_manager_flag enum --- vendor/miniaudio/resource_manager.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vendor/miniaudio/resource_manager.odin b/vendor/miniaudio/resource_manager.odin index 0c0a309d1..495a02c5d 100644 --- a/vendor/miniaudio/resource_manager.odin +++ b/vendor/miniaudio/resource_manager.odin @@ -62,10 +62,10 @@ RESOURCE_MANAGER_MAX_JOB_THREAD_COUNT :: 64 resource_manager_flag :: enum c.int { /* Indicates ma_resource_manager_next_job() should not block. Only valid when the job thread count is 0. */ - NON_BLOCKING = 0x00000001, + NON_BLOCKING = 0, /* Disables any kind of multithreading. Implicitly enables MA_RESOURCE_MANAGER_FLAG_NON_BLOCKING. */ - NO_THREADING = 0x00000002, + NO_THREADING = 1, } resource_manager_flags :: bit_set[resource_manager_flag; u32] From f761dc21022da139656720eb6b3a5890b80d7ea6 Mon Sep 17 00:00:00 2001 From: wrapperup Date: Mon, 16 Dec 2024 22:58:12 -0500 Subject: [PATCH 048/431] cleanup redundant constants --- vendor/miniaudio/device_io_types.odin | 2 -- 1 file changed, 2 deletions(-) diff --git a/vendor/miniaudio/device_io_types.odin b/vendor/miniaudio/device_io_types.odin index 0571714d2..b52a3f423 100644 --- a/vendor/miniaudio/device_io_types.odin +++ b/vendor/miniaudio/device_io_types.odin @@ -357,8 +357,6 @@ data_format_flag :: enum c.int { data_format_flags :: bit_set[data_format_flag; u32] -DATA_FORMAT_FLAG_EXCLUSIVE_MODE :: data_format_flags{.EXCLUSIVE_MODE} - MAX_DEVICE_NAME_LENGTH :: 255 device_info :: struct { From e0b7bfd21ec3f715339fcf6cd6cebf28345a0108 Mon Sep 17 00:00:00 2001 From: Gabriel Pariat Date: Tue, 17 Dec 2024 13:06:59 -0500 Subject: [PATCH 049/431] add trunc to glsl linalg --- core/math/linalg/glsl/linalg_glsl.odin | 16 ++++++++++++++++ core/math/linalg/glsl/linalg_glsl_math.odin | 2 ++ 2 files changed, 18 insertions(+) diff --git a/core/math/linalg/glsl/linalg_glsl.odin b/core/math/linalg/glsl/linalg_glsl.odin index 5444f89e2..ca61891cb 100644 --- a/core/math/linalg/glsl/linalg_glsl.odin +++ b/core/math/linalg/glsl/linalg_glsl.odin @@ -473,6 +473,22 @@ floor :: proc{ @(require_results) floor_dvec3 :: proc "c" (x: dvec3) -> dvec3 { return {floor(x.x), floor(x.y), floor(x.z)} } @(require_results) floor_dvec4 :: proc "c" (x: dvec4) -> dvec4 { return {floor(x.x), floor(x.y), floor(x.z), floor(x.w)} } +trunc :: proc{ + trunc_f32, + trunc_f64, + trunc_vec2, + trunc_vec3, + trunc_vec4, + trunc_dvec2, + trunc_dvec3, + trunc_dvec4, +} +@(require_results) trunc_vec2 :: proc "c" (x: vec2) -> vec2 { return {trunc(x.x), trunc(x.y)} } +@(require_results) trunc_vec3 :: proc "c" (x: vec3) -> vec3 { return {trunc(x.x), trunc(x.y), trunc(x.z)} } +@(require_results) trunc_vec4 :: proc "c" (x: vec4) -> vec4 { return {trunc(x.x), trunc(x.y), trunc(x.z), trunc(x.w)} } +@(require_results) trunc_dvec2 :: proc "c" (x: dvec2) -> dvec2 { return {trunc(x.x), trunc(x.y)} } +@(require_results) trunc_dvec3 :: proc "c" (x: dvec3) -> dvec3 { return {trunc(x.x), trunc(x.y), trunc(x.z)} } +@(require_results) trunc_dvec4 :: proc "c" (x: dvec4) -> dvec4 { return {trunc(x.x), trunc(x.y), trunc(x.z), trunc(x.w)} } round :: proc{ diff --git a/core/math/linalg/glsl/linalg_glsl_math.odin b/core/math/linalg/glsl/linalg_glsl_math.odin index 82b1857ab..b4461ca3b 100644 --- a/core/math/linalg/glsl/linalg_glsl_math.odin +++ b/core/math/linalg/glsl/linalg_glsl_math.odin @@ -23,6 +23,7 @@ import "core:math" @(require_results) exp2_f32 :: proc "c" (x: f32) -> f32 { return math.pow(f32(2), x) } @(require_results) sign_f32 :: proc "c" (x: f32) -> f32 { return math.sign(x) } @(require_results) floor_f32 :: proc "c" (x: f32) -> f32 { return math.floor(x) } +@(require_results) trunc_f32 :: proc "c" (x: f32) -> f32 { return math.trunc(x) } @(require_results) round_f32 :: proc "c" (x: f32) -> f32 { return math.round(x) } @(require_results) ceil_f32 :: proc "c" (x: f32) -> f32 { return math.ceil(x) } @(require_results) mod_f32 :: proc "c" (x, y: f32) -> f32 { return math.mod(x, y) } @@ -55,6 +56,7 @@ fract_f32 :: proc "c" (x: f32) -> f32 { @(require_results) exp2_f64 :: proc "c" (x: f64) -> f64 { return math.pow(f64(2), x) } @(require_results) sign_f64 :: proc "c" (x: f64) -> f64 { return math.sign(x) } @(require_results) floor_f64 :: proc "c" (x: f64) -> f64 { return math.floor(x) } +@(require_results) trunc_f64 :: proc "c" (x: f64) -> f64 { return math.trunc(x) } @(require_results) round_f64 :: proc "c" (x: f64) -> f64 { return math.round(x) } @(require_results) ceil_f64 :: proc "c" (x: f64) -> f64 { return math.ceil(x) } @(require_results) mod_f64 :: proc "c" (x, y: f64) -> f64 { return math.mod(x, y) } From 69bbd8082ae86f6c80aa1c65c723ac3b54998a44 Mon Sep 17 00:00:00 2001 From: Courtney Strachan Date: Tue, 17 Dec 2024 12:13:48 -0800 Subject: [PATCH 050/431] Fixed typo in wgpu.js --- vendor/wgpu/wgpu.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vendor/wgpu/wgpu.js b/vendor/wgpu/wgpu.js index 115a90062..9c43756d7 100644 --- a/vendor/wgpu/wgpu.js +++ b/vendor/wgpu/wgpu.js @@ -1428,7 +1428,7 @@ class WebGPUInterface { * @param {number} workgroupCountY * @param {number} workgroupCountZ */ - wgpuComputePassEncoderDispachWorkgroups: (computePassEncoderIdx, workgroupCountX, workgroupCountY, workgroupCountZ) => { + wgpuComputePassEncoderDispatchWorkgroups: (computePassEncoderIdx, workgroupCountX, workgroupCountY, workgroupCountZ) => { const computePassEncoder = this.computePassEncoders.get(computePassEncoderIdx); computePassEncoder.dispatchWorkgroups(workgroupCountX, workgroupCountY, workgroupCountZ); }, @@ -1438,7 +1438,7 @@ class WebGPUInterface { * @param {number} indirectBufferIdx * @param {BigInt} indirectOffset */ - wgpuComputePassEncoderDispachWorkgroupsIndirect: (computePassEncoderIdx, indirectBufferIdx, indirectOffset) => { + wgpuComputePassEncoderDispatchWorkgroupsIndirect: (computePassEncoderIdx, indirectBufferIdx, indirectOffset) => { const computePassEncoder = this.computePassEncoders.get(computePassEncoderIdx); const indirectBuffer = this.buffers.get(indirectBufferIdx); indirectOffset = this.unwrapBigInt(indirectOffset); From cce2cb79c9a53782e265ff34d49587309d615189 Mon Sep 17 00:00:00 2001 From: imlodinu Date: Thu, 19 Dec 2024 12:23:00 +0800 Subject: [PATCH 051/431] Change single pointers to multipointers, fix UUIDs in d3d11 and d3d12 --- vendor/directx/d3d11/d3d11.odin | 159 +++++++++--------- vendor/directx/d3d12/d3d12.odin | 112 ++++++------ vendor/directx/d3d_compiler/d3d_compiler.odin | 2 +- vendor/directx/dxgi/dxgi.odin | 10 +- 4 files changed, 141 insertions(+), 142 deletions(-) diff --git a/vendor/directx/d3d11/d3d11.odin b/vendor/directx/d3d11/d3d11.odin index 83801e854..3c41d1597 100644 --- a/vendor/directx/d3d11/d3d11.odin +++ b/vendor/directx/d3d11/d3d11.odin @@ -59,15 +59,14 @@ foreign d3d11 { WKPDID_D3DDebugObjectNameW_UUID_STRING :: "4CCA5FD8-921F-42C8-8566-70CAF2A9B741" WKPDID_D3DDebugObjectNameW_UUID := &IID{0x4cca5fd8, 0x921f, 0x42c8, {0x85, 0x66, 0x70, 0xca, 0xf2, 0xa9, 0xb7, 0x41}} -// TODO(bill): Convert these to actual internal UUID -foreign d3d11 { - WKPDID_CommentStringW: GUID -} -@(link_prefix="D3D_") -foreign d3d11 { - TEXTURE_LAYOUT_ROW_MAJOR: GUID - TEXTURE_LAYOUT_64KB_STANDARD_SWIZZLE: GUID -} +WKPDID_CommentStringW_UUID_STRING :: "d0149dc0-90e8-4ec8-8144-e900ad266bb2" +WKPDID_CommentStringW_UUID := &IID{0xd0149dc0, 0x90e8, 0x4ec8, {0x81, 0x44, 0xe9, 0x00, 0xad, 0x26, 0x6b, 0xb2}} + +TEXTURE_LAYOUT_ROW_MAJOR_UUID_STRING :: "b5dc234f-72bb-4bec-9705-8cf258df6b6c" +TEXTURE_LAYOUT_ROW_MAJOR_UUID := &IID{0xb5dc234f, 0x72bb, 0x4bec, {0x97, 0x05, 0x8c, 0xf2, 0x58, 0xdf, 0x6b, 0x6c}} + +TEXTURE_LAYOUT_64KB_STANDARD_SWIZZLE_UUID_STRING :: "4c0f29e3-3f5f-4d35-84c9-bc0983b62c28" +TEXTURE_LAYOUT_64KB_STANDARD_SWIZZLE_UUID := &IID{0x4c0f29e3, 0x3f5f, 0x4d35, {0x84, 0xc9, 0xbc, 0x09, 0x83, 0xb6, 0x2c, 0x28}} @(link_prefix="D3D11_") foreign d3d11 { @@ -2359,45 +2358,45 @@ IDeviceContext :: struct #raw_union { } IDeviceContext_VTable :: struct { using id3d11devicechild_vtable: IDeviceChild_VTable, - VSSetConstantBuffers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumBuffers: u32, ppConstantBuffers: ^^IBuffer), - PSSetShaderResources: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumViews: u32, ppShaderResourceViews: ^^IShaderResourceView), - PSSetShader: proc "system" (this: ^IDeviceContext, pPixelShader: ^IPixelShader, ppClassInstances: ^^IClassInstance, NumClassInstances: u32), - PSSetSamplers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumSamplers: u32, ppSamplers: ^^ISamplerState), - VSSetShader: proc "system" (this: ^IDeviceContext, pVertexShader: ^IVertexShader, ppClassInstances: ^^IClassInstance, NumClassInstances: u32), + VSSetConstantBuffers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumBuffers: u32, ppConstantBuffers: [^]^IBuffer), + PSSetShaderResources: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumViews: u32, ppShaderResourceViews: [^]^IShaderResourceView), + PSSetShader: proc "system" (this: ^IDeviceContext, pPixelShader: ^IPixelShader, ppClassInstances: [^]^IClassInstance, NumClassInstances: u32), + PSSetSamplers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumSamplers: u32, ppSamplers: [^]^ISamplerState), + VSSetShader: proc "system" (this: ^IDeviceContext, pVertexShader: ^IVertexShader, ppClassInstances: [^]^IClassInstance, NumClassInstances: u32), DrawIndexed: proc "system" (this: ^IDeviceContext, IndexCount: u32, StartIndexLocation: u32, BaseVertexLocation: i32), Draw: proc "system" (this: ^IDeviceContext, VertexCount: u32, StartVertexLocation: u32), Map: proc "system" (this: ^IDeviceContext, pResource: ^IResource, Subresource: u32, MapType: MAP, MapFlags: MAP_FLAGS, pMappedResource: ^MAPPED_SUBRESOURCE) -> HRESULT, Unmap: proc "system" (this: ^IDeviceContext, pResource: ^IResource, Subresource: u32), - PSSetConstantBuffers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumBuffers: u32, ppConstantBuffers: ^^IBuffer), + PSSetConstantBuffers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumBuffers: u32, ppConstantBuffers: [^]^IBuffer), IASetInputLayout: proc "system" (this: ^IDeviceContext, pInputLayout: ^IInputLayout), - IASetVertexBuffers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumBuffers: u32, ppVertexBuffers: ^^IBuffer, pStrides: ^u32, pOffsets: ^u32), + IASetVertexBuffers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumBuffers: u32, ppVertexBuffers: [^]^IBuffer, pStrides: [^]u32, pOffsets: [^]u32), IASetIndexBuffer: proc "system" (this: ^IDeviceContext, pIndexBuffer: ^IBuffer, Format: dxgi.FORMAT, Offset: u32), DrawIndexedInstanced: proc "system" (this: ^IDeviceContext, IndexCountPerInstance: u32, InstanceCount: u32, StartIndexLocation: u32, BaseVertexLocation: i32, StartInstanceLocation: u32), DrawInstanced: proc "system" (this: ^IDeviceContext, VertexCountPerInstance: u32, InstanceCount: u32, StartVertexLocation: u32, StartInstanceLocation: u32), - GSSetConstantBuffers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumBuffers: u32, ppConstantBuffers: ^^IBuffer), - GSSetShader: proc "system" (this: ^IDeviceContext, pShader: ^IGeometryShader, ppClassInstances: ^^IClassInstance, NumClassInstances: u32), + GSSetConstantBuffers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumBuffers: u32, ppConstantBuffers: [^]^IBuffer), + GSSetShader: proc "system" (this: ^IDeviceContext, pShader: ^IGeometryShader, ppClassInstances: [^]^IClassInstance, NumClassInstances: u32), IASetPrimitiveTopology: proc "system" (this: ^IDeviceContext, Topology: PRIMITIVE_TOPOLOGY), - VSSetShaderResources: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumViews: u32, ppShaderResourceViews: ^^IShaderResourceView), - VSSetSamplers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumSamplers: u32, ppSamplers: ^^ISamplerState), + VSSetShaderResources: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumViews: u32, ppShaderResourceViews: [^]^IShaderResourceView), + VSSetSamplers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumSamplers: u32, ppSamplers: [^]^ISamplerState), Begin: proc "system" (this: ^IDeviceContext, pAsync: ^IAsynchronous), End: proc "system" (this: ^IDeviceContext, pAsync: ^IAsynchronous), GetData: proc "system" (this: ^IDeviceContext, pAsync: ^IAsynchronous, pData: rawptr, DataSize: u32, GetDataFlags: u32) -> HRESULT, SetPredication: proc "system" (this: ^IDeviceContext, pPredicate: ^IPredicate, PredicateValue: BOOL), - GSSetShaderResources: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumViews: u32, ppShaderResourceViews: ^^IShaderResourceView), - GSSetSamplers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumSamplers: u32, ppSamplers: ^^ISamplerState), - OMSetRenderTargets: proc "system" (this: ^IDeviceContext, NumViews: u32, ppRenderTargetViews: ^^IRenderTargetView, pDepthStencilView: ^IDepthStencilView), - OMSetRenderTargetsAndUnorderedAccessViews: proc "system" (this: ^IDeviceContext, NumRTVs: u32, ppRenderTargetViews: ^^IRenderTargetView, pDepthStencilView: ^IDepthStencilView, UAVStartSlot: u32, NumUAVs: u32, ppUnorderedAccessViews: ^^IUnorderedAccessView, pUAVInitialCounts: ^u32), + GSSetShaderResources: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumViews: u32, ppShaderResourceViews: [^]^IShaderResourceView), + GSSetSamplers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumSamplers: u32, ppSamplers: [^]^ISamplerState), + OMSetRenderTargets: proc "system" (this: ^IDeviceContext, NumViews: u32, ppRenderTargetViews: [^]^IRenderTargetView, pDepthStencilView: ^IDepthStencilView), + OMSetRenderTargetsAndUnorderedAccessViews: proc "system" (this: ^IDeviceContext, NumRTVs: u32, ppRenderTargetViews: [^]^IRenderTargetView, pDepthStencilView: ^IDepthStencilView, UAVStartSlot: u32, NumUAVs: u32, ppUnorderedAccessViews: [^]^IUnorderedAccessView, pUAVInitialCounts: [^]u32), OMSetBlendState: proc "system" (this: ^IDeviceContext, pBlendState: ^IBlendState, BlendFactor: ^[4]f32, SampleMask: u32), OMSetDepthStencilState: proc "system" (this: ^IDeviceContext, pDepthStencilState: ^IDepthStencilState, StencilRef: u32), - SOSetTargets: proc "system" (this: ^IDeviceContext, NumBuffers: u32, ppSOTargets: ^^IBuffer, pOffsets: ^u32), + SOSetTargets: proc "system" (this: ^IDeviceContext, NumBuffers: u32, ppSOTargets: [^]^IBuffer, pOffsets: [^]u32), DrawAuto: proc "system" (this: ^IDeviceContext), DrawIndexedInstancedIndirect: proc "system" (this: ^IDeviceContext, pBufferForArgs: ^IBuffer, AlignedByteOffsetForArgs: u32), DrawInstancedIndirect: proc "system" (this: ^IDeviceContext, pBufferForArgs: ^IBuffer, AlignedByteOffsetForArgs: u32), Dispatch: proc "system" (this: ^IDeviceContext, ThreadGroupCountX: u32, ThreadGroupCountY: u32, ThreadGroupCountZ: u32), DispatchIndirect: proc "system" (this: ^IDeviceContext, pBufferForArgs: ^IBuffer, AlignedByteOffsetForArgs: u32), RSSetState: proc "system" (this: ^IDeviceContext, pRasterizerState: ^IRasterizerState), - RSSetViewports: proc "system" (this: ^IDeviceContext, NumViewports: u32, pViewports: ^VIEWPORT), - RSSetScissorRects: proc "system" (this: ^IDeviceContext, NumRects: u32, pRects: ^RECT), + RSSetViewports: proc "system" (this: ^IDeviceContext, NumViewports: u32, pViewports: [^]VIEWPORT), + RSSetScissorRects: proc "system" (this: ^IDeviceContext, NumRects: u32, pRects: [^]RECT), CopySubresourceRegion: proc "system" (this: ^IDeviceContext, pDstResource: ^IResource, DstSubresource: u32, DstX: u32, DstY: u32, DstZ: u32, pSrcResource: ^IResource, SrcSubresource: u32, pSrcBox: ^BOX), CopyResource: proc "system" (this: ^IDeviceContext, pDstResource: ^IResource, pSrcResource: ^IResource), UpdateSubresource: proc "system" (this: ^IDeviceContext, pDstResource: ^IResource, DstSubresource: u32, pDstBox: ^BOX, pSrcData: rawptr, SrcRowPitch: u32, SrcDepthPitch: u32), @@ -2411,57 +2410,57 @@ IDeviceContext_VTable :: struct { GetResourceMinLOD: proc "system" (this: ^IDeviceContext, pResource: ^IResource) -> f32, ResolveSubresource: proc "system" (this: ^IDeviceContext, pDstResource: ^IResource, DstSubresource: u32, pSrcResource: ^IResource, SrcSubresource: u32, Format: dxgi.FORMAT), ExecuteCommandList: proc "system" (this: ^IDeviceContext, pCommandList: ^ICommandList, RestoreContextState: BOOL), - HSSetShaderResources: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumViews: u32, ppShaderResourceViews: ^^IShaderResourceView), - HSSetShader: proc "system" (this: ^IDeviceContext, pHullShader: ^IHullShader, ppClassInstances: ^^IClassInstance, NumClassInstances: u32), - HSSetSamplers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumSamplers: u32, ppSamplers: ^^ISamplerState), - HSSetConstantBuffers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumBuffers: u32, ppConstantBuffers: ^^IBuffer), - DSSetShaderResources: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumViews: u32, ppShaderResourceViews: ^^IShaderResourceView), - DSSetShader: proc "system" (this: ^IDeviceContext, pDomainShader: ^IDomainShader, ppClassInstances: ^^IClassInstance, NumClassInstances: u32), - DSSetSamplers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumSamplers: u32, ppSamplers: ^^ISamplerState), - DSSetConstantBuffers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumBuffers: u32, ppConstantBuffers: ^^IBuffer), - CSSetShaderResources: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumViews: u32, ppShaderResourceViews: ^^IShaderResourceView), - CSSetUnorderedAccessViews: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumUAVs: u32, ppUnorderedAccessViews: ^^IUnorderedAccessView, pUAVInitialCounts: ^u32), - CSSetShader: proc "system" (this: ^IDeviceContext, pComputeShader: ^IComputeShader, ppClassInstances: ^^IClassInstance, NumClassInstances: u32), - CSSetSamplers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumSamplers: u32, ppSamplers: ^^ISamplerState), - CSSetConstantBuffers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumBuffers: u32, ppConstantBuffers: ^^IBuffer), - VSGetConstantBuffers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumBuffers: u32, ppConstantBuffers: ^^IBuffer), - PSGetShaderResources: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumViews: u32, ppShaderResourceViews: ^^IShaderResourceView), - PSGetShader: proc "system" (this: ^IDeviceContext, ppPixelShader: ^^IPixelShader, ppClassInstances: ^^IClassInstance, pNumClassInstances: ^u32), - PSGetSamplers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumSamplers: u32, ppSamplers: ^^ISamplerState), - VSGetShader: proc "system" (this: ^IDeviceContext, ppVertexShader: ^^IVertexShader, ppClassInstances: ^^IClassInstance, pNumClassInstances: ^u32), - PSGetConstantBuffers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumBuffers: u32, ppConstantBuffers: ^^IBuffer), + HSSetShaderResources: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumViews: u32, ppShaderResourceViews: [^]^IShaderResourceView), + HSSetShader: proc "system" (this: ^IDeviceContext, pHullShader: ^IHullShader, ppClassInstances: [^]^IClassInstance, NumClassInstances: u32), + HSSetSamplers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumSamplers: u32, ppSamplers: [^]^ISamplerState), + HSSetConstantBuffers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumBuffers: u32, ppConstantBuffers: [^]^IBuffer), + DSSetShaderResources: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumViews: u32, ppShaderResourceViews: [^]^IShaderResourceView), + DSSetShader: proc "system" (this: ^IDeviceContext, pDomainShader: ^IDomainShader, ppClassInstances: [^]^IClassInstance, NumClassInstances: u32), + DSSetSamplers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumSamplers: u32, ppSamplers: [^]^ISamplerState), + DSSetConstantBuffers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumBuffers: u32, ppConstantBuffers: [^]^IBuffer), + CSSetShaderResources: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumViews: u32, ppShaderResourceViews: [^]^IShaderResourceView), + CSSetUnorderedAccessViews: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumUAVs: u32, ppUnorderedAccessViews: [^]^IUnorderedAccessView, pUAVInitialCounts: [^]u32), + CSSetShader: proc "system" (this: ^IDeviceContext, pComputeShader: ^IComputeShader, ppClassInstances: [^]^IClassInstance, NumClassInstances: u32), + CSSetSamplers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumSamplers: u32, ppSamplers: [^]^ISamplerState), + CSSetConstantBuffers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumBuffers: u32, ppConstantBuffers: [^]^IBuffer), + VSGetConstantBuffers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumBuffers: u32, ppConstantBuffers: [^]^IBuffer), + PSGetShaderResources: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumViews: u32, ppShaderResourceViews: [^]^IShaderResourceView), + PSGetShader: proc "system" (this: ^IDeviceContext, ppPixelShader: ^^IPixelShader, ppClassInstances: [^]^IClassInstance, pNumClassInstances: ^u32), + PSGetSamplers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumSamplers: u32, ppSamplers: [^]^ISamplerState), + VSGetShader: proc "system" (this: ^IDeviceContext, ppVertexShader: ^^IVertexShader, ppClassInstances: [^]^IClassInstance, pNumClassInstances: ^u32), + PSGetConstantBuffers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumBuffers: u32, ppConstantBuffers: [^]^IBuffer), IAGetInputLayout: proc "system" (this: ^IDeviceContext, ppInputLayout: ^^IInputLayout), - IAGetVertexBuffers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumBuffers: u32, ppVertexBuffers: ^^IBuffer, pStrides: ^u32, pOffsets: ^u32), + IAGetVertexBuffers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumBuffers: u32, ppVertexBuffers: [^]^IBuffer, pStrides: [^]u32, pOffsets: [^]u32), IAGetIndexBuffer: proc "system" (this: ^IDeviceContext, pIndexBuffer: ^^IBuffer, Format: ^dxgi.FORMAT, Offset: ^u32), - GSGetConstantBuffers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumBuffers: u32, ppConstantBuffers: ^^IBuffer), - GSGetShader: proc "system" (this: ^IDeviceContext, ppGeometryShader: ^^IGeometryShader, ppClassInstances: ^^IClassInstance, pNumClassInstances: ^u32), + GSGetConstantBuffers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumBuffers: u32, ppConstantBuffers: [^]^IBuffer), + GSGetShader: proc "system" (this: ^IDeviceContext, ppGeometryShader: ^^IGeometryShader, ppClassInstances: [^]^IClassInstance, pNumClassInstances: ^u32), IAGetPrimitiveTopology: proc "system" (this: ^IDeviceContext, pTopology: ^PRIMITIVE_TOPOLOGY), - VSGetShaderResources: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumViews: u32, ppShaderResourceViews: ^^IShaderResourceView), - VSGetSamplers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumSamplers: u32, ppSamplers: ^^ISamplerState), + VSGetShaderResources: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumViews: u32, ppShaderResourceViews: [^]^IShaderResourceView), + VSGetSamplers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumSamplers: u32, ppSamplers: [^]^ISamplerState), GetPredication: proc "system" (this: ^IDeviceContext, ppPredicate: ^^IPredicate, pPredicateValue: ^BOOL), - GSGetShaderResources: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumViews: u32, ppShaderResourceViews: ^^IShaderResourceView), - GSGetSamplers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumSamplers: u32, ppSamplers: ^^ISamplerState), - OMGetRenderTargets: proc "system" (this: ^IDeviceContext, NumViews: u32, ppRenderTargetViews: ^^IRenderTargetView, ppDepthStencilView: ^^IDepthStencilView), - OMGetRenderTargetsAndUnorderedAccessViews: proc "system" (this: ^IDeviceContext, NumRTVs: u32, ppRenderTargetViews: ^^IRenderTargetView, ppDepthStencilView: ^^IDepthStencilView, UAVStartSlot: u32, NumUAVs: u32, ppUnorderedAccessViews: ^^IUnorderedAccessView), + GSGetShaderResources: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumViews: u32, ppShaderResourceViews: [^]^IShaderResourceView), + GSGetSamplers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumSamplers: u32, ppSamplers: [^]^ISamplerState), + OMGetRenderTargets: proc "system" (this: ^IDeviceContext, NumViews: u32, ppRenderTargetViews: [^]^IRenderTargetView, ppDepthStencilView: ^^IDepthStencilView), + OMGetRenderTargetsAndUnorderedAccessViews: proc "system" (this: ^IDeviceContext, NumRTVs: u32, ppRenderTargetViews: [^]^IRenderTargetView, ppDepthStencilView: ^^IDepthStencilView, UAVStartSlot: u32, NumUAVs: u32, ppUnorderedAccessViews: [^]^IUnorderedAccessView), OMGetBlendState: proc "system" (this: ^IDeviceContext, ppBlendState: ^^IBlendState, BlendFactor: ^[4]f32, pSampleMask: ^COLOR_WRITE_ENABLE_MASK), OMGetDepthStencilState: proc "system" (this: ^IDeviceContext, ppDepthStencilState: ^^IDepthStencilState, pStencilRef: ^u32), - SOGetTargets: proc "system" (this: ^IDeviceContext, NumBuffers: u32, ppSOTargets: ^^IBuffer), + SOGetTargets: proc "system" (this: ^IDeviceContext, NumBuffers: u32, ppSOTargets: [^]^IBuffer), RSGetState: proc "system" (this: ^IDeviceContext, ppRasterizerState: ^^IRasterizerState), - RSGetViewports: proc "system" (this: ^IDeviceContext, pNumViewports: ^u32, pViewports: ^VIEWPORT), - RSGetScissorRects: proc "system" (this: ^IDeviceContext, pNumRects: ^u32, pRects: ^RECT), - HSGetShaderResources: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumViews: u32, ppShaderResourceViews: ^^IShaderResourceView), - HSGetShader: proc "system" (this: ^IDeviceContext, ppHullShader: ^^IHullShader, ppClassInstances: ^^IClassInstance, pNumClassInstances: ^u32), - HSGetSamplers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumSamplers: u32, ppSamplers: ^^ISamplerState), - HSGetConstantBuffers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumBuffers: u32, ppConstantBuffers: ^^IBuffer), - DSGetShaderResources: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumViews: u32, ppShaderResourceViews: ^^IShaderResourceView), - DSGetShader: proc "system" (this: ^IDeviceContext, ppDomainShader: ^^IDomainShader, ppClassInstances: ^^IClassInstance, pNumClassInstances: ^u32), - DSGetSamplers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumSamplers: u32, ppSamplers: ^^ISamplerState), - DSGetConstantBuffers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumBuffers: u32, ppConstantBuffers: ^^IBuffer), - CSGetShaderResources: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumViews: u32, ppShaderResourceViews: ^^IShaderResourceView), - CSGetUnorderedAccessViews: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumUAVs: u32, ppUnorderedAccessViews: ^^IUnorderedAccessView), - CSGetShader: proc "system" (this: ^IDeviceContext, ppComputeShader: ^^IComputeShader, ppClassInstances: ^^IClassInstance, pNumClassInstances: ^u32), - CSGetSamplers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumSamplers: u32, ppSamplers: ^^ISamplerState), - CSGetConstantBuffers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumBuffers: u32, ppConstantBuffers: ^^IBuffer), + RSGetViewports: proc "system" (this: ^IDeviceContext, pNumViewports: ^u32, pViewports: [^]VIEWPORT), + RSGetScissorRects: proc "system" (this: ^IDeviceContext, pNumRects: ^u32, pRects: [^]RECT), + HSGetShaderResources: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumViews: u32, ppShaderResourceViews: [^]^IShaderResourceView), + HSGetShader: proc "system" (this: ^IDeviceContext, ppHullShader: ^^IHullShader, ppClassInstances: [^]^IClassInstance, pNumClassInstances: ^u32), + HSGetSamplers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumSamplers: u32, ppSamplers: [^]^ISamplerState), + HSGetConstantBuffers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumBuffers: u32, ppConstantBuffers: [^]^IBuffer), + DSGetShaderResources: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumViews: u32, ppShaderResourceViews: [^]^IShaderResourceView), + DSGetShader: proc "system" (this: ^IDeviceContext, ppDomainShader: ^^IDomainShader, ppClassInstances: [^]^IClassInstance, pNumClassInstances: ^u32), + DSGetSamplers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumSamplers: u32, ppSamplers: [^]^ISamplerState), + DSGetConstantBuffers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumBuffers: u32, ppConstantBuffers: [^]^IBuffer), + CSGetShaderResources: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumViews: u32, ppShaderResourceViews: [^]^IShaderResourceView), + CSGetUnorderedAccessViews: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumUAVs: u32, ppUnorderedAccessViews: [^]^IUnorderedAccessView), + CSGetShader: proc "system" (this: ^IDeviceContext, ppComputeShader: ^^IComputeShader, ppClassInstances: [^]^IClassInstance, pNumClassInstances: ^u32), + CSGetSamplers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumSamplers: u32, ppSamplers: [^]^ISamplerState), + CSGetConstantBuffers: proc "system" (this: ^IDeviceContext, StartSlot: u32, NumBuffers: u32, ppConstantBuffers: [^]^IBuffer), ClearState: proc "system" (this: ^IDeviceContext), Flush: proc "system" (this: ^IDeviceContext), GetType: proc "system" (this: ^IDeviceContext) -> DEVICE_CONTEXT_TYPE, @@ -3248,7 +3247,7 @@ IVideoContext_VTable :: struct { VideoProcessorSetStreamSourceRect: proc "system" (this: ^IVideoContext, pVideoProcessor: ^IVideoProcessor, StreamIndex: u32, Enable: BOOL, pRect: ^RECT), VideoProcessorSetStreamDestRect: proc "system" (this: ^IVideoContext, pVideoProcessor: ^IVideoProcessor, StreamIndex: u32, Enable: BOOL, pRect: ^RECT), VideoProcessorSetStreamAlpha: proc "system" (this: ^IVideoContext, pVideoProcessor: ^IVideoProcessor, StreamIndex: u32, Enable: BOOL, Alpha: f32), - VideoProcessorSetStreamPalette: proc "system" (this: ^IVideoContext, pVideoProcessor: ^IVideoProcessor, StreamIndex: u32, Count: u32, pEntries: ^u32), + VideoProcessorSetStreamPalette: proc "system" (this: ^IVideoContext, pVideoProcessor: ^IVideoProcessor, StreamIndex: u32, Count: u32, pEntries: [^]u32), VideoProcessorSetStreamPixelAspectRatio: proc "system" (this: ^IVideoContext, pVideoProcessor: ^IVideoProcessor, StreamIndex: u32, Enable: BOOL, pSourceAspectRatio: ^dxgi.RATIONAL, pDestinationAspectRatio: ^dxgi.RATIONAL), VideoProcessorSetStreamLumaKey: proc "system" (this: ^IVideoContext, pVideoProcessor: ^IVideoProcessor, StreamIndex: u32, Enable: BOOL, Lower: f32, Upper: f32), VideoProcessorSetStreamStereoFormat: proc "system" (this: ^IVideoContext, pVideoProcessor: ^IVideoProcessor, StreamIndex: u32, Enable: BOOL, Format: VIDEO_PROCESSOR_STEREO_FORMAT, LeftViewFrame0: BOOL, BaseViewFrame0: BOOL, FlipMode: VIDEO_PROCESSOR_STEREO_FLIP_MODE, MonoOffset: i32), @@ -3261,14 +3260,14 @@ IVideoContext_VTable :: struct { VideoProcessorGetStreamSourceRect: proc "system" (this: ^IVideoContext, pVideoProcessor: ^IVideoProcessor, StreamIndex: u32, pEnabled: ^BOOL, pRect: ^RECT), VideoProcessorGetStreamDestRect: proc "system" (this: ^IVideoContext, pVideoProcessor: ^IVideoProcessor, StreamIndex: u32, pEnabled: ^BOOL, pRect: ^RECT), VideoProcessorGetStreamAlpha: proc "system" (this: ^IVideoContext, pVideoProcessor: ^IVideoProcessor, StreamIndex: u32, pEnabled: ^BOOL, pAlpha: ^f32), - VideoProcessorGetStreamPalette: proc "system" (this: ^IVideoContext, pVideoProcessor: ^IVideoProcessor, StreamIndex: u32, Count: u32, pEntries: ^u32), + VideoProcessorGetStreamPalette: proc "system" (this: ^IVideoContext, pVideoProcessor: ^IVideoProcessor, StreamIndex: u32, Count: u32, pEntries: [^]u32), VideoProcessorGetStreamPixelAspectRatio: proc "system" (this: ^IVideoContext, pVideoProcessor: ^IVideoProcessor, StreamIndex: u32, pEnabled: ^BOOL, pSourceAspectRatio: ^dxgi.RATIONAL, pDestinationAspectRatio: ^dxgi.RATIONAL), VideoProcessorGetStreamLumaKey: proc "system" (this: ^IVideoContext, pVideoProcessor: ^IVideoProcessor, StreamIndex: u32, pEnabled: ^BOOL, pLower: ^f32, pUpper: ^f32), VideoProcessorGetStreamStereoFormat: proc "system" (this: ^IVideoContext, pVideoProcessor: ^IVideoProcessor, StreamIndex: u32, pEnable: ^BOOL, pFormat: ^VIDEO_PROCESSOR_STEREO_FORMAT, pLeftViewFrame0: ^BOOL, pBaseViewFrame0: ^BOOL, pFlipMode: ^VIDEO_PROCESSOR_STEREO_FLIP_MODE, MonoOffset: ^i32), VideoProcessorGetStreamAutoProcessingMode: proc "system" (this: ^IVideoContext, pVideoProcessor: ^IVideoProcessor, StreamIndex: u32, pEnabled: ^BOOL), VideoProcessorGetStreamFilter: proc "system" (this: ^IVideoContext, pVideoProcessor: ^IVideoProcessor, StreamIndex: u32, Filter: VIDEO_PROCESSOR_FILTER, pEnabled: ^BOOL, pLevel: ^i32), VideoProcessorGetStreamExtension: proc "system" (this: ^IVideoContext, pVideoProcessor: ^IVideoProcessor, StreamIndex: u32, pExtensionGuid: ^GUID, DataSize: u32, pData: rawptr) -> APP_DEPRECATED_HRESULT, - VideoProcessorBlt: proc "system" (this: ^IVideoContext, pVideoProcessor: ^IVideoProcessor, pView: ^IVideoProcessorOutputView, OutputFrame: u32, StreamCount: u32, pStreams: ^VIDEO_PROCESSOR_STREAM) -> HRESULT, + VideoProcessorBlt: proc "system" (this: ^IVideoContext, pVideoProcessor: ^IVideoProcessor, pView: ^IVideoProcessorOutputView, OutputFrame: u32, StreamCount: u32, pStreams: [^]VIDEO_PROCESSOR_STREAM) -> HRESULT, NegotiateCryptoSessionKeyExchange: proc "system" (this: ^IVideoContext, pCryptoSession: ^ICryptoSession, DataSize: u32, pData: rawptr) -> HRESULT, EncryptionBlt: proc "system" (this: ^IVideoContext, pCryptoSession: ^ICryptoSession, pSrcSurface: ^ITexture2D, pDstSurface: ^ITexture2D, IVSize: u32, pIV: rawptr), DecryptionBlt: proc "system" (this: ^IVideoContext, pCryptoSession: ^ICryptoSession, pSrcSurface: ^ITexture2D, pDstSurface: ^ITexture2D, pEncryptedBlockInfo: ^ENCRYPTED_BLOCK_INFO, ContentKeySize: u32, pContentKey: rawptr, IVSize: u32, pIV: rawptr), @@ -3329,10 +3328,10 @@ IDevice_VTable :: struct { CreateUnorderedAccessView: proc "system" (this: ^IDevice, pResource: ^IResource, pDesc: ^UNORDERED_ACCESS_VIEW_DESC, ppUAView: ^^IUnorderedAccessView) -> HRESULT, CreateRenderTargetView: proc "system" (this: ^IDevice, pResource: ^IResource, pDesc: ^RENDER_TARGET_VIEW_DESC, ppRTView: ^^IRenderTargetView) -> HRESULT, CreateDepthStencilView: proc "system" (this: ^IDevice, pResource: ^IResource, pDesc: ^DEPTH_STENCIL_VIEW_DESC, ppDepthStencilView: ^^IDepthStencilView) -> HRESULT, - CreateInputLayout: proc "system" (this: ^IDevice, pInputElementDescs: ^INPUT_ELEMENT_DESC, NumElements: u32, pShaderBytecodeWithInputSignature: rawptr, BytecodeLength: SIZE_T, ppInputLayout: ^^IInputLayout) -> HRESULT, + CreateInputLayout: proc "system" (this: ^IDevice, pInputElementDescs: [^]INPUT_ELEMENT_DESC, NumElements: u32, pShaderBytecodeWithInputSignature: rawptr, BytecodeLength: SIZE_T, ppInputLayout: ^^IInputLayout) -> HRESULT, CreateVertexShader: proc "system" (this: ^IDevice, pShaderBytecode: rawptr, BytecodeLength: SIZE_T, pClassLinkage: ^IClassLinkage, ppVertexShader: ^^IVertexShader) -> HRESULT, CreateGeometryShader: proc "system" (this: ^IDevice, pShaderBytecode: rawptr, BytecodeLength: SIZE_T, pClassLinkage: ^IClassLinkage, ppGeometryShader: ^^IGeometryShader) -> HRESULT, - CreateGeometryShaderWithStreamOutput: proc "system" (this: ^IDevice, pShaderBytecode: rawptr, BytecodeLength: SIZE_T, pSODeclaration: ^SO_DECLARATION_ENTRY, NumEntries: u32, pBufferStrides: ^u32, NumStrides: u32, RasterizedStream: u32, pClassLinkage: ^IClassLinkage, ppGeometryShader: ^^IGeometryShader) -> HRESULT, + CreateGeometryShaderWithStreamOutput: proc "system" (this: ^IDevice, pShaderBytecode: rawptr, BytecodeLength: SIZE_T, pSODeclaration: ^SO_DECLARATION_ENTRY, NumEntries: u32, pBufferStrides: [^]u32, NumStrides: u32, RasterizedStream: u32, pClassLinkage: ^IClassLinkage, ppGeometryShader: ^^IGeometryShader) -> HRESULT, CreatePixelShader: proc "system" (this: ^IDevice, pShaderBytecode: rawptr, BytecodeLength: SIZE_T, pClassLinkage: ^IClassLinkage, ppPixelShader: ^^IPixelShader) -> HRESULT, CreateHullShader: proc "system" (this: ^IDevice, pShaderBytecode: rawptr, BytecodeLength: SIZE_T, pClassLinkage: ^IClassLinkage, ppHullShader: ^^IHullShader) -> HRESULT, CreateDomainShader: proc "system" (this: ^IDevice, pShaderBytecode: rawptr, BytecodeLength: SIZE_T, pClassLinkage: ^IClassLinkage, ppDomainShader: ^^IDomainShader) -> HRESULT, @@ -3348,9 +3347,9 @@ IDevice_VTable :: struct { CreateDeferredContext: proc "system" (this: ^IDevice, ContextFlags: u32, ppDeferredContext: ^^IDeviceContext) -> HRESULT, OpenSharedResource: proc "system" (this: ^IDevice, hResource: HANDLE, ReturnedInterface: ^IID, ppResource: ^rawptr) -> HRESULT, CheckFormatSupport: proc "system" (this: ^IDevice, Format: dxgi.FORMAT, pFormatSupport: ^u32) -> HRESULT, - CheckMultisampleQualityLevels: proc "system" (this: ^IDevice, Format: dxgi.FORMAT, SampleCount: u32, pNumQualityLevels: ^u32) -> HRESULT, + CheckMultisampleQualityLevels: proc "system" (this: ^IDevice, Format: dxgi.FORMAT, SampleCount: u32, pNumQualityLevels: [^]u32) -> HRESULT, CheckCounterInfo: proc "system" (this: ^IDevice, pCounterInfo: ^COUNTER_INFO), - CheckCounter: proc "system" (this: ^IDevice, pDesc: ^COUNTER_DESC, pType: ^COUNTER_TYPE, pActiveCounters: ^u32, szName: cstring, pNameLength: ^u32, szUnits: ^u8, pUnitsLength: ^u32, szDescription: cstring, pDescriptionLength: ^u32) -> HRESULT, + CheckCounter: proc "system" (this: ^IDevice, pDesc: ^COUNTER_DESC, pType: ^COUNTER_TYPE, pActiveCounters: ^u32, szName: cstring, pNameLength: ^u32, szUnits: cstring, pUnitsLength: ^u32, szDescription: cstring, pDescriptionLength: ^u32) -> HRESULT, CheckFeatureSupport: proc "system" (this: ^IDevice, Feature: FEATURE, pFeatureSupportData: rawptr, FeatureSupportDataSize: u32) -> HRESULT, GetPrivateData: proc "system" (this: ^IDevice, guid: ^GUID, pDataSize: ^u32, pData: rawptr) -> HRESULT, SetPrivateData: proc "system" (this: ^IDevice, guid: ^GUID, DataSize: u32, pData: rawptr) -> HRESULT, @@ -3675,8 +3674,8 @@ IFunctionLinkingGraph :: struct #raw_union { IFunctionLinkingGraph_VTable :: struct { using iunknown_vtable: IUnknown_VTable, CreateModuleInstance: proc "system" (this: ^IFunctionLinkingGraph, ppModuleInstance: ^^IModuleInstance, ppErrorBuffer: ^^IBlob) -> HRESULT, - SetInputSignature: proc "system" (this: ^IFunctionLinkingGraph, pInputParameters: ^PARAMETER_DESC, cInputParameters: u32, ppInputNode: ^^ILinkingNode) -> HRESULT, - SetOutputSignature: proc "system" (this: ^IFunctionLinkingGraph, pOutputParameters: ^PARAMETER_DESC, cOutputParameters: u32, ppOutputNode: ^^ILinkingNode) -> HRESULT, + SetInputSignature: proc "system" (this: ^IFunctionLinkingGraph, pInputParameters: [^]PARAMETER_DESC, cInputParameters: u32, ppInputNode: ^^ILinkingNode) -> HRESULT, + SetOutputSignature: proc "system" (this: ^IFunctionLinkingGraph, pOutputParameters: [^]PARAMETER_DESC, cOutputParameters: u32, ppOutputNode: ^^ILinkingNode) -> HRESULT, CallFunction: proc "system" (this: ^IFunctionLinkingGraph, pModuleInstanceNamespace: cstring, pModuleWithFunctionPrototype: ^IModule, pFunctionName: cstring, ppCallNode: ^^ILinkingNode) -> HRESULT, PassValue: proc "system" (this: ^IFunctionLinkingGraph, pSrcNode: ^ILinkingNode, SrcParameterIndex: i32, pDstNode: ^ILinkingNode, DstParameterIndex: i32) -> HRESULT, PassValueWithSwizzle: proc "system" (this: ^IFunctionLinkingGraph, pSrcNode: ^ILinkingNode, SrcParameterIndex: i32, pSrcSwizzle: ^u8, pDstNode: ^ILinkingNode, DstParameterIndex: i32, pDstSwizzle: ^u8) -> HRESULT, diff --git a/vendor/directx/d3d12/d3d12.odin b/vendor/directx/d3d12/d3d12.odin index 4e51d5203..e707b0885 100644 --- a/vendor/directx/d3d12/d3d12.odin +++ b/vendor/directx/d3d12/d3d12.odin @@ -31,35 +31,35 @@ foreign d3d12 { CreateDevice :: proc(pAdapter: ^IUnknown, MinimumFeatureLevel: FEATURE_LEVEL, riid: ^IID, ppDevice: ^rawptr) -> HRESULT --- CreateRootSignatureDeserializer :: proc(pSrcData: rawptr, SrcDataSizeInBytes: SIZE_T, pRootSignatureDeserializerInterface: ^IID, ppRootSignatureDeserializer: ^rawptr) -> HRESULT --- CreateVersionedRootSignatureDeserializer :: proc(pSrcData: rawptr, SrcDataSizeInBytes: SIZE_T, pRootSignatureDeserializerInterface: ^IID, ppRootSignatureDeserializer: ^rawptr) -> HRESULT --- - EnableExperimentalFeatures :: proc(NumFeatures: u32, pIIDs: ^IID, pConfigurationStructs: rawptr, pConfigurationStructSizes: ^u32) -> HRESULT --- + EnableExperimentalFeatures :: proc(NumFeatures: u32, pIIDs: [^]IID, pConfigurationStructs: rawptr, pConfigurationStructSizes: [^]u32) -> HRESULT --- GetDebugInterface :: proc(riid: ^IID, ppvDebug: ^rawptr) -> HRESULT --- SerializeRootSignature :: proc(pRootSignature: ^ROOT_SIGNATURE_DESC, Version: ROOT_SIGNATURE_VERSION, ppBlob: ^^IBlob, ppErrorBlob: ^^IBlob) -> HRESULT --- SerializeVersionedRootSignature :: proc(pRootSignature: ^VERSIONED_ROOT_SIGNATURE_DESC, ppBlob: ^^IBlob, ppErrorBlob: ^^IBlob) -> HRESULT --- } -foreign d3d12 { - WKPDID_D3DDebugObjectNameW: GUID - WKPDID_CommentStringW: GUID +WKPDID_D3DDebugObjectNameW_UUID_STRING :: "4CCA5FD8-921F-42C8-8566-70CAF2A9B741" +WKPDID_D3DDebugObjectNameW_UUID := &IID{0x4cca5fd8, 0x921f, 0x42c8, {0x85, 0x66, 0x70, 0xca, 0xf2, 0xa9, 0xb7, 0x41}} - @(link_name="DXGI_DEBUG_D3D12") - DEBUG_D3D12: GUID +WKPDID_CommentStringW_UUID_STRING :: "d0149dc0-90e8-4ec8-8144-e900ad266bb2" +WKPDID_CommentStringW_UUID := &IID{0xd0149dc0, 0x90e8, 0x4ec8, {0x81, 0x44, 0xe9, 0x00, 0xad, 0x26, 0x6b, 0xb2}} - @(link_name="D3D12_PROTECTED_RESOURCES_SESSION_HARDWARE_PROTECTED") - PROTECTED_RESOURCES_SESSION_HARDWARE_PROTECTED: GUID -} +DEBUG_D3D12_UUID_STRING :: "cf59a98c-a950-4326-91ef-9ba17bfd95" +DEBUG_D3D12_UUID := &IID{0xcf59a98c, 0xa950, 0x4326, {0x91, 0xef, 0x9b, 0xba, 0xa1, 0x7b, 0xfd, 0x95}} -@(link_prefix="D3D_") -foreign d3d12 { - TEXTURE_LAYOUT_ROW_MAJOR: GUID - TEXTURE_LAYOUT_64KB_STANDARD_SWIZZLE: GUID -} +PROTECTED_RESOURCES_SESSION_HARDWARE_PROTECTED_UUID_STRING :: "62b0084e-c70e-4daa-a109-30ff8d5a0482" +PROTECTED_RESOURCES_SESSION_HARDWARE_PROTECTED_UUID := &IID{0x62b0084e, 0xc70e, 0x4daa, {0xa1, 0x09, 0x30, 0xff, 0x8d, 0x5a, 0x04, 0x82}} -@(link_prefix="D3D12") -foreign d3d12 { - ExperimentalShaderModels: UUID - TiledResourceTier4: UUID - MetaCommand: UUID -} +TEXTURE_LAYOUT_ROW_MAJOR_UUID_STRING :: "b5dc234f-72bb-4bec-9705-8cf258df6b6c" +TEXTURE_LAYOUT_ROW_MAJOR_UUID := &IID{0xb5dc234f, 0x72bb, 0x4bec, {0x97, 0x05, 0x8c, 0xf2, 0x58, 0xdf, 0x6b, 0x6c}} + +TEXTURE_LAYOUT_64KB_STANDARD_SWIZZLE_UUID_STRING :: "4c0f29e3-3f5f-4d35-84c9-bc0983b62c28" +TEXTURE_LAYOUT_64KB_STANDARD_SWIZZLE_UUID := &IID{0x4c0f29e3, 0x3f5f, 0x4d35, {0x84, 0xc9, 0xbc, 0x09, 0x83, 0xb6, 0x2c, 0x28}} + +ExperimentalShaderModels_UUID_STRING :: "76f5573e-f13a-40f5-b297-81ce9e18933f" +ExperimentalShaderModels_UUID := &IID{0x76f5573e, 0xf13a, 0x40f5, {0xb2, 0x97, 0x81, 0xce, 0x9e, 0x18, 0x93, 0x3f}} + +TiledResourceTier4_UUID_STRING :: "c9c4725f-a81a-4f56-8c5b-c51039d694fb" +TiledResourceTier4_UUID := &IID{0xc9c4725f, 0xa81a, 0x4f56, {0x8c, 0x5b, 0xc5, 0x10, 0x39, 0xd6, 0x94, 0xfb}} DRIVER_TYPE :: enum i32 { @@ -716,7 +716,7 @@ STREAM_OUTPUT_DESC :: struct { } INPUT_LAYOUT_DESC :: struct { - pInputElementDescs: ^INPUT_ELEMENT_DESC, + pInputElementDescs: [^]INPUT_ELEMENT_DESC, NumElements: u32, } @@ -1567,7 +1567,7 @@ VIEW_INSTANCING_FLAG :: enum u32 { VIEW_INSTANCING_DESC :: struct { ViewInstanceCount: u32, - pViewInstanceLocations: ^VIEW_INSTANCE_LOCATION, + pViewInstanceLocations: [^]VIEW_INSTANCE_LOCATION, Flags: VIEW_INSTANCING_FLAGS, } @@ -2489,14 +2489,14 @@ IGraphicsCommandList_VTable :: struct { CopyTiles: proc "system" (this: ^IGraphicsCommandList, pTiledResource: ^IResource, pTileRegionStartCoordinate: ^TILED_RESOURCE_COORDINATE, pTileRegionSize: ^TILE_REGION_SIZE, pBuffer: ^IResource, BufferStartOffsetInBytes: u64, Flags: TILE_COPY_FLAGS), ResolveSubresource: proc "system" (this: ^IGraphicsCommandList, pDstResource: ^IResource, DstSubresource: u32, pSrcResource: ^IResource, SrcSubresource: u32, Format: dxgi.FORMAT), IASetPrimitiveTopology: proc "system" (this: ^IGraphicsCommandList, PrimitiveTopology: PRIMITIVE_TOPOLOGY), - RSSetViewports: proc "system" (this: ^IGraphicsCommandList, NumViewports: u32, pViewports: ^VIEWPORT), - RSSetScissorRects: proc "system" (this: ^IGraphicsCommandList, NumRects: u32, pRects: ^RECT), + RSSetViewports: proc "system" (this: ^IGraphicsCommandList, NumViewports: u32, pViewports: [^]VIEWPORT), + RSSetScissorRects: proc "system" (this: ^IGraphicsCommandList, NumRects: u32, pRects: [^]RECT), OMSetBlendFactor: proc "system" (this: ^IGraphicsCommandList, BlendFactor: ^[4]f32), OMSetStencilRef: proc "system" (this: ^IGraphicsCommandList, StencilRef: u32), SetPipelineState: proc "system" (this: ^IGraphicsCommandList, pPipelineState: ^IPipelineState), - ResourceBarrier: proc "system" (this: ^IGraphicsCommandList, NumBarriers: u32, pBarriers: ^RESOURCE_BARRIER), + ResourceBarrier: proc "system" (this: ^IGraphicsCommandList, NumBarriers: u32, pBarriers: [^]RESOURCE_BARRIER), ExecuteBundle: proc "system" (this: ^IGraphicsCommandList, pCommandList: ^IGraphicsCommandList), - SetDescriptorHeaps: proc "system" (this: ^IGraphicsCommandList, NumDescriptorHeaps: u32, ppDescriptorHeaps: ^^IDescriptorHeap), + SetDescriptorHeaps: proc "system" (this: ^IGraphicsCommandList, NumDescriptorHeaps: u32, ppDescriptorHeaps: [^]^IDescriptorHeap), SetComputeRootSignature: proc "system" (this: ^IGraphicsCommandList, pRootSignature: ^IRootSignature), SetGraphicsRootSignature: proc "system" (this: ^IGraphicsCommandList, pRootSignature: ^IRootSignature), SetComputeRootDescriptorTable: proc "system" (this: ^IGraphicsCommandList, RootParameterIndex: u32, BaseDescriptor: GPU_DESCRIPTOR_HANDLE), @@ -2512,13 +2512,13 @@ IGraphicsCommandList_VTable :: struct { SetComputeRootUnorderedAccessView: proc "system" (this: ^IGraphicsCommandList, RootParameterIndex: u32, BufferLocation: GPU_VIRTUAL_ADDRESS), SetGraphicsRootUnorderedAccessView: proc "system" (this: ^IGraphicsCommandList, RootParameterIndex: u32, BufferLocation: GPU_VIRTUAL_ADDRESS), IASetIndexBuffer: proc "system" (this: ^IGraphicsCommandList, pView: ^INDEX_BUFFER_VIEW), - IASetVertexBuffers: proc "system" (this: ^IGraphicsCommandList, StartSlot: u32, NumViews: u32, pViews: ^VERTEX_BUFFER_VIEW), - SOSetTargets: proc "system" (this: ^IGraphicsCommandList, StartSlot: u32, NumViews: u32, pViews: ^STREAM_OUTPUT_BUFFER_VIEW), - OMSetRenderTargets: proc "system" (this: ^IGraphicsCommandList, NumRenderTargetDescriptors: u32, pRenderTargetDescriptors: ^CPU_DESCRIPTOR_HANDLE, RTsSingleHandleToDescriptorRange: BOOL, pDepthStencilDescriptor: ^CPU_DESCRIPTOR_HANDLE), - ClearDepthStencilView: proc "system" (this: ^IGraphicsCommandList, DepthStencilView: CPU_DESCRIPTOR_HANDLE, ClearFlags: CLEAR_FLAGS, Depth: f32, Stencil: u8, NumRects: u32, pRects: ^RECT), - ClearRenderTargetView: proc "system" (this: ^IGraphicsCommandList, RenderTargetView: CPU_DESCRIPTOR_HANDLE, ColorRGBA: ^[4]f32, NumRects: u32, pRects: ^RECT), - ClearUnorderedAccessViewUint: proc "system" (this: ^IGraphicsCommandList, ViewGPUHandleInCurrentHeap: GPU_DESCRIPTOR_HANDLE, ViewCPUHandle: CPU_DESCRIPTOR_HANDLE, pResource: ^IResource, Values: ^[4]u32, NumRects: u32, pRects: ^RECT), - ClearUnorderedAccessViewFloat: proc "system" (this: ^IGraphicsCommandList, ViewGPUHandleInCurrentHeap: GPU_DESCRIPTOR_HANDLE, ViewCPUHandle: CPU_DESCRIPTOR_HANDLE, pResource: ^IResource, Values: ^[4]f32, NumRects: u32, pRects: ^RECT), + IASetVertexBuffers: proc "system" (this: ^IGraphicsCommandList, StartSlot: u32, NumViews: u32, pViews: [^]VERTEX_BUFFER_VIEW), + SOSetTargets: proc "system" (this: ^IGraphicsCommandList, StartSlot: u32, NumViews: u32, pViews: [^]STREAM_OUTPUT_BUFFER_VIEW), + OMSetRenderTargets: proc "system" (this: ^IGraphicsCommandList, NumRenderTargetDescriptors: u32, pRenderTargetDescriptors: [^]CPU_DESCRIPTOR_HANDLE, RTsSingleHandleToDescriptorRange: BOOL, pDepthStencilDescriptor: ^CPU_DESCRIPTOR_HANDLE), + ClearDepthStencilView: proc "system" (this: ^IGraphicsCommandList, DepthStencilView: CPU_DESCRIPTOR_HANDLE, ClearFlags: CLEAR_FLAGS, Depth: f32, Stencil: u8, NumRects: u32, pRects: [^]RECT), + ClearRenderTargetView: proc "system" (this: ^IGraphicsCommandList, RenderTargetView: CPU_DESCRIPTOR_HANDLE, ColorRGBA: ^[4]f32, NumRects: u32, pRects: [^]RECT), + ClearUnorderedAccessViewUint: proc "system" (this: ^IGraphicsCommandList, ViewGPUHandleInCurrentHeap: GPU_DESCRIPTOR_HANDLE, ViewCPUHandle: CPU_DESCRIPTOR_HANDLE, pResource: ^IResource, Values: ^[4]u32, NumRects: u32, pRects: [^]RECT), + ClearUnorderedAccessViewFloat: proc "system" (this: ^IGraphicsCommandList, ViewGPUHandleInCurrentHeap: GPU_DESCRIPTOR_HANDLE, ViewCPUHandle: CPU_DESCRIPTOR_HANDLE, pResource: ^IResource, Values: ^[4]f32, NumRects: u32, pRects: [^]RECT), DiscardResource: proc "system" (this: ^IGraphicsCommandList, pResource: ^IResource, pRegion: ^DISCARD_REGION), BeginQuery: proc "system" (this: ^IGraphicsCommandList, pQueryHeap: ^IQueryHeap, Type: QUERY_TYPE, Index: u32), EndQuery: proc "system" (this: ^IGraphicsCommandList, pQueryHeap: ^IQueryHeap, Type: QUERY_TYPE, Index: u32), @@ -2539,10 +2539,10 @@ IGraphicsCommandList1 :: struct #raw_union { } IGraphicsCommandList1_VTable :: struct { using id3d12graphicscommandlist_vtable: IGraphicsCommandList_VTable, - AtomicCopyBufferUINT: proc "system" (this: ^IGraphicsCommandList1, pDstBuffer: ^IResource, DstOffset: u64, pSrcBuffer: ^IResource, SrcOffset: u64, Dependencies: u32, ppDependentResources: ^^IResource, pDependentSubresourceRanges: ^SUBRESOURCE_RANGE_UINT64), - AtomicCopyBufferUINT64: proc "system" (this: ^IGraphicsCommandList1, pDstBuffer: ^IResource, DstOffset: u64, pSrcBuffer: ^IResource, SrcOffset: u64, Dependencies: u32, ppDependentResources: ^^IResource, pDependentSubresourceRanges: ^SUBRESOURCE_RANGE_UINT64), + AtomicCopyBufferUINT: proc "system" (this: ^IGraphicsCommandList1, pDstBuffer: ^IResource, DstOffset: u64, pSrcBuffer: ^IResource, SrcOffset: u64, Dependencies: u32, ppDependentResources: [^]^IResource, pDependentSubresourceRanges: [^]SUBRESOURCE_RANGE_UINT64), + AtomicCopyBufferUINT64: proc "system" (this: ^IGraphicsCommandList1, pDstBuffer: ^IResource, DstOffset: u64, pSrcBuffer: ^IResource, SrcOffset: u64, Dependencies: u32, ppDependentResources: [^]^IResource, pDependentSubresourceRanges: [^]SUBRESOURCE_RANGE_UINT64), OMSetDepthBounds: proc "system" (this: ^IGraphicsCommandList1, Min: f32, Max: f32), - SetSamplePositions: proc "system" (this: ^IGraphicsCommandList1, NumSamplesPerPixel: u32, NumPixels: u32, pSamplePositions: ^SAMPLE_POSITION), + SetSamplePositions: proc "system" (this: ^IGraphicsCommandList1, NumSamplesPerPixel: u32, NumPixels: u32, pSamplePositions: [^]SAMPLE_POSITION), ResolveSubresourceRegion: proc "system" (this: ^IGraphicsCommandList1, pDstResource: ^IResource, DstSubresource: u32, DstX: u32, DstY: u32, pSrcResource: ^IResource, SrcSubresource: u32, pSrcRect: ^RECT, Format: dxgi.FORMAT, ResolveMode: RESOLVE_MODE), SetViewInstanceMask: proc "system" (this: ^IGraphicsCommandList1, Mask: u32), } @@ -2567,7 +2567,7 @@ IGraphicsCommandList2 :: struct #raw_union { } IGraphicsCommandList2_VTable :: struct { using id3d12graphicscommandlist1_vtable: IGraphicsCommandList1_VTable, - WriteBufferImmediate: proc "system" (this: ^IGraphicsCommandList2, Count: u32, pParams: ^WRITEBUFFERIMMEDIATE_PARAMETER, pModes: ^WRITEBUFFERIMMEDIATE_MODE), + WriteBufferImmediate: proc "system" (this: ^IGraphicsCommandList2, Count: u32, pParams: [^]WRITEBUFFERIMMEDIATE_PARAMETER, pModes: [^]WRITEBUFFERIMMEDIATE_MODE), } @@ -2579,9 +2579,9 @@ ICommandQueue :: struct #raw_union { } ICommandQueue_VTable :: struct { using id3d12devicechild_vtable: IDeviceChild_VTable, - UpdateTileMappings: proc "system" (this: ^ICommandQueue, pResource: ^IResource, NumResourceRegions: u32, pResourceRegionStartCoordinates: ^TILED_RESOURCE_COORDINATE, pResourceRegionSizes: ^TILE_REGION_SIZE, pHeap: ^IHeap, NumRanges: u32, pRangeFlags: ^TILE_RANGE_FLAGS, pHeapRangeStartOffsets: ^u32, pRangeTileCounts: ^u32, Flags: TILE_MAPPING_FLAGS), + UpdateTileMappings: proc "system" (this: ^ICommandQueue, pResource: ^IResource, NumResourceRegions: u32, pResourceRegionStartCoordinates: [^]TILED_RESOURCE_COORDINATE, pResourceRegionSizes: [^]TILE_REGION_SIZE, pHeap: ^IHeap, NumRanges: u32, pRangeFlags: [^]TILE_RANGE_FLAGS, pHeapRangeStartOffsets: [^]u32, pRangeTileCounts: [^]u32, Flags: TILE_MAPPING_FLAGS), CopyTileMappings: proc "system" (this: ^ICommandQueue, pDstResource: ^IResource, pDstRegionStartCoordinate: ^TILED_RESOURCE_COORDINATE, pSrcResource: ^IResource, pSrcRegionStartCoordinate: ^TILED_RESOURCE_COORDINATE, pRegionSize: ^TILE_REGION_SIZE, Flags: TILE_MAPPING_FLAGS), - ExecuteCommandLists: proc "system" (this: ^ICommandQueue, NumCommandLists: u32, ppCommandLists: ^^ICommandList), + ExecuteCommandLists: proc "system" (this: ^ICommandQueue, NumCommandLists: u32, ppCommandLists: [^]^ICommandList), SetMarker: proc "system" (this: ^ICommandQueue, Metadata: u32, pData: rawptr, Size: u32), BeginEvent: proc "system" (this: ^ICommandQueue, Metadata: u32, pData: rawptr, Size: u32), EndEvent: proc "system" (this: ^ICommandQueue), @@ -2617,9 +2617,9 @@ IDevice_VTable :: struct { CreateRenderTargetView: proc "system" (this: ^IDevice, pResource: ^IResource, pDesc: ^RENDER_TARGET_VIEW_DESC, DestDescriptor: CPU_DESCRIPTOR_HANDLE), CreateDepthStencilView: proc "system" (this: ^IDevice, pResource: ^IResource, pDesc: ^DEPTH_STENCIL_VIEW_DESC, DestDescriptor: CPU_DESCRIPTOR_HANDLE), CreateSampler: proc "system" (this: ^IDevice, pDesc: ^SAMPLER_DESC, DestDescriptor: CPU_DESCRIPTOR_HANDLE), - CopyDescriptors: proc "system" (this: ^IDevice, NumDestDescriptorRanges: u32, pDestDescriptorRangeStarts: ^CPU_DESCRIPTOR_HANDLE, pDestDescriptorRangeSizes: ^u32, NumSrcDescriptorRanges: u32, pSrcDescriptorRangeStarts: ^CPU_DESCRIPTOR_HANDLE, pSrcDescriptorRangeSizes: ^u32, DescriptorHeapsType: DESCRIPTOR_HEAP_TYPE), + CopyDescriptors: proc "system" (this: ^IDevice, NumDestDescriptorRanges: u32, pDestDescriptorRangeStarts: [^]CPU_DESCRIPTOR_HANDLE, pDestDescriptorRangeSizes: [^]u32, NumSrcDescriptorRanges: u32, pSrcDescriptorRangeStarts: [^]CPU_DESCRIPTOR_HANDLE, pSrcDescriptorRangeSizes: [^]u32, DescriptorHeapsType: DESCRIPTOR_HEAP_TYPE), CopyDescriptorsSimple: proc "system" (this: ^IDevice, NumDescriptors: u32, DestDescriptorRangeStart: CPU_DESCRIPTOR_HANDLE, SrcDescriptorRangeStart: CPU_DESCRIPTOR_HANDLE, DescriptorHeapsType: DESCRIPTOR_HEAP_TYPE), - GetResourceAllocationInfo: proc "system" (this: ^IDevice, RetVal: ^RESOURCE_ALLOCATION_INFO, visibleMask: u32, numResourceDescs: u32, pResourceDescs: ^RESOURCE_DESC), + GetResourceAllocationInfo: proc "system" (this: ^IDevice, RetVal: ^RESOURCE_ALLOCATION_INFO, visibleMask: u32, numResourceDescs: u32, pResourceDescs: [^]RESOURCE_DESC), GetCustomHeapProperties: proc "system" (this: ^IDevice, nodeMask: u32, heapType: HEAP_TYPE) -> HEAP_PROPERTIES, CreateCommittedResource: proc "system" (this: ^IDevice, pHeapProperties: ^HEAP_PROPERTIES, HeapFlags: HEAP_FLAGS, pDesc: ^RESOURCE_DESC, InitialResourceState: RESOURCE_STATES, pOptimizedClearValue: ^CLEAR_VALUE, riidResource: ^IID, ppvResource: ^rawptr) -> HRESULT, CreateHeap: proc "system" (this: ^IDevice, pDesc: ^HEAP_DESC, riid: ^IID, ppvHeap: ^rawptr) -> HRESULT, @@ -2628,11 +2628,11 @@ IDevice_VTable :: struct { CreateSharedHandle: proc "system" (this: ^IDevice, pObject: ^IDeviceChild, pAttributes: ^win32.SECURITY_ATTRIBUTES, Access: u32, Name: [^]u16, pHandle: ^HANDLE) -> HRESULT, OpenSharedHandle: proc "system" (this: ^IDevice, NTHandle: HANDLE, riid: ^IID, ppvObj: ^rawptr) -> HRESULT, OpenSharedHandleByName: proc "system" (this: ^IDevice, Name: [^]u16, Access: u32, pNTHandle: ^HANDLE) -> HRESULT, - MakeResident: proc "system" (this: ^IDevice, NumObjects: u32, ppObjects: ^^IPageable) -> HRESULT, - Evict: proc "system" (this: ^IDevice, NumObjects: u32, ppObjects: ^^IPageable) -> HRESULT, + MakeResident: proc "system" (this: ^IDevice, NumObjects: u32, ppObjects: [^]^IPageable) -> HRESULT, + Evict: proc "system" (this: ^IDevice, NumObjects: u32, ppObjects: [^]^IPageable) -> HRESULT, CreateFence: proc "system" (this: ^IDevice, InitialValue: u64, Flags: FENCE_FLAGS, riid: ^IID, ppFence: ^rawptr) -> HRESULT, GetDeviceRemovedReason: proc "system" (this: ^IDevice) -> HRESULT, - GetCopyableFootprints: proc "system" (this: ^IDevice, pResourceDesc: ^RESOURCE_DESC, FirstSubresource: u32, NumSubresources: u32, BaseOffset: u64, pLayouts: ^PLACED_SUBRESOURCE_FOOTPRINT, pNumRows: ^u32, pRowSizeInBytes: ^u64, pTotalBytes: ^u64), + GetCopyableFootprints: proc "system" (this: ^IDevice, pResourceDesc: ^RESOURCE_DESC, FirstSubresource: u32, NumSubresources: u32, BaseOffset: u64, pLayouts: [^]PLACED_SUBRESOURCE_FOOTPRINT, pNumRows: [^]u32, pRowSizeInBytes: [^]u64, pTotalBytes: ^u64), CreateQueryHeap: proc "system" (this: ^IDevice, pDesc: ^QUERY_HEAP_DESC, riid: ^IID, ppvHeap: ^rawptr) -> HRESULT, SetStablePowerState: proc "system" (this: ^IDevice, Enable: BOOL) -> HRESULT, CreateCommandSignature: proc "system" (this: ^IDevice, pDesc: ^COMMAND_SIGNATURE_DESC, pRootSignature: ^IRootSignature, riid: ^IID, ppvCommandSignature: ^rawptr) -> HRESULT, @@ -2694,8 +2694,8 @@ IDevice1 :: struct #raw_union { IDevice1_VTable :: struct { using id3d12device_vtable: IDevice_VTable, CreatePipelineLibrary: proc "system" (this: ^IDevice1, pLibraryBlob: rawptr, BlobLength: SIZE_T, riid: ^IID, ppPipelineLibrary: ^rawptr) -> HRESULT, - SetEventOnMultipleFenceCompletion: proc "system" (this: ^IDevice1, ppFences: ^^IFence, pFenceValues: ^u64, NumFences: u32, Flags: MULTIPLE_FENCE_WAIT_FLAGS, hEvent: HANDLE) -> HRESULT, - SetResidencyPriority: proc "system" (this: ^IDevice1, NumObjects: u32, ppObjects: ^^IPageable, pPriorities: ^RESIDENCY_PRIORITY) -> HRESULT, + SetEventOnMultipleFenceCompletion: proc "system" (this: ^IDevice1, ppFences: [^]^IFence, pFenceValues: [^]u64, NumFences: u32, Flags: MULTIPLE_FENCE_WAIT_FLAGS, hEvent: HANDLE) -> HRESULT, + SetResidencyPriority: proc "system" (this: ^IDevice1, NumObjects: u32, ppObjects: [^]^IPageable, pPriorities: [^]RESIDENCY_PRIORITY) -> HRESULT, } @@ -2726,7 +2726,7 @@ IDevice3_VTable :: struct { using id3d12device2_vtable: IDevice2_VTable, OpenExistingHeapFromAddress: proc "system" (this: ^IDevice3, pAddress: rawptr, riid: ^IID, ppvHeap: ^rawptr) -> HRESULT, OpenExistingHeapFromFileMapping: proc "system" (this: ^IDevice3, hFileMapping: HANDLE, riid: ^IID, ppvHeap: ^rawptr) -> HRESULT, - EnqueueMakeResident: proc "system" (this: ^IDevice3, Flags: RESIDENCY_FLAGS, NumObjects: u32, ppObjects: ^^IPageable, pFenceToSignal: ^IFence, FenceValueToSignal: u64) -> HRESULT, + EnqueueMakeResident: proc "system" (this: ^IDevice3, Flags: RESIDENCY_FLAGS, NumObjects: u32, ppObjects: [^]^IPageable, pFenceToSignal: ^IFence, FenceValueToSignal: u64) -> HRESULT, } COMMAND_LIST_FLAGS :: distinct bit_set[COMMAND_LIST_FLAG; u32] @@ -2804,7 +2804,7 @@ IDevice4_VTable :: struct { CreateCommittedResource1: proc "system" (this: ^IDevice4, pHeapProperties: ^HEAP_PROPERTIES, HeapFlags: HEAP_FLAGS, pDesc: ^RESOURCE_DESC, InitialResourceState: RESOURCE_STATES, pOptimizedClearValue: ^CLEAR_VALUE, pProtectedSession: ^IProtectedResourceSession, riidResource: ^IID, ppvResource: ^rawptr) -> HRESULT, CreateHeap1: proc "system" (this: ^IDevice4, pDesc: ^HEAP_DESC, pProtectedSession: ^IProtectedResourceSession, riid: ^IID, ppvHeap: ^rawptr) -> HRESULT, CreateReservedResource1: proc "system" (this: ^IDevice4, pDesc: ^RESOURCE_DESC, InitialState: RESOURCE_STATES, pOptimizedClearValue: ^CLEAR_VALUE, pProtectedSession: ^IProtectedResourceSession, riid: ^IID, ppvResource: ^rawptr) -> HRESULT, - GetResourceAllocationInfo1: proc "system" (this: ^IDevice4, RetVal: ^RESOURCE_ALLOCATION_INFO, visibleMask: u32, numResourceDescs: u32, pResourceDescs: ^RESOURCE_DESC, pResourceAllocationInfo1: ^RESOURCE_ALLOCATION_INFO1), + GetResourceAllocationInfo1: proc "system" (this: ^IDevice4, RetVal: ^RESOURCE_ALLOCATION_INFO, visibleMask: u32, numResourceDescs: u32, pResourceDescs: [^]RESOURCE_DESC, pResourceAllocationInfo1: ^RESOURCE_ALLOCATION_INFO1), } LIFETIME_STATE :: enum i32 { @@ -3220,7 +3220,7 @@ BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS :: struct { using _: struct #raw_union { InstanceDescs: GPU_VIRTUAL_ADDRESS, pGeometryDescs: ^RAYTRACING_GEOMETRY_DESC, - ppGeometryDescs: ^^RAYTRACING_GEOMETRY_DESC, + ppGeometryDescs: [^]^RAYTRACING_GEOMETRY_DESC, }, } @@ -3267,8 +3267,8 @@ IDevice5_VTable :: struct { using id3d12device4_vtable: IDevice4_VTable, CreateLifetimeTracker: proc "system" (this: ^IDevice5, pOwner: ^ILifetimeOwner, riid: ^IID, ppvTracker: ^rawptr) -> HRESULT, RemoveDevice: proc "system" (this: ^IDevice5), - EnumerateMetaCommands: proc "system" (this: ^IDevice5, pNumMetaCommands: ^u32, pDescs: ^META_COMMAND_DESC) -> HRESULT, - EnumerateMetaCommandParameters: proc "system" (this: ^IDevice5, CommandId: ^GUID, Stage: META_COMMAND_PARAMETER_STAGE, pTotalStructureSizeInBytes: ^u32, pParameterCount: ^u32, pParameterDescs: ^META_COMMAND_PARAMETER_DESC) -> HRESULT, + EnumerateMetaCommands: proc "system" (this: ^IDevice5, pNumMetaCommands: ^u32, pDescs: [^]META_COMMAND_DESC) -> HRESULT, + EnumerateMetaCommandParameters: proc "system" (this: ^IDevice5, CommandId: ^GUID, Stage: META_COMMAND_PARAMETER_STAGE, pTotalStructureSizeInBytes: ^u32, pParameterCount: ^u32, pParameterDescs: [^]META_COMMAND_PARAMETER_DESC) -> HRESULT, CreateMetaCommand: proc "system" (this: ^IDevice5, CommandId: ^GUID, NodeMask: u32, pCreationParametersData: rawptr, CreationParametersDataSizeInBytes: SIZE_T, riid: ^IID, ppMetaCommand: ^rawptr) -> HRESULT, CreateStateObject: proc "system" (this: ^IDevice5, pDesc: ^STATE_OBJECT_DESC, riid: ^IID, ppStateObject: ^rawptr) -> HRESULT, GetRaytracingAccelerationStructurePrebuildInfo: proc "system" (this: ^IDevice5, pDesc: ^BUILD_RAYTRACING_ACCELERATION_STRUCTURE_INPUTS, pInfo: ^RAYTRACING_ACCELERATION_STRUCTURE_PREBUILD_INFO), @@ -3635,11 +3635,11 @@ IDevice8 :: struct #raw_union { } IDevice8_VTable :: struct { using id3d12device7_vtable: IDevice7_VTable, - GetResourceAllocationInfo2: proc "system" (this: ^IDevice8, RetVal: ^RESOURCE_ALLOCATION_INFO, visibleMask: u32, numResourceDescs: u32, pResourceDescs: ^RESOURCE_DESC1, pResourceAllocationInfo1: ^RESOURCE_ALLOCATION_INFO1), + GetResourceAllocationInfo2: proc "system" (this: ^IDevice8, RetVal: ^RESOURCE_ALLOCATION_INFO, visibleMask: u32, numResourceDescs: u32, pResourceDescs: [^]RESOURCE_DESC1, pResourceAllocationInfo1: ^RESOURCE_ALLOCATION_INFO1), CreateCommittedResource2: proc "system" (this: ^IDevice8, pHeapProperties: ^HEAP_PROPERTIES, HeapFlags: HEAP_FLAGS, pDesc: ^RESOURCE_DESC1, InitialResourceState: RESOURCE_STATES, pOptimizedClearValue: ^CLEAR_VALUE, pProtectedSession: ^IProtectedResourceSession, riidResource: ^IID, ppvResource: ^rawptr) -> HRESULT, CreatePlacedResource1: proc "system" (this: ^IDevice8, pHeap: ^IHeap, HeapOffset: u64, pDesc: ^RESOURCE_DESC1, InitialState: RESOURCE_STATES, pOptimizedClearValue: ^CLEAR_VALUE, riid: ^IID, ppvResource: ^rawptr) -> HRESULT, CreateSamplerFeedbackUnorderedAccessView: proc "system" (this: ^IDevice8, pTargetedResource: ^IResource, pFeedbackResource: ^IResource, DestDescriptor: CPU_DESCRIPTOR_HANDLE), - GetCopyableFootprints1: proc "system" (this: ^IDevice8, pResourceDesc: ^RESOURCE_DESC1, FirstSubresource: u32, NumSubresources: u32, BaseOffset: u64, pLayouts: ^PLACED_SUBRESOURCE_FOOTPRINT, pNumRows: ^u32, pRowSizeInBytes: ^u64, pTotalBytes: ^u64), + GetCopyableFootprints1: proc "system" (this: ^IDevice8, pResourceDesc: ^RESOURCE_DESC1, FirstSubresource: u32, NumSubresources: u32, BaseOffset: u64, pLayouts: [^]PLACED_SUBRESOURCE_FOOTPRINT, pNumRows: ^u32, pRowSizeInBytes: ^u64, pTotalBytes: ^u64), } @@ -3727,7 +3727,7 @@ RENDER_PASS_ENDING_ACCESS_RESOLVE_PARAMETERS :: struct { pSrcResource: ^IResource, pDstResource: ^IResource, SubresourceCount: u32, - pSubresourceParameters: ^RENDER_PASS_ENDING_ACCESS_RESOLVE_SUBRESOURCE_PARAMETERS, + pSubresourceParameters: [^]RENDER_PASS_ENDING_ACCESS_RESOLVE_SUBRESOURCE_PARAMETERS, Format: dxgi.FORMAT, ResolveMode: RESOLVE_MODE, PreserveResolveSource: BOOL, @@ -3792,11 +3792,11 @@ IGraphicsCommandList4 :: struct #raw_union { } IGraphicsCommandList4_VTable :: struct { using id3d12graphicscommandlist3_vtable: IGraphicsCommandList3_VTable, - BeginRenderPass: proc "system" (this: ^IGraphicsCommandList4, NumRenderTargets: u32, pRenderTargets: ^RENDER_PASS_RENDER_TARGET_DESC, pDepthStencil: ^RENDER_PASS_DEPTH_STENCIL_DESC, Flags: RENDER_PASS_FLAGS), + BeginRenderPass: proc "system" (this: ^IGraphicsCommandList4, NumRenderTargets: u32, pRenderTargets: [^]RENDER_PASS_RENDER_TARGET_DESC, pDepthStencil: ^RENDER_PASS_DEPTH_STENCIL_DESC, Flags: RENDER_PASS_FLAGS), EndRenderPass: proc "system" (this: ^IGraphicsCommandList4), InitializeMetaCommand: proc "system" (this: ^IGraphicsCommandList4, pMetaCommand: ^IMetaCommand, pInitializationParametersData: rawptr, InitializationParametersDataSizeInBytes: SIZE_T), ExecuteMetaCommand: proc "system" (this: ^IGraphicsCommandList4, pMetaCommand: ^IMetaCommand, pExecutionParametersData: rawptr, ExecutionParametersDataSizeInBytes: SIZE_T), - BuildRaytracingAccelerationStructure: proc "system" (this: ^IGraphicsCommandList4, pDesc: ^BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC, NumPostbuildInfoDescs: u32, pPostbuildInfoDescs: ^RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC), + BuildRaytracingAccelerationStructure: proc "system" (this: ^IGraphicsCommandList4, pDesc: ^BUILD_RAYTRACING_ACCELERATION_STRUCTURE_DESC, NumPostbuildInfoDescs: u32, pPostbuildInfoDescs: [^]RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC), EmitRaytracingAccelerationStructurePostbuildInfo: proc "system" (this: ^IGraphicsCommandList4, pDesc: ^RAYTRACING_ACCELERATION_STRUCTURE_POSTBUILD_INFO_DESC, NumSourceAccelerationStructures: u32, pSourceAccelerationStructureData: ^GPU_VIRTUAL_ADDRESS), CopyRaytracingAccelerationStructure: proc "system" (this: ^IGraphicsCommandList4, DestAccelerationStructureData: GPU_VIRTUAL_ADDRESS, SourceAccelerationStructureData: GPU_VIRTUAL_ADDRESS, Mode: RAYTRACING_ACCELERATION_STRUCTURE_COPY_MODE), SetPipelineState1: proc "system" (this: ^IGraphicsCommandList4, pStateObject: ^IStateObject), diff --git a/vendor/directx/d3d_compiler/d3d_compiler.odin b/vendor/directx/d3d_compiler/d3d_compiler.odin index f54ba3555..5a7178aff 100644 --- a/vendor/directx/d3d_compiler/d3d_compiler.odin +++ b/vendor/directx/d3d_compiler/d3d_compiler.odin @@ -39,7 +39,7 @@ foreign d3dcompiler { SetBlobPart :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, Part: BLOB_PART, Flags: u32, pPart: rawptr, PartSize: SIZE_T, ppNewShader: ^^ID3DBlob) -> HRESULT --- CreateBlob :: proc(Size: SIZE_T, ppBlob: ^^ID3DBlob) -> HRESULT --- CompressShaders :: proc(uNumShaders: u32, pShaderData: ^SHADER_DATA, uFlags: u32, ppCompressedData: ^^ID3DBlob) -> HRESULT --- - DecompressShaders :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, uNumShaders: u32, uStartIndex: u32, pIndices: ^u32, uFlags: u32, ppShaders: ^^ID3DBlob, pTotalShaders: ^u32) -> HRESULT --- + DecompressShaders :: proc(pSrcData: rawptr, SrcDataSize: SIZE_T, uNumShaders: u32, uStartIndex: u32, pIndices: ^u32, uFlags: u32, ppShaders: [^]^ID3DBlob, pTotalShaders: ^u32) -> HRESULT --- Disassemble10Effect :: proc(pEffect: ^ID3D10Effect, Flags: u32, ppDisassembly: ^^ID3DBlob) -> HRESULT --- } diff --git a/vendor/directx/dxgi/dxgi.odin b/vendor/directx/dxgi/dxgi.odin index 66201c494..0056b6a66 100644 --- a/vendor/directx/dxgi/dxgi.odin +++ b/vendor/directx/dxgi/dxgi.odin @@ -611,7 +611,7 @@ IDevice_VTable :: struct { using idxgiobject_vtable: IObject_VTable, GetAdapter: proc "system" (this: ^IDevice, pAdapter: ^^IAdapter) -> HRESULT, CreateSurface: proc "system" (this: ^IDevice, pDesc: ^SURFACE_DESC, NumSurfaces: u32, Usage: USAGE, pSharedResource: ^SHARED_RESOURCE, ppSurface: ^^ISurface) -> HRESULT, - QueryResourceResidency: proc "system" (this: ^IDevice, ppResources: ^^IUnknown, pResidencyStatus: ^RESIDENCY, NumResources: u32) -> HRESULT, + QueryResourceResidency: proc "system" (this: ^IDevice, ppResources: [^]^IUnknown, pResidencyStatus: [^]RESIDENCY, NumResources: u32) -> HRESULT, SetGPUThreadPriority: proc "system" (this: ^IDevice, Priority: i32) -> HRESULT, GetGPUThreadPriority: proc "system" (this: ^IDevice, pPriority: ^i32) -> HRESULT, } @@ -792,8 +792,8 @@ IDevice2 :: struct #raw_union { } IDevice2_VTable :: struct { using idxgidevice1_vtable: IDevice1_VTable, - OfferResources: proc "system" (this: ^IDevice2, NumResources: u32, ppResources: ^^IResource, Priority: OFFER_RESOURCE_PRIORITY) -> HRESULT, - ReclaimResources: proc "system" (this: ^IDevice2, NumResources: u32, ppResources: ^^IResource, pDiscarded: ^BOOL) -> HRESULT, + OfferResources: proc "system" (this: ^IDevice2, NumResources: u32, ppResources: [^]^IResource, Priority: OFFER_RESOURCE_PRIORITY) -> HRESULT, + ReclaimResources: proc "system" (this: ^IDevice2, NumResources: u32, ppResources: [^]^IResource, pDiscarded: ^BOOL) -> HRESULT, EnqueueSetEvent: proc "system" (this: ^IDevice2, hEvent: HANDLE) -> HRESULT, } MODE_DESC1 :: struct { @@ -1232,8 +1232,8 @@ IDevice4 :: struct #raw_union { } IDevice4_VTable :: struct { using idxgidevice3_vtable: IDevice3_VTable, - OfferResources1: proc "system" (this: ^IDevice4, NumResources: u32, ppResources: ^^IResource, Priority: OFFER_RESOURCE_PRIORITY, Flags: OFFER_RESOURCE_FLAGS) -> HRESULT, - ReclaimResources1: proc "system" (this: ^IDevice4, NumResources: u32, ppResources: ^^IResource, pResults: ^RECLAIM_RESOURCE_RESULTS) -> HRESULT, + OfferResources1: proc "system" (this: ^IDevice4, NumResources: u32, ppResources: [^]^IResource, Priority: OFFER_RESOURCE_PRIORITY, Flags: OFFER_RESOURCE_FLAGS) -> HRESULT, + ReclaimResources1: proc "system" (this: ^IDevice4, NumResources: u32, ppResources: [^]^IResource, pResults: [^]RECLAIM_RESOURCE_RESULTS) -> HRESULT, } FEATURE :: enum i32 { From b73275cf423186c558e637f629a846eb21c45f24 Mon Sep 17 00:00:00 2001 From: jason Date: Thu, 19 Dec 2024 17:12:07 -0500 Subject: [PATCH 052/431] Get arm64 up to speed in os2 linux Readded open flags for arm64 to sys/linux/bits.odin. Make process_start name based instead of descriptor based to allow running of scripts. Fix bug in heap_linux. Fix and simplify os2.remove. --- core/os/os2/file_linux.odin | 22 ++------ core/os/os2/heap_linux.odin | 2 +- core/os/os2/process_linux.odin | 47 ++++------------- core/sys/linux/bits.odin | 94 +++++++++++++++++++++------------- 4 files changed, 73 insertions(+), 92 deletions(-) diff --git a/core/os/os2/file_linux.odin b/core/os/os2/file_linux.odin index e9ce13447..20f179f77 100644 --- a/core/os/os2/file_linux.odin +++ b/core/os/os2/file_linux.odin @@ -272,28 +272,12 @@ _truncate :: proc(f: ^File, size: i64) -> Error { } _remove :: proc(name: string) -> Error { - is_dir_fd :: proc(fd: linux.Fd) -> bool { - s: linux.Stat - if linux.fstat(fd, &s) != .NONE { - return false - } - return linux.S_ISDIR(s.mode) - } - TEMP_ALLOCATOR_GUARD() name_cstr := temp_cstring(name) or_return - fd, errno := linux.open(name_cstr, {.NOFOLLOW}) - #partial switch (errno) { - case .ELOOP: - /* symlink */ - case .NONE: - defer linux.close(fd) - if is_dir_fd(fd) { - return _get_platform_error(linux.rmdir(name_cstr)) - } - case: - return _get_platform_error(errno) + if fd, errno := linux.open(name_cstr, _OPENDIR_FLAGS); errno == .NONE { + linux.close(fd) + return _get_platform_error(linux.rmdir(name_cstr)) } return _get_platform_error(linux.unlink(name_cstr)) diff --git a/core/os/os2/heap_linux.odin b/core/os/os2/heap_linux.odin index ede5eb2ac..8819dfac7 100644 --- a/core/os/os2/heap_linux.odin +++ b/core/os/os2/heap_linux.odin @@ -415,7 +415,7 @@ _region_resize :: proc(alloc: ^Allocation_Header, new_size: int, alloc_is_free_l back_idx := -1 idx: u16 infinite: for { - for i := 0; i < len(region_iter.hdr.free_list); i += 1 { + for i := 0; i < int(region_iter.hdr.free_list_len); i += 1 { idx = region_iter.hdr.free_list[i] if _get_block_count(region_iter.memory[idx]) >= new_block_count { break infinite diff --git a/core/os/os2/process_linux.odin b/core/os/os2/process_linux.odin index 7eb4dfa44..936fbfc40 100644 --- a/core/os/os2/process_linux.odin +++ b/core/os/os2/process_linux.odin @@ -384,14 +384,6 @@ _Sys_Process_Attributes :: struct {} @(private="package") _process_start :: proc(desc: Process_Desc) -> (process: Process, err: Error) { - has_executable_permissions :: proc(fd: linux.Fd) -> bool { - backing: [48]u8 - b := strings.builder_from_bytes(backing[:]) - strings.write_string(&b, "/proc/self/fd/") - strings.write_int(&b, int(fd)) - return linux.access(strings.to_cstring(&b), linux.X_OK) == .NONE - } - TEMP_ALLOCATOR_GUARD() if len(desc.command) == 0 { @@ -411,7 +403,7 @@ _process_start :: proc(desc: Process_Desc) -> (process: Process, err: Error) { } // search PATH if just a plain name is provided - exe_fd: linux.Fd + exe_path: cstring executable_name := desc.command[0] if strings.index_byte(executable_name, '/') < 0 { path_env := get_env("PATH", temp_allocator()) @@ -426,16 +418,11 @@ _process_start :: proc(desc: Process_Desc) -> (process: Process, err: Error) { strings.write_byte(&exe_builder, '/') strings.write_string(&exe_builder, executable_name) - exe_path := strings.to_cstring(&exe_builder) - if exe_fd, errno = linux.openat(dir_fd, exe_path, {.PATH, .CLOEXEC}); errno != .NONE { - continue + exe_path = strings.to_cstring(&exe_builder) + if linux.access(exe_path, linux.X_OK) == .NONE { + found = true + break } - if !has_executable_permissions(exe_fd) { - linux.close(exe_fd) - continue - } - found = true - break } if !found { // check in cwd to match windows behavior @@ -443,29 +430,18 @@ _process_start :: proc(desc: Process_Desc) -> (process: Process, err: Error) { strings.write_string(&exe_builder, "./") strings.write_string(&exe_builder, executable_name) - exe_path := strings.to_cstring(&exe_builder) - if exe_fd, errno = linux.openat(dir_fd, exe_path, {.PATH, .CLOEXEC}); errno != .NONE { + exe_path = strings.to_cstring(&exe_builder) + if linux.access(exe_path, linux.X_OK) != .NONE { return process, .Not_Exist } - if !has_executable_permissions(exe_fd) { - linux.close(exe_fd) - return process, .Permission_Denied - } } } else { - exe_path := temp_cstring(executable_name) or_return - if exe_fd, errno = linux.openat(dir_fd, exe_path, {.PATH, .CLOEXEC}); errno != .NONE { - return process, _get_platform_error(errno) - } - if !has_executable_permissions(exe_fd) { - linux.close(exe_fd) - return process, .Permission_Denied + exe_path = temp_cstring(executable_name) or_return + if linux.access(exe_path, linux.X_OK) != .NONE { + return process, .Not_Exist } } - // At this point, we have an executable. - defer linux.close(exe_fd) - // args and environment need to be a list of cstrings // that are terminated by a nil pointer. cargs := make([]cstring, len(desc.command) + 1, temp_allocator()) or_return @@ -492,7 +468,6 @@ _process_start :: proc(desc: Process_Desc) -> (process: Process, err: Error) { } defer linux.close(child_pipe_fds[READ]) - // TODO: This is the traditional textbook implementation with fork. // A more efficient implementation with vfork: // @@ -573,7 +548,7 @@ _process_start :: proc(desc: Process_Desc) -> (process: Process, err: Error) { write_errno_to_parent_and_abort(child_pipe_fds[WRITE], errno) } - errno = linux.execveat(exe_fd, "", &cargs[0], env, {.AT_EMPTY_PATH}) + errno = linux.execveat(dir_fd, exe_path, &cargs[0], env) assert(errno != nil) write_errno_to_parent_and_abort(child_pipe_fds[WRITE], errno) } diff --git a/core/sys/linux/bits.odin b/core/sys/linux/bits.odin index 9ce2e206e..c304397de 100644 --- a/core/sys/linux/bits.odin +++ b/core/sys/linux/bits.odin @@ -152,43 +152,65 @@ Errno :: enum i32 { RDONLY flag is not present, because it has the value of 0, i.e. it is the default, unless WRONLY or RDWR is specified. */ -Open_Flags_Bits :: enum { - WRONLY = 0, - RDWR = 1, - CREAT = 6, - EXCL = 7, - NOCTTY = 8, - TRUNC = 9, - APPEND = 10, - NONBLOCK = 11, - DSYNC = 12, - ASYNC = 13, - DIRECT = 14, - LARGEFILE = 15, - DIRECTORY = 16, - NOFOLLOW = 17, - NOATIME = 18, - CLOEXEC = 19, - PATH = 21, +when ODIN_ARCH != .arm64 && ODIN_ARCH != .arm32 { + Open_Flags_Bits :: enum { + WRONLY = 0, + RDWR = 1, + CREAT = 6, + EXCL = 7, + NOCTTY = 8, + TRUNC = 9, + APPEND = 10, + NONBLOCK = 11, + DSYNC = 12, + ASYNC = 13, + DIRECT = 14, + LARGEFILE = 15, + DIRECTORY = 16, + NOFOLLOW = 17, + NOATIME = 18, + CLOEXEC = 19, + PATH = 21, + } + // https://github.com/torvalds/linux/blob/7367539ad4b0f8f9b396baf02110962333719a48/include/uapi/asm-generic/fcntl.h#L19 + #assert(1 << uint(Open_Flags_Bits.WRONLY) == 0o0000000_1) + #assert(1 << uint(Open_Flags_Bits.RDWR) == 0o0000000_2) + #assert(1 << uint(Open_Flags_Bits.CREAT) == 0o00000_100) + #assert(1 << uint(Open_Flags_Bits.EXCL) == 0o00000_200) + #assert(1 << uint(Open_Flags_Bits.NOCTTY) == 0o00000_400) + #assert(1 << uint(Open_Flags_Bits.TRUNC) == 0o0000_1000) + #assert(1 << uint(Open_Flags_Bits.APPEND) == 0o0000_2000) + #assert(1 << uint(Open_Flags_Bits.NONBLOCK) == 0o0000_4000) + #assert(1 << uint(Open_Flags_Bits.DSYNC) == 0o000_10000) + #assert(1 << uint(Open_Flags_Bits.ASYNC) == 0o000_20000) + #assert(1 << uint(Open_Flags_Bits.DIRECT) == 0o000_40000) + #assert(1 << uint(Open_Flags_Bits.LARGEFILE) == 0o00_100000) + #assert(1 << uint(Open_Flags_Bits.DIRECTORY) == 0o00_200000) + #assert(1 << uint(Open_Flags_Bits.NOFOLLOW) == 0o00_400000) + #assert(1 << uint(Open_Flags_Bits.NOATIME) == 0o0_1000000) + #assert(1 << uint(Open_Flags_Bits.CLOEXEC) == 0o0_2000000) + #assert(1 << uint(Open_Flags_Bits.PATH) == 0o_10000000) +} else { + Open_Flags_Bits :: enum { + WRONLY = 0, + RDWR = 1, + CREAT = 6, + EXCL = 7, + NOCTTY = 8, + TRUNC = 9, + APPEND = 10, + NONBLOCK = 11, + DSYNC = 12, + ASYNC = 13, + DIRECTORY = 14, + NOFOLLOW = 15, + DIRECT = 16, + LARGEFILE = 17, + NOATIME = 18, + CLOEXEC = 19, + PATH = 21, + } } -// https://github.com/torvalds/linux/blob/7367539ad4b0f8f9b396baf02110962333719a48/include/uapi/asm-generic/fcntl.h#L19 -#assert(1 << uint(Open_Flags_Bits.WRONLY) == 0o0000000_1) -#assert(1 << uint(Open_Flags_Bits.RDWR) == 0o0000000_2) -#assert(1 << uint(Open_Flags_Bits.CREAT) == 0o00000_100) -#assert(1 << uint(Open_Flags_Bits.EXCL) == 0o00000_200) -#assert(1 << uint(Open_Flags_Bits.NOCTTY) == 0o00000_400) -#assert(1 << uint(Open_Flags_Bits.TRUNC) == 0o0000_1000) -#assert(1 << uint(Open_Flags_Bits.APPEND) == 0o0000_2000) -#assert(1 << uint(Open_Flags_Bits.NONBLOCK) == 0o0000_4000) -#assert(1 << uint(Open_Flags_Bits.DSYNC) == 0o000_10000) -#assert(1 << uint(Open_Flags_Bits.ASYNC) == 0o000_20000) -#assert(1 << uint(Open_Flags_Bits.DIRECT) == 0o000_40000) -#assert(1 << uint(Open_Flags_Bits.LARGEFILE) == 0o00_100000) -#assert(1 << uint(Open_Flags_Bits.DIRECTORY) == 0o00_200000) -#assert(1 << uint(Open_Flags_Bits.NOFOLLOW) == 0o00_400000) -#assert(1 << uint(Open_Flags_Bits.NOATIME) == 0o0_1000000) -#assert(1 << uint(Open_Flags_Bits.CLOEXEC) == 0o0_2000000) -#assert(1 << uint(Open_Flags_Bits.PATH) == 0o_10000000) /* Bits for FD_Flags bitset From 5f46b5ca50b48395edf08583278aa4bcd2c54ed9 Mon Sep 17 00:00:00 2001 From: Barinzaya Date: Thu, 19 Dec 2024 17:52:09 -0500 Subject: [PATCH 053/431] Fixed zeroing in resize_dynamic_array. When a dynamic array has unused capacity and is resized to a size greater than its capacity, the unused part of its capacity wasn't being zeroed. --- base/runtime/core_builtin.odin | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index d28dadd02..8184c0e74 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -826,10 +826,12 @@ _resize_dynamic_array :: #force_inline proc(a: ^Raw_Dynamic_Array, size_of_elem, return nil } + if should_zero && a.len < length { + num_reused := min(a.cap, length) - a.len + intrinsics.mem_zero(([^]byte)(a.data)[a.len*size_of_elem:], num_reused*size_of_elem) + } + if length <= a.cap { - if should_zero && a.len < length { - intrinsics.mem_zero(([^]byte)(a.data)[a.len*size_of_elem:], (length-a.len)*size_of_elem) - } a.len = max(length, 0) return nil } From 14216ebf5169581a738e9c235ef8119a95271b12 Mon Sep 17 00:00:00 2001 From: Barinzaya Date: Thu, 19 Dec 2024 20:07:04 -0500 Subject: [PATCH 054/431] Added some implicit broadcasting for #simd arrays. This covers broadcasting from untyped numbers when assigning, as well as when performing binary operations. SIMD intrinsics have not been adjusted --- src/check_expr.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index cc9483187..81e33a8e8 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -3672,6 +3672,13 @@ gb_internal bool check_binary_array_expr(CheckerContext *c, Token op, Operand *x } } } + if (is_type_simd_vector(x->type) && !is_type_simd_vector(y->type)) { + if (check_is_assignable_to(c, y, x->type)) { + if (check_binary_op(c, x, op)) { + return true; + } + } + } return false; } @@ -4556,6 +4563,19 @@ gb_internal void convert_to_typed(CheckerContext *c, Operand *operand, Type *tar break; } + case Type_SimdVector: { + Type *elem = base_array_type(t); + if (check_is_assignable_to(c, operand, elem)) { + operand->mode = Addressing_Value; + } else { + operand->mode = Addressing_Invalid; + convert_untyped_error(c, operand, target_type); + return; + } + + break; + } + case Type_Matrix: { Type *elem = base_array_type(t); if (check_is_assignable_to(c, operand, elem)) { From 5376d2a20b74e84967cad87ba8ee3cb3bfff4930 Mon Sep 17 00:00:00 2001 From: avanspector Date: Fri, 20 Dec 2024 17:19:04 +0100 Subject: [PATCH 055/431] fix haiku --- build_odin.sh | 2 +- core/c/libc/errno.odin | 15 +- core/c/libc/locale.odin | 2 +- core/os/os_haiku.odin | 13 +- core/os/stat_unix.odin | 2 +- core/sync/futex_haiku.odin | 54 +++--- core/sys/haiku/errno.odin | 217 +++++++++++++++++++++++ core/sys/haiku/find_directory.odin | 43 ++--- core/sys/haiku/os.odin | 276 ++++++++++++++--------------- core/sys/haiku/types.odin | 14 +- core/sys/posix/errno.odin | 89 +++++++++- core/sys/posix/fcntl.odin | 69 +++++++- core/sys/posix/grp.odin | 4 +- core/sys/posix/pthread.odin | 52 +++++- core/sys/posix/sched.odin | 9 +- core/sys/posix/signal.odin | 159 ++++++++++++++++- core/sys/posix/signal_libc.odin | 2 +- core/sys/posix/sys_stat.odin | 32 +++- core/sys/posix/time.odin | 13 +- 19 files changed, 841 insertions(+), 226 deletions(-) create mode 100644 core/sys/haiku/errno.odin diff --git a/build_odin.sh b/build_odin.sh index 3547689d5..09094c151 100755 --- a/build_odin.sh +++ b/build_odin.sh @@ -115,7 +115,7 @@ OpenBSD) LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs)" ;; Haiku) - CXXFLAGS="$CXXFLAGS $($LLVM_CONFIG --cxxflags --ldflags) -I/system/develop/headers/private/shared -I/system/develop/headers/private/kernel" + CXXFLAGS="$CXXFLAGS -D_GNU_SOURCE $($LLVM_CONFIG --cxxflags --ldflags) -I/system/develop/headers/private/shared -I/system/develop/headers/private/kernel" LDFLAGS="$LDFLAGS -liconv" LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs)" ;; diff --git a/core/c/libc/errno.odin b/core/c/libc/errno.odin index de429a6ec..5d1ca8248 100644 --- a/core/c/libc/errno.odin +++ b/core/c/libc/errno.odin @@ -88,14 +88,15 @@ when ODIN_OS == .Haiku { _get_errno :: proc() -> ^int --- } - @(private="file") - B_GENERAL_ERROR_BASE :: min(i32) - @(private="file") - B_POSIX_ERROR_BASE :: B_GENERAL_ERROR_BASE + 0x7000 + _HAIKU_USE_POSITIVE_POSIX_ERRORS :: #config(HAIKU_USE_POSITIVE_POSIX_ERRORS, false) + _POSIX_ERROR_FACTOR :: -1 when _HAIKU_USE_POSITIVE_POSIX_ERRORS else 1 - EDOM :: B_POSIX_ERROR_BASE + 16 - EILSEQ :: B_POSIX_ERROR_BASE + 38 - ERANGE :: B_POSIX_ERROR_BASE + 17 + @(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 { diff --git a/core/c/libc/locale.odin b/core/c/libc/locale.odin index 371d755c5..d95f5c164 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 == .Windows { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Haiku || ODIN_OS == .Windows { LC_ALL :: 0 LC_COLLATE :: 1 diff --git a/core/os/os_haiku.odin b/core/os/os_haiku.odin index 4ad370724..d44ca9df0 100644 --- a/core/os/os_haiku.odin +++ b/core/os/os_haiku.odin @@ -1,11 +1,13 @@ package os -foreign import libc "system:c" +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 @@ -117,14 +119,13 @@ 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 libc { - @(link_name="_errorp") __error :: proc() -> ^c.int --- - +foreign lib { @(link_name="fork") _unix_fork :: proc() -> pid_t --- @(link_name="getthrid") _unix_getthrid :: proc() -> int --- - @(link_name="open") _unix_open :: proc(path: cstring, flags: c.int, #c_vararg mode: ..u16) -> Handle --- @(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 --- @@ -203,7 +204,7 @@ fork :: proc() -> (Pid, Error) { 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 := _unix_open(cstr, c.int(flags), u16(mode)) + 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() } diff --git a/core/os/stat_unix.odin b/core/os/stat_unix.odin index 7f7985e83..648987a07 100644 --- a/core/os/stat_unix.odin +++ b/core/os/stat_unix.odin @@ -53,7 +53,7 @@ File_Info :: struct { @(private, require_results) _make_time_from_unix_file_time :: proc(uft: Unix_File_Time) -> time.Time { return time.Time{ - _nsec = uft.nanoseconds + uft.seconds * 1_000_000_000, + _nsec = i64(uft.nanoseconds) + i64(uft.seconds) * 1_000_000_000, } } diff --git a/core/sync/futex_haiku.odin b/core/sync/futex_haiku.odin index 21d07b801..d1b265228 100644 --- a/core/sync/futex_haiku.odin +++ b/core/sync/futex_haiku.odin @@ -1,14 +1,12 @@ #+private package sync -import "core:c" -import "core:sys/haiku" -import "core:sys/unix" +import "core:sys/posix" import "core:time" @(private="file") Wait_Node :: struct { - thread: unix.pthread_t, + thread: posix.pthread_t, futex: ^Futex, prev, next: ^Wait_Node, } @@ -58,7 +56,7 @@ _futex_wait :: proc "contextless" (f: ^Futex, expect: u32) -> (ok: bool) { head := &waitq.list waiter := Wait_Node{ - thread = unix.pthread_self(), + thread = posix.pthread_self(), futex = f, prev = head, next = head.next, @@ -67,25 +65,25 @@ _futex_wait :: proc "contextless" (f: ^Futex, expect: u32) -> (ok: bool) { waiter.prev.next = &waiter waiter.next.prev = &waiter - old_mask, mask: haiku.sigset_t - haiku.sigemptyset(&mask) - haiku.sigaddset(&mask, haiku.SIGCONT) - unix.pthread_sigmask(haiku.SIG_BLOCK, &mask, &old_mask) + 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: c.int - haiku.sigwait(&mask, &sig) - errno := haiku.errno() - ok = errno == .OK + sig: posix.Signal + posix.sigwait(&mask, &sig) + errno := posix.errno() + ok = errno == nil } waiter.prev.next = waiter.next waiter.next.prev = waiter.prev - _ = unix.pthread_sigmask(haiku.SIG_SETMASK, &old_mask, nil) + _ = posix.pthread_sigmask(.SETMASK, &old_mask, nil) // FIXME: Add error handling! return @@ -101,7 +99,7 @@ _futex_wait_with_timeout :: proc "contextless" (f: ^Futex, expect: u32, duration head := &waitq.list waiter := Wait_Node{ - thread = unix.pthread_self(), + thread = posix.pthread_self(), futex = f, prev = head, next = head.next, @@ -110,29 +108,29 @@ _futex_wait_with_timeout :: proc "contextless" (f: ^Futex, expect: u32, duration waiter.prev.next = &waiter waiter.next.prev = &waiter - old_mask, mask: haiku.sigset_t - haiku.sigemptyset(&mask) - haiku.sigaddset(&mask, haiku.SIGCONT) - unix.pthread_sigmask(haiku.SIG_BLOCK, &mask, &old_mask) + 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: haiku.siginfo_t - ts := unix.timespec{ - tv_sec = i64(duration / 1e9), + 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 := haiku.errno() - ok = errno == .EAGAIN || errno == .OK + posix.sigtimedwait(&mask, &info, &ts) + errno := posix.errno() + ok = errno == .EAGAIN || errno == nil } waiter.prev.next = waiter.next waiter.next.prev = waiter.prev - unix.pthread_sigmask(haiku.SIG_SETMASK, &old_mask, nil) + posix.pthread_sigmask(.SETMASK, &old_mask, nil) // FIXME: Add error handling! return @@ -146,7 +144,7 @@ _futex_signal :: proc "contextless" (f: ^Futex) { head := &waitq.list for waiter := head.next; waiter != head; waiter = waiter.next { if waiter.futex == f { - unix.pthread_kill(waiter.thread, haiku.SIGCONT) + posix.pthread_kill(waiter.thread, .SIGCONT) break } } @@ -160,7 +158,7 @@ _futex_broadcast :: proc "contextless" (f: ^Futex) { head := &waitq.list for waiter := head.next; waiter != head; waiter = waiter.next { if waiter.futex == f { - unix.pthread_kill(waiter.thread, haiku.SIGCONT) + posix.pthread_kill(waiter.thread, .SIGCONT) } } } diff --git a/core/sys/haiku/errno.odin b/core/sys/haiku/errno.odin new file mode 100644 index 000000000..2b5e3681c --- /dev/null +++ b/core/sys/haiku/errno.odin @@ -0,0 +1,217 @@ +#+build haiku +package sys_haiku + +import "core:sys/posix" + +foreign import libroot "system:c" + +Errno :: enum i32 { + // 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, + + // 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, + + // New error codes that can be mapped to POSIX errors + TOO_MANY_ARGS = posix.E2BIG, + FILE_TOO_LARGE = posix.EFBIG, + DEVICE_NOT_FOUND = posix.ENODEV, + RESULT_NOT_REPRESENTABLE = posix.ERANGE, + BUFFER_OVERFLOW = posix.EOVERFLOW, + NOT_SUPPORTED = posix.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 index 758c4dff4..917394f48 100644 --- a/core/sys/haiku/find_directory.odin +++ b/core/sys/haiku/find_directory.odin @@ -1,9 +1,11 @@ #+build haiku package sys_haiku -import "core:c" +import "base:intrinsics" -directory_which :: enum c.int { +foreign import libroot "system:c" + +directory_which :: enum i32 { // Per volume directories DESKTOP_DIRECTORY = 0, TRASH_DIRECTORY, @@ -110,17 +112,18 @@ directory_which :: enum c.int { BEOS_SOUNDS_DIRECTORY, } -find_path_flags :: enum c.int { - CREATE_DIRECTORY = 0x0001, - CREATE_PARENT_DIRECTORY = 0x0002, - EXISTING_ONLY = 0x0004, +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 = 0x0010, - USER_ONLY = 0x0020, + // 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 c.int { +path_base_directory :: enum i32 { INSTALLATION_LOCATION_DIRECTORY, ADD_ONS_DIRECTORY, APPS_DIRECTORY, @@ -146,7 +149,7 @@ path_base_directory :: enum c.int { TRANSLATORS_DIRECTORY, VAR_DIRECTORY, - // find_path() only! + // find_path() only IMAGE_PATH = 1000, PACKAGE_PATH, } @@ -154,15 +157,15 @@ path_base_directory :: enum c.int { // 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() -> rawptr { return rawptr(current_image_symbol) } +current_image_symbol :: proc "contextless" () -> rawptr { return rawptr(current_image_symbol) } -foreign import libroot "system:c" +@(default_calling_convention="c") foreign libroot { - find_directory :: proc(which: directory_which, volume: dev_t, createIt: bool, pathString: [^]c.char, length: i32) -> status_t --- - find_path :: proc(codePointer: rawptr, baseDirectory: path_base_directory, subPath: cstring, pathBuffer: [^]c.char, bufferSize: c.size_t) -> status_t --- - find_path_etc :: proc(codePointer: rawptr, dependency: cstring, architecture: cstring, baseDirectory: path_base_directory, subPath: cstring, flags: find_path_flags, pathBuffer: [^]c.char, bufferSize: c.size_t) -> status_t --- - find_path_for_path :: proc(path: cstring, baseDirectory: path_base_directory, subPath: cstring, pathBuffer: [^]c.char, bufferSize: c.size_t) -> 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: [^]c.char, bufferSize: c.size_t) -> status_t --- - find_paths :: proc(baseDirectory: path_base_directory, subPath: cstring, _paths: ^[^][^]c.char, _pathCount: ^c.size_t) -> status_t --- - find_paths_etc :: proc(architecture: cstring, baseDirectory: path_base_directory, subPath: cstring, flags: find_path_flags, _paths: ^[^][^]c.char, _pathCount: ^c.size_t) -> status_t --- + 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: uintptr) -> 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: uintptr) -> status_t --- + find_path_for_path :: proc(path: cstring, baseDirectory: path_base_directory, subPath: cstring, pathBuffer: [^]byte, bufferSize: uintptr) -> 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: uintptr) -> status_t --- + find_paths :: proc(baseDirectory: path_base_directory, subPath: cstring, _paths: ^[^][^]byte, _pathCount: ^uintptr) -> status_t --- + find_paths_etc :: proc(architecture: cstring, baseDirectory: path_base_directory, subPath: cstring, flags: find_path_flags, _paths: ^[^][^]byte, _pathCount: ^uintptr) -> status_t --- } diff --git a/core/sys/haiku/os.odin b/core/sys/haiku/os.odin index 6ab3ef573..a9c5ea57d 100644 --- a/core/sys/haiku/os.odin +++ b/core/sys/haiku/os.odin @@ -1,8 +1,8 @@ #+build haiku package sys_haiku +import "base:intrinsics" import "core:c" -import "core:sys/unix" foreign import libroot "system:c" @@ -18,8 +18,8 @@ OS_NAME_LENGTH :: 32 area_info :: struct { area: area_id, - name: [OS_NAME_LENGTH]c.char, - size: c.size_t, + name: [OS_NAME_LENGTH]byte, + size: uintptr, lock: u32, protection: u32, team: team_id, @@ -31,11 +31,11 @@ area_info :: struct { } area_locking :: enum u32 { - NO_LOCK = 0, - LAZY_LOCK = 1, - FULL_LOCK = 2, - CONTIGUOUS = 3, - LOMEM = 4, // CONTIGUOUS, < 16 MB physical address + 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 } @@ -52,27 +52,29 @@ address_spec :: enum u32 { RANDOMIZED_BASE_ADDRESS = 7, } -area_protection_flags :: enum u32 { - READ_AREA = 1 << 0, - WRITE_AREA = 1 << 1, - EXECUTE_AREA = 1 << 2, +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 = 1 << 3, - CLONEABLE_AREA = 1 << 8, + 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: c.size_t, lock: area_locking, protection: area_protection_flags) -> area_id --- + create_area :: proc(name: cstring, startAddress: ^rawptr, addressSpec: address_spec, size: uintptr, 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: c.size_t) -> status_t --- + resize_area :: proc(id: area_id, newSize: uintptr) -> 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: c.size_t) -> status_t --- - _get_next_area_info :: proc(team: team_id, cookie: ^c.ssize_t, areaInfo: ^area_info, size: c.size_t) -> status_t --- + _get_area_info :: proc(id: area_id, areaInfo: ^area_info, size: uintptr) -> status_t --- + _get_next_area_info :: proc(team: team_id, cookie: ^c.ssize_t, areaInfo: ^area_info, size: uintptr) -> status_t --- } // Ports @@ -80,33 +82,35 @@ foreign libroot { port_info :: struct { port: port_id, team: team_id, - name: [OS_NAME_LENGTH]c.char, + 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_flags :: enum u32 { - USE_USER_MEMCPY = 0x80000000, +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 = 0x100, + 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: c.size_t) -> c.ssize_t --- - read_port_etc :: proc(port: port_id, code: ^i32, buffer: rawptr, bufferSize: c.size_t, flags: port_flags, timeout: bigtime_t) -> c.ssize_t --- - write_port :: proc(port: port_id, code: i32, buffer: rawptr, bufferSize: c.size_t) -> status_t --- - write_port_etc :: proc(port: port_id, code: i32, buffer: rawptr, bufferSize: c.size_t, flags: port_flags, timeout: bigtime_t) -> status_t --- + read_port :: proc(port: port_id, code: ^i32, buffer: rawptr, bufferSize: uintptr) -> c.ssize_t --- + read_port_etc :: proc(port: port_id, code: ^i32, buffer: rawptr, bufferSize: uintptr, flags: port_flags, timeout: bigtime_t) -> c.ssize_t --- + write_port :: proc(port: port_id, code: i32, buffer: rawptr, bufferSize: uintptr) -> status_t --- + write_port_etc :: proc(port: port_id, code: i32, buffer: rawptr, bufferSize: uintptr, 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) -> c.ssize_t --- port_buffer_size_etc :: proc(port: port_id, flags: port_flags, timeout: bigtime_t) -> c.ssize_t --- port_count :: proc(port: port_id) -> c.ssize_t --- set_port_owner :: proc(port: port_id, team: team_id) -> status_t --- - _get_port_info :: proc(port: port_id, portInfo: ^port_info, portInfoSize: c.size_t) -> status_t --- - _get_next_port_info :: proc(team: team_id, cookie: ^i32, portInfo: ^port_info, portInfoSize: c.size_t) -> status_t --- + _get_port_info :: proc(port: port_id, portInfo: ^port_info, portInfoSize: uintptr) -> status_t --- + _get_next_port_info :: proc(team: team_id, cookie: ^i32, portInfo: ^port_info, portInfoSize: uintptr) -> status_t --- } // Semaphores @@ -114,22 +118,24 @@ foreign libroot { sem_info :: struct { sem: sem_id, team: team_id, - name: [OS_NAME_LENGTH]c.char, + name: [OS_NAME_LENGTH]byte, count: i32, latest_holder: thread_id, } -semaphore_flags :: enum u32 { - CAN_INTERRUPT = 0x01, // acquisition of the semaphore can be interrupted (system use only) - CHECK_PERMISSION = 0x04, // ownership will be checked (system use only) - KILL_CAN_INTERRUPT = 0x20, // acquisition of the semaphore can be interrupted by SIGKILL[THR], even if not CAN_INTERRUPT (system use only) +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 = 0x02, // thread is not rescheduled - RELEASE_ALL = 0x08, // all waiting threads will be woken up, count will be zeroed - RELEASE_IF_WAITING_ONLY = 0x10, // release count only if there are any threads waiting + 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 --- @@ -141,8 +147,8 @@ foreign libroot { 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: c.size_t) -> status_t --- - _get_next_sem_info :: proc(team: team_id, cookie: ^i32, info: ^sem_info, infoSize: c.size_t) -> status_t --- + _get_sem_info :: proc(id: sem_id, info: ^sem_info, infoSize: uintptr) -> status_t --- + _get_next_sem_info :: proc(team: team_id, cookie: ^i32, info: ^sem_info, infoSize: uintptr) -> status_t --- } // Teams @@ -155,7 +161,7 @@ team_info :: struct { debugger_nub_thread: thread_id, debugger_nub_port: port_id, argc: i32, - args: [64]c.char, + args: [64]byte, uid: uid_t, gid: gid_t, @@ -165,7 +171,7 @@ team_info :: struct { group_id: pid_t, session_id: pid_t, parent: team_id, - name: [OS_NAME_LENGTH]c.char, + name: [OS_NAME_LENGTH]byte, start_time: bigtime_t, } @@ -183,17 +189,18 @@ team_usage_who :: enum i32 { 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: c.size_t) -> status_t --- - _get_next_team_info :: proc(cookie: ^i32, info: ^team_info, size: c.size_t) -> status_t --- - _get_team_usage_info :: proc(id: team_id, who: team_usage_who, info: ^team_usage_info, size: c.size_t) -> status_t --- + _get_team_info :: proc(id: team_id, info: ^team_info, size: uintptr) -> status_t --- + _get_next_team_info :: proc(cookie: ^i32, info: ^team_info, size: uintptr) -> status_t --- + _get_team_usage_info :: proc(id: team_id, who: team_usage_who, info: ^team_usage_info, size: uintptr) -> status_t --- } // Threads -thread_state :: enum c.int { +thread_state :: enum i32 { RUNNING = 1, READY, RECEIVING, @@ -205,7 +212,7 @@ thread_state :: enum c.int { thread_info :: struct { thread: thread_id, team: team_id, - name: [OS_NAME_LENGTH]c.char, + name: [OS_NAME_LENGTH]byte, state: thread_state, priority: thread_priority, sem: sem_id, @@ -234,6 +241,7 @@ 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 --- @@ -247,24 +255,25 @@ foreign libroot { 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: c.size_t) -> status_t --- - receive_data :: proc(sender: ^thread_id, buffer: rawptr, bufferSize: c.size_t) -> i32 --- + send_data :: proc(thread: thread_id, code: i32, buffer: rawptr, bufferSize: uintptr) -> status_t --- + receive_data :: proc(sender: ^thread_id, buffer: rawptr, bufferSize: uintptr) -> 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: c.int, flags: u32) -> status_t --- - snooze_until :: proc(time: bigtime_t, timeBase: c.int) -> status_t --- - _get_thread_info :: proc(id: thread_id, info: ^thread_info, size: c.size_t) -> status_t --- - _get_next_thread_info :: proc(team: team_id, cookie: ^i32, info: ^thread_info, size: c.size_t) -> status_t --- + 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: uintptr) -> status_t --- + _get_next_thread_info :: proc(team: team_id, cookie: ^i32, info: ^thread_info, size: uintptr) -> 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() -> c.ulong --- - set_real_time_clock :: proc(secsSinceJan1st1970: c.ulong) --- + 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 --- @@ -280,12 +289,14 @@ alarm_mode :: enum u32 { 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) --- /* @@ -296,7 +307,7 @@ foreign libroot { to re-enable the default debugger pass a zero. */ - disable_debugger :: proc(state: c.int) -> c.int --- + disable_debugger :: proc(state: i32) -> i32 --- } // System information @@ -338,15 +349,15 @@ system_info :: struct { max_teams: u32, used_teams: u32, - kernel_name: [FILE_NAME_LENGTH]c.char, - kernel_build_date: [OS_NAME_LENGTH]c.char, - kernel_build_time: [OS_NAME_LENGTH]c.char, + 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 c.int { +topology_level_type :: enum i32 { UNKNOWN, ROOT, SMT, @@ -354,7 +365,7 @@ topology_level_type :: enum c.int { PACKAGE, } -cpu_platform :: enum c.int { +cpu_platform :: enum i32 { UNKNOWN, x86, x86_64, @@ -370,7 +381,7 @@ cpu_platform :: enum c.int { RISC_V, } -cpu_vendor :: enum c.int { +cpu_vendor :: enum i32 { UNKNOWN, AMD, CYRIX, @@ -408,95 +419,68 @@ cpu_topology_node_info :: struct { }, } -// FIXME: Add cpuid_info when bit fields are ready. +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: c.size_t) -> status_t --- + _get_cpu_info_etc :: proc(firstCPU: u32, cpuCount: u32, info: ^cpu_info, size: uintptr) -> status_t --- get_cpu_topology_info :: proc(topologyInfos: [^]cpu_topology_node_info, topologyInfoCount: ^u32) -> status_t --- - is_computer_on :: proc() -> i32 --- - is_computer_on_fire :: proc() -> f64 --- -} - -// Signal.h - -SIG_BLOCK :: 1 -SIG_UNBLOCK :: 2 -SIG_SETMASK :: 3 - -/* - * The list of all defined signals: - * - * The numbering of signals for Haiku attempts to maintain - * some consistency with UN*X conventions so that things - * like "kill -9" do what you expect. - */ - -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 - -sigval :: struct #raw_union { - sival_int: c.int, - sival_ptr: rawptr, -} - -siginfo_t :: struct { - si_signo: c.int, // signal number - si_code: c.int, // signal code - si_errno: c.int, // if non zero, an error number 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 -} - -foreign libroot { - // signal set (sigset_t) manipulation - sigemptyset :: proc(set: ^sigset_t) -> c.int --- - sigfillset :: proc(set: ^sigset_t) -> c.int --- - sigaddset :: proc(set: ^sigset_t, _signal: c.int) -> c.int --- - sigdelset :: proc(set: ^sigset_t, _signal: c.int) -> c.int --- - sigismember :: proc(set: ^sigset_t, _signal: c.int) -> c.int --- - // querying and waiting for signals - sigpending :: proc(set: ^sigset_t) -> c.int --- - sigsuspend :: proc(mask: ^sigset_t) -> c.int --- - sigpause :: proc(_signal: c.int) -> c.int --- - sigwait :: proc(set: ^sigset_t, _signal: ^c.int) -> c.int --- - sigwaitinfo :: proc(set: ^sigset_t, info: ^siginfo_t) -> c.int --- - sigtimedwait :: proc(set: ^sigset_t, info: ^siginfo_t, timeout: ^unix.timespec) -> c.int --- - - send_signal :: proc(threadID: thread_id, signal: c.uint) -> c.int --- - set_signal_stack :: proc(base: rawptr, size: c.size_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 --- } diff --git a/core/sys/haiku/types.odin b/core/sys/haiku/types.odin index 47755b0b7..f15ffb00d 100644 --- a/core/sys/haiku/types.odin +++ b/core/sys/haiku/types.odin @@ -1,9 +1,7 @@ #+build haiku package sys_haiku -import "core:c" - -status_t :: i32 +status_t :: Errno bigtime_t :: i64 nanotime_t :: i64 type_code :: u32 @@ -37,16 +35,20 @@ mode_t :: u32 umode_t :: u32 nlink_t :: i32 -caddr_t :: ^c.char +caddr_t :: [^]byte addr_t :: phys_addr_t key_t :: i32 clockid_t :: i32 -time_t :: i64 when ODIN_ARCH == .amd64 || ODIN_ARCH == .arm64 else i32 +time_t :: int +timespec :: struct { + tv_sec: time_t, + tv_nsec: int, +} -sig_atomic_t :: c.int +sig_atomic_t :: i32 sigset_t :: u64 image_id :: i32 diff --git a/core/sys/posix/errno.odin b/core/sys/posix/errno.odin index 9bc77f12e..bb4e9e045 100644 --- a/core/sys/posix/errno.odin +++ b/core/sys/posix/errno.odin @@ -1,4 +1,4 @@ -#+build windows, darwin, linux, freebsd, openbsd, netbsd +#+build windows, darwin, linux, freebsd, openbsd, netbsd, haiku package posix import "core:c" @@ -536,5 +536,92 @@ 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 d948af600..bc0b5b5ba 100644 --- a/core/sys/posix/fcntl.odin +++ b/core/sys/posix/fcntl.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, openbsd, freebsd, netbsd +#+build linux, darwin, openbsd, freebsd, netbsd, haiku package posix import "core:c" @@ -343,6 +343,7 @@ when ODIN_OS == .Darwin { l_type: Lock_Type, /* [PSX] type of lock */ l_whence: c.short, /* [PSX] flag (Whence) of starting offset */ } + } else when ODIN_OS == .OpenBSD { off_t :: distinct c.int64_t @@ -408,6 +409,72 @@ 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/grp.odin b/core/sys/posix/grp.odin index 956ed148b..3694308a0 100644 --- a/core/sys/posix/grp.odin +++ b/core/sys/posix/grp.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd +#+build linux, darwin, netbsd, openbsd, freebsd, haiku 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 == .Linux { +when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD || ODIN_OS == .Haiku || ODIN_OS == .Linux { gid_t :: distinct c.uint32_t diff --git a/core/sys/posix/pthread.odin b/core/sys/posix/pthread.odin index 490064da6..36a3cd7b3 100644 --- a/core/sys/posix/pthread.odin +++ b/core/sys/posix/pthread.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd +#+build linux, darwin, netbsd, openbsd, freebsd, haiku package posix import "core:c" @@ -554,6 +554,56 @@ 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/sched.odin b/core/sys/posix/sched.odin index e91178b09..82b335653 100644 --- a/core/sys/posix/sched.odin +++ b/core/sys/posix/sched.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd +#+build linux, darwin, netbsd, openbsd, freebsd, haiku package posix import "core:c" @@ -101,4 +101,11 @@ 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 4ba4e9943..d43270410 100644 --- a/core/sys/posix/signal.odin +++ b/core/sys/posix/signal.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd +#+build linux, darwin, netbsd, openbsd, freebsd, haiku package posix import "base:intrinsics" @@ -185,6 +185,16 @@ foreign lib { */ sigwait :: proc(set: ^sigset_t, sig: ^Signal) -> Errno --- + when ODIN_OS != .Darwin { + /* + Wait for queued signals. + + [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/sigtimedwait.html ]] + */ + sigtimedwait :: proc(set: ^sigset_t, info: ^siginfo_t, timeout: ^timespec) -> result --- + } + + /* NOTE: unimplemented on darwin. void psiginfo(const siginfo_t *, const char *); @@ -1180,4 +1190,151 @@ when ODIN_OS == .Darwin { SI_TIMER :: -2 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 aef22da29..7a054ddd7 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 +#+build linux, windows, darwin, netbsd, openbsd, freebsd, haiku package posix import "base:intrinsics" diff --git a/core/sys/posix/sys_stat.odin b/core/sys/posix/sys_stat.odin index 61b98ef35..265356e54 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 +#+build linux, darwin, netbsd, openbsd, freebsd, haiku package posix import "core:c" @@ -428,6 +428,36 @@ 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/time.odin b/core/sys/posix/time.odin index f9c51c63c..88f0153f4 100644 --- a/core/sys/posix/time.odin +++ b/core/sys/posix/time.odin @@ -1,4 +1,4 @@ -#+build linux, darwin, netbsd, openbsd, freebsd +#+build linux, darwin, netbsd, openbsd, freebsd, haiku package posix import "core:c" @@ -230,6 +230,17 @@ 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 From be4748831d9ba0c462339b20e50dc0de8da181cd Mon Sep 17 00:00:00 2001 From: avanspector Date: Fri, 20 Dec 2024 17:25:15 +0100 Subject: [PATCH 056/431] Delete errors.odin --- core/sys/haiku/errors.odin | 239 ------------------------------------- 1 file changed, 239 deletions(-) delete mode 100644 core/sys/haiku/errors.odin diff --git a/core/sys/haiku/errors.odin b/core/sys/haiku/errors.odin deleted file mode 100644 index febe647ea..000000000 --- a/core/sys/haiku/errors.odin +++ /dev/null @@ -1,239 +0,0 @@ -#+build haiku -package sys_haiku - -import "core:c" - -Errno :: enum c.int { - // Error baselines - GENERAL_ERROR_BASE = min(c.int), - 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, - - // 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, - - // Some POSIX errors - E2BIG = POSIX_ERROR_BASE + 1, - EFBIG = POSIX_ERROR_BASE + 4, - ENODEV = POSIX_ERROR_BASE + 7, - ERANGE = POSIX_ERROR_BASE + 17, - EOVERFLOW = POSIX_ERROR_BASE + 41, - EOPNOTSUPP = POSIX_ERROR_BASE + 43, - - ENOSYS = POSIX_ERROR_BASE + 9, - EAGAIN = WOULD_BLOCK, - - // New error codes that can be mapped to POSIX errors - TOO_MANY_ARGS_NEG = E2BIG, - FILE_TOO_LARGE_NEG = EFBIG, - DEVICE_NOT_FOUND_NEG = ENODEV, - RESULT_NOT_REPRESENTABLE_NEG = ERANGE, - BUFFER_OVERFLOW_NEG = EOVERFLOW, - NOT_SUPPORTED_NEG = EOPNOTSUPP, - - TOO_MANY_ARGS_POS = -E2BIG, - FILE_TOO_LARGE_POS = -EFBIG, - DEVICE_NOT_FOUND_POS = -ENODEV, - RESULT_NOT_REPRESENTABLE_POS = -ERANGE, - BUFFER_OVERFLOW_POS = -EOVERFLOW, - NOT_SUPPORTED_POS = -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, -} - -errno :: #force_inline proc "contextless" () -> Errno { - return Errno(_errnop()^) -} - -foreign import libroot "system:c" -foreign libroot { - _to_positive_error :: proc(error: c.int) -> c.int --- - _to_negative_error :: proc(error: c.int) -> c.int --- - - _errnop :: proc() -> ^c.int --- -} From c06f79bb360bc27353f5139a6c763828b3a16ba2 Mon Sep 17 00:00:00 2001 From: chris-montero Date: Sat, 21 Dec 2024 15:53:55 +0200 Subject: [PATCH 057/431] fixed memory leak in core/prof/spall/doc.odin example code --- core/prof/spall/doc.odin | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/prof/spall/doc.odin b/core/prof/spall/doc.odin index c81bad05f..b007ad4cb 100644 --- a/core/prof/spall/doc.odin +++ b/core/prof/spall/doc.odin @@ -18,6 +18,8 @@ Example: defer spall.context_destroy(&spall_ctx) buffer_backing := make([]u8, spall.BUFFER_DEFAULT_SIZE) + defer delete(buffer_backing) + spall_buffer = spall.buffer_create(buffer_backing, u32(sync.current_thread_id())) defer spall.buffer_destroy(&spall_ctx, &spall_buffer) From e5f32e145512a1fb0db142a214dee2d3b42ac073 Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Sat, 21 Dec 2024 15:47:26 +0100 Subject: [PATCH 058/431] Makes tracking allocator default to crashing on a bad free instead of add to bad_free_array. The bad_free_array remains to not break old code. The new default behavior is implemented in a callback that you can override, there's a second provided callback that provides the old behavior where an element was added to bad_free_array. Rationale: Many people are just checking the allocation_map, but don't check the bad free array. Several examples throughout core that use tracking allocator don't check bad_free_array either, so people have been taught not to check it. --- core/mem/tracking_allocator.odin | 50 ++++++++++++++++++---- core/testing/runner.odin | 1 + tests/core/container/test_core_rbtree.odin | 1 + 3 files changed, 43 insertions(+), 9 deletions(-) diff --git a/core/mem/tracking_allocator.odin b/core/mem/tracking_allocator.odin index cf780de3f..25c547471 100644 --- a/core/mem/tracking_allocator.odin +++ b/core/mem/tracking_allocator.odin @@ -34,12 +34,18 @@ Tracking_Allocator_Bad_Free_Entry :: struct { location: runtime.Source_Code_Location, } +/* +Callback type for when tracking allocator runs into a bad free. +*/ +Tracking_Allocator_Bad_Free_Callback :: proc(t: ^Tracking_Allocator, memory: rawptr, location: runtime.Source_Code_Location) + /* Tracking allocator data. */ Tracking_Allocator :: struct { backing: Allocator, allocation_map: map[rawptr]Tracking_Allocator_Entry, + bad_free_callback: Tracking_Allocator_Bad_Free_Callback, bad_free_array: [dynamic]Tracking_Allocator_Bad_Free_Entry, mutex: sync.Mutex, clear_on_free_all: bool, @@ -61,6 +67,7 @@ allocate the tracked data. tracking_allocator_init :: proc(t: ^Tracking_Allocator, backing_allocator: Allocator, internals_allocator := context.allocator) { t.backing = backing_allocator t.allocation_map.allocator = internals_allocator + t.bad_free_callback = tracking_allocator_bad_free_callback_panic t.bad_free_array.allocator = internals_allocator if .Free_All in query_features(t.backing) { t.clear_on_free_all = true @@ -109,6 +116,33 @@ tracking_allocator_reset :: proc(t: ^Tracking_Allocator) { sync.mutex_unlock(&t.mutex) } +/* +Default behavior for a bad free: Crash with error message that says where the +bad free happened. + +Override Tracking_Allocator.bad_free_callback to have something else happen. For +example, you can use tracking_allocator_bad_free_callback_add_to_array to return +the tracking allocator to the old behavior, where the bad_free_array was used. +*/ +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() +} + +/* +Alternative behavior for a bad free: Store in `bad_free_array`. If you use this, +then you must make sure to check Tracking_Allocator.bad_free_array at some point. +*/ +tracking_allocator_bad_free_callback_add_to_array :: proc(t: ^Tracking_Allocator, memory: rawptr, location: runtime.Source_Code_Location) { + append(&t.bad_free_array, Tracking_Allocator_Bad_Free_Entry { + memory = memory, + location = location, + }) +} + /* Tracking allocator. @@ -116,8 +150,10 @@ The tracking allocator is an allocator wrapper that tracks memory allocations. This allocator stores all the allocations in a map. Whenever a pointer that's not inside of the map is freed, the `bad_free_array` entry is added. -An example of how to use the `Tracking_Allocator` to track subsequent allocations -in your program and report leaks and bad frees: +Here follows an example of how to use the `Tracking_Allocator` to track +subsequent allocations in your program and report leaks. By default, the +tracking allocator will crash on bad frees. You can override that behavior by +overriding `track.bad_free_callback`. Example: @@ -137,9 +173,6 @@ Example: for _, leak in track.allocation_map { fmt.printf("%v leaked %m\n", leak.location, leak.size) } - for bad_free in track.bad_free_array { - fmt.printf("%v allocation %p was freed badly\n", bad_free.location, bad_free.memory) - } } */ @(require_results) @@ -191,10 +224,9 @@ tracking_allocator_proc :: proc( } if mode == .Free && old_memory != nil && old_memory not_in data.allocation_map { - append(&data.bad_free_array, Tracking_Allocator_Bad_Free_Entry{ - memory = old_memory, - location = loc, - }) + if data.bad_free_callback != nil { + data.bad_free_callback(data, old_memory, loc) + } } else { result = data.backing.procedure(data.backing.data, mode, size, alignment, old_memory, old_size, loc) or_return } diff --git a/core/testing/runner.odin b/core/testing/runner.odin index 6b9d610ed..83a5ac4e7 100644 --- a/core/testing/runner.odin +++ b/core/testing/runner.odin @@ -391,6 +391,7 @@ runner :: proc(internal_tests: []Internal_Test) -> bool { fmt.assertf(alloc_error == nil, "Error allocating memory for task allocator #%i: %v", i, alloc_error) when TRACKING_MEMORY { mem.tracking_allocator_init(&task_memory_trackers[i], mem.rollback_stack_allocator(&task_allocators[i])) + task_memory_trackers[i].bad_free_callback = mem.tracking_allocator_bad_free_callback_add_to_array } } diff --git a/tests/core/container/test_core_rbtree.odin b/tests/core/container/test_core_rbtree.odin index bdd23691c..d220b7ed6 100644 --- a/tests/core/container/test_core_rbtree.odin +++ b/tests/core/container/test_core_rbtree.odin @@ -11,6 +11,7 @@ import "core:log" test_rbtree_integer :: proc(t: ^testing.T, $Key: typeid, $Value: typeid) { track: mem.Tracking_Allocator mem.tracking_allocator_init(&track, context.allocator) + track.bad_free_callback = mem.tracking_allocator_bad_free_callback_add_to_array defer mem.tracking_allocator_destroy(&track) context.allocator = mem.tracking_allocator(&track) From cb42b88e132295760ff823f03b228a5b0a2378b8 Mon Sep 17 00:00:00 2001 From: avanspector Date: Sat, 21 Dec 2024 16:54:45 +0100 Subject: [PATCH 059/431] Update errno.odin --- core/sys/haiku/errno.odin | 97 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 91 insertions(+), 6 deletions(-) diff --git a/core/sys/haiku/errno.odin b/core/sys/haiku/errno.odin index 2b5e3681c..1acdd3c0c 100644 --- a/core/sys/haiku/errno.odin +++ b/core/sys/haiku/errno.odin @@ -5,6 +5,9 @@ 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 + Errno :: enum i32 { // Error baselines GENERAL_ERROR_BASE = min(i32), @@ -109,13 +112,95 @@ Errno :: enum i32 { 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.E2BIG, - FILE_TOO_LARGE = posix.EFBIG, - DEVICE_NOT_FOUND = posix.ENODEV, - RESULT_NOT_REPRESENTABLE = posix.ERANGE, - BUFFER_OVERFLOW = posix.EOVERFLOW, - NOT_SUPPORTED = posix.EOPNOTSUPP, + 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, From 365e24ce8df6abacd34ed164852267f036c12d76 Mon Sep 17 00:00:00 2001 From: avanspector Date: Sat, 21 Dec 2024 17:09:57 +0100 Subject: [PATCH 060/431] Remove error baselines from Errno to make fmt clearer --- core/sys/haiku/errno.odin | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/core/sys/haiku/errno.odin b/core/sys/haiku/errno.odin index 1acdd3c0c..ef5a360bd 100644 --- a/core/sys/haiku/errno.odin +++ b/core/sys/haiku/errno.odin @@ -8,24 +8,24 @@ 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 { - // 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, - // General Errors NO_MEMORY = GENERAL_ERROR_BASE + 0, IO_ERROR = GENERAL_ERROR_BASE + 1, From a20d85df1eaf7a24c407256786b714044a87e5ff Mon Sep 17 00:00:00 2001 From: avanspector Date: Sat, 21 Dec 2024 17:15:53 +0100 Subject: [PATCH 061/431] Fix os_haiku.odin (again) --- core/os/os_haiku.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/os/os_haiku.odin b/core/os/os_haiku.odin index d44ca9df0..6b218af07 100644 --- a/core/os/os_haiku.odin +++ b/core/os/os_haiku.odin @@ -16,7 +16,7 @@ _Platform_Error :: haiku.Errno MAX_PATH :: haiku.PATH_MAX -ENOSYS :: _Platform_Error(i32(haiku.Errno.POSIX_ERROR_BASE) + 9) +ENOSYS :: _Platform_Error(haiku.Errno.ENOSYS) INVALID_HANDLE :: ~Handle(0) From 26f9688c69caa1ea8211da7ef072ea6ec292d8f7 Mon Sep 17 00:00:00 2001 From: misomosi Date: Sat, 21 Dec 2024 16:53:31 -0500 Subject: [PATCH 062/431] Fix early overwrite of dst w/ exp_u64 --- src/big_int.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/big_int.cpp b/src/big_int.cpp index 8e476f090..0b0a9a400 100644 --- a/src/big_int.cpp +++ b/src/big_int.cpp @@ -251,7 +251,10 @@ gb_internal void big_int_from_string(BigInt *dst, String const &s, bool *success exp *= 10; exp += v; } - big_int_exp_u64(dst, &b, exp, success); + BigInt tmp = {}; + mp_init(&tmp); + big_int_exp_u64(&tmp, &b, exp, success); + big_int_mul_eq(dst, &tmp); } if (is_negative) { From f2f952b344b076c17281e0e77195a27d94f58919 Mon Sep 17 00:00:00 2001 From: Roland Kovacs Date: Sun, 22 Dec 2024 01:52:57 +0100 Subject: [PATCH 063/431] Fix crash when proc return type is undeclared parapoly variable Disallow the declaration of new parapoly variables in return types, when the procedure's parapoly scope is itself. This happens if e.g.: `foo :: proc() -> $T`. Closes #3949, #4294, #4563 --- src/check_type.cpp | 9 ++++++++- src/checker.hpp | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/check_type.cpp b/src/check_type.cpp index 13a6125ca..44108ccbe 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -2440,8 +2440,12 @@ gb_internal bool check_procedure_type(CheckerContext *ctx, Type *type, Ast *proc bool success = true; isize specialization_count = 0; Type *params = check_get_params(c, c->scope, pt->params, &variadic, &variadic_index, &success, &specialization_count, operands); - Type *results = check_get_results(c, c->scope, pt->results); + bool no_poly_return = c->disallow_polymorphic_return_types; + c->disallow_polymorphic_return_types = c->scope == c->polymorphic_scope; + // NOTE(zen3ger): if the parapoly scope is the current proc's scope, then the return types shall not declare new poly vars + Type *results = check_get_results(c, c->scope, pt->results); + c->disallow_polymorphic_return_types = no_poly_return; isize param_count = 0; isize result_count = 0; @@ -3383,6 +3387,9 @@ gb_internal bool check_type_internal(CheckerContext *ctx, Ast *e, Type **type, T } Type *t = alloc_type_generic(ctx->scope, 0, token.string, specific); if (ctx->allow_polymorphic_types) { + if (ctx->disallow_polymorphic_return_types) { + error(ident, "Undeclared polymorphic parameter '%.*s' in return type", LIT(token.string)); + } Scope *ps = ctx->polymorphic_scope; Scope *s = ctx->scope; Scope *entity_scope = s; diff --git a/src/checker.hpp b/src/checker.hpp index 438156f18..a4cb47521 100644 --- a/src/checker.hpp +++ b/src/checker.hpp @@ -521,6 +521,7 @@ struct CheckerContext { bool in_enum_type; bool collect_delayed_decls; bool allow_polymorphic_types; + bool disallow_polymorphic_return_types; // NOTE(zen3ger): no poly type decl in return types bool no_polymorphic_errors; bool hide_polymorphic_errors; bool in_polymorphic_specialization; From 9f77f7c4175a6202b01a984a692c0288ac6077ec Mon Sep 17 00:00:00 2001 From: Roland Kovacs Date: Sun, 22 Dec 2024 12:38:37 +0100 Subject: [PATCH 064/431] Fix crash on assignment of parapoly proc to variable --- src/check_decl.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/check_decl.cpp b/src/check_decl.cpp index 60eb030ff..d541426d3 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -94,12 +94,14 @@ gb_internal Type *check_init_variable(CheckerContext *ctx, Entity *e, Operand *o return nullptr; } if (e2->state.load() != EntityState_Resolved) { - gbString str = type_to_string(t); - defer (gb_string_free(str)); - error(e->token, "Invalid use of a polymorphic type '%s' in %.*s", str, LIT(context_name)); - e->type = t_invalid; + e->type = t; return nullptr; } + gbString str = type_to_string(t); + defer (gb_string_free(str)); + error(operand->expr, "Invalid use of a non-specialized polymorphic type '%s' in %.*s", str, LIT(context_name)); + e->type = t_invalid; + return nullptr; } else if (is_type_empty_union(t)) { gbString str = type_to_string(t); defer (gb_string_free(str)); From f07a6f463c16c3dc5cdadd6ce4e77a855ac6816d Mon Sep 17 00:00:00 2001 From: blob1807 <12388588+blob1807@users.noreply.github.com> Date: Sun, 22 Dec 2024 23:10:42 +1000 Subject: [PATCH 065/431] Fix io.write_escaped_rune not writing full value --- core/io/util.odin | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/core/io/util.odin b/core/io/util.odin index 296be7bc0..fdbbd5b9f 100644 --- a/core/io/util.odin +++ b/core/io/util.odin @@ -132,9 +132,13 @@ write_encoded_rune :: proc(w: Writer, r: rune, write_quote := true, n_written: ^ buf: [2]byte s := strconv.append_bits(buf[:], u64(r), 16, true, 64, strconv.digits, nil) switch len(s) { - case 0: write_string(w, "00", &n) or_return - case 1: write_byte(w, '0', &n) or_return - case 2: write_string(w, s, &n) or_return + case 0: + write_string(w, "00", &n) or_return + case 1: + write_byte(w, '0', &n) or_return + fallthrough + case 2: + write_string(w, s, &n) or_return } } else { write_rune(w, r, &n) or_return From fdf510b7b35119739d6e41170abd46204356d58b Mon Sep 17 00:00:00 2001 From: misomosi Date: Sat, 21 Dec 2024 19:59:31 -0500 Subject: [PATCH 066/431] Pack struct when needed, use field_align metadata --- src/llvm_backend.hpp | 2 ++ src/llvm_backend_general.cpp | 18 +++++++++++++++++- src/llvm_backend_utility.cpp | 19 ++++++++++++++++--- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/llvm_backend.hpp b/src/llvm_backend.hpp index e84ffd1cd..3bbd97e4b 100644 --- a/src/llvm_backend.hpp +++ b/src/llvm_backend.hpp @@ -742,3 +742,5 @@ gb_global char const *llvm_linkage_strings[] = { }; #define ODIN_METADATA_IS_PACKED str_lit("odin-is-packed") +#define ODIN_METADATA_MIN_ALIGN str_lit("odin-min-align") +#define ODIN_METADATA_MAX_ALIGN str_lit("odin-max-align") diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index bab330da7..762256258 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -734,6 +734,17 @@ gb_internal LLVMValueRef OdinLLVMBuildLoad(lbProcedure *p, LLVMTypeRef type, LLV if (is_packed != 0) { LLVMSetAlignment(result, 1); } + u64 align = LLVMGetAlignment(result); + u64 align_min = lb_get_metadata_custom_u64(p->module, value, ODIN_METADATA_MIN_ALIGN); + u64 align_max = lb_get_metadata_custom_u64(p->module, value, ODIN_METADATA_MAX_ALIGN); + if (align_min != 0 && align < align_min) { + align = align_min; + } + if (align_max != 0 && align > align_max) { + align = align_max; + } + GB_ASSERT(align <= UINT_MAX); + LLVMSetAlignment(result, (unsigned int)align); } return result; @@ -2121,6 +2132,7 @@ gb_internal LLVMTypeRef lb_type_internal(lbModule *m, Type *type) { } i64 prev_offset = 0; + bool requires_packing = type->Struct.is_packed; for (i32 field_index : struct_fields_index_by_increasing_offset(temporary_allocator(), type)) { Entity *field = type->Struct.fields[field_index]; i64 offset = type->Struct.offsets[field_index]; @@ -2141,6 +2153,10 @@ gb_internal LLVMTypeRef lb_type_internal(lbModule *m, Type *type) { field_type = t_rawptr; } + // max_field_align might misalign items in a way that requires packing + // so check the alignment of all fields to see if packing is required. + requires_packing = requires_packing || ((offset % type_align_of(field_type)) != 0); + array_add(&fields, lb_type(m, field_type)); prev_offset = offset + type_size_of(field->type); @@ -2155,7 +2171,7 @@ gb_internal LLVMTypeRef lb_type_internal(lbModule *m, Type *type) { GB_ASSERT(fields[i] != nullptr); } - LLVMTypeRef struct_type = LLVMStructTypeInContext(ctx, fields.data, cast(unsigned)fields.count, type->Struct.is_packed); + LLVMTypeRef struct_type = LLVMStructTypeInContext(ctx, fields.data, cast(unsigned)fields.count, requires_packing); map_set(&m->struct_field_remapping, cast(void *)struct_type, field_remapping); map_set(&m->struct_field_remapping, cast(void *)type, field_remapping); #if 0 diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index a2a0ba4cc..b86d0773b 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -1200,9 +1200,22 @@ gb_internal lbValue lb_emit_struct_ep(lbProcedure *p, lbValue s, i32 index) { lbValue gep = lb_emit_struct_ep_internal(p, s, index, result_type); Type *bt = base_type(t); - if (bt->kind == Type_Struct && bt->Struct.is_packed) { - lb_set_metadata_custom_u64(p->module, gep.value, ODIN_METADATA_IS_PACKED, 1); - GB_ASSERT(lb_get_metadata_custom_u64(p->module, gep.value, ODIN_METADATA_IS_PACKED) == 1); + if (bt->kind == Type_Struct) { + if (bt->Struct.is_packed) { + lb_set_metadata_custom_u64(p->module, gep.value, ODIN_METADATA_IS_PACKED, 1); + GB_ASSERT(lb_get_metadata_custom_u64(p->module, gep.value, ODIN_METADATA_IS_PACKED) == 1); + } + u64 align_max = bt->Struct.custom_max_field_align; + u64 align_min = bt->Struct.custom_min_field_align; + GB_ASSERT(align_min == 0 || align_max == 0 || align_min <= align_max); + if (align_max) { + lb_set_metadata_custom_u64(p->module, gep.value, ODIN_METADATA_MAX_ALIGN, align_max); + GB_ASSERT(lb_get_metadata_custom_u64(p->module, gep.value, ODIN_METADATA_MAX_ALIGN) == align_max); + } + if (align_min) { + lb_set_metadata_custom_u64(p->module, gep.value, ODIN_METADATA_MIN_ALIGN, align_min); + GB_ASSERT(lb_get_metadata_custom_u64(p->module, gep.value, ODIN_METADATA_MIN_ALIGN) == align_min); + } } return gep; From 276dab69b69fb8429c3e2a2e4fc8f0cd994c010d Mon Sep 17 00:00:00 2001 From: Misomosi Date: Sun, 10 Nov 2024 10:41:16 -0500 Subject: [PATCH 067/431] Pack MDEI struct to fix issue #4407 --- core/sys/windows/dbghelp.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sys/windows/dbghelp.odin b/core/sys/windows/dbghelp.odin index 336992b4a..e32b4c874 100644 --- a/core/sys/windows/dbghelp.odin +++ b/core/sys/windows/dbghelp.odin @@ -15,7 +15,7 @@ MINIDUMP_DIRECTORY :: struct { Location: MINIDUMP_LOCATION_DESCRIPTOR, } -MINIDUMP_EXCEPTION_INFORMATION :: struct { +MINIDUMP_EXCEPTION_INFORMATION :: struct #max_field_align(4) { ThreadId: DWORD, ExceptionPointers: ^EXCEPTION_POINTERS, ClientPointers: BOOL, From 0a2200fa12c2255d03f366fe301228a147ed79e5 Mon Sep 17 00:00:00 2001 From: Joao Fukuda Date: Sun, 22 Dec 2024 15:53:54 -0300 Subject: [PATCH 068/431] Fix issue #4612 --- core/sys/linux/types.odin | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core/sys/linux/types.odin b/core/sys/linux/types.odin index 42d5cc988..dc3e4018d 100644 --- a/core/sys/linux/types.odin +++ b/core/sys/linux/types.odin @@ -684,6 +684,15 @@ Address_Family :: distinct Protocol_Family */ Socket_Msg :: bit_set[Socket_Msg_Bits; i32] + +/* + Struct representing a generic socket address. +*/ +Sock_Addr :: struct #packed { + sa_family: Address_Family, + sa_data: [14]u8, +} + /* Struct representing IPv4 socket address. */ @@ -691,6 +700,7 @@ Sock_Addr_In :: struct #packed { sin_family: Address_Family, sin_port: u16be, sin_addr: [4]u8, + sin_zero: [size_of(Sock_Addr) - size_of(Address_Family) - size_of(u16be) - size_of([4]u8)]u8, } /* @@ -720,6 +730,7 @@ Sock_Addr_Any :: struct #raw_union { family: Address_Family, port: u16be, }, + using generic: Sock_Addr, using ipv4: Sock_Addr_In, using ipv6: Sock_Addr_In6, using uds: Sock_Addr_Un, From 28e226381d3ebe20b70d13c0ea46a7183d59d65e Mon Sep 17 00:00:00 2001 From: Joao Fukuda Date: Sun, 22 Dec 2024 16:09:51 -0300 Subject: [PATCH 069/431] Remove extra white space Got in on 0a2200f without me noticing, mb. --- core/sys/linux/types.odin | 1 - 1 file changed, 1 deletion(-) diff --git a/core/sys/linux/types.odin b/core/sys/linux/types.odin index dc3e4018d..08a443bcc 100644 --- a/core/sys/linux/types.odin +++ b/core/sys/linux/types.odin @@ -684,7 +684,6 @@ Address_Family :: distinct Protocol_Family */ Socket_Msg :: bit_set[Socket_Msg_Bits; i32] - /* Struct representing a generic socket address. */ From 6ff81b6e4c1f9880d92ee5a2ccae241431afb6ee Mon Sep 17 00:00:00 2001 From: fleandro <3987005+flga@users.noreply.github.com> Date: Mon, 23 Dec 2024 01:03:51 +0000 Subject: [PATCH 070/431] make -export-dependencies:json emit valid json --- src/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 4d85a9e72..0450c61ec 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2120,7 +2120,7 @@ gb_internal void export_dependencies(Checker *c) { for_array(i, files) { AstFile *file = files[i]; gb_fprintf(&f, "\t\t\"%.*s\"", LIT(file->fullpath)); - if (i+1 == files.count) { + if (i+1 < files.count) { gb_fprintf(&f, ","); } gb_fprintf(&f, "\n"); @@ -2133,7 +2133,7 @@ gb_internal void export_dependencies(Checker *c) { for_array(i, load_files) { LoadFileCache *cache = load_files[i]; gb_fprintf(&f, "\t\t\"%.*s\"", LIT(cache->path)); - if (i+1 == load_files.count) { + if (i+1 < load_files.count) { gb_fprintf(&f, ","); } gb_fprintf(&f, "\n"); From e82a0c8fc7db1f3eaa50e147c1cc0a3d2d482d9a Mon Sep 17 00:00:00 2001 From: "dmitriy.gorevoy" Date: Mon, 23 Dec 2024 09:25:18 +0100 Subject: [PATCH 071/431] Fixed crash in arena_free_all() for bootstrapped growing arenas. When trying to set arena.curr_block.used = 0 after mem.zero() caused a crash because if the arena is bootstrapped its memory will be zeroed out after mem.zero() thus making arena.cur_block point to zero. --- core/mem/virtual/arena.odin | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/mem/virtual/arena.odin b/core/mem/virtual/arena.odin index 79407d80d..4a0fff241 100644 --- a/core/mem/virtual/arena.odin +++ b/core/mem/virtual/arena.odin @@ -204,8 +204,9 @@ arena_free_all :: proc(arena: ^Arena, loc := #caller_location) { } // Zero the first block's memory if arena.curr_block != nil { - mem.zero(arena.curr_block.base, int(arena.curr_block.used)) + curr_block_used := int(arena.curr_block.used) arena.curr_block.used = 0 + mem.zero(arena.curr_block.base, curr_block_used) } arena.total_used = 0 case .Static, .Buffer: From ad99d20d292ab4708996c935315c36aef58796a8 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 23 Dec 2024 16:33:23 +0100 Subject: [PATCH 072/431] Remove outdated PNG save helpers --- core/image/png/helpers.odin | 130 +----------------------------------- 1 file changed, 1 insertion(+), 129 deletions(-) diff --git a/core/image/png/helpers.odin b/core/image/png/helpers.odin index f094b54a9..a9495ed4d 100644 --- a/core/image/png/helpers.odin +++ b/core/image/png/helpers.odin @@ -396,132 +396,4 @@ exif :: proc(c: image.PNG_Chunk) -> (res: Exif, ok: bool) { General helper functions */ -compute_buffer_size :: image.compute_buffer_size - -/* - PNG save helpers -*/ - -when false { - - make_chunk :: proc(c: any, t: Chunk_Type) -> (res: Chunk) { - - data: []u8 - if v, ok := c.([]u8); ok { - data = v - } else { - data = mem.any_to_bytes(c) - } - - res.header.length = u32be(len(data)) - res.header.type = t - res.data = data - - // CRC the type - crc := hash.crc32(mem.any_to_bytes(res.header.type)) - // Extend the CRC with the data - res.crc = u32be(hash.crc32(data, crc)) - return - } - - write_chunk :: proc(fd: os.Handle, chunk: Chunk) { - c := chunk - // Write length + type - os.write_ptr(fd, &c.header, 8) - // Write data - os.write_ptr(fd, mem.raw_data(c.data), int(c.header.length)) - // Write CRC32 - os.write_ptr(fd, &c.crc, 4) - } - - write_image_as_png :: proc(filename: string, image: Image) -> (err: Error) { - profiler.timed_proc() - using image - using os - flags: int = O_WRONLY|O_CREATE|O_TRUNC - - if len(image.pixels) == 0 || len(image.pixels) < image.width * image.height * int(image.channels) { - return .Invalid_Image_Dimensions - } - - mode: int = 0 - when ODIN_OS == .Linux || ODIN_OS == .Darwin { - // NOTE(justasd): 644 (owner read, write; group read; others read) - mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH - } - - fd, fderr := open(filename, flags, mode) - if fderr != nil { - return .Cannot_Open_File - } - defer close(fd) - - magic := Signature - - write_ptr(fd, &magic, 8) - - ihdr := IHDR{ - width = u32be(width), - height = u32be(height), - bit_depth = depth, - compression_method = 0, - filter_method = 0, - interlace_method = .None, - } - - switch channels { - case 1: ihdr.color_type = Color_Type{} - case 2: ihdr.color_type = Color_Type{.Alpha} - case 3: ihdr.color_type = Color_Type{.Color} - case 4: ihdr.color_type = Color_Type{.Color, .Alpha} - case:// Unhandled - return .Unknown_Color_Type - } - h := make_chunk(ihdr, .IHDR) - write_chunk(fd, h) - - bytes_needed := width * height * int(channels) + height - filter_bytes := mem.make_dynamic_array_len_cap([dynamic]u8, bytes_needed, bytes_needed, context.allocator) - defer delete(filter_bytes) - - i := 0; j := 0 - // Add a filter byte 0 per pixel row - for y := 0; y < height; y += 1 { - filter_bytes[j] = 0; j += 1 - for x := 0; x < width; x += 1 { - for z := 0; z < channels; z += 1 { - filter_bytes[j+z] = image.pixels[i+z] - } - i += channels; j += channels - } - } - assert(j == bytes_needed) - - a: []u8 = filter_bytes[:] - - out_buf: ^[dynamic]u8 - defer free(out_buf) - - ctx := zlib.ZLIB_Context{ - in_buf = &a, - out_buf = out_buf, - } - err = zlib.write_zlib_stream_from_memory(&ctx) - - b: []u8 - if err == nil { - b = ctx.out_buf[:] - } else { - return err - } - - idat := make_chunk(b, .IDAT) - - write_chunk(fd, idat) - - iend := make_chunk([]u8{}, .IEND) - write_chunk(fd, iend) - - return nil - } -} +compute_buffer_size :: image.compute_buffer_size \ No newline at end of file From 8c761627c84847bae3ec5e77a1408c542d9460b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20K=C3=A9ri?= Date: Tue, 24 Dec 2024 02:17:57 +0100 Subject: [PATCH 073/431] encoding/base32: Replace assertions with error returns Replace assertions with proper error handling in base32.decode() to allow programs to handle invalid input gracefully rather than crashing. The function now returns ([]byte, Error) instead of just []byte. --- core/encoding/base32/base32.odin | 40 +++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/core/encoding/base32/base32.odin b/core/encoding/base32/base32.odin index f3320428d..688b27544 100644 --- a/core/encoding/base32/base32.odin +++ b/core/encoding/base32/base32.odin @@ -7,6 +7,15 @@ package encoding_base32 // Incase your specific version does not use padding, you may // truncate it from the encoded output. +// Error represents errors that can occur during base32 decoding operations. +// See RFC 4648 sections 3.2, 4 and 6. +Error :: enum { + None, + Invalid_Character, // Input contains characters outside of base32 alphabet (A-Z, 2-7) + Invalid_Length, // Input length is not valid for base32 (must be a multiple of 8 with proper padding) + Malformed_Input, // Input has improper structure (wrong padding position or incomplete groups) +} + ENC_TABLE := [32]byte { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', @@ -91,9 +100,9 @@ _encode :: proc(out, data: []byte, ENC_TBL := ENC_TABLE, allocator := context.al } } -decode :: proc(data: string, DEC_TBL := DEC_TABLE, allocator := context.allocator) -> []byte #no_bounds_check{ +decode :: proc(data: string, DEC_TBL := DEC_TABLE, allocator := context.allocator) -> ([]byte, Error) #no_bounds_check { if len(data) == 0 { - return nil + return nil, .None } outi := 0 @@ -113,16 +122,29 @@ decode :: proc(data: string, DEC_TBL := DEC_TABLE, allocator := context.allocato input := data[0] data = data[1:] if input == byte(PADDING) && j >= 2 && len(data) < 8 { - assert(!(len(data) + j < 8 - 1), "Corrupted input") - for k := 0; k < 8-1-j; k +=1 { - assert(len(data) < k || data[k] == byte(PADDING), "Corrupted input") + // assert(!(len(data) + j < 8 - 1), "Corrupted input") + if len(data) + j < 8 - 1 { + return nil, .Malformed_Input + } + // assert(len(data) < k || data[k] == byte(PADDING), "Corrupted input") + for k := 0; k < 8-1-j; k += 1 { + if len(data) < k || data[k] != byte(PADDING) { + return nil, .Malformed_Input + } } dlen, end = j, true - assert(dlen != 1 && dlen != 3 && dlen != 6, "Corrupted input") + // assert(dlen != 1 && dlen != 3 && dlen != 6, "Corrupted input") + if dlen == 1 || dlen == 3 || dlen == 6 { + return nil, .Invalid_Length + } break } - dbuf[j] = DEC_TABLE[input] - assert(dbuf[j] != 0xff, "Corrupted input") + decoded := DEC_TBL[input] + // assert(dbuf[j] != 0xff, "Corrupted input") + if decoded == 0 && input != byte(ENC_TABLE[0]) { + return nil, .Invalid_Character + } + dbuf[j] = decoded j += 1 } @@ -144,5 +166,5 @@ decode :: proc(data: string, DEC_TBL := DEC_TABLE, allocator := context.allocato } outi += 5 } - return out + return out, .None } From b9338777e34006b40b9315e795232e0608caa499 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20K=C3=A9ri?= Date: Tue, 24 Dec 2024 02:20:32 +0100 Subject: [PATCH 074/431] encoding/base32: Fix buffer allocation and bounds checking Fix buffer allocation size calculation and add proper bounds checking to ensure output buffer has sufficient space. This fixes crashes that could occur with inputs like "AA" and other edge cases where the output buffer was too small. Remove #no_bounds_check as proper bounds checking is necessary for safe error handling. The small performance trade-off is worth the improved robustness. --- core/encoding/base32/base32.odin | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/core/encoding/base32/base32.odin b/core/encoding/base32/base32.odin index 688b27544..8e3499dce 100644 --- a/core/encoding/base32/base32.odin +++ b/core/encoding/base32/base32.odin @@ -100,15 +100,18 @@ _encode :: proc(out, data: []byte, ENC_TBL := ENC_TABLE, allocator := context.al } } -decode :: proc(data: string, DEC_TBL := DEC_TABLE, allocator := context.allocator) -> ([]byte, Error) #no_bounds_check { +decode :: proc(data: string, DEC_TBL := DEC_TABLE, allocator := context.allocator) -> ([]byte, Error) { if len(data) == 0 { return nil, .None } + // Calculate maximum possible output size and allocate buffer + out_len := (len(data) * 5 + 7) / 8 // Ceiling division to ensure enough space + out := make([]byte, out_len, allocator) + outi := 0 data := data - out := make([]byte, len(data) / 8 * 5, allocator) end := false for len(data) > 0 && !end { dbuf : [8]byte @@ -122,25 +125,22 @@ decode :: proc(data: string, DEC_TBL := DEC_TABLE, allocator := context.allocato input := data[0] data = data[1:] if input == byte(PADDING) && j >= 2 && len(data) < 8 { - // assert(!(len(data) + j < 8 - 1), "Corrupted input") if len(data) + j < 8 - 1 { return nil, .Malformed_Input } - // assert(len(data) < k || data[k] == byte(PADDING), "Corrupted input") for k := 0; k < 8-1-j; k += 1 { if len(data) < k || data[k] != byte(PADDING) { return nil, .Malformed_Input } } dlen, end = j, true - // assert(dlen != 1 && dlen != 3 && dlen != 6, "Corrupted input") if dlen == 1 || dlen == 3 || dlen == 6 { return nil, .Invalid_Length } break } + decoded := DEC_TBL[input] - // assert(dbuf[j] != 0xff, "Corrupted input") if decoded == 0 && input != byte(ENC_TABLE[0]) { return nil, .Invalid_Character } @@ -148,23 +148,41 @@ decode :: proc(data: string, DEC_TBL := DEC_TABLE, allocator := context.allocato j += 1 } + // Ensure we have enough space in output buffer + needed := 5 // Each full 8-char block produces 5 bytes + if outi + needed > len(out) { + return nil, .Invalid_Length + } + + // Process complete input blocks switch dlen { case 8: + if len(dbuf) < 8 { return nil, .Invalid_Length } out[outi + 4] = dbuf[6] << 5 | dbuf[7] fallthrough case 7: + if len(dbuf) < 7 { return nil, .Invalid_Length } out[outi + 3] = dbuf[4] << 7 | dbuf[5] << 2 | dbuf[6] >> 3 fallthrough case 5: + if len(dbuf) < 5 { return nil, .Invalid_Length } out[outi + 2] = dbuf[3] << 4 | dbuf[4] >> 1 fallthrough case 4: + if len(dbuf) < 4 { return nil, .Invalid_Length } out[outi + 1] = dbuf[1] << 6 | dbuf[2] << 1 | dbuf[3] >> 4 fallthrough case 2: + if len(dbuf) < 2 { return nil, .Invalid_Length } out[outi + 0] = dbuf[0] << 3 | dbuf[1] >> 2 } outi += 5 } + + // Trim output buffer to actual size + if outi < len(out) { + out = out[:outi] + } + return out, .None } From 7672ac945a7b8e35b600a9d2a2421caf16a5a364 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20K=C3=A9ri?= Date: Tue, 24 Dec 2024 15:28:34 +0100 Subject: [PATCH 075/431] encoding/base32: Add RFC 4648 test suite Add test suite based on RFC 4648 test vectors and validation rules: - Add section 10 test vectors for valid encoding/decoding - Add test cases for invalid character handling (section 3.2) - Add test cases for padding validation (section 4) - Add test cases for length requirements (section 6) The test vectors verify that: - Empty string encodes/decodes correctly - Standard cases like "foo" -> "MZXW6===" work - Invalid characters are rejected - Missing or malformed padding is detected - Invalid lengths are caught --- core/encoding/base32/base32.odin | 104 +++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/core/encoding/base32/base32.odin b/core/encoding/base32/base32.odin index 8e3499dce..54737c9ce 100644 --- a/core/encoding/base32/base32.odin +++ b/core/encoding/base32/base32.odin @@ -1,5 +1,8 @@ package encoding_base32 +import "core:testing" +import "core:bytes" + // @note(zh): Encoding utility for Base32 // A secondary param can be used to supply a custom alphabet to // @link(encode) and a matching decoding table to @link(decode). @@ -186,3 +189,104 @@ decode :: proc(data: string, DEC_TBL := DEC_TABLE, allocator := context.allocato return out, .None } + +@(test) +test_base32_decode_valid :: proc(t: ^testing.T) { + // RFC 4648 Section 10 - Test vectors + cases := [?]struct { + input, expected: string, + }{ + {"", ""}, + {"MY======", "f"}, + {"MZXQ====", "fo"}, + {"MZXW6===", "foo"}, + {"MZXW6YQ=", "foob"}, + {"MZXW6YTB", "fooba"}, + {"MZXW6YTBOI======", "foobar"}, + } + + + for c in cases { + output, err := decode(c.input) + testing.expect_value(t, err, Error.None) + expected := transmute([]u8)c.expected + + if output != nil { + testing.expect(t, bytes.equal(output, expected)) + } else { + testing.expect(t, len(c.expected) == 0) + } + } +} + +@(test) +test_base32_encode :: proc(t: ^testing.T) { + // RFC 4648 Section 10 - Test vectors + cases := [?]struct { + input, expected: string, + }{ + {"", ""}, + {"f", "MY======"}, + {"fo", "MZXQ===="}, + {"foo", "MZXW6==="}, + {"foob", "MZXW6YQ="}, + {"fooba", "MZXW6YTB"}, + {"foobar", "MZXW6YTBOI======"}, + } + + for c in cases { + output := encode(transmute([]byte)c.input) + testing.expect(t, output == c.expected) + } +} + +@(test) +test_base32_decode_invalid :: proc(t: ^testing.T) { + // Section 3.2 - Alphabet check + { + // Characters outside alphabet + input := "MZ1W6YTB" // '1' not in alphabet (A-Z, 2-7) + _, err := decode(input) + testing.expect_value(t, err, Error.Invalid_Character) + } + { + // Lowercase not allowed + input := "mzxq====" + _, err := decode(input) + testing.expect_value(t, err, Error.Invalid_Character) + } + + // Section 4 - Padding requirements + { + // Padding must only be at end + input := "MZ=Q====" + _, err := decode(input) + testing.expect_value(t, err, Error.Malformed_Input) + } + { + // Missing padding + input := "MZXQ" // Should be MZXQ==== + _, err := decode(input) + testing.expect_value(t, err, Error.Malformed_Input) + } + { + // Incorrect padding length + input := "MZXQ=" // Needs 4 padding chars + _, err := decode(input) + testing.expect_value(t, err, Error.Malformed_Input) + } + { + // Too much padding + input := "MY=========" // Extra padding chars + _, err := decode(input) + testing.expect_value(t, err, Error.Malformed_Input) + } + + // Section 6 - Block size requirements + { + // Single character (invalid block) + input := "M" + _, err := decode(input) + testing.expect_value(t, err, Error.Invalid_Length) + } +} From f1f2ed31940d02728ce55e591743834968dd5994 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20K=C3=A9ri?= Date: Tue, 24 Dec 2024 15:52:33 +0100 Subject: [PATCH 076/431] encoding/base32: Fix decode implementation per RFC 4648 Rework base32.decode() to properly handle all cases per RFC 4648: - Fix error detection order: - Check minimum length first (Invalid_Length) - Check character validity (Invalid_Character) - Check padding and structure (Malformed_Input) - Fix padding validation: - Add required padding length checks (2=6, 4=4, 5=3, 7=1 chars) - Ensure padding only appears at end - Fix handling of unpadded inputs - Fix buffer handling: - Proper output buffer size calculation - Add bounds checking for buffer access - Add proper buffer validation For example: - "M" correctly returns Invalid_Length (too short) - "mzxq====" correctly returns Invalid_Character (lowercase) - "MZXQ=" correctly returns Malformed_Input (wrong padding) - Unpadded input lengths must be multiples of 8 These changes make the decode function fully compliant with RFC 4648 requirements while providing proper error handling. --- core/encoding/base32/base32.odin | 173 +++++++++++++++++-------------- 1 file changed, 97 insertions(+), 76 deletions(-) diff --git a/core/encoding/base32/base32.odin b/core/encoding/base32/base32.odin index 54737c9ce..d940c856b 100644 --- a/core/encoding/base32/base32.odin +++ b/core/encoding/base32/base32.odin @@ -103,88 +103,109 @@ _encode :: proc(out, data: []byte, ENC_TBL := ENC_TABLE, allocator := context.al } } -decode :: proc(data: string, DEC_TBL := DEC_TABLE, allocator := context.allocator) -> ([]byte, Error) { +decode :: proc(data: string, DEC_TBL := DEC_TABLE, allocator := context.allocator) -> (out: []byte, err: Error) { if len(data) == 0 { return nil, .None } - // Calculate maximum possible output size and allocate buffer - out_len := (len(data) * 5 + 7) / 8 // Ceiling division to ensure enough space - out := make([]byte, out_len, allocator) - - outi := 0 - data := data - - end := false - for len(data) > 0 && !end { - dbuf : [8]byte - dlen := 8 - - for j := 0; j < 8; { - if len(data) == 0 { - dlen, end = j, true - break - } - input := data[0] - data = data[1:] - if input == byte(PADDING) && j >= 2 && len(data) < 8 { - if len(data) + j < 8 - 1 { - return nil, .Malformed_Input - } - for k := 0; k < 8-1-j; k += 1 { - if len(data) < k || data[k] != byte(PADDING) { - return nil, .Malformed_Input - } - } - dlen, end = j, true - if dlen == 1 || dlen == 3 || dlen == 6 { - return nil, .Invalid_Length - } - break - } - - decoded := DEC_TBL[input] - if decoded == 0 && input != byte(ENC_TABLE[0]) { - return nil, .Invalid_Character - } - dbuf[j] = decoded - j += 1 - } - - // Ensure we have enough space in output buffer - needed := 5 // Each full 8-char block produces 5 bytes - if outi + needed > len(out) { - return nil, .Invalid_Length - } - - // Process complete input blocks - switch dlen { - case 8: - if len(dbuf) < 8 { return nil, .Invalid_Length } - out[outi + 4] = dbuf[6] << 5 | dbuf[7] - fallthrough - case 7: - if len(dbuf) < 7 { return nil, .Invalid_Length } - out[outi + 3] = dbuf[4] << 7 | dbuf[5] << 2 | dbuf[6] >> 3 - fallthrough - case 5: - if len(dbuf) < 5 { return nil, .Invalid_Length } - out[outi + 2] = dbuf[3] << 4 | dbuf[4] >> 1 - fallthrough - case 4: - if len(dbuf) < 4 { return nil, .Invalid_Length } - out[outi + 1] = dbuf[1] << 6 | dbuf[2] << 1 | dbuf[3] >> 4 - fallthrough - case 2: - if len(dbuf) < 2 { return nil, .Invalid_Length } - out[outi + 0] = dbuf[0] << 3 | dbuf[1] >> 2 - } - outi += 5 + // Check minimum length requirement first + if len(data) < 2 { + return nil, .Invalid_Length } - // Trim output buffer to actual size - if outi < len(out) { - out = out[:outi] + // Validate characters - only A-Z and 2-7 allowed before padding + for i := 0; i < len(data); i += 1 { + c := data[i] + if c == byte(PADDING) { + break + } + if !((c >= 'A' && c <= 'Z') || (c >= '2' && c <= '7')) { + return nil, .Invalid_Character + } + } + + // Validate padding and length + data_len := len(data) + padding_count := 0 + for i := data_len - 1; i >= 0; i -= 1 { + if data[i] != byte(PADDING) { + break + } + padding_count += 1 + } + + // Check for proper padding and length combinations + if padding_count > 0 { + // Verify no padding in the middle + for i := 0; i < data_len - padding_count; i += 1 { + if data[i] == byte(PADDING) { + return nil, .Malformed_Input + } + } + + // Required padding for each content length mod 8 + content_len := data_len - padding_count + required_padding := map[int]int{ + 2 = 6, // 2 chars need 6 padding chars + 4 = 4, // 4 chars need 4 padding chars + 5 = 3, // 5 chars need 3 padding chars + 7 = 1, // 7 chars need 1 padding char + } + + mod8 := content_len % 8 + if req_pad, ok := required_padding[mod8]; ok { + if padding_count != req_pad { + return nil, .Malformed_Input + } + } else if mod8 != 0 { + // If not in the map and not a multiple of 8, it's invalid + return nil, .Malformed_Input + } + } else { + // No padding - must be multiple of 8 + if data_len % 8 != 0 { + return nil, .Malformed_Input + } + } + + // Calculate decoded length: 5 bytes for every 8 input chars + input_chars := data_len - padding_count + out_len := input_chars * 5 / 8 + out = make([]byte, out_len, allocator) + defer if err != .None { + delete(out) + } + + // Process input in 8-byte blocks + outi := 0 + for i := 0; i < input_chars; i += 8 { + buf: [8]byte + block_size := min(8, input_chars - i) + + // Decode block + for j := 0; j < block_size; j += 1 { + buf[j] = DEC_TBL[data[i + j]] + } + + // Convert to output bytes based on block size + bytes_to_write := block_size * 5 / 8 + switch block_size { + case 8: + out[outi + 4] = (buf[6] << 5) | buf[7] + fallthrough + case 7: + out[outi + 3] = (buf[4] << 7) | (buf[5] << 2) | (buf[6] >> 3) + fallthrough + case 5: + out[outi + 2] = (buf[3] << 4) | (buf[4] >> 1) + fallthrough + case 4: + out[outi + 1] = (buf[1] << 6) | (buf[2] << 1) | (buf[3] >> 4) + fallthrough + case 2: + out[outi] = (buf[0] << 3) | (buf[1] >> 2) + } + outi += bytes_to_write } return out, .None From 93238db202c6648d11d4a78a83b1a29751ac77a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20K=C3=A9ri?= Date: Tue, 24 Dec 2024 16:00:00 +0100 Subject: [PATCH 077/431] encoding/base32: Use consistent allocator and add proper cleanup Fix memory handling throughout base32 package: - Make padding map package-level constant (to avoid repeated allocs) - Use passed allocator in encode's make() call - Add defer delete for allocated memory in encode - Add proper cleanup in test cases - Fix memory cleanup of output buffers The changes ensure consistent allocator usage and cleanup in both implementation and tests. --- core/encoding/base32/base32.odin | 65 +++++++++++++++++++++----------- 1 file changed, 43 insertions(+), 22 deletions(-) diff --git a/core/encoding/base32/base32.odin b/core/encoding/base32/base32.odin index d940c856b..72e20e427 100644 --- a/core/encoding/base32/base32.odin +++ b/core/encoding/base32/base32.odin @@ -45,11 +45,19 @@ DEC_TABLE := [?]u8 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } +REQUIRED_PADDING := map[int]int{ + 2 = 6, // 2 chars need 6 padding chars + 4 = 4, // 4 chars need 4 padding chars + 5 = 3, // 5 chars need 3 padding chars + 7 = 1, // 7 chars need 1 padding char +} + encode :: proc(data: []byte, ENC_TBL := ENC_TABLE, allocator := context.allocator) -> string { out_length := (len(data) + 4) / 5 * 8 - out := make([]byte, out_length) + out := make([]byte, out_length, allocator) + defer delete(out) _encode(out, data) - return string(out) + return string(out[:]) } @private @@ -143,22 +151,13 @@ decode :: proc(data: string, DEC_TBL := DEC_TABLE, allocator := context.allocato } } - // Required padding for each content length mod 8 content_len := data_len - padding_count - required_padding := map[int]int{ - 2 = 6, // 2 chars need 6 padding chars - 4 = 4, // 4 chars need 4 padding chars - 5 = 3, // 5 chars need 3 padding chars - 7 = 1, // 7 chars need 1 padding char - } - mod8 := content_len % 8 - if req_pad, ok := required_padding[mod8]; ok { + if req_pad, ok := REQUIRED_PADDING[mod8]; ok { if padding_count != req_pad { return nil, .Malformed_Input } } else if mod8 != 0 { - // If not in the map and not a multiple of 8, it's invalid return nil, .Malformed_Input } } else { @@ -208,7 +207,7 @@ decode :: proc(data: string, DEC_TBL := DEC_TABLE, allocator := context.allocato outi += bytes_to_write } - return out, .None + return } @(test) @@ -226,12 +225,13 @@ test_base32_decode_valid :: proc(t: ^testing.T) { {"MZXW6YTBOI======", "foobar"}, } - for c in cases { output, err := decode(c.input) + if output != nil { + defer delete(output) + } testing.expect_value(t, err, Error.None) expected := transmute([]u8)c.expected - if output != nil { testing.expect(t, bytes.equal(output, expected)) } else { @@ -267,13 +267,19 @@ test_base32_decode_invalid :: proc(t: ^testing.T) { { // Characters outside alphabet input := "MZ1W6YTB" // '1' not in alphabet (A-Z, 2-7) - _, err := decode(input) + output, err := decode(input) + if output != nil { + defer delete(output) + } testing.expect_value(t, err, Error.Invalid_Character) } { // Lowercase not allowed input := "mzxq====" - _, err := decode(input) + output, err := decode(input) + if output != nil { + defer delete(output) + } testing.expect_value(t, err, Error.Invalid_Character) } @@ -281,25 +287,37 @@ test_base32_decode_invalid :: proc(t: ^testing.T) { { // Padding must only be at end input := "MZ=Q====" - _, err := decode(input) + output, err := decode(input) + if output != nil { + defer delete(output) + } testing.expect_value(t, err, Error.Malformed_Input) } { // Missing padding input := "MZXQ" // Should be MZXQ==== - _, err := decode(input) + output, err := decode(input) + if output != nil { + defer delete(output) + } testing.expect_value(t, err, Error.Malformed_Input) } { // Incorrect padding length input := "MZXQ=" // Needs 4 padding chars - _, err := decode(input) + output, err := decode(input) + if output != nil { + defer delete(output) + } testing.expect_value(t, err, Error.Malformed_Input) } { // Too much padding input := "MY=========" // Extra padding chars - _, err := decode(input) + output, err := decode(input) + if output != nil { + defer delete(output) + } testing.expect_value(t, err, Error.Malformed_Input) } @@ -307,7 +325,10 @@ test_base32_decode_invalid :: proc(t: ^testing.T) { { // Single character (invalid block) input := "M" - _, err := decode(input) + output, err := decode(input) + if output != nil { + defer delete(output) + } testing.expect_value(t, err, Error.Invalid_Length) } } From e75a49f095ed7ecd72b4caccf550545a980163ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20K=C3=A9ri?= Date: Tue, 24 Dec 2024 16:07:01 +0100 Subject: [PATCH 078/431] encoding/base32: Set optimization mode for decode() --- core/encoding/base32/base32.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/core/encoding/base32/base32.odin b/core/encoding/base32/base32.odin index 72e20e427..53d31fb30 100644 --- a/core/encoding/base32/base32.odin +++ b/core/encoding/base32/base32.odin @@ -111,6 +111,7 @@ _encode :: proc(out, data: []byte, ENC_TBL := ENC_TABLE, allocator := context.al } } +@(optimization_mode="favor_size") decode :: proc(data: string, DEC_TBL := DEC_TABLE, allocator := context.allocator) -> (out: []byte, err: Error) { if len(data) == 0 { return nil, .None From 3a5440e4eddea3735b26689e576ba4e1102a6a3a Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Mon, 23 Dec 2024 14:15:59 +0900 Subject: [PATCH 079/431] base/runtime: Add `ensure` and `ensure_contextless` This provides an equivalent to `assert` and `assert_contextless` that are always evaluated, ignoring `ODIN_DISABLE_ASSERT`, which is useful for enforcing API contracts or "asserting" on conditionals with side-effects. --- base/runtime/core_builtin.odin | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/base/runtime/core_builtin.odin b/base/runtime/core_builtin.odin index d28dadd02..f06dcb478 100644 --- a/base/runtime/core_builtin.odin +++ b/base/runtime/core_builtin.odin @@ -964,6 +964,24 @@ assert :: proc(condition: bool, message := #caller_expression(condition), loc := } } +// Evaluates the condition and aborts the program iff the condition is +// false. This routine ignores `ODIN_DISABLE_ASSERT`, and will always +// execute. +@builtin +ensure :: proc(condition: bool, message := #caller_expression(condition), loc := #caller_location) { + if !condition { + @(cold) + internal :: proc(message: string, loc: Source_Code_Location) { + p := context.assertion_failure_proc + if p == nil { + p = default_assertion_failure_proc + } + p("unsatisfied ensure", message, loc) + } + internal(message, loc) + } +} + @builtin panic :: proc(message: string, loc := #caller_location) -> ! { p := context.assertion_failure_proc @@ -999,6 +1017,17 @@ assert_contextless :: proc "contextless" (condition: bool, message := #caller_ex } } +@builtin +ensure_contextless :: proc "contextless" (condition: bool, message := #caller_expression(condition), loc := #caller_location) { + if !condition { + @(cold) + internal :: proc "contextless" (message: string, loc: Source_Code_Location) { + default_assertion_contextless_failure_proc("unsatisfied ensure", message, loc) + } + internal(message, loc) + } +} + @builtin panic_contextless :: proc "contextless" (message: string, loc := #caller_location) -> ! { default_assertion_contextless_failure_proc("panic", message, loc) From 8211a911dbf75b683da4f5c1c3f2970d56103497 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20K=C3=A9ri?= Date: Tue, 24 Dec 2024 20:46:38 +0100 Subject: [PATCH 080/431] encoding/base32: Replace padding map with switch statement Replace package-level map with a simple switch statement for padding validation. This eliminates allocations we can't properly free while maintaining the same validation logic. --- core/encoding/base32/base32.odin | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/core/encoding/base32/base32.odin b/core/encoding/base32/base32.odin index 53d31fb30..68b8b7a5e 100644 --- a/core/encoding/base32/base32.odin +++ b/core/encoding/base32/base32.odin @@ -45,13 +45,6 @@ DEC_TABLE := [?]u8 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } -REQUIRED_PADDING := map[int]int{ - 2 = 6, // 2 chars need 6 padding chars - 4 = 4, // 4 chars need 4 padding chars - 5 = 3, // 5 chars need 3 padding chars - 7 = 1, // 7 chars need 1 padding char -} - encode :: proc(data: []byte, ENC_TBL := ENC_TABLE, allocator := context.allocator) -> string { out_length := (len(data) + 4) / 5 * 8 out := make([]byte, out_length, allocator) @@ -154,8 +147,17 @@ decode :: proc(data: string, DEC_TBL := DEC_TABLE, allocator := context.allocato content_len := data_len - padding_count mod8 := content_len % 8 - if req_pad, ok := REQUIRED_PADDING[mod8]; ok { - if padding_count != req_pad { + required_padding: int + switch mod8 { + case 2: required_padding = 6 // 2 chars need 6 padding chars + case 4: required_padding = 4 // 4 chars need 4 padding chars + case 5: required_padding = 3 // 5 chars need 3 padding chars + case 7: required_padding = 1 // 7 chars need 1 padding char + case: required_padding = 0 + } + + if required_padding > 0 { + if padding_count != required_padding { return nil, .Malformed_Input } } else if mod8 != 0 { From e7fb02a84a24f5430199249934a3dc37b10a4d39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20K=C3=A9ri?= Date: Wed, 25 Dec 2024 16:15:41 +0100 Subject: [PATCH 081/431] encoding/base32: Add custom validation support Add support for custom alphabet validation through an optional validation function parameter. The default validation follows RFC 4648 base32 alphabet rules (A-Z, 2-7). This properly supports the documented ability to use custom alphabets. --- core/encoding/base32/base32.odin | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/core/encoding/base32/base32.odin b/core/encoding/base32/base32.odin index 68b8b7a5e..7c70b7e9a 100644 --- a/core/encoding/base32/base32.odin +++ b/core/encoding/base32/base32.odin @@ -7,18 +7,25 @@ import "core:bytes" // A secondary param can be used to supply a custom alphabet to // @link(encode) and a matching decoding table to @link(decode). // If none is supplied it just uses the standard Base32 alphabet. -// Incase your specific version does not use padding, you may +// In case your specific version does not use padding, you may // truncate it from the encoded output. // Error represents errors that can occur during base32 decoding operations. // See RFC 4648 sections 3.2, 4 and 6. Error :: enum { None, - Invalid_Character, // Input contains characters outside of base32 alphabet (A-Z, 2-7) + Invalid_Character, // Input contains characters outside the specified alphabet Invalid_Length, // Input length is not valid for base32 (must be a multiple of 8 with proper padding) Malformed_Input, // Input has improper structure (wrong padding position or incomplete groups) } +Validate_Proc :: #type proc(c: byte) -> bool + +@private +_validate_default :: proc(c: byte) -> bool { + return (c >= 'A' && c <= 'Z') || (c >= '2' && c <= '7') +} + ENC_TABLE := [32]byte { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', @@ -105,7 +112,11 @@ _encode :: proc(out, data: []byte, ENC_TBL := ENC_TABLE, allocator := context.al } @(optimization_mode="favor_size") -decode :: proc(data: string, DEC_TBL := DEC_TABLE, allocator := context.allocator) -> (out: []byte, err: Error) { +decode :: proc( + data: string, + DEC_TBL := DEC_TABLE, + validate: Validate_Proc = _validate_default, + allocator := context.allocator) -> (out: []byte, err: Error) { if len(data) == 0 { return nil, .None } @@ -115,13 +126,13 @@ decode :: proc(data: string, DEC_TBL := DEC_TABLE, allocator := context.allocato return nil, .Invalid_Length } - // Validate characters - only A-Z and 2-7 allowed before padding + // Validate characters using provided validation function for i := 0; i < len(data); i += 1 { c := data[i] if c == byte(PADDING) { break } - if !((c >= 'A' && c <= 'Z') || (c >= '2' && c <= '7')) { + if !validate(c) { return nil, .Invalid_Character } } From 88c0e62095730354d139af3b90b7d91fa19f5e1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20K=C3=A9ri?= Date: Thu, 26 Dec 2024 14:48:02 +0100 Subject: [PATCH 082/431] encoding/base32: Use `ENC_TBL` parameter consistently in encode() Fix encoding to properly use provided encoding table parameter instead of hardcoded `ENC_TABLE`. This makes encode properly support custom alphabets as documented. --- core/encoding/base32/base32.odin | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/core/encoding/base32/base32.odin b/core/encoding/base32/base32.odin index 7c70b7e9a..ea529ed63 100644 --- a/core/encoding/base32/base32.odin +++ b/core/encoding/base32/base32.odin @@ -56,7 +56,7 @@ encode :: proc(data: []byte, ENC_TBL := ENC_TABLE, allocator := context.allocato out_length := (len(data) + 4) / 5 * 8 out := make([]byte, out_length, allocator) defer delete(out) - _encode(out, data) + _encode(out, data, ENC_TBL) return string(out[:]) } @@ -69,26 +69,26 @@ _encode :: proc(out, data: []byte, ENC_TBL := ENC_TABLE, allocator := context.al carry: byte switch len(data) { case: - out[7] = ENC_TABLE[data[4] & 0x1f] + out[7] = ENC_TBL[data[4] & 0x1f] carry = data[4] >> 5 fallthrough case 4: - out[6] = ENC_TABLE[carry | (data[3] << 3) & 0x1f] - out[5] = ENC_TABLE[(data[3] >> 2) & 0x1f] + out[6] = ENC_TBL[carry | (data[3] << 3) & 0x1f] + out[5] = ENC_TBL[(data[3] >> 2) & 0x1f] carry = data[3] >> 7 fallthrough case 3: - out[4] = ENC_TABLE[carry | (data[2] << 1) & 0x1f] + out[4] = ENC_TBL[carry | (data[2] << 1) & 0x1f] carry = (data[2] >> 4) & 0x1f fallthrough case 2: - out[3] = ENC_TABLE[carry | (data[1] << 4) & 0x1f] - out[2] = ENC_TABLE[(data[1] >> 1) & 0x1f] + out[3] = ENC_TBL[carry | (data[1] << 4) & 0x1f] + out[2] = ENC_TBL[(data[1] >> 1) & 0x1f] carry = (data[1] >> 6) & 0x1f fallthrough case 1: - out[1] = ENC_TABLE[carry | (data[0] << 2) & 0x1f] - out[0] = ENC_TABLE[data[0] >> 3] + out[1] = ENC_TBL[carry | (data[0] << 2) & 0x1f] + out[0] = ENC_TBL[data[0] >> 3] } if len(data) < 5 { From 490f52700533bdda725fd90fc19cb248d38b2ff5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20K=C3=A9ri?= Date: Thu, 26 Dec 2024 19:20:46 +0100 Subject: [PATCH 083/431] encoding/base32: Expand `DEC_TABLE` to full 256 bytes The decoding table was only 224 bytes which caused type mismatches when using custom alphabets, so expand with zeroes to cover full byte range while maintaining the same decoding logic. --- core/encoding/base32/base32.odin | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/core/encoding/base32/base32.odin b/core/encoding/base32/base32.odin index ea529ed63..12b6a426b 100644 --- a/core/encoding/base32/base32.odin +++ b/core/encoding/base32/base32.odin @@ -35,21 +35,23 @@ ENC_TABLE := [32]byte { PADDING :: '=' -DEC_TABLE := [?]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, 0, 0, 0, - 0, 0, 26, 27, 28, 29, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, +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, 0, 0, 0, 0, 0, + 0, 0, 26, 27, 28, 29, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 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, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } encode :: proc(data: []byte, ENC_TBL := ENC_TABLE, allocator := context.allocator) -> string { From 8a91e0bb19c013d0b088c90f3d1a09560dffac5c Mon Sep 17 00:00:00 2001 From: Sebastian Pahnke Date: Sat, 28 Dec 2024 08:51:54 +0100 Subject: [PATCH 084/431] Add regression tests reproducing the issue --- tests/issues/run.bat | 1 + tests/issues/run.sh | 1 + tests/issues/test_issue_4584.odin | 56 +++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 tests/issues/test_issue_4584.odin diff --git a/tests/issues/run.bat b/tests/issues/run.bat index dcea3d483..7ed43205d 100644 --- a/tests/issues/run.bat +++ b/tests/issues/run.bat @@ -16,6 +16,7 @@ set COMMON=-define:ODIN_TEST_FANCY=false -file -vet -strict-style ..\..\..\odin test ..\test_issue_2637.odin %COMMON% || exit /b ..\..\..\odin test ..\test_issue_2666.odin %COMMON% || exit /b ..\..\..\odin test ..\test_issue_4210.odin %COMMON% || exit /b +..\..\..\odin test ..\test_issue_4584.odin %COMMON% || exit /b @echo off diff --git a/tests/issues/run.sh b/tests/issues/run.sh index c3bc00e24..54543980e 100755 --- a/tests/issues/run.sh +++ b/tests/issues/run.sh @@ -17,6 +17,7 @@ $ODIN test ../test_issue_2615.odin $COMMON $ODIN test ../test_issue_2637.odin $COMMON $ODIN test ../test_issue_2666.odin $COMMON $ODIN test ../test_issue_4210.odin $COMMON +$ODIN test ../test_issue_4584.odin $COMMON if [[ $($ODIN build ../test_issue_2395.odin $COMMON 2>&1 >/dev/null | grep -c "Error:") -eq 2 ]] ; then echo "SUCCESSFUL 1/1" else diff --git a/tests/issues/test_issue_4584.odin b/tests/issues/test_issue_4584.odin new file mode 100644 index 000000000..b80ecb3d9 --- /dev/null +++ b/tests/issues/test_issue_4584.odin @@ -0,0 +1,56 @@ +// Tests issue #4584 https://github.com/odin-lang/Odin/issues/4584 +package test_issues + +import "core:testing" +import "core:math/linalg" + +@test +test_adjugate_2x2 :: proc(t: ^testing.T) { + m := matrix[2,2]int { + -3, 2, + -1, 0, + } + expected := matrix[2,2]int { + 0, -2, + 1, -3, + } + testing.expect_value(t, linalg.adjugate(m), expected) + testing.expect_value(t, linalg.determinant(m), 2) + testing.expect_value(t, linalg.adjugate(m) * m, 2 * linalg.identity(matrix[2,2]int)) +} + +@test +test_adjugate_3x3 :: proc(t: ^testing.T) { + m := matrix[3,3]int { + -3, 2, -5, + -1, 0, -2, + 3, -4, 1, + } + expected := matrix[3,3]int { + -8, 18, -4, + -5, 12, -1, + 4, -6, 2, + } + testing.expect_value(t, linalg.adjugate(m), expected) + testing.expect_value(t, linalg.determinant(m), -6) + testing.expect_value(t, linalg.adjugate(m) * m, -6 * linalg.identity(matrix[3,3]int)) +} + +@test +test_adjugate_4x4 :: proc(t: ^testing.T) { + m := matrix[4,4]int { + -3, 2, -5, 1, + -1, 0, -2, 2, + 3, -4, 1, 3, + 4, 5, 6, 7, + } + expected := matrix[4,4]int { + -144, 266, -92, -16, + 57, 92, -5, -16, + 105, -142, 55, 2, + 33, -96, 9, -6, + } + testing.expect_value(t, linalg.adjugate(m), expected) + testing.expect_value(t, linalg.determinant(m), -174) + testing.expect_value(t, linalg.adjugate(m) * m, -174 * linalg.identity(matrix[4,4]int)) +} \ No newline at end of file From e8a202f0a27256162f8fe20f4d92cdb63ec1e967 Mon Sep 17 00:00:00 2001 From: Sebastian Pahnke Date: Sat, 28 Dec 2024 08:56:09 +0100 Subject: [PATCH 085/431] Add tests for glsl and hlsl variants --- tests/issues/test_issue_4584.odin | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/issues/test_issue_4584.odin b/tests/issues/test_issue_4584.odin index b80ecb3d9..176daf6af 100644 --- a/tests/issues/test_issue_4584.odin +++ b/tests/issues/test_issue_4584.odin @@ -3,6 +3,8 @@ package test_issues import "core:testing" import "core:math/linalg" +import glm "core:math/linalg/glsl" +import hlm "core:math/linalg/hlsl" @test test_adjugate_2x2 :: proc(t: ^testing.T) { @@ -17,6 +19,12 @@ test_adjugate_2x2 :: proc(t: ^testing.T) { testing.expect_value(t, linalg.adjugate(m), expected) testing.expect_value(t, linalg.determinant(m), 2) testing.expect_value(t, linalg.adjugate(m) * m, 2 * linalg.identity(matrix[2,2]int)) + + testing.expect_value(t, glm.adjugate(m), expected) + testing.expect_value(t, glm.adjugate(m) * m, 2 * linalg.identity(matrix[2,2]int)) + + testing.expect_value(t, hlm.adjugate(m), expected) + testing.expect_value(t, hlm.adjugate(m) * m, 2 * linalg.identity(matrix[2,2]int)) } @test @@ -34,6 +42,12 @@ test_adjugate_3x3 :: proc(t: ^testing.T) { testing.expect_value(t, linalg.adjugate(m), expected) testing.expect_value(t, linalg.determinant(m), -6) testing.expect_value(t, linalg.adjugate(m) * m, -6 * linalg.identity(matrix[3,3]int)) + + testing.expect_value(t, glm.adjugate(m), expected) + testing.expect_value(t, glm.adjugate(m) * m, -6 * linalg.identity(matrix[3,3]int)) + + testing.expect_value(t, hlm.adjugate(m), expected) + testing.expect_value(t, hlm.adjugate(m) * m, -6 * linalg.identity(matrix[3,3]int)) } @test @@ -53,4 +67,10 @@ test_adjugate_4x4 :: proc(t: ^testing.T) { testing.expect_value(t, linalg.adjugate(m), expected) testing.expect_value(t, linalg.determinant(m), -174) testing.expect_value(t, linalg.adjugate(m) * m, -174 * linalg.identity(matrix[4,4]int)) + + testing.expect_value(t, glm.adjugate(m), expected) + testing.expect_value(t, glm.adjugate(m) * m, -174 * linalg.identity(matrix[4,4]int)) + + testing.expect_value(t, hlm.adjugate(m), expected) + testing.expect_value(t, hlm.adjugate(m) * m, -174 * linalg.identity(matrix[4,4]int)) } \ No newline at end of file From 0d955e55dbe9aaefebddde222d8bd62c59236eae Mon Sep 17 00:00:00 2001 From: Sebastian Pahnke Date: Sat, 28 Dec 2024 09:05:26 +0100 Subject: [PATCH 086/431] Add tests for determinants because their calculation depends on the adjugate --- tests/issues/test_issue_4584.odin | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tests/issues/test_issue_4584.odin b/tests/issues/test_issue_4584.odin index 176daf6af..f14f1f1d3 100644 --- a/tests/issues/test_issue_4584.odin +++ b/tests/issues/test_issue_4584.odin @@ -21,9 +21,11 @@ test_adjugate_2x2 :: proc(t: ^testing.T) { testing.expect_value(t, linalg.adjugate(m) * m, 2 * linalg.identity(matrix[2,2]int)) testing.expect_value(t, glm.adjugate(m), expected) + testing.expect_value(t, glm.determinant(m), 2) testing.expect_value(t, glm.adjugate(m) * m, 2 * linalg.identity(matrix[2,2]int)) testing.expect_value(t, hlm.adjugate(m), expected) + testing.expect_value(t, hlm.determinant(m), 2) testing.expect_value(t, hlm.adjugate(m) * m, 2 * linalg.identity(matrix[2,2]int)) } @@ -44,9 +46,11 @@ test_adjugate_3x3 :: proc(t: ^testing.T) { testing.expect_value(t, linalg.adjugate(m) * m, -6 * linalg.identity(matrix[3,3]int)) testing.expect_value(t, glm.adjugate(m), expected) + testing.expect_value(t, glm.determinant(m), -6) testing.expect_value(t, glm.adjugate(m) * m, -6 * linalg.identity(matrix[3,3]int)) testing.expect_value(t, hlm.adjugate(m), expected) + testing.expect_value(t, hlm.determinant(m), -6) testing.expect_value(t, hlm.adjugate(m) * m, -6 * linalg.identity(matrix[3,3]int)) } @@ -60,7 +64,7 @@ test_adjugate_4x4 :: proc(t: ^testing.T) { } expected := matrix[4,4]int { -144, 266, -92, -16, - 57, 92, -5, -16, + -57, 92, -5, -16, 105, -142, 55, 2, 33, -96, 9, -6, } @@ -69,8 +73,10 @@ test_adjugate_4x4 :: proc(t: ^testing.T) { testing.expect_value(t, linalg.adjugate(m) * m, -174 * linalg.identity(matrix[4,4]int)) testing.expect_value(t, glm.adjugate(m), expected) + testing.expect_value(t, glm.determinant(m), -174) testing.expect_value(t, glm.adjugate(m) * m, -174 * linalg.identity(matrix[4,4]int)) testing.expect_value(t, hlm.adjugate(m), expected) + testing.expect_value(t, hlm.determinant(m), -174) testing.expect_value(t, hlm.adjugate(m) * m, -174 * linalg.identity(matrix[4,4]int)) } \ No newline at end of file From f23e226854c6777a27f13f70759fb022acafd532 Mon Sep 17 00:00:00 2001 From: Sebastian Pahnke Date: Sat, 28 Dec 2024 09:23:43 +0100 Subject: [PATCH 087/431] Rename adjugate to cofactor to keep existing usages for inverse and determinant correct and add new adjugate procedures --- core/math/linalg/general.odin | 84 ++++++++++++++++++++------ core/math/linalg/glsl/linalg_glsl.odin | 84 ++++++++++++++++++++------ core/math/linalg/hlsl/linalg_hlsl.odin | 84 ++++++++++++++++++++------ 3 files changed, 198 insertions(+), 54 deletions(-) diff --git a/core/math/linalg/general.odin b/core/math/linalg/general.odin index 8c4f2954a..4a0150972 100644 --- a/core/math/linalg/general.odin +++ b/core/math/linalg/general.odin @@ -417,6 +417,13 @@ adjugate :: proc{ matrix4x4_adjugate, } +cofactor :: proc{ + matrix1x1_cofactor, + matrix2x2_cofactor, + matrix3x3_cofactor, + matrix4x4_cofactor, +} + inverse_transpose :: proc{ matrix1x1_inverse_transpose, matrix2x2_inverse_transpose, @@ -479,9 +486,9 @@ matrix3x3_determinant :: proc "contextless" (m: $M/matrix[3, 3]$T) -> (det: T) # } @(require_results) matrix4x4_determinant :: proc "contextless" (m: $M/matrix[4, 4]$T) -> (det: T) #no_bounds_check { - a := adjugate(m) + c := cofactor(m) for i in 0..<4 { - det += m[0, i] * a[0, i] + det += m[0, i] * c[0, i] } return } @@ -497,6 +504,47 @@ matrix1x1_adjugate :: proc "contextless" (x: $M/matrix[1, 1]$T) -> (y: M) #no_bo @(require_results) matrix2x2_adjugate :: proc "contextless" (x: $M/matrix[2, 2]$T) -> (y: M) #no_bounds_check { + y[0, 0] = +x[1, 1] + y[0, 1] = -x[0, 1] + y[1, 0] = -x[1, 0] + y[1, 1] = +x[0, 0] + return +} + +@(require_results) +matrix3x3_adjugate :: proc "contextless" (m: $M/matrix[3, 3]$T) -> (y: M) #no_bounds_check { + y[0, 0] = +(m[1, 1] * m[2, 2] - m[2, 1] * m[1, 2]) + y[1, 0] = -(m[1, 0] * m[2, 2] - m[2, 0] * m[1, 2]) + y[2, 0] = +(m[1, 0] * m[2, 1] - m[2, 0] * m[1, 1]) + y[0, 1] = -(m[0, 1] * m[2, 2] - m[2, 1] * m[0, 2]) + y[1, 1] = +(m[0, 0] * m[2, 2] - m[2, 0] * m[0, 2]) + y[2, 1] = -(m[0, 0] * m[2, 1] - m[2, 0] * m[0, 1]) + y[0, 2] = +(m[0, 1] * m[1, 2] - m[1, 1] * m[0, 2]) + y[1, 2] = -(m[0, 0] * m[1, 2] - m[1, 0] * m[0, 2]) + y[2, 2] = +(m[0, 0] * m[1, 1] - m[1, 0] * m[0, 1]) + return +} + +@(require_results) +matrix4x4_adjugate :: proc "contextless" (x: $M/matrix[4, 4]$T) -> (y: M) #no_bounds_check { + for i in 0..<4 { + for j in 0..<4 { + sign: T = 1 if (i + j) % 2 == 0 else -1 + y[i, j] = sign * matrix_minor(x, j, i) + } + } + return +} + + +@(require_results) +matrix1x1_cofactor :: proc "contextless" (x: $M/matrix[1, 1]$T) -> (y: M) #no_bounds_check { + y = x + return +} + +@(require_results) +matrix2x2_cofactor :: proc "contextless" (x: $M/matrix[2, 2]$T) -> (y: M) #no_bounds_check { y[0, 0] = +x[1, 1] y[0, 1] = -x[1, 0] y[1, 0] = -x[0, 1] @@ -505,7 +553,7 @@ matrix2x2_adjugate :: proc "contextless" (x: $M/matrix[2, 2]$T) -> (y: M) #no_bo } @(require_results) -matrix3x3_adjugate :: proc "contextless" (m: $M/matrix[3, 3]$T) -> (y: M) #no_bounds_check { +matrix3x3_cofactor :: proc "contextless" (m: $M/matrix[3, 3]$T) -> (y: M) #no_bounds_check { y[0, 0] = +(m[1, 1] * m[2, 2] - m[2, 1] * m[1, 2]) y[0, 1] = -(m[1, 0] * m[2, 2] - m[2, 0] * m[1, 2]) y[0, 2] = +(m[1, 0] * m[2, 1] - m[2, 0] * m[1, 1]) @@ -520,7 +568,7 @@ matrix3x3_adjugate :: proc "contextless" (m: $M/matrix[3, 3]$T) -> (y: M) #no_bo @(require_results) -matrix4x4_adjugate :: proc "contextless" (x: $M/matrix[4, 4]$T) -> (y: M) #no_bounds_check { +matrix4x4_cofactor :: proc "contextless" (x: $M/matrix[4, 4]$T) -> (y: M) #no_bounds_check { for i in 0..<4 { for j in 0..<4 { sign: T = 1 if (i + j) % 2 == 0 else -1 @@ -556,19 +604,19 @@ matrix2x2_inverse_transpose :: proc "contextless" (x: $M/matrix[2, 2]$T) -> (y: @(require_results) matrix3x3_inverse_transpose :: proc "contextless" (x: $M/matrix[3, 3]$T) -> (y: M) #no_bounds_check { - a := adjugate(x) + c := cofactor(x) d := determinant(x) when intrinsics.type_is_integer(T) { for i in 0..<3 { for j in 0..<3 { - y[i, j] = a[i, j] / d + y[i, j] = c[i, j] / d } } } else { id := 1/d for i in 0..<3 { for j in 0..<3 { - y[i, j] = a[i, j] * id + y[i, j] = c[i, j] * id } } } @@ -577,22 +625,22 @@ matrix3x3_inverse_transpose :: proc "contextless" (x: $M/matrix[3, 3]$T) -> (y: @(require_results) matrix4x4_inverse_transpose :: proc "contextless" (x: $M/matrix[4, 4]$T) -> (y: M) #no_bounds_check { - a := adjugate(x) + c := cofactor(x) d: T for i in 0..<4 { - d += x[0, i] * a[0, i] + d += x[0, i] * c[0, i] } when intrinsics.type_is_integer(T) { for i in 0..<4 { for j in 0..<4 { - y[i, j] = a[i, j] / d + y[i, j] = c[i, j] / d } } } else { id := 1/d for i in 0..<4 { for j in 0..<4 { - y[i, j] = a[i, j] * id + y[i, j] = c[i, j] * id } } } @@ -625,19 +673,19 @@ matrix2x2_inverse :: proc "contextless" (x: $M/matrix[2, 2]$T) -> (y: M) #no_bou @(require_results) matrix3x3_inverse :: proc "contextless" (x: $M/matrix[3, 3]$T) -> (y: M) #no_bounds_check { - a := adjugate(x) + c := cofactor(x) d := determinant(x) when intrinsics.type_is_integer(T) { for i in 0..<3 { for j in 0..<3 { - y[i, j] = a[j, i] / d + y[i, j] = c[j, i] / d } } } else { id := 1/d for i in 0..<3 { for j in 0..<3 { - y[i, j] = a[j, i] * id + y[i, j] = c[j, i] * id } } } @@ -646,22 +694,22 @@ matrix3x3_inverse :: proc "contextless" (x: $M/matrix[3, 3]$T) -> (y: M) #no_bou @(require_results) matrix4x4_inverse :: proc "contextless" (x: $M/matrix[4, 4]$T) -> (y: M) #no_bounds_check { - a := adjugate(x) + c := cofactor(x) d: T for i in 0..<4 { - d += x[0, i] * a[0, i] + d += x[0, i] * c[0, i] } when intrinsics.type_is_integer(T) { for i in 0..<4 { for j in 0..<4 { - y[i, j] = a[j, i] / d + y[i, j] = c[j, i] / d } } } else { id := 1/d for i in 0..<4 { for j in 0..<4 { - y[i, j] = a[j, i] * id + y[i, j] = c[j, i] * id } } } diff --git a/core/math/linalg/glsl/linalg_glsl.odin b/core/math/linalg/glsl/linalg_glsl.odin index ca61891cb..bd2cf416a 100644 --- a/core/math/linalg/glsl/linalg_glsl.odin +++ b/core/math/linalg/glsl/linalg_glsl.odin @@ -1882,6 +1882,13 @@ adjugate :: proc{ adjugate_matrix4x4, } +cofactor :: proc{ + cofactor_matrix1x1, + cofactor_matrix2x2, + cofactor_matrix3x3, + cofactor_matrix4x4, +} + inverse_transpose :: proc{ inverse_transpose_matrix1x1, inverse_transpose_matrix2x2, @@ -1944,9 +1951,9 @@ determinant_matrix3x3 :: proc "contextless" (m: $M/matrix[3, 3]$T) -> (det: T) { } @(require_results) determinant_matrix4x4 :: proc "contextless" (m: $M/matrix[4, 4]$T) -> (det: T) { - a := adjugate(m) + c := cofactor(m) #no_bounds_check for i in 0..<4 { - det += m[0, i] * a[0, i] + det += m[0, i] * c[0, i] } return } @@ -1962,6 +1969,47 @@ adjugate_matrix1x1 :: proc "contextless" (x: $M/matrix[1, 1]$T) -> (y: M) { @(require_results) adjugate_matrix2x2 :: proc "contextless" (x: $M/matrix[2, 2]$T) -> (y: M) { + y[0, 0] = +x[1, 1] + y[0, 1] = -x[0, 1] + y[1, 0] = -x[1, 0] + y[1, 1] = +x[0, 0] + return +} + +@(require_results) +adjugate_matrix3x3 :: proc "contextless" (m: $M/matrix[3, 3]$T) -> (y: M) { + y[0, 0] = +(m[1, 1] * m[2, 2] - m[2, 1] * m[1, 2]) + y[1, 0] = -(m[1, 0] * m[2, 2] - m[2, 0] * m[1, 2]) + y[2, 0] = +(m[1, 0] * m[2, 1] - m[2, 0] * m[1, 1]) + y[0, 1] = -(m[0, 1] * m[2, 2] - m[2, 1] * m[0, 2]) + y[1, 1] = +(m[0, 0] * m[2, 2] - m[2, 0] * m[0, 2]) + y[2, 1] = -(m[0, 0] * m[2, 1] - m[2, 0] * m[0, 1]) + y[0, 2] = +(m[0, 1] * m[1, 2] - m[1, 1] * m[0, 2]) + y[1, 2] = -(m[0, 0] * m[1, 2] - m[1, 0] * m[0, 2]) + y[2, 2] = +(m[0, 0] * m[1, 1] - m[1, 0] * m[0, 1]) + return +} + +@(require_results) +adjugate_matrix4x4 :: proc "contextless" (x: $M/matrix[4, 4]$T) -> (y: M) { + for i in 0..<4 { + for j in 0..<4 { + sign: T = 1 if (i + j) % 2 == 0 else -1 + y[i, j] = sign * matrix_minor(x, j, i) + } + } + return +} + + +@(require_results) +cofactor_matrix1x1 :: proc "contextless" (x: $M/matrix[1, 1]$T) -> (y: M) { + y = x + return +} + +@(require_results) +cofactor_matrix2x2 :: proc "contextless" (x: $M/matrix[2, 2]$T) -> (y: M) { y[0, 0] = +x[1, 1] y[0, 1] = -x[1, 0] y[1, 0] = -x[0, 1] @@ -1970,7 +2018,7 @@ adjugate_matrix2x2 :: proc "contextless" (x: $M/matrix[2, 2]$T) -> (y: M) { } @(require_results) -adjugate_matrix3x3 :: proc "contextless" (m: $M/matrix[3, 3]$T) -> (y: M) { +cofactor_matrix3x3 :: proc "contextless" (m: $M/matrix[3, 3]$T) -> (y: M) { y[0, 0] = +(m[1, 1] * m[2, 2] - m[2, 1] * m[1, 2]) y[0, 1] = -(m[1, 0] * m[2, 2] - m[2, 0] * m[1, 2]) y[0, 2] = +(m[1, 0] * m[2, 1] - m[2, 0] * m[1, 1]) @@ -1985,7 +2033,7 @@ adjugate_matrix3x3 :: proc "contextless" (m: $M/matrix[3, 3]$T) -> (y: M) { @(require_results) -adjugate_matrix4x4 :: proc "contextless" (x: $M/matrix[4, 4]$T) -> (y: M) { +cofactor_matrix4x4 :: proc "contextless" (x: $M/matrix[4, 4]$T) -> (y: M) { for i in 0..<4 { for j in 0..<4 { sign: T = 1 if (i + j) % 2 == 0 else -1 @@ -2021,19 +2069,19 @@ inverse_transpose_matrix2x2 :: proc "contextless" (x: $M/matrix[2, 2]$T) -> (y: @(require_results) inverse_transpose_matrix3x3 :: proc "contextless" (x: $M/matrix[3, 3]$T) -> (y: M) #no_bounds_check { - a := adjugate(x) + c := cofactor(x) d := determinant(x) when intrinsics.type_is_integer(T) { for i in 0..<3 { for j in 0..<3 { - y[i, j] = a[i, j] / d + y[i, j] = c[i, j] / d } } } else { id := 1/d for i in 0..<3 { for j in 0..<3 { - y[i, j] = a[i, j] * id + y[i, j] = c[i, j] * id } } } @@ -2042,22 +2090,22 @@ inverse_transpose_matrix3x3 :: proc "contextless" (x: $M/matrix[3, 3]$T) -> (y: @(require_results) inverse_transpose_matrix4x4 :: proc "contextless" (x: $M/matrix[4, 4]$T) -> (y: M) #no_bounds_check { - a := adjugate(x) + c := cofactor(x) d: T for i in 0..<4 { - d += x[0, i] * a[0, i] + d += x[0, i] * c[0, i] } when intrinsics.type_is_integer(T) { for i in 0..<4 { for j in 0..<4 { - y[i, j] = a[i, j] / d + y[i, j] = c[i, j] / d } } } else { id := 1/d for i in 0..<4 { for j in 0..<4 { - y[i, j] = a[i, j] * id + y[i, j] = c[i, j] * id } } } @@ -2090,19 +2138,19 @@ inverse_matrix2x2 :: proc "contextless" (x: $M/matrix[2, 2]$T) -> (y: M) { @(require_results) inverse_matrix3x3 :: proc "contextless" (x: $M/matrix[3, 3]$T) -> (y: M) #no_bounds_check { - a := adjugate(x) + c := cofactor(x) d := determinant(x) when intrinsics.type_is_integer(T) { for i in 0..<3 { for j in 0..<3 { - y[i, j] = a[j, i] / d + y[i, j] = c[j, i] / d } } } else { id := 1/d for i in 0..<3 { for j in 0..<3 { - y[i, j] = a[j, i] * id + y[i, j] = c[j, i] * id } } } @@ -2111,22 +2159,22 @@ inverse_matrix3x3 :: proc "contextless" (x: $M/matrix[3, 3]$T) -> (y: M) #no_bou @(require_results) inverse_matrix4x4 :: proc "contextless" (x: $M/matrix[4, 4]$T) -> (y: M) #no_bounds_check { - a := adjugate(x) + c := cofactor(x) d: T for i in 0..<4 { - d += x[0, i] * a[0, i] + d += x[0, i] * c[0, i] } when intrinsics.type_is_integer(T) { for i in 0..<4 { for j in 0..<4 { - y[i, j] = a[j, i] / d + y[i, j] = c[j, i] / d } } } else { id := 1/d for i in 0..<4 { for j in 0..<4 { - y[i, j] = a[j, i] * id + y[i, j] = c[j, i] * id } } } diff --git a/core/math/linalg/hlsl/linalg_hlsl.odin b/core/math/linalg/hlsl/linalg_hlsl.odin index a89fdddd3..cca70f9c8 100644 --- a/core/math/linalg/hlsl/linalg_hlsl.odin +++ b/core/math/linalg/hlsl/linalg_hlsl.odin @@ -1514,6 +1514,13 @@ adjugate :: proc{ adjugate_matrix4x4, } +cofactor :: proc{ + cofactor_matrix1x1, + cofactor_matrix2x2, + cofactor_matrix3x3, + cofactor_matrix4x4, +} + inverse_transpose :: proc{ inverse_transpose_matrix1x1, inverse_transpose_matrix2x2, @@ -1568,9 +1575,9 @@ determinant_matrix3x3 :: proc "contextless" (m: $M/matrix[3, 3]$T) -> (det: T) { } @(require_results) determinant_matrix4x4 :: proc "contextless" (m: $M/matrix[4, 4]$T) -> (det: T) { - a := adjugate(m) + c := cofactor(m) #no_bounds_check for i in 0..<4 { - det += m[0, i] * a[0, i] + det += m[0, i] * c[0, i] } return } @@ -1586,6 +1593,47 @@ adjugate_matrix1x1 :: proc "contextless" (x: $M/matrix[1, 1]$T) -> (y: M) { @(require_results) adjugate_matrix2x2 :: proc "contextless" (x: $M/matrix[2, 2]$T) -> (y: M) { + y[0, 0] = +x[1, 1] + y[0, 1] = -x[0, 1] + y[1, 0] = -x[1, 0] + y[1, 1] = +x[0, 0] + return +} + +@(require_results) +adjugate_matrix3x3 :: proc "contextless" (m: $M/matrix[3, 3]$T) -> (y: M) { + y[0, 0] = +(m[1, 1] * m[2, 2] - m[2, 1] * m[1, 2]) + y[1, 0] = -(m[1, 0] * m[2, 2] - m[2, 0] * m[1, 2]) + y[2, 0] = +(m[1, 0] * m[2, 1] - m[2, 0] * m[1, 1]) + y[0, 1] = -(m[0, 1] * m[2, 2] - m[2, 1] * m[0, 2]) + y[1, 1] = +(m[0, 0] * m[2, 2] - m[2, 0] * m[0, 2]) + y[2, 1] = -(m[0, 0] * m[2, 1] - m[2, 0] * m[0, 1]) + y[0, 2] = +(m[0, 1] * m[1, 2] - m[1, 1] * m[0, 2]) + y[1, 2] = -(m[0, 0] * m[1, 2] - m[1, 0] * m[0, 2]) + y[2, 2] = +(m[0, 0] * m[1, 1] - m[1, 0] * m[0, 1]) + return +} + +@(require_results) +adjugate_matrix4x4 :: proc "contextless" (x: $M/matrix[4, 4]$T) -> (y: M) { + for i in 0..<4 { + for j in 0..<4 { + sign: T = 1 if (i + j) % 2 == 0 else -1 + y[i, j] = sign * matrix_minor(x, j, i) + } + } + return +} + + +@(require_results) +cofactor_matrix1x1 :: proc "contextless" (x: $M/matrix[1, 1]$T) -> (y: M) { + y = x + return +} + +@(require_results) +cofactor_matrix2x2 :: proc "contextless" (x: $M/matrix[2, 2]$T) -> (y: M) { y[0, 0] = +x[1, 1] y[0, 1] = -x[1, 0] y[1, 0] = -x[0, 1] @@ -1594,7 +1642,7 @@ adjugate_matrix2x2 :: proc "contextless" (x: $M/matrix[2, 2]$T) -> (y: M) { } @(require_results) -adjugate_matrix3x3 :: proc "contextless" (m: $M/matrix[3, 3]$T) -> (y: M) { +cofactor_matrix3x3 :: proc "contextless" (m: $M/matrix[3, 3]$T) -> (y: M) { y[0, 0] = +(m[1, 1] * m[2, 2] - m[2, 1] * m[1, 2]) y[0, 1] = -(m[1, 0] * m[2, 2] - m[2, 0] * m[1, 2]) y[0, 2] = +(m[1, 0] * m[2, 1] - m[2, 0] * m[1, 1]) @@ -1609,7 +1657,7 @@ adjugate_matrix3x3 :: proc "contextless" (m: $M/matrix[3, 3]$T) -> (y: M) { @(require_results) -adjugate_matrix4x4 :: proc "contextless" (x: $M/matrix[4, 4]$T) -> (y: M) { +cofactor_matrix4x4 :: proc "contextless" (x: $M/matrix[4, 4]$T) -> (y: M) { for i in 0..<4 { for j in 0..<4 { sign: T = 1 if (i + j) % 2 == 0 else -1 @@ -1645,19 +1693,19 @@ inverse_transpose_matrix2x2 :: proc "contextless" (x: $M/matrix[2, 2]$T) -> (y: @(require_results) inverse_transpose_matrix3x3 :: proc "contextless" (x: $M/matrix[3, 3]$T) -> (y: M) #no_bounds_check { - a := adjugate(x) + c := cofactor(x) d := determinant(x) when intrinsics.type_is_integer(T) { for i in 0..<3 { for j in 0..<3 { - y[i, j] = a[i, j] / d + y[i, j] = c[i, j] / d } } } else { id := 1/d for i in 0..<3 { for j in 0..<3 { - y[i, j] = a[i, j] * id + y[i, j] = c[i, j] * id } } } @@ -1666,22 +1714,22 @@ inverse_transpose_matrix3x3 :: proc "contextless" (x: $M/matrix[3, 3]$T) -> (y: @(require_results) inverse_transpose_matrix4x4 :: proc "contextless" (x: $M/matrix[4, 4]$T) -> (y: M) #no_bounds_check { - a := adjugate(x) + c := cofactor(x) d: T for i in 0..<4 { - d += x[0, i] * a[0, i] + d += x[0, i] * c[0, i] } when intrinsics.type_is_integer(T) { for i in 0..<4 { for j in 0..<4 { - y[i, j] = a[i, j] / d + y[i, j] = c[i, j] / d } } } else { id := 1/d for i in 0..<4 { for j in 0..<4 { - y[i, j] = a[i, j] * id + y[i, j] = c[i, j] * id } } } @@ -1714,19 +1762,19 @@ inverse_matrix2x2 :: proc "contextless" (x: $M/matrix[2, 2]$T) -> (y: M) { @(require_results) inverse_matrix3x3 :: proc "contextless" (x: $M/matrix[3, 3]$T) -> (y: M) #no_bounds_check { - a := adjugate(x) + c := cofactor(x) d := determinant(x) when intrinsics.type_is_integer(T) { for i in 0..<3 { for j in 0..<3 { - y[i, j] = a[j, i] / d + y[i, j] = c[j, i] / d } } } else { id := 1/d for i in 0..<3 { for j in 0..<3 { - y[i, j] = a[j, i] * id + y[i, j] = c[j, i] * id } } } @@ -1735,22 +1783,22 @@ inverse_matrix3x3 :: proc "contextless" (x: $M/matrix[3, 3]$T) -> (y: M) #no_bou @(require_results) inverse_matrix4x4 :: proc "contextless" (x: $M/matrix[4, 4]$T) -> (y: M) #no_bounds_check { - a := adjugate(x) + c := cofactor(x) d: T for i in 0..<4 { - d += x[0, i] * a[0, i] + d += x[0, i] * c[0, i] } when intrinsics.type_is_integer(T) { for i in 0..<4 { for j in 0..<4 { - y[i, j] = a[j, i] / d + y[i, j] = c[j, i] / d } } } else { id := 1/d for i in 0..<4 { for j in 0..<4 { - y[i, j] = a[j, i] * id + y[i, j] = c[j, i] * id } } } From 02a9d8560fb82471ddc89154dee1e9e30afb88ab Mon Sep 17 00:00:00 2001 From: Sebastian Pahnke Date: Sat, 28 Dec 2024 09:33:58 +0100 Subject: [PATCH 088/431] Test symmetry --- tests/issues/test_issue_4584.odin | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/tests/issues/test_issue_4584.odin b/tests/issues/test_issue_4584.odin index f14f1f1d3..27e5cd789 100644 --- a/tests/issues/test_issue_4584.odin +++ b/tests/issues/test_issue_4584.odin @@ -8,6 +8,7 @@ import hlm "core:math/linalg/hlsl" @test test_adjugate_2x2 :: proc(t: ^testing.T) { + I := linalg.identity(matrix[2,2]int) m := matrix[2,2]int { -3, 2, -1, 0, @@ -18,19 +19,23 @@ test_adjugate_2x2 :: proc(t: ^testing.T) { } testing.expect_value(t, linalg.adjugate(m), expected) testing.expect_value(t, linalg.determinant(m), 2) - testing.expect_value(t, linalg.adjugate(m) * m, 2 * linalg.identity(matrix[2,2]int)) + testing.expect_value(t, linalg.adjugate(m) * m, 2 * I) + testing.expect_value(t, m * linalg.adjugate(m), 2 * I) testing.expect_value(t, glm.adjugate(m), expected) testing.expect_value(t, glm.determinant(m), 2) - testing.expect_value(t, glm.adjugate(m) * m, 2 * linalg.identity(matrix[2,2]int)) + testing.expect_value(t, glm.adjugate(m) * m, 2 * I) + testing.expect_value(t, m * glm.adjugate(m), 2 * I) testing.expect_value(t, hlm.adjugate(m), expected) testing.expect_value(t, hlm.determinant(m), 2) - testing.expect_value(t, hlm.adjugate(m) * m, 2 * linalg.identity(matrix[2,2]int)) + testing.expect_value(t, hlm.adjugate(m) * m, 2 * I) + testing.expect_value(t, m * hlm.adjugate(m), 2 * I) } @test test_adjugate_3x3 :: proc(t: ^testing.T) { + I := linalg.identity(matrix[3,3]int) m := matrix[3,3]int { -3, 2, -5, -1, 0, -2, @@ -43,19 +48,23 @@ test_adjugate_3x3 :: proc(t: ^testing.T) { } testing.expect_value(t, linalg.adjugate(m), expected) testing.expect_value(t, linalg.determinant(m), -6) - testing.expect_value(t, linalg.adjugate(m) * m, -6 * linalg.identity(matrix[3,3]int)) + testing.expect_value(t, linalg.adjugate(m) * m, -6 * I) + testing.expect_value(t, m * linalg.adjugate(m), -6 * I) testing.expect_value(t, glm.adjugate(m), expected) testing.expect_value(t, glm.determinant(m), -6) - testing.expect_value(t, glm.adjugate(m) * m, -6 * linalg.identity(matrix[3,3]int)) + testing.expect_value(t, glm.adjugate(m) * m, -6 * I) + testing.expect_value(t, m * glm.adjugate(m), -6 * I) testing.expect_value(t, hlm.adjugate(m), expected) testing.expect_value(t, hlm.determinant(m), -6) - testing.expect_value(t, hlm.adjugate(m) * m, -6 * linalg.identity(matrix[3,3]int)) + testing.expect_value(t, hlm.adjugate(m) * m, -6 * I) + testing.expect_value(t, m * hlm.adjugate(m), -6 * I) } @test test_adjugate_4x4 :: proc(t: ^testing.T) { + I := linalg.identity(matrix[4,4]int) m := matrix[4,4]int { -3, 2, -5, 1, -1, 0, -2, 2, @@ -70,13 +79,16 @@ test_adjugate_4x4 :: proc(t: ^testing.T) { } testing.expect_value(t, linalg.adjugate(m), expected) testing.expect_value(t, linalg.determinant(m), -174) - testing.expect_value(t, linalg.adjugate(m) * m, -174 * linalg.identity(matrix[4,4]int)) + testing.expect_value(t, linalg.adjugate(m) * m, -174 * I) + testing.expect_value(t, m * linalg.adjugate(m), -174 * I) testing.expect_value(t, glm.adjugate(m), expected) testing.expect_value(t, glm.determinant(m), -174) - testing.expect_value(t, glm.adjugate(m) * m, -174 * linalg.identity(matrix[4,4]int)) + testing.expect_value(t, glm.adjugate(m) * m, -174 * I) + testing.expect_value(t, m * glm.adjugate(m), -174 * I) testing.expect_value(t, hlm.adjugate(m), expected) testing.expect_value(t, hlm.determinant(m), -174) - testing.expect_value(t, hlm.adjugate(m) * m, -174 * linalg.identity(matrix[4,4]int)) + testing.expect_value(t, hlm.adjugate(m) * m, -174 * I) + testing.expect_value(t, m * hlm.adjugate(m), -174 * I) } \ No newline at end of file From ec5ee19c01c30e8fd01c9f04a2249c4d3d18b50d Mon Sep 17 00:00:00 2001 From: Sebastian Pahnke Date: Sat, 28 Dec 2024 10:24:37 +0100 Subject: [PATCH 089/431] Add regression tests for matrix inverse --- tests/issues/test_issue_4584.odin | 95 +++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/tests/issues/test_issue_4584.odin b/tests/issues/test_issue_4584.odin index 27e5cd789..a709926d2 100644 --- a/tests/issues/test_issue_4584.odin +++ b/tests/issues/test_issue_4584.odin @@ -2,6 +2,7 @@ package test_issues import "core:testing" +import "core:log" import "core:math/linalg" import glm "core:math/linalg/glsl" import hlm "core:math/linalg/hlsl" @@ -91,4 +92,98 @@ test_adjugate_4x4 :: proc(t: ^testing.T) { testing.expect_value(t, hlm.determinant(m), -174) testing.expect_value(t, hlm.adjugate(m) * m, -174 * I) testing.expect_value(t, m * hlm.adjugate(m), -174 * I) +} + +@test +test_inverse_regression_2x2 :: proc(t: ^testing.T) { + I := linalg.identity(matrix[2,2]f32) + m := matrix[2,2]f32 { + -3, 2, + -1, 0, + } + expected := matrix[2,2]f32 { + 0.0, -1.0, + 1.0/2.0, -3.0/2.0, + } + expect_float_matrix_value(t, linalg.inverse(m), expected) + expect_float_matrix_value(t, linalg.inverse(m) * m, I) + expect_float_matrix_value(t, m * linalg.inverse(m), I) + + expect_float_matrix_value(t, glm.inverse(m), expected) + expect_float_matrix_value(t, glm.inverse(m) * m, I) + expect_float_matrix_value(t, m * glm.inverse(m), I) + + expect_float_matrix_value(t, hlm.inverse(m), expected) + expect_float_matrix_value(t, hlm.inverse(m) * m, I) + expect_float_matrix_value(t, m * hlm.inverse(m), I) +} + +@test +test_inverse_regression_3x3 :: proc(t: ^testing.T) { + I := linalg.identity(matrix[3,3]f32) + m := matrix[3,3]f32 { + -3, 2, -5, + -1, 0, -2, + 3, -4, 1, + } + expected := matrix[3,3]f32 { + 4.0/3.0, -3.0, 2.0/3.0, + 5.0/6.0, -2.0, 1.0/6.0, + -2.0/3.0, 1.0, -1.0/3.0, + } + expect_float_matrix_value(t, linalg.inverse(m), expected) + expect_float_matrix_value(t, linalg.inverse(m) * m, I) + expect_float_matrix_value(t, m * linalg.inverse(m), I) + + expect_float_matrix_value(t, glm.inverse(m), expected) + expect_float_matrix_value(t, glm.inverse(m) * m, I) + expect_float_matrix_value(t, m * glm.inverse(m), I) + + expect_float_matrix_value(t, hlm.inverse(m), expected) + expect_float_matrix_value(t, hlm.inverse(m) * m, I) + expect_float_matrix_value(t, m * hlm.inverse(m), I) +} + +@test +test_inverse_regression_4x4 :: proc(t: ^testing.T) { + I := linalg.identity(matrix[4,4]f32) + m := matrix[4,4]f32 { + -3, 2, -5, 1, + -1, 0, -2, 2, + 3, -4, 1, 3, + 4, 5, 6, 7, + } + expected := matrix[4,4]f32 { + 24.0/29.0, -133.0/87.0, 46.0/87.0, 8.0/87.0, + 19.0/58.0, -46.0/87.0, 5.0/174.0, 8.0/87.0, + -35.0/58.0, 71.0/87.0, -55.0/174.0, -1.0/87.0, + -11.0/58.0, 16.0/29.0, -3.0/58.0, 1.0/29.0, + } + expect_float_matrix_value(t, linalg.inverse(m), expected) + expect_float_matrix_value(t, linalg.inverse(m) * m, I) + expect_float_matrix_value(t, m * linalg.inverse(m), I) + + expect_float_matrix_value(t, glm.inverse(m), expected) + expect_float_matrix_value(t, glm.inverse(m) * m, I) + expect_float_matrix_value(t, m * glm.inverse(m), I) + + expect_float_matrix_value(t, hlm.inverse(m), expected) + expect_float_matrix_value(t, hlm.inverse(m) * m, I) + expect_float_matrix_value(t, m * hlm.inverse(m), I) +} + +@(private="file") +expect_float_matrix_value :: proc(t: ^testing.T, value, expected: $M/matrix[$N, N]f32, loc := #caller_location, value_expr := #caller_expression(value)) -> bool { + ok := true + outer: for i in 0.. 1e-6 { + ok = false + break outer + } + } + } + if !ok do log.errorf("expected %v to be %v, got %v", value_expr, expected, value, location=loc) + return ok } \ No newline at end of file From b21fc1923307602500c696e418efa951a5658ed8 Mon Sep 17 00:00:00 2001 From: Sebastian Pahnke Date: Sat, 28 Dec 2024 10:29:05 +0100 Subject: [PATCH 090/431] Add regression tests for inverse_transpose --- tests/issues/test_issue_4584.odin | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/issues/test_issue_4584.odin b/tests/issues/test_issue_4584.odin index a709926d2..9eea23420 100644 --- a/tests/issues/test_issue_4584.odin +++ b/tests/issues/test_issue_4584.odin @@ -106,14 +106,17 @@ test_inverse_regression_2x2 :: proc(t: ^testing.T) { 1.0/2.0, -3.0/2.0, } expect_float_matrix_value(t, linalg.inverse(m), expected) + expect_float_matrix_value(t, linalg.inverse_transpose(m), linalg.transpose(expected)) expect_float_matrix_value(t, linalg.inverse(m) * m, I) expect_float_matrix_value(t, m * linalg.inverse(m), I) expect_float_matrix_value(t, glm.inverse(m), expected) + expect_float_matrix_value(t, glm.inverse_transpose(m), glm.transpose(expected)) expect_float_matrix_value(t, glm.inverse(m) * m, I) expect_float_matrix_value(t, m * glm.inverse(m), I) expect_float_matrix_value(t, hlm.inverse(m), expected) + expect_float_matrix_value(t, hlm.inverse_transpose(m), hlm.transpose(expected)) expect_float_matrix_value(t, hlm.inverse(m) * m, I) expect_float_matrix_value(t, m * hlm.inverse(m), I) } @@ -132,14 +135,17 @@ test_inverse_regression_3x3 :: proc(t: ^testing.T) { -2.0/3.0, 1.0, -1.0/3.0, } expect_float_matrix_value(t, linalg.inverse(m), expected) + expect_float_matrix_value(t, linalg.inverse_transpose(m), linalg.transpose(expected)) expect_float_matrix_value(t, linalg.inverse(m) * m, I) expect_float_matrix_value(t, m * linalg.inverse(m), I) expect_float_matrix_value(t, glm.inverse(m), expected) + expect_float_matrix_value(t, glm.inverse_transpose(m), glm.transpose(expected)) expect_float_matrix_value(t, glm.inverse(m) * m, I) expect_float_matrix_value(t, m * glm.inverse(m), I) expect_float_matrix_value(t, hlm.inverse(m), expected) + expect_float_matrix_value(t, hlm.inverse_transpose(m), hlm.transpose(expected)) expect_float_matrix_value(t, hlm.inverse(m) * m, I) expect_float_matrix_value(t, m * hlm.inverse(m), I) } @@ -160,14 +166,17 @@ test_inverse_regression_4x4 :: proc(t: ^testing.T) { -11.0/58.0, 16.0/29.0, -3.0/58.0, 1.0/29.0, } expect_float_matrix_value(t, linalg.inverse(m), expected) + expect_float_matrix_value(t, linalg.inverse_transpose(m), linalg.transpose(expected)) expect_float_matrix_value(t, linalg.inverse(m) * m, I) expect_float_matrix_value(t, m * linalg.inverse(m), I) expect_float_matrix_value(t, glm.inverse(m), expected) + expect_float_matrix_value(t, glm.inverse_transpose(m), glm.transpose(expected)) expect_float_matrix_value(t, glm.inverse(m) * m, I) expect_float_matrix_value(t, m * glm.inverse(m), I) expect_float_matrix_value(t, hlm.inverse(m), expected) + expect_float_matrix_value(t, hlm.inverse_transpose(m), hlm.transpose(expected)) expect_float_matrix_value(t, hlm.inverse(m) * m, I) expect_float_matrix_value(t, m * hlm.inverse(m), I) } From d22cb20d85e0afeb61f6ad26434dd92b9d9b2ff7 Mon Sep 17 00:00:00 2001 From: dozn <16659513+dozn@users.noreply.github.com> Date: Sat, 28 Dec 2024 07:48:09 -0800 Subject: [PATCH 091/431] Use Struct Tags For Embedded (with `using`) Structs When Unmarshalling JSON A fix for https://github.com/odin-lang/Odin/issues/4539 --- core/encoding/json/unmarshal.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/encoding/json/unmarshal.odin b/core/encoding/json/unmarshal.odin index c70b8d39a..e76de2747 100644 --- a/core/encoding/json/unmarshal.odin +++ b/core/encoding/json/unmarshal.odin @@ -470,7 +470,7 @@ unmarshal_object :: proc(p: ^Parser, v: any, end_token: Token_Kind) -> (err: Unm } } - if field.name == key { + if field.name == key || (field.tag != "" && reflect.struct_tag_get(field.tag, "json") == key) { offset = field.offset type = field.type found = true From 87c159c69fd699312fa014700c03f43188dd0728 Mon Sep 17 00:00:00 2001 From: dozn <16659513+dozn@users.noreply.github.com> Date: Sat, 28 Dec 2024 08:13:38 -0800 Subject: [PATCH 092/431] Remove unnecessary string() conversion. --- core/encoding/json/unmarshal.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/encoding/json/unmarshal.odin b/core/encoding/json/unmarshal.odin index e76de2747..57371e360 100644 --- a/core/encoding/json/unmarshal.odin +++ b/core/encoding/json/unmarshal.odin @@ -439,7 +439,7 @@ unmarshal_object :: proc(p: ^Parser, v: any, end_token: Token_Kind) -> (err: Unm use_field_idx := -1 for field, field_idx in fields { - tag_value := string(reflect.struct_tag_get(field.tag, "json")) + tag_value := reflect.struct_tag_get(field.tag, "json") json_name, _ := json_name_from_tag_value(tag_value) if key == json_name { use_field_idx = field_idx From 77511da195ad83c6d8e130be7249cde53d78d69c Mon Sep 17 00:00:00 2001 From: shashank Date: Sun, 29 Dec 2024 19:58:55 +0530 Subject: [PATCH 093/431] update cgltf from 1.13 to 1.14 --- vendor/cgltf/cgltf.odin | 71 +++- vendor/cgltf/src/cgltf.h | 653 ++++++++++++++++++++++----------- vendor/cgltf/src/cgltf_write.h | 67 +++- 3 files changed, 549 insertions(+), 242 deletions(-) diff --git a/vendor/cgltf/cgltf.odin b/vendor/cgltf/cgltf.odin index a24c36d64..e9dc7ef84 100644 --- a/vendor/cgltf/cgltf.odin +++ b/vendor/cgltf/cgltf.odin @@ -105,6 +105,7 @@ type :: enum c.int { } primitive_type :: enum c.int { + invalid, points, lines, line_loop, @@ -222,15 +223,6 @@ accessor_sparse :: struct { indices_component_type: component_type, values_buffer_view: ^buffer_view, values_byte_offset: uint, - extras: extras_t, - indices_extras: extras_t, - values_extras: extras_t, - extensions_count: uint, - extensions: [^]extension `fmt:"v,extensions_count"`, - indices_extensions_count: uint, - indices_extensions: [^]extension `fmt:"v,indices_extensions_count"`, - values_extensions_count: uint, - values_extensions: [^]extension `fmt:"v,values_extensions_count"`, } accessor :: struct { @@ -306,9 +298,6 @@ texture_view :: struct { scale: f32, /* equivalent to strength for occlusion_texture */ has_transform: b32, transform: texture_transform, - extras: extras_t, - extensions_count: uint, - extensions: [^]extension `fmt:"v,extensions_count"`, } pbr_metallic_roughness :: struct { @@ -381,6 +370,16 @@ iridescence :: struct { iridescence_thickness_texture: texture_view, } +anisotropy :: struct { + anisotropy_strength: f32, + anisotropy_rotation: f32, + anisotropy_texture: texture_view, +} + +dispersion :: struct { + dispersion: f32, +} + material :: struct { name: cstring, has_pbr_metallic_roughness: b32, @@ -393,6 +392,8 @@ material :: struct { has_sheen: b32, has_emissive_strength: b32, has_iridescence: b32, + has_anisotropy: b32, + has_dispersion: b32, pbr_metallic_roughness: pbr_metallic_roughness, pbr_specular_glossiness: pbr_specular_glossiness, clearcoat: clearcoat, @@ -403,6 +404,8 @@ material :: struct { volume: volume, emissive_strength: emissive_strength, iridescence: iridescence, + anisotropy: anisotropy, + dispersion: dispersion, normal_texture: texture_view, occlusion_texture: texture_view, emissive_texture: texture_view, @@ -432,7 +435,6 @@ draco_mesh_compression :: struct { } mesh_gpu_instancing :: struct { - buffer_view: ^buffer_view, attributes: []attribute, } @@ -683,6 +685,9 @@ foreign lib { node_transform_local :: proc(node: ^node, out_matrix: [^]f32) --- node_transform_world :: proc(node: ^node, out_matrix: [^]f32) --- + @(require_results) + buffer_view_data :: proc(view: ^/*const*/buffer_view) -> [^]byte --- + @(require_results) accessor_read_float :: proc(accessor: ^/*const*/accessor, index: uint, out: [^]f32, element_size: uint) -> b32 --- @(require_results) @@ -693,13 +698,53 @@ foreign lib { @(require_results) num_components :: proc(type: type) -> uint --- + @(require_results) + component_size :: proc(component_type: component_type) -> uint --- + @(require_results) + calc_size :: proc(type: type, component_type: component_type) -> uint --- + @(require_results) accessor_unpack_floats :: proc(accessor: ^/*const*/accessor, out: [^]f32, float_count: uint) -> uint --- + @(require_results) + accessor_unpack_indices :: proc(accessor: ^/*const*/accessor , out: rawptr, out_component_size: uint, index_count: uint) -> uint --- /* this function is deprecated and will be removed in the future; use cgltf_extras::data instead */ @(require_results) copy_extras_json :: proc(data: ^data, extras: ^extras_t, dest: [^]byte, dest_size: ^uint) -> result --- + @(require_results) + mesh_index :: proc(data: ^/*const*/data, object: ^/*const*/mesh) -> uint --- + @(require_results) + material_index :: proc(data: ^/*const*/data, object: ^/*const*/material) -> uint --- + @(require_results) + accessor_index :: proc(data: ^/*const*/data, object: ^/*const*/accessor) -> uint --- + @(require_results) + buffer_view_index :: proc(data: ^/*const*/data, object: ^/*const*/buffer_view) -> uint --- + @(require_results) + buffer_index :: proc(data: ^/*const*/data, object: ^/*const*/buffer) -> uint --- + @(require_results) + image_index :: proc(data: ^/*const*/data, object: ^/*const*/image) -> uint --- + @(require_results) + texture_index :: proc(data: ^/*const*/data, object: ^/*const*/texture) -> uint --- + @(require_results) + sampler_index :: proc(data: ^/*const*/data, object: ^/*const*/sampler) -> uint --- + @(require_results) + skin_index :: proc(data: ^/*const*/data, object: ^/*const*/skin) -> uint --- + @(require_results) + camera_index :: proc(data: ^/*const*/data, object: ^/*const*/camera) -> uint --- + @(require_results) + light_index :: proc(data: ^/*const*/data, object: ^/*const*/light) -> uint --- + @(require_results) + node_index :: proc(data: ^/*const*/data, object: ^/*const*/node) -> uint --- + @(require_results) + scene_index :: proc(data: ^/*const*/data, object: ^/*const*/scene) -> uint --- + @(require_results) + animation_index :: proc(data: ^/*const*/data, object: ^/*const*/animation) -> uint --- + @(require_results) + animation_sampler_index :: proc(animation: ^/*const*/animation, object: ^/*const*/animation_sampler) -> uint --- + @(require_results) + animation_channel_index :: proc(animation: ^/*const*/animation, object: ^/*const*/animation_channel) -> uint --- + @(require_results) write_file :: proc(#by_ptr options: options, path: cstring, data: ^data) -> result --- @(require_results) diff --git a/vendor/cgltf/src/cgltf.h b/vendor/cgltf/src/cgltf.h index a534cefb4..17dc0ca5d 100644 --- a/vendor/cgltf/src/cgltf.h +++ b/vendor/cgltf/src/cgltf.h @@ -1,7 +1,7 @@ /** * cgltf - a single-file glTF 2.0 parser written in C99. * - * Version: 1.13 + * Version: 1.14 * * Website: https://github.com/jkuhlmann/cgltf * @@ -63,9 +63,15 @@ * By passing null for the output pointer, users can find out how many floats are required in the * output buffer. * + * `cgltf_accessor_unpack_indices` reads in the index data from an accessor. Assumes that + * `cgltf_load_buffers` has already been called. By passing null for the output pointer, users can + * find out how many indices are required in the output buffer. Returns 0 if the accessor is + * sparse or if the output component size is less than the accessor's component size. + * * `cgltf_num_components` is a tiny utility that tells you the dimensionality of * a certain accessor type. This can be used before `cgltf_accessor_unpack_floats` to help allocate - * the necessary amount of memory. + * the necessary amount of memory. `cgltf_component_size` and `cgltf_calc_size` exist for + * similar purposes. * * `cgltf_accessor_read_float` reads a certain element from a non-sparse accessor and converts it to * floating point, assuming that `cgltf_load_buffers` has already been called. The passed-in element @@ -74,7 +80,7 @@ * * `cgltf_accessor_read_uint` is similar to its floating-point counterpart, but limited to reading * vector types and does not support matrix types. The passed-in element size is the number of uints - * in the output buffer, which should be in the range [1, 4]. Returns false if the passed-in + * in the output buffer, which should be in the range [1, 4]. Returns false if the passed-in * element_size is too small, or if the accessor is sparse. * * `cgltf_accessor_read_index` is similar to its floating-point counterpart, but it returns size_t @@ -89,6 +95,7 @@ #define CGLTF_H_INCLUDED__ #include +#include /* For uint8_t, uint32_t */ #ifdef __cplusplus extern "C" { @@ -195,6 +202,7 @@ typedef enum cgltf_type typedef enum cgltf_primitive_type { + cgltf_primitive_type_invalid, cgltf_primitive_type_points, cgltf_primitive_type_lines, cgltf_primitive_type_line_loop, @@ -326,15 +334,6 @@ typedef struct cgltf_accessor_sparse cgltf_component_type indices_component_type; cgltf_buffer_view* values_buffer_view; cgltf_size values_byte_offset; - cgltf_extras extras; - cgltf_extras indices_extras; - cgltf_extras values_extras; - cgltf_size extensions_count; - cgltf_extension* extensions; - cgltf_size indices_extensions_count; - cgltf_extension* indices_extensions; - cgltf_size values_extensions_count; - cgltf_extension* values_extensions; } cgltf_accessor_sparse; typedef struct cgltf_accessor @@ -417,9 +416,6 @@ typedef struct cgltf_texture_view cgltf_float scale; /* equivalent to strength for occlusion_texture */ cgltf_bool has_transform; cgltf_texture_transform transform; - cgltf_extras extras; - cgltf_size extensions_count; - cgltf_extension* extensions; } cgltf_texture_view; typedef struct cgltf_pbr_metallic_roughness @@ -502,6 +498,18 @@ typedef struct cgltf_iridescence cgltf_texture_view iridescence_thickness_texture; } cgltf_iridescence; +typedef struct cgltf_anisotropy +{ + cgltf_float anisotropy_strength; + cgltf_float anisotropy_rotation; + cgltf_texture_view anisotropy_texture; +} cgltf_anisotropy; + +typedef struct cgltf_dispersion +{ + cgltf_float dispersion; +} cgltf_dispersion; + typedef struct cgltf_material { char* name; @@ -515,6 +523,8 @@ typedef struct cgltf_material cgltf_bool has_sheen; cgltf_bool has_emissive_strength; cgltf_bool has_iridescence; + cgltf_bool has_anisotropy; + cgltf_bool has_dispersion; cgltf_pbr_metallic_roughness pbr_metallic_roughness; cgltf_pbr_specular_glossiness pbr_specular_glossiness; cgltf_clearcoat clearcoat; @@ -525,6 +535,8 @@ typedef struct cgltf_material cgltf_volume volume; cgltf_emissive_strength emissive_strength; cgltf_iridescence iridescence; + cgltf_anisotropy anisotropy; + cgltf_dispersion dispersion; cgltf_texture_view normal_texture; cgltf_texture_view occlusion_texture; cgltf_texture_view emissive_texture; @@ -557,7 +569,6 @@ typedef struct cgltf_draco_mesh_compression { } cgltf_draco_mesh_compression; typedef struct cgltf_mesh_gpu_instancing { - cgltf_buffer_view* buffer_view; cgltf_attribute* attributes; cgltf_size attributes_count; } cgltf_mesh_gpu_instancing; @@ -829,17 +840,39 @@ void cgltf_free(cgltf_data* data); void cgltf_node_transform_local(const cgltf_node* node, cgltf_float* out_matrix); void cgltf_node_transform_world(const cgltf_node* node, cgltf_float* out_matrix); +const uint8_t* cgltf_buffer_view_data(const cgltf_buffer_view* view); + cgltf_bool cgltf_accessor_read_float(const cgltf_accessor* accessor, cgltf_size index, cgltf_float* out, cgltf_size element_size); cgltf_bool cgltf_accessor_read_uint(const cgltf_accessor* accessor, cgltf_size index, cgltf_uint* out, cgltf_size element_size); cgltf_size cgltf_accessor_read_index(const cgltf_accessor* accessor, cgltf_size index); cgltf_size cgltf_num_components(cgltf_type type); +cgltf_size cgltf_component_size(cgltf_component_type component_type); +cgltf_size cgltf_calc_size(cgltf_type type, cgltf_component_type component_type); cgltf_size cgltf_accessor_unpack_floats(const cgltf_accessor* accessor, cgltf_float* out, cgltf_size float_count); +cgltf_size cgltf_accessor_unpack_indices(const cgltf_accessor* accessor, void* out, cgltf_size out_component_size, cgltf_size index_count); /* this function is deprecated and will be removed in the future; use cgltf_extras::data instead */ cgltf_result cgltf_copy_extras_json(const cgltf_data* data, const cgltf_extras* extras, char* dest, cgltf_size* dest_size); +cgltf_size cgltf_mesh_index(const cgltf_data* data, const cgltf_mesh* object); +cgltf_size cgltf_material_index(const cgltf_data* data, const cgltf_material* object); +cgltf_size cgltf_accessor_index(const cgltf_data* data, const cgltf_accessor* object); +cgltf_size cgltf_buffer_view_index(const cgltf_data* data, const cgltf_buffer_view* object); +cgltf_size cgltf_buffer_index(const cgltf_data* data, const cgltf_buffer* object); +cgltf_size cgltf_image_index(const cgltf_data* data, const cgltf_image* object); +cgltf_size cgltf_texture_index(const cgltf_data* data, const cgltf_texture* object); +cgltf_size cgltf_sampler_index(const cgltf_data* data, const cgltf_sampler* object); +cgltf_size cgltf_skin_index(const cgltf_data* data, const cgltf_skin* object); +cgltf_size cgltf_camera_index(const cgltf_data* data, const cgltf_camera* object); +cgltf_size cgltf_light_index(const cgltf_data* data, const cgltf_light* object); +cgltf_size cgltf_node_index(const cgltf_data* data, const cgltf_node* object); +cgltf_size cgltf_scene_index(const cgltf_data* data, const cgltf_scene* object); +cgltf_size cgltf_animation_index(const cgltf_data* data, const cgltf_animation* object); +cgltf_size cgltf_animation_sampler_index(const cgltf_animation* animation, const cgltf_animation_sampler* object); +cgltf_size cgltf_animation_channel_index(const cgltf_animation* animation, const cgltf_animation_channel* object); + #ifdef __cplusplus } #endif @@ -860,7 +893,7 @@ cgltf_result cgltf_copy_extras_json(const cgltf_data* data, const cgltf_extras* #ifdef CGLTF_IMPLEMENTATION -#include /* For uint8_t, uint32_t */ +#include /* For assert */ #include /* For strncpy */ #include /* For fopen */ #include /* For UINT_MAX etc */ @@ -870,10 +903,6 @@ cgltf_result cgltf_copy_extras_json(const cgltf_data* data, const cgltf_extras* #include /* For malloc, free, atoi, atof */ #endif -#if CGLTF_VALIDATE_ENABLE_ASSERTS -#include -#endif - /* JSMN_PARENT_LINKS is necessary to make parsing large structures linear in input size */ #define JSMN_PARENT_LINKS @@ -902,15 +931,15 @@ enum jsmnerr { }; typedef struct { jsmntype_t type; - int start; - int end; + ptrdiff_t start; + ptrdiff_t end; int size; #ifdef JSMN_PARENT_LINKS int parent; #endif } jsmntok_t; typedef struct { - unsigned int pos; /* offset in the JSON string */ + size_t pos; /* offset in the JSON string */ unsigned int toknext; /* next token to allocate */ int toksuper; /* superior token node, e.g parent object or array */ } jsmn_parser; @@ -922,8 +951,8 @@ static int jsmn_parse(jsmn_parser *parser, const char *js, size_t len, jsmntok_t #ifndef CGLTF_CONSTS -static const cgltf_size GlbHeaderSize = 12; -static const cgltf_size GlbChunkHeaderSize = 8; +#define GlbHeaderSize 12 +#define GlbChunkHeaderSize 8 static const uint32_t GlbVersion = 2; static const uint32_t GlbMagic = 0x46546C67; static const uint32_t GlbMagicJsonChunk = 0x4E4F534A; @@ -995,7 +1024,7 @@ static cgltf_result cgltf_default_file_read(const struct cgltf_memory_options* m { fseek(file, 0, SEEK_END); -#ifdef _WIN32 +#ifdef _MSC_VER __int64 length = _ftelli64(file); #else long length = ftell(file); @@ -1017,7 +1046,7 @@ static cgltf_result cgltf_default_file_read(const struct cgltf_memory_options* m fclose(file); return cgltf_result_out_of_memory; } - + cgltf_size read_size = fread(file_data, 1, file_size, file); fclose(file); @@ -1125,7 +1154,7 @@ cgltf_result cgltf_parse(const cgltf_options* options, const void* data, cgltf_s // JSON chunk: length uint32_t json_length; memcpy(&json_length, json_chunk, 4); - if (GlbHeaderSize + GlbChunkHeaderSize + json_length > size) + if (json_length > size - GlbHeaderSize - GlbChunkHeaderSize) { return cgltf_result_data_too_short; } @@ -1139,10 +1168,10 @@ cgltf_result cgltf_parse(const cgltf_options* options, const void* data, cgltf_s json_chunk += GlbChunkHeaderSize; - const void* bin = 0; + const void* bin = NULL; cgltf_size bin_size = 0; - if (GlbHeaderSize + GlbChunkHeaderSize + json_length + GlbChunkHeaderSize <= size) + if (GlbChunkHeaderSize <= size - GlbHeaderSize - GlbChunkHeaderSize - json_length) { // We can read another chunk const uint8_t* bin_chunk = json_chunk + json_length; @@ -1150,7 +1179,7 @@ cgltf_result cgltf_parse(const cgltf_options* options, const void* data, cgltf_s // Bin chunk: length uint32_t bin_length; memcpy(&bin_length, bin_chunk, 4); - if (GlbHeaderSize + GlbChunkHeaderSize + json_length + GlbChunkHeaderSize + bin_length > size) + if (bin_length > size - GlbHeaderSize - GlbChunkHeaderSize - json_length - GlbChunkHeaderSize) { return cgltf_result_data_too_short; } @@ -1486,8 +1515,6 @@ cgltf_result cgltf_load_buffers(const cgltf_options* options, cgltf_data* data, return cgltf_result_success; } -static cgltf_size cgltf_calc_size(cgltf_type type, cgltf_component_type component_type); - static cgltf_size cgltf_calc_index_bound(cgltf_buffer_view* buffer_view, cgltf_size offset, cgltf_component_type component_type, cgltf_size count) { char* data = (char*)buffer_view->buffer->data + offset + buffer_view->offset; @@ -1538,6 +1565,9 @@ cgltf_result cgltf_validate(cgltf_data* data) { cgltf_accessor* accessor = &data->accessors[i]; + CGLTF_ASSERT_IF(data->accessors[i].component_type == cgltf_component_type_invalid, cgltf_result_invalid_gltf); + CGLTF_ASSERT_IF(data->accessors[i].type == cgltf_type_invalid, cgltf_result_invalid_gltf); + cgltf_size element_size = cgltf_calc_size(accessor->type, accessor->component_type); if (accessor->buffer_view) @@ -1551,7 +1581,7 @@ cgltf_result cgltf_validate(cgltf_data* data) { cgltf_accessor_sparse* sparse = &accessor->sparse; - cgltf_size indices_component_size = cgltf_calc_size(cgltf_type_scalar, sparse->indices_component_type); + cgltf_size indices_component_size = cgltf_component_size(sparse->indices_component_type); cgltf_size indices_req_size = sparse->indices_byte_offset + indices_component_size * sparse->count; cgltf_size values_req_size = sparse->values_byte_offset + element_size * sparse->count; @@ -1617,43 +1647,48 @@ cgltf_result cgltf_validate(cgltf_data* data) for (cgltf_size j = 0; j < data->meshes[i].primitives_count; ++j) { + CGLTF_ASSERT_IF(data->meshes[i].primitives[j].type == cgltf_primitive_type_invalid, cgltf_result_invalid_gltf); CGLTF_ASSERT_IF(data->meshes[i].primitives[j].targets_count != data->meshes[i].primitives[0].targets_count, cgltf_result_invalid_gltf); - if (data->meshes[i].primitives[j].attributes_count) + CGLTF_ASSERT_IF(data->meshes[i].primitives[j].attributes_count == 0, cgltf_result_invalid_gltf); + + cgltf_accessor* first = data->meshes[i].primitives[j].attributes[0].data; + + CGLTF_ASSERT_IF(first->count == 0, cgltf_result_invalid_gltf); + + for (cgltf_size k = 0; k < data->meshes[i].primitives[j].attributes_count; ++k) { - cgltf_accessor* first = data->meshes[i].primitives[j].attributes[0].data; + CGLTF_ASSERT_IF(data->meshes[i].primitives[j].attributes[k].data->count != first->count, cgltf_result_invalid_gltf); + } - for (cgltf_size k = 0; k < data->meshes[i].primitives[j].attributes_count; ++k) + for (cgltf_size k = 0; k < data->meshes[i].primitives[j].targets_count; ++k) + { + for (cgltf_size m = 0; m < data->meshes[i].primitives[j].targets[k].attributes_count; ++m) { - CGLTF_ASSERT_IF(data->meshes[i].primitives[j].attributes[k].data->count != first->count, cgltf_result_invalid_gltf); + CGLTF_ASSERT_IF(data->meshes[i].primitives[j].targets[k].attributes[m].data->count != first->count, cgltf_result_invalid_gltf); } + } - for (cgltf_size k = 0; k < data->meshes[i].primitives[j].targets_count; ++k) - { - for (cgltf_size m = 0; m < data->meshes[i].primitives[j].targets[k].attributes_count; ++m) - { - CGLTF_ASSERT_IF(data->meshes[i].primitives[j].targets[k].attributes[m].data->count != first->count, cgltf_result_invalid_gltf); - } - } + cgltf_accessor* indices = data->meshes[i].primitives[j].indices; - cgltf_accessor* indices = data->meshes[i].primitives[j].indices; + CGLTF_ASSERT_IF(indices && + indices->component_type != cgltf_component_type_r_8u && + indices->component_type != cgltf_component_type_r_16u && + indices->component_type != cgltf_component_type_r_32u, cgltf_result_invalid_gltf); - CGLTF_ASSERT_IF(indices && - indices->component_type != cgltf_component_type_r_8u && - indices->component_type != cgltf_component_type_r_16u && - indices->component_type != cgltf_component_type_r_32u, cgltf_result_invalid_gltf); + CGLTF_ASSERT_IF(indices && indices->type != cgltf_type_scalar, cgltf_result_invalid_gltf); + CGLTF_ASSERT_IF(indices && indices->stride != cgltf_component_size(indices->component_type), cgltf_result_invalid_gltf); - if (indices && indices->buffer_view && indices->buffer_view->buffer->data) - { - cgltf_size index_bound = cgltf_calc_index_bound(indices->buffer_view, indices->offset, indices->component_type, indices->count); + if (indices && indices->buffer_view && indices->buffer_view->buffer->data) + { + cgltf_size index_bound = cgltf_calc_index_bound(indices->buffer_view, indices->offset, indices->component_type, indices->count); - CGLTF_ASSERT_IF(index_bound >= first->count, cgltf_result_data_too_short); - } + CGLTF_ASSERT_IF(index_bound >= first->count, cgltf_result_data_too_short); + } - for (cgltf_size k = 0; k < data->meshes[i].primitives[j].mappings_count; ++k) - { - CGLTF_ASSERT_IF(data->meshes[i].primitives[j].mappings[k].variant >= data->variants_count, cgltf_result_invalid_gltf); - } + for (cgltf_size k = 0; k < data->meshes[i].primitives[j].mappings_count; ++k) + { + CGLTF_ASSERT_IF(data->meshes[i].primitives[j].mappings[k].variant >= data->variants_count, cgltf_result_invalid_gltf); } } } @@ -1710,10 +1745,15 @@ cgltf_result cgltf_validate(cgltf_data* data) cgltf_size values = channel->sampler->interpolation == cgltf_interpolation_type_cubic_spline ? 3 : 1; - CGLTF_ASSERT_IF(channel->sampler->input->count * components * values != channel->sampler->output->count, cgltf_result_data_too_short); + CGLTF_ASSERT_IF(channel->sampler->input->count * components * values != channel->sampler->output->count, cgltf_result_invalid_gltf); } } + for (cgltf_size i = 0; i < data->variants_count; ++i) + { + CGLTF_ASSERT_IF(!data->variants[i].name, cgltf_result_invalid_gltf); + } + return cgltf_result_success; } @@ -1760,12 +1800,6 @@ static void cgltf_free_extensions(cgltf_data* data, cgltf_extension* extensions, data->memory.free_func(data->memory.user_data, extensions); } -static void cgltf_free_texture_view(cgltf_data* data, cgltf_texture_view* view) -{ - cgltf_free_extensions(data, view->extensions, view->extensions_count); - cgltf_free_extras(data, &view->extras); -} - void cgltf_free(cgltf_data* data) { if (!data) @@ -1787,15 +1821,6 @@ void cgltf_free(cgltf_data* data) { data->memory.free_func(data->memory.user_data, data->accessors[i].name); - if(data->accessors[i].is_sparse) - { - cgltf_free_extensions(data, data->accessors[i].sparse.extensions, data->accessors[i].sparse.extensions_count); - cgltf_free_extensions(data, data->accessors[i].sparse.indices_extensions, data->accessors[i].sparse.indices_extensions_count); - cgltf_free_extensions(data, data->accessors[i].sparse.values_extensions, data->accessors[i].sparse.values_extensions_count); - cgltf_free_extras(data, &data->accessors[i].sparse.extras); - cgltf_free_extras(data, &data->accessors[i].sparse.indices_extras); - cgltf_free_extras(data, &data->accessors[i].sparse.values_extras); - } cgltf_free_extensions(data, data->accessors[i].extensions, data->accessors[i].extensions_count); cgltf_free_extras(data, &data->accessors[i].extras); } @@ -1897,57 +1922,13 @@ void cgltf_free(cgltf_data* data) { data->memory.free_func(data->memory.user_data, data->materials[i].name); - if(data->materials[i].has_pbr_metallic_roughness) - { - cgltf_free_texture_view(data, &data->materials[i].pbr_metallic_roughness.metallic_roughness_texture); - cgltf_free_texture_view(data, &data->materials[i].pbr_metallic_roughness.base_color_texture); - } - if(data->materials[i].has_pbr_specular_glossiness) - { - cgltf_free_texture_view(data, &data->materials[i].pbr_specular_glossiness.diffuse_texture); - cgltf_free_texture_view(data, &data->materials[i].pbr_specular_glossiness.specular_glossiness_texture); - } - if(data->materials[i].has_clearcoat) - { - cgltf_free_texture_view(data, &data->materials[i].clearcoat.clearcoat_texture); - cgltf_free_texture_view(data, &data->materials[i].clearcoat.clearcoat_roughness_texture); - cgltf_free_texture_view(data, &data->materials[i].clearcoat.clearcoat_normal_texture); - } - if(data->materials[i].has_specular) - { - cgltf_free_texture_view(data, &data->materials[i].specular.specular_texture); - cgltf_free_texture_view(data, &data->materials[i].specular.specular_color_texture); - } - if(data->materials[i].has_transmission) - { - cgltf_free_texture_view(data, &data->materials[i].transmission.transmission_texture); - } - if (data->materials[i].has_volume) - { - cgltf_free_texture_view(data, &data->materials[i].volume.thickness_texture); - } - if(data->materials[i].has_sheen) - { - cgltf_free_texture_view(data, &data->materials[i].sheen.sheen_color_texture); - cgltf_free_texture_view(data, &data->materials[i].sheen.sheen_roughness_texture); - } - if(data->materials[i].has_iridescence) - { - cgltf_free_texture_view(data, &data->materials[i].iridescence.iridescence_texture); - cgltf_free_texture_view(data, &data->materials[i].iridescence.iridescence_thickness_texture); - } - - cgltf_free_texture_view(data, &data->materials[i].normal_texture); - cgltf_free_texture_view(data, &data->materials[i].occlusion_texture); - cgltf_free_texture_view(data, &data->materials[i].emissive_texture); - cgltf_free_extensions(data, data->materials[i].extensions, data->materials[i].extensions_count); cgltf_free_extras(data, &data->materials[i].extras); } data->memory.free_func(data->memory.user_data, data->materials); - for (cgltf_size i = 0; i < data->images_count; ++i) + for (cgltf_size i = 0; i < data->images_count; ++i) { data->memory.free_func(data->memory.user_data, data->images[i].name); data->memory.free_func(data->memory.user_data, data->images[i].uri); @@ -2195,8 +2176,6 @@ static cgltf_ssize cgltf_component_read_integer(const void* in, cgltf_component_ return *((const uint16_t*) in); case cgltf_component_type_r_32u: return *((const uint32_t*) in); - case cgltf_component_type_r_32f: - return (cgltf_ssize)*((const float*) in); case cgltf_component_type_r_8: return *((const int8_t*) in); case cgltf_component_type_r_8u: @@ -2214,8 +2193,6 @@ static cgltf_size cgltf_component_read_index(const void* in, cgltf_component_typ return *((const uint16_t*) in); case cgltf_component_type_r_32u: return *((const uint32_t*) in); - case cgltf_component_type_r_32f: - return (cgltf_size)*((const float*) in); case cgltf_component_type_r_8u: return *((const uint8_t*) in); default: @@ -2251,8 +2228,6 @@ static cgltf_float cgltf_component_read_float(const void* in, cgltf_component_ty return (cgltf_float)cgltf_component_read_integer(in, component_type); } -static cgltf_size cgltf_component_size(cgltf_component_type component_type); - static cgltf_bool cgltf_element_read_float(const uint8_t* element, cgltf_type type, cgltf_component_type component_type, cgltf_bool normalized, cgltf_float* out, cgltf_size element_size) { cgltf_size num_components = cgltf_num_components(type); @@ -2355,21 +2330,41 @@ cgltf_size cgltf_accessor_unpack_floats(const cgltf_accessor* accessor, cgltf_fl cgltf_size element_count = float_count / floats_per_element; // First pass: convert each element in the base accessor. - cgltf_float* dest = out; - cgltf_accessor dense = *accessor; - dense.is_sparse = 0; - for (cgltf_size index = 0; index < element_count; index++, dest += floats_per_element) + if (accessor->buffer_view == NULL) { - if (!cgltf_accessor_read_float(&dense, index, dest, floats_per_element)) + memset(out, 0, element_count * floats_per_element * sizeof(cgltf_float)); + } + else + { + const uint8_t* element = cgltf_buffer_view_data(accessor->buffer_view); + if (element == NULL) { return 0; } + element += accessor->offset; + + if (accessor->component_type == cgltf_component_type_r_32f && accessor->stride == floats_per_element * sizeof(cgltf_float)) + { + memcpy(out, element, element_count * floats_per_element * sizeof(cgltf_float)); + } + else + { + cgltf_float* dest = out; + + for (cgltf_size index = 0; index < element_count; index++, dest += floats_per_element, element += accessor->stride) + { + if (!cgltf_element_read_float(element, accessor->type, accessor->component_type, accessor->normalized, dest, floats_per_element)) + { + return 0; + } + } + } } // Second pass: write out each element in the sparse accessor. if (accessor->is_sparse) { - const cgltf_accessor_sparse* sparse = &dense.sparse; + const cgltf_accessor_sparse* sparse = &accessor->sparse; const uint8_t* index_data = cgltf_buffer_view_data(sparse->indices_buffer_view); const uint8_t* reader_head = cgltf_buffer_view_data(sparse->values_buffer_view); @@ -2383,17 +2378,15 @@ cgltf_size cgltf_accessor_unpack_floats(const cgltf_accessor* accessor, cgltf_fl reader_head += sparse->values_byte_offset; cgltf_size index_stride = cgltf_component_size(sparse->indices_component_type); - for (cgltf_size reader_index = 0; reader_index < sparse->count; reader_index++, index_data += index_stride) + for (cgltf_size reader_index = 0; reader_index < sparse->count; reader_index++, index_data += index_stride, reader_head += accessor->stride) { size_t writer_index = cgltf_component_read_index(index_data, sparse->indices_component_type); float* writer_head = out + writer_index * floats_per_element; - if (!cgltf_element_read_float(reader_head, dense.type, dense.component_type, dense.normalized, writer_head, floats_per_element)) + if (!cgltf_element_read_float(reader_head, accessor->type, accessor->component_type, accessor->normalized, writer_head, floats_per_element)) { return 0; } - - reader_head += dense.stride; } } @@ -2487,12 +2480,165 @@ cgltf_size cgltf_accessor_read_index(const cgltf_accessor* accessor, cgltf_size return cgltf_component_read_index(element, accessor->component_type); } +cgltf_size cgltf_mesh_index(const cgltf_data* data, const cgltf_mesh* object) +{ + assert(object && (cgltf_size)(object - data->meshes) < data->meshes_count); + return (cgltf_size)(object - data->meshes); +} + +cgltf_size cgltf_material_index(const cgltf_data* data, const cgltf_material* object) +{ + assert(object && (cgltf_size)(object - data->materials) < data->materials_count); + return (cgltf_size)(object - data->materials); +} + +cgltf_size cgltf_accessor_index(const cgltf_data* data, const cgltf_accessor* object) +{ + assert(object && (cgltf_size)(object - data->accessors) < data->accessors_count); + return (cgltf_size)(object - data->accessors); +} + +cgltf_size cgltf_buffer_view_index(const cgltf_data* data, const cgltf_buffer_view* object) +{ + assert(object && (cgltf_size)(object - data->buffer_views) < data->buffer_views_count); + return (cgltf_size)(object - data->buffer_views); +} + +cgltf_size cgltf_buffer_index(const cgltf_data* data, const cgltf_buffer* object) +{ + assert(object && (cgltf_size)(object - data->buffers) < data->buffers_count); + return (cgltf_size)(object - data->buffers); +} + +cgltf_size cgltf_image_index(const cgltf_data* data, const cgltf_image* object) +{ + assert(object && (cgltf_size)(object - data->images) < data->images_count); + return (cgltf_size)(object - data->images); +} + +cgltf_size cgltf_texture_index(const cgltf_data* data, const cgltf_texture* object) +{ + assert(object && (cgltf_size)(object - data->textures) < data->textures_count); + return (cgltf_size)(object - data->textures); +} + +cgltf_size cgltf_sampler_index(const cgltf_data* data, const cgltf_sampler* object) +{ + assert(object && (cgltf_size)(object - data->samplers) < data->samplers_count); + return (cgltf_size)(object - data->samplers); +} + +cgltf_size cgltf_skin_index(const cgltf_data* data, const cgltf_skin* object) +{ + assert(object && (cgltf_size)(object - data->skins) < data->skins_count); + return (cgltf_size)(object - data->skins); +} + +cgltf_size cgltf_camera_index(const cgltf_data* data, const cgltf_camera* object) +{ + assert(object && (cgltf_size)(object - data->cameras) < data->cameras_count); + return (cgltf_size)(object - data->cameras); +} + +cgltf_size cgltf_light_index(const cgltf_data* data, const cgltf_light* object) +{ + assert(object && (cgltf_size)(object - data->lights) < data->lights_count); + return (cgltf_size)(object - data->lights); +} + +cgltf_size cgltf_node_index(const cgltf_data* data, const cgltf_node* object) +{ + assert(object && (cgltf_size)(object - data->nodes) < data->nodes_count); + return (cgltf_size)(object - data->nodes); +} + +cgltf_size cgltf_scene_index(const cgltf_data* data, const cgltf_scene* object) +{ + assert(object && (cgltf_size)(object - data->scenes) < data->scenes_count); + return (cgltf_size)(object - data->scenes); +} + +cgltf_size cgltf_animation_index(const cgltf_data* data, const cgltf_animation* object) +{ + assert(object && (cgltf_size)(object - data->animations) < data->animations_count); + return (cgltf_size)(object - data->animations); +} + +cgltf_size cgltf_animation_sampler_index(const cgltf_animation* animation, const cgltf_animation_sampler* object) +{ + assert(object && (cgltf_size)(object - animation->samplers) < animation->samplers_count); + return (cgltf_size)(object - animation->samplers); +} + +cgltf_size cgltf_animation_channel_index(const cgltf_animation* animation, const cgltf_animation_channel* object) +{ + assert(object && (cgltf_size)(object - animation->channels) < animation->channels_count); + return (cgltf_size)(object - animation->channels); +} + +cgltf_size cgltf_accessor_unpack_indices(const cgltf_accessor* accessor, void* out, cgltf_size out_component_size, cgltf_size index_count) +{ + if (out == NULL) + { + return accessor->count; + } + + index_count = accessor->count < index_count ? accessor->count : index_count; + cgltf_size index_component_size = cgltf_component_size(accessor->component_type); + + if (accessor->is_sparse) + { + return 0; + } + if (accessor->buffer_view == NULL) + { + return 0; + } + if (index_component_size > out_component_size) + { + return 0; + } + const uint8_t* element = cgltf_buffer_view_data(accessor->buffer_view); + if (element == NULL) + { + return 0; + } + element += accessor->offset; + + if (index_component_size == out_component_size && accessor->stride == out_component_size) + { + memcpy(out, element, index_count * index_component_size); + return index_count; + } + + // The component size of the output array is larger than the component size of the index data, so index data will be padded. + switch (out_component_size) + { + case 2: + for (cgltf_size index = 0; index < index_count; index++, element += accessor->stride) + { + ((uint16_t*)out)[index] = (uint16_t)cgltf_component_read_index(element, accessor->component_type); + } + break; + case 4: + for (cgltf_size index = 0; index < index_count; index++, element += accessor->stride) + { + ((uint32_t*)out)[index] = (uint32_t)cgltf_component_read_index(element, accessor->component_type); + } + break; + default: + break; + } + + return index_count; +} + #define CGLTF_ERROR_JSON -1 #define CGLTF_ERROR_NOMEM -2 #define CGLTF_ERROR_LEGACY -3 #define CGLTF_CHECK_TOKTYPE(tok_, type_) if ((tok_).type != (type_)) { return CGLTF_ERROR_JSON; } -#define CGLTF_CHECK_TOKTYPE_RETTYPE(tok_, type_, ret_) if ((tok_).type != (type_)) { return (ret_)CGLTF_ERROR_JSON; } +#define CGLTF_CHECK_TOKTYPE_RET(tok_, type_, ret_) if ((tok_).type != (type_)) { return ret_; } #define CGLTF_CHECK_KEY(tok_) if ((tok_).type != JSMN_STRING || (tok_).size == 0) { return CGLTF_ERROR_JSON; } /* checking size for 0 verifies that a value follows the key */ #define CGLTF_PTRINDEX(type, idx) (type*)((cgltf_size)idx + 1) @@ -2503,7 +2649,7 @@ static int cgltf_json_strcmp(jsmntok_t const* tok, const uint8_t* json_chunk, co { CGLTF_CHECK_TOKTYPE(*tok, JSMN_STRING); size_t const str_len = strlen(str); - size_t const name_length = tok->end - tok->start; + size_t const name_length = (size_t)(tok->end - tok->start); return (str_len == name_length) ? strncmp((const char*)json_chunk + tok->start, str, str_len) : 128; } @@ -2511,7 +2657,7 @@ static int cgltf_json_to_int(jsmntok_t const* tok, const uint8_t* json_chunk) { CGLTF_CHECK_TOKTYPE(*tok, JSMN_PRIMITIVE); char tmp[128]; - int size = (cgltf_size)(tok->end - tok->start) < sizeof(tmp) ? tok->end - tok->start : (int)(sizeof(tmp) - 1); + int size = (size_t)(tok->end - tok->start) < sizeof(tmp) ? (int)(tok->end - tok->start) : (int)(sizeof(tmp) - 1); strncpy(tmp, (const char*)json_chunk + tok->start, size); tmp[size] = 0; return CGLTF_ATOI(tmp); @@ -2519,19 +2665,20 @@ static int cgltf_json_to_int(jsmntok_t const* tok, const uint8_t* json_chunk) static cgltf_size cgltf_json_to_size(jsmntok_t const* tok, const uint8_t* json_chunk) { - CGLTF_CHECK_TOKTYPE_RETTYPE(*tok, JSMN_PRIMITIVE, cgltf_size); + CGLTF_CHECK_TOKTYPE_RET(*tok, JSMN_PRIMITIVE, 0); char tmp[128]; - int size = (cgltf_size)(tok->end - tok->start) < sizeof(tmp) ? tok->end - tok->start : (int)(sizeof(tmp) - 1); + int size = (size_t)(tok->end - tok->start) < sizeof(tmp) ? (int)(tok->end - tok->start) : (int)(sizeof(tmp) - 1); strncpy(tmp, (const char*)json_chunk + tok->start, size); tmp[size] = 0; - return (cgltf_size)CGLTF_ATOLL(tmp); + long long res = CGLTF_ATOLL(tmp); + return res < 0 ? 0 : (cgltf_size)res; } static cgltf_float cgltf_json_to_float(jsmntok_t const* tok, const uint8_t* json_chunk) { CGLTF_CHECK_TOKTYPE(*tok, JSMN_PRIMITIVE); char tmp[128]; - int size = (cgltf_size)(tok->end - tok->start) < sizeof(tmp) ? tok->end - tok->start : (int)(sizeof(tmp) - 1); + int size = (size_t)(tok->end - tok->start) < sizeof(tmp) ? (int)(tok->end - tok->start) : (int)(sizeof(tmp) - 1); strncpy(tmp, (const char*)json_chunk + tok->start, size); tmp[size] = 0; return (cgltf_float)CGLTF_ATOF(tmp); @@ -2539,7 +2686,7 @@ static cgltf_float cgltf_json_to_float(jsmntok_t const* tok, const uint8_t* json static cgltf_bool cgltf_json_to_bool(jsmntok_t const* tok, const uint8_t* json_chunk) { - int size = tok->end - tok->start; + int size = (int)(tok->end - tok->start); return size == 4 && memcmp(json_chunk + tok->start, "true", 4) == 0; } @@ -2605,7 +2752,7 @@ static int cgltf_parse_json_string(cgltf_options* options, jsmntok_t const* toke { return CGLTF_ERROR_JSON; } - int size = tokens[i].end - tokens[i].start; + int size = (int)(tokens[i].end - tokens[i].start); char* result = (char*)options->memory.alloc_func(options->memory.user_data, size + 1); if (!result) { @@ -2706,6 +2853,11 @@ static void cgltf_parse_attribute_type(const char* name, cgltf_attribute_type* o if (us && *out_type != cgltf_attribute_type_invalid) { *out_index = CGLTF_ATOI(us + 1); + if (*out_index < 0) + { + *out_type = cgltf_attribute_type_invalid; + *out_index = 0; + } } } @@ -2863,6 +3015,10 @@ static int cgltf_parse_json_draco_mesh_compression(cgltf_options* options, jsmnt out_draco_mesh_compression->buffer_view = CGLTF_PTRINDEX(cgltf_buffer_view, cgltf_json_to_int(tokens + i, json_chunk)); ++i; } + else + { + i = cgltf_skip_json(tokens, i+1); + } if (i < 0) { @@ -2888,11 +3044,9 @@ static int cgltf_parse_json_mesh_gpu_instancing(cgltf_options* options, jsmntok_ { i = cgltf_parse_json_attribute_list(options, tokens, i + 1, json_chunk, &out_mesh_gpu_instancing->attributes, &out_mesh_gpu_instancing->attributes_count); } - else if (cgltf_json_strcmp(tokens + i, json_chunk, "bufferView") == 0) + else { - ++i; - out_mesh_gpu_instancing->buffer_view = CGLTF_PTRINDEX(cgltf_buffer_view, cgltf_json_to_int(tokens + i, json_chunk)); - ++i; + i = cgltf_skip_json(tokens, i+1); } if (i < 0) @@ -3036,6 +3190,31 @@ static int cgltf_parse_json_material_mappings(cgltf_options* options, jsmntok_t return i; } +static cgltf_primitive_type cgltf_json_to_primitive_type(jsmntok_t const* tok, const uint8_t* json_chunk) +{ + int type = cgltf_json_to_int(tok, json_chunk); + + switch (type) + { + case 0: + return cgltf_primitive_type_points; + case 1: + return cgltf_primitive_type_lines; + case 2: + return cgltf_primitive_type_line_loop; + case 3: + return cgltf_primitive_type_line_strip; + case 4: + return cgltf_primitive_type_triangles; + case 5: + return cgltf_primitive_type_triangle_strip; + case 6: + return cgltf_primitive_type_triangle_fan; + default: + return cgltf_primitive_type_invalid; + } +} + static int cgltf_parse_json_primitive(cgltf_options* options, jsmntok_t const* tokens, int i, const uint8_t* json_chunk, cgltf_primitive* out_prim) { CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT); @@ -3052,9 +3231,7 @@ static int cgltf_parse_json_primitive(cgltf_options* options, jsmntok_t const* t if (cgltf_json_strcmp(tokens+i, json_chunk, "mode") == 0) { ++i; - out_prim->type - = (cgltf_primitive_type) - cgltf_json_to_int(tokens+i, json_chunk); + out_prim->type = cgltf_json_to_primitive_type(tokens+i, json_chunk); ++i; } else if (cgltf_json_strcmp(tokens+i, json_chunk, "indices") == 0) @@ -3290,7 +3467,7 @@ static cgltf_component_type cgltf_json_to_component_type(jsmntok_t const* tok, c } } -static int cgltf_parse_json_accessor_sparse(cgltf_options* options, jsmntok_t const* tokens, int i, const uint8_t* json_chunk, cgltf_accessor_sparse* out_sparse) +static int cgltf_parse_json_accessor_sparse(jsmntok_t const* tokens, int i, const uint8_t* json_chunk, cgltf_accessor_sparse* out_sparse) { CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT); @@ -3304,7 +3481,7 @@ static int cgltf_parse_json_accessor_sparse(cgltf_options* options, jsmntok_t co if (cgltf_json_strcmp(tokens+i, json_chunk, "count") == 0) { ++i; - out_sparse->count = cgltf_json_to_int(tokens + i, json_chunk); + out_sparse->count = cgltf_json_to_size(tokens + i, json_chunk); ++i; } else if (cgltf_json_strcmp(tokens+i, json_chunk, "indices") == 0) @@ -3337,14 +3514,6 @@ static int cgltf_parse_json_accessor_sparse(cgltf_options* options, jsmntok_t co out_sparse->indices_component_type = cgltf_json_to_component_type(tokens + i, json_chunk); ++i; } - else if (cgltf_json_strcmp(tokens + i, json_chunk, "extras") == 0) - { - i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_sparse->indices_extras); - } - else if (cgltf_json_strcmp(tokens + i, json_chunk, "extensions") == 0) - { - i = cgltf_parse_json_unprocessed_extensions(options, tokens, i, json_chunk, &out_sparse->indices_extensions_count, &out_sparse->indices_extensions); - } else { i = cgltf_skip_json(tokens, i+1); @@ -3380,14 +3549,6 @@ static int cgltf_parse_json_accessor_sparse(cgltf_options* options, jsmntok_t co out_sparse->values_byte_offset = cgltf_json_to_size(tokens + i, json_chunk); ++i; } - else if (cgltf_json_strcmp(tokens + i, json_chunk, "extras") == 0) - { - i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_sparse->values_extras); - } - else if (cgltf_json_strcmp(tokens + i, json_chunk, "extensions") == 0) - { - i = cgltf_parse_json_unprocessed_extensions(options, tokens, i, json_chunk, &out_sparse->values_extensions_count, &out_sparse->values_extensions); - } else { i = cgltf_skip_json(tokens, i+1); @@ -3399,14 +3560,6 @@ static int cgltf_parse_json_accessor_sparse(cgltf_options* options, jsmntok_t co } } } - else if (cgltf_json_strcmp(tokens + i, json_chunk, "extras") == 0) - { - i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_sparse->extras); - } - else if (cgltf_json_strcmp(tokens + i, json_chunk, "extensions") == 0) - { - i = cgltf_parse_json_unprocessed_extensions(options, tokens, i, json_chunk, &out_sparse->extensions_count, &out_sparse->extensions); - } else { i = cgltf_skip_json(tokens, i+1); @@ -3464,8 +3617,7 @@ static int cgltf_parse_json_accessor(cgltf_options* options, jsmntok_t const* to else if (cgltf_json_strcmp(tokens+i, json_chunk, "count") == 0) { ++i; - out_accessor->count = - cgltf_json_to_int(tokens+i, json_chunk); + out_accessor->count = cgltf_json_to_size(tokens+i, json_chunk); ++i; } else if (cgltf_json_strcmp(tokens+i, json_chunk, "type") == 0) @@ -3520,7 +3672,7 @@ static int cgltf_parse_json_accessor(cgltf_options* options, jsmntok_t const* to else if (cgltf_json_strcmp(tokens + i, json_chunk, "sparse") == 0) { out_accessor->is_sparse = 1; - i = cgltf_parse_json_accessor_sparse(options, tokens, i + 1, json_chunk, &out_accessor->sparse); + i = cgltf_parse_json_accessor_sparse(tokens, i + 1, json_chunk, &out_accessor->sparse); } else if (cgltf_json_strcmp(tokens + i, json_chunk, "extras") == 0) { @@ -3592,6 +3744,8 @@ static int cgltf_parse_json_texture_transform(jsmntok_t const* tokens, int i, co static int cgltf_parse_json_texture_view(cgltf_options* options, jsmntok_t const* tokens, int i, const uint8_t* json_chunk, cgltf_texture_view* out_texture_view) { + (void)options; + CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT); out_texture_view->scale = 1.0f; @@ -3616,7 +3770,7 @@ static int cgltf_parse_json_texture_view(cgltf_options* options, jsmntok_t const out_texture_view->texcoord = cgltf_json_to_int(tokens + i, json_chunk); ++i; } - else if (cgltf_json_strcmp(tokens + i, json_chunk, "scale") == 0) + else if (cgltf_json_strcmp(tokens + i, json_chunk, "scale") == 0) { ++i; out_texture_view->scale = cgltf_json_to_float(tokens + i, json_chunk); @@ -3628,28 +3782,12 @@ static int cgltf_parse_json_texture_view(cgltf_options* options, jsmntok_t const out_texture_view->scale = cgltf_json_to_float(tokens + i, json_chunk); ++i; } - else if (cgltf_json_strcmp(tokens + i, json_chunk, "extras") == 0) - { - i = cgltf_parse_json_extras(options, tokens, i + 1, json_chunk, &out_texture_view->extras); - } else if (cgltf_json_strcmp(tokens + i, json_chunk, "extensions") == 0) { ++i; CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT); - if(out_texture_view->extensions) - { - return CGLTF_ERROR_JSON; - } - int extensions_size = tokens[i].size; - out_texture_view->extensions_count = 0; - out_texture_view->extensions = (cgltf_extension*)cgltf_calloc(options, sizeof(cgltf_extension), extensions_size); - - if (!out_texture_view->extensions) - { - return CGLTF_ERROR_NOMEM; - } ++i; @@ -3664,7 +3802,7 @@ static int cgltf_parse_json_texture_view(cgltf_options* options, jsmntok_t const } else { - i = cgltf_parse_json_unprocessed_extension(options, tokens, i, json_chunk, &(out_texture_view->extensions[out_texture_view->extensions_count++])); + i = cgltf_skip_json(tokens, i + 1); } if (i < 0) @@ -3701,11 +3839,11 @@ static int cgltf_parse_json_pbr_metallic_roughness(cgltf_options* options, jsmnt if (cgltf_json_strcmp(tokens+i, json_chunk, "metallicFactor") == 0) { ++i; - out_pbr->metallic_factor = + out_pbr->metallic_factor = cgltf_json_to_float(tokens + i, json_chunk); ++i; } - else if (cgltf_json_strcmp(tokens+i, json_chunk, "roughnessFactor") == 0) + else if (cgltf_json_strcmp(tokens+i, json_chunk, "roughnessFactor") == 0) { ++i; out_pbr->roughness_factor = @@ -3718,13 +3856,11 @@ static int cgltf_parse_json_pbr_metallic_roughness(cgltf_options* options, jsmnt } else if (cgltf_json_strcmp(tokens+i, json_chunk, "baseColorTexture") == 0) { - i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, - &out_pbr->base_color_texture); + i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, &out_pbr->base_color_texture); } else if (cgltf_json_strcmp(tokens + i, json_chunk, "metallicRoughnessTexture") == 0) { - i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, - &out_pbr->metallic_roughness_texture); + i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, &out_pbr->metallic_roughness_texture); } else { @@ -4127,6 +4263,78 @@ static int cgltf_parse_json_iridescence(cgltf_options* options, jsmntok_t const* return i; } +static int cgltf_parse_json_anisotropy(cgltf_options* options, jsmntok_t const* tokens, int i, const uint8_t* json_chunk, cgltf_anisotropy* out_anisotropy) +{ + CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT); + int size = tokens[i].size; + ++i; + + + for (int j = 0; j < size; ++j) + { + CGLTF_CHECK_KEY(tokens[i]); + + if (cgltf_json_strcmp(tokens + i, json_chunk, "anisotropyStrength") == 0) + { + ++i; + out_anisotropy->anisotropy_strength = cgltf_json_to_float(tokens + i, json_chunk); + ++i; + } + else if (cgltf_json_strcmp(tokens + i, json_chunk, "anisotropyRotation") == 0) + { + ++i; + out_anisotropy->anisotropy_rotation = cgltf_json_to_float(tokens + i, json_chunk); + ++i; + } + else if (cgltf_json_strcmp(tokens + i, json_chunk, "anisotropyTexture") == 0) + { + i = cgltf_parse_json_texture_view(options, tokens, i + 1, json_chunk, &out_anisotropy->anisotropy_texture); + } + else + { + i = cgltf_skip_json(tokens, i + 1); + } + + if (i < 0) + { + return i; + } + } + + return i; +} + +static int cgltf_parse_json_dispersion(jsmntok_t const* tokens, int i, const uint8_t* json_chunk, cgltf_dispersion* out_dispersion) +{ + CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT); + int size = tokens[i].size; + ++i; + + + for (int j = 0; j < size; ++j) + { + CGLTF_CHECK_KEY(tokens[i]); + + if (cgltf_json_strcmp(tokens + i, json_chunk, "dispersion") == 0) + { + ++i; + out_dispersion->dispersion = cgltf_json_to_float(tokens + i, json_chunk); + ++i; + } + else + { + i = cgltf_skip_json(tokens, i + 1); + } + + if (i < 0) + { + return i; + } + } + + return i; +} + static int cgltf_parse_json_image(cgltf_options* options, jsmntok_t const* tokens, int i, const uint8_t* json_chunk, cgltf_image* out_image) { CGLTF_CHECK_TOKTYPE(tokens[i], JSMN_OBJECT); @@ -4134,11 +4342,11 @@ static int cgltf_parse_json_image(cgltf_options* options, jsmntok_t const* token int size = tokens[i].size; ++i; - for (int j = 0; j < size; ++j) + for (int j = 0; j < size; ++j) { CGLTF_CHECK_KEY(tokens[i]); - if (cgltf_json_strcmp(tokens + i, json_chunk, "uri") == 0) + if (cgltf_json_strcmp(tokens + i, json_chunk, "uri") == 0) { i = cgltf_parse_json_string(options, tokens, i + 1, json_chunk, &out_image->uri); } @@ -4218,7 +4426,7 @@ static int cgltf_parse_json_sampler(cgltf_options* options, jsmntok_t const* tok = cgltf_json_to_int(tokens + i, json_chunk); ++i; } - else if (cgltf_json_strcmp(tokens + i, json_chunk, "wrapT") == 0) + else if (cgltf_json_strcmp(tokens + i, json_chunk, "wrapT") == 0) { ++i; out_sampler->wrap_t @@ -4268,7 +4476,7 @@ static int cgltf_parse_json_texture(cgltf_options* options, jsmntok_t const* tok out_texture->sampler = CGLTF_PTRINDEX(cgltf_sampler, cgltf_json_to_int(tokens + i, json_chunk)); ++i; } - else if (cgltf_json_strcmp(tokens + i, json_chunk, "source") == 0) + else if (cgltf_json_strcmp(tokens + i, json_chunk, "source") == 0) { ++i; out_texture->image = CGLTF_PTRINDEX(cgltf_image, cgltf_json_to_int(tokens + i, json_chunk)); @@ -4515,6 +4723,16 @@ static int cgltf_parse_json_material(cgltf_options* options, jsmntok_t const* to out_material->has_iridescence = 1; i = cgltf_parse_json_iridescence(options, tokens, i + 1, json_chunk, &out_material->iridescence); } + else if (cgltf_json_strcmp(tokens + i, json_chunk, "KHR_materials_anisotropy") == 0) + { + out_material->has_anisotropy = 1; + i = cgltf_parse_json_anisotropy(options, tokens, i + 1, json_chunk, &out_material->anisotropy); + } + else if (cgltf_json_strcmp(tokens + i, json_chunk, "KHR_materials_dispersion") == 0) + { + out_material->has_dispersion = 1; + i = cgltf_parse_json_dispersion(tokens, i + 1, json_chunk, &out_material->dispersion); + } else { i = cgltf_parse_json_unprocessed_extension(options, tokens, i, json_chunk, &(out_material->extensions[out_material->extensions_count++])); @@ -4674,7 +4892,7 @@ static int cgltf_parse_json_meshopt_compression(cgltf_options* options, jsmntok_ else if (cgltf_json_strcmp(tokens+i, json_chunk, "count") == 0) { ++i; - out_meshopt_compression->count = cgltf_json_to_int(tokens+i, json_chunk); + out_meshopt_compression->count = cgltf_json_to_size(tokens+i, json_chunk); ++i; } else if (cgltf_json_strcmp(tokens+i, json_chunk, "mode") == 0) @@ -5963,7 +6181,7 @@ cgltf_size cgltf_num_components(cgltf_type type) { } } -static cgltf_size cgltf_component_size(cgltf_component_type component_type) { +cgltf_size cgltf_component_size(cgltf_component_type component_type) { switch (component_type) { case cgltf_component_type_r_8: @@ -5981,7 +6199,7 @@ static cgltf_size cgltf_component_size(cgltf_component_type component_type) { } } -static cgltf_size cgltf_calc_size(cgltf_type type, cgltf_component_type component_type) +cgltf_size cgltf_calc_size(cgltf_type type, cgltf_component_type component_type) { cgltf_size component_size = cgltf_component_size(component_type); if (type == cgltf_type_mat2 && component_size == 1) @@ -6366,6 +6584,8 @@ static int cgltf_fixup_pointers(cgltf_data* data) CGLTF_PTRFIXUP(data->materials[i].iridescence.iridescence_texture.texture, data->textures, data->textures_count); CGLTF_PTRFIXUP(data->materials[i].iridescence.iridescence_thickness_texture.texture, data->textures, data->textures_count); + + CGLTF_PTRFIXUP(data->materials[i].anisotropy.anisotropy_texture.texture, data->textures, data->textures_count); } for (cgltf_size i = 0; i < data->buffer_views_count; ++i) @@ -6410,7 +6630,6 @@ static int cgltf_fixup_pointers(cgltf_data* data) if (data->nodes[i].has_mesh_gpu_instancing) { - CGLTF_PTRFIXUP_REQ(data->nodes[i].mesh_gpu_instancing.buffer_view, data->buffer_views, data->buffer_views_count); for (cgltf_size m = 0; m < data->nodes[i].mesh_gpu_instancing.attributes_count; ++m) { CGLTF_PTRFIXUP_REQ(data->nodes[i].mesh_gpu_instancing.attributes[m].data, data->accessors, data->accessors_count); @@ -6499,7 +6718,7 @@ static jsmntok_t *jsmn_alloc_token(jsmn_parser *parser, * Fills token type and boundaries. */ static void jsmn_fill_token(jsmntok_t *token, jsmntype_t type, - int start, int end) { + ptrdiff_t start, ptrdiff_t end) { token->type = type; token->start = start; token->end = end; @@ -6512,7 +6731,7 @@ static void jsmn_fill_token(jsmntok_t *token, jsmntype_t type, static int jsmn_parse_primitive(jsmn_parser *parser, const char *js, size_t len, jsmntok_t *tokens, size_t num_tokens) { jsmntok_t *token; - int start; + ptrdiff_t start; start = parser->pos; @@ -6562,7 +6781,7 @@ static int jsmn_parse_string(jsmn_parser *parser, const char *js, size_t len, jsmntok_t *tokens, size_t num_tokens) { jsmntok_t *token; - int start = parser->pos; + ptrdiff_t start = parser->pos; parser->pos++; diff --git a/vendor/cgltf/src/cgltf_write.h b/vendor/cgltf/src/cgltf_write.h index 033b0d1cc..aa648a479 100644 --- a/vendor/cgltf/src/cgltf_write.h +++ b/vendor/cgltf/src/cgltf_write.h @@ -1,7 +1,7 @@ /** * cgltf_write - a single-file glTF 2.0 writer written in C99. * - * Version: 1.13 + * Version: 1.14 * * Website: https://github.com/jkuhlmann/cgltf * @@ -85,6 +85,8 @@ cgltf_size cgltf_write(const cgltf_options* options, char* buffer, cgltf_size si #define CGLTF_EXTENSION_FLAG_MATERIALS_EMISSIVE_STRENGTH (1 << 13) #define CGLTF_EXTENSION_FLAG_MESH_GPU_INSTANCING (1 << 14) #define CGLTF_EXTENSION_FLAG_MATERIALS_IRIDESCENCE (1 << 15) +#define CGLTF_EXTENSION_FLAG_MATERIALS_ANISOTROPY (1 << 16) +#define CGLTF_EXTENSION_FLAG_MATERIALS_DISPERSION (1 << 17) typedef struct { char* buffer; @@ -152,7 +154,6 @@ typedef struct { context->extension_flags |= CGLTF_EXTENSION_FLAG_TEXTURE_TRANSFORM; \ cgltf_write_texture_transform(context, &info.transform); \ } \ - cgltf_write_extras(context, &info.extras); \ cgltf_write_line(context, "}"); } #define CGLTF_WRITE_NORMAL_TEXTURE_INFO(label, info) if (info.texture) { \ @@ -164,7 +165,6 @@ typedef struct { context->extension_flags |= CGLTF_EXTENSION_FLAG_TEXTURE_TRANSFORM; \ cgltf_write_texture_transform(context, &info.transform); \ } \ - cgltf_write_extras(context, &info.extras); \ cgltf_write_line(context, "}"); } #define CGLTF_WRITE_OCCLUSION_TEXTURE_INFO(label, info) if (info.texture) { \ @@ -176,12 +176,11 @@ typedef struct { context->extension_flags |= CGLTF_EXTENSION_FLAG_TEXTURE_TRANSFORM; \ cgltf_write_texture_transform(context, &info.transform); \ } \ - cgltf_write_extras(context, &info.extras); \ cgltf_write_line(context, "}"); } #ifndef CGLTF_CONSTS -static const cgltf_size GlbHeaderSize = 12; -static const cgltf_size GlbChunkHeaderSize = 8; +#define GlbHeaderSize 12 +#define GlbChunkHeaderSize 8 static const uint32_t GlbVersion = 2; static const uint32_t GlbMagic = 0x46546C67; static const uint32_t GlbMagicJsonChunk = 0x4E4F534A; @@ -360,6 +359,21 @@ static int cgltf_int_from_component_type(cgltf_component_type ctype) } } +static int cgltf_int_from_primitive_type(cgltf_primitive_type ctype) +{ + switch (ctype) + { + case cgltf_primitive_type_points: return 0; + case cgltf_primitive_type_lines: return 1; + case cgltf_primitive_type_line_loop: return 2; + case cgltf_primitive_type_line_strip: return 3; + case cgltf_primitive_type_triangles: return 4; + case cgltf_primitive_type_triangle_strip: return 5; + case cgltf_primitive_type_triangle_fan: return 6; + default: return -1; + } +} + static const char* cgltf_str_from_alpha_mode(cgltf_alpha_mode alpha_mode) { switch (alpha_mode) @@ -455,7 +469,7 @@ static void cgltf_write_asset(cgltf_write_context* context, const cgltf_asset* a static void cgltf_write_primitive(cgltf_write_context* context, const cgltf_primitive* prim) { - cgltf_write_intprop(context, "mode", (int) prim->type, 4); + cgltf_write_intprop(context, "mode", cgltf_int_from_primitive_type(prim->type), 4); CGLTF_WRITE_IDXPROP("indices", prim->indices, context->data->accessors); CGLTF_WRITE_IDXPROP("material", prim->material, context->data->materials); cgltf_write_line(context, "\"attributes\": {"); @@ -641,6 +655,16 @@ static void cgltf_write_material(cgltf_write_context* context, const cgltf_mater context->extension_flags |= CGLTF_EXTENSION_FLAG_MATERIALS_IRIDESCENCE; } + if (material->has_anisotropy) + { + context->extension_flags |= CGLTF_EXTENSION_FLAG_MATERIALS_ANISOTROPY; + } + + if (material->has_dispersion) + { + context->extension_flags |= CGLTF_EXTENSION_FLAG_MATERIALS_DISPERSION; + } + if (material->has_pbr_metallic_roughness) { const cgltf_pbr_metallic_roughness* params = &material->pbr_metallic_roughness; @@ -656,7 +680,7 @@ static void cgltf_write_material(cgltf_write_context* context, const cgltf_mater cgltf_write_line(context, "}"); } - if (material->unlit || material->has_pbr_specular_glossiness || material->has_clearcoat || material->has_ior || material->has_specular || material->has_transmission || material->has_sheen || material->has_volume || material->has_emissive_strength || material->has_iridescence) + if (material->unlit || material->has_pbr_specular_glossiness || material->has_clearcoat || material->has_ior || material->has_specular || material->has_transmission || material->has_sheen || material->has_volume || material->has_emissive_strength || material->has_iridescence || material->has_anisotropy || material->has_dispersion) { cgltf_write_line(context, "\"extensions\": {"); if (material->has_clearcoat) @@ -767,6 +791,22 @@ static void cgltf_write_material(cgltf_write_context* context, const cgltf_mater CGLTF_WRITE_TEXTURE_INFO("iridescenceThicknessTexture", params->iridescence_thickness_texture); cgltf_write_line(context, "}"); } + if (material->has_anisotropy) + { + cgltf_write_line(context, "\"KHR_materials_anisotropy\": {"); + const cgltf_anisotropy* params = &material->anisotropy; + cgltf_write_floatprop(context, "anisotropyFactor", params->anisotropy_strength, 0.f); + cgltf_write_floatprop(context, "anisotropyRotation", params->anisotropy_rotation, 0.f); + CGLTF_WRITE_TEXTURE_INFO("anisotropyTexture", params->anisotropy_texture); + cgltf_write_line(context, "}"); + } + if (material->has_dispersion) + { + cgltf_write_line(context, "\"KHR_materials_dispersion\": {"); + const cgltf_dispersion* params = &material->dispersion; + cgltf_write_floatprop(context, "dispersion", params->dispersion, 0.f); + cgltf_write_line(context, "}"); + } cgltf_write_line(context, "}"); } @@ -977,7 +1017,6 @@ static void cgltf_write_node(cgltf_write_context* context, const cgltf_node* nod cgltf_write_line(context, "\"EXT_mesh_gpu_instancing\": {"); { - CGLTF_WRITE_IDXPROP("bufferView", node->mesh_gpu_instancing.buffer_view, context->data->buffer_views); cgltf_write_line(context, "\"attributes\": {"); { for (cgltf_size i = 0; i < node->mesh_gpu_instancing.attributes_count; ++i) @@ -1044,14 +1083,11 @@ static void cgltf_write_accessor(cgltf_write_context* context, const cgltf_acces cgltf_write_sizeprop(context, "byteOffset", (int)accessor->sparse.indices_byte_offset, 0); CGLTF_WRITE_IDXPROP("bufferView", accessor->sparse.indices_buffer_view, context->data->buffer_views); cgltf_write_intprop(context, "componentType", cgltf_int_from_component_type(accessor->sparse.indices_component_type), 0); - cgltf_write_extras(context, &accessor->sparse.indices_extras); cgltf_write_line(context, "}"); cgltf_write_line(context, "\"values\": {"); cgltf_write_sizeprop(context, "byteOffset", (int)accessor->sparse.values_byte_offset, 0); CGLTF_WRITE_IDXPROP("bufferView", accessor->sparse.values_buffer_view, context->data->buffer_views); - cgltf_write_extras(context, &accessor->sparse.values_extras); cgltf_write_line(context, "}"); - cgltf_write_extras(context, &accessor->sparse.extras); cgltf_write_line(context, "}"); } cgltf_write_extras(context, &accessor->extras); @@ -1123,6 +1159,7 @@ static void cgltf_write_light(cgltf_write_context* context, const cgltf_light* l cgltf_write_floatprop(context, "outerConeAngle", light->spot_outer_cone_angle, 3.14159265358979323846f/4.0f); cgltf_write_line(context, "}"); } + cgltf_write_extras( context, &light->extras ); cgltf_write_line(context, "}"); } @@ -1249,9 +1286,15 @@ static void cgltf_write_extensions(cgltf_write_context* context, uint32_t extens if (extension_flags & CGLTF_EXTENSION_FLAG_MATERIALS_IRIDESCENCE) { cgltf_write_stritem(context, "KHR_materials_iridescence"); } + if (extension_flags & CGLTF_EXTENSION_FLAG_MATERIALS_ANISOTROPY) { + cgltf_write_stritem(context, "KHR_materials_anisotropy"); + } if (extension_flags & CGLTF_EXTENSION_FLAG_MESH_GPU_INSTANCING) { cgltf_write_stritem(context, "EXT_mesh_gpu_instancing"); } + if (extension_flags & CGLTF_EXTENSION_FLAG_MATERIALS_DISPERSION) { + cgltf_write_stritem(context, "KHR_materials_dispersion"); + } } cgltf_size cgltf_write(const cgltf_options* options, char* buffer, cgltf_size size, const cgltf_data* data) From 3e63f598a0bdeb5e7a7d4adaffa019a4a6ad99c4 Mon Sep 17 00:00:00 2001 From: shashank Date: Sun, 29 Dec 2024 20:07:36 +0530 Subject: [PATCH 094/431] build cgltf lib --- vendor/cgltf/lib/cgltf.lib | Bin 347066 -> 376502 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/vendor/cgltf/lib/cgltf.lib b/vendor/cgltf/lib/cgltf.lib index 0d7ea6f9b4a4d895c063f949e631315ef8e35e8c..6dddf3baf2b14c6bd553bd6c0228187114cb63b1 100644 GIT binary patch literal 376502 zcmeFadtemhz5hSC5F=7IB1LMgMx{22)kwG`gu={TXLe^VLR6|~2#`QDB@zdjY0vTd z$M2VEcX@W^^?aVs=kt7?>&(P+r#B=QES@p)((>HnvZ+;*Csj|Zo?4xIzS8)4+2o0r zO=jtNBL$(LQxH-shCjnT7>NE1^hSoLQMY8Bu&nA`w)?nG>@oRj=P4jeElo z5X=@f(J#kC0lzmO&Ya9$i1;Fk67z%i1v@fwCWfMF(CdwfOXp|Lh5d<;m^7V;#AG=T zh$KkrFTVTiBRA?T^O%ayXbEI$H~q0^V2{2dV~M zojD2Lk*seg1tZ}|3>t~cmNYEN$_mMeNFtmFiZ|w-jws<+JQk)RCYk7HC?1i5L2*fr zLZJkzBp#&zN|$UdA`$fmLxHfEy0P74MI?~$N29)kcxAw6vN@9Q1{75Zi%S|i7H3OV zV}Wom98$#ghE&e!xRQv4;v~f63N9`^DLHfkgInOioC_fE*S(ZZJi`q<@;0a>6f* z&8_X7COQ5@Oiic}MfAnh_^gaNlLM;H7xV>Xv137Ft4V$!;qyg&30Z9D=x8*_2}a~d z(669Pv@UGSww1|B95oXT_{0Tmoo4;R;kX+12PD=kOnQbRA)gdLbGfOt(Nw>a!?8rr z7lPN8CL7vkXZ2L2L_DU3#HNOp4wITuIU4YK5mOxt8d^-};rDKm_HZJ#;m+bT($IV@fC( z_xgefbkye1N0*xIwWr9c>PJ+>MOBFfq-+dLk>heA7FK=Y{LZE(vmS~hM-&+&STi~- zb8!krnrH|Yn7>VWDDkiqibcX`G_#^oc7U4_4y#hs8;XdjhU6ksKu!rKLP}Ucpmwx3 zBu$|)C8ES*zC_d~hT}@CE*nZyBC0G$l~7b{Yicsb_LN988cJZ)5U-~;XwpgzpbZB7 z0dclZQq7jfB5+y|(M=to*}zy-N`%7bd>fagk_{$Nant~sp(=K?btV^NBX&x{8w^FG z=l9_)k(2XAeL=hQxz%Ujmnv@Gs%vG z<7gC!5WV(HSI|sj-Y^a9OfeL!oGwTZN0s{xpk50QZV3;_yS5yOf@d^wY4R)`c((xsF^?z zxtfJS1ohARseH@7TIHfC$BI-H0~QUGI7B0gKGLttloR2>QW{OIq4Vn+&D z7MTXz>PRe(J~j-pD&E&gaGYKn%q1aNxGZM zPDC(JqlZH;2CK|1wZBK&zq(rl}08Xyzi*k^N}+g$B76jL{3)8dAZA1!jZ6 z_~9r__Aozb>s++B73$kCauAD)pqN_Ryx<0VME3f^vWx~pU4W0qRI3=p>-EYpLvMsF z)mmFCo1^I!oU6SO2uHl=U6`2-tr&tR^h~&^Q-dLqxEu~)!G&?8aY1KGL$Xe98JVbH zOkBY-0loT?=8lf$u0|Us<_*QvNR-xBK3_u$vw-=XsYX+=xmw2KavB5CdOGmSyb?fexE-U#Ee~p)g5iABqEOYCZK>63(BZCRxpMMm`z37 z2ZL7(1$>Yh35Xcz8e46v$SW$opemvF%~rLIdP+PJ@nZ1vv(!qr}OI6Ax$0Cx9dEBCwHdK&Zta(Kh{zf0+Wuo;d%azTIOC5b4jfJs} z3ZUtxn}Ll{iGU<2Sb>PB^2XLq7HiB&+4%8_m?dE}_bX!Cf(0#|6ulNnJ~1Fg{AvO- zW3sj_nOfYo2vcD+oviid5b}w^px>)R)QG8OY{Z6qi3GaMm>7{~)u#u9j(YRb7Sq;< z6jFjA40qYkv5^&1d?7iG2GN{sUf4(zmIaM`g!x5pJfwOfm}-#Xt!>FA4K0Q&drSPH z4-=qhAQCi{ZjB8;`W);Zcrk|}Q&M^}tw+bv+>!0yF$=+P8mDQaN!l!a00M?pxHl2U zdfsG=#b!SimgwgEXfN5GXIA4kI-8S?*^v&?;)zfkV`~(v*@o5*)=jjv^1ca(-k?v8 zVYJ|CqqDW8IlKJ8ZVWmTzYo*s9B~%yz$MUE%W)s`bymYGIvUYNu$X1NySXa~h&~Bh zNfK5hCpK{LLMy1_Xzh ziv@yVNy&7xwmnHeO!(v|HoEkId|`7_Q)frIx6K-4ZU@LBM-!@o1rz3k=+7Fxm;pv< z8D^dZdV``r5yw*4==r#w++KE2lvUcq@r&*AlhMXhLrY8Zf?4SSFKb*-!~{AR4ulf9 z=2}po$`A*uXeSybei@xpe=R}(AXf6RO7}bCv7pnV`~OVP*7QsGj zQOJ5Hn;CfxZS94J#Gs_mjKt`lxQ@&zQ#c;>M}k%vS1v6T|Wa)wow zr3HDW!*b=eGIY;QxguC6V-~EpknEs5q^o2Rn?{O1fVj#nCq2TNjfn*! zYQh%|X2-plxf9Q#*i?!t3aVJIwQTp3?jW-!n7bfF42H0N4q}5kFsH7bmeBQ!+B@r; zTUn=p6_vRNEPW%`kn%DoS-a|N5#~-o!Hggp4Px}p_%@X@UN~h_F}`8jTjt!9i7m5c z32do^;@GT6ThZ2@s$bByq#etuoW(ab-TgicNiw>>T=y?*Ml|KF)B&>ztQ^;yer^U< z-}cHQAKJdp=hvIHc^n!tHo{`aA4tf4Y^IT5Dvui#oXQKuV+yv<^_G;KT4dut>#eXT zW7|9A4P&dF??(;o%rJ%kY}jKI$T;4yH;ahai>75JCNa4)oa`JWD>@=#6E^IRd9wpi zC^KcWC=wCG=o-?e5rlXk6rmX@WwaYT?424BWjPd3{Khme*CIAc zFz3s;Z{&@LVQkh10WU6^cG(55$e+m?b@lESfI$QY%mgp|>6GhMX35vqtgHdwUcwhaNc1CD*p zsEBneX5QHPF!wL%MQgNSS@V)k)4&iFl|&G0cXT);FcYFVy`)o7*z!`anAKOOxeiQ+ zms3_18+$<+{f(`b%~@z2DD@Ktdnd?+6-H=o6AU5|B{EnHFNST|zZQ;m{Avqik<3?L<*7RJw-m;a6JZNeW+)B=b zhkXxXU!qr(1DLeNqk49ed-!Nh=g)LpK3c0uL7x{pg}K_IGoNj273p=B%@f2el5haK z0aA~RkSH3A&F8Q_Lsd^)S0%I zRWa`O2cj`GEN1&bQ(n4H8w;ud`%N^WW!6>-ZpiVYmS+thE| zr7g>Ot_7r=2t*akpL|z%72j+u@J%<j6`MW0HXfPB1p=gQ|Yt zHcOhKI4Xv5;}qKk`iP*H>OiX0|6(C8E^Oux^Xws0mZ#7uN2as(eW8~6SJtv^O(Hg zK`U4t5zYIx8U11+9z}@AUff)u{JK*!O*!Z8YD|pAq5<4tWh7?2rZ$hfrrU2Z5gjwO zq_8nZLiIcS_Cn*LKNO5fs!}oubfMrJ&#A^GvVTr=)-CVj9;YF%V{VkIHserFsNs%CDBSW1zj@rWNc{h0?d6AD|S z5+WWl2w)AUM@Qzyq63TukI5j$KhxAmG2Pk3<7>F5<;Cr8dQ8P$|5yS$z!IKD$=$6r z`2aW1CV*hUDcuB&1hrTD$H#>oQ zSd!G0JsGDY_Q55onZ8=HR~W?b%+2=8f+5kTqGJ!R=K9%`q4-2a!fksz#f8e0q&E7R zPhZ#57t;v$dn5_>W?>p8arhqZ3+4QqKC94KMlYgN3w>p7B3wpA`2sOKV@eBR17zhf zKd=H=dCOQn`kGn8zQ_BS6^il)@Tj*E z{>*y|JQf~_`@LQ~N%Wap6&HivkgTv<4WDTMVyTHGCx%k?Y|Cd|R2;L8xEBv|e`Zlp zA8%(X?%8;>2#<-1c#MB$eSJ$Cp6JC+(8A`ndTc(lrkd(;UxlsA#Tv0jsIPDCXsB=K zYG`h0z!Ii@VPjK6XG;p_opa)1vJor5s-{YIWPeYpscc#}Kl{6yyWTK`j_maXIoBuY z;xgZ9ZqmdBOi=cBQzJo{-&IqYCfVN{Kcxu|)SCFIQ*k2udukK?ZfZ*BpWl?$yQ|6Y zS&Oh>Q44&Ro&nzi8egqQ6V=RBRL7(Pp9YkR|j8+36U4i}B(RQhUq z*QMTg4lq~C%+(w{GG~poL{1)kjb(SL3;PuH^f~0rtmeXA}1|bI;-Z6yrowvN2s8Tg2v+##Yj~XWCF} zhW`4avxXd0Wcot70@BNc90BZ>tJ!GU!^?0C0iDzFLf?qH$d6S zEv*52Jlg?V%f8l}jD~rQ#GO{;1hu>s00%G`0 z#`?-h!*4RuTh7C8GU{)8Pab}g(RkrG`*`2*n~Z26!*4PUzsWfKCgbp%jQTJ!{3fF@ zg&cm95w{zL-((zqlhN{G?eLq7xzG8Vo>%Y=zsYF4mT7rPd-zR8{@o|`ia_Qu6}<5{ z{3avb4;y}yG5y-C=}A8?9tjzKlQD_sh3uR&{3he@n~XM(iVwfZ2oDUu$*4bxn)_1A z@SBVs^s>2qcRKtguU-+fzh_)W%t`o+xQHyQtjZ?@v)uHiQs z>9wqX_SN9wHyQtD5jgxN&@lmRgWt=y1;hIZ|KfU%F zi=xjI3EJoIS|g52@Si1Fkm_pGe+fbp68@j0e;NOdECbg#zjM*}+373Gkhq`YM4`-k zNs_&Zo5qAPq|UoH^OGe+p;EkrUi2Klq&0n|6p4x8rWq`~by;4Pn8$MoocDv-WN?KJ z+&Y}U7fj`SNZ=^K$4=fYI3ELZ(BPcpT?_8G!63;FJ9)FAxN^TB-0^_UIF&mI1w9Jp zji2gV3I4H@cQ52!^pGGN_?ga)bl~c6e#*mwa0@rKZ+e`BL!HxUH(DGh`U#5UL=Rb$$HskWw!2I6eocuQrT+J3i z_%1$lK)h{zkbXY^bIC7>a`yAZxTYEm1My{7zk6|h88~UHPC3=v^SE3Ors`KZSB!t` z%wC66v#bqwIOTpdef>XgA1ULRsz0{NOkDY!LPAkA%`k2l+wYNub!3XC3 zU+diI4)X58`Tu-EXVTwx<(A@N-IIba7auyD>bDvfn!wySz%bzy{9`BYESw*;O%N*Z zp~FcYl{*p4v^?BAaDFg9G&m>!Er(w|1#{C*WWaGQK6d(1IPH8&5SH&EN)VjJxmJ9(ck6NI0F+x~)16*zEzI86|q2J@pMI_DJ6eYm{CV06-Gah-AMuPBWF2)c8B$4(x_!C^3)-_SXyab`U(KM!W!f9sr6xzyBl zf?4(E(DJUv>f;X^Bc=bYkYHahqxz?@bdy9saw+ENs0`sd8I)`R&8&~UL$Ja{=guj;RoKsx=I|B3E zlM96HWjc3(gS;<-n=!gT`1%)gj>a9kc)ksexb%w!!Zr#V9Ah20M{xf84tW<(C=ga(qH|*$xB;AxUW#%nht}^c zTs{}f=!rV#)DPVSc`aa0snR+6w)5ZfaKz`qyf#_qoa~)~%Ny~vcdE`g#a|!fy#?l` zX*zeRL%E|z2trA1fiO6}wL znuN;-!HlXKS{@BC7lHZw6*@=XcJ|(n^XGusn}_=??EM{>yXWZgoceQ~=4zdD zst>Yb3>f(uopbWbC|qa)le|vnMmyNC1aWmieSxrXq0XJ-z>$7?8w-TKCY^KAZ!0SF z`(Uo<)VY|0yo1oMVOfDtvs~w#+T{UU-Uy~~h0Z};+xnp8&Ue6sZ`L^{{r(dT@j5W4 z_v)O}yqM;(&w)94jm|mw`C*j%6)-OvoKv|Upxk3%Ue$DY=Q`N&H#p*w{sLjlcXaMD z2W|(>f4Uj{_;+>AsoXnp;rC!V?$9}pgFNC+{(gb*le>oIrlWyagO!0F= zm-_(ZEeG=zYA879+s@vnaQ-qd?-`tv|8^oyNB*urc;-c2o>P5HgMhma76>oBG_-yi z{4(p01;WdRbk1qK9Dsgn|6Cx14(ptgeto!n4VYK|qH|9DeE}|)zfvHa`(HW-HEjLz z2F}j}^VL^%&Z%7Lek3qY{#ECk$|XBK0`u74hL%Th^(>e#yry$baYgHZZ-Y5za87m* zckx6_XnPN#(mh0`KBcd-NapE$o)EfiKnb*|Kb`v%H=2F%RMbiBUu^#?S)`3{(|tvcs4 zZ~8OptsP9fL+2(q*n2(XeUd5^7Io>I)BHd}{!hTnSgLbQ^?N6{TftnsOy`{X$uRU= z4Cd#wA%~+DAG`Sbgf8A(D13qs9ZvH0*I*srT_~LVsLs(ohMl}R#LJR{g~GO%bA2hAlT8=U)Ib`dpoZ+ikgCocDv-V{lITksZb76$wAUhYlz19$fe{n3Wgm zoKt@=AD6GWxJdZ*r8@T&$h5Qf2~?}^vLc~ilFm8pm-vzYWiaPX);Wp>J9%Hj`N;-@ zBs=Ul>UWYZI2!kQU2xw(MQs8%Vw$d>(|AeK@E?I`nyzzB_4Yit&0tz)=$uo1Tm${? z1yeM0Xum81cLtahJh#kxKlC<(K^At1Ww;;Op371Hc@MaU43 zJo3gP|Hoj;rTq5J02AgpPCt^j7|eQ}v$6MnFk5(zlSlROyul#J4kvq$fP2SKDukp0ly{4lwuf94C+L-38_)p0km60!*=wvxAdI@p7KQkiB#` z`R@{N)AGn8{pNsa;W-=qZUJ*U&vE)u`+Wq=ex9?D_Xd~`d5)7u^)b$0Bvjx-$58bf z1T%~0Y~;0r>E<~b{q6*FKhJUUXy1H~!7v5!>2Qj_hrvCbM;`SDFM)Z3=WO&FB^L?f@S(%WUh>}*FfoI}G{sTBIbas% zkynlUtH3n#)poK9X9eR!A$2lP9C-2s||(;#FtZj%m>$+ zM;__7-le=dz}=fi9@WP#Fo$@~#@>&?l!iIKaQ2eC3&70aIU9L%!7S!EP9E922F&d| zXCvWH3mw!>K<02JY=V@<_k3i0%_ZoMZi#gS*&ZGjYY~R}LXzFxT^( zjlJu@Y~ndi9_jaUFxz>~M&4mC$9ayE$HpVooxP*Moo%pA_EP^c9ZZ7fZ1igda}&>T z`jNcNU>@W-8+rS{yufod^4wu5`d zg}mb~<$VmUG|t79jsGq%7*sVoocgON;Jhy6&2uTQ9o%vk^1kO%-u>XVf#X3k-sQsq5!F-xW9@Xzz zcnG?Z9)!j*RJ_E%T+MTw|4804Fzb2Frhe}SvxVn4d1UYNU|u!2q3nGF%!hg8k$&T@ z#=ZqUbPQ#07|fMC$LUA%Qef8coQ=Id2J>^Co0mr(^)D;H+|F}0{(A(>0MBvyk-S4--s3qNd1J1{ z{23oQhO&1Cm>AF5$ZG+!jORH0sD5uZ7*;U8ocwnuxcl?Sqxjnc=1)9lqu+;MO0FB) zUh>~~Fw=R?M&8w6ns|=0m*n+=xr66y$lg~C21#}}`R@d{;`*WOC3)w8 znZk26`qhD%$8(&1)IL^#xs~T^feiVNnf*CnKzr7V;Ch;66kMx@britfl z^y>w)f#*1Rq~Akep5Qqfd4B?Pgy%SURKFz)+{N>G;4U#(r+6lLs!Mr`!KGZtyUnG% zhrm6WM;^uBL6`F01oyEEd1o$k=f8>IW*DrK|7d)h>r&oAaP4{Ik-fLNl=owBKX)N- zze{;Xz`c`49<`6rjqdz+0l0|<>*PPOHvwib&)Kw(HDGSzIj((BdwUqn0MFUTI|Sw^ z&vEjoeoLF&*;@wgEQ1}&-f1r7%>s9w3wg_3%G(6)?mY6SKX}5WyqCcJ&4s+;Meh7p z4(?)ub@CtS7j`MH30%^JybUhpJqT{A3wbZNl=n8cPxHv5_Hou?cmA6MPBhq|{CAy8 zc{hPu<3ipKUCJ8(_p}RnM_tM*X~uIc_|P$wy_E*TKzupPCslBB^2nq5=yECVR&d|T zBah;Ft4n#$gFEa(-ls0*oq0XhzxdGM){( z(=O#50ryTGd1UYC8+4!Kv-cu!Qw(+}|JAva*8*-?9(gqW-tJP~{ouCbkw^AE59T<} z*^HMXTZ)9S_|V~GFO9#G!1#I2M&5idtvtt#zhv)vgQ0TiaEiaX!9AEq9@)DO%qu)+ zqo1$@`^xyxF_gU*ftkj0HuC0xS;%uX_O3D*RxrMt?7bb_J$dAjy#rtl@|=x+?|~_7 z&2Mixm`a|rkrxAVHP6}DyUbwn*}ERx<~;Jq-YsCB;W-=qj)OVDbDVw@&tu!rPvS#I zCJt=m`N1T3j+006+-fjPAikXHcNMr>^T;E69|W_L=WO(Q1 zvUeJoAkT5~sJ~xmFiar6ob2rew?2a8FX?x-!Q``d3OH{b zdE~!&F6E`bb?1>s`rQd;3(wiu`#hM#JZIy-Pr;m;;{0MG?_x03Jjcl+{jM~aeEw?% zcT*mD)YaV%|-wR;g;5i$6M|I-;0DS16Z`O`Ddnx{=fC=)Pjl6|m+IfzX zNBZ4rFi5h)sr~*K+|TpKBmeDpDeqNqZ|0Fl`kmT^@e&_8GJdhK*AFJabDX{8zg93S zc+N)N9boR|IZhtwx65EiKRTTJcL?0kJo3nYrAu{NnXn<`odvGKU^9NP(Ju(*I-aw! zcR84KJjcl+|NR)u7M`<__dJ-xJjcl+|9xsO`RpCLtVlQyA3B`uCI5*A!$A7&@P2I_ zxOsWxk$x+{+|F}0_C5k;faf@S$$y8yyuoue@@NBYS6nxsvB>>LUfF zo9Arm_f9Ym@tlpkr@4A3B`uCI3w{7zX0Y$=(>atMkYs zdzZPCw*lN8F62GxQr-b@hw{iH|9$LI-l%V(f5C?iC;w5rOfeV+;>*c@VQ^RGkw^8B z0<*#3hI$_9dtiQ?M;__76U;%Lvx%4Yz!a_++FtTsIhabGvym4Ab2ZO#@l5tEGZ-Y< z;pD$f;O@>NkK*qMm-1c!_evgltUtY3_lcpNWBrZ+S8lLQ@k0Ka;Zj}<+|_yH(en|@ zT*~VOw;_)_`uhwIfjPi)Hud`^n2&jmt6!>*GrMtL5+6D;ezB3405g~8IC|i~~2`U^9N<^dos*m-1$TyUvBY z8!ezB1!gQ?>=P9FI$31$_~ z*~q&a%!52IfR5=%DWz1R~~s(ADdjtdl1}K7xG?kDenz%AG(k? zZmm22Rf3ytuulFXd#`pWF9~ji3wd|Al=ld@0T=QPxs>-FxWaY1Z-%nB++bijJDl2E zH8_7BdGvhKe3$aB2iKKH-o=o&3CsY`+4L`mz#Qc{oBpM=5A#@j=*alRM&1lCVV>jU zQUA9X%rc&{k#{?odw7nMNA?bYInHx7@Jxmr}|aF&B-H= z>bJ|KycOVX$s>=}NB4r+$#XXLz5?bAp5yE-hrCf5`bm7~$oR!ZUKq@kJjcmn>s2rt zc+N)NLtq}|IZhtU{|@c< z8+p%wd5PyZdDK2mfGO?g?68q{0hozA$H}AkOBf82>~M)IRP2vz6y;?0o^uD?G>P zNAq!E1Lm>#&@q&~UNAA9^CvyrzS%yFKxkvH<&=wI;3v4fMx z#t$$m&)LYk9!wX{aq=i$Hi7ve&)LY^4(1u2)`KeyhRUVGNxxgb-OkJ7{(G9F_ak=lIF9~)?=M|&^mlK6 z<$|Mj`J{ytMgG6{SqyHsg~Q*s<@5`K`;CQ5ShzLdKEF|~GbGs|mRY&maOK}za$nt) zUmpD(@F!hxw}89$U-Qc&JN}Og?pAP1ZqF}|xQ|?LtHAYrC%-(hM$zAhr`Q_2ykN(8MS>u`hj(y=BygY0Bz@I4>PO)%S zdDPxUTR5vcD)&qm9JTZFEu6Jn((ghS9O+kS;jH?d0ERW3NPcb5lAGj$ zBmDv{I4bw+E;#z{#a!=#BR?;9!BIc-Z5JHr_Y)T!>9^GdNAOY!4PjSIf{nonRXgwoYIBR_n7j?mn2lsUs9QEVh za>3C)>$hES)Xwj7!O?jBmd-BIsIk>SdIGVpqalz5NDdCc9 zcEM4cuCj2}IHmry&%#;binvWKxw~9&)ZXrQ!BM~VhzpMFecZxX?WK0P!v#n7?y+$8 ze)*jXj@soR7aZAf)WTWqp!W8bg|q5M@=pE%AJ0~KG!B+oIIBErA7606k-cAa$ zN#4sA&Z-}^%U3O&RUXyH2@7YHNBzsE7S3MY*dONaU#Q%(TySLXc`i7bCthgbtoo6> zsTR&^FU7$O7aY}_&%#;DC3$fRXJ2le3y$LX>lV&hE^+f+aMW+y;F9Zf!O=K>YIniWeo4~8S@olJ_bL}0mHT}QXVs75>MjdsEtmS|`(1Ek#}*eH#r-Z99NFX9Nh0MoYfB6XMNWNNAsN1e!}+$R(Z4^c8&{<{8H(HqkRj}1xNenSG(ZO2G{O_ z`x3ZYU2s(H11`98z-@EEQGFbC!O_0d$1XUMcly2g>y7rME_K0CefV8)<>0P!!O?!x z3Ktxe`yCe?)yIFh;Hcc)E;#b@VHX_rL+`ubE(ACFzWnt;>!?~69K}`K1xNmCb-{fZ z+&UK=mHSf{9IfA;cEOzs?o}5Ywcio<=l37=L+88TsD3B8;Hcb)3y$V>%`P~K)8#HW zYL~aU;KbjvsX2YMTp=YT_vu9L*#4SUBtWLF4Lv7aWa8e{#tkb-_`8 zaKZ&g`3a!Bv9mcEOS79=34S z_#^HYE;w3mZLx6HxFUO>a=}r3yx@YP`uH!G+<&{^$c~R(a5O(1`JlV_`@9Q|+R?c# zI4bv27aYy&rn%tA&tVrF`S~gr9NDqJ1xMrRH(YSkpRRVnQ9t>83x{}~-_e0fnS(g~ z=q{@q;NLeO?%(a?aqlG%_am3weJ;75y5#=D1;_TKES$Ank{!RcaMu2SxNR=Er(AM- zU2?y5$vx+i`@Ku<4|d#w#W!?JnFMd>M>{4?FLRuLPP@Fk{8E1)C|#k}sfu^ndHC{0 z>(0wP8CU%=DH@oK(+w@D#$;2*xWj|tFd)qTXOD#MJ=hOxgE&`dg_w4`PU26 zgz2XV^D)>9rwbPeJ!`N`G5(DJIRbqnNPy08*4(b>0!`4QzAotB3Un=*tj4zY>Qsc*6CHEY!RJ1=R z+6h^ETh?AXLcFRyOI*3C?UJ?M%UUTrD{FJdi?Y@-UY51g_=McEv$B2%%}*b|OIF3g zRHS~vQbrl6@ns~wT<-t+GFkgjexl~q|Ek9SPnB06NS&{0+huK+I-y8;|A@Tp!(th~ zw;h=&7wwm8zugU4$uCG-w?SvQpXPe_hq^{V*JMI1@{&H4q)N5?{(t9)*bd#w>vvoZ z{xN3t9He%#)U`#bWs%ql6=<0#gRQxDYiUv}bsGgr)Ug6iIQnl#vaoXi&YSDhRPaTg_ z$|yzKr;=B76G&Lq0Fzk(;j>V6#llTUJxgGUMozUPG2YYd{EGNs#aXM!}Ck}+JdjDfgMyq+oNZ zx|P-8FOd2dmJ(;f+gG45RLiWbX-b)@9n}LtI|8rx%A>1a_w;^BZm-=<9-622EgZjC z_IOW_d)i@p-*O7~-SYeI%G&Ho6_tfh9j9soiuPN?-BZf8!-Y)bYxkgFSqmdv_I7?T zr$*LN0Y%|5Pw%%VrFD#xi{9$_W@$<11#*A!PmxcMYkU=*YZ6jUl zIa-KF!q?||K13u{4ICS#orL)L)5rJpF;?qh{j0~BBFsz%j})I3$A3P!&mU0Z+cH9KepuE){!Na?Y) z6R8C2DLz0-?~v`>N)?WsB5kFi?O2hj?Urg-=jmB}DkLhJ zLe=8wEx?ax?RL-F6C}duPZ5Ke+Vu1uV!|&+3_gz(av}!zAy4P|(VELEI=>`q&!OLi zpLVcnl9^ky9n{xcvqS0murM_n-^HHQYmps_$gBUDx>?dLFXbu^P9CKdP~{a+w5^IU3{i z6dR3=f%wL8)WM@kmC$ciwg0CgEf zuR-dsOwoC{il$wI-o(Z=Wu(K&PCDdu&5^vW*$i#|LD$@kETq6jc{t4IY<6VPk z2hDTNFg4xIBAPpB5=QOqYz~2mq^XkEr7ij5z8flj_V16E*i~|2P9<+JEZO~!SdtZC zTgfD=SeOUNMl{lF3?m8pTN*}+4oE#m3O&7FLwxC}dw@zkCki~Pe}!|}e$1;py$>O& z^n6g9Z14FRt_vm07b)5{&s7KHp2Ht|uKHtBQ+n)cl04OuN8L96?bl0ZKF5Bjx0T90 z+l%MF{nyf&e~@eUC;!AQ{-(*(wynw2aj=R7?U3d_iov{ARo zwcBJ*XpcOI8Ob&v$)oVQuGr_(iY-bjc3qBQ8%Tvoqh@9GnWWAt{>SwB4;Y-)$Mefk zvn&d|mQjdi0L)Wnh4wN}{e?UwVd^=$$+GA{>E3Eos&j%wqPm_B-D(I}(T8c~hIMnk&N#{7Z-!~{Da+aQo8Nf9% z=3n|necZwTrvIcUcRXlqs1E_O)!NNE?4= z|5pF@2d-DZ_;ViOK<*#4l8yL(_moK=%l*p7gZn&}Y`^K`&XX{?K00w=$HN8bt}eZ1 zrm0i8bS2HOR9Z8?g&E3LQ({b?F$K~22_MNtpJsa)tX|d?pCk8QQ_wrm`S!81E3 zuj`eBWjfXxw9vxzNv1lJuG?`j^!hQPyjYl?Nwpw#KRbuE(K!NsDA*BzW(#|c7Nk`A znnYh`vH7s)ssXGd3#c`Ft{M2d=Q@3R!Skf`)E4WhCoHE(a-6^8G(ZCL^Ad^JVnY4^TGe0o9%cNz`6WJe=VO=+yV97{*i=}8Lu#}}*kxH=?&GXn~ z?-VMY#yPEkEX9(!UGuvc`QE{%-n4v&){Y15N9)}Q-SPM)>j)~5x|yXWA+?;Psxv7Hg>SKQVkU(tu&{!i zBexkTZdRvVU8-mwsM<(HdsCV42kcRFR>@cxegVB=f!uczItSKWAPB4VK4U9I3x879 z`e-JrY9}fEV@^gZQ2NCJEKoYmQwGx=&q=%dm4kv+Ao?fPV0IN(*<9^JX?kRTCzBGd zU=6pzaJ8zv#RPb}r&kK${);O;y(3{Z*3>k!!IsMlXxohF{uZhJuBZ1;P?mZ*k-C8d zEy~N)el|s53*sjN1#-_*g*`{k>p3yovzEpmc{4_=UV0D+>x%WXXu){%?BHK^m7IsQ z;cE(zT_u-Nat2GzrDPRLmQu2UB}Y+`wqtgPRASAY0E{7#Pe6%7FZ3;MnLdrp`^uMUFh_uiKrvDE+z zxBaEKXpdXE$UO}b4ukBT4{pBsq;;plieojNEzfD&x?h=z(}5vj$(9HjIH|4pQ>VvV+k&au>g zf!6cBfs~%N5LfiP)kuAvantdAHA{*3zJ{gz_@2vBGQO{6DHY%KEJaJy>sYD|-}6|C z%4}dM$~T{-(1EJjbC_$W+O}To1a(8V>0j==PVzh<7xYUk`o{H3Mwm)_kDbyl-9<4w zyp0275qJdf)SKZ%)_9?z%rhwq{vrz5CW?_D-(;Bax_wqF%N{;`wM;slz_ zW7lV!w5~wuSD?jSI*TE+TiR71L?`USycx6DeXjw7BL#tW0`(p8an$_Fr8?sXCxJn4T=P}Hs-xN#Iazmbt?2C5FQ6N(ncOzlP5ff5IQ zhsg#N;X$F`F$0N0kr7l70K^D3)QnaQj7M3IR zFiX)y_CHvPrm8<>sUKyoQk&Dyy^Pe)*i}+mKS$11^;-g%ykhfjK*1iDC$L8u{0lis zFW+3d6b{A0;9i8x(rGS6TM8s&%-sqTkS?R|JmW8B6Gn3!gVZPp!Qb3P>T@hbUO1Jd zRHQsCl|ZVDrRp*%YSgE(b90dz%~HnH+GZ9?6@%*dgSJmua6;1F@@sFi+Evlx)%eHH z>A+b0S^-*PplWZ=pn0S3QAjs7`dElyqwi60w9)q{wTNRyQSCXY=hG3Lmt)HfD`eV; z@@u=OL)Gt$XfOWVb6Nn?^hg0KQ~zCz-^HfirT9I9{U&Gm+9o(;)3q zw7$))7e%7YMUBc7rC%?@?-G+LWAMAw^c#z~$jPSPXW{qAjH>0Y?Sxvi>F8NaLF%BO zSs^>y%>|NzdI4Dl^%k!GCI!n(3Xy`NO}|OOF&?BvA!UUA*ByDS0J^Ib@8_$^$crW_heE(&!o0zQmLq0t(&29A5S2HQvq|whsGpTDcsU?}zt(nxFnbbp>)DxK$$S=baJ(Efy^;>psStd19EB*rp5pAEOy{YLp zD5y(E`%NSp`>*;4A=q`TF+|YXeSnsffeqR-j<>;Z^TOdanABH%yHa$JwwG#upM0E! z2HlVtB0MTkW4FRT#e#&Ce!qdnGVGduu=>D?Q<^+0_R9-g{3qi zeMPSA>4qYnwfEo&A*|w|yKk91;xHz3^0vQ>kc;+&`&6)+Z;qnX6|kH%N~F%0YklpW zwKq_<<~{q-%Yj)ekEr|zIrUr^4M~?jDw_Ya(pb%0p}cERpy~iybDQ+>lRkCAI4Cum zM0gP3GkbsJr#^lZm={A}n)#nhsh_7A(RU(&{W0YmpRU8hy2nsn-DkS6La9tGU0^NBO5VwIlLwztdUoJ$+<|Z{>9}ek76>t_8(+`z!UXQ--3O(i zOyL~nk|Mo$>Rmi*-^1t#r|VnZJ?n4|rpY4~Lj+tOL50o9Is|@S+*J?1!{vTF6h-!v zzvpHB{bQ1s_V;(`2W)fi@5P3{p#;_PvaV}cE%!n%Q+e%F9tEAJcM2U6y=E!HvL`1LTQVZE9qhXVrzD3=S%|8QQaLo?83Od7f1#KE}S> z>vGKl-GDr6&Om#k3Z`F((%H+XRx2rpFND>)OMftmcWK6-RH2oWt>^J+10*7~Le_ex z?I&Sm&0@-$mUGQea@OmamR2Wh zy)XBys1Q0m+LfhROdtQ`z98iUTX6=FSipLWbLHAX&)O6gQ+jXFb1$x9!|#3kq|htCO@d60a&j_y3gqxQ z=O{mRQd)_0R*LwC)VLbx_=$lIPP%kJ`2Dd9c0|~WOH(*s5 z%>V|dHHBRYdPP;+NGejhrj~4~^Pkb}sGMe$sdE@I5`qU1Q?goHn0yqDQfp?nd)7qI z(?L2ECbu+gP_@Y7h}K(h0(~%vhsr$zxZ+uxV0XJlbwgJy&9^-)7mbYct!H35(;Nt+ zOcOGhzG%&46h(Q7Pv@;L@@5PCGp5(51-?K6^-TVPYAUTFQ`%3hIWncG1=Z z-Y{&bH5XO<;J=eko)=Z`XiBIRd^+!dk@td3n^<7YO9c|hdN=AUsH0jr zKx3U+i>_qVHcXXRN2QNJYyJ%kO-Z$N1k-E=Rqp96CDFA#cjKgI?MEXF!?YeY{Pzqz z%=(w2JxZT?8uh)DS?XDSTD6dxLPA6)WC!I-3)wQH5E1>JymC8a4iHTe|GF7BXhWa44yFDhv%@yL2haS6LySx!5m>~ zzeYu61j>D3OvN^mlF+TNobp}-S9IfqXYB)&AF~~-&n+`Kn)#MvN}`W0y5*}z!4nyk zss@#sX`VIjqrCL|O4c+oiPfwBv~gV>`gAul-^IXvT3HMwhPC1W<{#>xnJwoqTLzd% za@@fr;^7{8W+0|vYSwdODRy1|8^NXYDWz0jdZ}tHicH>tGDcRY{lz26R`lDxd7ib~ zDP;RciLes8O#^ouvwNjauD~N;OvZlRc$@nMW6`_jrX43J=C+L>znRMQ+?abZfOw1YGMH4 z!W^R3>IEbpp!?Q!VL>J$E+RE`1!Y~0 z#{82_q)<26_E7k{9^u} zTZSd(_hB;Y3VM+s>(#Q-h*n&{{Gn0-Y2VWx75U!M&?0@K3ZMqbMfO5u*C(5v-cjcK zgAhMd-C?ybfcVzs)RJr2ZE;~JB^DG{IkhPukuwp{)TU?Hf0lBaJ zO}TH`5w&mLVVRyK?f=C9xwmieLA9?P4^uDOBWo)Ul6#Ha-_-*$wtcbK8Q+fHWDl+k z;^FMsXbjmOkevO21&8rN)qFBGGC?P(wL_QLV&-C?>UBwbUDX$3T}veG6Ly2oc;Xf4 zG6R*hF=tSbKAiZCs`Z}4x^ZpONz|Isa5$%|<92hUMxvct%wFE6lnZv}esxe8Vgi!PD+J2X<{FDVZ|Ij2%1!JqexjY5vM` zJayAKE{+toM>p;#C-!Sw@sBk4`(vl$x$(|ZBU&9UW^KxqS2wndxrQ|wt))baYRgMx za!Q4wz2CG!*4+E!Mdptjb?e4flQVWIJ-e{L`@!8%+q0@7#}g)g@Qgs!s{!ped*oZK zSuoGDW(CF+NqZ+VJRltA7{(yp;0!uJ{5-j5`Pecz@Eg<}YsWM7=^tAf)jr16igKar zvZ(eBM%S_FdX=@h3T#~IK{IzY|f(0h& zT#?mTp`EB*Wzyr&0C9ri)!LQ{>_~ls+{|fTp%=q2Xr2&Kaq`S!=>D;-bFj43Vs65yT}%)D+tP$dUfQ!Ih>W_6WGY5QOs#y1^$`?wgWITY zooD#DRvnAs=}zoiQA=HH)>AhoD{?Fg8QOn64qum43SAdvw{wxPq$0zPIcnI4KC!l? zq%wIJgGfmNx8_T*jrcm5_x_OPaXl1kk){Syhu)U8m`sUvV-XSvAv`pIH!Wa^T6+U_ z;QkdmaGB03BY@f`MuHo#jY9Dr(B4J7&xY~Ld+A8=Ev7zp07G0%d%SWF{w38fM0dja zvwyHZF^S(akskfg`;(Qs^mW(*tizU>`;!b0Lwg>37-}N6Kk=;D&Jr|S+>4ZF)hqH+o}Mquo&(+K?7VJPES z)sz!aCZ1XJCK$a&e#;W?=8Rt(kKiO1Pwbpm^G__L`N&Dsr&k{v$)+Eat~78+*VmI2 zdUGiB=26vM!n%fDDiwm=w;z4Jk)uxC#6)_&fu8IKWC`DXOgytzz-$QUo4LUzbRrA&PUN3!Z=7&8pi+B755n~1+nb4J0a8u2 z(BO;t?kSkPB1BB%$;Qg8J?SBqox=okB29SLA~#Jk)3*mF;`U%mb!ALjSj~FI|JnG& zR^x^{(UvRe-s3cw2uG7*Z1%ZZjMcVGEK9DU#*PUTYdaaFYQV1@3D@{1mV4G{(ABS< z$j*PTr8f~1@XtKi)s(R3953*;|g(A7k@C`ZYX) zr{VD4V`dMbG$-;+`B}8c6fJ1o?0HRkYqGj4jCP)le=!>`=_S&}oO5+-MoP=>u5$EW zB+%S{nOLgB2NvTxULkEKv1s>G745x$%pd7S%)$cC60^vdm(`M))s5dU3k%=Wcua^} z#xLu-NMHXh%aX9?ZP3_rsr?0I!2CEZe4`0t0ymIAa<$xbnOWbB>$39Do-pG^46C&d z5O0=e!f46u!vj|41@>TFW}gLbixAO*cS7*UhlpnZ6W8nrp!A&(SuA`Tso${FYnfE` zFAtdBqENIW`im6wp8MD62^k1{$=J0!UDj^h11W>I58xZqZnQJ=iT-Q!?Fsyu0+x?m zqgN`lHF^e{7a`=q!?HH34DVLq>2ne;58lmS?h*I?@7~LNndfg8WM4?5w^trU7J7T- zckKS(=kY7ORYk**Alv@!f~<(``m^%%ETH~|Ay2q&{G&I;1{isX0h} z#8UbbmtV7g;u3mnh5w;0SbSsG1K(Kf;2XDF@Qs^D_{O|#a7WVyq#ci3y+3AUla8OT z6zTXWOOcL)EJZrPIQ)Mu5(O+Z52-?yT1XdJs;35zLGHmLFR4;le|c($qW`OpJ-CnI z>z-a9biRido)MmSL2|-&wRWI$RJecCXhnOD;$PU>jjtVEeBB3&iv?g4B+MI&I}zei z>B{MasbptkXNm3)I0n0-6)a>%2*(Ep@ksR2%hL}WZ#KW9%`(t~>bev46coqZ3pz*6 z)Klb8Jw;AsDQwviG^ArG+wYjl^vBushyTt&>J{e17Nq`*rP`5tm8DWh(Gy%n!ZM`( z#!}0XdX1&Jk@`O@MN{7+EG4fzz7;=YjS3Uws-1FQ@A$is?5QbMwSB2_yqBb3($=%{ za@Es%b6UBRGVZ{i$tc}=Gv&o!-N0kNa^D@}AI48%07Cm8Z9Dbs2Aat{#vb%4JGCjfWqEwFtms;mb&^VX4VT z#bI2ra3fOsizw73(rbpr!cQ|-=^5Oc*|~g9_!4UdPMZ90c;He84>*;{TR$;lRToma z&2%&3ac19-Ggs*^V;DB4gPh{~n*a6qW>2)6BOL`h9@#+0eF-Db&qV3~3sDO1-?0>h z_wy`8;r)A-qVRr!rMi)Nk)vPZ^% zXy3m0n!Xek>CxSRlwQ*`$^A8}=?61ce}$A$(=@mmFWdj>1Wp_8+oSi({wac$0`k-7 z`Igh@Y4gfGwKRRKoQ~9=*jOncmHlf3>`#)6yAltf8h;m~Of~+h5UlS1Dp+Xq79PLF z8wC6D8YenrOpiaL*J7Dp0!O4lJm7E;Kkza~De%|+9bb6p0gu3ner=y$JAjutJiRM% zR(f(KefNA&+HoCba(?{X8F_Gr)Gt2SbK=ZoH4=9r(NTiLuZ~@aZ+ZuY{VYCqrqq36 zLgz_aXF$TS)9~X`*5)OTe>dKR@ojshMC#dAa>{;^p8OHgC$#O7w)b~OeCvwO#B&;I z?Tg9P(Y~|kkBiWh409q`e?5S`0a||@o<)t7E10fveJVz1uH_!Br-ONcB?+55M2MthU}#@jCRN{jyftx~&dDPCDT zq`!YVS)PFVTE9pADB81`@nFIsyhWoF{W-l^fp?hJ6`z8K1q<{Sa25T9vI#F3iw|~v zWcoVIY_8YTNKK62y6WyJ5rs^B1C`{g)Tu znH2L2QF4Fpc+v&WXVc%XQTx}AUx%M^-{b5w{veRje?^7TA1%WY06Q#Egwc!ILA*AU z?lV^Zk^V@CUMsT4ujiBdYI5t10!|OJN~HAAOCYs_1>s{z>8~jNCX@OIDZPhLp&2z} z`cq1x{x{1Ii@2BEd8+<$Y0pj(e?13L-t*|)$R(s=vUba6B=FS1IH6O-KV?E^jjY{v zFN&jA(Z7l?EtPB5JdEERr>5sphLpa`(GC1x_Pzx?s_JTcV1^_ja)N?J>m_28ASh8( z5`&PzM9yfUfS_2hrp8)oZAHu=D%8Mafb=ldTI*+9`$=2dQrjx6mr}2U2mx>49knXn z8An^ZA&8p)eb+kY%$%7sAyB{a{m=jNJe<6<_c?3d*Is+=wbx$2?>lQs@kDJ*!-AFj z1=tY4?%Qnkx=MA;RCW6jykRWhF#=e!haZ9+7}$z@9>E4k2~1yjs32lZD}aT^OGYaT zAJ&Z9?8rV~6dj!^vp<452ubZw`CZjBP747Qf5i33D4=HYpi- zodnh)Dq_`P=yGnuYW6{v#U99PLK=v~SDa=|8&$;7i+54rr|khOEaHQ2eC-)ltZTn%sc_-P08r`B*uZy>CsXC2&E2e`OIZB-&Wh31^8lEpvXCjXA~%c95C;KW8|k#*JMET+Hr z&EkVQ%Hq#3*P+9qB43LcW43OLVPeYlhLlc)N`+#4!i;|UZ)KEA-?UPJX4jcY1&F3g z@j~p%X@TaEM)5pye`7#zqqvQo-WUL{amDlahB07VDMFWPXoWfNVTN{Ki8gV@NO*-P z{>~gc!i_lV*D8xJ{<=_p@f-e{F27cg!qB^98aIaOd{Ju*tu34JQ7vA&1eiO|M)_9$ zj?DfjY)svXz{zD37%;IJ7)Q48!i)Uw;DYB9>+!D|nHWSsK| zA}_%*upDti(YI@j@(%&0euyv6d7TeIFVq?3|3vsXoqW8DkDvRf&X~3l4|!qQD!%$8 zXpAny8^wR8w9lYzZR7fVWK3J#Hts;Awh9I9ZIrivWK2Z`O?y;=@D{*;aUsdkw3Uc_ z9luX4c4FUQY>{So+G?iz7D6s4CH)TOKwcPVly@Rz>T0Av?NdAkTu|=5@hM4^FmPrW zYTRvz#btII+)%axIY#M6m*JrmfqDT()!~VX#S>MHCt3kdw2M)$tz?vIt1*!ZJWf3h zk4cqn_*69>4AdPRydRVy0+2~|7(*0#ZvKRUk<3!wkVG|JGxkWO^Y=;&D zc^{8@DL$K}IHQu?r2+)-V-&j#`7qj`wTvSKU~ySMVh2Ek;im%;c0<`_P(=o7%aG0D z@g)emxojiC0B$W?&q%c3w~OQzrZXPj;_XVpa=i2>yRMMJ}5d6q)Jcq@Pj#HW7A2(Du(0!m17MRl><- zlK~$ioK|)r;0mNYr>q%IoW#Zxx?^;phuH`Vb3{l3^Cpjt*Njg(y zT*3dKQNCKD5wuP6TZ`v@M)~6ituL#<=g$B=jZX%!bW_(0J>&@WIkg?b&nSO{MDafA zghd{Y%0!7U%r-ItS)IBD!O*`TyuPeVV;QxUB#^=*NZ~R0o|Qko7)coAPx1|N7Ww3y zb(*$j7G-fGn6Tt#z}W-c+-BqxEjblq5Sc^D1ICv~^23dC3_Fl6H_A6KAsNzAb?ccB z2)VTe%(2U1dp7eoxvY}8ldt(M;?_B}XcS*qHX4C$H0lLBnyPNSs2ZE-O z&eRX^OL~uV%Bh_o%Y03}tE`1R*O=N`COpiTs**qA21qX-k5(RVMkR-(B!sfDGjoW> zPk<#5ScCR{039Fz&X6hB0frD~$d&7OM2HSn03E(0!|_Zi9OGP92y1Y3eOOyeVEDX; z$wSWXC`P_j?REsvB7}tk`{Su-Ovq7DKuo^kIDZASkKP&6A~epVZR@6)hi?DviP*H$ z9Ul7)25Jy?m7rP|nLtqqqhflNpb0=%2;%IlXe!Wb37ZCVr68{`)<~btv90}#`M+R= zU;#8p*AWmjXK?dpHU!Pa^E)s}V%FXtlPP9wxad^*i!*2i-OtHE2TY-*oOEljW^3n+ z3tLD_mL^_vdY$eY7ZfM?*>X1&1a^xY9>JPgIqjd`)jUkQ_O_MM; zO52o8O)J<*?ri(&$;@Z$s!;FdgQPL;W&J}*OPM+I6*v}-RIe}=Qd~#T2O9I209mK@ zgTtWr#44QaH1DcnI=_z2tRL2nm27O~Kv<6Ph1k}jnFm?N4Zx2#&FalpTr_XafDnCT zN5`9qtBTAZTp7Uw6Bv}8=V(Ooi^^xl&9>!BS<^(zmH|;u=gpwxJ|~dn%?@NgSb>O8 zfT~0l#c9^NO2WR2ry_2T!W9Yp)2QOArRw|!=w0Y^Y+H1{&fY~rJIl$}z2`F&OVmm! zi24P=&IMPD>r#Wv&UR{Tba#z<7=wBkENihe*;W*V!w|<06%;j2RrC|zcx?wKKLG8p zDr1}#tMif(e+-f0HV-eZVJ7G#Zyb%f^<9$Aq{*tqtG~n_s9qfTJN?Erh-^_hh0%y_ z#`fwg;7-SVe5B3}tGYKkXVDWn3%C})kB`(b$X1^yoR9jH6XYnD+{Z_%sFT|y0i00A z?(d;+vT%@@XizT~;kE+!Wx?BgA*_Gc$Q4}efl+2PNe$l8h1pd=RBeU=^MQ0>b_>vF z683vHjLMIXCG0sjY%>sD*oOjJ-LQSoSGXn!1-=HP^s0d9H5Eto-LMOQzL57WcEf%O zq>A~PGbxuX0#(teyg+_pC_kC^FoVxO7mA%Qj^+%)53rjRX4{|2mIBtd-CEYdzt9#@ zuB85yDiJJu!xi<3%cuaPc4S6<;+w@-D%!5Hus@48w??eTaNHSsrzQB5B%Qw`CChH8 zUCBMD8{%xB;X22l8T(z{S2|{L3gV4oo)(Y{8pU5Ticbc|JFPtA)x`_#If#4R)3gMvkWpuz3jhUIB+p>QLHx!3XzB6a|IiDIJ)gKW}v; zxyY;Th#ro9MtAyPEESs&37tW6p|v6T8(Pn!_oW{@G@WKHB#0l3c3tP>_@G24( zzIS|h9uAI>@fq=2YEBXt9~cQ@177n;jw$)HHXx@ZP7Syvl-#6_M%Ft6${GvJwx!A% zfrK^Ul(|-$WteU7E)7npO$LkQvKA?$^borXQFVhU-R@_@5U;Ah?*XYL0U3+(OV+CL z%jrPMC5w>{MPy@8^@C}`-8yyGXPLA;ey;{cf~d`(2#fgF%(m!ea?!TvR_G3GA40X( zbMT*nb+{4#2#Hy*Kw)gOJ`I>DvcnZs=tSylxn~z!@o8*pv$2q#PSnL4a)j2m7SH3~ zNN{b}YtWa8C#eR|PBegXKX3Pe+1J!sbzAMk>#Zr9Q&X`K(A8G=d1_)q^>ddu3V*iK zYo3%aKaFi`zG8o~i9W0rv!5WL8`?CXC%axBUOM_4R}8}j06w0%Mz+zDaWKV5*CSAE zV_%?c%4S3v^Q+M0@t3aYtFK&uSInlTBW+XQj*8kq=x$!`BLg};ZB`c{VH)kg3)>?-ivJu zM*EG6&8ehTnrmlRIN(kMBNhU7)VXeJ{tL9UHLoZ$Z*ru_ds^`>28(uhGr?IC-lW!a zz1H$>Y0GEdFcwm%fpr8gTevex!7Yq=o~h71Kif%Kxl>!Y#%|>rZRHwmcm&0zDQISb5K60A(#0!$9mUllQr!rUMkU_#V&7Uc38_)Fs^)_L%*8(uCXZ8bpHD2B40Jp?j2 z^zGPTF$ToADFL1Ihlp(`{m>X7_GEmu9Fgl0DKV9d*@$1lV(g4qn^^#ECv3TLs6@oR z{GxeK?8`4ji2FP1(Wq-rPR39YFK0=5p|F|Mm3uqt2{9r`jzE;zcHd1%gTw01CCpdb zfn~{k5y9H<|JSEapij=fK%ZW2SfF>GKE2(4K{q@P2&L)aL;0tF?O%w;wrl!duU>&( zIsY<)GI7p}egQlBz?*(LCtg%o7%0s77bxuIhV>2>76#paAvZh^=u=qW#Nb2ur+@8V zh~M4yasp~V7s@R_%fM@cfki-^A%cNhferx*1-Lh(?J zg5pPza#JwyH$0Wf#hAAAy_rBOCH6|74nZw$>;o7D>b|-VEbMED4FyVp7J_;x5CJ+s z!lt-kbAbM?RDk{}s1@igL5qOy6tozK%fevbI-u2p`eD()JO%^BK%M#?&?v;^pWLAL@uC}=4V4~+){WmxGvET|l4tsq-CsxK>YcJ|e|WksY3 z-Yd7^f(II5f+xpD7sJ!v6Cj3z^(9>$IGfnkTGoQHltn4l3~gtucqz#P;110dKQU>$l2%;VZ2nTDb#kOezy!xc8yiI(yR z+KgIw5$47@7P6&~g(VVl^ByEPCK#>v(&`(n_N8?=H};=5n;s?8j|6ScnoZb@Z;!M! zRCIMDxy<2aJ%xtY=!#&}gwHEld)HRj`Rp4#-k0_vezYTPb*QrB1v{j=*UnH4x78Ja zYQJo%I7OJ9*YkYyI-XU4lYAmD)E-kjZdmOxMQnmn6!e&)@VwE5VtqJ3Ho#*Yy^&(S zKg>Gy8%4Wo621W1V0oG5` zy)SyXw~yeCBfsyX#o^96N|dk2--f#T78#RozlU!<6;zc|jPA(bYaw&Q zzefi3DP&$nw*HOWpsNX)oBlmA7_LHw4u{S5cR0pI1*6BHVn%U{jdFRx!M<%%#I~W@ zhHbM~c2-7Z*KaUd=1ZnO$W*e48xjqpQ>S>UWqK}=DZWI;f(Rvh5J|M)k7=z+oY{+v z1C|%#Fc2YK7mME5IAaZt%z|wxzX98tgzr45PRLHRAbOH-szZ?48l)D60T});eWXfj zoHX^15x9%gh1W(B@vR_1mMdBp@ZAiSdn2j4O*b{W>H0?Nd^0`*R7;Ru5=$gFz(^an zzoBMou?!%SPp6U^+0}t^Rlhj*NSj+jL@xoyw!)iYn|d`L!$&zE!?D(B9&#TSqn00ES|lstIO(09S|Il>SOgv3>*i)e6jY@>KErMPd#N@&r%kTJzPP* z6pks`&++k*qA~k5kZRE$0(udd4h7x@;tfEdz(3vC0>r3I^f;g@i9HoazooYA8T=0g zC@YVaSPIJ;OBPF;9niyboWyQ%W9dlr1PS9lf_||WNa@kxYMsPB<;M0UzmPCG3f3=9 z0Xj{>PItrT6z6ma`>7lD4A4Xg`-dC$HE@v05_TAnT_T{fCG281>~}z4m$2L2u=jz^ zldwhfhOKg82{q|U(S0(nFK!-}~ zcidPCORq^R1)dVGtW#<>z1RSQF{`7&+Q^X$C*HBqMG$w!BfC~@5$0}m(njoQOh;Rb zz%u|bsx4OmN2HriMY`D=Q7YXO0eNQ(nF}Awm2O08c*d1TRC|uOFo3!6TC{->ejEkx zk}EXg>^G5ME=eO!ff%b(7#!MSOeIPb1+i1C=E@SV&XMoeL7#Q)(FjT#YneIa8OQWR zTB`)|WlW~x;S<%>Fv<|Fj zEN79i_AIhj^w``A>gvG4{6JJV9G9pRsC5pp2Cbbs9@-Z0y>Rsga-OHD|AGz_oacG# z)J^oQdkh~#_&AEUOP1T5$5^x#wcfQVT>VdD@n2x{mE;Jm4fakISiS2Kp&GKDm8GCN z=bqGhH`7LZ242g~I2>W0gW%lE!>u;;-(wM()4(?%a2!q$mL$&UHF68CkG%GDgm~K* zY&#O{ij9RR{w+ktuAwM?E~!~(KolSEinx`zX`|W(Q^d{NxDek`b3r?LayGS{Xa;os z@}4xqP`1D!d>qbZD0L=)XxHlMPmIL|ri0WJ-|BxbwE@*=HocH;XP7wVwDa+#E%%8Y z!vuyq2@J$UHNC4H)7JEA*ufZ!Ki)2r%t5}1{WbNNJI~C(JR|;(oOxy;y07wfdUR55 z_In`Z?Jok+jbD}Z$FSqh|c&oVc54Up2?4y1EW(48x|xYfCb z%hIuu8W)*L`8bSvO>H!ghS4LMrZyi)Q~RMC`)eRgjXRE6*Cy0(BcKIki9pY8eJB?u zEaUI`MB{8KK`UrNTW)d(xfGezHQst?>L!wRH&W$12gZ|C2hTdr+8(j`mErPNGYC8F z$3=>O^Z={v^j8C5#_c+bJ$U95co~|vM%so>=f>O&XJfoZCjV(2waCj$NLVl4eNPZm z&RQYY$O`#2Ss{O>vqn-E$zMnDb&-q}@*+^{Y?XyEkjxz?Al}4cc?o_y2UT;p?jXFR zTz5}-J(Ed>qR06T%!5@{!`irk8&A(eJ*f4tA<0`LWfED5M7=Dx$cXb)vT(KTeue#*HSd z5zW_$RAkHN2U9d3#K-=W&j&i(b5yD%R~UaZ^_FS<)3)vbYgIF!YBf7D7QX-|Jdon` z?jas1XkjB#Z=NBu{};kkX6OF7@+xl2smxBbVG?FJA-RTKV~u8@2v=4e+DDV)_ zd-5Jlp7p&DV)VUApn>up2bId9KLXPCZU<61^kpEGL*H^^`(Z4n<I7e-ISk}6jyE#o}@oYT5N`<@tEh%+E~T|}akBFb`TLU!RrCb@KN+2s>dNm_P^ zjV_05IuRe#T9=elbfN1r3NJisnWvNo@%Kthfr5rZZpO{-BCeB3YFocg6zlcu zk;Hhosd^%kIHSVD)+D(!d4HXQ8GPL4X-ATs9m>by~a;&PV{cbGET~pt41Ox${q{)wbMu zvmV>ZQgPe>GJS;6-3+7*>@FY`?cM{TYy41vsw9p5Haf-|62`+n8pa(F{bB{s+Y(EG zQ)6im@{oiT0cqH1pzny7S?h+)2f9SUctf?m$K8(#3FD0^8b)zQneIM78b%RSneGKZ z%5=HUqp?2$N;6%NT2v+#_G{aO$ce^0%$IHhz?kf958+Ge5k!{Tf|~Izu2k9VFe&cP zD3jvuj+dYG$u|IY#CLfthx{RHyQ5&2ncjzJt&Fj1h~h7MyzXVhUqfmA2A2`(i?!$3BY_of&wP$xs3l;hmFs(+gnExQtYV0}F z8cu$77#~B(v<5p&rJuvJ#(`=1>qs9+J@2kvy$hzawzPwC*OM~H({dNhJd`cG1N4l< z(qu#jWg!|`V<{OwFR|2zYwQn!UX-xw-LREFFH6`XZWs-7HcA+`0rcC`fRsU;>4s5j zstn@SK*}I)b7Ogc-(e6vTd!6k2la_175J02WToY{PE=g7em#51dXlw0({^mf%U4`| z36)VNd@3J2^T{2qUB@GJl~UV)2BBPVs*JVkE-*bRl4`9BmFacW#osiprLu^-ye*)e z$@D&=XJT7gFyiOpt=OCq)G1A1{bUIbdq+q4vVcSVxE_uv;2t@MWmJQRFmmd@PcH;| zKLkB)3dTks9gLm^nnzQ>IocL*25`ZZ&2B_xI2f;%VVu{&Xz&Ty7Li>GM>ff)I80CP zM{#;TjE|w5-pevZVrO0T=f>hcLu-hU=s%&~n|fx)gYhPm?H!plmjLOYSPn$1w2*Yp zcO{ml!x~$J7>ykb^uEN_0%`0;K-`oF1!}}oLZoRkjQk>0ln3Ewpct2sHSddy03~OC z2P5gisQ_xZaN-($uY&p(cXuSG2Fc8;&NUeh%ek5uRy%bD5X z;1!Dh8C+u>jL6JBFJ=vP2QuP3G8>z7H2eHW!0i6CN3=AzKcSF)X;fL7T!ws0M;wv+ zAv%pIIAl#{$X0~AR@GKRgJ>*%54~P)OvPmc`%7(nXcX^-+6XM?c(}+IvBns` zA@8uhF}2Jc*67=EHe65ZWX!P~*8h^ZZV8YM%_o6AlrSEt)UdrU0zQ$jK|mT70op2I z6Wy>GK<{6_C!Dd|SVu0IxG9cOiAgqz?m)Jsh1}XUrb}-G}f{U;)tgQReK?SCTvW zXjeqrYuRhFN8d{*K-wH~3=B}$BBZ_v)<*Z15Mkn3gue~g6_Xmqyx3MiR?%0uM3R!n z$oC^v--E7^?7cSa1`xYoqDiR?Mz0X-)@EpZp@Ce7!R2TmVTSGWWO#wX+>Hfm0p{m| z`b14X_#Y{12(FF<)#L~kkTf8o$!Jhj&Dh&QeyjqT)8OoXTYUkXYp*VeRDUlpvn4}q zC7NfueYq2m(Y_ZT&&s{-2hx^#8R%uHT}nJ< zHfIs@0dk;=n0J7@5>XJ^`FrUmtD7SnR+UPro)4rQm97PPNaQ{-r0Gnm#1j`sB^M?VL{ z2q-CF%W3N=j#d=~ME;=^`CUPyzt~1xNUpWFiW)wK5%;B@-7!P*Q?@>iLZ2m!=2;+R z7ViV;cFBS6~OuL4pwG~bOSYf?5uuO-Tco_Ax(kQ~81XM-lkgwdVo zJG)b+&OxMO%9t}KympM&;8h(LQK0N`fjt@@J4V@~5&K25AMRDTv*(-8Q{-FL`%voM zijgCRiVwSIe??Y|+-^VVE2m1^$albtzS_KEBRcuxY^qmc7sO-7SrEO*x1A<%Ig)K7 zYOR@AF(9=2u6lD|KmV4!{8zP9Te!$WAJAZ`>|xzY)Gh1W@Lp;-ytkUn29kyJ0+YoGDDe6Plm- z+5`AddF`7(X9}ODmRC735BaEw!Kqd^^-Um+Z3I#-ej||bc$ye#>^*KQH_Xow${)M2 z{m}pQ+i^guQ$7_)zr6rR)1^(i&HzukvAl~>XMiDKJURo60Mc)715zvftw2{ux{yHa z*dajNxC;fo0kjeMp>WzW6%Q*KDjs(9EENw0aqSXR@tl{f;;GqL6_0J9K(f^G?ASuV ztL32%tmnmAf>cl}Nz7|(F~L);-K)7Ow9AA8PkHx9X?kJrk=9!u=n|eMy7O+6z6B#d zXJ)te6up|OHF&|+Ts;7oz0T~`?82VXxv{FsdvmKxTg`f5bU=Lk2Aac zz%}2~9nv8nS8L5Fr}bVqHka2X4nz?B%5~OJi4&-UzsYM?z*3T0MzhIVzD)?X%l9&1 zPIkC+=3@{r6th~V8pEdz<{)dz7!VEJK+J*HA$fldU5FY#AG)IPbL_}G^e7OhxW8H# zZrI4=MxRGV5$ZO(JQj%xaP0d$J`0Tu0_8UH3wwbAUyX-d+WOrG7pj~z^gk6{2Uukb@_t&EUv-|7L_bZC8 zi@w5s%6`wSfQ)L(?MOSHO?LnPf&O{mSJ6LdTK1Lp&ofYePXFA_{z)tP9`sMq+IvQ< z@90vcWgYZ@X)`G=kG`Iqz}X7mI^DAskk?8IW3>@P;reuHmU1z}R)JPh6hmo9oGBzi zxtJCbPvWQ@$ww83?s1NOvC=k_>{?-;w5x{c&)mWEA~_>jgF_9zwRBtR;S7C~|GqzG ze>Ia@0;G}@eXOc%$n|t?hTL_1E)SrY4X1f?a`uS~R?zAKxOywfLJMZBX8 z8e55Z3_k6#64NXCP>F3%B|JltJ(U8ja;b;XYd-z;&^dMiAYoY8WrN(B?Mmb8-{ku_;Vn;2Xl5`O}mBS?A1Ix=K_vNA8 zY;~^4HKo{t0h?4UJBSPGbyTD~-Yp$Lu6Q^f!^j$sa9Crm64QUbH1mL0V|N=XKNGFw z5|mQM=5in%*D0WzCH5mXc26{s#!|I$i^Mhn>9^Eg{#wFl#-L$*>K-b!m%o)*j(v^o za$~*9eQcfRaqLn#qQq?zI;nxo3SVD(M2R~<)+Icmq^CW8i{G{`B{rJI(aR7Zdmcus z#L-R~d#H|`bl>R6JWY3yNYBq@?sBl_7v?{gVY5-o^y52HEc7J7Wxyo#YTeZgoNi8HRCCtZIGiOS>l?AsWD{I<41F zwtylJ&!EhiCc1t7j3#7&9h%unIiZW0XU;|OjN9O{g(J#iOT^~c8I z-r7(;I|MjCu6bG97Yin|leS?nO zpe4iLOHq(8&Gxsj(fKZ?7s$tT=)kx&z7AVz<8kfqTyT>pRK1bX$goe%#96(G5y%b;jgHdMFt8f|C{s!vem4}(qXxY%tdZ=QD~9NGKlGc$xE*J_34wGJ1{+04Rp?(Fa$ zkN0#ZYZ#DsCrggcXHV{E+x}o_!plmNk0a|oJ6Cc#)aT3Yt?;=>=T>0mp6qeiGEhG!l(4w3_ZMH&BKFaxN$Gb(i*l|G0 z#l8omE7qtRMvbGcSlfYgb+y)w-2|kot9{X>b#+A}E~QroxY;{FB3ahK7Y%H(h z+(gj-!0O7}mDSaDlsbELwJUSyid~*NgZ~%LolEo1ojb>pZK?7v=w#Ujg>TZJ5a(nn zFS_V=@EtN9e(~3g!`~YGJ(-4vjri!I998H=2({O*=K_M8c@~=k{1#x~(a?0~9^ta3 z_~e`DE3$SaBlD2kyPHKK4PV`zRnKxR`4bS#Tzux})cgC1vB+j#+u!lfpCxIN+AZ0y z?KD~J-6oZtr`Opzx!rlPH6VK}8ARTd^4I(t%3Ueb@JH;?YO`0$)oJ0f!XsQhs|RZB z{pKF5mw&D7{NGqFlLbC2BZWLs`RN*l3Gew7XoJLdxv>W$MpwVo_P!*sJjAZw@+6Ud z`#YdlB=&YUcC{P(1<-2}%Pmj+_8=hrb|TQ55_^stON(Ajm*W>wX}$k(OSMOo}>fEI}{>0Pu)Y6N|#6&=y09o=xUPB zA-LO7xCcj}AK6SxnoL2tj@u{Kc*z=Z_L>}F4eq=U>_;9x>G%P5Iw5kWk0C_iTGPwZ z3U)IhXw-S|35}EBnLPrF~X3wP{0xR1fEeo)H-ivz#5KbGGN% zVY)N*c*YKskLN5-1}dzt2U14O3Q}Qx5W2uGWDACxZjG%5dIA4KflKiGZ;5SoV;2J{ zlYbOQJza6Bpx<&s;aBnnPw#6Ojf-xTFd7GGSOVzx682L!j3>WtldzZEu#bQ=wPP_T z^@|gMl*(^`{w!bo*$rC-q+jru{W6LD!i^mSMy#=9^14j<8<5g_0Z5lAJvB@UpyXJH zY(<4;EktS%L_Qg?zS6U2aKN$iXU}*ZPZuJ77Cg}5++Vf?ITbC`W}5L>t6`t3<{0!e zdR~9dqzk!I$;lNbaqx?$l=%xIt#jcL`v>5yX}B~EIR^PQUMNPL*>GSQ3ftEg#9TyS zY5Ik-G%Qa;u1{@ZbbMgL@-!Tth82KaUDsTLJaC&4|5Prh#cf)++F%g^DD+R-%TZE( zXqDluwtFiI2|5GX|~u$35_lfQ%P zLfX+YvxyCi*7&Maj)Y335-Sw3FCt;#JvoFMKsZx7l5^g_f4&W|hQyB+p>7<}11dy% z#&;x-&B>22pfV{Ri=2Bl#P*6F;+yk5B8i1G3rx-F_VeOyKId+7>ZHuiPtQ)>$am}- zsZYh{`K#;zZ^4W>cNVhA!(sgU=p}vyG~!Pq#%%ghyiT~?CVEwN(-uSz_xnC-)V1Al z1F{%f-8-3p>?|E)boSSw=uqFU_d%!T*BlO{K-Yq<9*Y_~&#c@hpT^Fn0)8P>`jCpc z-u3qzv1h)1)U{gHx=-kiReE}tk=M04`NuuHlrPGz>OG@p`WEygv*`&Q?7?{-t9EGd zu-c*GC3hf3;!t|YEufd&<*bJ0VAxs}Zd*tnxvY}PtR!V!RE+pYe36~f03*(c(yuDuikTlscR~fL`K20H_G<3?AY|gMqSbA(Cq>Y8Ksz%yo5CziKSz&ULace)={RcAmOzseOCU zQtOe~tdQb8xVfoJ^`>IPYuHt@gos0o_)rArb}gQgG5CSgw?!1R4Ts&ny#<-b?Ax?m zrDVvyO(Ql{(`EE;BmNFt_edW%TK@rHp6+T%awN2(f993vmv)xokJvRx7m31uiMU1(t}i%=cYnl2*Nh==hD-WTJ)YL zG=xWTDKX;zz!&~KV_qZ zJQ3y2sXA}V-g^lB;GE_!R~L2GsD;E`)BT)Q zpeJvoG8ss989xNlE!XSa*#3|(^r+UwKqG|SOd$RCS3sMk{+DuG;HEnk!ZY3vz59|^r50F9B@ z1#T=aga24!-vkOv?0ar3J@kGev8MvnO6(*cr92Oa2B@LHa-i`NyTXmF!|$i?D->t| z(l5RRq&e+{W%a4@#U4N!TM4vP=zSZAUxfmfy0QNaM8#|<@D$JliG9(HodPw28qb{v zr1YXdn%cEMG*EJk;aqvIsG1o%baMj@OK? zh)YMGlSty}GW#TwwZ>lWK-v5Y}dte79GmX;s*I*`66t zNlnOF9ZucyTtKy%z-3&)^-g{09Bs5x9s^4>T4{|h}2Xovr_@@_C&m)qI~LR#gL=!B`=ngc+l3%+;qp-!Fu&h+ ze_0E1Kp~0S!{ijAaPXWBKMOI=+3-_=v(JXZ^E0iAavK^wEB+8;V%N-oa-%=KH4`{e zLs#Ro5e{`a4098g_o4tqZ6w2Z#D`uQbUDe+sg7#+-QO?Le+BSRG8>n$&I*luDJ8f4 znTgRY5GsRm65hE8uz4@fA$Z$+q+}t|cK!@WoyU}rI$18epOZ5ueQSfiMK5I29k?g$ z+qJ6tUwS8jzcClwlez}IUNc@CCbv)%gQPdmskF8-?;xhs6ABE*Q)hOzjfVAbH)96w z0B)R~wU4nLQikvX*~d7OwUO!e{RC_KMc3`vbDn*yn#6i`tU8PWy(9&?5{SMR zC%<~fkCA-@`2wV8&wsw&-y1-eb_Gk21{EHTBe6(OuMZiF@6{BuggN)zj?tqN$l?Ut zy<_N8j7peh>Jr9F4f?@OWWs--{24J0e~u)+2ipmFL~lq$)z`b)M?NN_gd;TV7n~#H zLQKK7fAo_^Zt?St?oifN#@?o}h-dn#$DX%ZhCF?~ud27N$F!%pT&Lg~h1-^AQfnSbV#RYVd|*p9-LJ&Q;0A7lb(1Qbu}llfeT zwCb(?i3wd+VT1KB?iv8sD76bBr%Sn-L^kLcn+_6?6_4L_xW*>W^UIDA{~luCNJ`De zaovbmTJe(mwz^8w8dr?JHL(*hJ@7D!b#Vz!eq(DGX71Eb*!%A8y>&ePL4IxD=-SH7 z_w0(p4hzfU0FZzqFUXwsa2`{I~t@83==o!lT8iC%y z|4`sbJk|L!SFZXV9ogu6LxFTfOM^v~0Hy=!d+!2`lr%nc!-isj|3fGjVNB`jklw=e zi%~$1K`vZ5k==mj;L>id#eSxTW?PQ1?cX`)tB+=NDzgl~^`c#s9(awT5x*0mwqKd0 zfDjNXxS^W9)zQaqyak#AdS+4ifMx$9`Qgn#l_t61i zhzGJ4K*!~Dal|7qn59og1D|3y@E+ZMjBmu~ZymC3OAWXO^H`L^y;dx5yX!p5S&YpY|e;tXVgs0#ddGzrKy*C zOBJFUcb^QwjeBj`aI_AO@v%0tZm{UfyC;0UgAFFWL&}hSk}L5iEzIHW-JA+=SEpjY1Dik`>C@{ckAdN!=tA`RNk{n5m3udy7Uc{LZU?)5dp_o# zd4?v<+^4(e!gwWo#}82!_0~m2yR!D%fOIj=1*v-Ldc%#~4)hEvG!!@%PxaPyB9MMN z2}onxfYe*pkKI_lqp?%~>eXaq!1^tnhHC6spc0wn#{+5XH9*ru24dZ=`-b3cKSm+Ljk6I~t9N2*Dh*m*;1Aok#M^l!Wc@7S<44Hu>1&1pz_ z_PY<;P%Or4%W61D6(CuW=fzH3rzm?-(F;)!>BrJ4?31G01;#F{63+n{oBC2@1`Nov zWPwWM#|ZWng|FsXj!QOY^~6tnylWXAg?Q_5sEV5_71(iHT(G#f!Ir!*Bz=CbT$CS_OJp833L z;Y2_q4Am!q5%8{IE{!qzpdaHBSSk)T8V}eZ{i1H@Ujq7*Gw5T~X3_r(c9T5Sl#~BH z`RF6hAU~DlQIt9U`Jb3ge@b@!6hz1QcBUt=S*MpmDo_`tXB9ghN^eG#M>z|Y({?u#ful02S7=({b*X2wOZqo+ znDKOAl+eREVLdhmWO7SLVXF)=Ce8b7JqyZLMtZ!z6~k4N?nM5<99y*@)E9~mY@|>9 z&c~Qi9sSNG;Or*soKeEU2c-?B0w?e>n*Csu zoypnNFyx@z)I~!M0vK}C%srg?U8a;A^l6?<|31|YrO195%F<|fS3OFkuYp{OFi6W2 zGOvMrA7N^~k@jF#j1sB>>|~%jMJ_xINaezLK&o!w$wQT^xuJiLy!VCs9xpM~*l9q2 zm)Hw|lnQ;BX>143{Sy1A8%vW8jXe^BT<=8V5flBEh8(I;`yr6tjz;NMW0$+J?*i#P zX&<_=+$qp+PX$^j=}rRDZ?AS^{|uxmy}RAmw}G_eeK7ecl~F*d(i;n;RK5wMTYfhK zsrruo%`~7u3 zoK=~193Zv^>y0P!9_<<)%l2|f1pYzw%ZKes&tD{$^|_@6*E{7f5Z zz)ML#`}zkSS0CRDdZQ#~BCp8FfSd!{dC4{;&S<1GhOSQ8HS>7MhU7*B+5(x7rFS#W z@seV{Guy~*DPAmV)J4t{q6~J73Lyz|$?hHnv^Afy8chV>uc$ zmMSUQLxlq4f%IG6E2fO+Mxa)S<<6PL-Up;sZ%Lqq5=*-;jpdm?jpfq*f6Y-i`QJo=W=`7 zyy0<7`HuO5sKY3~@gEk~0mR96i*2n-JytPN$WG|hSq zl>hSS4kX7J!?E0RR7SC_1;)ZSBF)4gJOk!U*5dgBf{%2)CI_|TqK-iFQOpSGi#h_y z`}i9<23cI>5lH@#zd38zzkk8sET#S1;%^8y&TooZ%OS)#zrTy$a!UvTlDvb!$4gcr z&kyFVUUX9_yJ(JYzXomu?FE9FtHIm_e9sX zxrlma+eqcqky~tyex|JoUN;kAU9(9MoRm~r6r&X?w5gGdtu8icvGULkEml4g`@E#Z z4>K0>QQipS(O!1v%^LSu=Tp3F12?d@J;vIKm%9-J>K?TOY=3S>aBj7dp&D_zFwIiD zQ0EWD%OX@H6fgA3lBIaT8m)zq_~+aTb1lE|*SK7cD38Vk`WDi5{Foktcr}lbz1c3= zo2Bwm_h!W#g=Z`EfP7t@rW%goQp{=4C#8S#!Z+PnO-XKv3R)wSg)b+hvfplT}Cm?3>t@L>Nh1X%Y$h&m)YX0B@~JWf zhy`CG-q)eF3HSAklRc+d)gxbm@vfs*6~4dD3_eRDYM->TjIw{}Y1! zi+Md_@)YyV7RHGe!o=mX(|ZFFCgm#>B}uzbcalk^%SG0dQLZ_tW4m0J5xxX#VBY4Lzx|9w zCSKI?2%nSk9LF$EdG13(+2w%*!XD>eo*yD6UwM`=P8;b?CYmnK1pLY<&!51p?ehGJ zuqWl2jTf~~;%e|QGoMI)n*pA}v?G=5!l1|9hG74~NCV^*@G17A?gW+CFNq&Hi=+!#qXuYaj56U2C6Zs0gQhmI9{>X5v>y`}9i} ztd|t52mNiscBg&d$CK^T$pBAb{00wp+IMa6tjH+La!+BhI@?&}!)~SH2w&p1){e(d zky{?SzkMo4R5Ll;S6ZI+8Rc2yDNhZ4Wi-yE$cJ5?3kiEzo=Rq)l6yyuw$G3rm8Z|H zw$Dc7+UaZ?fYY5Vt9@?4#V&SvZXoPod8XrC4?j4Y0Xyt(U~aqC-!^BIhpmw=&vg9C zXrFaB32c|=VZt7k=O({o<7kre)CSW92aKus@2DJGg?ntsiMPdyS5xT?^>0-E{nV#<;qS1 z%i5(Vn_n_U{9451o2x4`n!mzRS6Ra|fPC1^|H&uX{1Bvf%sJ+6bc--L58Ly<&DQn9i5*uO7!L7p`Y|5SdHi;w;Bk5WTE;dF*)aBTtbUkD=lA`O<&l4(<1cE4{>`oh{dj^iQM;D66-V=<(_Pd z-LT2vwwQmxw<5n8XJ1(C;h=Debzyl)-N-Ivrnc?EGP4$E71`C~vXIO84Jym7DI~uw zBxV_KU}Lnt51d{15L!C%HM=8cYe!KTe6-$LA-czx@RGAuq=JQ~Tz+A+@)xWFjMiBW zm`%Vl&6ff^fCUC`1YUG6ygG!tI^9aH{@hsn3rOo&crC+w@HxtBAa0e)UJL){YlXvoW9uql7=c!=jV$gWk1DZQ%SrBf!E0(d$);@(hDMIBcKAIDMAHNx#9 zH*U`DBX^;XB%eoJe7|c5%Gx$TYGe=2h zwn-#T_h6veRgwI;^rf`O8$BtzW%@^t^y?+jfneD!B%io;HvVw5q#|_l2+Jn;VmuFY zhEXx#ICk7SdTK5m8Dkd4Vsr$^U8m$0@ej4^T>nxl2hi?R~1S*vG<^kz@4+H6YTNx|wodPD_SKd1vNZ;e` zkG@AQIbTY;`(v)yOWr#aNZ-2jf%Ls6-S>)$aN&lO<1C3hEd(sb$YkN$K+ zfg@mI^Ms^(G?2b`8IZoW6i6*qwgK%g^m;-2sqfVS>3g$*1_-?efew`SR=e-f)w^nU z4@XLeNbFHSN@WI+of^;}q4G~4)!%M$-z&j)s=u8Cr25;h11Xi)fmDBc8nn@Bm~|aWU!uB?tw+2BcvZ0@-;6+E4O)=>X_& zrHy_CbhxDU2O#|-2~;j&AGl$IpJANSl+UE>rQ2ERGB~y-aj-xv_192Sb=Ikv%S(~$TwC#6?j_#1)bfh?x!iCr> z)59!g1j*rG&?#O@dqj`-rF4j&K~Na?PGN_Veg^CzIT6kI819q-x|b+37qcI~!YC z74AIL@q3g`EkkKMphNHxAhitr0BD;G>1}T805qO5DegIbF0rQr>9-fTvA+Q7l304k z(b)Uk*v&w_!LmZ)xJhG+F&5IBTgukbn_HJ4R@vImft0QB5_$c0Es%3ux@Q)U>rou~aPaajvvafC`*Da+%=I$7Ic zk_J)7B#^52uOmHMLf;QC_nL!zr>J_yMf~>mu&oX*g1x$l$kQk%=`f!0av z&)wMjf%My*pT2mM(r@|-A-pHk7wtoI`g-oGn7+PFa{kj76qjH9^u@zq_Vo1zYO&|j z*I)Q{#$^FHzR`<#YSw3_$v6Xyi9^l+llwX*g07h*kKrYGOsLyb#7lM0QaQmd6*&U@ zZ%xHi|9s_Bv8hvWO_o6aKQ|R0_CGikUnSD_j;G?e@?Lr><|LvM^=CjW65AX7RartA zkjDDCL81=?oyPA5(rNqw_uDstc5WKq2u6izd;|VuP2&>~q?5&0D#K&1f9J3MQAHD( z;7+S9C;=!RbQBnMBj3bwk~d~vg4*YenT__}3+=zt`IoZ(a+S5E8on}wV zd5>4*n?T23f(g`}<~bpIrulvHO~^Q+;YbZU3F1AA^afj2UHgbmBj?&;W9L;aKO)V% z7g7%NJE$S2DoU}W=OHBj3n_7frZdIEIf{EGIOnR19^6Pdsk@1OdFrXbd=+$0t?*>B!_D(aE|9&HYE2tc!s(_Glm#1I`D!U1GoO#?t&*r}AY$f00=BE}OC& z%R!jFUALiWGfXcd))ro>PEWhR52@<9jE=e*&DhvL^dk5L8g>eHA|s_{(|V4O8WVnV zVYP0WO&jFmbZe7|h2X)WNoSdBGA;~{>0ROH!}-`*xOu$;hl3rr?yEz?0%4vcZyS+X zL%qiYtu^zYt$R4cpL+QnS#sd;8LEWjd`yh^5c50P(zR*PXzMRzFIDTjiP}U z@q^f06V?iI0qdKvnV&ePSK449Vtrm;z0p`$&yOukIJT1r(=toDCb)hgn6T&6!pOCe zwx|hbF*UW;Hd%B&0`8!jYSLfCR|9#u5f9>HdslZWUdnEZz4e-r+;X84#zd$_$8)KU+Yw6P z90CVYF{M?%ICpr)IR!emzRvc0IGmc8!}u6Nb`C1B9LYx&H$RVa)JB!IPENefwtzGYy=PN@1U{JD1hdG@y;0Zs_id?%v3M=f z>n9pa;pglo8BVzuftE)*4ZhaBO6fIx(MKfEB#_QVz0jH}fsO_$lGs`xjh*Jk{uhv{ znQn1oDch=i`Z18or=PpAGtggk>+CV0J%#c!KuWm|yhT%M0Mf8;0cl>kfOON#D+gk> zoE)AKJ}Z2-8G8?luova9LPvwOS?3{aVHIJ#GE+FnUIYh%5CG}I{#wq&UJoqPuNd(i zsBa4VL>@Z8z#0 zJ!alx^-ZHI)p^~HcW``MB(fJLZ|z}!22#20c_8(Y@v0m9DUiy1l<(9_1{d7=?PMVR zmh#=DLYYnzHI~AW_T6rJthyP^@w+e*y`Soqlbx;(he3Y_XymA8_u4C;_L#@EG(ZUb@b9 z8Km3`hs+8Xz60 z+ktc#2T@5H`!yhqodBdPV5%EC14tPJ&Gw=~`3^U>(~YI5rqdy{iwX-QGg@9%Y;9?(Mh#fT?@1mx1WQk#jBX3&K#J4^pww@S|IoO>m#+ zvAM%r2HSyHkkrGhw^W?1xYvDPuW?jb&jA59Lu`Bw0#Ye3pDzW`DV1{)E3$uJT)OJy%g zUZo8@Ci+^$`o!e*6>s<9a#++AMtl`M#bJ85hI^||Y|fwn#Ie63h%0eqs~StF-^kBM zDGwA(sJCVn*AJUj6v4gC;jXihR1g}BX1E1Cs|ai>5`4zF`qi|8;nkr6^o8b=(9X># z6-TTyN+ZLznC_=17xCM%rzHj+QIEOBTC)jBA?cHg!mtrFt#$lf!a$@9Y-1XoptuPYoZ!1ge>%6Hf!OUL$%ACJjE8UevrlKsX zBYhj$St;cv1KP2GE?#j}-0^zbKMX{?qnsny*=)5(xoNvp--0MTJNzDy_v~;F)g%~_ zc9}OMuOYcyU+TV+zKm{YGV9P6Gc=hQUrxC zF?0X$@>gL$ZQ5>%5_=&~$D=vy5VL)I0S|~_j;rAGc7Dh4h`kT*hXSL4o)#1ax)o{L zGntbvmmR+8mLh`bezD8xzV4SU2WzpN_|G;VPn0Vj{I-2T8jF8eJ+=9(>xTs+pKdbS zKf|U2CcaH$ar2>B{o{@JgxPv4U$&~bD3q$e#9wKC`Y#WOm0CfQK}9Qw`vcEOMjL^& zf@%}vV3M+aZkSUpZ{Xw3M{td;raXWwUhd!9mwbMJu+2P(B|v%s>kdD-UKDKnASQ?(9MtVsPO^jW z&F|%#gMe-obU4tj1a+;AZ7aCqbhD}5?q`|KupAOQ`xk{q0(t+jBdhn9fk3ok2?k1m zOc^!hK&J_+06JYzCD24cH9(UEnLuX?ngH~5K~sVH2)$`Q1%euZ3I$yV#0x-!f$2bW z@e~YT-#E}$&BmE z9GhJpN{n0Ekr;OiaAMpaW~w7x?9B$P5j!ltf>eyt@UPnZSxVP6*Kv>YmI5# z5u@W_GZ?FpKP%0uaEUR$8bhMC>heuSE06osH$j9)maiB*&RQH7g2BgaUu>xX;({&J zS3Iqyf)Q{D>$J`F)|p%Dt*=FlJK7_`j!4xw5T&zPp5u&IYmx3FX7IEUv&uxoNqlno-hR60x3+SdVCds-*-*?0VAV#dEf&lP`_=|HP(2 z#QNoR$Y%o%v0_i5l?*jvB^I$N9{S^L`VS1jwD)?fi7UwE_BO5X8Z#JPZ&r;fGUlHE z+O<`eZ8ln0@k49kR=i}i9wNnnZ?Rx6eUJWz@Z|=sehN^3#nJQYtw?dbH4#~EM-{MA z*GEsSwZf%!cqfd)^@<)A-qId~0%_hhF0ro|ZiUMjJSmb0e{TK(I}=^0Gw@>X=z-X& zi+uXJ`Q*E1A~dPKdVO=T)OC_aQ&~^Zhw;sq<{zN2>59I|Z<-4v{7=YzS!xdwDTu_j z6-7HE*qfc#eiMpQU;UCXKZq~tao}Y)REYe z5o=oC-^|m+ZT9_Vbo*vvlc1Gny71~Iv$K5@-y61u1EU;wTFtIc%r2>`x&r;Nmr$sw zh*XWo)$Sjmts5-d?S*Z&*0-hM4YVujerSW$P};yzuug)X!z;~)IPKl5zRE1c_5-50 zhtD&M)$3=z6T!C7a_KZ(M(Z3ldJtl41LwX=cu4QbNbq0CI?nnP;GSGu%U)lO`^@Y2 zNBV1#JX#c?XYW zFJ*E#QOw3+aupHl?9I~Q68xfR99Gfp5ZR8lW)mB&9{|O!;y(C08dh+{(0Y|cPPP`$ z!>7=SuFXGK(S^&6_#g4DX`PC8SlfIk`m&C={pzh#OHFH1iHx~ObzP|uJ5+|!z%n>O zb9UxAbPjE>;#{dju>HEVzA9kErjle=J1V5ytbSx>s@`HhLZQ*Zk$Ii0hRD2!`N!=E z)h`?K_hpr#nwBskwz^Ta3hmm#(EtV`BaO!Vt3bcON>IZJO@*}d?-*(QlqMrM8(dyr zHM67{`R~h8p*vny%n=@e_F`PAcE`KGa3a`hp0|?UG*q|G#BQm4&n>0c$|9$~2nk3r z;Ud|^LRUK4tX^ZZUJe4LRRfYBi%{$}*A%7pS`KP~WCNaHhe$p8xHpyC8?0YamTR!k zEnjM`MLC2;#oC2_1JXhFVvjv2V(o$cg#J1M2ZuvUPWo$+_SdeJkyv|8L-o_l_}!I~ zpiU9Lk-GS01%e*HtceQgz_p95KM->KmCi?s&?qo`4ZB3138T zAxmrpa{1`YpSoTYz^J1b%HYcEHf*6oB37KMTsRJlRYI${pL~jDSW#ME{lUz4N3MXJ zXu79?zH#2U9k^p>SO4)#6>`o4x(?}v0=ENQ2qqK^P!GCR!p;Pf)%VT?`i{i@8c1VD z&w)$Pi}Rluzs1>QL=3;14eP#ypSOZ<}I7tgU9- zc|%}K)LAzIB}ZW0sQR|(*xEMSdl!EydJ?;1WqA1!_{3+;Q*V=k&dc`8$la^9hW+sW zkkm2VMnk4)HZZvzV-DMfWDT=zZee}Zoh`_PvEX=Q#!NJPs`I`z*D$SUp&9Rr9vTs8 zs2M^Wg&^NN$(oF}JvzBlQx#^dSHmHay?B?TU1bjYK+}#E8u#?!hr`cZ`f9YWt8N6U zU@Q`|vovccti*V`lXd27X3Pver+K3ovYNx%tiF$VpZRiE!w9~?@Bf3@@2ndu4VXBy z*sVC^on63KP_mcaM%t=-%sQGLshi``XySc3XhAG73C z-%{Z04j5YvCvf-it=(RImp2*<$ejQ4UC+PnE^m~IbEKp*r{>mOqgj1*kD}FUR0 zS+X>1IM|HCpMS!#`nN8#zx!Kv1=`hEzzw+nd?n@?9L&yO$T|Nh6AAHo_$Jcg${RPm9SL}t^!~`%F%#tbWKdt)6>4?Y=GiEHP zfX3-R&zSc^(|A-d|M@KVuYROfW(^ZLz7{oO{bZ|e|DyE73fx`&Yj-akq%*e;-z}Zz zfZgAD@(32Jm03qi=V?VIrT^3*ESEo(qW|#i|F`Ys<-_T;;&{E&f8lTYCt}AmgX59Nu(dB-jd-#U-^$p$A zH?*H`=w7~|hHq%GZ)ktt&;hxjySrbG-(CH3-`svV{{Qz&(GsA)|G(WY&BRY8*mIYy zlWD*{-FeujTN|aR0IYDD4-7AV*9Ckxy3L9h*+1G zn8Eglbv0}hHV5I489)<^u{|%Zx0})*B?mf4FVb>=^g?!N+=HjQp()=*Vs8grqH_uNGZ1i zDdjalO8IdhrTh%gH-+9SKuY;-Af-%)%f|~ndSg|36M>W-T_`KP^MI5dceIbx8Uj*! zvw)Ny4?$_{Iv{#n33~xH8jw;h1yagGfHbGa04e1vAf+4yQY!xiq*VSJ zNU8h=NU7Wgbd==pE+D0HKaf&+-Hjc9UH2-gN&{4F;P5`Qw{P8AKrF=b*QvMl` zQvPosrTkkU&EFkBO8IX?{*-iau1MF`G*^8K*M#42Qu!Q6sSM`YRAOm>TPOLu3`i;SYGI}P zb0DRB3y@O&9gya48IV$54y2Sn22v{fLbsw+4gyjtgMpMv1&}%i9|IH-&NUH8sU(1u z${j#Tv( zQeF$Bly3x5%1;3)m5+gx%61^7!kSeog+OB^e*^GTD*FQ|6~<`nr9h)4e?J0J%6|b; z%FBV2@&iCh`C%Z<-xEMe`8gn^yf@S_O652prBV%~RBC{f%6Oo0_$m~b2&7cb0a7a0 zxUqKtoh12N2c(og08+|Zft2zWKuS3T;|Vp zs7~_tV<4sSGa#k%kQ@6iAUci-1&m^c@-aY4xe`bzp9G|oYk@R>rvoYFvw)QH^+1}x zyMUC+eLzZO1&~td1TrOmPXZ~G7l4#Xmm51`0Q$K0KOm)i8IV$*4WyLk0x9KIAiMto zDdii1l=4eJO680HL*ARfM^&AF+!GQYU}OR!Mn#PpY!E>dmmn^TfZmabVgaGzLPaeK zwkU~WL5)sC(ra9*Rk~B{qOG?6wYAu)1VKQp7HzFsTgBD|3@TccMJ4a|Ilp`F%p{XQ ztHAqtUp_5qQAgPo>=aMdqVtYVRv7_dt;ze(#LDFl4q<1SM zz3)QOTL5)&{{1B+z55~Qy%@cH7m{A-E}`CTko5XO(%T=hL;8zi10m@h4oPoP^!7&R zBo}_afu#H_Buig}r2J1v%CAETzjq-ie+)^vAA1y}av~&^lOd^$g`{#ibfF8sb0Mir zhoo{BB$X#2sXPlw>RNjK5@*X6WUD?Z_w*w&QRYTGn2TAWMkn|=)C%aI) z5R%>{ko4w9Z~qL9cA@qjB;}rT$fR5bNqH|w$`z18Z4e~oBOocC2TA2RNGdl#Qn>|^ z%J(3J+D{>=+yhDFWk@QYK~gDVxK=9NAgPo>QrQEN%6^bkCP7lU0+LESB$Wn8DmOu= zy0H2lB$YcLsjP_Jz5!{g|GSW#PFfWE1Ui&Dq$pNY7C!3<9qgX%5k317q-!PyN6(Id zban6v(X+A8;qKcrqGuOCRqoj((X%U|VeZ*=(X(42t0{|OKa8IJ5*q2AJrF%>f^;eI z6VbE3K?(P}SEFZZA)W8@QS_|S?$na*cRN7}gEHtO_iW$j*&wLeJv%abHWGTuJ*$qM zoeqt0&!$ArWKj4@J+GL5lr9N6-ENDfZupo_zo*_CJZ9?bJ7nw}Fu2?J!93HWX64 z4Tlu_Cqat0FGGsAc~C!>Lw^ZL<^Le5JP1jp37X(ye+8s(hmU1la~-W;+etmk^Ix(p zVKZ33?2bLOJKo(j(qrtHLvJ;|V+}la%6W~m%W5mZQinBrwYz-Se#s)=(r~SaKe{X! zrm)i{CQFi&ARDJudIjTIL^6%V?<4rll+t9wc-FKx)g0m#KIS!!F8BJ6mkp^yuBRqcNm?c(5^MP~{-I0gq^PWpYKfth%<|EAjp zl=53bqe3Htps+>NnAeq~(wy(R*p#>5O2+n%OxZhrRTbgJa1@_k40%L~kFJQ>5^r}#V?K|J2#sZ@5lE*QjREuK@gLiKv3?Eb zF|gf~JqqEDRW>x0C;i?Pk=4Pj9It_W96@{(umOY7tEQUn&JQIOoZt|6!siT7ZOXG# zqu4~3;vT)p=?$GPJJy?@y+1CoFhO&ATDVYZrB^Vv(lUV8Ft*%+ZYN9pLBfy1PQJOUD%U5A zTvJFc=x{}|srtf=Zco6Wd!|!Md+kD}dmHBTloqYM9>mb=J z-nsy=f;~tyO{oG(Vk@~DMkwJX3!75?xp0&cJ50DYtU}&>Fw$=dZSkK9lU~c{DvamH z{7OG-?T0M?d)a3N zE%v^hs7^0uDAuAf% zF(f#ciFVW%nUX>iTGa{O)l2IzY0{GOZ{j~+=$}ETsaJ6-q;};*NbSlqA+;-~Lz)4) z3{va#YDg_iJ5od{2SHM?#i>%Mf~0abq+@_CfR1wG1J^@Rv6HT)@)0BzJEv7D1yp%b zDS^6Csu#Jd2Q`j*JkO+ZC8T|b^C6p!DU8_xlSjKR{sn!B{};tJ^7nr3tsS(WBO7`^ zI+PgiS$`oU>ut7Yl(VG{QW$&- zlJ!fV1Nnbp%+8iQ-u=$D%^&D&-W?k1o>f4V?%Bc65$@SBkoY;K9(?nR?gwp2p0WpFe*Ga8Z` zUxwty1W0b21I3*i7eR945=d^?m7;q4Afzx@3@Hp=faH%4Ai1#-k{g>LxzUX|nIPpr zN;xB#i1LgKvKC7lFG%9R4#?2ay2CXUJuDqn@5tRk3mxTCnS~EA*rl^r1Bvol@>@U zMbX^NP)NPs(UA0JK+?MmlHMFhde=eH`!*!K+aX!?C#bK>Wp)zDUXK0>?d|AAXdg%a zfGqzP##TZ5I(i-2-_dHQ!qHl&pQClq0gh}A%I19wV;dm5inlOkvr$%x@IP|m07pg8 zL5_-{fsRU`L5@lz>J1(2o|Qp^9St9wdvjn_it~v4msV3Shkf{InLhlqvJU(3)7t67 zJGIo56{*G%<*9F8|rs$T};aD|2LMpAjl7$?IiETVMTO{353r#0UURvP-&NH#9WTZ)%)fSv$ryz(-FT zZmp=}%bKG)=$qZD)e`wFf4QE#=l2X7%>Mf+|2@yI zrknGT!r4|{C=|Q`c4X5v9_2dqz333LQ5v5FR`)Ls>vz0vJ^Y_KW0L8sN;!)18>R8N zRx5@cw*wb#jKjQCd!(23ubTcHjKmPIL7bSRXX6qSBj(Q@ffqunlZ-(m{VvIdk_wAE zPA8FLW_JG`9OFnkmKs4_lpg+ws+Ojp+1}8V4e~>4W0xL0q$Ou(9w%|&{inRb7vx9_ zhY~DjRc~$VlGiQ1TUhI|ecS#)h`Yo{x@E|zoZ%L97S2uZ~nwX&rclFH7IRIK5lB@2f@vgHU!Dt6Gh-hLlCp8prc z9^r2(zX(bBRY=OOLsEVZ(qQu@NXjjcl*drHNM$-Cm6?!KWCqh#GG9>%Xgrs~9B;}t%Y7YDklHN0r^qz;L_jgEo zuS04MybDRs7AZ+D#V9fL)VPY$R`sdZsxtlj1LCe+Oif{6WGt2G2+nMpLN2kf@M(;q zjAKB#p_7%y`!cdZOUBr7cwJ8Ub{M7x!YM2E)Of}B-s96)sY0goR zP_0>At3zT|8f6bHxN4j#y>_@8(R3r_HV|$r&%$AwoZ%PM+#IHC6_?py$BMY|b*>JX z&%dML|7a{csO?kKv7w3CRx|v}>0mbMyrE0ZMp7GDPZm%wS#9b@mxG+m2syqZ`#8Ub z{;|@8dYlE6=_{!JJDRANM)_$o5be~7W~K`>bGTlCYa`rtq;XAeN*4>_WPe8OY28qI zHy3*TN5Oc{(UTYh_cvGj>yMsYyNg;lWuu0?L-cv0xUh<0>vt^Z7Ff`w=TsCkmUk~4 z`oc5gYY%j>QSEQ8DNih1&|X}uH#Qai43i2c>i{@TsXhwSDx9*$pP z%?zju7*H25pe|rQ-9g5~$62&7O%hBqS#A5ag-D(e%*JURe$H*8#zP<52|j9Zgd>48 zDCLb(yg^eeoHi zjN}|fFcUUy&WqX`gH*02AeE~gq;jE)|D8RvgHr~cf!ky0A5bX#l&*_F|) zQ*z@>=8&miX4CK0reXR*>K}aQK zy`5@`2E1&Yp5|_z|5>&FR!|+!LnthJ+&OX&^B~9ml>dBfe^)Kl?3Y;h9a3JNk~!tS zQ0;%}?pTPbBbzEW`5^L={-z{7W^aHu%Ud|~hJRP_zaFkiVq&6Aos{%@1*K>!uUUuM zMSOqGKqDF8t-yYZv*sSyfF+^Zv<0k&y}z}mT#e(pcgMNz-EH~3Wu-OYXGt+r$&Qce z*o-#@oI1-*oVf{>Hr4BH`Mt8UdBtia1`ML9GxMAE3-MdBaXeLB(0Ot*WOSojwaB6c8Ewr8lYnXjx=+reHvK17lLY0?k&w!XVma>D5Eh^C9Wo1WC{829>x!gA|g#grw*BOTC6MrDIRCF6)VO-7S%a4wp&9T3hRd;u-r@D@k4P=}J;77dgDfm0h1@vIWJIt5-BA#>xy9=I{(3 zndNFd**cb4Nftyf==n~~Rk_wh*|HtuJU>siw3S(53zo5s>;m1^)r94Q8j4oBV@nuh zW=N?!7x=n1LG^i!@!b%Xg-A4p)x&BTwH-OKGCNqZiJx5{E;=wN#xnZuTrYSEl=4xtl{R}q7 zU>jDs$6?bNd&l_D2FDn;&$-o6h>uOuofcZtf% zvZ$;a2)*Y@xhhB{?kSM;ZiJ+AHzcd>gJjk3AX#P0m_BeSPeM|$?R-+{OZh1k8|{*c zZN-qv@sLzf&__;X0wfh16_d(?kW^lRq_PT<${UbW3Mf-&xDc{a^QE$TRLS*k?93^&R)P;s#2?&XOER-(Z?YQ9 zI*oK!zM~E18pc6Fr^Ty(53g?tPN_|0c8SJEEq0BQoY57V!?7IQz;a9SvXyZj6E?~a zH5FbspvpZIj14UveD;$4qr_oVzPvsPlGjgy#WYNE8A7fyAWcm&Dy@z1*6m@Fppb(({`ARGLMIuT!b-B*lUya{Cbojd zHAl8v24*@9%dL59#-upKH29Fy)uV-|o=;V(5|Ja}somaS;>YthgdH8cqlA++gzowc zJ*}qW>aJj%&SSD_RE!)+s7>=UStVz+_?1wv;?iRL6fUqe*^HNujWL9k^53yz@E6z{ zI$HL9?J2G^)aq%?(009^y%3myW7<#w>5Oq5q|7SZ?COBUwAAiq6jo^l(k5dHXtCI` z;GUN9ccb0Ha2*vw(k#XEfwA<_q)(%S@V0)M4b%o1LyL2*6IbnzVu`EEmC5CcvzJWL zfG3lw21&FK15X9XMHU6qA6s2tw4J-7ePVNW@i3O~j>br7zISOep2OaOpzJytQU)FY zDFb_uGVlaQ<2mO*D!XiCN7;4_q!Q4^ZlscL_Tx0(YWBn0=PFUJgrxEhNGf|q<+A-- zw%DA9Y#9svr@IvWR2*3AZ3F=bQnR#b)4=~f0=f^DX)O|hT? zDV!aMiY<-O2kFpGqL1?Kwk)nRSFp9k)!Ghp%wYg!FKYp-JuYwi*qYHZ!jRr3 zg`joTws#?zX((5ckW{qTQPV0~4ue#*oCT>6oC>M7ACfKXGD@$VY+H-yMKKa_uH9MsfsG-sv4~cs?Jf#N6F$$N zM7ShInSkjY>kSt$zUx}Fn)AutPZ5mhGWTYEYz70aEM{&c;m2+2suxpNy682fjVjHI z;|`=C%_<;lCzOpRY|fe)YQL*$0~uuXJY9Sm8WtE)FW+m`43Ez9y7H~I8x|_ zYiug8YrKCAEl>KYt}9G@6T)1g#1%WOZTwul<2H6>4L>l>RElH4xrZaFMm9|I{u3`f zoM&Mv%|A~ojaR-B7De{&-a&EI>Ty`^wR+sQ?XS7bw|vbe9N{ji__Z_0&Y`>psiFvZ zF=I$}&&@@3zH|~KY{tHGyJ=bDK=_%>|MGJe5;zGuePwAZ^mff||D6xhSN4tRo3IdX z<$anYuE@`NjQ7cM*&`$t@Us2$WbY_jcaWvS{%PZB!#gq|Ug;926+NWOG12lihFE50 z^{m^8pANc|(OkLpp_x(Dmc5`W9c|>I4L*6&k^_h*m8}U#Wvd6NY^{b=woZi9@SXyx zY@GqAY+VfL;>0H*U7YwFBxM^)m$IctDYrmU?n%Y@ISlrM&)aswol??6(q zi$A4u7o^(k0Z1y3KvLP2dPph!e?KT;V5?Ygry>1}vjz8nup<(tvl8=<-G zceg>`aW&V^A*&aQV)yg+eD}V)Qd_Sp zORYN~ONT;b&VrGUEKNeP^y|^vxsWWiB~WvnYc`cDt9}JFxMvSW&ul12mi{Gr_9`Sx z-;SPr45@zZ%rvWPE{9~Z?edh(2SKv=NJ#bb@sMn`$zR!gIV8P#ko0Whp!AkO(zA(P z>Dg&d(t8b(o?T5Sz03u$T>R>9{P?kgnv$TLaGChyC7tZPAXjj3P<-&LD9^LvJkLt= zJS)%hYe-SLF94gz5RYbb4SQ#?NMXnmdYl|uQc+WpSZH-xo?vBRTeYp+ zXMgf2|76DFCKQYs5Du6nhv6b)nst1ejE~?SnPI_#*_GBZVAF(!k1gY81d#9w2gYe} zE%*9g5witS*0R;4Oi{S7Dljj&Z}_Hbbr=bS0#3JFdd} z5Szo@xBEdVh;6O0RBWY`+`S2syOw<9uHD!@!hLJA;rc?`MovrE!~>0X4MGfIK6zxt z@T9+vO(fO+iXqRj&7Oi?k;&!@|3!y3yWo=mS5l~_{B^8Ce3xh} zI+(`?oiz58llg{lt8_oLk1G=ki^JdXF6BS&UU7715PZ%FM&_5h=kB4|bB@__W@FK@ zCVYJIWQv$A2umR8|0xh&X3keQ)#eh;Qost&f8O0cs)l;lTF%%)SX(5gNdH45L$h_F zEu25wu8k~3;yTv~vVEfa5(-5zOWfv0QLH+8X0tu_xMw!ov$y-A2Kt?QX7fJ#x@T$V z*Y4Rd{B23ID0W^%vm$DY=+TItjmQ@I>Dy1Cd-*@76=B;$j>@1@oTb4Go6U|>43<%R zyA;oTQfsQY#Ie<6o6REy#h{@Tg9!xl6gc);-2>$uTdWpc<=Cds%N~qi+l<}c`yjz! z_abte;}FXM`*=e~l-f$36Y@LwpG3U0==Z_APP5H0Wj?XBlX+~kPZ-Mx3>;gUc&HnW zT9p$&z3GE^Pco28HCF89);+oNfov}s_EG$rQ<>Xv-p+QqI=|CdLBn8fwkx)dnn}m7 zQezlbo!Zf?B%$a%!#ZgkZ(@b;WSe+&>2OIu3|A@XK`QA^fmG6sgH+N@fhM_$02=TU8u9%7i%H?&PrnaZbS6DB0TzK_dA>Skn-0cePKI1^uGn!sI+zp$sIx=2qjfnW5|9rDcyx#g`mQKgmQ6cU?p2-S3>rUsXqphWr zC*m`8bXMYgI*0{E%h+bns%zax%XSz>W5Ku0e-g(7n~R)KaQIKDtvx=V9S5!MwYA5A zdp+V4n*I|%eVI~Rc2Z*pnv22taeqr*!nZY%Q=wZtGdw%SET%9nYyuc?KH-1 z>pH{LPrV3S)lXKWs!p(egvdtfMO}z2(UB2Z!Kr6GMO-SG;A zR{IumS7YYgT065cMMM22d=PA{-PLWaon5A_wH%;DPHpbOeuip)bu`15yD-5o4tERD zu#VTihFI7Fa6J~+0;e4pE+epwyUcRejt+O#F0e0x?YlLHw?9Si|1If1ZPSkSfjjj| z6Yh2pRNHZ6dOirODPGZr8kH8UD#zyqkH^Orq`k ziHcsG<>f65&kA!Ztn(b{h4&QFKAlbqV|G}D8&uumK1yUpG5c)MKhYY$DoU$(y{#6@ z_6|!h?f5fG!{J$NHpzMy|F#LC!L=7_Q*#GDsX4j*MAtZij+)X5sn*toFdD0*L65Rr z-OGCC9L$wG$|PZJnR3R0~7Ni=j-OfY$4GbCHN9X69H^|h_#q4snMGRzCndJvZ` zTi*x&#jFQ;884{TwV`Fzq5DIsLn|TGp<^Kp9-jwk@YuS0s!gq5DwQ>mRMtUK`3RDV z?d8#W5ZfUumE9nzOoya050Z)vBTMC0NGf+iI`rZNN{FjDa?A4qXbPO(beTgMRPQC)fMxJcW)OsyyvjvH0rIl03HhXKb=Gq!q zx;;6^kriLOBSU9aU3sQCvbQ(1t96S0l;4e%KYDo7=-kb`lam>2Z;)HqmNjqIvTWGQ zsyTOR@RY1dUUXBJHs+IFTAnz2i4Bq}mPSB|B@a?8O@a<_t;flb;^rrizPJn07xzN? zq6s?8eepP?FFHr5+*aD^i=I&`x16N-xBR0oMv<8ZC(^46YW7Yr-B?o+_X)DGd(X%Q@n=)*nvA!KOj76-s^3P1l)FRfl z-Ri8FHuGdVDKd&k*OksXE3xC=DRG!*wd#HtrcAfxrO_$?&gBaQwN^2tlPMY(oRi9^ zU$CNql?<$C$gE^=eK@7K&okfoKP_jN;*A>8;#O9SYB;*WKe^1-GL&Z)G+0Uu7c|g1 z7|1_k9jt8l^mDIlcxx+GHn0M!&B_M6;rWBCR~XFEvYldPrVU}|^hK-c+go#yZw@_s zJ4KrTnXCdWvAn2)L>bMTdyOaew$b2;wuYM)!owAH?!P31_&$dA%LF^LlAm&%X?)PK zZ+5G-?di3vZA;(@#fgX9cj2U$M%_A?jE~k8On5o;b^6M(Lf5g4Uu#P%!^f?s7+y5H z0(Y{e7`A@a8mn{89c4{HF`8NHC}!I_iqmLFY3@H`B9Hg7un6ARuNY&`T?;UKyRQYP z?8pSSM#Y8}w%^SE!Gw@Xp_3q05vM{b@NJkvRm4{z&HPV?RP9a=htRB{!z3U-9 z(|XXbhxHNZ^oPfFFK@Ed@8@%YdOc|}7OR^>iu4+X7u0e*#%^_+&a9zAeZOwg6}4V++zr_cz@b{RPvcRJkKC&yTKLC0E7)`l2gcU>CjS_}E*o9(7cyI(cj z<9=bw!G^qJi?OUfEKIsbtPMMEJ}tksN#9A`&|cd+-u_C7eb=-xWF=-E2Acy88M zcY1Kpoz}4`t|@9Kjb!@MHo*|A)773zYmjSCWtX6fjKS$ex02QiYWHbdx!gXVH=*t6 zML*zQVb#Oa>|?Fdix%kR=u}N%x?86-cZ}3@OLt=|du+;%YI)XEam9mWH{fZz0Nz%#|M+qaFhv(8Z9iG0a#_Q(ugM=Lz9IEVK4+j-Md_qg@ z30C;m4z~io_Neq#ePgwU*?Et(gVI;^j@4GCud0aE?q?-^ZQt}&m9g4B>8lQk)t08O z8XT+bp1$fZ65s3n+b>C8%<}UW)&Jrmx!e-XjE~p9%JP^nT(?I7zh`SRy!0aLHeiaa z!PuUrED8NE|2;_^iA3=7IAdTZ=gt%gRn_cn?2 zqMOX7c)cBh6B@HU3X(nYL~me9N74J+t%+XK*_P2e-@>X*^je+ygUp+({V>!#JkLbD zbx6ao-a+}=jBUy?HfI3u_N95>>>yLEer`R1Y=ggK2>et&N;5_#vic38d9n*{q#R`70*cFo>-66`{3*a3ORcAw-_VHAylDIMh< zn={#B2g!7{W!`DZ7?G2AR#;F*dFM~|s~wwntRb~JV{E+g)g5e*4O_(P$1-&k8nQi- zeZF#foyFDm?>Ocg7YI!0DB0UNa9d3Frn4=R{f3MYImzBG1L4~U&dz&;3 zLM$uUYjs59jdrXEzskQL!o~;fcBH)Zg=q(0yB2r+;J;s**`S-dlwdpemu+M)Uf*{+ zH@EW@h_mt#Gnt$2UPrNW156=Th=ZdD5;eP}l+4$hID} z&PIVL9c81BGm+SSDQP;}G8-*KKS)VA*{F%e4mqW44l)sBr`H__}h-dN7?SJr%U`|Zh6ewcT@IV^7va!SKv znT2S%Wc>- zPnwsuWkEV7V?<6pInjbLYHprkzuK_{DG}d#;%ZiwRe4^|>G*YB)@vfnRydP(?5zIK zr`x0a*(Xoh2~6oI?bzMzLBZXA+A*DNnRaf<7?G29=37ukY3B#_s~wbfc2rHq3afa% zjdq0|-yTV+%>qL!D;H+sC~I`f-aMT54LPBS7ds#)TtemjDONj05Ua&0NYyABN^FQ0~ zkTxV;liC+ayZyT(_F|Y`Rv2% zNxtCTEG{d3mz!jJxYIp;V-~ty9nQ+{@{?REGk1gz%*17Ornl?nvJZ|3Psrosc^ePd zs%7qWnF^N{qr=q$TtQ%a2)UZTE-AM2NTOx#*Rj7itb()hyp^m)nKwDhr;2SAaa0<82u(eTbQic6+>r#bnfXvfW zc4bA@y_exhDON}fxY-RKa^8aHuDon-OUzc66_YJI+oX#0qNzO3#Qk*p)sBsOYc68x zjkZ&5>&Elv@yop9OTH7y?AX87DZ3qA&26vA&Rq)G?ne0N0_d#j$4)N@Px@=K6F&QB z!l=}{{jTj8(xI!ZH=}cO`AqCXg|y}Q8<4g<&w-@!Tj*@Jk@$~L zf47nNDI?ktMKQar`XKjgHFThR_A-BKleA5j$^x6}mjydPvY-@_1$Kj|Ut)T8Ou77F z$CS&0Q=_*RL(;n*lHM(l^yWj-yA!&>>Di5S(t7}s-b>Njjga(ulOCkECnUXcNO}XH zOS+qVM?gAG;~YqOw?N-;Z+`^Y-A+ZZ-$I8uS^~+9S0K6Z1|&D$hUCUakhWUK7-Eyn zoguk#EF_h$KvJ0uN##69Dl?#)ozG`OQmKQa^7H8JGDv!_LDE|dN$(v{{`7}sAzZ#OyZ-V5;uOPW`KO{GP56O+kAo=`hNH#wQ$&H=6#$vNw=)fb=q;f4Jm0v|~pM<3M1|+?;ko4Y%r1vRwtJCYsxu()9fuwgR zq_^WC>CJ$ocNrwTIgs?OgKl?v--e`jJ0!hFqPMFc>3sr8uM;6Fy{?e-dO=DX<&e@w z3X)zOq_p8fN*lj`lr|oOA&o73gaw#O0A4G5M4twd@VL;M*4U(SSS1-NyA^E%olF#ke(mNZH&&_iA zd@dxPe+QBq_d#;w_mJFp7?K;yA^H3{NH)I!$&Fnok)<*SlFH$bRE~nAG79=3UvU`) zB$e@yRAxtSe*{VIAxL^nkn|phq_+~1&tHM$^X}~FlisnAe4d2l^NG-OVyq}O1ycUK z3Q}m?0Lk6EA-Q`WBzJ!Y$=xPMq45+Xf2@S$uH6*#UFSwABscbfe&C)R7(E*b$+dBi zT$=>RwaJiNn+D0XOCh;780Js*?+QqI*Fe&1gnsVy=0no^Atb#e(c3p6=@qc(KzhZH z^mc}%R|YBl9RMl)eHoJ8TuABfW=QGpUPx)}VMuPg0LhJ4Ai42xNN&6fDI_;SvUxKk zH;$q=B9-xwRL+2;@>NJG)1kYa&o6_dG6#~%9nsszA?dAxr1usiy|s|^)&V%Ih8IXK_JtUuhACemnLUQ8~NNzj^$&IHW`TRvlHvbcn8)Xd8HoDYV4k>k> z4*kkKI|ov&dod)}uD53{3~qts+I&c^-3iIHUqf>30Z6VjLsIF&^qN$5hNRL9lFDAt zJ-@UJ6O?W=MMTA?f`PlHOg=Z=Bu(kn|Qp(t9O(Tfk~Y>Gg%Aw?8Dk zN=SM`AjMk(QoLORN$)3+;_V(t@wNg|yuAR)jSnEXu@RCRn<2T;tt<@5-jHnG9g-U- zL%(%#^c6_)HWiX`8j|w2ASvGnN%?z_;^=3Plz$0H`CpJ!K7*uE#M(Qlbc3YQ8@k_x z={}HDDj=zx6urF&lHNQ>dN)GSyA_h&kD=c=y5Io9*|G|fEpI`xWi2FI)b1a`W;BIx)_q)N04GQ#$Ff2YF|jP zIslRzCqQze8j>4dhUCVXkV0}QB%3dSAh~f6BsUI$ zRl2y-wz?_-2qAOUP$rwM@aGZ79_nr_YdRk07&t6JfwI#6_Oj% zA-ORVk{h!ixsiqxk~cuI`4&iS{27wU+mKY=hotf`B$a{+P9%3eFM*`e6Ozi2(c9A@ z>D5Bgn*&MjYDjw5L-P6eAo+Y5B)v_LQf%jbq0je)j|&VNBlu?HRyws;PO^eh40fmKjo6%<$n zJ?-@7LxEM0^p-?#Uxl7?K7SjM&o@GHqjzQK#-5PeD2L?607yPR0+JiUAh|IUlFAK` zEd357mG41P`5Cm*S$ZENmES>9c{zH!9(vwc+NpnNX&EFphCp)TC`fJ`2g!|-puadb z#zS)BbVzR0MQ`tfr1vN!y~iQxJqbzgc}OYy-;h#v{J>Ce1f-OGGNe3xA*7UjIV3l3 zh2+NfA-S;tk{iE*6uJ*WviXmYY+eIRb!~=q(97Mec8(1Q!=)Iy*u9NIuei7SL~p+Y zebc=i1ij|o9vi(K2g$x~K(g;rNcPQ!WZzuqZ!S!4hGgGuknDRndiyFQy-kqx3JwbO zx8KLkiR1L2_dyBsX4wWb;2Dx$zdHF#Q0M&Fdk# z(Qja=G8~f1iI7xMkW?l>QaJ~b%GV&N{1}oge}JU27?R2|NGi`lFO^ul{R5K9YmijB z4hrAy5B%`!R|-jQPe}3BA5y%Hhosj4DKFd#DcMHopeRjW;2=@jj#w z{}htV1%pF34u+(15+s#VA*q}ON#(1MRHj2xxfqhAcSBNH3Q6TDNGdBKsk{vR%Z1;Y zkW`u>sq{P~d^-?Y=i;aeQoNlA$&GU$xp4s`H@*(ZjmsffS`W#M21suF9+Jv)kW^lR zr1At!E0C<(2uUwC zB-HB+NpBZO>18iS=_LtC?+QriWgevTayz8a#ycQ|LrCtn zKnjiShlT!#Lvr_INGcaVQkelsr52LPb^V+H2w-HH2w|A-OZ5v(fNqb-R_Xw-4#-3 zltc1IKS=JL3rXcFNGfw7S?@zq`61NoLgOw-D)&NCc{O_5{m4+SA0)klAn6?fN$)sF zp^=0X8nux0?uHZ^zl9VUD?+NN)6mt|cMq zoeN2C8YI0Lko0ClvVJZk>wQSpdktH<{D~Vh!polw?LMIwW6?5(>}6N>x`R{MZIuLf zE>#y4aWU%Ha<{UIJK9nWoosPce@>DLdx9Vg-K-sx zOxurJJ+@Pk+l^6HzHuJ2B7%dU-R(m4@&Pxi=p^Kwoge(_aA|Gmr&f1cdHyK7tF&f! z4n;Qq*ulu=C$E9$T#Rc63%|>nz#hoCJuux9EnUKx3?i4~lT$;dmd5AW6x#Du);$X0(!gw+op0?R=LSN%ixrHU%$6z(s4{muY(txpEsrO!UTUc-Of|y@s%utlb{AT@^kd-5rcXvAYDZsmAVJO!@EWIQ3C6yV%WK zwHqkrXPNGwQeJ)S6E%HP{)r^JU3nAbTC!eniE`rvvb~N_XvbIo<+*BYJdkaD5UQ3S zGRukZ*tWTGY7;(I`Mxh{UFEyolcVx|Af)nr9HezSXF;kju7*^;KLSam2epP&c7>#} z2PBnI&^%Ws+4%vgCB{Qixg~o06ePXZA?Y#j?9$Ri}L0rRch_ zoT}JP>`xU~$s1I~s)h$r1yd83SNFG99QjX`OCcSU{HkKCMyMloHus^j3G3Kuf3sbI zXV2X#?h{H`@WwyL9#!Q1`igmQynYt39%fm$<~+qmmhWpXQ03I98pj@0Qz|r`fC>7z z=9t97XNmH#G{`#c)=uxYa?kx7u7gu{C!fBo_SZM}vEP_#b4hq>o!y<6^m|uC$NGnr z0e(sPpSoD6rUKBh{>g^wST$L{d&R2gk$j=D#&frM#+a>OUIAh zuqqwD$?6O9xyKEaEJ;7f@BNxL;HF}Jm-H92s+0@JlZ#u5Y_;j))yJg@H`x8yr{YfS z-YMM)){d7wtHelFCZwB(+nU+~Q>nJF)C8mJg|dCB};gZSDyu*9p{hnD@ zMs2Mb=_}8OQ5QGPwX~dgs5Hy5AOzD_j)~RS%}|r`t^!V9IZm&q=iStvzH*{o&&m5W zF;-5D{m7h++P%3;h2Lx^!ZQ0nh^+D`vgW;LS_{KFCcda^4=|JqBCeg=h56Y>SK$P= zUwG+9*BQmH`v#APANmfBSpBX(O*z2n*c1(F#JCdizihI!x!bVy_M1#wWkeax>)kLV zXN!4YOC8VKv*Z1(30xYO$_aMu;(&P@OmFeVF5J{ivX8DT>~LlF4%!tJL{+^06|0@X z=$gBde_cH~6&vmX=IYU7jFf#p&pmiS!PQ|v5Km0bw~D9jm`I{NSXU}@?XOTGrpAxY zU5RNl!jlgVz2Vz z`cUH`^`WLi>OIba)Q7qTQXk4%&+3Vt07<19lFFAMsoV}d;6_sIvcE~L$94}Sm7$dG z`gS;^Z><-sZ|yq2_uUs0AbsIO`r_M=zPKII7j{R_hjIhb7yD6f>Wlu6zOdbi`eFpM z-hE*g@#zcO$0EP|2GX|=Li+ZPkiLBqdeHgpc}U~lh2#UNoCrx}G9;C+K~k~(Wm35m z(%3;Aq_G3Lvso%nLyyS~Nd4ipkgbm|ihUS8+lj*Z0@rWe1=8;hgfs(lX!L9p6j)`? zoX@`o1y(__>N4md=f*XV{PsIYR_#F}N-Bp#QaKuuN&=Ef3hF}cFN#fol!nfLq;gI4 z_6|sTk3iB}3Q6w?NP2&TRyeEdmKs_02_(J#3^+?=BqWv5kW|J%Qkev49OHaQR!xJX z@)#tQe?n4u9g@l#NGcyf-JIWAAgL4;hbjj`dV3rsz0)D-eHD`4`H=K3hGx3>m;*`g zYDiZ7B6_{O@gHIQ%K(~f@I4wNZ&pM>D#|S3Zd5^+43eN zmENQ?sT>SROkNGhj6Qn?$F%2G%wPeD>y2}#9PNl4{QNGi>cRQiz` zG+s0iQo0`wN!j+DNckK{%3p(|dE)a4s`5KA z2-C8H;kfjME|;AYwm;_k*I&bjF*@iiuZU^^^B%W}H+ z)>xj&M9eA0!7x_X3!};G`O94ECeJ`b((khxCz*QU?oP%Q3Ye~%MnA1Ud}WRPU+4JcIQ;cq?fyw-L2O{< z@9lUbcVGqoplrbzqwPP{TiEsE8}7dPktr8O{^4%b?17an`lrO*MA`>`cs87p@rrpO z6Y|bln=q@xX$FvNc=9H*g891n{I_$f$dI+!yV!Aw_uMV*P6XM=%G6K80Q z8AuMB;JrD5XM)IN@-PU7Ahzh<^ho+2x`<+iiZY;3&j?aD3J(ZV-wA_@Wtx7|3&aoD)cknI~P|O(B z?&B_1-954J)pjD)4ZbKA{nW7xWR)CiT{&-InDAY6;*T~1Wyx@$jKSAn%FPB~y#mHc z7@4+lSm#&fiU2`OvkW^Ymi=2TM|EY#SE-dNE zCWl@WtKHulI<2&WfptshS+m;7HuIdWBcC*@f*CGl9fspMz#xfv78mPfU$U`=X=u{Y zJPXXBgSgX_=35x5&YmMPud%Cty9vrkF=-e5Jo}u5FxB92l+E2d95c*}_Y-_}t1(I6 z8A*B}sZi5sz@ZDRcKX32pm0RrES>u=BAKDc&{&Tl)2sr@Qcm6iDr>8LXjLXHGq-P( z-lLsK7NcJO(G2+8r~?)xxpcSkr1YGs;#hp{^Efc%sq2DXMM53$_#O6TY5PwFYc+R!+_MVLGf$)X_nY>iRF>N z7Ax#XV_S2pcB@LGojm{xRi`E|xh)ctlYw**MNF!wx2N({n1u#A-{3 z--=npzqLohcV^aqmG+n;$t_2NOdHul+6(OoN=-LL8f1lpvn5{tbuugCwWVfLITse& ze~V+aMd{IFvg(lBf$6P@!T)v)mrWr#S=H>ANFMkx&%-ckJ(gTRuQYE4jc$r06I4u$ zYTbF3Hob*=J~^%OH$Qo}i^~zC%P6Tk<<`7bHfBe%t?LP6IeX|i9Hxk}=(Z20XcRMu zMhm8?1Q0`*i(E*3RBeMXJa#3>cRL8ZE**uQtKo8rkXALE3%4y6B^GWf2?@8LB#cg) z@>-T#Ig%WP7vk59w3cN~PHi3CUwE?H&d!BJ0#RnUe`lK5HWtr++DqVHxQ{6a*teIH z(YB}C^tN)`w$wWd-+vUJyDzDcgNtaN&8e7yP07N|%7S0OyhMis=&F~w2AvwY{`(!| z7h7Y}acRT#<8)cnIBeU*cR8k28$YY0>Cnh6lr&}eO&b|CwauNZ8LJN6;vREb=wP*1 zm^QxnjMA|MEz6?3vaB*mn|D_Hnty-x|Ml|Wix1@vC*;C7PA{#>Iiu-(>%X=8$Hp%v zx^cR}kR9|~7^CA9D`O0)D0VHRHOY5C8lPDVX?$h{r16=jA&t+hg7$RZz6EL2$c`x2 z_{`TKseB8P%FU2eZiA%qGpNL=+y_bJ6-X+5$sSUf21(@-NGg{>Qn?q>nBngsjTJo% zN#%p+?I?ULJzMJ~z4IaIO@pL&DI{Bd4N0Y#;$GiYK>F5BVbZsD#-6@C4$|n?Nsw$g z1(M45A*nnJNyW}%lFAB5D*uKqrPM8oy#qp{{x2a?_eko3L|N$+w< zvlwYedh;OZy$(rbGbEMH3>-Aej}?;}X# zi1|jZD~rRolOgHNhNO25B)#h(>3tiT@ z(whj$mYX4|ya4Ij48*#P(kmXS><&p~Z%8WrA(aA$K~k}kl%#S#B$cZn*)k83N+Tqd z`H*b66OzhZkW}paB&pb0Nm5x4N##>WDqTxMm0plkc7voc4(d%EQW%>E?ds?ZsE?z` zkR6*}7&{j#b2Js&-O+St4@ddt3MMj1u$r2eMMCsm-4J~xSn6==#}Km)t#oR6cg8TZ zt|hs9Ye{aU9X)L0n6@O>t=eT}Rh6x3WK+qx6;(9NS-8vaNqxm#SZF&d!p#$GgIQok z^TBXWdtp4r0OR$0QtOA!*1$^~Z)_@zMBnE=xxQkd{g?eQwtRSS?FE57CzzD z34c>F>p`a5c$7B$1icxZ@jTK$vDi5Xl;pe#pAw9_Vi=1h3;JgQnV&OrlII2eh_Waq z81^Kd!c8PCa>*@^wjp=sQQ99E%uF4$8L0MyR1hp@b_3Skv-UJ-K)r{JShIFyVoo!6 zcYLCZc{HSqIRa9~^dM!-36KiUb0B5RuR+R~Yayv5NO)4Qu9H-335Qe~AT3L{1=6yF z|AVBm3r$O_{3Vt>h+N9`#B{0 zteGqO?uTTbHFH&nEr;aGKS8oDU%^2t`dkGE`OkGpbLaS!uC>u4*I)0Z*W&dz5?NtxbMtxr zJ2s_fme@W92E3=(vDe|ulX-W(SsDDsrup`!V-V!zoIQ|%qZTDzx``1E#>IorsV{7r zuiXCaf;gJyYc)Kbz385e26$47?t8G3Ka4TYc1?vQug}_rKyalw88CjsLFAZf|3h}n z@jEj=vn|1vuqXWz3dG)Pa<(I|7sXq=nUTt6TC~2-R-BKqRr=v}gm(R%*^Ur*>9U%M z9oyGf9ZNR!Fh4}Q5xSaQv>Rb-1V{SMm!GGr5W$X zum8ktO0d~$a);#_i!Oh&5~Z1UU}|WW8g{_7XPqs}C-J*zwrHdaXSJAiVp#oS{`R{h z8wh0l-it&^BKG?CAbN>EssJ>$5#&kdaW~;Xkabx0d+nvCTzf(XEm^s7 zW{UhSl=!&=8(UlApN+p&;-3$xESv_ZEc^?k64e&%sYJB{sa2x(hE$^3c21S}Rx_x? zKOK_FuOO+s14-pWNGcm4sT@qUe#VvVwzy9V{*H~xNFja$B)#fki{tg*A=tf!Gb$+ZYAQ-6c%|F8(Z$9|!CHqAQ;uuJt90|#j zNl2a?2c=w4od?Nl`6||lIX)sQXST~t>3F-`6tY{^+;p2MII?$TvS2q#hH~detAT^H zG3;P|%qyAgG&<9>=spC^ z@_4;XZHLuS)C^Dgt7{LpsfOW&{P) zN6x}znKxjb-S&1<|7DjlofZCYt`?eB;;$s&pK5P@6c5+uH8;UCM zDZ0+z%~V!zSNj`m!dpg6siGBYJ9++(pJaS|93EKDLJTY3SR!;*e$Tqq3K_4_zNPq8 z+HAX~B+rs3ipMN}xOE5eMocIUM-cG zTSGp!&G+V?^D}!tEZuo5kD*oZe$cAOPG4_({w9yTj_mwX<6?t%?Z-7^t+w5}n%b65 zO*^6BIyFH8E~#)HsW#O^o>U8-j*~D;~nM!+{mbns3^I8vC)!ux|I`AZuu_%BLMOU7~jpt#qgp z7nJIKHMFcC#vGG%Cl&-njIEUFYPmGr5vlZ@$&9R-(!`ZZ+park{Z4E5+hwuY$-3HK zn+kf`cKU|W@ozOUz^>)NZf9}rY)j``{$0)3_PYp;S|sO!sBszt8dkXk9i-KFw< zNGkt^r1CZ-mG>a2^rHa%rc<$te$@6m5|YXqNZ;D^Z~FElNZ+v$L>mD?b-Ab$->&zc+3dj^u;Um)rI6H*KEEl4fMwUG4Kh_#|dIg#GZcqwXe#~C2w%qRVqmHArrZ#cScpVEBjIZyj@%3_dwVxZVv7gc2 zV(j29%x>=ChOKUO|6t@f7&e>FD-r>JQ&m#)hUZJY;2z|Rnc0%opy|NyPwn_%2tDgD z_1aB*S94VRRb$ZN@T?CeF&fQQA=-!T03F88m{+oYYzQ01)QU98-e+LKhRm^%q4Qv= zkXjA)vBt@ZZFMH8*~Zg?;fV#j%#5emR6}s`Ryd#(EylIANwy^D=k`Uk!mm}k-lLe! zlROoPQJ2M5Au?=6;m5BB%(ECs(yCs+#wznXs}G|_y$!i!h6OW~WSCQlc|32UHWs^P zu`L_U-B{Yn;^bCaoarX_!RQrcd$jjGXr|EwxAr%UG9CF4_M))V+TgT3@>^<)Ps_0M zdFr}$!}djUv29tVux)QQL3-1xMbf!ZYElC`{b?Giw6sIq9yEhl9Y~-;vTu# z?)s`(-J2calp-%QZ0?Ts{*&UNH+3Cxbm3z*SMcqx*9EJVJzVO`^DE@-o?&#lv%L& z+V;XI;JVnMYn$`9n>9AnPSVO5J=sD`W%)5HjYnCLW#3U#y6xDf+i3848qt}8A#}WT zBih>rlU){tYK(m;YW@z2n!k1fpQ?X5wM&h=sgP<*I~PO^fj1zj*!pcXB8sEt@6J*4 z*HyM|UJq(=0YA*t9dWvM&>N#zfanj(uJ+42lz`#_3fe}|;wB(-)V!PvN#&vF?K_b4x<^gto>9}ePtV1%WM31cu=*1uUv7e=cK|hyR7OBjISG==DNqn^kQ&ibAz5`1B$XdQ zQn5{eQdtB^Who?;KSNTnhQCy-;V+dvX_TvJKM<0htpbx?H6*<+L(;Py&eA&{lAhhl zC%s@yczOj55_Wb?NQ_I2Pn?!;1H|$E?3U`FwY)XOKzoCzOp_ozqAc88xT_UFoHFJL zp~kT^wQN>0=|9cn{mA%(ds$UO)nkLJ?8&iB0gx@H@nr^ za7}G{JN0&MY+W2WvAUU%Jh3Fl znb3{&RlQkXz&Zumz`;5N+iMWM4y%fpVHKryFkaAJrylk?tl>HCv;FpZo`W`QFCFay zPt}z*MrcapGa{=BZ#Si~cderl|LlX4bnI%-y9+8yx&`#^CcC3kY8?IBhQ1BPcMX&Ppv7TxBr2p*OQt+dS#IG_JX8mlfAY& zj@#oP=^YJ8?`zRpTk(6oTNLp}NPE_oL+U_32kCrh+or4ATX!QZs-wLRq%Q_TI#=1I z*RZdt_wOcYbjT_#v_$kklLS3kW?&hs|9ilB&#Ms(mM;1-V{iB7eUII zvmjY@1(cODQ^ZbL$`?b&BdTCyKL zvn2sVu`1{RM>GliWN~uXic1QIG;!+DVsG)P&eR<(ixUmWVsH8IQdf&DA6{(#T|T^w zFJsGx_qBg5Y3P}1NED|UlBLTN?!}TJP0JG{_Rec4;MI~=4JS7XPU9(PI;H%cOs|jh zFD80zioJT+%6Qt^*Q4SO_U<*R{y7etpqIuQO(%Stzeyqnyju}e?)iTU^C<(O^A_-G%|QNg)*J)KJMsEMj1>sS`$gSaR$y3s?w&k7 z-XGbmuld5JE$oo71A-vf+XaDNQf$NA_34d;wI#===M*#2a_vm)Ncp>@hP^QJEaIW) z(4_wy&C;g&rkay!TaDx_$48qKU6+-$8&!3y%M*1Q&Wc~>#+h3l^BQ*XP%JS)snsrg z#P(^W8g}s?U$ca`#=hEaUgPm3yTaxZ6~QxCZAIkP{85osy4+6HV-oIEqR%4MYuU;C zOS&P}S%&olvqxdn?SXL`GyvvIz6oo_!sZvHq#LP zDJX~)wE2_$D4W~-FyDhMeGse0ZS5Sp47!8tUKqOyy3^5>q-AT3X$kBv-LnJv`&W+6 zpdECtqsh=O99cj8E=N!|tH&$X9c;WI6- z)isybeL`mWGY?3W)eXB)iq0&t?AOa_)jsUfOR`~@B{51`RyJAcDqCW?X7?nyCfPvY z-}-HWRO}7oAc>i0XJw>>6_d*oL9LKbt)RkxdBW8S6qz*xlddQXa+TL`c`<61t&%M} zwROoI_mjsyXOS!1oYC$VX1DoWe|A6u8-UA7U@eH!2IHUz- z;oyO*1Bv%)|3%OLd&+;-YrL$$Yd9o1Y+XG4dz6T|KFn6sH^u9%KjSqHCak_mzY}#V35y&>$X-msI$jlV^IVsX)?AJ)HanB~(<$pu zEQ_~@`my~TekP6;9FMwEK@Ie-i|5&p&8rv2YKZ%Fj%Go&RT<{Ecd}(T`!}(K9K3iMO2TC$y=kU$EoQ(@%7AKe@K)A-vi`lZ1Mr z>g==5oU~+Lex(*3b#3fHoGfac{DMV|FNNzG*96X;Vb1+IMMacx?)hxzEMA9SOEEFM z!gCH=^p271EKtnnbV0mJEPif07C)>}iSQj2v@rsI}Aw+CptYAt> zY|4i{Vq;&A$BtiG8ary-uCeX~J!6G4It{k3@3p^zKjR`5k*N%ID*H0xTYRp~Yh=E# zxB4AD?SM)lePOy&(F_0N(>_kx!B0X<%oiE=GcHKiG_T)+u5I|m=bYHE^CjI@cAe2> zvN>_J{T2MNizNz)(pXGnez7Ak3uF7TyLrzKyTtl%>S52N@mTk9JI6X7W zaZ_+W<&YH2ou{%a%;%QP@!(dBaS+^!*$Iod6~nFAf900B(;cnwPd>M7Z7`wHt2owc zT=!V7!@9+K9ol16$&8&Q+gE3XpYq?+qEHc8sMtU|mUiwG>-?epJM)G8OTV+w5n24} z3)B6S|A&9_X-^44LB9ztu~^BtpK(FDrfKW9!$0|SZ6d%z7w`O6Hk(RE!XcQbQ0Fv0%lDioJoo_ujzXd+*r0qGB(+b7poY2?-bP z``&${Sx)}_&p$I~W@lzM$*xc$Y$?iCtOeCYO}tDeBvrcOnJ%(~n3ShWV}hF7E6|-n zbk$6>Ig>1d;%Y@zFX|R*Cu#N94Af{!%Y#237g7SK(H5f?)&_5b3rCGXCC*?*RpNu+ zrV&yi^Pm=b%%gR|c93duy3o#*L*bZ)BzR&wP(HQ;wXhwiC$cQzB_vgOETMVS(tyu)W_@Jd&Pg-Nli|V50tqODx5M8ye#@yEzYTUb6`GHJ)g5RU#3Sd11LJ7h8r}IATyQ)W)w1 z2uYPber%4j0aO|ExqqdP+Fljtf8zCN8HCzmfMs>07S@H98#O~J(EUy$3U^Y|aHgx@ zxk5GJ?^qT|YGKq$sfSJ#PG^9|#mY(Qfz*%V9OXR6F;8ltXB8+e#K>HWGcVELjGpLo zI!9q8iJz%K61*|))CcDQYT-yty^)0%RfMD}A6=RcPZ4x6R;4iMg=?FtDtZ_|R5*%TqFs4HiJa8}NVHv1}eUEw|>o&ZEq)NLEUrWgL zUumN*e$hopsa974)t-qb>G{GuF`*suy`I6yzCYJa^zU6L#O zmPT-czxm9QTIjirdRpjl7SgJm1&5KQoY80XX_DdlZz!*qdhgztz zhpLo0PWlTj@b@tDq854;P%jc^U5GKn+PQi$Twf_fNBn?XNJp4Awb1(*@g`SSr1bnp z@W8#4hjS*isxuE{ZHAYSRB4})X@_c&k_aBHU_Xg9&nhCKePnSjyHCt7ndynXaVs0ZrK!3yw6mG(=j%`=3Oppz_rSq@Ye zHMdlt`<~Z@L*`$V8FlmJu8*iHGv1aEj#hIW&K!EKIh+HShiY=>FvFNT*C@iOoWc#C zjdKYyHwURXZ)3Y3o+ab8a-xExMTBx7~mnQf&d4lg{ z9{7&(uuZ6iZ9+Xzwbw<^(9GtuHqAZ{iQ zHxr1PiL*fwdf5oB@E5=9KzkvzFh~659$#aKG$z3V_fj6#m|9q4>Vd5O@Dh?LZ8L=$ z3%XciS^lydsBVAQn=ObkrlJpA7JxGUQ%}LK<_YNnt2MQ-UbYn~>=xYN?`V^2MhwH01M zQl;IJYU35_f2EDO@^x3G-R3Xq-bE-J{KYTZ(0)fPtQ~$49r~SI-31TaOLVYi0eU*?@X@@D*{qM9qZM_**a>ioC-b^i1rm~p$h&40aWxgIDJsich)J^Dx&8cZRI@i>%G*I zTIiWVqk*5>LB9AY1}4D^V@$aiV`|~`6Y7Pmba)9#mHrT_kJqh0pZiz(s69szhrg=y zNAUWTCX^dTL(0bbPz&oq%Z-}r;3Xtgx?^cX>9v^t$aE6u@b?ajB(*S?Nwg%`_WV2{ zc;H^j!!l3{<4HY`CGg`Y$d9X+M`gIPjo*IeZiW z{nz@ay@c1sKdST>(P(zi;yS>p$QjNUv?W!F)ce!V^2Bo9cUfeqg{50YOGhG$b%pb5 zvZb>L9l&y0cypdYy!t3h5rJHMOwTJE%f!J+5}7K35w)r>+g3Q`ZhQEv`{ye9^Fw zo>jJxQ@PJnsD&!~sET%FPTLtG&VK{JUdR~!K44zdLa#%_%gRiHGb@4X;P5$76*!;4 zBzR(!DIa?pwM@aHp2)fmFCnSQ;{?rvgEbZ8K|YK6S9zfRYas*pt16FkwDvW0xEi5) zTn!gpu7fVKykW^{o zkH27s=P5!-uZOEVhK4vP^LY3cC1G|(Xb)fO-2~(gJDyYMu0kgU>T;Fif$LmOVjYHvl4S%{L zq^C@QTBx8+74Q?V_LMhSpu^v1%!69!0T*>K&wnU2K6X_|&zSysh*qb9yk(2;UI!2}zZH1FFwc1YN9wtPIq`yr?c}ZstAkk1AdKu_x48uB|4>dAwpZ zr54t-86PLUf6!}S3jJe-T%=z!1!|#!D^(z^4cBLamHTKdxoZ+{m;$v>!GkJPaNN4d zoo&8lD%3(1Z#fm1o$)GBK8QHH)fm*0AN-iel zx3HdEpZ&&EsD&!y|Ef0FBZP!^KBcvx7OG6Cur~GN6n-!TYN5i+zpBkSxwiSqRH%h2 z^ZrT&zlkZNUrdEssIr8rkWtA%<*0O2Ze07#6sUy?E94YZ&%N-)7MA`n1!|$fI;v34 z93)(YLWxr5O)d1^LcGh)L4p^~3zUm<5Vdd)qF%_7Kc7;izl-Vv6O*8eL6Mb#T9_Br zMa}K-5|S$21OHfSVXh+z&=Y7c#0zNf%}fA~sI0Z%g(aa}tTnZ;*3=7GixC%+3VnPm zyKKEI=#s9$%0P87FRF{0+XPMgt3vm}Kh|3Q++2-$QwwW-O=YbGFDwb=Vy&r#wWeOk zS_dy7snWlrP-{UKYb`4SwJLu@Evz;5DqCw+`ftmvwX6)(!n~+%*;=d8{q)zhR%f-Q7S{TEg|((!tTnZ;*3_$P ztySrlmRoCC8K{M|rn+TotxC5Ftm1^#2wX=fXMOcuZd9$zYELb!y)ISxhw~BmAekjN zW#)SgwNSx;S5UpO7kUp$z=b#7n_B2ylX(AApQBuiKD99V)C;vY!b?c1^y^T4o+6Y6 zgCZ*fwJ`cr7d4OY9{5L&6w`|W(rs8`vzsnYLSZro&LpcclB>Xwb0D%}vpxT!d^>jexU>9U$r3u})1 z%RdVjjt*4NW8Tz4?{HeLf0!RA7vn}Pj2rbT8#h(@_;@o4Pz&Qmb<4(0 zmF^%~>wh>S#?M-WRF&17T3GYszmA(e^QIPhr&Sm?%Eh=*3*$z;%EnEVerCCGla+y5 z7&oe0Hg2kPN6W>{gfp9=d?n!-{jv?H!c`_#b82DDv;R77)tNW7(0f{iaid&}8?`WQ z)C=P#KR2k-pH*($WM!Zh#*ONhof}l?E|7~Goa?9<-|(m0LNZ`Arxw;6zcuoA$EhLn zrWSgysxWSpi*chC#*KQF?Qg2|Haih9r`(IJXv3 zO;&qqVeRkzb?i);H?`3FafPv?T#OyHFm}|dZ0uC&zbrR)vNBK$V@Gw%#!i*)d%4(^ zf92^a)L2OHB^-W5NG+^AK9Cj0jeocTW`Y&xlQ~nM7ApLt3h?Aq^QAS4jf)H~Rxeci z7U_0F!5^;bGX-j)f*Nd~4ERlQxCez!Bz|^IoBWVm%Udu{YN4kl^~CEl(#r5VZSW42 zd0&II&<^HnYnY052wzNO-1cO_M8$NwvdelNa zBceyXsd$urN+@{XUdqEZrWS^kdLRpDKq0BpHlx}+MbO0~P?oCAw-> zx}4RMnw*ui23$2afh*?5oRyj(XA(#={8C#e8+=U5YECVzn=Mtr?oy17? zoy21F9Vpip)=Ys~sL+@ykSlG_n(#@vF??bU-{?(3@87uLlMVBx7J55TZ&MApLe5_u z4>l&A^4HMnF;8ltXG`jdpN!9teKIb5>kzZFWnR=muQtTXYOoGB_^Kv15I$otEP-$M zAJu~28PNrfpn#u-Q$GwLwJezevhe!4kW}U6Mf1YZ7V_XAFHC|y_9yC9omtpxX$esq z&mD!NO5c~)ryM~SdlqG5eW`_cQC-x;@mENybOVU4TA6Qkj}ctpZ+#Y7YGF>@sF#YC zl)o<6fO%32J;TcNlX=g{&s<5|S$Yc&c9ozjvTVzHuseVD8jIF&FBAEK|9D zrAj-6Y6DZgB-rkht(XJVMa`BK=ni4JAjQ5VTb?eB1#0%GKz9VuRa4P3gg%S;HDawq zEv&^@-V;AR(}T~?bm8+eu!CivpW*j~h18fSPzx0%Q3WgbEHS3iKYkNufV!XqU(jMo z)Iz1{R7t-wr$0j{NxQ#RQ{>ZQntC>8UerRbImFAVw+`3)supJi<3KgIbA|3v{G~hg zEtvw2H`EWu8){jCMHMg~{C&NUROPjZ<|T|bc!vx~LJ6_AQ7_DwTG*$lK5D69 z%ANJMWD3+mg&h?t;O~}&)QTxk3l;WNsE{nD;K~%Jg$jqL0z9|eA{~B31b3)5I9#<@ zw+QaXQmDAXx#%jC1aAJwl&FPDCn_w<1GzS7%@nAG3g;?RSPD~`kldL9wNT-TOkt_& zR<)rWl!&xp3e-Y{TQY@m`o$x;h_+`6)Ix;^Q~_7GS*lmK@>jgQm;$v>;VD%x(B=#V zsBVkKay_d9Q=k?qyrv3xUyX9&P*tuL-b{g7sPKU*z@=%8%k;O@a-rusG7oB@$5-NE zm7&jNlxT8^QeCd@6Ij_@g)+eUwknLJRp9%Gm;@zDu&IANW;FzhDj{nzog%>!nAnA6 zdH$w(;^+hUkUJs6enB5c1j@xjnOZpdP<_{CFM!aU=EkSFytU{#1}>HInB)jd;hgVtn#pEle#aAqU+F&%CrN zaoQhgp8$ZRPRxT^=uwN-(?kP)MN<{}fIjqrYQ#hE#Fn9aY#D0dtVBJLWdScCsmjBO z<}pBv8*o$)?yaNE={$jZ>s;04QusSeJ0)Eo1-Avde5%BKO%hkW-GOvr%lI(nEZaM zflNDyYR}c<=EC`#NLrn%Sps(jgLCDoSD|Mg)g^feD%gvuuO+kUfkjo2h2N$U5@jmp z*F#npIHQsGD6cNm19kD5vXE41_odqST@TPE_aT8ga8M`tNMJ9Z-gxX&3+qMefO%}f zBJ)XAJ`sFAlp?f+Vm+xJwhCi;p4b~GAL~smtT**UR$X`rNmU-HG>;q|E(fC73!+KRMWL5e!CnHcf&%JN z1&k-PEWx4*$QmuzJ5=SB!ABNiiY*9vVC%`}QC@v$9;k0A*Gp98F-kcP{;2x9n4x}7 z1$m6;^MFRjI+W4JUO`KySR2|VsQp-O#iXhZQ+Rz4f+Un1dmv?F-=G%eMRifLGgA1Z zN_QsFCG&PUYq^7RHSYp8z3xCQ%yk}7FtdQ?uFcRb)-F<9*|!4*_Cwi~%Mo%t!jI`u z3-y-J5|z1DGeOR)EAyfjdaWQ{k^x*FE>a{FxpA!rh*HEYTsSvJN4RBy8{i$_M>>Py zZvYp`#c~N?4F)6u-X(Gpco)G%b8(!Mivl|ZkO&3Lfs27`61f4~K=6tHo+Vcw{#kMj zIh zsBbKkE3VwKlx6*QB@#hhBS=(INXw{>jxy`NE71Umd=&h{D1}3>i3KaIoJf_&{r@SQ z>R8E_DFtfqU-hL}=+h!NipuNJ^85e0QebaRhd!MOtyNx0%5wg@(xgB{;<+R^vat84 zZlAK8|FSfL$km1lT1b;fO5=*+riqp7wkyI>+6~%Fb zMerv_|$AO^5~~F;dLMCPci563mI3XoAF(HNP(kVDRQX+~- z438J5#DqsA#wSU{DY%d95;8~$XE`K@;>BE&BsM-)8ao(7)5NjSF(69C{b4V3?Zngs zDK}t+bF4 zjGJb-apAgphC1V>8E#y-_}B!fT{@SNB$A|vxkRcjNtBADSm=}pQJk2QiqpLk6D6=B zO^6f&S1J)FL`!2xm0+JVRU!_DI3=V+K@qrku~ZZn7aP%06d_HNaFWE-=$Hfu0{0n-Y+Fd9FZC)5@e#|5+TlV`S5JPS)ltcp0Fn( zPArl{B#NZGFniAmP zBuXWTNkdrCWKghh6v!aKFESRINJ5V5R0+%ovGHPZD8`GTJI2PrD1rwTZ>32@Ng*6= zL%9@Dd{P|jO-W3ZK$LN~kn#r*92c=Esa(=VqxTj`0=r#N4ij!#E6KvR4j@B z2yEfKC@v{R)D=grfI!cnZr*U@hjiiE`+56!;K)9&R4E+zTx4SEfH-jov`l1~(FzI` z!XIw3QW+eN1FXAjJQR9-8Cbr9m)SKqF)kH`&N4FC{mNiMIKmai zEm_ub{i=+otli7(kZXQAeUQP~kB*8sPD5{kFmj%up~1fGyM=m(aA3g9ej!hU0{Zrf?M(nO4C=AY5*khp;ah~Bs#0thyfEyB(IG7t6C6aJM z6JRLh5+%}@#AxWRaFlWB(51N{xQW0)8-!u7NQspW;UZ%tD3+K26J`=-4?|m`l!JL7 z8t2FavBV4JD9?mwm_ZU@s+D^i5fd9136ltn^(iq>Xqbc|V5XD6`8!S{adh&5CX&Ra zlhDVJNijSrH6cQp3i*-uEEwU@NvYwn31sMkX&Poi7+jzTNvTrI8UJ9hB}s|AvY)TN zH%yHoq27U3$`EW^RnX-I6cyqNbbctnW`x@CA%S-=PQqUDhl4%| zevoMj4FXxC@XL>GDRAV%aKgV07AL1d8%6$~Tv`f;iwSu71y4%pWhOj9$4fo*L>8By z5#)51UJ$Y5hQU9)@MJ|!<^PFEFHtG$;i)m6tmB0+d_{v^8~A6*HHC{&a90%_cr1x+ z3TJJbV(n&$Th1D)4=Xl!i#U73**Y|$Jf3VDDHuajc?&twT$Csd)GRfeq<;QT+dvOs&c4czbq&JW^&_%+9?qV%leo_s7B?)iBI9^iqDw5I_$2?&v zN%sj$Rib4rw=c{#5=t*yX;Ol!>4plibs9g7@bYEnCWXC<1!JQ>b!BfATo}q`JJq`t z7E)ADF*le~RKdc;LiY*p6!H*2`PG&xDf!8W?w3atBo&KBrz+k>Si1ZJpRBC-0+(HO z$-$~4rkJ(LnVV`TE|7U$rCI(Tib-aC^n;GBn5)v1OVt%ga`P_TEe9y%Dv$p~^klO( zk(IsWS5MY5L?Ii+(#fWHS~!I@7lq0$yeKNvT}fN2u+Sr9d(ILDBFnxoJ;6y_ER0EX zB%n&d90c#eIBQ`dqVKS=Yaa zZU*pg=;TOu(0P@&h3S*NC6hii>4ZsbKI*&{nONx#*+fd;(*+36qoJicUJ$z{eUL(A~_Tv7OcH~M&_>`88 z7ya2i~%j`)c)P-*S7WrjxXl5Z+7{}m$l~AM~C0nnc|$? z-u&Csy!qc>^ziKIUEk{VTIuywZ3mg^y$`x84h>n^vBs=5Ex$i*qV|D{oc*w%o!0YD z-7~(26rMYnx459xwARbxl{!X$e6}yc)n(GSCAD?WCN$gA?b8WY{Z2k7dM$r^DfgFs zuI-_FX>RA9zFp-Lx$mUe?9P$-+b=Kf6Lfgzx3NiiYi*Xbc5E=sBa?!&!1;Z_MU9?PH>? zvvZ!e7}5Fryh(ayC+=(sj$U-~ae94o!{7_!+O6ujqQk>BKUY{rw~ibcquE%u=B2Q( zUdBJ(6gW7$yzue(dhA0zPu=N#>{|bEIz8n5sm(9uJa7Hyy^*P%=DD-y3p&qepVj1O z=8n&QMvR|0f8l34?)SmNwWK{7kGAsvR^|QiT;2VS!%rQ~$mlrf#P&_bJ%`+t-3fdEG6ey?lms1lBVQj2jzrLay%T?Jg!RYkwh+V{bZx#kC%PQ z?!T+i(G^mseLfzAtK5b^{HfEUXxECUms;yK#%w9Hnm?}~eeZ$hCu*KkTN>W9@N8SN z$=0X89q&+G>O5DhJL39Q-GR%k&NV!GTg&Cfq@wN-6S|veytQ8Va@oW=v-Wz;A6IQu z%m-KT(>B>3n%jmA2sxde|3DN_Iy7-_so66V9}1TEsnI?*gVnL$!XeSgB2b74C$C;(Pd?Bk1rD2 z))B2QpIJG+$;AOvMxR*Kci5%(<3n0EvU#=H`qryyy?oURJ&pE1$Z|bm+<#QJ>M`*b zTkD(;v2E-gkh>v!>mPxjIQ1KX0=m2Z-w3*XKNMm zj9XUgTY>JI9V?!vf3e-1ksW+oee#I))ip<_)~`7r_FM8*QNCZn@@mb$b{gF!=uVG$ zy<@w*KQ}mf|3c}~Rx|z5yUjm&uGd`e4z)^3x(@o8HgsN0#6iuj)#eNjGx+j#&ffiY zUUlyWYIw%)={alRMR%=nr`I*~%@4Z&uFG1>N$30e#IDy_8Z~p0*mYg@z44ZpM0+x~ ze_hnR%H(fuBka!Ix{~?5Pf;sx``A^Qt=A>Q_ua8#PpPqaW2Zx7XJ4H%H7>jn_qD+l zpTsY7bTTgNnwDjrR&5+Nv!vGZc1|rS*NyZWJY{&)j}~e@bf>>ta_`90ZFcA1g%qW> z+ZDWHW1o?;GEQBoubF9}=hvj;jHAi6@hu&SqaKXE)v^D^&`skE`)P>>y|bBSt$X49 zoIf|mzO!jL=HY`2z1-gke{=WlSoE@>S(`HryFPRO?vQ)DYge;fXFPT;ne9H+Env_5 zN`3ZDEt>IKzxtnx+^SzsYqe}>QE6}Gf=RU=OkGwbXz7@e+!^ye>%EUWv@d|TrDZnAyRw>^(GH~V7VugR+hR~JRs+J0!xVeU(4zYLwWSzW&6zaLrU zedX&v9n?xU-W#o>K5o?4pEg>ncCP3#v$%KjCqBO~e&1T^XMeqAq{rsnLq7jlwp_F< zW68RmZiiz1MKPM^8?RhqRJXYF!xR6Z$G;B9ZSI+W;QeXy*gNTJp{+l~`$_*i4ZU-u z?G4w2Z`rTzcgS{X)@}Bs(Tn5kFWQ{{yyAS)gs(NmYUIKSmsOhMka{E->Aj&=Iv z5wLJ(&FXq*hW1Xp9Di(P$FDkeKCW-PE^qj=EJWN-t5dI6ckOR_@7-{7iQ`RM|7n_? zYd?Rkf4ugOA43xFUGqMbG<;s`fkPMS_p7?t<4;o`*AdHS4WBaR!NJ-y&5Q51sx)|$ z^yDu8jAu5@)_=?S?vp*qY0$09TVg)H5)WOS(LcE5(!MWFb^W4uA#hG(^W35vnSRv_ zIv?0zyYpdbr_B?lxUX6CDJAOF=uF%D2PSTt`07rxF4sSXer{dw#nxSeg2U^_rGDt0 zzVJZih6gYGHP-d55#g|O#tw6v^W$9Z#(wVkYUFBzvGadk+&SfI4@WC~)6>olHvKZ& zqzzv;);iAT{+hTsHATj|D}9`_sZ&CqgEPKw?bv3y=h7R88jD<81=jaU>i7QMne49D z#{c>7RX?*!#@Z&qYwvu`-I@Gs<@Ba6r*XSRzMmTBG3m-8>uEE)y4k5^UHtevf5t$o z+$*j#GffbY3^N`-1TH4MvQ1dT8$2$zXnx z*)q#Cv+S?yexErwI$_MnHaSMa{6CqLtUEKOx6dIn>Aq%dMJ5MEX)Wkv*5KNs*>SJW zt*?>QK{6-6zU>>wewtO)a}RdTXuWe-?Wztg*N>jp>lhW~J+36}&*h#ggY$f@9h#DT zwQiHnTHY?3&WqB_#wFIS6ec?NXW`c=x<@v9pGg{+Ja0w7!)~UcCkHuPZyV2J2`Va{xOSKNsvRwi%>!#X zG(G%es-4NCYw=rNkMG>1NB35VM<0Ig7%3W4z32EQjV??K{QBlq!pNOJhfdb0e#~rD z?k1ljc3b0X1q|L+#a3d_qh!h~E+MW1cii=~;J-k<@ZR#-->a=RI`(U{%al9wFOO`X z7Qfym>%3mC#N^cDQL`_M}U~`}Ko=4}AYH%l6*;BV*pp``W`W zLciVPhTO1-3m32IWG{=3ubr`CQSHkIg!kF~BKv%NF{oR4?@#St*)8Qq=ulz*1s(y0t*#*M>lMiOMafp7Tl{~A~^|ZCqjp7T9y4tpl zACTiVwPM3;l4=FH*URrL#t7Pm;3h|<-E9FrH7{sMjj1o;oN=8Rn76S z^SUR9!ygnCoH&`^(ztP)R)NW&yruKG}R)67rwO1~Wj|KEA>ha8d zNS2MRTjle)-DgD&FKQXOKW(CSnyX}3QewK^zV)@He7?0p|4Q!BT&FQU+pAtNKh^Z= z?@PUwopI=~VM17~rgPo)9N3}}b-#&e;%MWM)ePGl6pz@H-o0O!z>TK+S4R~0&VT<- z8ha&SaJ)~1bh_xf#(3T08ST`pw;qYKJFqt6xnsMfRZ<$4PMs9|+*-)b?O56oJ;{7s z;k{u>Qn$sod+eI~d(8R9iyi0o+F7%O_NDPvHYNw#4&QyZ;hMpF9eYhQnx=Ivt8s4a zw{5GOzo6b`sObQKua+=qj?Mg6m9sA8ezbdZrRj@Pix*l2zKa(1sx;lK(mE&8l;3yP z%xKY6;AdV`J2@lS^H7BK$M<_(hF3Xcx_$J(9pBSd8IH^oiEj-#Qh2NMNM6{L7Y*C4 z9+elaZt1P1=U(`s&&{~r+w-)mh#%N)+3cql(PP9?qm$Qam(&S8b1A`jx2Sv7qOD$E zj_s^Eztw}pHo=2C6~7Rl-+$g>c#S7nRi{?_YWOR5Vl#c4KF--=zQ4}AFWNKXxl5BD z3*NR~mUC>hxl#33Dek_iZG88kCzeAiSx*^qYREYul@*B&YW~G@hQ2(WQ2#*P(j4 zenS8Md~x)%RTlf2d0N!bnD)zaX`AO~8|7b{J2Nckp3jsTn@iWu9P_eYWp1H)%=M?X zF9&!D`$xvy8NTr2o{<{r&L2l;D zY;O!6cc$xGKkqG`+j}i4+R-_;)|-qm2P1~ZHklAz-0;)l&!=n~+ys;eC$?=cj=?MXSbq85C4UuSX4`KZOnK*`md)Z%Zz%nfof!ZrFw1A5LYc51N_f zJ4La_1PuRwp^aqTJ3Tj;yG%vT%R)m(ko%<5AX#C{g)Q>1Yx z{Oo~~bDr*ud^`Pt-uJiLQ#+k|;XY}go5zQ<{YSoSJ#+O?X+h+WvhTH*Y5$I@F}$bt z)*a{iNh7voB?Jc+?YeGSY5bs+I!nDC3j0IrTnZh-`SlX=J74*}uc+4BZGztBf-WVa ztWP{C`@THA4{fr0S*&#^7Wj8|=eZtR+~lIbcP?nS^;uTNAe@nY+*UYde?QzcJUIM>td$paB*0FH=FGHcdZcWuG)E@U`xWE^V|I00# zT)*wt_|wg#XFEG)>DjJ%Ki8>tNM!M(f%7zWT4lNY*LWxgmjr*xyD#k?9e5{ZzMlWJK6?t%l6q&abu{q}x3BkW-0>%F8><-iNldjg&NVVs?^mbY z$-W_6rb+Z!>zH>_RvqlyD(r@_Td~2i{KZ-YS2sS2T4Qn3Y{})OCTDE!t$#k+qSDmY zb?0643odM&sD0HpZ>rYdR+FV(A4U$pF6y`8^egwgIV1KNJv+W;bfNu;F>NA^+RoGa z-1?V_3j9oA3h1Y+-#e+HH6KyAqEEIW8^2w33>;G}F-4w=Z!1 zk>Ky>k+7+rm#|)uHVS{&+apUVtj8vPn(dNdrtKu?Z+xX@aOHsKQ{lakUq(a2D@Q7g zY9Xv|?lqa}JEPJg8^7cW`?4Rkwx6@3VWUM&Yv;|K^6Xl-ttXB~{g~PK%JY7!lB$f# z{~pr*wy^%$(fRz@&@i1aL0>3;i&1%6l^VR+WL5E<2Wv*!?c`%F>zYLmo|Q{N~|!%re?^idt z!GaHG^@RP`Ck*^)GwYiD4gxRu}fqDtT+QZf=$B!h4&3x~F=W z&w8?G;p*F)gBlv?4a={SSdcJP$X_brah6+I?K9>(}bOMd#Lg+JE(Q_%w3fYd4#<`yXTs9XNBIZpLGw zJUt_`E5Eqa+{z}W!PFaTMzsnV-K9@==kV`$?|d<+KQSP(_o;Nv2YurPkKEKGN;f7W zr)?XPd7*};Cd>DaoPY9k9apE3wZ?l;O{Rj`K1w{qy!{%s{(d`yXnF?a%5AYPv4d_4M};^YNN{=Ptck{IQX3 zv+4`ZwJ@n4wBc29pHJJ(9bXIeAA9a=>7kD=n+W>V#&o@OrO=^6bIJInxg)<;d69f< z?%w>#%a#m@Ezv!3>%fKy=U<40H0irI z`$Fd-I!?V~vQPU5mWua>jUJ@`WK7f7m5!|$daLTJincLHum`O|e(-2Kzs8OFOMDaJhGX zRjm1}k5jV7g$-|>w5iA9iRrIuSUDNpj{3e*W6hc8`gV~GL)5Yh&Y$fS9~txAe@4%a z&bw@fOD5jm@2Ghv{aO`|2O`b;6Dvd--(mA}l_ zzvGzOv)ZQ@Q6)j2=J!?0J6oC@cXVIpN}hH_yTTgWKPUNFBg4@vyqd9v=KTz-F59_F z?niqC=y#MX)G&NCx`Wno&C#bDUwxH&LuXBkZ%czM*4F5S`m>rlWVvwpcxv)gRE++%m} zlUt<=zi#P1DCO~)b&;ZdBkaN!R!*Py>+O$}-3e1h?&`PlV{@*Beb(=k;;hg0{dI;| zdT;tLxNY*fS%hbos(ln$eX1SIWZP>W_`@WAu zUfLeM>UcBQvu=ZyYJ+>!ny{i~jdd5c9}_Px9aH<4s7Cx-c(Ov>``wp4T{%6`cI+XC z>wcLZ2Y-J#ru#MRn)Sm{4!UQkiFXX0*37w)=9!_|t{*?vT-Zl4uAp~o|0|=%o%S;I zwV(Cz_R+Ui2j6wwzyHHf^)UnHjhsAQcl!p@v^g268}Gl(?iUlAfAocmXM@J$S8UzAqD8`a*s z<>xOy_I;b#x9^GtSMp37N%|Ih4BxTxXI1mzUVZ+2^q#r3v$47N>e4|UE>xZFYN_j; z)>G?|MbyALyYy-vY14G^s_%{-g&Hefy=Ys!*Wk0~{ZEe*)i#-&%xQT$>+I71r=fMuSETMfDo%v;~6=8&}XPFwvO-DtP?^+ENQiIY2j znLMh;=?JY;`@CikuY5bA=Yo$BeSHqjX!(72s(Y^mfj5@^Tz6@XPECsk^#d-x?|AL2 z^Odf%Kh~9bjAGhts0GAw_tQ`-!CwglRY;*hPPrA>Y)8I?-^Ty(1wQgTrroYlfHfiy<8-rhdUEp@4u3v7e`B7mJ zQt4ci8#*;3THe19W*9Q4>VB<>w)TcAay3$awjG%ICTUxFb1Pa4db@L}Sfw&A}ns6Rg-X_TLFJUwP*ak6f# zTbF~H)i!HMM$PVQlwz=I=3TqlZ3~jk`kwrmQ@4(KK;ecbAN`|Cf}VV_(CqEdan&xT z-UcDgF?}=V9?IQ*^Ky+r>XkaIo6*~DbdOat&-84wam$zw(p7`c)wc6MotpF3AGf|=EZXZ-ko|W0pr3c1gazKdFmu`+$4s|_-7cAh z%*ZzNe=yg?Ec9c|71bM0l{(Gy|L*3e-XSirWyzTf^-czgex7`~wdosac0W%i&uZ^t z*7vk7NpVT@Tjku=r`?z7gVN7Wf3dW2^5(m16UP6sPMjG0!9h1!(naH3mv#P+PT2Vd zWqw}SRoX$%`RI>p*>4w*>r>}dlYUEkcl6vpwM)r)m-*(Q{d;{r6@M$;s$`S-P@lHr zT93+DRp&;XLEa+{1T}NeJozPbS*t~fwf;OZ=4xEng=&E zY2P`_@!7I3tH1Tm89nrsqt_SPch_d`n>qjK0ksXEBg`}3&5L_KYUt-*Uz@))a`o0- znPGTqP}Y|Imix`qmuJ6x6l~VyT>SDt*K1Ets$XjwuuHeF&D6G;*K0j`=&;|na?ip2 z+IVzn(|m~9wKGO%bPR)cburx6e!AnLn7YrJ{CcqEp|#lN<`3t4?Y4}%S+sn6$781_ z>@hfSZg=<-+aE{zXAV95dB(d)8&UdzotM26&b#MbPqyqkRsYNC*54+=fz+5;VL^ zzgu0iGjEOCwfvKr>&BIJJU2)tEpJsarki(Xzb*PE;}W-DH5rrrshYL*h3<2UmpcwS zY&o$=J?PZ0m~A6YT-9}GGmR)ixr=e-&=bm>l9A7)2xMct4~!+CRFJ==tHNMyZRedZlE#y^4zmA zi`Gxu;ySbHm++2tFTd`wW5C0(8>>wRj;>|UzmrYBERR3#$0syh8eBPViI8zS{8@!V zY~<*1mDNg1@khk%qQoMpL(`@?YHA~S1is7V5FZKq;Gq$O;{ab|jgZ1uY9Xn?OIS_~Vi#qG~t%q-MmgSIgtM!Hbm=3K^ z+^Nig-%*232)JTi-p5)lQ|91zZ`9TBMq*ep4@=LR${e`S3~*M14zl|XiVs)jkf^DJ zA`@QMhjjrZZe(C;ooDGIoK=I)vREP zY1j54&=zH5XaIX;I(JI8PF3dMJx0~l=p(h@u{;ss@C*2|I!1&u7q%Fm4_w1<${hUR zyt-O{*rNACpLP$GIVOZ7#HY1;lC3faA5^TaW)E9T%RWvRqs+kvBCD&N!Y#aJX@7>J zu56i23Fj(ov1gBKAxc!{m=TWfkXbM3uuNr+IpH|L7L$WcB`;-8E!d;3=13Uu2+viM zHY#)QrW5LFez3(}J3gV-V`UDOL|ttQZ1K2QQqr`eG6!$aqpr3c2-qrV*;=iYIdutV z32ZTW`)`L%S2jMDut#>h+n3&ds?4z>oL1nf3)ZpS-x?}&tO*BehdH!5{|2g9HZL2( z5ylqPdDSDF{;7i(j8N;68CV@Ei*;4s5}I4O3Dr!uDz;bg-W)04dPHp(0r0x&Pa zfX9WcXt`XOgGYqySU%Gu4{|LV=O%>H2eugNwk=!HPGs3|( z#WB3rj6D#lvU#}>&ScnPUhijKgoB_gr#ayqge~eke>H!)GN%RM^u{f`N;YqPq|9ka zICViD`S{WW5tg}COAiP}*)qEk&RE>SOZ;_! zit!MJ0MHRQ9y;?>l*gTLgt7O+%NHt+9q5{%(+$durO0q-^c2i%8b_zYppG?^Uz2no9DHCS_I_*kL4B1u-h_jXg~VCv*-uv$$6!ao z*$!JM66esq^qaDd58J|+*xgf-v2J}Pr?=2BN%0$cRvMrh4d=D<)3oU4!# z*6V=wiwnvef5O2BFJrrFO%|!p2_T$o(1D4IOD>qST3IKMaPS6_wZTf7t!<~w2_l>$ zu*JH2*KPMwnG;Mng*<2Cj}wr2+4zJI4nEQaN9u@AXY!Oep@dTiTg>Z&{>Y!ooNk1J zeHH7~Y~qb}${d*XAcpwBL1wzPcIRgpj2y8L0H%D&YROZ0Y2IW}{glb?JKe+-G zg$gK)&v6Qz-(yXxDs$oq2OqIqAFS!qHo-7lRwsdQ@X-o** z-#xb+lsQtu!N+-F-za_Gx=5J=haAMY5Vn}t%B^`*lsSV5Cyvi+#hOjfBxPfmMmXzW zi+fJojM}BlNhh3Ru*JNREbFgV<_sYmd>kppIV}wz09-b&p@f4sSH`-V&zhv7|G@GB z>V*$DhJ%m$aj%+-vd%EVDTFPS$1(TOOl3|c;oyUKaa`56kI_};3@02l;6QfVo}D*7 zDsx5<&O6v*UMnmDe3UsO2?rn1f_d$As{@^-Y~4o@P9bbj=V5wn72|Uj;Rt=h_VA6J z$~vP7hm7Q4+362-R_2UR;Pe~fY^KZ^OE{Bo3$L2_wISSP%RG*7y22JyhrsY_${ZMy zpuJ!aB=!2F@3CB&GvO~daHxPzBizEP!EMts$~qGX2agV%n@)c?qoO~P8nNp(cZW$- z92b*`4jkkpNwy#Fshk(ML3yN_v_HRp+H!$1XDZ>~gF)s&=*BdBw^f-ljd1W*tH_w|ZbLJ8b-iomvSZlhBzOT%gM>zOE4nwf^j5!Hiq-?!l%7?n! z0SCv`7yE7CKq5-5)MAB0mre9U4q?}Ig1DfZ#ta~V&@CNc0V6Cd%YPYh^TEaOFIpDEVx=2(*nX`^?u+=a=u4z+M^!fFKV*_K0 z8(5X@j__30*+4k3I3VX%?fdn8t<2d-IMDgXTJ+6juAMSx6XA@3Etbba>NioDvzc&& zG7l^ny+@g|g>dju1$dnLgsxIC_HHE{eEdfPu%bU%zgO1TMmTtLR|p<==i5$Tmu;`@ zgwp}GK;zB?wuR!OC4Y{Oqm#N?8`xsf>f``jzpTzq*rN`QaH7en=KUec99ZrE2f7AH z?XPqQR^~ug08TQrJM!+ve!Zm3fsg^`5EKErG*`nZI76AUmvF8E2iw9)+u@foXCL9f z!9Z$k;kE(dQ?~B=2`8H8yfJi!&Vn3F&h!s#EqSafkF;Y*FCJ;nkbykn%8*PRX~~e; zJYvBRJRUIBWeAoY(-elBrU1FqEG;7}B1poUeo&;CN7^z(SB*l|8Dh;NnhbI05p9Na z;}I=}B=U#{L&oq(ZHD07jmd~1Yj{M5A;)<{mmyDhqz*%V@#tE#3OKT0X||WJTi$P<9TE>Ll*GJSca_U5fg?K@JI`WT;dUThCJet zF$^i;k*W;AaUPRCLmKjk9znv>@U|%uDP>_T;Lc4EF%tTo_EkXSAf5wY8BRn>QUVY0 zoP>z@q_Rj79O@(q5$nj8r!p&H1dq_%qaxrga$??zaH0~E;C4nrLY*jySQIG$l#?PB z4^lwzjqE|p#4Ak_D^*ZNPNqWch|J=VDpVP6>yjXi!X4apR_1&quRT1npKwwVWN!PY zjzrAzrZt5-3dSWy5MkJ03E{>^G$R7?NUXqMoVYj!AqUeDKKEUqL(OwMvYR1zJq42` zL*DR+4MR$K#F!y^Fxq0WVn{t6v1W(|k9aX8kVk4V1lI$YS}`PpM|4@yG~Rq z+~tvO48e!^VCu^dJv=ReG?*dvc_fn|9e5;*A$@oxg&`?C(vu;xd88jhw(&?8hFsv0 z?hJX&BVi1wq(e)X$dFn*GK3*6JR)Lzrr+-A+>lUnIXlbna7YfJhF))8O{6ByEvN3t2xo=3Jaq(6_$ zWQc@ERx@M*kE~$GJRX_NkS#niiy=pOWI01_@yKF^yylTD3@PQ2^$e-bpEz!0NFyHE zz>uyyvWg)QJd($dEFPJ`kUSol&X9vVlEaXzJhFx%FL-1nL%#FKT88Mtm0nEK7-GpI za~RT$N0u_gn@6@Wq!*7YVn{5H%w@<(9^n9?$If&GBwidJ!ItWT14w)#{pux@5xoGx z`)~3Ik$QgqE-m@@?clElBFzP)y@0f8#dBN*#6>teMlSWjef^0-3ZSH>PECQd3*I3@>*eGG-(gThpsL3d5vbT%dBnLT zaC#~zJA)3cyk*MHz!{{7fR02Ffp83wN1CV+|E2QLqJk@z6M)#4Gt!6xOb34UYI*WoKOREX9(#n!vHaY7vJt+S@Q@j4~7{diX4hy zBZ);MPF%M#DHS%L~zK@;-#h4|l<6$RjS; zGpEA~IW($R(*yEIbL1SCN1SoGGKOv`rwsMdV+fGB?NAFtC?QiO5i^lToUj%(BW zIC$1G9hmi;v51r95ho|8*Is!qCk(v})Scz!|Tm~y3Sf1VRLOrU32+p~vCqoM0 z9gfNrL3R?nph;+X&>)|xqCq(5PDXx)V6&4En;~St_5_q6P;+>2q&z~#!*22jnNz|Q z5Eo!sLT`x&l*Fewj>aYMLWGtF>s1-rLWW>{j1>^9S3Ly;OXi}0V8uEpAXu?bd4#Oc z;sC`wNqJC)dBjFXGjzC5Z>eO%)Il)ei8k3A|)c#n}}RS($C*5u$=?3C1B&b(BX)RIyzd z2P;ZuX@-zBwjZDl@KVej5n1k*Jcl48_xkb($sK2D=0$SH7%_z8jxa+=o8tOWhG3ia zgx5rPDV7HjS$S}TU)`=mcJXm*zkn-T_l_8`&-tq`3Pgey5%Y&^`4_=DpK}1#_ zY#oNM)?oOXuc=~1P_C=+IUvWmj|a5E+58lL`ZpXO5xVXBRCCm zTNDr+3-%}=*i#NEAQ<^m@`y8bR(M9OEO&C`R)RT&9+7@ynnNK1^*Lj?p&_(B1}6251ML%QrY zkGQ^(eYSqE=bumQ$VwAn?y3Q9=^99#b4ZeT;asS$hHF$1<<9mRK1t^Fg7+dEPChT3 zFV)p*!xq!1tY7onv%G%tUWB8NS0Qj^dG-C+$w}sAY=}x6R|qdCpg2uC5W^9p%A?_FI-=CzRbA{>RhE)XxFAO6&nrpdex@?M0a zkk>_pyr%5E*jDCM#Cs8rLSB~?>a}3k3~!lNB|fx-qmb8Sg}kz2zHF9x)#JSgM)3)Ws8c`w3I$m=Te!rq%X#PylXYXI*>I0|`PBVM>0y&inoa!}@#$$Jrw zLSEO2m(b_c8x0&N^P10l5spG$H;5OGhnQERMB7?2uU)(s;V9&FQz0+Is2QJRURQZ9 z!coZU7V#4L#{0rHS7cuQ)7yE6Sy3#1e-$IBm=zHPMN||?%L1Zua!vwfbX}HRSlIv@ zNah4yvnWQ)SurAlh@vQB!Yq0Xc+CmK>_rT}s+#JqsdHwQ`~KlO&vW?&_YN z?w&d4{J<1xl-GO8>&GX{UD4QPCrE^YG|KCJIP2U~uwIv4-dHJK2QWn%<@EtkCWa5i zYX2ovf+^A{uMdgZ75?H88T0VGi)`PhVTv@$YZYkaTK??jC)Nmc3R9#}ULO&)1scI| zQqPN*?QgwiF-02X^&ilR*Zlt5Jt)-eOp!);eN2?;8z&aFJy@s(Op!);eWJXUJ@Znd zP%kk>8s+sVQQh$`{O`KsF3t$`5mTg5UY`+V+H3TM-7XdCC#FcFygnxi+Y7z!`>3LW zP@C@zr{Exs^7;bKN(_J7drDHMu1t|ed3{NgiQ)Z2@7zbIzD$uud3~k4x;*#bZbF5b zB8~F;nkZARO?tI;7V0RbNTa;IQC%*a+KeBlzDPCmi+8 zVYXfsOp!);{YaGQ^C!LZ<65DPVTv@$>nEay;9vOP5A)`|CDh4Gkw$s_th_pmS+`oK z8<`@F^7@4+(>G@Hxcx|>o?(hK%IjC<)wffhaYB8?6ls*#Z$z2#u>a}j4c^?waBB=L z9HdcR|An*CH@3fK{ZgU&GDRBYwT>vP7akRx=g-;FdKH)=jq>^(wBmKk+3!6j)Fh@z zqrBD=g~`}nzyDbUFVL9l>oTTDqrCo5UfT^=aeZzSB*H-&<%JiB#PIOwed~o9#uRCk7d|0y zzV8Baz4fkt|Gb0sI-V)gD6fr`SLA`3KZI&yiZsfr15u`L+btq3z;H~^1{6~ zsn_olkL)hgLrjrId2LEmcc>Hgjh|n5$wj@*6ls*#X3FcZ11_8`UhA16jq=*u)(gFM zzILN)gzB*yoPvWi%4-Yd_3LxZhX@sCiZse=OQOuRjP2FQ#;}1Y(kQQv%Ikodk&g>? zIa8!jUY&?C<9xrT`}`o(LZ(QgytYza^ZLG1E!0O$kw$rKt-R)3_Sbx&HtXudkTl9` z8|8K9Sx$xM+(d2QE@*DXwuMtR{=DCzTa zV=cFd*9%OMMtSW(lo>acU$V)@LVeE^X_OZ}MG&v-C-+_^)GjzFgM&263!jR~e$<_3 z=GSzy{qQiRNTa-VR$fC_j^0hEQdr$u=SeD6ls*#ZY5qqy}%S{lvmdhug$F2=S-1CdF`&enr>KihEN-KbJ~kE%Bx$6 z*LK!x52i??y!KFD7hZGtHbNc76ls*#o+VzLt=I8Pkw$rSFYyv;DpRCUUOh^@4zymg zm?Dkx+N;D%sJTp$MtSXB;&p-bTE-ME-yn_h+P9=$=UT6UOp!);?Wer3ZwQrPiZse={}QjAtk+nk zNTa-Zmv{+vI#Z-kUikFd8QDw>E3DTwOp!);9cU>NL!ss|MH=PRr=(toSg)6vB8~Do zNO@rlh5DQ+(kQRKmNNA^$9nzA6ls)KKTDZ<3AM|fPTwGn^6FnwudS_DKc+~dyap&Q ztd~$Zrbwf_23pG0Ya8n|fhp1`uX0Oay$<=a{&k@)V~RA&YmlXk*H+f+QKm?vyeceZ zyoCCIDbgsf!9?La3Xd1Mb(yxQ_1dUAo`ZJ_P@}wtD6i*!>UD%rJ9Q_hj5Nw?sHITx z&cceDAF*EhF-02Xb+DzdUc0>f&V51+VTv@$YZy`PdM&nIai&P4ybe)bx7>ZudqN$< z6ls*#p+uRr!%L}^^^aSxlb9ln@;Xd;UAi{2g-|CmMH=NboG88lmkr&j=JAEr>jI`o zqr3vjtK0nfR|s_jQ>0N|K}(gvf#dv+*6Ts0NTa+$mcsUW{HAYT6KWY#q)}dBqD*@Q zfPJU1ZJI;KdYyrR|%OW5Uy*l3}4?E$CYAdT{hDX;mJi#rH4 zlqu3EuekDh@X|RQg*uig(kQQl@=8v+>v5q@W{Nb*D@l}@V;?jB+eJdnVTv@$E2X^l zzGVMjgnEK0(kQRA^4hi2`gKCBVv01%E2F#~nSI&`LjBDYX_Qx%DBhANn|9)w2g0^* zbl=NqFVZNlobn1h)%RSXhB8GO<&`H2`yuv?mFHjbuuz9HMH=N*P+pN;Pah@J1g1!% zybdSIwAb9;Qx6g9T&75)yhbRmVc%R76Y55$NTa+)s(MX-Z}hK1J;oGil-DTbHG9b$ ze+cy^Q>0N|M-XM&>xc!fFWtqq*BYisqr8q(Ub~O}x<;ri_jX#DG|KBJ<@N2F<_m{d zubxbiMtL2ryqOp!);9jm;0fA{?DLY>JJX_VJ- zM47(PcR+Aop>Af1G|FqV^7`)J`nXU}GesKZb-b+?MtN}WyI$&TWB4&sq)}ccD6jc7 z>!t|xH&dihUX|9X19-i;=#<}t+8tjLfP*y3>qO->@9xMFp@uO<8s$|*l!@Unm)!q~ zP{%Sw8s#-cd9C}g*I1#ZF-02XRZWz;&+lVncr{a`QC?$}*RQirtQYDrrbwf_YD&C% zS+9RHMH=N*tGu>fvBRc9tz(Kb%4-}^7(@6++0HNYd3&Js+I1gnEqH?jHOgze^7`nt zT@Ddy08^wucV}!Ow(BGesKZb&~QbpMPdns9L5-qr4_4uW8jk-5}JNOp!); z)hn;Mj?Y~$)EuTrqr4i3a>sCxjo|{ONTa+OmDl5|erpx#4W>w=yqZ+K-dTI|T%lGo zMH=NbQF*Oi^+`miEqXbvOd91iNqKc^*kPqmJ((hn@@iIImwbD}LqY|ZB8~EDA<7-Y z0XBxCnIetyYE@oG|8(IsLQQ3gG|H<@)vJ8zdqJTtXNok+YqIiM`~J8_p&n$4G|Fp= z^7<<0N|rzo$;`iq7MRmT)*l-H?5Vc)=G;f=d& zHN|>e#1v_i*J;WtABDbgsfbBWplix0<9>mI%_W7}&MQ>0N|GnCh-BgZ9$dWb2~D6g4B znS08)7k=`BP_HsY8s&AK@*4QBvYmxm%M@vp*T0A|ePey-hCPIWS2^e)jq*BQdF^|7 zeuz+gnIetyx>DEFuF-02XbrDe*Lp<)^dhWETw!JQ4 ziZsgWV&(PG{hh8BYCcn>QC^o=FYJeV-TT;!LcPZnX_VKc%4_M1d-W8GzHAcmB8~F8 zj40FR2S!Hs5Nf~PSXX%S3^mGYmh#%~;>+(5D$f*Yl-K1%nfc-GyYxFSXk$2;Dbgsf zE0kBoQRSV5x`rvzD6iQ>nX&hamM6~6S+B>LB8~F8QhDVLfBSQxK4pqD%IhjiVYCi; za^p{rv0fbyz;o~kYSbvNt1X4C+-1tY?-!~!Q>0N|*ARvELh7hXKdu%k$rNdn*R{&) zldqE>3Uv}wq)}eiDX*2CUYjJ;1x%4fdCgH?!|oo|AkiR52i??yly1QjE5uU?=?oK-u#LdX_VJZ%Iom!kK0|SW0@k2^17KQ zbA6q%Y1fB@I-e=hD6d?hPBrbwf_ZdLXA>+>Ia3H1$Aq)}eCDX-e{g~toE zTOa6TaF9lM-QG^UQcRIXdEKGBDz_f@tawdliZsgWPNLk`^69p3+`|-Ul-FI#YvkZ# zuN3M%rbwf_?k@2<%6e^ikP{8kD6e~zSC8vHy+x>@Op!);-K)HCAG_9ijc1B9%4@Fj zIwf5By->56B8~F8k0^6}wJr}nKE`@I%@k>r*Zs4dwTv8p^{9IMtMC%)D}*rWv>ri24AARDgRdsQ>0N|4=b7~f`iLpgD6jb?UNzQhqkc{WNu#_TRbH?C zam-0V?a35rl-B~H%-p8xg0bmw*6R?aNTa+KDlc4{3pJW4(kQRTY`yUQwaq76eJ|9> zOp!);EmB^`Jl=JnP;;0fjq-Y&sBOWA?v>>?tq|%7rbwf_7Avp$-#`A6P^*|Cjq-Ye zD0e^XZ)5m3Q>0N|Pbx2bS460u{hd}Ojq+MTl)0AQyl7oT)OsbDB8~ETN_pLQ)i>7& zHHj(GD6glL*MC1)wNb=+UBeV-9cUq)}ckmUs!Z)j%hPq)}ckDX(6; z%)a6X>jj&gbdW}Qy{xdojq+MSlwMH=Px4pHvDakTY%mMPLGuXmLf_6?!dGDRBY^>0-#?DHpBuP%d}$dg8Sy{Ek1 z=p3&V>M*8AqrBc%Uf5n~>otZc(kQPFl-G%SJ~~^d8BCEzd3{KfJBCMEue+Hdjq+Nh zymlRzeqX2+Op!);eWdDzF+9$Cea{qWl-GZh*Q?<}CJWWM!ihX-l-I{4UQO1k4^yO3 zUY{thWnYiIOQ;-Eq)}d<5@ljoH>*%F&3ZL5MH=PxnetlIaBD}QE@6r^%IkCGg>%s= z>-7Lrq)}d9D6jmZ2Oc5R>r9bGd3{OLj!uZnaDEuGUOzHL8s+ts^1|m|LhUrz$&570 z>uXytoU@&@di6q~1~Ww(<@Js7nz!`FzCs0N|tCd&3 zWxr*Fx|J!?D6cg{xnnri#&9`Pq)}eqDKDI33-t|Cq)}dLiNbzp=Ga1QHN=TLX_VLZ z%Inbi>rWP{A5)}JUOy0JVt5qHv4tAN6ls*#kIE}{##J8*HI*sSD6gN0a>sDAjo}=o zNTa-dR$lo0OQ^+6kw$s_Le#Dt!!@r?=_b_sOp!);{i?hkTeGep)E`WdMtS{4l!@UZ zUEc35RJWl{dyz(Y{a1PQIBIE&P=_%^8s)W)D0d7`u`#SJj1z*xY2WgbopG3K1DAZR>kw$s_rMxhPLUlUW@gj}#`kN?s z3@6$c9>f%Blox!NC%^5CS0%^|Pc@K2^lqr5g#Ud;zg*ioq7!<_aa zjq=)@D2yQqe$Xqr5sQFYFsa zEn|u_%Bz#D7xpL|qlEf~Dbgq}{G|^0Jkf`rcG*>^?GB+3m61kyZB3NBZwNJnDbgsf zZIss=`+ip=R3%fSQC^*iGJON*hj|;r8BCEzd2Oq_-o518_l3HHDbgsf?TB)>*9hyi zj49G6ukDo=wwF*}Fhv^WwF6P^Ygwqx4s{|=8s)X4^1^FbsQs8Cjq=)wD0h1am12rC z%4=ukh1arB^-PgQdEqaSIiCT?I{Y?w_LHqPh8HtM8s)XC^7`(=!8-^wmnqUHuP#Kn z+pEoby}%S{l-F*`3)@Smub3i@^6F~qWv(xwHapB|FVZNl-IW)%mr%W!B8~FuMwGj~ zgo-gm8s)Wz^1}8Ks+K9zD6c(jy|50rP8n%qID;wDD6j6yt9s=tmk4zSQ>0N|J&1C* z*C^|?j49G6uf3EPwwF*}Fhv^Wh2Pid^h48LLTxtOX)n?!ub#>a+e@hZm?Dkx+J`82 zdkK|diZsfrm-52)5~`jl(kQQeZN0D#xCdKlV|X!Bq)}e`DX$gRuIwVzeN2%?dF@Y> zyS+}dUN1348s*hnd0~4A^(|ARQCro*W$l-87$Q8Op!); z4JFFmUd`6)8Ky|1yzqB~rC!)xLVd~r z*P%qY+e@ejQ>0N|hbb?-zJ#h_iZse=I8nPh6)3}f(WH&x45mn0N|M-XMk4SZg?pY^()DbgsfBbC>gx1Kvvs6|YXMtL2jyxtxid!o^Ltz?Qc z%Ij$5wdjaHZxQNerbwf_jv)%$3y*ox15bX;dTkeT&XPuX9jm;$Wlr8!sDqdyjq*B< zDAVWv{-9f7k@ZS3MH=NbT6v9V>E2VQu}qOhc^yv__Kl6;e?P5%zx7({bt+S&QC=q~ zuP1NrJ5{JFnIetysO$8gl8O2j6JD4rPio%Bxm+EnhJDOQDWtiZse=98snp&J0)oe5>_pW{Nb* zYrOKhZllJrLS4WVX_QwTQRe#kYUPN+gVyU-rbwf_PEuaS-*MBgLM>s6G|Fp&rLb*A zG~9jLHP-7rrbwf_>Me!67e6;D)GthtMtL<5)e{J$uHEawzCv|Qz$rLLqr4iG*Vh%R zh6!~5Q>0N|O+=adSMKE>rU(^hiZse=qVn2t{qiQEs+l5<@|r}HxxVl-szRO46ls)K zv+_D(+Dp5G|KB-qRjnk$!^c|xz2ihz!Yhe*9_%#ZFI+#LjBDY zX_VJYqPkz!1m|wB-9M1NTa+iAj;fRURt;HjzZnY6ls*#h05!)=_{uRwTLOwD6fl% zGS~9#ySlz6)Z0vvMtNPVy!P(8-9AEn&lG8t*Cj-m>uc42Kb$L6r;O8Hq)}d%DzDFG zZTYfLy_h16^195{3-jHtd*9Gqw!MN(kw$sVQeG!)eep{|RWd~y<#oC8!tWTr-FltE z6ls*#70TExy^;*po zX_VL1%IoqAwm)2`&9hD`lSX-6LsWMsxhydD+I?=bUOkv1jqmsH|qr7fVUN619@B*RkW{Nb* z>qg~O*s)^vT0N|Hz}`S$DQ!7P#-cy8s&Af^1|zDmi79DDbgsfTa?$CL%Mx0 zRM(u-_@q%@w<@ovdoR82GV2v!iZsgWHsyuyIS5tD6ls*#?aHg+Tae;qrC1^Uf5oDTd(JsB8~F8OL=8FuenF4PnaT&^17R-E%^HCFm>4R zcUZ4KnIetyx<`4<+_LF8p?1zYnUO|$-AmMgkc@Y|d!9ZiBGf@lkw$sVRbCCFU zY~T2cDbgsfN0isCC(TF*wQIrY8>CTQ^NBM3aP$eszjTT9>dzEul-Hxm>wvELJ%!3K zMH=O`fGFIz!G8E^e!K2Mox~Jrl-EM#bzYaNe-`RIrbwf_9wVwddxgK9)lsNBm?Dkx zTBN*2re@@YdX_2DD6hv=z256Hc#=?`Fhv^WwODywee=N|2~~DD6dVrHD6c1oGV8A| zcG%}Vq4r>kG|KBqlvc9h4^AWT>itZcL?0N| z&nmAw_dodqp?+eDG|FokQRe#Ed*14uuCmwH_9L*3;qzapQC`m}FC6EE>cbRil-F{i zOy9VC#Xhw{#hD_F@_Jr*y|G}y??P2GMH=Px0#W-x=`n`KT;CcK>U5?^qr6^JUb`(F zS1#0bOp!);y`<{3{IEXjg<8NAX_VK?%4=}%3vL$bO{PeryjBp^o$D1Gd_zH~wM>yl zdA*{%s$TdhAylW4kQp4LQC_bSW%?oBzl7SCDbgsf*Ob?P@<)vjD$EpVl-KJ-x%=TQ zwjWk9MH=PxhVpuSr%kUDY8q3dQC@EnWyblR_dfN0p=L2f8s+tt@~Ydbe3(%8F-02X z^)^vvZGKK}#BM@8&lG8t*GlD8wm!e9P@ghI8s+tls@EAErmq+3FQ!PNyxvt_4{UeX zLZP~ha{2~ol-IwN*P6XM_Z6y~Dbgsf_mtPi%R~PaD$f*Yl-K)2nX$Kd`))(fMI z^Z9wU&%ehMX_VK0l-J_7KOH61uS}6fd3{Wjd9L^HI~Vr4-g<3!gwx8TQC^=Yuk+5^ z{7s?uXNok+>r+c%zPLYswe<=xMH=PxnWb>Vet-7ey@aY{iZoQ%Q{jvmEjBJYs9AnX z^mEDw^T4C){3qcroTB3q&IdJ``hqBf9@mqcyGx$k(~$|XX*#}sNb z^%YU3^q&qr@gSjoVhS~y`kJUs*sHC_bx<)lMaQ;BI{%LvO?^WYZ;6)OyY`p?Lha8K zYBcpNQ8PIAO*{8FPN<8RLXD>t(bV5WnG&w}`Q<@E-OLnfG=)?24jXO8CH(pJ zFD41Km?_j~Y9pddy~3SOdr_#jm_m)F@b|gpcf{VF`A%P<)-Z({O?4ou6PNIrM;`iG zsLfAsPNPOsn<(ne>rSW=Y9FRhqp3}aGBLbjxx1(bfQ>f9@Rz#UrerW!&JB!zUnL>@GwkE18=N@~t zL!D4N!|06%YBaSCQM)+FW%sWgmk}z;6lyfpnJ5#(_iyO-r%)4_LXD=jCCb$6rjAG4 zE!0e=P@}2sh%%8seAxM}yTk2Fp+-~N69u<$Ij;2MpL^IWm@^(6ZU|)lcDOFLXD=n5M@d@e_7i~q0VLs zHJaK@d0qI+pmT(p!xU;X)m2d|o;~P#q2@7#8cpr4sE#9=Ts`VVrck4)Zi;$h(l!tn z6OE6VLXD>OP}CoRonYx>sQ)sB8cpq~s9`Hd!K&F%ouQxLff`M9C(6vskG`h7O{iW> zp+-|Z6gBwNCF6uTgelZ$YA>QpD^Fgy-ZcV@U@GdMU3DUVRy!37W_+Uy+P_LXD;lBg)jPEwkRj{QN0~y6rozhWi{PLU;@GVnms{L$Gx?tQSn=4`&KBnu-%;B7eiM zMGJ+R&J=1il_1L0>z3TofKWFwg&IvIi8B50;^!y3?t06ZLXDi)pAv{277g&Iv2h%)UJsfC}VvR>aZg&IvAPLx?Y+;etj zics5)cVdVdO^qOG6DPUsv_tM)B2-_dP@}1lM46dh*`A%_LPeQEjiyEs)semGw?Egl zPC1b&)M)AmMOEIr{g2{x3R9@j)R9DO#$HpVKL4grS2KkgO&z7E2fzE*9HAa$3N@NK zny4+Uiy;GlcqtDb#4{SfWfn?0Qrj1|HK7*E5A0O&v#+ z8KY)CkaFt}Bi`Pn~P@}0TqD*^*!uUp( ziTsaDp+-|%98R8A45E3N@Mf7p9?jYDb#3c zJW(*cqvPo71K$Ys7E`FvR2@-f6kXfW^>?AlCOCPaMpGvdW#*z)^XB|Zs9sE=MpF}r zGJAT5gx*;tRDmhfXsVtlb5%xreOoKk=}e(UQw>C!7+&?&0aJy#iz(D-s*$MfPPNN^ zsGi$fsMnZ6ji#E2GV}Qd)?ObGYLj{=Gt_8mB2i|=aqlBvxk@;IDb#3clA@;8;;+$} z>#LF})M%=iD05W~T(=q~5r(>uDb#4Hg{V#(jX%0}ncN)6G7Bokml_|1gCbO-&}MBbRXg&68di>My2Hqp2xGZNb#5JKS@TP`foar%|J+ zsYIC=wq3o;fkKrtg&IvwBg%|yFU)_^b%)I|g&IvwC(1;A_dk0L6tA&Np+-|DE9$t; zd$`8=vzS7SrcNPhD~?9sm9;O4*G){JMpLH}Wuo!z$9ub0zDt-wjiyc`%8XHO9rwyD z;`J_5sL|Bv%ImV%k9b9>O&XnoqefF_5Va-OYxFk_YlZ5@6lyeeCQ)YG*!Y9bp^By- z4q*y4nmUUp6T|DiZCWnWiAO!JS->99jeuYrAOrb_o7ZGJjxK-y?*LZj?Q>f9@#YCAH)_0u!p?F=-6lyee ziSi2c8(A;ZBTS)2QD zV^5*Bo#+$+HJZAdC=-ndXTNZzP`#N#ji#LVV&ywR?Fjo1c%Vj8a}+h9 z#{(w|bs$ry(bV-snfAJ^u+z~(MVLa3rfwi=8>c8`D_(y14xx@`3N@O#QF%S^Mt7L> znP{BG6lyee6H%u3UN*eqH=(X#3N@O#nJCkvHu_=JmXzDhi%(Z-H>!iU#t!D}~nz~(4Q`h|tn}Vi6Sr^T+6U;z6lyeer=k`g9fzk^#w*PfYBY5hQD#f9@{Y04O~ge9iw8y7K!8cjVyl&RN4tCw9a)SXPBMpN^NG9~P^)t)f$7_X<8LXD;# zCCc>P6JFTyYoXp{3N@NqK$IzAr!QuHEYz<|p+-{+i8Awz-hcLmTbU_gXSi?Tff`Lc zM$`^Ya@kh5kNI4v{!F1pQ;Ud#jaNESW(qZ$dXgykL&stFQ%n0z!ya7?69%BkM zntFjK6OG5W47v6JUSkS1ntG8aGqT-$&o8by_By6eqp6pOGST>9+pfn*342U&+6y(B zdYLE_wJv+_1Vf1VuP{@n(bNi}wskTs`}&0=W(jpHQ>f9@D@1i=>b3Q|x?%`FElvk& zH1#S`rc94-e%ZC+^$b&}(bQ{1*{kw~EnFphk15n>>UE;beR<=j@LO(-^Tu%1;DH)V zy+M?TM)fxPFBJ-Y(wPp_XzER(%m^@Y@VQ?KRbUD=ntF>UQ>H_2dg*1MPG$-f9@N}^yhl#VOk=(0q-USkS1ntF#QvkLg-qxTww>NL&C3pJX0 zm#FR7YpYYc-Xzpurck4)e-mXQpIh1QPoWx^LXD>0BWgGH8vVr)a9Nv(&S45QntGq8 zotdio=@-|W?QNz|qp1&w+JmVZ_J1WWULB`9r%|J+4~go=)Q@9(Um#SRDb#3c6;Y;y zHA@dYTPXNpMmkWVsgH<)Edx5%JrZ@b*FvUHqpAN8W%@?Lyf?oWuV0x$jix>(Y8UqU zvEx-R^)Qj|4=YnVP@}0&l-F^;yz`Y%cUj+&A!J7m17Dun);F`Q^NV1 ze)Nn`Gnhh+roJM|^o`wid&U*RB}}14Q(qHhN_gX=msN__&rG34Q{NC}TDj%Sa}N;e zz*C*-qDE8S64jNXkxxGXO=tSX7^YC8snta7&(yEKuX|LeIZUBOQ)`IYk*RwgJQ9qI z*PBeCMpNGrWv-N)M@?QR)MlqSnW08gYl$-Ll~_7uU!fvQp+-~R6SWVQ@P|H&s)ag( zDb#4{2ck>~AGm4J^Fl3P3N@Pgk*HnS>!7PzR|)kCQ>f9@Pek=#YT^3Le-P@x)1A|( z(bUgG?ZH&4HS=$w#xsQ)P5nZYxjQ^`Y@bbpx}7Q1XzEv@Og}s@HT_+oUStY2n);0> zQ^IYo>Aqa3vNN25qefHzCCaR%jyiD8Frf}*3N@NqN0hlLdrut!(>K!(o0vk4rhX^N zjBH;$z3rJo-NqDZG_{^6)5;gr{P>bk?=poNP5nWXDbxKE`VSSVGx*|x8cqF46f_bY zSDw4ijY9Qg3N@PgizxU*$GV!M2Mcu=Q>f9@-$a?&@{_%*j}_`Drck4)GANw$t^Q~h z`0{KR=BzS)HtS4qp8h^GBeoEm;8RE zP?s@<8cl7kye@otvTOFWm?_j~Y73&a=XwpkB<{MFzhDYAn%a^mGj6OprrX9+!d=dG zGDD4~Iud18qc3L8cg<4bOrb_oorvnkC0us=)i8L29UTo!p+-|%5e40oj_;?mxuS6o zQ>f9@)`|*^dEq|sdXg#BXlfgx%pOt0!n<5+qPLksjix#iWn%c#=7*gjUK^j|lp8gg z+LkEOH`Y8~6%c9wQ>f9@c0`$eIQO&dV8&%)csx_6(bV>eI`e@op)Q7+$rNfdwF6Nm z8e6>b+$fRhH!qp2=LnO43! z^-52n9$^YKn%a#h6OHG0JZ!vBA2Ed*O?4&8M5E^qeF{QtIm3w|YBaSwQD&xh=`%mB z6>1PusL@n6qRhQAb?>7Sg&NNkYBaS6QSgV3H9wvFf>1Xyg&L;~7x5VsJ7=C#XATba}cf>d-#5uDS7dOrb_oJrwoUO>Z@r@|BhS#T05ZwU?qM z&;R@)p|+Xnlo&Od+FMb3?tkF!LhZp6YBbeTQ7ymYJl{m)Af`~GseOnt^Mp%-A50eN zFs4wWsb0$K_fvnkPN*Z9LXD>ORn#S`*T9X-l(3d5)M#oyMeWdr-*0cI$xNX}Q~N8b zKKtuxp=L0J8cp?9)YkE*=LvNsQ>f9@0gC$a+?js~bq7BK>l^TZw| z)%^cgkVm|J%#k(CEp<(e_|I(BxVq|8OH*Tbd|TrLdnQ!JCn_tOYbG`|w^lY+HIA#P z9$!;Ep|+~7zOA{Yta@C1Yi;Gks^%8;@5*TDx2)Va3iIzBPEs=f}sl*Z&=+gxM**@$o}l(MC^skx!DzNxyZ zo}r?oDNW7wV>!twTjk`snkkj^WjBs*RdsbuOG{HTR30i&3)N_4K&Q0T!5bT1NL}OD znyJRVt)a5IsbOMMV@+eL34=XR*-|&%)B%cI?f!3T*48+&s(OM`5R*f3B3RZzsoAu; zY2viXnyCWxEhsXD-;F# zj5^m+)iANXrdgkxP}itVR97|BG*_up^>yRMx2iML!0rOHRM#|Wv#LfYR4a6P1dEs+>fY?oI_28dC@Ho>wJ%H>#;T4R{ z8ZEu*ix}5suMpRHyykE$t8SRcMWQpUP0)5`$S`MIBY-*OE|obqrm4w{Xe|@!Cc0Yy zhTM8*bf~OqZmybE(o*dwsxeoZ*Do(e?vYy63WN8UwpJL3r%f#FE|rpAU)N%y;PP|E ztJ1>5@YmdgBXZ4H>={l!_#b7aySQw|Hdj?QRnkz14ciPEUF?*_(2`ms*~nfqP~ z6}>c9b7v?`F(bUa1^Y|zZd;lN`GH$uaB>slt(RJYYvHCK+S zZ-U127FNTc)m$yNZdYs6HJO3Jb<$*7YDsl!sPpM2lbh<>8a#S?%lMiak6u+n89_tC zWmMBRu62B=UtM$E*c!ZtReNL$ccqr5)@HcBmx5#Kpc2m9uB129O}P}|8((PxH)v^s znKG27nBL*hY6kL1qJnvx=K^@7aG5<)@REf)G0nGpuWQ##rnC;OM34NPR6oiCfRWmx z58zo3u`}5z&D}Zg0nk*aR8OZpPIjp^}x~^$X@Ib2IZenghwRKb5CRR>t!a0OpsJL=zZffG`7EPThTbm}pl}+<6 zy7RjJ+o5E%mPs03?{Wv3(p(3(N!L<|PH?TAM4TGgIytB6VW?9Y$P;djW{Tm6)Lqm$ zh1RV#4GM+ImY_HjDLF}Vk&?4G8^M!2@wJOB$B-DBinu^pJvuWH_bdepQd!&Fh569 z8CwI@4mf0~6Rr`+D8ehnVFvj!UMZ?zu61LJ zu7*z0h0|$H>5g%~Qe&%d?Auc~dGz049_=Zd zJO*qqkMrI<4f^QE&At)=%S8f6tssqEw{vi9?afCl*Djb}I-|7J6LKZVj!- zDV7;GiUVO~PPsNHb8<67=LT}ypsf9n6_u@||8UH#%*o9R*BdC?24zleW>DWiZX1-T z1}%BQq*}5xRl&5i3U!8u0Sa@U*MQk(^@57h6lm-00T!nz(6tQXXGW@|9?4#~hbxnu zq99tjdAX?sg_uRChfz_I!g$5y9L(*;H-~lvP7dZ4@0&wA0u@Ht0X0qI z+GB7YKlaptD^TdT;@ zR9&~ybX~*JbY0KVbY0uhbX9mfhsDQsWrj;|7QxKxr3l}gg>tCDonswB_i(Q5-LFotnb zybI{2Ok;X+=7Q2`-eq+1^em)D^O+nu$-9_}D=w!ZiwmkqpF~yEl9wk`OiNQ0EaQ!O z#X@D_r}4`OcH;3tkzXDr*$JGvq+BLO;51e{0w)J^JMhh+9f6aBS=9LE(2l?_2+k8C zzZh_;?mI4fMVszZn(i9_#e39W`I~LP()^tk@K5)vywigGhK*kgw8*K7>F=(hXqmo% zePzCZ@yg93K3e8cO?efFo+WwIu~^}e35_J8qnC<2a`Ke?qZu3CCl8aFsX*2h+uL3wv+f_OJG=8PCdHK#5TnfKTFxbAllh_^# zFA%9ZxOyPMnCyGO8-a6$cwFH|;Co3Mfs=#BHEaZ`3MS4)FGZ?)_-Rx|uFBdSMSg)& zW!9cMSfZNy!h#tsh_;P?9Hp4?)OF8 z%imM)XCUvH`eo@-_+^4`r265M<_DUh`qCos%R;^0>Q@LY^2>_fh4stCB>UmcE31Uv^64ml5p9n%8#y@^MT2vT?oP>z9pN;+Ku{j+kE#oazVj z?zDf88mlMMxE z!?CeBc&tUN#|9!|^YB=W*gX8=K<{Sz^*|@FJ=A&^Kd!4pw!Qjux^JgYyhqIx@1O2h zcz)&DujVGXecZqH4&Pq=t-?0~R^i+JR^fXwScP9jocGNA!oaER!u~-Zy1f_}fo}+m zz&8R$;2QuV@T&s8wBb7nIEn3{{*_0zy}EO{Z`Bp=(Z3b%pYB(9=Ob5s?ary~!v0m~ z&u#hN7mUES@?ndC-?ndBO1$k?QZ`!_{z(cv=OrhZTzRdrSsa0+;(+y|lf4{Po z@NYG@#EHAdJ;^QdZ9TWhw*}oI-&S;s{NiIi7vtBLZTbc>@Q;lBWS@VJ7Kv|EMB*D0 zk@!YLB!1O#J`Cm;4Ng^X(Pt7BTAZdp*DfP{Zc&jXiHyoSSNMGv&L`1L*Y-{;1)XPp z9+XK?#dJO^Rr*Se`@GX8=9!W^#c2w!6n&MHGUobmr<4}V)WVrTk+$eMc6fXdu=p(z zol=^2C4GuhHH(8d=RE)jAbpI|gRw~-n0}Dxs*3q~4Zd{DBSxnbn(|I_f^42^dvV@r z4rkt4_Ts$LJSvBs3O~~79TO+X1A}*Z{6cAyJTQF2#gCIT50KtQ@grS{p4}E+?^2~L z>bsKc&}PEn#MPC#9=J-99ojsaEJ=1~-(-i@{iMX(H`ya(rJpSJXk!nNM^;o0dRL>} zCU7Y{GU5FY`En_*KIb9w$jak3;DnnKyke;s9Y;m!D^5|KNsgDk-W27T zbKV26b2$6aYmaNpL)30o(4$J{*WADDtL;|QURGXpv8C~BB+mtd<86~X9C5+sW#*js zxAB27qfn;4r@QH=`?0B?3>KA zo*b0We#ssU?Cei@HLpo=EcNu;q&Xq>PIEZjbei){b2!~>n)6O`INfBL^Guu*JL@F$A6B+KXv%0QBp`m@1ZUD&K3gZxrj}w$Yq0tcq$ePIJ?X?VMsKU45q?`5M)PRqbubo zk7wigbPyQ)c0WrD&ZooaWFeOez#cq)lZd3GQ~7KtoCyb7tD48vv`R`Qkc1uy!3(25 z&)O^(g5+#69uEi8fplU-rT1qWM4kv_Ly=?zrbi?PNx1I9owQJetmf zBm&J^-{$gzeDkqHG8u^l8sV$=;T!s=*NnATdAyK~#NyFZ06*wuPgi83`FK7Si3Uc7 zgPEZ8Njus->Y`B1@2ik1P^O;OImd+>fbh(_4WOI>3Dpm+& zgQHxTgk#xcG#Sd{X;&ukbTXC8=TdlDG8vf8Bnz1oOnn>b>~yu?z)UI_jpcGt=&4h! zVMVGCPo|QEM8J9RUlP)pL;`wMHqfNwJtUuiZjIq?Zfd1(RkX~YY$6*Cg&+hi@RbJ= zvmvo)Bpr?>q1kJuhMSt2CCY z(x<}EfY9AbcCf9o5XeJUjOFr?fcb*vSXDJFVyq$*3`By-SSki1mi_AHQcWThP9+jh zeq4Wqo9dgIi#4G@D3OYX^7*`IM!~fTza1cEsX!u?0#ypyfWI($g!#VcVlhm(vf+3h zhRnd&y4qU!$&4b)LZFaL7J@;T{Fyi9ixiGo(p*wBHWJ0+5QtMS zjz&WwE^$o_Ll1kk+@PQ^r>qYbzsc5`lHI!G0FcQcY;`vk(Zd~q9G!zFb8VJR6k#I7Y zP_mNjpx-BA`FJ!IXdPcyJpsRnyf~{6+;n1@AdG3EDaj`kC`5z7WI7keTX9We8;uB5 z1?l(E0Q9g(7M4YBQ3Sq9AHJO4b$x^a@n|>}h1+m|J~H7M)o>sdi-eNtOxh(XDOW5| zC=}8KSVK@wwl5S{5>{*ZR3sgPAq&6t-0Dg)glNDzAp+B$fcX^0$dZvM9LOcZ@kAbm z71w7giajHNR0>u%c^J-Js$xgD1tjzNL+Uq4YPqvA)SdOU~1-)j4}P%xBDpsi@-Stq8W*dphi}!k*wB1Fo`BnP9Pg?{X@gQZ zoO8krX-ad|#F3U6lncZ5RWP5W^P}wf!3CJ=#S%DlJ0Cf*DHVB`tiU80QkvSD-4{m$ z?o^pzJOoMZyB^$;>RQ??4+BafgA)jtnvH4B7T;y8t`LZ)GWlo>ieS2PQ8)zfW zW=;j39TmqOZZCygDwIe>l7Xh`>iRbPF^Uoq4uWtO&gEe0%s(JdtQnfiz+^HUP6g=8 zu(R&jaz!{7jKw2a9R7lb9}%?`D9iFudx_hNpNYTVlbqSZE71+Uo#SZ$UtT(VHj3p!B{v16L1W^Oqn6b zBl$NSoO`0pGK5Sxk&DN3MNC^`eVxo-;jWs2AtRkkCW>_S_9=OW1MzU70IQVZJk{+f z5r}3Z@np_f4oG3m-COd5nS3S|&KDBUOsZb)dyL3qFuvgx6$ur|ozKUKFd9fEgP~*= zt|Xl=jj~o34hFJW3_Pq#wa)Yv`(qQ9f$2yn3PV^vUfdS0F;LVg7;SP%nD{!EjRZpm z6}LDNhLI@&-9Q(|V{oZRsG-sDU4f8=I|y@Vi&wQ2q#X6@LmEJHvY1Wb$~%6oJ}Q?u;8wu#1S~# zvB~B66s&rKumqS^+ca5DXW>*n90>-d*H+2>WKb#%D|T2b2c|c|@4Z-gE|7r7BiRr< z!hoNz8{aez?kI3ax9R0D7l)k>n7K`bo0Oc6Ct$vlD#QZQ+@}W>qS0I^i<5C&wpjVl zNF)@4{gp7pgEkaer`a@!LMj)^6yVM~wyqgt(9~E}Z<7awLeW$V#=`*p@Ps{Io`;?r z48vA&%fu!b-v)(Y857TkV1b3d#AoG&0Cvn^B!n9wjqttl@H2D4#&ND?Bg}v@Y1l4+ zryou5+e{vcAuyAGI}0of#@E%4g>|CMy&UF#(PSo>f|XXwcsZR*6ksKhNI@TQt&J;U zIoS3|!VJcFSZejzKp_~724jW1Go5yRM!+Ulz&=wR+A0k51?Wn$e1#4d4u}PlsU?N!sh7Qh)n|)ecIf@|jd58id<4 zd`Ljf!(b3jz!Dn5JF!jLqau=q-LzmhhCy{Fz=|_jfV~pvLf9vo&5tJ794iu;Or#JF z=L4{Ei@LWyUb6J7ocmPDGz6|`CJ+<04%tr zU>^m#R|+;n@wXZ5=^^2KGLgbQ$x|k&>5u{pDmZQFOo zM%ny^CSaMAEx_K-IQUhC<|_BDz~FEp43|Ll~N!T?=6b!Gi?Y zFf2INjGP~w3>HFJd?MsrG?G$L2*u*C6o7RvekZ9U42ou8V;#2EodoNS8@ll<)Fy{> zeJD1>T&Rj*N5~l7mSn%#nxp z496tea0kXoYaFf`NC;CR{bL|L!gigo+2>$`CL4uE0t7&q;kP?ogvuKp6{TRi-%D!q zE02b9uuqo4M|6fn2S_;a3UH`!cI}bOBj}LmIngbnx>g$A0O42_QibS$` z*n%706IKys)(6w6WGEC$`oJ69K0XDNTx0tCPnys zC6-R&xZ{M;4%+r{j3)|@JtDA&ka9X)*gSm_t*h*~5gZR@5|OA=PxG9|Erx%`;MEu1 zC1C$48V~33{fux}9`(36=@RgcMLZf$<8Cv_J+>bNbO#|0YxOX!L=sNv>>fMs6L>=~ z2?<7GF#U51=eM8k4Z|E8W_vNX`aHsJm)+hhJbj450xp|yTHLDJEiG);!`umW^WaS- z2&ILJ_Zz(}vwv9(FlgY3FOY?979tXj*AT;EMUF}As0Iv`vgTX{me<^t=>jSmp!aI1D$jpjUxq=ghmjp+F=Y$-#4+h->G*Xm>f3 zfX6uDSPI_kq*jnTi^`<#w(!IxlFVh`)lO&B*KH@8bl&BP1VZ_ECX|LZ6Hwqh^KaJ< zUT+FQ2;;CyM51_?+uJ4W#Weqm?J+1mD z6QM*B-l>4uo^88<(NHR%hR5E4;tB77NCKYt!CHz^TzC4x@N!Qc_JWeI@TVX6vYEk+ z0N($B5#8wr&IHM`EHEE|=QXJy3?P_p7U`mO%|}3+%7*hncyR&K&9dE73xjk#5-lVm z@Kyl|u*r*dQ-pKRDsq8HD2&@Z&J5LTD;8~|c(Sl@5rXwk65b%fbmz?oPh}4FdJ`e2 zw=;P08$F&I#4IhNB;>sA`4rz5qOWoDT1@7 z<0&iz;N`w_1h#4@OM9#E6vM(hk_d+4^nxP}Pq3TkDa_)tuw*2Ycg8VikHu37!(}{{ z3ubtbSa!$8Q=WtQGCXIDz@s2c=e;6N zDO3#hy~8>DXaGo^%iL3$55Q0cujJT^iGD`eyJGktt^lv3B=Y!@s(WdRTScDP!~SbH zn@qy10ZyT1HEgzyJh6cxct<}M3BpKKf%693ZKB2woh5f7i8CRaQ-|s;jSp zXN<-FUCBRu0_U4+V3T-YZ9h8XzsraAs~tN={(DGKdQ}A;l3uOS%bo1(U!yA@P)!-h zf7jNa$o}`h!Bi6Y?;?FgZ7mWueehs7A^$zN7XQ1p)})WAwdIx{k#&APw&VW+hEy$- literal 347066 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

_Vn@3%S&=(nUlZtu+KFZSkOP|aowzs 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®~xe@gfl2Fk%$~ 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

itE$S+qSz%_X@_%rPE~%n3|f-(!yPxprc& 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 From c9c59edc646082ad9a687a80ccfd4e421d7e15d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20K=C3=A9ri?= Date: Sun, 29 Dec 2024 23:35:01 +0100 Subject: [PATCH 095/431] encoding/base32: Move tests to base32_test.odin Move existing test procedures to a dedicated test file for better code organization and maintainability. --- core/encoding/base32/base32.odin | 126 ------------------------- core/encoding/base32/base32_test.odin | 127 ++++++++++++++++++++++++++ 2 files changed, 127 insertions(+), 126 deletions(-) create mode 100644 core/encoding/base32/base32_test.odin diff --git a/core/encoding/base32/base32.odin b/core/encoding/base32/base32.odin index 12b6a426b..60ece7b26 100644 --- a/core/encoding/base32/base32.odin +++ b/core/encoding/base32/base32.odin @@ -1,8 +1,5 @@ package encoding_base32 -import "core:testing" -import "core:bytes" - // @note(zh): Encoding utility for Base32 // A secondary param can be used to supply a custom alphabet to // @link(encode) and a matching decoding table to @link(decode). @@ -225,126 +222,3 @@ decode :: proc( return } - -@(test) -test_base32_decode_valid :: proc(t: ^testing.T) { - // RFC 4648 Section 10 - Test vectors - cases := [?]struct { - input, expected: string, - }{ - {"", ""}, - {"MY======", "f"}, - {"MZXQ====", "fo"}, - {"MZXW6===", "foo"}, - {"MZXW6YQ=", "foob"}, - {"MZXW6YTB", "fooba"}, - {"MZXW6YTBOI======", "foobar"}, - } - - for c in cases { - output, err := decode(c.input) - if output != nil { - defer delete(output) - } - testing.expect_value(t, err, Error.None) - expected := transmute([]u8)c.expected - if output != nil { - testing.expect(t, bytes.equal(output, expected)) - } else { - testing.expect(t, len(c.expected) == 0) - } - } -} - -@(test) -test_base32_encode :: proc(t: ^testing.T) { - // RFC 4648 Section 10 - Test vectors - cases := [?]struct { - input, expected: string, - }{ - {"", ""}, - {"f", "MY======"}, - {"fo", "MZXQ===="}, - {"foo", "MZXW6==="}, - {"foob", "MZXW6YQ="}, - {"fooba", "MZXW6YTB"}, - {"foobar", "MZXW6YTBOI======"}, - } - - for c in cases { - output := encode(transmute([]byte)c.input) - testing.expect(t, output == c.expected) - } -} - -@(test) -test_base32_decode_invalid :: proc(t: ^testing.T) { - // Section 3.2 - Alphabet check - { - // Characters outside alphabet - input := "MZ1W6YTB" // '1' not in alphabet (A-Z, 2-7) - output, err := decode(input) - if output != nil { - defer delete(output) - } - testing.expect_value(t, err, Error.Invalid_Character) - } - { - // Lowercase not allowed - input := "mzxq====" - output, err := decode(input) - if output != nil { - defer delete(output) - } - testing.expect_value(t, err, Error.Invalid_Character) - } - - // Section 4 - Padding requirements - { - // Padding must only be at end - input := "MZ=Q====" - output, err := decode(input) - if output != nil { - defer delete(output) - } - testing.expect_value(t, err, Error.Malformed_Input) - } - { - // Missing padding - input := "MZXQ" // Should be MZXQ==== - output, err := decode(input) - if output != nil { - defer delete(output) - } - testing.expect_value(t, err, Error.Malformed_Input) - } - { - // Incorrect padding length - input := "MZXQ=" // Needs 4 padding chars - output, err := decode(input) - if output != nil { - defer delete(output) - } - testing.expect_value(t, err, Error.Malformed_Input) - } - { - // Too much padding - input := "MY=========" // Extra padding chars - output, err := decode(input) - if output != nil { - defer delete(output) - } - testing.expect_value(t, err, Error.Malformed_Input) - } - - // Section 6 - Block size requirements - { - // Single character (invalid block) - input := "M" - output, err := decode(input) - if output != nil { - defer delete(output) - } - testing.expect_value(t, err, Error.Invalid_Length) - } -} diff --git a/core/encoding/base32/base32_test.odin b/core/encoding/base32/base32_test.odin new file mode 100644 index 000000000..e492f9a85 --- /dev/null +++ b/core/encoding/base32/base32_test.odin @@ -0,0 +1,127 @@ +package encoding_base32 + +import "core:testing" +import "core:bytes" + +@(test) +test_base32_decode_valid :: proc(t: ^testing.T) { + // RFC 4648 Section 10 - Test vectors + cases := [?]struct { + input, expected: string, + }{ + {"", ""}, + {"MY======", "f"}, + {"MZXQ====", "fo"}, + {"MZXW6===", "foo"}, + {"MZXW6YQ=", "foob"}, + {"MZXW6YTB", "fooba"}, + {"MZXW6YTBOI======", "foobar"}, + } + + for c in cases { + output, err := decode(c.input) + if output != nil { + defer delete(output) + } + testing.expect_value(t, err, Error.None) + expected := transmute([]u8)c.expected + if output != nil { + testing.expect(t, bytes.equal(output, expected)) + } else { + testing.expect(t, len(c.expected) == 0) + } + } +} + +@(test) +test_base32_encode :: proc(t: ^testing.T) { + // RFC 4648 Section 10 - Test vectors + cases := [?]struct { + input, expected: string, + }{ + {"", ""}, + {"f", "MY======"}, + {"fo", "MZXQ===="}, + {"foo", "MZXW6==="}, + {"foob", "MZXW6YQ="}, + {"fooba", "MZXW6YTB"}, + {"foobar", "MZXW6YTBOI======"}, + } + + for c in cases { + output := encode(transmute([]byte)c.input) + testing.expect(t, output == c.expected) + } +} + +@(test) +test_base32_decode_invalid :: proc(t: ^testing.T) { + // Section 3.2 - Alphabet check + { + // Characters outside alphabet + input := "MZ1W6YTB" // '1' not in alphabet (A-Z, 2-7) + output, err := decode(input) + if output != nil { + defer delete(output) + } + testing.expect_value(t, err, Error.Invalid_Character) + } + { + // Lowercase not allowed + input := "mzxq====" + output, err := decode(input) + if output != nil { + defer delete(output) + } + testing.expect_value(t, err, Error.Invalid_Character) + } + + // Section 4 - Padding requirements + { + // Padding must only be at end + input := "MZ=Q====" + output, err := decode(input) + if output != nil { + defer delete(output) + } + testing.expect_value(t, err, Error.Malformed_Input) + } + { + // Missing padding + input := "MZXQ" // Should be MZXQ==== + output, err := decode(input) + if output != nil { + defer delete(output) + } + testing.expect_value(t, err, Error.Malformed_Input) + } + { + // Incorrect padding length + input := "MZXQ=" // Needs 4 padding chars + output, err := decode(input) + if output != nil { + defer delete(output) + } + testing.expect_value(t, err, Error.Malformed_Input) + } + { + // Too much padding + input := "MY=========" // Extra padding chars + output, err := decode(input) + if output != nil { + defer delete(output) + } + testing.expect_value(t, err, Error.Malformed_Input) + } + + // Section 6 - Block size requirements + { + // Single character (invalid block) + input := "M" + output, err := decode(input) + if output != nil { + defer delete(output) + } + testing.expect_value(t, err, Error.Invalid_Length) + } +} From 0d4c0064d961d8a50901afd8c359962b687d1cbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20K=C3=A9ri?= Date: Mon, 30 Dec 2024 03:03:50 +0100 Subject: [PATCH 096/431] encoding/base32: Add encode->decode roundtrip test Add test_base32_roundtrip() to verify the encode->decode roundtrip preserves data integrity. This test helps ensure our base32 implementation correctly handles the full encode->decode cycle without data loss or corruption. --- core/encoding/base32/base32_test.odin | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/core/encoding/base32/base32_test.odin b/core/encoding/base32/base32_test.odin index e492f9a85..6589abc42 100644 --- a/core/encoding/base32/base32_test.odin +++ b/core/encoding/base32/base32_test.odin @@ -125,3 +125,26 @@ test_base32_decode_invalid :: proc(t: ^testing.T) { testing.expect_value(t, err, Error.Invalid_Length) } } + +@(test) +test_base32_roundtrip :: proc(t: ^testing.T) { + cases := [?]string{ + "", + "f", + "fo", + "foo", + "foob", + "fooba", + "foobar", + } + + for input in cases { + encoded := encode(transmute([]byte)input) + decoded, err := decode(encoded) + if decoded != nil { + defer delete(decoded) + } + testing.expect_value(t, err, Error.None) + testing.expect(t, bytes.equal(decoded, transmute([]byte)input)) + } +} From 591dd8765adb04ff5e0ba66c4c583ea49dbbcc87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20K=C3=A9ri?= Date: Mon, 30 Dec 2024 12:00:38 +0100 Subject: [PATCH 097/431] encoding/base32: Remove incorrect defer delete in encode() Remove premature deallocation of the output buffer which was causing use-after-free behavior. The returned string needs to take ownership of this memory, but the defer delete was freeing it before the string could be used. This fixes issues with encoding that were introduced by overly aggressive memory cleanup in 93238db2. --- core/encoding/base32/base32.odin | 1 - 1 file changed, 1 deletion(-) diff --git a/core/encoding/base32/base32.odin b/core/encoding/base32/base32.odin index 60ece7b26..c46d4a323 100644 --- a/core/encoding/base32/base32.odin +++ b/core/encoding/base32/base32.odin @@ -54,7 +54,6 @@ DEC_TABLE := [256]u8 { encode :: proc(data: []byte, ENC_TBL := ENC_TABLE, allocator := context.allocator) -> string { out_length := (len(data) + 4) / 5 * 8 out := make([]byte, out_length, allocator) - defer delete(out) _encode(out, data, ENC_TBL) return string(out[:]) } From 82925097699c389475c5e2d12286a447165ffa65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20K=C3=A9ri?= Date: Mon, 30 Dec 2024 15:18:38 +0100 Subject: [PATCH 098/431] encoding/base32: Add custom alphabet test case Add test case to verify custom alphabet support. The test uses a decimal-uppercase alphabet (0-9, A-V) to test both encoding and decoding with custom tables, including validation. This ensures the encode and decode functions work correctly with custom encoding tables and validation functions as documented. --- core/encoding/base32/base32_test.odin | 75 +++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/core/encoding/base32/base32_test.odin b/core/encoding/base32/base32_test.odin index 6589abc42..968c6c4df 100644 --- a/core/encoding/base32/base32_test.odin +++ b/core/encoding/base32/base32_test.odin @@ -148,3 +148,78 @@ test_base32_roundtrip :: proc(t: ^testing.T) { testing.expect(t, bytes.equal(decoded, transmute([]byte)input)) } } + +@(test) + +test_base32_custom_alphabet :: proc(t: ^testing.T) { + custom_enc_table := [32]byte{ + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', + 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', + 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', + } + + custom_dec_table: [256]u8 + for i := 0; i < len(custom_enc_table); i += 1 { + custom_dec_table[custom_enc_table[i]] = u8(i) + } + + /* + custom_dec_table := [256]u8{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x00-0x0f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x10-0x1f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x20-0x2f + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, // 0x30-0x3f ('0'-'9') + 0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, // 0x40-0x4f ('A'-'O') + 25, 26, 27, 28, 29, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x50-0x5f ('P'-'V') + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x60-0x6f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x70-0x7f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x80-0x8f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x90-0x9f + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0xa0-0xaf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0xb0-0xbf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0xc0-0xcf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0xd0-0xdf + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0xe0-0xef + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0xf0-0xff + } + */ + + custom_validate :: proc(c: byte) -> bool { + return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'V') || c == byte(PADDING) + } + + cases := [?]struct { + input: string, + enc_expected: string, + }{ + {"f", "CO======"}, + {"fo", "CPNG===="}, + {"foo", "CPNMU==="}, + } + + for c in cases { + // Test encoding + encoded := encode(transmute([]byte)c.input, custom_enc_table) + testing.expect(t, encoded == c.enc_expected) + + // Test decoding + decoded, err := decode(encoded, custom_dec_table, custom_validate) + defer if decoded != nil { + delete(decoded) + } + + testing.expect_value(t, err, Error.None) + testing.expect(t, bytes.equal(decoded, transmute([]byte)c.input)) + } + + // Test invalid character detection + { + input := "WXY=====" // Contains chars not in our alphabet + output, err := decode(input, custom_dec_table, custom_validate) + if output != nil { + delete(output) + } + testing.expect_value(t, err, Error.Invalid_Character) + } +} From 5ce6990077bf4d88a2e9617969e610b65b223f89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20K=C3=A9ri?= Date: Mon, 30 Dec 2024 15:26:42 +0100 Subject: [PATCH 099/431] encoding/base32: Add proper cleanup for encoded strings in tests Add defer delete for encoded strings across all test procedures to ensure proper cleanup and prevent memory leaks. This completes the memory management improvements started in 591dd876. --- core/encoding/base32/base32_test.odin | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/encoding/base32/base32_test.odin b/core/encoding/base32/base32_test.odin index 968c6c4df..b032aa122 100644 --- a/core/encoding/base32/base32_test.odin +++ b/core/encoding/base32/base32_test.odin @@ -50,6 +50,7 @@ test_base32_encode :: proc(t: ^testing.T) { for c in cases { output := encode(transmute([]byte)c.input) + defer delete(output) testing.expect(t, output == c.expected) } } @@ -140,6 +141,7 @@ test_base32_roundtrip :: proc(t: ^testing.T) { for input in cases { encoded := encode(transmute([]byte)input) + defer delete(encoded) decoded, err := decode(encoded) if decoded != nil { defer delete(decoded) @@ -150,7 +152,6 @@ test_base32_roundtrip :: proc(t: ^testing.T) { } @(test) - test_base32_custom_alphabet :: proc(t: ^testing.T) { custom_enc_table := [32]byte{ '0', '1', '2', '3', '4', '5', '6', '7', @@ -201,6 +202,7 @@ test_base32_custom_alphabet :: proc(t: ^testing.T) { for c in cases { // Test encoding encoded := encode(transmute([]byte)c.input, custom_enc_table) + defer delete(encoded) testing.expect(t, encoded == c.enc_expected) // Test decoding From 3d25128520c558a5703c478eef61bb23326afe18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20K=C3=A9ri?= Date: Mon, 30 Dec 2024 15:31:57 +0100 Subject: [PATCH 100/431] encoding/base32: Convert files to UTF-8 with Unix line endings --- core/encoding/base32/base32.odin | 447 ++++++++++++++++--------------- 1 file changed, 224 insertions(+), 223 deletions(-) diff --git a/core/encoding/base32/base32.odin b/core/encoding/base32/base32.odin index c46d4a323..d4e4cbe03 100644 --- a/core/encoding/base32/base32.odin +++ b/core/encoding/base32/base32.odin @@ -1,223 +1,224 @@ -package encoding_base32 - -// @note(zh): Encoding utility for Base32 -// A secondary param can be used to supply a custom alphabet to -// @link(encode) and a matching decoding table to @link(decode). -// If none is supplied it just uses the standard Base32 alphabet. -// In case your specific version does not use padding, you may -// truncate it from the encoded output. - -// Error represents errors that can occur during base32 decoding operations. -// See RFC 4648 sections 3.2, 4 and 6. -Error :: enum { - None, - Invalid_Character, // Input contains characters outside the specified alphabet - Invalid_Length, // Input length is not valid for base32 (must be a multiple of 8 with proper padding) - Malformed_Input, // Input has improper structure (wrong padding position or incomplete groups) -} - -Validate_Proc :: #type proc(c: byte) -> bool - -@private -_validate_default :: proc(c: byte) -> bool { - return (c >= 'A' && c <= 'Z') || (c >= '2' && c <= '7') -} - -ENC_TABLE := [32]byte { - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', - 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', - 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', - 'Y', 'Z', '2', '3', '4', '5', '6', '7', -} - -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, 0, 0, 0, 0, 0, - 0, 0, 26, 27, 28, 29, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -} - -encode :: proc(data: []byte, ENC_TBL := ENC_TABLE, allocator := context.allocator) -> string { - out_length := (len(data) + 4) / 5 * 8 - out := make([]byte, out_length, allocator) - _encode(out, data, ENC_TBL) - return string(out[:]) -} - -@private -_encode :: proc(out, data: []byte, ENC_TBL := ENC_TABLE, allocator := context.allocator) { - out := out - data := data - - for len(data) > 0 { - carry: byte - switch len(data) { - case: - out[7] = ENC_TBL[data[4] & 0x1f] - carry = data[4] >> 5 - fallthrough - case 4: - out[6] = ENC_TBL[carry | (data[3] << 3) & 0x1f] - out[5] = ENC_TBL[(data[3] >> 2) & 0x1f] - carry = data[3] >> 7 - fallthrough - case 3: - out[4] = ENC_TBL[carry | (data[2] << 1) & 0x1f] - carry = (data[2] >> 4) & 0x1f - fallthrough - case 2: - out[3] = ENC_TBL[carry | (data[1] << 4) & 0x1f] - out[2] = ENC_TBL[(data[1] >> 1) & 0x1f] - carry = (data[1] >> 6) & 0x1f - fallthrough - case 1: - out[1] = ENC_TBL[carry | (data[0] << 2) & 0x1f] - out[0] = ENC_TBL[data[0] >> 3] - } - - if len(data) < 5 { - out[7] = byte(PADDING) - if len(data) < 4 { - out[6] = byte(PADDING) - out[5] = byte(PADDING) - if len(data) < 3 { - out[4] = byte(PADDING) - if len(data) < 2 { - out[3] = byte(PADDING) - out[2] = byte(PADDING) - } - } - } - break - } - data = data[5:] - out = out[8:] - } -} - -@(optimization_mode="favor_size") -decode :: proc( - data: string, - DEC_TBL := DEC_TABLE, - validate: Validate_Proc = _validate_default, - allocator := context.allocator) -> (out: []byte, err: Error) { - if len(data) == 0 { - return nil, .None - } - - // Check minimum length requirement first - if len(data) < 2 { - return nil, .Invalid_Length - } - - // Validate characters using provided validation function - for i := 0; i < len(data); i += 1 { - c := data[i] - if c == byte(PADDING) { - break - } - if !validate(c) { - return nil, .Invalid_Character - } - } - - // Validate padding and length - data_len := len(data) - padding_count := 0 - for i := data_len - 1; i >= 0; i -= 1 { - if data[i] != byte(PADDING) { - break - } - padding_count += 1 - } - - // Check for proper padding and length combinations - if padding_count > 0 { - // Verify no padding in the middle - for i := 0; i < data_len - padding_count; i += 1 { - if data[i] == byte(PADDING) { - return nil, .Malformed_Input - } - } - - content_len := data_len - padding_count - mod8 := content_len % 8 - required_padding: int - switch mod8 { - case 2: required_padding = 6 // 2 chars need 6 padding chars - case 4: required_padding = 4 // 4 chars need 4 padding chars - case 5: required_padding = 3 // 5 chars need 3 padding chars - case 7: required_padding = 1 // 7 chars need 1 padding char - case: required_padding = 0 - } - - if required_padding > 0 { - if padding_count != required_padding { - return nil, .Malformed_Input - } - } else if mod8 != 0 { - return nil, .Malformed_Input - } - } else { - // No padding - must be multiple of 8 - if data_len % 8 != 0 { - return nil, .Malformed_Input - } - } - - // Calculate decoded length: 5 bytes for every 8 input chars - input_chars := data_len - padding_count - out_len := input_chars * 5 / 8 - out = make([]byte, out_len, allocator) - defer if err != .None { - delete(out) - } - - // Process input in 8-byte blocks - outi := 0 - for i := 0; i < input_chars; i += 8 { - buf: [8]byte - block_size := min(8, input_chars - i) - - // Decode block - for j := 0; j < block_size; j += 1 { - buf[j] = DEC_TBL[data[i + j]] - } - - // Convert to output bytes based on block size - bytes_to_write := block_size * 5 / 8 - switch block_size { - case 8: - out[outi + 4] = (buf[6] << 5) | buf[7] - fallthrough - case 7: - out[outi + 3] = (buf[4] << 7) | (buf[5] << 2) | (buf[6] >> 3) - fallthrough - case 5: - out[outi + 2] = (buf[3] << 4) | (buf[4] >> 1) - fallthrough - case 4: - out[outi + 1] = (buf[1] << 6) | (buf[2] << 1) | (buf[3] >> 4) - fallthrough - case 2: - out[outi] = (buf[0] << 3) | (buf[1] >> 2) - } - outi += bytes_to_write - } - - return -} +package encoding_base32 + +// @note(zh): Encoding utility for Base32 +// A secondary param can be used to supply a custom alphabet to +// @link(encode) and a matching decoding table to @link(decode). +// If none is supplied it just uses the standard Base32 alphabet. +// In case your specific version does not use padding, you may +// truncate it from the encoded output. + +// Error represents errors that can occur during base32 decoding operations. +// See RFC 4648 sections 3.2, 4 and 6. +Error :: enum { + None, + Invalid_Character, // Input contains characters outside the specified alphabet + Invalid_Length, // Input length is not valid for base32 (must be a multiple of 8 with proper padding) + Malformed_Input, // Input has improper structure (wrong padding position or incomplete groups) +} + +Validate_Proc :: #type proc(c: byte) -> bool + +@private +_validate_default :: proc(c: byte) -> bool { + return (c >= 'A' && c <= 'Z') || (c >= '2' && c <= '7') +} + +ENC_TABLE := [32]byte { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', + 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', + 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', + 'Y', 'Z', '2', '3', '4', '5', '6', '7', +} + +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, 0, 0, 0, 0, 0, + 0, 0, 26, 27, 28, 29, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +} + +encode :: proc(data: []byte, ENC_TBL := ENC_TABLE, allocator := context.allocator) -> string { + out_length := (len(data) + 4) / 5 * 8 + out := make([]byte, out_length, allocator) + _encode(out, data, ENC_TBL) + return string(out[:]) +} + +@private +_encode :: proc(out, data: []byte, ENC_TBL := ENC_TABLE, allocator := context.allocator) { + out := out + data := data + + for len(data) > 0 { + carry: byte + switch len(data) { + case: + out[7] = ENC_TBL[data[4] & 0x1f] + carry = data[4] >> 5 + fallthrough + case 4: + out[6] = ENC_TBL[carry | (data[3] << 3) & 0x1f] + out[5] = ENC_TBL[(data[3] >> 2) & 0x1f] + carry = data[3] >> 7 + fallthrough + case 3: + out[4] = ENC_TBL[carry | (data[2] << 1) & 0x1f] + carry = (data[2] >> 4) & 0x1f + fallthrough + case 2: + out[3] = ENC_TBL[carry | (data[1] << 4) & 0x1f] + out[2] = ENC_TBL[(data[1] >> 1) & 0x1f] + carry = (data[1] >> 6) & 0x1f + fallthrough + case 1: + out[1] = ENC_TBL[carry | (data[0] << 2) & 0x1f] + out[0] = ENC_TBL[data[0] >> 3] + } + + if len(data) < 5 { + out[7] = byte(PADDING) + if len(data) < 4 { + out[6] = byte(PADDING) + out[5] = byte(PADDING) + if len(data) < 3 { + out[4] = byte(PADDING) + if len(data) < 2 { + out[3] = byte(PADDING) + out[2] = byte(PADDING) + } + } + } + break + } + data = data[5:] + out = out[8:] + } +} + +@(optimization_mode="favor_size") +decode :: proc( + data: string, + DEC_TBL := DEC_TABLE, + validate: Validate_Proc = _validate_default, + allocator := context.allocator) -> (out: []byte, err: Error) +{ + if len(data) == 0 { + return nil, .None + } + + // Check minimum length requirement first + if len(data) < 2 { + return nil, .Invalid_Length + } + + // Validate characters using provided validation function + for i := 0; i < len(data); i += 1 { + c := data[i] + if c == byte(PADDING) { + break + } + if !validate(c) { + return nil, .Invalid_Character + } + } + + // Validate padding and length + data_len := len(data) + padding_count := 0 + for i := data_len - 1; i >= 0; i -= 1 { + if data[i] != byte(PADDING) { + break + } + padding_count += 1 + } + + // Check for proper padding and length combinations + if padding_count > 0 { + // Verify no padding in the middle + for i := 0; i < data_len - padding_count; i += 1 { + if data[i] == byte(PADDING) { + return nil, .Malformed_Input + } + } + + content_len := data_len - padding_count + mod8 := content_len % 8 + required_padding: int + switch mod8 { + case 2: required_padding = 6 // 2 chars need 6 padding chars + case 4: required_padding = 4 // 4 chars need 4 padding chars + case 5: required_padding = 3 // 5 chars need 3 padding chars + case 7: required_padding = 1 // 7 chars need 1 padding char + case: required_padding = 0 + } + + if required_padding > 0 { + if padding_count != required_padding { + return nil, .Malformed_Input + } + } else if mod8 != 0 { + return nil, .Malformed_Input + } + } else { + // No padding - must be multiple of 8 + if data_len % 8 != 0 { + return nil, .Malformed_Input + } + } + + // Calculate decoded length: 5 bytes for every 8 input chars + input_chars := data_len - padding_count + out_len := input_chars * 5 / 8 + out = make([]byte, out_len, allocator) + defer if err != .None { + delete(out) + } + + // Process input in 8-byte blocks + outi := 0 + for i := 0; i < input_chars; i += 8 { + buf: [8]byte + block_size := min(8, input_chars - i) + + // Decode block + for j := 0; j < block_size; j += 1 { + buf[j] = DEC_TBL[data[i + j]] + } + + // Convert to output bytes based on block size + bytes_to_write := block_size * 5 / 8 + switch block_size { + case 8: + out[outi + 4] = (buf[6] << 5) | buf[7] + fallthrough + case 7: + out[outi + 3] = (buf[4] << 7) | (buf[5] << 2) | (buf[6] >> 3) + fallthrough + case 5: + out[outi + 2] = (buf[3] << 4) | (buf[4] >> 1) + fallthrough + case 4: + out[outi + 1] = (buf[1] << 6) | (buf[2] << 1) | (buf[3] >> 4) + fallthrough + case 2: + out[outi] = (buf[0] << 3) | (buf[1] >> 2) + } + outi += bytes_to_write + } + + return +} From 0d0a202a78032a55be40b3bd08fbb67ce202a612 Mon Sep 17 00:00:00 2001 From: fleandro <3987005+flga@users.noreply.github.com> Date: Mon, 30 Dec 2024 22:09:27 +0000 Subject: [PATCH 101/431] vendor:vulkan Add support for xlib and xcb --- .../vulkan/_gen/create_vulkan_odin_wrapper.py | 35 ++++++++---- vendor/vulkan/_gen/vulkan_xcb.h | 56 +++++++++++++++++++ vendor/vulkan/_gen/vulkan_xlib.h | 56 +++++++++++++++++++ vendor/vulkan/core.odin | 6 ++ vendor/vulkan/enums.odin | 4 ++ vendor/vulkan/procedures.odin | 16 ++++++ vendor/vulkan/structs.odin | 30 ++++++++-- 7 files changed, 187 insertions(+), 16 deletions(-) create mode 100644 vendor/vulkan/_gen/vulkan_xcb.h create mode 100644 vendor/vulkan/_gen/vulkan_xlib.h diff --git a/vendor/vulkan/_gen/create_vulkan_odin_wrapper.py b/vendor/vulkan/_gen/create_vulkan_odin_wrapper.py index 1a4f96901..a0154328b 100644 --- a/vendor/vulkan/_gen/create_vulkan_odin_wrapper.py +++ b/vendor/vulkan/_gen/create_vulkan_odin_wrapper.py @@ -16,6 +16,8 @@ file_and_urls = [ ("vulkan_macos.h", 'https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/main/include/vulkan/vulkan_macos.h', False), ("vulkan_ios.h", 'https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/main/include/vulkan/vulkan_ios.h', False), ("vulkan_wayland.h", 'https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/main/include/vulkan/vulkan_wayland.h', False), + ("vulkan_xlib.h", 'https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/main/include/vulkan/vulkan_xlib.h', False), + ("vulkan_xcb.h", 'https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/main/include/vulkan/vulkan_xcb.h', False), # Vulkan Video ("vulkan_video_codec_av1std.h", 'https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/main/include/vk_video/vulkan_video_codec_av1std.h', False), ("vulkan_video_codec_av1std_decode.h", 'https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/main/include/vk_video/vulkan_video_codec_av1std_decode.h', False), @@ -46,17 +48,19 @@ def no_vk(t): t = t.replace('PFN_', 'Proc') t = t.replace('PFN_', 'Proc') - t = re.sub('(?:Vk|VK_)?(\w+)', '\\1', t) + t = re.sub('(?:Vk|VK_)?(\\w+)', '\\1', t) # Vulkan Video - t = re.sub('(?:Std|STD_|VK_STD)?(\w+)', '\\1', t) + t = re.sub('(?:Std|STD_|VK_STD)?(\\w+)', '\\1', t) return t OPAQUE_STRUCTS = """ -wl_surface :: struct {} // Opaque struct defined by Wayland -wl_display :: struct {} // Opaque struct defined by Wayland -IOSurfaceRef :: struct {} // Opaque struct defined by Apple’s CoreGraphics framework -""" +wl_surface :: struct {} // Opaque struct defined by Wayland +wl_display :: struct {} // Opaque struct defined by Wayland +xcb_connection_t :: struct {} // Opaque struct defined by xcb +XlibDisplay :: struct {} // Opaque struct defined by Xlib +IOSurfaceRef :: struct {} // Opaque struct defined by Apple’s CoreGraphics framework +""" def convert_type(t, prev_name, curr_name): table = { @@ -91,6 +95,9 @@ def convert_type(t, prev_name, curr_name): "struct BaseInStructure": "BaseInStructure", "struct wl_display": "wl_display", "struct wl_surface": "wl_surface", + "Display": "XlibDisplay", + "Window": "XlibWindow", + "VisualID": "XlibVisualID", 'v': '', } @@ -106,7 +113,7 @@ def convert_type(t, prev_name, curr_name): elif t.endswith("*"): pointer = "^" ttype = t[:len(t)-1] - elem = convert_type(ttype, prev_name, curr_name) + elem = convert_type(ttype, prev_name, curr_name) if curr_name.endswith("s") or curr_name.endswith("Table"): if prev_name.endswith("Count") or prev_name.endswith("Counts"): @@ -445,7 +452,7 @@ def parse_enums(f): def parse_fake_enums(f): data = re.findall(r"static const Vk(\w+FlagBits2) VK_(\w+?) = (\w+);", src, re.S) - + data.sort(key=lambda x: x[0]) fake_enums = {} @@ -507,7 +514,7 @@ def parse_fake_enums(f): continue ff.append((n, v)) - + max_flag_value = max([int(v) for n, v in ff if is_int(v)] + [0]) max_group_value = max([int(v) for n, v in groups if is_int(v)] + [0]) if max_flag_value < max_group_value: @@ -575,13 +582,13 @@ def parse_structs(f): ffields.append(tuple([bit_field_name, bit_field_type, comment])) prev_name = "" continue - + # The second way has many fields that are each 1 bit elif int(fname) == 1: bit_field_type = do_type(bit_field[0], prev_name, fname) ffields.append(tuple(["bitfield", bit_field_type, comment])) break - + if '[' in fname: @@ -919,7 +926,11 @@ when ODIN_OS == .Windows { \t} } -CAMetalLayer :: struct {} +xcb_visualid_t :: u32 +xcb_window_t :: u32 +XlibWindow :: uint +XlibVisualID :: uint +CAMetalLayer :: struct {} MTLBuffer_id :: rawptr MTLTexture_id :: rawptr diff --git a/vendor/vulkan/_gen/vulkan_xcb.h b/vendor/vulkan/_gen/vulkan_xcb.h new file mode 100644 index 000000000..cdf6b5269 --- /dev/null +++ b/vendor/vulkan/_gen/vulkan_xcb.h @@ -0,0 +1,56 @@ +#ifndef VULKAN_XCB_H_ +#define VULKAN_XCB_H_ 1 + +/* +** Copyright 2015-2024 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_xcb_surface is a preprocessor guard. Do not pass it to API calls. +#define VK_KHR_xcb_surface 1 +#define VK_KHR_XCB_SURFACE_SPEC_VERSION 6 +#define VK_KHR_XCB_SURFACE_EXTENSION_NAME "VK_KHR_xcb_surface" +typedef VkFlags VkXcbSurfaceCreateFlagsKHR; +typedef struct VkXcbSurfaceCreateInfoKHR { + VkStructureType sType; + const void* pNext; + VkXcbSurfaceCreateFlagsKHR flags; + xcb_connection_t* connection; + xcb_window_t window; +} VkXcbSurfaceCreateInfoKHR; + +typedef VkResult (VKAPI_PTR *PFN_vkCreateXcbSurfaceKHR)(VkInstance instance, const VkXcbSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); +typedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, xcb_connection_t* connection, xcb_visualid_t visual_id); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateXcbSurfaceKHR( + VkInstance instance, + const VkXcbSurfaceCreateInfoKHR* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkSurfaceKHR* pSurface); + +VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceXcbPresentationSupportKHR( + VkPhysicalDevice physicalDevice, + uint32_t queueFamilyIndex, + xcb_connection_t* connection, + xcb_visualid_t visual_id); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/vulkan/_gen/vulkan_xlib.h b/vendor/vulkan/_gen/vulkan_xlib.h new file mode 100644 index 000000000..b3c3e27d7 --- /dev/null +++ b/vendor/vulkan/_gen/vulkan_xlib.h @@ -0,0 +1,56 @@ +#ifndef VULKAN_XLIB_H_ +#define VULKAN_XLIB_H_ 1 + +/* +** Copyright 2015-2024 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_xlib_surface is a preprocessor guard. Do not pass it to API calls. +#define VK_KHR_xlib_surface 1 +#define VK_KHR_XLIB_SURFACE_SPEC_VERSION 6 +#define VK_KHR_XLIB_SURFACE_EXTENSION_NAME "VK_KHR_xlib_surface" +typedef VkFlags VkXlibSurfaceCreateFlagsKHR; +typedef struct VkXlibSurfaceCreateInfoKHR { + VkStructureType sType; + const void* pNext; + VkXlibSurfaceCreateFlagsKHR flags; + Display* dpy; + Window window; +} VkXlibSurfaceCreateInfoKHR; + +typedef VkResult (VKAPI_PTR *PFN_vkCreateXlibSurfaceKHR)(VkInstance instance, const VkXlibSurfaceCreateInfoKHR* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface); +typedef VkBool32 (VKAPI_PTR *PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR)(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, Display* dpy, VisualID visualID); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkCreateXlibSurfaceKHR( + VkInstance instance, + const VkXlibSurfaceCreateInfoKHR* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkSurfaceKHR* pSurface); + +VKAPI_ATTR VkBool32 VKAPI_CALL vkGetPhysicalDeviceXlibPresentationSupportKHR( + VkPhysicalDevice physicalDevice, + uint32_t queueFamilyIndex, + Display* dpy, + VisualID visualID); +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/vendor/vulkan/core.odin b/vendor/vulkan/core.odin index a335018f9..f90b65008 100644 --- a/vendor/vulkan/core.odin +++ b/vendor/vulkan/core.odin @@ -1161,6 +1161,12 @@ EXT_METAL_OBJECTS_EXTENSION_NAME :: "VK_EXT_metal_objec KHR_wayland_surface :: 1 KHR_WAYLAND_SURFACE_SPEC_VERSION :: 6 KHR_WAYLAND_SURFACE_EXTENSION_NAME :: "VK_KHR_wayland_surface" +KHR_xlib_surface :: 1 +KHR_XLIB_SURFACE_SPEC_VERSION :: 6 +KHR_XLIB_SURFACE_EXTENSION_NAME :: "VK_KHR_xlib_surface" +KHR_xcb_surface :: 1 +KHR_XCB_SURFACE_SPEC_VERSION :: 6 +KHR_XCB_SURFACE_EXTENSION_NAME :: "VK_KHR_xcb_surface" // Handles types Instance :: distinct Handle diff --git a/vendor/vulkan/enums.odin b/vendor/vulkan/enums.odin index 5ac8d1612..a55ba9e58 100644 --- a/vendor/vulkan/enums.odin +++ b/vendor/vulkan/enums.odin @@ -4585,6 +4585,10 @@ WaylandSurfaceCreateFlagsKHR :: distinct bit_set[Wayland WaylandSurfaceCreateFlagKHR :: enum u32 {} Win32SurfaceCreateFlagsKHR :: distinct bit_set[Win32SurfaceCreateFlagKHR; Flags] Win32SurfaceCreateFlagKHR :: enum u32 {} +XcbSurfaceCreateFlagsKHR :: distinct bit_set[XcbSurfaceCreateFlagKHR; Flags] +XcbSurfaceCreateFlagKHR :: enum u32 {} +XlibSurfaceCreateFlagsKHR :: distinct bit_set[XlibSurfaceCreateFlagKHR; Flags] +XlibSurfaceCreateFlagKHR :: enum u32 {} AccessFlags2 :: distinct bit_set[AccessFlag2; Flags64] AccessFlag2 :: enum Flags64 { INDIRECT_COMMAND_READ = 0, diff --git a/vendor/vulkan/procedures.odin b/vendor/vulkan/procedures.odin index dc03275a2..19f70fc85 100644 --- a/vendor/vulkan/procedures.odin +++ b/vendor/vulkan/procedures.odin @@ -36,6 +36,8 @@ ProcCreateMacOSSurfaceMVK :: #type pr 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) @@ -113,6 +115,8 @@ ProcGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR :: #type pr 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) @@ -730,6 +734,8 @@ CreateMacOSSurfaceMVK: ProcCreateMacO CreateMetalSurfaceEXT: ProcCreateMetalSurfaceEXT CreateWaylandSurfaceKHR: ProcCreateWaylandSurfaceKHR CreateWin32SurfaceKHR: ProcCreateWin32SurfaceKHR +CreateXcbSurfaceKHR: ProcCreateXcbSurfaceKHR +CreateXlibSurfaceKHR: ProcCreateXlibSurfaceKHR DebugReportMessageEXT: ProcDebugReportMessageEXT DestroyDebugReportCallbackEXT: ProcDestroyDebugReportCallbackEXT DestroyDebugUtilsMessengerEXT: ProcDestroyDebugUtilsMessengerEXT @@ -806,6 +812,8 @@ GetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR: ProcGetPhysica GetPhysicalDeviceVideoFormatPropertiesKHR: ProcGetPhysicalDeviceVideoFormatPropertiesKHR GetPhysicalDeviceWaylandPresentationSupportKHR: ProcGetPhysicalDeviceWaylandPresentationSupportKHR GetPhysicalDeviceWin32PresentationSupportKHR: ProcGetPhysicalDeviceWin32PresentationSupportKHR +GetPhysicalDeviceXcbPresentationSupportKHR: ProcGetPhysicalDeviceXcbPresentationSupportKHR +GetPhysicalDeviceXlibPresentationSupportKHR: ProcGetPhysicalDeviceXlibPresentationSupportKHR GetWinrtDisplayNV: ProcGetWinrtDisplayNV ReleaseDisplayEXT: ProcReleaseDisplayEXT SubmitDebugUtilsMessageEXT: ProcSubmitDebugUtilsMessageEXT @@ -1423,6 +1431,8 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { 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") @@ -1499,6 +1509,8 @@ load_proc_addresses_custom :: proc(set_proc_address: SetProcAddressType) { 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") @@ -3879,6 +3891,8 @@ load_proc_addresses_instance :: proc(instance: Instance) { 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") @@ -3955,6 +3969,8 @@ load_proc_addresses_instance :: proc(instance: Instance) { 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") diff --git a/vendor/vulkan/structs.odin b/vendor/vulkan/structs.odin index 3c41d1923..b8ed60d22 100644 --- a/vendor/vulkan/structs.odin +++ b/vendor/vulkan/structs.odin @@ -32,7 +32,11 @@ when ODIN_OS == .Windows { } } -CAMetalLayer :: struct {} +xcb_visualid_t :: u32 +xcb_window_t :: u32 +XlibWindow :: uint +XlibVisualID :: uint +CAMetalLayer :: struct {} MTLBuffer_id :: rawptr MTLTexture_id :: rawptr @@ -8910,6 +8914,22 @@ WaylandSurfaceCreateInfoKHR :: struct { surface: ^wl_surface, } +XlibSurfaceCreateInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + flags: XlibSurfaceCreateFlagsKHR, + dpy: ^XlibDisplay, + window: XlibWindow, +} + +XcbSurfaceCreateInfoKHR :: struct { + sType: StructureType, + pNext: rawptr, + flags: XcbSurfaceCreateFlagsKHR, + connection: ^xcb_connection_t, + window: xcb_window_t, +} + VideoAV1ColorConfigFlags :: struct { bitfield: u32, } @@ -9753,9 +9773,11 @@ VideoEncodeH265ReferenceInfo :: struct { // Opaque structs -wl_surface :: struct {} // Opaque struct defined by Wayland -wl_display :: struct {} // Opaque struct defined by Wayland -IOSurfaceRef :: struct {} // Opaque struct defined by Apple’s CoreGraphics framework +wl_surface :: struct {} // Opaque struct defined by Wayland +wl_display :: struct {} // Opaque struct defined by Wayland +xcb_connection_t :: struct {} // Opaque struct defined by xcb +XlibDisplay :: struct {} // Opaque struct defined by Xlib +IOSurfaceRef :: struct {} // Opaque struct defined by Apple’s CoreGraphics framework // Aliases PhysicalDeviceVariablePointerFeatures :: PhysicalDeviceVariablePointersFeatures PhysicalDeviceShaderDrawParameterFeatures :: PhysicalDeviceShaderDrawParametersFeatures From bddca04b25bfce0f5bfa80c344ca66e4952d1302 Mon Sep 17 00:00:00 2001 From: CodingChris Date: Mon, 30 Dec 2024 23:20:08 +0100 Subject: [PATCH 102/431] added IsZoomed to user32 bindings in sys/windows --- core/sys/windows/user32.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/core/sys/windows/user32.odin b/core/sys/windows/user32.odin index 957d6ab70..da979a3e3 100644 --- a/core/sys/windows/user32.odin +++ b/core/sys/windows/user32.odin @@ -51,6 +51,7 @@ foreign user32 { IsWindowVisible :: proc(hwnd: HWND) -> BOOL --- IsWindowEnabled :: proc(hwnd: HWND) -> BOOL --- IsIconic :: proc(hwnd: HWND) -> BOOL --- + IsZoomed :: proc(hwnd: HWND) -> BOOL --- BringWindowToTop :: proc(hWnd: HWND) -> BOOL --- GetTopWindow :: proc(hWnd: HWND) -> HWND --- SetForegroundWindow :: proc(hWnd: HWND) -> BOOL --- From 98967aad7454a1b25e9230b696e4c949d4ac7e27 Mon Sep 17 00:00:00 2001 From: fleandro <3987005+flga@users.noreply.github.com> Date: Tue, 31 Dec 2024 02:44:42 +0000 Subject: [PATCH 103/431] vendor:vulkan Use vendor:x11/xlib types when available --- .../vulkan/_gen/create_vulkan_odin_wrapper.py | 18 +++++++++++++++--- vendor/vulkan/structs.odin | 18 +++++++++++++++--- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/vendor/vulkan/_gen/create_vulkan_odin_wrapper.py b/vendor/vulkan/_gen/create_vulkan_odin_wrapper.py index a0154328b..b8d7b9464 100644 --- a/vendor/vulkan/_gen/create_vulkan_odin_wrapper.py +++ b/vendor/vulkan/_gen/create_vulkan_odin_wrapper.py @@ -58,7 +58,6 @@ OPAQUE_STRUCTS = """ wl_surface :: struct {} // Opaque struct defined by Wayland wl_display :: struct {} // Opaque struct defined by Wayland xcb_connection_t :: struct {} // Opaque struct defined by xcb -XlibDisplay :: struct {} // Opaque struct defined by Xlib IOSurfaceRef :: struct {} // Opaque struct defined by Apple’s CoreGraphics framework """ @@ -901,6 +900,10 @@ import "core:c" import win32 "core:sys/windows" _ :: win32 + +import "vendor:x11/xlib" +_ :: xlib + when ODIN_OS == .Windows { \tHINSTANCE :: win32.HINSTANCE \tHWND :: win32.HWND @@ -926,10 +929,19 @@ when ODIN_OS == .Windows { \t} } +// We want to use `vendor:x11/xlib` types so we need to match their build constraints. +when ODIN_OS == .Linux || ODIN_OS == .FreeBSD || ODIN_OS == .OpenBSD { +\tXlibDisplay :: xlib.Display +\tXlibWindow :: xlib.Window +\tXlibVisualID :: xlib.VisualID +} else { +\tXlibDisplay :: struct {} // Opaque struct defined by Xlib +\tXlibWindow :: c.ulong +\tXlibVisualID :: c.ulong +} + xcb_visualid_t :: u32 xcb_window_t :: u32 -XlibWindow :: uint -XlibVisualID :: uint CAMetalLayer :: struct {} MTLBuffer_id :: rawptr diff --git a/vendor/vulkan/structs.odin b/vendor/vulkan/structs.odin index b8ed60d22..3bab29f4e 100644 --- a/vendor/vulkan/structs.odin +++ b/vendor/vulkan/structs.odin @@ -7,6 +7,10 @@ import "core:c" import win32 "core:sys/windows" _ :: win32 + +import "vendor:x11/xlib" +_ :: xlib + when ODIN_OS == .Windows { HINSTANCE :: win32.HINSTANCE HWND :: win32.HWND @@ -32,10 +36,19 @@ when ODIN_OS == .Windows { } } +// We want to use `vendor:x11/xlib` types so we need to match their build constraints. +when ODIN_OS == .Linux || ODIN_OS == .FreeBSD || ODIN_OS == .OpenBSD { + XlibDisplay :: xlib.Display + XlibWindow :: xlib.Window + XlibVisualID :: xlib.VisualID +} else { + XlibDisplay :: struct {} // Opaque struct defined by Xlib + XlibWindow :: c.ulong + XlibVisualID :: c.ulong +} + xcb_visualid_t :: u32 xcb_window_t :: u32 -XlibWindow :: uint -XlibVisualID :: uint CAMetalLayer :: struct {} MTLBuffer_id :: rawptr @@ -9776,7 +9789,6 @@ VideoEncodeH265ReferenceInfo :: struct { wl_surface :: struct {} // Opaque struct defined by Wayland wl_display :: struct {} // Opaque struct defined by Wayland xcb_connection_t :: struct {} // Opaque struct defined by xcb -XlibDisplay :: struct {} // Opaque struct defined by Xlib IOSurfaceRef :: struct {} // Opaque struct defined by Apple’s CoreGraphics framework // Aliases PhysicalDeviceVariablePointerFeatures :: PhysicalDeviceVariablePointersFeatures From d6f4412dc33bf21607fe97ebfcbd2ba2c81368f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20K=C3=A9ri?= Date: Tue, 31 Dec 2024 18:18:23 +0100 Subject: [PATCH 104/431] encoding/base32: Fix style issues for CI --- core/encoding/base32/base32.odin | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/core/encoding/base32/base32.odin b/core/encoding/base32/base32.odin index d4e4cbe03..b6af279ec 100644 --- a/core/encoding/base32/base32.odin +++ b/core/encoding/base32/base32.odin @@ -48,7 +48,7 @@ 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, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } encode :: proc(data: []byte, ENC_TBL := ENC_TABLE, allocator := context.allocator) -> string { @@ -66,7 +66,7 @@ _encode :: proc(out, data: []byte, ENC_TBL := ENC_TABLE, allocator := context.al for len(data) > 0 { carry: byte switch len(data) { - case: + case: out[7] = ENC_TBL[data[4] & 0x1f] carry = data[4] >> 5 fallthrough @@ -114,8 +114,7 @@ decode :: proc( data: string, DEC_TBL := DEC_TABLE, validate: Validate_Proc = _validate_default, - allocator := context.allocator) -> (out: []byte, err: Error) -{ + allocator := context.allocator) -> (out: []byte, err: Error) { if len(data) == 0 { return nil, .None } @@ -163,7 +162,7 @@ decode :: proc( case 4: required_padding = 4 // 4 chars need 4 padding chars case 5: required_padding = 3 // 5 chars need 3 padding chars case 7: required_padding = 1 // 7 chars need 1 padding char - case: required_padding = 0 + case: required_padding = 0 } if required_padding > 0 { From fe88c22b1fa3b5090ae74dc358896ef784446469 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20K=C3=A9ri?= Date: Tue, 31 Dec 2024 23:47:33 +0100 Subject: [PATCH 105/431] encoding/base32: Fix RFC 4648 references and add RFC reference URL Fix incorrect RFC 4648 section references: - Add RFC URL reference at package level - Update Error enum documentation to reference correct sections: - Invalid_Character: Section 3.3 (non-alphabet characters) - Invalid_Length: Section 6 (base32 block size requirements) - Malformed_Input: Section 3.2 (padding) - Fix test file section references to match correct sections This ensures all RFC references are accurate and adds a link to the source RFC for reference. --- core/encoding/base32/base32.odin | 7 ++++++- core/encoding/base32/base32_test.odin | 6 +++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/core/encoding/base32/base32.odin b/core/encoding/base32/base32.odin index b6af279ec..0b8ec95c4 100644 --- a/core/encoding/base32/base32.odin +++ b/core/encoding/base32/base32.odin @@ -1,3 +1,5 @@ +// Base32 encoding/decoding implementation as specified in RFC 4648. +// [[ More; https://www.rfc-editor.org/rfc/rfc4648.html ]] package encoding_base32 // @note(zh): Encoding utility for Base32 @@ -8,7 +10,10 @@ package encoding_base32 // truncate it from the encoded output. // Error represents errors that can occur during base32 decoding operations. -// See RFC 4648 sections 3.2, 4 and 6. +// As per RFC 4648: +// - Section 3.3: Invalid character handling +// - Section 3.2: Padding requirements +// - Section 6: Base32 encoding specifics (including block size requirements) Error :: enum { None, Invalid_Character, // Input contains characters outside the specified alphabet diff --git a/core/encoding/base32/base32_test.odin b/core/encoding/base32/base32_test.odin index b032aa122..ea41ae36f 100644 --- a/core/encoding/base32/base32_test.odin +++ b/core/encoding/base32/base32_test.odin @@ -57,7 +57,7 @@ test_base32_encode :: proc(t: ^testing.T) { @(test) test_base32_decode_invalid :: proc(t: ^testing.T) { - // Section 3.2 - Alphabet check + // Section 3.3 - Non-alphabet characters { // Characters outside alphabet input := "MZ1W6YTB" // '1' not in alphabet (A-Z, 2-7) @@ -77,7 +77,7 @@ test_base32_decode_invalid :: proc(t: ^testing.T) { testing.expect_value(t, err, Error.Invalid_Character) } - // Section 4 - Padding requirements + // Section 3.2 - Padding requirements { // Padding must only be at end input := "MZ=Q====" @@ -115,7 +115,7 @@ test_base32_decode_invalid :: proc(t: ^testing.T) { testing.expect_value(t, err, Error.Malformed_Input) } - // Section 6 - Block size requirements + // Section 6 - Base32 block size requirements { // Single character (invalid block) input := "M" From c8ad2a4245fb9f0f5a0975e394693333299eb2a7 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 1 Jan 2025 15:12:54 +0000 Subject: [PATCH 106/431] Support multiple paths for wasm in `foreign import` --- src/check_decl.cpp | 88 ++++++++++++++++++++++------------------------ src/checker.cpp | 34 ++++++++++++++++++ src/checker.hpp | 1 + 3 files changed, 77 insertions(+), 46 deletions(-) diff --git a/src/check_decl.cpp b/src/check_decl.cpp index 60eb030ff..ced886bc9 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -971,6 +971,43 @@ gb_internal void check_objc_methods(CheckerContext *ctx, Entity *e, AttributeCon } } +gb_internal void check_foreign_procedure(CheckerContext *ctx, Entity *e, DeclInfo *d) { + GB_ASSERT(e != nullptr); + GB_ASSERT(e->kind == Entity_Procedure); + String name = e->Procedure.link_name; + + mutex_lock(&ctx->info->foreign_mutex); + + auto *fp = &ctx->info->foreigns; + StringHashKey key = string_hash_string(name); + Entity **found = string_map_get(fp, key); + if (found && e != *found) { + Entity *f = *found; + TokenPos pos = f->token.pos; + Type *this_type = base_type(e->type); + Type *other_type = base_type(f->type); + if (is_type_proc(this_type) && is_type_proc(other_type)) { + if (!are_signatures_similar_enough(this_type, other_type)) { + error(d->proc_lit, + "Redeclaration of foreign procedure '%.*s' with different type signatures\n" + "\tat %s", + LIT(name), token_pos_to_string(pos)); + } + } else if (!signature_parameter_similar_enough(this_type, other_type)) { + error(d->proc_lit, + "Foreign entity '%.*s' previously declared elsewhere with a different type\n" + "\tat %s", + LIT(name), token_pos_to_string(pos)); + } + } else if (name == "main") { + error(d->proc_lit, "The link name 'main' is reserved for internal use"); + } else { + string_map_set(fp, key, e); + } + + mutex_unlock(&ctx->info->foreign_mutex); +} + gb_internal void check_proc_decl(CheckerContext *ctx, Entity *e, DeclInfo *d) { GB_ASSERT(e->type == nullptr); if (d->proc_lit->kind != Ast_ProcLit) { @@ -1307,57 +1344,16 @@ gb_internal void check_proc_decl(CheckerContext *ctx, Entity *e, DeclInfo *d) { name = e->Procedure.link_name; } Entity *foreign_library = init_entity_foreign_library(ctx, e); - - if (is_arch_wasm() && foreign_library != nullptr) { - String module_name = str_lit("env"); - GB_ASSERT (foreign_library->kind == Entity_LibraryName); - if (foreign_library->LibraryName.paths.count != 1) { - error(foreign_library->token, "'foreign import' for '%.*s' architecture may only have one path, got %td", - LIT(target_arch_names[build_context.metrics.arch]), foreign_library->LibraryName.paths.count); - } - - if (foreign_library->LibraryName.paths.count >= 1) { - module_name = foreign_library->LibraryName.paths[0]; - } - - if (!string_ends_with(module_name, str_lit(".o"))) { - name = concatenate3_strings(permanent_allocator(), module_name, WASM_MODULE_NAME_SEPARATOR, name); - } - } - e->Procedure.is_foreign = true; e->Procedure.link_name = name; + e->Procedure.foreign_library = foreign_library; - mutex_lock(&ctx->info->foreign_mutex); - - auto *fp = &ctx->info->foreigns; - StringHashKey key = string_hash_string(name); - Entity **found = string_map_get(fp, key); - if (found && e != *found) { - Entity *f = *found; - TokenPos pos = f->token.pos; - Type *this_type = base_type(e->type); - Type *other_type = base_type(f->type); - if (is_type_proc(this_type) && is_type_proc(other_type)) { - if (!are_signatures_similar_enough(this_type, other_type)) { - error(d->proc_lit, - "Redeclaration of foreign procedure '%.*s' with different type signatures\n" - "\tat %s", - LIT(name), token_pos_to_string(pos)); - } - } else if (!signature_parameter_similar_enough(this_type, other_type)) { - error(d->proc_lit, - "Foreign entity '%.*s' previously declared elsewhere with a different type\n" - "\tat %s", - LIT(name), token_pos_to_string(pos)); - } - } else if (name == "main") { - error(d->proc_lit, "The link name 'main' is reserved for internal use"); + if (is_arch_wasm() && foreign_library != nullptr) { + // NOTE(bill): this must be delayed because the foreign import paths might not be evaluated yet until much later + mpsc_enqueue(&ctx->info->foreign_decls_to_check, e); } else { - string_map_set(fp, key, e); + check_foreign_procedure(ctx, e, d); } - - mutex_unlock(&ctx->info->foreign_mutex); } else { String name = e->token.string; if (e->Procedure.link_name.len > 0) { diff --git a/src/checker.cpp b/src/checker.cpp index b7cf343f8..7e0a64d75 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -1356,6 +1356,7 @@ gb_internal void init_checker_info(CheckerInfo *i) { mpsc_init(&i->required_global_variable_queue, a); // 1<<10); mpsc_init(&i->required_foreign_imports_through_force_queue, a); // 1<<10); mpsc_init(&i->foreign_imports_to_check_fullpaths, a); // 1<<10); + mpsc_init(&i->foreign_decls_to_check, a); // 1<<10); mpsc_init(&i->intrinsics_entry_point_usage, a); // 1<<10); // just waste some memory here, even if it probably never used string_map_init(&i->load_directory_cache); @@ -1382,6 +1383,7 @@ gb_internal void destroy_checker_info(CheckerInfo *i) { mpsc_destroy(&i->required_global_variable_queue); mpsc_destroy(&i->required_foreign_imports_through_force_queue); mpsc_destroy(&i->foreign_imports_to_check_fullpaths); + mpsc_destroy(&i->foreign_decls_to_check); map_destroy(&i->objc_msgSend_types); string_map_destroy(&i->load_file_cache); @@ -5094,6 +5096,38 @@ gb_internal void check_foreign_import_fullpaths(Checker *c) { e->LibraryName.paths = fl->fullpaths; } + + for (Entity *e = nullptr; mpsc_dequeue(&c->info.foreign_decls_to_check, &e); /**/) { + GB_ASSERT(e != nullptr); + if (e->kind != Entity_Procedure) { + continue; + } + if (!is_arch_wasm()) { + continue; + } + Entity *foreign_library = e->Procedure.foreign_library; + GB_ASSERT(foreign_library != nullptr); + + String name = e->Procedure.link_name; + + String module_name = str_lit("env"); + GB_ASSERT (foreign_library->kind == Entity_LibraryName); + if (foreign_library->LibraryName.paths.count != 1) { + error(foreign_library->token, "'foreign import' for '%.*s' architecture may only have one path, got %td", + LIT(target_arch_names[build_context.metrics.arch]), foreign_library->LibraryName.paths.count); + } + + if (foreign_library->LibraryName.paths.count >= 1) { + module_name = foreign_library->LibraryName.paths[0]; + } + + if (!string_ends_with(module_name, str_lit(".o"))) { + name = concatenate3_strings(permanent_allocator(), module_name, WASM_MODULE_NAME_SEPARATOR, name); + } + e->Procedure.link_name = name; + + check_foreign_procedure(&ctx, e, e->decl_info); + } } gb_internal void check_add_foreign_import_decl(CheckerContext *ctx, Ast *decl) { diff --git a/src/checker.hpp b/src/checker.hpp index 438156f18..036990f29 100644 --- a/src/checker.hpp +++ b/src/checker.hpp @@ -461,6 +461,7 @@ struct CheckerInfo { MPSCQueue required_global_variable_queue; MPSCQueue required_foreign_imports_through_force_queue; MPSCQueue foreign_imports_to_check_fullpaths; + MPSCQueue foreign_decls_to_check; MPSCQueue intrinsics_entry_point_usage; From 049359cae46c1280dc14ea45914638dfb9cb21e0 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 1 Jan 2025 15:13:07 +0000 Subject: [PATCH 107/431] Clean up box2d `foreign import` --- vendor/box2d/box2d.odin | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/vendor/box2d/box2d.odin b/vendor/box2d/box2d.odin index e7da34a45..83c43800b 100644 --- a/vendor/box2d/box2d.odin +++ b/vendor/box2d/box2d.odin @@ -27,16 +27,8 @@ when !#exists(LIB_PATH) { #panic("Could not find the compiled box2d libraries at \"" + LIB_PATH + "\", they can be compiled by running the `build.sh` script at `" + ODIN_ROOT + "vendor/box2d/build_box2d.sh\"`") } -when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 { - when VECTOR_EXT == "_simd" { - foreign import lib "lib/box2d_wasm_simd.o" - } else { - foreign import lib "lib/box2d_wasm.o" - } -} else { - foreign import lib { - LIB_PATH, - } +foreign import lib { + LIB_PATH, } From 6383fddb59cfcd3f0c8eefb2c700381d14488691 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 1 Jan 2025 15:13:36 +0000 Subject: [PATCH 108/431] Disable the os-specific code in `libc` so that non-OS specific platforms still work with it --- vendor/libc/stdio.odin | 1 + 1 file changed, 1 insertion(+) diff --git a/vendor/libc/stdio.odin b/vendor/libc/stdio.odin index 10b95b96b..97667a5c8 100644 --- a/vendor/libc/stdio.odin +++ b/vendor/libc/stdio.odin @@ -1,3 +1,4 @@ +#+build !freestanding package odin_libc import "core:c" From 1cf7a56ba700b8a20b4fe94459db416679501793 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 1 Jan 2025 15:13:46 +0000 Subject: [PATCH 109/431] General clean up of code --- core/math/rand/rand.odin | 24 ------------------------ core/mem/allocators.odin | 23 ----------------------- core/mem/mem.odin | 9 +-------- core/os/os2/process.odin | 11 ++++++++++- 4 files changed, 11 insertions(+), 56 deletions(-) diff --git a/core/math/rand/rand.odin b/core/math/rand/rand.odin index 474277e84..72d9400d7 100644 --- a/core/math/rand/rand.odin +++ b/core/math/rand/rand.odin @@ -29,30 +29,6 @@ Reset the seed used by the context.random_generator. Inputs: - seed: The seed value -Example: - import "core:math/rand" - import "core:fmt" - - set_global_seed_example :: proc() { - rand.set_global_seed(1) - fmt.println(rand.uint64()) - } - -Possible Output: - - 10 -*/ -@(deprecated="Prefer `rand.reset`") -set_global_seed :: proc(seed: u64) { - runtime.random_generator_reset_u64(context.random_generator, seed) -} - -/* -Reset the seed used by the context.random_generator. - -Inputs: -- seed: The seed value - Example: import "core:math/rand" import "core:fmt" diff --git a/core/mem/allocators.odin b/core/mem/allocators.odin index 13d509f1e..028be58e3 100644 --- a/core/mem/allocators.odin +++ b/core/mem/allocators.odin @@ -140,14 +140,6 @@ arena_init :: proc(a: ^Arena, data: []byte) { a.temp_count = 0 } -@(deprecated="prefer 'mem.arena_init'") -init_arena :: proc(a: ^Arena, data: []byte) { - a.data = data - a.offset = 0 - a.peak_used = 0 - a.temp_count = 0 -} - /* Allocate memory from an arena. @@ -786,14 +778,6 @@ stack_init :: proc(s: ^Stack, data: []byte) { s.peak_used = 0 } -@(deprecated="prefer 'mem.stack_init'") -init_stack :: proc(s: ^Stack, data: []byte) { - s.data = data - s.prev_offset = 0 - s.curr_offset = 0 - s.peak_used = 0 -} - /* Allocate memory from stack. @@ -1162,13 +1146,6 @@ small_stack_init :: proc(s: ^Small_Stack, data: []byte) { s.peak_used = 0 } -@(deprecated="prefer 'small_stack_init'") -init_small_stack :: proc(s: ^Small_Stack, data: []byte) { - s.data = data - s.offset = 0 - s.peak_used = 0 -} - /* Small stack allocator. diff --git a/core/mem/mem.odin b/core/mem/mem.odin index ccbc77798..b2a7158a1 100644 --- a/core/mem/mem.odin +++ b/core/mem/mem.odin @@ -685,11 +685,4 @@ calc_padding_with_header :: proc "contextless" (ptr: uintptr, align: uintptr, he } } return int(padding) -} - -@(require_results, deprecated="prefer 'slice.clone'") -clone_slice :: proc(slice: $T/[]$E, allocator := context.allocator, loc := #caller_location) -> (new_slice: T) { - new_slice, _ = make(T, len(slice), allocator, loc) - runtime.copy(new_slice, slice) - return new_slice -} +} \ No newline at end of file diff --git a/core/os/os2/process.odin b/core/os/os2/process.odin index 5b5a6e844..c90e3add2 100644 --- a/core/os/os2/process.odin +++ b/core/os/os2/process.odin @@ -290,12 +290,21 @@ process_open :: proc(pid: int, flags := Process_Open_Flags {}) -> (Process, Erro return _process_open(pid, flags) } + +/* +OS-specific process attributes. +*/ +Process_Attributes :: struct { + sys_attr: _Sys_Process_Attributes, +} + /* The description of how a process should be created. */ Process_Desc :: struct { // OS-specific attributes. - sys_attr: _Sys_Process_Attributes, + sys_attr: Process_Attributes, + // The working directory of the process. If the string has length 0, the // working directory is assumed to be the current working directory of the // current process. From 7b334d2bd9e881b450fb19e394d6d71840a62cf9 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 1 Jan 2025 17:26:15 +0000 Subject: [PATCH 110/431] Add `#branch_location` --- src/check_expr.cpp | 12 ++++++ src/entity.cpp | 1 + src/llvm_backend.hpp | 7 +++- src/llvm_backend_expr.cpp | 12 ++++-- src/llvm_backend_proc.cpp | 6 ++- src/llvm_backend_stmt.cpp | 81 +++++++++++++++++++++++------------- src/llvm_backend_utility.cpp | 8 ++-- 7 files changed, 89 insertions(+), 38 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index cc9483187..fba9b8dad 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -8725,6 +8725,18 @@ gb_internal ExprKind check_basic_directive_expr(CheckerContext *c, Operand *o, A error(node, "#caller_expression may only be used as a default argument parameter"); o->type = t_string; o->mode = Addressing_Value; + } else if (name == "branch_location") { + if (!c->in_defer) { + error(node, "#branch_location may only be used within a 'defer' statement"); + } else if (c->curr_proc_decl) { + Entity *e = c->curr_proc_decl->entity; + if (e != nullptr) { + GB_ASSERT(e->kind == Entity_Procedure); + e->Procedure.uses_branch_location = true; + } + } + o->type = t_source_code_location; + o->mode = Addressing_Value; } else { if (name == "location") { init_core_source_code_location(c->checker); diff --git a/src/entity.cpp b/src/entity.cpp index 0c4a20df4..802b381f9 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -256,6 +256,7 @@ struct Entity { bool entry_point_only : 1; bool has_instrumentation : 1; bool is_memcpy_like : 1; + bool uses_branch_location : 1; } Procedure; struct { Array entities; diff --git a/src/llvm_backend.hpp b/src/llvm_backend.hpp index e84ffd1cd..8ca11bf28 100644 --- a/src/llvm_backend.hpp +++ b/src/llvm_backend.hpp @@ -359,6 +359,10 @@ struct lbProcedure { bool in_multi_assignment; Array raw_input_parameters; + bool uses_branch_location; + TokenPos branch_location_pos; + TokenPos curr_token_pos; + Array variadic_reuses; lbAddr variadic_reuse_base_array_ptr; @@ -444,7 +448,8 @@ gb_internal lbValue lb_emit_matrix_ev(lbProcedure *p, lbValue s, isize row, isiz gb_internal lbValue lb_emit_arith(lbProcedure *p, TokenKind op, lbValue lhs, lbValue rhs, Type *type); gb_internal lbValue lb_emit_byte_swap(lbProcedure *p, lbValue value, Type *end_type); -gb_internal void lb_emit_defer_stmts(lbProcedure *p, lbDeferExitKind kind, lbBlock *block); +gb_internal void lb_emit_defer_stmts(lbProcedure *p, lbDeferExitKind kind, lbBlock *block, TokenPos pos); +gb_internal void lb_emit_defer_stmts(lbProcedure *p, lbDeferExitKind kind, lbBlock *block, Ast *node); gb_internal lbValue lb_emit_transmute(lbProcedure *p, lbValue value, Type *t); gb_internal lbValue lb_emit_comp(lbProcedure *p, TokenKind op_kind, lbValue left, lbValue right); gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array const &args, ProcInlining inlining = ProcInlining_none); diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 9c325e088..3b238bcd8 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -3502,7 +3502,13 @@ gb_internal lbValue lb_build_expr_internal(lbProcedure *p, Ast *expr) { case_ast_node(bd, BasicDirective, expr); TokenPos pos = bd->token.pos; - GB_PANIC("Non-constant basic literal %s - %.*s", token_pos_to_string(pos), LIT(bd->name.string)); + String name = bd->name.string; + if (name == "branch_location") { + GB_ASSERT(p->uses_branch_location); + String proc_name = p->entity->token.string; + return lb_emit_source_code_location_as_global(p, proc_name, p->branch_location_pos); + } + GB_PANIC("Non-constant basic literal %s - %.*s", token_pos_to_string(pos), LIT(name)); case_end; case_ast_node(i, Implicit, expr); @@ -3668,7 +3674,7 @@ gb_internal lbValue lb_build_expr_internal(lbProcedure *p, Ast *expr) { lb_emit_if(p, lb_emit_try_has_value(p, rhs), then, else_); lb_start_block(p, else_); - lb_emit_defer_stmts(p, lbDeferExit_Branch, block); + lb_emit_defer_stmts(p, lbDeferExit_Branch, block, expr); lb_emit_jump(p, block); lb_start_block(p, then); @@ -5493,7 +5499,7 @@ gb_internal lbAddr lb_build_addr_internal(lbProcedure *p, Ast *expr) { lb_emit_if(p, lb_emit_try_has_value(p, rhs), then, else_); lb_start_block(p, else_); - lb_emit_defer_stmts(p, lbDeferExit_Branch, block); + lb_emit_defer_stmts(p, lbDeferExit_Branch, block, expr); lb_emit_jump(p, block); lb_start_block(p, then); diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 712e13592..7e44a0046 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -125,6 +125,10 @@ gb_internal lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool i // map_init(&p->selector_addr, 0); // map_init(&p->tuple_fix_map, 0); + if (p->entity != nullptr && p->entity->Procedure.uses_branch_location) { + p->uses_branch_location = true; + } + if (p->is_foreign) { lb_add_foreign_library_path(p->module, entity->Procedure.foreign_library); } @@ -757,7 +761,7 @@ gb_internal void lb_end_procedure_body(lbProcedure *p) { if (p->type->Proc.result_count == 0) { instr = LLVMGetLastInstruction(p->curr_block->block); if (!lb_is_instr_terminating(instr)) { - lb_emit_defer_stmts(p, lbDeferExit_Return, nullptr); + lb_emit_defer_stmts(p, lbDeferExit_Return, nullptr, p->body); lb_set_debug_position_to_procedure_end(p); LLVMBuildRetVoid(p->builder); } diff --git a/src/llvm_backend_stmt.cpp b/src/llvm_backend_stmt.cpp index 9a5f25712..a2f0d2f4a 100644 --- a/src/llvm_backend_stmt.cpp +++ b/src/llvm_backend_stmt.cpp @@ -208,8 +208,8 @@ gb_internal void lb_open_scope(lbProcedure *p, Scope *s) { } -gb_internal void lb_close_scope(lbProcedure *p, lbDeferExitKind kind, lbBlock *block, bool pop_stack=true) { - lb_emit_defer_stmts(p, kind, block); +gb_internal void lb_close_scope(lbProcedure *p, lbDeferExitKind kind, lbBlock *block, Ast *node, bool pop_stack=true) { + lb_emit_defer_stmts(p, kind, block, node); GB_ASSERT(p->scope_index > 0); // NOTE(bill): Remove `context`s made in that scope @@ -721,7 +721,7 @@ gb_internal void lb_build_range_interval(lbProcedure *p, AstBinaryExpr *node, lb_build_stmt(p, rs->body); - lb_close_scope(p, lbDeferExit_Default, nullptr); + lb_close_scope(p, lbDeferExit_Default, nullptr, node->left); lb_pop_target_list(p); if (check != nullptr) { @@ -854,7 +854,7 @@ gb_internal void lb_build_range_tuple(lbProcedure *p, AstRangeStmt *rs, Scope *s lb_build_stmt(p, rs->body); - lb_close_scope(p, lbDeferExit_Default, nullptr); + lb_close_scope(p, lbDeferExit_Default, nullptr, rs->body); lb_pop_target_list(p); lb_emit_jump(p, loop); lb_start_block(p, done); @@ -976,7 +976,7 @@ gb_internal void lb_build_range_stmt_struct_soa(lbProcedure *p, AstRangeStmt *rs lb_build_stmt(p, rs->body); - lb_close_scope(p, lbDeferExit_Default, nullptr); + lb_close_scope(p, lbDeferExit_Default, nullptr, rs->body); lb_pop_target_list(p); lb_emit_jump(p, loop); lb_start_block(p, done); @@ -1192,7 +1192,7 @@ gb_internal void lb_build_range_stmt(lbProcedure *p, AstRangeStmt *rs, Scope *sc lb_build_stmt(p, rs->body); - lb_close_scope(p, lbDeferExit_Default, nullptr); + lb_close_scope(p, lbDeferExit_Default, nullptr, rs->body); lb_pop_target_list(p); lb_emit_jump(p, loop); lb_start_block(p, done); @@ -1363,7 +1363,7 @@ gb_internal void lb_build_unroll_range_stmt(lbProcedure *p, AstUnrollRangeStmt * } - lb_close_scope(p, lbDeferExit_Default, nullptr); + lb_close_scope(p, lbDeferExit_Default, nullptr, rs->body); } gb_internal bool lb_switch_stmt_can_be_trivial_jump_table(AstSwitchStmt *ss, bool *default_found_) { @@ -1433,6 +1433,7 @@ gb_internal void lb_build_switch_stmt(lbProcedure *p, AstSwitchStmt *ss, Scope * ast_node(body, BlockStmt, ss->body); isize case_count = body->stmts.count; + Ast *default_clause = nullptr; Slice default_stmts = {}; lbBlock *default_fall = nullptr; lbBlock *default_block = nullptr; @@ -1482,6 +1483,7 @@ gb_internal void lb_build_switch_stmt(lbProcedure *p, AstSwitchStmt *ss, Scope * if (cc->list.count == 0) { // default case + default_clause = clause; default_stmts = cc->stmts; default_fall = fall; if (switch_instr == nullptr) { @@ -1552,7 +1554,7 @@ gb_internal void lb_build_switch_stmt(lbProcedure *p, AstSwitchStmt *ss, Scope * lb_push_target_list(p, ss->label, done, nullptr, fall); lb_open_scope(p, body->scope); lb_build_stmt_list(p, cc->stmts); - lb_close_scope(p, lbDeferExit_Default, body); + lb_close_scope(p, lbDeferExit_Default, body, clause); lb_pop_target_list(p); lb_emit_jump(p, done); @@ -1570,13 +1572,13 @@ gb_internal void lb_build_switch_stmt(lbProcedure *p, AstSwitchStmt *ss, Scope * lb_push_target_list(p, ss->label, done, nullptr, default_fall); lb_open_scope(p, default_block->scope); lb_build_stmt_list(p, default_stmts); - lb_close_scope(p, lbDeferExit_Default, default_block); + lb_close_scope(p, lbDeferExit_Default, default_block, default_clause); lb_pop_target_list(p); } lb_emit_jump(p, done); lb_start_block(p, done); - lb_close_scope(p, lbDeferExit_Default, done); + lb_close_scope(p, lbDeferExit_Default, done, ss->body); } gb_internal void lb_store_type_case_implicit(lbProcedure *p, Ast *clause, lbValue value, bool is_default_case) { @@ -1627,7 +1629,7 @@ gb_internal void lb_type_case_body(lbProcedure *p, Ast *label, Ast *clause, lbBl lb_push_target_list(p, label, done, nullptr, nullptr); lb_build_stmt_list(p, cc->stmts); - lb_close_scope(p, lbDeferExit_Default, body); + lb_close_scope(p, lbDeferExit_Default, body, clause); lb_pop_target_list(p); lb_emit_jump(p, done); @@ -1835,7 +1837,7 @@ gb_internal void lb_build_type_switch_stmt(lbProcedure *p, AstTypeSwitchStmt *ss lb_emit_jump(p, done); lb_start_block(p, done); - lb_close_scope(p, lbDeferExit_Default, done); + lb_close_scope(p, lbDeferExit_Default, done, ss->body); } @@ -1959,7 +1961,7 @@ gb_internal void lb_build_assignment(lbProcedure *p, Array &lvals, Slice p->in_multi_assignment = prev_in_assignment; } -gb_internal void lb_build_return_stmt_internal(lbProcedure *p, lbValue res) { +gb_internal void lb_build_return_stmt_internal(lbProcedure *p, lbValue res, TokenPos pos) { lbFunctionType *ft = lb_get_function_type(p->module, p->type); bool return_by_pointer = ft->ret.kind == lbArg_Indirect; bool split_returns = ft->multiple_return_original_type != nullptr; @@ -1982,7 +1984,7 @@ gb_internal void lb_build_return_stmt_internal(lbProcedure *p, lbValue res) { LLVMBuildStore(p->builder, LLVMConstNull(p->abi_function_type->ret.type), p->return_ptr.addr.value); } - lb_emit_defer_stmts(p, lbDeferExit_Return, nullptr); + lb_emit_defer_stmts(p, lbDeferExit_Return, nullptr, pos); // Check for terminator in the defer stmts LLVMValueRef instr = LLVMGetLastInstruction(p->curr_block->block); @@ -2012,7 +2014,7 @@ gb_internal void lb_build_return_stmt_internal(lbProcedure *p, lbValue res) { ret_val = OdinLLVMBuildTransmute(p, ret_val, ret_type); } - lb_emit_defer_stmts(p, lbDeferExit_Return, nullptr); + lb_emit_defer_stmts(p, lbDeferExit_Return, nullptr, pos); // Check for terminator in the defer stmts LLVMValueRef instr = LLVMGetLastInstruction(p->curr_block->block); @@ -2021,7 +2023,7 @@ gb_internal void lb_build_return_stmt_internal(lbProcedure *p, lbValue res) { } } } -gb_internal void lb_build_return_stmt(lbProcedure *p, Slice const &return_results) { +gb_internal void lb_build_return_stmt(lbProcedure *p, Slice const &return_results, TokenPos pos) { lb_ensure_abi_function_type(p->module, p); isize return_count = p->type->Proc.result_count; @@ -2029,7 +2031,7 @@ gb_internal void lb_build_return_stmt(lbProcedure *p, Slice const &return if (return_count == 0) { // No return values - lb_emit_defer_stmts(p, lbDeferExit_Return, nullptr); + lb_emit_defer_stmts(p, lbDeferExit_Return, nullptr, pos); // Check for terminator in the defer stmts LLVMValueRef instr = LLVMGetLastInstruction(p->curr_block->block); @@ -2138,11 +2140,11 @@ gb_internal void lb_build_return_stmt(lbProcedure *p, Slice const &return GB_ASSERT(result_values.count-1 == result_eps.count); lb_addr_store(p, p->return_ptr, result_values[result_values.count-1]); - lb_emit_defer_stmts(p, lbDeferExit_Return, nullptr); + lb_emit_defer_stmts(p, lbDeferExit_Return, nullptr, pos); LLVMBuildRetVoid(p->builder); return; } else { - return lb_build_return_stmt_internal(p, result_values[result_values.count-1]); + return lb_build_return_stmt_internal(p, result_values[result_values.count-1], pos); } } else { @@ -2169,7 +2171,7 @@ gb_internal void lb_build_return_stmt(lbProcedure *p, Slice const &return } if (return_by_pointer) { - lb_emit_defer_stmts(p, lbDeferExit_Return, nullptr); + lb_emit_defer_stmts(p, lbDeferExit_Return, nullptr, pos); LLVMBuildRetVoid(p->builder); return; } @@ -2177,13 +2179,13 @@ gb_internal void lb_build_return_stmt(lbProcedure *p, Slice const &return res = lb_emit_load(p, res); } } - lb_build_return_stmt_internal(p, res); + lb_build_return_stmt_internal(p, res, pos); } gb_internal void lb_build_if_stmt(lbProcedure *p, Ast *node) { ast_node(is, IfStmt, node); lb_open_scope(p, is->scope); // Scope #1 - defer (lb_close_scope(p, lbDeferExit_Default, nullptr)); + defer (lb_close_scope(p, lbDeferExit_Default, nullptr, node)); lbBlock *then = lb_create_block(p, "if.then"); lbBlock *done = lb_create_block(p, "if.done"); @@ -2234,7 +2236,7 @@ gb_internal void lb_build_if_stmt(lbProcedure *p, Ast *node) { lb_open_scope(p, scope_of_node(is->else_stmt)); lb_build_stmt(p, is->else_stmt); - lb_close_scope(p, lbDeferExit_Default, nullptr); + lb_close_scope(p, lbDeferExit_Default, nullptr, is->else_stmt); } lb_emit_jump(p, done); @@ -2251,7 +2253,7 @@ gb_internal void lb_build_if_stmt(lbProcedure *p, Ast *node) { lb_open_scope(p, scope_of_node(is->else_stmt)); lb_build_stmt(p, is->else_stmt); - lb_close_scope(p, lbDeferExit_Default, nullptr); + lb_close_scope(p, lbDeferExit_Default, nullptr, is->else_stmt); lb_emit_jump(p, done); } @@ -2322,7 +2324,7 @@ gb_internal void lb_build_for_stmt(lbProcedure *p, Ast *node) { } lb_start_block(p, done); - lb_close_scope(p, lbDeferExit_Default, nullptr); + lb_close_scope(p, lbDeferExit_Default, nullptr, node); } gb_internal void lb_build_assign_stmt_array(lbProcedure *p, TokenKind op, lbAddr const &lhs, lbValue const &value) { @@ -2588,7 +2590,7 @@ gb_internal void lb_build_stmt(lbProcedure *p, Ast *node) { lb_open_scope(p, bs->scope); lb_build_stmt_list(p, bs->stmts); - lb_close_scope(p, lbDeferExit_Default, nullptr); + lb_close_scope(p, lbDeferExit_Default, nullptr, node); if (done != nullptr) { lb_emit_jump(p, done); @@ -2702,7 +2704,7 @@ gb_internal void lb_build_stmt(lbProcedure *p, Ast *node) { case_end; case_ast_node(rs, ReturnStmt, node); - lb_build_return_stmt(p, rs->results); + lb_build_return_stmt(p, rs->results, ast_token(node).pos); case_end; case_ast_node(is, IfStmt, node); @@ -2755,7 +2757,7 @@ gb_internal void lb_build_stmt(lbProcedure *p, Ast *node) { } } if (block != nullptr) { - lb_emit_defer_stmts(p, lbDeferExit_Branch, block); + lb_emit_defer_stmts(p, lbDeferExit_Branch, block, node); } lb_emit_jump(p, block); lb_start_block(p, lb_create_block(p, "unreachable")); @@ -2795,7 +2797,13 @@ gb_internal void lb_build_defer_stmt(lbProcedure *p, lbDefer const &d) { } } -gb_internal void lb_emit_defer_stmts(lbProcedure *p, lbDeferExitKind kind, lbBlock *block) { +gb_internal void lb_emit_defer_stmts(lbProcedure *p, lbDeferExitKind kind, lbBlock *block, TokenPos pos) { + TokenPos prev_token_pos = p->branch_location_pos; + if (p->uses_branch_location) { + p->branch_location_pos = pos; + } + defer (p->branch_location_pos = prev_token_pos); + isize count = p->defer_stmts.count; isize i = count; while (i --> 0) { @@ -2822,6 +2830,21 @@ gb_internal void lb_emit_defer_stmts(lbProcedure *p, lbDeferExitKind kind, lbBlo } } +gb_internal void lb_emit_defer_stmts(lbProcedure *p, lbDeferExitKind kind, lbBlock *block, Ast *node) { + TokenPos pos = {}; + if (node) { + if (node->kind == Ast_BlockStmt) { + pos = ast_end_token(node).pos; + } else if (node->kind == Ast_CaseClause) { + pos = ast_end_token(node).pos; + } else { + pos = ast_token(node).pos; + } + } + return lb_emit_defer_stmts(p, kind, block, pos); +} + + gb_internal void lb_add_defer_node(lbProcedure *p, isize scope_index, Ast *stmt) { Type *pt = base_type(p->type); GB_ASSERT(pt->kind == Type_Proc); diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index a2a0ba4cc..3e4393a8f 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -476,8 +476,8 @@ gb_internal lbValue lb_emit_or_else(lbProcedure *p, Ast *arg, Ast *else_expr, Ty } } -gb_internal void lb_build_return_stmt(lbProcedure *p, Slice const &return_results); -gb_internal void lb_build_return_stmt_internal(lbProcedure *p, lbValue res); +gb_internal void lb_build_return_stmt(lbProcedure *p, Slice const &return_results, TokenPos pos); +gb_internal void lb_build_return_stmt_internal(lbProcedure *p, lbValue res, TokenPos pos); gb_internal lbValue lb_emit_or_return(lbProcedure *p, Ast *arg, TypeAndValue const &tv) { lbValue lhs = {}; @@ -506,10 +506,10 @@ gb_internal lbValue lb_emit_or_return(lbProcedure *p, Ast *arg, TypeAndValue con lbValue found = map_must_get(&p->module->values, end_entity); lb_emit_store(p, found, rhs); - lb_build_return_stmt(p, {}); + lb_build_return_stmt(p, {}, ast_token(arg).pos); } else { GB_ASSERT(tuple->variables.count == 1); - lb_build_return_stmt_internal(p, rhs); + lb_build_return_stmt_internal(p, rhs, ast_token(arg).pos); } } lb_start_block(p, continue_block); From 51e90e5e96d409086f96a9c3e1b5fbbdbb44eecc Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Wed, 1 Jan 2025 21:07:44 +0100 Subject: [PATCH 111/431] Fix for vendor:libc using wrong types for log and sin procs. --- vendor/libc/include/math.h | 4 ++-- vendor/libc/math.odin | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/vendor/libc/include/math.h b/vendor/libc/include/math.h index 3f60d698f..9d486da11 100644 --- a/vendor/libc/include/math.h +++ b/vendor/libc/include/math.h @@ -17,5 +17,5 @@ double fabs(double x); int abs(int); double ldexp(double, int); double exp(double); -float log(float); -float sin(float); +double log(double); +double sin(double); diff --git a/vendor/libc/math.odin b/vendor/libc/math.odin index 59f42dd67..af319ac6d 100644 --- a/vendor/libc/math.odin +++ b/vendor/libc/math.odin @@ -90,11 +90,11 @@ exp :: proc "c" (x: f64) -> f64 { } @(require, linkage="strong", link_name="log") -log :: proc "c" (x: f32) -> f32 { +log :: proc "c" (x: f64) -> f64 { return math.ln(x) } @(require, linkage="strong", link_name="sin") -sin :: proc "c" (x: f32) -> f32 { +sin :: proc "c" (x: f64) -> f64 { return math.sin(x) } From f80c33727ca4920e8ffe809c1c79abb093595c76 Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Wed, 1 Jan 2025 21:15:44 +0100 Subject: [PATCH 112/431] Fix for casing error in box2d/wasm.Makefile --- vendor/box2d/wasm.Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/box2d/wasm.Makefile b/vendor/box2d/wasm.Makefile index 929b61aea..c3e3ed25a 100644 --- a/vendor/box2d/wasm.Makefile +++ b/vendor/box2d/wasm.Makefile @@ -10,7 +10,7 @@ SRCS = $(wildcard box2d-$(VERSION)/src/*.c) OBJS_SIMD = $(SRCS:.c=_simd.o) OBJS = $(SRCS:.c=.o) SYSROOT = $(shell odin root)/vendor/libc -CFLAGS = -Ibox2d-$(VERSION)/include -Ibox2d-$(VERSION)/Extern/simde --target=wasm32 -D__EMSCRIPTEN__ -DNDEBUG -O3 --sysroot=$(SYSROOT) +CFLAGS = -Ibox2d-$(VERSION)/include -Ibox2d-$(VERSION)/extern/simde --target=wasm32 -D__EMSCRIPTEN__ -DNDEBUG -O3 --sysroot=$(SYSROOT) all: lib/box2d_wasm.o lib/box2d_wasm_simd.o clean From dc1b75b6c3f493faa4d5ad79770a55c2595a33da Mon Sep 17 00:00:00 2001 From: Karl Zylinski Date: Wed, 1 Jan 2025 22:02:41 +0100 Subject: [PATCH 113/431] Added WASM libs for raylib and raygui. Added them to the foreign import blocks, with optional ways to override them. These overrides can be used to use alterantive libs when using for example emscripten. --- vendor/raylib/raygui.odin | 5 +++++ vendor/raylib/raylib.odin | 5 +++++ vendor/raylib/rlgl/rlgl.odin | 5 +++++ vendor/raylib/wasm/libraygui.a | Bin 0 -> 188456 bytes vendor/raylib/wasm/libraylib.a | Bin 0 -> 1388436 bytes 5 files changed, 15 insertions(+) create mode 100644 vendor/raylib/wasm/libraygui.a create mode 100644 vendor/raylib/wasm/libraylib.a diff --git a/vendor/raylib/raygui.odin b/vendor/raylib/raygui.odin index a15467ae8..559437a60 100644 --- a/vendor/raylib/raygui.odin +++ b/vendor/raylib/raygui.odin @@ -3,6 +3,7 @@ package raylib import "core:c" RAYGUI_SHARED :: #config(RAYGUI_SHARED, false) +RAYGUI_WASM_LIB :: #config(RAYGUI_WASM_LIB, "wasm/libraygui.a") when ODIN_OS == .Windows { foreign import lib { @@ -22,6 +23,10 @@ when ODIN_OS == .Windows { "macos/libraygui.dylib" when RAYGUI_SHARED else "macos/libraygui.a", } } +} else when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 { + foreign import lib { + RAYGUI_WASM_LIB, + } } else { foreign import lib "system:raygui" } diff --git a/vendor/raylib/raylib.odin b/vendor/raylib/raylib.odin index 34a803b99..bb51f105f 100644 --- a/vendor/raylib/raylib.odin +++ b/vendor/raylib/raylib.odin @@ -100,6 +100,7 @@ MAX_TEXT_BUFFER_LENGTH :: #config(RAYLIB_MAX_TEXT_BUFFER_LENGTH, 1024) #assert(size_of(rune) == size_of(c.int)) RAYLIB_SHARED :: #config(RAYLIB_SHARED, false) +RAYLIB_WASM_LIB :: #config(RAYLIB_WASM_LIB, "wasm/libraylib.a") when ODIN_OS == .Windows { @(extra_linker_flags="/NODEFAULTLIB:" + ("msvcrt" when RAYLIB_SHARED else "libcmt")) @@ -127,6 +128,10 @@ when ODIN_OS == .Windows { "system:OpenGL.framework", "system:IOKit.framework", } +} else when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 { + foreign import lib { + RAYLIB_WASM_LIB, + } } else { foreign import lib "system:raylib" } diff --git a/vendor/raylib/rlgl/rlgl.odin b/vendor/raylib/rlgl/rlgl.odin index 40913cd50..340a983de 100644 --- a/vendor/raylib/rlgl/rlgl.odin +++ b/vendor/raylib/rlgl/rlgl.odin @@ -113,6 +113,7 @@ import rl "../." VERSION :: "5.0" RAYLIB_SHARED :: #config(RAYLIB_SHARED, false) +RAYLIB_WASM_LIB :: #config(RAYLIB_WASM_LIB, "../wasm/libraylib.a") // Note: We pull in the full raylib library. If you want a truly stand-alone rlgl, then: // - Compile a separate rlgl library and use that in the foreign import blocks below. @@ -145,6 +146,10 @@ when ODIN_OS == .Windows { "system:OpenGL.framework", "system:IOKit.framework", } +} else when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 { + foreign import lib { + RAYLIB_WASM_LIB, + } } else { foreign import lib "system:raylib" } diff --git a/vendor/raylib/wasm/libraygui.a b/vendor/raylib/wasm/libraygui.a new file mode 100644 index 0000000000000000000000000000000000000000..cfde78a931590ab927c874c6fce8d6866a9ddfe4 GIT binary patch literal 188456 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�E=0>r-V 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

HR%u#b&^T{xhV6kZlVE5BTuTj-aM#dsY;`wl5U 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 literal 0 HcmV?d00001 diff --git a/vendor/raylib/wasm/libraylib.a b/vendor/raylib/wasm/libraylib.a new file mode 100644 index 0000000000000000000000000000000000000000..4cdbfa6948e492fefbad6c081f796f8eb128fecf GIT binary patch literal 1388436 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

-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
9ffC_%Vt)M!wqCv&>pL#yi>m!ba&8usb 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