renderer.h

cross platform rendering playground

src/renderer.h

2.14 KB
#pragma once

#include <cstdint>
#include <vector>

#include "backend/rhi.h"
#include "core/frame_stats.h"
#include "core/globals.h"
#include "core/gpu_arena.h"
#include "passes/debug/debug_draw.h"
#include "scene/scene.h"
#include "shaders/renderer_types.h"

struct SceneGraph;

struct MeshRT {
    rhi::Buffer blas_buffer;
    rhi::AccelStruct blas{};
    u64 blas_device_address = 0;
    bool dynamic = false;
};

struct RtScene {
    rhi::AccelStruct tlas{};

    rhi::Buffer scratch_buffer;
    u64 scratch_device_addr = 0;
    u64 scratch_size = 0;
    rhi::Buffer tlas_buffer;
    u64 tlas_buffer_size = 0;
    rhi::Buffer instance_buffer;
    u64 instance_buffer_size = 0;
    rhi::Buffer instance_data_buffer;
};

constexpr rhi::SampleCount MSAA_SAMPLE_COUNT = rhi::SampleCount::Sample1;

struct RenderData {
    u64 vertex_bda = 0;
    u64 index_bda = 0;

    u64 aniso_wrap_mips = 0;
    u64 linear_clamp_mips = 0;
    u64 linear_clamp = 0;
    u64 cmp_greater = 0;

    rhi::BufferView vertex_view{};
    rhi::BufferView frame_ubo_view[MAX_FRAMES_IN_FLIGHT]{};
    u32 render_item_count = 0;

    FrameStats frame_stats;

    Arena staging;

    std::vector<Vertex> vertices;
    std::vector<u32> indices;
    std::vector<SubmeshGPU> submeshes;
    std::vector<MeshRT> mesh_rt;
    std::vector<MaterialGPU> materials;
    std::vector<RenderItemGPU> render_items;

    rhi::Buffer vertex_buffer;
    rhi::Buffer index_buffer;
    rhi::Buffer submesh_buffer;
    rhi::Buffer material_buffer;
    rhi::Buffer render_item_buffer;

    RtScene rt_scene;

    rhi::Image display;
    rhi::Image irr_atlas;
    rhi::Image dis_atlas;
    rhi::Image sky;
    rhi::ImageView sky_view;
    rhi::Image cascade[Light::CASCADE_COUNT];
    rhi::Image id_blit;

    u32 cascade_size = 2048;

    std::vector<std::pair<rhi::Image, rhi::ImageView>> loaded_textures;

    DdgiGridParams ddgi_grid{};
    DdgiConfig ddgi_cfg{};

    DebugViewMode debug = DebugViewMode::NONE;
    DebugDraw debug_draw;
    SceneGraph *scene_graph = nullptr;
};

struct FrameData {
    rhi::Buffer frame_ubo;

    rhi::Buffer point_light_buffer;

    rhi::Buffer transform_buffer;
    u32 transform_capacity = 0;
};