@@ -89,6 +89,17 @@ namespace cage
8989 Holder<DevicePipelinesCache> pipelinesCache;
9090 Holder<Texture> texDummy2d, texDummyArray, texDummyCube;
9191 Holder<GpuBuffer> bufDummyUniform, bufDummyStorage;
92+ wgpu::Sampler sampStaticShadowmaps;
93+
94+ void generateStaticSamplers ()
95+ {
96+ wgpu::SamplerDescriptor desc = {};
97+ desc.addressModeU = desc.addressModeV = desc.addressModeW = wgpu::AddressMode::ClampToEdge;
98+ desc.magFilter = desc.minFilter = wgpu::FilterMode::Nearest;
99+ desc.mipmapFilter = wgpu::MipmapFilterMode::Nearest;
100+ desc.label = " static sampler shadowmaps" ;
101+ sampStaticShadowmaps = device.CreateSampler (&desc);
102+ }
92103
93104 void generateDummyTextures ()
94105 {
@@ -97,11 +108,18 @@ namespace cage
97108 cfg.channels = 4 ;
98109 cfg.mipLevels = 1 ;
99110 texDummy2d = newTexture (this , cfg, " dummy2d" );
111+ texDummy2d = newTexture (texDummy2d->nativeTexture (), texDummy2d->nativeView (), sampStaticShadowmaps, " dummy2d" );
112+
100113 cfg.flags = TextureFlags::Array;
101114 texDummyArray = newTexture (this , cfg, " dummyArray" );
115+ texDummyArray = newTexture (texDummyArray->nativeTexture (), texDummyArray->nativeView (), sampStaticShadowmaps, " dummyArray" );
116+ texDummyArray->flags = cfg.flags ;
117+
102118 cfg.resolution [2 ] = 6 ;
103119 cfg.flags = TextureFlags::Cubemap;
104120 texDummyCube = newTexture (this , cfg, " dummyCube" );
121+ texDummyCube = newTexture (texDummyCube->nativeTexture (), texDummyCube->nativeView (), sampStaticShadowmaps, " dummyCube" );
122+ texDummyCube->flags = cfg.flags ;
105123
106124 wgpu::TexelCopyTextureInfo dest = {};
107125 dest.texture = texDummy2d->nativeTexture ();
@@ -201,20 +219,21 @@ namespace cage
201219 desc.SetDeviceLostCallback (wgpu::CallbackMode::AllowProcessEvents, lostFromDevice);
202220 desc.SetUncapturedErrorCallback (errorFromDevice);
203221
204- static constexpr std::array<wgpu::FeatureName, 1 > requiredFeatures = {
222+ static constexpr std::array<wgpu::FeatureName, 2 > requiredFeatures = {
223+ wgpu::FeatureName::StaticSamplers,
205224 wgpu::FeatureName::TextureCompressionBC,
206225 };
207226 desc.requiredFeatures = requiredFeatures.data ();
208227 desc.requiredFeatureCount = requiredFeatures.size ();
209228
210229 wgpu::Limits requiredLimits = {};
211230 requiredLimits.maxSampledTexturesPerShaderStage = 32 ;
212- requiredLimits.maxSamplersPerShaderStage = 32 ;
213231 desc.requiredLimits = &requiredLimits;
214232
215- static constexpr std::array<const char *, 2 > toggles = {
216- " use_user_defined_labels_in_backend " , // show my names for textures etc in nsight
233+ static constexpr std::array<const char *, 3 > toggles = {
234+ " allow_unsafe_apis " , // allow use of StaticSamplers
217235 " disable_symbol_renaming" , // preserve variable names in shaders
236+ " use_user_defined_labels_in_backend" , // show my names for textures etc in nsight
218237 };
219238 wgpu::DawnTogglesDescriptor togglesDesc;
220239 togglesDesc.enabledToggles = toggles.data ();
@@ -235,6 +254,7 @@ namespace cage
235254
236255 bindingsCache = newDeviceBindingsCache (this );
237256 pipelinesCache = newDevicePipelinesCache (this );
257+ generateStaticSamplers ();
238258 generateDummyTextures ();
239259 generateDummyBuffers ();
240260
@@ -407,4 +427,10 @@ namespace cage
407427 GraphicsDeviceImpl *impl = (GraphicsDeviceImpl *)device;
408428 return +impl->bufDummyStorage ;
409429 }
430+
431+ wgpu::Sampler getStaticSamplerShadowmap (GraphicsDevice *device)
432+ {
433+ GraphicsDeviceImpl *impl = (GraphicsDeviceImpl *)device;
434+ return impl->sampStaticShadowmaps ;
435+ }
410436}
0 commit comments