diff --git a/examples/bindful/main.rs b/examples/bindful/main.rs index 33f81390..35fd6675 100644 --- a/examples/bindful/main.rs +++ b/examples/bindful/main.rs @@ -1,7 +1,7 @@ // currently windows only because here we need a concrete gfx and os implementation #![cfg(target_os = "windows")] -use hotline_rs::{*, prelude::{Pipeline, Texture}}; +use hotline_rs::{*, prelude::*}; use os::{App, Window}; use gfx::{CmdBuf, Device, SwapChain, RenderPass}; @@ -12,6 +12,12 @@ struct Vertex { color: [f32; 4], } +#[repr(C)] +struct LetterboxPushConstants { + x: f32, + y: f32 +} + fn main() -> Result<(), hotline_rs::Error> { // app let mut app = os_platform::App::create(os::AppInfo { @@ -38,8 +44,8 @@ fn main() -> Result<(), hotline_rs::Error> { rect: os::Rect { x: 100, y: 100, - width: 1024, - height: 1024, + width: 1280, + height: 720, }, style: os::WindowStyleFlags::NONE, parent_handle: None, @@ -152,7 +158,6 @@ fn main() -> Result<(), hotline_rs::Error> { cmdbuffer.set_heap(pso_pmfx, dev.get_shader_heap()); - // set bindings let srv0 = textures[0].get_srv_index().unwrap(); let srv1 = textures[1].get_srv_index().unwrap(); let srv2 = textures[2].get_srv_index().unwrap(); @@ -177,6 +182,23 @@ fn main() -> Result<(), hotline_rs::Error> { if let Some(t3) = pso_pmfx.get_pipeline_slot(3, 0, gfx::DescriptorType::ShaderResource) { cmdbuffer.set_binding(pso_pmfx, dev.get_shader_heap(), t3.index, srv3); } + + // lookup push constants for letterboxing the quad + if let Some(c0) = pso_pmfx.get_pipeline_slot(0, 0, gfx::DescriptorType::PushConstants) { + let pc = if vp_rect.width >= vp_rect.height { + LetterboxPushConstants { + x: vp_rect.height as f32 / vp_rect.width as f32, + y: 1.0 + } + } + else { + LetterboxPushConstants { + x: 1.0, + y: vp_rect.width as f32 / vp_rect.height as f32 + } + }; + cmdbuffer.push_render_constants(c0.index, 2, 0, gfx::as_u8_slice(&pc)); + } cmdbuffer.set_index_buffer(&index_buffer); cmdbuffer.set_vertex_buffer(&vertex_buffer, 0); @@ -196,7 +218,7 @@ fn main() -> Result<(), hotline_rs::Error> { dev.execute(&cmdbuffer); - swap_chain.swap(&dev); + swap_chain.swap(&mut dev); ci = (ci + 1) % 4; } diff --git a/examples/bindless/main.rs b/examples/bindless/main.rs index de6119e4..753cb7fe 100644 --- a/examples/bindless/main.rs +++ b/examples/bindless/main.rs @@ -1,7 +1,7 @@ // currently windows only because here we need a concrete gfx and os implementation #![cfg(target_os = "windows")] -use hotline_rs::*; +use hotline_rs::{*, prelude::*}; use os::{App, Window}; use gfx::{CmdBuf, Device, SwapChain, RenderPass}; @@ -12,6 +12,12 @@ struct Vertex { color: [f32; 4], } +#[repr(C)] +struct LetterboxPushConstants { + x: f32, + y: f32 +} + fn main() -> Result<(), hotline_rs::Error> { // app let mut app = os_platform::App::create(os::AppInfo { @@ -38,8 +44,8 @@ fn main() -> Result<(), hotline_rs::Error> { rect: os::Rect { x: 100, y: 100, - width: 1024, - height: 1024, + width: 1280, + height: 720, }, style: os::WindowStyleFlags::NONE, parent_handle: None, @@ -55,10 +61,10 @@ fn main() -> Result<(), hotline_rs::Error> { a: 1.00, }), }; - let mut swap_chain = dev.create_swap_chain::(&swap_chain_info, &win)?; + let mut swap_chain = dev.create_swap_chain::(&swap_chain_info, &win)?; // 2 // cmd buffer - let mut cmdbuffer = dev.create_cmd_buf(2); + let mut cmdbuffer = dev.create_cmd_buf(2); // 2 // vertex buffer let vertices = [ @@ -128,26 +134,13 @@ fn main() -> Result<(), hotline_rs::Error> { textures.push(tex); } - // push constants - let constants: [f32; 4] = [1.0, 1.0, 0.0, 1.0]; - - // constant buffer - let mut cbuffer: [f32; 64] = [0.0; 64]; - cbuffer[0] = 1.0; - cbuffer[1] = 0.0; - cbuffer[2] = 1.0; - cbuffer[3] = 1.0; - - let info = gfx::BufferInfo { - usage: gfx::BufferUsage::CONSTANT_BUFFER, - cpu_access: gfx::CpuAccessFlags::NONE, - format: gfx::Format::Unknown, - stride: cbuffer.len() * 4, - num_elements: 1, - initial_state: gfx::ResourceState::VertexConstantBuffer - }; - - let _constant_buffer = dev.create_buffer(&info, data![gfx::as_u8_slice(&cbuffer)]); + // srv indices are used to index into descriptor arrays + let srv_indices = [ + textures[0].get_srv_index().unwrap() as u32, + textures[1].get_srv_index().unwrap() as u32, + textures[2].get_srv_index().unwrap() as u32, + textures[3].get_srv_index().unwrap() as u32, + ]; // render target let rt_info = gfx::TextureInfo { @@ -164,21 +157,6 @@ fn main() -> Result<(), hotline_rs::Error> { }; let render_target = dev.create_texture(&rt_info, data![]).unwrap(); - // depth stencil target - let ds_info = gfx::TextureInfo { - format: gfx::Format::D24nS8u, - tex_type: gfx::TextureType::Texture2D, - width: 512, - height: 512, - depth: 1, - array_layers: 1, - mip_levels: 1, - samples: 1, - usage: gfx::TextureUsage::DEPTH_STENCIL, - initial_state: gfx::ResourceState::DepthStencil, - }; - let depth_stencil = dev.create_texture::(&ds_info, None).unwrap(); - // pass for render target with depth stencil let render_target_pass = dev .create_render_pass(&gfx::RenderPassInfo { @@ -189,7 +167,7 @@ fn main() -> Result<(), hotline_rs::Error> { b: 1.0, a: 1.0, }), - depth_stencil: Some(&depth_stencil), + depth_stencil: None, //Some(&depth_stencil), ds_clear: Some(gfx::ClearDepthStencil { depth: Some(1.0), stencil: None, @@ -224,7 +202,7 @@ fn main() -> Result<(), hotline_rs::Error> { // compute pass cmdbuffer.set_marker(0xff00ffff, "Frame Start"); - + cmdbuffer.begin_event(0xff0000ff, "Compute Pass"); cmdbuffer.set_compute_pipeline(pso_compute); cmdbuffer.set_heap(pso_compute, dev.get_shader_heap()); @@ -288,7 +266,27 @@ fn main() -> Result<(), hotline_rs::Error> { cmdbuffer.set_index_buffer(&index_buffer); cmdbuffer.set_vertex_buffer(&vertex_buffer, 0); - cmdbuffer.push_render_constants(0, 4, 0, constants.as_slice()); + // lookup push constants for letterboxing the quad and push the data + if let Some(c0) = pso_pmfx.get_pipeline_slot(0, 0, gfx::DescriptorType::PushConstants) { + let pc = if vp_rect.width >= vp_rect.height { + LetterboxPushConstants { + x: vp_rect.height as f32 / vp_rect.width as f32, + y: 1.0 + } + } + else { + LetterboxPushConstants { + x: 1.0, + y: vp_rect.width as f32 / vp_rect.height as f32 + } + }; + cmdbuffer.push_render_constants(c0.index, 2, 0, gfx::as_u8_slice(&pc)); + } + + // lookup push srv indices and push the data + if let Some(c1) = pso_pmfx.get_pipeline_slot(1, 0, gfx::DescriptorType::PushConstants) { + cmdbuffer.push_render_constants(c1.index, 4, 0, gfx::as_u8_slice(&srv_indices)); + } cmdbuffer.draw_indexed_instanced(6, 1, 0, 0, 0); @@ -306,7 +304,7 @@ fn main() -> Result<(), hotline_rs::Error> { dev.execute(&cmdbuffer); - swap_chain.swap(&dev); + swap_chain.swap(&mut dev); ci = (ci + 1) % 4; } @@ -317,4 +315,4 @@ fn main() -> Result<(), hotline_rs::Error> { dev.cleanup_dropped_resources(&swap_chain); Ok(()) -} +} \ No newline at end of file diff --git a/examples/swap_chain/main.rs b/examples/swap_chain/main.rs index bebbf243..90ec536c 100644 --- a/examples/swap_chain/main.rs +++ b/examples/swap_chain/main.rs @@ -6,10 +6,7 @@ use hotline_rs::*; use os::App; use os::Window; -use maths_rs::Vec3f; use maths_rs::vec::vec3f; -use maths_rs::vec::splat3f; -use maths_rs::dot; use maths_rs::cos; use gfx::Device; diff --git a/plugins/ecs/src/lib.rs b/plugins/ecs/src/lib.rs index eda0017c..d2c3d061 100644 --- a/plugins/ecs/src/lib.rs +++ b/plugins/ecs/src/lib.rs @@ -6,8 +6,6 @@ use hotline_rs::prelude::*; use maths_rs::prelude::*; use bevy_ecs::prelude::*; - -use bevy_ecs::schedule::SystemConfig; use bevy_ecs::schedule::SystemConfigs; use std::collections::HashMap; diff --git a/plugins/ecs_examples/src/bindless_texture.rs b/plugins/ecs_examples/src/bindless_texture.rs index 02bf8084..9d2b2b5f 100644 --- a/plugins/ecs_examples/src/bindless_texture.rs +++ b/plugins/ecs_examples/src/bindless_texture.rs @@ -152,6 +152,7 @@ pub fn setup_bindless_texture( pub fn draw_meshes_bindless_texture( pmfx: &Res, view: &pmfx::View, + cmd_buf: &mut ::CmdBuf, mesh_draw_query: Query<(&WorldMatrix, &MeshComponent, &TextureInstance)>) -> Result<(), hotline_rs::Error> { let pmfx = &pmfx; @@ -159,18 +160,18 @@ pub fn draw_meshes_bindless_texture( let pipeline = pmfx.get_render_pipeline_for_format(&view.view_pipeline, fmt)?; let camera = pmfx.get_camera_constants(&view.camera)?; - view.cmd_buf.set_render_pipeline(pipeline); - view.cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); + cmd_buf.set_render_pipeline(pipeline); + cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); - view.cmd_buf.set_heap(pipeline, &pmfx.shader_heap); + cmd_buf.set_heap(pipeline, &pmfx.shader_heap); for (world_matrix, mesh, texture) in &mesh_draw_query { - view.cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0); - view.cmd_buf.push_render_constants(1, 1, 16, gfx::as_u8_slice(&texture.0)); + cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0); + cmd_buf.push_render_constants(1, 1, 16, gfx::as_u8_slice(&texture.0)); - view.cmd_buf.set_index_buffer(&mesh.0.ib); - view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); - view.cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); + cmd_buf.set_index_buffer(&mesh.0.ib); + cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); + cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); } Ok(()) diff --git a/plugins/ecs_examples/src/blend_states.rs b/plugins/ecs_examples/src/blend_states.rs index 981a22e3..0a93e115 100644 --- a/plugins/ecs_examples/src/blend_states.rs +++ b/plugins/ecs_examples/src/blend_states.rs @@ -107,6 +107,7 @@ pub fn setup_blend_states( pub fn render_meshes_pipeline_coloured( pmfx: &Res, view: &pmfx::View, + cmd_buf: &mut ::CmdBuf, mesh_draw_query: Query<(&WorldMatrix, &MeshComponent, &PipelineComponent, &Colour)>) -> Result<(), hotline_rs::Error> { let pmfx = &pmfx; @@ -116,14 +117,14 @@ pub fn render_meshes_pipeline_coloured( for (world_matrix, mesh, pipeline, colour) in &mesh_draw_query { // set pipeline per mesh let pipeline = pmfx.get_render_pipeline_for_format(&pipeline.0, fmt)?; - view.cmd_buf.set_render_pipeline(pipeline); - view.cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); - view.cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0); - view.cmd_buf.push_render_constants(1, 4, 12, &colour.0); - - view.cmd_buf.set_index_buffer(&mesh.0.ib); - view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); - view.cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); + cmd_buf.set_render_pipeline(pipeline); + cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); + cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0); + cmd_buf.push_render_constants(1, 4, 12, &colour.0); + + cmd_buf.set_index_buffer(&mesh.0.ib); + cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); + cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); } Ok(()) diff --git a/plugins/ecs_examples/src/cubemap.rs b/plugins/ecs_examples/src/cubemap.rs index 8a76c97b..084a0cc7 100644 --- a/plugins/ecs_examples/src/cubemap.rs +++ b/plugins/ecs_examples/src/cubemap.rs @@ -70,25 +70,26 @@ pub fn setup_cubemap( pub fn render_meshes_cubemap( pmfx: &Res, view: &pmfx::View, + cmd_buf: &mut ::CmdBuf, mesh_draw_query: Query<(&WorldMatrix, &MeshComponent, &TextureInstance)>) -> Result<(), hotline_rs::Error> { let fmt = view.pass.get_format_hash(); let pipeline = pmfx.get_render_pipeline_for_format(&view.view_pipeline, fmt)?; let camera = pmfx.get_camera_constants(&view.camera)?; - view.cmd_buf.set_render_pipeline(pipeline); - view.cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); + cmd_buf.set_render_pipeline(pipeline); + cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); - view.cmd_buf.set_heap(pipeline, &pmfx.shader_heap); + cmd_buf.set_heap(pipeline, &pmfx.shader_heap); let mut mip = 0; for (world_matrix, mesh, cubemap) in &mesh_draw_query { - view.cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0); - view.cmd_buf.push_render_constants(1, 2, 16, gfx::as_u8_slice(&[cubemap.0, mip, 0, 0])); + cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0); + cmd_buf.push_render_constants(1, 2, 16, gfx::as_u8_slice(&[cubemap.0, mip, 0, 0])); - view.cmd_buf.set_index_buffer(&mesh.0.ib); - view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); - view.cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); + cmd_buf.set_index_buffer(&mesh.0.ib); + cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); + cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); mip += 1; } diff --git a/plugins/ecs_examples/src/draw.rs b/plugins/ecs_examples/src/draw.rs index ef9937cd..ff0c2a99 100644 --- a/plugins/ecs_examples/src/draw.rs +++ b/plugins/ecs_examples/src/draw.rs @@ -49,18 +49,19 @@ pub fn setup_draw( pub fn draw_meshes( pmfx: &Res, view: &pmfx::View, + cmd_buf: &mut ::CmdBuf, mesh_draw_query: Query<(&WorldMatrix, &MeshComponent)>) -> Result<(), hotline_rs::Error> { let fmt = view.pass.get_format_hash(); let pipeline = pmfx.get_render_pipeline_for_format(&view.view_pipeline, fmt)?; let camera = pmfx.get_camera_constants(&view.camera)?; - view.cmd_buf.set_render_pipeline(pipeline); - view.cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); + cmd_buf.set_render_pipeline(pipeline); + cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); for (_, mesh) in &mesh_draw_query { - view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); - view.cmd_buf.draw_instanced(3, 1, 0, 0); + cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); + cmd_buf.draw_instanced(3, 1, 0, 0); } Ok(()) diff --git a/plugins/ecs_examples/src/draw_cbuffer_instanced.rs b/plugins/ecs_examples/src/draw_cbuffer_instanced.rs index 4a07da83..dfd3335e 100644 --- a/plugins/ecs_examples/src/draw_cbuffer_instanced.rs +++ b/plugins/ecs_examples/src/draw_cbuffer_instanced.rs @@ -97,6 +97,7 @@ pub fn setup_draw_cbuffer_instanced( pub fn draw_meshes_cbuffer_instanced( pmfx: &Res, view: &pmfx::View, + cmd_buf: &mut ::CmdBuf, instance_draw_query: Query<(&InstanceBuffer, &MeshComponent, &PipelineComponent)> ) -> Result<(), hotline_rs::Error> { @@ -107,13 +108,13 @@ pub fn draw_meshes_cbuffer_instanced( for (instance_batch, mesh, pipeline) in &instance_draw_query { // set pipeline per batch let pipeline = pmfx.get_render_pipeline_for_format(&pipeline.0, fmt)?; - view.cmd_buf.set_render_pipeline(pipeline); - view.cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); + cmd_buf.set_render_pipeline(pipeline); + cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); // bind the constant buffer (cbv) on the slot for b1, space0 specified in the shader let pipeline_slot = pipeline.get_pipeline_slot(1, 0, gfx::DescriptorType::ConstantBuffer); if let Some(pipeline_slot) = pipeline_slot { - view.cmd_buf.set_binding( + cmd_buf.set_binding( pipeline, instance_batch.heap.as_ref().unwrap(), pipeline_slot.index, @@ -122,9 +123,9 @@ pub fn draw_meshes_cbuffer_instanced( } // bind vb, ib and draw instanced - view.cmd_buf.set_index_buffer(&mesh.0.ib); - view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); - view.cmd_buf.draw_indexed_instanced(mesh.0.num_indices, instance_batch.instance_count, 0, 0, 0); + cmd_buf.set_index_buffer(&mesh.0.ib); + cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); + cmd_buf.draw_indexed_instanced(mesh.0.num_indices, instance_batch.instance_count, 0, 0, 0); } Ok(()) diff --git a/plugins/ecs_examples/src/draw_indexed.rs b/plugins/ecs_examples/src/draw_indexed.rs index 1120438f..33b55d6b 100644 --- a/plugins/ecs_examples/src/draw_indexed.rs +++ b/plugins/ecs_examples/src/draw_indexed.rs @@ -47,19 +47,20 @@ pub fn setup_draw_indexed( pub fn draw_meshes_indexed( pmfx: &Res, view: &pmfx::View, + cmd_buf: &mut ::CmdBuf, mesh_draw_query: Query<(&WorldMatrix, &MeshComponent)>) -> Result<(), hotline_rs::Error> { let fmt = view.pass.get_format_hash(); let pipeline = pmfx.get_render_pipeline_for_format(&view.view_pipeline, fmt)?; let camera = pmfx.get_camera_constants(&view.camera)?; - view.cmd_buf.set_render_pipeline(pipeline); - view.cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); + cmd_buf.set_render_pipeline(pipeline); + cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); for (_, mesh) in &mesh_draw_query { - view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); - view.cmd_buf.set_index_buffer(&mesh.0.ib); - view.cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); + cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); + cmd_buf.set_index_buffer(&mesh.0.ib); + cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); } Ok(()) diff --git a/plugins/ecs_examples/src/draw_indirect.rs b/plugins/ecs_examples/src/draw_indirect.rs index 1e8fd993..dd6761b8 100644 --- a/plugins/ecs_examples/src/draw_indirect.rs +++ b/plugins/ecs_examples/src/draw_indirect.rs @@ -114,6 +114,7 @@ pub fn setup_draw_indirect( pub fn draw_meshes_indirect( pmfx: &Res, view: &pmfx::View, + cmd_buf: &mut ::CmdBuf, mesh_draw_indirect_query: Query<(&WorldMatrix, &MeshComponent, &CommandSignatureComponent, &BufferComponent)>) -> Result<(), hotline_rs::Error> { @@ -121,15 +122,15 @@ pub fn draw_meshes_indirect( let pipeline = pmfx.get_render_pipeline_for_format(&view.view_pipeline, fmt)?; let camera = pmfx.get_camera_constants(&view.camera)?; - view.cmd_buf.set_render_pipeline(pipeline); - view.cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); + cmd_buf.set_render_pipeline(pipeline); + cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); for (world_matrix, mesh, command, args) in &mesh_draw_indirect_query { - view.cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0); - view.cmd_buf.set_index_buffer(&mesh.0.ib); - view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); + cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0); + cmd_buf.set_index_buffer(&mesh.0.ib); + cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); - view.cmd_buf.execute_indirect( + cmd_buf.execute_indirect( &command.0, 1, &args.0, diff --git a/plugins/ecs_examples/src/draw_vertex_buffer_instanced.rs b/plugins/ecs_examples/src/draw_vertex_buffer_instanced.rs index 81e18291..ace7fb02 100644 --- a/plugins/ecs_examples/src/draw_vertex_buffer_instanced.rs +++ b/plugins/ecs_examples/src/draw_vertex_buffer_instanced.rs @@ -88,6 +88,7 @@ pub fn setup_draw_vertex_buffer_instanced( pub fn draw_meshes_vertex_buffer_instanced( pmfx: &Res, view: &pmfx::View, + cmd_buf: &mut ::CmdBuf, instance_draw_query: Query<(&InstanceBuffer, &MeshComponent, &PipelineComponent)> ) -> Result<(), hotline_rs::Error> { @@ -98,13 +99,13 @@ pub fn draw_meshes_vertex_buffer_instanced( for (instance_batch, mesh, pipeline) in &instance_draw_query { // set pipeline per mesh let pipeline = pmfx.get_render_pipeline_for_format(&pipeline.0, fmt)?; - view.cmd_buf.set_render_pipeline(pipeline); - view.cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); - view.cmd_buf.set_heap(pipeline, &pmfx.shader_heap); - view.cmd_buf.set_index_buffer(&mesh.0.ib); - view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); - view.cmd_buf.set_vertex_buffer(&instance_batch.buffer, 1); - view.cmd_buf.draw_indexed_instanced(mesh.0.num_indices, instance_batch.instance_count, 0, 0, 0); + cmd_buf.set_render_pipeline(pipeline); + cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); + cmd_buf.set_heap(pipeline, &pmfx.shader_heap); + cmd_buf.set_index_buffer(&mesh.0.ib); + cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); + cmd_buf.set_vertex_buffer(&instance_batch.buffer, 1); + cmd_buf.draw_indexed_instanced(mesh.0.num_indices, instance_batch.instance_count, 0, 0, 0); } Ok(()) diff --git a/plugins/ecs_examples/src/dynamic_cubemap.rs b/plugins/ecs_examples/src/dynamic_cubemap.rs index f7d5431b..0dd36e89 100644 --- a/plugins/ecs_examples/src/dynamic_cubemap.rs +++ b/plugins/ecs_examples/src/dynamic_cubemap.rs @@ -63,7 +63,7 @@ pub fn setup_dynamic_cubemap( let dist = rand::distributions::Uniform::from(0..orbit_meshes.len()); let num_primitves = 32; - for i in 0..num_primitves { + for _ in 0..num_primitves { let rv = normalize(vec3f(rng.gen(), rng.gen(), rng.gen()) * 2.0 - 1.0); let rr = vec3f(rng.gen(), rng.gen(), rng.gen()) * f32::tau(); let offset : f32 = 20.0 + rng.gen::() * 20.0; @@ -102,24 +102,23 @@ pub fn orbit_meshes( pub fn render_orbit_meshes( pmfx: &Res, view: &pmfx::View, + cmd_buf: &mut ::CmdBuf, mesh_draw_query: Query<(&WorldMatrix, &MeshComponent), Without>) -> Result<(), hotline_rs::Error> { let fmt = view.pass.get_format_hash(); let pipeline = pmfx.get_render_pipeline_for_format(&view.view_pipeline, fmt)?; let camera = pmfx.get_camera_constants(&view.camera)?; - view.cmd_buf.set_render_pipeline(pipeline); - view.cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); + cmd_buf.set_render_pipeline(pipeline); + cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); - view.cmd_buf.set_heap(pipeline, &pmfx.shader_heap); + cmd_buf.set_heap(pipeline, &pmfx.shader_heap); - let mut mip = 0; for (world_matrix, mesh) in &mesh_draw_query { - view.cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0); - view.cmd_buf.set_index_buffer(&mesh.0.ib); - view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); - view.cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); - mip += 1; + cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0); + cmd_buf.set_index_buffer(&mesh.0.ib); + cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); + cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); } Ok(()) @@ -130,26 +129,27 @@ pub fn render_orbit_meshes( pub fn render_meshes_cubemap_reflect( pmfx: &Res, view: &pmfx::View, + cmd_buf: &mut ::CmdBuf, mesh_draw_query: Query<(&WorldMatrix, &MeshComponent, &TextureInstance)>) -> Result<(), hotline_rs::Error> { let fmt = view.pass.get_format_hash(); let pipeline = pmfx.get_render_pipeline_for_format(&view.view_pipeline, fmt)?; let camera = pmfx.get_camera_constants(&view.camera)?; - view.cmd_buf.set_render_pipeline(pipeline); - view.cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); - view.cmd_buf.push_render_constants(0, 4, 16, gfx::as_u8_slice(&camera.view_position)); + cmd_buf.set_render_pipeline(pipeline); + cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); + cmd_buf.push_render_constants(0, 4, 16, gfx::as_u8_slice(&camera.view_position)); - view.cmd_buf.set_heap(pipeline, &pmfx.shader_heap); + cmd_buf.set_heap(pipeline, &pmfx.shader_heap); let mut mip = 0; for (world_matrix, mesh, cubemap) in &mesh_draw_query { - view.cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0); - view.cmd_buf.push_render_constants(1, 2, 16, gfx::as_u8_slice(&[cubemap.0, mip, 0, 0])); + cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0); + cmd_buf.push_render_constants(1, 2, 16, gfx::as_u8_slice(&[cubemap.0, mip, 0, 0])); - view.cmd_buf.set_index_buffer(&mesh.0.ib); - view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); - view.cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); + cmd_buf.set_index_buffer(&mesh.0.ib); + cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); + cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); mip += 1; } diff --git a/plugins/ecs_examples/src/gpu_frustum_culling.rs b/plugins/ecs_examples/src/gpu_frustum_culling.rs index d5b74e17..ed885c56 100644 --- a/plugins/ecs_examples/src/gpu_frustum_culling.rs +++ b/plugins/ecs_examples/src/gpu_frustum_culling.rs @@ -332,12 +332,13 @@ pub fn swirling_meshes( pub fn dispatch_compute_frustum_cull( pmfx: &Res, pass: &mut pmfx::ComputePass, + cmd_buf: &mut ::CmdBuf, indirect_draw_query: Query<&DrawIndirectComponent>) -> Result<(), hotline_rs::Error> { for indirect_draw in &indirect_draw_query { // clears the counter - pass.cmd_buf.transition_barrier(&gfx::TransitionBarrier { + cmd_buf.transition_barrier(&gfx::TransitionBarrier { texture: None, buffer: Some(&indirect_draw.dynamic_buffer), state_before: gfx::ResourceState::IndirectArgument, @@ -345,9 +346,9 @@ pub fn dispatch_compute_frustum_cull( }); let offset = indirect_draw.dynamic_buffer.get_counter_offset().unwrap(); - pass.cmd_buf.copy_buffer_region(&indirect_draw.dynamic_buffer, offset, &indirect_draw.counter_reset, 0, std::mem::size_of::()); + cmd_buf.copy_buffer_region(&indirect_draw.dynamic_buffer, offset, &indirect_draw.counter_reset, 0, std::mem::size_of::()); - pass.cmd_buf.transition_barrier(&gfx::TransitionBarrier { + cmd_buf.transition_barrier(&gfx::TransitionBarrier { texture: None, buffer: Some(&indirect_draw.dynamic_buffer), state_before: gfx::ResourceState::CopyDst, @@ -356,17 +357,17 @@ pub fn dispatch_compute_frustum_cull( // run the shader to cull the entities let pipeline = pmfx.get_compute_pipeline(&pass.pass_pipline).unwrap(); - pass.cmd_buf.set_compute_pipeline(pipeline); + cmd_buf.set_compute_pipeline(pipeline); // resource index info for looking up input (draw all info) / output (culled draw call info) let slot = pipeline.get_pipeline_slot(0, 1, gfx::DescriptorType::PushConstants); if let Some(slot) = slot { // output uav - pass.cmd_buf.push_compute_constants(slot.index, 1, 0, + cmd_buf.push_compute_constants(slot.index, 1, 0, gfx::as_u8_slice(&indirect_draw.dynamic_buffer.get_uav_index().unwrap())); // input srv - pass.cmd_buf.push_compute_constants(slot.index, 1, 4, + cmd_buf.push_compute_constants(slot.index, 1, 4, gfx::as_u8_slice(&indirect_draw.arg_buffer.get_srv_index().unwrap())); } @@ -374,13 +375,13 @@ pub fn dispatch_compute_frustum_cull( let world_buffer_info = pmfx.get_world_buffer_info(); let slot = pipeline.get_pipeline_slot(2, 0, gfx::DescriptorType::PushConstants); if let Some(slot) = slot { - pass.cmd_buf.push_compute_constants( + cmd_buf.push_compute_constants( slot.index, gfx::num_32bit_constants(&world_buffer_info), 0, gfx::as_u8_slice(&world_buffer_info)); } - pass.cmd_buf.set_heap(pipeline, &pmfx.shader_heap); + cmd_buf.set_heap(pipeline, &pmfx.shader_heap); - pass.cmd_buf.dispatch( + cmd_buf.dispatch( gfx::Size3 { x: indirect_draw.max_count / pass.numthreads.x, y: pass.numthreads.y, @@ -390,7 +391,7 @@ pub fn dispatch_compute_frustum_cull( ); // transition to `IndirectArgument` - pass.cmd_buf.transition_barrier(&gfx::TransitionBarrier { + cmd_buf.transition_barrier(&gfx::TransitionBarrier { texture: None, buffer: Some(&indirect_draw.dynamic_buffer), state_before: gfx::ResourceState::UnorderedAccess, @@ -406,26 +407,27 @@ pub fn dispatch_compute_frustum_cull( pub fn draw_meshes_indirect_culling( pmfx: &Res, view: &pmfx::View, + cmd_buf: &mut ::CmdBuf, indirect_draw_query: Query<&DrawIndirectComponent>) -> Result<(), hotline_rs::Error> { let fmt = view.pass.get_format_hash(); let pipeline = pmfx.get_render_pipeline_for_format(&view.view_pipeline, fmt)?; - view.cmd_buf.set_render_pipeline(&pipeline); + cmd_buf.set_render_pipeline(&pipeline); // bind the world buffer info let world_buffer_info = pmfx.get_world_buffer_info(); let slot = pipeline.get_pipeline_slot(2, 0, gfx::DescriptorType::PushConstants); if let Some(slot) = slot { - view.cmd_buf.push_render_constants( + cmd_buf.push_render_constants( slot.index, gfx::num_32bit_constants(&world_buffer_info), 0, gfx::as_u8_slice(&world_buffer_info)); } - view.cmd_buf.set_heap(pipeline, &pmfx.shader_heap); + cmd_buf.set_heap(pipeline, &pmfx.shader_heap); for indirect_draw in &indirect_draw_query { - view.cmd_buf.execute_indirect( + cmd_buf.execute_indirect( &indirect_draw.signature, indirect_draw.max_count, &indirect_draw.dynamic_buffer, diff --git a/plugins/ecs_examples/src/lib.rs b/plugins/ecs_examples/src/lib.rs index 9dfefbec..34aee2f3 100644 --- a/plugins/ecs_examples/src/lib.rs +++ b/plugins/ecs_examples/src/lib.rs @@ -243,6 +243,7 @@ pub fn batch_bindless_draw_data( pub fn render_meshes_bindless( pmfx: &Res, view: &pmfx::View, + cmd_buf: &mut ::CmdBuf, queries: ( Query<(&InstanceBuffer, &MeshComponent)>, Query<(&MeshComponent, &WorldMatrix), Without> @@ -256,29 +257,29 @@ pub fn render_meshes_bindless( let camera = pmfx.get_camera_constants(&view.camera)?; let pipeline = pmfx.get_render_pipeline_for_format(&view.view_pipeline, fmt)?; - view.cmd_buf.set_render_pipeline(&pipeline); + cmd_buf.set_render_pipeline(&pipeline); // bind view push constants let slot = pipeline.get_pipeline_slot(0, 0, gfx::DescriptorType::PushConstants); if let Some(slot) = slot { - view.cmd_buf.push_render_constants(slot.index, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); - view.cmd_buf.push_render_constants(slot.index, 4, 16, gfx::as_u8_slice(&camera.view_position)); + cmd_buf.push_render_constants(slot.index, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); + cmd_buf.push_render_constants(slot.index, 4, 16, gfx::as_u8_slice(&camera.view_position)); } // bind the world buffer info let world_buffer_info = pmfx.get_world_buffer_info(); let slot = pipeline.get_pipeline_slot(2, 0, gfx::DescriptorType::PushConstants); if let Some(slot) = slot { - view.cmd_buf.push_render_constants( + cmd_buf.push_render_constants( slot.index, gfx::num_32bit_constants(&world_buffer_info), 0, gfx::as_u8_slice(&world_buffer_info)); } // bind resource uses let using_slot = pipeline.get_pipeline_slot(0, 1, gfx::DescriptorType::PushConstants); - if let Some(slot) = using_slot { + if let Some(_) = using_slot { for i in 0..view.use_indices.len() { let num_constants = gfx::num_32bit_constants(&view.use_indices[i]); - view.cmd_buf.push_compute_constants( + cmd_buf.push_compute_constants( 0, num_constants, i as u32 * num_constants, @@ -288,14 +289,14 @@ pub fn render_meshes_bindless( } // bind the shader resource heap - view.cmd_buf.set_heap(pipeline, &pmfx.shader_heap); + cmd_buf.set_heap(pipeline, &pmfx.shader_heap); // instance batch draw calls for (instance_batch, mesh) in &instance_draw_query { - view.cmd_buf.set_index_buffer(&mesh.0.ib); - view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); - view.cmd_buf.set_vertex_buffer(&instance_batch.buffer, 1); - view.cmd_buf.draw_indexed_instanced(mesh.0.num_indices, instance_batch.instance_count, 0, 0, 0); + cmd_buf.set_index_buffer(&mesh.0.ib); + cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); + cmd_buf.set_vertex_buffer(&instance_batch.buffer, 1); + cmd_buf.draw_indexed_instanced(mesh.0.num_indices, instance_batch.instance_count, 0, 0, 0); } // single draw calls @@ -303,11 +304,11 @@ pub fn render_meshes_bindless( // set the world matrix push constants let slot = pipeline.get_pipeline_slot(1, 0, gfx::DescriptorType::PushConstants); if let Some(slot) = slot { - view.cmd_buf.push_render_constants(slot.index, 12, 0, &world_matrix.0); + cmd_buf.push_render_constants(slot.index, 12, 0, &world_matrix.0); } - view.cmd_buf.set_index_buffer(&mesh.0.ib); - view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); - view.cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); + cmd_buf.set_index_buffer(&mesh.0.ib); + cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); + cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); } Ok(()) @@ -319,6 +320,7 @@ pub fn render_meshes_bindless( pub fn render_meshes( pmfx: &Res, view: &pmfx::View, + cmd_buf: &mut ::CmdBuf, queries: ( Query<(&WorldMatrix, &MeshComponent), Without>, Query<(&WorldMatrix, &MeshComponent), (With, Without)>, @@ -329,20 +331,20 @@ pub fn render_meshes( let pipeline = pmfx.get_render_pipeline_for_format(&view.view_pipeline, fmt)?; let camera = pmfx.get_camera_constants(&view.camera)?; - view.cmd_buf.set_render_pipeline(&pipeline); - view.cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); + cmd_buf.set_render_pipeline(&pipeline); + cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); let (mesh_draw_query, billboard_draw_query, cylindrical_draw_query) = queries; for (world_matrix, mesh) in &mesh_draw_query { let slot = pipeline.get_pipeline_slot(1, 0, gfx::DescriptorType::PushConstants); if let Some(slot) = slot { - view.cmd_buf.push_render_constants(slot.index, 12, 0, &world_matrix.0); + cmd_buf.push_render_constants(slot.index, 12, 0, &world_matrix.0); } - view.cmd_buf.set_index_buffer(&mesh.0.ib); - view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); - view.cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); + cmd_buf.set_index_buffer(&mesh.0.ib); + cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); + cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); } // billboard @@ -351,12 +353,12 @@ pub fn render_meshes( let bbmat = world_matrix.0 * Mat4f::from(inv_rot); let slot = pipeline.get_pipeline_slot(1, 0, gfx::DescriptorType::PushConstants); if let Some(slot) = slot { - view.cmd_buf.push_render_constants(slot.index, 12, 0, &bbmat); + cmd_buf.push_render_constants(slot.index, 12, 0, &bbmat); } - view.cmd_buf.set_index_buffer(&mesh.0.ib); - view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); - view.cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); + cmd_buf.set_index_buffer(&mesh.0.ib); + cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); + cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); } // spherical billboard @@ -370,12 +372,12 @@ pub fn render_meshes( let bbmat = world_matrix.0 * Mat4f::from(cyl_rot); let slot = pipeline.get_pipeline_slot(1, 0, gfx::DescriptorType::PushConstants); if let Some(slot) = slot { - view.cmd_buf.push_render_constants(slot.index, 12, 0, &bbmat); + cmd_buf.push_render_constants(slot.index, 12, 0, &bbmat); } - view.cmd_buf.set_index_buffer(&mesh.0.ib); - view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); - view.cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); + cmd_buf.set_index_buffer(&mesh.0.ib); + cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); + cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); } Ok(()) @@ -387,6 +389,7 @@ pub fn render_meshes( pub fn render_debug( pmfx: &Res, view: &pmfx::View, + cmd_buf: &mut ::CmdBuf, mut imdraw: ResMut, mut device: ResMut, session_info: ResMut, @@ -450,7 +453,7 @@ pub fn render_debug( // cameras if session_info.debug_draw_flags.contains(DebugDrawFlags::CAMERAS) { - for (name, camera) in &camera_query { + for (name, _) in &camera_query { let constants = pmfx.get_camera_constants(name)?; imdraw.add_frustum(constants.view_projection_matrix, Vec4f::white()); } @@ -460,9 +463,9 @@ pub fn render_debug( imdraw.submit(&mut device.0, bb as usize).unwrap(); // draw - view.cmd_buf.set_render_pipeline(&pipeline); - view.cmd_buf.push_render_constants(0, 16, 0, &camera.view_projection_matrix); - imdraw.draw_3d(&view.cmd_buf, bb as usize); + cmd_buf.set_render_pipeline(&pipeline); + cmd_buf.push_render_constants(0, 16, 0, &camera.view_projection_matrix); + imdraw.draw_3d(cmd_buf, bb as usize); Ok(()) } @@ -472,7 +475,9 @@ pub fn render_debug( #[export_render_fn] pub fn blit( pmfx: &Res, - view: &pmfx::View) -> Result<(), hotline_rs::Error> { + view: &pmfx::View, + cmd_buf: &mut ::CmdBuf +) -> Result<(), hotline_rs::Error> { let pmfx = &pmfx; let fmt = view.pass.get_format_hash(); @@ -485,21 +490,21 @@ pub fn blit( } let srv = view.use_indices[0].index; - view.cmd_buf.set_render_pipeline(pipeline); + cmd_buf.set_render_pipeline(pipeline); let slot = pipeline.get_pipeline_slot(0, 0, gfx::DescriptorType::PushConstants); if let Some(slot) = slot { - view.cmd_buf.push_render_constants(slot.index, 2, 0, &view.blit_dimension); + cmd_buf.push_render_constants(slot.index, 2, 0, &view.blit_dimension); } let slot = pipeline.get_pipeline_slot(1, 0, gfx::DescriptorType::ShaderResource); if let Some(slot) = slot { - view.cmd_buf.set_binding(pipeline, &pmfx.shader_heap, slot.index, srv as usize); + cmd_buf.set_binding(pipeline, &pmfx.shader_heap, slot.index, srv as usize); } - view.cmd_buf.set_index_buffer(&pmfx.0.unit_quad_mesh.ib); - view.cmd_buf.set_vertex_buffer(&pmfx.0.unit_quad_mesh.vb, 0); - view.cmd_buf.draw_indexed_instanced(6, 1, 0, 0, 0); + cmd_buf.set_index_buffer(&pmfx.0.unit_quad_mesh.ib); + cmd_buf.set_vertex_buffer(&pmfx.0.unit_quad_mesh.vb, 0); + cmd_buf.draw_indexed_instanced(6, 1, 0, 0, 0); Ok(()) } @@ -509,7 +514,9 @@ pub fn blit( #[export_render_fn] pub fn cubemap_clear( pmfx: &Res, - view: &pmfx::View) -> Result<(), hotline_rs::Error> { + view: &pmfx::View, + cmd_buf: &mut ::CmdBuf +) -> Result<(), hotline_rs::Error> { let pmfx = &pmfx; let fmt = view.pass.get_format_hash(); @@ -523,22 +530,22 @@ pub fn cubemap_clear( } let srv = view.use_indices[0].index; - view.cmd_buf.set_render_pipeline(pipeline); + cmd_buf.set_render_pipeline(pipeline); let slot = pipeline.get_pipeline_slot(0, 0, gfx::DescriptorType::PushConstants); if let Some(slot) = slot { let inv = camera.view_projection_matrix.inverse(); - view.cmd_buf.push_render_constants(slot.index, 16, 0, &inv); + cmd_buf.push_render_constants(slot.index, 16, 0, &inv); } let slot = pipeline.get_pipeline_slot(0, 0, gfx::DescriptorType::ShaderResource); if let Some(slot) = slot { - view.cmd_buf.set_binding(pipeline, &pmfx.shader_heap, slot.index, srv as usize); + cmd_buf.set_binding(pipeline, &pmfx.shader_heap, slot.index, srv as usize); } - view.cmd_buf.set_index_buffer(&pmfx.0.unit_quad_mesh.ib); - view.cmd_buf.set_vertex_buffer(&pmfx.0.unit_quad_mesh.vb, 0); - view.cmd_buf.draw_indexed_instanced(6, 1, 0, 0, 0); + cmd_buf.set_index_buffer(&pmfx.0.unit_quad_mesh.ib); + cmd_buf.set_vertex_buffer(&pmfx.0.unit_quad_mesh.vb, 0); + cmd_buf.draw_indexed_instanced(6, 1, 0, 0, 0); Ok(()) } @@ -548,17 +555,18 @@ pub fn cubemap_clear( #[export_compute_fn] pub fn dispatch_compute( pmfx: &Res, - pass: &pmfx::ComputePass + pass: &pmfx::ComputePass, + cmd_buf: &mut ::CmdBuf ) -> Result<(), hotline_rs::Error> { let pipeline = pmfx.get_compute_pipeline(&pass.pass_pipline)?; - pass.cmd_buf.set_compute_pipeline(&pipeline); + cmd_buf.set_compute_pipeline(&pipeline); let using_slot = pipeline.get_pipeline_slot(0, 1, gfx::DescriptorType::PushConstants); if let Some(slot) = using_slot { for i in 0..pass.use_indices.len() { let num_constants = gfx::num_32bit_constants(&pass.use_indices[i]); - pass.cmd_buf.push_compute_constants( + cmd_buf.push_compute_constants( slot.index, num_constants, i as u32 * num_constants, @@ -567,9 +575,9 @@ pub fn dispatch_compute( } } - pass.cmd_buf.set_heap(pipeline, &pmfx.shader_heap); + cmd_buf.set_heap(pipeline, &pmfx.shader_heap); - pass.cmd_buf.dispatch( + cmd_buf.dispatch( pass.group_count, pass.numthreads ); @@ -581,9 +589,9 @@ pub fn dispatch_compute( pub fn setup_tlas( mut device: ResMut, mut pmfx: ResMut, - mut entities_query: Query<(&mut Position, &mut Scale, &mut Rotation, &BLASComponent)>, - mut tlas_query: Query<&mut TLASComponent>, - mut commands: Commands) -> Result<(), hotline_rs::Error> { + entities_query: Query<(&mut Position, &mut Scale, &mut Rotation, &BLASComponent)>, + mut tlas_query: Query<&mut TLASComponent> +) -> Result<(), hotline_rs::Error> { // setup tlas, first time only for mut t in &mut tlas_query { @@ -626,7 +634,8 @@ pub fn update_tlas( mut device: ResMut, pmfx: &Res, pass: &mut pmfx::ComputePass, - mut entities_query: Query<(&mut Position, &mut Scale, &mut Rotation, &BLASComponent)>, + cmd_buf: &mut ::CmdBuf, + entities_query: Query<(&mut Position, &mut Scale, &mut Rotation, &BLASComponent)>, mut tlas_query: Query<&mut TLASComponent>, ) -> Result<(), hotline_rs::Error> { // update tlas @@ -651,7 +660,7 @@ pub fn update_tlas( if let Some(tlas) = t.tlas.as_ref() { let instance_buffer = device.create_raytracing_instance_buffer(&instances)?; - pass.cmd_buf.update_raytracing_tlas(tlas, &instance_buffer, instances.len(), gfx::AccelerationStructureRebuildMode::Refit); + cmd_buf.update_raytracing_tlas(tlas, &instance_buffer, instances.len(), gfx::AccelerationStructureRebuildMode::Refit); t.instance_buffer = Some(instance_buffer); } } diff --git a/plugins/ecs_examples/src/omni_shadow_map.rs b/plugins/ecs_examples/src/omni_shadow_map.rs index 393ea855..8043493e 100644 --- a/plugins/ecs_examples/src/omni_shadow_map.rs +++ b/plugins/ecs_examples/src/omni_shadow_map.rs @@ -161,11 +161,11 @@ pub fn setup_omni_shadow_map( pub fn animate_omni_shadow ( time: Res, mut pmfx: ResMut, - mut light_query: Query<(&mut Position, &mut Velocity, &LightComponent)>) -> Result<(), hotline_rs::Error> { + mut light_query: Query<(&mut Position, &LightComponent)>) -> Result<(), hotline_rs::Error> { let extent = 60.0; - for (mut position, mut velocity, component) in &mut light_query { + for (mut position, component) in &mut light_query { position.0 = vec3f(sin(time.accumulated), cos(time.accumulated), cos(time.accumulated)) * extent; diff --git a/plugins/ecs_examples/src/pbr.rs b/plugins/ecs_examples/src/pbr.rs index a890554e..ccf789e7 100644 --- a/plugins/ecs_examples/src/pbr.rs +++ b/plugins/ecs_examples/src/pbr.rs @@ -90,6 +90,7 @@ pub fn setup_pbr( pub fn render_meshes_pbr( pmfx: &Res, view: &pmfx::View, + cmd_buf: &mut ::CmdBuf, state: &Res, mesh_draw_query: Query<(&WorldMatrix, &MeshComponent, &TextureInstance)>) -> Result<(), hotline_rs::Error> { @@ -97,11 +98,11 @@ pub fn render_meshes_pbr( let pipeline = pmfx.get_render_pipeline_for_format(&view.view_pipeline, fmt)?; let camera = pmfx.get_camera_constants(&view.camera)?; - view.cmd_buf.set_render_pipeline(pipeline); - view.cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); - view.cmd_buf.push_render_constants(0, 4, 16, gfx::as_u8_slice(&camera.view_position)); + cmd_buf.set_render_pipeline(pipeline); + cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); + cmd_buf.push_render_constants(0, 4, 16, gfx::as_u8_slice(&camera.view_position)); - view.cmd_buf.set_heap(pipeline, &pmfx.shader_heap); + cmd_buf.set_heap(pipeline, &pmfx.shader_heap); let rc = 8; let mut i = 0; @@ -115,13 +116,13 @@ pub fn render_meshes_pbr( 0.0 }; - view.cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0); - view.cmd_buf.push_render_constants(1, 4, 12, gfx::as_u8_slice(&[roughness, metalness, 0.0, 0.0])); - view.cmd_buf.push_render_constants(1, 2, 16, gfx::as_u8_slice(&[cubemap.0, state.lut_srv, 0, 0])); + cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0); + cmd_buf.push_render_constants(1, 4, 12, gfx::as_u8_slice(&[roughness, metalness, 0.0, 0.0])); + cmd_buf.push_render_constants(1, 2, 16, gfx::as_u8_slice(&[cubemap.0, state.lut_srv, 0, 0])); - view.cmd_buf.set_index_buffer(&mesh.0.ib); - view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); - view.cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); + cmd_buf.set_index_buffer(&mesh.0.ib); + cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); + cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); i += 1; } diff --git a/plugins/ecs_examples/src/raster_states.rs b/plugins/ecs_examples/src/raster_states.rs index 2f144c9d..26bfadd8 100644 --- a/plugins/ecs_examples/src/raster_states.rs +++ b/plugins/ecs_examples/src/raster_states.rs @@ -75,6 +75,7 @@ pub fn setup_raster_states( pub fn render_meshes_pipeline( pmfx: &Res, view: &pmfx::View, + cmd_buf: &mut ::CmdBuf, mesh_draw_query: Query<(&WorldMatrix, &MeshComponent, &PipelineComponent)>) -> Result<(), hotline_rs::Error> { let pmfx = &pmfx; @@ -84,13 +85,13 @@ pub fn render_meshes_pipeline( for (world_matrix, mesh, pipeline) in &mesh_draw_query { // set pipeline per mesh let pipeline = pmfx.get_render_pipeline_for_format(&pipeline.0, fmt)?; - view.cmd_buf.set_render_pipeline(&pipeline); - view.cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); - view.cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0); - - view.cmd_buf.set_index_buffer(&mesh.0.ib); - view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); - view.cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); + cmd_buf.set_render_pipeline(&pipeline); + cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); + cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0); + + cmd_buf.set_index_buffer(&mesh.0.ib); + cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); + cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); } Ok(()) diff --git a/plugins/ecs_examples/src/raytracing_pipeline.rs b/plugins/ecs_examples/src/raytracing_pipeline.rs index a90979bb..176debf7 100644 --- a/plugins/ecs_examples/src/raytracing_pipeline.rs +++ b/plugins/ecs_examples/src/raytracing_pipeline.rs @@ -198,10 +198,10 @@ pub fn setup_raytracing_pipeline_scene( #[export_compute_fn] pub fn render_meshes_raytraced( - mut device: ResMut, + device: ResMut, pmfx: &Res, pass: &pmfx::ComputePass, - entities_query: Query<(&mut Position, &mut Scale, &mut Rotation, &BLASComponent)>, + cmd_buf: &mut ::CmdBuf, tlas_query: Query<&mut TLASComponent>, ) -> Result<(), hotline_rs::Error> { let pmfx = &pmfx.0; @@ -217,36 +217,36 @@ pub fn render_meshes_raytraced( if let Some(tlas) = &t.tlas { // set pipeline let raytracing_pipeline = pmfx.get_raytracing_pipeline(&pass.pass_pipline)?; - pass.cmd_buf.set_raytracing_pipeline(&raytracing_pipeline.pipeline); + cmd_buf.set_raytracing_pipeline(&raytracing_pipeline.pipeline); let slot = raytracing_pipeline.pipeline.get_pipeline_slot(0, 0, gfx::DescriptorType::PushConstants); if let Some(slot) = slot { // camera constants let inv = camera.view_projection_matrix.inverse(); - pass.cmd_buf.push_compute_constants(slot.index, 16, 0, &inv); + cmd_buf.push_compute_constants(slot.index, 16, 0, &inv); // output uav - pass.cmd_buf.push_compute_constants(slot.index, 1, 16, gfx::as_u8_slice(&pass.use_indices[0].index)); + cmd_buf.push_compute_constants(slot.index, 1, 16, gfx::as_u8_slice(&pass.use_indices[0].index)); // scene tlas let srv0 = tlas.get_srv_index().expect("expect tlas to have an srv"); - pass.cmd_buf.push_compute_constants(slot.index, 1, 17, gfx::as_u8_slice(&srv0)); + cmd_buf.push_compute_constants(slot.index, 1, 17, gfx::as_u8_slice(&srv0)); // point light info let world_buffer_info = pmfx.get_world_buffer_info(); - pass.cmd_buf.push_compute_constants(slot.index, 2, 18, gfx::as_u8_slice(&world_buffer_info.point_light)); + cmd_buf.push_compute_constants(slot.index, 2, 18, gfx::as_u8_slice(&world_buffer_info.point_light)); } - pass.cmd_buf.set_heap(&raytracing_pipeline.pipeline, &pmfx.shader_heap); + cmd_buf.set_heap(&raytracing_pipeline.pipeline, &pmfx.shader_heap); let second_slot = raytracing_pipeline.pipeline.get_pipeline_slot(1, 0, gfx::DescriptorType::ShaderResource); if let Some(second_slot) = second_slot { let srv_buffer = t.instance_geometry_buffer.as_ref().unwrap().get_srv_index().unwrap(); - pass.cmd_buf.set_binding(&raytracing_pipeline.pipeline, &pmfx.shader_heap, second_slot.index, srv_buffer); + cmd_buf.set_binding(&raytracing_pipeline.pipeline, &pmfx.shader_heap, second_slot.index, srv_buffer); } // dispatch - pass.cmd_buf.dispatch_rays(&raytracing_pipeline.sbt, gfx::Size3 { + cmd_buf.dispatch_rays(&raytracing_pipeline.sbt, gfx::Size3 { x: output_size.0 as u32, y: output_size.1 as u32, z: 1 diff --git a/plugins/ecs_examples/src/tangent_space_normal_maps.rs b/plugins/ecs_examples/src/tangent_space_normal_maps.rs index 23978f0d..c26b6eb7 100644 --- a/plugins/ecs_examples/src/tangent_space_normal_maps.rs +++ b/plugins/ecs_examples/src/tangent_space_normal_maps.rs @@ -52,6 +52,7 @@ pub fn setup_tangent_space_normal_maps( pub fn render_meshes_debug_tangent_space( pmfx: &Res, view: &pmfx::View, + cmd_buf: &mut ::CmdBuf, queries: ( Query<&TextureComponent>, Query<(&WorldMatrix, &MeshComponent)> @@ -62,24 +63,24 @@ pub fn render_meshes_debug_tangent_space( let pipeline = pmfx.get_render_pipeline_for_format(&view.view_pipeline, fmt)?; let camera = pmfx.get_camera_constants(&view.camera)?; - view.cmd_buf.set_render_pipeline(pipeline); - view.cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); + cmd_buf.set_render_pipeline(pipeline); + cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); - view.cmd_buf.set_heap(pipeline, &pmfx.shader_heap); + cmd_buf.set_heap(pipeline, &pmfx.shader_heap); let (texture_query, mesh_draw_query) = queries; // bind first texture if let Some(texture) = (&texture_query).into_iter().next() { let usrv = texture.get_srv_index().unwrap() as u32; - view.cmd_buf.push_render_constants(1, 1, 16, gfx::as_u8_slice(&usrv)); + cmd_buf.push_render_constants(1, 1, 16, gfx::as_u8_slice(&usrv)); } for (world_matrix, mesh) in &mesh_draw_query { - view.cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0); - view.cmd_buf.set_index_buffer(&mesh.0.ib); - view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); - view.cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); + cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0); + cmd_buf.set_index_buffer(&mesh.0.ib); + cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); + cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); } Ok(()) diff --git a/plugins/ecs_examples/src/texture2d_array.rs b/plugins/ecs_examples/src/texture2d_array.rs index d48cdb6d..17ba433a 100644 --- a/plugins/ecs_examples/src/texture2d_array.rs +++ b/plugins/ecs_examples/src/texture2d_array.rs @@ -89,16 +89,17 @@ pub fn setup_texture2d_array( pub fn render_meshes_texture2d_array( pmfx: &Res, view: &pmfx::View, + cmd_buf: &mut ::CmdBuf, mesh_query: Query<(&WorldMatrix, &MeshComponent, &TextureInstance, &AnimatedTexture), With>) -> Result<(), hotline_rs::Error> { let fmt = view.pass.get_format_hash(); let pipeline = pmfx.get_render_pipeline_for_format(&view.view_pipeline, fmt)?; let camera = pmfx.get_camera_constants(&view.camera)?; - view.cmd_buf.set_render_pipeline(pipeline); - view.cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); + cmd_buf.set_render_pipeline(pipeline); + cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); - view.cmd_buf.set_heap(pipeline, &pmfx.shader_heap); + cmd_buf.set_heap(pipeline, &pmfx.shader_heap); // spherical billboard let inv_rot = Mat3f::from(camera.view_matrix.transpose()); @@ -110,12 +111,12 @@ pub fn render_meshes_texture2d_array( for (world_matrix, mesh, texture, animated_texture) in &mesh_query { let bbmat = world_matrix.0 * Mat4f::from(cyl_rot); - view.cmd_buf.push_render_constants(1, 12, 0, &bbmat); - view.cmd_buf.push_render_constants(1, 2, 16, gfx::as_u8_slice(&[texture.0, animated_texture.frame, 0, 0])); + cmd_buf.push_render_constants(1, 12, 0, &bbmat); + cmd_buf.push_render_constants(1, 2, 16, gfx::as_u8_slice(&[texture.0, animated_texture.frame, 0, 0])); - view.cmd_buf.set_index_buffer(&mesh.0.ib); - view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); - view.cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); + cmd_buf.set_index_buffer(&mesh.0.ib); + cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); + cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); } Ok(()) diff --git a/plugins/ecs_examples/src/texture3d.rs b/plugins/ecs_examples/src/texture3d.rs index 01291dc4..a275760d 100644 --- a/plugins/ecs_examples/src/texture3d.rs +++ b/plugins/ecs_examples/src/texture3d.rs @@ -64,24 +64,25 @@ pub fn setup_texture3d( pub fn render_meshes_texture3d( pmfx: &Res, view: &pmfx::View, + cmd_buf: &mut ::CmdBuf, mesh_draw_query: Query<(&WorldMatrix, &MeshComponent, &TextureInstance)>) -> Result<(), hotline_rs::Error> { let fmt = view.pass.get_format_hash(); let pipeline = pmfx.get_render_pipeline_for_format(&view.view_pipeline, fmt)?; let camera = pmfx.get_camera_constants(&view.camera)?; - view.cmd_buf.set_render_pipeline(pipeline); - view.cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); - view.cmd_buf.push_render_constants(0, 4, 16, gfx::as_u8_slice(&camera.view_position)); + cmd_buf.set_render_pipeline(pipeline); + cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix)); + cmd_buf.push_render_constants(0, 4, 16, gfx::as_u8_slice(&camera.view_position)); - view.cmd_buf.set_heap(pipeline, &pmfx.shader_heap); + cmd_buf.set_heap(pipeline, &pmfx.shader_heap); for (world_matrix, mesh, tex) in &mesh_draw_query { - view.cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0); - view.cmd_buf.push_render_constants(1, 2, 16, gfx::as_u8_slice(&[tex.0, 0, 0, 0])); - view.cmd_buf.set_index_buffer(&mesh.0.ib); - view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); - view.cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); + cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0); + cmd_buf.push_render_constants(1, 2, 16, gfx::as_u8_slice(&[tex.0, 0, 0, 0])); + cmd_buf.set_index_buffer(&mesh.0.ib); + cmd_buf.set_vertex_buffer(&mesh.0.vb, 0); + cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0); } Ok(()) diff --git a/plugins/export_macros/src/lib.rs b/plugins/export_macros/src/lib.rs index 100f0d07..db7e93d0 100644 --- a/plugins/export_macros/src/lib.rs +++ b/plugins/export_macros/src/lib.rs @@ -150,7 +150,7 @@ pub fn export_render_fn(attr: TokenStream, item: TokenStream) -> TokenStream { let parsed = parse_fn(&item); // emit code to move function args into closure and pass them to function - let (moves, pass) = emit_moves_and_pass_args(&parsed, &vec!["pmfx :: View"]); + let (moves, pass) = emit_moves_and_pass_args(&parsed, &vec!["pmfx :: View", "< gfx_platform :: Device as Device > :: CmdBuf"]); let order = emit_update_order(attr, "SystemSets :: Render"); let render_closure = quote! { @@ -161,18 +161,19 @@ pub fn export_render_fn(attr: TokenStream, item: TokenStream) -> TokenStream { let err = match view { Ok(v) => { let mut view = v.lock().unwrap(); + let mut cmd_buf = std::mem::take(&mut view.cmd_buf); let col = view.colour_hash; - view.cmd_buf.begin_event(col, &view_name); - - view.cmd_buf.begin_render_pass(&view.pass); - view.cmd_buf.set_viewport(&view.viewport); - view.cmd_buf.set_scissor_rect(&view.scissor_rect); - + cmd_buf.begin_event(col, &view_name); + cmd_buf.begin_render_pass(&view.pass); + cmd_buf.set_viewport(&view.viewport); + cmd_buf.set_scissor_rect(&view.scissor_rect); let result = fn_name(fn_args); + cmd_buf.end_render_pass(); + cmd_buf.end_event(); + + view.cmd_buf = cmd_buf; - view.cmd_buf.end_render_pass(); - view.cmd_buf.end_event(); result } Err(v) => { @@ -214,7 +215,7 @@ pub fn export_compute_fn(attr: TokenStream, item: TokenStream) -> TokenStream { let parsed = parse_fn(&item); // emit code to move function args into closure and pass them to function - let (moves, pass) = emit_moves_and_pass_args(&parsed, &vec!["pmfx :: ComputePass"]); + let (moves, pass) = emit_moves_and_pass_args(&parsed, &vec!["pmfx :: ComputePass", "< gfx_platform :: Device as Device > :: CmdBuf"]); let order = emit_update_order(attr, "SystemSets :: Render"); let render_closure = quote! { @@ -226,11 +227,13 @@ pub fn export_compute_fn(attr: TokenStream, item: TokenStream) -> TokenStream { let err = match pass { Ok(p) => { let mut pass = p.lock().unwrap(); - pass.cmd_buf.begin_event(0xffffff, &pass_name); + let mut cmd_buf = std::mem::take(&mut pass.cmd_buf); + cmd_buf.begin_event(0xffffff, &pass_name); let result = fn_name(fn_args); + cmd_buf.end_event(); - pass.cmd_buf.end_event(); + pass.cmd_buf = cmd_buf; Ok(()) } diff --git a/shaders/bindful.hlsl b/shaders/bindful.hlsl index 65cfa87e..6dda7c24 100644 --- a/shaders/bindful.hlsl +++ b/shaders/bindful.hlsl @@ -1,6 +1,8 @@ +//#pragma argument(developmentfeatures) + struct vs_input { float3 position : POSITION; - float4 colour : COLOR; + float4 uv : TEXCOORD0; }; struct ps_input { @@ -15,10 +17,14 @@ Texture2D texture3 : register(t3); SamplerState sampler0 : register(s0); +cbuffer letterbox : register(b0, space0) { + float2 quad_scale; +}; + ps_input vs_main(vs_input input) { ps_input output; - output.position = float4(input.position, 1.0); - output.uv = input.colour; + output.position = float4(input.position.xy * quad_scale, input.position.z, 1.0); + output.uv = input.uv; return output; } diff --git a/shaders/bindful.pmfx b/shaders/bindful.pmfx index 132347b2..16415323 100644 --- a/shaders/bindful.pmfx +++ b/shaders/bindful.pmfx @@ -16,7 +16,10 @@ ps: ps_main, static_samplers: { sampler0: "wrap_linear" - } + }, + push_constants: [ + "letterbox" + ] topology: "TriangleList" } } diff --git a/shaders/bindless.hlsl b/shaders/bindless.hlsl index 0cddd6d7..5f8159ea 100644 --- a/shaders/bindless.hlsl +++ b/shaders/bindless.hlsl @@ -12,25 +12,20 @@ struct ps_output { float4 colour : SV_Target; }; -cbuffer push_constants : register(b0, space0) { - float4 my_rgba; +cbuffer letterbox : register(b0, space0) { + float2 quad_scale; }; -cbuffer double_constants : register(b1, space0) { - float4 my_rgba2; -}; - -struct data { - float4 rgba; +cbuffer srv_indices : register(b1, space0) { + int4 texture_handle; }; Texture2D texture0[10] : register(t0); -ConstantBuffer cbuffer0[10] : register(b2); SamplerState sampler0 : register(s0); ps_input vs_main(vs_input input) { ps_input output; - output.position = float4(input.position, 1.0); + output.position = float4(input.position.xy * quad_scale, input.position.z, 1.0); output.colour = input.colour; return output; } @@ -41,11 +36,10 @@ ps_output ps_main(ps_input input) { float4 final = float4(0.0, 0.0, 0.0, 0.0); float2 uv = input.colour.rg * float2(1.0, -1.0); - float4 r0 = texture0[1].Sample(sampler0, uv * 2.0); - float4 r1 = texture0[2].Sample(sampler0, uv * 2.0); - float4 r2 = texture0[3].Sample(sampler0, uv * 2.0); - float4 r3 = texture0[4].Sample(sampler0, uv * 2.0); - r3 *= my_rgba; + float4 r0 = texture0[texture_handle[0]].Sample(sampler0, uv * 2.0); + float4 r1 = texture0[texture_handle[1]].Sample(sampler0, uv * 2.0); + float4 r2 = texture0[texture_handle[2]].Sample(sampler0, uv * 2.0); + float4 r3 = texture0[texture_handle[3]].Sample(sampler0, uv * 2.0); if(input.colour.r < 0.5 && input.colour.g < 0.5) { @@ -73,5 +67,5 @@ RWTexture2D rwtex[10] : register(u0); [numthreads(16, 16, 1)] void cs_main(uint3 did : SV_DispatchThreadID) { - rwtex[6][did.xy] = float4(0.0, 0.0, 0.0, 1.0); + rwtex[7][did.xy] = float4(0.0, 0.0, 0.0, 1.0); } \ No newline at end of file diff --git a/shaders/bindless.pmfx b/shaders/bindless.pmfx index 8d4ba915..119e4b35 100644 --- a/shaders/bindless.pmfx +++ b/shaders/bindless.pmfx @@ -15,8 +15,8 @@ vs: vs_main, ps: ps_main, push_constants: [ - "push_constants" - "mush_constants" + "letterbox", + "srv_indices" ] static_samplers: { sampler0: "wrap_linear" diff --git a/shaders/imgui.hlsl b/shaders/imgui.hlsl new file mode 100644 index 00000000..120bdb27 --- /dev/null +++ b/shaders/imgui.hlsl @@ -0,0 +1,37 @@ +cbuffer proj_matrix : register(b0, space0) +{ + float4x4 ProjectionMatrix; +}; + +struct VS_INPUT +{ + float2 pos : POSITION; + float2 uv : TEXCOORD0; + float4 col : COLOR0; +}; + +struct PS_INPUT +{ + float4 pos : SV_POSITION; + float4 col : COLOR0; + float2 uv : TEXCOORD0; +}; + + +PS_INPUT vs_main(VS_INPUT input) +{ + PS_INPUT output; + output.pos = mul(ProjectionMatrix, float4(input.pos.xy, 0.0, 1.0)); + output.col = input.col; + output.uv = input.uv; + return output; +} + +SamplerState sampler0 : register(s0); +Texture2D texture0 : register(t0); + +float4 ps_main(PS_INPUT input) : SV_Target +{ + float4 out_col = input.col * texture0.Sample(sampler0, input.uv); + return out_col; +} \ No newline at end of file diff --git a/shaders/imgui.pmfx b/shaders/imgui.pmfx new file mode 100644 index 00000000..009cc1f1 --- /dev/null +++ b/shaders/imgui.pmfx @@ -0,0 +1,25 @@ +{ + include: [ + "imgui.hlsl" + ] + sampler_states: { + wrap_linear: { + filter: "Linear", + address_u: "Wrap", + address_v: "Wrap", + address_w: "Wrap", + } + } + pipelines: { + default: { + vs: vs_main, + ps: ps_main, + push_constants: [ + "proj_matrix" + ], + static_samplers: { + sampler0: "wrap_linear" + } + } + } +} diff --git a/src/gfx.rs b/src/gfx.rs index 3249928f..e66762c6 100644 --- a/src/gfx.rs +++ b/src/gfx.rs @@ -11,6 +11,8 @@ use serde::{Deserialize, Serialize}; use std::hash::Hash; use maths_rs::max; +use null::*; + type Error = super::Error; /// Macro to pass data!\[expression\] or data!\[\] (None) to a create function, so you don't have to deduce a 'T'. @@ -1416,15 +1418,15 @@ pub trait CmdBuf: Send + Sync + Clone { /// to complete, this value indicates the buffer number you should `write` to during the current frame fn get_backbuffer_index(&self) -> u32; /// Begins a render pass, end must be called - fn begin_render_pass(&self, render_pass: &D::RenderPass); + fn begin_render_pass(&mut self, render_pass: &D::RenderPass); /// End a render pass must be called after `begin_render_pass` has been called - fn end_render_pass(&self); + fn end_render_pass(&mut self); /// Begin a names marker event which will be visible in tools such as PIX or RenderDoc fn begin_event(&mut self, colour: u32, name: &str); /// End an event that was started with `begin_event` fn end_event(&mut self); /// Similar to `begin_event/end_event` except it inserts a single marker point instead of a range - fn set_marker(&self, colour: u32, name: &str); + fn set_marker(&mut self, colour: u32, name: &str); /// Function to specifically insert a timestamp query and request readback into the `Buffer` /// read back the rsult with `Device::read_timestamps` fn timestamp_query(&mut self, heap: &mut D::QueryHeap, resolve_buffer: &mut D::Buffer); @@ -1440,31 +1442,31 @@ pub trait CmdBuf: Send + Sync + Clone { /// Add a uav barrier for resources fn uav_barrier(&mut self, resource: UavResource); /// Set the viewport on the rasterizer stage - fn set_viewport(&self, viewport: &Viewport); + fn set_viewport(&mut self, viewport: &Viewport); /// Set the scissor rect on the rasterizer stage - fn set_scissor_rect(&self, scissor_rect: &ScissorRect); + fn set_scissor_rect(&mut self, scissor_rect: &ScissorRect); /// Set the index `buffer` to use for draw calls, the buffer should be created with `BufferUsage::INDEX` - fn set_index_buffer(&self, buffer: &D::Buffer); + fn set_index_buffer(&mut self, buffer: &D::Buffer); /// Set the index `buffer` on `slot` to use for draw calls, the buffer should be created with `BufferUsage::VERTEX` - fn set_vertex_buffer(&self, buffer: &D::Buffer, slot: u32); + fn set_vertex_buffer(&mut self, buffer: &D::Buffer, slot: u32); /// Set render pipeline for `draw` commands - fn set_render_pipeline(&self, pipeline: &D::RenderPipeline); + fn set_render_pipeline(&mut self, pipeline: &D::RenderPipeline); /// Set a compute pipeline for `dispatch` - fn set_compute_pipeline(&self, pipeline: &D::ComputePipeline); + fn set_compute_pipeline(&mut self, pipeline: &D::ComputePipeline); /// Set a raytracing pipeline for `dispatch_rays` - fn set_raytracing_pipeline(&self, pipeline: &D::RaytracingPipeline); + fn set_raytracing_pipeline(&mut self, pipeline: &D::RaytracingPipeline); /// Set's the active shader heap for the pipeline (srv, uav and cbv) and sets all descriptor tables to the root of the heap - fn set_heap(&self, pipeline: &T, heap: &D::Heap); + fn set_heap(&mut self, pipeline: &T, heap: &D::Heap); /// Binds the heap with offset (texture srv, uav) on to the `slot` of a pipeline. /// this is like a traditional bindful render architecture `cmd.set_binding(pipeline, heap, 0, texture1_id)` - fn set_binding(&self, pipeline: &T, heap: &D::Heap, slot: u32, offset: usize); + fn set_binding(&mut self, pipeline: &T, heap: &D::Heap, slot: u32, offset: usize); /// Push a small amount of data into the command buffer for a render pipeline, num values and dest offset are the number of 32bit values - fn push_render_constants(&self, slot: u32, num_values: u32, dest_offset: u32, data: &[T]); + fn push_render_constants(&mut self, slot: u32, num_values: u32, dest_offset: u32, data: &[T]); /// Push a small amount of data into the command buffer for a compute pipeline, num values and dest offset are the number of 32bit values - fn push_compute_constants(&self, slot: u32, num_values: u32, dest_offset: u32, data: &[T]); + fn push_compute_constants(&mut self, slot: u32, num_values: u32, dest_offset: u32, data: &[T]); /// Make a non-indexed draw call supplying vertex and instance counts fn draw_instanced( - &self, + &mut self, vertex_count: u32, instance_count: u32, start_vertex: u32, @@ -1472,7 +1474,7 @@ pub trait CmdBuf: Send + Sync + Clone { ); /// Make an indexed draw call supplying index and instance counts, an index buffer should be bound fn draw_indexed_instanced( - &self, + &mut self, index_count: u32, instance_count: u32, start_index: u32, @@ -1480,10 +1482,10 @@ pub trait CmdBuf: Send + Sync + Clone { start_instance: u32, ); /// Thread count is required for metal, in hlsl it is specified in the shader - fn dispatch(&self, group_count: Size3, numthreads: Size3); + fn dispatch(&mut self, group_count: Size3, numthreads: Size3); /// Issue indirect commands with signature created from `create_indirect_render_command` fn execute_indirect( - &self, + &mut self, command: &D::CommandSignature, max_command_count: u32, argument_buffer: &D::Buffer, @@ -1492,11 +1494,11 @@ pub trait CmdBuf: Send + Sync + Clone { counter_buffer_offset: usize ); /// Issue dispatch call for ray tracing with the specified `RaytracingShaderBindingTable` which is associated with the bound `RaytracingPipeline` - fn dispatch_rays(&self, sbt: &D::RaytracingShaderBindingTable, numthreads: Size3); + fn dispatch_rays(&mut self, sbt: &D::RaytracingShaderBindingTable, numthreads: Size3); /// Update a raytracing TLAS with instance transform info contained in `instance_buffer` of length `instance_count`. Use `mode` to control quick refit or full rebuild fn update_raytracing_tlas(&mut self, tlas: &D::RaytracingTLAS, instance_buffer: &D::Buffer, instance_count: usize, mode: AccelerationStructureRebuildMode); /// Resolves the `subresource` (mip index, 3d texture slice or array slice) - fn resolve_texture_subresource(&self, texture: &D::Texture, subresource: u32) -> Result<(), Error>; + fn resolve_texture_subresource(&mut self, texture: &D::Texture, subresource: u32) -> Result<(), Error>; /// Generates a full mip chain for the specified `texture` where `heap` is the shader heap the texture was created on fn generate_mip_maps(&mut self, texture: &D::Texture, device: &D, heap: &D::Heap) -> Result<(), Error>; /// Read back the swapchains contents to CPU diff --git a/src/gfx/d3d12.rs b/src/gfx/d3d12.rs index 56bbf9ab..5b0b0027 100644 --- a/src/gfx/d3d12.rs +++ b/src/gfx/d3d12.rs @@ -176,7 +176,7 @@ pub struct RenderPipeline { lookup: RootSignatureLookup } -#[derive(Clone)] +#[derive(Clone, Default)] pub struct CmdBuf { bb_index: usize, command_allocator: Vec, @@ -4143,7 +4143,7 @@ impl super::CmdBuf for CmdBuf { self.bb_index as u32 } - fn begin_render_pass(&self, render_pass: &RenderPass) { + fn begin_render_pass(&mut self, render_pass: &RenderPass) { unsafe { let cmd4: ID3D12GraphicsCommandList4 = self.cmd().cast().unwrap(); cmd4.BeginRenderPass( @@ -4158,7 +4158,7 @@ impl super::CmdBuf for CmdBuf { } } - fn end_render_pass(&self) { + fn end_render_pass(&mut self) { unsafe { let cmd4: ID3D12GraphicsCommandList4 = self.cmd().cast().unwrap(); cmd4.EndRenderPass(); @@ -4291,7 +4291,7 @@ impl super::CmdBuf for CmdBuf { self.in_flight_barriers[bb].push(barrier); } - fn set_viewport(&self, viewport: &super::Viewport) { + fn set_viewport(&mut self, viewport: &super::Viewport) { let d3d12_vp = D3D12_VIEWPORT { TopLeftX: viewport.x, TopLeftY: viewport.y, @@ -4305,7 +4305,7 @@ impl super::CmdBuf for CmdBuf { } } - fn set_scissor_rect(&self, scissor_rect: &super::ScissorRect) { + fn set_scissor_rect(&mut self, scissor_rect: &super::ScissorRect) { let d3d12_sr = RECT { left: scissor_rect.left, top: scissor_rect.top, @@ -4318,7 +4318,7 @@ impl super::CmdBuf for CmdBuf { } } - fn set_vertex_buffer(&self, buffer: &Buffer, slot: u32) { + fn set_vertex_buffer(&mut self, buffer: &Buffer, slot: u32) { let cmd = self.cmd(); if buffer.vbv.is_some() { unsafe { @@ -4327,7 +4327,7 @@ impl super::CmdBuf for CmdBuf { } } - fn set_index_buffer(&self, buffer: &Buffer) { + fn set_index_buffer(&mut self, buffer: &Buffer) { let cmd = self.cmd(); if buffer.ibv.is_some() { unsafe { @@ -4336,7 +4336,7 @@ impl super::CmdBuf for CmdBuf { } } - fn set_render_pipeline(&self, pipeline: &RenderPipeline) { + fn set_render_pipeline(&mut self, pipeline: &RenderPipeline) { let cmd = self.cmd(); unsafe { cmd.SetGraphicsRootSignature(&pipeline.root_signature); @@ -4345,7 +4345,7 @@ impl super::CmdBuf for CmdBuf { } } - fn set_compute_pipeline(&self, pipeline: &ComputePipeline) { + fn set_compute_pipeline(&mut self, pipeline: &ComputePipeline) { let cmd = self.cmd(); unsafe { cmd.SetComputeRootSignature(&pipeline.root_signature); @@ -4353,7 +4353,7 @@ impl super::CmdBuf for CmdBuf { } } - fn set_raytracing_pipeline(&self, pipeline: &RaytracingPipeline) { + fn set_raytracing_pipeline(&mut self, pipeline: &RaytracingPipeline) { let cmd = self.cmd().cast::().unwrap(); unsafe { cmd.SetComputeRootSignature(&pipeline.root_signature); @@ -4361,7 +4361,7 @@ impl super::CmdBuf for CmdBuf { } } - fn set_heap(&self, pipeline: &T, heap: &Heap) { + fn set_heap(&mut self, pipeline: &T, heap: &Heap) { unsafe { self.cmd().SetDescriptorHeaps(&[Some(heap.heap.clone())]); let slots = pipeline.get_pipeline_slots(); @@ -4387,7 +4387,7 @@ impl super::CmdBuf for CmdBuf { } } - fn set_binding(&self, _: &T, heap: &Heap, slot: u32, offset: usize) { + fn set_binding(&mut self, _: &T, heap: &Heap, slot: u32, offset: usize) { unsafe { self.cmd().SetDescriptorHeaps(&[Some(heap.heap.clone())]); let mut base = heap.heap.GetGPUDescriptorHandleForHeapStart(); @@ -4404,14 +4404,14 @@ impl super::CmdBuf for CmdBuf { } } - fn set_marker(&self, colour: u32, name: &str) { + fn set_marker(&mut self, colour: u32, name: &str) { let cmd = &self.command_list[self.bb_index]; if self.pix.is_some() { self.pix.unwrap().set_marker_on_command_list(cmd, colour as u64, name); } } - fn push_render_constants(&self, slot: u32, num_values: u32, dest_offset: u32, data: &[T]) { + fn push_render_constants(&mut self, slot: u32, num_values: u32, dest_offset: u32, data: &[T]) { let cmd = self.cmd(); unsafe { cmd.SetGraphicsRoot32BitConstants( @@ -4423,7 +4423,7 @@ impl super::CmdBuf for CmdBuf { } } - fn push_compute_constants(&self, slot: u32, num_values: u32, dest_offset: u32, data: &[T]) { + fn push_compute_constants(&mut self, slot: u32, num_values: u32, dest_offset: u32, data: &[T]) { let cmd = self.cmd(); unsafe { cmd.SetComputeRoot32BitConstants( @@ -4436,7 +4436,7 @@ impl super::CmdBuf for CmdBuf { } fn draw_instanced( - &self, + &mut self, vertex_count: u32, instance_count: u32, start_vertex: u32, @@ -4448,7 +4448,7 @@ impl super::CmdBuf for CmdBuf { } fn draw_indexed_instanced( - &self, + &mut self, index_count: u32, instance_count: u32, start_index: u32, @@ -4466,14 +4466,14 @@ impl super::CmdBuf for CmdBuf { } } - fn dispatch(&self, group_count: Size3, _numthreads: Size3) { + fn dispatch(&mut self, group_count: Size3, _numthreads: Size3) { unsafe { self.cmd().Dispatch(group_count.x, group_count.y, group_count.z); } } fn execute_indirect( - &self, + &mut self, command: &CommandSignature, max_command_count: u32, argument_buffer: &Buffer, @@ -4494,7 +4494,7 @@ impl super::CmdBuf for CmdBuf { } } - fn dispatch_rays(&self, sbt: &RaytracingShaderBindingTable, numthreads: Size3) { + fn dispatch_rays(&mut self, sbt: &RaytracingShaderBindingTable, numthreads: Size3) { unsafe { let dispatch_desc = D3D12_DISPATCH_RAYS_DESC { RayGenerationShaderRecord: D3D12_GPU_VIRTUAL_ADDRESS_RANGE { @@ -4645,7 +4645,7 @@ impl super::CmdBuf for CmdBuf { } } - fn resolve_texture_subresource(&self, texture: &Texture, subresource: u32) -> result::Result<(), super::Error> { + fn resolve_texture_subresource(&mut self, texture: &Texture, subresource: u32) -> result::Result<(), super::Error> { unsafe { if let Some(resolve) = &texture.resolved_resource { self.cmd().ResolveSubresource( diff --git a/src/gfx/null.rs b/src/gfx/null.rs index 8f9c64c2..38e538af 100644 --- a/src/gfx/null.rs +++ b/src/gfx/null.rs @@ -130,11 +130,11 @@ impl super::CmdBuf for CmdBuf { unimplemented!() } - fn begin_render_pass(&self, render_pass: &RenderPass) { + fn begin_render_pass(&mut self, render_pass: &RenderPass) { unimplemented!() } - fn end_render_pass(&self) { + fn end_render_pass(&mut self) { unimplemented!() } @@ -146,7 +146,7 @@ impl super::CmdBuf for CmdBuf { unimplemented!() } - fn set_marker(&self, colour: u32, name: &str) { + fn set_marker(&mut self, colour: u32, name: &str) { unimplemented!() } @@ -174,52 +174,52 @@ impl super::CmdBuf for CmdBuf { unimplemented!() } - fn set_viewport(&self, viewport: &Viewport) { + fn set_viewport(&mut self, viewport: &Viewport) { unimplemented!() } - fn set_scissor_rect(&self, scissor_rect: &ScissorRect) { + fn set_scissor_rect(&mut self, scissor_rect: &ScissorRect) { unimplemented!() } - fn set_index_buffer(&self, buffer: &Buffer) { + fn set_index_buffer(&mut self, buffer: &Buffer) { unimplemented!() } - fn set_vertex_buffer(&self, buffer: &Buffer, slot: u32) { + fn set_vertex_buffer(&mut self, buffer: &Buffer, slot: u32) { unimplemented!() } - fn set_render_pipeline(&self, pipeline: &RenderPipeline) { + fn set_render_pipeline(&mut self, pipeline: &RenderPipeline) { unimplemented!() } - fn set_compute_pipeline(&self, pipeline: &ComputePipeline) { + fn set_compute_pipeline(&mut self, pipeline: &ComputePipeline) { unimplemented!() } - fn set_raytracing_pipeline(&self, pipeline: &RaytracingPipeline) { + fn set_raytracing_pipeline(&mut self, pipeline: &RaytracingPipeline) { unimplemented!() } - fn set_heap(&self, pipeline: &T, heap: &Heap) { + fn set_heap(&mut self, pipeline: &T, heap: &Heap) { unimplemented!() } - fn set_binding(&self, pipeline: &T, heap: &Heap, slot: u32, offset: usize) { + fn set_binding(&mut self, pipeline: &T, heap: &Heap, slot: u32, offset: usize) { unimplemented!() } - fn push_render_constants(&self, slot: u32, num_values: u32, dest_offset: u32, data: &[T]) { + fn push_render_constants(&mut self, slot: u32, num_values: u32, dest_offset: u32, data: &[T]) { unimplemented!() } - fn push_compute_constants(&self, slot: u32, num_values: u32, dest_offset: u32, data: &[T]) { + fn push_compute_constants(&mut self, slot: u32, num_values: u32, dest_offset: u32, data: &[T]) { unimplemented!() } fn draw_instanced( - &self, + &mut self, vertex_count: u32, instance_count: u32, start_vertex: u32, @@ -229,7 +229,7 @@ impl super::CmdBuf for CmdBuf { } fn draw_indexed_instanced( - &self, + &mut self, index_count: u32, instance_count: u32, start_index: u32, @@ -239,12 +239,12 @@ impl super::CmdBuf for CmdBuf { unimplemented!() } - fn dispatch(&self, group_count: Size3, numthreads: Size3) { + fn dispatch(&mut self, group_count: Size3, numthreads: Size3) { unimplemented!() } fn execute_indirect( - &self, + &mut self, command: &CommandSignature, max_command_count: u32, argument_buffer: &Buffer, @@ -255,7 +255,7 @@ impl super::CmdBuf for CmdBuf { unimplemented!() } - fn dispatch_rays(&self, sbt: &RaytracingShaderBindingTable, numthreads: Size3) { + fn dispatch_rays(&mut self, sbt: &RaytracingShaderBindingTable, numthreads: Size3) { unimplemented!() } @@ -263,7 +263,7 @@ impl super::CmdBuf for CmdBuf { unimplemented!() } - fn resolve_texture_subresource(&self, texture: &Texture, subresource: u32) -> Result<(), Error> { + fn resolve_texture_subresource(&mut self, texture: &Texture, subresource: u32) -> Result<(), Error> { unimplemented!() } diff --git a/src/imdraw.rs b/src/imdraw.rs index d0499511..3f064ed7 100644 --- a/src/imdraw.rs +++ b/src/imdraw.rs @@ -257,14 +257,14 @@ impl ImDraw where D: gfx::Device { Ok(()) } - pub fn draw_2d(&mut self, cmd: &D::CmdBuf, buffer_index: usize) { + pub fn draw_2d(&mut self, cmd: &mut D::CmdBuf, buffer_index: usize) { if buffer_index < self.vertices_2d.gpu_data.len() { cmd.set_vertex_buffer(&self.vertices_2d.gpu_data[buffer_index], 0); cmd.draw_instanced(self.vertices_2d.vertex_count, 1, 0, 0); } } - pub fn draw_3d(&mut self, cmd: &D::CmdBuf, buffer_index: usize) { + pub fn draw_3d(&mut self, cmd: &mut D::CmdBuf, buffer_index: usize) { if buffer_index < self.vertices_3d.gpu_data.len() { cmd.set_vertex_buffer(&self.vertices_3d.gpu_data[buffer_index], 0); cmd.draw_instanced(self.vertices_3d.vertex_count, 1, 0, 0);