From 20c936bee1f819b625f6ee1ecfcf45e848a8543d Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Thu, 3 Nov 2022 11:16:45 +0100 Subject: [PATCH] rusticl: print missing context features Signed-off-by: Thomas Debesse Reviewed-by: Karol Herbst Part-of: --- .../frontends/rusticl/mesa/pipe/context.rs | 51 ++++++++++--------- .../frontends/rusticl/mesa/pipe/screen.rs | 27 +++++----- src/gallium/frontends/rusticl/meson.build | 1 + src/gallium/frontends/rusticl/util/feature.rs | 14 +++++ src/gallium/frontends/rusticl/util/lib.rs | 1 + 5 files changed, 58 insertions(+), 36 deletions(-) create mode 100644 src/gallium/frontends/rusticl/util/feature.rs diff --git a/src/gallium/frontends/rusticl/mesa/pipe/context.rs b/src/gallium/frontends/rusticl/mesa/pipe/context.rs index 0df09a25f1a..06bbe3da027 100644 --- a/src/gallium/frontends/rusticl/mesa/pipe/context.rs +++ b/src/gallium/frontends/rusticl/mesa/pipe/context.rs @@ -5,6 +5,7 @@ use crate::pipe::screen::*; use crate::pipe::transfer::*; use mesa_rust_gen::*; +use mesa_rust_util::has_required_feature; use std::os::raw::*; use std::ptr; @@ -475,28 +476,30 @@ impl Drop for PipeContext { } } -fn has_required_cbs(c: &pipe_context) -> bool { - c.destroy.is_some() - && c.bind_compute_state.is_some() - && c.bind_sampler_states.is_some() - && c.buffer_map.is_some() - && c.buffer_subdata.is_some() - && c.buffer_unmap.is_some() - && c.clear_buffer.is_some() - && c.clear_texture.is_some() - && c.create_compute_state.is_some() - && c.delete_compute_state.is_some() - && c.delete_sampler_state.is_some() - && c.flush.is_some() - && c.launch_grid.is_some() - && 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() - && c.texture_map.is_some() - && c.texture_subdata.is_some() - && c.texture_unmap.is_some() +fn has_required_cbs(context: &pipe_context) -> bool { + // Use '&' to evaluate all features and to not stop + // on first missing one to list all missing features. + has_required_feature!(context, destroy) + & has_required_feature!(context, bind_compute_state) + & has_required_feature!(context, bind_sampler_states) + & has_required_feature!(context, buffer_map) + & has_required_feature!(context, buffer_subdata) + & has_required_feature!(context, buffer_unmap) + & has_required_feature!(context, clear_buffer) + & has_required_feature!(context, clear_texture) + & has_required_feature!(context, create_compute_state) + & has_required_feature!(context, delete_compute_state) + & has_required_feature!(context, delete_sampler_state) + & has_required_feature!(context, flush) + & has_required_feature!(context, launch_grid) + & has_required_feature!(context, memory_barrier) + & has_required_feature!(context, resource_copy_region) + & has_required_feature!(context, sampler_view_destroy) + & has_required_feature!(context, set_constant_buffer) + & has_required_feature!(context, set_global_binding) + & has_required_feature!(context, set_sampler_views) + & has_required_feature!(context, set_shader_images) + & has_required_feature!(context, texture_map) + & has_required_feature!(context, texture_subdata) + & has_required_feature!(context, texture_unmap) } diff --git a/src/gallium/frontends/rusticl/mesa/pipe/screen.rs b/src/gallium/frontends/rusticl/mesa/pipe/screen.rs index cba06469592..fa1ddd42578 100644 --- a/src/gallium/frontends/rusticl/mesa/pipe/screen.rs +++ b/src/gallium/frontends/rusticl/mesa/pipe/screen.rs @@ -5,6 +5,7 @@ use crate::pipe::resource::*; use crate::util::disk_cache::*; use mesa_rust_gen::*; +use mesa_rust_util::has_required_feature; use mesa_rust_util::string::*; use std::convert::TryInto; @@ -326,16 +327,18 @@ impl Drop for PipeScreen { } fn has_required_cbs(screen: *mut pipe_screen) -> bool { - let s = unsafe { *screen }; - s.context_create.is_some() - && s.destroy.is_some() - && s.fence_finish.is_some() - && s.fence_reference.is_some() - && s.get_compiler_options.is_some() - && s.get_compute_param.is_some() - && s.get_name.is_some() - && s.get_param.is_some() - && s.get_shader_param.is_some() - && s.is_format_supported.is_some() - && s.resource_create.is_some() + let screen = unsafe { *screen }; + // Use '&' to evaluate all features and to not stop + // on first missing one to list all missing features. + has_required_feature!(screen, context_create) + & has_required_feature!(screen, destroy) + & has_required_feature!(screen, fence_finish) + & has_required_feature!(screen, fence_reference) + & has_required_feature!(screen, get_compiler_options) + & has_required_feature!(screen, get_compute_param) + & has_required_feature!(screen, get_name) + & has_required_feature!(screen, get_param) + & has_required_feature!(screen, get_shader_param) + & has_required_feature!(screen, is_format_supported) + & has_required_feature!(screen, resource_create) } diff --git a/src/gallium/frontends/rusticl/meson.build b/src/gallium/frontends/rusticl/meson.build index 844b829daff..5bfa6faf5af 100644 --- a/src/gallium/frontends/rusticl/meson.build +++ b/src/gallium/frontends/rusticl/meson.build @@ -24,6 +24,7 @@ libmesa_rust_util_files = files( 'util/lib.rs', 'util/assert.rs', 'util/bitset.rs', + 'util/feature.rs', 'util/properties.rs', 'util/ptr.rs', 'util/string.rs', diff --git a/src/gallium/frontends/rusticl/util/feature.rs b/src/gallium/frontends/rusticl/util/feature.rs new file mode 100644 index 00000000000..8b50d4fcd47 --- /dev/null +++ b/src/gallium/frontends/rusticl/util/feature.rs @@ -0,0 +1,14 @@ +#[macro_export] +macro_rules! has_required_feature { + ($object:ident, $feature:ident) => {{ + let has_feature = $object.$feature.is_some(); + if !has_feature { + println!( + "Missing {} feature {}", + stringify!($object), + stringify!($feature) + ); + } + has_feature + }}; +} diff --git a/src/gallium/frontends/rusticl/util/lib.rs b/src/gallium/frontends/rusticl/util/lib.rs index b3a090f4ff0..a55f0fd0a43 100644 --- a/src/gallium/frontends/rusticl/util/lib.rs +++ b/src/gallium/frontends/rusticl/util/lib.rs @@ -1,5 +1,6 @@ pub mod assert; pub mod bitset; +pub mod feature; pub mod math; pub mod properties; pub mod ptr;