diff --git a/naga/src/back/hlsl/help.rs b/naga/src/back/hlsl/help.rs index 47d8f3af791..b1d26295692 100644 --- a/naga/src/back/hlsl/help.rs +++ b/naga/src/back/hlsl/help.rs @@ -1181,14 +1181,14 @@ impl super::Writer<'_, W> { writeln!( self.out, "SamplerState {}[2048]: register(s{}, space{});", - super::writer::SAMPLER_BUFFER_VAR, + super::writer::SAMPLER_HEAP_VAR, self.options.sampler_array.sampler_array.register, self.options.sampler_array.sampler_array.space )?; writeln!( self.out, "SamplerComparisonState {}[2048]: register(s{}, space{});", - super::writer::COMPARISON_SAMPLER_BUFFER_VAR, + super::writer::COMPARISON_SAMPLER_HEAP_VAR, self.options.sampler_array.comparison_sampler_array.register, self.options.sampler_array.comparison_sampler_array.space )?; @@ -1202,12 +1202,15 @@ impl super::Writer<'_, W> { &mut self, key: super::SamplerBufferKey, ) -> BackendResult { - let entry = self.wrapped.sampler_buffers.entry(key); - let std::collections::hash_map::Entry::Vacant(entry) = entry else { + if self.wrapped.sampler_buffers.contains_key(&key) { return Ok(()); }; - let sampler_array_name = self.namer.call("sampler_array"); + self.write_sampler_arrays()?; + + let sampler_array_name = self + .namer + .call(&format!("nagaGroup{}SamplerIndexArray", key.group)); let bind_target = match self.options.sampler_index_arrays.get(&key) { Some(&bind_target) => bind_target, @@ -1227,9 +1230,7 @@ impl super::Writer<'_, W> { bind_target.register, bind_target.space )?; - entry.insert(sampler_array_name); - - self.write_sampler_arrays()?; + self.wrapped.sampler_buffers.insert(key, sampler_array_name); Ok(()) } diff --git a/naga/src/back/hlsl/keywords.rs b/naga/src/back/hlsl/keywords.rs index 63725c79024..481719bf5e7 100644 --- a/naga/src/back/hlsl/keywords.rs +++ b/naga/src/back/hlsl/keywords.rs @@ -819,8 +819,8 @@ pub const RESERVED: &[&str] = &[ super::writer::FREXP_FUNCTION, super::writer::EXTRACT_BITS_FUNCTION, super::writer::INSERT_BITS_FUNCTION, - super::writer::SAMPLER_BUFFER_VAR, - super::writer::COMPARISON_SAMPLER_BUFFER_VAR, + super::writer::SAMPLER_HEAP_VAR, + super::writer::COMPARISON_SAMPLER_HEAP_VAR, ]; // DXC scalar types, from https://github.com/microsoft/DirectXShaderCompiler/blob/18c9e114f9c314f93e68fbc72ce207d4ed2e65ae/tools/clang/lib/AST/ASTContextHLSL.cpp#L48-L254 diff --git a/naga/src/back/hlsl/mod.rs b/naga/src/back/hlsl/mod.rs index 0d96cd83f68..a9637a4d40e 100644 --- a/naga/src/back/hlsl/mod.rs +++ b/naga/src/back/hlsl/mod.rs @@ -271,13 +271,13 @@ impl Options { res_binding: &crate::ResourceBinding, ) -> Result { match self.binding_map.get(res_binding) { - Some(target) => Ok(target.clone()), + Some(target) => Ok(*target), None if self.fake_missing_bindings => Ok(BindTarget { space: res_binding.group as u8, register: res_binding.binding, binding_array_size: None, }), - None => Err(EntryPointError::MissingBinding(res_binding.clone())), + None => Err(EntryPointError::MissingBinding(*res_binding)), } } } diff --git a/naga/src/back/hlsl/writer.rs b/naga/src/back/hlsl/writer.rs index d7515ae4261..dc0ca4f09fa 100644 --- a/naga/src/back/hlsl/writer.rs +++ b/naga/src/back/hlsl/writer.rs @@ -24,8 +24,8 @@ pub(crate) const MODF_FUNCTION: &str = "naga_modf"; pub(crate) const FREXP_FUNCTION: &str = "naga_frexp"; pub(crate) const EXTRACT_BITS_FUNCTION: &str = "naga_extractBits"; pub(crate) const INSERT_BITS_FUNCTION: &str = "naga_insertBits"; -pub(crate) const SAMPLER_BUFFER_VAR: &str = "nagaSamplerArray"; -pub(crate) const COMPARISON_SAMPLER_BUFFER_VAR: &str = "nagaComparisonSamplerArray"; +pub(crate) const SAMPLER_HEAP_VAR: &str = "nagaSamplerHeap"; +pub(crate) const COMPARISON_SAMPLER_HEAP_VAR: &str = "nagaComparisonSamplerHeap"; struct EpStructMember { name: String, @@ -141,11 +141,11 @@ impl<'a, W: fmt::Write> super::Writer<'a, W> { ) { use crate::Expression; self.need_bake_expressions.clear(); - for (fun_handle, expr) in func.expressions.iter() { - let expr_info = &info[fun_handle]; - let min_ref_count = func.expressions[fun_handle].bake_ref_count(); + for (exp_handle, expr) in func.expressions.iter() { + let expr_info = &info[exp_handle]; + let min_ref_count = func.expressions[exp_handle].bake_ref_count(); if min_ref_count <= expr_info.ref_count { - self.need_bake_expressions.insert(fun_handle); + self.need_bake_expressions.insert(exp_handle); } if let Expression::Math { fun, arg, .. } = *expr { @@ -170,7 +170,7 @@ impl<'a, W: fmt::Write> super::Writer<'a, W> { self.need_bake_expressions.insert(arg); } crate::MathFunction::CountLeadingZeros => { - let inner = info[fun_handle].ty.inner_with(&module.types); + let inner = info[exp_handle].ty.inner_with(&module.types); if let Some(ScalarKind::Sint) = inner.scalar_kind() { self.need_bake_expressions.insert(arg); } @@ -185,6 +185,14 @@ impl<'a, W: fmt::Write> super::Writer<'a, W> { self.need_bake_expressions.insert(expr); } } + + if let Expression::GlobalVariable(_) = *expr { + let inner = info[exp_handle].ty.inner_with(&module.types); + + if let TypeInner::Sampler { .. } = *inner { + self.need_bake_expressions.insert(exp_handle); + } + } } for statement in func.body.iter() { match *statement { @@ -817,10 +825,10 @@ impl<'a, W: fmt::Write> super::Writer<'a, W> { _ => inner, }; - let is_sampler = matches!(*handle_ty, crate::TypeInner::Sampler { .. }); + let is_sampler = matches!(*handle_ty, TypeInner::Sampler { .. }); if is_sampler { - self.write_sampler(handle, global)?; + self.write_global_sampler(module, handle, global)?; return Ok(()); } @@ -960,23 +968,48 @@ impl<'a, W: fmt::Write> super::Writer<'a, W> { Ok(()) } - fn write_sampler( + fn write_global_sampler( &mut self, + module: &Module, handle: Handle, global: &crate::GlobalVariable, ) -> BackendResult { - let name = &self.names[&NameKey::GlobalVariable(handle)]; + let binding = *global.binding.as_ref().unwrap(); - let binding = global.binding.as_ref().unwrap(); + let key = super::SamplerBufferKey { + group: binding.group, + }; + self.write_wrapped_sampler_buffer(key)?; // this was already resolved earlier when we started evaluating an entry point. - let bt = self.options.resolve_resource_binding(binding).unwrap(); + let bt = self.options.resolve_resource_binding(&binding).unwrap(); - writeln!(self.out, "static const uint {name} = {};", bt.register)?; + let comparison = match module.types[global.ty].inner { + TypeInner::Sampler { comparison } => comparison, + TypeInner::BindingArray { .. } => { + // We don't emit anything for binding arrays immediately, + // as we need to do the index lookup just-in-time. + return Ok(()); + } + _ => unreachable!(), + }; - self.write_wrapped_sampler_buffer(super::SamplerBufferKey { - group: binding.group, - })?; + write!(self.out, "static const ")?; + self.write_type(module, global.ty)?; + + let heap_var = if comparison { + COMPARISON_SAMPLER_HEAP_VAR + } else { + SAMPLER_HEAP_VAR + }; + + let index_buffer_name = &self.wrapped.sampler_buffers[&key]; + let name = &self.names[&NameKey::GlobalVariable(handle)]; + writeln!( + self.out, + " {name} = {heap_var}[{index_buffer_name}[{register}]];", + register = bt.register + )?; Ok(()) } @@ -2917,23 +2950,12 @@ impl<'a, W: fmt::Write> super::Writer<'a, W> { } Expression::GlobalVariable(handle) => { let global_variable = &module.global_variables[handle]; - let ty = &module.types[global_variable.ty].inner; - if let crate::TypeInner::Sampler { comparison } = *ty { - let variable = if comparison { - COMPARISON_SAMPLER_BUFFER_VAR - } else { - SAMPLER_BUFFER_VAR - }; - let name = &self.names[&NameKey::GlobalVariable(handle)]; - write!(self.out, "{variable}[{name}]")?; - } else { - match global_variable.space { - crate::AddressSpace::Storage { .. } => {} - _ => { - let name = &self.names[&NameKey::GlobalVariable(handle)]; - write!(self.out, "{name}")?; - } + match global_variable.space { + crate::AddressSpace::Storage { .. } => {} + _ => { + let name = &self.names[&NameKey::GlobalVariable(handle)]; + write!(self.out, "{name}")?; } } } diff --git a/naga/src/back/msl/mod.rs b/naga/src/back/msl/mod.rs index 0c85c8a9e4c..7e92aa78afc 100644 --- a/naga/src/back/msl/mod.rs +++ b/naga/src/back/msl/mod.rs @@ -498,7 +498,7 @@ impl Options { index: 0, interpolation: None, }), - None => Err(EntryPointError::MissingBindTarget(res_binding.clone())), + None => Err(EntryPointError::MissingBindTarget(*res_binding)), } } diff --git a/naga/src/back/msl/writer.rs b/naga/src/back/msl/writer.rs index f4b55bbbc58..674127f2432 100644 --- a/naga/src/back/msl/writer.rs +++ b/naga/src/back/msl/writer.rs @@ -5149,7 +5149,7 @@ template }; if !good { ep_error = - Some(super::EntryPointError::MissingBindTarget(br.clone())); + Some(super::EntryPointError::MissingBindTarget(*br)); break; } } diff --git a/naga/src/lib.rs b/naga/src/lib.rs index 687dc5b441d..f52a18de3e7 100644 --- a/naga/src/lib.rs +++ b/naga/src/lib.rs @@ -963,7 +963,7 @@ pub enum Binding { } /// Pipeline binding information for global resources. -#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)] +#[derive(Copy, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)] #[cfg_attr(feature = "serialize", derive(Serialize))] #[cfg_attr(feature = "deserialize", derive(Deserialize))] #[cfg_attr(feature = "arbitrary", derive(Arbitrary))] diff --git a/naga/src/valid/interface.rs b/naga/src/valid/interface.rs index 335826d12ce..ddc7c9aa2b2 100644 --- a/naga/src/valid/interface.rs +++ b/naga/src/valid/interface.rs @@ -773,7 +773,7 @@ impl super::Validator { } if let Some(ref bind) = var.binding { - if !self.ep_resource_bindings.insert(bind.clone()) { + if !self.ep_resource_bindings.insert(*bind) { if self.flags.contains(super::ValidationFlags::BINDINGS) { return Err(EntryPointError::BindingCollision(var_handle) .with_span_handle(var_handle, &module.global_variables)); diff --git a/naga/tests/out/hlsl/binding-arrays.hlsl b/naga/tests/out/hlsl/binding-arrays.hlsl index 8ec57723df6..93555408043 100644 --- a/naga/tests/out/hlsl/binding-arrays.hlsl +++ b/naga/tests/out/hlsl/binding-arrays.hlsl @@ -12,11 +12,9 @@ Texture2DArray texture_array_2darray[5] : register(t0, space2); Texture2DMS texture_array_multisampled[5] : register(t0, space3); Texture2D texture_array_depth[5] : register(t0, space4); RWTexture2D texture_array_storage[5] : register(u0, space5); -static const uint samp = 0; -StructuredBuffer sampler_array : register(t0, space255); -SamplerState nagaSamplerArray[2048]: register(s0, space0); -SamplerComparisonState nagaComparisonSamplerArray[2048]: register(s0, space1); -static const uint samp_comp = 0; +SamplerState nagaSamplerHeap[2048]: register(s0, space0); +SamplerComparisonState nagaComparisonSamplerHeap[2048]: register(s0, space1); +StructuredBuffer nagaGroup0SamplerIndexArray : register(t0, space255); cbuffer uni : register(b0, space8) { UniformIndex uni; } struct FragmentInput_main { diff --git a/naga/tests/out/hlsl/image.hlsl b/naga/tests/out/hlsl/image.hlsl index 3ad76025c10..30bfd86aeb2 100644 --- a/naga/tests/out/hlsl/image.hlsl +++ b/naga/tests/out/hlsl/image.hlsl @@ -15,11 +15,11 @@ TextureCube image_cube : register(t5); TextureCubeArray image_cube_array : register(t6); Texture3D image_3d : register(t7); Texture2DMS image_aa : register(t8); -static const uint sampler_reg = 0; -StructuredBuffer sampler_array : register(t1, space255); -SamplerState nagaSamplerArray[2048]: register(s0, space0); -SamplerComparisonState nagaComparisonSamplerArray[2048]: register(s0, space1); -static const uint sampler_cmp = 1; +SamplerState nagaSamplerHeap[2048]: register(s0, space0); +SamplerComparisonState nagaComparisonSamplerHeap[2048]: register(s0, space1); +StructuredBuffer nagaGroup1SamplerIndexArray : register(t1, space255); +static const SamplerState sampler_reg = nagaSamplerHeap[nagaGroup1SamplerIndexArray[0]]; +static const SamplerComparisonState sampler_cmp = nagaComparisonSamplerHeap[nagaGroup1SamplerIndexArray[1]]; Texture2D image_2d_depth : register(t2, space1); Texture2DArray image_2d_array_depth : register(t3, space1); TextureCube image_cube_depth : register(t4, space1); @@ -250,70 +250,70 @@ float4 texture_sample() : SV_Target0 float2 tc = (0.5).xx; float3 tc3_ = (0.5).xxx; - float4 _e9 = image_1d.Sample(nagaSamplerArray[sampler_reg], tc.x); + float4 _e9 = image_1d.Sample(sampler_reg, tc.x); float4 _e10 = a; a = (_e10 + _e9); - float4 _e14 = image_2d.Sample(nagaSamplerArray[sampler_reg], tc); + float4 _e14 = image_2d.Sample(sampler_reg, tc); float4 _e15 = a; a = (_e15 + _e14); - float4 _e19 = image_2d.Sample(nagaSamplerArray[sampler_reg], tc, int2(int2(3, 1))); + float4 _e19 = image_2d.Sample(sampler_reg, tc, int2(int2(3, 1))); float4 _e20 = a; a = (_e20 + _e19); - float4 _e24 = image_2d.SampleLevel(nagaSamplerArray[sampler_reg], tc, 2.3); + float4 _e24 = image_2d.SampleLevel(sampler_reg, tc, 2.3); float4 _e25 = a; a = (_e25 + _e24); - float4 _e29 = image_2d.SampleLevel(nagaSamplerArray[sampler_reg], tc, 2.3, int2(int2(3, 1))); + float4 _e29 = image_2d.SampleLevel(sampler_reg, tc, 2.3, int2(int2(3, 1))); float4 _e30 = a; a = (_e30 + _e29); - float4 _e35 = image_2d.SampleBias(nagaSamplerArray[sampler_reg], tc, 2.0, int2(int2(3, 1))); + float4 _e35 = image_2d.SampleBias(sampler_reg, tc, 2.0, int2(int2(3, 1))); float4 _e36 = a; a = (_e36 + _e35); - float4 _e41 = image_2d_array.Sample(nagaSamplerArray[sampler_reg], float3(tc, 0u)); + float4 _e41 = image_2d_array.Sample(sampler_reg, float3(tc, 0u)); float4 _e42 = a; a = (_e42 + _e41); - float4 _e47 = image_2d_array.Sample(nagaSamplerArray[sampler_reg], float3(tc, 0u), int2(int2(3, 1))); + float4 _e47 = image_2d_array.Sample(sampler_reg, float3(tc, 0u), int2(int2(3, 1))); float4 _e48 = a; a = (_e48 + _e47); - float4 _e53 = image_2d_array.SampleLevel(nagaSamplerArray[sampler_reg], float3(tc, 0u), 2.3); + float4 _e53 = image_2d_array.SampleLevel(sampler_reg, float3(tc, 0u), 2.3); float4 _e54 = a; a = (_e54 + _e53); - float4 _e59 = image_2d_array.SampleLevel(nagaSamplerArray[sampler_reg], float3(tc, 0u), 2.3, int2(int2(3, 1))); + float4 _e59 = image_2d_array.SampleLevel(sampler_reg, float3(tc, 0u), 2.3, int2(int2(3, 1))); float4 _e60 = a; a = (_e60 + _e59); - float4 _e66 = image_2d_array.SampleBias(nagaSamplerArray[sampler_reg], float3(tc, 0u), 2.0, int2(int2(3, 1))); + float4 _e66 = image_2d_array.SampleBias(sampler_reg, float3(tc, 0u), 2.0, int2(int2(3, 1))); float4 _e67 = a; a = (_e67 + _e66); - float4 _e72 = image_2d_array.Sample(nagaSamplerArray[sampler_reg], float3(tc, 0)); + float4 _e72 = image_2d_array.Sample(sampler_reg, float3(tc, 0)); float4 _e73 = a; a = (_e73 + _e72); - float4 _e78 = image_2d_array.Sample(nagaSamplerArray[sampler_reg], float3(tc, 0), int2(int2(3, 1))); + float4 _e78 = image_2d_array.Sample(sampler_reg, float3(tc, 0), int2(int2(3, 1))); float4 _e79 = a; a = (_e79 + _e78); - float4 _e84 = image_2d_array.SampleLevel(nagaSamplerArray[sampler_reg], float3(tc, 0), 2.3); + float4 _e84 = image_2d_array.SampleLevel(sampler_reg, float3(tc, 0), 2.3); float4 _e85 = a; a = (_e85 + _e84); - float4 _e90 = image_2d_array.SampleLevel(nagaSamplerArray[sampler_reg], float3(tc, 0), 2.3, int2(int2(3, 1))); + float4 _e90 = image_2d_array.SampleLevel(sampler_reg, float3(tc, 0), 2.3, int2(int2(3, 1))); float4 _e91 = a; a = (_e91 + _e90); - float4 _e97 = image_2d_array.SampleBias(nagaSamplerArray[sampler_reg], float3(tc, 0), 2.0, int2(int2(3, 1))); + float4 _e97 = image_2d_array.SampleBias(sampler_reg, float3(tc, 0), 2.0, int2(int2(3, 1))); float4 _e98 = a; a = (_e98 + _e97); - float4 _e103 = image_cube_array.Sample(nagaSamplerArray[sampler_reg], float4(tc3_, 0u)); + float4 _e103 = image_cube_array.Sample(sampler_reg, float4(tc3_, 0u)); float4 _e104 = a; a = (_e104 + _e103); - float4 _e109 = image_cube_array.SampleLevel(nagaSamplerArray[sampler_reg], float4(tc3_, 0u), 2.3); + float4 _e109 = image_cube_array.SampleLevel(sampler_reg, float4(tc3_, 0u), 2.3); float4 _e110 = a; a = (_e110 + _e109); - float4 _e116 = image_cube_array.SampleBias(nagaSamplerArray[sampler_reg], float4(tc3_, 0u), 2.0); + float4 _e116 = image_cube_array.SampleBias(sampler_reg, float4(tc3_, 0u), 2.0); float4 _e117 = a; a = (_e117 + _e116); - float4 _e122 = image_cube_array.Sample(nagaSamplerArray[sampler_reg], float4(tc3_, 0)); + float4 _e122 = image_cube_array.Sample(sampler_reg, float4(tc3_, 0)); float4 _e123 = a; a = (_e123 + _e122); - float4 _e128 = image_cube_array.SampleLevel(nagaSamplerArray[sampler_reg], float4(tc3_, 0), 2.3); + float4 _e128 = image_cube_array.SampleLevel(sampler_reg, float4(tc3_, 0), 2.3); float4 _e129 = a; a = (_e129 + _e128); - float4 _e135 = image_cube_array.SampleBias(nagaSamplerArray[sampler_reg], float4(tc3_, 0), 2.0); + float4 _e135 = image_cube_array.SampleBias(sampler_reg, float4(tc3_, 0), 2.0); float4 _e136 = a; a = (_e136 + _e135); float4 _e138 = a; @@ -326,28 +326,28 @@ float texture_sample_comparison() : SV_Target0 float2 tc_1 = (0.5).xx; float3 tc3_1 = (0.5).xxx; - float _e8 = image_2d_depth.SampleCmp(nagaComparisonSamplerArray[sampler_cmp], tc_1, 0.5); + float _e8 = image_2d_depth.SampleCmp(sampler_cmp, tc_1, 0.5); float _e9 = a_1; a_1 = (_e9 + _e8); - float _e14 = image_2d_array_depth.SampleCmp(nagaComparisonSamplerArray[sampler_cmp], float3(tc_1, 0u), 0.5); + float _e14 = image_2d_array_depth.SampleCmp(sampler_cmp, float3(tc_1, 0u), 0.5); float _e15 = a_1; a_1 = (_e15 + _e14); - float _e20 = image_2d_array_depth.SampleCmp(nagaComparisonSamplerArray[sampler_cmp], float3(tc_1, 0), 0.5); + float _e20 = image_2d_array_depth.SampleCmp(sampler_cmp, float3(tc_1, 0), 0.5); float _e21 = a_1; a_1 = (_e21 + _e20); - float _e25 = image_cube_depth.SampleCmp(nagaComparisonSamplerArray[sampler_cmp], tc3_1, 0.5); + float _e25 = image_cube_depth.SampleCmp(sampler_cmp, tc3_1, 0.5); float _e26 = a_1; a_1 = (_e26 + _e25); - float _e30 = image_2d_depth.SampleCmpLevelZero(nagaComparisonSamplerArray[sampler_cmp], tc_1, 0.5); + float _e30 = image_2d_depth.SampleCmpLevelZero(sampler_cmp, tc_1, 0.5); float _e31 = a_1; a_1 = (_e31 + _e30); - float _e36 = image_2d_array_depth.SampleCmpLevelZero(nagaComparisonSamplerArray[sampler_cmp], float3(tc_1, 0u), 0.5); + float _e36 = image_2d_array_depth.SampleCmpLevelZero(sampler_cmp, float3(tc_1, 0u), 0.5); float _e37 = a_1; a_1 = (_e37 + _e36); - float _e42 = image_2d_array_depth.SampleCmpLevelZero(nagaComparisonSamplerArray[sampler_cmp], float3(tc_1, 0), 0.5); + float _e42 = image_2d_array_depth.SampleCmpLevelZero(sampler_cmp, float3(tc_1, 0), 0.5); float _e43 = a_1; a_1 = (_e43 + _e42); - float _e47 = image_cube_depth.SampleCmpLevelZero(nagaComparisonSamplerArray[sampler_cmp], tc3_1, 0.5); + float _e47 = image_cube_depth.SampleCmpLevelZero(sampler_cmp, tc3_1, 0.5); float _e48 = a_1; a_1 = (_e48 + _e47); float _e50 = a_1; @@ -357,12 +357,12 @@ float texture_sample_comparison() : SV_Target0 float4 gather() : SV_Target0 { float2 tc_2 = (0.5).xx; - float4 s2d = image_2d.GatherGreen(nagaSamplerArray[sampler_reg], tc_2); - float4 s2d_offset = image_2d.GatherAlpha(nagaSamplerArray[sampler_reg], tc_2, int2(int2(3, 1))); - float4 s2d_depth = image_2d_depth.GatherCmp(nagaComparisonSamplerArray[sampler_cmp], tc_2, 0.5); - float4 s2d_depth_offset = image_2d_depth.GatherCmp(nagaComparisonSamplerArray[sampler_cmp], tc_2, 0.5, int2(int2(3, 1))); - uint4 u = image_2d_u32_.Gather(nagaSamplerArray[sampler_reg], tc_2); - int4 i = image_2d_i32_.Gather(nagaSamplerArray[sampler_reg], tc_2); + float4 s2d = image_2d.GatherGreen(sampler_reg, tc_2); + float4 s2d_offset = image_2d.GatherAlpha(sampler_reg, tc_2, int2(int2(3, 1))); + float4 s2d_depth = image_2d_depth.GatherCmp(sampler_cmp, tc_2, 0.5); + float4 s2d_depth_offset = image_2d_depth.GatherCmp(sampler_cmp, tc_2, 0.5, int2(int2(3, 1))); + uint4 u = image_2d_u32_.Gather(sampler_reg, tc_2); + int4 i = image_2d_i32_.Gather(sampler_reg, tc_2); float4 f = (float4(u) + float4(i)); return ((((s2d + s2d_offset) + s2d_depth) + s2d_depth_offset) + f); } @@ -370,8 +370,8 @@ float4 gather() : SV_Target0 float4 depth_no_comparison() : SV_Target0 { float2 tc_3 = (0.5).xx; - float s2d_1 = image_2d_depth.Sample(nagaSamplerArray[sampler_reg], tc_3); - float4 s2d_gather = image_2d_depth.Gather(nagaSamplerArray[sampler_reg], tc_3); - float s2d_level = image_2d_depth.SampleLevel(nagaSamplerArray[sampler_reg], tc_3, 1); + float s2d_1 = image_2d_depth.Sample(sampler_reg, tc_3); + float4 s2d_gather = image_2d_depth.Gather(sampler_reg, tc_3); + float s2d_level = image_2d_depth.SampleLevel(sampler_reg, tc_3, 1); return (((s2d_1).xxxx + s2d_gather) + (s2d_level).xxxx); } diff --git a/naga/tests/out/hlsl/quad.hlsl b/naga/tests/out/hlsl/quad.hlsl index af34d1b67e0..580182a7def 100644 --- a/naga/tests/out/hlsl/quad.hlsl +++ b/naga/tests/out/hlsl/quad.hlsl @@ -6,10 +6,10 @@ struct VertexOutput { static const float c_scale = 1.2; Texture2D u_texture : register(t0); -static const uint u_sampler = 1; -StructuredBuffer sampler_array : register(t0, space255); -SamplerState nagaSamplerArray[2048]: register(s0, space0); -SamplerComparisonState nagaComparisonSamplerArray[2048]: register(s0, space1); +SamplerState nagaSamplerHeap[2048]: register(s0, space0); +SamplerComparisonState nagaComparisonSamplerHeap[2048]: register(s0, space1); +StructuredBuffer nagaGroup0SamplerIndexArray : register(t0, space255); +static const SamplerState u_sampler = nagaSamplerHeap[nagaGroup0SamplerIndexArray[1]]; struct VertexOutput_vert_main { float2 uv_2 : LOC0; @@ -37,7 +37,7 @@ VertexOutput_vert_main vert_main(float2 pos : LOC0, float2 uv : LOC1) float4 frag_main(FragmentInput_frag_main fragmentinput_frag_main) : SV_Target0 { float2 uv_1 = fragmentinput_frag_main.uv_3; - float4 color = u_texture.Sample(nagaSamplerArray[u_sampler], uv_1); + float4 color = u_texture.Sample(u_sampler, uv_1); if ((color.w == 0.0)) { discard; } diff --git a/naga/tests/out/hlsl/shadow.hlsl b/naga/tests/out/hlsl/shadow.hlsl index 450dcf58b96..f0d958b4122 100644 --- a/naga/tests/out/hlsl/shadow.hlsl +++ b/naga/tests/out/hlsl/shadow.hlsl @@ -28,10 +28,10 @@ cbuffer u_entity : register(b0, space1) { Entity u_entity; } ByteAddressBuffer s_lights : register(t1); cbuffer u_lights : register(b1) { Light u_lights[10]; } Texture2DArray t_shadow : register(t2); -static const uint sampler_shadow = 3; -StructuredBuffer sampler_array : register(t0, space255); -SamplerState nagaSamplerArray[2048]: register(s0, space0); -SamplerComparisonState nagaComparisonSamplerArray[2048]: register(s0, space1); +SamplerState nagaSamplerHeap[2048]: register(s0, space0); +SamplerComparisonState nagaComparisonSamplerHeap[2048]: register(s0, space1); +StructuredBuffer nagaGroup0SamplerIndexArray : register(t0, space255); +static const SamplerComparisonState sampler_shadow = nagaComparisonSamplerHeap[nagaGroup0SamplerIndexArray[3]]; struct VertexOutput_vs_main { float3 world_normal : LOC0; @@ -59,7 +59,7 @@ float fetch_shadow(uint light_id, float4 homogeneous_coords) float2 flip_correction = float2(0.5, -0.5); float proj_correction = (1.0 / homogeneous_coords.w); float2 light_local = (((homogeneous_coords.xy * flip_correction) * proj_correction) + float2(0.5, 0.5)); - float _e24 = t_shadow.SampleCmpLevelZero(nagaComparisonSamplerArray[sampler_shadow], float3(light_local, int(light_id)), (homogeneous_coords.z * proj_correction)); + float _e24 = t_shadow.SampleCmpLevelZero(sampler_shadow, float3(light_local, int(light_id)), (homogeneous_coords.z * proj_correction)); return _e24; } diff --git a/naga/tests/out/hlsl/skybox.hlsl b/naga/tests/out/hlsl/skybox.hlsl index 91d3179c6bd..f1d77c3c506 100644 --- a/naga/tests/out/hlsl/skybox.hlsl +++ b/naga/tests/out/hlsl/skybox.hlsl @@ -17,10 +17,10 @@ struct Data { cbuffer r_data : register(b0) { Data r_data; } TextureCube r_texture : register(t0); -static const uint r_sampler = 0; -StructuredBuffer sampler_array : register(t0, space2); -SamplerState nagaSamplerArray[2048]: register(s0, space0); -SamplerComparisonState nagaComparisonSamplerArray[2048]: register(s0, space1); +SamplerState nagaSamplerHeap[2048]: register(s0, space0); +SamplerComparisonState nagaComparisonSamplerHeap[2048]: register(s0, space1); +StructuredBuffer nagaGroup0SamplerIndexArray : register(t0, space2); +static const SamplerState r_sampler = nagaSamplerHeap[nagaGroup0SamplerIndexArray[0]]; struct VertexOutput_vs_main { float3 uv : LOC0; @@ -63,6 +63,6 @@ VertexOutput_vs_main vs_main(uint vertex_index : SV_VertexID) float4 fs_main(FragmentInput_fs_main fragmentinput_fs_main) : SV_Target0 { VertexOutput in_ = { fragmentinput_fs_main.position_1, fragmentinput_fs_main.uv_1 }; - float4 _e4 = r_texture.Sample(nagaSamplerArray[r_sampler], in_.uv); + float4 _e4 = r_texture.Sample(r_sampler, in_.uv); return _e4; } diff --git a/naga/tests/out/hlsl/texture-arg.hlsl b/naga/tests/out/hlsl/texture-arg.hlsl index e7f88338e9b..a2f24e626f0 100644 --- a/naga/tests/out/hlsl/texture-arg.hlsl +++ b/naga/tests/out/hlsl/texture-arg.hlsl @@ -1,8 +1,8 @@ Texture2D Texture : register(t0); -static const uint Sampler = 1; -StructuredBuffer sampler_array : register(t0, space255); -SamplerState nagaSamplerArray[2048]: register(s0, space0); -SamplerComparisonState nagaComparisonSamplerArray[2048]: register(s0, space1); +SamplerState nagaSamplerHeap[2048]: register(s0, space0); +SamplerComparisonState nagaComparisonSamplerHeap[2048]: register(s0, space1); +StructuredBuffer nagaGroup0SamplerIndexArray : register(t0, space255); +static const SamplerState Sampler = nagaSamplerHeap[nagaGroup0SamplerIndexArray[1]]; float4 test(Texture2D Passed_Texture, SamplerState Passed_Sampler) { @@ -12,6 +12,6 @@ float4 test(Texture2D Passed_Texture, SamplerState Passed_Sampler) float4 main() : SV_Target0 { - const float4 _e2 = test(Texture, nagaSamplerArray[Sampler]); + const float4 _e2 = test(Texture, Sampler); return _e2; }