Support native limits in wgpu device creation
This commit is contained in:
parent
f986f0d4b1
commit
fbb032fe63
4 changed files with 29 additions and 1 deletions
|
|
@ -26,6 +26,7 @@ namespace psemek::app
|
||||||
#if defined(PSEMEK_GRAPHICS_API_WEBGPU)
|
#if defined(PSEMEK_GRAPHICS_API_WEBGPU)
|
||||||
std::vector<wgpu::feature> required_features;
|
std::vector<wgpu::feature> required_features;
|
||||||
std::optional<wgpu::limits> required_limits;
|
std::optional<wgpu::limits> required_limits;
|
||||||
|
std::optional<wgpu::native_limits> required_native_limits;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -106,9 +106,18 @@ namespace psemek::sdl2
|
||||||
wgpu::device::descriptor device_descriptor
|
wgpu::device::descriptor device_descriptor
|
||||||
{
|
{
|
||||||
.required_features = options.required_features,
|
.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)
|
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)
|
if (status != wgpu::device::request_status::success)
|
||||||
|
|
|
||||||
|
|
@ -83,6 +83,12 @@ namespace psemek::wgpu
|
||||||
std::uint32_t max_compute_workgroups_per_dimension = 65535;
|
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
|
enum class create_pipeline_async_status : std::uint32_t
|
||||||
{
|
{
|
||||||
success = 0x00000000,
|
success = 0x00000000,
|
||||||
|
|
@ -186,4 +192,6 @@ namespace psemek::wgpu
|
||||||
friend struct adapter;
|
friend struct adapter;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
detail::chained_struct_ptr to_chained_struct(native_limits && value);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
#include <psemek/wgpu/device.hpp>
|
#include <psemek/wgpu/device.hpp>
|
||||||
#include <psemek/wgpu/external/webgpu.h>
|
#include <psemek/wgpu/external/webgpu.h>
|
||||||
|
#include <psemek/wgpu/external/wgpu.h>
|
||||||
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
|
|
@ -452,4 +453,13 @@ namespace psemek::wgpu
|
||||||
wgpuDeviceRelease((WGPUDevice)ptr);
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue