diff --git a/libs/app/include/psemek/app/application.hpp b/libs/app/include/psemek/app/application.hpp index 93fc9913..b9cd1f36 100644 --- a/libs/app/include/psemek/app/application.hpp +++ b/libs/app/include/psemek/app/application.hpp @@ -26,6 +26,7 @@ namespace psemek::app #if defined(PSEMEK_GRAPHICS_API_WEBGPU) std::vector required_features; std::optional required_limits; + std::optional required_native_limits; #endif }; diff --git a/libs/sdl2/source/window.cpp b/libs/sdl2/source/window.cpp index c541938c..6b57a07b 100644 --- a/libs/sdl2/source/window.cpp +++ b/libs/sdl2/source/window.cpp @@ -106,9 +106,18 @@ namespace psemek::sdl2 wgpu::device::descriptor device_descriptor { .required_features = options.required_features, - .required_limits = options.required_limits ? std::optional(wgpu::device::required_limits{.limits = *options.required_limits}) : std::nullopt, + .required_limits = std::nullopt, }; + if (options.required_limits || options.required_native_limits) + device_descriptor.required_limits = wgpu::device::required_limits{}; + + if (options.required_limits) + device_descriptor.required_limits->limits = *options.required_limits; + + if (options.required_native_limits) + device_descriptor.required_limits->chain.push_back(wgpu::native_limits{*options.required_native_limits}); + wgpu_adapter_.request_device(device_descriptor, [this](wgpu::device::request_status status, wgpu::device device_in, std::string const & message) { if (status != wgpu::device::request_status::success) diff --git a/libs/wgpu/include/psemek/wgpu/device.hpp b/libs/wgpu/include/psemek/wgpu/device.hpp index 562cbc31..27fef999 100644 --- a/libs/wgpu/include/psemek/wgpu/device.hpp +++ b/libs/wgpu/include/psemek/wgpu/device.hpp @@ -83,6 +83,12 @@ namespace psemek::wgpu std::uint32_t max_compute_workgroups_per_dimension = 65535; }; + struct native_limits + { + std::uint32_t max_push_constant_size = 0; + std::uint32_t max_non_sampler_bindings = 0; + }; + enum class create_pipeline_async_status : std::uint32_t { success = 0x00000000, @@ -186,4 +192,6 @@ namespace psemek::wgpu friend struct adapter; }; + detail::chained_struct_ptr to_chained_struct(native_limits && value); + } diff --git a/libs/wgpu/source/device.cpp b/libs/wgpu/source/device.cpp index a9c9895b..bc4487c9 100644 --- a/libs/wgpu/source/device.cpp +++ b/libs/wgpu/source/device.cpp @@ -1,5 +1,6 @@ #include #include +#include #include @@ -452,4 +453,13 @@ namespace psemek::wgpu wgpuDeviceRelease((WGPUDevice)ptr); } + detail::chained_struct_ptr to_chained_struct(native_limits && value) + { + WGPURequiredLimitsExtras chained = {}; + chained.chain.sType = (WGPUSType)WGPUSType_RequiredLimitsExtras; + static_assert(sizeof(WGPUNativeLimits) == sizeof(native_limits)); + std::memcpy(&chained.limits, &value, sizeof(value)); + return detail::make_chained_struct(chained); + } + }