From 7b015457163c35b66ed047d2dd2b8e2b85bf6765 Mon Sep 17 00:00:00 2001 From: Karol Herbst Date: Wed, 14 Sep 2022 17:53:18 +0200 Subject: [PATCH] rusticl: use real constant buffer for cb0 Signed-off-by: Karol Herbst Reviewed-by: Alyssa Rosenzweig Reviewed-By: Mike Blumenkrantz Part-of: --- src/gallium/frontends/rusticl/core/kernel.rs | 9 ++++-- .../frontends/rusticl/mesa/pipe/context.rs | 32 +++++++++++++------ 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/gallium/frontends/rusticl/core/kernel.rs b/src/gallium/frontends/rusticl/core/kernel.rs index 11199bfbf44..31ce0a8b1b4 100644 --- a/src/gallium/frontends/rusticl/core/kernel.rs +++ b/src/gallium/frontends/rusticl/core/kernel.rs @@ -588,6 +588,10 @@ fn lower_and_optimize_nir_late( nir.pass0(nir_lower_int64); } + if nir_options.lower_uniforms_to_ubo { + nir.pass0(rusticl_lower_inputs); + } + nir.pass1(nir_lower_convert_alu_types, None); opt_nir(nir, dev); @@ -988,15 +992,16 @@ impl Kernel { init_data.len() as u32, ); } - let cso = ctx.create_compute_state(nir, input.len() as u32, local_size as u32); + let cso = ctx.create_compute_state(nir, local_size as u32); ctx.bind_compute_state(cso); ctx.bind_sampler_states(&samplers); ctx.set_sampler_views(&mut sviews); ctx.set_shader_images(&iviews); ctx.set_global_binding(resources.as_slice(), &mut globals); + ctx.set_constant_buffer(0, &input); - ctx.launch_grid(work_dim, block, grid, &input); + ctx.launch_grid(work_dim, block, grid); ctx.clear_global_binding(globals.len() as u32); ctx.clear_shader_images(iviews.len() as u32); diff --git a/src/gallium/frontends/rusticl/mesa/pipe/context.rs b/src/gallium/frontends/rusticl/mesa/pipe/context.rs index 39a18be20a4..bda36c41e8c 100644 --- a/src/gallium/frontends/rusticl/mesa/pipe/context.rs +++ b/src/gallium/frontends/rusticl/mesa/pipe/context.rs @@ -265,16 +265,11 @@ impl PipeContext { unsafe { self.pipe.as_ref().texture_unmap.unwrap()(self.pipe.as_ptr(), tx) }; } - pub fn create_compute_state( - &self, - nir: &NirShader, - input_mem: u32, - local_mem: u32, - ) -> *mut c_void { + pub fn create_compute_state(&self, nir: &NirShader, local_mem: u32) -> *mut c_void { let state = pipe_compute_state { ir_type: pipe_shader_ir::PIPE_SHADER_IR_NIR, prog: nir.dup_for_driver().cast(), - req_input_mem: input_mem, + req_input_mem: 0, req_local_mem: local_mem, }; unsafe { self.pipe.as_ref().create_compute_state.unwrap()(self.pipe.as_ptr(), &state) } @@ -321,10 +316,28 @@ impl PipeContext { unsafe { self.pipe.as_ref().delete_sampler_state.unwrap()(self.pipe.as_ptr(), ptr) } } - pub fn launch_grid(&self, work_dim: u32, block: [u32; 3], grid: [u32; 3], input: &[u8]) { + pub fn set_constant_buffer(&self, idx: u32, data: &[u8]) { + let cb = pipe_constant_buffer { + buffer: ptr::null_mut(), + buffer_offset: 0, + buffer_size: data.len() as u32, + user_buffer: data.as_ptr().cast(), + }; + unsafe { + self.pipe.as_ref().set_constant_buffer.unwrap()( + self.pipe.as_ptr(), + pipe_shader_type::PIPE_SHADER_COMPUTE, + idx, + false, + &cb, + ) + } + } + + pub fn launch_grid(&self, work_dim: u32, block: [u32; 3], grid: [u32; 3]) { let info = pipe_grid_info { pc: 0, - input: input.as_ptr().cast(), + input: ptr::null(), work_dim: work_dim, block: block, last_block: [0; 3], @@ -475,6 +488,7 @@ fn has_required_cbs(c: &pipe_context) -> bool { && c.memory_barrier.is_some() && c.resource_copy_region.is_some() && c.sampler_view_destroy.is_some() + && c.set_constant_buffer.is_some() && c.set_global_binding.is_some() && c.set_sampler_views.is_some() && c.set_shader_images.is_some()