From f192cc469671e68569a72ca74a114c39756530b4 Mon Sep 17 00:00:00 2001
From: zanciks <zackarysemancik@gmail.com>
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 <zackarysemancik@gmail.com>
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 <zackarysemancik@gmail.com>
Date: Wed, 27 Nov 2024 21:53:44 -0700
Subject: [PATCH 3/3] if let syn::parse::<ItemFn>

---
 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::<ItemFn>(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<T>(
+pub unsafe fn buffer_load_intrinsic<T>(
     buffer: &[u32],
     // FIXME(eddyb) should be `usize`.
     offset: u32,
@@ -26,7 +26,7 @@ unsafe fn buffer_load_intrinsic<T>(
 // HACK(eddyb) try to prevent MIR inlining from breaking our intrinsics.
 #[inline(never)]
 #[spirv_std_macros::gpu_only]
-unsafe fn buffer_store_intrinsic<T>(
+pub unsafe fn buffer_store_intrinsic<T>(
     buffer: &mut [u32],
     // FIXME(eddyb) should be `usize`.
     offset: u32,