named gpu textures

- makes debugging easier
- part of named resources refactoring
This commit is contained in:
Dmitry Stepanov
2025-06-14 11:32:31 +03:00
parent f0649b23f0
commit d9744687c2
28 changed files with 240 additions and 64 deletions
+8 -5
View File
@@ -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()?;
+3 -2
View File
@@ -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,
},
)?;
}
+5 -2
View File
@@ -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 =
+1
View File
@@ -397,6 +397,7 @@ impl SceneController for UiScene {
&self.ui.drawing_context,
Color::DIM_GRAY,
PixelKind::RGBA8,
&engine.resource_manager,
),
);
}
+5
View File
@@ -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);
+3
View File
@@ -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,
+4
View File
@@ -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<GpuTexture, FrameworkError> {
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<GpuTexture, FrameworkError> {
self.create_texture(GpuTextureDescriptor {
name,
kind: GpuTextureKind::Cube { size },
pixel_kind,
..Default::default()
+2 -1
View File
@@ -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,
)?;
}
+4 -3
View File
@@ -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<Self, FrameworkError> {
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,
})
+1
View File
@@ -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,
+5 -1
View File
@@ -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<i32>,
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,
));
}
+20 -7
View File
@@ -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<TextureRenderData, FrameworkError> {
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.
@@ -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,
+22 -4
View File
@@ -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<Self, FrameworkError> {
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((
+8 -2
View File
@@ -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<Self, FrameworkError> {
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<DrawCallStatistics, FrameworkError> {
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<RenderPassStatistics, FrameworkError> {
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)
}
+27 -16
View File
@@ -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;
+57 -12
View File
@@ -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<GpuFrameBuffer, FrameworkError> {
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<GpuFrameBuffer, FrameworkError> {
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::<Texture>() {
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<Item = &'a DrawingContext>,
) -> 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<Item = &'a DrawingContext>,
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()?;
+18 -4
View File
@@ -127,12 +127,26 @@ impl OcclusionTester {
height: usize,
tile_size: usize,
) -> Result<Self, FrameworkError> {
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(
@@ -52,8 +52,12 @@ impl VisibilityBufferOptimizer {
w_tiles: usize,
h_tiles: usize,
) -> Result<Self, FrameworkError> {
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
+6
View File
@@ -217,6 +217,7 @@ impl RendererResources {
pub fn new(server: &dyn GraphicsServer) -> Result<Self, FrameworkError> {
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,
+5
View File
@@ -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<Self, FrameworkError> {
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,
+6
View File
@@ -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<GpuFrameBuffer, FrameworkError> {
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,
+4
View File
@@ -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<GpuFrameBuffer, FrameworkError> {
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<RenderPassStatistics, FrameworkError> {
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,
+2 -1
View File
@@ -48,7 +48,8 @@ impl Blur {
width: usize,
height: usize,
) -> Result<Self, FrameworkError> {
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,
+3 -1
View File
@@ -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,
+1
View File
@@ -47,6 +47,7 @@ impl MatrixStorage {
let identity = [Matrix4::<f32>::identity()];
Ok(Self {
texture: server.create_texture(GpuTextureDescriptor {
name: "MatrixStorage",
kind: GpuTextureKind::Rectangle {
width: 4,
height: 1,
+9 -1
View File
@@ -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,
))
}
+1
View File
@@ -185,6 +185,7 @@ pub fn make_brdf_lut(
}
server.create_texture(GpuTextureDescriptor {
name: "BrdfLut",
kind: GpuTextureKind::Rectangle {
width: size,
height: size,