rusticl/kernel: stop clearing sampler views on kernel launches

Instead we just unbind on the next launch by using the
unbind_num_trailing_slots parameter.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36243>
This commit is contained in:
Karol Herbst
2025-07-18 22:42:16 +02:00
committed by Marge Bot
parent 2e54e8e89e
commit eb904cd51c
3 changed files with 14 additions and 5 deletions

View File

@@ -1653,10 +1653,9 @@ impl Kernel {
globals.push(unsafe { input.as_mut_ptr().byte_add(offset) }.cast());
}
let sviews_len = sviews.len();
ctx.bind_kernel(&nir_kernel_builds, variant)?;
ctx.bind_sampler_states(&samplers);
ctx.set_sampler_views(sviews);
ctx.bind_sampler_views(sviews);
ctx.set_shader_images(&iviews);
ctx.set_global_binding(resources.as_slice(), &mut globals);
@@ -1701,7 +1700,6 @@ impl Kernel {
}
ctx.clear_global_binding(globals.len() as u32);
ctx.clear_sampler_views(sviews_len as u32);
ctx.clear_sampler_states(samplers.len() as u32);
ctx.memory_barrier(PIPE_BARRIER_GLOBAL_BUFFER);

View File

@@ -10,6 +10,7 @@ use mesa_rust::compiler::nir::NirShader;
use mesa_rust::pipe::context::PipeContext;
use mesa_rust::pipe::context::PipeContextPrio;
use mesa_rust::pipe::fence::PipeFence;
use mesa_rust::pipe::resource::PipeSamplerView;
use mesa_rust_gen::*;
use mesa_rust_util::properties::*;
use rusticl_opencl_gen::*;
@@ -70,6 +71,7 @@ impl<'a> QueueContext<'a> {
variant: NirKernelVariant::Default,
cso: None,
use_stream: self.dev.prefers_real_buffer_in_cb0(),
bound_sampler_views: 0,
}
}
}
@@ -83,6 +85,7 @@ pub struct QueueContextWithState<'a> {
builds: Option<Arc<NirKernelBuilds>>,
variant: NirKernelVariant,
cso: Option<CSOWrapper<'a>>,
bound_sampler_views: u32,
}
impl QueueContextWithState<'_> {
@@ -123,6 +126,13 @@ impl QueueContextWithState<'_> {
Ok(())
}
pub fn bind_sampler_views(&mut self, views: Vec<PipeSamplerView>) {
let cnt = views.len() as u32;
let unbind_cnt = self.bound_sampler_views.saturating_sub(cnt);
self.ctx.set_sampler_views(views, unbind_cnt);
self.bound_sampler_views = cnt;
}
pub fn update_cb0(&self, data: &[u8]) -> CLResult<()> {
// only update if we actually bind data
if !data.is_empty() {
@@ -149,6 +159,7 @@ impl<'a> Deref for QueueContextWithState<'a> {
impl Drop for QueueContextWithState<'_> {
fn drop(&mut self) {
self.set_constant_buffer(0, &[]);
self.ctx.clear_sampler_views(self.bound_sampler_views);
self.ctx.clear_shader_images(self.dev.caps.max_write_images);
if self.builds.is_some() {
// SAFETY: We simply unbind here. The bound cso will only be dropped at the end of this

View File

@@ -541,14 +541,14 @@ impl PipeContext {
}
}
pub fn set_sampler_views(&self, mut views: Vec<PipeSamplerView>) {
pub fn set_sampler_views(&self, mut views: Vec<PipeSamplerView>, unbind_trailing: u32) {
unsafe {
self.pipe.as_ref().set_sampler_views.unwrap()(
self.pipe.as_ptr(),
pipe_shader_type::PIPE_SHADER_COMPUTE,
0,
views.len() as u32,
0,
unbind_trailing,
PipeSamplerView::as_pipe(views.as_mut_slice()),
);
}