diff options
Diffstat (limited to 'renderer.cpp')
-rw-r--r-- | renderer.cpp | 223 |
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); -} |