gpu: implement Limits and conversion

Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
This commit is contained in:
Stephen Gutekanst 2022-03-07 23:08:54 -07:00 committed by Stephen Gutekanst
parent 39ab0105a9
commit 4d97c52353
3 changed files with 60 additions and 39 deletions

View file

@ -1,37 +1,27 @@
// TODO: docs
// TODO:
// typedef struct WGPUSupportedLimits {
// WGPUChainedStructOut * nextInChain;
// WGPULimits limits;
// } WGPUSupportedLimits;
// TODO:
// typedef struct WGPULimits {
// uint32_t maxTextureDimension1D;
// uint32_t maxTextureDimension2D;
// uint32_t maxTextureDimension3D;
// uint32_t maxTextureArrayLayers;
// uint32_t maxBindGroups;
// 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;
// uint32_t maxVertexAttributes;
// uint32_t maxVertexBufferArrayStride;
// uint32_t maxInterStageShaderComponents;
// uint32_t maxComputeWorkgroupStorageSize;
// uint32_t maxComputeInvocationsPerWorkgroup;
// uint32_t maxComputeWorkgroupSizeX;
// uint32_t maxComputeWorkgroupSizeY;
// uint32_t maxComputeWorkgroupSizeZ;
// uint32_t maxComputeWorkgroupsPerDimension;
// } WGPULimits;
max_texture_dimension_1d: u32,
max_texture_dimension_2d: u32,
max_texture_dimension_3d: u32,
max_texture_array_layers: u32,
max_bind_groups: u32,
max_dynamic_uniform_buffers_per_pipeline_layout: u32,
max_dynamic_storage_buffers_per_pipeline_layout: u32,
max_sampled_textures_per_shader_stage: u32,
max_samplers_per_shader_stage: u32,
max_storage_buffers_per_shader_stage: u32,
max_storage_textures_per_shader_stage: u32,
max_uniform_buffers_per_shader_stage: u32,
max_uniform_buffer_binding_size: u64,
max_storage_buffer_binding_size: u64,
min_uniform_buffer_offset_alignment: u32,
min_storage_buffer_offset_alignment: u32,
max_vertex_buffers: u32,
max_vertex_attributes: u32,
max_vertex_buffer_array_stride: u32,
max_inter_stage_shader_components: u32,
max_compute_workgroup_storage_size: u32,
max_compute_invocations_per_workgroup: u32,
max_compute_workgroup_size_x: u32,
max_compute_workgroup_size_y: u32,
max_compute_workgroup_size_z: u32,
max_compute_workgroups_per_dimension: u32,

View file

@ -300,10 +300,36 @@ const device_vtable = Device.VTable{
}).release,
};
// TODO: maybe make Limits an extern struct that can be cast?
fn convertLimits(l: Limits) c.WGPULimits {
// TODO: implement!
_ = l;
return std.mem.zeroes(c.WGPULimits);
return .{
.maxTextureDimension1D = l.max_texture_dimension_1d,
.maxTextureDimension2D = l.max_texture_dimension_2d,
.maxTextureDimension3D = l.max_texture_dimension_3d,
.maxTextureArrayLayers = l.max_texture_array_layers,
.maxBindGroups = l.max_bind_groups,
.maxDynamicUniformBuffersPerPipelineLayout = l.max_dynamic_uniform_buffers_per_pipeline_layout,
.maxDynamicStorageBuffersPerPipelineLayout = l.max_dynamic_storage_buffers_per_pipeline_layout,
.maxSampledTexturesPerShaderStage = l.max_sampled_textures_per_shader_stage,
.maxSamplersPerShaderStage = l.max_samplers_per_shader_stage,
.maxStorageBuffersPerShaderStage = l.max_storage_buffers_per_shader_stage,
.maxStorageTexturesPerShaderStage = l.max_storage_textures_per_shader_stage,
.maxUniformBuffersPerShaderStage = l.max_uniform_buffers_per_shader_stage,
.maxUniformBufferBindingSize = l.max_uniform_buffer_binding_size,
.maxStorageBufferBindingSize = l.max_storage_buffer_binding_size,
.minUniformBufferOffsetAlignment = l.min_uniform_buffer_offset_alignment,
.minStorageBufferOffsetAlignment = l.min_storage_buffer_offset_alignment,
.maxVertexBuffers = l.max_vertex_buffers,
.maxVertexAttributes = l.max_vertex_attributes,
.maxVertexBufferArrayStride = l.max_vertex_buffer_array_stride,
.maxInterStageShaderComponents = l.max_inter_stage_shader_components,
.maxComputeWorkgroupStorageSize = l.max_compute_workgroup_storage_size,
.maxComputeInvocationsPerWorkgroup = l.max_compute_invocations_per_workgroup,
.maxComputeWorkgroupSizeX = l.max_compute_workgroup_size_x,
.maxComputeWorkgroupSizeY = l.max_compute_workgroup_size_y,
.maxComputeWorkgroupSizeZ = l.max_compute_workgroup_size_z,
.maxComputeWorkgroupsPerDimension = l.max_compute_workgroups_per_dimension,
};
}
test "syntax" {

View file

@ -994,6 +994,11 @@ typedef struct WGPUComputePipelineDescriptor {
WGPUProgrammableStageDescriptor compute;
} WGPUComputePipelineDescriptor;
typedef struct WGPUSupportedLimits {
WGPUChainedStructOut * nextInChain;
WGPULimits limits;
} WGPUSupportedLimits;
typedef struct WGPUDeviceProperties {
uint32_t deviceID;
uint32_t vendorID;