| 239 | } |
| 240 | |
| 241 | bool GPUDeviceWebGPU::Init() |
| 242 | { |
| 243 | // Init device limits |
| 244 | Array<WGPUFeatureName, FixedAllocation<32>> features; |
| 245 | #define CHECK_FEATURE(feature) if (wgpuAdapterHasFeature(Adapter->Adapter, feature)) features.Add(feature) |
| 246 | CHECK_FEATURE(WGPUFeatureName_CoreFeaturesAndLimits); |
| 247 | CHECK_FEATURE(WGPUFeatureName_DepthClipControl); |
| 248 | CHECK_FEATURE(WGPUFeatureName_Depth32FloatStencil8); |
| 249 | CHECK_FEATURE(WGPUFeatureName_TextureCompressionBC); |
| 250 | CHECK_FEATURE(WGPUFeatureName_TextureCompressionBCSliced3D); |
| 251 | CHECK_FEATURE(WGPUFeatureName_TextureCompressionETC2); |
| 252 | CHECK_FEATURE(WGPUFeatureName_TextureCompressionASTC); |
| 253 | CHECK_FEATURE(WGPUFeatureName_TextureCompressionASTCSliced3D); |
| 254 | CHECK_FEATURE(WGPUFeatureName_TimestampQuery); |
| 255 | CHECK_FEATURE(WGPUFeatureName_IndirectFirstInstance); |
| 256 | CHECK_FEATURE(WGPUFeatureName_RG11B10UfloatRenderable); |
| 257 | CHECK_FEATURE(WGPUFeatureName_BGRA8UnormStorage); |
| 258 | CHECK_FEATURE(WGPUFeatureName_Float32Filterable); |
| 259 | CHECK_FEATURE(WGPUFeatureName_Float32Blendable); |
| 260 | CHECK_FEATURE(WGPUFeatureName_ClipDistances); |
| 261 | CHECK_FEATURE(WGPUFeatureName_TextureFormatsTier1); |
| 262 | CHECK_FEATURE(WGPUFeatureName_TextureFormatsTier2); |
| 263 | CHECK_FEATURE(WGPUFeatureName_PrimitiveIndex); |
| 264 | CHECK_FEATURE(WGPUFeatureName_MultiDrawIndirect); |
| 265 | #undef CHECK_FEATURE |
| 266 | #if BUILD_DEBUG |
| 267 | LOG(Info, "WebGPU features:"); |
| 268 | #define LOG_FEATURE(feature) if (features.Contains(feature)) LOG(Info, " > {}", TEXT(#feature)) |
| 269 | LOG_FEATURE(WGPUFeatureName_CoreFeaturesAndLimits); |
| 270 | LOG_FEATURE(WGPUFeatureName_DepthClipControl); |
| 271 | LOG_FEATURE(WGPUFeatureName_Depth32FloatStencil8); |
| 272 | LOG_FEATURE(WGPUFeatureName_TextureCompressionBC); |
| 273 | LOG_FEATURE(WGPUFeatureName_TextureCompressionBCSliced3D); |
| 274 | LOG_FEATURE(WGPUFeatureName_TextureCompressionETC2); |
| 275 | LOG_FEATURE(WGPUFeatureName_TextureCompressionASTC); |
| 276 | LOG_FEATURE(WGPUFeatureName_TextureCompressionASTCSliced3D); |
| 277 | LOG_FEATURE(WGPUFeatureName_TimestampQuery); |
| 278 | LOG_FEATURE(WGPUFeatureName_IndirectFirstInstance); |
| 279 | LOG_FEATURE(WGPUFeatureName_RG11B10UfloatRenderable); |
| 280 | LOG_FEATURE(WGPUFeatureName_BGRA8UnormStorage); |
| 281 | LOG_FEATURE(WGPUFeatureName_Float32Filterable); |
| 282 | LOG_FEATURE(WGPUFeatureName_Float32Blendable); |
| 283 | LOG_FEATURE(WGPUFeatureName_ClipDistances); |
| 284 | LOG_FEATURE(WGPUFeatureName_TextureFormatsTier1); |
| 285 | LOG_FEATURE(WGPUFeatureName_TextureFormatsTier2); |
| 286 | LOG_FEATURE(WGPUFeatureName_PrimitiveIndex); |
| 287 | LOG_FEATURE(WGPUFeatureName_MultiDrawIndirect); |
| 288 | #undef LOG_FEATURE |
| 289 | #endif |
| 290 | for (int32 i = 0; i < (int32)PixelFormat::MAX; i++) |
| 291 | FeaturesPerFormat[i] = FormatFeatures(MSAALevel::None, FormatSupport::None); |
| 292 | WGPULimits limits = WGPU_LIMITS_INIT; |
| 293 | if (wgpuAdapterGetLimits(Adapter->Adapter, &limits) == WGPUStatus_Success) |
| 294 | { |
| 295 | MinUniformBufferOffsetAlignment = limits.minUniformBufferOffsetAlignment; |
| 296 | TimestampQuery = features.Contains(WGPUFeatureName_TimestampQuery); |
| 297 | Limits.HasCompute = |
| 298 | limits.maxStorageBuffersPerShaderStage >= GPU_MAX_UA_BINDED && |
no test coverage detected