summaryrefslogtreecommitdiff
path: root/renderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'renderer.cpp')
-rw-r--r--renderer.cpp223
1 files changed, 17 insertions, 206 deletions
diff --git a/renderer.cpp b/renderer.cpp
index 8bc2d94..d8c4895 100644
--- a/renderer.cpp
+++ b/renderer.cpp
@@ -5,23 +5,10 @@ extern "C" {
#include "memory.h"
}
-#include <string.h>
-
struct VP_Cbuffer {
m4f view_projection;
};
-struct TS_Cbuffer {
- m4f inv_view;
- m4f inv_proj;
- m4f prev_vp;
-};
-
-struct TS_Caster_Config {
- int index;
- char pad[60];
-};
-
struct Global_Cbuffer {
v3f camera_pos;
int light_count;
@@ -49,21 +36,7 @@ void init_drawlist(
);
}
-void Renderer::make_ts_sampler(Device* d) {
- Sampler_State s{};
- s.min = Filter_Mode::point;
- s.mag = Filter_Mode::point;
- s.mip = Filter_Mode::point;
- s.address_u = Address_Mode::clamp;
- s.address_v = Address_Mode::clamp;
- ts_sampler = d->create_sampler("temporal shadow sampler", s);
-}
-
-void Renderer::init(
- Arena* arena,
- Device* d,
- Asset_Arena& assets
-) {
+void Renderer::init(Arena* arena, Device* d) {
int i;
auto id = [&](int did, int cap) {
init_drawlist(&drawlists[did], d, arena, cap);
@@ -71,8 +44,6 @@ void Renderer::init(
id(FORWARD, 512);
for (i = SHADOW_MAP_START; i < SHADOW_MAP_END; i++)
id(i, 512);
- for (i = SHADOW_JIT_START; i < SHADOW_JIT_END; i++)
- id(i, 512);
camera_count = 1;
cameras.init();
globals.init(
@@ -81,39 +52,6 @@ void Renderer::init(
sizeof(Global_Cbuffer),
Buffer_Flags::constant_buffer
);
- ts_config.init(
- d,
- "Temporal shadow cbuffer",
- sizeof(TS_Cbuffer),
- Buffer_Flags::constant_buffer
- );
- ts_config2.init(
- d,
- "Temporal shadow casters",
- sizeof(TS_Caster_Config) * Lighting::max_shadows,
- Buffer_Flags::constant_buffer
- );
- quad.init(d);
- ts_shader = (Shader*)assets.load("ts.csh");
- ts_shadowmap_binding = ts_shader->descriptor_binding("shadowmaps");
- ts_depthmap_binding = ts_shader->descriptor_binding("depthmap");
- ts_prev_binding = ts_shader->descriptor_binding("previous");
- ts_vert_binding = ts_shader->binding_index("verts");
- ts_config_binding = ts_shader->descriptor_binding("config");
- ts_caster_config_binding = ts_shader->descriptor_binding("caster_config");
- ts_casters_binding = ts_shader->descriptor_binding("casters");
- ts_globals_binding = ts_shader->descriptor_binding("globals");
- ts_prev_occlusion_binding = ts_shader->descriptor_binding("prev_occlusion");
- assert(ts_shadowmap_binding >= 0);
- assert(ts_depthmap_binding >= 0);
- assert(ts_prev_binding >= 0);
- assert(ts_vert_binding >= 0);
- assert(ts_config_binding >= 0);
- assert(ts_caster_config_binding >= 0);
- assert(ts_casters_binding >= 0);
- assert(ts_globals_binding >= 0);
- assert(ts_prev_occlusion_binding >= 0);
- make_ts_sampler(d);
frame = 0;
}
@@ -122,10 +60,6 @@ void Renderer::destroy(Device* d) {
for (i = 0; i < drawlist_count; i++)
drawlists[i].vp.destroy(d);
globals.destroy(d);
- ts_config.destroy(d);
- ts_config2.destroy(d);
- quad.destroy(d);
- d->destroy_sampler(ts_sampler);
}
void Renderer::set_camera(Camera_Id cam, int drawlist) {
@@ -147,7 +81,6 @@ void Drawlist::render(
vpc->view_projection = cam.get_proj() * cam.get_view();
vp.unmap(dev);
vp.update(dev->get_ctx());
- res.shadows = l->ss_shadows[r.frame & 1];
res.sampler = r.clamped_linear;
res.env_cubemap = r.env_cubemap;
res.vp = vp.gpuonly;
@@ -173,73 +106,6 @@ void Renderer::update_globals(
globals.update(ctx);
}
-void Renderer::temporal_shadows(
- Device* dev,
- Context& ctx,
- const Lighting* l,
- Pipeline_Builder& pb
-) {
- int i, c = l->caster_count;
- Camera& cam = get_camera(drawlists[FORWARD].camera);
- TS_Cbuffer* cbuf = (TS_Cbuffer*)ts_config.map(dev);
- TS_Caster_Config* casters = (TS_Caster_Config*)ts_config2.map(dev);
- for (i = 0; i < c; i++) {
- casters[i].index = i;
- }
- cbuf->inv_view = cam.get_view().inverse();
- cbuf->inv_proj = cam.get_proj().inverse();
- cbuf->prev_vp = prev_vp;
- ts_config.unmap(dev);
- ts_config2.unmap(dev);
- ctx.debug_push("temporal shadows");
- ts_config.update(ctx);
- ts_config2.update(ctx);
- for (i = 0; i < c; i++) {
- int ind = frame & 1;
- auto& pass = pb
- .begin_rp()
- .rp_target(l->ss_shadow_slices[ind][i], Clear_Mode::discard)
- .rp_target(l->occlusion[ind], Clear_Mode::discard)
- .build_rp();
- auto& pip = pb
- .begin()
- .shader(ts_shader->id)
- .vertex_format(ts_shader->vf)
- .texture(
- ts_shadowmap_binding,
- l->shadows,
- l->shadow_sampler)
- .texture(
- ts_prev_binding,
- l->ss_shadow_slices[!ind][i],
- ts_sampler)
- .texture(
- ts_depthmap_binding,
- dev->get_depth_target(),
- ts_sampler)
- .texture(
- ts_prev_occlusion_binding,
- l->occlusion[!ind],
- ts_sampler)
- .cbuffer(ts_config_binding, ts_config.gpuonly)
- .cbuffer(
- ts_caster_config_binding,
- ts_config2.gpuonly,
- i * sizeof(TS_Caster_Config),
- sizeof(TS_Caster_Config))
- .cbuffer(ts_globals_binding, globals.gpuonly)
- .sbuffer(ts_casters_binding, l->gpu_casters.gpuonly)
- .build();
- quad.render(
- ctx,
- pip,
- pass,
- ts_vert_binding
- );
- }
- ctx.debug_pop();
-}
-
void Renderer::render(
Device* dev,
Arena* a, Texture_Id hdr_target,
@@ -260,11 +126,11 @@ void Renderer::render(
.rp_target(hdr_target, Clear_Mode::restore)
.rp_depth_target(dev->get_depth_target(), Clear_Mode::restore)
.build_rp();
- Render_Pass* shadow_passes[drawlist_count];
- for (i = SHADOW_MAP_START, j = 0; i < SHADOW_JIT_END; i++, j++) {
+ Render_Pass* shadow_passes[Lighting::max_shadows];
+ for (i = 0; i < Lighting::max_shadows; i++) {
shadow_passes[i] = &pb
.begin_rp()
- .rp_depth_target(l->shadow_slices[j], 1.0f)
+ .rp_depth_target(l->shadow_slices[i], 1.0f)
.build_rp();
}
@@ -272,26 +138,22 @@ void Renderer::render(
drawlists[FORWARD].render(*this, dev, a, l, depth_prepass, 0);
ctx.debug_pop();
- auto shadows = [&]<typename T>(int s, T cam) {
- for (i = s, j = 0; j < l->caster_count; i++, j++) {
- auto o = [](Pipeline_Builder& pb) {
- pb.cull(Cull_Mode::front);
- };
- setcam(i, l->casters[j].*cam);
- ctx.debug_push("shadow map");
- drawlists[i].render(*this, dev, a, l, *shadow_passes[i], o);
- ctx.debug_pop();
- }
- };
ctx.debug_push("shadow maps");
- shadows(SHADOW_MAP_START, &Caster::reality);
- ctx.debug_pop();
- ctx.debug_push("jittered shadow maps");
- shadows(SHADOW_JIT_START, &Caster::jittered);
+ for (
+ i = SHADOW_MAP_START, j = 0;
+ i < SHADOW_MAP_END && j < l->caster_count;
+ i++, j++
+ ) {
+ auto o = [](Pipeline_Builder& pb) {
+ pb.cull(Cull_Mode::front);
+ };
+ setcam(i, l->cameras[j]);
+ ctx.debug_push("shadow map");
+ drawlists[i].render(*this, dev, a, l, *shadow_passes[j], o);
+ ctx.debug_pop();
+ }
ctx.debug_pop();
- temporal_shadows(dev, ctx, l, pb);
-
ctx.debug_push("forward");
drawlists[FORWARD].render(*this, dev, a, l, forward_pass, 0);
ctx.debug_pop();
@@ -348,54 +210,3 @@ void Renderer::setcam(int did, Camera_Id cam) {
assert(cam.index);
drawlists[did].camera = cam;
}
-
-void Fullscreen_Quad::init(Device* d) {
- float verts[] = {
- -1.0f, -1.0f, 0.0f, 0.0f,
- -1.0f, 3.0f, 0.0f, 2.0f,
- 3.0f, -1.0f, 2.0f, 0.0f
- };
- Buffer_Id stage;
- void* mem;
- stage = d->create_buffer(
- "sky vb stage",
- sizeof verts,
- Buffer_Flags::cpu_readwrite |
- Buffer_Flags::copy_src
- );
- mem = d->map_buffer(stage, 0, sizeof verts);
- memcpy(mem, verts, sizeof verts);
- d->unmap_buffer(stage);
- vb = d->create_buffer(
- "fullscreen quad",
- sizeof verts,
- Buffer_Flags::copy_dst |
- Buffer_Flags::vertex_buffer
- );
- Context& ctx = d->acquire();
- ctx.copy(vb, stage);
- d->submit(ctx);
- d->destroy_bufferi(stage);
-}
-
-void Fullscreen_Quad::destroy(Device* d) {
- d->destroy_buffer(vb);
-}
-
-void Fullscreen_Quad::render(
- Context& ctx,
- Pipeline& pip,
- Render_Pass& pass,
- int bind
-) {
- Vertex_Buffer_Binding vbb[] = {{
- .id = vb,
- .offset = 0,
- .target = bind
- }, {}};
- Draw draw{};
- draw.verts = vbb;
- draw.vertex_count = 3;
- draw.instance_count = 1;
- ctx.submit(draw, pip, pass);
-}