Skip to content

Commit 76ec115

Browse files
committed
- fixup ecs render and compute fn mutability issues with cmdbuf
1 parent 1d8afb5 commit 76ec115

34 files changed

Lines changed: 245 additions & 227 deletions

plugins/ecs/src/lib.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ use hotline_rs::prelude::*;
66
use maths_rs::prelude::*;
77

88
use bevy_ecs::prelude::*;
9-
10-
use bevy_ecs::schedule::SystemConfig;
119
use bevy_ecs::schedule::SystemConfigs;
1210

1311
use std::collections::HashMap;

plugins/ecs_examples/src/bindless_material.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// currently windows only because here we need a concrete gfx and os implementation
2-
#![cfg(target_os = "macos")]
2+
#![cfg(target_os = "windows")]
33

44
///
55
/// Bindless Material

plugins/ecs_examples/src/bindless_texture.rs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// currently windows only because here we need a concrete gfx and os implementation
2-
#![cfg(target_os = "macos")]
2+
#![cfg(target_os = "windows")]
33

44
///
55
/// Bindless Texture
@@ -152,25 +152,26 @@ pub fn setup_bindless_texture(
152152
pub fn draw_meshes_bindless_texture(
153153
pmfx: &Res<PmfxRes>,
154154
view: &pmfx::View<gfx_platform::Device>,
155+
cmd_buf: &mut <gfx_platform::Device as Device>::CmdBuf,
155156
mesh_draw_query: Query<(&WorldMatrix, &MeshComponent, &TextureInstance)>) -> Result<(), hotline_rs::Error> {
156157

157158
let pmfx = &pmfx;
158159
let fmt = view.pass.get_format_hash();
159160
let pipeline = pmfx.get_render_pipeline_for_format(&view.view_pipeline, fmt)?;
160161
let camera = pmfx.get_camera_constants(&view.camera)?;
161162

162-
view.cmd_buf.set_render_pipeline(pipeline);
163-
view.cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix));
163+
cmd_buf.set_render_pipeline(pipeline);
164+
cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix));
164165

165-
view.cmd_buf.set_heap(pipeline, &pmfx.shader_heap);
166+
cmd_buf.set_heap(pipeline, &pmfx.shader_heap);
166167

167168
for (world_matrix, mesh, texture) in &mesh_draw_query {
168-
view.cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0);
169-
view.cmd_buf.push_render_constants(1, 1, 16, gfx::as_u8_slice(&texture.0));
169+
cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0);
170+
cmd_buf.push_render_constants(1, 1, 16, gfx::as_u8_slice(&texture.0));
170171

171-
view.cmd_buf.set_index_buffer(&mesh.0.ib);
172-
view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0);
173-
view.cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0);
172+
cmd_buf.set_index_buffer(&mesh.0.ib);
173+
cmd_buf.set_vertex_buffer(&mesh.0.vb, 0);
174+
cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0);
174175
}
175176

176177
Ok(())

plugins/ecs_examples/src/blend_states.rs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// currently windows only because here we need a concrete gfx and os implementation
2-
#![cfg(target_os = "macos")]
2+
#![cfg(target_os = "windows")]
33

44
///
55
/// Blend States
@@ -107,6 +107,7 @@ pub fn setup_blend_states(
107107
pub fn render_meshes_pipeline_coloured(
108108
pmfx: &Res<PmfxRes>,
109109
view: &pmfx::View<gfx_platform::Device>,
110+
cmd_buf: &mut <gfx_platform::Device as Device>::CmdBuf,
110111
mesh_draw_query: Query<(&WorldMatrix, &MeshComponent, &PipelineComponent, &Colour)>) -> Result<(), hotline_rs::Error> {
111112

112113
let pmfx = &pmfx;
@@ -116,14 +117,14 @@ pub fn render_meshes_pipeline_coloured(
116117
for (world_matrix, mesh, pipeline, colour) in &mesh_draw_query {
117118
// set pipeline per mesh
118119
let pipeline = pmfx.get_render_pipeline_for_format(&pipeline.0, fmt)?;
119-
view.cmd_buf.set_render_pipeline(pipeline);
120-
view.cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix));
121-
view.cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0);
122-
view.cmd_buf.push_render_constants(1, 4, 12, &colour.0);
123-
124-
view.cmd_buf.set_index_buffer(&mesh.0.ib);
125-
view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0);
126-
view.cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0);
120+
cmd_buf.set_render_pipeline(pipeline);
121+
cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix));
122+
cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0);
123+
cmd_buf.push_render_constants(1, 4, 12, &colour.0);
124+
125+
cmd_buf.set_index_buffer(&mesh.0.ib);
126+
cmd_buf.set_vertex_buffer(&mesh.0.vb, 0);
127+
cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0);
127128
}
128129

129130
Ok(())

plugins/ecs_examples/src/cubemap.rs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// currently windows only because here we need a concrete gfx and os implementation
2-
#![cfg(target_os = "macos")]
2+
#![cfg(target_os = "windows")]
33

44
///
55
/// Cubemap
@@ -70,25 +70,26 @@ pub fn setup_cubemap(
7070
pub fn render_meshes_cubemap(
7171
pmfx: &Res<PmfxRes>,
7272
view: &pmfx::View<gfx_platform::Device>,
73+
cmd_buf: &mut <gfx_platform::Device as Device>::CmdBuf,
7374
mesh_draw_query: Query<(&WorldMatrix, &MeshComponent, &TextureInstance)>) -> Result<(), hotline_rs::Error> {
7475

7576
let fmt = view.pass.get_format_hash();
7677
let pipeline = pmfx.get_render_pipeline_for_format(&view.view_pipeline, fmt)?;
7778
let camera = pmfx.get_camera_constants(&view.camera)?;
7879

79-
view.cmd_buf.set_render_pipeline(pipeline);
80-
view.cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix));
80+
cmd_buf.set_render_pipeline(pipeline);
81+
cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix));
8182

82-
view.cmd_buf.set_heap(pipeline, &pmfx.shader_heap);
83+
cmd_buf.set_heap(pipeline, &pmfx.shader_heap);
8384

8485
let mut mip = 0;
8586
for (world_matrix, mesh, cubemap) in &mesh_draw_query {
86-
view.cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0);
87-
view.cmd_buf.push_render_constants(1, 2, 16, gfx::as_u8_slice(&[cubemap.0, mip, 0, 0]));
87+
cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0);
88+
cmd_buf.push_render_constants(1, 2, 16, gfx::as_u8_slice(&[cubemap.0, mip, 0, 0]));
8889

89-
view.cmd_buf.set_index_buffer(&mesh.0.ib);
90-
view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0);
91-
view.cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0);
90+
cmd_buf.set_index_buffer(&mesh.0.ib);
91+
cmd_buf.set_vertex_buffer(&mesh.0.vb, 0);
92+
cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0);
9293

9394
mip += 1;
9495
}

plugins/ecs_examples/src/directional_lights.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// currently windows only because here we need a concrete gfx and os implementation
2-
#![cfg(target_os = "macos")]
2+
#![cfg(target_os = "windows")]
33

44
use crate::prelude::*;
55

plugins/ecs_examples/src/draw.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// currently windows only because here we need a concrete gfx and os implementation
2-
#![cfg(target_os = "macos")]
2+
#![cfg(target_os = "windows")]
33

44
///
55
/// Draw
@@ -49,18 +49,19 @@ pub fn setup_draw(
4949
pub fn draw_meshes(
5050
pmfx: &Res<PmfxRes>,
5151
view: &pmfx::View<gfx_platform::Device>,
52+
cmd_buf: &mut <gfx_platform::Device as Device>::CmdBuf,
5253
mesh_draw_query: Query<(&WorldMatrix, &MeshComponent)>) -> Result<(), hotline_rs::Error> {
5354

5455
let fmt = view.pass.get_format_hash();
5556
let pipeline = pmfx.get_render_pipeline_for_format(&view.view_pipeline, fmt)?;
5657
let camera = pmfx.get_camera_constants(&view.camera)?;
5758

58-
view.cmd_buf.set_render_pipeline(pipeline);
59-
view.cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix));
59+
cmd_buf.set_render_pipeline(pipeline);
60+
cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix));
6061

6162
for (_, mesh) in &mesh_draw_query {
62-
view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0);
63-
view.cmd_buf.draw_instanced(3, 1, 0, 0);
63+
cmd_buf.set_vertex_buffer(&mesh.0.vb, 0);
64+
cmd_buf.draw_instanced(3, 1, 0, 0);
6465
}
6566

6667
Ok(())

plugins/ecs_examples/src/draw_cbuffer_instanced.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// currently windows only because here we need a concrete gfx and os implementation
2-
#![cfg(target_os = "macos")]
2+
#![cfg(target_os = "windows")]
33

44
///
55
/// Draw cbuffer Instanced
@@ -97,6 +97,7 @@ pub fn setup_draw_cbuffer_instanced(
9797
pub fn draw_meshes_cbuffer_instanced(
9898
pmfx: &Res<PmfxRes>,
9999
view: &pmfx::View<gfx_platform::Device>,
100+
cmd_buf: &mut <gfx_platform::Device as Device>::CmdBuf,
100101
instance_draw_query: Query<(&InstanceBuffer, &MeshComponent, &PipelineComponent)>
101102
) -> Result<(), hotline_rs::Error> {
102103

@@ -107,13 +108,13 @@ pub fn draw_meshes_cbuffer_instanced(
107108
for (instance_batch, mesh, pipeline) in &instance_draw_query {
108109
// set pipeline per batch
109110
let pipeline = pmfx.get_render_pipeline_for_format(&pipeline.0, fmt)?;
110-
view.cmd_buf.set_render_pipeline(pipeline);
111-
view.cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix));
111+
cmd_buf.set_render_pipeline(pipeline);
112+
cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix));
112113

113114
// bind the constant buffer (cbv) on the slot for b1, space0 specified in the shader
114115
let pipeline_slot = pipeline.get_pipeline_slot(1, 0, gfx::DescriptorType::ConstantBuffer);
115116
if let Some(pipeline_slot) = pipeline_slot {
116-
view.cmd_buf.set_binding(
117+
cmd_buf.set_binding(
117118
pipeline,
118119
instance_batch.heap.as_ref().unwrap(),
119120
pipeline_slot.index,
@@ -122,9 +123,9 @@ pub fn draw_meshes_cbuffer_instanced(
122123
}
123124

124125
// bind vb, ib and draw instanced
125-
view.cmd_buf.set_index_buffer(&mesh.0.ib);
126-
view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0);
127-
view.cmd_buf.draw_indexed_instanced(mesh.0.num_indices, instance_batch.instance_count, 0, 0, 0);
126+
cmd_buf.set_index_buffer(&mesh.0.ib);
127+
cmd_buf.set_vertex_buffer(&mesh.0.vb, 0);
128+
cmd_buf.draw_indexed_instanced(mesh.0.num_indices, instance_batch.instance_count, 0, 0, 0);
128129
}
129130

130131
Ok(())

plugins/ecs_examples/src/draw_indexed.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// currently windows only because here we need a concrete gfx and os implementation
2-
#![cfg(target_os = "macos")]
2+
#![cfg(target_os = "windows")]
33

44
///
55
/// Draw Indexed
@@ -47,19 +47,20 @@ pub fn setup_draw_indexed(
4747
pub fn draw_meshes_indexed(
4848
pmfx: &Res<PmfxRes>,
4949
view: &pmfx::View<gfx_platform::Device>,
50+
cmd_buf: &mut <gfx_platform::Device as Device>::CmdBuf,
5051
mesh_draw_query: Query<(&WorldMatrix, &MeshComponent)>) -> Result<(), hotline_rs::Error> {
5152

5253
let fmt = view.pass.get_format_hash();
5354
let pipeline = pmfx.get_render_pipeline_for_format(&view.view_pipeline, fmt)?;
5455
let camera = pmfx.get_camera_constants(&view.camera)?;
5556

56-
view.cmd_buf.set_render_pipeline(pipeline);
57-
view.cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix));
57+
cmd_buf.set_render_pipeline(pipeline);
58+
cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix));
5859

5960
for (_, mesh) in &mesh_draw_query {
60-
view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0);
61-
view.cmd_buf.set_index_buffer(&mesh.0.ib);
62-
view.cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0);
61+
cmd_buf.set_vertex_buffer(&mesh.0.vb, 0);
62+
cmd_buf.set_index_buffer(&mesh.0.ib);
63+
cmd_buf.draw_indexed_instanced(mesh.0.num_indices, 1, 0, 0, 0);
6364
}
6465

6566
Ok(())

plugins/ecs_examples/src/draw_indirect.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// currently windows only because here we need a concrete gfx and os implementation
2-
#![cfg(target_os = "macos")]
2+
#![cfg(target_os = "windows")]
33

44
///
55
/// Draw Indirect
@@ -114,22 +114,23 @@ pub fn setup_draw_indirect(
114114
pub fn draw_meshes_indirect(
115115
pmfx: &Res<PmfxRes>,
116116
view: &pmfx::View<gfx_platform::Device>,
117+
cmd_buf: &mut <gfx_platform::Device as Device>::CmdBuf,
117118
mesh_draw_indirect_query: Query<(&WorldMatrix, &MeshComponent, &CommandSignatureComponent, &BufferComponent)>)
118119
-> Result<(), hotline_rs::Error> {
119120

120121
let fmt = view.pass.get_format_hash();
121122
let pipeline = pmfx.get_render_pipeline_for_format(&view.view_pipeline, fmt)?;
122123
let camera = pmfx.get_camera_constants(&view.camera)?;
123124

124-
view.cmd_buf.set_render_pipeline(pipeline);
125-
view.cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix));
125+
cmd_buf.set_render_pipeline(pipeline);
126+
cmd_buf.push_render_constants(0, 16, 0, gfx::as_u8_slice(&camera.view_projection_matrix));
126127

127128
for (world_matrix, mesh, command, args) in &mesh_draw_indirect_query {
128-
view.cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0);
129-
view.cmd_buf.set_index_buffer(&mesh.0.ib);
130-
view.cmd_buf.set_vertex_buffer(&mesh.0.vb, 0);
129+
cmd_buf.push_render_constants(1, 12, 0, &world_matrix.0);
130+
cmd_buf.set_index_buffer(&mesh.0.ib);
131+
cmd_buf.set_vertex_buffer(&mesh.0.vb, 0);
131132

132-
view.cmd_buf.execute_indirect(
133+
cmd_buf.execute_indirect(
133134
&command.0,
134135
1,
135136
&args.0,

0 commit comments

Comments
 (0)