From e2048150a363ebbee36992079515011b93cb7dbf Mon Sep 17 00:00:00 2001 From: Joshua Simmons Date: Sun, 28 Apr 2024 17:08:27 +0200 Subject: [PATCH] shark: Move shaders into their own crate We can build them with cargo and a build script. --- Cargo.lock | 5 + Cargo.toml | 1 + title/shark-shaders/Cargo.toml | 8 ++ title/shark-shaders/build.rs | 105 ++++++++++++++++++ .../shaders/basic.frag.glsl | 2 +- .../shaders/basic.vert.glsl | 0 .../shaders/text.frag.glsl | 0 .../shaders/text.vert.glsl | 0 title/shark-shaders/src/lib.rs | 1 + title/shark/Cargo.toml | 4 +- title/shark/src/pipelines/basic.rs | 9 +- title/shark/src/pipelines/text.rs | 10 +- title/shark/src/shaders/basic.frag.spv | Bin 1036 -> 0 bytes title/shark/src/shaders/basic.vert.spv | Bin 2432 -> 0 bytes title/shark/src/shaders/build.sh | 9 -- title/shark/src/shaders/text.frag.spv | Bin 700 -> 0 bytes title/shark/src/shaders/text.vert.spv | Bin 3300 -> 0 bytes 17 files changed, 131 insertions(+), 23 deletions(-) create mode 100644 title/shark-shaders/Cargo.toml create mode 100644 title/shark-shaders/build.rs rename title/{shark/src => shark-shaders}/shaders/basic.frag.glsl (85%) rename title/{shark/src => shark-shaders}/shaders/basic.vert.glsl (100%) rename title/{shark/src => shark-shaders}/shaders/text.frag.glsl (100%) rename title/{shark/src => shark-shaders}/shaders/text.vert.glsl (100%) create mode 100644 title/shark-shaders/src/lib.rs delete mode 100644 title/shark/src/shaders/basic.frag.spv delete mode 100644 title/shark/src/shaders/basic.vert.spv delete mode 100755 title/shark/src/shaders/build.sh delete mode 100644 title/shark/src/shaders/text.frag.spv delete mode 100644 title/shark/src/shaders/text.vert.spv diff --git a/Cargo.lock b/Cargo.lock index 9f2873b..3bfe90d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -183,8 +183,13 @@ dependencies = [ "narcissus-gpu", "narcissus-image", "narcissus-maths", + "shark-shaders", ] +[[package]] +name = "shark-shaders" +version = "0.1.0" + [[package]] name = "sqlite-sys" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index e1766e3..3cc5eca 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,6 +2,7 @@ members = [ "title/shark", + "title/shark-shaders", "external/blake3-smol", "external/renderdoc-sys", "external/sdl2-sys", diff --git a/title/shark-shaders/Cargo.toml b/title/shark-shaders/Cargo.toml new file mode 100644 index 0000000..ccd34fd --- /dev/null +++ b/title/shark-shaders/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "shark-shaders" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/title/shark-shaders/build.rs b/title/shark-shaders/build.rs new file mode 100644 index 0000000..c543f80 --- /dev/null +++ b/title/shark-shaders/build.rs @@ -0,0 +1,105 @@ +use std::io::Write; +use std::process::Command; + +const SHADER_ROOT: &str = "shaders"; + +#[derive(Clone, Copy)] +enum ShaderStage { + Vertex, + Fragment, +} + +impl ShaderStage { + fn name(self) -> &'static str { + match self { + ShaderStage::Vertex => "vert", + ShaderStage::Fragment => "frag", + } + } +} + +#[derive(Clone, Copy)] +struct Shader { + stage: ShaderStage, + name: &'static str, +} + +const SHADERS: [Shader; 4] = [ + Shader { + stage: ShaderStage::Vertex, + name: "basic", + }, + Shader { + stage: ShaderStage::Fragment, + name: "basic", + }, + Shader { + stage: ShaderStage::Vertex, + name: "text", + }, + Shader { + stage: ShaderStage::Fragment, + name: "text", + }, +]; + +fn main() { + let out_dir = std::env::var("OUT_DIR").unwrap(); + let debug = match std::env::var("DEBUG").unwrap().as_str() { + "true" | "2" | "1" => "", + _ => "0", + }; + + let commands = SHADERS.map(|shader| { + Command::new("glslang") + .args(["--target-env", "vulkan1.3"]) + .arg(&format!("-g{debug}")) + .args([ + "-o", + &format!("{out_dir}/{}.{}.spv", shader.name, shader.stage.name()), + ]) + .arg(&format!( + "{SHADER_ROOT}/{}.{}.glsl", + shader.name, + shader.stage.name() + )) + .spawn() + .unwrap() + }); + + let dst_path = std::path::Path::new(&out_dir).join("shaders.rs"); + let mut file = std::fs::File::create(dst_path).unwrap(); + + writeln!( + file, + "#[repr(align(4))]\nstruct SpirvBytes([u8; LEN]);" + ) + .unwrap(); + + for shader in SHADERS { + writeln!( + file, + "pub const {}_{}_SPV: &'static [u8] = &SpirvBytes(*include_bytes!(\"{out_dir}/{}.{}.spv\")).0;", + shader.name.to_ascii_uppercase(), + shader.stage.name().to_ascii_uppercase(), + shader.name, + shader.stage.name() + ) + .unwrap(); + } + + for mut command in commands { + let status = command.wait().unwrap(); + assert!(status.success()); + } + + for shader in SHADERS { + println!( + "cargo::rerun-if-changed={SHADER_ROOT}/{}.{}.glsl", + shader.name, + shader.stage.name() + ) + } + + println!("cargo::rerun-if-changed=build.rs"); +} diff --git a/title/shark/src/shaders/basic.frag.glsl b/title/shark-shaders/shaders/basic.frag.glsl similarity index 85% rename from title/shark/src/shaders/basic.frag.glsl rename to title/shark-shaders/shaders/basic.frag.glsl index c09e330..bf30d60 100644 --- a/title/shark/src/shaders/basic.frag.glsl +++ b/title/shark-shaders/shaders/basic.frag.glsl @@ -8,7 +8,7 @@ layout(location = 1) in vec3 normal; layout(location = 0) out vec4 outColor; void main() { - float NdotL = max(dot(normal, vec3(0.0, 1.0, 0.0)), 0.1f); + float NdotL = max(dot(normal, vec3(0.0, 1.0, 0.0)), 0.1); vec3 rgb = texture(sampler2D(tex, texSampler), vec2(texcoord.x, texcoord.y)).rgb; outColor = vec4(rgb * NdotL, 1.0); } diff --git a/title/shark/src/shaders/basic.vert.glsl b/title/shark-shaders/shaders/basic.vert.glsl similarity index 100% rename from title/shark/src/shaders/basic.vert.glsl rename to title/shark-shaders/shaders/basic.vert.glsl diff --git a/title/shark/src/shaders/text.frag.glsl b/title/shark-shaders/shaders/text.frag.glsl similarity index 100% rename from title/shark/src/shaders/text.frag.glsl rename to title/shark-shaders/shaders/text.frag.glsl diff --git a/title/shark/src/shaders/text.vert.glsl b/title/shark-shaders/shaders/text.vert.glsl similarity index 100% rename from title/shark/src/shaders/text.vert.glsl rename to title/shark-shaders/shaders/text.vert.glsl diff --git a/title/shark-shaders/src/lib.rs b/title/shark-shaders/src/lib.rs new file mode 100644 index 0000000..9f574b0 --- /dev/null +++ b/title/shark-shaders/src/lib.rs @@ -0,0 +1 @@ +include!(concat!(env!("OUT_DIR"), "/shaders.rs")); diff --git a/title/shark/Cargo.toml b/title/shark/Cargo.toml index 85b4ca5..8b6d1aa 100644 --- a/title/shark/Cargo.toml +++ b/title/shark/Cargo.toml @@ -11,4 +11,6 @@ narcissus-core = { path = "../../engine/narcissus-core" } narcissus-font = { path = "../../engine/narcissus-font" } narcissus-maths = { path = "../../engine/narcissus-maths" } narcissus-image = { path = "../../engine/narcissus-image" } -narcissus-gpu = { path = "../../engine/narcissus-gpu" } \ No newline at end of file +narcissus-gpu = { path = "../../engine/narcissus-gpu" } + +shark-shaders = { path = "../shark-shaders" } \ No newline at end of file diff --git a/title/shark/src/pipelines/basic.rs b/title/shark/src/pipelines/basic.rs index 063d885..110a866 100644 --- a/title/shark/src/pipelines/basic.rs +++ b/title/shark/src/pipelines/basic.rs @@ -1,4 +1,4 @@ -use narcissus_core::{default, include_bytes_align}; +use narcissus_core::default; use narcissus_gpu::{ Bind, BindGroupLayout, BindGroupLayoutDesc, BindGroupLayoutEntryDesc, BindingType, BlendMode, BufferUsageFlags, CmdEncoder, CompareOp, CullingMode, Device, DeviceExt, Frame, FrontFace, @@ -8,9 +8,6 @@ use narcissus_gpu::{ }; use narcissus_maths::{Affine3, Mat4}; -const VERT_SPV: &[u8] = include_bytes_align!(4, "../shaders/basic.vert.spv"); -const FRAG_SPV: &[u8] = include_bytes_align!(4, "../shaders/basic.frag.spv"); - #[allow(unused)] #[repr(C)] pub struct BasicUniforms { @@ -84,11 +81,11 @@ impl BasicPipeline { let pipeline = device.create_graphics_pipeline(&GraphicsPipelineDesc { vertex_shader: ShaderDesc { entry: c"main", - code: VERT_SPV, + code: shark_shaders::BASIC_VERT_SPV, }, fragment_shader: ShaderDesc { entry: c"main", - code: FRAG_SPV, + code: shark_shaders::BASIC_FRAG_SPV, }, bind_group_layouts: &[uniforms_bind_group_layout, storage_bind_group_layout], layout: GraphicsPipelineLayout { diff --git a/title/shark/src/pipelines/text.rs b/title/shark/src/pipelines/text.rs index 6239ea2..ab1ba51 100644 --- a/title/shark/src/pipelines/text.rs +++ b/title/shark/src/pipelines/text.rs @@ -1,4 +1,4 @@ -use narcissus_core::{default, include_bytes_align}; +use narcissus_core::default; use narcissus_font::{TouchedGlyph, TouchedGlyphIndex}; use narcissus_gpu::{ Bind, BindGroupLayout, BindGroupLayoutDesc, BindGroupLayoutEntryDesc, BindingType, BlendMode, @@ -7,9 +7,7 @@ use narcissus_gpu::{ PolygonMode, Sampler, SamplerAddressMode, SamplerDesc, SamplerFilter, ShaderDesc, ShaderStageFlags, ThreadToken, Topology, TypedBind, }; - -const VERT_SPV: &[u8] = include_bytes_align!(4, "../shaders/text.vert.spv"); -const FRAG_SPV: &[u8] = include_bytes_align!(4, "../shaders/text.frag.spv"); +use shark_shaders; #[allow(unused)] #[repr(C)] @@ -107,11 +105,11 @@ impl TextPipeline { let pipeline = device.create_graphics_pipeline(&GraphicsPipelineDesc { vertex_shader: ShaderDesc { entry: c"main", - code: VERT_SPV, + code: shark_shaders::TEXT_VERT_SPV, }, fragment_shader: ShaderDesc { entry: c"main", - code: FRAG_SPV, + code: shark_shaders::TEXT_FRAG_SPV, }, bind_group_layouts: &[bind_group_layout], layout: GraphicsPipelineLayout { diff --git a/title/shark/src/shaders/basic.frag.spv b/title/shark/src/shaders/basic.frag.spv deleted file mode 100644 index aabdd66eaf0b8deb0faff787824003c68c2fc62e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1036 zcmZ9K$xc;K5JlI!&3nK@1PmaJG=hLMPos1RLBog%2@n$cX*6Z`ZNcIE(NwpCt%M8b-B(nOjFYZmgB4q!w|W8%QTGSS;UVscQ1F|rU~v?sQvz2@(JMn?(SrkVWx7P z{KrvpHKwy5R}FK0Gv=t6&9lrUW-ia%{f&8QUO~*5pi@_Ok6#4??PV>XyaUR4Y9vew7^N;!DzmpE85T; zhrm4VD80ZYQ-3qw72&)6`uH+EG}o_%^y({Z_~e_ABYsL7`@Km|+}l2PU5CI6M=gDG z_riG#fnU;wzgyWS{*5*~*vWTj?Si3rPrDGfHN)M!uRpX={{X>p&*H;J2;3;xUSjqa eY(FvQUDAs)96>2H?H?VE=x)%o6vlt&?0wEmPHNs}ybfb#UKv6rQAA}B9IJsw%TI8@jWFAp>BFar`eWf3rNlwti!N z;q%Xo*hCY7#%yL|Jh#BT)my)4Yy)P1Pk@8KkHD|M@4!P~iIz>k82AXd#E8vN1rFrD zG5UJ{$6WB0&$m3(^W}ppwf6tcV6mTr-&Hayqyu_T-9>rD69%4RQ z+q!+O_VpCkvin@cimP|k=c;W@kM+GrxgO2CSWTbzF3+;7ejl4i?n^WgS3TWJ@v?_@ z^)x@0nSDKlb=v6er7&yCPh}M5vzQ$1ZN2KP7G`_9P#4;sZ44uBKTXsyXPPGN*ZZEK zjhVb}Yww_CGI!xQmi7n9XD=-qAacZJX@ZxSKDFo_l}{~-?W2jEYn!9q)W94qTY(QD zurq0^H!=BaPd?t2e6)82yDon^XBRhLTRj?Y{asnB>pfy$a+IgP+0#_>c}Mbf zx1HUFF61U=KXszU#HzmdPhtNi=8g+{otQHfuTS&4EiZL&IJF`# zea5MaBk7Zu`t;i*R<)le*5~jdu|9{FiOIoS_jn>_s9dpy#JtOjI|VUUKle<=RS$E| zW?aAC`NaD57BjbB??T4)>s^GnJI@N^(99RfTb}YN{L9cs$HAV3e-*nY>RV6T_i7oU zmU+h1tSi~G&*MsBeZJo&=3Le5YCIG1`oCr}IA4R+(5A6Si?R_a6{iRF9sT+gRUu{l)Pw2#tCQdz6@Yf2U?2Cog>~jN-fS1R`Ib Owf#Pby<@;B2D}G=RD72J diff --git a/title/shark/src/shaders/build.sh b/title/shark/src/shaders/build.sh deleted file mode 100755 index 4d379fc..0000000 --- a/title/shark/src/shaders/build.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -pushd "${0%/*}" -glslc --target-env=vulkan1.3 -O -fshader-stage=vert -o basic.vert.spv basic.vert.glsl -glslc --target-env=vulkan1.3 -O -fshader-stage=frag -o basic.frag.spv basic.frag.glsl -glslc --target-env=vulkan1.3 -O -fshader-stage=vert -o text.vert.spv text.vert.glsl -glslc --target-env=vulkan1.3 -O -fshader-stage=frag -o text.frag.spv text.frag.glsl -echo "built shaders" -popd diff --git a/title/shark/src/shaders/text.frag.spv b/title/shark/src/shaders/text.frag.spv deleted file mode 100644 index d858dfd50168222d16b6a5b592395712f75d216a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 700 zcmY+CJ5Pd95Jb=Sf&lUo1r;A4J+V+@Vzi~9F(z7@*jQ+zzr){aV`9#7A-D;F*`3{) z-Aj?r>eMn?w3)GrJ~PYx`Sm)#yt}6l)sq@~8_%m=vAgO+ z{wVRigZyKNoy@Bx_7=X7_4N(bb+NZ`-ZfR|I?J%ai3xG{7ear3JxNm<)q8&TeYbsG2^x-25QaLBz+@kUX2z>8cF51ON}NgigcZ%T^cUP>x|E9P*~so&TWpNv8y_H=?ix01@R_~t#bWaT>l!^zjdts$ldzEQa^Litsj~C z(ZlzV%hV4xUO(7){b1etIs4erJLa*Q8=2fZoHx0_ zQa3v=?YQXJhowGKzR?kXrTXQwR)dO%|J7=$H=H@oY7G|lXxjV1Uae76`I%MrYI{cp zBMw_j9CB^63=basmsy7${>aP?_UNzlE-)+cXEvCb$g5rVH5$};lW$t1nhDOIKm7Rv zXGh0zYGl{YQ6oEq42PS{0Su1F>=8Ah-{kMscT!wl$(MKXowLe!Aa&i{lC(WBV5ARd9hxZHCgTaeEhz~mc z$oryq20grx`MqF|h)dp=+R-fgSFIyfc)n$fcpv+l^B^8Fdq+HE{Mj|+O&XTnU#^Y% zlJoC2=WJ~LkqQIfreU2Mwet|`KlSTAB?mpa+kJ`ry5$|-w-w&0IgM(cR(dYjLv+~D z3+`rgKWbDmcLW&w#*PK&4g<#@9dX%#o4ps{*btYUn6d6$uc@89#n`sZ#$HX-J@HD#Zgt!x>^b#v7rf^ChBM-vk+Dy$=cJm!$ZtqBYpLl? zscgVw^R`s87n^r%10I`qJ;$+mPb!Q!!QMB9AGL7je;`#(V&a1hyt!Y{Wj;QX3hU0t zM^fSG^{4JN_egsEnN)aqel8UjpY!(N&W+CnsqpxGAr+Q7zLY8sczXPmRD96EpF0|C ou}0Oii~cR4X6}-3q29VZTVJ2wBTr`y%jC73JOF8}}l -- 2.49.0