From 07af9deb6aa33f0828ed0a311f5c72f25c446e6d Mon Sep 17 00:00:00 2001 From: Sven Balzer <4653051+Kyuusokuna@users.noreply.github.com> Date: Tue, 14 Apr 2026 14:06:00 +0200 Subject: [PATCH] update wgpu-native from v25.0.2.2 to v29.0.0.0 --- libs/imgui/backends/imgui_impl_wgpu.cpp | 46 +- libs/wgpu/include/webgpu/webgpu.h | 4282 +++++++++++++++++++---- libs/wgpu/include/webgpu/wgpu.h | 1176 ++++++- libs/wgpu/lib/Linux/libwgpu_native.a | Bin 16232166 -> 17310204 bytes libs/wgpu/lib/Windows/wgpu_native.lib | Bin 15067650 -> 15202376 bytes libs/wgpu/wgpu-native-git-tag | 2 +- src/main.cpp | 2 +- 7 files changed, 4678 insertions(+), 830 deletions(-) diff --git a/libs/imgui/backends/imgui_impl_wgpu.cpp b/libs/imgui/backends/imgui_impl_wgpu.cpp index 5a98b7e..8549994 100644 --- a/libs/imgui/backends/imgui_impl_wgpu.cpp +++ b/libs/imgui/backends/imgui_impl_wgpu.cpp @@ -66,11 +66,6 @@ #error Emscripten <4.0.10 with '-sUSE_WEBGPU=1' is not supported anymore. #endif -#if defined IMGUI_IMPL_WEBGPU_BACKEND_DAWN || defined IMGUI_IMPL_WEBGPU_BACKEND_WGVK -// Dawn renamed WGPUProgrammableStageDescriptor to WGPUComputeState (see: https://github.com/webgpu-native/webgpu-headers/pull/413) -// Using type alias until WGPU adopts the same naming convention (#8369) -using WGPUProgrammableStageDescriptor = WGPUComputeState; -#endif // Dear ImGui prototypes from imgui_internal.h extern ImGuiID ImHashData(const void* data_p, size_t data_size, ImU32 seed); @@ -312,7 +307,7 @@ static void SafeRelease(FrameResources& res) SafeRelease(res.VertexBufferHost); } -static WGPUProgrammableStageDescriptor ImGui_ImplWGPU_CreateShaderModuleWGSL(const char* wgsl_source) +static WGPUComputeState ImGui_ImplWGPU_CreateShaderModuleWGSL(const char* wgsl_source) { ImGui_ImplWGPU_Data* bd = ImGui_ImplWGPU_GetBackendData(); @@ -323,14 +318,14 @@ static WGPUProgrammableStageDescriptor ImGui_ImplWGPU_CreateShaderModuleWGSL(con WGPUShaderModuleDescriptor desc = {}; desc.nextInChain = (WGPUChainedStruct*)&wgsl_desc; - WGPUProgrammableStageDescriptor stage_desc = {}; + WGPUComputeState stage_desc = {}; stage_desc.module = wgpuDeviceCreateShaderModule(bd->wgpuDevice, &desc); stage_desc.entryPoint = { "main", WGPU_STRLEN }; return stage_desc; } -static WGPUProgrammableStageDescriptor ImGui_ImplWGPU_CreateShaderModuleSPIRV(const void* spirv_binary, size_t spirv_length) +static WGPUComputeState ImGui_ImplWGPU_CreateShaderModuleSPIRV(const void* spirv_binary, size_t spirv_length) { ImGui_ImplWGPU_Data* bd = ImGui_ImplWGPU_GetBackendData(); @@ -342,7 +337,7 @@ static WGPUProgrammableStageDescriptor ImGui_ImplWGPU_CreateShaderModuleSPIRV(co WGPUShaderModuleDescriptor desc = {}; desc.nextInChain = (WGPUChainedStruct*)&spirv_desc; - WGPUProgrammableStageDescriptor stage_desc = {}; + WGPUComputeState stage_desc = {}; stage_desc.module = wgpuDeviceCreateShaderModule(bd->wgpuDevice, &desc); stage_desc.entryPoint = { "main", WGPU_STRLEN }; @@ -741,7 +736,7 @@ bool ImGui_ImplWGPU_CreateDeviceObjects() graphics_pipeline_desc.layout = wgpuDeviceCreatePipelineLayout(bd->wgpuDevice, &layout_desc); // Create the vertex shader - WGPUProgrammableStageDescriptor vertex_shader_desc = ImGui_ImplWGPU_CreateShaderModuleWGSL(__shader_vert_wgsl); + WGPUComputeState vertex_shader_desc = ImGui_ImplWGPU_CreateShaderModuleWGSL(__shader_vert_wgsl); if (!vertex_shader_desc.module) vertex_shader_desc = ImGui_ImplWGPU_CreateShaderModuleSPIRV(__shader_vert_spirv, sizeof(__shader_vert_spirv)); graphics_pipeline_desc.vertex.module = vertex_shader_desc.module; graphics_pipeline_desc.vertex.entryPoint = vertex_shader_desc.entryPoint; @@ -749,15 +744,9 @@ bool ImGui_ImplWGPU_CreateDeviceObjects() // Vertex input configuration WGPUVertexAttribute attribute_desc[] = { -#if defined IMGUI_IMPL_WEBGPU_BACKEND_DAWN || defined IMGUI_IMPL_WEBGPU_BACKEND_WGVK { nullptr, WGPUVertexFormat_Float32x2, (uint64_t)offsetof(ImDrawVert, pos), 0 }, { nullptr, WGPUVertexFormat_Float32x2, (uint64_t)offsetof(ImDrawVert, uv), 1 }, { nullptr, WGPUVertexFormat_Unorm8x4, (uint64_t)offsetof(ImDrawVert, col), 2 }, -#else - { WGPUVertexFormat_Float32x2, (uint64_t)offsetof(ImDrawVert, pos), 0 }, - { WGPUVertexFormat_Float32x2, (uint64_t)offsetof(ImDrawVert, uv), 1 }, - { WGPUVertexFormat_Unorm8x4, (uint64_t)offsetof(ImDrawVert, col), 2 }, -#endif }; WGPUVertexBufferLayout buffer_layouts[1]; @@ -770,7 +759,7 @@ bool ImGui_ImplWGPU_CreateDeviceObjects() graphics_pipeline_desc.vertex.buffers = buffer_layouts; // Create the pixel shader - WGPUProgrammableStageDescriptor pixel_shader_desc = ImGui_ImplWGPU_CreateShaderModuleWGSL(__shader_frag_wgsl); + WGPUComputeState pixel_shader_desc = ImGui_ImplWGPU_CreateShaderModuleWGSL(__shader_frag_wgsl); if (!pixel_shader_desc.module) pixel_shader_desc = ImGui_ImplWGPU_CreateShaderModuleSPIRV(__shader_frag_spirv, sizeof(__shader_frag_spirv)); // Create the blending setup @@ -957,24 +946,15 @@ void ImGui_ImplWGPU_NewFrame() bool ImGui_ImplWGPU_IsSurfaceStatusError(WGPUSurfaceGetCurrentTextureStatus status) { -#if defined(IMGUI_IMPL_WEBGPU_BACKEND_DAWN) || defined(IMGUI_IMPL_WEBGPU_BACKEND_WGVK) return (status == WGPUSurfaceGetCurrentTextureStatus_Error); -#else - return (status == WGPUSurfaceGetCurrentTextureStatus_OutOfMemory || status == WGPUSurfaceGetCurrentTextureStatus_DeviceLost); -#endif } bool ImGui_ImplWGPU_IsSurfaceStatusSubOptimal(WGPUSurfaceGetCurrentTextureStatus status) { -#if defined(__EMSCRIPTEN__) && !defined(IMGUI_IMPL_WEBGPU_BACKEND_DAWN) return (status == WGPUSurfaceGetCurrentTextureStatus_Timeout || status == WGPUSurfaceGetCurrentTextureStatus_Outdated || status == WGPUSurfaceGetCurrentTextureStatus_Lost); -#else - return (status == WGPUSurfaceGetCurrentTextureStatus_Timeout || status == WGPUSurfaceGetCurrentTextureStatus_Outdated || status == WGPUSurfaceGetCurrentTextureStatus_Lost || status == WGPUSurfaceGetCurrentTextureStatus_SuccessSuboptimal); -#endif } // Helpers to obtain a string -#if defined(IMGUI_IMPL_WEBGPU_BACKEND_DAWN) || defined(IMGUI_IMPL_WEBGPU_BACKEND_WGVK) const char* ImGui_ImplWGPU_GetErrorTypeName(WGPUErrorType type) { switch (type) @@ -997,20 +977,6 @@ const char* ImGui_ImplWGPU_GetDeviceLostReasonName(WGPUDeviceLostReason type) default: return "Unknown"; } } -#elif !defined(__EMSCRIPTEN__) -const char* ImGui_ImplWGPU_GetLogLevelName(WGPULogLevel level) -{ - switch (level) - { - case WGPULogLevel_Error: return "Error"; - case WGPULogLevel_Warn: return "Warn"; - case WGPULogLevel_Info: return "Info"; - case WGPULogLevel_Debug: return "Debug"; - case WGPULogLevel_Trace: return "Trace"; - default: return "Unknown"; - } -} -#endif const char* ImGui_ImplWGPU_GetBackendTypeName(WGPUBackendType type) { diff --git a/libs/wgpu/include/webgpu/webgpu.h b/libs/wgpu/include/webgpu/webgpu.h index db92746..4223519 100644 --- a/libs/wgpu/include/webgpu/webgpu.h +++ b/libs/wgpu/include/webgpu/webgpu.h @@ -13,6 +13,15 @@ * * This is the home of WebGPU C API specification. We define here the standard * `webgpu.h` header that all implementations should provide. + * + * For all details where behavior is not otherwise specified, `webgpu.h` has + * the same behavior as the WebGPU specification for JavaScript on the Web. + * The WebIDL-based Web specification is mapped into C as faithfully (and + * bidirectionally) as practical/possible. + * The working draft of WebGPU can be found at . + * + * The standard include directive for this header is `#include ` + * (if it is provided in a system-wide or toolchain-wide include directory). */ #ifndef WEBGPU_H_ @@ -54,37 +63,103 @@ #include #include +#include #define _wgpu_COMMA , #if defined(__cplusplus) +# define _wgpu_ENUM_ZERO_INIT(type) type(0) +# define _wgpu_STRUCT_ZERO_INIT {} # if __cplusplus >= 201103L # define _wgpu_MAKE_INIT_STRUCT(type, value) (type value) # else # define _wgpu_MAKE_INIT_STRUCT(type, value) value # endif -#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L -# define _wgpu_MAKE_INIT_STRUCT(type, value) ((type) value) #else -# define _wgpu_MAKE_INIT_STRUCT(type, value) value +# define _wgpu_ENUM_ZERO_INIT(type) (type)0 +# define _wgpu_STRUCT_ZERO_INIT {0} +# if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +# define _wgpu_MAKE_INIT_STRUCT(type, value) ((type) value) +# else +# define _wgpu_MAKE_INIT_STRUCT(type, value) value +# endif #endif - /** - * \defgroup Constants + * \defgroup Constants Constants * \brief Constants. * * @{ */ -#define WGPU_ARRAY_LAYER_COUNT_UNDEFINED (UINT32_MAX) -#define WGPU_COPY_STRIDE_UNDEFINED (UINT32_MAX) -#define WGPU_DEPTH_SLICE_UNDEFINED (UINT32_MAX) -#define WGPU_LIMIT_U32_UNDEFINED (UINT32_MAX) -#define WGPU_LIMIT_U64_UNDEFINED (UINT64_MAX) -#define WGPU_MIP_LEVEL_COUNT_UNDEFINED (UINT32_MAX) -#define WGPU_QUERY_SET_INDEX_UNDEFINED (UINT32_MAX) -#define WGPU_WHOLE_MAP_SIZE (SIZE_MAX) -#define WGPU_WHOLE_SIZE (UINT64_MAX) +/** + * 'True' value of @ref WGPUBool. + * + * @remark It's not usually necessary to use this, as `true` (from + * `stdbool.h` or C++) casts to the same value. + */ +#define WGPU_TRUE (UINT32_C(1)) +/** + * 'False' value of @ref WGPUBool. + * + * @remark It's not usually necessary to use this, as `false` (from + * `stdbool.h` or C++) casts to the same value. + */ +#define WGPU_FALSE (UINT32_C(0)) +/** + * Indicates no array layer count is specified. For more info, + * see @ref SentinelValues and the places that use this sentinel value. + */ +#define WGPU_ARRAY_LAYER_COUNT_UNDEFINED (UINT32_MAX) +/** + * Indicates no copy stride is specified. For more info, + * see @ref SentinelValues and the places that use this sentinel value. + */ +#define WGPU_COPY_STRIDE_UNDEFINED (UINT32_MAX) +/** + * Indicates no depth clear value is specified. For more info, + * see @ref SentinelValues and the places that use this sentinel value. + */ +#define WGPU_DEPTH_CLEAR_VALUE_UNDEFINED (NAN) +/** + * Indicates no depth slice is specified. For more info, + * see @ref SentinelValues and the places that use this sentinel value. + */ +#define WGPU_DEPTH_SLICE_UNDEFINED (UINT32_MAX) +/** + * For `uint32_t` limits, indicates no limit value is specified. For more info, + * see @ref SentinelValues and the places that use this sentinel value. + */ +#define WGPU_LIMIT_U32_UNDEFINED (UINT32_MAX) +/** + * For `uint64_t` limits, indicates no limit value is specified. For more info, + * see @ref SentinelValues and the places that use this sentinel value. + */ +#define WGPU_LIMIT_U64_UNDEFINED (UINT64_MAX) +/** + * Indicates no mip level count is specified. For more info, + * see @ref SentinelValues and the places that use this sentinel value. + */ +#define WGPU_MIP_LEVEL_COUNT_UNDEFINED (UINT32_MAX) +/** + * Indicates no query set index is specified. For more info, + * see @ref SentinelValues and the places that use this sentinel value. + */ +#define WGPU_QUERY_SET_INDEX_UNDEFINED (UINT32_MAX) +/** + * Sentinel value used in @ref WGPUStringView to indicate that the pointer + * is to a null-terminated string, rather than an explicitly-sized string. + */ +#define WGPU_STRLEN (SIZE_MAX) +/** + * Indicates a size extending to the end of the buffer. For more info, + * see @ref SentinelValues and the places that use this sentinel value. + */ +#define WGPU_WHOLE_MAP_SIZE (SIZE_MAX) +/** + * Indicates a size extending to the end of the buffer. For more info, + * see @ref SentinelValues and the places that use this sentinel value. + */ +#define WGPU_WHOLE_SIZE (UINT64_MAX) /** @} */ @@ -93,8 +168,6 @@ * * @{ */ -typedef uint64_t WGPUFlags; -typedef uint32_t WGPUBool; /** * Nullable value defining a pointer+length view into a UTF-8 encoded string. @@ -118,26 +191,25 @@ typedef uint32_t WGPUBool; * For info on how this is used in various places, see \ref Strings. */ typedef struct WGPUStringView { - char const * WGPU_NULLABLE data; + WGPU_NULLABLE char const * data; size_t length; -} WGPUStringView; +} WGPUStringView WGPU_STRUCTURE_ATTRIBUTE; /** - * Sentinel value used in @ref WGPUStringView to indicate that the pointer - * is to a null-terminated string, rather than an explicitly-sized string. + * Initializer for @ref WGPUStringView. */ -#define WGPU_STRLEN SIZE_MAX - #define WGPU_STRING_VIEW_INIT _wgpu_MAKE_INIT_STRUCT(WGPUStringView, { \ /*.data=*/NULL _wgpu_COMMA \ /*.length=*/WGPU_STRLEN _wgpu_COMMA \ }) +typedef uint64_t WGPUFlags; +typedef uint32_t WGPUBool; /** @} */ /** - * \defgroup Objects + * \defgroup Objects Objects * \brief Opaque, non-dispatchable handles to WebGPU objects. * * @{ @@ -150,7 +222,17 @@ typedef struct WGPUCommandBufferImpl* WGPUCommandBuffer WGPU_OBJECT_ATTRIBUTE; typedef struct WGPUCommandEncoderImpl* WGPUCommandEncoder WGPU_OBJECT_ATTRIBUTE; typedef struct WGPUComputePassEncoderImpl* WGPUComputePassEncoder WGPU_OBJECT_ATTRIBUTE; typedef struct WGPUComputePipelineImpl* WGPUComputePipeline WGPU_OBJECT_ATTRIBUTE; +/** + * TODO + * + * Releasing the last ref to a `WGPUDevice` also calls @ref wgpuDeviceDestroy. + * For more info, see @ref DeviceRelease. + */ typedef struct WGPUDeviceImpl* WGPUDevice WGPU_OBJECT_ATTRIBUTE; +/** + * A sampleable 2D texture that may perform 0-copy YUV sampling internally. Creation of @ref WGPUExternalTexture is extremely implementation-dependent and not defined in this header. + */ +typedef struct WGPUExternalTextureImpl* WGPUExternalTexture WGPU_OBJECT_ATTRIBUTE; typedef struct WGPUInstanceImpl* WGPUInstance WGPU_OBJECT_ATTRIBUTE; typedef struct WGPUPipelineLayoutImpl* WGPUPipelineLayout WGPU_OBJECT_ATTRIBUTE; typedef struct WGPUQuerySetImpl* WGPUQuerySet WGPU_OBJECT_ATTRIBUTE; @@ -168,26 +250,27 @@ typedef struct WGPUSurfaceImpl* WGPUSurface WGPU_OBJECT_ATTRIBUTE; typedef struct WGPUTextureImpl* WGPUTexture WGPU_OBJECT_ATTRIBUTE; typedef struct WGPUTextureViewImpl* WGPUTextureView WGPU_OBJECT_ATTRIBUTE; - /** @} */ + // Structure forward declarations struct WGPUAdapterInfo; -struct WGPUBindGroupEntry; struct WGPUBlendComponent; struct WGPUBufferBindingLayout; struct WGPUBufferDescriptor; struct WGPUColor; struct WGPUCommandBufferDescriptor; struct WGPUCommandEncoderDescriptor; +struct WGPUCompatibilityModeLimits; struct WGPUCompilationMessage; -struct WGPUComputePassTimestampWrites; struct WGPUConstantEntry; struct WGPUExtent3D; +struct WGPUExternalTextureBindingEntry; +struct WGPUExternalTextureBindingLayout; struct WGPUFuture; -struct WGPUInstanceCapabilities; -struct WGPULimits; +struct WGPUInstanceLimits; struct WGPUMultisampleState; struct WGPUOrigin3D; +struct WGPUPassTimestampWrites; struct WGPUPipelineLayoutDescriptor; struct WGPUPrimitiveState; struct WGPUQuerySetDescriptor; @@ -196,20 +279,19 @@ struct WGPURenderBundleDescriptor; struct WGPURenderBundleEncoderDescriptor; struct WGPURenderPassDepthStencilAttachment; struct WGPURenderPassMaxDrawCount; -struct WGPURenderPassTimestampWrites; -struct WGPURequestAdapterOptions; +struct WGPURequestAdapterWebXROptions; struct WGPUSamplerBindingLayout; struct WGPUSamplerDescriptor; -struct WGPUShaderModuleDescriptor; struct WGPUShaderSourceSPIRV; struct WGPUShaderSourceWGSL; struct WGPUStencilFaceState; struct WGPUStorageTextureBindingLayout; struct WGPUSupportedFeatures; +struct WGPUSupportedInstanceFeatures; struct WGPUSupportedWGSLLanguageFeatures; struct WGPUSurfaceCapabilities; +struct WGPUSurfaceColorManagement; struct WGPUSurfaceConfiguration; -struct WGPUSurfaceDescriptor; struct WGPUSurfaceSourceAndroidNativeWindow; struct WGPUSurfaceSourceMetalLayer; struct WGPUSurfaceSourceWaylandSurface; @@ -219,27 +301,35 @@ struct WGPUSurfaceSourceXlibWindow; struct WGPUSurfaceTexture; struct WGPUTexelCopyBufferLayout; struct WGPUTextureBindingLayout; -struct WGPUTextureViewDescriptor; +struct WGPUTextureBindingViewDimension; +struct WGPUTextureComponentSwizzle; struct WGPUVertexAttribute; -struct WGPUBindGroupDescriptor; +struct WGPUBindGroupEntry; struct WGPUBindGroupLayoutEntry; struct WGPUBlendState; struct WGPUCompilationInfo; struct WGPUComputePassDescriptor; +struct WGPUComputeState; struct WGPUDepthStencilState; -struct WGPUDeviceDescriptor; struct WGPUFutureWaitInfo; struct WGPUInstanceDescriptor; -struct WGPUProgrammableStageDescriptor; +struct WGPULimits; struct WGPURenderPassColorAttachment; +struct WGPURequestAdapterOptions; +struct WGPUShaderModuleDescriptor; +struct WGPUSurfaceDescriptor; struct WGPUTexelCopyBufferInfo; struct WGPUTexelCopyTextureInfo; +struct WGPUTextureComponentSwizzleDescriptor; struct WGPUTextureDescriptor; struct WGPUVertexBufferLayout; +struct WGPUBindGroupDescriptor; struct WGPUBindGroupLayoutDescriptor; struct WGPUColorTargetState; struct WGPUComputePipelineDescriptor; +struct WGPUDeviceDescriptor; struct WGPURenderPassDescriptor; +struct WGPUTextureViewDescriptor; struct WGPUVertexState; struct WGPUFragmentState; struct WGPURenderPipelineDescriptor; @@ -256,13 +346,13 @@ struct WGPURequestAdapterCallbackInfo; struct WGPURequestDeviceCallbackInfo; struct WGPUUncapturedErrorCallbackInfo; - /** - * \defgroup Enumerations + * \defgroup Enumerations Enumerations * \brief Enums. * * @{ */ + typedef enum WGPUAdapterType { WGPUAdapterType_DiscreteGPU = 0x00000001, WGPUAdapterType_IntegratedGPU = 0x00000002, @@ -273,8 +363,7 @@ typedef enum WGPUAdapterType { typedef enum WGPUAddressMode { /** - * `0x00000000`. - * Indicates no value is passed for this argument. See @ref SentinelValues. + * `0`. Indicates no value is passed for this argument. See @ref SentinelValues. */ WGPUAddressMode_Undefined = 0x00000000, WGPUAddressMode_ClampToEdge = 0x00000001, @@ -285,8 +374,7 @@ typedef enum WGPUAddressMode { typedef enum WGPUBackendType { /** - * `0x00000000`. - * Indicates no value is passed for this argument. See @ref SentinelValues. + * `0`. Indicates no value is passed for this argument. See @ref SentinelValues. */ WGPUBackendType_Undefined = 0x00000000, WGPUBackendType_Null = 0x00000001, @@ -302,8 +390,7 @@ typedef enum WGPUBackendType { typedef enum WGPUBlendFactor { /** - * `0x00000000`. - * Indicates no value is passed for this argument. See @ref SentinelValues. + * `0`. Indicates no value is passed for this argument. See @ref SentinelValues. */ WGPUBlendFactor_Undefined = 0x00000000, WGPUBlendFactor_Zero = 0x00000001, @@ -328,8 +415,7 @@ typedef enum WGPUBlendFactor { typedef enum WGPUBlendOperation { /** - * `0x00000000`. - * Indicates no value is passed for this argument. See @ref SentinelValues. + * `0`. Indicates no value is passed for this argument. See @ref SentinelValues. */ WGPUBlendOperation_Undefined = 0x00000000, WGPUBlendOperation_Add = 0x00000001, @@ -342,15 +428,13 @@ typedef enum WGPUBlendOperation { typedef enum WGPUBufferBindingType { /** - * `0x00000000`. - * Indicates that this @ref WGPUBufferBindingLayout member of + * `0`. Indicates that this @ref WGPUBufferBindingLayout member of * its parent @ref WGPUBindGroupLayoutEntry is not used. * (See also @ref SentinelValues.) */ WGPUBufferBindingType_BindingNotUsed = 0x00000000, /** - * `0x00000001`. - * Indicates no value is passed for this argument. See @ref SentinelValues. + * `1`. Indicates no value is passed for this argument. See @ref SentinelValues. */ WGPUBufferBindingType_Undefined = 0x00000001, WGPUBufferBindingType_Uniform = 0x00000002, @@ -371,21 +455,18 @@ typedef enum WGPUBufferMapState { */ typedef enum WGPUCallbackMode { /** - * `0x00000001`. * Callbacks created with `WGPUCallbackMode_WaitAnyOnly`: - * - fire when the asynchronous operation's future is passed to a call to `::wgpuInstanceWaitAny` - * AND the operation has already completed or it completes inside the call to `::wgpuInstanceWaitAny`. + * - fire when the asynchronous operation's future is passed to a call to @ref wgpuInstanceWaitAny + * AND the operation has already completed or it completes inside the call to @ref wgpuInstanceWaitAny. */ WGPUCallbackMode_WaitAnyOnly = 0x00000001, /** - * `0x00000002`. * Callbacks created with `WGPUCallbackMode_AllowProcessEvents`: * - fire for the same reasons as callbacks created with `WGPUCallbackMode_WaitAnyOnly` - * - fire inside a call to `::wgpuInstanceProcessEvents` if the asynchronous operation is complete. + * - fire inside a call to @ref wgpuInstanceProcessEvents if the asynchronous operation is complete. */ WGPUCallbackMode_AllowProcessEvents = 0x00000002, /** - * `0x00000003`. * Callbacks created with `WGPUCallbackMode_AllowSpontaneous`: * - fire for the same reasons as callbacks created with `WGPUCallbackMode_AllowProcessEvents` * - **may** fire spontaneously on an arbitrary or application thread, when the WebGPU implementations discovers that the asynchronous operation is complete. @@ -400,8 +481,7 @@ typedef enum WGPUCallbackMode { typedef enum WGPUCompareFunction { /** - * `0x00000000`. - * Indicates no value is passed for this argument. See @ref SentinelValues. + * `0`. Indicates no value is passed for this argument. See @ref SentinelValues. */ WGPUCompareFunction_Undefined = 0x00000000, WGPUCompareFunction_Never = 0x00000001, @@ -417,9 +497,10 @@ typedef enum WGPUCompareFunction { typedef enum WGPUCompilationInfoRequestStatus { WGPUCompilationInfoRequestStatus_Success = 0x00000001, - WGPUCompilationInfoRequestStatus_InstanceDropped = 0x00000002, - WGPUCompilationInfoRequestStatus_Error = 0x00000003, - WGPUCompilationInfoRequestStatus_Unknown = 0x00000004, + /** + * See @ref CallbackStatuses. + */ + WGPUCompilationInfoRequestStatus_CallbackCancelled = 0x00000002, WGPUCompilationInfoRequestStatus_Force32 = 0x7FFFFFFF } WGPUCompilationInfoRequestStatus WGPU_ENUM_ATTRIBUTE; @@ -430,32 +511,59 @@ typedef enum WGPUCompilationMessageType { WGPUCompilationMessageType_Force32 = 0x7FFFFFFF } WGPUCompilationMessageType WGPU_ENUM_ATTRIBUTE; +typedef enum WGPUComponentSwizzle { + /** + * `0`. Indicates no value is passed for this argument. See @ref SentinelValues. + */ + WGPUComponentSwizzle_Undefined = 0x00000000, + /** + * Force its value to 0. + */ + WGPUComponentSwizzle_Zero = 0x00000001, + /** + * Force its value to 1. + */ + WGPUComponentSwizzle_One = 0x00000002, + /** + * Take its value from the red channel of the texture. + */ + WGPUComponentSwizzle_R = 0x00000003, + /** + * Take its value from the green channel of the texture. + */ + WGPUComponentSwizzle_G = 0x00000004, + /** + * Take its value from the blue channel of the texture. + */ + WGPUComponentSwizzle_B = 0x00000005, + /** + * Take its value from the alpha channel of the texture. + */ + WGPUComponentSwizzle_A = 0x00000006, + WGPUComponentSwizzle_Force32 = 0x7FFFFFFF +} WGPUComponentSwizzle WGPU_ENUM_ATTRIBUTE; + /** - * Describes how frames are composited with other contents on the screen when `::wgpuSurfacePresent` is called. + * Describes how frames are composited with other contents on the screen when @ref wgpuSurfacePresent is called. */ typedef enum WGPUCompositeAlphaMode { /** - * `0x00000000`. - * Lets the WebGPU implementation choose the best mode (supported, and with the best performance) between @ref WGPUCompositeAlphaMode_Opaque or @ref WGPUCompositeAlphaMode_Inherit. + * `0`. Lets the WebGPU implementation choose the best mode (supported, and with the best performance) between @ref WGPUCompositeAlphaMode_Opaque or @ref WGPUCompositeAlphaMode_Inherit. */ WGPUCompositeAlphaMode_Auto = 0x00000000, /** - * `0x00000001`. * The alpha component of the image is ignored and teated as if it is always 1.0. */ WGPUCompositeAlphaMode_Opaque = 0x00000001, /** - * `0x00000002`. * The alpha component is respected and non-alpha components are assumed to be already multiplied with the alpha component. For example, (0.5, 0, 0, 0.5) is semi-transparent bright red. */ WGPUCompositeAlphaMode_Premultiplied = 0x00000002, /** - * `0x00000003`. * The alpha component is respected and non-alpha components are assumed to NOT be already multiplied with the alpha component. For example, (1.0, 0, 0, 0.5) is semi-transparent bright red. */ WGPUCompositeAlphaMode_Unpremultiplied = 0x00000003, /** - * `0x00000004`. * The handling of the alpha component is unknown to WebGPU and should be handled by the application using system-specific APIs. This mode may be unavailable (for example on Wasm). */ WGPUCompositeAlphaMode_Inherit = 0x00000004, @@ -464,17 +572,18 @@ typedef enum WGPUCompositeAlphaMode { typedef enum WGPUCreatePipelineAsyncStatus { WGPUCreatePipelineAsyncStatus_Success = 0x00000001, - WGPUCreatePipelineAsyncStatus_InstanceDropped = 0x00000002, + /** + * See @ref CallbackStatuses. + */ + WGPUCreatePipelineAsyncStatus_CallbackCancelled = 0x00000002, WGPUCreatePipelineAsyncStatus_ValidationError = 0x00000003, WGPUCreatePipelineAsyncStatus_InternalError = 0x00000004, - WGPUCreatePipelineAsyncStatus_Unknown = 0x00000005, WGPUCreatePipelineAsyncStatus_Force32 = 0x7FFFFFFF } WGPUCreatePipelineAsyncStatus WGPU_ENUM_ATTRIBUTE; typedef enum WGPUCullMode { /** - * `0x00000000`. - * Indicates no value is passed for this argument. See @ref SentinelValues. + * `0`. Indicates no value is passed for this argument. See @ref SentinelValues. */ WGPUCullMode_Undefined = 0x00000000, WGPUCullMode_None = 0x00000001, @@ -486,7 +595,10 @@ typedef enum WGPUCullMode { typedef enum WGPUDeviceLostReason { WGPUDeviceLostReason_Unknown = 0x00000001, WGPUDeviceLostReason_Destroyed = 0x00000002, - WGPUDeviceLostReason_InstanceDropped = 0x00000003, + /** + * See @ref CallbackStatuses. + */ + WGPUDeviceLostReason_CallbackCancelled = 0x00000003, WGPUDeviceLostReason_FailedCreation = 0x00000004, WGPUDeviceLostReason_Force32 = 0x7FFFFFFF } WGPUDeviceLostReason WGPU_ENUM_ATTRIBUTE; @@ -512,43 +624,49 @@ typedef enum WGPUErrorType { */ typedef enum WGPUFeatureLevel { /** - * `0x00000001`. - * "Compatibility" profile which can be supported on OpenGL ES 3.1. + * `0`. Indicates no value is passed for this argument. See @ref SentinelValues. + */ + WGPUFeatureLevel_Undefined = 0x00000000, + /** + * "Compatibility" profile which can be supported on OpenGL ES 3.1 and D3D11. */ WGPUFeatureLevel_Compatibility = 0x00000001, /** - * `0x00000002`. - * "Core" profile which can be supported on Vulkan/Metal/D3D12. + * "Core" profile which can be supported on Vulkan/Metal/D3D12 (at least). */ WGPUFeatureLevel_Core = 0x00000002, WGPUFeatureLevel_Force32 = 0x7FFFFFFF } WGPUFeatureLevel WGPU_ENUM_ATTRIBUTE; typedef enum WGPUFeatureName { - WGPUFeatureName_Undefined = 0x00000000, - WGPUFeatureName_DepthClipControl = 0x00000001, - WGPUFeatureName_Depth32FloatStencil8 = 0x00000002, - WGPUFeatureName_TimestampQuery = 0x00000003, + WGPUFeatureName_CoreFeaturesAndLimits = 0x00000001, + WGPUFeatureName_DepthClipControl = 0x00000002, + WGPUFeatureName_Depth32FloatStencil8 = 0x00000003, WGPUFeatureName_TextureCompressionBC = 0x00000004, WGPUFeatureName_TextureCompressionBCSliced3D = 0x00000005, WGPUFeatureName_TextureCompressionETC2 = 0x00000006, WGPUFeatureName_TextureCompressionASTC = 0x00000007, WGPUFeatureName_TextureCompressionASTCSliced3D = 0x00000008, - WGPUFeatureName_IndirectFirstInstance = 0x00000009, - WGPUFeatureName_ShaderF16 = 0x0000000A, - WGPUFeatureName_RG11B10UfloatRenderable = 0x0000000B, - WGPUFeatureName_BGRA8UnormStorage = 0x0000000C, - WGPUFeatureName_Float32Filterable = 0x0000000D, - WGPUFeatureName_Float32Blendable = 0x0000000E, - WGPUFeatureName_ClipDistances = 0x0000000F, - WGPUFeatureName_DualSourceBlending = 0x00000010, + WGPUFeatureName_TimestampQuery = 0x00000009, + WGPUFeatureName_IndirectFirstInstance = 0x0000000A, + WGPUFeatureName_ShaderF16 = 0x0000000B, + WGPUFeatureName_RG11B10UfloatRenderable = 0x0000000C, + WGPUFeatureName_BGRA8UnormStorage = 0x0000000D, + WGPUFeatureName_Float32Filterable = 0x0000000E, + WGPUFeatureName_Float32Blendable = 0x0000000F, + WGPUFeatureName_ClipDistances = 0x00000010, + WGPUFeatureName_DualSourceBlending = 0x00000011, + WGPUFeatureName_Subgroups = 0x00000012, + WGPUFeatureName_TextureFormatsTier1 = 0x00000013, + WGPUFeatureName_TextureFormatsTier2 = 0x00000014, + WGPUFeatureName_PrimitiveIndex = 0x00000015, + WGPUFeatureName_TextureComponentSwizzle = 0x00000016, WGPUFeatureName_Force32 = 0x7FFFFFFF } WGPUFeatureName WGPU_ENUM_ATTRIBUTE; typedef enum WGPUFilterMode { /** - * `0x00000000`. - * Indicates no value is passed for this argument. See @ref SentinelValues. + * `0`. Indicates no value is passed for this argument. See @ref SentinelValues. */ WGPUFilterMode_Undefined = 0x00000000, WGPUFilterMode_Nearest = 0x00000001, @@ -558,8 +676,7 @@ typedef enum WGPUFilterMode { typedef enum WGPUFrontFace { /** - * `0x00000000`. - * Indicates no value is passed for this argument. See @ref SentinelValues. + * `0`. Indicates no value is passed for this argument. See @ref SentinelValues. */ WGPUFrontFace_Undefined = 0x00000000, WGPUFrontFace_CCW = 0x00000001, @@ -569,8 +686,7 @@ typedef enum WGPUFrontFace { typedef enum WGPUIndexFormat { /** - * `0x00000000`. - * Indicates no value is passed for this argument. See @ref SentinelValues. + * `0`. Indicates no value is passed for this argument. See @ref SentinelValues. */ WGPUIndexFormat_Undefined = 0x00000000, WGPUIndexFormat_Uint16 = 0x00000001, @@ -578,10 +694,29 @@ typedef enum WGPUIndexFormat { WGPUIndexFormat_Force32 = 0x7FFFFFFF } WGPUIndexFormat WGPU_ENUM_ATTRIBUTE; +typedef enum WGPUInstanceFeatureName { + /** + * Enable use of ::wgpuInstanceWaitAny with `timeoutNS > 0`. + */ + WGPUInstanceFeatureName_TimedWaitAny = 0x00000001, + /** + * Enable passing SPIR-V shaders to @ref wgpuDeviceCreateShaderModule, + * via @ref WGPUShaderSourceSPIRV. + */ + WGPUInstanceFeatureName_ShaderSourceSPIRV = 0x00000002, + /** + * Normally, a @ref WGPUAdapter can only create a single device. If this is + * available and enabled, then adapters won't immediately expire when they + * create a device, so can be reused to make multiple devices. They may + * still expire for other reasons. + */ + WGPUInstanceFeatureName_MultipleDevicesPerAdapter = 0x00000003, + WGPUInstanceFeatureName_Force32 = 0x7FFFFFFF +} WGPUInstanceFeatureName WGPU_ENUM_ATTRIBUTE; + typedef enum WGPULoadOp { /** - * `0x00000000`. - * Indicates no value is passed for this argument. See @ref SentinelValues. + * `0`. Indicates no value is passed for this argument. See @ref SentinelValues. */ WGPULoadOp_Undefined = 0x00000000, WGPULoadOp_Load = 0x00000001, @@ -591,17 +726,18 @@ typedef enum WGPULoadOp { typedef enum WGPUMapAsyncStatus { WGPUMapAsyncStatus_Success = 0x00000001, - WGPUMapAsyncStatus_InstanceDropped = 0x00000002, + /** + * See @ref CallbackStatuses. + */ + WGPUMapAsyncStatus_CallbackCancelled = 0x00000002, WGPUMapAsyncStatus_Error = 0x00000003, WGPUMapAsyncStatus_Aborted = 0x00000004, - WGPUMapAsyncStatus_Unknown = 0x00000005, WGPUMapAsyncStatus_Force32 = 0x7FFFFFFF } WGPUMapAsyncStatus WGPU_ENUM_ATTRIBUTE; typedef enum WGPUMipmapFilterMode { /** - * `0x00000000`. - * Indicates no value is passed for this argument. See @ref SentinelValues. + * `0`. Indicates no value is passed for this argument. See @ref SentinelValues. */ WGPUMipmapFilterMode_Undefined = 0x00000000, WGPUMipmapFilterMode_Nearest = 0x00000001, @@ -610,6 +746,9 @@ typedef enum WGPUMipmapFilterMode { } WGPUMipmapFilterMode WGPU_ENUM_ATTRIBUTE; typedef enum WGPUOptionalBool { + /** + * `0`. + */ WGPUOptionalBool_False = 0x00000000, WGPUOptionalBool_True = 0x00000001, WGPUOptionalBool_Undefined = 0x00000002, @@ -618,23 +757,23 @@ typedef enum WGPUOptionalBool { typedef enum WGPUPopErrorScopeStatus { /** - * `0x00000001`. * The error scope stack was successfully popped and a result was reported. */ WGPUPopErrorScopeStatus_Success = 0x00000001, - WGPUPopErrorScopeStatus_InstanceDropped = 0x00000002, /** - * `0x00000003`. + * See @ref CallbackStatuses. + */ + WGPUPopErrorScopeStatus_CallbackCancelled = 0x00000002, + /** * The error scope stack could not be popped, because it was empty. */ - WGPUPopErrorScopeStatus_EmptyStack = 0x00000003, + WGPUPopErrorScopeStatus_Error = 0x00000003, WGPUPopErrorScopeStatus_Force32 = 0x7FFFFFFF } WGPUPopErrorScopeStatus WGPU_ENUM_ATTRIBUTE; typedef enum WGPUPowerPreference { /** - * `0x00000000`. - * No preference. (See also @ref SentinelValues.) + * `0`. No preference. (See also @ref SentinelValues.) */ WGPUPowerPreference_Undefined = 0x00000000, WGPUPowerPreference_LowPower = 0x00000001, @@ -642,37 +781,38 @@ typedef enum WGPUPowerPreference { WGPUPowerPreference_Force32 = 0x7FFFFFFF } WGPUPowerPreference WGPU_ENUM_ATTRIBUTE; +typedef enum WGPUPredefinedColorSpace { + WGPUPredefinedColorSpace_SRGB = 0x00000001, + WGPUPredefinedColorSpace_DisplayP3 = 0x00000002, + WGPUPredefinedColorSpace_Force32 = 0x7FFFFFFF +} WGPUPredefinedColorSpace WGPU_ENUM_ATTRIBUTE; + /** - * Describes when and in which order frames are presented on the screen when `::wgpuSurfacePresent` is called. + * Describes when and in which order frames are presented on the screen when @ref wgpuSurfacePresent is called. */ typedef enum WGPUPresentMode { /** - * `0x00000000`. - * Present mode is not specified. Use the default. + * `0`. Present mode is not specified. Use the default. */ WGPUPresentMode_Undefined = 0x00000000, /** - * `0x00000001`. * The presentation of the image to the user waits for the next vertical blanking period to update in a first-in, first-out manner. * Tearing cannot be observed and frame-loop will be limited to the display's refresh rate. * This is the only mode that's always available. */ WGPUPresentMode_Fifo = 0x00000001, /** - * `0x00000002`. * The presentation of the image to the user tries to wait for the next vertical blanking period but may decide to not wait if a frame is presented late. * Tearing can sometimes be observed but late-frame don't produce a full-frame stutter in the presentation. * This is still a first-in, first-out mechanism so a frame-loop will be limited to the display's refresh rate. */ WGPUPresentMode_FifoRelaxed = 0x00000002, /** - * `0x00000003`. * The presentation of the image to the user is updated immediately without waiting for a vertical blank. * Tearing can be observed but latency is minimized. */ WGPUPresentMode_Immediate = 0x00000003, /** - * `0x00000004`. * The presentation of the image to the user waits for the next vertical blanking period to update to the latest provided image. * Tearing cannot be observed and a frame-loop is not limited to the display's refresh rate. */ @@ -682,8 +822,7 @@ typedef enum WGPUPresentMode { typedef enum WGPUPrimitiveTopology { /** - * `0x00000000`. - * Indicates no value is passed for this argument. See @ref SentinelValues. + * `0`. Indicates no value is passed for this argument. See @ref SentinelValues. */ WGPUPrimitiveTopology_Undefined = 0x00000000, WGPUPrimitiveTopology_PointList = 0x00000001, @@ -702,53 +841,48 @@ typedef enum WGPUQueryType { typedef enum WGPUQueueWorkDoneStatus { WGPUQueueWorkDoneStatus_Success = 0x00000001, - WGPUQueueWorkDoneStatus_InstanceDropped = 0x00000002, + /** + * See @ref CallbackStatuses. + */ + WGPUQueueWorkDoneStatus_CallbackCancelled = 0x00000002, + /** + * There was some deterministic error. (Note this is currently never used, + * but it will be relevant when it's possible to create a queue object.) + */ WGPUQueueWorkDoneStatus_Error = 0x00000003, - WGPUQueueWorkDoneStatus_Unknown = 0x00000004, WGPUQueueWorkDoneStatus_Force32 = 0x7FFFFFFF } WGPUQueueWorkDoneStatus WGPU_ENUM_ATTRIBUTE; typedef enum WGPURequestAdapterStatus { WGPURequestAdapterStatus_Success = 0x00000001, - WGPURequestAdapterStatus_InstanceDropped = 0x00000002, + /** + * See @ref CallbackStatuses. + */ + WGPURequestAdapterStatus_CallbackCancelled = 0x00000002, WGPURequestAdapterStatus_Unavailable = 0x00000003, WGPURequestAdapterStatus_Error = 0x00000004, - WGPURequestAdapterStatus_Unknown = 0x00000005, WGPURequestAdapterStatus_Force32 = 0x7FFFFFFF } WGPURequestAdapterStatus WGPU_ENUM_ATTRIBUTE; typedef enum WGPURequestDeviceStatus { WGPURequestDeviceStatus_Success = 0x00000001, - WGPURequestDeviceStatus_InstanceDropped = 0x00000002, + /** + * See @ref CallbackStatuses. + */ + WGPURequestDeviceStatus_CallbackCancelled = 0x00000002, WGPURequestDeviceStatus_Error = 0x00000003, - WGPURequestDeviceStatus_Unknown = 0x00000004, WGPURequestDeviceStatus_Force32 = 0x7FFFFFFF } WGPURequestDeviceStatus WGPU_ENUM_ATTRIBUTE; -typedef enum WGPUSType { - WGPUSType_ShaderSourceSPIRV = 0x00000001, - WGPUSType_ShaderSourceWGSL = 0x00000002, - WGPUSType_RenderPassMaxDrawCount = 0x00000003, - WGPUSType_SurfaceSourceMetalLayer = 0x00000004, - WGPUSType_SurfaceSourceWindowsHWND = 0x00000005, - WGPUSType_SurfaceSourceXlibWindow = 0x00000006, - WGPUSType_SurfaceSourceWaylandSurface = 0x00000007, - WGPUSType_SurfaceSourceAndroidNativeWindow = 0x00000008, - WGPUSType_SurfaceSourceXCBWindow = 0x00000009, - WGPUSType_Force32 = 0x7FFFFFFF -} WGPUSType WGPU_ENUM_ATTRIBUTE; - typedef enum WGPUSamplerBindingType { /** - * `0x00000000`. - * Indicates that this @ref WGPUSamplerBindingLayout member of + * `0`. Indicates that this @ref WGPUSamplerBindingLayout member of * its parent @ref WGPUBindGroupLayoutEntry is not used. * (See also @ref SentinelValues.) */ WGPUSamplerBindingType_BindingNotUsed = 0x00000000, /** - * `0x00000001`. - * Indicates no value is passed for this argument. See @ref SentinelValues. + * `1`. Indicates no value is passed for this argument. See @ref SentinelValues. */ WGPUSamplerBindingType_Undefined = 0x00000001, WGPUSamplerBindingType_Filtering = 0x00000002, @@ -770,8 +904,7 @@ typedef enum WGPUStatus { typedef enum WGPUStencilOperation { /** - * `0x00000000`. - * Indicates no value is passed for this argument. See @ref SentinelValues. + * `0`. Indicates no value is passed for this argument. See @ref SentinelValues. */ WGPUStencilOperation_Undefined = 0x00000000, WGPUStencilOperation_Keep = 0x00000001, @@ -787,15 +920,13 @@ typedef enum WGPUStencilOperation { typedef enum WGPUStorageTextureAccess { /** - * `0x00000000`. - * Indicates that this @ref WGPUStorageTextureBindingLayout member of + * `0`. Indicates that this @ref WGPUStorageTextureBindingLayout member of * its parent @ref WGPUBindGroupLayoutEntry is not used. * (See also @ref SentinelValues.) */ WGPUStorageTextureAccess_BindingNotUsed = 0x00000000, /** - * `0x00000001`. - * Indicates no value is passed for this argument. See @ref SentinelValues. + * `1`. Indicates no value is passed for this argument. See @ref SentinelValues. */ WGPUStorageTextureAccess_Undefined = 0x00000001, WGPUStorageTextureAccess_WriteOnly = 0x00000002, @@ -806,8 +937,7 @@ typedef enum WGPUStorageTextureAccess { typedef enum WGPUStoreOp { /** - * `0x00000000`. - * Indicates no value is passed for this argument. See @ref SentinelValues. + * `0`. Indicates no value is passed for this argument. See @ref SentinelValues. */ WGPUStoreOp_Undefined = 0x00000000, WGPUStoreOp_Store = 0x00000001, @@ -815,57 +945,60 @@ typedef enum WGPUStoreOp { WGPUStoreOp_Force32 = 0x7FFFFFFF } WGPUStoreOp WGPU_ENUM_ATTRIBUTE; +typedef enum WGPUSType { + WGPUSType_ShaderSourceSPIRV = 0x00000001, + WGPUSType_ShaderSourceWGSL = 0x00000002, + WGPUSType_RenderPassMaxDrawCount = 0x00000003, + WGPUSType_SurfaceSourceMetalLayer = 0x00000004, + WGPUSType_SurfaceSourceWindowsHWND = 0x00000005, + WGPUSType_SurfaceSourceXlibWindow = 0x00000006, + WGPUSType_SurfaceSourceWaylandSurface = 0x00000007, + WGPUSType_SurfaceSourceAndroidNativeWindow = 0x00000008, + WGPUSType_SurfaceSourceXCBWindow = 0x00000009, + WGPUSType_SurfaceColorManagement = 0x0000000A, + WGPUSType_RequestAdapterWebXROptions = 0x0000000B, + WGPUSType_TextureComponentSwizzleDescriptor = 0x0000000C, + WGPUSType_ExternalTextureBindingLayout = 0x0000000D, + WGPUSType_ExternalTextureBindingEntry = 0x0000000E, + WGPUSType_CompatibilityModeLimits = 0x0000000F, + WGPUSType_TextureBindingViewDimension = 0x00000010, + WGPUSType_Force32 = 0x7FFFFFFF +} WGPUSType WGPU_ENUM_ATTRIBUTE; + /** - * The status enum for `::wgpuSurfaceGetCurrentTexture`. + * The status enum for @ref wgpuSurfaceGetCurrentTexture. */ typedef enum WGPUSurfaceGetCurrentTextureStatus { /** - * `0x00000001`. * Yay! Everything is good and we can render this frame. */ WGPUSurfaceGetCurrentTextureStatus_SuccessOptimal = 0x00000001, /** - * `0x00000002`. * Still OK - the surface can present the frame, but in a suboptimal way. The surface may need reconfiguration. */ WGPUSurfaceGetCurrentTextureStatus_SuccessSuboptimal = 0x00000002, /** - * `0x00000003`. * Some operation timed out while trying to acquire the frame. */ WGPUSurfaceGetCurrentTextureStatus_Timeout = 0x00000003, /** - * `0x00000004`. * The surface is too different to be used, compared to when it was originally created. */ WGPUSurfaceGetCurrentTextureStatus_Outdated = 0x00000004, /** - * `0x00000005`. - * The connection to whatever owns the surface was lost. + * The connection to whatever owns the surface was lost, or generally needs to be fully reinitialized. */ WGPUSurfaceGetCurrentTextureStatus_Lost = 0x00000005, /** - * `0x00000006`. - * The system ran out of memory. + * There was some deterministic error (for example, the surface is not configured, or there was an @ref OutStructChainError). Should produce @ref ImplementationDefinedLogging containing details. */ - WGPUSurfaceGetCurrentTextureStatus_OutOfMemory = 0x00000006, - /** - * `0x00000007`. - * The @ref WGPUDevice configured on the @ref WGPUSurface was lost. - */ - WGPUSurfaceGetCurrentTextureStatus_DeviceLost = 0x00000007, - /** - * `0x00000008`. - * The surface is not configured, or there was an @ref OutStructChainError. - */ - WGPUSurfaceGetCurrentTextureStatus_Error = 0x00000008, + WGPUSurfaceGetCurrentTextureStatus_Error = 0x00000006, WGPUSurfaceGetCurrentTextureStatus_Force32 = 0x7FFFFFFF } WGPUSurfaceGetCurrentTextureStatus WGPU_ENUM_ATTRIBUTE; typedef enum WGPUTextureAspect { /** - * `0x00000000`. - * Indicates no value is passed for this argument. See @ref SentinelValues. + * `0`. Indicates no value is passed for this argument. See @ref SentinelValues. */ WGPUTextureAspect_Undefined = 0x00000000, WGPUTextureAspect_All = 0x00000001, @@ -876,8 +1009,7 @@ typedef enum WGPUTextureAspect { typedef enum WGPUTextureDimension { /** - * `0x00000000`. - * Indicates no value is passed for this argument. See @ref SentinelValues. + * `0`. Indicates no value is passed for this argument. See @ref SentinelValues. */ WGPUTextureDimension_Undefined = 0x00000000, WGPUTextureDimension_1D = 0x00000001, @@ -888,119 +1020,122 @@ typedef enum WGPUTextureDimension { typedef enum WGPUTextureFormat { /** - * `0x00000000`. - * Indicates no value is passed for this argument. See @ref SentinelValues. + * `0`. Indicates no value is passed for this argument. See @ref SentinelValues. */ WGPUTextureFormat_Undefined = 0x00000000, WGPUTextureFormat_R8Unorm = 0x00000001, WGPUTextureFormat_R8Snorm = 0x00000002, WGPUTextureFormat_R8Uint = 0x00000003, WGPUTextureFormat_R8Sint = 0x00000004, - WGPUTextureFormat_R16Uint = 0x00000005, - WGPUTextureFormat_R16Sint = 0x00000006, - WGPUTextureFormat_R16Float = 0x00000007, - WGPUTextureFormat_RG8Unorm = 0x00000008, - WGPUTextureFormat_RG8Snorm = 0x00000009, - WGPUTextureFormat_RG8Uint = 0x0000000A, - WGPUTextureFormat_RG8Sint = 0x0000000B, - WGPUTextureFormat_R32Float = 0x0000000C, - WGPUTextureFormat_R32Uint = 0x0000000D, - WGPUTextureFormat_R32Sint = 0x0000000E, - WGPUTextureFormat_RG16Uint = 0x0000000F, - WGPUTextureFormat_RG16Sint = 0x00000010, - WGPUTextureFormat_RG16Float = 0x00000011, - WGPUTextureFormat_RGBA8Unorm = 0x00000012, - WGPUTextureFormat_RGBA8UnormSrgb = 0x00000013, - WGPUTextureFormat_RGBA8Snorm = 0x00000014, - WGPUTextureFormat_RGBA8Uint = 0x00000015, - WGPUTextureFormat_RGBA8Sint = 0x00000016, - WGPUTextureFormat_BGRA8Unorm = 0x00000017, - WGPUTextureFormat_BGRA8UnormSrgb = 0x00000018, - WGPUTextureFormat_RGB10A2Uint = 0x00000019, - WGPUTextureFormat_RGB10A2Unorm = 0x0000001A, - WGPUTextureFormat_RG11B10Ufloat = 0x0000001B, - WGPUTextureFormat_RGB9E5Ufloat = 0x0000001C, - WGPUTextureFormat_RG32Float = 0x0000001D, - WGPUTextureFormat_RG32Uint = 0x0000001E, - WGPUTextureFormat_RG32Sint = 0x0000001F, - WGPUTextureFormat_RGBA16Uint = 0x00000020, - WGPUTextureFormat_RGBA16Sint = 0x00000021, - WGPUTextureFormat_RGBA16Float = 0x00000022, - WGPUTextureFormat_RGBA32Float = 0x00000023, - WGPUTextureFormat_RGBA32Uint = 0x00000024, - WGPUTextureFormat_RGBA32Sint = 0x00000025, - WGPUTextureFormat_Stencil8 = 0x00000026, - WGPUTextureFormat_Depth16Unorm = 0x00000027, - WGPUTextureFormat_Depth24Plus = 0x00000028, - WGPUTextureFormat_Depth24PlusStencil8 = 0x00000029, - WGPUTextureFormat_Depth32Float = 0x0000002A, - WGPUTextureFormat_Depth32FloatStencil8 = 0x0000002B, - WGPUTextureFormat_BC1RGBAUnorm = 0x0000002C, - WGPUTextureFormat_BC1RGBAUnormSrgb = 0x0000002D, - WGPUTextureFormat_BC2RGBAUnorm = 0x0000002E, - WGPUTextureFormat_BC2RGBAUnormSrgb = 0x0000002F, - WGPUTextureFormat_BC3RGBAUnorm = 0x00000030, - WGPUTextureFormat_BC3RGBAUnormSrgb = 0x00000031, - WGPUTextureFormat_BC4RUnorm = 0x00000032, - WGPUTextureFormat_BC4RSnorm = 0x00000033, - WGPUTextureFormat_BC5RGUnorm = 0x00000034, - WGPUTextureFormat_BC5RGSnorm = 0x00000035, - WGPUTextureFormat_BC6HRGBUfloat = 0x00000036, - WGPUTextureFormat_BC6HRGBFloat = 0x00000037, - WGPUTextureFormat_BC7RGBAUnorm = 0x00000038, - WGPUTextureFormat_BC7RGBAUnormSrgb = 0x00000039, - WGPUTextureFormat_ETC2RGB8Unorm = 0x0000003A, - WGPUTextureFormat_ETC2RGB8UnormSrgb = 0x0000003B, - WGPUTextureFormat_ETC2RGB8A1Unorm = 0x0000003C, - WGPUTextureFormat_ETC2RGB8A1UnormSrgb = 0x0000003D, - WGPUTextureFormat_ETC2RGBA8Unorm = 0x0000003E, - WGPUTextureFormat_ETC2RGBA8UnormSrgb = 0x0000003F, - WGPUTextureFormat_EACR11Unorm = 0x00000040, - WGPUTextureFormat_EACR11Snorm = 0x00000041, - WGPUTextureFormat_EACRG11Unorm = 0x00000042, - WGPUTextureFormat_EACRG11Snorm = 0x00000043, - WGPUTextureFormat_ASTC4x4Unorm = 0x00000044, - WGPUTextureFormat_ASTC4x4UnormSrgb = 0x00000045, - WGPUTextureFormat_ASTC5x4Unorm = 0x00000046, - WGPUTextureFormat_ASTC5x4UnormSrgb = 0x00000047, - WGPUTextureFormat_ASTC5x5Unorm = 0x00000048, - WGPUTextureFormat_ASTC5x5UnormSrgb = 0x00000049, - WGPUTextureFormat_ASTC6x5Unorm = 0x0000004A, - WGPUTextureFormat_ASTC6x5UnormSrgb = 0x0000004B, - WGPUTextureFormat_ASTC6x6Unorm = 0x0000004C, - WGPUTextureFormat_ASTC6x6UnormSrgb = 0x0000004D, - WGPUTextureFormat_ASTC8x5Unorm = 0x0000004E, - WGPUTextureFormat_ASTC8x5UnormSrgb = 0x0000004F, - WGPUTextureFormat_ASTC8x6Unorm = 0x00000050, - WGPUTextureFormat_ASTC8x6UnormSrgb = 0x00000051, - WGPUTextureFormat_ASTC8x8Unorm = 0x00000052, - WGPUTextureFormat_ASTC8x8UnormSrgb = 0x00000053, - WGPUTextureFormat_ASTC10x5Unorm = 0x00000054, - WGPUTextureFormat_ASTC10x5UnormSrgb = 0x00000055, - WGPUTextureFormat_ASTC10x6Unorm = 0x00000056, - WGPUTextureFormat_ASTC10x6UnormSrgb = 0x00000057, - WGPUTextureFormat_ASTC10x8Unorm = 0x00000058, - WGPUTextureFormat_ASTC10x8UnormSrgb = 0x00000059, - WGPUTextureFormat_ASTC10x10Unorm = 0x0000005A, - WGPUTextureFormat_ASTC10x10UnormSrgb = 0x0000005B, - WGPUTextureFormat_ASTC12x10Unorm = 0x0000005C, - WGPUTextureFormat_ASTC12x10UnormSrgb = 0x0000005D, - WGPUTextureFormat_ASTC12x12Unorm = 0x0000005E, - WGPUTextureFormat_ASTC12x12UnormSrgb = 0x0000005F, + WGPUTextureFormat_R16Unorm = 0x00000005, + WGPUTextureFormat_R16Snorm = 0x00000006, + WGPUTextureFormat_R16Uint = 0x00000007, + WGPUTextureFormat_R16Sint = 0x00000008, + WGPUTextureFormat_R16Float = 0x00000009, + WGPUTextureFormat_RG8Unorm = 0x0000000A, + WGPUTextureFormat_RG8Snorm = 0x0000000B, + WGPUTextureFormat_RG8Uint = 0x0000000C, + WGPUTextureFormat_RG8Sint = 0x0000000D, + WGPUTextureFormat_R32Float = 0x0000000E, + WGPUTextureFormat_R32Uint = 0x0000000F, + WGPUTextureFormat_R32Sint = 0x00000010, + WGPUTextureFormat_RG16Unorm = 0x00000011, + WGPUTextureFormat_RG16Snorm = 0x00000012, + WGPUTextureFormat_RG16Uint = 0x00000013, + WGPUTextureFormat_RG16Sint = 0x00000014, + WGPUTextureFormat_RG16Float = 0x00000015, + WGPUTextureFormat_RGBA8Unorm = 0x00000016, + WGPUTextureFormat_RGBA8UnormSrgb = 0x00000017, + WGPUTextureFormat_RGBA8Snorm = 0x00000018, + WGPUTextureFormat_RGBA8Uint = 0x00000019, + WGPUTextureFormat_RGBA8Sint = 0x0000001A, + WGPUTextureFormat_BGRA8Unorm = 0x0000001B, + WGPUTextureFormat_BGRA8UnormSrgb = 0x0000001C, + WGPUTextureFormat_RGB10A2Uint = 0x0000001D, + WGPUTextureFormat_RGB10A2Unorm = 0x0000001E, + WGPUTextureFormat_RG11B10Ufloat = 0x0000001F, + WGPUTextureFormat_RGB9E5Ufloat = 0x00000020, + WGPUTextureFormat_RG32Float = 0x00000021, + WGPUTextureFormat_RG32Uint = 0x00000022, + WGPUTextureFormat_RG32Sint = 0x00000023, + WGPUTextureFormat_RGBA16Unorm = 0x00000024, + WGPUTextureFormat_RGBA16Snorm = 0x00000025, + WGPUTextureFormat_RGBA16Uint = 0x00000026, + WGPUTextureFormat_RGBA16Sint = 0x00000027, + WGPUTextureFormat_RGBA16Float = 0x00000028, + WGPUTextureFormat_RGBA32Float = 0x00000029, + WGPUTextureFormat_RGBA32Uint = 0x0000002A, + WGPUTextureFormat_RGBA32Sint = 0x0000002B, + WGPUTextureFormat_Stencil8 = 0x0000002C, + WGPUTextureFormat_Depth16Unorm = 0x0000002D, + WGPUTextureFormat_Depth24Plus = 0x0000002E, + WGPUTextureFormat_Depth24PlusStencil8 = 0x0000002F, + WGPUTextureFormat_Depth32Float = 0x00000030, + WGPUTextureFormat_Depth32FloatStencil8 = 0x00000031, + WGPUTextureFormat_BC1RGBAUnorm = 0x00000032, + WGPUTextureFormat_BC1RGBAUnormSrgb = 0x00000033, + WGPUTextureFormat_BC2RGBAUnorm = 0x00000034, + WGPUTextureFormat_BC2RGBAUnormSrgb = 0x00000035, + WGPUTextureFormat_BC3RGBAUnorm = 0x00000036, + WGPUTextureFormat_BC3RGBAUnormSrgb = 0x00000037, + WGPUTextureFormat_BC4RUnorm = 0x00000038, + WGPUTextureFormat_BC4RSnorm = 0x00000039, + WGPUTextureFormat_BC5RGUnorm = 0x0000003A, + WGPUTextureFormat_BC5RGSnorm = 0x0000003B, + WGPUTextureFormat_BC6HRGBUfloat = 0x0000003C, + WGPUTextureFormat_BC6HRGBFloat = 0x0000003D, + WGPUTextureFormat_BC7RGBAUnorm = 0x0000003E, + WGPUTextureFormat_BC7RGBAUnormSrgb = 0x0000003F, + WGPUTextureFormat_ETC2RGB8Unorm = 0x00000040, + WGPUTextureFormat_ETC2RGB8UnormSrgb = 0x00000041, + WGPUTextureFormat_ETC2RGB8A1Unorm = 0x00000042, + WGPUTextureFormat_ETC2RGB8A1UnormSrgb = 0x00000043, + WGPUTextureFormat_ETC2RGBA8Unorm = 0x00000044, + WGPUTextureFormat_ETC2RGBA8UnormSrgb = 0x00000045, + WGPUTextureFormat_EACR11Unorm = 0x00000046, + WGPUTextureFormat_EACR11Snorm = 0x00000047, + WGPUTextureFormat_EACRG11Unorm = 0x00000048, + WGPUTextureFormat_EACRG11Snorm = 0x00000049, + WGPUTextureFormat_ASTC4x4Unorm = 0x0000004A, + WGPUTextureFormat_ASTC4x4UnormSrgb = 0x0000004B, + WGPUTextureFormat_ASTC5x4Unorm = 0x0000004C, + WGPUTextureFormat_ASTC5x4UnormSrgb = 0x0000004D, + WGPUTextureFormat_ASTC5x5Unorm = 0x0000004E, + WGPUTextureFormat_ASTC5x5UnormSrgb = 0x0000004F, + WGPUTextureFormat_ASTC6x5Unorm = 0x00000050, + WGPUTextureFormat_ASTC6x5UnormSrgb = 0x00000051, + WGPUTextureFormat_ASTC6x6Unorm = 0x00000052, + WGPUTextureFormat_ASTC6x6UnormSrgb = 0x00000053, + WGPUTextureFormat_ASTC8x5Unorm = 0x00000054, + WGPUTextureFormat_ASTC8x5UnormSrgb = 0x00000055, + WGPUTextureFormat_ASTC8x6Unorm = 0x00000056, + WGPUTextureFormat_ASTC8x6UnormSrgb = 0x00000057, + WGPUTextureFormat_ASTC8x8Unorm = 0x00000058, + WGPUTextureFormat_ASTC8x8UnormSrgb = 0x00000059, + WGPUTextureFormat_ASTC10x5Unorm = 0x0000005A, + WGPUTextureFormat_ASTC10x5UnormSrgb = 0x0000005B, + WGPUTextureFormat_ASTC10x6Unorm = 0x0000005C, + WGPUTextureFormat_ASTC10x6UnormSrgb = 0x0000005D, + WGPUTextureFormat_ASTC10x8Unorm = 0x0000005E, + WGPUTextureFormat_ASTC10x8UnormSrgb = 0x0000005F, + WGPUTextureFormat_ASTC10x10Unorm = 0x00000060, + WGPUTextureFormat_ASTC10x10UnormSrgb = 0x00000061, + WGPUTextureFormat_ASTC12x10Unorm = 0x00000062, + WGPUTextureFormat_ASTC12x10UnormSrgb = 0x00000063, + WGPUTextureFormat_ASTC12x12Unorm = 0x00000064, + WGPUTextureFormat_ASTC12x12UnormSrgb = 0x00000065, WGPUTextureFormat_Force32 = 0x7FFFFFFF } WGPUTextureFormat WGPU_ENUM_ATTRIBUTE; typedef enum WGPUTextureSampleType { /** - * `0x00000000`. - * Indicates that this @ref WGPUTextureBindingLayout member of + * `0`. Indicates that this @ref WGPUTextureBindingLayout member of * its parent @ref WGPUBindGroupLayoutEntry is not used. * (See also @ref SentinelValues.) */ WGPUTextureSampleType_BindingNotUsed = 0x00000000, /** - * `0x00000001`. - * Indicates no value is passed for this argument. See @ref SentinelValues. + * `1`. Indicates no value is passed for this argument. See @ref SentinelValues. */ WGPUTextureSampleType_Undefined = 0x00000001, WGPUTextureSampleType_Float = 0x00000002, @@ -1013,8 +1148,7 @@ typedef enum WGPUTextureSampleType { typedef enum WGPUTextureViewDimension { /** - * `0x00000000`. - * Indicates no value is passed for this argument. See @ref SentinelValues. + * `0`. Indicates no value is passed for this argument. See @ref SentinelValues. */ WGPUTextureViewDimension_Undefined = 0x00000000, WGPUTextureViewDimension_1D = 0x00000001, @@ -1026,6 +1160,12 @@ typedef enum WGPUTextureViewDimension { WGPUTextureViewDimension_Force32 = 0x7FFFFFFF } WGPUTextureViewDimension WGPU_ENUM_ATTRIBUTE; +typedef enum WGPUToneMappingMode { + WGPUToneMappingMode_Standard = 0x00000001, + WGPUToneMappingMode_Extended = 0x00000002, + WGPUToneMappingMode_Force32 = 0x7FFFFFFF +} WGPUToneMappingMode WGPU_ENUM_ATTRIBUTE; + typedef enum WGPUVertexFormat { WGPUVertexFormat_Uint8 = 0x00000001, WGPUVertexFormat_Uint8x2 = 0x00000002, @@ -1073,151 +1213,229 @@ typedef enum WGPUVertexFormat { typedef enum WGPUVertexStepMode { /** - * `0x00000000`. - * This @ref WGPUVertexBufferLayout is a "hole" in the @ref WGPUVertexState `buffers` array. - * (See also @ref SentinelValues.) + * `0`. Indicates no value is passed for this argument. See @ref SentinelValues. */ - WGPUVertexStepMode_VertexBufferNotUsed = 0x00000000, - /** - * `0x00000001`. - * Indicates no value is passed for this argument. See @ref SentinelValues. - */ - WGPUVertexStepMode_Undefined = 0x00000001, - WGPUVertexStepMode_Vertex = 0x00000002, - WGPUVertexStepMode_Instance = 0x00000003, + WGPUVertexStepMode_Undefined = 0x00000000, + WGPUVertexStepMode_Vertex = 0x00000001, + WGPUVertexStepMode_Instance = 0x00000002, WGPUVertexStepMode_Force32 = 0x7FFFFFFF } WGPUVertexStepMode WGPU_ENUM_ATTRIBUTE; -typedef enum WGPUWGSLLanguageFeatureName { - WGPUWGSLLanguageFeatureName_ReadonlyAndReadwriteStorageTextures = 0x00000001, - WGPUWGSLLanguageFeatureName_Packed4x8IntegerDotProduct = 0x00000002, - WGPUWGSLLanguageFeatureName_UnrestrictedPointerParameters = 0x00000003, - WGPUWGSLLanguageFeatureName_PointerCompositeAccess = 0x00000004, - WGPUWGSLLanguageFeatureName_Force32 = 0x7FFFFFFF -} WGPUWGSLLanguageFeatureName WGPU_ENUM_ATTRIBUTE; - /** * Status returned from a call to ::wgpuInstanceWaitAny. */ typedef enum WGPUWaitStatus { /** - * `0x00000001`. * At least one WGPUFuture completed successfully. */ WGPUWaitStatus_Success = 0x00000001, /** - * `0x00000002`. - * No WGPUFutures completed within the timeout. + * The wait operation succeeded, but no WGPUFutures completed within the timeout. */ WGPUWaitStatus_TimedOut = 0x00000002, /** - * `0x00000003`. - * A @ref Timed-Wait was performed when WGPUInstanceFeatures::timedWaitAnyEnable is false. + * The call was invalid for some reason (see @ref Wait-Any). + * Should produce @ref ImplementationDefinedLogging containing details. */ - WGPUWaitStatus_UnsupportedTimeout = 0x00000003, - /** - * `0x00000004`. - * The number of futures waited on in a @ref Timed-Wait is greater than the supported WGPUInstanceFeatures::timedWaitAnyMaxCount. - */ - WGPUWaitStatus_UnsupportedCount = 0x00000004, - /** - * `0x00000005`. - * An invalid wait was performed with @ref Mixed-Sources. - */ - WGPUWaitStatus_UnsupportedMixedSources = 0x00000005, + WGPUWaitStatus_Error = 0x00000003, WGPUWaitStatus_Force32 = 0x7FFFFFFF } WGPUWaitStatus WGPU_ENUM_ATTRIBUTE; +typedef enum WGPUWGSLLanguageFeatureName { + WGPUWGSLLanguageFeatureName_ReadonlyAndReadwriteStorageTextures = 0x00000001, + WGPUWGSLLanguageFeatureName_Packed4x8IntegerDotProduct = 0x00000002, + WGPUWGSLLanguageFeatureName_UnrestrictedPointerParameters = 0x00000003, + WGPUWGSLLanguageFeatureName_PointerCompositeAccess = 0x00000004, + WGPUWGSLLanguageFeatureName_UniformBufferStandardLayout = 0x00000005, + WGPUWGSLLanguageFeatureName_SubgroupId = 0x00000006, + WGPUWGSLLanguageFeatureName_TextureAndSamplerLet = 0x00000007, + WGPUWGSLLanguageFeatureName_SubgroupUniformity = 0x00000008, + WGPUWGSLLanguageFeatureName_TextureFormatsTier1 = 0x00000009, + WGPUWGSLLanguageFeatureName_Force32 = 0x7FFFFFFF +} WGPUWGSLLanguageFeatureName WGPU_ENUM_ATTRIBUTE; /** @} */ /** - * \defgroup Bitflags + * \defgroup Bitflags Bitflags * \brief Type and constant definitions for bitflag types. * * @{ */ + +/** + * For reserved non-standard bitflag values, see @ref BitflagRegistry. + */ typedef WGPUFlags WGPUBufferUsage; +/** + * `0`. + */ static const WGPUBufferUsage WGPUBufferUsage_None = 0x0000000000000000; +/** + * The buffer can be *mapped* on the CPU side in *read* mode (using @ref WGPUMapMode_Read). + */ static const WGPUBufferUsage WGPUBufferUsage_MapRead = 0x0000000000000001; +/** + * The buffer can be *mapped* on the CPU side in *write* mode (using @ref WGPUMapMode_Write). + * + * @note This usage is **not** required to set `mappedAtCreation` to `true` in @ref WGPUBufferDescriptor. + */ static const WGPUBufferUsage WGPUBufferUsage_MapWrite = 0x0000000000000002; +/** + * The buffer can be used as the *source* of a GPU-side copy operation. + */ static const WGPUBufferUsage WGPUBufferUsage_CopySrc = 0x0000000000000004; +/** + * The buffer can be used as the *destination* of a GPU-side copy operation. + */ static const WGPUBufferUsage WGPUBufferUsage_CopyDst = 0x0000000000000008; +/** + * The buffer can be used as an Index buffer when doing indexed drawing in a render pipeline. + */ static const WGPUBufferUsage WGPUBufferUsage_Index = 0x0000000000000010; +/** + * The buffer can be used as a Vertex buffer when using a render pipeline. + */ static const WGPUBufferUsage WGPUBufferUsage_Vertex = 0x0000000000000020; +/** + * The buffer can be bound to a shader as a uniform buffer. + */ static const WGPUBufferUsage WGPUBufferUsage_Uniform = 0x0000000000000040; +/** + * The buffer can be bound to a shader as a storage buffer. + */ static const WGPUBufferUsage WGPUBufferUsage_Storage = 0x0000000000000080; +/** + * The buffer can store arguments for an indirect draw call. + */ static const WGPUBufferUsage WGPUBufferUsage_Indirect = 0x0000000000000100; +/** + * The buffer can store the result of a timestamp or occlusion query. + */ static const WGPUBufferUsage WGPUBufferUsage_QueryResolve = 0x0000000000000200; +/** + * For reserved non-standard bitflag values, see @ref BitflagRegistry. + */ typedef WGPUFlags WGPUColorWriteMask; +/** + * `0`. + */ static const WGPUColorWriteMask WGPUColorWriteMask_None = 0x0000000000000000; static const WGPUColorWriteMask WGPUColorWriteMask_Red = 0x0000000000000001; static const WGPUColorWriteMask WGPUColorWriteMask_Green = 0x0000000000000002; static const WGPUColorWriteMask WGPUColorWriteMask_Blue = 0x0000000000000004; static const WGPUColorWriteMask WGPUColorWriteMask_Alpha = 0x0000000000000008; -static const WGPUColorWriteMask WGPUColorWriteMask_All = 0x000000000000000F /* Red | Green | Blue | Alpha */; +/** + * `Red | Green | Blue | Alpha`. + */ +static const WGPUColorWriteMask WGPUColorWriteMask_All = 0x000000000000000F; +/** + * For reserved non-standard bitflag values, see @ref BitflagRegistry. + */ typedef WGPUFlags WGPUMapMode; +/** + * `0`. + */ static const WGPUMapMode WGPUMapMode_None = 0x0000000000000000; static const WGPUMapMode WGPUMapMode_Read = 0x0000000000000001; static const WGPUMapMode WGPUMapMode_Write = 0x0000000000000002; +/** + * For reserved non-standard bitflag values, see @ref BitflagRegistry. + */ typedef WGPUFlags WGPUShaderStage; +/** + * `0`. + */ static const WGPUShaderStage WGPUShaderStage_None = 0x0000000000000000; static const WGPUShaderStage WGPUShaderStage_Vertex = 0x0000000000000001; static const WGPUShaderStage WGPUShaderStage_Fragment = 0x0000000000000002; static const WGPUShaderStage WGPUShaderStage_Compute = 0x0000000000000004; +/** + * For reserved non-standard bitflag values, see @ref BitflagRegistry. + */ typedef WGPUFlags WGPUTextureUsage; +/** + * `0`. + */ static const WGPUTextureUsage WGPUTextureUsage_None = 0x0000000000000000; static const WGPUTextureUsage WGPUTextureUsage_CopySrc = 0x0000000000000001; static const WGPUTextureUsage WGPUTextureUsage_CopyDst = 0x0000000000000002; static const WGPUTextureUsage WGPUTextureUsage_TextureBinding = 0x0000000000000004; static const WGPUTextureUsage WGPUTextureUsage_StorageBinding = 0x0000000000000008; static const WGPUTextureUsage WGPUTextureUsage_RenderAttachment = 0x0000000000000010; - +static const WGPUTextureUsage WGPUTextureUsage_TransientAttachment = 0x0000000000000020; /** @} */ + typedef void (*WGPUProc)(void) WGPU_FUNCTION_ATTRIBUTE; - /** - * \defgroup Callbacks + * \defgroup Callbacks Callbacks * \brief Callbacks through which asynchronous functions return. * * @{ */ + /** - * @param message - * This parameter is @ref PassedWithoutOwnership. - */ -typedef void (*WGPUBufferMapCallback)(WGPUMapAsyncStatus status, WGPUStringView message, WGPU_NULLABLE void* userdata1, WGPU_NULLABLE void* userdata2) WGPU_FUNCTION_ATTRIBUTE; -/** - * @param compilationInfo - * This parameter is @ref PassedWithoutOwnership. - */ -typedef void (*WGPUCompilationInfoCallback)(WGPUCompilationInfoRequestStatus status, struct WGPUCompilationInfo const * compilationInfo, WGPU_NULLABLE void* userdata1, WGPU_NULLABLE void* userdata2) WGPU_FUNCTION_ATTRIBUTE; -/** - * @param pipeline - * This parameter is @ref PassedWithOwnership. - */ -typedef void (*WGPUCreateComputePipelineAsyncCallback)(WGPUCreatePipelineAsyncStatus status, WGPUComputePipeline pipeline, WGPUStringView message, WGPU_NULLABLE void* userdata1, WGPU_NULLABLE void* userdata2) WGPU_FUNCTION_ATTRIBUTE; -/** - * @param pipeline - * This parameter is @ref PassedWithOwnership. - */ -typedef void (*WGPUCreateRenderPipelineAsyncCallback)(WGPUCreatePipelineAsyncStatus status, WGPURenderPipeline pipeline, WGPUStringView message, WGPU_NULLABLE void* userdata1, WGPU_NULLABLE void* userdata2) WGPU_FUNCTION_ATTRIBUTE; -/** - * @param device - * Reference to the device which was lost. If, and only if, the `reason` is @ref WGPUDeviceLostReason_FailedCreation, this is a non-null pointer to a null @ref WGPUDevice. - * This parameter is @ref PassedWithoutOwnership. + * See also @ref CallbackError. * * @param message * This parameter is @ref PassedWithoutOwnership. */ -typedef void (*WGPUDeviceLostCallback)(WGPUDevice const * device, WGPUDeviceLostReason reason, WGPUStringView message, WGPU_NULLABLE void* userdata1, WGPU_NULLABLE void* userdata2) WGPU_FUNCTION_ATTRIBUTE; +typedef void (*WGPUBufferMapCallback)(WGPUMapAsyncStatus status, WGPUStringView message, WGPU_NULLABLE void* userdata1, WGPU_NULLABLE void* userdata2) WGPU_FUNCTION_ATTRIBUTE; + /** + * See also @ref CallbackError. + * + * @param compilationInfo + * This argument contains multiple @ref ImplementationAllocatedStructChain roots. + * Arbitrary chains must be handled gracefully by the application! + * This parameter is @ref PassedWithoutOwnership. + */ +typedef void (*WGPUCompilationInfoCallback)(WGPUCompilationInfoRequestStatus status, struct WGPUCompilationInfo const * compilationInfo, WGPU_NULLABLE void* userdata1, WGPU_NULLABLE void* userdata2) WGPU_FUNCTION_ATTRIBUTE; + +/** + * See also @ref CallbackError. + * + * @param pipeline + * This parameter is @ref PassedWithOwnership. + */ +typedef void (*WGPUCreateComputePipelineAsyncCallback)(WGPUCreatePipelineAsyncStatus status, WGPUComputePipeline pipeline, WGPUStringView message, WGPU_NULLABLE void* userdata1, WGPU_NULLABLE void* userdata2) WGPU_FUNCTION_ATTRIBUTE; + +/** + * See also @ref CallbackError. + * + * @param pipeline + * This parameter is @ref PassedWithOwnership. + */ +typedef void (*WGPUCreateRenderPipelineAsyncCallback)(WGPUCreatePipelineAsyncStatus status, WGPURenderPipeline pipeline, WGPUStringView message, WGPU_NULLABLE void* userdata1, WGPU_NULLABLE void* userdata2) WGPU_FUNCTION_ATTRIBUTE; + +/** + * See also @ref CallbackError. + * + * @param device + * Pointer to the device which was lost. This is always a non-null pointer. + * The pointed-to @ref WGPUDevice will be null if, and only if, either: + * (1) The `reason` is @ref WGPUDeviceLostReason_FailedCreation. + * (2) The last ref of the device has been (or is being) released: see @ref DeviceRelease. + * This parameter is @ref PassedWithoutOwnership. + * + * @param reason + * An error code explaining why the device was lost. + * + * @param message + * A @ref LocalizableHumanReadableMessageString describing why the device was lost. + * This parameter is @ref PassedWithoutOwnership. + */ +typedef void (*WGPUDeviceLostCallback)(WGPUDevice const * device, WGPUDeviceLostReason reason, WGPUStringView message, WGPU_NULLABLE void* userdata1, WGPU_NULLABLE void* userdata2) WGPU_FUNCTION_ATTRIBUTE; + +/** + * See also @ref CallbackError. + * * @param status * See @ref WGPUPopErrorScopeStatus. * @@ -1226,13 +1444,31 @@ typedef void (*WGPUDeviceLostCallback)(WGPUDevice const * device, WGPUDeviceLost * If the `status` is not @ref WGPUPopErrorScopeStatus_Success, this is @ref WGPUErrorType_NoError. * * @param message - * If the `type` is not @ref WGPUErrorType_NoError, this is a non-empty @ref LocalizableHumanReadableMessageString; + * If the `status` is not @ref WGPUPopErrorScopeStatus_Success **or** + * the `type` is not @ref WGPUErrorType_NoError, this is a non-empty + * @ref LocalizableHumanReadableMessageString; * otherwise, this is an empty string. * This parameter is @ref PassedWithoutOwnership. */ typedef void (*WGPUPopErrorScopeCallback)(WGPUPopErrorScopeStatus status, WGPUErrorType type, WGPUStringView message, WGPU_NULLABLE void* userdata1, WGPU_NULLABLE void* userdata2) WGPU_FUNCTION_ATTRIBUTE; -typedef void (*WGPUQueueWorkDoneCallback)(WGPUQueueWorkDoneStatus status, WGPU_NULLABLE void* userdata1, WGPU_NULLABLE void* userdata2) WGPU_FUNCTION_ATTRIBUTE; + /** + * See also @ref CallbackError. + * + * @param status + * See @ref WGPUQueueWorkDoneStatus. + * + * @param message + * If the `status` is not @ref WGPUQueueWorkDoneStatus_Success, + * this is a non-empty @ref LocalizableHumanReadableMessageString; + * otherwise, this is an empty string. + * This parameter is @ref PassedWithoutOwnership. + */ +typedef void (*WGPUQueueWorkDoneCallback)(WGPUQueueWorkDoneStatus status, WGPUStringView message, WGPU_NULLABLE void* userdata1, WGPU_NULLABLE void* userdata2) WGPU_FUNCTION_ATTRIBUTE; + +/** + * See also @ref CallbackError. + * * @param adapter * This parameter is @ref PassedWithOwnership. * @@ -1240,7 +1476,10 @@ typedef void (*WGPUQueueWorkDoneCallback)(WGPUQueueWorkDoneStatus status, WGPU_N * This parameter is @ref PassedWithoutOwnership. */ typedef void (*WGPURequestAdapterCallback)(WGPURequestAdapterStatus status, WGPUAdapter adapter, WGPUStringView message, WGPU_NULLABLE void* userdata1, WGPU_NULLABLE void* userdata2) WGPU_FUNCTION_ATTRIBUTE; + /** + * See also @ref CallbackError. + * * @param device * This parameter is @ref PassedWithOwnership. * @@ -1248,7 +1487,10 @@ typedef void (*WGPURequestAdapterCallback)(WGPURequestAdapterStatus status, WGPU * This parameter is @ref PassedWithoutOwnership. */ typedef void (*WGPURequestDeviceCallback)(WGPURequestDeviceStatus status, WGPUDevice device, WGPUStringView message, WGPU_NULLABLE void* userdata1, WGPU_NULLABLE void* userdata2) WGPU_FUNCTION_ATTRIBUTE; + /** + * See also @ref CallbackError. + * * @param device * This parameter is @ref PassedWithoutOwnership. * @@ -1266,953 +1508,3362 @@ typedef void (*WGPUUncapturedErrorCallback)(WGPUDevice const * device, WGPUError */ typedef struct WGPUChainedStruct { - struct WGPUChainedStruct const * next; + struct WGPUChainedStruct * next; WGPUSType sType; } WGPUChainedStruct WGPU_STRUCTURE_ATTRIBUTE; -typedef struct WGPUChainedStructOut { - struct WGPUChainedStructOut * next; - WGPUSType sType; -} WGPUChainedStructOut WGPU_STRUCTURE_ATTRIBUTE; - /** @} */ /** - * \defgroup Structures + * \defgroup Structures Structures * \brief Descriptors and other transparent structures. * * @{ */ - /** - * \defgroup WGPUCallbackInfo +/** + * \defgroup CallbackInfoStructs Callback Info Structs * \brief Callback info structures that are used in asynchronous functions. * * @{ */ + typedef struct WGPUBufferMapCallbackInfo { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; + /** + * Controls when the callback may be called. + * + * Has no default. The `INIT` macro sets this to (@ref WGPUCallbackMode)0. + */ WGPUCallbackMode mode; WGPUBufferMapCallback callback; WGPU_NULLABLE void* userdata1; WGPU_NULLABLE void* userdata2; } WGPUBufferMapCallbackInfo WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUBufferMapCallbackInfo. + */ +#define WGPU_BUFFER_MAP_CALLBACK_INFO_INIT _wgpu_MAKE_INIT_STRUCT(WGPUBufferMapCallbackInfo, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.mode=*/_wgpu_ENUM_ZERO_INIT(WGPUCallbackMode) _wgpu_COMMA \ + /*.callback=*/NULL _wgpu_COMMA \ + /*.userdata1=*/NULL _wgpu_COMMA \ + /*.userdata2=*/NULL _wgpu_COMMA \ +}) + typedef struct WGPUCompilationInfoCallbackInfo { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; + /** + * Controls when the callback may be called. + * + * Has no default. The `INIT` macro sets this to (@ref WGPUCallbackMode)0. + */ WGPUCallbackMode mode; WGPUCompilationInfoCallback callback; WGPU_NULLABLE void* userdata1; WGPU_NULLABLE void* userdata2; } WGPUCompilationInfoCallbackInfo WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUCompilationInfoCallbackInfo. + */ +#define WGPU_COMPILATION_INFO_CALLBACK_INFO_INIT _wgpu_MAKE_INIT_STRUCT(WGPUCompilationInfoCallbackInfo, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.mode=*/_wgpu_ENUM_ZERO_INIT(WGPUCallbackMode) _wgpu_COMMA \ + /*.callback=*/NULL _wgpu_COMMA \ + /*.userdata1=*/NULL _wgpu_COMMA \ + /*.userdata2=*/NULL _wgpu_COMMA \ +}) + typedef struct WGPUCreateComputePipelineAsyncCallbackInfo { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; + /** + * Controls when the callback may be called. + * + * Has no default. The `INIT` macro sets this to (@ref WGPUCallbackMode)0. + */ WGPUCallbackMode mode; WGPUCreateComputePipelineAsyncCallback callback; WGPU_NULLABLE void* userdata1; WGPU_NULLABLE void* userdata2; } WGPUCreateComputePipelineAsyncCallbackInfo WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUCreateComputePipelineAsyncCallbackInfo. + */ +#define WGPU_CREATE_COMPUTE_PIPELINE_ASYNC_CALLBACK_INFO_INIT _wgpu_MAKE_INIT_STRUCT(WGPUCreateComputePipelineAsyncCallbackInfo, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.mode=*/_wgpu_ENUM_ZERO_INIT(WGPUCallbackMode) _wgpu_COMMA \ + /*.callback=*/NULL _wgpu_COMMA \ + /*.userdata1=*/NULL _wgpu_COMMA \ + /*.userdata2=*/NULL _wgpu_COMMA \ +}) + typedef struct WGPUCreateRenderPipelineAsyncCallbackInfo { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; + /** + * Controls when the callback may be called. + * + * Has no default. The `INIT` macro sets this to (@ref WGPUCallbackMode)0. + */ WGPUCallbackMode mode; WGPUCreateRenderPipelineAsyncCallback callback; WGPU_NULLABLE void* userdata1; WGPU_NULLABLE void* userdata2; } WGPUCreateRenderPipelineAsyncCallbackInfo WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUCreateRenderPipelineAsyncCallbackInfo. + */ +#define WGPU_CREATE_RENDER_PIPELINE_ASYNC_CALLBACK_INFO_INIT _wgpu_MAKE_INIT_STRUCT(WGPUCreateRenderPipelineAsyncCallbackInfo, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.mode=*/_wgpu_ENUM_ZERO_INIT(WGPUCallbackMode) _wgpu_COMMA \ + /*.callback=*/NULL _wgpu_COMMA \ + /*.userdata1=*/NULL _wgpu_COMMA \ + /*.userdata2=*/NULL _wgpu_COMMA \ +}) + typedef struct WGPUDeviceLostCallbackInfo { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; + /** + * Controls when the callback may be called. + * + * Has no default. The `INIT` macro sets this to (@ref WGPUCallbackMode)0. + */ WGPUCallbackMode mode; WGPUDeviceLostCallback callback; WGPU_NULLABLE void* userdata1; WGPU_NULLABLE void* userdata2; } WGPUDeviceLostCallbackInfo WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUDeviceLostCallbackInfo. + */ +#define WGPU_DEVICE_LOST_CALLBACK_INFO_INIT _wgpu_MAKE_INIT_STRUCT(WGPUDeviceLostCallbackInfo, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.mode=*/_wgpu_ENUM_ZERO_INIT(WGPUCallbackMode) _wgpu_COMMA \ + /*.callback=*/NULL _wgpu_COMMA \ + /*.userdata1=*/NULL _wgpu_COMMA \ + /*.userdata2=*/NULL _wgpu_COMMA \ +}) + typedef struct WGPUPopErrorScopeCallbackInfo { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; + /** + * Controls when the callback may be called. + * + * Has no default. The `INIT` macro sets this to (@ref WGPUCallbackMode)0. + */ WGPUCallbackMode mode; WGPUPopErrorScopeCallback callback; WGPU_NULLABLE void* userdata1; WGPU_NULLABLE void* userdata2; } WGPUPopErrorScopeCallbackInfo WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUPopErrorScopeCallbackInfo. + */ +#define WGPU_POP_ERROR_SCOPE_CALLBACK_INFO_INIT _wgpu_MAKE_INIT_STRUCT(WGPUPopErrorScopeCallbackInfo, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.mode=*/_wgpu_ENUM_ZERO_INIT(WGPUCallbackMode) _wgpu_COMMA \ + /*.callback=*/NULL _wgpu_COMMA \ + /*.userdata1=*/NULL _wgpu_COMMA \ + /*.userdata2=*/NULL _wgpu_COMMA \ +}) + typedef struct WGPUQueueWorkDoneCallbackInfo { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; + /** + * Controls when the callback may be called. + * + * Has no default. The `INIT` macro sets this to (@ref WGPUCallbackMode)0. + */ WGPUCallbackMode mode; WGPUQueueWorkDoneCallback callback; WGPU_NULLABLE void* userdata1; WGPU_NULLABLE void* userdata2; } WGPUQueueWorkDoneCallbackInfo WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUQueueWorkDoneCallbackInfo. + */ +#define WGPU_QUEUE_WORK_DONE_CALLBACK_INFO_INIT _wgpu_MAKE_INIT_STRUCT(WGPUQueueWorkDoneCallbackInfo, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.mode=*/_wgpu_ENUM_ZERO_INIT(WGPUCallbackMode) _wgpu_COMMA \ + /*.callback=*/NULL _wgpu_COMMA \ + /*.userdata1=*/NULL _wgpu_COMMA \ + /*.userdata2=*/NULL _wgpu_COMMA \ +}) + typedef struct WGPURequestAdapterCallbackInfo { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; + /** + * Controls when the callback may be called. + * + * Has no default. The `INIT` macro sets this to (@ref WGPUCallbackMode)0. + */ WGPUCallbackMode mode; WGPURequestAdapterCallback callback; WGPU_NULLABLE void* userdata1; WGPU_NULLABLE void* userdata2; } WGPURequestAdapterCallbackInfo WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPURequestAdapterCallbackInfo. + */ +#define WGPU_REQUEST_ADAPTER_CALLBACK_INFO_INIT _wgpu_MAKE_INIT_STRUCT(WGPURequestAdapterCallbackInfo, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.mode=*/_wgpu_ENUM_ZERO_INIT(WGPUCallbackMode) _wgpu_COMMA \ + /*.callback=*/NULL _wgpu_COMMA \ + /*.userdata1=*/NULL _wgpu_COMMA \ + /*.userdata2=*/NULL _wgpu_COMMA \ +}) + typedef struct WGPURequestDeviceCallbackInfo { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; + /** + * Controls when the callback may be called. + * + * Has no default. The `INIT` macro sets this to (@ref WGPUCallbackMode)0. + */ WGPUCallbackMode mode; WGPURequestDeviceCallback callback; WGPU_NULLABLE void* userdata1; WGPU_NULLABLE void* userdata2; } WGPURequestDeviceCallbackInfo WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPURequestDeviceCallbackInfo. + */ +#define WGPU_REQUEST_DEVICE_CALLBACK_INFO_INIT _wgpu_MAKE_INIT_STRUCT(WGPURequestDeviceCallbackInfo, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.mode=*/_wgpu_ENUM_ZERO_INIT(WGPUCallbackMode) _wgpu_COMMA \ + /*.callback=*/NULL _wgpu_COMMA \ + /*.userdata1=*/NULL _wgpu_COMMA \ + /*.userdata2=*/NULL _wgpu_COMMA \ +}) + typedef struct WGPUUncapturedErrorCallbackInfo { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; WGPUUncapturedErrorCallback callback; WGPU_NULLABLE void* userdata1; WGPU_NULLABLE void* userdata2; } WGPUUncapturedErrorCallbackInfo WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUUncapturedErrorCallbackInfo. + */ +#define WGPU_UNCAPTURED_ERROR_CALLBACK_INFO_INIT _wgpu_MAKE_INIT_STRUCT(WGPUUncapturedErrorCallbackInfo, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.callback=*/NULL _wgpu_COMMA \ + /*.userdata1=*/NULL _wgpu_COMMA \ + /*.userdata2=*/NULL _wgpu_COMMA \ +}) + /** @} */ +/** + * Default values can be set using @ref WGPU_ADAPTER_INFO_INIT as initializer. + */ typedef struct WGPUAdapterInfo { - WGPUChainedStructOut * nextInChain; + WGPUChainedStruct * nextInChain; /** * This is an \ref OutputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. */ WGPUStringView vendor; /** * This is an \ref OutputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. */ WGPUStringView architecture; /** * This is an \ref OutputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. */ WGPUStringView device; /** * This is an \ref OutputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. */ WGPUStringView description; + /** + * The `INIT` macro sets this to @ref WGPUBackendType_Undefined. + */ WGPUBackendType backendType; + /** + * The `INIT` macro sets this to (@ref WGPUAdapterType)0. + */ WGPUAdapterType adapterType; + /** + * The `INIT` macro sets this to `0`. + */ uint32_t vendorID; + /** + * The `INIT` macro sets this to `0`. + */ uint32_t deviceID; + /** + * The `INIT` macro sets this to `0`. + */ + uint32_t subgroupMinSize; + /** + * The `INIT` macro sets this to `0`. + */ + uint32_t subgroupMaxSize; } WGPUAdapterInfo WGPU_STRUCTURE_ATTRIBUTE; -typedef struct WGPUBindGroupEntry { - WGPUChainedStruct const * nextInChain; - uint32_t binding; - WGPU_NULLABLE WGPUBuffer buffer; - uint64_t offset; - uint64_t size; - WGPU_NULLABLE WGPUSampler sampler; - WGPU_NULLABLE WGPUTextureView textureView; -} WGPUBindGroupEntry WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUAdapterInfo. + */ +#define WGPU_ADAPTER_INFO_INIT _wgpu_MAKE_INIT_STRUCT(WGPUAdapterInfo, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.vendor=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ + /*.architecture=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ + /*.device=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ + /*.description=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ + /*.backendType=*/WGPUBackendType_Undefined _wgpu_COMMA \ + /*.adapterType=*/_wgpu_ENUM_ZERO_INIT(WGPUAdapterType) _wgpu_COMMA \ + /*.vendorID=*/0 _wgpu_COMMA \ + /*.deviceID=*/0 _wgpu_COMMA \ + /*.subgroupMinSize=*/0 _wgpu_COMMA \ + /*.subgroupMaxSize=*/0 _wgpu_COMMA \ +}) +/** + * Default values can be set using @ref WGPU_BLEND_COMPONENT_INIT as initializer. + */ typedef struct WGPUBlendComponent { + /** + * If set to @ref WGPUBlendOperation_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUBlendOperation_Add. + * + * The `INIT` macro sets this to @ref WGPUBlendOperation_Undefined. + */ WGPUBlendOperation operation; + /** + * If set to @ref WGPUBlendFactor_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUBlendFactor_One. + * + * The `INIT` macro sets this to @ref WGPUBlendFactor_Undefined. + */ WGPUBlendFactor srcFactor; + /** + * If set to @ref WGPUBlendFactor_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUBlendFactor_Zero. + * + * The `INIT` macro sets this to @ref WGPUBlendFactor_Undefined. + */ WGPUBlendFactor dstFactor; } WGPUBlendComponent WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUBlendComponent. + */ +#define WGPU_BLEND_COMPONENT_INIT _wgpu_MAKE_INIT_STRUCT(WGPUBlendComponent, { \ + /*.operation=*/WGPUBlendOperation_Undefined _wgpu_COMMA \ + /*.srcFactor=*/WGPUBlendFactor_Undefined _wgpu_COMMA \ + /*.dstFactor=*/WGPUBlendFactor_Undefined _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_BUFFER_BINDING_LAYOUT_INIT as initializer. + */ typedef struct WGPUBufferBindingLayout { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; + /** + * If set to @ref WGPUBufferBindingType_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUBufferBindingType_Uniform. + * + * The `INIT` macro sets this to @ref WGPUBufferBindingType_Undefined. + */ WGPUBufferBindingType type; + /** + * The `INIT` macro sets this to `WGPU_FALSE`. + */ WGPUBool hasDynamicOffset; + /** + * The `INIT` macro sets this to `0`. + */ uint64_t minBindingSize; } WGPUBufferBindingLayout WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUBufferBindingLayout. + */ +#define WGPU_BUFFER_BINDING_LAYOUT_INIT _wgpu_MAKE_INIT_STRUCT(WGPUBufferBindingLayout, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.type=*/WGPUBufferBindingType_Undefined _wgpu_COMMA \ + /*.hasDynamicOffset=*/WGPU_FALSE _wgpu_COMMA \ + /*.minBindingSize=*/0 _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_BUFFER_DESCRIPTOR_INIT as initializer. + */ typedef struct WGPUBufferDescriptor { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; /** * This is a \ref NonNullInputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. */ WGPUStringView label; + /** + * The `INIT` macro sets this to @ref WGPUBufferUsage_None. + */ WGPUBufferUsage usage; + /** + * The `INIT` macro sets this to `0`. + */ uint64_t size; + /** + * When true, the buffer is mapped in write mode at creation. It should thus be unmapped once its initial data has been written. + * + * @note Mapping at creation does **not** require the usage @ref WGPUBufferUsage_MapWrite. + * + * The `INIT` macro sets this to `WGPU_FALSE`. + */ WGPUBool mappedAtCreation; } WGPUBufferDescriptor WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUBufferDescriptor. + */ +#define WGPU_BUFFER_DESCRIPTOR_INIT _wgpu_MAKE_INIT_STRUCT(WGPUBufferDescriptor, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.label=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ + /*.usage=*/WGPUBufferUsage_None _wgpu_COMMA \ + /*.size=*/0 _wgpu_COMMA \ + /*.mappedAtCreation=*/WGPU_FALSE _wgpu_COMMA \ +}) + +/** + * An RGBA color. Represents a `f32`, `i32`, or `u32` color using @ref DoubleAsSupertype. + * + * If any channel is non-finite, produces a @ref NonFiniteFloatValueError. + * + * Default values can be set using @ref WGPU_COLOR_INIT as initializer. + */ typedef struct WGPUColor { + /** + * The `INIT` macro sets this to `0.`. + */ double r; + /** + * The `INIT` macro sets this to `0.`. + */ double g; + /** + * The `INIT` macro sets this to `0.`. + */ double b; + /** + * The `INIT` macro sets this to `0.`. + */ double a; } WGPUColor WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUColor. + */ +#define WGPU_COLOR_INIT _wgpu_MAKE_INIT_STRUCT(WGPUColor, { \ + /*.r=*/0. _wgpu_COMMA \ + /*.g=*/0. _wgpu_COMMA \ + /*.b=*/0. _wgpu_COMMA \ + /*.a=*/0. _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_COMMAND_BUFFER_DESCRIPTOR_INIT as initializer. + */ typedef struct WGPUCommandBufferDescriptor { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; /** * This is a \ref NonNullInputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. */ WGPUStringView label; } WGPUCommandBufferDescriptor WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUCommandBufferDescriptor. + */ +#define WGPU_COMMAND_BUFFER_DESCRIPTOR_INIT _wgpu_MAKE_INIT_STRUCT(WGPUCommandBufferDescriptor, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.label=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_COMMAND_ENCODER_DESCRIPTOR_INIT as initializer. + */ typedef struct WGPUCommandEncoderDescriptor { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; /** * This is a \ref NonNullInputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. */ WGPUStringView label; } WGPUCommandEncoderDescriptor WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUCommandEncoderDescriptor. + */ +#define WGPU_COMMAND_ENCODER_DESCRIPTOR_INIT _wgpu_MAKE_INIT_STRUCT(WGPUCommandEncoderDescriptor, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.label=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ +}) + +/** + * Note: While Compatibility Mode is optional to implement, this extension struct + * is required to be supported (for both queries and requests) and behave as + * defined in the WebGPU spec. + * + * Default values can be set using @ref WGPU_COMPATIBILITY_MODE_LIMITS_INIT as initializer. + */ +typedef struct WGPUCompatibilityModeLimits { + WGPUChainedStruct chain; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxStorageBuffersInVertexStage; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxStorageTexturesInVertexStage; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxStorageBuffersInFragmentStage; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxStorageTexturesInFragmentStage; +} WGPUCompatibilityModeLimits WGPU_STRUCTURE_ATTRIBUTE; + +/** + * Initializer for @ref WGPUCompatibilityModeLimits. + */ +#define WGPU_COMPATIBILITY_MODE_LIMITS_INIT _wgpu_MAKE_INIT_STRUCT(WGPUCompatibilityModeLimits, { \ + /*.chain=*/_wgpu_MAKE_INIT_STRUCT(WGPUChainedStruct, { \ + /*.next=*/NULL _wgpu_COMMA \ + /*.sType=*/WGPUSType_CompatibilityModeLimits _wgpu_COMMA \ + }) _wgpu_COMMA \ + /*.maxStorageBuffersInVertexStage=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxStorageTexturesInVertexStage=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxStorageBuffersInFragmentStage=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxStorageTexturesInFragmentStage=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ +}) + +/** + * This is an @ref ImplementationAllocatedStructChain root. + * Arbitrary chains must be handled gracefully by the application! + * + * Default values can be set using @ref WGPU_COMPILATION_MESSAGE_INIT as initializer. + */ typedef struct WGPUCompilationMessage { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; /** * A @ref LocalizableHumanReadableMessageString. * * This is an \ref OutputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. */ WGPUStringView message; /** * Severity level of the message. + * + * The `INIT` macro sets this to (@ref WGPUCompilationMessageType)0. */ WGPUCompilationMessageType type; /** * Line number where the message is attached, starting at 1. + * + * The `INIT` macro sets this to `0`. */ uint64_t lineNum; /** * Offset in UTF-8 code units (bytes) from the beginning of the line, starting at 1. + * + * The `INIT` macro sets this to `0`. */ uint64_t linePos; /** * Offset in UTF-8 code units (bytes) from the beginning of the shader code, starting at 0. + * + * The `INIT` macro sets this to `0`. */ uint64_t offset; /** * Length in UTF-8 code units (bytes) of the span the message corresponds to. + * + * The `INIT` macro sets this to `0`. */ uint64_t length; } WGPUCompilationMessage WGPU_STRUCTURE_ATTRIBUTE; -typedef struct WGPUComputePassTimestampWrites { - WGPUQuerySet querySet; - uint32_t beginningOfPassWriteIndex; - uint32_t endOfPassWriteIndex; -} WGPUComputePassTimestampWrites WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUCompilationMessage. + */ +#define WGPU_COMPILATION_MESSAGE_INIT _wgpu_MAKE_INIT_STRUCT(WGPUCompilationMessage, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.message=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ + /*.type=*/_wgpu_ENUM_ZERO_INIT(WGPUCompilationMessageType) _wgpu_COMMA \ + /*.lineNum=*/0 _wgpu_COMMA \ + /*.linePos=*/0 _wgpu_COMMA \ + /*.offset=*/0 _wgpu_COMMA \ + /*.length=*/0 _wgpu_COMMA \ +}) +/** + * Default values can be set using @ref WGPU_CONSTANT_ENTRY_INIT as initializer. + */ typedef struct WGPUConstantEntry { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; /** * This is a \ref NonNullInputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. */ WGPUStringView key; + /** + * Represents a WGSL numeric or boolean value using @ref DoubleAsSupertype. + * + * If non-finite, produces a @ref NonFiniteFloatValueError. + * + * The `INIT` macro sets this to `0.`. + */ double value; } WGPUConstantEntry WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUConstantEntry. + */ +#define WGPU_CONSTANT_ENTRY_INIT _wgpu_MAKE_INIT_STRUCT(WGPUConstantEntry, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.key=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ + /*.value=*/0. _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_EXTENT_3D_INIT as initializer. + */ typedef struct WGPUExtent3D { + /** + * The `INIT` macro sets this to `0`. + */ uint32_t width; + /** + * The `INIT` macro sets this to `1`. + */ uint32_t height; + /** + * The `INIT` macro sets this to `1`. + */ uint32_t depthOrArrayLayers; } WGPUExtent3D WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUExtent3D. + */ +#define WGPU_EXTENT_3D_INIT _wgpu_MAKE_INIT_STRUCT(WGPUExtent3D, { \ + /*.width=*/0 _wgpu_COMMA \ + /*.height=*/1 _wgpu_COMMA \ + /*.depthOrArrayLayers=*/1 _wgpu_COMMA \ +}) + +/** + * Chained in an @ref WGPUBindGroupEntry to set it to an @ref WGPUExternalTexture. This must have a corresponding @ref WGPUExternalTextureBindingLayout in the @ref WGPUBindGroupLayout. + * + * Default values can be set using @ref WGPU_EXTERNAL_TEXTURE_BINDING_ENTRY_INIT as initializer. + */ +typedef struct WGPUExternalTextureBindingEntry { + WGPUChainedStruct chain; + /** + * The `INIT` macro sets this to `NULL`. + */ + WGPUExternalTexture externalTexture; +} WGPUExternalTextureBindingEntry WGPU_STRUCTURE_ATTRIBUTE; + +/** + * Initializer for @ref WGPUExternalTextureBindingEntry. + */ +#define WGPU_EXTERNAL_TEXTURE_BINDING_ENTRY_INIT _wgpu_MAKE_INIT_STRUCT(WGPUExternalTextureBindingEntry, { \ + /*.chain=*/_wgpu_MAKE_INIT_STRUCT(WGPUChainedStruct, { \ + /*.next=*/NULL _wgpu_COMMA \ + /*.sType=*/WGPUSType_ExternalTextureBindingEntry _wgpu_COMMA \ + }) _wgpu_COMMA \ + /*.externalTexture=*/NULL _wgpu_COMMA \ +}) + +/** + * Chained in @ref WGPUBindGroupLayoutEntry to specify that the corresponding entries in an @ref WGPUBindGroup will contain an @ref WGPUExternalTexture. + * + * Default values can be set using @ref WGPU_EXTERNAL_TEXTURE_BINDING_LAYOUT_INIT as initializer. + */ +typedef struct WGPUExternalTextureBindingLayout { + WGPUChainedStruct chain; +} WGPUExternalTextureBindingLayout WGPU_STRUCTURE_ATTRIBUTE; + +/** + * Initializer for @ref WGPUExternalTextureBindingLayout. + */ +#define WGPU_EXTERNAL_TEXTURE_BINDING_LAYOUT_INIT _wgpu_MAKE_INIT_STRUCT(WGPUExternalTextureBindingLayout, { \ + /*.chain=*/_wgpu_MAKE_INIT_STRUCT(WGPUChainedStruct, { \ + /*.next=*/NULL _wgpu_COMMA \ + /*.sType=*/WGPUSType_ExternalTextureBindingLayout _wgpu_COMMA \ + }) _wgpu_COMMA \ +}) + /** * Opaque handle to an asynchronous operation. See @ref Asynchronous-Operations for more information. + * + * Default values can be set using @ref WGPU_FUTURE_INIT as initializer. */ typedef struct WGPUFuture { /** * Opaque id of the @ref WGPUFuture + * + * The `INIT` macro sets this to `0`. */ uint64_t id; } WGPUFuture WGPU_STRUCTURE_ATTRIBUTE; /** - * Features enabled on the WGPUInstance + * Initializer for @ref WGPUFuture. */ -typedef struct WGPUInstanceCapabilities { - /** This struct chain is used as mutable in some places and immutable in others. */ - WGPUChainedStructOut * nextInChain; - /** - * Enable use of ::wgpuInstanceWaitAny with `timeoutNS > 0`. - */ - WGPUBool timedWaitAnyEnable; +#define WGPU_FUTURE_INIT _wgpu_MAKE_INIT_STRUCT(WGPUFuture, { \ + /*.id=*/0 _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_INSTANCE_LIMITS_INIT as initializer. + */ +typedef struct WGPUInstanceLimits { + WGPUChainedStruct * nextInChain; /** * The maximum number @ref WGPUFutureWaitInfo supported in a call to ::wgpuInstanceWaitAny with `timeoutNS > 0`. + * + * The `INIT` macro sets this to `0`. */ size_t timedWaitAnyMaxCount; -} WGPUInstanceCapabilities WGPU_STRUCTURE_ATTRIBUTE; +} WGPUInstanceLimits WGPU_STRUCTURE_ATTRIBUTE; -typedef struct WGPULimits { - /** This struct chain is used as mutable in some places and immutable in others. */ - WGPUChainedStructOut * nextInChain; - uint32_t maxTextureDimension1D; - uint32_t maxTextureDimension2D; - uint32_t maxTextureDimension3D; - uint32_t maxTextureArrayLayers; - uint32_t maxBindGroups; - uint32_t maxBindGroupsPlusVertexBuffers; - uint32_t maxBindingsPerBindGroup; - uint32_t maxDynamicUniformBuffersPerPipelineLayout; - uint32_t maxDynamicStorageBuffersPerPipelineLayout; - uint32_t maxSampledTexturesPerShaderStage; - uint32_t maxSamplersPerShaderStage; - uint32_t maxStorageBuffersPerShaderStage; - uint32_t maxStorageTexturesPerShaderStage; - uint32_t maxUniformBuffersPerShaderStage; - uint64_t maxUniformBufferBindingSize; - uint64_t maxStorageBufferBindingSize; - uint32_t minUniformBufferOffsetAlignment; - uint32_t minStorageBufferOffsetAlignment; - uint32_t maxVertexBuffers; - uint64_t maxBufferSize; - uint32_t maxVertexAttributes; - uint32_t maxVertexBufferArrayStride; - uint32_t maxInterStageShaderVariables; - uint32_t maxColorAttachments; - uint32_t maxColorAttachmentBytesPerSample; - uint32_t maxComputeWorkgroupStorageSize; - uint32_t maxComputeInvocationsPerWorkgroup; - uint32_t maxComputeWorkgroupSizeX; - uint32_t maxComputeWorkgroupSizeY; - uint32_t maxComputeWorkgroupSizeZ; - uint32_t maxComputeWorkgroupsPerDimension; -} WGPULimits WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUInstanceLimits. + */ +#define WGPU_INSTANCE_LIMITS_INIT _wgpu_MAKE_INIT_STRUCT(WGPUInstanceLimits, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.timedWaitAnyMaxCount=*/0 _wgpu_COMMA \ +}) +/** + * Default values can be set using @ref WGPU_MULTISAMPLE_STATE_INIT as initializer. + */ typedef struct WGPUMultisampleState { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; + /** + * The `INIT` macro sets this to `1`. + */ uint32_t count; + /** + * The `INIT` macro sets this to `0xFFFFFFFF`. + */ uint32_t mask; + /** + * The `INIT` macro sets this to `WGPU_FALSE`. + */ WGPUBool alphaToCoverageEnabled; - } WGPUMultisampleState WGPU_STRUCTURE_ATTRIBUTE; + +/** + * Initializer for @ref WGPUMultisampleState. + */ +#define WGPU_MULTISAMPLE_STATE_INIT _wgpu_MAKE_INIT_STRUCT(WGPUMultisampleState, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.count=*/1 _wgpu_COMMA \ + /*.mask=*/0xFFFFFFFF _wgpu_COMMA \ + /*.alphaToCoverageEnabled=*/WGPU_FALSE _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_ORIGIN_3D_INIT as initializer. + */ typedef struct WGPUOrigin3D { + /** + * The `INIT` macro sets this to `0`. + */ uint32_t x; + /** + * The `INIT` macro sets this to `0`. + */ uint32_t y; + /** + * The `INIT` macro sets this to `0`. + */ uint32_t z; } WGPUOrigin3D WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUOrigin3D. + */ +#define WGPU_ORIGIN_3D_INIT _wgpu_MAKE_INIT_STRUCT(WGPUOrigin3D, { \ + /*.x=*/0 _wgpu_COMMA \ + /*.y=*/0 _wgpu_COMMA \ + /*.z=*/0 _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_PASS_TIMESTAMP_WRITES_INIT as initializer. + */ +typedef struct WGPUPassTimestampWrites { + WGPUChainedStruct * nextInChain; + /** + * Query set to write timestamps to. + * + * The `INIT` macro sets this to `NULL`. + */ + WGPUQuerySet querySet; + /** + * The `INIT` macro sets this to @ref WGPU_QUERY_SET_INDEX_UNDEFINED. + */ + uint32_t beginningOfPassWriteIndex; + /** + * The `INIT` macro sets this to @ref WGPU_QUERY_SET_INDEX_UNDEFINED. + */ + uint32_t endOfPassWriteIndex; +} WGPUPassTimestampWrites WGPU_STRUCTURE_ATTRIBUTE; + +/** + * Initializer for @ref WGPUPassTimestampWrites. + */ +#define WGPU_PASS_TIMESTAMP_WRITES_INIT _wgpu_MAKE_INIT_STRUCT(WGPUPassTimestampWrites, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.querySet=*/NULL _wgpu_COMMA \ + /*.beginningOfPassWriteIndex=*/WGPU_QUERY_SET_INDEX_UNDEFINED _wgpu_COMMA \ + /*.endOfPassWriteIndex=*/WGPU_QUERY_SET_INDEX_UNDEFINED _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_PIPELINE_LAYOUT_DESCRIPTOR_INIT as initializer. + */ typedef struct WGPUPipelineLayoutDescriptor { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; /** * This is a \ref NonNullInputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. */ WGPUStringView label; + /** + * Array count for `bindGroupLayouts`. The `INIT` macro sets this to 0. + */ size_t bindGroupLayoutCount; + /** + * The `INIT` macro sets this to `NULL`. + */ WGPUBindGroupLayout const * bindGroupLayouts; + /** + * The `INIT` macro sets this to `0`. + */ + uint32_t immediateSize; } WGPUPipelineLayoutDescriptor WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUPipelineLayoutDescriptor. + */ +#define WGPU_PIPELINE_LAYOUT_DESCRIPTOR_INIT _wgpu_MAKE_INIT_STRUCT(WGPUPipelineLayoutDescriptor, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.label=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ + /*.bindGroupLayoutCount=*/0 _wgpu_COMMA \ + /*.bindGroupLayouts=*/NULL _wgpu_COMMA \ + /*.immediateSize=*/0 _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_PRIMITIVE_STATE_INIT as initializer. + */ typedef struct WGPUPrimitiveState { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; + /** + * If set to @ref WGPUPrimitiveTopology_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUPrimitiveTopology_TriangleList. + * + * The `INIT` macro sets this to @ref WGPUPrimitiveTopology_Undefined. + */ WGPUPrimitiveTopology topology; + /** + * The `INIT` macro sets this to @ref WGPUIndexFormat_Undefined. + */ WGPUIndexFormat stripIndexFormat; + /** + * If set to @ref WGPUFrontFace_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUFrontFace_CCW. + * + * The `INIT` macro sets this to @ref WGPUFrontFace_Undefined. + */ WGPUFrontFace frontFace; + /** + * If set to @ref WGPUCullMode_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUCullMode_None. + * + * The `INIT` macro sets this to @ref WGPUCullMode_Undefined. + */ WGPUCullMode cullMode; + /** + * The `INIT` macro sets this to `WGPU_FALSE`. + */ WGPUBool unclippedDepth; } WGPUPrimitiveState WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUPrimitiveState. + */ +#define WGPU_PRIMITIVE_STATE_INIT _wgpu_MAKE_INIT_STRUCT(WGPUPrimitiveState, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.topology=*/WGPUPrimitiveTopology_Undefined _wgpu_COMMA \ + /*.stripIndexFormat=*/WGPUIndexFormat_Undefined _wgpu_COMMA \ + /*.frontFace=*/WGPUFrontFace_Undefined _wgpu_COMMA \ + /*.cullMode=*/WGPUCullMode_Undefined _wgpu_COMMA \ + /*.unclippedDepth=*/WGPU_FALSE _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_QUERY_SET_DESCRIPTOR_INIT as initializer. + */ typedef struct WGPUQuerySetDescriptor { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; /** * This is a \ref NonNullInputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. */ WGPUStringView label; + /** + * The `INIT` macro sets this to (@ref WGPUQueryType)0. + */ WGPUQueryType type; + /** + * The `INIT` macro sets this to `0`. + */ uint32_t count; } WGPUQuerySetDescriptor WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUQuerySetDescriptor. + */ +#define WGPU_QUERY_SET_DESCRIPTOR_INIT _wgpu_MAKE_INIT_STRUCT(WGPUQuerySetDescriptor, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.label=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ + /*.type=*/_wgpu_ENUM_ZERO_INIT(WGPUQueryType) _wgpu_COMMA \ + /*.count=*/0 _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_QUEUE_DESCRIPTOR_INIT as initializer. + */ typedef struct WGPUQueueDescriptor { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; /** * This is a \ref NonNullInputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. */ WGPUStringView label; } WGPUQueueDescriptor WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUQueueDescriptor. + */ +#define WGPU_QUEUE_DESCRIPTOR_INIT _wgpu_MAKE_INIT_STRUCT(WGPUQueueDescriptor, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.label=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_RENDER_BUNDLE_DESCRIPTOR_INIT as initializer. + */ typedef struct WGPURenderBundleDescriptor { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; /** * This is a \ref NonNullInputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. */ WGPUStringView label; } WGPURenderBundleDescriptor WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPURenderBundleDescriptor. + */ +#define WGPU_RENDER_BUNDLE_DESCRIPTOR_INIT _wgpu_MAKE_INIT_STRUCT(WGPURenderBundleDescriptor, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.label=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_RENDER_BUNDLE_ENCODER_DESCRIPTOR_INIT as initializer. + */ typedef struct WGPURenderBundleEncoderDescriptor { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; /** * This is a \ref NonNullInputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. */ WGPUStringView label; + /** + * Array count for `colorFormats`. The `INIT` macro sets this to 0. + */ size_t colorFormatCount; + /** + * The `INIT` macro sets this to `NULL`. + */ WGPUTextureFormat const * colorFormats; + /** + * The `INIT` macro sets this to @ref WGPUTextureFormat_Undefined. + */ WGPUTextureFormat depthStencilFormat; + /** + * The `INIT` macro sets this to `1`. + */ uint32_t sampleCount; + /** + * The `INIT` macro sets this to `WGPU_FALSE`. + */ WGPUBool depthReadOnly; + /** + * The `INIT` macro sets this to `WGPU_FALSE`. + */ WGPUBool stencilReadOnly; } WGPURenderBundleEncoderDescriptor WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPURenderBundleEncoderDescriptor. + */ +#define WGPU_RENDER_BUNDLE_ENCODER_DESCRIPTOR_INIT _wgpu_MAKE_INIT_STRUCT(WGPURenderBundleEncoderDescriptor, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.label=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ + /*.colorFormatCount=*/0 _wgpu_COMMA \ + /*.colorFormats=*/NULL _wgpu_COMMA \ + /*.depthStencilFormat=*/WGPUTextureFormat_Undefined _wgpu_COMMA \ + /*.sampleCount=*/1 _wgpu_COMMA \ + /*.depthReadOnly=*/WGPU_FALSE _wgpu_COMMA \ + /*.stencilReadOnly=*/WGPU_FALSE _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_RENDER_PASS_DEPTH_STENCIL_ATTACHMENT_INIT as initializer. + */ typedef struct WGPURenderPassDepthStencilAttachment { + WGPUChainedStruct * nextInChain; + /** + * The `INIT` macro sets this to `NULL`. + */ WGPUTextureView view; + /** + * The `INIT` macro sets this to @ref WGPULoadOp_Undefined. + */ WGPULoadOp depthLoadOp; + /** + * The `INIT` macro sets this to @ref WGPUStoreOp_Undefined. + */ WGPUStoreOp depthStoreOp; + /** + * This is a @ref NullableFloatingPointType. + * + * If `NaN`, indicates an `undefined` value (as defined by the JS spec). + * Use @ref WGPU_DEPTH_CLEAR_VALUE_UNDEFINED to indicate this semantically. + * + * If infinite, produces a @ref NonFiniteFloatValueError. + * + * The `INIT` macro sets this to @ref WGPU_DEPTH_CLEAR_VALUE_UNDEFINED. + */ float depthClearValue; + /** + * The `INIT` macro sets this to `WGPU_FALSE`. + */ WGPUBool depthReadOnly; + /** + * The `INIT` macro sets this to @ref WGPULoadOp_Undefined. + */ WGPULoadOp stencilLoadOp; + /** + * The `INIT` macro sets this to @ref WGPUStoreOp_Undefined. + */ WGPUStoreOp stencilStoreOp; + /** + * The `INIT` macro sets this to `0`. + */ uint32_t stencilClearValue; + /** + * The `INIT` macro sets this to `WGPU_FALSE`. + */ WGPUBool stencilReadOnly; } WGPURenderPassDepthStencilAttachment WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPURenderPassDepthStencilAttachment. + */ +#define WGPU_RENDER_PASS_DEPTH_STENCIL_ATTACHMENT_INIT _wgpu_MAKE_INIT_STRUCT(WGPURenderPassDepthStencilAttachment, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.view=*/NULL _wgpu_COMMA \ + /*.depthLoadOp=*/WGPULoadOp_Undefined _wgpu_COMMA \ + /*.depthStoreOp=*/WGPUStoreOp_Undefined _wgpu_COMMA \ + /*.depthClearValue=*/WGPU_DEPTH_CLEAR_VALUE_UNDEFINED _wgpu_COMMA \ + /*.depthReadOnly=*/WGPU_FALSE _wgpu_COMMA \ + /*.stencilLoadOp=*/WGPULoadOp_Undefined _wgpu_COMMA \ + /*.stencilStoreOp=*/WGPUStoreOp_Undefined _wgpu_COMMA \ + /*.stencilClearValue=*/0 _wgpu_COMMA \ + /*.stencilReadOnly=*/WGPU_FALSE _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_RENDER_PASS_MAX_DRAW_COUNT_INIT as initializer. + */ typedef struct WGPURenderPassMaxDrawCount { WGPUChainedStruct chain; + /** + * The `INIT` macro sets this to `50000000`. + */ uint64_t maxDrawCount; } WGPURenderPassMaxDrawCount WGPU_STRUCTURE_ATTRIBUTE; -typedef struct WGPURenderPassTimestampWrites { - WGPUQuerySet querySet; - uint32_t beginningOfPassWriteIndex; - uint32_t endOfPassWriteIndex; -} WGPURenderPassTimestampWrites WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPURenderPassMaxDrawCount. + */ +#define WGPU_RENDER_PASS_MAX_DRAW_COUNT_INIT _wgpu_MAKE_INIT_STRUCT(WGPURenderPassMaxDrawCount, { \ + /*.chain=*/_wgpu_MAKE_INIT_STRUCT(WGPUChainedStruct, { \ + /*.next=*/NULL _wgpu_COMMA \ + /*.sType=*/WGPUSType_RenderPassMaxDrawCount _wgpu_COMMA \ + }) _wgpu_COMMA \ + /*.maxDrawCount=*/50000000 _wgpu_COMMA \ +}) -typedef struct WGPURequestAdapterOptions { - WGPUChainedStruct const * nextInChain; +/** + * Extension providing requestAdapter options for implementations with WebXR interop (i.e. Wasm). + * + * Default values can be set using @ref WGPU_REQUEST_ADAPTER_WEBXR_OPTIONS_INIT as initializer. + */ +typedef struct WGPURequestAdapterWebXROptions { + WGPUChainedStruct chain; /** - * "Feature level" for the adapter request. If an adapter is returned, it must support the features and limits in the requested feature level. + * Sets the `xrCompatible` option in the JS API. * - * Implementations may ignore @ref WGPUFeatureLevel_Compatibility and provide @ref WGPUFeatureLevel_Core instead. @ref WGPUFeatureLevel_Core is the default in the JS API, but in C, this field is **required** (must not be undefined). + * The `INIT` macro sets this to `WGPU_FALSE`. */ - WGPUFeatureLevel featureLevel; - WGPUPowerPreference powerPreference; - /** - * If true, requires the adapter to be a "fallback" adapter as defined by the JS spec. - * If this is not possible, the request returns null. - */ - WGPUBool forceFallbackAdapter; - /** - * If set, requires the adapter to have a particular backend type. - * If this is not possible, the request returns null. - */ - WGPUBackendType backendType; - /** - * If set, requires the adapter to be able to output to a particular surface. - * If this is not possible, the request returns null. - */ - WGPU_NULLABLE WGPUSurface compatibleSurface; -} WGPURequestAdapterOptions WGPU_STRUCTURE_ATTRIBUTE; + WGPUBool xrCompatible; +} WGPURequestAdapterWebXROptions WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPURequestAdapterWebXROptions. + */ +#define WGPU_REQUEST_ADAPTER_WEBXR_OPTIONS_INIT _wgpu_MAKE_INIT_STRUCT(WGPURequestAdapterWebXROptions, { \ + /*.chain=*/_wgpu_MAKE_INIT_STRUCT(WGPUChainedStruct, { \ + /*.next=*/NULL _wgpu_COMMA \ + /*.sType=*/WGPUSType_RequestAdapterWebXROptions _wgpu_COMMA \ + }) _wgpu_COMMA \ + /*.xrCompatible=*/WGPU_FALSE _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_SAMPLER_BINDING_LAYOUT_INIT as initializer. + */ typedef struct WGPUSamplerBindingLayout { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; + /** + * If set to @ref WGPUSamplerBindingType_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUSamplerBindingType_Filtering. + * + * The `INIT` macro sets this to @ref WGPUSamplerBindingType_Undefined. + */ WGPUSamplerBindingType type; } WGPUSamplerBindingLayout WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUSamplerBindingLayout. + */ +#define WGPU_SAMPLER_BINDING_LAYOUT_INIT _wgpu_MAKE_INIT_STRUCT(WGPUSamplerBindingLayout, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.type=*/WGPUSamplerBindingType_Undefined _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_SAMPLER_DESCRIPTOR_INIT as initializer. + */ typedef struct WGPUSamplerDescriptor { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; /** * This is a \ref NonNullInputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. */ WGPUStringView label; + /** + * If set to @ref WGPUAddressMode_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUAddressMode_ClampToEdge. + * + * The `INIT` macro sets this to @ref WGPUAddressMode_Undefined. + */ WGPUAddressMode addressModeU; + /** + * If set to @ref WGPUAddressMode_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUAddressMode_ClampToEdge. + * + * The `INIT` macro sets this to @ref WGPUAddressMode_Undefined. + */ WGPUAddressMode addressModeV; + /** + * If set to @ref WGPUAddressMode_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUAddressMode_ClampToEdge. + * + * The `INIT` macro sets this to @ref WGPUAddressMode_Undefined. + */ WGPUAddressMode addressModeW; + /** + * If set to @ref WGPUFilterMode_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUFilterMode_Nearest. + * + * The `INIT` macro sets this to @ref WGPUFilterMode_Undefined. + */ WGPUFilterMode magFilter; + /** + * If set to @ref WGPUFilterMode_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUFilterMode_Nearest. + * + * The `INIT` macro sets this to @ref WGPUFilterMode_Undefined. + */ WGPUFilterMode minFilter; + /** + * If set to @ref WGPUFilterMode_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUMipmapFilterMode_Nearest. + * + * The `INIT` macro sets this to @ref WGPUMipmapFilterMode_Undefined. + */ WGPUMipmapFilterMode mipmapFilter; + /** + * TODO + * + * If non-finite, produces a @ref NonFiniteFloatValueError. + * + * The `INIT` macro sets this to `0.f`. + */ float lodMinClamp; + /** + * TODO + * + * If non-finite, produces a @ref NonFiniteFloatValueError. + * + * The `INIT` macro sets this to `32.f`. + */ float lodMaxClamp; + /** + * The `INIT` macro sets this to @ref WGPUCompareFunction_Undefined. + */ WGPUCompareFunction compare; + /** + * The `INIT` macro sets this to `1`. + */ uint16_t maxAnisotropy; } WGPUSamplerDescriptor WGPU_STRUCTURE_ATTRIBUTE; -typedef struct WGPUShaderModuleDescriptor { - WGPUChainedStruct const * nextInChain; - /** - * This is a \ref NonNullInputString. - */ - WGPUStringView label; -} WGPUShaderModuleDescriptor WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUSamplerDescriptor. + */ +#define WGPU_SAMPLER_DESCRIPTOR_INIT _wgpu_MAKE_INIT_STRUCT(WGPUSamplerDescriptor, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.label=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ + /*.addressModeU=*/WGPUAddressMode_Undefined _wgpu_COMMA \ + /*.addressModeV=*/WGPUAddressMode_Undefined _wgpu_COMMA \ + /*.addressModeW=*/WGPUAddressMode_Undefined _wgpu_COMMA \ + /*.magFilter=*/WGPUFilterMode_Undefined _wgpu_COMMA \ + /*.minFilter=*/WGPUFilterMode_Undefined _wgpu_COMMA \ + /*.mipmapFilter=*/WGPUMipmapFilterMode_Undefined _wgpu_COMMA \ + /*.lodMinClamp=*/0.f _wgpu_COMMA \ + /*.lodMaxClamp=*/32.f _wgpu_COMMA \ + /*.compare=*/WGPUCompareFunction_Undefined _wgpu_COMMA \ + /*.maxAnisotropy=*/1 _wgpu_COMMA \ +}) +/** + * Default values can be set using @ref WGPU_SHADER_SOURCE_SPIRV_INIT as initializer. + */ typedef struct WGPUShaderSourceSPIRV { WGPUChainedStruct chain; + /** + * The `INIT` macro sets this to `0`. + */ uint32_t codeSize; + /** + * The `INIT` macro sets this to `NULL`. + */ uint32_t const * code; } WGPUShaderSourceSPIRV WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUShaderSourceSPIRV. + */ +#define WGPU_SHADER_SOURCE_SPIRV_INIT _wgpu_MAKE_INIT_STRUCT(WGPUShaderSourceSPIRV, { \ + /*.chain=*/_wgpu_MAKE_INIT_STRUCT(WGPUChainedStruct, { \ + /*.next=*/NULL _wgpu_COMMA \ + /*.sType=*/WGPUSType_ShaderSourceSPIRV _wgpu_COMMA \ + }) _wgpu_COMMA \ + /*.codeSize=*/0 _wgpu_COMMA \ + /*.code=*/NULL _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_SHADER_SOURCE_WGSL_INIT as initializer. + */ typedef struct WGPUShaderSourceWGSL { WGPUChainedStruct chain; /** * This is a \ref NonNullInputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. */ WGPUStringView code; } WGPUShaderSourceWGSL WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUShaderSourceWGSL. + */ +#define WGPU_SHADER_SOURCE_WGSL_INIT _wgpu_MAKE_INIT_STRUCT(WGPUShaderSourceWGSL, { \ + /*.chain=*/_wgpu_MAKE_INIT_STRUCT(WGPUChainedStruct, { \ + /*.next=*/NULL _wgpu_COMMA \ + /*.sType=*/WGPUSType_ShaderSourceWGSL _wgpu_COMMA \ + }) _wgpu_COMMA \ + /*.code=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_STENCIL_FACE_STATE_INIT as initializer. + */ typedef struct WGPUStencilFaceState { + /** + * If set to @ref WGPUCompareFunction_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUCompareFunction_Always. + * + * The `INIT` macro sets this to @ref WGPUCompareFunction_Undefined. + */ WGPUCompareFunction compare; + /** + * If set to @ref WGPUStencilOperation_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUStencilOperation_Keep. + * + * The `INIT` macro sets this to @ref WGPUStencilOperation_Undefined. + */ WGPUStencilOperation failOp; + /** + * If set to @ref WGPUStencilOperation_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUStencilOperation_Keep. + * + * The `INIT` macro sets this to @ref WGPUStencilOperation_Undefined. + */ WGPUStencilOperation depthFailOp; + /** + * If set to @ref WGPUStencilOperation_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUStencilOperation_Keep. + * + * The `INIT` macro sets this to @ref WGPUStencilOperation_Undefined. + */ WGPUStencilOperation passOp; } WGPUStencilFaceState WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUStencilFaceState. + */ +#define WGPU_STENCIL_FACE_STATE_INIT _wgpu_MAKE_INIT_STRUCT(WGPUStencilFaceState, { \ + /*.compare=*/WGPUCompareFunction_Undefined _wgpu_COMMA \ + /*.failOp=*/WGPUStencilOperation_Undefined _wgpu_COMMA \ + /*.depthFailOp=*/WGPUStencilOperation_Undefined _wgpu_COMMA \ + /*.passOp=*/WGPUStencilOperation_Undefined _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_STORAGE_TEXTURE_BINDING_LAYOUT_INIT as initializer. + */ typedef struct WGPUStorageTextureBindingLayout { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; + /** + * If set to @ref WGPUStorageTextureAccess_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUStorageTextureAccess_WriteOnly. + * + * The `INIT` macro sets this to @ref WGPUStorageTextureAccess_Undefined. + */ WGPUStorageTextureAccess access; + /** + * The `INIT` macro sets this to @ref WGPUTextureFormat_Undefined. + */ WGPUTextureFormat format; + /** + * If set to @ref WGPUTextureViewDimension_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUTextureViewDimension_2D. + * + * The `INIT` macro sets this to @ref WGPUTextureViewDimension_Undefined. + */ WGPUTextureViewDimension viewDimension; } WGPUStorageTextureBindingLayout WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUStorageTextureBindingLayout. + */ +#define WGPU_STORAGE_TEXTURE_BINDING_LAYOUT_INIT _wgpu_MAKE_INIT_STRUCT(WGPUStorageTextureBindingLayout, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.access=*/WGPUStorageTextureAccess_Undefined _wgpu_COMMA \ + /*.format=*/WGPUTextureFormat_Undefined _wgpu_COMMA \ + /*.viewDimension=*/WGPUTextureViewDimension_Undefined _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_SUPPORTED_FEATURES_INIT as initializer. + */ typedef struct WGPUSupportedFeatures { + /** + * Array count for `features`. The `INIT` macro sets this to 0. + */ size_t featureCount; + /** + * The `INIT` macro sets this to `NULL`. + */ WGPUFeatureName const * features; } WGPUSupportedFeatures WGPU_STRUCTURE_ATTRIBUTE; -typedef struct WGPUSupportedWGSLLanguageFeatures { +/** + * Initializer for @ref WGPUSupportedFeatures. + */ +#define WGPU_SUPPORTED_FEATURES_INIT _wgpu_MAKE_INIT_STRUCT(WGPUSupportedFeatures, { \ + /*.featureCount=*/0 _wgpu_COMMA \ + /*.features=*/NULL _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_SUPPORTED_INSTANCE_FEATURES_INIT as initializer. + */ +typedef struct WGPUSupportedInstanceFeatures { + /** + * Array count for `features`. The `INIT` macro sets this to 0. + */ size_t featureCount; + /** + * The `INIT` macro sets this to `NULL`. + */ + WGPUInstanceFeatureName const * features; +} WGPUSupportedInstanceFeatures WGPU_STRUCTURE_ATTRIBUTE; + +/** + * Initializer for @ref WGPUSupportedInstanceFeatures. + */ +#define WGPU_SUPPORTED_INSTANCE_FEATURES_INIT _wgpu_MAKE_INIT_STRUCT(WGPUSupportedInstanceFeatures, { \ + /*.featureCount=*/0 _wgpu_COMMA \ + /*.features=*/NULL _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_SUPPORTED_WGSL_LANGUAGE_FEATURES_INIT as initializer. + */ +typedef struct WGPUSupportedWGSLLanguageFeatures { + /** + * Array count for `features`. The `INIT` macro sets this to 0. + */ + size_t featureCount; + /** + * The `INIT` macro sets this to `NULL`. + */ WGPUWGSLLanguageFeatureName const * features; } WGPUSupportedWGSLLanguageFeatures WGPU_STRUCTURE_ATTRIBUTE; /** - * Filled by `::wgpuSurfaceGetCapabilities` with what's supported for `::wgpuSurfaceConfigure` for a pair of @ref WGPUSurface and @ref WGPUAdapter. + * Initializer for @ref WGPUSupportedWGSLLanguageFeatures. + */ +#define WGPU_SUPPORTED_WGSL_LANGUAGE_FEATURES_INIT _wgpu_MAKE_INIT_STRUCT(WGPUSupportedWGSLLanguageFeatures, { \ + /*.featureCount=*/0 _wgpu_COMMA \ + /*.features=*/NULL _wgpu_COMMA \ +}) + +/** + * Filled by @ref wgpuSurfaceGetCapabilities with what's supported for @ref wgpuSurfaceConfigure for a pair of @ref WGPUSurface and @ref WGPUAdapter. + * + * Default values can be set using @ref WGPU_SURFACE_CAPABILITIES_INIT as initializer. */ typedef struct WGPUSurfaceCapabilities { - WGPUChainedStructOut * nextInChain; + WGPUChainedStruct * nextInChain; /** * The bit set of supported @ref WGPUTextureUsage bits. * Guaranteed to contain @ref WGPUTextureUsage_RenderAttachment. + * + * The `INIT` macro sets this to @ref WGPUTextureUsage_None. */ WGPUTextureUsage usages; /** - * A list of supported @ref WGPUTextureFormat values, in order of preference. + * Array count for `formats`. The `INIT` macro sets this to 0. */ size_t formatCount; + /** + * A list of supported @ref WGPUTextureFormat values, in order of preference. + * + * The `INIT` macro sets this to `NULL`. + */ WGPUTextureFormat const * formats; + /** + * Array count for `presentModes`. The `INIT` macro sets this to 0. + */ + size_t presentModeCount; /** * A list of supported @ref WGPUPresentMode values. * Guaranteed to contain @ref WGPUPresentMode_Fifo. + * + * The `INIT` macro sets this to `NULL`. */ - size_t presentModeCount; WGPUPresentMode const * presentModes; + /** + * Array count for `alphaModes`. The `INIT` macro sets this to 0. + */ + size_t alphaModeCount; /** * A list of supported @ref WGPUCompositeAlphaMode values. * @ref WGPUCompositeAlphaMode_Auto will be an alias for the first element and will never be present in this array. + * + * The `INIT` macro sets this to `NULL`. */ - size_t alphaModeCount; WGPUCompositeAlphaMode const * alphaModes; } WGPUSurfaceCapabilities WGPU_STRUCTURE_ATTRIBUTE; /** - * Options to `::wgpuSurfaceConfigure` for defining how a @ref WGPUSurface will be rendered to and presented to the user. + * Initializer for @ref WGPUSurfaceCapabilities. + */ +#define WGPU_SURFACE_CAPABILITIES_INIT _wgpu_MAKE_INIT_STRUCT(WGPUSurfaceCapabilities, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.usages=*/WGPUTextureUsage_None _wgpu_COMMA \ + /*.formatCount=*/0 _wgpu_COMMA \ + /*.formats=*/NULL _wgpu_COMMA \ + /*.presentModeCount=*/0 _wgpu_COMMA \ + /*.presentModes=*/NULL _wgpu_COMMA \ + /*.alphaModeCount=*/0 _wgpu_COMMA \ + /*.alphaModes=*/NULL _wgpu_COMMA \ +}) + +/** + * Extension of @ref WGPUSurfaceConfiguration for color spaces and HDR. + * + * Default values can be set using @ref WGPU_SURFACE_COLOR_MANAGEMENT_INIT as initializer. + */ +typedef struct WGPUSurfaceColorManagement { + WGPUChainedStruct chain; + /** + * The `INIT` macro sets this to (@ref WGPUPredefinedColorSpace)0. + */ + WGPUPredefinedColorSpace colorSpace; + /** + * The `INIT` macro sets this to (@ref WGPUToneMappingMode)0. + */ + WGPUToneMappingMode toneMappingMode; +} WGPUSurfaceColorManagement WGPU_STRUCTURE_ATTRIBUTE; + +/** + * Initializer for @ref WGPUSurfaceColorManagement. + */ +#define WGPU_SURFACE_COLOR_MANAGEMENT_INIT _wgpu_MAKE_INIT_STRUCT(WGPUSurfaceColorManagement, { \ + /*.chain=*/_wgpu_MAKE_INIT_STRUCT(WGPUChainedStruct, { \ + /*.next=*/NULL _wgpu_COMMA \ + /*.sType=*/WGPUSType_SurfaceColorManagement _wgpu_COMMA \ + }) _wgpu_COMMA \ + /*.colorSpace=*/_wgpu_ENUM_ZERO_INIT(WGPUPredefinedColorSpace) _wgpu_COMMA \ + /*.toneMappingMode=*/_wgpu_ENUM_ZERO_INIT(WGPUToneMappingMode) _wgpu_COMMA \ +}) + +/** + * Options to @ref wgpuSurfaceConfigure for defining how a @ref WGPUSurface will be rendered to and presented to the user. * See @ref Surface-Configuration for more details. + * + * Default values can be set using @ref WGPU_SURFACE_CONFIGURATION_INIT as initializer. */ typedef struct WGPUSurfaceConfiguration { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; /** * The @ref WGPUDevice to use to render to surface's textures. + * + * The `INIT` macro sets this to `NULL`. */ WGPUDevice device; /** * The @ref WGPUTextureFormat of the surface's textures. + * + * The `INIT` macro sets this to @ref WGPUTextureFormat_Undefined. */ WGPUTextureFormat format; /** * The @ref WGPUTextureUsage of the surface's textures. + * + * The `INIT` macro sets this to @ref WGPUTextureUsage_RenderAttachment. */ WGPUTextureUsage usage; /** * The width of the surface's textures. + * + * The `INIT` macro sets this to `0`. */ uint32_t width; /** * The height of the surface's textures. + * + * The `INIT` macro sets this to `0`. */ uint32_t height; /** - * The additional @ref WGPUTextureFormat for @ref WGPUTextureView format reinterpretation of the surface's textures. + * Array count for `viewFormats`. The `INIT` macro sets this to 0. */ size_t viewFormatCount; + /** + * The additional @ref WGPUTextureFormat for @ref WGPUTextureView format reinterpretation of the surface's textures. + * + * The `INIT` macro sets this to `NULL`. + */ WGPUTextureFormat const * viewFormats; /** * How the surface's frames will be composited on the screen. + * + * If set to @ref WGPUCompositeAlphaMode_Auto, + * [defaults] to @ref WGPUCompositeAlphaMode_Inherit in native (allowing the mode + * to be configured externally), and to @ref WGPUCompositeAlphaMode_Opaque in Wasm. + * + * The `INIT` macro sets this to @ref WGPUCompositeAlphaMode_Auto. */ WGPUCompositeAlphaMode alphaMode; /** - * When and in which order the surface's frames will be shown on the screen. Defaults to @ref WGPUPresentMode_Fifo. + * When and in which order the surface's frames will be shown on the screen. + * + * If set to @ref WGPUPresentMode_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUPresentMode_Fifo. + * + * The `INIT` macro sets this to @ref WGPUPresentMode_Undefined. */ WGPUPresentMode presentMode; } WGPUSurfaceConfiguration WGPU_STRUCTURE_ATTRIBUTE; /** - * The root descriptor for the creation of an @ref WGPUSurface with `::wgpuInstanceCreateSurface`. - * It isn't sufficient by itself and must have one of the `WGPUSurfaceSource*` in its chain. - * See @ref Surface-Creation for more details. + * Initializer for @ref WGPUSurfaceConfiguration. */ -typedef struct WGPUSurfaceDescriptor { - WGPUChainedStruct const * nextInChain; - /** - * Label used to refer to the object. - * - * This is a \ref NonNullInputString. - */ - WGPUStringView label; -} WGPUSurfaceDescriptor WGPU_STRUCTURE_ATTRIBUTE; +#define WGPU_SURFACE_CONFIGURATION_INIT _wgpu_MAKE_INIT_STRUCT(WGPUSurfaceConfiguration, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.device=*/NULL _wgpu_COMMA \ + /*.format=*/WGPUTextureFormat_Undefined _wgpu_COMMA \ + /*.usage=*/WGPUTextureUsage_RenderAttachment _wgpu_COMMA \ + /*.width=*/0 _wgpu_COMMA \ + /*.height=*/0 _wgpu_COMMA \ + /*.viewFormatCount=*/0 _wgpu_COMMA \ + /*.viewFormats=*/NULL _wgpu_COMMA \ + /*.alphaMode=*/WGPUCompositeAlphaMode_Auto _wgpu_COMMA \ + /*.presentMode=*/WGPUPresentMode_Undefined _wgpu_COMMA \ +}) /** * Chained in @ref WGPUSurfaceDescriptor to make an @ref WGPUSurface wrapping an Android [`ANativeWindow`](https://developer.android.com/ndk/reference/group/a-native-window). + * + * Default values can be set using @ref WGPU_SURFACE_SOURCE_ANDROID_NATIVE_WINDOW_INIT as initializer. */ typedef struct WGPUSurfaceSourceAndroidNativeWindow { WGPUChainedStruct chain; /** * The pointer to the [`ANativeWindow`](https://developer.android.com/ndk/reference/group/a-native-window) that will be wrapped by the @ref WGPUSurface. + * + * The `INIT` macro sets this to `NULL`. */ void * window; } WGPUSurfaceSourceAndroidNativeWindow WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUSurfaceSourceAndroidNativeWindow. + */ +#define WGPU_SURFACE_SOURCE_ANDROID_NATIVE_WINDOW_INIT _wgpu_MAKE_INIT_STRUCT(WGPUSurfaceSourceAndroidNativeWindow, { \ + /*.chain=*/_wgpu_MAKE_INIT_STRUCT(WGPUChainedStruct, { \ + /*.next=*/NULL _wgpu_COMMA \ + /*.sType=*/WGPUSType_SurfaceSourceAndroidNativeWindow _wgpu_COMMA \ + }) _wgpu_COMMA \ + /*.window=*/NULL _wgpu_COMMA \ +}) + /** * Chained in @ref WGPUSurfaceDescriptor to make an @ref WGPUSurface wrapping a [`CAMetalLayer`](https://developer.apple.com/documentation/quartzcore/cametallayer?language=objc). + * + * Default values can be set using @ref WGPU_SURFACE_SOURCE_METAL_LAYER_INIT as initializer. */ typedef struct WGPUSurfaceSourceMetalLayer { WGPUChainedStruct chain; /** * The pointer to the [`CAMetalLayer`](https://developer.apple.com/documentation/quartzcore/cametallayer?language=objc) that will be wrapped by the @ref WGPUSurface. + * + * The `INIT` macro sets this to `NULL`. */ void * layer; } WGPUSurfaceSourceMetalLayer WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUSurfaceSourceMetalLayer. + */ +#define WGPU_SURFACE_SOURCE_METAL_LAYER_INIT _wgpu_MAKE_INIT_STRUCT(WGPUSurfaceSourceMetalLayer, { \ + /*.chain=*/_wgpu_MAKE_INIT_STRUCT(WGPUChainedStruct, { \ + /*.next=*/NULL _wgpu_COMMA \ + /*.sType=*/WGPUSType_SurfaceSourceMetalLayer _wgpu_COMMA \ + }) _wgpu_COMMA \ + /*.layer=*/NULL _wgpu_COMMA \ +}) + /** * Chained in @ref WGPUSurfaceDescriptor to make an @ref WGPUSurface wrapping a [Wayland](https://wayland.freedesktop.org/) [`wl_surface`](https://wayland.freedesktop.org/docs/html/apa.html#protocol-spec-wl_surface). + * + * Default values can be set using @ref WGPU_SURFACE_SOURCE_WAYLAND_SURFACE_INIT as initializer. */ typedef struct WGPUSurfaceSourceWaylandSurface { WGPUChainedStruct chain; /** * A [`wl_display`](https://wayland.freedesktop.org/docs/html/apa.html#protocol-spec-wl_display) for this Wayland instance. + * + * The `INIT` macro sets this to `NULL`. */ void * display; /** * A [`wl_surface`](https://wayland.freedesktop.org/docs/html/apa.html#protocol-spec-wl_surface) that will be wrapped by the @ref WGPUSurface + * + * The `INIT` macro sets this to `NULL`. */ void * surface; } WGPUSurfaceSourceWaylandSurface WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUSurfaceSourceWaylandSurface. + */ +#define WGPU_SURFACE_SOURCE_WAYLAND_SURFACE_INIT _wgpu_MAKE_INIT_STRUCT(WGPUSurfaceSourceWaylandSurface, { \ + /*.chain=*/_wgpu_MAKE_INIT_STRUCT(WGPUChainedStruct, { \ + /*.next=*/NULL _wgpu_COMMA \ + /*.sType=*/WGPUSType_SurfaceSourceWaylandSurface _wgpu_COMMA \ + }) _wgpu_COMMA \ + /*.display=*/NULL _wgpu_COMMA \ + /*.surface=*/NULL _wgpu_COMMA \ +}) + /** * Chained in @ref WGPUSurfaceDescriptor to make an @ref WGPUSurface wrapping a Windows [`HWND`](https://learn.microsoft.com/en-us/windows/apps/develop/ui-input/retrieve-hwnd). + * + * Default values can be set using @ref WGPU_SURFACE_SOURCE_WINDOWS_HWND_INIT as initializer. */ typedef struct WGPUSurfaceSourceWindowsHWND { WGPUChainedStruct chain; /** * The [`HINSTANCE`](https://learn.microsoft.com/en-us/windows/win32/learnwin32/winmain--the-application-entry-point) for this application. * Most commonly `GetModuleHandle(nullptr)`. + * + * The `INIT` macro sets this to `NULL`. */ void * hinstance; /** * The [`HWND`](https://learn.microsoft.com/en-us/windows/apps/develop/ui-input/retrieve-hwnd) that will be wrapped by the @ref WGPUSurface. + * + * The `INIT` macro sets this to `NULL`. */ void * hwnd; } WGPUSurfaceSourceWindowsHWND WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUSurfaceSourceWindowsHWND. + */ +#define WGPU_SURFACE_SOURCE_WINDOWS_HWND_INIT _wgpu_MAKE_INIT_STRUCT(WGPUSurfaceSourceWindowsHWND, { \ + /*.chain=*/_wgpu_MAKE_INIT_STRUCT(WGPUChainedStruct, { \ + /*.next=*/NULL _wgpu_COMMA \ + /*.sType=*/WGPUSType_SurfaceSourceWindowsHWND _wgpu_COMMA \ + }) _wgpu_COMMA \ + /*.hinstance=*/NULL _wgpu_COMMA \ + /*.hwnd=*/NULL _wgpu_COMMA \ +}) + /** * Chained in @ref WGPUSurfaceDescriptor to make an @ref WGPUSurface wrapping an [XCB](https://xcb.freedesktop.org/) `xcb_window_t`. + * + * Default values can be set using @ref WGPU_SURFACE_SOURCE_XCB_WINDOW_INIT as initializer. */ typedef struct WGPUSurfaceSourceXCBWindow { WGPUChainedStruct chain; /** * The `xcb_connection_t` for the connection to the X server. + * + * The `INIT` macro sets this to `NULL`. */ void * connection; /** * The `xcb_window_t` for the window that will be wrapped by the @ref WGPUSurface. + * + * The `INIT` macro sets this to `0`. */ uint32_t window; } WGPUSurfaceSourceXCBWindow WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUSurfaceSourceXCBWindow. + */ +#define WGPU_SURFACE_SOURCE_XCB_WINDOW_INIT _wgpu_MAKE_INIT_STRUCT(WGPUSurfaceSourceXCBWindow, { \ + /*.chain=*/_wgpu_MAKE_INIT_STRUCT(WGPUChainedStruct, { \ + /*.next=*/NULL _wgpu_COMMA \ + /*.sType=*/WGPUSType_SurfaceSourceXCBWindow _wgpu_COMMA \ + }) _wgpu_COMMA \ + /*.connection=*/NULL _wgpu_COMMA \ + /*.window=*/0 _wgpu_COMMA \ +}) + /** * Chained in @ref WGPUSurfaceDescriptor to make an @ref WGPUSurface wrapping an [Xlib](https://www.x.org/releases/current/doc/libX11/libX11/libX11.html) `Window`. + * + * Default values can be set using @ref WGPU_SURFACE_SOURCE_XLIB_WINDOW_INIT as initializer. */ typedef struct WGPUSurfaceSourceXlibWindow { WGPUChainedStruct chain; /** * A pointer to the [`Display`](https://www.x.org/releases/current/doc/libX11/libX11/libX11.html#Opening_the_Display) connected to the X server. + * + * The `INIT` macro sets this to `NULL`. */ void * display; /** * The [`Window`](https://www.x.org/releases/current/doc/libX11/libX11/libX11.html#Creating_Windows) that will be wrapped by the @ref WGPUSurface. + * + * The `INIT` macro sets this to `0`. */ uint64_t window; } WGPUSurfaceSourceXlibWindow WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUSurfaceSourceXlibWindow. + */ +#define WGPU_SURFACE_SOURCE_XLIB_WINDOW_INIT _wgpu_MAKE_INIT_STRUCT(WGPUSurfaceSourceXlibWindow, { \ + /*.chain=*/_wgpu_MAKE_INIT_STRUCT(WGPUChainedStruct, { \ + /*.next=*/NULL _wgpu_COMMA \ + /*.sType=*/WGPUSType_SurfaceSourceXlibWindow _wgpu_COMMA \ + }) _wgpu_COMMA \ + /*.display=*/NULL _wgpu_COMMA \ + /*.window=*/0 _wgpu_COMMA \ +}) + /** * Queried each frame from a @ref WGPUSurface to get a @ref WGPUTexture to render to along with some metadata. * See @ref Surface-Presenting for more details. + * + * Default values can be set using @ref WGPU_SURFACE_TEXTURE_INIT as initializer. */ typedef struct WGPUSurfaceTexture { - WGPUChainedStructOut * nextInChain; + WGPUChainedStruct * nextInChain; /** * The @ref WGPUTexture representing the frame that will be shown on the surface. * It is @ref ReturnedWithOwnership from @ref wgpuSurfaceGetCurrentTexture. + * + * The `INIT` macro sets this to `NULL`. */ WGPUTexture texture; /** - * Whether the call to `::wgpuSurfaceGetCurrentTexture` succeeded and a hint as to why it might not have. + * Whether the call to @ref wgpuSurfaceGetCurrentTexture succeeded and a hint as to why it might not have. + * + * The `INIT` macro sets this to (@ref WGPUSurfaceGetCurrentTextureStatus)0. */ WGPUSurfaceGetCurrentTextureStatus status; } WGPUSurfaceTexture WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUSurfaceTexture. + */ +#define WGPU_SURFACE_TEXTURE_INIT _wgpu_MAKE_INIT_STRUCT(WGPUSurfaceTexture, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.texture=*/NULL _wgpu_COMMA \ + /*.status=*/_wgpu_ENUM_ZERO_INIT(WGPUSurfaceGetCurrentTextureStatus) _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_TEXEL_COPY_BUFFER_LAYOUT_INIT as initializer. + */ typedef struct WGPUTexelCopyBufferLayout { + /** + * The `INIT` macro sets this to `0`. + */ uint64_t offset; + /** + * The `INIT` macro sets this to @ref WGPU_COPY_STRIDE_UNDEFINED. + */ uint32_t bytesPerRow; + /** + * The `INIT` macro sets this to @ref WGPU_COPY_STRIDE_UNDEFINED. + */ uint32_t rowsPerImage; } WGPUTexelCopyBufferLayout WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUTexelCopyBufferLayout. + */ +#define WGPU_TEXEL_COPY_BUFFER_LAYOUT_INIT _wgpu_MAKE_INIT_STRUCT(WGPUTexelCopyBufferLayout, { \ + /*.offset=*/0 _wgpu_COMMA \ + /*.bytesPerRow=*/WGPU_COPY_STRIDE_UNDEFINED _wgpu_COMMA \ + /*.rowsPerImage=*/WGPU_COPY_STRIDE_UNDEFINED _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_TEXTURE_BINDING_LAYOUT_INIT as initializer. + */ typedef struct WGPUTextureBindingLayout { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; + /** + * If set to @ref WGPUTextureSampleType_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUTextureSampleType_Float. + * + * The `INIT` macro sets this to @ref WGPUTextureSampleType_Undefined. + */ WGPUTextureSampleType sampleType; + /** + * If set to @ref WGPUTextureViewDimension_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUTextureViewDimension_2D. + * + * The `INIT` macro sets this to @ref WGPUTextureViewDimension_Undefined. + */ WGPUTextureViewDimension viewDimension; + /** + * The `INIT` macro sets this to `WGPU_FALSE`. + */ WGPUBool multisampled; } WGPUTextureBindingLayout WGPU_STRUCTURE_ATTRIBUTE; -typedef struct WGPUTextureViewDescriptor { - WGPUChainedStruct const * nextInChain; - /** - * This is a \ref NonNullInputString. - */ - WGPUStringView label; - WGPUTextureFormat format; - WGPUTextureViewDimension dimension; - uint32_t baseMipLevel; - uint32_t mipLevelCount; - uint32_t baseArrayLayer; - uint32_t arrayLayerCount; - WGPUTextureAspect aspect; - WGPUTextureUsage usage; -} WGPUTextureViewDescriptor WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUTextureBindingLayout. + */ +#define WGPU_TEXTURE_BINDING_LAYOUT_INIT _wgpu_MAKE_INIT_STRUCT(WGPUTextureBindingLayout, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.sampleType=*/WGPUTextureSampleType_Undefined _wgpu_COMMA \ + /*.viewDimension=*/WGPUTextureViewDimension_Undefined _wgpu_COMMA \ + /*.multisampled=*/WGPU_FALSE _wgpu_COMMA \ +}) +/** + * Note: While Compatibility Mode is optional to implement, this extension struct + * is required to be accepted (but per the WebGPU spec, its contents are ignored + * on devices that have the @ref WGPUFeatureName_CoreFeaturesAndLimits feature). + * + * Default values can be set using @ref WGPU_TEXTURE_BINDING_VIEW_DIMENSION_INIT as initializer. + */ +typedef struct WGPUTextureBindingViewDimension { + WGPUChainedStruct chain; + /** + * The `INIT` macro sets this to @ref WGPUTextureViewDimension_Undefined. + */ + WGPUTextureViewDimension textureBindingViewDimension; +} WGPUTextureBindingViewDimension WGPU_STRUCTURE_ATTRIBUTE; + +/** + * Initializer for @ref WGPUTextureBindingViewDimension. + */ +#define WGPU_TEXTURE_BINDING_VIEW_DIMENSION_INIT _wgpu_MAKE_INIT_STRUCT(WGPUTextureBindingViewDimension, { \ + /*.chain=*/_wgpu_MAKE_INIT_STRUCT(WGPUChainedStruct, { \ + /*.next=*/NULL _wgpu_COMMA \ + /*.sType=*/WGPUSType_TextureBindingViewDimension _wgpu_COMMA \ + }) _wgpu_COMMA \ + /*.textureBindingViewDimension=*/WGPUTextureViewDimension_Undefined _wgpu_COMMA \ +}) + +/** + * When accessed by a shader, the red/green/blue/alpha channels are replaced + * by the value corresponding to the component specified in r, g, b, and a, + * respectively unlike the JS API which uses a string of length four, with + * each character mapping to the texture view's red/green/blue/alpha channels. + * + * Default values can be set using @ref WGPU_TEXTURE_COMPONENT_SWIZZLE_INIT as initializer. + */ +typedef struct WGPUTextureComponentSwizzle { + /** + * The value that replaces the red channel in the shader. + * + * If set to @ref WGPUComponentSwizzle_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUComponentSwizzle_R. + * + * The `INIT` macro sets this to @ref WGPUComponentSwizzle_Undefined. + */ + WGPUComponentSwizzle r; + /** + * The value that replaces the green channel in the shader. + * + * If set to @ref WGPUComponentSwizzle_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUComponentSwizzle_G. + * + * The `INIT` macro sets this to @ref WGPUComponentSwizzle_Undefined. + */ + WGPUComponentSwizzle g; + /** + * The value that replaces the blue channel in the shader. + * + * If set to @ref WGPUComponentSwizzle_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUComponentSwizzle_B. + * + * The `INIT` macro sets this to @ref WGPUComponentSwizzle_Undefined. + */ + WGPUComponentSwizzle b; + /** + * The value that replaces the alpha channel in the shader. + * + * If set to @ref WGPUComponentSwizzle_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUComponentSwizzle_A. + * + * The `INIT` macro sets this to @ref WGPUComponentSwizzle_Undefined. + */ + WGPUComponentSwizzle a; +} WGPUTextureComponentSwizzle WGPU_STRUCTURE_ATTRIBUTE; + +/** + * Initializer for @ref WGPUTextureComponentSwizzle. + */ +#define WGPU_TEXTURE_COMPONENT_SWIZZLE_INIT _wgpu_MAKE_INIT_STRUCT(WGPUTextureComponentSwizzle, { \ + /*.r=*/WGPUComponentSwizzle_Undefined _wgpu_COMMA \ + /*.g=*/WGPUComponentSwizzle_Undefined _wgpu_COMMA \ + /*.b=*/WGPUComponentSwizzle_Undefined _wgpu_COMMA \ + /*.a=*/WGPUComponentSwizzle_Undefined _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_VERTEX_ATTRIBUTE_INIT as initializer. + */ typedef struct WGPUVertexAttribute { + WGPUChainedStruct * nextInChain; + /** + * The `INIT` macro sets this to (@ref WGPUVertexFormat)0. + */ WGPUVertexFormat format; + /** + * The `INIT` macro sets this to `0`. + */ uint64_t offset; + /** + * The `INIT` macro sets this to `0`. + */ uint32_t shaderLocation; } WGPUVertexAttribute WGPU_STRUCTURE_ATTRIBUTE; -typedef struct WGPUBindGroupDescriptor { - WGPUChainedStruct const * nextInChain; - /** - * This is a \ref NonNullInputString. - */ - WGPUStringView label; - WGPUBindGroupLayout layout; - size_t entryCount; - WGPUBindGroupEntry const * entries; -} WGPUBindGroupDescriptor WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUVertexAttribute. + */ +#define WGPU_VERTEX_ATTRIBUTE_INIT _wgpu_MAKE_INIT_STRUCT(WGPUVertexAttribute, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.format=*/_wgpu_ENUM_ZERO_INIT(WGPUVertexFormat) _wgpu_COMMA \ + /*.offset=*/0 _wgpu_COMMA \ + /*.shaderLocation=*/0 _wgpu_COMMA \ +}) -typedef struct WGPUBindGroupLayoutEntry { - WGPUChainedStruct const * nextInChain; +/** + * Default values can be set using @ref WGPU_BIND_GROUP_ENTRY_INIT as initializer. + */ +typedef struct WGPUBindGroupEntry { + WGPUChainedStruct * nextInChain; + /** + * Binding index in the bind group. + * + * The `INIT` macro sets this to `0`. + */ uint32_t binding; + /** + * Set this if the binding is a buffer object. + * Otherwise must be null. + * + * The `INIT` macro sets this to `NULL`. + */ + WGPU_NULLABLE WGPUBuffer buffer; + /** + * If the binding is a buffer, this is the byte offset of the binding range. + * Otherwise ignored. + * + * The `INIT` macro sets this to `0`. + */ + uint64_t offset; + /** + * If the binding is a buffer, this is the byte size of the binding range + * (@ref WGPU_WHOLE_SIZE means the binding ends at the end of the buffer). + * Otherwise ignored. + * + * The `INIT` macro sets this to @ref WGPU_WHOLE_SIZE. + */ + uint64_t size; + /** + * Set this if the binding is a sampler object. + * Otherwise must be null. + * + * The `INIT` macro sets this to `NULL`. + */ + WGPU_NULLABLE WGPUSampler sampler; + /** + * Set this if the binding is a texture view object. + * Otherwise must be null. + * + * The `INIT` macro sets this to `NULL`. + */ + WGPU_NULLABLE WGPUTextureView textureView; +} WGPUBindGroupEntry WGPU_STRUCTURE_ATTRIBUTE; + +/** + * Initializer for @ref WGPUBindGroupEntry. + */ +#define WGPU_BIND_GROUP_ENTRY_INIT _wgpu_MAKE_INIT_STRUCT(WGPUBindGroupEntry, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.binding=*/0 _wgpu_COMMA \ + /*.buffer=*/NULL _wgpu_COMMA \ + /*.offset=*/0 _wgpu_COMMA \ + /*.size=*/WGPU_WHOLE_SIZE _wgpu_COMMA \ + /*.sampler=*/NULL _wgpu_COMMA \ + /*.textureView=*/NULL _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_BIND_GROUP_LAYOUT_ENTRY_INIT as initializer. + */ +typedef struct WGPUBindGroupLayoutEntry { + WGPUChainedStruct * nextInChain; + /** + * The `INIT` macro sets this to `0`. + */ + uint32_t binding; + /** + * The `INIT` macro sets this to @ref WGPUShaderStage_None. + */ WGPUShaderStage visibility; + /** + * If non-zero, this entry defines a binding array with this size. + * + * The `INIT` macro sets this to `0`. + */ + uint32_t bindingArraySize; + /** + * The `INIT` macro sets this to zero (which sets the entry to `BindingNotUsed`). + */ WGPUBufferBindingLayout buffer; + /** + * The `INIT` macro sets this to zero (which sets the entry to `BindingNotUsed`). + */ WGPUSamplerBindingLayout sampler; + /** + * The `INIT` macro sets this to zero (which sets the entry to `BindingNotUsed`). + */ WGPUTextureBindingLayout texture; + /** + * The `INIT` macro sets this to zero (which sets the entry to `BindingNotUsed`). + */ WGPUStorageTextureBindingLayout storageTexture; } WGPUBindGroupLayoutEntry WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUBindGroupLayoutEntry. + */ +#define WGPU_BIND_GROUP_LAYOUT_ENTRY_INIT _wgpu_MAKE_INIT_STRUCT(WGPUBindGroupLayoutEntry, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.binding=*/0 _wgpu_COMMA \ + /*.visibility=*/WGPUShaderStage_None _wgpu_COMMA \ + /*.bindingArraySize=*/0 _wgpu_COMMA \ + /*.buffer=*/_wgpu_STRUCT_ZERO_INIT _wgpu_COMMA \ + /*.sampler=*/_wgpu_STRUCT_ZERO_INIT _wgpu_COMMA \ + /*.texture=*/_wgpu_STRUCT_ZERO_INIT _wgpu_COMMA \ + /*.storageTexture=*/_wgpu_STRUCT_ZERO_INIT _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_BLEND_STATE_INIT as initializer. + */ typedef struct WGPUBlendState { + /** + * The `INIT` macro sets this to @ref WGPU_BLEND_COMPONENT_INIT. + */ WGPUBlendComponent color; + /** + * The `INIT` macro sets this to @ref WGPU_BLEND_COMPONENT_INIT. + */ WGPUBlendComponent alpha; } WGPUBlendState WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUBlendState. + */ +#define WGPU_BLEND_STATE_INIT _wgpu_MAKE_INIT_STRUCT(WGPUBlendState, { \ + /*.color=*/WGPU_BLEND_COMPONENT_INIT _wgpu_COMMA \ + /*.alpha=*/WGPU_BLEND_COMPONENT_INIT _wgpu_COMMA \ +}) + +/** + * This is an @ref ImplementationAllocatedStructChain root. + * Arbitrary chains must be handled gracefully by the application! + * + * Default values can be set using @ref WGPU_COMPILATION_INFO_INIT as initializer. + */ typedef struct WGPUCompilationInfo { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; + /** + * Array count for `messages`. The `INIT` macro sets this to 0. + */ size_t messageCount; + /** + * The `INIT` macro sets this to `NULL`. + */ WGPUCompilationMessage const * messages; } WGPUCompilationInfo WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUCompilationInfo. + */ +#define WGPU_COMPILATION_INFO_INIT _wgpu_MAKE_INIT_STRUCT(WGPUCompilationInfo, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.messageCount=*/0 _wgpu_COMMA \ + /*.messages=*/NULL _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_COMPUTE_PASS_DESCRIPTOR_INIT as initializer. + */ typedef struct WGPUComputePassDescriptor { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; /** * This is a \ref NonNullInputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. */ WGPUStringView label; - WGPU_NULLABLE WGPUComputePassTimestampWrites const * timestampWrites; + /** + * The `INIT` macro sets this to `NULL`. + */ + WGPU_NULLABLE WGPUPassTimestampWrites const * timestampWrites; } WGPUComputePassDescriptor WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUComputePassDescriptor. + */ +#define WGPU_COMPUTE_PASS_DESCRIPTOR_INIT _wgpu_MAKE_INIT_STRUCT(WGPUComputePassDescriptor, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.label=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ + /*.timestampWrites=*/NULL _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_COMPUTE_STATE_INIT as initializer. + */ +typedef struct WGPUComputeState { + WGPUChainedStruct * nextInChain; + /** + * The `INIT` macro sets this to `NULL`. + */ + WGPUShaderModule module; + /** + * This is a \ref NullableInputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. + */ + WGPUStringView entryPoint; + /** + * Array count for `constants`. The `INIT` macro sets this to 0. + */ + size_t constantCount; + /** + * The `INIT` macro sets this to `NULL`. + */ + WGPUConstantEntry const * constants; +} WGPUComputeState WGPU_STRUCTURE_ATTRIBUTE; + +/** + * Initializer for @ref WGPUComputeState. + */ +#define WGPU_COMPUTE_STATE_INIT _wgpu_MAKE_INIT_STRUCT(WGPUComputeState, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.module=*/NULL _wgpu_COMMA \ + /*.entryPoint=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ + /*.constantCount=*/0 _wgpu_COMMA \ + /*.constants=*/NULL _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_DEPTH_STENCIL_STATE_INIT as initializer. + */ typedef struct WGPUDepthStencilState { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; + /** + * The `INIT` macro sets this to @ref WGPUTextureFormat_Undefined. + */ WGPUTextureFormat format; + /** + * The `INIT` macro sets this to @ref WGPUOptionalBool_Undefined. + */ WGPUOptionalBool depthWriteEnabled; + /** + * The `INIT` macro sets this to @ref WGPUCompareFunction_Undefined. + */ WGPUCompareFunction depthCompare; + /** + * The `INIT` macro sets this to @ref WGPU_STENCIL_FACE_STATE_INIT. + */ WGPUStencilFaceState stencilFront; + /** + * The `INIT` macro sets this to @ref WGPU_STENCIL_FACE_STATE_INIT. + */ WGPUStencilFaceState stencilBack; + /** + * The `INIT` macro sets this to `0xFFFFFFFF`. + */ uint32_t stencilReadMask; + /** + * The `INIT` macro sets this to `0xFFFFFFFF`. + */ uint32_t stencilWriteMask; + /** + * The `INIT` macro sets this to `0`. + */ int32_t depthBias; + /** + * TODO + * + * If non-finite, produces a @ref NonFiniteFloatValueError. + * + * The `INIT` macro sets this to `0.f`. + */ float depthBiasSlopeScale; + /** + * TODO + * + * If non-finite, produces a @ref NonFiniteFloatValueError. + * + * The `INIT` macro sets this to `0.f`. + */ float depthBiasClamp; } WGPUDepthStencilState WGPU_STRUCTURE_ATTRIBUTE; -typedef struct WGPUDeviceDescriptor { - WGPUChainedStruct const * nextInChain; - /** - * This is a \ref NonNullInputString. - */ - WGPUStringView label; - size_t requiredFeatureCount; - WGPUFeatureName const * requiredFeatures; - WGPU_NULLABLE WGPULimits const * requiredLimits; - WGPUQueueDescriptor defaultQueue; - WGPUDeviceLostCallbackInfo deviceLostCallbackInfo; - WGPUUncapturedErrorCallbackInfo uncapturedErrorCallbackInfo; -} WGPUDeviceDescriptor WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUDepthStencilState. + */ +#define WGPU_DEPTH_STENCIL_STATE_INIT _wgpu_MAKE_INIT_STRUCT(WGPUDepthStencilState, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.format=*/WGPUTextureFormat_Undefined _wgpu_COMMA \ + /*.depthWriteEnabled=*/WGPUOptionalBool_Undefined _wgpu_COMMA \ + /*.depthCompare=*/WGPUCompareFunction_Undefined _wgpu_COMMA \ + /*.stencilFront=*/WGPU_STENCIL_FACE_STATE_INIT _wgpu_COMMA \ + /*.stencilBack=*/WGPU_STENCIL_FACE_STATE_INIT _wgpu_COMMA \ + /*.stencilReadMask=*/0xFFFFFFFF _wgpu_COMMA \ + /*.stencilWriteMask=*/0xFFFFFFFF _wgpu_COMMA \ + /*.depthBias=*/0 _wgpu_COMMA \ + /*.depthBiasSlopeScale=*/0.f _wgpu_COMMA \ + /*.depthBiasClamp=*/0.f _wgpu_COMMA \ +}) /** * Struct holding a future to wait on, and a `completed` boolean flag. + * + * Default values can be set using @ref WGPU_FUTURE_WAIT_INFO_INIT as initializer. */ typedef struct WGPUFutureWaitInfo { /** * The future to wait on. + * + * The `INIT` macro sets this to @ref WGPU_FUTURE_INIT. */ WGPUFuture future; /** * Whether or not the future completed. + * + * The `INIT` macro sets this to `WGPU_FALSE`. */ WGPUBool completed; } WGPUFutureWaitInfo WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUFutureWaitInfo. + */ +#define WGPU_FUTURE_WAIT_INFO_INIT _wgpu_MAKE_INIT_STRUCT(WGPUFutureWaitInfo, { \ + /*.future=*/WGPU_FUTURE_INIT _wgpu_COMMA \ + /*.completed=*/WGPU_FALSE _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_INSTANCE_DESCRIPTOR_INIT as initializer. + */ typedef struct WGPUInstanceDescriptor { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; /** - * Instance features to enable + * Array count for `requiredFeatures`. The `INIT` macro sets this to 0. */ - WGPUInstanceCapabilities features; + size_t requiredFeatureCount; + /** + * The `INIT` macro sets this to `NULL`. + */ + WGPUInstanceFeatureName const * requiredFeatures; + /** + * The `INIT` macro sets this to `NULL`. + */ + WGPU_NULLABLE WGPUInstanceLimits const * requiredLimits; } WGPUInstanceDescriptor WGPU_STRUCTURE_ATTRIBUTE; -typedef struct WGPUProgrammableStageDescriptor { - WGPUChainedStruct const * nextInChain; - WGPUShaderModule module; - /** - * This is a \ref NullableInputString. - */ - WGPUStringView entryPoint; - size_t constantCount; - WGPUConstantEntry const * constants; -} WGPUProgrammableStageDescriptor WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUInstanceDescriptor. + */ +#define WGPU_INSTANCE_DESCRIPTOR_INIT _wgpu_MAKE_INIT_STRUCT(WGPUInstanceDescriptor, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.requiredFeatureCount=*/0 _wgpu_COMMA \ + /*.requiredFeatures=*/NULL _wgpu_COMMA \ + /*.requiredLimits=*/NULL _wgpu_COMMA \ +}) +/** + * Default values can be set using @ref WGPU_LIMITS_INIT as initializer. + */ +typedef struct WGPULimits { + WGPUChainedStruct * nextInChain; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxTextureDimension1D; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxTextureDimension2D; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxTextureDimension3D; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxTextureArrayLayers; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxBindGroups; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxBindGroupsPlusVertexBuffers; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxBindingsPerBindGroup; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxDynamicUniformBuffersPerPipelineLayout; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxDynamicStorageBuffersPerPipelineLayout; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxSampledTexturesPerShaderStage; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxSamplersPerShaderStage; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxStorageBuffersPerShaderStage; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxStorageTexturesPerShaderStage; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxUniformBuffersPerShaderStage; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U64_UNDEFINED. + */ + uint64_t maxUniformBufferBindingSize; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U64_UNDEFINED. + */ + uint64_t maxStorageBufferBindingSize; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t minUniformBufferOffsetAlignment; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t minStorageBufferOffsetAlignment; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxVertexBuffers; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U64_UNDEFINED. + */ + uint64_t maxBufferSize; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxVertexAttributes; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxVertexBufferArrayStride; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxInterStageShaderVariables; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxColorAttachments; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxColorAttachmentBytesPerSample; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxComputeWorkgroupStorageSize; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxComputeInvocationsPerWorkgroup; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxComputeWorkgroupSizeX; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxComputeWorkgroupSizeY; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxComputeWorkgroupSizeZ; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxComputeWorkgroupsPerDimension; + /** + * The `INIT` macro sets this to @ref WGPU_LIMIT_U32_UNDEFINED. + */ + uint32_t maxImmediateSize; +} WGPULimits WGPU_STRUCTURE_ATTRIBUTE; + +/** + * Initializer for @ref WGPULimits. + */ +#define WGPU_LIMITS_INIT _wgpu_MAKE_INIT_STRUCT(WGPULimits, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.maxTextureDimension1D=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxTextureDimension2D=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxTextureDimension3D=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxTextureArrayLayers=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxBindGroups=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxBindGroupsPlusVertexBuffers=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxBindingsPerBindGroup=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxDynamicUniformBuffersPerPipelineLayout=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxDynamicStorageBuffersPerPipelineLayout=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxSampledTexturesPerShaderStage=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxSamplersPerShaderStage=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxStorageBuffersPerShaderStage=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxStorageTexturesPerShaderStage=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxUniformBuffersPerShaderStage=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxUniformBufferBindingSize=*/WGPU_LIMIT_U64_UNDEFINED _wgpu_COMMA \ + /*.maxStorageBufferBindingSize=*/WGPU_LIMIT_U64_UNDEFINED _wgpu_COMMA \ + /*.minUniformBufferOffsetAlignment=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.minStorageBufferOffsetAlignment=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxVertexBuffers=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxBufferSize=*/WGPU_LIMIT_U64_UNDEFINED _wgpu_COMMA \ + /*.maxVertexAttributes=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxVertexBufferArrayStride=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxInterStageShaderVariables=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxColorAttachments=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxColorAttachmentBytesPerSample=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxComputeWorkgroupStorageSize=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxComputeInvocationsPerWorkgroup=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxComputeWorkgroupSizeX=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxComputeWorkgroupSizeY=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxComputeWorkgroupSizeZ=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxComputeWorkgroupsPerDimension=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ + /*.maxImmediateSize=*/WGPU_LIMIT_U32_UNDEFINED _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_RENDER_PASS_COLOR_ATTACHMENT_INIT as initializer. + */ typedef struct WGPURenderPassColorAttachment { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; + /** + * If `NULL`, indicates a hole in the parent + * @ref WGPURenderPassDescriptor::colorAttachments array. + * + * The `INIT` macro sets this to `NULL`. + */ WGPU_NULLABLE WGPUTextureView view; + /** + * The `INIT` macro sets this to @ref WGPU_DEPTH_SLICE_UNDEFINED. + */ uint32_t depthSlice; + /** + * The `INIT` macro sets this to `NULL`. + */ WGPU_NULLABLE WGPUTextureView resolveTarget; + /** + * The `INIT` macro sets this to @ref WGPULoadOp_Undefined. + */ WGPULoadOp loadOp; + /** + * The `INIT` macro sets this to @ref WGPUStoreOp_Undefined. + */ WGPUStoreOp storeOp; + /** + * The `INIT` macro sets this to @ref WGPU_COLOR_INIT. + */ WGPUColor clearValue; } WGPURenderPassColorAttachment WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPURenderPassColorAttachment. + */ +#define WGPU_RENDER_PASS_COLOR_ATTACHMENT_INIT _wgpu_MAKE_INIT_STRUCT(WGPURenderPassColorAttachment, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.view=*/NULL _wgpu_COMMA \ + /*.depthSlice=*/WGPU_DEPTH_SLICE_UNDEFINED _wgpu_COMMA \ + /*.resolveTarget=*/NULL _wgpu_COMMA \ + /*.loadOp=*/WGPULoadOp_Undefined _wgpu_COMMA \ + /*.storeOp=*/WGPUStoreOp_Undefined _wgpu_COMMA \ + /*.clearValue=*/WGPU_COLOR_INIT _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_REQUEST_ADAPTER_OPTIONS_INIT as initializer. + */ +typedef struct WGPURequestAdapterOptions { + WGPUChainedStruct * nextInChain; + /** + * "Feature level" for the adapter request. If an adapter is returned, it must support the features and limits in the requested feature level. + * + * If set to @ref WGPUFeatureLevel_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUFeatureLevel_Core. + * Additionally, implementations may ignore @ref WGPUFeatureLevel_Compatibility + * and provide @ref WGPUFeatureLevel_Core instead. + * + * The `INIT` macro sets this to @ref WGPUFeatureLevel_Undefined. + */ + WGPUFeatureLevel featureLevel; + /** + * The `INIT` macro sets this to @ref WGPUPowerPreference_Undefined. + */ + WGPUPowerPreference powerPreference; + /** + * If true, requires the adapter to be a "fallback" adapter as defined by the JS spec. + * If this is not possible, the request returns null. + * + * The `INIT` macro sets this to `WGPU_FALSE`. + */ + WGPUBool forceFallbackAdapter; + /** + * If set, requires the adapter to have a particular backend type. + * If this is not possible, the request returns null. + * + * The `INIT` macro sets this to @ref WGPUBackendType_Undefined. + */ + WGPUBackendType backendType; + /** + * If set, requires the adapter to be able to output to a particular surface. + * If this is not possible, the request returns null. + * + * The `INIT` macro sets this to `NULL`. + */ + WGPU_NULLABLE WGPUSurface compatibleSurface; +} WGPURequestAdapterOptions WGPU_STRUCTURE_ATTRIBUTE; + +/** + * Initializer for @ref WGPURequestAdapterOptions. + */ +#define WGPU_REQUEST_ADAPTER_OPTIONS_INIT _wgpu_MAKE_INIT_STRUCT(WGPURequestAdapterOptions, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.featureLevel=*/WGPUFeatureLevel_Undefined _wgpu_COMMA \ + /*.powerPreference=*/WGPUPowerPreference_Undefined _wgpu_COMMA \ + /*.forceFallbackAdapter=*/WGPU_FALSE _wgpu_COMMA \ + /*.backendType=*/WGPUBackendType_Undefined _wgpu_COMMA \ + /*.compatibleSurface=*/NULL _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_SHADER_MODULE_DESCRIPTOR_INIT as initializer. + */ +typedef struct WGPUShaderModuleDescriptor { + WGPUChainedStruct * nextInChain; + /** + * This is a \ref NonNullInputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. + */ + WGPUStringView label; +} WGPUShaderModuleDescriptor WGPU_STRUCTURE_ATTRIBUTE; + +/** + * Initializer for @ref WGPUShaderModuleDescriptor. + */ +#define WGPU_SHADER_MODULE_DESCRIPTOR_INIT _wgpu_MAKE_INIT_STRUCT(WGPUShaderModuleDescriptor, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.label=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ +}) + +/** + * The root descriptor for the creation of an @ref WGPUSurface with @ref wgpuInstanceCreateSurface. + * It isn't sufficient by itself and must have one of the `WGPUSurfaceSource*` in its chain. + * See @ref Surface-Creation for more details. + * + * Default values can be set using @ref WGPU_SURFACE_DESCRIPTOR_INIT as initializer. + */ +typedef struct WGPUSurfaceDescriptor { + WGPUChainedStruct * nextInChain; + /** + * Label used to refer to the object. + * + * This is a \ref NonNullInputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. + */ + WGPUStringView label; +} WGPUSurfaceDescriptor WGPU_STRUCTURE_ATTRIBUTE; + +/** + * Initializer for @ref WGPUSurfaceDescriptor. + */ +#define WGPU_SURFACE_DESCRIPTOR_INIT _wgpu_MAKE_INIT_STRUCT(WGPUSurfaceDescriptor, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.label=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_TEXEL_COPY_BUFFER_INFO_INIT as initializer. + */ typedef struct WGPUTexelCopyBufferInfo { + /** + * The `INIT` macro sets this to @ref WGPU_TEXEL_COPY_BUFFER_LAYOUT_INIT. + */ WGPUTexelCopyBufferLayout layout; + /** + * The `INIT` macro sets this to `NULL`. + */ WGPUBuffer buffer; } WGPUTexelCopyBufferInfo WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUTexelCopyBufferInfo. + */ +#define WGPU_TEXEL_COPY_BUFFER_INFO_INIT _wgpu_MAKE_INIT_STRUCT(WGPUTexelCopyBufferInfo, { \ + /*.layout=*/WGPU_TEXEL_COPY_BUFFER_LAYOUT_INIT _wgpu_COMMA \ + /*.buffer=*/NULL _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_TEXEL_COPY_TEXTURE_INFO_INIT as initializer. + */ typedef struct WGPUTexelCopyTextureInfo { + /** + * The `INIT` macro sets this to `NULL`. + */ WGPUTexture texture; + /** + * The `INIT` macro sets this to `0`. + */ uint32_t mipLevel; + /** + * The `INIT` macro sets this to @ref WGPU_ORIGIN_3D_INIT. + */ WGPUOrigin3D origin; + /** + * If set to @ref WGPUTextureAspect_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUTextureAspect_All. + * + * The `INIT` macro sets this to @ref WGPUTextureAspect_Undefined. + */ WGPUTextureAspect aspect; } WGPUTexelCopyTextureInfo WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUTexelCopyTextureInfo. + */ +#define WGPU_TEXEL_COPY_TEXTURE_INFO_INIT _wgpu_MAKE_INIT_STRUCT(WGPUTexelCopyTextureInfo, { \ + /*.texture=*/NULL _wgpu_COMMA \ + /*.mipLevel=*/0 _wgpu_COMMA \ + /*.origin=*/WGPU_ORIGIN_3D_INIT _wgpu_COMMA \ + /*.aspect=*/WGPUTextureAspect_Undefined _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_TEXTURE_COMPONENT_SWIZZLE_DESCRIPTOR_INIT as initializer. + */ +typedef struct WGPUTextureComponentSwizzleDescriptor { + WGPUChainedStruct chain; + /** + * The `INIT` macro sets this to @ref WGPU_TEXTURE_COMPONENT_SWIZZLE_INIT. + */ + WGPUTextureComponentSwizzle swizzle; +} WGPUTextureComponentSwizzleDescriptor WGPU_STRUCTURE_ATTRIBUTE; + +/** + * Initializer for @ref WGPUTextureComponentSwizzleDescriptor. + */ +#define WGPU_TEXTURE_COMPONENT_SWIZZLE_DESCRIPTOR_INIT _wgpu_MAKE_INIT_STRUCT(WGPUTextureComponentSwizzleDescriptor, { \ + /*.chain=*/_wgpu_MAKE_INIT_STRUCT(WGPUChainedStruct, { \ + /*.next=*/NULL _wgpu_COMMA \ + /*.sType=*/WGPUSType_TextureComponentSwizzleDescriptor _wgpu_COMMA \ + }) _wgpu_COMMA \ + /*.swizzle=*/WGPU_TEXTURE_COMPONENT_SWIZZLE_INIT _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_TEXTURE_DESCRIPTOR_INIT as initializer. + */ typedef struct WGPUTextureDescriptor { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; /** * This is a \ref NonNullInputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. */ WGPUStringView label; + /** + * The `INIT` macro sets this to @ref WGPUTextureUsage_None. + */ WGPUTextureUsage usage; + /** + * If set to @ref WGPUTextureDimension_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUTextureDimension_2D. + * + * The `INIT` macro sets this to @ref WGPUTextureDimension_Undefined. + */ WGPUTextureDimension dimension; + /** + * The `INIT` macro sets this to @ref WGPU_EXTENT_3D_INIT. + */ WGPUExtent3D size; + /** + * The `INIT` macro sets this to @ref WGPUTextureFormat_Undefined. + */ WGPUTextureFormat format; + /** + * The `INIT` macro sets this to `1`. + */ uint32_t mipLevelCount; + /** + * The `INIT` macro sets this to `1`. + */ uint32_t sampleCount; + /** + * Array count for `viewFormats`. The `INIT` macro sets this to 0. + */ size_t viewFormatCount; + /** + * The `INIT` macro sets this to `NULL`. + */ WGPUTextureFormat const * viewFormats; } WGPUTextureDescriptor WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUTextureDescriptor. + */ +#define WGPU_TEXTURE_DESCRIPTOR_INIT _wgpu_MAKE_INIT_STRUCT(WGPUTextureDescriptor, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.label=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ + /*.usage=*/WGPUTextureUsage_None _wgpu_COMMA \ + /*.dimension=*/WGPUTextureDimension_Undefined _wgpu_COMMA \ + /*.size=*/WGPU_EXTENT_3D_INIT _wgpu_COMMA \ + /*.format=*/WGPUTextureFormat_Undefined _wgpu_COMMA \ + /*.mipLevelCount=*/1 _wgpu_COMMA \ + /*.sampleCount=*/1 _wgpu_COMMA \ + /*.viewFormatCount=*/0 _wgpu_COMMA \ + /*.viewFormats=*/NULL _wgpu_COMMA \ +}) + +/** + * If `attributes` is empty *and* `stepMode` is @ref WGPUVertexStepMode_Undefined, + * indicates a "hole" in the parent @ref WGPUVertexState `buffers` array, + * with behavior equivalent to `null` in the JS API. + * + * If `attributes` is empty but `stepMode` is *not* @ref WGPUVertexStepMode_Undefined, + * indicates a vertex buffer with no attributes, with behavior equivalent to + * `{ attributes: [] }` in the JS API. (TODO: If the JS API changes not to + * distinguish these cases, then this distinction doesn't matter and we can + * remove this documentation.) + * + * If `stepMode` is @ref WGPUVertexStepMode_Undefined but `attributes` is *not* empty, + * `stepMode` [defaults](@ref SentinelValues) to @ref WGPUVertexStepMode_Vertex. + * + * Default values can be set using @ref WGPU_VERTEX_BUFFER_LAYOUT_INIT as initializer. + */ typedef struct WGPUVertexBufferLayout { + WGPUChainedStruct * nextInChain; /** - * The step mode for the vertex buffer. If @ref WGPUVertexStepMode_VertexBufferNotUsed, - * indicates a "hole" in the parent @ref WGPUVertexState `buffers` array: - * the pipeline does not use a vertex buffer at this `location`. + * The `INIT` macro sets this to @ref WGPUVertexStepMode_Undefined. */ WGPUVertexStepMode stepMode; + /** + * The `INIT` macro sets this to `0`. + */ uint64_t arrayStride; + /** + * Array count for `attributes`. The `INIT` macro sets this to 0. + */ size_t attributeCount; + /** + * The `INIT` macro sets this to `NULL`. + */ WGPUVertexAttribute const * attributes; } WGPUVertexBufferLayout WGPU_STRUCTURE_ATTRIBUTE; -typedef struct WGPUBindGroupLayoutDescriptor { - WGPUChainedStruct const * nextInChain; +/** + * Initializer for @ref WGPUVertexBufferLayout. + */ +#define WGPU_VERTEX_BUFFER_LAYOUT_INIT _wgpu_MAKE_INIT_STRUCT(WGPUVertexBufferLayout, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.stepMode=*/WGPUVertexStepMode_Undefined _wgpu_COMMA \ + /*.arrayStride=*/0 _wgpu_COMMA \ + /*.attributeCount=*/0 _wgpu_COMMA \ + /*.attributes=*/NULL _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_BIND_GROUP_DESCRIPTOR_INIT as initializer. + */ +typedef struct WGPUBindGroupDescriptor { + WGPUChainedStruct * nextInChain; /** * This is a \ref NonNullInputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. */ WGPUStringView label; + /** + * The `INIT` macro sets this to `NULL`. + */ + WGPUBindGroupLayout layout; + /** + * Array count for `entries`. The `INIT` macro sets this to 0. + */ size_t entryCount; + /** + * The `INIT` macro sets this to `NULL`. + */ + WGPUBindGroupEntry const * entries; +} WGPUBindGroupDescriptor WGPU_STRUCTURE_ATTRIBUTE; + +/** + * Initializer for @ref WGPUBindGroupDescriptor. + */ +#define WGPU_BIND_GROUP_DESCRIPTOR_INIT _wgpu_MAKE_INIT_STRUCT(WGPUBindGroupDescriptor, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.label=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ + /*.layout=*/NULL _wgpu_COMMA \ + /*.entryCount=*/0 _wgpu_COMMA \ + /*.entries=*/NULL _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_BIND_GROUP_LAYOUT_DESCRIPTOR_INIT as initializer. + */ +typedef struct WGPUBindGroupLayoutDescriptor { + WGPUChainedStruct * nextInChain; + /** + * This is a \ref NonNullInputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. + */ + WGPUStringView label; + /** + * Array count for `entries`. The `INIT` macro sets this to 0. + */ + size_t entryCount; + /** + * The `INIT` macro sets this to `NULL`. + */ WGPUBindGroupLayoutEntry const * entries; } WGPUBindGroupLayoutDescriptor WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUBindGroupLayoutDescriptor. + */ +#define WGPU_BIND_GROUP_LAYOUT_DESCRIPTOR_INIT _wgpu_MAKE_INIT_STRUCT(WGPUBindGroupLayoutDescriptor, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.label=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ + /*.entryCount=*/0 _wgpu_COMMA \ + /*.entries=*/NULL _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_COLOR_TARGET_STATE_INIT as initializer. + */ typedef struct WGPUColorTargetState { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; /** * The texture format of the target. If @ref WGPUTextureFormat_Undefined, * indicates a "hole" in the parent @ref WGPUFragmentState `targets` array: * the pipeline does not output a value at this `location`. + * + * The `INIT` macro sets this to @ref WGPUTextureFormat_Undefined. */ WGPUTextureFormat format; + /** + * The `INIT` macro sets this to `NULL`. + */ WGPU_NULLABLE WGPUBlendState const * blend; + /** + * The `INIT` macro sets this to @ref WGPUColorWriteMask_All. + */ WGPUColorWriteMask writeMask; } WGPUColorTargetState WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUColorTargetState. + */ +#define WGPU_COLOR_TARGET_STATE_INIT _wgpu_MAKE_INIT_STRUCT(WGPUColorTargetState, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.format=*/WGPUTextureFormat_Undefined _wgpu_COMMA \ + /*.blend=*/NULL _wgpu_COMMA \ + /*.writeMask=*/WGPUColorWriteMask_All _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_COMPUTE_PIPELINE_DESCRIPTOR_INIT as initializer. + */ typedef struct WGPUComputePipelineDescriptor { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; /** * This is a \ref NonNullInputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. */ WGPUStringView label; + /** + * The `INIT` macro sets this to `NULL`. + */ WGPU_NULLABLE WGPUPipelineLayout layout; - WGPUProgrammableStageDescriptor compute; + /** + * The `INIT` macro sets this to @ref WGPU_COMPUTE_STATE_INIT. + */ + WGPUComputeState compute; } WGPUComputePipelineDescriptor WGPU_STRUCTURE_ATTRIBUTE; -typedef struct WGPURenderPassDescriptor { - WGPUChainedStruct const * nextInChain; +/** + * Initializer for @ref WGPUComputePipelineDescriptor. + */ +#define WGPU_COMPUTE_PIPELINE_DESCRIPTOR_INIT _wgpu_MAKE_INIT_STRUCT(WGPUComputePipelineDescriptor, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.label=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ + /*.layout=*/NULL _wgpu_COMMA \ + /*.compute=*/WGPU_COMPUTE_STATE_INIT _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_DEVICE_DESCRIPTOR_INIT as initializer. + */ +typedef struct WGPUDeviceDescriptor { + WGPUChainedStruct * nextInChain; /** * This is a \ref NonNullInputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. */ WGPUStringView label; + /** + * Array count for `requiredFeatures`. The `INIT` macro sets this to 0. + */ + size_t requiredFeatureCount; + /** + * The `INIT` macro sets this to `NULL`. + */ + WGPUFeatureName const * requiredFeatures; + /** + * The `INIT` macro sets this to `NULL`. + */ + WGPU_NULLABLE WGPULimits const * requiredLimits; + /** + * The `INIT` macro sets this to @ref WGPU_QUEUE_DESCRIPTOR_INIT. + */ + WGPUQueueDescriptor defaultQueue; + /** + * The `INIT` macro sets this to @ref WGPU_DEVICE_LOST_CALLBACK_INFO_INIT. + */ + WGPUDeviceLostCallbackInfo deviceLostCallbackInfo; + /** + * Called when there is an uncaptured error on this device, from any thread. + * See @ref ErrorScopes. + * + * **Important:** This callback does not have a configurable @ref WGPUCallbackMode; it may be called at any time (like @ref WGPUCallbackMode_AllowSpontaneous). As such, calls into the `webgpu.h` API from this callback are unsafe. See @ref CallbackReentrancy. + * + * The `INIT` macro sets this to @ref WGPU_UNCAPTURED_ERROR_CALLBACK_INFO_INIT. + */ + WGPUUncapturedErrorCallbackInfo uncapturedErrorCallbackInfo; +} WGPUDeviceDescriptor WGPU_STRUCTURE_ATTRIBUTE; + +/** + * Initializer for @ref WGPUDeviceDescriptor. + */ +#define WGPU_DEVICE_DESCRIPTOR_INIT _wgpu_MAKE_INIT_STRUCT(WGPUDeviceDescriptor, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.label=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ + /*.requiredFeatureCount=*/0 _wgpu_COMMA \ + /*.requiredFeatures=*/NULL _wgpu_COMMA \ + /*.requiredLimits=*/NULL _wgpu_COMMA \ + /*.defaultQueue=*/WGPU_QUEUE_DESCRIPTOR_INIT _wgpu_COMMA \ + /*.deviceLostCallbackInfo=*/WGPU_DEVICE_LOST_CALLBACK_INFO_INIT _wgpu_COMMA \ + /*.uncapturedErrorCallbackInfo=*/WGPU_UNCAPTURED_ERROR_CALLBACK_INFO_INIT _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_RENDER_PASS_DESCRIPTOR_INIT as initializer. + */ +typedef struct WGPURenderPassDescriptor { + WGPUChainedStruct * nextInChain; + /** + * This is a \ref NonNullInputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. + */ + WGPUStringView label; + /** + * Array count for `colorAttachments`. The `INIT` macro sets this to 0. + */ size_t colorAttachmentCount; + /** + * The `INIT` macro sets this to `NULL`. + */ WGPURenderPassColorAttachment const * colorAttachments; + /** + * The `INIT` macro sets this to `NULL`. + */ WGPU_NULLABLE WGPURenderPassDepthStencilAttachment const * depthStencilAttachment; + /** + * The `INIT` macro sets this to `NULL`. + */ WGPU_NULLABLE WGPUQuerySet occlusionQuerySet; - WGPU_NULLABLE WGPURenderPassTimestampWrites const * timestampWrites; + /** + * The `INIT` macro sets this to `NULL`. + */ + WGPU_NULLABLE WGPUPassTimestampWrites const * timestampWrites; } WGPURenderPassDescriptor WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPURenderPassDescriptor. + */ +#define WGPU_RENDER_PASS_DESCRIPTOR_INIT _wgpu_MAKE_INIT_STRUCT(WGPURenderPassDescriptor, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.label=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ + /*.colorAttachmentCount=*/0 _wgpu_COMMA \ + /*.colorAttachments=*/NULL _wgpu_COMMA \ + /*.depthStencilAttachment=*/NULL _wgpu_COMMA \ + /*.occlusionQuerySet=*/NULL _wgpu_COMMA \ + /*.timestampWrites=*/NULL _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_TEXTURE_VIEW_DESCRIPTOR_INIT as initializer. + */ +typedef struct WGPUTextureViewDescriptor { + WGPUChainedStruct * nextInChain; + /** + * This is a \ref NonNullInputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. + */ + WGPUStringView label; + /** + * The `INIT` macro sets this to @ref WGPUTextureFormat_Undefined. + */ + WGPUTextureFormat format; + /** + * The `INIT` macro sets this to @ref WGPUTextureViewDimension_Undefined. + */ + WGPUTextureViewDimension dimension; + /** + * The `INIT` macro sets this to `0`. + */ + uint32_t baseMipLevel; + /** + * The `INIT` macro sets this to @ref WGPU_MIP_LEVEL_COUNT_UNDEFINED. + */ + uint32_t mipLevelCount; + /** + * The `INIT` macro sets this to `0`. + */ + uint32_t baseArrayLayer; + /** + * The `INIT` macro sets this to @ref WGPU_ARRAY_LAYER_COUNT_UNDEFINED. + */ + uint32_t arrayLayerCount; + /** + * If set to @ref WGPUTextureAspect_Undefined, + * [defaults](@ref SentinelValues) to @ref WGPUTextureAspect_All. + * + * The `INIT` macro sets this to @ref WGPUTextureAspect_Undefined. + */ + WGPUTextureAspect aspect; + /** + * The `INIT` macro sets this to @ref WGPUTextureUsage_None. + */ + WGPUTextureUsage usage; +} WGPUTextureViewDescriptor WGPU_STRUCTURE_ATTRIBUTE; + +/** + * Initializer for @ref WGPUTextureViewDescriptor. + */ +#define WGPU_TEXTURE_VIEW_DESCRIPTOR_INIT _wgpu_MAKE_INIT_STRUCT(WGPUTextureViewDescriptor, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.label=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ + /*.format=*/WGPUTextureFormat_Undefined _wgpu_COMMA \ + /*.dimension=*/WGPUTextureViewDimension_Undefined _wgpu_COMMA \ + /*.baseMipLevel=*/0 _wgpu_COMMA \ + /*.mipLevelCount=*/WGPU_MIP_LEVEL_COUNT_UNDEFINED _wgpu_COMMA \ + /*.baseArrayLayer=*/0 _wgpu_COMMA \ + /*.arrayLayerCount=*/WGPU_ARRAY_LAYER_COUNT_UNDEFINED _wgpu_COMMA \ + /*.aspect=*/WGPUTextureAspect_Undefined _wgpu_COMMA \ + /*.usage=*/WGPUTextureUsage_None _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_VERTEX_STATE_INIT as initializer. + */ typedef struct WGPUVertexState { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; + /** + * The `INIT` macro sets this to `NULL`. + */ WGPUShaderModule module; /** * This is a \ref NullableInputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. */ WGPUStringView entryPoint; + /** + * Array count for `constants`. The `INIT` macro sets this to 0. + */ size_t constantCount; + /** + * The `INIT` macro sets this to `NULL`. + */ WGPUConstantEntry const * constants; + /** + * Array count for `buffers`. The `INIT` macro sets this to 0. + */ size_t bufferCount; + /** + * The `INIT` macro sets this to `NULL`. + */ WGPUVertexBufferLayout const * buffers; } WGPUVertexState WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUVertexState. + */ +#define WGPU_VERTEX_STATE_INIT _wgpu_MAKE_INIT_STRUCT(WGPUVertexState, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.module=*/NULL _wgpu_COMMA \ + /*.entryPoint=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ + /*.constantCount=*/0 _wgpu_COMMA \ + /*.constants=*/NULL _wgpu_COMMA \ + /*.bufferCount=*/0 _wgpu_COMMA \ + /*.buffers=*/NULL _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_FRAGMENT_STATE_INIT as initializer. + */ typedef struct WGPUFragmentState { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; + /** + * The `INIT` macro sets this to `NULL`. + */ WGPUShaderModule module; /** * This is a \ref NullableInputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. */ WGPUStringView entryPoint; + /** + * Array count for `constants`. The `INIT` macro sets this to 0. + */ size_t constantCount; + /** + * The `INIT` macro sets this to `NULL`. + */ WGPUConstantEntry const * constants; + /** + * Array count for `targets`. The `INIT` macro sets this to 0. + */ size_t targetCount; + /** + * The `INIT` macro sets this to `NULL`. + */ WGPUColorTargetState const * targets; } WGPUFragmentState WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPUFragmentState. + */ +#define WGPU_FRAGMENT_STATE_INIT _wgpu_MAKE_INIT_STRUCT(WGPUFragmentState, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.module=*/NULL _wgpu_COMMA \ + /*.entryPoint=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ + /*.constantCount=*/0 _wgpu_COMMA \ + /*.constants=*/NULL _wgpu_COMMA \ + /*.targetCount=*/0 _wgpu_COMMA \ + /*.targets=*/NULL _wgpu_COMMA \ +}) + +/** + * Default values can be set using @ref WGPU_RENDER_PIPELINE_DESCRIPTOR_INIT as initializer. + */ typedef struct WGPURenderPipelineDescriptor { - WGPUChainedStruct const * nextInChain; + WGPUChainedStruct * nextInChain; /** * This is a \ref NonNullInputString. + * + * The `INIT` macro sets this to @ref WGPU_STRING_VIEW_INIT. */ WGPUStringView label; + /** + * The `INIT` macro sets this to `NULL`. + */ WGPU_NULLABLE WGPUPipelineLayout layout; + /** + * The `INIT` macro sets this to @ref WGPU_VERTEX_STATE_INIT. + */ WGPUVertexState vertex; + /** + * The `INIT` macro sets this to @ref WGPU_PRIMITIVE_STATE_INIT. + */ WGPUPrimitiveState primitive; + /** + * The `INIT` macro sets this to `NULL`. + */ WGPU_NULLABLE WGPUDepthStencilState const * depthStencil; + /** + * The `INIT` macro sets this to @ref WGPU_MULTISAMPLE_STATE_INIT. + */ WGPUMultisampleState multisample; + /** + * The `INIT` macro sets this to `NULL`. + */ WGPU_NULLABLE WGPUFragmentState const * fragment; } WGPURenderPipelineDescriptor WGPU_STRUCTURE_ATTRIBUTE; +/** + * Initializer for @ref WGPURenderPipelineDescriptor. + */ +#define WGPU_RENDER_PIPELINE_DESCRIPTOR_INIT _wgpu_MAKE_INIT_STRUCT(WGPURenderPipelineDescriptor, { \ + /*.nextInChain=*/NULL _wgpu_COMMA \ + /*.label=*/WGPU_STRING_VIEW_INIT _wgpu_COMMA \ + /*.layout=*/NULL _wgpu_COMMA \ + /*.vertex=*/WGPU_VERTEX_STATE_INIT _wgpu_COMMA \ + /*.primitive=*/WGPU_PRIMITIVE_STATE_INIT _wgpu_COMMA \ + /*.depthStencil=*/NULL _wgpu_COMMA \ + /*.multisample=*/WGPU_MULTISAMPLE_STATE_INIT _wgpu_COMMA \ + /*.fragment=*/NULL _wgpu_COMMA \ +}) + /** @} */ #ifdef __cplusplus @@ -2220,23 +4871,34 @@ extern "C" { #endif #if !defined(WGPU_SKIP_PROCS) - +// Global procs /** * Proc pointer type for @ref wgpuCreateInstance: * > @copydoc wgpuCreateInstance */ typedef WGPUInstance (*WGPUProcCreateInstance)(WGPU_NULLABLE WGPUInstanceDescriptor const * descriptor) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuGetInstanceCapabilities: - * > @copydoc wgpuGetInstanceCapabilities + * Proc pointer type for @ref wgpuGetInstanceFeatures: + * > @copydoc wgpuGetInstanceFeatures */ -typedef WGPUStatus (*WGPUProcGetInstanceCapabilities)(WGPUInstanceCapabilities * capabilities) WGPU_FUNCTION_ATTRIBUTE; +typedef void (*WGPUProcGetInstanceFeatures)(WGPUSupportedInstanceFeatures * features) WGPU_FUNCTION_ATTRIBUTE; +/** + * Proc pointer type for @ref wgpuGetInstanceLimits: + * > @copydoc wgpuGetInstanceLimits + */ +typedef WGPUStatus (*WGPUProcGetInstanceLimits)(WGPUInstanceLimits * limits) WGPU_FUNCTION_ATTRIBUTE; +/** + * Proc pointer type for @ref wgpuHasInstanceFeature: + * > @copydoc wgpuHasInstanceFeature + */ +typedef WGPUBool (*WGPUProcHasInstanceFeature)(WGPUInstanceFeatureName feature) WGPU_FUNCTION_ATTRIBUTE; /** * Proc pointer type for @ref wgpuGetProcAddress: * > @copydoc wgpuGetProcAddress */ typedef WGPUProc (*WGPUProcGetProcAddress)(WGPUStringView procName) WGPU_FUNCTION_ATTRIBUTE; + // Procs of Adapter /** * Proc pointer type for @ref wgpuAdapterGetFeatures: @@ -2264,12 +4926,12 @@ typedef WGPUBool (*WGPUProcAdapterHasFeature)(WGPUAdapter adapter, WGPUFeatureNa */ typedef WGPUFuture (*WGPUProcAdapterRequestDevice)(WGPUAdapter adapter, WGPU_NULLABLE WGPUDeviceDescriptor const * descriptor, WGPURequestDeviceCallbackInfo callbackInfo) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuAdapterAddRef. + * Proc pointer type for @ref wgpuAdapterAddRef: * > @copydoc wgpuAdapterAddRef */ typedef void (*WGPUProcAdapterAddRef)(WGPUAdapter adapter) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuAdapterRelease. + * Proc pointer type for @ref wgpuAdapterRelease: * > @copydoc wgpuAdapterRelease */ typedef void (*WGPUProcAdapterRelease)(WGPUAdapter adapter) WGPU_FUNCTION_ATTRIBUTE; @@ -2288,12 +4950,12 @@ typedef void (*WGPUProcAdapterInfoFreeMembers)(WGPUAdapterInfo adapterInfo) WGPU */ typedef void (*WGPUProcBindGroupSetLabel)(WGPUBindGroup bindGroup, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuBindGroupAddRef. + * Proc pointer type for @ref wgpuBindGroupAddRef: * > @copydoc wgpuBindGroupAddRef */ typedef void (*WGPUProcBindGroupAddRef)(WGPUBindGroup bindGroup) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuBindGroupRelease. + * Proc pointer type for @ref wgpuBindGroupRelease: * > @copydoc wgpuBindGroupRelease */ typedef void (*WGPUProcBindGroupRelease)(WGPUBindGroup bindGroup) WGPU_FUNCTION_ATTRIBUTE; @@ -2305,12 +4967,12 @@ typedef void (*WGPUProcBindGroupRelease)(WGPUBindGroup bindGroup) WGPU_FUNCTION_ */ typedef void (*WGPUProcBindGroupLayoutSetLabel)(WGPUBindGroupLayout bindGroupLayout, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuBindGroupLayoutAddRef. + * Proc pointer type for @ref wgpuBindGroupLayoutAddRef: * > @copydoc wgpuBindGroupLayoutAddRef */ typedef void (*WGPUProcBindGroupLayoutAddRef)(WGPUBindGroupLayout bindGroupLayout) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuBindGroupLayoutRelease. + * Proc pointer type for @ref wgpuBindGroupLayoutRelease: * > @copydoc wgpuBindGroupLayoutRelease */ typedef void (*WGPUProcBindGroupLayoutRelease)(WGPUBindGroupLayout bindGroupLayout) WGPU_FUNCTION_ATTRIBUTE; @@ -2326,16 +4988,16 @@ typedef void (*WGPUProcBufferDestroy)(WGPUBuffer buffer) WGPU_FUNCTION_ATTRIBUTE * > @copydoc wgpuBufferGetConstMappedRange */ typedef void const * (*WGPUProcBufferGetConstMappedRange)(WGPUBuffer buffer, size_t offset, size_t size) WGPU_FUNCTION_ATTRIBUTE; -/** - * Proc pointer type for @ref wgpuBufferGetMapState: - * > @copydoc wgpuBufferGetMapState - */ -typedef WGPUBufferMapState (*WGPUProcBufferGetMapState)(WGPUBuffer buffer) WGPU_FUNCTION_ATTRIBUTE; /** * Proc pointer type for @ref wgpuBufferGetMappedRange: * > @copydoc wgpuBufferGetMappedRange */ typedef void * (*WGPUProcBufferGetMappedRange)(WGPUBuffer buffer, size_t offset, size_t size) WGPU_FUNCTION_ATTRIBUTE; +/** + * Proc pointer type for @ref wgpuBufferGetMapState: + * > @copydoc wgpuBufferGetMapState + */ +typedef WGPUBufferMapState (*WGPUProcBufferGetMapState)(WGPUBuffer buffer) WGPU_FUNCTION_ATTRIBUTE; /** * Proc pointer type for @ref wgpuBufferGetSize: * > @copydoc wgpuBufferGetSize @@ -2351,6 +5013,11 @@ typedef WGPUBufferUsage (*WGPUProcBufferGetUsage)(WGPUBuffer buffer) WGPU_FUNCTI * > @copydoc wgpuBufferMapAsync */ typedef WGPUFuture (*WGPUProcBufferMapAsync)(WGPUBuffer buffer, WGPUMapMode mode, size_t offset, size_t size, WGPUBufferMapCallbackInfo callbackInfo) WGPU_FUNCTION_ATTRIBUTE; +/** + * Proc pointer type for @ref wgpuBufferReadMappedRange: + * > @copydoc wgpuBufferReadMappedRange + */ +typedef WGPUStatus (*WGPUProcBufferReadMappedRange)(WGPUBuffer buffer, size_t offset, void * data, size_t size) WGPU_FUNCTION_ATTRIBUTE; /** * Proc pointer type for @ref wgpuBufferSetLabel: * > @copydoc wgpuBufferSetLabel @@ -2362,12 +5029,17 @@ typedef void (*WGPUProcBufferSetLabel)(WGPUBuffer buffer, WGPUStringView label) */ typedef void (*WGPUProcBufferUnmap)(WGPUBuffer buffer) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuBufferAddRef. + * Proc pointer type for @ref wgpuBufferWriteMappedRange: + * > @copydoc wgpuBufferWriteMappedRange + */ +typedef WGPUStatus (*WGPUProcBufferWriteMappedRange)(WGPUBuffer buffer, size_t offset, void const * data, size_t size) WGPU_FUNCTION_ATTRIBUTE; +/** + * Proc pointer type for @ref wgpuBufferAddRef: * > @copydoc wgpuBufferAddRef */ typedef void (*WGPUProcBufferAddRef)(WGPUBuffer buffer) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuBufferRelease. + * Proc pointer type for @ref wgpuBufferRelease: * > @copydoc wgpuBufferRelease */ typedef void (*WGPUProcBufferRelease)(WGPUBuffer buffer) WGPU_FUNCTION_ATTRIBUTE; @@ -2379,12 +5051,12 @@ typedef void (*WGPUProcBufferRelease)(WGPUBuffer buffer) WGPU_FUNCTION_ATTRIBUTE */ typedef void (*WGPUProcCommandBufferSetLabel)(WGPUCommandBuffer commandBuffer, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuCommandBufferAddRef. + * Proc pointer type for @ref wgpuCommandBufferAddRef: * > @copydoc wgpuCommandBufferAddRef */ typedef void (*WGPUProcCommandBufferAddRef)(WGPUCommandBuffer commandBuffer) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuCommandBufferRelease. + * Proc pointer type for @ref wgpuCommandBufferRelease: * > @copydoc wgpuCommandBufferRelease */ typedef void (*WGPUProcCommandBufferRelease)(WGPUCommandBuffer commandBuffer) WGPU_FUNCTION_ATTRIBUTE; @@ -2461,12 +5133,12 @@ typedef void (*WGPUProcCommandEncoderSetLabel)(WGPUCommandEncoder commandEncoder */ typedef void (*WGPUProcCommandEncoderWriteTimestamp)(WGPUCommandEncoder commandEncoder, WGPUQuerySet querySet, uint32_t queryIndex) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuCommandEncoderAddRef. + * Proc pointer type for @ref wgpuCommandEncoderAddRef: * > @copydoc wgpuCommandEncoderAddRef */ typedef void (*WGPUProcCommandEncoderAddRef)(WGPUCommandEncoder commandEncoder) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuCommandEncoderRelease. + * Proc pointer type for @ref wgpuCommandEncoderRelease: * > @copydoc wgpuCommandEncoderRelease */ typedef void (*WGPUProcCommandEncoderRelease)(WGPUCommandEncoder commandEncoder) WGPU_FUNCTION_ATTRIBUTE; @@ -2518,12 +5190,12 @@ typedef void (*WGPUProcComputePassEncoderSetLabel)(WGPUComputePassEncoder comput */ typedef void (*WGPUProcComputePassEncoderSetPipeline)(WGPUComputePassEncoder computePassEncoder, WGPUComputePipeline pipeline) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuComputePassEncoderAddRef. + * Proc pointer type for @ref wgpuComputePassEncoderAddRef: * > @copydoc wgpuComputePassEncoderAddRef */ typedef void (*WGPUProcComputePassEncoderAddRef)(WGPUComputePassEncoder computePassEncoder) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuComputePassEncoderRelease. + * Proc pointer type for @ref wgpuComputePassEncoderRelease: * > @copydoc wgpuComputePassEncoderRelease */ typedef void (*WGPUProcComputePassEncoderRelease)(WGPUComputePassEncoder computePassEncoder) WGPU_FUNCTION_ATTRIBUTE; @@ -2540,12 +5212,12 @@ typedef WGPUBindGroupLayout (*WGPUProcComputePipelineGetBindGroupLayout)(WGPUCom */ typedef void (*WGPUProcComputePipelineSetLabel)(WGPUComputePipeline computePipeline, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuComputePipelineAddRef. + * Proc pointer type for @ref wgpuComputePipelineAddRef: * > @copydoc wgpuComputePipelineAddRef */ typedef void (*WGPUProcComputePipelineAddRef)(WGPUComputePipeline computePipeline) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuComputePipelineRelease. + * Proc pointer type for @ref wgpuComputePipelineRelease: * > @copydoc wgpuComputePipelineRelease */ typedef void (*WGPUProcComputePipelineRelease)(WGPUComputePipeline computePipeline) WGPU_FUNCTION_ATTRIBUTE; @@ -2565,7 +5237,7 @@ typedef WGPUBindGroupLayout (*WGPUProcDeviceCreateBindGroupLayout)(WGPUDevice de * Proc pointer type for @ref wgpuDeviceCreateBuffer: * > @copydoc wgpuDeviceCreateBuffer */ -typedef WGPUBuffer (*WGPUProcDeviceCreateBuffer)(WGPUDevice device, WGPUBufferDescriptor const * descriptor) WGPU_FUNCTION_ATTRIBUTE; +typedef WGPU_NULLABLE WGPUBuffer (*WGPUProcDeviceCreateBuffer)(WGPUDevice device, WGPUBufferDescriptor const * descriptor) WGPU_FUNCTION_ATTRIBUTE; /** * Proc pointer type for @ref wgpuDeviceCreateCommandEncoder: * > @copydoc wgpuDeviceCreateCommandEncoder @@ -2630,7 +5302,7 @@ typedef void (*WGPUProcDeviceDestroy)(WGPUDevice device) WGPU_FUNCTION_ATTRIBUTE * Proc pointer type for @ref wgpuDeviceGetAdapterInfo: * > @copydoc wgpuDeviceGetAdapterInfo */ -typedef WGPUAdapterInfo (*WGPUProcDeviceGetAdapterInfo)(WGPUDevice device) WGPU_FUNCTION_ATTRIBUTE; +typedef WGPUStatus (*WGPUProcDeviceGetAdapterInfo)(WGPUDevice device, WGPUAdapterInfo * adapterInfo) WGPU_FUNCTION_ATTRIBUTE; /** * Proc pointer type for @ref wgpuDeviceGetFeatures: * > @copydoc wgpuDeviceGetFeatures @@ -2672,16 +5344,33 @@ typedef void (*WGPUProcDevicePushErrorScope)(WGPUDevice device, WGPUErrorFilter */ typedef void (*WGPUProcDeviceSetLabel)(WGPUDevice device, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuDeviceAddRef. + * Proc pointer type for @ref wgpuDeviceAddRef: * > @copydoc wgpuDeviceAddRef */ typedef void (*WGPUProcDeviceAddRef)(WGPUDevice device) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuDeviceRelease. + * Proc pointer type for @ref wgpuDeviceRelease: * > @copydoc wgpuDeviceRelease */ typedef void (*WGPUProcDeviceRelease)(WGPUDevice device) WGPU_FUNCTION_ATTRIBUTE; +// Procs of ExternalTexture +/** + * Proc pointer type for @ref wgpuExternalTextureSetLabel: + * > @copydoc wgpuExternalTextureSetLabel + */ +typedef void (*WGPUProcExternalTextureSetLabel)(WGPUExternalTexture externalTexture, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; +/** + * Proc pointer type for @ref wgpuExternalTextureAddRef: + * > @copydoc wgpuExternalTextureAddRef + */ +typedef void (*WGPUProcExternalTextureAddRef)(WGPUExternalTexture externalTexture) WGPU_FUNCTION_ATTRIBUTE; +/** + * Proc pointer type for @ref wgpuExternalTextureRelease: + * > @copydoc wgpuExternalTextureRelease + */ +typedef void (*WGPUProcExternalTextureRelease)(WGPUExternalTexture externalTexture) WGPU_FUNCTION_ATTRIBUTE; + // Procs of Instance /** * Proc pointer type for @ref wgpuInstanceCreateSurface: @@ -2692,7 +5381,7 @@ typedef WGPUSurface (*WGPUProcInstanceCreateSurface)(WGPUInstance instance, WGPU * Proc pointer type for @ref wgpuInstanceGetWGSLLanguageFeatures: * > @copydoc wgpuInstanceGetWGSLLanguageFeatures */ -typedef WGPUStatus (*WGPUProcInstanceGetWGSLLanguageFeatures)(WGPUInstance instance, WGPUSupportedWGSLLanguageFeatures * features) WGPU_FUNCTION_ATTRIBUTE; +typedef void (*WGPUProcInstanceGetWGSLLanguageFeatures)(WGPUInstance instance, WGPUSupportedWGSLLanguageFeatures * features) WGPU_FUNCTION_ATTRIBUTE; /** * Proc pointer type for @ref wgpuInstanceHasWGSLLanguageFeature: * > @copydoc wgpuInstanceHasWGSLLanguageFeature @@ -2714,12 +5403,12 @@ typedef WGPUFuture (*WGPUProcInstanceRequestAdapter)(WGPUInstance instance, WGPU */ typedef WGPUWaitStatus (*WGPUProcInstanceWaitAny)(WGPUInstance instance, size_t futureCount, WGPU_NULLABLE WGPUFutureWaitInfo * futures, uint64_t timeoutNS) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuInstanceAddRef. + * Proc pointer type for @ref wgpuInstanceAddRef: * > @copydoc wgpuInstanceAddRef */ typedef void (*WGPUProcInstanceAddRef)(WGPUInstance instance) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuInstanceRelease. + * Proc pointer type for @ref wgpuInstanceRelease: * > @copydoc wgpuInstanceRelease */ typedef void (*WGPUProcInstanceRelease)(WGPUInstance instance) WGPU_FUNCTION_ATTRIBUTE; @@ -2731,12 +5420,12 @@ typedef void (*WGPUProcInstanceRelease)(WGPUInstance instance) WGPU_FUNCTION_ATT */ typedef void (*WGPUProcPipelineLayoutSetLabel)(WGPUPipelineLayout pipelineLayout, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuPipelineLayoutAddRef. + * Proc pointer type for @ref wgpuPipelineLayoutAddRef: * > @copydoc wgpuPipelineLayoutAddRef */ typedef void (*WGPUProcPipelineLayoutAddRef)(WGPUPipelineLayout pipelineLayout) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuPipelineLayoutRelease. + * Proc pointer type for @ref wgpuPipelineLayoutRelease: * > @copydoc wgpuPipelineLayoutRelease */ typedef void (*WGPUProcPipelineLayoutRelease)(WGPUPipelineLayout pipelineLayout) WGPU_FUNCTION_ATTRIBUTE; @@ -2763,12 +5452,12 @@ typedef WGPUQueryType (*WGPUProcQuerySetGetType)(WGPUQuerySet querySet) WGPU_FUN */ typedef void (*WGPUProcQuerySetSetLabel)(WGPUQuerySet querySet, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuQuerySetAddRef. + * Proc pointer type for @ref wgpuQuerySetAddRef: * > @copydoc wgpuQuerySetAddRef */ typedef void (*WGPUProcQuerySetAddRef)(WGPUQuerySet querySet) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuQuerySetRelease. + * Proc pointer type for @ref wgpuQuerySetRelease: * > @copydoc wgpuQuerySetRelease */ typedef void (*WGPUProcQuerySetRelease)(WGPUQuerySet querySet) WGPU_FUNCTION_ATTRIBUTE; @@ -2800,12 +5489,12 @@ typedef void (*WGPUProcQueueWriteBuffer)(WGPUQueue queue, WGPUBuffer buffer, uin */ typedef void (*WGPUProcQueueWriteTexture)(WGPUQueue queue, WGPUTexelCopyTextureInfo const * destination, void const * data, size_t dataSize, WGPUTexelCopyBufferLayout const * dataLayout, WGPUExtent3D const * writeSize) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuQueueAddRef. + * Proc pointer type for @ref wgpuQueueAddRef: * > @copydoc wgpuQueueAddRef */ typedef void (*WGPUProcQueueAddRef)(WGPUQueue queue) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuQueueRelease. + * Proc pointer type for @ref wgpuQueueRelease: * > @copydoc wgpuQueueRelease */ typedef void (*WGPUProcQueueRelease)(WGPUQueue queue) WGPU_FUNCTION_ATTRIBUTE; @@ -2817,12 +5506,12 @@ typedef void (*WGPUProcQueueRelease)(WGPUQueue queue) WGPU_FUNCTION_ATTRIBUTE; */ typedef void (*WGPUProcRenderBundleSetLabel)(WGPURenderBundle renderBundle, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuRenderBundleAddRef. + * Proc pointer type for @ref wgpuRenderBundleAddRef: * > @copydoc wgpuRenderBundleAddRef */ typedef void (*WGPUProcRenderBundleAddRef)(WGPURenderBundle renderBundle) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuRenderBundleRelease. + * Proc pointer type for @ref wgpuRenderBundleRelease: * > @copydoc wgpuRenderBundleRelease */ typedef void (*WGPUProcRenderBundleRelease)(WGPURenderBundle renderBundle) WGPU_FUNCTION_ATTRIBUTE; @@ -2894,12 +5583,12 @@ typedef void (*WGPUProcRenderBundleEncoderSetPipeline)(WGPURenderBundleEncoder r */ typedef void (*WGPUProcRenderBundleEncoderSetVertexBuffer)(WGPURenderBundleEncoder renderBundleEncoder, uint32_t slot, WGPU_NULLABLE WGPUBuffer buffer, uint64_t offset, uint64_t size) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuRenderBundleEncoderAddRef. + * Proc pointer type for @ref wgpuRenderBundleEncoderAddRef: * > @copydoc wgpuRenderBundleEncoderAddRef */ typedef void (*WGPUProcRenderBundleEncoderAddRef)(WGPURenderBundleEncoder renderBundleEncoder) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuRenderBundleEncoderRelease. + * Proc pointer type for @ref wgpuRenderBundleEncoderRelease: * > @copydoc wgpuRenderBundleEncoderRelease */ typedef void (*WGPUProcRenderBundleEncoderRelease)(WGPURenderBundleEncoder renderBundleEncoder) WGPU_FUNCTION_ATTRIBUTE; @@ -3006,12 +5695,12 @@ typedef void (*WGPUProcRenderPassEncoderSetVertexBuffer)(WGPURenderPassEncoder r */ typedef void (*WGPUProcRenderPassEncoderSetViewport)(WGPURenderPassEncoder renderPassEncoder, float x, float y, float width, float height, float minDepth, float maxDepth) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuRenderPassEncoderAddRef. + * Proc pointer type for @ref wgpuRenderPassEncoderAddRef: * > @copydoc wgpuRenderPassEncoderAddRef */ typedef void (*WGPUProcRenderPassEncoderAddRef)(WGPURenderPassEncoder renderPassEncoder) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuRenderPassEncoderRelease. + * Proc pointer type for @ref wgpuRenderPassEncoderRelease: * > @copydoc wgpuRenderPassEncoderRelease */ typedef void (*WGPUProcRenderPassEncoderRelease)(WGPURenderPassEncoder renderPassEncoder) WGPU_FUNCTION_ATTRIBUTE; @@ -3028,12 +5717,12 @@ typedef WGPUBindGroupLayout (*WGPUProcRenderPipelineGetBindGroupLayout)(WGPURend */ typedef void (*WGPUProcRenderPipelineSetLabel)(WGPURenderPipeline renderPipeline, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuRenderPipelineAddRef. + * Proc pointer type for @ref wgpuRenderPipelineAddRef: * > @copydoc wgpuRenderPipelineAddRef */ typedef void (*WGPUProcRenderPipelineAddRef)(WGPURenderPipeline renderPipeline) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuRenderPipelineRelease. + * Proc pointer type for @ref wgpuRenderPipelineRelease: * > @copydoc wgpuRenderPipelineRelease */ typedef void (*WGPUProcRenderPipelineRelease)(WGPURenderPipeline renderPipeline) WGPU_FUNCTION_ATTRIBUTE; @@ -3045,12 +5734,12 @@ typedef void (*WGPUProcRenderPipelineRelease)(WGPURenderPipeline renderPipeline) */ typedef void (*WGPUProcSamplerSetLabel)(WGPUSampler sampler, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuSamplerAddRef. + * Proc pointer type for @ref wgpuSamplerAddRef: * > @copydoc wgpuSamplerAddRef */ typedef void (*WGPUProcSamplerAddRef)(WGPUSampler sampler) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuSamplerRelease. + * Proc pointer type for @ref wgpuSamplerRelease: * > @copydoc wgpuSamplerRelease */ typedef void (*WGPUProcSamplerRelease)(WGPUSampler sampler) WGPU_FUNCTION_ATTRIBUTE; @@ -3067,12 +5756,12 @@ typedef WGPUFuture (*WGPUProcShaderModuleGetCompilationInfo)(WGPUShaderModule sh */ typedef void (*WGPUProcShaderModuleSetLabel)(WGPUShaderModule shaderModule, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuShaderModuleAddRef. + * Proc pointer type for @ref wgpuShaderModuleAddRef: * > @copydoc wgpuShaderModuleAddRef */ typedef void (*WGPUProcShaderModuleAddRef)(WGPUShaderModule shaderModule) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuShaderModuleRelease. + * Proc pointer type for @ref wgpuShaderModuleRelease: * > @copydoc wgpuShaderModuleRelease */ typedef void (*WGPUProcShaderModuleRelease)(WGPUShaderModule shaderModule) WGPU_FUNCTION_ATTRIBUTE; @@ -3084,6 +5773,13 @@ typedef void (*WGPUProcShaderModuleRelease)(WGPUShaderModule shaderModule) WGPU_ */ typedef void (*WGPUProcSupportedFeaturesFreeMembers)(WGPUSupportedFeatures supportedFeatures) WGPU_FUNCTION_ATTRIBUTE; +// Procs of SupportedInstanceFeatures +/** + * Proc pointer type for @ref wgpuSupportedInstanceFeaturesFreeMembers: + * > @copydoc wgpuSupportedInstanceFeaturesFreeMembers + */ +typedef void (*WGPUProcSupportedInstanceFeaturesFreeMembers)(WGPUSupportedInstanceFeatures supportedInstanceFeatures) WGPU_FUNCTION_ATTRIBUTE; + // Procs of SupportedWGSLLanguageFeatures /** * Proc pointer type for @ref wgpuSupportedWGSLLanguageFeaturesFreeMembers: @@ -3123,12 +5819,12 @@ typedef void (*WGPUProcSurfaceSetLabel)(WGPUSurface surface, WGPUStringView labe */ typedef void (*WGPUProcSurfaceUnconfigure)(WGPUSurface surface) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuSurfaceAddRef. + * Proc pointer type for @ref wgpuSurfaceAddRef: * > @copydoc wgpuSurfaceAddRef */ typedef void (*WGPUProcSurfaceAddRef)(WGPUSurface surface) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuSurfaceRelease. + * Proc pointer type for @ref wgpuSurfaceRelease: * > @copydoc wgpuSurfaceRelease */ typedef void (*WGPUProcSurfaceRelease)(WGPUSurface surface) WGPU_FUNCTION_ATTRIBUTE; @@ -3181,6 +5877,11 @@ typedef uint32_t (*WGPUProcTextureGetMipLevelCount)(WGPUTexture texture) WGPU_FU * > @copydoc wgpuTextureGetSampleCount */ typedef uint32_t (*WGPUProcTextureGetSampleCount)(WGPUTexture texture) WGPU_FUNCTION_ATTRIBUTE; +/** + * Proc pointer type for @ref wgpuTextureGetTextureBindingViewDimension: + * > @copydoc wgpuTextureGetTextureBindingViewDimension + */ +typedef WGPUTextureViewDimension (*WGPUProcTextureGetTextureBindingViewDimension)(WGPUTexture texture) WGPU_FUNCTION_ATTRIBUTE; /** * Proc pointer type for @ref wgpuTextureGetUsage: * > @copydoc wgpuTextureGetUsage @@ -3197,12 +5898,12 @@ typedef uint32_t (*WGPUProcTextureGetWidth)(WGPUTexture texture) WGPU_FUNCTION_A */ typedef void (*WGPUProcTextureSetLabel)(WGPUTexture texture, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuTextureAddRef. + * Proc pointer type for @ref wgpuTextureAddRef: * > @copydoc wgpuTextureAddRef */ typedef void (*WGPUProcTextureAddRef)(WGPUTexture texture) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuTextureRelease. + * Proc pointer type for @ref wgpuTextureRelease: * > @copydoc wgpuTextureRelease */ typedef void (*WGPUProcTextureRelease)(WGPUTexture texture) WGPU_FUNCTION_ATTRIBUTE; @@ -3214,12 +5915,12 @@ typedef void (*WGPUProcTextureRelease)(WGPUTexture texture) WGPU_FUNCTION_ATTRIB */ typedef void (*WGPUProcTextureViewSetLabel)(WGPUTextureView textureView, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuTextureViewAddRef. + * Proc pointer type for @ref wgpuTextureViewAddRef: * > @copydoc wgpuTextureViewAddRef */ typedef void (*WGPUProcTextureViewAddRef)(WGPUTextureView textureView) WGPU_FUNCTION_ATTRIBUTE; /** - * Proc pointer type for @ref wgpuTextureViewRelease. + * Proc pointer type for @ref wgpuTextureViewRelease: * > @copydoc wgpuTextureViewRelease */ typedef void (*WGPUProcTextureViewRelease)(WGPUTextureView textureView) WGPU_FUNCTION_ATTRIBUTE; @@ -3235,29 +5936,39 @@ typedef void (*WGPUProcTextureViewRelease)(WGPUTextureView textureView) WGPU_FUN */ /** * Create a WGPUInstance + * + * @returns + * This value is @ref ReturnedWithOwnership. */ WGPU_EXPORT WGPUInstance wgpuCreateInstance(WGPU_NULLABLE WGPUInstanceDescriptor const * descriptor) WGPU_FUNCTION_ATTRIBUTE; /** - * Query the supported instance capabilities. + * Get the list of @ref WGPUInstanceFeatureName values supported by the instance. * - * @param capabilities - * The supported instance capabilities + * @param features + * This parameter is @ref ReturnedWithOwnership. + */ +WGPU_EXPORT void wgpuGetInstanceFeatures(WGPUSupportedInstanceFeatures * features) WGPU_FUNCTION_ATTRIBUTE; +/** + * Get the limits supported by the instance. * * @returns * Indicates if there was an @ref OutStructChainError. */ -WGPU_EXPORT WGPUStatus wgpuGetInstanceCapabilities(WGPUInstanceCapabilities * capabilities) WGPU_FUNCTION_ATTRIBUTE; +WGPU_EXPORT WGPUStatus wgpuGetInstanceLimits(WGPUInstanceLimits * limits) WGPU_FUNCTION_ATTRIBUTE; +/** + * Check whether a particular @ref WGPUInstanceFeatureName is supported by the instance. + */ +WGPU_EXPORT WGPUBool wgpuHasInstanceFeature(WGPUInstanceFeatureName feature) WGPU_FUNCTION_ATTRIBUTE; /** * Returns the "procedure address" (function pointer) of the named function. * The result must be cast to the appropriate proc pointer type. */ WGPU_EXPORT WGPUProc wgpuGetProcAddress(WGPUStringView procName) WGPU_FUNCTION_ATTRIBUTE; - /** @} */ /** - * \defgroup Methods + * \defgroup Methods Methods * \brief Functions that are relative to a specific object. * * @{ @@ -3293,10 +6004,9 @@ WGPU_EXPORT WGPUBool wgpuAdapterHasFeature(WGPUAdapter adapter, WGPUFeatureName WGPU_EXPORT WGPUFuture wgpuAdapterRequestDevice(WGPUAdapter adapter, WGPU_NULLABLE WGPUDeviceDescriptor const * descriptor, WGPURequestDeviceCallbackInfo callbackInfo) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuAdapterAddRef(WGPUAdapter adapter) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuAdapterRelease(WGPUAdapter adapter) WGPU_FUNCTION_ATTRIBUTE; + /** @} */ - - /** * \defgroup WGPUAdapterInfoMethods WGPUAdapterInfo methods * \brief Functions whose first argument has type WGPUAdapterInfo. @@ -3304,13 +6014,12 @@ WGPU_EXPORT void wgpuAdapterRelease(WGPUAdapter adapter) WGPU_FUNCTION_ATTRIBUTE * @{ */ /** - * Frees array members of WGPUAdapterInfo which were allocated by the API. + * Frees members which were allocated by the API. */ WGPU_EXPORT void wgpuAdapterInfoFreeMembers(WGPUAdapterInfo adapterInfo) WGPU_FUNCTION_ATTRIBUTE; + /** @} */ - - /** * \defgroup WGPUBindGroupMethods WGPUBindGroup methods * \brief Functions whose first argument has type WGPUBindGroup. @@ -3320,10 +6029,9 @@ WGPU_EXPORT void wgpuAdapterInfoFreeMembers(WGPUAdapterInfo adapterInfo) WGPU_FU WGPU_EXPORT void wgpuBindGroupSetLabel(WGPUBindGroup bindGroup, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuBindGroupAddRef(WGPUBindGroup bindGroup) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuBindGroupRelease(WGPUBindGroup bindGroup) WGPU_FUNCTION_ATTRIBUTE; + /** @} */ - - /** * \defgroup WGPUBindGroupLayoutMethods WGPUBindGroupLayout methods * \brief Functions whose first argument has type WGPUBindGroupLayout. @@ -3333,10 +6041,9 @@ WGPU_EXPORT void wgpuBindGroupRelease(WGPUBindGroup bindGroup) WGPU_FUNCTION_ATT WGPU_EXPORT void wgpuBindGroupLayoutSetLabel(WGPUBindGroupLayout bindGroupLayout, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuBindGroupLayoutAddRef(WGPUBindGroupLayout bindGroupLayout) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuBindGroupLayoutRelease(WGPUBindGroupLayout bindGroupLayout) WGPU_FUNCTION_ATTRIBUTE; + /** @} */ - - /** * \defgroup WGPUBufferMethods WGPUBuffer methods * \brief Functions whose first argument has type WGPUBuffer. @@ -3345,49 +6052,104 @@ WGPU_EXPORT void wgpuBindGroupLayoutRelease(WGPUBindGroupLayout bindGroupLayout) */ WGPU_EXPORT void wgpuBufferDestroy(WGPUBuffer buffer) WGPU_FUNCTION_ATTRIBUTE; /** - * @param offset - * Byte offset relative to the beginning of the buffer. - * - * @param size - * Byte size of the range to get. The returned pointer is valid for exactly this many bytes. - * - * @returns * Returns a const pointer to beginning of the mapped range. * It must not be written; writing to this range causes undefined behavior. - * Returns `NULL` with @ref ImplementationDefinedLogging if: + * See @ref MappedRangeBehavior for error conditions and guarantees. + * This function is safe to call inside spontaneous callbacks (see @ref CallbackReentrancy). + * + * In Wasm, if `memcpy`ing from this range, prefer using @ref wgpuBufferReadMappedRange + * instead for better performance. * - * - There is any content-timeline error as defined in the WebGPU specification for `getMappedRange()` (alignments, overlaps, etc.) - * **except** for overlaps with other *const* ranges, which are allowed in C. - * (JS does not allow this because const ranges do not exist.) - */ -WGPU_EXPORT void const * wgpuBufferGetConstMappedRange(WGPUBuffer buffer, size_t offset, size_t size) WGPU_FUNCTION_ATTRIBUTE; -WGPU_EXPORT WGPUBufferMapState wgpuBufferGetMapState(WGPUBuffer buffer) WGPU_FUNCTION_ATTRIBUTE; -/** * @param offset * Byte offset relative to the beginning of the buffer. * * @param size - * Byte size of the range to get. The returned pointer is valid for exactly this many bytes. - * - * @returns + * Byte size of the range to get. + * If this is @ref WGPU_WHOLE_MAP_SIZE, it defaults to `buffer.size - offset`. + * The returned pointer is valid for exactly this many bytes. + */ +WGPU_EXPORT void const * wgpuBufferGetConstMappedRange(WGPUBuffer buffer, size_t offset, size_t size) WGPU_FUNCTION_ATTRIBUTE; +/** * Returns a mutable pointer to beginning of the mapped range. - * Returns `NULL` with @ref ImplementationDefinedLogging if: + * See @ref MappedRangeBehavior for error conditions and guarantees. + * This function is safe to call inside spontaneous callbacks (see @ref CallbackReentrancy). * - * - There is any content-timeline error as defined in the WebGPU specification for `getMappedRange()` (alignments, overlaps, etc.) - * - The buffer is not mapped with @ref WGPUMapMode_Write. + * In Wasm, if `memcpy`ing into this range, prefer using @ref wgpuBufferWriteMappedRange + * instead for better performance. + * + * @param offset + * Byte offset relative to the beginning of the buffer. + * + * @param size + * Byte size of the range to get. + * If this is @ref WGPU_WHOLE_MAP_SIZE, it defaults to `buffer.size - offset`. + * The returned pointer is valid for exactly this many bytes. */ WGPU_EXPORT void * wgpuBufferGetMappedRange(WGPUBuffer buffer, size_t offset, size_t size) WGPU_FUNCTION_ATTRIBUTE; +WGPU_EXPORT WGPUBufferMapState wgpuBufferGetMapState(WGPUBuffer buffer) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT uint64_t wgpuBufferGetSize(WGPUBuffer buffer) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT WGPUBufferUsage wgpuBufferGetUsage(WGPUBuffer buffer) WGPU_FUNCTION_ATTRIBUTE; +/** + * @param mode + * The mapping mode (read or write). + * + * @param offset + * Byte offset relative to beginning of the buffer. + * + * @param size + * Byte size of the region to map. + * If this is @ref WGPU_WHOLE_MAP_SIZE, it defaults to `buffer.size - offset`. + */ WGPU_EXPORT WGPUFuture wgpuBufferMapAsync(WGPUBuffer buffer, WGPUMapMode mode, size_t offset, size_t size, WGPUBufferMapCallbackInfo callbackInfo) WGPU_FUNCTION_ATTRIBUTE; +/** + * Copies a range of data from the buffer mapping into the provided destination pointer. + * See @ref MappedRangeBehavior for error conditions and guarantees. + * This function is safe to call inside spontaneous callbacks (see @ref CallbackReentrancy). + * + * In Wasm, this is more efficient than copying from a mapped range into a `malloc`'d range. + * + * @param offset + * Byte offset relative to the beginning of the buffer. + * + * @param data + * Destination, to read buffer data into. + * + * @param size + * Number of bytes of data to read from the buffer. + * (Note @ref WGPU_WHOLE_MAP_SIZE is *not* accepted here.) + * + * @returns + * @ref WGPUStatus_Error if the copy did not occur. + */ +WGPU_EXPORT WGPUStatus wgpuBufferReadMappedRange(WGPUBuffer buffer, size_t offset, void * data, size_t size) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuBufferSetLabel(WGPUBuffer buffer, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuBufferUnmap(WGPUBuffer buffer) WGPU_FUNCTION_ATTRIBUTE; +/** + * Copies a range of data from the provided source pointer into the buffer mapping. + * See @ref MappedRangeBehavior for error conditions and guarantees. + * This function is safe to call inside spontaneous callbacks (see @ref CallbackReentrancy). + * + * In Wasm, this is more efficient than copying from a `malloc`'d range into a mapped range. + * + * @param offset + * Byte offset relative to the beginning of the buffer. + * + * @param data + * Source, to write buffer data from. + * + * @param size + * Number of bytes of data to write to the buffer. + * (Note @ref WGPU_WHOLE_MAP_SIZE is *not* accepted here.) + * + * @returns + * @ref WGPUStatus_Error if the copy did not occur. + */ +WGPU_EXPORT WGPUStatus wgpuBufferWriteMappedRange(WGPUBuffer buffer, size_t offset, void const * data, size_t size) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuBufferAddRef(WGPUBuffer buffer) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuBufferRelease(WGPUBuffer buffer) WGPU_FUNCTION_ATTRIBUTE; + /** @} */ - - /** * \defgroup WGPUCommandBufferMethods WGPUCommandBuffer methods * \brief Functions whose first argument has type WGPUCommandBuffer. @@ -3397,23 +6159,34 @@ WGPU_EXPORT void wgpuBufferRelease(WGPUBuffer buffer) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuCommandBufferSetLabel(WGPUCommandBuffer commandBuffer, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuCommandBufferAddRef(WGPUCommandBuffer commandBuffer) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuCommandBufferRelease(WGPUCommandBuffer commandBuffer) WGPU_FUNCTION_ATTRIBUTE; + /** @} */ - - /** * \defgroup WGPUCommandEncoderMethods WGPUCommandEncoder methods * \brief Functions whose first argument has type WGPUCommandEncoder. * * @{ */ +/** + * @returns + * This value is @ref ReturnedWithOwnership. + */ WGPU_EXPORT WGPUComputePassEncoder wgpuCommandEncoderBeginComputePass(WGPUCommandEncoder commandEncoder, WGPU_NULLABLE WGPUComputePassDescriptor const * descriptor) WGPU_FUNCTION_ATTRIBUTE; +/** + * @returns + * This value is @ref ReturnedWithOwnership. + */ WGPU_EXPORT WGPURenderPassEncoder wgpuCommandEncoderBeginRenderPass(WGPUCommandEncoder commandEncoder, WGPURenderPassDescriptor const * descriptor) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuCommandEncoderClearBuffer(WGPUCommandEncoder commandEncoder, WGPUBuffer buffer, uint64_t offset, uint64_t size) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuCommandEncoderCopyBufferToBuffer(WGPUCommandEncoder commandEncoder, WGPUBuffer source, uint64_t sourceOffset, WGPUBuffer destination, uint64_t destinationOffset, uint64_t size) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuCommandEncoderCopyBufferToTexture(WGPUCommandEncoder commandEncoder, WGPUTexelCopyBufferInfo const * source, WGPUTexelCopyTextureInfo const * destination, WGPUExtent3D const * copySize) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuCommandEncoderCopyTextureToBuffer(WGPUCommandEncoder commandEncoder, WGPUTexelCopyTextureInfo const * source, WGPUTexelCopyBufferInfo const * destination, WGPUExtent3D const * copySize) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuCommandEncoderCopyTextureToTexture(WGPUCommandEncoder commandEncoder, WGPUTexelCopyTextureInfo const * source, WGPUTexelCopyTextureInfo const * destination, WGPUExtent3D const * copySize) WGPU_FUNCTION_ATTRIBUTE; +/** + * @returns + * This value is @ref ReturnedWithOwnership. + */ WGPU_EXPORT WGPUCommandBuffer wgpuCommandEncoderFinish(WGPUCommandEncoder commandEncoder, WGPU_NULLABLE WGPUCommandBufferDescriptor const * descriptor) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuCommandEncoderInsertDebugMarker(WGPUCommandEncoder commandEncoder, WGPUStringView markerLabel) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuCommandEncoderPopDebugGroup(WGPUCommandEncoder commandEncoder) WGPU_FUNCTION_ATTRIBUTE; @@ -3423,10 +6196,9 @@ WGPU_EXPORT void wgpuCommandEncoderSetLabel(WGPUCommandEncoder commandEncoder, W WGPU_EXPORT void wgpuCommandEncoderWriteTimestamp(WGPUCommandEncoder commandEncoder, WGPUQuerySet querySet, uint32_t queryIndex) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuCommandEncoderAddRef(WGPUCommandEncoder commandEncoder) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuCommandEncoderRelease(WGPUCommandEncoder commandEncoder) WGPU_FUNCTION_ATTRIBUTE; + /** @} */ - - /** * \defgroup WGPUComputePassEncoderMethods WGPUComputePassEncoder methods * \brief Functions whose first argument has type WGPUComputePassEncoder. @@ -3444,46 +6216,108 @@ WGPU_EXPORT void wgpuComputePassEncoderSetLabel(WGPUComputePassEncoder computePa WGPU_EXPORT void wgpuComputePassEncoderSetPipeline(WGPUComputePassEncoder computePassEncoder, WGPUComputePipeline pipeline) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuComputePassEncoderAddRef(WGPUComputePassEncoder computePassEncoder) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuComputePassEncoderRelease(WGPUComputePassEncoder computePassEncoder) WGPU_FUNCTION_ATTRIBUTE; + /** @} */ - - /** * \defgroup WGPUComputePipelineMethods WGPUComputePipeline methods * \brief Functions whose first argument has type WGPUComputePipeline. * * @{ */ +/** + * @returns + * This value is @ref ReturnedWithOwnership. + */ WGPU_EXPORT WGPUBindGroupLayout wgpuComputePipelineGetBindGroupLayout(WGPUComputePipeline computePipeline, uint32_t groupIndex) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuComputePipelineSetLabel(WGPUComputePipeline computePipeline, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuComputePipelineAddRef(WGPUComputePipeline computePipeline) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuComputePipelineRelease(WGPUComputePipeline computePipeline) WGPU_FUNCTION_ATTRIBUTE; + /** @} */ - - /** * \defgroup WGPUDeviceMethods WGPUDevice methods * \brief Functions whose first argument has type WGPUDevice. * * @{ */ +/** + * @returns + * This value is @ref ReturnedWithOwnership. + */ WGPU_EXPORT WGPUBindGroup wgpuDeviceCreateBindGroup(WGPUDevice device, WGPUBindGroupDescriptor const * descriptor) WGPU_FUNCTION_ATTRIBUTE; +/** + * @returns + * This value is @ref ReturnedWithOwnership. + */ WGPU_EXPORT WGPUBindGroupLayout wgpuDeviceCreateBindGroupLayout(WGPUDevice device, WGPUBindGroupLayoutDescriptor const * descriptor) WGPU_FUNCTION_ATTRIBUTE; -WGPU_EXPORT WGPUBuffer wgpuDeviceCreateBuffer(WGPUDevice device, WGPUBufferDescriptor const * descriptor) WGPU_FUNCTION_ATTRIBUTE; +/** + * TODO + * + * If @ref WGPUBufferDescriptor::mappedAtCreation is `true` and the mapping allocation fails, + * returns `NULL`. + * + * @returns + * This value is @ref ReturnedWithOwnership. + */ +WGPU_EXPORT WGPU_NULLABLE WGPUBuffer wgpuDeviceCreateBuffer(WGPUDevice device, WGPUBufferDescriptor const * descriptor) WGPU_FUNCTION_ATTRIBUTE; +/** + * @returns + * This value is @ref ReturnedWithOwnership. + */ WGPU_EXPORT WGPUCommandEncoder wgpuDeviceCreateCommandEncoder(WGPUDevice device, WGPU_NULLABLE WGPUCommandEncoderDescriptor const * descriptor) WGPU_FUNCTION_ATTRIBUTE; +/** + * @returns + * This value is @ref ReturnedWithOwnership. + */ WGPU_EXPORT WGPUComputePipeline wgpuDeviceCreateComputePipeline(WGPUDevice device, WGPUComputePipelineDescriptor const * descriptor) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT WGPUFuture wgpuDeviceCreateComputePipelineAsync(WGPUDevice device, WGPUComputePipelineDescriptor const * descriptor, WGPUCreateComputePipelineAsyncCallbackInfo callbackInfo) WGPU_FUNCTION_ATTRIBUTE; +/** + * @returns + * This value is @ref ReturnedWithOwnership. + */ WGPU_EXPORT WGPUPipelineLayout wgpuDeviceCreatePipelineLayout(WGPUDevice device, WGPUPipelineLayoutDescriptor const * descriptor) WGPU_FUNCTION_ATTRIBUTE; +/** + * @returns + * This value is @ref ReturnedWithOwnership. + */ WGPU_EXPORT WGPUQuerySet wgpuDeviceCreateQuerySet(WGPUDevice device, WGPUQuerySetDescriptor const * descriptor) WGPU_FUNCTION_ATTRIBUTE; +/** + * @returns + * This value is @ref ReturnedWithOwnership. + */ WGPU_EXPORT WGPURenderBundleEncoder wgpuDeviceCreateRenderBundleEncoder(WGPUDevice device, WGPURenderBundleEncoderDescriptor const * descriptor) WGPU_FUNCTION_ATTRIBUTE; +/** + * @returns + * This value is @ref ReturnedWithOwnership. + */ WGPU_EXPORT WGPURenderPipeline wgpuDeviceCreateRenderPipeline(WGPUDevice device, WGPURenderPipelineDescriptor const * descriptor) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT WGPUFuture wgpuDeviceCreateRenderPipelineAsync(WGPUDevice device, WGPURenderPipelineDescriptor const * descriptor, WGPUCreateRenderPipelineAsyncCallbackInfo callbackInfo) WGPU_FUNCTION_ATTRIBUTE; +/** + * @returns + * This value is @ref ReturnedWithOwnership. + */ WGPU_EXPORT WGPUSampler wgpuDeviceCreateSampler(WGPUDevice device, WGPU_NULLABLE WGPUSamplerDescriptor const * descriptor) WGPU_FUNCTION_ATTRIBUTE; +/** + * @returns + * This value is @ref ReturnedWithOwnership. + */ WGPU_EXPORT WGPUShaderModule wgpuDeviceCreateShaderModule(WGPUDevice device, WGPUShaderModuleDescriptor const * descriptor) WGPU_FUNCTION_ATTRIBUTE; +/** + * @returns + * This value is @ref ReturnedWithOwnership. + */ WGPU_EXPORT WGPUTexture wgpuDeviceCreateTexture(WGPUDevice device, WGPUTextureDescriptor const * descriptor) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuDeviceDestroy(WGPUDevice device) WGPU_FUNCTION_ATTRIBUTE; -WGPU_EXPORT WGPUAdapterInfo wgpuDeviceGetAdapterInfo(WGPUDevice device) WGPU_FUNCTION_ATTRIBUTE; +/** + * @param adapterInfo + * This parameter is @ref ReturnedWithOwnership. + * + * @returns + * Indicates if there was an @ref OutStructChainError. + */ +WGPU_EXPORT WGPUStatus wgpuDeviceGetAdapterInfo(WGPUDevice device, WGPUAdapterInfo * adapterInfo) WGPU_FUNCTION_ATTRIBUTE; /** * Get the list of @ref WGPUFeatureName values supported by the device. * @@ -3501,16 +6335,39 @@ WGPU_EXPORT WGPUStatus wgpuDeviceGetLimits(WGPUDevice device, WGPULimits * limit * The @ref WGPUFuture for the device-lost event of the device. */ WGPU_EXPORT WGPUFuture wgpuDeviceGetLostFuture(WGPUDevice device) WGPU_FUNCTION_ATTRIBUTE; +/** + * @returns + * This value is @ref ReturnedWithOwnership. + */ WGPU_EXPORT WGPUQueue wgpuDeviceGetQueue(WGPUDevice device) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT WGPUBool wgpuDeviceHasFeature(WGPUDevice device, WGPUFeatureName feature) WGPU_FUNCTION_ATTRIBUTE; +/** + * Pops an error scope to the current thread's error scope stack, + * asynchronously returning the result. See @ref ErrorScopes. + */ WGPU_EXPORT WGPUFuture wgpuDevicePopErrorScope(WGPUDevice device, WGPUPopErrorScopeCallbackInfo callbackInfo) WGPU_FUNCTION_ATTRIBUTE; +/** + * Pushes an error scope to the current thread's error scope stack. + * See @ref ErrorScopes. + */ WGPU_EXPORT void wgpuDevicePushErrorScope(WGPUDevice device, WGPUErrorFilter filter) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuDeviceSetLabel(WGPUDevice device, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuDeviceAddRef(WGPUDevice device) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuDeviceRelease(WGPUDevice device) WGPU_FUNCTION_ATTRIBUTE; + /** @} */ +/** + * \defgroup WGPUExternalTextureMethods WGPUExternalTexture methods + * \brief Functions whose first argument has type WGPUExternalTexture. + * + * @{ + */ +WGPU_EXPORT void wgpuExternalTextureSetLabel(WGPUExternalTexture externalTexture, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; +WGPU_EXPORT void wgpuExternalTextureAddRef(WGPUExternalTexture externalTexture) WGPU_FUNCTION_ATTRIBUTE; +WGPU_EXPORT void wgpuExternalTextureRelease(WGPUExternalTexture externalTexture) WGPU_FUNCTION_ATTRIBUTE; +/** @} */ /** * \defgroup WGPUInstanceMethods WGPUInstance methods @@ -3526,15 +6383,16 @@ WGPU_EXPORT void wgpuDeviceRelease(WGPUDevice device) WGPU_FUNCTION_ATTRIBUTE; * * @returns * A new @ref WGPUSurface for this descriptor (or an error @ref WGPUSurface). + * This value is @ref ReturnedWithOwnership. */ WGPU_EXPORT WGPUSurface wgpuInstanceCreateSurface(WGPUInstance instance, WGPUSurfaceDescriptor const * descriptor) WGPU_FUNCTION_ATTRIBUTE; /** * Get the list of @ref WGPUWGSLLanguageFeatureName values supported by the instance. */ -WGPU_EXPORT WGPUStatus wgpuInstanceGetWGSLLanguageFeatures(WGPUInstance instance, WGPUSupportedWGSLLanguageFeatures * features) WGPU_FUNCTION_ATTRIBUTE; +WGPU_EXPORT void wgpuInstanceGetWGSLLanguageFeatures(WGPUInstance instance, WGPUSupportedWGSLLanguageFeatures * features) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT WGPUBool wgpuInstanceHasWGSLLanguageFeature(WGPUInstance instance, WGPUWGSLLanguageFeatureName feature) WGPU_FUNCTION_ATTRIBUTE; /** - * Processes asynchronous events on this `WGPUInstance`, calling any callbacks for asynchronous operations created with `::WGPUCallbackMode_AllowProcessEvents`. + * Processes asynchronous events on this `WGPUInstance`, calling any callbacks for asynchronous operations created with @ref WGPUCallbackMode_AllowProcessEvents. * * See @ref Process-Events for more information. */ @@ -3548,10 +6406,9 @@ WGPU_EXPORT WGPUFuture wgpuInstanceRequestAdapter(WGPUInstance instance, WGPU_NU WGPU_EXPORT WGPUWaitStatus wgpuInstanceWaitAny(WGPUInstance instance, size_t futureCount, WGPU_NULLABLE WGPUFutureWaitInfo * futures, uint64_t timeoutNS) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuInstanceAddRef(WGPUInstance instance) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuInstanceRelease(WGPUInstance instance) WGPU_FUNCTION_ATTRIBUTE; + /** @} */ - - /** * \defgroup WGPUPipelineLayoutMethods WGPUPipelineLayout methods * \brief Functions whose first argument has type WGPUPipelineLayout. @@ -3561,10 +6418,9 @@ WGPU_EXPORT void wgpuInstanceRelease(WGPUInstance instance) WGPU_FUNCTION_ATTRIB WGPU_EXPORT void wgpuPipelineLayoutSetLabel(WGPUPipelineLayout pipelineLayout, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuPipelineLayoutAddRef(WGPUPipelineLayout pipelineLayout) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuPipelineLayoutRelease(WGPUPipelineLayout pipelineLayout) WGPU_FUNCTION_ATTRIBUTE; + /** @} */ - - /** * \defgroup WGPUQuerySetMethods WGPUQuerySet methods * \brief Functions whose first argument has type WGPUQuerySet. @@ -3577,10 +6433,9 @@ WGPU_EXPORT WGPUQueryType wgpuQuerySetGetType(WGPUQuerySet querySet) WGPU_FUNCTI WGPU_EXPORT void wgpuQuerySetSetLabel(WGPUQuerySet querySet, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuQuerySetAddRef(WGPUQuerySet querySet) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuQuerySetRelease(WGPUQuerySet querySet) WGPU_FUNCTION_ATTRIBUTE; + /** @} */ - - /** * \defgroup WGPUQueueMethods WGPUQueue methods * \brief Functions whose first argument has type WGPUQueue. @@ -3598,10 +6453,9 @@ WGPU_EXPORT void wgpuQueueWriteBuffer(WGPUQueue queue, WGPUBuffer buffer, uint64 WGPU_EXPORT void wgpuQueueWriteTexture(WGPUQueue queue, WGPUTexelCopyTextureInfo const * destination, void const * data, size_t dataSize, WGPUTexelCopyBufferLayout const * dataLayout, WGPUExtent3D const * writeSize) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuQueueAddRef(WGPUQueue queue) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuQueueRelease(WGPUQueue queue) WGPU_FUNCTION_ATTRIBUTE; + /** @} */ - - /** * \defgroup WGPURenderBundleMethods WGPURenderBundle methods * \brief Functions whose first argument has type WGPURenderBundle. @@ -3611,10 +6465,9 @@ WGPU_EXPORT void wgpuQueueRelease(WGPUQueue queue) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuRenderBundleSetLabel(WGPURenderBundle renderBundle, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuRenderBundleAddRef(WGPURenderBundle renderBundle) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuRenderBundleRelease(WGPURenderBundle renderBundle) WGPU_FUNCTION_ATTRIBUTE; + /** @} */ - - /** * \defgroup WGPURenderBundleEncoderMethods WGPURenderBundleEncoder methods * \brief Functions whose first argument has type WGPURenderBundleEncoder. @@ -3625,6 +6478,10 @@ WGPU_EXPORT void wgpuRenderBundleEncoderDraw(WGPURenderBundleEncoder renderBundl WGPU_EXPORT void wgpuRenderBundleEncoderDrawIndexed(WGPURenderBundleEncoder renderBundleEncoder, uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t baseVertex, uint32_t firstInstance) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuRenderBundleEncoderDrawIndexedIndirect(WGPURenderBundleEncoder renderBundleEncoder, WGPUBuffer indirectBuffer, uint64_t indirectOffset) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuRenderBundleEncoderDrawIndirect(WGPURenderBundleEncoder renderBundleEncoder, WGPUBuffer indirectBuffer, uint64_t indirectOffset) WGPU_FUNCTION_ATTRIBUTE; +/** + * @returns + * This value is @ref ReturnedWithOwnership. + */ WGPU_EXPORT WGPURenderBundle wgpuRenderBundleEncoderFinish(WGPURenderBundleEncoder renderBundleEncoder, WGPU_NULLABLE WGPURenderBundleDescriptor const * descriptor) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuRenderBundleEncoderInsertDebugMarker(WGPURenderBundleEncoder renderBundleEncoder, WGPUStringView markerLabel) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuRenderBundleEncoderPopDebugGroup(WGPURenderBundleEncoder renderBundleEncoder) WGPU_FUNCTION_ATTRIBUTE; @@ -3636,10 +6493,9 @@ WGPU_EXPORT void wgpuRenderBundleEncoderSetPipeline(WGPURenderBundleEncoder rend WGPU_EXPORT void wgpuRenderBundleEncoderSetVertexBuffer(WGPURenderBundleEncoder renderBundleEncoder, uint32_t slot, WGPU_NULLABLE WGPUBuffer buffer, uint64_t offset, uint64_t size) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuRenderBundleEncoderAddRef(WGPURenderBundleEncoder renderBundleEncoder) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuRenderBundleEncoderRelease(WGPURenderBundleEncoder renderBundleEncoder) WGPU_FUNCTION_ATTRIBUTE; + /** @} */ - - /** * \defgroup WGPURenderPassEncoderMethods WGPURenderPassEncoder methods * \brief Functions whose first argument has type WGPURenderPassEncoder. @@ -3658,6 +6514,10 @@ WGPU_EXPORT void wgpuRenderPassEncoderInsertDebugMarker(WGPURenderPassEncoder re WGPU_EXPORT void wgpuRenderPassEncoderPopDebugGroup(WGPURenderPassEncoder renderPassEncoder) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuRenderPassEncoderPushDebugGroup(WGPURenderPassEncoder renderPassEncoder, WGPUStringView groupLabel) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuRenderPassEncoderSetBindGroup(WGPURenderPassEncoder renderPassEncoder, uint32_t groupIndex, WGPU_NULLABLE WGPUBindGroup group, size_t dynamicOffsetCount, uint32_t const * dynamicOffsets) WGPU_FUNCTION_ATTRIBUTE; +/** + * @param color + * The RGBA blend constant. Represents an `f32` color using @ref DoubleAsSupertype. + */ WGPU_EXPORT void wgpuRenderPassEncoderSetBlendConstant(WGPURenderPassEncoder renderPassEncoder, WGPUColor const * color) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuRenderPassEncoderSetIndexBuffer(WGPURenderPassEncoder renderPassEncoder, WGPUBuffer buffer, WGPUIndexFormat format, uint64_t offset, uint64_t size) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuRenderPassEncoderSetLabel(WGPURenderPassEncoder renderPassEncoder, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; @@ -3665,27 +6525,34 @@ WGPU_EXPORT void wgpuRenderPassEncoderSetPipeline(WGPURenderPassEncoder renderPa WGPU_EXPORT void wgpuRenderPassEncoderSetScissorRect(WGPURenderPassEncoder renderPassEncoder, uint32_t x, uint32_t y, uint32_t width, uint32_t height) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuRenderPassEncoderSetStencilReference(WGPURenderPassEncoder renderPassEncoder, uint32_t reference) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuRenderPassEncoderSetVertexBuffer(WGPURenderPassEncoder renderPassEncoder, uint32_t slot, WGPU_NULLABLE WGPUBuffer buffer, uint64_t offset, uint64_t size) WGPU_FUNCTION_ATTRIBUTE; +/** + * TODO + * + * If any argument is non-finite, produces a @ref NonFiniteFloatValueError. + */ WGPU_EXPORT void wgpuRenderPassEncoderSetViewport(WGPURenderPassEncoder renderPassEncoder, float x, float y, float width, float height, float minDepth, float maxDepth) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuRenderPassEncoderAddRef(WGPURenderPassEncoder renderPassEncoder) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuRenderPassEncoderRelease(WGPURenderPassEncoder renderPassEncoder) WGPU_FUNCTION_ATTRIBUTE; + /** @} */ - - /** * \defgroup WGPURenderPipelineMethods WGPURenderPipeline methods * \brief Functions whose first argument has type WGPURenderPipeline. * * @{ */ +/** + * @returns + * This value is @ref ReturnedWithOwnership. + */ WGPU_EXPORT WGPUBindGroupLayout wgpuRenderPipelineGetBindGroupLayout(WGPURenderPipeline renderPipeline, uint32_t groupIndex) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuRenderPipelineSetLabel(WGPURenderPipeline renderPipeline, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuRenderPipelineAddRef(WGPURenderPipeline renderPipeline) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuRenderPipelineRelease(WGPURenderPipeline renderPipeline) WGPU_FUNCTION_ATTRIBUTE; + /** @} */ - - /** * \defgroup WGPUSamplerMethods WGPUSampler methods * \brief Functions whose first argument has type WGPUSampler. @@ -3695,10 +6562,9 @@ WGPU_EXPORT void wgpuRenderPipelineRelease(WGPURenderPipeline renderPipeline) WG WGPU_EXPORT void wgpuSamplerSetLabel(WGPUSampler sampler, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuSamplerAddRef(WGPUSampler sampler) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuSamplerRelease(WGPUSampler sampler) WGPU_FUNCTION_ATTRIBUTE; + /** @} */ - - /** * \defgroup WGPUShaderModuleMethods WGPUShaderModule methods * \brief Functions whose first argument has type WGPUShaderModule. @@ -3709,10 +6575,9 @@ WGPU_EXPORT WGPUFuture wgpuShaderModuleGetCompilationInfo(WGPUShaderModule shade WGPU_EXPORT void wgpuShaderModuleSetLabel(WGPUShaderModule shaderModule, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuShaderModuleAddRef(WGPUShaderModule shaderModule) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuShaderModuleRelease(WGPUShaderModule shaderModule) WGPU_FUNCTION_ATTRIBUTE; + /** @} */ - - /** * \defgroup WGPUSupportedFeaturesMethods WGPUSupportedFeatures methods * \brief Functions whose first argument has type WGPUSupportedFeatures. @@ -3720,12 +6585,24 @@ WGPU_EXPORT void wgpuShaderModuleRelease(WGPUShaderModule shaderModule) WGPU_FUN * @{ */ /** - * Frees array members of WGPUSupportedFeatures which were allocated by the API. + * Frees members which were allocated by the API. */ WGPU_EXPORT void wgpuSupportedFeaturesFreeMembers(WGPUSupportedFeatures supportedFeatures) WGPU_FUNCTION_ATTRIBUTE; + /** @} */ +/** + * \defgroup WGPUSupportedInstanceFeaturesMethods WGPUSupportedInstanceFeatures methods + * \brief Functions whose first argument has type WGPUSupportedInstanceFeatures. + * + * @{ + */ +/** + * Frees members which were allocated by the API. + */ +WGPU_EXPORT void wgpuSupportedInstanceFeaturesFreeMembers(WGPUSupportedInstanceFeatures supportedInstanceFeatures) WGPU_FUNCTION_ATTRIBUTE; +/** @} */ /** * \defgroup WGPUSupportedWGSLLanguageFeaturesMethods WGPUSupportedWGSLLanguageFeatures methods @@ -3734,13 +6611,12 @@ WGPU_EXPORT void wgpuSupportedFeaturesFreeMembers(WGPUSupportedFeatures supporte * @{ */ /** - * Frees array members of WGPUSupportedWGSLLanguageFeatures which were allocated by the API. + * Frees members which were allocated by the API. */ WGPU_EXPORT void wgpuSupportedWGSLLanguageFeaturesFreeMembers(WGPUSupportedWGSLLanguageFeatures supportedWGSLLanguageFeatures) WGPU_FUNCTION_ATTRIBUTE; + /** @} */ - - /** * \defgroup WGPUSurfaceMethods WGPUSurface methods * \brief Functions whose first argument has type WGPUSurface. @@ -3766,7 +6642,7 @@ WGPU_EXPORT void wgpuSurfaceConfigure(WGPUSurface surface, WGPUSurfaceConfigurat * * @param capabilities * The structure to fill capabilities in. - * It may contain memory allocations so `::wgpuSurfaceCapabilitiesFreeMembers` must be called to avoid memory leaks. + * It may contain memory allocations so @ref wgpuSurfaceCapabilitiesFreeMembers must be called to avoid memory leaks. * This parameter is @ref ReturnedWithOwnership. * * @returns @@ -3805,10 +6681,9 @@ WGPU_EXPORT void wgpuSurfaceSetLabel(WGPUSurface surface, WGPUStringView label) WGPU_EXPORT void wgpuSurfaceUnconfigure(WGPUSurface surface) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuSurfaceAddRef(WGPUSurface surface) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuSurfaceRelease(WGPUSurface surface) WGPU_FUNCTION_ATTRIBUTE; + /** @} */ - - /** * \defgroup WGPUSurfaceCapabilitiesMethods WGPUSurfaceCapabilities methods * \brief Functions whose first argument has type WGPUSurfaceCapabilities. @@ -3816,19 +6691,22 @@ WGPU_EXPORT void wgpuSurfaceRelease(WGPUSurface surface) WGPU_FUNCTION_ATTRIBUTE * @{ */ /** - * Frees array members of WGPUSurfaceCapabilities which were allocated by the API. + * Frees members which were allocated by the API. */ WGPU_EXPORT void wgpuSurfaceCapabilitiesFreeMembers(WGPUSurfaceCapabilities surfaceCapabilities) WGPU_FUNCTION_ATTRIBUTE; + /** @} */ - - /** * \defgroup WGPUTextureMethods WGPUTexture methods * \brief Functions whose first argument has type WGPUTexture. * * @{ */ +/** + * @returns + * This value is @ref ReturnedWithOwnership. + */ WGPU_EXPORT WGPUTextureView wgpuTextureCreateView(WGPUTexture texture, WGPU_NULLABLE WGPUTextureViewDescriptor const * descriptor) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuTextureDestroy(WGPUTexture texture) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT uint32_t wgpuTextureGetDepthOrArrayLayers(WGPUTexture texture) WGPU_FUNCTION_ATTRIBUTE; @@ -3837,15 +6715,15 @@ WGPU_EXPORT WGPUTextureFormat wgpuTextureGetFormat(WGPUTexture texture) WGPU_FUN WGPU_EXPORT uint32_t wgpuTextureGetHeight(WGPUTexture texture) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT uint32_t wgpuTextureGetMipLevelCount(WGPUTexture texture) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT uint32_t wgpuTextureGetSampleCount(WGPUTexture texture) WGPU_FUNCTION_ATTRIBUTE; +WGPU_EXPORT WGPUTextureViewDimension wgpuTextureGetTextureBindingViewDimension(WGPUTexture texture) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT WGPUTextureUsage wgpuTextureGetUsage(WGPUTexture texture) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT uint32_t wgpuTextureGetWidth(WGPUTexture texture) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuTextureSetLabel(WGPUTexture texture, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuTextureAddRef(WGPUTexture texture) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuTextureRelease(WGPUTexture texture) WGPU_FUNCTION_ATTRIBUTE; + /** @} */ - - /** * \defgroup WGPUTextureViewMethods WGPUTextureView methods * \brief Functions whose first argument has type WGPUTextureView. @@ -3855,8 +6733,8 @@ WGPU_EXPORT void wgpuTextureRelease(WGPUTexture texture) WGPU_FUNCTION_ATTRIBUTE WGPU_EXPORT void wgpuTextureViewSetLabel(WGPUTextureView textureView, WGPUStringView label) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuTextureViewAddRef(WGPUTextureView textureView) WGPU_FUNCTION_ATTRIBUTE; WGPU_EXPORT void wgpuTextureViewRelease(WGPUTextureView textureView) WGPU_FUNCTION_ATTRIBUTE; -/** @} */ +/** @} */ /** @} */ diff --git a/libs/wgpu/include/webgpu/wgpu.h b/libs/wgpu/include/webgpu/wgpu.h index 2adc5c0..4bf1979 100644 --- a/libs/wgpu/include/webgpu/wgpu.h +++ b/libs/wgpu/include/webgpu/wgpu.h @@ -1,208 +1,1090 @@ +/** + * @file wgpu.h + * @brief wgpu-native specific extensions to the standard WebGPU C API. + * + * This header defines native-only types, enumerations, structures, and functions + * that extend the WebGPU specification defined in @c webgpu.h. All extension + * enum values and struct type identifiers (@ref WGPUNativeSType) are allocated + * within the @c 0x0003XXXX range reserved for wgpu-native. + * + * Include this header after @c webgpu.h (it is included automatically). + */ #ifndef WGPU_H_ #define WGPU_H_ #include "webgpu.h" -typedef enum WGPUNativeSType { +typedef enum WGPUNativeSType +{ // Start at 0003 since that's allocated range for wgpu-native + /** Identifies @ref WGPUDeviceExtras. */ WGPUSType_DeviceExtras = 0x00030001, + /** Identifies @ref WGPUNativeLimits. */ WGPUSType_NativeLimits = 0x00030002, + /** Identifies @ref WGPUPipelineLayoutExtras. */ WGPUSType_PipelineLayoutExtras = 0x00030003, + /** Identifies @ref WGPUShaderSourceGLSL. */ WGPUSType_ShaderSourceGLSL = 0x00030004, + /** Identifies @ref WGPUInstanceExtras. */ WGPUSType_InstanceExtras = 0x00030006, + /** Identifies @ref WGPUBindGroupEntryExtras. */ WGPUSType_BindGroupEntryExtras = 0x00030007, + /** Identifies @ref WGPUBindGroupLayoutEntryExtras. */ WGPUSType_BindGroupLayoutEntryExtras = 0x00030008, + /** Identifies @ref WGPUQuerySetDescriptorExtras. */ WGPUSType_QuerySetDescriptorExtras = 0x00030009, + /** Identifies @ref WGPUSurfaceConfigurationExtras. */ WGPUSType_SurfaceConfigurationExtras = 0x0003000A, + /** Identifies @ref WGPUSurfaceSourceSwapChainPanel. */ WGPUSType_SurfaceSourceSwapChainPanel = 0x0003000B, + /** Identifies @ref WGPUPrimitiveStateExtras. */ + WGPUSType_PrimitiveStateExtras = 0x0003000C, WGPUNativeSType_Force32 = 0x7FFFFFFF } WGPUNativeSType; -typedef enum WGPUNativeFeature { - WGPUNativeFeature_PushConstants = 0x00030001, +/** + * Additional surface-get-current-texture status codes defined by wgpu-native. + * + * These extend the standard @c WGPUSurfaceGetCurrentTextureStatus values. + */ +typedef enum WGPUNativeSurfaceGetCurrentTextureStatus +{ + /** + * The surface texture was not acquired because the window is occluded + * (e.g. minimized or fully covered by another window). + * + * No texture is returned and the @c texture field of + * @c WGPUSurfaceTexture will be NULL. The surface and swapchain remain + * valid -- there is no need to reconfigure or recreate the surface. + * + * Applications should skip rendering for the current frame and try + * again once the window is no longer occluded. If you are using a + * windowing library such as winit, listen for the window's "occluded" + * event and request a new redraw when the window becomes visible again. + * + * When does this occur? + * + * Currently this status is only produced by the Metal backend on macOS. + * When a window is not visible (checked via the @c NSWindow + * @c occlusionState property), acquiring the next drawable would block + * for up to one second waiting for vsync. wgpu-native returns + * @c Occluded instead to avoid that hang. + * + * Other backends (Vulkan, DX12, GL) do not currently report this + * status; an occluded window on those backends may produce + * @c WGPUSurfaceGetCurrentTextureStatus_Timeout or simply succeed + * normally. + */ + WGPUSurfaceGetCurrentTextureStatus_Occluded = 0x00030001, + WGPUNativeSurfaceGetCurrentTextureStatus_Force32 = 0x7FFFFFFF +} WGPUNativeSurfaceGetCurrentTextureStatus; + +/** + * Native-only device features. + * + * These extend the standard @c WGPUFeatureName values and can be passed to + * @c WGPUDeviceDescriptor::requiredFeatures to request additional + * capabilities when creating a device. + */ +typedef enum WGPUNativeFeature +{ + /** + * Allows the use of immediate data: small, fast blocks of memory + * that can be updated inside a render pass, compute pass, or render + * bundle encoder. + * + * Enables @ref wgpuRenderPassEncoderSetImmediates, + * @ref wgpuComputePassEncoderSetImmediates, + * @ref wgpuRenderBundleEncoderSetImmediates, + * non-zero @c immediateDataSize in @ref WGPUPipelineLayoutExtras, + * and non-zero @c maxImmediateSize in @ref WGPUNativeLimits. + * + * A block of immediate data can be declared in WGSL with + * @c var: + * @code + * struct Immediates { example: f32, } + * var c: Immediates; + * @endcode + * + * In GLSL, this corresponds to @c layout(immediates) @c uniform @c Name @c {..}. + * + * Supported platforms: + * - DX12 + * - Vulkan + * - Metal + * - OpenGL (emulated with uniforms) + * - WebGPU + * + * This is a web and native feature. + */ + WGPUNativeFeature_Immediates = 0x00030001, + /** + * Enables device-specific texture format features. + * + * By default only texture format properties as defined by the WebGPU + * specification are allowed. Enabling this feature flag extends the + * features of each format to the ones supported by the current device. + * Note that without this flag, read/write storage access is not allowed + * at all. + * + * This extension does not enable additional formats. + * + * Supported platforms: + * - Vulkan + * - DX12 + * - Metal + * + * This is a native only feature. + */ WGPUNativeFeature_TextureAdapterSpecificFormatFeatures = 0x00030002, - WGPUNativeFeature_MultiDrawIndirect = 0x00030003, + /** + * Allows the use of a buffer containing the actual number of draw calls. + * + * Enables @ref wgpuRenderPassEncoderMultiDrawIndirectCount and + * @ref wgpuRenderPassEncoderMultiDrawIndexedIndirectCount. + * + * This feature being present also implies that all calls to + * @ref wgpuRenderPassEncoderMultiDrawIndirect and + * @ref wgpuRenderPassEncoderMultiDrawIndexedIndirect are not being + * emulated with a series of @c draw_indirect calls. + * + * Supported platforms: + * - DX12 + * - Vulkan 1.2+ (or VK_KHR_draw_indirect_count) + * + * This is a native only feature. + */ WGPUNativeFeature_MultiDrawIndirectCount = 0x00030004, + /** + * Enables bindings of writable storage buffers and textures visible + * to vertex shaders. + * + * Note: some (tiled-based) platforms do not support vertex shaders + * with any side-effects. + * + * Supported platforms: + * - All + * + * This is a native only feature. + */ WGPUNativeFeature_VertexWritableStorage = 0x00030005, + /** + * Allows the user to create uniform arrays of textures in shaders: + * + * - WGSL: @c var @c textures: @c binding_array, @c 10> + * - GLSL: @c uniform @c texture2D @c textures[10] + * + * If @ref WGPUNativeFeature_StorageResourceBindingArray is supported + * as well as this, the user may also create uniform arrays of storage + * textures. + * + * This capability allows them to exist and to be indexed by dynamically + * uniform values. + * + * Supported platforms: + * - DX12 + * - Metal (with MSL 2.0+ on macOS 10.13+) + * - Vulkan + * + * This is a native only feature. + */ WGPUNativeFeature_TextureBindingArray = 0x00030006, + /** + * Allows shaders to index sampled texture and storage buffer resource + * arrays with dynamically non-uniform values: + * + * e.g. @c texture_array[vertex_data] + * + * In order to use this capability, the corresponding GLSL extension must + * be enabled: + * + * @c \#extension @c GL_EXT_nonuniform_qualifier @c : @c require + * + * and then used either as @c nonuniformEXT qualifier in variable + * declaration or as @c nonuniformEXT constructor. + * + * WGSL and HLSL do not need any extension. + * + * Supported platforms: + * - DX12 + * - Metal (with MSL 2.0+ on macOS 10.13+) + * - Vulkan 1.2+ (or VK_EXT_descriptor_indexing) + * + * This is a native only feature. + */ WGPUNativeFeature_SampledTextureAndStorageBufferArrayNonUniformIndexing = 0x00030007, + /** + * Enables use of Pipeline Statistics Queries. These queries report the + * count of various operations performed between the start and stop call. + * + * Use @ref wgpuRenderPassEncoderBeginPipelineStatisticsQuery / + * @ref wgpuRenderPassEncoderEndPipelineStatisticsQuery (or the compute + * pass equivalents) to start and stop a query. + * + * They must be resolved using @c wgpuCommandEncoderResolveQuerySet into + * a buffer. See @ref WGPUPipelineStatisticName for the list of available + * statistics. + * + * Supported platforms: + * - Vulkan + * - DX12 + * + * This is a native only feature. + */ WGPUNativeFeature_PipelineStatisticsQuery = 0x00030008, + /** + * Allows the user to create uniform arrays of storage buffers or + * textures in shaders, if @ref WGPUNativeFeature_BufferBindingArray + * or @ref WGPUNativeFeature_TextureBindingArray (respectively) + * is also supported. + * + * This capability allows them to exist and to be indexed by dynamically + * uniform values. + * + * Supported platforms: + * - Metal (with MSL 2.2+ on macOS 10.13+) + * - Vulkan + * + * This is a native only feature. + */ WGPUNativeFeature_StorageResourceBindingArray = 0x00030009, + /** + * Allows the user to create bind groups containing arrays with fewer + * bindings than the @c WGPUBindGroupLayout requires. + * + * Supported platforms: + * - Vulkan + * - DX12 + * + * This is a native only feature. + */ WGPUNativeFeature_PartiallyBoundBindingArray = 0x0003000A, + /** + * Enables normalized 16-bit texture formats: + * @ref WGPUNativeTextureFormat_R16Unorm, @ref WGPUNativeTextureFormat_R16Snorm, + * @ref WGPUNativeTextureFormat_Rg16Unorm, @ref WGPUNativeTextureFormat_Rg16Snorm, + * @ref WGPUNativeTextureFormat_Rgba16Unorm, @ref WGPUNativeTextureFormat_Rgba16Snorm. + * + * Supported platforms: + * - Vulkan + * - DX12 + * - Metal + * + * This is a native only feature. + */ WGPUNativeFeature_TextureFormat16bitNorm = 0x0003000B, + /** + * Enables ASTC HDR family of compressed textures. + * + * Compressed textures sacrifice some quality in exchange for + * significantly reduced bandwidth usage. + * + * Support for this feature guarantees availability of + * @c COPY_SRC | @c COPY_DST | @c TEXTURE_BINDING for ASTC formats + * with the HDR channel type. + * @ref WGPUNativeFeature_TextureAdapterSpecificFormatFeatures may + * enable additional usages. + * + * Supported platforms: + * - Metal + * - Vulkan + * - OpenGL + * + * This is a native only feature. + */ WGPUNativeFeature_TextureCompressionAstcHdr = 0x0003000C, + /** + * Removes the WebGPU restriction that @c MAP_READ and @c MAP_WRITE + * buffer usages must be paired exclusively with @c COPY_DST and + * @c COPY_SRC respectively. + * + * This is only beneficial on systems that share memory between CPU and + * GPU. If enabled on a system that doesn't, this can severely hinder + * performance. Only use if you understand the consequences. + * + * Supported platforms: + * - Vulkan + * - DX12 + * - Metal + * + * This is a native only feature. + */ WGPUNativeFeature_MappablePrimaryBuffers = 0x0003000E, + /** + * Allows the user to create arrays of buffers in shaders: + * + * - WGSL: @c var @c buffer_array: @c array + * - GLSL: @c uniform @c myBuffer @c { @c ... @c } @c buffer_array[10] + * + * This capability allows them to exist and to be indexed by dynamically + * uniform values. + * + * If @ref WGPUNativeFeature_StorageResourceBindingArray is supported as + * well as this, the user may also create arrays of storage buffers. + * + * Supported platforms: + * - Vulkan + * + * This is a native only feature. + */ WGPUNativeFeature_BufferBindingArray = 0x0003000F, + /** + * Allows shaders to index uniform buffer and storage texture resource + * arrays with dynamically non-uniform values. + * + * This is a native only feature. + */ WGPUNativeFeature_UniformBufferAndStorageTextureArrayNonUniformIndexing = 0x00030010, // TODO: requires wgpu.h api change // WGPUNativeFeature_AddressModeClampToZero = 0x00030011, // WGPUNativeFeature_AddressModeClampToBorder = 0x00030012, - // WGPUNativeFeature_PolygonModeLine = 0x00030013, - // WGPUNativeFeature_PolygonModePoint = 0x00030014, - // WGPUNativeFeature_ConservativeRasterization = 0x00030015, + /** + * Allows the user to set @ref WGPUPolygonMode_Line in + * @ref WGPUPrimitiveStateExtras::polygonMode. + * + * This allows drawing polygons/triangles as lines (wireframe) instead + * of filled. + * + * Supported platforms: + * - DX12 + * - Vulkan + * - Metal + * + * This is a native only feature. + */ + WGPUNativeFeature_PolygonModeLine = 0x00030013, + /** + * Allows the user to set @ref WGPUPolygonMode_Point in + * @ref WGPUPrimitiveStateExtras::polygonMode. + * + * This allows only drawing the vertices of polygons/triangles instead + * of filled. + * + * Supported platforms: + * - Vulkan + * + * This is a native only feature. + */ + WGPUNativeFeature_PolygonModePoint = 0x00030014, + /** + * Allows the user to enable overestimation conservative rasterization + * via @ref WGPUPrimitiveStateExtras::conservative. + * + * Processing of degenerate triangles/lines is hardware specific. + * Only triangles are supported. + * + * Supported platforms: + * - Vulkan + * + * This is a native only feature. + */ + WGPUNativeFeature_ConservativeRasterization = 0x00030015, // WGPUNativeFeature_ClearTexture = 0x00030016, + /** + * Enables creating shader modules from pre-compiled SPIR-V binary via + * @ref wgpuDeviceCreateShaderModuleSpirV. + * + * Shader code isn't parsed or interpreted in any way. It is the caller's + * responsibility to ensure the code is correct. + * + * Supported platforms: + * - Vulkan + * - DX12 + * - Metal + * - WebGPU + * + * This is a native only feature. + */ WGPUNativeFeature_SpirvShaderPassthrough = 0x00030017, // WGPUNativeFeature_Multiview = 0x00030018, + /** + * Enables using 64-bit types for vertex attributes. + * + * Requires @ref WGPUNativeFeature_ShaderF64. + * + * This is a native only feature. + */ WGPUNativeFeature_VertexAttribute64bit = 0x00030019, + /** + * Allows for creation of textures of format + * @ref WGPUNativeTextureFormat_NV12. + * + * Supported platforms: + * - DX12 + * - Vulkan + * + * This is a native only feature. + */ WGPUNativeFeature_TextureFormatNv12 = 0x0003001A, - WGPUNativeFeature_RayTracingAccelerationStructure = 0x0003001B, + /** + * Allows for the creation of ray-tracing queries within shaders. + * + * @b EXPERIMENTAL: Features enabled by this may have major bugs and are + * expected to be subject to breaking changes. + * + * Supported platforms: + * - Vulkan + * + * This is a native only feature. + */ WGPUNativeFeature_RayQuery = 0x0003001C, + /** + * Enables 64-bit floating point types in SPIR-V shaders. + * + * Note: even when supported by GPU hardware, 64-bit floating point + * operations are frequently between 16 and 64 @e times slower than + * equivalent operations on 32-bit floats. + * + * Supported platforms: + * - Vulkan + * + * This is a native only feature. + */ WGPUNativeFeature_ShaderF64 = 0x0003001D, + /** + * Allows shaders to use i16. Not currently supported in naga, only + * available through SPIR-V passthrough. + * + * Supported platforms: + * - Vulkan + * + * This is a native only feature. + */ WGPUNativeFeature_ShaderI16 = 0x0003001E, - WGPUNativeFeature_ShaderPrimitiveIndex = 0x0003001F, + /** + * Allows shaders to use the @c early_depth_test attribute. + * + * The attribute is applied to the fragment shader entry point and can be + * used in two ways: + * + * 1. Force early depth/stencil tests: + * - WGSL: @c \@early_depth_test(force) + * - GLSL: @c layout(early_fragment_tests) @c in; + * + * 2. Provide a conservative depth specifier that allows an additional + * early depth test under certain conditions: + * - WGSL: @c \@early_depth_test(greater_equal/less_equal/unchanged) + * - GLSL: @c layout(depth_) @c out @c float @c gl_FragDepth; + * + * Supported platforms: + * - Vulkan + * - GLES 3.1+ + * + * This is a native only feature. + */ WGPUNativeFeature_ShaderEarlyDepthTest = 0x00030020, + /** + * Allows compute and fragment shaders to use the subgroup operation + * built-ins and perform subgroup operations (except barriers). + * + * Supported platforms: + * - Vulkan + * - DX12 + * - Metal + * + * This is a native only feature. + */ WGPUNativeFeature_Subgroup = 0x00030021, + /** + * Allows vertex shaders to use the subgroup operation built-ins and + * perform subgroup operations (except barriers). + * + * Supported platforms: + * - Vulkan + * + * This is a native only feature. + */ WGPUNativeFeature_SubgroupVertex = 0x00030022, + /** + * Allows compute shaders to use the subgroup barrier. + * + * Requires @ref WGPUNativeFeature_Subgroup. Without it, enables nothing. + * + * Supported platforms: + * - Vulkan + * - Metal + * + * This is a native only feature. + */ WGPUNativeFeature_SubgroupBarrier = 0x00030023, + /** + * Allows for timestamp queries directly on command encoders. + * + * Implies @c WGPUFeatureName_TimestampQuery is supported. + * + * Supported platforms: + * - Vulkan + * - DX12 + * - Metal + * - OpenGL (with GL_ARB_timer_query) + * + * This is a native only feature. + */ WGPUNativeFeature_TimestampQueryInsideEncoders = 0x00030024, + /** + * Allows for timestamp queries inside render and compute passes. + * + * Implies @c WGPUFeatureName_TimestampQuery and + * @ref WGPUNativeFeature_TimestampQueryInsideEncoders are supported. + * + * Enables @ref wgpuRenderPassEncoderWriteTimestamp and + * @ref wgpuComputePassEncoderWriteTimestamp. + * + * This is generally not available on tile-based rasterization GPUs. + * + * Supported platforms: + * - Vulkan + * - DX12 + * - Metal (AMD & Intel, not Apple GPUs) + * - OpenGL (with GL_ARB_timer_query) + * + * This is a native only feature. + */ WGPUNativeFeature_TimestampQueryInsidePasses = 0x00030025, + /** + * Allows shaders to use i64 and u64. + * + * Supported platforms: + * - Vulkan + * - DX12 (DXC only) + * - Metal (with MSL 2.3+) + * + * This is a native only feature. + */ WGPUNativeFeature_ShaderInt64 = 0x00030026, WGPUNativeFeature_Force32 = 0x7FFFFFFF } WGPUNativeFeature; -typedef enum WGPULogLevel { +typedef enum WGPULogLevel +{ WGPULogLevel_Off = 0x00000000, + /** Only error messages. */ WGPULogLevel_Error = 0x00000001, + /** Errors and warnings. */ WGPULogLevel_Warn = 0x00000002, + /** Errors, warnings, and informational messages. */ WGPULogLevel_Info = 0x00000003, + /** Errors, warnings, informational, and debug messages. */ WGPULogLevel_Debug = 0x00000004, + /** All messages, including very verbose trace-level output. */ WGPULogLevel_Trace = 0x00000005, WGPULogLevel_Force32 = 0x7FFFFFFF } WGPULogLevel; +/** + * Bitflags selecting which graphics backends the @ref WGPUInstance should + * enable. + * + * Pass in the @c backends field of @ref WGPUInstanceExtras. + */ typedef WGPUFlags WGPUInstanceBackend; +/** All backends (the default when zero-initialized). */ static const WGPUInstanceBackend WGPUInstanceBackend_All = 0x00000000; +/** + * Vulkan backend. + * Supported on Windows, Linux/Android, and macOS/iOS via Vulkan Portability. + */ static const WGPUInstanceBackend WGPUInstanceBackend_Vulkan = 1 << 0; +/** + * OpenGL / OpenGL ES backend. + * Supported on Linux/Android, the web via WebGL, and Windows/macOS via ANGLE. + */ static const WGPUInstanceBackend WGPUInstanceBackend_GL = 1 << 1; +/** + * Metal backend. + * Supported on macOS and iOS. + */ static const WGPUInstanceBackend WGPUInstanceBackend_Metal = 1 << 2; +/** + * Direct3D 12 backend. + * Supported on Windows 10 and later. + */ static const WGPUInstanceBackend WGPUInstanceBackend_DX12 = 1 << 3; -static const WGPUInstanceBackend WGPUInstanceBackend_DX11 = 1 << 4; +/** + * Browser WebGPU backend. + * Supported when targeting the web through WebAssembly. + */ static const WGPUInstanceBackend WGPUInstanceBackend_BrowserWebGPU = 1 << 5; -// Vulkan, Metal, DX12 and BrowserWebGPU +/** Primary (first-tier) backends: Vulkan, Metal, DX12, and BrowserWebGPU. */ static const WGPUInstanceBackend WGPUInstanceBackend_Primary = (1 << 0) | (1 << 2) | (1 << 3) | (1 << 5); -// GL and DX11 -static const WGPUInstanceBackend WGPUInstanceBackend_Secondary = (1 << 1) | (1 << 4); +/** Secondary (second-tier) backends: GL. */ +static const WGPUInstanceBackend WGPUInstanceBackend_Secondary = (1 << 1); static const WGPUInstanceBackend WGPUInstanceBackend_Force32 = 0x7FFFFFFF; +/** + * Bitflags controlling instance debugging and validation behavior. + * + * These are not part of the WebGPU standard. + * + * Pass in the @c flags field of @ref WGPUInstanceExtras. + */ typedef WGPUFlags WGPUInstanceFlag; -static const WGPUInstanceFlag WGPUInstanceFlag_Default = 0x00000000; +/** No flags set. */ +static const WGPUInstanceFlag WGPUInstanceFlag_Empty = 0x00000000; +/** + * Generate debug information in shaders and objects. + * + * When using @ref WGPUInstanceFlag_WithEnv, takes value from the + * @c WGPU_DEBUG environment variable. + */ static const WGPUInstanceFlag WGPUInstanceFlag_Debug = 1 << 0; +/** + * Enable validation in the backend API, if possible: + * + * - On the DX12 backend, this calls @c ID3D12Debug::EnableDebugLayer. + * - On the Vulkan backend, this enables the Vulkan Validation Layers. + * - On the GLES backend (Windows), this enables debug output. + * - On the GLES backend (non-Windows), this calls @c eglDebugMessageControlKHR. + * + * When using @ref WGPUInstanceFlag_WithEnv, takes value from the + * @c WGPU_VALIDATION environment variable. + */ static const WGPUInstanceFlag WGPUInstanceFlag_Validation = 1 << 1; +/** + * Don't pass labels to the backend API (wgpu-hal). + * + * When using @ref WGPUInstanceFlag_WithEnv, takes value from the + * @c WGPU_DISCARD_HAL_LABELS environment variable. + */ static const WGPUInstanceFlag WGPUInstanceFlag_DiscardHalLabels = 1 << 2; +/** + * Whether wgpu should expose adapters that run on top of non-compliant + * adapters. + * + * Turning this on might mean that some of the functionality provided by the + * wgpu adapter/device is not working or broken. This mainly applies to a + * Vulkan driver's compliance version. If the major compliance version is 0, + * then the driver is ignored unless this flag is set. + * + * When using @ref WGPUInstanceFlag_WithEnv, takes value from the + * @c WGPU_ALLOW_UNDERLYING_NONCOMPLIANT_ADAPTER environment variable. + */ +static const WGPUInstanceFlag WGPUInstanceFlag_AllowUnderlyingNoncompliantAdapter = 1 << 3; +/** + * Enable GPU-based validation. Implies @ref WGPUInstanceFlag_Validation. + * Currently only changes behavior on the DX12 and Vulkan backends. + * + * - D3D12: Called "GPU-based validation" (GBV). + * - Vulkan: Called "GPU-Assisted Validation" via VK_LAYER_KHRONOS_validation. + * + * When using @ref WGPUInstanceFlag_WithEnv, takes value from the + * @c WGPU_GPU_BASED_VALIDATION environment variable. + */ +static const WGPUInstanceFlag WGPUInstanceFlag_GPUBasedValidation = 1 << 4; +/** + * Validate indirect buffer content prior to issuing indirect draws/dispatches. + * + * This validation will transform indirect calls into no-ops if they are not + * valid. For example, @c dispatch_workgroups_indirect arguments must be less + * than the @c max_compute_workgroups_per_dimension device limit. + * + * When using @ref WGPUInstanceFlag_WithEnv, takes value from the + * @c WGPU_VALIDATION_INDIRECT_CALL environment variable. + */ +static const WGPUInstanceFlag WGPUInstanceFlag_ValidationIndirectCall = 1 << 5; +/** + * Enable automatic timestamp normalization. When enabled, + * @c wgpuCommandEncoderResolveQuerySet will automatically normalize timestamps + * to nanoseconds instead of returning raw timestamp values. + * + * This introduces a compute shader into the resolution of query sets. When + * enabled, the timestamp period returned by @ref wgpuQueueGetTimestampPeriod + * will always be @c 1.0. + */ +static const WGPUInstanceFlag WGPUInstanceFlag_AutomaticTimestampNormalization = 1 << 6; +/** + * Use the default flags for the current build configuration. + * In debug builds, this typically enables @ref WGPUInstanceFlag_Debug and + * @ref WGPUInstanceFlag_Validation. + */ +static const WGPUInstanceFlag WGPUInstanceFlag_Default = 1 << 24; +/** + * Convenience alias that enables @ref WGPUInstanceFlag_Debug and + * @ref WGPUInstanceFlag_Validation. + */ +static const WGPUInstanceFlag WGPUInstanceFlag_Debugging = 1 << 25; +/** + * Convenience alias that enables @ref WGPUInstanceFlag_Debug, + * @ref WGPUInstanceFlag_Validation, and + * @ref WGPUInstanceFlag_GPUBasedValidation. + */ +static const WGPUInstanceFlag WGPUInstanceFlag_AdvancedDebugging = 1 << 26; +/** + * Modify the flags based on environment variables. Flags with environment + * variable support (e.g. @c WGPU_DEBUG, @c WGPU_VALIDATION) will be read + * from the process environment and applied on top of the explicitly set flags. + */ +static const WGPUInstanceFlag WGPUInstanceFlag_WithEnv = 1 << 27; static const WGPUInstanceFlag WGPUInstanceFlag_Force32 = 0x7FFFFFFF; -typedef enum WGPUDx12Compiler { +typedef enum WGPUDx12Compiler +{ WGPUDx12Compiler_Undefined = 0x00000000, + /** + * Use the FXC (D3DCompile) shader compiler. + * + * The FXC compiler is old, slow, and unmaintained. However, it doesn't + * require any additional DLLs to be shipped with the application. + */ WGPUDx12Compiler_Fxc = 0x00000001, + /** + * Use the DXC (DirectX Shader Compiler). + * + * The DXC compiler is new, fast, and maintained. However, it requires + * @c dxcompiler.dll to be available. The path to this DLL can be + * specified via @ref WGPUInstanceExtras::dxcPath. + * + * Minimum supported version: v1.8.2502. + * Requires WDDM 2.1 (Windows 10 version 1607). + */ WGPUDx12Compiler_Dxc = 0x00000002, WGPUDx12Compiler_Force32 = 0x7FFFFFFF } WGPUDx12Compiler; -typedef enum WGPUGles3MinorVersion { +typedef enum WGPUGles3MinorVersion +{ WGPUGles3MinorVersion_Automatic = 0x00000000, + /** Request an ES 3.0 context. */ WGPUGles3MinorVersion_Version0 = 0x00000001, + /** Request an ES 3.1 context. */ WGPUGles3MinorVersion_Version1 = 0x00000002, + /** Request an ES 3.2 context. */ WGPUGles3MinorVersion_Version2 = 0x00000003, WGPUGles3MinorVersion_Force32 = 0x7FFFFFFF } WGPUGles3MinorVersion; -typedef enum WGPUPipelineStatisticName { +typedef enum WGPUPipelineStatisticName +{ WGPUPipelineStatisticName_VertexShaderInvocations = 0x00000000, + /** + * Number of times the clipper is invoked. This is also the number of + * triangles output by the vertex shader. + */ WGPUPipelineStatisticName_ClipperInvocations = 0x00000001, + /** + * Number of primitives that are not culled by the clipper. This is the + * number of triangles that are actually on screen and will be rasterized + * and rendered. + */ WGPUPipelineStatisticName_ClipperPrimitivesOut = 0x00000002, + /** + * Number of times the fragment shader is invoked. Accounts for fragment + * shaders running in 2x2 blocks in order to get derivatives. + */ WGPUPipelineStatisticName_FragmentShaderInvocations = 0x00000003, + /** + * Number of times a compute shader is invoked. This will be equivalent + * to the dispatch count times the workgroup size. + */ WGPUPipelineStatisticName_ComputeShaderInvocations = 0x00000004, WGPUPipelineStatisticName_Force32 = 0x7FFFFFFF } WGPUPipelineStatisticName WGPU_ENUM_ATTRIBUTE; -typedef enum WGPUNativeQueryType { +typedef enum WGPUNativeQueryType +{ WGPUNativeQueryType_PipelineStatistics = 0x00030000, WGPUNativeQueryType_Force32 = 0x7FFFFFFF } WGPUNativeQueryType WGPU_ENUM_ATTRIBUTE; -typedef enum WGPUDxcMaxShaderModel { +typedef enum WGPUDxcMaxShaderModel +{ WGPUDxcMaxShaderModel_V6_0 = 0x00000000, + /** Shader Model 6.1 */ WGPUDxcMaxShaderModel_V6_1 = 0x00000001, + /** Shader Model 6.2 */ WGPUDxcMaxShaderModel_V6_2 = 0x00000002, + /** Shader Model 6.3 */ WGPUDxcMaxShaderModel_V6_3 = 0x00000003, + /** Shader Model 6.4 */ WGPUDxcMaxShaderModel_V6_4 = 0x00000004, + /** Shader Model 6.5 */ WGPUDxcMaxShaderModel_V6_5 = 0x00000005, + /** Shader Model 6.6 */ WGPUDxcMaxShaderModel_V6_6 = 0x00000006, + /** Shader Model 6.7 */ WGPUDxcMaxShaderModel_V6_7 = 0x00000007, WGPUDxcMaxShaderModel_Force32 = 0x7FFFFFFF } WGPUDxcMaxShaderModel; -typedef enum WGPUGLFenceBehaviour { +typedef enum WGPUGLFenceBehaviour +{ WGPUGLFenceBehaviour_Normal = 0x00000000, + /** + * Fences are short-circuited to always report completion immediately. + * + * This solves a specific issue that arose due to a bug in wgpu-core that + * made many WebGL programs work when they shouldn't have. If you have + * code that calls @ref wgpuDevicePoll with @c wait=true on WebGL, you + * may need to enable this option for "wait" to behave how you expect. + * + * When this is set, @c wgpuQueueOnCompletedWorkDone callbacks will fire + * the next time the device is polled, not when work is actually done on + * the GPU. + */ WGPUGLFenceBehaviour_AutoFinish = 0x00000001, WGPUGLFenceBehaviour_Force32 = 0x7FFFFFFF } WGPUGLFenceBehaviour; -typedef struct WGPUInstanceExtras { +typedef enum WGPUDx12SwapchainKind +{ + WGPUDx12SwapchainKind_Undefined = 0x00000000, + /** + * Use a DXGI swapchain created directly from the window's HWND. + * + * This does not support transparency but has better support from + * developer tooling such as RenderDoc. + */ + WGPUDx12SwapchainKind_DxgiFromHwnd = 0x00000001, + /** + * Use a DXGI swapchain created from a DirectComposition visual made + * automatically from the window's HWND. + * + * This creates a single @c IDCompositionVisual over the entire window. + * Supports transparency. If you want to manage the composition tree + * yourself, create your own device and composition and pass the relevant + * visual via the surface target. + */ + WGPUDx12SwapchainKind_DxgiFromVisual = 0x00000002, + WGPUDx12SwapchainKind_Force32 = 0x7FFFFFFF +} WGPUDx12SwapchainKind; + +/** + * Discriminant for @ref WGPUNativeDisplayHandle. + * + * Identifies which platform's display connection is stored in the tagged union. + * Use @ref WGPUNativeDisplayHandleType_None (the default when zero-initialized) when + * no display handle is needed. Platforms with no display connection data (Windows, + * macOS, iOS, Android) should use @ref WGPUNativeDisplayHandleType_None. + */ +typedef enum WGPUNativeDisplayHandleType +{ + /** No display handle provided. */ + WGPUNativeDisplayHandleType_None = 0x00000000, + /** X11 display connection via Xlib. See @ref WGPUXlibDisplayHandle. */ + WGPUNativeDisplayHandleType_Xlib = 0x00000001, + /** X11 display connection via XCB. See @ref WGPUXcbDisplayHandle. */ + WGPUNativeDisplayHandleType_Xcb = 0x00000002, + /** Wayland display connection. See @ref WGPUWaylandDisplayHandle. */ + WGPUNativeDisplayHandleType_Wayland = 0x00000003, + WGPUNativeDisplayHandleType_Force32 = 0x7FFFFFFF +} WGPUNativeDisplayHandleType; + +/** + * Xlib display connection data for @ref WGPUNativeDisplayHandle. + */ +typedef struct WGPUXlibDisplayHandle +{ + /** Pointer to the X11 @c Display (i.e. @c Display*). Must not be NULL. */ + void *display; + /** X11 screen number. */ + int screen; +} WGPUXlibDisplayHandle; + +/** + * XCB display connection data for @ref WGPUNativeDisplayHandle. + */ +typedef struct WGPUXcbDisplayHandle +{ + /** Pointer to the XCB connection (i.e. @c xcb_connection_t*). Must not be NULL. */ + void *connection; + /** X11 screen number. */ + int screen; +} WGPUXcbDisplayHandle; + +/** + * Wayland display connection data for @ref WGPUNativeDisplayHandle. + */ +typedef struct WGPUWaylandDisplayHandle +{ + /** Pointer to the Wayland display (i.e. @c wl_display*). Must not be NULL. */ + void *display; +} WGPUWaylandDisplayHandle; + +/** + * Platform display connection, passed as a field of @ref WGPUInstanceExtras. + * + * This is a tagged union. Set @c type to indicate which variant is active, then + * populate the corresponding field in @c data. Zero-initialization yields + * @ref WGPUNativeDisplayHandleType_None, meaning no display handle is provided. + * + * Currently required by the GLES backend when presenting on Wayland. Other + * backends ignore this field. If the instance is created with a display handle, + * all surfaces created from it must use the same display connection. + */ +typedef struct WGPUNativeDisplayHandle +{ + WGPUNativeDisplayHandleType type; + union + { + WGPUXlibDisplayHandle xlib; + WGPUXcbDisplayHandle xcb; + WGPUWaylandDisplayHandle wayland; + } data; +} WGPUNativeDisplayHandle; + +typedef struct WGPUInstanceExtras +{ WGPUChainedStruct chain; + /** + * Which backends to enable. + * Zero (@ref WGPUInstanceBackend_All) enables all backends. + */ WGPUInstanceBackend backends; + /** + * Flags controlling debug/validation behavior. + * See @ref WGPUInstanceFlag for available flags. + */ WGPUInstanceFlag flags; + /** + * Which DX12 shader compiler to use. + * See @ref WGPUDx12Compiler. Ignored on non-DX12 backends. + */ WGPUDx12Compiler dx12ShaderCompiler; + /** + * Which OpenGL ES 3 minor version to request. + * See @ref WGPUGles3MinorVersion. Ignored on non-GL backends. + */ WGPUGles3MinorVersion gles3MinorVersion; + /** + * Controls OpenGL fence synchronization behavior. + * See @ref WGPUGLFenceBehaviour. Ignored on non-GL backends. + */ WGPUGLFenceBehaviour glFenceBehaviour; - WGPUStringView dxilPath; + /** + * File system path to @c dxcompiler.dll for dynamic DXC loading. + * Only used when @c dx12ShaderCompiler is @ref WGPUDx12Compiler_Dxc. + * An empty/undefined string view means the DLL will be searched for + * on the system PATH. + */ WGPUStringView dxcPath; + /** + * Maximum HLSL shader model version that DXC should target. + * See @ref WGPUDxcMaxShaderModel. Only used with the DXC compiler. + */ WGPUDxcMaxShaderModel dxcMaxShaderModel; + /** + * Which DX12 presentation system (swapchain kind) to use. + * See @ref WGPUDx12SwapchainKind. Ignored on non-DX12 backends. + */ + WGPUDx12SwapchainKind dx12PresentationSystem; + + WGPU_NULLABLE const uint8_t *budgetForDeviceCreation; + WGPU_NULLABLE const uint8_t *budgetForDeviceLoss; + + /** + * Platform display connection to associate with this instance. + * Zero-initialized yields @ref WGPUNativeDisplayHandleType_None (no handle). + */ + WGPUNativeDisplayHandle displayHandle; } WGPUInstanceExtras; -typedef struct WGPUDeviceExtras { +typedef struct WGPUDeviceExtras +{ WGPUChainedStruct chain; + /** + * File system path for API trace output. + * + * When set to a non-empty path, wgpu will record all API calls to + * the given directory, which can later be replayed for debugging. + * An empty/undefined string view disables tracing. + */ WGPUStringView tracePath; } WGPUDeviceExtras; -typedef struct WGPUNativeLimits { +typedef struct WGPUNativeLimits +{ /** This struct chain is used as mutable in some places and immutable in others. */ - WGPUChainedStructOut chain; - uint32_t maxPushConstantSize; + WGPUChainedStruct chain; + /** + * Amount of storage available for immediate data, in bytes. + * + * Defaults to 0. A non-zero value requires + * @ref WGPUNativeFeature_Immediates. Expected maximum sizes vary by + * backend: + * - Vulkan: 128-256 bytes + * - DX12: 128 bytes + * - Metal: 4096 bytes + * - OpenGL: ~256 bytes (emulated with uniforms) + */ + uint32_t maxImmediateSize; + /** + * Maximum number of live non-sampler bindings. + * + * Default is 1,000,000. Only meaningful on D3D12. + * + * @b Warning: On integrated GPUs, large values can cause significant + * system RAM consumption. + */ uint32_t maxNonSamplerBindings; + /** + * Maximum number of individual resources within binding arrays per + * shader stage. + */ + uint32_t maxBindingArrayElementsPerShaderStage; } WGPUNativeLimits; -typedef struct WGPUPushConstantRange { - WGPUShaderStage stages; - uint32_t start; - uint32_t end; -} WGPUPushConstantRange; - -typedef struct WGPUPipelineLayoutExtras { +typedef struct WGPUPipelineLayoutExtras +{ WGPUChainedStruct chain; - size_t pushConstantRangeCount; - WGPUPushConstantRange const * pushConstantRanges; + /** + * The number of bytes of immediate data allocated for use in shaders + * attached to this pipeline. + * + * The @c var declarations in the shader must be equal or + * smaller than this size. If this value is non-zero, + * @ref WGPUNativeFeature_Immediates must be enabled. + */ + uint32_t immediateDataSize; } WGPUPipelineLayoutExtras; +/** + * Identifier for a particular call to @ref wgpuQueueSubmitForIndex. + * + * Can be passed to @ref wgpuDevicePoll to block until a particular + * submission has finished execution. + * + * This type is unique to wgpu-native; there is no analogue in the + * WebGPU specification. + */ typedef uint64_t WGPUSubmissionIndex; -typedef struct WGPUShaderDefine { +typedef struct WGPUShaderDefine +{ WGPUStringView name; + /** The value of the preprocessor macro (e.g. @c "1"). */ WGPUStringView value; } WGPUShaderDefine; -typedef struct WGPUShaderSourceGLSL { +typedef struct WGPUShaderSourceGLSL +{ WGPUChainedStruct chain; + /** The shader stage this GLSL source targets. */ WGPUShaderStage stage; + /** GLSL source code. */ WGPUStringView code; + /** Number of entries in @c defines. */ uint32_t defineCount; - WGPUShaderDefine * defines; + WGPUShaderDefine const *defines; } WGPUShaderSourceGLSL; -typedef struct WGPUShaderModuleDescriptorSpirV { +typedef struct WGPUShaderModuleDescriptorSpirV +{ WGPUStringView label; + /** Number of 32-bit words in @c source. */ uint32_t sourceSize; - uint32_t const * source; + uint32_t const *source; } WGPUShaderModuleDescriptorSpirV; -typedef struct WGPURegistryReport { - size_t numAllocated; - size_t numKeptFromUser; - size_t numReleasedFromUser; - size_t elementSize; +typedef struct WGPURegistryReport +{ + size_t numAllocated; + size_t numKeptFromUser; + size_t numReleasedFromUser; + size_t elementSize; } WGPURegistryReport; -typedef struct WGPUHubReport { +typedef struct WGPUHubReport +{ WGPURegistryReport adapters; WGPURegistryReport devices; WGPURegistryReport queues; @@ -222,104 +1104,226 @@ typedef struct WGPUHubReport { WGPURegistryReport samplers; } WGPUHubReport; -typedef struct WGPUGlobalReport { +typedef struct WGPUGlobalReport +{ WGPURegistryReport surfaces; + /** Statistics for all other resource types, grouped by backend hub. */ WGPUHubReport hub; } WGPUGlobalReport; -typedef struct WGPUInstanceEnumerateAdapterOptions { - WGPUChainedStruct const * nextInChain; +typedef struct WGPUInstanceEnumerateAdapterOptions +{ + WGPUChainedStruct const *nextInChain; WGPUInstanceBackend backends; } WGPUInstanceEnumerateAdapterOptions; -typedef struct WGPUBindGroupEntryExtras { +typedef struct WGPUBindGroupEntryExtras +{ WGPUChainedStruct chain; - WGPUBuffer const * buffers; + WGPUBuffer const *buffers; size_t bufferCount; - WGPUSampler const * samplers; + WGPUSampler const *samplers; size_t samplerCount; - WGPUTextureView const * textureViews; + WGPUTextureView const *textureViews; size_t textureViewCount; } WGPUBindGroupEntryExtras; -typedef struct WGPUBindGroupLayoutEntryExtras { +typedef struct WGPUBindGroupLayoutEntryExtras +{ WGPUChainedStruct chain; + /** + * Number of resources in this binding array slot. Corresponds to the + * array size in the shader (e.g. @c binding_array). + */ uint32_t count; } WGPUBindGroupLayoutEntryExtras; -typedef struct WGPUQuerySetDescriptorExtras { +typedef struct WGPUQuerySetDescriptorExtras +{ WGPUChainedStruct chain; - WGPUPipelineStatisticName const * pipelineStatistics; + WGPUPipelineStatisticName const *pipelineStatistics; size_t pipelineStatisticCount; } WGPUQuerySetDescriptorExtras WGPU_STRUCTURE_ATTRIBUTE; -typedef struct WGPUSurfaceConfigurationExtras { +typedef struct WGPUSurfaceConfigurationExtras +{ WGPUChainedStruct chain; + /** + * Desired maximum number of frames in flight (i.e. the number of monitor + * refreshes between @c wgpuSurfaceGetCurrentTexture and presentation). + * + * - 1: Minimize latency (CPU and GPU cannot run in parallel). + * - 2: Balance between latency and throughput (the default). + * - 3+: Maximize throughput. + */ uint32_t desiredMaximumFrameLatency; } WGPUSurfaceConfigurationExtras WGPU_STRUCTURE_ATTRIBUTE; /** * Chained in @ref WGPUSurfaceDescriptor to make a @ref WGPUSurface wrapping a WinUI [`SwapChainPanel`](https://learn.microsoft.com/en-us/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.swapchainpanel). */ -typedef struct WGPUSurfaceSourceSwapChainPanel { +typedef struct WGPUSurfaceSourceSwapChainPanel +{ WGPUChainedStruct chain; /** * A pointer to the [`ISwapChainPanelNative`](https://learn.microsoft.com/en-us/windows/windows-app-sdk/api/win32/microsoft.ui.xaml.media.dxinterop/nn-microsoft-ui-xaml-media-dxinterop-iswapchainpanelnative) * interface of the SwapChainPanel that will be wrapped by the @ref WGPUSurface. */ - void * panelNative; + void *panelNative; } WGPUSurfaceSourceSwapChainPanel WGPU_STRUCTURE_ATTRIBUTE; -typedef void (*WGPULogCallback)(WGPULogLevel level, WGPUStringView message, void * userdata); +typedef enum WGPUPolygonMode +{ + WGPUPolygonMode_Fill = 0, + /** + * Polygons are drawn as line segments (wireframe). + * Requires @ref WGPUNativeFeature_PolygonModeLine. + */ + WGPUPolygonMode_Line = 1, + /** + * Polygons are drawn as points (vertices only). + * Requires @ref WGPUNativeFeature_PolygonModePoint. + */ + WGPUPolygonMode_Point = 2, +} WGPUPolygonMode; -typedef enum WGPUNativeTextureFormat { +typedef struct WGPUPrimitiveStateExtras +{ + WGPUChainedStruct chain; + /** + * Controls the way each polygon is rasterized. + * See @ref WGPUPolygonMode. Defaults to @ref WGPUPolygonMode_Fill. + */ + WGPUPolygonMode polygonMode; + /** + * If set to true, the primitives are rendered with conservative + * overestimation. Only valid when @c polygonMode is + * @ref WGPUPolygonMode_Fill. + * Requires @ref WGPUNativeFeature_ConservativeRasterization. + */ + WGPUBool conservative; +} WGPUPrimitiveStateExtras WGPU_STRUCTURE_ATTRIBUTE; + +typedef void (*WGPULogCallback)(WGPULogLevel level, WGPUStringView message, void *userdata); + +typedef enum WGPUNativeTextureFormat +{ // From Features::TEXTURE_FORMAT_16BIT_NORM WGPUNativeTextureFormat_R16Unorm = 0x00030001, + /** + * Red channel only. 16-bit signed integer per channel. + * [-32767, 32767] converted to/from float [-1, 1] in shader. + * Requires @ref WGPUNativeFeature_TextureFormat16bitNorm. + */ WGPUNativeTextureFormat_R16Snorm = 0x00030002, + /** + * Red and green channels. 16-bit unsigned integer per channel. + * [0, 65535] converted to/from float [0, 1] in shader. + * Requires @ref WGPUNativeFeature_TextureFormat16bitNorm. + */ WGPUNativeTextureFormat_Rg16Unorm = 0x00030003, + /** + * Red and green channels. 16-bit signed integer per channel. + * [-32767, 32767] converted to/from float [-1, 1] in shader. + * Requires @ref WGPUNativeFeature_TextureFormat16bitNorm. + */ WGPUNativeTextureFormat_Rg16Snorm = 0x00030004, + /** + * Red, green, blue, and alpha channels. 16-bit unsigned integer per channel. + * [0, 65535] converted to/from float [0, 1] in shader. + * Requires @ref WGPUNativeFeature_TextureFormat16bitNorm. + */ WGPUNativeTextureFormat_Rgba16Unorm = 0x00030005, + /** + * Red, green, blue, and alpha channels. 16-bit signed integer per channel. + * [-32767, 32767] converted to/from float [-1, 1] in shader. + * Requires @ref WGPUNativeFeature_TextureFormat16bitNorm. + */ WGPUNativeTextureFormat_Rgba16Snorm = 0x00030006, - // From Features::TEXTURE_FORMAT_NV12 + /** + * YUV 4:2:0 chroma subsampled format (NV12). + * Plane 0 contains R8Unorm luminance (Y), Plane 1 contains Rg8Unorm + * chrominance (UV) at half width and half height. + * Requires @ref WGPUNativeFeature_TextureFormatNv12. + */ WGPUNativeTextureFormat_NV12 = 0x00030007, + /** + * YUV 4:2:0 with 10 bits used from 16-bit channels (P010). + * Plane 0 contains R16Unorm luminance (Y), Plane 1 contains Rg16Unorm + * chrominance (UV) at half width and half height. + */ + WGPUNativeTextureFormat_P010 = 0x00030008, } WGPUNativeTextureFormat; #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif -void wgpuGenerateReport(WGPUInstance instance, WGPUGlobalReport * report); -size_t wgpuInstanceEnumerateAdapters(WGPUInstance instance, WGPU_NULLABLE WGPUInstanceEnumerateAdapterOptions const * options, WGPUAdapter * adapters); + void wgpuGenerateReport(WGPUInstance instance, WGPUGlobalReport *report); + size_t wgpuInstanceEnumerateAdapters(WGPUInstance instance, WGPU_NULLABLE WGPUInstanceEnumerateAdapterOptions const *options, WGPUAdapter *adapters); -WGPUSubmissionIndex wgpuQueueSubmitForIndex(WGPUQueue queue, size_t commandCount, WGPUCommandBuffer const * commands); + WGPUSubmissionIndex wgpuQueueSubmitForIndex(WGPUQueue queue, size_t commandCount, WGPUCommandBuffer const *commands); + float wgpuQueueGetTimestampPeriod(WGPUQueue queue); -// Returns true if the queue is empty, or false if there are more queue submissions still in flight. -WGPUBool wgpuDevicePoll(WGPUDevice device, WGPUBool wait, WGPU_NULLABLE WGPUSubmissionIndex const * submissionIndex); -WGPUShaderModule wgpuDeviceCreateShaderModuleSpirV(WGPUDevice device, WGPUShaderModuleDescriptorSpirV const * descriptor); + // Returns true if the queue is empty, or false if there are more queue submissions still in flight. + WGPUBool wgpuDevicePoll(WGPUDevice device, WGPUBool wait, WGPU_NULLABLE WGPUSubmissionIndex const *submissionIndex); + WGPUShaderModule wgpuDeviceCreateShaderModuleSpirV(WGPUDevice device, WGPUShaderModuleDescriptorSpirV const *descriptor); -void wgpuSetLogCallback(WGPULogCallback callback, void * userdata); + void wgpuSetLogCallback(WGPULogCallback callback, void *userdata); -void wgpuSetLogLevel(WGPULogLevel level); + void wgpuSetLogLevel(WGPULogLevel level); -uint32_t wgpuGetVersion(void); + uint32_t wgpuGetVersion(void); -void wgpuRenderPassEncoderSetPushConstants(WGPURenderPassEncoder encoder, WGPUShaderStage stages, uint32_t offset, uint32_t sizeBytes, void const * data); -void wgpuComputePassEncoderSetPushConstants(WGPUComputePassEncoder encoder, uint32_t offset, uint32_t sizeBytes, void const * data); -void wgpuRenderBundleEncoderSetPushConstants(WGPURenderBundleEncoder encoder, WGPUShaderStage stages, uint32_t offset, uint32_t sizeBytes, void const * data); + /** + * Returns the backend-native `id` as an opaque pointer. + * + * The returned pointer is borrowed and remains valid only while `device` is alive. + * Ownership is retained by wgpu-native; callers must not release or destroy it. + * Returns NULL when the active backend is not Metal or when the handle is unavailable. + */ + void *wgpuDeviceGetNativeMetalDevice(WGPUDevice device); -void wgpuRenderPassEncoderMultiDrawIndirect(WGPURenderPassEncoder encoder, WGPUBuffer buffer, uint64_t offset, uint32_t count); -void wgpuRenderPassEncoderMultiDrawIndexedIndirect(WGPURenderPassEncoder encoder, WGPUBuffer buffer, uint64_t offset, uint32_t count); + /** + * Returns the backend-native `id` as an opaque pointer. + * + * The returned pointer is borrowed and remains valid only while `queue` is alive. + * Ownership is retained by wgpu-native; callers must not release or destroy it. + * Returns NULL when the active backend is not Metal or when the handle is unavailable. + */ + void *wgpuQueueGetNativeMetalCommandQueue(WGPUQueue queue); -void wgpuRenderPassEncoderMultiDrawIndirectCount(WGPURenderPassEncoder encoder, WGPUBuffer buffer, uint64_t offset, WGPUBuffer count_buffer, uint64_t count_buffer_offset, uint32_t max_count); -void wgpuRenderPassEncoderMultiDrawIndexedIndirectCount(WGPURenderPassEncoder encoder, WGPUBuffer buffer, uint64_t offset, WGPUBuffer count_buffer, uint64_t count_buffer_offset, uint32_t max_count); + /** + * Returns the backend-native `id` as an opaque pointer. + * + * The returned pointer is borrowed and remains valid only while `texture` is alive. + * Ownership is retained by wgpu-native; callers must not release or destroy it. + * Returns NULL when the active backend is not Metal or when the handle is unavailable. + */ + void *wgpuTextureGetNativeMetalTexture(WGPUTexture texture); -void wgpuComputePassEncoderBeginPipelineStatisticsQuery(WGPUComputePassEncoder computePassEncoder, WGPUQuerySet querySet, uint32_t queryIndex); -void wgpuComputePassEncoderEndPipelineStatisticsQuery(WGPUComputePassEncoder computePassEncoder); -void wgpuRenderPassEncoderBeginPipelineStatisticsQuery(WGPURenderPassEncoder renderPassEncoder, WGPUQuerySet querySet, uint32_t queryIndex); -void wgpuRenderPassEncoderEndPipelineStatisticsQuery(WGPURenderPassEncoder renderPassEncoder); + void wgpuRenderPassEncoderSetImmediates(WGPURenderPassEncoder encoder, uint32_t offset, uint32_t sizeBytes, void const *data); + void wgpuComputePassEncoderSetImmediates(WGPUComputePassEncoder encoder, uint32_t offset, uint32_t sizeBytes, void const *data); + void wgpuRenderBundleEncoderSetImmediates(WGPURenderBundleEncoder encoder, uint32_t offset, uint32_t sizeBytes, void const *data); -void wgpuComputePassEncoderWriteTimestamp(WGPUComputePassEncoder computePassEncoder, WGPUQuerySet querySet, uint32_t queryIndex); -void wgpuRenderPassEncoderWriteTimestamp(WGPURenderPassEncoder renderPassEncoder, WGPUQuerySet querySet, uint32_t queryIndex); + void wgpuRenderPassEncoderMultiDrawIndirect(WGPURenderPassEncoder encoder, WGPUBuffer buffer, uint64_t offset, uint32_t count); + void wgpuRenderPassEncoderMultiDrawIndexedIndirect(WGPURenderPassEncoder encoder, WGPUBuffer buffer, uint64_t offset, uint32_t count); + + void wgpuRenderPassEncoderMultiDrawIndirectCount(WGPURenderPassEncoder encoder, WGPUBuffer buffer, uint64_t offset, WGPUBuffer count_buffer, uint64_t count_buffer_offset, uint32_t max_count); + void wgpuRenderPassEncoderMultiDrawIndexedIndirectCount(WGPURenderPassEncoder encoder, WGPUBuffer buffer, uint64_t offset, WGPUBuffer count_buffer, uint64_t count_buffer_offset, uint32_t max_count); + + void wgpuComputePassEncoderBeginPipelineStatisticsQuery(WGPUComputePassEncoder computePassEncoder, WGPUQuerySet querySet, uint32_t queryIndex); + void wgpuComputePassEncoderEndPipelineStatisticsQuery(WGPUComputePassEncoder computePassEncoder); + void wgpuRenderPassEncoderBeginPipelineStatisticsQuery(WGPURenderPassEncoder renderPassEncoder, WGPUQuerySet querySet, uint32_t queryIndex); + void wgpuRenderPassEncoderEndPipelineStatisticsQuery(WGPURenderPassEncoder renderPassEncoder); + + void wgpuComputePassEncoderWriteTimestamp(WGPUComputePassEncoder computePassEncoder, WGPUQuerySet querySet, uint32_t queryIndex); + void wgpuRenderPassEncoderWriteTimestamp(WGPURenderPassEncoder renderPassEncoder, WGPUQuerySet querySet, uint32_t queryIndex); + + // Returns true if the capture was successfully started, or false if it failed to start or is not supported on the current platform. + WGPUBool wgpuDeviceStartGraphicsDebuggerCapture(WGPUDevice device); + void wgpuDeviceStopGraphicsDebuggerCapture(WGPUDevice device); #ifdef __cplusplus } // extern "C" diff --git a/libs/wgpu/lib/Linux/libwgpu_native.a b/libs/wgpu/lib/Linux/libwgpu_native.a index 923d594d5b8268f750c5aef93c45eed22f2d859c..5cd5982d3622e134b304970eae9a7a373ab30792 100644 GIT binary patch literal 17310204 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 z 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�{Y*C=!cALwLR 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