From 39eaa57a77f64b7433df476abff3ce038224e54c Mon Sep 17 00:00:00 2001 From: Dzmitry Malyshau Date: Sun, 18 Jul 2021 02:15:02 -0400 Subject: [PATCH] hlsl-out: implement constant buffer support --- src/back/hlsl/writer.rs | 27 ++++++++++++++++++--------- tests/out/hlsl/globals.hlsl | 2 +- tests/out/hlsl/shadow.hlsl | 2 +- tests/out/hlsl/skybox.hlsl | 2 +- 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/back/hlsl/writer.rs b/src/back/hlsl/writer.rs index 245fb78e74..64055a698e 100644 --- a/src/back/hlsl/writer.rs +++ b/src/back/hlsl/writer.rs @@ -344,7 +344,7 @@ impl<'a, W: Write> Writer<'a, W> { crate::StorageClass::Function => unreachable!("Function storage class"), crate::StorageClass::Private => ("static ", ""), crate::StorageClass::WorkGroup => ("groupshared ", ""), - crate::StorageClass::Uniform => ("", "b"), + crate::StorageClass::Uniform => ("cbuffer", "b"), crate::StorageClass::Storage | crate::StorageClass::Handle => { if let TypeInner::Sampler { .. } = *inner { ("", "s") @@ -358,12 +358,13 @@ impl<'a, W: Write> Writer<'a, W> { }; write!(self.out, "{}", storage)?; - self.write_type(module, global.ty)?; - write!( - self.out, - " {}", - &self.names[&NameKey::GlobalVariable(handle)] - )?; + // constant buffer declarations are expected to be inlined, e.g. + // cbuffer foo: register(b0) { field1: type1; }; + if global.class != crate::StorageClass::Uniform { + self.write_type(module, global.ty)?; + } + let name = &self.names[&NameKey::GlobalVariable(handle)]; + write!(self.out, " {}", name)?; if let TypeInner::Array { size, .. } = module.types[global.ty].inner { self.write_array_size(module, size)?; } @@ -375,14 +376,22 @@ impl<'a, W: Write> Writer<'a, W> { if self.options.shader_model > super::ShaderModel::V5_0 { write!(self.out, ", space{}", bt.space)?; } - writeln!(self.out, ");")?; - } else { + write!(self.out, ")")?; + } else if global.class == crate::StorageClass::Private { write!(self.out, " = ")?; if let Some(init) = global.init { self.write_constant(module, init)?; } else { self.write_default_init(module, global.ty)?; } + } + + if global.class == crate::StorageClass::Uniform { + write!(self.out, " {{ ")?; + self.write_type(module, global.ty)?; + let name = &self.names[&NameKey::GlobalVariable(handle)]; + writeln!(self.out, " {}; }}", name)?; + } else { writeln!(self.out, ";")?; } diff --git a/tests/out/hlsl/globals.hlsl b/tests/out/hlsl/globals.hlsl index 9ae4325888..0236e18272 100644 --- a/tests/out/hlsl/globals.hlsl +++ b/tests/out/hlsl/globals.hlsl @@ -1,6 +1,6 @@ static const bool Foo = true; -groupshared float wg[10] = (float[10])0; +groupshared float wg[10]; [numthreads(1, 1, 1)] void main() diff --git a/tests/out/hlsl/shadow.hlsl b/tests/out/hlsl/shadow.hlsl index e123bebdd7..bcce7a0fd1 100644 --- a/tests/out/hlsl/shadow.hlsl +++ b/tests/out/hlsl/shadow.hlsl @@ -16,7 +16,7 @@ struct Lights { Light data[1]; }; -Globals u_globals : register(b0); +cbuffer u_globals : register(b0) { Globals u_globals; } Lights s_lights : register(t1); Texture2DArray t_shadow : register(t2); SamplerComparisonState sampler_shadow : register(s3); diff --git a/tests/out/hlsl/skybox.hlsl b/tests/out/hlsl/skybox.hlsl index 283ab73b88..6886185b6c 100644 --- a/tests/out/hlsl/skybox.hlsl +++ b/tests/out/hlsl/skybox.hlsl @@ -8,7 +8,7 @@ struct Data { float4x4 view; }; -Data r_data : register(b0, space0); +cbuffer r_data : register(b0, space0) { Data r_data; } TextureCube r_texture : register(t0, space0); SamplerState r_sampler : register(s0, space1);