Skip to content

Commit

Permalink
Refactored res man code. Fixed render tests.
Browse files Browse the repository at this point in the history
  • Loading branch information
facundo-villa committed Oct 20, 2023
1 parent 62df4bf commit 7afe336
Show file tree
Hide file tree
Showing 13 changed files with 800 additions and 908 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/rust.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,4 @@ jobs:
- name: Build
run: cargo build
- name: Run unit tests
run: RUST_BACKTRACE=1 cargo test -- --skip render
run: RUST_BACKTRACE=1 cargo test -- --skip render --skip window --skip graphics
7 changes: 2 additions & 5 deletions src/application.rs
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ impl Application for BaseApplication {
use log::{info, trace};
use maths_rs::prelude::Base;

use crate::{orchestrator, rendering::{render_system}, window_system, input_manager, Vector2, rendering::{self, render_system::RenderSystem}, render_domain, resource_manager, file_tracker};
use crate::{orchestrator, rendering::render_system, window_system, input_manager, Vector2, rendering::{self}, render_domain, resource_manager, file_tracker};

/// An orchestrated application is an application that uses the orchestrator to manage systems.
/// It is the recommended way to create a simple application.
Expand Down Expand Up @@ -139,7 +139,7 @@ impl Application for GraphicsApplication {

let orchestrator = application.get_mut_orchestrator();

orchestrator.spawn_entity(resource_manager::ResourceManager::new_as_system());
orchestrator.spawn_entity(resource_manager::resource_manager::ResourceManager::new_as_system());

let window_system_handle = orchestrator.spawn_entity(window_system::WindowSystem::new_as_system()).unwrap();
let input_system_handle = orchestrator.spawn_entity(input_manager::InputManager::new_as_system()).unwrap();
Expand Down Expand Up @@ -279,7 +279,6 @@ mod tests {
app.deinitialize();
}

#[ignore = "Ignore until we have a way to disable this test in CI where windows are not supported"]
#[test]
fn create_graphics_application() {
let mut app = GraphicsApplication::new("Test");
Expand All @@ -292,8 +291,6 @@ mod tests {
while !app.application.close {
app.tick();

println!("Tick!");

if start_time.elapsed().as_secs() > 1 {
app.close();
}
Expand Down
30 changes: 15 additions & 15 deletions src/render_domain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ impl VisibilityWorldRenderDomain {
let indices_buffer_handle = render_system.create_buffer(Some("Visibility Index Buffer"), 1024 * 1024 * 16, render_system::Uses::Index | render_system::Uses::Storage, render_system::DeviceAccesses::CpuWrite | render_system::DeviceAccesses::GpuRead, render_system::UseCases::STATIC);

let debug_position = render_system.create_texture(Some("debug position"), Extent::new(1920, 1080, 1), render_system::TextureFormats::RGBAu16, None, render_system::Uses::RenderTarget | render_system::Uses::Storage | render_system::Uses::TransferDestination, render_system::DeviceAccesses::GpuRead, render_system::UseCases::DYNAMIC);
let debug_normal = render_system.create_texture(Some("debug normal"), Extent::new(1920, 1080, 1), render_system::TextureFormats::RGBAu16, None, render_system::Uses::RenderTarget | render_system::Uses::Storage | render_system::Uses::TransferDestination, render_system::DeviceAccesses::GpuRead, render_system::UseCases::DYNAMIC);
let debug_normals = render_system.create_texture(Some("debug normal"), Extent::new(1920, 1080, 1), render_system::TextureFormats::RGBAu16, None, render_system::Uses::RenderTarget | render_system::Uses::Storage | render_system::Uses::TransferDestination, render_system::DeviceAccesses::GpuRead, render_system::UseCases::DYNAMIC);

let albedo = render_system.create_texture(Some("albedo"), Extent::new(1920, 1080, 1), render_system::TextureFormats::RGBAu16, None, render_system::Uses::RenderTarget | render_system::Uses::Storage | render_system::Uses::TransferDestination, render_system::DeviceAccesses::GpuRead, render_system::UseCases::DYNAMIC);
let depth_target = render_system.create_texture(Some("depth_target"), Extent::new(1920, 1080, 1), render_system::TextureFormats::Depth32, None, render_system::Uses::DepthStencil, render_system::DeviceAccesses::GpuRead, render_system::UseCases::DYNAMIC);
Expand Down Expand Up @@ -608,19 +608,19 @@ impl VisibilityWorldRenderDomain {
descriptor_set: visibility_passes_descriptor_set,
binding: 5,
array_element: 0,
descriptor: render_system::Descriptor::Texture(material_id),
descriptor: render_system::Descriptor::Texture{ handle: material_id, layout: render_system::Layouts::General },
},
render_system::DescriptorWrite { // MaterialId
descriptor_set: visibility_passes_descriptor_set,
binding: 6,
array_element: 0,
descriptor: render_system::Descriptor::Texture(primitive_index),
descriptor: render_system::Descriptor::Texture{ handle: primitive_index, layout: render_system::Layouts::General },
},
render_system::DescriptorWrite { // InstanceId
descriptor_set: visibility_passes_descriptor_set,
binding: 7,
array_element: 0,
descriptor: render_system::Descriptor::Texture(instance_id),
descriptor: render_system::Descriptor::Texture{ handle: instance_id, layout: render_system::Layouts::General },
},
]);

Expand Down Expand Up @@ -730,7 +730,7 @@ impl VisibilityWorldRenderDomain {
descriptor_set: material_evaluation_descriptor_set,
binding: 0,
array_element: 0,
descriptor: render_system::Descriptor::Texture(albedo),
descriptor: render_system::Descriptor::Texture{ handle: albedo, layout: render_system::Layouts::General },
},
render_system::DescriptorWrite { // MeshBuffer
descriptor_set: material_evaluation_descriptor_set,
Expand Down Expand Up @@ -772,13 +772,13 @@ impl VisibilityWorldRenderDomain {
descriptor_set: material_evaluation_descriptor_set,
binding: 7,
array_element: 0,
descriptor: render_system::Descriptor::Texture(debug_position),
descriptor: render_system::Descriptor::Texture{ handle: debug_position, layout: render_system::Layouts::General }
},
render_system::DescriptorWrite { // debug_normals
descriptor_set: material_evaluation_descriptor_set,
binding: 8,
array_element: 0,
descriptor: render_system::Descriptor::Texture(debug_normal),
descriptor: render_system::Descriptor::Texture{ handle: debug_normals, layout: render_system::Layouts::General }
},
render_system::DescriptorWrite { // LightData
descriptor_set: material_evaluation_descriptor_set,
Expand Down Expand Up @@ -894,13 +894,13 @@ impl VisibilityWorldRenderDomain {
descriptor_set,
binding: 0,
array_element: 0,
descriptor: render_system::Descriptor::Texture(albedo),
descriptor: render_system::Descriptor::Texture{ handle: albedo, layout: render_system::Layouts::General },
},
render_system::DescriptorWrite {
descriptor_set,
binding: 1,
array_element: 0,
descriptor: render_system::Descriptor::Texture(result),
descriptor: render_system::Descriptor::Texture{ handle: result, layout: render_system::Layouts::General },
},
]);

Expand Down Expand Up @@ -974,7 +974,7 @@ impl VisibilityWorldRenderDomain {
instance_id,

debug_position,
debug_normal,
debug_normal: debug_normals,

material_count,
material_offset,
Expand All @@ -997,7 +997,7 @@ impl VisibilityWorldRenderDomain {
.add_listener::<PointLight>()
}

fn load_material(&mut self, resource_manager: &mut resource_manager::ResourceManager, render_system: &mut render_system::RenderSystemImplementation, asset_url: &str) {
fn load_material(&mut self, resource_manager: &mut resource_manager::resource_manager::ResourceManager, render_system: &mut render_system::RenderSystemImplementation, asset_url: &str) {
let (response, buffer) = resource_manager.get(asset_url).unwrap();

for resource_document in &response.resources {
Expand Down Expand Up @@ -1622,17 +1622,17 @@ impl orchestrator::EntitySubscriber<Mesh> for VisibilityWorldRenderDomain {
orchestrator.tie_self(Self::transform, &handle, Mesh::transform);

{
let resource_manager = orchestrator.get_by_class::<resource_manager::ResourceManager>();
let resource_manager = orchestrator.get_by_class::<resource_manager::resource_manager::ResourceManager>();
let mut resource_manager = resource_manager.get_mut();
let resource_manager: &mut resource_manager::ResourceManager = resource_manager.downcast_mut().unwrap();
let resource_manager: &mut resource_manager::resource_manager::ResourceManager = resource_manager.downcast_mut().unwrap();

self.load_material(resource_manager, render_system, mesh.material_id);
}

if !self.mesh_resources.contains_key(mesh.resource_id) { // Load only if not already loaded
let resource_manager = orchestrator.get_by_class::<resource_manager::ResourceManager>();
let resource_manager = orchestrator.get_by_class::<resource_manager::resource_manager::ResourceManager>();
let mut resource_manager = resource_manager.get_mut();
let resource_manager: &mut resource_manager::ResourceManager = resource_manager.downcast_mut().unwrap();
let resource_manager: &mut resource_manager::resource_manager::ResourceManager = resource_manager.downcast_mut().unwrap();

self.load_material(resource_manager, render_system, mesh.material_id);

Expand Down
15 changes: 0 additions & 15 deletions src/rendering/cct.rs
Original file line number Diff line number Diff line change
@@ -1,19 +1,4 @@
//! Taken from https://github.com/m-lima/tempergb
//! Convert a [color temperature](https://en.wikipedia.org/wiki/Color_temperature) into RGB
//!
//! This is a rust port of the work by [Tanner Helland](https://tannerhelland.com/2012/09/18/convert-temperature-rgb-algorithm-code.html)
//!
//! # Example
//!
//! ```
//! use tempergb::{rgb_from_temperature, Color};
//! let temperature = 2500;
//! let rgb = tempergb::rgb_from_temperature(temperature);
//! assert_eq!(rgb, (255, 159, 70));
//! assert_eq!(rgb.r(), 255);
//! assert_eq!(rgb.g(), 159);
//! assert_eq!(rgb.b(), 70);
//! ```
use crate::Vector3;

Expand Down
28 changes: 18 additions & 10 deletions src/rendering/render_system.rs
Original file line number Diff line number Diff line change
Expand Up @@ -202,11 +202,14 @@ pub trait CommandBufferRecording {
}

pub enum Descriptor {
Buffer{
Buffer {
handle: BufferHandle,
size: usize,
},
Texture(TextureHandle),
Texture {
handle: TextureHandle,
layout: Layouts,
},
Swapchain(SwapchainHandle),
Sampler(SamplerHandle),
}
Expand Down Expand Up @@ -918,7 +921,7 @@ pub(super) mod tests {
let vertex_shader = renderer.create_shader(ShaderSourceType::GLSL, ShaderTypes::Vertex, vertex_shader_code.as_bytes());
let fragment_shader = renderer.create_shader(ShaderSourceType::GLSL, ShaderTypes::Fragment, fragment_shader_code.as_bytes());

let pipeline_layout = renderer.create_pipeline_layout(&[], &[]);
let pipeline_layout = renderer.create_pipeline_layout(&[], &[PushConstantRange{ offset: 0, size: 16 * 4 }]);

// Use and odd width to make sure there is a middle/center pixel
let extent = crate::Extent { width: 1920, height: 1080, depth: 1 };
Expand Down Expand Up @@ -1087,7 +1090,7 @@ pub(super) mod tests {

let buffer = renderer.create_buffer(None, 64, Uses::Uniform | Uses::Storage, DeviceAccesses::CpuWrite | DeviceAccesses::GpuRead, UseCases::DYNAMIC);

let sampled_texture = renderer.create_texture(None, crate::Extent { width: 2, height: 2, depth: 1 }, TextureFormats::RGBAu8, None, Uses::Texture, DeviceAccesses::CpuWrite | DeviceAccesses::GpuRead, UseCases::STATIC);
let sampled_texture = renderer.create_texture(Some("sampled texture"), crate::Extent { width: 2, height: 2, depth: 1 }, TextureFormats::RGBAu8, None, Uses::Texture, DeviceAccesses::CpuWrite | DeviceAccesses::GpuRead, UseCases::STATIC);

let pixels = vec![
RGBAu8 { r: 255, g: 0, b: 0, a: 255 },
Expand All @@ -1096,7 +1099,7 @@ pub(super) mod tests {
RGBAu8 { r: 255, g: 255, b: 0, a: 255 },
];

let sampler = renderer.create_sampler();
let sampler = renderer.create_sampler();

let bindings = [
DescriptorSetLayoutBinding {
Expand Down Expand Up @@ -1132,7 +1135,7 @@ pub(super) mod tests {
renderer.write(&[
DescriptorWrite { descriptor_set: descriptor_set, binding: 0, array_element: 0, descriptor: Descriptor::Sampler(sampler) },
DescriptorWrite { descriptor_set: descriptor_set, binding: 1, array_element: 0, descriptor: Descriptor::Buffer{ handle: buffer, size: 64 } },
DescriptorWrite { descriptor_set: descriptor_set, binding: 2, array_element: 0, descriptor: Descriptor::Texture(sampled_texture) },
DescriptorWrite { descriptor_set: descriptor_set, binding: 2, array_element: 0, descriptor: Descriptor::Texture{ handle: sampled_texture, layout: Layouts::Texture } },
]);

assert!(!renderer.has_errors());
Expand Down Expand Up @@ -1170,7 +1173,14 @@ pub(super) mod tests {

command_buffer_recording.write_texture_data(sampled_texture, &pixels);

// command_buffer_recording.transition_textures(&[(sampled_texture, true, Layouts::Texture, Stages::SHADER_READ, AccessPolicies::READ)]);
command_buffer_recording.consume_resources(&[
Consumption{
handle: Handle::Texture(sampled_texture),
stages: Stages::FRAGMENT,
access: AccessPolicies::READ,
layout: Layouts::Texture,
}
]);

let attachments = [
AttachmentInformation {
Expand Down Expand Up @@ -1392,8 +1402,6 @@ bitflags::bitflags! {
const PRESENTATION = 0b1000000;
/// The host stage.
const HOST = 0b10000000;
/// The shader read stage.
const SHADER_READ = 0b100000000;
/// The shader write stage.
const SHADER_WRITE = 0b1000000000;
/// The indirect commands evaluation stage.
Expand Down Expand Up @@ -1529,7 +1537,7 @@ pub struct DescriptorWrite {
/// The descriptor set to write to.
pub descriptor_set: DescriptorSetHandle,
/// The binding to write to.
pub binding: u32,
pub binding: u32,
/// The index of the array element to write to in the binding(if the binding is an array).
pub array_element: u32,
/// Information describing the descriptor.
Expand Down
Loading

0 comments on commit 7afe336

Please sign in to comment.