Skip to content

Commit 1c0270e

Browse files
committed
watch: always consume SpirvBuilder
1 parent ca27415 commit 1c0270e

File tree

3 files changed

+19
-46
lines changed

3 files changed

+19
-46
lines changed

crates/spirv-builder/src/lib.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -519,12 +519,6 @@ impl Default for SpirvBuilder {
519519
}
520520
}
521521

522-
impl AsRef<SpirvBuilder> for SpirvBuilder {
523-
fn as_ref(&self) -> &SpirvBuilder {
524-
self
525-
}
526-
}
527-
528522
impl SpirvBuilder {
529523
pub fn new(path_to_crate: impl AsRef<Path>, target: impl Into<String>) -> Self {
530524
Self {

crates/spirv-builder/src/watch.rs

Lines changed: 16 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use crate::{SpirvBuilder, SpirvBuilderError, leaf_deps};
1111

1212
impl SpirvBuilder {
1313
/// Watches the module for changes, rebuilding it upon them.
14-
pub fn watch(&self) -> Result<SpirvWatcher<&Self>, SpirvBuilderError> {
14+
pub fn watch(self) -> Result<SpirvWatcher, SpirvBuilderError> {
1515
SpirvWatcher::new(self)
1616
}
1717
}
@@ -20,25 +20,24 @@ type WatchedPaths = HashSet<PathBuf>;
2020

2121
/// Watcher of a crate which rebuilds it on changes.
2222
#[derive(Debug)]
23-
pub struct SpirvWatcher<B> {
24-
builder: B,
23+
pub struct SpirvWatcher {
24+
builder: SpirvBuilder,
2525
watcher: RecommendedWatcher,
2626
rx: Receiver<()>,
27+
/// `first_result`: the path to the crate
28+
/// `!first_result`: the path to our metadata file with entry point names and file paths
2729
watch_path: PathBuf,
2830
watched_paths: WatchedPaths,
2931
first_result: bool,
3032
}
3133

32-
impl<B> SpirvWatcher<B>
33-
where
34-
B: AsRef<SpirvBuilder>,
35-
{
36-
fn new(as_builder: B) -> Result<Self, SpirvBuilderError> {
37-
let builder = as_builder.as_ref();
34+
impl SpirvWatcher {
35+
fn new(builder: SpirvBuilder) -> Result<Self, SpirvBuilderError> {
3836
let path_to_crate = builder
3937
.path_to_crate
4038
.as_ref()
41-
.ok_or(SpirvBuilderError::MissingCratePath)?;
39+
.ok_or(SpirvBuilderError::MissingCratePath)?
40+
.clone();
4241
if !matches!(builder.print_metadata, crate::MetadataPrintout::None) {
4342
return Err(SpirvWatcherError::WatchWithPrintMetadata.into());
4443
}
@@ -63,8 +62,8 @@ where
6362
.map_err(SpirvWatcherError::NotifyFailed)?;
6463

6564
Ok(Self {
66-
watch_path: path_to_crate.clone(),
67-
builder: as_builder,
65+
watch_path: path_to_crate,
66+
builder,
6867
watcher,
6968
rx,
7069
watched_paths: HashSet::new(),
@@ -82,17 +81,15 @@ where
8281
}
8382

8483
self.rx.recv().expect("watcher should be alive");
85-
let builder = self.builder.as_ref();
86-
let metadata_file = crate::invoke_rustc(builder)?;
87-
let result = builder.parse_metadata_file(&metadata_file)?;
84+
let metadata_file = crate::invoke_rustc(&self.builder)?;
85+
let result = self.builder.parse_metadata_file(&metadata_file)?;
8886

8987
Self::watch_leaf_deps(&self.watch_path, &mut self.watched_paths, &mut self.watcher)?;
9088
Ok(result)
9189
}
9290

9391
fn recv_first_result(&mut self) -> Result<CompileResult, SpirvBuilderError> {
94-
let builder = self.builder.as_ref();
95-
let metadata_file = match crate::invoke_rustc(builder) {
92+
let metadata_file = match crate::invoke_rustc(&self.builder) {
9693
Ok(path) => path,
9794
Err(err) => {
9895
log::error!("{err}");
@@ -103,7 +100,7 @@ where
103100
.map_err(SpirvWatcherError::NotifyFailed)?;
104101
let path = loop {
105102
self.rx.recv().expect("watcher should be alive");
106-
match crate::invoke_rustc(builder) {
103+
match crate::invoke_rustc(&self.builder) {
107104
Ok(path) => break path,
108105
Err(err) => log::error!("{err}"),
109106
}
@@ -114,7 +111,7 @@ where
114111
path
115112
}
116113
};
117-
let result = builder.parse_metadata_file(&metadata_file)?;
114+
let result = self.builder.parse_metadata_file(&metadata_file)?;
118115

119116
Self::watch_leaf_deps(&metadata_file, &mut self.watched_paths, &mut self.watcher)?;
120117
self.watch_path = metadata_file;
@@ -139,23 +136,6 @@ where
139136
}
140137
}
141138

142-
impl<B> SpirvWatcher<B>
143-
where
144-
B: AsRef<SpirvBuilder>,
145-
{
146-
#[inline]
147-
pub fn forget_lifetime(self) -> SpirvWatcher<SpirvBuilder> {
148-
SpirvWatcher {
149-
builder: self.builder.as_ref().clone(),
150-
watcher: self.watcher,
151-
rx: self.rx,
152-
watch_path: self.watch_path,
153-
watched_paths: self.watched_paths,
154-
first_result: self.first_result,
155-
}
156-
}
157-
}
158-
159139
#[derive(Debug, thiserror::Error)]
160140
pub enum SpirvWatcherError {
161141
#[error("watching within build scripts will prevent build completion")]

examples/runners/wgpu/src/lib.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -180,16 +180,15 @@ fn maybe_watch(
180180
let mut watcher = builder.watch().unwrap();
181181
let first_compile = watcher.recv().unwrap();
182182

183-
let mut thread_watcher = watcher.forget_lifetime();
183+
let shader_modules = handle_compile_result(first_compile);
184184
std::thread::spawn(move || {
185185
loop {
186-
let compile_result = thread_watcher.recv().unwrap();
186+
let compile_result = watcher.recv().unwrap();
187187
let modules = handle_compile_result(compile_result);
188188
f(modules);
189189
}
190190
});
191-
192-
handle_compile_result(first_compile)
191+
shader_modules
193192
} else {
194193
handle_compile_result(builder.build().unwrap())
195194
}

0 commit comments

Comments
 (0)