From a521ec38f04972227370ee19cb766304812f5de5 Mon Sep 17 00:00:00 2001 From: Zhixing Zhang Date: Wed, 3 Mar 2021 15:30:39 -0500 Subject: [PATCH 1/5] Enabled WgpuLimits & moved WgpuFeatures for consistency --- crates/bevy_wgpu/src/lib.rs | 81 +++++++++------------ crates/bevy_wgpu/src/wgpu_renderer.rs | 9 ++- crates/bevy_wgpu/src/wgpu_type_converter.rs | 63 ++++++++++++++++ 3 files changed, 104 insertions(+), 49 deletions(-) diff --git a/crates/bevy_wgpu/src/lib.rs b/crates/bevy_wgpu/src/lib.rs index 2d4156d16ff8c..d6550d94447b1 100644 --- a/crates/bevy_wgpu/src/lib.rs +++ b/crates/bevy_wgpu/src/lib.rs @@ -41,54 +41,43 @@ pub enum WgpuFeature { VertexAttribute64Bit, } -impl From for wgpu::Features { - fn from(value: WgpuFeature) -> Self { - match value { - WgpuFeature::DepthClamping => wgpu::Features::DEPTH_CLAMPING, - WgpuFeature::TextureCompressionBc => wgpu::Features::TEXTURE_COMPRESSION_BC, - WgpuFeature::TimestampQuery => wgpu::Features::TIMESTAMP_QUERY, - WgpuFeature::PipelineStatisticsQuery => wgpu::Features::PIPELINE_STATISTICS_QUERY, - WgpuFeature::MappablePrimaryBuffers => wgpu::Features::MAPPABLE_PRIMARY_BUFFERS, - WgpuFeature::SampledTextureBindingArray => { - wgpu::Features::SAMPLED_TEXTURE_BINDING_ARRAY - } - WgpuFeature::SampledTextureArrayDynamicIndexing => { - wgpu::Features::SAMPLED_TEXTURE_ARRAY_DYNAMIC_INDEXING - } - WgpuFeature::SampledTextureArrayNonUniformIndexing => { - wgpu::Features::SAMPLED_TEXTURE_ARRAY_NON_UNIFORM_INDEXING - } - WgpuFeature::UnsizedBindingArray => wgpu::Features::UNSIZED_BINDING_ARRAY, - WgpuFeature::MultiDrawIndirect => wgpu::Features::MULTI_DRAW_INDIRECT, - WgpuFeature::MultiDrawIndirectCount => wgpu::Features::MULTI_DRAW_INDIRECT_COUNT, - WgpuFeature::PushConstants => wgpu::Features::PUSH_CONSTANTS, - WgpuFeature::AddressModeClampToBorder => wgpu::Features::ADDRESS_MODE_CLAMP_TO_BORDER, - WgpuFeature::NonFillPolygonMode => wgpu::Features::NON_FILL_POLYGON_MODE, - WgpuFeature::TextureCompressionEtc2 => wgpu::Features::TEXTURE_COMPRESSION_ETC2, - WgpuFeature::TextureCompressionAstcLdr => wgpu::Features::TEXTURE_COMPRESSION_ASTC_LDR, - WgpuFeature::TextureAdapterSpecificFormatFeatures => { - wgpu::Features::TEXTURE_ADAPTER_SPECIFIC_FORMAT_FEATURES - } - WgpuFeature::ShaderFloat64 => wgpu::Features::SHADER_FLOAT64, - WgpuFeature::VertexAttribute64Bit => wgpu::Features::VERTEX_ATTRIBUTE_64BIT, - } - } +#[derive(Default, Clone)] +pub struct WgpuFeatures { + pub features: Vec, } -impl From for wgpu::Features { - fn from(features: WgpuFeatures) -> Self { - features - .features - .iter() - .fold(wgpu::Features::empty(), |wgpu_features, feature| { - wgpu_features | (*feature).into() - }) - } +#[derive(Debug, Clone)] +pub struct WgpuLimits { + pub max_bind_groups: u32, + pub max_dynamic_uniform_buffers_per_pipeline_layout: u32, + pub max_dynamic_storage_buffers_per_pipeline_layout: u32, + pub max_sampled_textures_per_shader_stage: u32, + pub max_samplers_per_shader_stage: u32, + pub max_storage_buffers_per_shader_stage: u32, + pub max_storage_textures_per_shader_stage: u32, + pub max_uniform_buffers_per_shader_stage: u32, + pub max_uniform_buffer_binding_size: u32, + pub max_push_constant_size: u32, } -#[derive(Default, Clone)] -pub struct WgpuFeatures { - pub features: Vec, +impl Default for WgpuLimits { + fn default() -> Self { + let default = wgpu::Limits::default(); + WgpuLimits { + max_bind_groups: default.max_bind_groups, + max_dynamic_uniform_buffers_per_pipeline_layout: default + .max_dynamic_uniform_buffers_per_pipeline_layout, + max_dynamic_storage_buffers_per_pipeline_layout: default + .max_dynamic_storage_buffers_per_pipeline_layout, + max_sampled_textures_per_shader_stage: default.max_sampled_textures_per_shader_stage, + max_samplers_per_shader_stage: default.max_samplers_per_shader_stage, + max_storage_buffers_per_shader_stage: default.max_storage_buffers_per_shader_stage, + max_storage_textures_per_shader_stage: default.max_storage_textures_per_shader_stage, + max_uniform_buffers_per_shader_stage: default.max_uniform_buffers_per_shader_stage, + max_uniform_buffer_binding_size: default.max_uniform_buffer_binding_size, + max_push_constant_size: default.max_push_constant_size, + } + } } #[derive(Default)] @@ -119,10 +108,12 @@ pub fn get_wgpu_render_system(resources: &mut Resources) -> impl FnMut(&mut Worl } #[derive(Default, Clone)] -pub struct WgpuOptions { +pub struct WgpuOptions<'a> { + pub name: Option<&'a str>, pub backend: WgpuBackend, pub power_pref: WgpuPowerOptions, pub features: WgpuFeatures, + pub limits: WgpuLimits, } #[derive(Clone)] diff --git a/crates/bevy_wgpu/src/wgpu_renderer.rs b/crates/bevy_wgpu/src/wgpu_renderer.rs index 1491c9894c379..c1873d9ff2c7b 100644 --- a/crates/bevy_wgpu/src/wgpu_renderer.rs +++ b/crates/bevy_wgpu/src/wgpu_renderer.rs @@ -10,6 +10,7 @@ use bevy_render::{ }; use bevy_window::{WindowCreated, WindowResized, Windows}; use std::{ops::Deref, sync::Arc}; +use crate::wgpu_type_converter::WgpuInto; pub struct WgpuRenderer { pub instance: wgpu::Instance, @@ -21,7 +22,7 @@ pub struct WgpuRenderer { } impl WgpuRenderer { - pub async fn new(options: WgpuOptions) -> Self { + pub async fn new(options: WgpuOptions<'_>) -> Self { let backend = match options.backend { WgpuBackend::Auto => wgpu::BackendBit::PRIMARY, WgpuBackend::Vulkan => wgpu::BackendBit::VULKAN, @@ -53,9 +54,9 @@ impl WgpuRenderer { let (device, queue) = adapter .request_device( &wgpu::DeviceDescriptor { - label: None, - features: options.features.into(), - limits: wgpu::Limits::default(), + label: options.name, + features: options.features.wgpu_into(), + limits: options.limits.wgpu_into(), }, trace_path, ) diff --git a/crates/bevy_wgpu/src/wgpu_type_converter.rs b/crates/bevy_wgpu/src/wgpu_type_converter.rs index 923900e74d4ba..016aa93f66eda 100644 --- a/crates/bevy_wgpu/src/wgpu_type_converter.rs +++ b/crates/bevy_wgpu/src/wgpu_type_converter.rs @@ -17,6 +17,7 @@ use bevy_render::{ }; use bevy_window::Window; use wgpu::BufferBindingType; +use crate::{WgpuLimits, WgpuFeatures, WgpuFeature}; pub trait WgpuFrom { fn from(val: T) -> Self; @@ -647,3 +648,65 @@ impl WgpuFrom<&Window> for wgpu::SwapChainDescriptor { } } } + +impl WgpuFrom for wgpu::Features { + fn from(value: WgpuFeature) -> Self { + match value { + WgpuFeature::DepthClamping => wgpu::Features::DEPTH_CLAMPING, + WgpuFeature::TextureCompressionBc => wgpu::Features::TEXTURE_COMPRESSION_BC, + WgpuFeature::TimestampQuery => wgpu::Features::TIMESTAMP_QUERY, + WgpuFeature::PipelineStatisticsQuery => wgpu::Features::PIPELINE_STATISTICS_QUERY, + WgpuFeature::MappablePrimaryBuffers => wgpu::Features::MAPPABLE_PRIMARY_BUFFERS, + WgpuFeature::SampledTextureBindingArray => { + wgpu::Features::SAMPLED_TEXTURE_BINDING_ARRAY + } + WgpuFeature::SampledTextureArrayDynamicIndexing => { + wgpu::Features::SAMPLED_TEXTURE_ARRAY_DYNAMIC_INDEXING + } + WgpuFeature::SampledTextureArrayNonUniformIndexing => { + wgpu::Features::SAMPLED_TEXTURE_ARRAY_NON_UNIFORM_INDEXING + } + WgpuFeature::UnsizedBindingArray => wgpu::Features::UNSIZED_BINDING_ARRAY, + WgpuFeature::MultiDrawIndirect => wgpu::Features::MULTI_DRAW_INDIRECT, + WgpuFeature::MultiDrawIndirectCount => wgpu::Features::MULTI_DRAW_INDIRECT_COUNT, + WgpuFeature::PushConstants => wgpu::Features::PUSH_CONSTANTS, + WgpuFeature::AddressModeClampToBorder => wgpu::Features::ADDRESS_MODE_CLAMP_TO_BORDER, + WgpuFeature::NonFillPolygonMode => wgpu::Features::NON_FILL_POLYGON_MODE, + WgpuFeature::TextureCompressionEtc2 => wgpu::Features::TEXTURE_COMPRESSION_ETC2, + WgpuFeature::TextureCompressionAstcLdr => wgpu::Features::TEXTURE_COMPRESSION_ASTC_LDR, + WgpuFeature::TextureAdapterSpecificFormatFeatures => { + wgpu::Features::TEXTURE_ADAPTER_SPECIFIC_FORMAT_FEATURES + } + WgpuFeature::ShaderFloat64 => wgpu::Features::SHADER_FLOAT64, + WgpuFeature::VertexAttribute64Bit => wgpu::Features::VERTEX_ATTRIBUTE_64BIT, + } + } +} + +impl WgpuFrom for wgpu::Features { + fn from(features: WgpuFeatures) -> Self { + features + .features + .iter() + .fold(wgpu::Features::empty(), |wgpu_features, feature| { + wgpu_features | (*feature).wgpu_into() + }) + } +} + +impl WgpuFrom for wgpu::Limits { + fn from(val: WgpuLimits) -> Self { + wgpu::Limits { + max_bind_groups: val.max_bind_groups, + max_dynamic_uniform_buffers_per_pipeline_layout: val.max_dynamic_uniform_buffers_per_pipeline_layout, + max_dynamic_storage_buffers_per_pipeline_layout: val.max_dynamic_storage_buffers_per_pipeline_layout, + max_sampled_textures_per_shader_stage: val.max_sampled_textures_per_shader_stage, + max_samplers_per_shader_stage: val.max_samplers_per_shader_stage, + max_storage_buffers_per_shader_stage: val.max_storage_buffers_per_shader_stage, + max_storage_textures_per_shader_stage: val.max_storage_textures_per_shader_stage, + max_uniform_buffers_per_shader_stage: val.max_uniform_buffers_per_shader_stage, + max_uniform_buffer_binding_size: val.max_uniform_buffer_binding_size, + max_push_constant_size: val.max_push_constant_size + } + } +} From d17823744ec6a1248afe9010084a05aa1ac7ccc0 Mon Sep 17 00:00:00 2001 From: Zhixing Zhang Date: Wed, 3 Mar 2021 15:31:10 -0500 Subject: [PATCH 2/5] re-export wgpu constants --- .../src/renderer/wgpu_render_resource_context.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/crates/bevy_wgpu/src/renderer/wgpu_render_resource_context.rs b/crates/bevy_wgpu/src/renderer/wgpu_render_resource_context.rs index 9399e986d31ec..e7c5b79936279 100644 --- a/crates/bevy_wgpu/src/renderer/wgpu_render_resource_context.rs +++ b/crates/bevy_wgpu/src/renderer/wgpu_render_resource_context.rs @@ -25,8 +25,10 @@ pub struct WgpuRenderResourceContext { pub resources: WgpuResources, } -pub const BIND_BUFFER_ALIGNMENT: usize = 256; -pub const TEXTURE_ALIGNMENT: usize = 256; +pub const COPY_BYTES_PER_ROW_ALIGNMENT: usize = wgpu::COPY_BYTES_PER_ROW_ALIGNMENT as usize; +pub const BIND_BUFFER_ALIGNMENT: usize = wgpu::BIND_BUFFER_ALIGNMENT as usize; +pub const COPY_BUFFER_ALIGNMENT: usize = wgpu::COPY_BUFFER_ALIGNMENT as usize; +pub const PUSH_CONSTANT_ALIGNMENT: u32 = wgpu::PUSH_CONSTANT_ALIGNMENT; impl WgpuRenderResourceContext { pub fn new(device: Arc) -> Self { @@ -657,7 +659,7 @@ impl RenderResourceContext for WgpuRenderResourceContext { } fn get_aligned_texture_size(&self, size: usize) -> usize { - (size + TEXTURE_ALIGNMENT - 1) & !(TEXTURE_ALIGNMENT - 1) + (size + COPY_BYTES_PER_ROW_ALIGNMENT - 1) & !(COPY_BYTES_PER_ROW_ALIGNMENT - 1) } fn get_aligned_uniform_size(&self, size: usize, dynamic: bool) -> usize { From f11a9594f02f3f0646a372b3fbdd39f3669f78e1 Mon Sep 17 00:00:00 2001 From: Zhixing Zhang Date: Wed, 3 Mar 2021 15:34:41 -0500 Subject: [PATCH 3/5] cargo fmt --- crates/bevy_wgpu/src/wgpu_renderer.rs | 2 +- crates/bevy_wgpu/src/wgpu_type_converter.rs | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/crates/bevy_wgpu/src/wgpu_renderer.rs b/crates/bevy_wgpu/src/wgpu_renderer.rs index c1873d9ff2c7b..ddba63718b16b 100644 --- a/crates/bevy_wgpu/src/wgpu_renderer.rs +++ b/crates/bevy_wgpu/src/wgpu_renderer.rs @@ -1,5 +1,6 @@ use crate::{ renderer::{WgpuRenderGraphExecutor, WgpuRenderResourceContext}, + wgpu_type_converter::WgpuInto, WgpuBackend, WgpuOptions, WgpuPowerOptions, }; use bevy_app::{prelude::*, ManualEventReader}; @@ -10,7 +11,6 @@ use bevy_render::{ }; use bevy_window::{WindowCreated, WindowResized, Windows}; use std::{ops::Deref, sync::Arc}; -use crate::wgpu_type_converter::WgpuInto; pub struct WgpuRenderer { pub instance: wgpu::Instance, diff --git a/crates/bevy_wgpu/src/wgpu_type_converter.rs b/crates/bevy_wgpu/src/wgpu_type_converter.rs index 016aa93f66eda..f8b35c1b69834 100644 --- a/crates/bevy_wgpu/src/wgpu_type_converter.rs +++ b/crates/bevy_wgpu/src/wgpu_type_converter.rs @@ -1,3 +1,4 @@ +use crate::{WgpuFeature, WgpuFeatures, WgpuLimits}; use bevy_render::{ color::Color, pass::{LoadOp, Operations}, @@ -17,7 +18,6 @@ use bevy_render::{ }; use bevy_window::Window; use wgpu::BufferBindingType; -use crate::{WgpuLimits, WgpuFeatures, WgpuFeature}; pub trait WgpuFrom { fn from(val: T) -> Self; @@ -698,15 +698,17 @@ impl WgpuFrom for wgpu::Limits { fn from(val: WgpuLimits) -> Self { wgpu::Limits { max_bind_groups: val.max_bind_groups, - max_dynamic_uniform_buffers_per_pipeline_layout: val.max_dynamic_uniform_buffers_per_pipeline_layout, - max_dynamic_storage_buffers_per_pipeline_layout: val.max_dynamic_storage_buffers_per_pipeline_layout, + max_dynamic_uniform_buffers_per_pipeline_layout: val + .max_dynamic_uniform_buffers_per_pipeline_layout, + max_dynamic_storage_buffers_per_pipeline_layout: val + .max_dynamic_storage_buffers_per_pipeline_layout, max_sampled_textures_per_shader_stage: val.max_sampled_textures_per_shader_stage, max_samplers_per_shader_stage: val.max_samplers_per_shader_stage, max_storage_buffers_per_shader_stage: val.max_storage_buffers_per_shader_stage, max_storage_textures_per_shader_stage: val.max_storage_textures_per_shader_stage, max_uniform_buffers_per_shader_stage: val.max_uniform_buffers_per_shader_stage, max_uniform_buffer_binding_size: val.max_uniform_buffer_binding_size, - max_push_constant_size: val.max_push_constant_size + max_push_constant_size: val.max_push_constant_size, } } } From 189d8a664547a43d8dfacb60b5babcd45be985dd Mon Sep 17 00:00:00 2001 From: Zhixing Zhang Date: Wed, 3 Mar 2021 15:59:21 -0500 Subject: [PATCH 4/5] =?UTF-8?q?Use=20Cow<=E2=80=98static,=20str>=20for=20n?= =?UTF-8?q?ame?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/bevy_wgpu/src/lib.rs | 5 +++-- crates/bevy_wgpu/src/wgpu_renderer.rs | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/crates/bevy_wgpu/src/lib.rs b/crates/bevy_wgpu/src/lib.rs index d6550d94447b1..820a6db67bc3d 100644 --- a/crates/bevy_wgpu/src/lib.rs +++ b/crates/bevy_wgpu/src/lib.rs @@ -17,6 +17,7 @@ use bevy_render::{ }; use futures_lite::future; use renderer::WgpuRenderResourceContext; +use std::borrow::Cow; #[derive(Clone, Copy)] pub enum WgpuFeature { @@ -108,8 +109,8 @@ pub fn get_wgpu_render_system(resources: &mut Resources) -> impl FnMut(&mut Worl } #[derive(Default, Clone)] -pub struct WgpuOptions<'a> { - pub name: Option<&'a str>, +pub struct WgpuOptions { + pub name: Option>, pub backend: WgpuBackend, pub power_pref: WgpuPowerOptions, pub features: WgpuFeatures, diff --git a/crates/bevy_wgpu/src/wgpu_renderer.rs b/crates/bevy_wgpu/src/wgpu_renderer.rs index ddba63718b16b..8fe7cc4f7bbd1 100644 --- a/crates/bevy_wgpu/src/wgpu_renderer.rs +++ b/crates/bevy_wgpu/src/wgpu_renderer.rs @@ -22,7 +22,7 @@ pub struct WgpuRenderer { } impl WgpuRenderer { - pub async fn new(options: WgpuOptions<'_>) -> Self { + pub async fn new(options: WgpuOptions) -> Self { let backend = match options.backend { WgpuBackend::Auto => wgpu::BackendBit::PRIMARY, WgpuBackend::Vulkan => wgpu::BackendBit::VULKAN, @@ -54,7 +54,7 @@ impl WgpuRenderer { let (device, queue) = adapter .request_device( &wgpu::DeviceDescriptor { - label: options.name, + label: options.name.as_ref().map(|a| a.as_ref()), features: options.features.wgpu_into(), limits: options.limits.wgpu_into(), }, From d116acf870615fbf0e5ade65a1fdba6edf9ae36e Mon Sep 17 00:00:00 2001 From: Zhixing Zhang Date: Wed, 3 Mar 2021 16:04:43 -0500 Subject: [PATCH 5/5] =?UTF-8?q?Change=20=E2=80=98name=E2=80=99=20to=20?= =?UTF-8?q?=E2=80=98device=5Flabel=E2=80=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/bevy_wgpu/src/lib.rs | 2 +- crates/bevy_wgpu/src/wgpu_renderer.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/bevy_wgpu/src/lib.rs b/crates/bevy_wgpu/src/lib.rs index 820a6db67bc3d..6f6e8c17d1c2c 100644 --- a/crates/bevy_wgpu/src/lib.rs +++ b/crates/bevy_wgpu/src/lib.rs @@ -110,7 +110,7 @@ pub fn get_wgpu_render_system(resources: &mut Resources) -> impl FnMut(&mut Worl #[derive(Default, Clone)] pub struct WgpuOptions { - pub name: Option>, + pub device_label: Option>, pub backend: WgpuBackend, pub power_pref: WgpuPowerOptions, pub features: WgpuFeatures, diff --git a/crates/bevy_wgpu/src/wgpu_renderer.rs b/crates/bevy_wgpu/src/wgpu_renderer.rs index 8fe7cc4f7bbd1..b86746558b269 100644 --- a/crates/bevy_wgpu/src/wgpu_renderer.rs +++ b/crates/bevy_wgpu/src/wgpu_renderer.rs @@ -54,7 +54,7 @@ impl WgpuRenderer { let (device, queue) = adapter .request_device( &wgpu::DeviceDescriptor { - label: options.name.as_ref().map(|a| a.as_ref()), + label: options.device_label.as_ref().map(|a| a.as_ref()), features: options.features.wgpu_into(), limits: options.limits.wgpu_into(), },