From d9744687c2ff81e3b1ecc373a157d1739637334b Mon Sep 17 00:00:00 2001 From: Dmitry Stepanov Date: Sat, 14 Jun 2025 11:32:31 +0300 Subject: [PATCH] named gpu textures - makes debugging easier - part of named resources refactoring --- editor/src/asset/preview/mod.rs | 13 ++-- editor/src/highlight.rs | 5 +- editor/src/overlay.rs | 7 +- editor/src/ui_scene/mod.rs | 1 + fyrox-graphics-gl/src/texture.rs | 5 ++ fyrox-graphics/src/gpu_texture.rs | 3 + fyrox-graphics/src/server.rs | 4 ++ fyrox-impl/src/engine/mod.rs | 3 +- fyrox-impl/src/renderer/bloom/blur.rs | 7 +- fyrox-impl/src/renderer/bloom/mod.rs | 1 + fyrox-impl/src/renderer/bundle.rs | 6 +- fyrox-impl/src/renderer/cache/texture.rs | 27 ++++++-- fyrox-impl/src/renderer/forward_renderer.rs | 4 ++ fyrox-impl/src/renderer/gbuffer.rs | 26 +++++-- fyrox-impl/src/renderer/hdr/mod.rs | 10 ++- fyrox-impl/src/renderer/light.rs | 43 +++++++----- fyrox-impl/src/renderer/mod.rs | 69 +++++++++++++++---- fyrox-impl/src/renderer/occlusion/mod.rs | 22 ++++-- .../src/renderer/occlusion/optimizer.rs | 8 ++- fyrox-impl/src/renderer/resources.rs | 6 ++ fyrox-impl/src/renderer/shadow/csm.rs | 5 ++ fyrox-impl/src/renderer/shadow/point.rs | 6 ++ fyrox-impl/src/renderer/shadow/spot.rs | 4 ++ fyrox-impl/src/renderer/ssao/blur.rs | 3 +- fyrox-impl/src/renderer/ssao/mod.rs | 4 +- fyrox-impl/src/renderer/storage.rs | 1 + fyrox-impl/src/renderer/ui_renderer.rs | 10 ++- fyrox-impl/src/renderer/utils.rs | 1 + 28 files changed, 240 insertions(+), 64 deletions(-) diff --git a/editor/src/asset/preview/mod.rs b/editor/src/asset/preview/mod.rs index 61aabe6e5..b6873160d 100644 --- a/editor/src/asset/preview/mod.rs +++ b/editor/src/asset/preview/mod.rs @@ -334,11 +334,13 @@ fn render_scene_to_texture( scene.update(rt_size, 0.016, Default::default()); let temp_handle = Handle::new(u32::MAX, u32::MAX); - if let Ok(scene_data) = - graphics_context - .renderer - .render_scene(temp_handle, scene, elapsed_time, 0.0) - { + if let Ok(scene_data) = graphics_context.renderer.render_scene( + temp_handle, + scene, + elapsed_time, + 0.0, + &engine.resource_manager, + ) { let ldr_texture = scene_data.scene_data.ldr_scene_frame_texture(); let (width, height) = match ldr_texture.kind() { @@ -626,6 +628,7 @@ pub fn render_ui_to_texture( ui.draw(), Color::opaque(100, 100, 100), PixelKind::RGBA8, + &engine.resource_manager, ) .ok()?; diff --git a/editor/src/highlight.rs b/editor/src/highlight.rs index c5147861d..f69fca7e9 100644 --- a/editor/src/highlight.rs +++ b/editor/src/highlight.rs @@ -59,11 +59,11 @@ impl HighlightRenderPass { height = height.max(1); let depth_stencil = server - .create_2d_render_target(PixelKind::D24S8, width, height) + .create_2d_render_target("HighlightDepthStencil", PixelKind::D24S8, width, height) .unwrap(); let frame_texture = server - .create_2d_render_target(PixelKind::RGBA8, width, height) + .create_2d_render_target("HighlightFrameTexture", PixelKind::RGBA8, width, height) .unwrap(); server @@ -159,6 +159,7 @@ impl SceneRenderPass for HighlightRenderPass { scene_depth: Some(ctx.depth_texture), viewport: ctx.observer.viewport, uniform_memory_allocator: ctx.uniform_memory_allocator, + resource_manager: ctx.resource_manager, }, )?; } diff --git a/editor/src/overlay.rs b/editor/src/overlay.rs index 2efd83d71..c0e8eafa7 100644 --- a/editor/src/overlay.rs +++ b/editor/src/overlay.rs @@ -100,10 +100,13 @@ impl SceneRenderPass for OverlayRenderPass { let camera_side = inv_view.side(); let sound_icon = ctx .texture_cache - .get(ctx.server, &self.sound_icon) + .get(ctx.server, ctx.resource_manager, &self.sound_icon) .cloned() .unwrap(); - let light_icon = ctx.texture_cache.get(ctx.server, &self.light_icon).unwrap(); + let light_icon = ctx + .texture_cache + .get(ctx.server, ctx.resource_manager, &self.light_icon) + .unwrap(); for node in ctx.scene.graph.linear_iter() { let icon = diff --git a/editor/src/ui_scene/mod.rs b/editor/src/ui_scene/mod.rs index 34e653527..d0a4bb303 100644 --- a/editor/src/ui_scene/mod.rs +++ b/editor/src/ui_scene/mod.rs @@ -397,6 +397,7 @@ impl SceneController for UiScene { &self.ui.drawing_context, Color::DIM_GRAY, PixelKind::RGBA8, + &engine.resource_manager, ), ); } diff --git a/fyrox-graphics-gl/src/texture.rs b/fyrox-graphics-gl/src/texture.rs index d52cc7248..7b8b96082 100644 --- a/fyrox-graphics-gl/src/texture.rs +++ b/fyrox-graphics-gl/src/texture.rs @@ -287,6 +287,11 @@ impl GlTexture { result.set_data(desc.kind, desc.pixel_kind, desc.mip_count, desc.data)?; let mut binding = result.make_temp_binding(); + if server.gl.supports_debug() { + server + .gl + .object_label(glow::TEXTURE, texture.0.get(), Some(desc.name)); + } binding.set_base_level(desc.base_level); binding.set_max_level(desc.max_level); diff --git a/fyrox-graphics/src/gpu_texture.rs b/fyrox-graphics/src/gpu_texture.rs index cfdc916d6..262a106ef 100644 --- a/fyrox-graphics/src/gpu_texture.rs +++ b/fyrox-graphics/src/gpu_texture.rs @@ -417,6 +417,8 @@ pub enum CubeMapFace { /// Descriptor of a texture that is used to request textures from a graphics server. pub struct GpuTextureDescriptor<'a> { + /// Name of the texture. This name is used only for debug purposes. + pub name: &'a str, /// Kind of the texture. See [`GpuTextureKind`] docs for more info. pub kind: GpuTextureKind, /// Pixel kind of the texture. See [`PixelKind`] docs for more info. @@ -442,6 +444,7 @@ impl Default for GpuTextureDescriptor<'_> { // and may potentially lead to weird behavior! fn default() -> Self { Self { + name: "", kind: GpuTextureKind::Rectangle { width: 1, height: 1, diff --git a/fyrox-graphics/src/server.rs b/fyrox-graphics/src/server.rs index 61c9bc08e..47b9af3b6 100644 --- a/fyrox-graphics/src/server.rs +++ b/fyrox-graphics/src/server.rs @@ -176,11 +176,13 @@ pub trait GraphicsServer: GraphicsServerAsAny { /// size and pixel kind. fn create_2d_render_target( &self, + name: &str, pixel_kind: PixelKind, width: usize, height: usize, ) -> Result { self.create_texture(GpuTextureDescriptor { + name, kind: GpuTextureKind::Rectangle { width, height }, pixel_kind, ..Default::default() @@ -191,10 +193,12 @@ pub trait GraphicsServer: GraphicsServerAsAny { /// size and pixel kind. fn create_cube_render_target( &self, + name: &str, pixel_kind: PixelKind, size: usize, ) -> Result { self.create_texture(GpuTextureDescriptor { + name, kind: GpuTextureKind::Cube { size }, pixel_kind, ..Default::default() diff --git a/fyrox-impl/src/engine/mod.rs b/fyrox-impl/src/engine/mod.rs index 59857aef9..c452d3683 100644 --- a/fyrox-impl/src/engine/mod.rs +++ b/fyrox-impl/src/engine/mod.rs @@ -1869,7 +1869,7 @@ impl Engine { let window_size = if let GraphicsContext::Initialized(ctx) = &mut self.graphics_context { let inner_size = ctx.window.inner_size(); let window_size = Vector2::new(inner_size.width as f32, inner_size.height as f32); - ctx.renderer.update_caches(dt); + ctx.renderer.update_caches(&self.resource_manager, dt); window_size } else { Vector2::new(1.0, 1.0) @@ -2349,6 +2349,7 @@ impl Engine { self.elapsed_time, self.user_interfaces.iter().map(|ui| &ui.drawing_context), &ctx.window, + &self.resource_manager, )?; } diff --git a/fyrox-impl/src/renderer/bloom/blur.rs b/fyrox-impl/src/renderer/bloom/blur.rs index 308c6fea1..b5e6a520d 100644 --- a/fyrox-impl/src/renderer/bloom/blur.rs +++ b/fyrox-impl/src/renderer/bloom/blur.rs @@ -46,6 +46,7 @@ pub struct GaussianBlur { fn create_framebuffer( server: &dyn GraphicsServer, + name: &str, width: usize, height: usize, pixel_kind: PixelKind, @@ -53,7 +54,7 @@ fn create_framebuffer( server.create_frame_buffer( None, vec![Attachment::color( - server.create_2d_render_target(pixel_kind, width, height)?, + server.create_2d_render_target(name, pixel_kind, width, height)?, )], ) } @@ -66,8 +67,8 @@ impl GaussianBlur { pixel_kind: PixelKind, ) -> Result { Ok(Self { - h_framebuffer: create_framebuffer(server, width, height, pixel_kind)?, - v_framebuffer: create_framebuffer(server, width, height, pixel_kind)?, + h_framebuffer: create_framebuffer(server, "HBlur", width, height, pixel_kind)?, + v_framebuffer: create_framebuffer(server, "VBlur", width, height, pixel_kind)?, width, height, }) diff --git a/fyrox-impl/src/renderer/bloom/mod.rs b/fyrox-impl/src/renderer/bloom/mod.rs index a7622031d..aaabb13d9 100644 --- a/fyrox-impl/src/renderer/bloom/mod.rs +++ b/fyrox-impl/src/renderer/bloom/mod.rs @@ -57,6 +57,7 @@ impl BloomRenderer { framebuffer: server.create_frame_buffer( None, vec![Attachment::color(server.create_2d_render_target( + "Bloom", PixelKind::RGBA16F, width, height, diff --git a/fyrox-impl/src/renderer/bundle.rs b/fyrox-impl/src/renderer/bundle.rs index dd607ecdb..d23a6885b 100644 --- a/fyrox-impl/src/renderer/bundle.rs +++ b/fyrox-impl/src/renderer/bundle.rs @@ -78,6 +78,7 @@ use crate::{ use fxhash::{FxBuildHasher, FxHashMap, FxHasher}; use fyrox_graph::{SceneGraph, SceneGraphNode}; use fyrox_graphics::gpu_program::{SamplerFallback, ShaderResourceDefinition}; +use fyrox_resource::manager::ResourceManager; use std::{ fmt::{Debug, Formatter}, hash::{Hash, Hasher}, @@ -131,6 +132,7 @@ pub struct BundleRenderContext<'a> { pub frame_buffer: &'a GpuFrameBuffer, pub viewport: Rect, pub uniform_memory_allocator: &'a mut UniformMemoryAllocator, + pub resource_manager: &'a ResourceManager, // Built-in uniforms. pub use_pom: bool, @@ -343,6 +345,7 @@ pub fn make_texture_binding( resource_definition: &ShaderResourceDefinition, renderer_resources: &RendererResources, fallback: SamplerFallback, + resource_manager: &ResourceManager, texture_cache: &mut TextureCache, ) -> ResourceBinding { let fallback = renderer_resources.sampler_fallback(fallback); @@ -356,7 +359,7 @@ pub fn make_texture_binding( .as_ref() .and_then(|t| { texture_cache - .get(server, t) + .get(server, resource_manager, t) .map(|t| (&t.gpu_texture, &t.gpu_sampler)) }) .unwrap_or(fallback) @@ -620,6 +623,7 @@ impl RenderDataBundle { resource_definition, render_context.renderer_resources, fallback, + render_context.resource_manager, render_context.texture_cache, )); } diff --git a/fyrox-impl/src/renderer/cache/texture.rs b/fyrox-impl/src/renderer/cache/texture.rs index 741787d82..f62edad75 100644 --- a/fyrox-impl/src/renderer/cache/texture.rs +++ b/fyrox-impl/src/renderer/cache/texture.rs @@ -30,10 +30,13 @@ use fyrox_graphics::gpu_texture::{GpuTexture, GpuTextureDescriptor, GpuTextureKi use fyrox_graphics::sampler::{ GpuSampler, GpuSamplerDescriptor, MagnificationFilter, MinificationFilter, WrapMode, }; +use fyrox_resource::manager::ResourceManager; use fyrox_texture::{ TextureKind, TextureMagnificationFilter, TextureMinificationFilter, TexturePixelKind, TextureWrapMode, }; +use std::borrow::Cow; +use uuid::Uuid; #[derive(Clone)] pub struct TextureRenderData { @@ -149,9 +152,18 @@ fn create_sampler( fn create_gpu_texture( server: &dyn GraphicsServer, + resource_manager: &ResourceManager, + uuid: &Uuid, texture: &Texture, ) -> Result { + let path = resource_manager.uuid_to_resource_path(*uuid); + let name = path + .as_ref() + .map(|path| path.to_string_lossy()) + .unwrap_or_else(|| Cow::Borrowed("")); + let gpu_texture = server.create_texture(GpuTextureDescriptor { + name: &name, kind: convert_texture_kind(texture.kind()), pixel_kind: convert_pixel_kind(texture.pixel_kind()), mip_count: texture.mip_count() as usize, @@ -174,14 +186,15 @@ impl TextureCache { pub fn upload( &mut self, server: &dyn GraphicsServer, + resource_manager: &ResourceManager, texture: &TextureResource, ) -> Result<(), FrameworkError> { - let mut texture = texture.state(); - if let Some(texture) = texture.data() { + let texture = texture.state(); + if let Some((texture, uuid)) = texture.data_ref_with_id() { self.cache.get_entry_mut_or_insert_with( &texture.cache_index, Default::default(), - || create_gpu_texture(server, texture), + || create_gpu_texture(server, resource_manager, uuid, texture), )?; Ok(()) } else { @@ -194,15 +207,15 @@ impl TextureCache { pub fn get( &mut self, server: &dyn GraphicsServer, + resource_manager: &ResourceManager, texture_resource: &TextureResource, ) -> Option<&TextureRenderData> { - let mut texture_data_guard = texture_resource.state(); - - if let Some(texture) = texture_data_guard.data() { + let texture_data_guard = texture_resource.state(); + if let Some((texture, uuid)) = texture_data_guard.data_ref_with_id() { match self.cache.get_mut_or_insert_with( &texture.cache_index, Default::default(), - || create_gpu_texture(server, texture), + || create_gpu_texture(server, resource_manager, uuid, texture), ) { Ok(entry) => { // Check if some value has changed in resource. diff --git a/fyrox-impl/src/renderer/forward_renderer.rs b/fyrox-impl/src/renderer/forward_renderer.rs index 7204d50de..e1a8bf06a 100644 --- a/fyrox-impl/src/renderer/forward_renderer.rs +++ b/fyrox-impl/src/renderer/forward_renderer.rs @@ -33,6 +33,7 @@ use crate::{ }; use fyrox_graphics::framebuffer::GpuFrameBuffer; use fyrox_graphics::gpu_texture::GpuTexture; +use fyrox_resource::manager::ResourceManager; pub(crate) struct ForwardRenderer { render_pass_name: ImmutableString, @@ -51,6 +52,7 @@ pub(crate) struct ForwardRenderContext<'a> { pub scene_depth: &'a GpuTexture, pub ambient_light: Color, pub uniform_memory_allocator: &'a mut UniformMemoryAllocator, + pub resource_manager: &'a ResourceManager, } impl ForwardRenderer { @@ -79,6 +81,7 @@ impl ForwardRenderer { scene_depth, ambient_light, uniform_memory_allocator, + resource_manager, } = args; statistics += bundle_storage.render_to_frame_buffer( @@ -93,6 +96,7 @@ impl ForwardRenderer { frame_buffer: framebuffer, viewport, uniform_memory_allocator, + resource_manager, use_pom: quality_settings.use_parallax_mapping, light_position: &Default::default(), renderer_resources, diff --git a/fyrox-impl/src/renderer/gbuffer.rs b/fyrox-impl/src/renderer/gbuffer.rs index 0cac8e223..deca37e2f 100644 --- a/fyrox-impl/src/renderer/gbuffer.rs +++ b/fyrox-impl/src/renderer/gbuffer.rs @@ -52,6 +52,7 @@ use crate::{ scene::{decal::Decal, graph::Graph, mesh::RenderPath}, }; use fxhash::FxHashSet; +use fyrox_resource::manager::ResourceManager; pub struct GBuffer { framebuffer: GpuFrameBuffer, @@ -77,6 +78,7 @@ pub(crate) struct GBufferRenderContext<'a, 'b> { pub uniform_memory_allocator: &'a mut UniformMemoryAllocator, #[allow(dead_code)] pub screen_space_debug_renderer: &'a mut DebugRenderer, + pub resource_manager: &'a ResourceManager, } impl GBuffer { @@ -85,10 +87,21 @@ impl GBuffer { width: usize, height: usize, ) -> Result { - let diffuse_texture = server.create_2d_render_target(PixelKind::RGBA8, width, height)?; - let normal_texture = server.create_2d_render_target(PixelKind::RGBA8, width, height)?; + let diffuse_texture = server.create_2d_render_target( + "GBufferDiffuseTexture", + PixelKind::RGBA8, + width, + height, + )?; + let normal_texture = server.create_2d_render_target( + "GBufferNormalTexture", + PixelKind::RGBA8, + width, + height, + )?; let framebuffer = server.create_frame_buffer( Some(Attachment::depth_stencil(server.create_2d_render_target( + "GBufferDepthStencilTexture", PixelKind::D24S8, width, height, @@ -97,16 +110,19 @@ impl GBuffer { Attachment::color(diffuse_texture.clone()), Attachment::color(normal_texture.clone()), Attachment::color(server.create_2d_render_target( + "GBufferAmbientTexture", PixelKind::RGBA16F, width, height, )?), Attachment::color(server.create_2d_render_target( + "GBufferMaterialTexture", PixelKind::RGBA8, width, height, )?), Attachment::color(server.create_2d_render_target( + "GBufferDecalMaskTexture", PixelKind::R8UI, width, height, @@ -178,6 +194,7 @@ impl GBuffer { graph, uniform_buffer_cache, uniform_memory_allocator, + resource_manager, .. } = args; @@ -215,6 +232,7 @@ impl GBuffer { frame_buffer: &self.framebuffer, viewport, uniform_memory_allocator, + resource_manager, use_pom: quality_settings.use_parallax_mapping, light_position: &Default::default(), renderer_resources, @@ -263,7 +281,7 @@ impl GBuffer { .diffuse_texture() .and_then(|t| { texture_cache - .get(server, t) + .get(server, resource_manager, t) .map(|t| (t.gpu_texture.clone(), t.gpu_sampler.clone())) }) .unwrap_or(( @@ -276,7 +294,7 @@ impl GBuffer { .normal_texture() .and_then(|t| { texture_cache - .get(server, t) + .get(server, resource_manager, t) .map(|t| (t.gpu_texture.clone(), t.gpu_sampler.clone())) }) .unwrap_or(( diff --git a/fyrox-impl/src/renderer/hdr/mod.rs b/fyrox-impl/src/renderer/hdr/mod.rs index 71b6338d3..b562c6345 100644 --- a/fyrox-impl/src/renderer/hdr/mod.rs +++ b/fyrox-impl/src/renderer/hdr/mod.rs @@ -44,6 +44,7 @@ use crate::{ scene::camera::{ColorGradingLut, Exposure}, }; use fyrox_graphics::framebuffer::ReadTarget; +use fyrox_resource::manager::ResourceManager; mod adaptation; mod luminance; @@ -61,7 +62,8 @@ pub struct LumBuffer { impl LumBuffer { fn new(server: &dyn GraphicsServer, size: usize) -> Result { - let texture = server.create_2d_render_target(PixelKind::R32F, size, size)?; + let texture = + server.create_2d_render_target("LuminanceTexture", PixelKind::R32F, size, size)?; Ok(Self { framebuffer: server.create_frame_buffer(None, vec![Attachment::color(texture)])?, size, @@ -108,6 +110,7 @@ impl HighDynamicRangeRenderer { ], adaptation_chain: AdaptationChain::new(server)?, stub_lut: server.create_texture(GpuTextureDescriptor { + name: "StubHdrLut", kind: GpuTextureKind::Volume { width: 1, height: 1, @@ -292,13 +295,14 @@ impl HighDynamicRangeRenderer { texture_cache: &mut TextureCache, uniform_buffer_cache: &mut UniformBufferCache, renderer_resources: &RendererResources, + resource_manager: &ResourceManager, ) -> Result { let frame_matrix = make_viewport_matrix(viewport); let color_grading_lut_tex = color_grading_lut .and_then(|l| { texture_cache - .get(server, l.lut_ref()) + .get(server, resource_manager, l.lut_ref()) .map(|t| (&t.gpu_texture, &t.gpu_sampler)) }) .unwrap_or((&self.stub_lut, &renderer_resources.nearest_clamp_sampler)); @@ -369,6 +373,7 @@ impl HighDynamicRangeRenderer { texture_cache: &mut TextureCache, uniform_buffer_cache: &mut UniformBufferCache, renderer_resources: &RendererResources, + resource_manager: &ResourceManager, ) -> Result { let mut stats = RenderPassStatistics::default(); stats += self.calculate_frame_luminance( @@ -390,6 +395,7 @@ impl HighDynamicRangeRenderer { texture_cache, uniform_buffer_cache, renderer_resources, + resource_manager, )?; Ok(stats) } diff --git a/fyrox-impl/src/renderer/light.rs b/fyrox-impl/src/renderer/light.rs index e9ea376e4..eed47c36d 100644 --- a/fyrox-impl/src/renderer/light.rs +++ b/fyrox-impl/src/renderer/light.rs @@ -63,6 +63,7 @@ use crate::{ }, }; use fyrox_graphics::gpu_texture::GpuTexture; +use fyrox_resource::manager::ResourceManager; pub struct DeferredLightRenderer { sphere: GpuGeometryBuffer, @@ -94,6 +95,7 @@ pub(crate) struct DeferredRendererContext<'a> { pub uniform_memory_allocator: &'a mut UniformMemoryAllocator, pub dynamic_surface_cache: &'a mut DynamicSurfaceCache, pub ssao_renderer: &'a ScreenSpaceAmbientOcclusionRenderer, + pub resource_manager: &'a ResourceManager, } impl DeferredLightRenderer { @@ -255,6 +257,7 @@ impl DeferredLightRenderer { uniform_memory_allocator, dynamic_surface_cache, ssao_renderer, + resource_manager, } = args; let viewport = Rect::new(0, 0, gbuffer.width, gbuffer.height); @@ -288,7 +291,7 @@ impl DeferredLightRenderer { // Render skybox (if any). if let Some(skybox) = scene.skybox_ref().and_then(|s| s.cubemap_ref()) { - if let Some(texture_sampler_pair) = textures.get(server, skybox) { + if let Some(texture_sampler_pair) = textures.get(server, resource_manager, skybox) { let size = observer.position.z_far / 2.0f32.sqrt(); let scale = Matrix4::new_scaling(size); let wvp = Matrix4::new_translation(&observer.position.translation) * scale; @@ -327,7 +330,11 @@ impl DeferredLightRenderer { .as_ref() .or(render_data_bundle.environment_map.as_ref()) .or_else(|| scene.skybox_ref().and_then(|s| s.cubemap_ref())) - .and_then(|c| textures.get(server, c).map(|d| &d.gpu_texture)) + .and_then(|c| { + textures + .get(server, resource_manager, c) + .map(|d| &d.gpu_texture) + }) .unwrap_or(&renderer_resources.environment_dummy); // Ambient light. @@ -640,6 +647,7 @@ impl DeferredLightRenderer { renderer_resources, uniform_memory_allocator, dynamic_surface_cache, + resource_manager, )?; light_stats.spot_shadow_maps_rendered += 1; @@ -661,6 +669,7 @@ impl DeferredLightRenderer { renderer_resources, uniform_memory_allocator, dynamic_surface_cache, + resource_manager, })?; light_stats.point_shadow_maps_rendered += 1; @@ -679,6 +688,7 @@ impl DeferredLightRenderer { renderer_resources, uniform_memory_allocator, dynamic_surface_cache, + resource_manager, })?; light_stats.csm_rendered += 1; @@ -699,19 +709,11 @@ impl DeferredLightRenderer { ref cookie_texture, .. } => { - let (cookie_enabled, cookie_texture) = - if let Some(texture) = cookie_texture.as_ref() { - if let Some(cookie) = textures.get(server, texture) { - (true, (&cookie.gpu_texture, &cookie.gpu_sampler)) - } else { - ( - false, - ( - &renderer_resources.white_dummy, - &renderer_resources.linear_wrap_sampler, - ), - ) - } + let (cookie_enabled, cookie_texture) = if let Some(texture) = + cookie_texture.as_ref() + { + if let Some(cookie) = textures.get(server, resource_manager, texture) { + (true, (&cookie.gpu_texture, &cookie.gpu_sampler)) } else { ( false, @@ -720,7 +722,16 @@ impl DeferredLightRenderer { &renderer_resources.linear_wrap_sampler, ), ) - }; + } + } else { + ( + false, + ( + &renderer_resources.white_dummy, + &renderer_resources.linear_wrap_sampler, + ), + ) + }; light_stats.spot_lights_rendered += 1; diff --git a/fyrox-impl/src/renderer/mod.rs b/fyrox-impl/src/renderer/mod.rs index ca6c6a61e..57ead9a93 100644 --- a/fyrox-impl/src/renderer/mod.rs +++ b/fyrox-impl/src/renderer/mod.rs @@ -234,10 +234,19 @@ impl RenderDataContainer { assert_eq!(width, height); } - let depth_stencil = server.create_2d_render_target(PixelKind::D24S8, width, height)?; + let depth_stencil = server.create_2d_render_target( + "ObserverDepthStencil", + PixelKind::D24S8, + width, + height, + )?; // Intermediate scene frame will be rendered in HDR render target. - let hdr_frame_texture = - server.create_2d_render_target(PixelKind::RGBA16F, width, height)?; + let hdr_frame_texture = server.create_2d_render_target( + "ObserverHdrFrame", + PixelKind::RGBA16F, + width, + height, + )?; let hdr_scene_framebuffer = server.create_frame_buffer( Some(Attachment::depth_stencil(depth_stencil.clone())), @@ -245,6 +254,7 @@ impl RenderDataContainer { )?; let ldr_frame_texture = server.create_texture(GpuTextureDescriptor { + name: "LdrFrameTexture", kind: match final_frame_texture { FrameTextureKind::Rectangle => GpuTextureKind::Rectangle { width, height }, FrameTextureKind::Cube => GpuTextureKind::Cube { size: width }, @@ -266,6 +276,7 @@ impl RenderDataContainer { depth_stencil: GpuTexture, ) -> Result { let ldr_temp_texture = server.create_texture(GpuTextureDescriptor { + name: "LdrTempTexture", kind: GpuTextureKind::Rectangle { width, height }, // Final scene frame is in standard sRGB space. pixel_kind: PixelKind::RGBA8, @@ -396,6 +407,7 @@ fn make_ui_frame_buffer( pixel_kind: PixelKind, ) -> Result { let color_texture = server.create_texture(GpuTextureDescriptor { + name: "UiFbTexture", kind: GpuTextureKind::Rectangle { width: frame_size.x as usize, height: frame_size.y as usize, @@ -405,6 +417,7 @@ fn make_ui_frame_buffer( })?; let depth_stencil = server.create_2d_render_target( + "UiDepthStencil", PixelKind::D24S8, frame_size.x as usize, frame_size.y as usize, @@ -498,6 +511,9 @@ pub struct SceneRenderPassContext<'a, 'b> { /// Dynamic surface cache. See [`DynamicSurfaceCache`] docs for more info. pub dynamic_surface_cache: &'a mut DynamicSurfaceCache, + + /// A reference to the resource manager. + pub resource_manager: &'a ResourceManager, } /// A trait for custom scene rendering pass. It could be used to add your own rendering techniques. @@ -756,6 +772,7 @@ impl Renderer { drawing_context: &DrawingContext, clear_color: Color, pixel_kind: PixelKind, + resource_manager: &ResourceManager, ) -> Result<(), FrameworkError> { let new_width = screen_size.x as usize; let new_height = screen_size.y as usize; @@ -802,6 +819,7 @@ impl Renderer { uniform_buffer_cache: &mut self.uniform_buffer_cache, render_pass_cache: &mut self.shader_cache, uniform_memory_allocator: &mut self.uniform_memory_allocator, + resource_manager, })?; // Finally register texture in the cache so it will become available as texture in deferred/forward @@ -818,7 +836,7 @@ impl Renderer { ) } - fn update_texture_cache(&mut self, dt: f32) { + fn update_texture_cache(&mut self, resource_manager: &ResourceManager, dt: f32) { // Maximum amount of textures uploaded to GPU per frame. This defines throughput **only** for // requests from resource manager. This is needed to prevent huge lag when there are tons of // requests, so this is some kind of work load balancer. @@ -828,7 +846,10 @@ impl Renderer { while let Ok(event) = self.texture_event_receiver.try_recv() { if let ResourceEvent::Loaded(resource) | ResourceEvent::Reloaded(resource) = event { if let Some(texture) = resource.try_cast::() { - match self.texture_cache.upload(&*self.server, &texture) { + match self + .texture_cache + .upload(&*self.server, resource_manager, &texture) + { Ok(_) => { uploaded += 1; if uploaded >= THROUGHPUT { @@ -867,8 +888,8 @@ impl Renderer { /// /// Normally, this is called from `Engine::update()`. /// You should only call this manually if you don't use that method. - pub fn update_caches(&mut self, dt: f32) { - self.update_texture_cache(dt); + pub fn update_caches(&mut self, resource_manager: &ResourceManager, dt: f32) { + self.update_texture_cache(resource_manager, dt); self.update_shader_cache(dt); self.geometry_cache.update(dt); } @@ -880,6 +901,7 @@ impl Renderer { scene: &Scene, elapsed_time: f32, dt: f32, + resource_manager: &ResourceManager, ) -> Result<&mut RenderDataContainer, FrameworkError> { let server = &*self.server; @@ -967,6 +989,7 @@ impl Renderer { uniform_buffer_cache: &mut self.uniform_buffer_cache, uniform_memory_allocator: &mut self.uniform_memory_allocator, screen_space_debug_renderer: &mut self.screen_space_debug_renderer, + resource_manager, })?; server.set_polygon_fill_mode(PolygonFace::FrontAndBack, PolygonFillMode::Fill); @@ -1006,6 +1029,7 @@ impl Renderer { uniform_memory_allocator: &mut self.uniform_memory_allocator, dynamic_surface_cache: &mut self.dynamic_surface_cache, ssao_renderer: &render_data.ssao_renderer, + resource_manager, })?; render_data.statistics += light_stats; @@ -1026,6 +1050,7 @@ impl Renderer { scene_depth: depth, ambient_light: scene.rendering_options.ambient_lighting_color, uniform_memory_allocator: &mut self.uniform_memory_allocator, + resource_manager, })?; for render_pass in self.scene_render_passes.iter() { @@ -1052,6 +1077,7 @@ impl Renderer { uniform_buffer_cache: &mut self.uniform_buffer_cache, uniform_memory_allocator: &mut self.uniform_memory_allocator, dynamic_surface_cache: &mut self.dynamic_surface_cache, + resource_manager, })?; } @@ -1078,6 +1104,7 @@ impl Renderer { &mut self.texture_cache, &mut self.uniform_buffer_cache, &self.renderer_resources, + resource_manager, )?; std::mem::swap(&mut dest_buf, &mut src_buf); @@ -1136,6 +1163,7 @@ impl Renderer { uniform_buffer_cache: &mut self.uniform_buffer_cache, uniform_memory_allocator: &mut self.uniform_memory_allocator, dynamic_surface_cache: &mut self.dynamic_surface_cache, + resource_manager, })?; } @@ -1150,6 +1178,7 @@ impl Renderer { scene: &Scene, elapsed_time: f32, dt: f32, + resource_manager: &ResourceManager, ) -> Result<&SceneRenderData, FrameworkError> { let graph = &scene.graph; @@ -1228,15 +1257,28 @@ impl Renderer { // At first, render the reflection probes to off-screen render target and generate mipmaps // for the cube maps. for observer in observers.reflection_probes.iter() { - let render_data = - self.render_scene_observer(observer, scene_handle, scene, elapsed_time, dt)?; + let render_data = self.render_scene_observer( + observer, + scene_handle, + scene, + elapsed_time, + dt, + resource_manager, + )?; let probe_cube_map = render_data.ldr_scene_frame_texture().clone(); self.server.generate_mipmap(&probe_cube_map); } // Then render everything else. for observer in observers.cameras.iter() { - self.render_scene_observer(observer, scene_handle, scene, elapsed_time, dt)?; + self.render_scene_observer( + observer, + scene_handle, + scene, + elapsed_time, + dt, + resource_manager, + )?; } self.visibility_cache.update(graph); @@ -1266,6 +1308,7 @@ impl Renderer { &mut self, scenes: &SceneContainer, elapsed_time: f32, + resource_manager: &ResourceManager, drawing_contexts: impl Iterator, ) -> Result<(), FrameworkError> { if self.frame_size.0 == 0 || self.frame_size.1 == 0 { @@ -1300,7 +1343,7 @@ impl Renderer { let backbuffer_height = self.frame_size.1 as f32; for (scene_handle, scene) in scenes.pair_iter().filter(|(_, s)| *s.enabled) { - self.render_scene(scene_handle, scene, elapsed_time, dt)?; + self.render_scene(scene_handle, scene, elapsed_time, dt, resource_manager)?; } self.graphics_server() @@ -1320,6 +1363,7 @@ impl Renderer { uniform_buffer_cache: &mut self.uniform_buffer_cache, render_pass_cache: &mut self.shader_cache, uniform_memory_allocator: &mut self.uniform_memory_allocator, + resource_manager, })?; } @@ -1347,8 +1391,9 @@ impl Renderer { elapsed_time: f32, drawing_contexts: impl Iterator, window: &Window, + resource_manager: &ResourceManager, ) -> Result<(), FrameworkError> { - self.render_frame(scenes, elapsed_time, drawing_contexts)?; + self.render_frame(scenes, elapsed_time, resource_manager, drawing_contexts)?; self.statistics.end_frame(); window.pre_present_notify(); self.graphics_server().swap_buffers()?; diff --git a/fyrox-impl/src/renderer/occlusion/mod.rs b/fyrox-impl/src/renderer/occlusion/mod.rs index 0798c95e2..4349d5808 100644 --- a/fyrox-impl/src/renderer/occlusion/mod.rs +++ b/fyrox-impl/src/renderer/occlusion/mod.rs @@ -127,12 +127,26 @@ impl OcclusionTester { height: usize, tile_size: usize, ) -> Result { - let depth_stencil = server.create_2d_render_target(PixelKind::D24S8, width, height)?; - let visibility_mask = server.create_2d_render_target(PixelKind::RGBA8, width, height)?; + let depth_stencil = server.create_2d_render_target( + "OcclusionTesterDepthStencilTexture", + PixelKind::D24S8, + width, + height, + )?; + let visibility_mask = server.create_2d_render_target( + "OcclusionTesterVisibilityMask", + PixelKind::RGBA8, + width, + height, + )?; let w_tiles = width / tile_size + 1; let h_tiles = height / tile_size + 1; - let tile_buffer = - server.create_2d_render_target(PixelKind::R32UI, w_tiles * (MAX_BITS + 1), h_tiles)?; + let tile_buffer = server.create_2d_render_target( + "OcclusionTesterTileBuffer", + PixelKind::R32UI, + w_tiles * (MAX_BITS + 1), + h_tiles, + )?; Ok(Self { framebuffer: server.create_frame_buffer( diff --git a/fyrox-impl/src/renderer/occlusion/optimizer.rs b/fyrox-impl/src/renderer/occlusion/optimizer.rs index 4ff26fb15..7bfd932d5 100644 --- a/fyrox-impl/src/renderer/occlusion/optimizer.rs +++ b/fyrox-impl/src/renderer/occlusion/optimizer.rs @@ -52,8 +52,12 @@ impl VisibilityBufferOptimizer { w_tiles: usize, h_tiles: usize, ) -> Result { - let optimized_visibility_buffer = - server.create_2d_render_target(PixelKind::R32UI, w_tiles, h_tiles)?; + let optimized_visibility_buffer = server.create_2d_render_target( + "OptimizedVisibilityTexture", + PixelKind::R32UI, + w_tiles, + h_tiles, + )?; Ok(Self { framebuffer: server diff --git a/fyrox-impl/src/renderer/resources.rs b/fyrox-impl/src/renderer/resources.rs index 2b8cb91fd..406c46fe7 100644 --- a/fyrox-impl/src/renderer/resources.rs +++ b/fyrox-impl/src/renderer/resources.rs @@ -217,6 +217,7 @@ impl RendererResources { pub fn new(server: &dyn GraphicsServer) -> Result { Ok(Self { white_dummy: server.create_texture(GpuTextureDescriptor { + name: "WhiteDummy", kind: GpuTextureKind::Rectangle { width: 1, height: 1, @@ -226,6 +227,7 @@ impl RendererResources { ..Default::default() })?, black_dummy: server.create_texture(GpuTextureDescriptor { + name: "BlackDummy", kind: GpuTextureKind::Rectangle { width: 1, height: 1, @@ -235,6 +237,7 @@ impl RendererResources { ..Default::default() })?, environment_dummy: server.create_texture(GpuTextureDescriptor { + name: "EnvironmentDummy", kind: GpuTextureKind::Cube { size: 1 }, pixel_kind: PixelKind::RGBA8, data: Some(&[ @@ -248,6 +251,7 @@ impl RendererResources { ..Default::default() })?, normal_dummy: server.create_texture(GpuTextureDescriptor { + name: "NormalDummy", kind: GpuTextureKind::Rectangle { width: 1, height: 1, @@ -257,6 +261,7 @@ impl RendererResources { ..Default::default() })?, metallic_dummy: server.create_texture(GpuTextureDescriptor { + name: "MetallicDummy", kind: GpuTextureKind::Rectangle { width: 1, height: 1, @@ -266,6 +271,7 @@ impl RendererResources { ..Default::default() })?, volume_dummy: server.create_texture(GpuTextureDescriptor { + name: "VolumeDummy", kind: GpuTextureKind::Volume { width: 1, height: 1, diff --git a/fyrox-impl/src/renderer/shadow/csm.rs b/fyrox-impl/src/renderer/shadow/csm.rs index fea1ab0f8..61006885f 100644 --- a/fyrox-impl/src/renderer/shadow/csm.rs +++ b/fyrox-impl/src/renderer/shadow/csm.rs @@ -52,6 +52,7 @@ use crate::{ use approx::relative_eq; use fyrox_graphics::framebuffer::GpuFrameBuffer; use fyrox_graphics::gpu_texture::GpuTexture; +use fyrox_resource::manager::ResourceManager; pub struct Cascade { pub frame_buffer: GpuFrameBuffer, @@ -66,6 +67,7 @@ impl Cascade { precision: ShadowMapPrecision, ) -> Result { let depth = server.create_2d_render_target( + "CsmCascadeTexture", match precision { ShadowMapPrecision::Full => PixelKind::D32F, ShadowMapPrecision::Half => PixelKind::D16, @@ -106,6 +108,7 @@ pub(crate) struct CsmRenderContext<'a, 'c> { pub renderer_resources: &'a RendererResources, pub uniform_memory_allocator: &'a mut UniformMemoryAllocator, pub dynamic_surface_cache: &'a mut DynamicSurfaceCache, + pub resource_manager: &'a ResourceManager, } impl CsmRenderer { @@ -156,6 +159,7 @@ impl CsmRenderer { renderer_resources, uniform_memory_allocator, dynamic_surface_cache, + resource_manager, } = ctx; let LightSourceKind::Directional { ref csm_options } = light.kind else { @@ -282,6 +286,7 @@ impl CsmRenderer { frame_buffer: framebuffer, viewport, uniform_memory_allocator, + resource_manager, use_pom: false, light_position: &Default::default(), renderer_resources, diff --git a/fyrox-impl/src/renderer/shadow/point.rs b/fyrox-impl/src/renderer/shadow/point.rs index 6737322c7..27962b0dd 100644 --- a/fyrox-impl/src/renderer/shadow/point.rs +++ b/fyrox-impl/src/renderer/shadow/point.rs @@ -45,6 +45,7 @@ use crate::{ }, scene::{collider::BitMask, graph::Graph}, }; +use fyrox_resource::manager::ResourceManager; pub struct PointShadowMapRenderer { precision: ShadowMapPrecision, @@ -67,6 +68,7 @@ pub(crate) struct PointShadowMapRenderContext<'a> { pub renderer_resources: &'a RendererResources, pub uniform_memory_allocator: &'a mut UniformMemoryAllocator, pub dynamic_surface_cache: &'a mut DynamicSurfaceCache, + pub resource_manager: &'a ResourceManager, } impl PointShadowMapRenderer { @@ -81,6 +83,7 @@ impl PointShadowMapRenderer { precision: ShadowMapPrecision, ) -> Result { let depth = server.create_2d_render_target( + "PointShadowMapDepthTexture", match precision { ShadowMapPrecision::Full => PixelKind::D32F, ShadowMapPrecision::Half => PixelKind::D16, @@ -90,6 +93,7 @@ impl PointShadowMapRenderer { )?; let cube_map = server.create_texture(GpuTextureDescriptor { + name: "PointLightShadowCubeMap", kind: GpuTextureKind::Cube { size }, pixel_kind: PixelKind::R16F, ..Default::default() @@ -145,6 +149,7 @@ impl PointShadowMapRenderer { renderer_resources, uniform_memory_allocator, dynamic_surface_cache, + resource_manager, } = args; let framebuffer = &self.cascades[cascade]; @@ -199,6 +204,7 @@ impl PointShadowMapRenderer { frame_buffer: framebuffer, viewport, uniform_memory_allocator, + resource_manager, use_pom: false, light_position: &light_pos, renderer_resources, diff --git a/fyrox-impl/src/renderer/shadow/spot.rs b/fyrox-impl/src/renderer/shadow/spot.rs index 771ed17b4..2d992c269 100644 --- a/fyrox-impl/src/renderer/shadow/spot.rs +++ b/fyrox-impl/src/renderer/shadow/spot.rs @@ -43,6 +43,7 @@ use crate::{ }; use fyrox_graphics::framebuffer::GpuFrameBuffer; use fyrox_graphics::gpu_texture::GpuTexture; +use fyrox_resource::manager::ResourceManager; pub struct SpotShadowMapRenderer { precision: ShadowMapPrecision, @@ -66,6 +67,7 @@ impl SpotShadowMapRenderer { precision: ShadowMapPrecision, ) -> Result { let depth = server.create_2d_render_target( + "SpotShadowMapCascade", match precision { ShadowMapPrecision::Full => PixelKind::D32F, ShadowMapPrecision::Half => PixelKind::D16, @@ -123,6 +125,7 @@ impl SpotShadowMapRenderer { renderer_resources: &RendererResources, uniform_memory_allocator: &mut UniformMemoryAllocator, dynamic_surface_cache: &mut DynamicSurfaceCache, + resource_manager: &ResourceManager, ) -> Result { let mut statistics = RenderPassStatistics::default(); @@ -164,6 +167,7 @@ impl SpotShadowMapRenderer { frame_buffer: framebuffer, viewport, uniform_memory_allocator, + resource_manager, use_pom: false, light_position: &Default::default(), renderer_resources, diff --git a/fyrox-impl/src/renderer/ssao/blur.rs b/fyrox-impl/src/renderer/ssao/blur.rs index eeb6741f6..d48f68f1e 100644 --- a/fyrox-impl/src/renderer/ssao/blur.rs +++ b/fyrox-impl/src/renderer/ssao/blur.rs @@ -48,7 +48,8 @@ impl Blur { width: usize, height: usize, ) -> Result { - let frame = server.create_2d_render_target(PixelKind::R32F, width, height)?; + let frame = + server.create_2d_render_target("BlurTexture", PixelKind::R32F, width, height)?; Ok(Self { framebuffer: server.create_frame_buffer(None, vec![Attachment::color(frame)])?, width, diff --git a/fyrox-impl/src/renderer/ssao/mod.rs b/fyrox-impl/src/renderer/ssao/mod.rs index b20214fc5..c0aa34eb8 100644 --- a/fyrox-impl/src/renderer/ssao/mod.rs +++ b/fyrox-impl/src/renderer/ssao/mod.rs @@ -74,7 +74,8 @@ impl ScreenSpaceAmbientOcclusionRenderer { let width = (frame_width / 2).max(1); let height = (frame_height / 2).max(1); - let occlusion = server.create_2d_render_target(PixelKind::R32F, width, height)?; + let occlusion = + server.create_2d_render_target("SsaoTexture", PixelKind::R32F, width, height)?; let mut rng = crate::rand::thread_rng(); @@ -110,6 +111,7 @@ impl ScreenSpaceAmbientOcclusionRenderer { pixel[2] = 0u8; // B } server.create_texture(GpuTextureDescriptor { + name: "SsaoNoise", kind: GpuTextureKind::Rectangle { width: NOISE_SIZE, height: NOISE_SIZE, diff --git a/fyrox-impl/src/renderer/storage.rs b/fyrox-impl/src/renderer/storage.rs index f79a370b9..ace26cf7e 100644 --- a/fyrox-impl/src/renderer/storage.rs +++ b/fyrox-impl/src/renderer/storage.rs @@ -47,6 +47,7 @@ impl MatrixStorage { let identity = [Matrix4::::identity()]; Ok(Self { texture: server.create_texture(GpuTextureDescriptor { + name: "MatrixStorage", kind: GpuTextureKind::Rectangle { width: 4, height: 1, diff --git a/fyrox-impl/src/renderer/ui_renderer.rs b/fyrox-impl/src/renderer/ui_renderer.rs index 5cc955db4..1d00a4282 100644 --- a/fyrox-impl/src/renderer/ui_renderer.rs +++ b/fyrox-impl/src/renderer/ui_renderer.rs @@ -62,6 +62,7 @@ use fyrox_graphics::{ gpu_program::ShaderResourceKind, uniform::StaticUniformBuffer, }; +use fyrox_resource::manager::ResourceManager; use fyrox_ui::draw::Command; use uuid::Uuid; @@ -95,6 +96,8 @@ pub struct UiRenderContext<'a, 'b, 'c> { pub render_pass_cache: &'a mut ShaderCache, /// A reference to the uniform memory allocator. pub uniform_memory_allocator: &'a mut UniformMemoryAllocator, + /// A reference to the resource manager. + pub resource_manager: &'a ResourceManager, } fn write_uniform_blocks( @@ -284,6 +287,7 @@ impl UiRenderer { uniform_buffer_cache, render_pass_cache, uniform_memory_allocator, + resource_manager, } = args; let mut statistics = RenderPassStatistics::default(); @@ -430,6 +434,7 @@ impl UiRenderer { } if let Some(texture) = texture_cache.get( server, + resource_manager, &page .texture .as_ref() @@ -446,7 +451,9 @@ impl UiRenderer { } } CommandTexture::Texture(texture) => { - if let Some(texture) = texture_cache.get(server, texture) { + if let Some(texture) = + texture_cache.get(server, resource_manager, texture) + { diffuse_texture = (&texture.gpu_texture, &texture.gpu_sampler); } @@ -466,6 +473,7 @@ impl UiRenderer { resource, renderer_resources, fallback, + resource_manager, texture_cache, )) } diff --git a/fyrox-impl/src/renderer/utils.rs b/fyrox-impl/src/renderer/utils.rs index b2e167c36..54d5876b0 100644 --- a/fyrox-impl/src/renderer/utils.rs +++ b/fyrox-impl/src/renderer/utils.rs @@ -185,6 +185,7 @@ pub fn make_brdf_lut( } server.create_texture(GpuTextureDescriptor { + name: "BrdfLut", kind: GpuTextureKind::Rectangle { width: size, height: size,