@@ -5,14 +5,18 @@ use std::{io, path::Path};
5
5
6
6
use crate :: {
7
7
lockfile:: { LockfileMismatchError , LockfileMismatchHandler } ,
8
- spirv_builder:: SpirvBuilder ,
8
+ spirv_builder:: { CompileResult , SpirvBuilder , SpirvBuilderError } ,
9
9
spirv_cache:: {
10
10
command:: CommandExecError ,
11
11
install:: { Install , InstallError , InstallParams , InstalledBackend } ,
12
12
toolchain:: HaltToolchainInstallation ,
13
+ user_output,
13
14
} ,
14
15
} ;
15
16
17
+ #[ cfg( feature = "watch" ) ]
18
+ use crate :: spirv_builder:: { AcceptFirstCompile , Watch } ;
19
+
16
20
/// Creates shader crate builder, allowing to modify install and build parameters separately.
17
21
///
18
22
/// # Errors
@@ -24,14 +28,14 @@ use crate::{
24
28
/// * there is a lockfile version mismatch that cannot be resolved automatically.
25
29
#[ inline]
26
30
#[ expect( clippy:: unreachable, reason = "target was already set" ) ]
27
- pub fn shader_crate_builder < P , S , E , T , C , W > (
31
+ pub fn make_shader_crate_builder < P , S , E , T , C , W > (
28
32
shader_crate : P ,
29
33
target : S ,
30
34
mut build : SpirvBuilder ,
31
35
install : InstallParams ,
32
36
writer : W ,
33
37
halt_toolchain_installation : HaltToolchainInstallation < T , C > ,
34
- ) -> Result < ShaderCrateBuilder , MakeShaderBuilderError < E > >
38
+ ) -> Result < ShaderCrateBuilder , MakeShaderCrateBuilderError < E > >
35
39
where
36
40
P : AsRef < Path > ,
37
41
S : Into < String > ,
@@ -78,10 +82,57 @@ pub struct ShaderCrateBuilder {
78
82
pub lockfile_mismatch_handler : LockfileMismatchHandler ,
79
83
}
80
84
85
+ impl ShaderCrateBuilder {
86
+ /// Builds the shader crate using the configured [`SpirvBuilder`].
87
+ ///
88
+ /// # Errors
89
+ ///
90
+ /// Returns an error if building the shader crate failed.
91
+ #[ inline]
92
+ pub fn build < W > ( & self , writer : W ) -> Result < CompileResult , ShaderCrateBuildError >
93
+ where
94
+ W : io:: Write ,
95
+ {
96
+ let shader_crate = self . installed_backend_args . shader_crate . display ( ) ;
97
+ user_output ! ( writer, "Compiling shaders at {shader_crate}...\n " ) ?;
98
+
99
+ let result = self . builder . build ( ) ?;
100
+ Ok ( result)
101
+ }
102
+
103
+ /// Watches the shader crate for changes using the configured [`SpirvBuilder`].
104
+ ///
105
+ /// Calls `on_compilation_finishes` after each successful compilation.
106
+ ///
107
+ /// # Errors
108
+ ///
109
+ /// Returns an error if watching shader crate for changes failed.
110
+ #[ cfg( feature = "watch" ) ]
111
+ #[ inline]
112
+ pub fn watch < W , T , F > (
113
+ & self ,
114
+ writer : W ,
115
+ on_compilation_finishes : F ,
116
+ ) -> Result < Watch < T > , ShaderCrateBuildError >
117
+ where
118
+ W : io:: Write ,
119
+ F : FnMut ( CompileResult , Option < AcceptFirstCompile < ' _ , T > > ) + Send + ' static ,
120
+ {
121
+ let shader_crate = self . installed_backend_args . shader_crate . display ( ) ;
122
+ user_output ! (
123
+ writer,
124
+ "Watching shaders for changes at {shader_crate}...\n "
125
+ ) ?;
126
+
127
+ let watch = self . builder . watch ( on_compilation_finishes) ?;
128
+ Ok ( watch)
129
+ }
130
+ }
131
+
81
132
/// An error indicating what went wrong when creating a [`ShaderCrateBuilder`].
82
133
#[ derive( Debug , thiserror:: Error ) ]
83
134
#[ non_exhaustive]
84
- pub enum MakeShaderBuilderError < E > {
135
+ pub enum MakeShaderCrateBuilderError < E = CommandExecError > {
85
136
/// The given shader crate path is not valid.
86
137
#[ error( "shader crate path is not valid: {0}" ) ]
87
138
InvalidCratePath ( #[ from] io:: Error ) ,
@@ -92,3 +143,15 @@ pub enum MakeShaderBuilderError<E> {
92
143
#[ error( transparent) ]
93
144
LockfileMismatch ( #[ from] LockfileMismatchError ) ,
94
145
}
146
+
147
+ /// An error indicating what went wrong when building the shader crate.
148
+ #[ derive( Debug , thiserror:: Error ) ]
149
+ #[ non_exhaustive]
150
+ pub enum ShaderCrateBuildError {
151
+ /// Failed to write user output.
152
+ #[ error( "failed to write user output: {0}" ) ]
153
+ IoWrite ( #[ from] io:: Error ) ,
154
+ /// Failed to build shader crate.
155
+ #[ error( "failed to build shader crate: {0}" ) ]
156
+ Build ( #[ from] SpirvBuilderError ) ,
157
+ }
0 commit comments