From f192cc469671e68569a72ca74a114c39756530b4 Mon Sep 17 00:00:00 2001 From: zanciks Date: Wed, 27 Nov 2024 16:12:08 -0700 Subject: [PATCH 1/3] detect if functions are public for fragment shaders --- crates/spirv-std/macros/src/lib.rs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/crates/spirv-std/macros/src/lib.rs b/crates/spirv-std/macros/src/lib.rs index 9ecc7aef8b..202454a85b 100644 --- a/crates/spirv-std/macros/src/lib.rs +++ b/crates/spirv-std/macros/src/lib.rs @@ -76,7 +76,7 @@ mod image; use proc_macro::TokenStream; use proc_macro2::{Delimiter, Group, Ident, Span, TokenTree}; -use syn::{punctuated::Punctuated, spanned::Spanned, visit_mut::VisitMut, ItemFn, Token}; +use syn::{punctuated::Punctuated, spanned::Spanned, visit_mut::VisitMut, ItemFn, Token, Visibility}; use quote::{quote, ToTokens}; use std::fmt::Write; @@ -149,6 +149,14 @@ pub fn spirv(attr: TokenStream, item: TokenStream) -> TokenStream { let attr: proc_macro2::TokenStream = attr.into(); tokens.extend(quote! { #[cfg_attr(target_arch="spirv", rust_gpu::spirv(#attr))] }); + if attr.to_string().trim() == "fragment" { + let item_clone = item.clone(); + let input = syn::parse_macro_input!(item_clone as ItemFn); + if !matches!(input.vis, Visibility::Public(_)) { + panic!("The `spirv` macro can only be applied to public functions."); + } + } + let item: proc_macro2::TokenStream = item.into(); for tt in item { match tt { From 6dc4bc74ba8a7e4249040bad2147f6c0ce9bc452 Mon Sep 17 00:00:00 2001 From: zanciks Date: Wed, 27 Nov 2024 16:45:21 -0700 Subject: [PATCH 2/3] cargo fmt --- crates/spirv-std/macros/src/lib.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/spirv-std/macros/src/lib.rs b/crates/spirv-std/macros/src/lib.rs index 202454a85b..e95ee95e32 100644 --- a/crates/spirv-std/macros/src/lib.rs +++ b/crates/spirv-std/macros/src/lib.rs @@ -76,7 +76,9 @@ mod image; use proc_macro::TokenStream; use proc_macro2::{Delimiter, Group, Ident, Span, TokenTree}; -use syn::{punctuated::Punctuated, spanned::Spanned, visit_mut::VisitMut, ItemFn, Token, Visibility}; +use syn::{ + punctuated::Punctuated, spanned::Spanned, visit_mut::VisitMut, ItemFn, Token, Visibility, +}; use quote::{quote, ToTokens}; use std::fmt::Write; From a4304a68077ad7fa079d76bd2a26ffac0b993ee9 Mon Sep 17 00:00:00 2001 From: zanciks Date: Wed, 27 Nov 2024 21:53:44 -0700 Subject: [PATCH 3/3] if let syn::parse:: --- crates/spirv-std/macros/src/lib.rs | 6 ++---- crates/spirv-std/src/byte_addressable_buffer.rs | 4 ++-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/crates/spirv-std/macros/src/lib.rs b/crates/spirv-std/macros/src/lib.rs index e95ee95e32..c5e7a0f3b6 100644 --- a/crates/spirv-std/macros/src/lib.rs +++ b/crates/spirv-std/macros/src/lib.rs @@ -151,10 +151,8 @@ pub fn spirv(attr: TokenStream, item: TokenStream) -> TokenStream { let attr: proc_macro2::TokenStream = attr.into(); tokens.extend(quote! { #[cfg_attr(target_arch="spirv", rust_gpu::spirv(#attr))] }); - if attr.to_string().trim() == "fragment" { - let item_clone = item.clone(); - let input = syn::parse_macro_input!(item_clone as ItemFn); - if !matches!(input.vis, Visibility::Public(_)) { + if let Ok(item_fn) = syn::parse::(item.clone()) { + if !matches!(item_fn.vis, Visibility::Public(_)) { panic!("The `spirv` macro can only be applied to public functions."); } } diff --git a/crates/spirv-std/src/byte_addressable_buffer.rs b/crates/spirv-std/src/byte_addressable_buffer.rs index 0640e54bda..aefccfbcb2 100644 --- a/crates/spirv-std/src/byte_addressable_buffer.rs +++ b/crates/spirv-std/src/byte_addressable_buffer.rs @@ -6,7 +6,7 @@ use core::mem; // HACK(eddyb) try to prevent MIR inlining from breaking our intrinsics. #[inline(never)] #[spirv_std_macros::gpu_only] -unsafe fn buffer_load_intrinsic( +pub unsafe fn buffer_load_intrinsic( buffer: &[u32], // FIXME(eddyb) should be `usize`. offset: u32, @@ -26,7 +26,7 @@ unsafe fn buffer_load_intrinsic( // HACK(eddyb) try to prevent MIR inlining from breaking our intrinsics. #[inline(never)] #[spirv_std_macros::gpu_only] -unsafe fn buffer_store_intrinsic( +pub unsafe fn buffer_store_intrinsic( buffer: &mut [u32], // FIXME(eddyb) should be `usize`. offset: u32,