Skip to content

Commit 77f9840

Browse files
WebGPU: Implement wgpuAdapterGetInfo on GPUAdapter.info (#22031)
Implements `wgpuAdapterGetInfo()`, the C equivalent of `GPUAdapter.info`. Uses `GPUAdapter.info` (not `GPUAdapter.requestAdapterInfo()`), which is new in the WebGPU spec, so this requires an updated browser. `wgpuAdapterGetProperties()` still exists and still doesn't return any real info.
1 parent f374af7 commit 77f9840

File tree

10 files changed

+189
-0
lines changed

10 files changed

+189
-0
lines changed

src/generated_struct_info32.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -792,6 +792,18 @@
792792
"minor": 1,
793793
"patch": 2
794794
},
795+
"WGPUAdapterInfo": {
796+
"__size__": 36,
797+
"adapterType": 24,
798+
"architecture": 8,
799+
"backendType": 20,
800+
"description": 16,
801+
"device": 12,
802+
"deviceID": 32,
803+
"nextInChain": 0,
804+
"vendor": 4,
805+
"vendorID": 28
806+
},
795807
"WGPUAdapterProperties": {
796808
"__size__": 40,
797809
"adapterType": 28,

src/generated_struct_info64.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -792,6 +792,18 @@
792792
"minor": 1,
793793
"patch": 2
794794
},
795+
"WGPUAdapterInfo": {
796+
"__size__": 56,
797+
"adapterType": 44,
798+
"architecture": 16,
799+
"backendType": 40,
800+
"description": 32,
801+
"device": 24,
802+
"deviceID": 52,
803+
"nextInChain": 0,
804+
"vendor": 8,
805+
"vendorID": 48
806+
},
795807
"WGPUAdapterProperties": {
796808
"__size__": 72,
797809
"adapterType": 56,

src/library_sigs.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1552,6 +1552,7 @@ sigs = {
15521552
uuid_unparse_upper__sig: 'vpp',
15531553
uuid_variant__sig: 'ip',
15541554
wgpuAdapterEnumerateFeatures__sig: 'ppp',
1555+
wgpuAdapterGetInfo__sig: 'vpp',
15551556
wgpuAdapterGetLimits__sig: 'ipp',
15561557
wgpuAdapterGetProperties__sig: 'vpp',
15571558
wgpuAdapterHasFeature__sig: 'ipi',

src/library_webgpu.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ wgpu${type}Release: (id) => WebGPU.mgr${type}.release(id),`;
7777
MIP_LEVEL_COUNT_UNDEFINED: 0xFFFFFFFF,
7878
ARRAY_LAYER_COUNT_UNDEFINED: 0xFFFFFFFF,
7979
AdapterType: {
80+
CPU: 3,
8081
Unknown: 4,
8182
},
8283
BackendType: {
@@ -2536,6 +2537,26 @@ var LibraryWebGPU = {
25362537
return adapter.features.size;
25372538
},
25382539

2540+
wgpuAdapterGetInfo__deps: ['$stringToNewUTF8'],
2541+
wgpuAdapterGetInfo: (adapterId, info) => {
2542+
var adapter = WebGPU.mgrAdapter.get(adapterId);
2543+
{{{ gpu.makeCheckDescriptor('info') }}}
2544+
2545+
var vendorPtr = stringToNewUTF8(adapter.info.vendor);
2546+
{{{ makeSetValue('info', C_STRUCTS.WGPUAdapterInfo.vendor, 'vendorPtr', '*') }}};
2547+
var architecturePtr = stringToNewUTF8(adapter.info.architecture);
2548+
{{{ makeSetValue('info', C_STRUCTS.WGPUAdapterInfo.architecture, 'architecturePtr', '*') }}};
2549+
var devicePtr = stringToNewUTF8(adapter.info.device);
2550+
{{{ makeSetValue('info', C_STRUCTS.WGPUAdapterInfo.device, 'devicePtr', '*') }}};
2551+
var descriptionPtr = stringToNewUTF8(adapter.info.description);
2552+
{{{ makeSetValue('info', C_STRUCTS.WGPUAdapterInfo.description, 'descriptionPtr', '*') }}};
2553+
{{{ makeSetValue('info', C_STRUCTS.WGPUAdapterInfo.backendType, gpu.BackendType.WebGPU, 'i32') }}};
2554+
var adapterType = adapter.isFallbackAdapter ? {{{ gpu.AdapterType.CPU }}} : {{{ gpu.AdapterType.Unknown }}};
2555+
{{{ makeSetValue('info', C_STRUCTS.WGPUAdapterInfo.adapterType, 'adapterType', 'i32') }}};
2556+
{{{ makeSetValue('info', C_STRUCTS.WGPUAdapterInfo.vendorID, '0', 'i32') }}};
2557+
{{{ makeSetValue('info', C_STRUCTS.WGPUAdapterInfo.deviceID, '0', 'i32') }}};
2558+
},
2559+
25392560
wgpuAdapterGetProperties: (adapterId, properties) => {
25402561
{{{ gpu.makeCheckDescriptor('properties') }}}
25412562
{{{ makeSetValue('properties', C_STRUCTS.WGPUAdapterProperties.vendorID, '0', 'i32') }}};

src/struct_info.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1224,6 +1224,17 @@
12241224
"next",
12251225
"sType"
12261226
],
1227+
"WGPUAdapterInfo": [
1228+
"nextInChain",
1229+
"vendor",
1230+
"architecture",
1231+
"device",
1232+
"description",
1233+
"backendType",
1234+
"adapterType",
1235+
"vendorID",
1236+
"deviceID"
1237+
],
12271238
"WGPUAdapterProperties": [
12281239
"nextInChain",
12291240
"vendorID",

system/include/webgpu/webgpu.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ typedef struct WGPUTextureImpl* WGPUTexture WGPU_OBJECT_ATTRIBUTE;
105105
typedef struct WGPUTextureViewImpl* WGPUTextureView WGPU_OBJECT_ATTRIBUTE;
106106

107107
// Structure forward declarations
108+
struct WGPUAdapterInfo;
108109
struct WGPUAdapterProperties;
109110
struct WGPUBindGroupEntry;
110111
struct WGPUBlendComponent;
@@ -787,6 +788,18 @@ typedef struct WGPUChainedStructOut {
787788
WGPUSType sType;
788789
} WGPUChainedStructOut WGPU_STRUCTURE_ATTRIBUTE;
789790

791+
typedef struct WGPUAdapterInfo {
792+
WGPUChainedStructOut * nextInChain;
793+
char const * vendor;
794+
char const * architecture;
795+
char const * device;
796+
char const * description;
797+
WGPUBackendType backendType;
798+
WGPUAdapterType adapterType;
799+
uint32_t vendorID;
800+
uint32_t deviceID;
801+
} WGPUAdapterInfo WGPU_STRUCTURE_ATTRIBUTE;
802+
790803
typedef struct WGPUAdapterProperties {
791804
WGPUChainedStructOut * nextInChain;
792805
uint32_t vendorID;
@@ -1380,6 +1393,7 @@ extern "C" {
13801393

13811394
#if !defined(WGPU_SKIP_PROCS)
13821395

1396+
typedef void (*WGPUProcAdapterInfoFreeMembers)(WGPUAdapterInfo value) WGPU_FUNCTION_ATTRIBUTE;
13831397
typedef void (*WGPUProcAdapterPropertiesFreeMembers)(WGPUAdapterProperties value) WGPU_FUNCTION_ATTRIBUTE;
13841398
typedef WGPUInstance (*WGPUProcCreateInstance)(WGPUInstanceDescriptor const * descriptor) WGPU_FUNCTION_ATTRIBUTE;
13851399
typedef WGPUBool (*WGPUProcGetInstanceFeatures)(WGPUInstanceFeatures * features) WGPU_FUNCTION_ATTRIBUTE;
@@ -1388,6 +1402,7 @@ typedef void (*WGPUProcSurfaceCapabilitiesFreeMembers)(WGPUSurfaceCapabilities v
13881402

13891403
// Procs of Adapter
13901404
typedef size_t (*WGPUProcAdapterEnumerateFeatures)(WGPUAdapter adapter, WGPUFeatureName * features) WGPU_FUNCTION_ATTRIBUTE;
1405+
typedef void (*WGPUProcAdapterGetInfo)(WGPUAdapter adapter, WGPUAdapterInfo * info) WGPU_FUNCTION_ATTRIBUTE;
13911406
typedef WGPUBool (*WGPUProcAdapterGetLimits)(WGPUAdapter adapter, WGPUSupportedLimits * limits) WGPU_FUNCTION_ATTRIBUTE;
13921407
typedef void (*WGPUProcAdapterGetProperties)(WGPUAdapter adapter, WGPUAdapterProperties * properties) WGPU_FUNCTION_ATTRIBUTE;
13931408
typedef WGPUBool (*WGPUProcAdapterHasFeature)(WGPUAdapter adapter, WGPUFeatureName feature) WGPU_FUNCTION_ATTRIBUTE;
@@ -1626,6 +1641,7 @@ typedef void (*WGPUProcTextureViewRelease)(WGPUTextureView textureView) WGPU_FUN
16261641

16271642
#if !defined(WGPU_SKIP_DECLARATIONS)
16281643

1644+
WGPU_EXPORT void wgpuAdapterInfoFreeMembers(WGPUAdapterInfo value) WGPU_FUNCTION_ATTRIBUTE;
16291645
WGPU_EXPORT void wgpuAdapterPropertiesFreeMembers(WGPUAdapterProperties value) WGPU_FUNCTION_ATTRIBUTE;
16301646
WGPU_EXPORT WGPUInstance wgpuCreateInstance(WGPU_NULLABLE WGPUInstanceDescriptor const * descriptor) WGPU_FUNCTION_ATTRIBUTE;
16311647
WGPU_EXPORT WGPUBool wgpuGetInstanceFeatures(WGPUInstanceFeatures * features) WGPU_FUNCTION_ATTRIBUTE;
@@ -1634,6 +1650,7 @@ WGPU_EXPORT void wgpuSurfaceCapabilitiesFreeMembers(WGPUSurfaceCapabilities valu
16341650

16351651
// Methods of Adapter
16361652
WGPU_EXPORT size_t wgpuAdapterEnumerateFeatures(WGPUAdapter adapter, WGPUFeatureName * features) WGPU_FUNCTION_ATTRIBUTE;
1653+
WGPU_EXPORT void wgpuAdapterGetInfo(WGPUAdapter adapter, WGPUAdapterInfo * info) WGPU_FUNCTION_ATTRIBUTE;
16371654
WGPU_EXPORT WGPUBool wgpuAdapterGetLimits(WGPUAdapter adapter, WGPUSupportedLimits * limits) WGPU_FUNCTION_ATTRIBUTE;
16381655
WGPU_EXPORT void wgpuAdapterGetProperties(WGPUAdapter adapter, WGPUAdapterProperties * properties) WGPU_FUNCTION_ATTRIBUTE;
16391656
WGPU_EXPORT WGPUBool wgpuAdapterHasFeature(WGPUAdapter adapter, WGPUFeatureName feature) WGPU_FUNCTION_ATTRIBUTE;

system/include/webgpu/webgpu_cpp.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,7 @@ namespace wgpu {
622622
class Texture;
623623
class TextureView;
624624

625+
struct AdapterInfo;
625626
struct AdapterProperties;
626627
struct BindGroupEntry;
627628
struct BlendComponent;
@@ -797,6 +798,7 @@ namespace wgpu {
797798
using ObjectBase::operator=;
798799

799800
size_t EnumerateFeatures(FeatureName * features) const;
801+
void GetInfo(AdapterInfo * info) const;
800802
Bool GetLimits(SupportedLimits * limits) const;
801803
void GetProperties(AdapterProperties * properties) const;
802804
Bool HasFeature(FeatureName feature) const;
@@ -1214,6 +1216,24 @@ namespace wgpu {
12141216
Bool GetInstanceFeatures(InstanceFeatures * features);
12151217
Proc GetProcAddress(Device device, char const * procName);
12161218

1219+
struct AdapterInfo {
1220+
AdapterInfo() = default;
1221+
~AdapterInfo();
1222+
AdapterInfo(const AdapterInfo&) = delete;
1223+
AdapterInfo& operator=(const AdapterInfo&) = delete;
1224+
AdapterInfo(AdapterInfo&&);
1225+
AdapterInfo& operator=(AdapterInfo&&);
1226+
ChainedStructOut * nextInChain = nullptr;
1227+
char const * const vendor = nullptr;
1228+
char const * const architecture = nullptr;
1229+
char const * const device = nullptr;
1230+
char const * const description = nullptr;
1231+
BackendType const backendType = {};
1232+
AdapterType const adapterType = {};
1233+
uint32_t const vendorID = {};
1234+
uint32_t const deviceID = {};
1235+
};
1236+
12171237
struct AdapterProperties {
12181238
AdapterProperties() = default;
12191239
~AdapterProperties();

system/lib/webgpu/webgpu.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <webgpu/webgpu.h>
1111

1212
#include <array>
13+
#include <cstdlib>
1314
#include <cassert>
1415

1516
//
@@ -81,3 +82,12 @@ void wgpuSurfaceGetCapabilities(WGPUSurface surface,
8182
void wgpuSurfaceCapabilitiesFreeMembers(WGPUSurfaceCapabilities value) {
8283
// wgpuSurfaceCapabilities doesn't currently allocate anything.
8384
}
85+
86+
// WGPUAdapterInfo
87+
88+
void wgpuAdapterInfoFreeMembers(WGPUAdapterInfo value) {
89+
free(const_cast<char *>(value.vendor));
90+
free(const_cast<char *>(value.architecture));
91+
free(const_cast<char *>(value.device));
92+
free(const_cast<char *>(value.description));
93+
}

system/lib/webgpu/webgpu_cpp.cpp

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -731,6 +731,30 @@ namespace wgpu {
731731
static_assert(offsetof(ChainedStruct, sType) == offsetof(WGPUChainedStruct, sType),
732732
"offsetof mismatch for ChainedStruct::sType");
733733

734+
// AdapterInfo
735+
736+
static_assert(sizeof(AdapterInfo) == sizeof(WGPUAdapterInfo), "sizeof mismatch for AdapterInfo");
737+
static_assert(alignof(AdapterInfo) == alignof(WGPUAdapterInfo), "alignof mismatch for AdapterInfo");
738+
739+
static_assert(offsetof(AdapterInfo, nextInChain) == offsetof(WGPUAdapterInfo, nextInChain),
740+
"offsetof mismatch for AdapterInfo::nextInChain");
741+
static_assert(offsetof(AdapterInfo, vendor) == offsetof(WGPUAdapterInfo, vendor),
742+
"offsetof mismatch for AdapterInfo::vendor");
743+
static_assert(offsetof(AdapterInfo, architecture) == offsetof(WGPUAdapterInfo, architecture),
744+
"offsetof mismatch for AdapterInfo::architecture");
745+
static_assert(offsetof(AdapterInfo, device) == offsetof(WGPUAdapterInfo, device),
746+
"offsetof mismatch for AdapterInfo::device");
747+
static_assert(offsetof(AdapterInfo, description) == offsetof(WGPUAdapterInfo, description),
748+
"offsetof mismatch for AdapterInfo::description");
749+
static_assert(offsetof(AdapterInfo, backendType) == offsetof(WGPUAdapterInfo, backendType),
750+
"offsetof mismatch for AdapterInfo::backendType");
751+
static_assert(offsetof(AdapterInfo, adapterType) == offsetof(WGPUAdapterInfo, adapterType),
752+
"offsetof mismatch for AdapterInfo::adapterType");
753+
static_assert(offsetof(AdapterInfo, vendorID) == offsetof(WGPUAdapterInfo, vendorID),
754+
"offsetof mismatch for AdapterInfo::vendorID");
755+
static_assert(offsetof(AdapterInfo, deviceID) == offsetof(WGPUAdapterInfo, deviceID),
756+
"offsetof mismatch for AdapterInfo::deviceID");
757+
734758
// AdapterProperties
735759

736760
static_assert(sizeof(AdapterProperties) == sizeof(WGPUAdapterProperties), "sizeof mismatch for AdapterProperties");
@@ -1924,6 +1948,55 @@ template <typename T>
19241948
static_assert(offsetof(RenderPipelineDescriptor, fragment) == offsetof(WGPURenderPipelineDescriptor, fragment),
19251949
"offsetof mismatch for RenderPipelineDescriptor::fragment");
19261950

1951+
// AdapterInfo implementation
1952+
AdapterInfo::~AdapterInfo() {
1953+
if (this->vendor != nullptr || this->architecture != nullptr || this->device != nullptr || this->description != nullptr) {
1954+
wgpuAdapterInfoFreeMembers(
1955+
*reinterpret_cast<WGPUAdapterInfo*>(this));
1956+
}
1957+
}
1958+
1959+
static void Reset(AdapterInfo& value) {
1960+
AdapterInfo defaultValue{};
1961+
AsNonConstReference(value.vendor) = defaultValue.vendor;
1962+
AsNonConstReference(value.architecture) = defaultValue.architecture;
1963+
AsNonConstReference(value.device) = defaultValue.device;
1964+
AsNonConstReference(value.description) = defaultValue.description;
1965+
AsNonConstReference(value.backendType) = defaultValue.backendType;
1966+
AsNonConstReference(value.adapterType) = defaultValue.adapterType;
1967+
AsNonConstReference(value.vendorID) = defaultValue.vendorID;
1968+
AsNonConstReference(value.deviceID) = defaultValue.deviceID;
1969+
}
1970+
1971+
AdapterInfo::AdapterInfo(AdapterInfo&& rhs)
1972+
: vendor(rhs.vendor),
1973+
architecture(rhs.architecture),
1974+
device(rhs.device),
1975+
description(rhs.description),
1976+
backendType(rhs.backendType),
1977+
adapterType(rhs.adapterType),
1978+
vendorID(rhs.vendorID),
1979+
deviceID(rhs.deviceID){
1980+
Reset(rhs);
1981+
}
1982+
1983+
AdapterInfo& AdapterInfo::operator=(AdapterInfo&& rhs) {
1984+
if (&rhs == this) {
1985+
return *this;
1986+
}
1987+
this->~AdapterInfo();
1988+
AsNonConstReference(this->vendor) = std::move(rhs.vendor);
1989+
AsNonConstReference(this->architecture) = std::move(rhs.architecture);
1990+
AsNonConstReference(this->device) = std::move(rhs.device);
1991+
AsNonConstReference(this->description) = std::move(rhs.description);
1992+
AsNonConstReference(this->backendType) = std::move(rhs.backendType);
1993+
AsNonConstReference(this->adapterType) = std::move(rhs.adapterType);
1994+
AsNonConstReference(this->vendorID) = std::move(rhs.vendorID);
1995+
AsNonConstReference(this->deviceID) = std::move(rhs.deviceID);
1996+
Reset(rhs);
1997+
return *this;
1998+
}
1999+
19272000
// AdapterProperties
19282001
AdapterProperties::~AdapterProperties() {
19292002
if (this->vendorName != nullptr || this->architecture != nullptr || this->name != nullptr || this->driverDescription != nullptr) {
@@ -1987,6 +2060,10 @@ template <typename T>
19872060
auto result = wgpuAdapterEnumerateFeatures(Get(), reinterpret_cast<WGPUFeatureName * >(features));
19882061
return result;
19892062
}
2063+
void Adapter::GetInfo(AdapterInfo * info) const {
2064+
*info = AdapterInfo();
2065+
wgpuAdapterGetInfo(Get(), reinterpret_cast<WGPUAdapterInfo * >(info));
2066+
}
19902067
Bool Adapter::GetLimits(SupportedLimits * limits) const {
19912068
auto result = wgpuAdapterGetLimits(Get(), reinterpret_cast<WGPUSupportedLimits * >(limits));
19922069
return result;

test/webgpu_basic_rendering.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,14 @@ void run() {
420420
int main() {
421421
GetAdapter([](wgpu::Adapter a) {
422422
adapter = a;
423+
424+
wgpu::AdapterInfo info;
425+
adapter.GetInfo(&info);
426+
printf("adapter vendor: %s\n", info.vendor);
427+
printf("adapter architecture: %s\n", info.architecture);
428+
printf("adapter device: %s\n", info.device);
429+
printf("adapter description: %s\n", info.description);
430+
423431
GetDevice([](wgpu::Device dev) {
424432
device = dev;
425433
run();

0 commit comments

Comments
 (0)