From 80b81ed58e8157b9c47727f1e4027507a0df7a58 Mon Sep 17 00:00:00 2001 From: Karol Herbst Date: Mon, 6 Jan 2025 01:53:09 +0100 Subject: [PATCH] rusticl/mesa: add PipeSamplerView wrapper Reviewed-by: @LingMan Part-of: --- .../frontends/rusticl/mesa/pipe/context.rs | 4 ++ .../frontends/rusticl/mesa/pipe/resource.rs | 58 +++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/src/gallium/frontends/rusticl/mesa/pipe/context.rs b/src/gallium/frontends/rusticl/mesa/pipe/context.rs index e5201bf19f8..b9817743b59 100644 --- a/src/gallium/frontends/rusticl/mesa/pipe/context.rs +++ b/src/gallium/frontends/rusticl/mesa/pipe/context.rs @@ -51,6 +51,10 @@ impl PipeContext { Some(s) } + pub(crate) fn pipe(&self) -> NonNull { + self.pipe + } + pub fn buffer_subdata( &self, res: &PipeResource, diff --git a/src/gallium/frontends/rusticl/mesa/pipe/resource.rs b/src/gallium/frontends/rusticl/mesa/pipe/resource.rs index 5d6d5c6c123..d7a9cd9b28d 100644 --- a/src/gallium/frontends/rusticl/mesa/pipe/resource.rs +++ b/src/gallium/frontends/rusticl/mesa/pipe/resource.rs @@ -1,10 +1,13 @@ use mesa_rust_gen::*; use std::{ + marker::PhantomData, mem, ptr::{self, NonNull}, }; +use super::context::PipeContext; + #[derive(PartialEq, Eq, Hash)] #[repr(transparent)] pub struct PipeResource { @@ -214,3 +217,58 @@ impl Drop for PipeResource { unsafe { pipe_resource_reference(&mut self.pipe.as_ptr(), ptr::null_mut()) } } } + +/// Wrapper around gallium's pipe_sampler_view. +/// +/// It deals with the refcounting and frees the object automatically if not needed anymore. +#[repr(transparent)] +pub struct PipeSamplerView<'c, 'r> { + view: NonNull, + // the pipe_sampler_view object references both a context and a resource. + _ctx: PhantomData<&'c PipeContext>, + _res: PhantomData<&'r PipeResource>, +} + +impl<'c, 'r> PipeSamplerView<'c, 'r> { + pub fn new( + ctx: &'c PipeContext, + res: &'r PipeResource, + format: pipe_format, + size: u32, + app_img_info: Option<&AppImgInfo>, + ) -> Option { + let template = res.pipe_sampler_view_template(format, size, app_img_info); + let view = unsafe { + ctx.pipe().as_ref().create_sampler_view.unwrap()( + ctx.pipe().as_ptr(), + res.pipe(), + &template, + ) + }; + + let view = NonNull::new(view)?; + unsafe { + debug_assert_eq!(view.as_ref().context, ctx.pipe().as_ptr()); + debug_assert_eq!(view.as_ref().texture, res.pipe()); + } + + Some(Self { + view: view, + _ctx: PhantomData, + _res: PhantomData, + }) + } + + pub(crate) fn as_pipe(views: &mut [Self]) -> *mut *mut pipe_sampler_view { + // We are transparent over *mut pipe_sample_view, so this is sound. + views.as_mut_ptr().cast() + } +} + +impl Drop for PipeSamplerView<'_, '_> { + fn drop(&mut self) { + unsafe { + pipe_sampler_view_reference(&mut ptr::null_mut(), self.view.as_ptr()); + } + } +}