diff --git a/core/sys/info/platform_windows.odin b/core/sys/info/platform_windows.odin index 7713e7bda..bad99f811 100644 --- a/core/sys/info/platform_windows.odin +++ b/core/sys/info/platform_windows.odin @@ -3,9 +3,10 @@ package sysinfo import sys "core:sys/windows" import "base:intrinsics" import "core:strings" +import "core:strconv" import "core:unicode/utf16" -import "core:fmt" +// import "core:fmt" import "base:runtime" @(private) @@ -280,20 +281,56 @@ init_ram :: proc "contextless" () { @(init, private) init_gpu_info :: proc "contextless" () { - GPU_INFO_BASE :: "SYSTEM\\ControlSet001\\Control\\Class\\{4d36e968-e325-11ce-bfc1-08002be10318}\\" + GPU_ROOT_KEY :: `SYSTEM\ControlSet001\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}` context = runtime.default_context() + runtime.DEFAULT_TEMP_ALLOCATOR_TEMP_GUARD() + + gpu_key: sys.HKEY + if status := sys.RegOpenKeyExW( + sys.HKEY_LOCAL_MACHINE, + GPU_ROOT_KEY, + 0, + sys.KEY_ENUMERATE_SUB_KEYS, + &gpu_key, + ); status != i32(sys.ERROR_SUCCESS) { + return + } + defer sys.RegCloseKey(gpu_key) gpu_list: [dynamic]GPU + gpu: ^GPU - // TODO: Use registry APIs to iterate over entries instead of trying 0000..0009. - for gpu_index in 0..<10 { - key := fmt.tprintf("%v\\%04d", GPU_INFO_BASE, gpu_index) + index := sys.DWORD(0) + for { + defer index += 1 + + buf_wstring: [100]u16 + buf_len := u32(len(buf_wstring)) + buf_utf8: [4 * len(buf_wstring)]u8 + + if status := sys.RegEnumKeyW( + gpu_key, + index, + &buf_wstring[0], + &buf_len, + ); status != i32(sys.ERROR_SUCCESS) { + break + } + + utf16.decode_to_utf8(buf_utf8[:], buf_wstring[:]) + leaf := string(cstring(&buf_utf8[0])) + + // Skip leafs that are not of the form 000x + if _, is_integer := strconv.parse_int(leaf, 10); !is_integer { + continue + } + + key := strings.concatenate({GPU_ROOT_KEY, "\\", leaf}, context.temp_allocator) - gpu: ^GPU if vendor, ok := read_reg_string(sys.HKEY_LOCAL_MACHINE, key, "ProviderName"); ok { - append(&gpu_list, GPU{vendor_name = vendor}) - gpu = &gpu_list[len(gpu_list) - 1] + idx := append(&gpu_list, GPU{vendor_name = vendor}) + gpu = &gpu_list[idx - 1] } else { continue } diff --git a/core/sys/windows/advapi32.odin b/core/sys/windows/advapi32.odin index f834511d4..22cb27863 100644 --- a/core/sys/windows/advapi32.odin +++ b/core/sys/windows/advapi32.odin @@ -167,6 +167,13 @@ foreign advapi32 { lpftLastWriteTime: ^FILETIME, ) -> LSTATUS --- + RegEnumKeyW :: proc( + hKey: HKEY, + dwIndex: DWORD, + lpName: LPWSTR, + lpcchName: LPDWORD, + ) -> LSTATUS --- + RegEnumKeyExW :: proc( hKey: HKEY, dwIndex: DWORD, diff --git a/examples/all/all_vendor.odin b/examples/all/all_vendor.odin index 71bb6ef86..80f6c52bb 100644 --- a/examples/all/all_vendor.odin +++ b/examples/all/all_vendor.odin @@ -31,6 +31,7 @@ package all @(require) import "core:sys/darwin/Foundation" @(require) import "core:sys/darwin/CoreFoundation" @(require) import "core:sys/darwin/Security" +@(require) import "vendor:darwin/CoreVideo" @(require) import "vendor:darwin/Metal" @(require) import "vendor:darwin/MetalKit" @(require) import "vendor:darwin/QuartzCore" diff --git a/examples/all/all_vendor_windows.odin b/examples/all/all_vendor_windows.odin index b71b69a5a..8a0c29eaf 100644 --- a/examples/all/all_vendor_windows.odin +++ b/examples/all/all_vendor_windows.odin @@ -1,6 +1,7 @@ #+build windows package all +@(require) import "vendor:compress/lz4" @(require) import "vendor:wgpu/glfwglue" @(require) import "vendor:wgpu/sdl2glue" @(require) import "vendor:wgpu" diff --git a/vendor/box2d/box2d.odin b/vendor/box2d/box2d.odin index 8b0a57a4e..27d3fd177 100644 --- a/vendor/box2d/box2d.odin +++ b/vendor/box2d/box2d.odin @@ -1,3 +1,4 @@ +// Bindings for [[ Box2D ; https://box2d.org ]]. package vendor_box2d import "base:intrinsics" diff --git a/vendor/cgltf/cgltf.odin b/vendor/cgltf/cgltf.odin index bab58d851..9d2a975f3 100644 --- a/vendor/cgltf/cgltf.odin +++ b/vendor/cgltf/cgltf.odin @@ -1,3 +1,4 @@ +// Bindings for [[ cgtlf ; https://github.com/jkuhlmann/cgltf ]]. package cgltf @(private) diff --git a/vendor/commonmark/cmark.odin b/vendor/commonmark/cmark.odin index 6b07f157f..e63db9b15 100644 --- a/vendor/commonmark/cmark.odin +++ b/vendor/commonmark/cmark.odin @@ -1,5 +1,5 @@ /* - Bindings against CMark (https://github.com/commonmark/cmark) + Bindings for [[CMark ; https://github.com/commonmark/cmark ]]. Original authors: John MacFarlane, Vicent Marti, Kārlis Gaņģis, Nick Wellnhofer. See LICENSE for license details. diff --git a/vendor/commonmark/doc.odin b/vendor/commonmark/doc.odin index ef788fb8f..3b96594d9 100644 --- a/vendor/commonmark/doc.odin +++ b/vendor/commonmark/doc.odin @@ -1,6 +1,6 @@ #+build ignore /* - Bindings against CMark (https://github.com/commonmark/cmark) + Bindings for [[CMark; https://github.com/commonmark/cmark]]. Original authors: John MacFarlane, Vicent Marti, Kārlis Gaņģis, Nick Wellnhofer. See LICENSE for license details. diff --git a/vendor/compress/lz4/lz4.odin b/vendor/compress/lz4/lz4.odin index 310248d56..35acaeb5a 100644 --- a/vendor/compress/lz4/lz4.odin +++ b/vendor/compress/lz4/lz4.odin @@ -1,3 +1,4 @@ +// Bindings for [[LZ4 ; https://github.com/lz4/lz4]]. package vendor_compress_lz4 when ODIN_OS == .Windows { diff --git a/vendor/darwin/CoreVideo/CVDisplayLink.odin b/vendor/darwin/CoreVideo/CVDisplayLink.odin index fae988e0a..73d11d739 100644 --- a/vendor/darwin/CoreVideo/CVDisplayLink.odin +++ b/vendor/darwin/CoreVideo/CVDisplayLink.odin @@ -1,3 +1,4 @@ +// Bindings for [[ CoreVideo ; https://developer.apple.com/documentation/corevideo ]]. package CoreVideo DisplayLinkRef :: distinct rawptr diff --git a/vendor/darwin/Metal/MetalClasses.odin b/vendor/darwin/Metal/MetalClasses.odin index 67cf84f1e..c01c6311a 100644 --- a/vendor/darwin/Metal/MetalClasses.odin +++ b/vendor/darwin/Metal/MetalClasses.odin @@ -1,3 +1,4 @@ +// Bindings for [[ Metal ; https://developer.apple.com/documentation/metal ]]. package objc_Metal import NS "core:sys/darwin/Foundation" diff --git a/vendor/darwin/MetalKit/MetalKit.odin b/vendor/darwin/MetalKit/MetalKit.odin index 34a87cf42..3a4491a21 100644 --- a/vendor/darwin/MetalKit/MetalKit.odin +++ b/vendor/darwin/MetalKit/MetalKit.odin @@ -1,3 +1,4 @@ +// Bindings for [[ MetalKit ; https://developer.apple.com/documentation/metalkit ]]. package objc_MetalKit import NS "core:sys/darwin/Foundation" diff --git a/vendor/darwin/QuartzCore/QuartzCore.odin b/vendor/darwin/QuartzCore/QuartzCore.odin index b19a5fec5..0e54b3d30 100644 --- a/vendor/darwin/QuartzCore/QuartzCore.odin +++ b/vendor/darwin/QuartzCore/QuartzCore.odin @@ -1,3 +1,4 @@ +// Bindings for [[ QuartzCore ; https://developer.apple.com/documentation/quartzcore ]]. package objc_QuartzCore import NS "core:sys/darwin/Foundation"