summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarol Herbst <kherbst@redhat.com>2024-05-07 22:33:10 +0200
committerEric Engestrom <eric@engestrom.ch>2024-05-08 14:38:36 +0200
commite76bce30e60c1c1c7812a48eb9ef54d9d05d877a (patch)
tree4ead8c82662eaf6874ae19e3658659f840424e1e
parentbd3a6fae9df1b73bdf39b5b5b5af98332108d328 (diff)
rusticl: use stream uploader for cb0 if prefered
Using the same buffer without a barrier actually can lead to data races as drivers might not properly synchronize the content. Using the stream uploader is a neat fix which prevents us from having to use a barrier but still keep high throughput when launching kernels back-to-back. Fixes: 5ff33f99058 ("rusticl: use real buffer for cb0 for drivers prefering") Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27666> (cherry picked from commit 8da8c6c2d8bf9b9b04ee030df68d7d44146fc877)
-rw-r--r--.pick_status.json2
-rw-r--r--src/gallium/frontends/rusticl/core/queue.rs28
-rw-r--r--src/gallium/frontends/rusticl/mesa/pipe/context.rs32
-rw-r--r--src/gallium/frontends/rusticl/rusticl_mesa_bindings.h1
4 files changed, 41 insertions, 22 deletions
diff --git a/.pick_status.json b/.pick_status.json
index b529161996d..afeda95ec6e 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -114,7 +114,7 @@
"description": "rusticl: use stream uploader for cb0 if prefered",
"nominated": true,
"nomination_type": 1,
- "resolution": 0,
+ "resolution": 1,
"main_sha": null,
"because_sha": "5ff33f99058b5338fa83689da3d3c34d7079f4f7",
"notes": null
diff --git a/src/gallium/frontends/rusticl/core/queue.rs b/src/gallium/frontends/rusticl/core/queue.rs
index 85cb6f39552..b1c37c1767a 100644
--- a/src/gallium/frontends/rusticl/core/queue.rs
+++ b/src/gallium/frontends/rusticl/core/queue.rs
@@ -6,8 +6,6 @@ use crate::core::platform::*;
use crate::impl_cl_type_trait;
use mesa_rust::pipe::context::PipeContext;
-use mesa_rust::pipe::resource::PipeResource;
-use mesa_rust::pipe::screen::ResourceType;
use mesa_rust_util::properties::*;
use rusticl_opencl_gen::*;
@@ -25,7 +23,7 @@ use std::thread::JoinHandle;
/// Used for tracking bound GPU state to lower CPU overhead and centralize state tracking
pub struct QueueContext {
ctx: PipeContext,
- cb0: Option<PipeResource>,
+ use_stream: bool,
}
impl QueueContext {
@@ -34,30 +32,18 @@ impl QueueContext {
.screen()
.create_context()
.ok_or(CL_OUT_OF_HOST_MEMORY)?;
- let size = device.param_max_size() as u32;
- let cb0 = if device.prefers_real_buffer_in_cb0() {
- device
- .screen()
- .resource_create_buffer(size, ResourceType::Cb0, 0)
- } else {
- None
- };
-
- if let Some(cb0) = &cb0 {
- ctx.bind_constant_buffer(0, cb0);
- }
- Ok(Self { ctx: ctx, cb0: cb0 })
+ Ok(Self {
+ ctx: ctx,
+ use_stream: device.prefers_real_buffer_in_cb0(),
+ })
}
pub fn update_cb0(&self, data: &[u8]) {
// only update if we actually bind data
if !data.is_empty() {
- // if we have a real buffer, update that, otherwise just set the data directly
- if let Some(cb) = &self.cb0 {
- debug_assert!(data.len() <= cb.width() as usize);
- self.ctx
- .buffer_subdata(cb, 0, data.as_ptr().cast(), data.len() as u32);
+ if self.use_stream {
+ self.ctx.set_constant_buffer_stream(0, data);
} else {
self.ctx.set_constant_buffer(0, data);
}
diff --git a/src/gallium/frontends/rusticl/mesa/pipe/context.rs b/src/gallium/frontends/rusticl/mesa/pipe/context.rs
index 0d0faeda33a..b01e24ebf28 100644
--- a/src/gallium/frontends/rusticl/mesa/pipe/context.rs
+++ b/src/gallium/frontends/rusticl/mesa/pipe/context.rs
@@ -8,6 +8,7 @@ use mesa_rust_gen::pipe_fd_type::*;
use mesa_rust_gen::*;
use mesa_rust_util::has_required_feature;
+use std::mem::size_of;
use std::os::raw::*;
use std::ptr;
use std::ptr::*;
@@ -417,6 +418,37 @@ impl PipeContext {
}
}
+ pub fn set_constant_buffer_stream(&self, idx: u32, data: &[u8]) {
+ let mut cb = pipe_constant_buffer {
+ buffer: ptr::null_mut(),
+ buffer_offset: 0,
+ buffer_size: data.len() as u32,
+ user_buffer: ptr::null_mut(),
+ };
+
+ unsafe {
+ let stream = self.pipe.as_ref().stream_uploader;
+ u_upload_data(
+ stream,
+ 0,
+ data.len() as u32,
+ size_of::<[u64; 16]>() as u32,
+ data.as_ptr().cast(),
+ &mut cb.buffer_offset,
+ &mut cb.buffer,
+ );
+ u_upload_unmap(stream);
+
+ 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,
diff --git a/src/gallium/frontends/rusticl/rusticl_mesa_bindings.h b/src/gallium/frontends/rusticl/rusticl_mesa_bindings.h
index 291088e2843..5d0c23d7641 100644
--- a/src/gallium/frontends/rusticl/rusticl_mesa_bindings.h
+++ b/src/gallium/frontends/rusticl/rusticl_mesa_bindings.h
@@ -19,6 +19,7 @@
#include "util/disk_cache.h"
#include "util/os_time.h"
#include "util/sha1/sha1.h"
+#include "util/u_upload_mgr.h"
#include "util/u_printf.h"
#include "util/u_sampler.h"
#include "util/u_surface.h"