Support native limits in wgpu device creation

This commit is contained in:
Nikita Lisitsa 2024-11-14 13:48:40 +03:00
parent f986f0d4b1
commit fbb032fe63
4 changed files with 29 additions and 1 deletions

View file

@ -26,6 +26,7 @@ namespace psemek::app
#if defined(PSEMEK_GRAPHICS_API_WEBGPU)
std::vector<wgpu::feature> required_features;
std::optional<wgpu::limits> required_limits;
std::optional<wgpu::native_limits> required_native_limits;
#endif
};

View file

@ -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)

View file

@ -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);
}

View file

@ -1,5 +1,6 @@
#include <psemek/wgpu/device.hpp>
#include <psemek/wgpu/external/webgpu.h>
#include <psemek/wgpu/external/wgpu.h>
#include <cstring>
@ -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);
}
}