From 5b548cb866405b6716d5f904e4df75c07dbbad9b Mon Sep 17 00:00:00 2001 From: quou Date: Sun, 2 Mar 2025 17:30:17 +1100 Subject: nevermind --- Makefile | 17 ++-- build.ninja | 9 +- c2.cpp | 73 +++++++++++++-- configure.lua | 1 - intermediate/forward.h | 6 -- intermediate/surface.glsl | 59 ++++++++++-- intermediate/ts.glsl | 179 ------------------------------------- lighting.cpp | 127 +++++--------------------- lighting.hpp | 25 ++---- model.cpp | 6 +- model.hpp | 1 - renderer.cpp | 223 ++++------------------------------------------ renderer.hpp | 43 +-------- sc/sc.cpp | 2 +- src/guy.blend | Bin 483196 -> 0 bytes video.cpp | 19 ++-- video.hpp | 1 - 17 files changed, 185 insertions(+), 606 deletions(-) delete mode 100644 intermediate/ts.glsl delete mode 100644 src/guy.blend diff --git a/Makefile b/Makefile index fe8d568..4a1b27e 100644 --- a/Makefile +++ b/Makefile @@ -118,18 +118,15 @@ data/tonemap.csh: intermediate/tonemap.glsl shadercompiler | data data/triangle.csh: intermediate/triangle.glsl shadercompiler | data cpp -MMD -MF data/triangle.d -MT data/triangle.csh -Iintermediate intermediate/triangle.glsl > /dev/null ./shadercompiler intermediate/triangle.glsl data/triangle.csh -data/ts.csh: intermediate/ts.glsl shadercompiler | data - cpp -MMD -MF data/ts.d -MT data/ts.csh -Iintermediate intermediate/ts.glsl > /dev/null - ./shadercompiler intermediate/ts.glsl data/ts.csh data/ui.csh: intermediate/ui.glsl shadercompiler | data cpp -MMD -MF data/ui.d -MT data/ui.csh -Iintermediate intermediate/ui.glsl > /dev/null ./shadercompiler intermediate/ui.glsl data/ui.csh -data/monkey.mdl: convmodel intermediate/monkey.glb data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ts.csh data/ui.csh | data +data/monkey.mdl: convmodel intermediate/monkey.glb data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ui.csh | data ./convmodel data intermediate/monkey.glb data/monkey.mdl -data/cube.mdl: convmodel intermediate/cube.glb data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ts.csh data/ui.csh | data +data/cube.mdl: convmodel intermediate/cube.glb data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ui.csh | data ./convmodel data intermediate/cube.glb data/cube.mdl -data/scene.mdl: convmodel intermediate/scene.glb data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ts.csh data/ui.csh | data +data/scene.mdl: convmodel intermediate/scene.glb data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ui.csh | data ./convmodel data intermediate/scene.glb data/scene.mdl data/22.tex: convtexture intermediate/22.bmp | data @@ -152,16 +149,16 @@ data/plastic.mat: convmaterial intermediate/plastic.mat | data data/greybox.mat: convmaterial intermediate/greybox.mat | data ./convmaterial intermediate/greybox.mat data/greybox.mat -pack: packer data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ts.csh data/ui.csh data/monkey.mdl data/cube.mdl data/scene.mdl data/22.tex data/kita.tex data/brick_albedo.tex data/brick_ao.tex data/brick_normal.tex data/sky.tex data/bricks.mat data/plastic.mat data/greybox.mat - ./packer pack data debug.csh mip_spec.csh sky.csh surface.csh surface_depthonly.csh tonemap.csh triangle.csh ts.csh ui.csh monkey.mdl cube.mdl scene.mdl 22.tex kita.tex brick_albedo.tex brick_ao.tex brick_normal.tex sky.tex bricks.mat plastic.mat greybox.mat +pack: packer data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ui.csh data/monkey.mdl data/cube.mdl data/scene.mdl data/22.tex data/kita.tex data/brick_albedo.tex data/brick_ao.tex data/brick_normal.tex data/sky.tex data/bricks.mat data/plastic.mat data/greybox.mat + ./packer pack data debug.csh mip_spec.csh sky.csh surface.csh surface_depthonly.csh tonemap.csh triangle.csh ui.csh monkey.mdl cube.mdl scene.mdl 22.tex kita.tex brick_albedo.tex brick_ao.tex brick_normal.tex sky.tex bricks.mat plastic.mat greybox.mat data: mkdir -p data --include qstd/memory.d qstd/plat.d qstd/str.d qstd/pack.d cfg/cfgparse.d sc/sc.d sc/includer.d app.d asset.d c2.d camera.d debugdraw.d editor.d lighting.d maths.d model.d physics.d pipeline.d renderer.d scene.d ui.d video.d world.d convtexture.d convmodel.d convmaterial.d packer.d data/debug.d data/mip_spec.d data/sky.d data/surface.d data/surface_depthonly.d data/tonemap.d data/triangle.d data/ts.d data/ui.d +-include qstd/memory.d qstd/plat.d qstd/str.d qstd/pack.d cfg/cfgparse.d sc/sc.d sc/includer.d app.d asset.d c2.d camera.d debugdraw.d editor.d lighting.d maths.d model.d physics.d pipeline.d renderer.d scene.d ui.d video.d world.d convtexture.d convmodel.d convmaterial.d packer.d data/debug.d data/mip_spec.d data/sky.d data/surface.d data/surface_depthonly.d data/tonemap.d data/triangle.d data/ui.d clean: - rm -f qstd/memory.o qstd/plat.o qstd/str.o qstd/pack.o cfg/cfgparse.o sc/sc.o sc/includer.o app.o asset.o c2.o camera.o debugdraw.o editor.o lighting.o maths.o model.o physics.o pipeline.o renderer.o scene.o ui.o video.o world.o convtexture.o convmodel.o convmaterial.o packer.o qstd/memory.d qstd/plat.d qstd/str.d qstd/pack.d cfg/cfgparse.d sc/sc.d sc/includer.d app.d asset.d c2.d camera.d debugdraw.d editor.d lighting.d maths.d model.d physics.d pipeline.d renderer.d scene.d ui.d video.d world.d convtexture.d convmodel.d convmaterial.d packer.d data/debug.d data/mip_spec.d data/sky.d data/surface.d data/surface_depthonly.d data/tonemap.d data/triangle.d data/ts.d data/ui.d data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ts.csh data/ui.csh data/monkey.mdl data/cube.mdl data/scene.mdl data/22.tex data/kita.tex data/brick_albedo.tex data/brick_ao.tex data/brick_normal.tex data/sky.tex data/bricks.mat data/plastic.mat data/greybox.mat + rm -f qstd/memory.o qstd/plat.o qstd/str.o qstd/pack.o cfg/cfgparse.o sc/sc.o sc/includer.o app.o asset.o c2.o camera.o debugdraw.o editor.o lighting.o maths.o model.o physics.o pipeline.o renderer.o scene.o ui.o video.o world.o convtexture.o convmodel.o convmaterial.o packer.o qstd/memory.d qstd/plat.d qstd/str.d qstd/pack.d cfg/cfgparse.d sc/sc.d sc/includer.d app.d asset.d c2.d camera.d debugdraw.d editor.d lighting.d maths.d model.d physics.d pipeline.d renderer.d scene.d ui.d video.d world.d convtexture.d convmodel.d convmaterial.d packer.d data/debug.d data/mip_spec.d data/sky.d data/surface.d data/surface_depthonly.d data/tonemap.d data/triangle.d data/ui.d data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ui.csh data/monkey.mdl data/cube.mdl data/scene.mdl data/22.tex data/kita.tex data/brick_albedo.tex data/brick_ao.tex data/brick_normal.tex data/sky.tex data/bricks.mat data/plastic.mat data/greybox.mat rm -f shadercompiler rmdir data rm -f c2 diff --git a/build.ninja b/build.ninja index 8635232..0d15a5e 100644 --- a/build.ninja +++ b/build.ninja @@ -83,12 +83,11 @@ build data/surface.csh: shadercompiler intermediate/surface.glsl | shadercompile build data/surface_depthonly.csh: shadercompiler intermediate/surface_depthonly.glsl | shadercompiler.exe build data/tonemap.csh: shadercompiler intermediate/tonemap.glsl | shadercompiler.exe build data/triangle.csh: shadercompiler intermediate/triangle.glsl | shadercompiler.exe -build data/ts.csh: shadercompiler intermediate/ts.glsl | shadercompiler.exe build data/ui.csh: shadercompiler intermediate/ui.glsl | shadercompiler.exe -build data/monkey.mdl: convmodel intermediate/monkey.glb | convmodel.exe data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ts.csh data/ui.csh -build data/cube.mdl: convmodel intermediate/cube.glb | convmodel.exe data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ts.csh data/ui.csh -build data/scene.mdl: convmodel intermediate/scene.glb | convmodel.exe data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ts.csh data/ui.csh +build data/monkey.mdl: convmodel intermediate/monkey.glb | convmodel.exe data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ui.csh +build data/cube.mdl: convmodel intermediate/cube.glb | convmodel.exe data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ui.csh +build data/scene.mdl: convmodel intermediate/scene.glb | convmodel.exe data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ui.csh build data/bricks.mat: convmaterial intermediate/bricks.mat | convmaterial.exe build data/plastic.mat: convmaterial intermediate/plastic.mat | convmaterial.exe @@ -107,5 +106,5 @@ build data/brick_normal.tex: convtexture intermediate/brick_normal.bmp | convtex build data/sky.tex: convtexture intermediate/sky.hdr | convtexture.exe format = rgba16f -build pack: packer data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ts.csh data/ui.csh data/monkey.mdl data/cube.mdl data/scene.mdl data/bricks.mat data/plastic.mat data/greybox.mat data/22.tex data/kita.tex data/brick_albedo.tex data/brick_ao.tex data/brick_normal.tex data/sky.tex | packer.exe +build pack: packer data/debug.csh data/mip_spec.csh data/sky.csh data/surface.csh data/surface_depthonly.csh data/tonemap.csh data/triangle.csh data/ui.csh data/monkey.mdl data/cube.mdl data/scene.mdl data/bricks.mat data/plastic.mat data/greybox.mat data/22.tex data/kita.tex data/brick_albedo.tex data/brick_ao.tex data/brick_normal.tex data/sky.tex | packer.exe diff --git a/c2.cpp b/c2.cpp index f53d59d..ac9e7d4 100644 --- a/c2.cpp +++ b/c2.cpp @@ -162,6 +162,61 @@ struct Orbit_Cam { } }; +struct Fullscreen_Quad { + Buffer_Id vb; + + void 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 destroy(Device* d) { + d->destroy_buffer(vb); + } + + void 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); + } +}; + struct Sky { Staged_Buffer config; Texture_Id texture; @@ -592,6 +647,7 @@ struct C2 : public App { Lighting lighting; Camera_Id camera; Orbit_Cam orbit_cam; + Fullscreen_Quad quad; Sky sky; Env_Probe eprobe; Tonemap tonemap; @@ -647,6 +703,7 @@ struct C2 : public App { ui_shader = (Shader*)assets.load("ui.csh"); texture = (Texture*)assets.load("22.tex"); texture2 = (Texture*)assets.load("kita.tex"); + quad.init(dev); cbuf = dev->create_buffer( "config buffer", sizeof(Config_Buffer), @@ -658,7 +715,7 @@ struct C2 : public App { per_frame_memory_size ); clamped_linear = create_clamped_linear(dev); - renderer.init(arena, dev, assets); + renderer.init(arena, dev); world = (World*)arena_alloc(arena, sizeof *world); world->init(arena); ui = UI::create(this, &ui_arena); @@ -669,7 +726,7 @@ struct C2 : public App { ui->layout(w, h); fps_label = ui->create_element(ui->root, ""); scene.init(&scene_arena, 32, clamped_linear); - lighting.init(dev, w, h); + lighting.init(dev); sky.init(dev, &assets); eprobe.init(dev, &assets, 256); tonemap.init(dev, &assets); @@ -827,7 +884,7 @@ struct C2 : public App { Render_Pass& tonemap_pass = pb.build_rp(); ctx.debug_push("environment cube"); - eprobe.render(dev, &frame_arena, renderer.quad, sky); + eprobe.render(dev, &frame_arena, quad, sky); ctx.debug_pop(); renderer.env_cubemap = eprobe.get_cubemap(); @@ -836,11 +893,11 @@ struct C2 : public App { Texture& bb = dev->get_texture(hdr_target); pcam.asp = (float)bb.w / (float)bb.h; - renderer.prev_vp = pcam.get_proj() * pcam.get_view(); orbit_cam.update_orbit(*this); pcam.update(); lighting.update(dev, ctx, *world, renderer, scene); update_scene(scene, dev, *world); + lr.add_box(scene.bound); ctx.debug_push("scene"); renderer.render( dev, @@ -854,7 +911,7 @@ struct C2 : public App { sky.render( dev, &frame_arena, - renderer.quad, + quad, sky_pass, clamped_linear, pcam, @@ -868,7 +925,7 @@ struct C2 : public App { tonemap.render( dev, &frame_arena, - renderer.quad, + quad, tonemap_pass, hdr_target, clamped_linear @@ -902,7 +959,7 @@ struct C2 : public App { clamped_linear ); Pipeline& ui_pip = pb.build(); - renderer.quad.render( + quad.render( ctx, ui_pip, ui_pass, @@ -944,6 +1001,7 @@ struct C2 : public App { } void on_destroy() override { + quad.destroy(dev); scene.destroy(dev); sky.destroy(dev); lighting.destroy(dev, renderer); @@ -972,7 +1030,6 @@ struct C2 : public App { dev->destroy_buffer(ui_buffer); make_hdr_target(); make_ui_texture(); - lighting.recreate(dev, w, h); } void make_hdr_target() { diff --git a/configure.lua b/configure.lua index d944308..9bfe342 100644 --- a/configure.lua +++ b/configure.lua @@ -50,7 +50,6 @@ config = { "surface_depthonly", "tonemap", "triangle", - "ts", "ui", }, materials = { diff --git a/intermediate/forward.h b/intermediate/forward.h index 156a185..7c4c9d3 100644 --- a/intermediate/forward.h +++ b/intermediate/forward.h @@ -22,9 +22,6 @@ name: Caster [variable] name: projection type: mat4 -[variable] -name: jittered -type: mat4 [struct] name: Globals @@ -44,7 +41,4 @@ type: Globals stage: fragment #endif - -#define max_casters 16 - #endif diff --git a/intermediate/surface.glsl b/intermediate/surface.glsl index 82bf2f6..71a4307 100644 --- a/intermediate/surface.glsl +++ b/intermediate/surface.glsl @@ -29,9 +29,6 @@ type: vec2 name: uv type: vec2 [interpolator] -name: screen -type: vec4 -[interpolator] name: position type: vec4 [interpolator] @@ -117,7 +114,7 @@ dimension: cube [texture] name: shadowmaps stage: fragment -dimension: array +dimension: shadowArray [target] name: colour @@ -136,9 +133,7 @@ void main() { interpolator.uv = uv; interpolator.position = pos; interpolator.tbn = mat3(t, b, n); - pos = c_vp.view_projection * pos; - interpolator.screen = pos; - gl_Position = pos; + gl_Position = c_vp.view_projection * pos; } #endif @@ -175,10 +170,54 @@ float specular_brdf(vec2 uv, vec3 ref, vec3 l, vec3 v, vec3 n) { return (D * F * G) / (4.0 * ndl * ndv + 0.001); } +vec2 poissonDisk[16] = vec2[]( + vec2(-0.94201624, -0.39906216), + vec2(0.94558609, -0.76890725), + vec2(-0.094184101, -0.92938870), + vec2(0.34495938, 0.29387760), + vec2(-0.91588581, 0.45771432), + vec2(-0.81544232, -0.87912464), + vec2(-0.38277543, 0.27676845), + vec2(0.97484398, 0.75648379), + vec2(0.44323325, -0.97511554), + vec2(0.53742981, -0.47373420), + vec2(-0.26496911, -0.41893023), + vec2(0.79197514, 0.19090188), + vec2(-0.24188840, 0.99706507), + vec2(-0.81409955, 0.91437590), + vec2(0.19984126, 0.78641367), + vec2(0.14383161, -0.14100790) +); + +float random(vec3 seed, int i){ + vec4 seed4 = vec4(seed,i); + float dot_product = dot(seed4, vec4(12.9898,78.233,45.164,94.673)); + return fract(sin(dot_product) * 43758.5453); +} + +float get_shadow(Light l, vec3 wpos) { + const int taps = 4; + const float w = 1.0 / float(taps); + const float m = 1.0 / 1000.0; + int i; + float d = 0.0f; + Caster caster = casters[l.caster_id]; + vec4 surf = caster.projection * vec4(wpos, 1.0); + surf /= surf.w; + surf.xy = surf.xy * 0.5 + 0.5; + surf.z -= 0.005; + for (i = 0; i < taps; i++) { + int index = int(16.0 * random(floor(wpos.xyz * 1000.0), i)) % 16; + vec2 coord = surf.xy + poissonDisk[index] * m; + vec4 vec = vec4(coord, float(l.caster_id), surf.z); + d += texture(shadowmaps, vec).r * w; + } + return d; +} + void main() { int i; vec2 uv = interpolator.uv; - vec2 suv = (interpolator.screen.xy / interpolator.screen.w) * 0.5 + 0.5; vec3 p = interpolator.position.xyz; vec3 nrmsample = texture(normal, uv).rgb; @@ -212,7 +251,9 @@ void main() { spec_col * specular_brdf(uv, ref, light_dir, view_dir, nrm) * cos_theta_i; - float shadow = texture(shadowmaps, vec3(suv, float(l.caster_id))).r; + float shadow = 1.0f; + if (l.caster_id >= 0) + shadow = get_shadow(l, p); light += (diffuse + spec) * l.brightness * l.colour * shadow; } diff --git a/intermediate/ts.glsl b/intermediate/ts.glsl deleted file mode 100644 index d80d6e4..0000000 --- a/intermediate/ts.glsl +++ /dev/null @@ -1,179 +0,0 @@ -#ifdef DESC -[program] -type: graphics -vertex: main -fragment: main -#endif - -#include "forward.h" - -#ifdef DESC - -[binding] -name: verts -rate: vertex -[attribute] -name: position -type: vec2 -[attribute] -name: uv -type: vec2 - -[interpolator] -name: uv -type: vec2 - -[texture] -name: shadowmaps -stage: fragment -dimension: shadowArray -[texture] -name: previous -stage: fragment -dimension: 2 -[texture] -name: depthmap -stage: fragment -dimension: 2 -[texture] -name: prev_occlusion -stage: fragment -dimension: 2 - -[struct] -name: Config -[variable] -name: inv_view -type: mat4 -[variable] -name: inv_proj -type: mat4 -[variable] -name: prev_vp -type: mat4 - -[struct] -name: Caster_Config -[variable] -name: index -type: int - -[cbuffer] -name: config -type: Config -stage: fragment - -[cbuffer] -name: caster_config -type: Caster_Config -stage: fragment - -[sbuffer] -name: casters -type: Caster -stage: fragment - -[target] -name: shadow_amount -type: float -[target] -name: occlusion -type: float - -#endif - -#ifdef VERTEX_SHADER -void main() { - interpolator.uv = uv; - gl_Position = vec4(position, 1.0, 1.0); -} -#endif - -#ifdef FRAGMENT_SHADER - -vec2 poissonDisk[16] = vec2[]( - vec2(-0.94201624, -0.39906216), - vec2(0.94558609, -0.76890725), - vec2(-0.094184101, -0.92938870), - vec2(0.34495938, 0.29387760), - vec2(-0.91588581, 0.45771432), - vec2(-0.81544232, -0.87912464), - vec2(-0.38277543, 0.27676845), - vec2(0.97484398, 0.75648379), - vec2(0.44323325, -0.97511554), - vec2(0.53742981, -0.47373420), - vec2(-0.26496911, -0.41893023), - vec2(0.79197514, 0.19090188), - vec2(-0.24188840, 0.99706507), - vec2(-0.81409955, 0.91437590), - vec2(0.19984126, 0.78641367), - vec2(0.14383161, -0.14100790) -); - -float random(vec3 seed, int i) { - vec4 seed4 = vec4(seed, i); - float dot_product = dot(seed4, vec4(12.9898,78.233,45.164,94.673)); - return fract(sin(dot_product) * 43758.5453); -} - -float get_shadow(int id, mat4 proj, vec3 wpos) { - const int taps = 4; - const float w = 1.0 / float(taps); - const float m = 1.0 / 1000.0; - int i; - float d = 0.0f; - vec4 surf = proj * vec4(wpos, 1.0); - surf /= surf.w; - surf.xy = surf.xy * 0.5 + 0.5; - surf.z -= 0.005; - for (i = 0; i < taps; i++) { - float r = random(floor(wpos.xyz * 1000.0), i + globals.frame); - int index = int(16.0 * r) % 16; - vec2 coord = surf.xy + poissonDisk[index] * m; - vec4 vec = vec4(coord, float(id), surf.z); - d += texture(shadowmaps, vec).r * w; - } - return d; -} - -vec4 get_world_pos(float depth, vec2 uv) { - float z = depth; - vec4 clip = vec4(uv * 2.0 - 1.0, z, 1.0); - vec4 view = config.inv_proj * clip; - view /= view.w; - return config.inv_view * view; -} - -void main() { - float w_prev = 0.99; - float w_cur = 0.01; - Caster caster = casters[caster_config.index]; - vec2 uv = interpolator.uv; - float d = texture(depthmap, uv).r; - float o = texture(prev_occlusion, uv).r; - vec4 wpos = get_world_pos(d, uv); - vec4 prev_pos = config.prev_vp * vec4(wpos.xyz, 1.0); - vec2 prev_uv = (prev_pos.xy / prev_pos.w) * 0.5 + 0.5; - float prev = texture(previous, prev_uv).r; - float base = get_shadow( - caster_config.index, - caster.projection, - wpos.xyz - ); - float jittered = get_shadow( - caster_config.index + max_casters, - caster.jittered, - wpos.xyz - ); - if ( - prev_uv.x < 0.0 || prev_uv.x > 1.0 || - prev_uv.y < 0.0 || prev_uv.y > 1.0 || - abs(d - o) > 0.001 - ) { - shadow_amount = base; - } else { - shadow_amount = prev * w_prev + jittered * w_cur; - } - occlusion = d; -} -#endif diff --git a/lighting.cpp b/lighting.cpp index 9f154cb..0e41ddd 100644 --- a/lighting.cpp +++ b/lighting.cpp @@ -8,8 +8,6 @@ extern "C" { #include "plat.h" } -#include - /* needs to match surface shader */ struct GPU_Light { v3f dir; @@ -20,19 +18,18 @@ struct GPU_Light { struct GPU_Caster { m4f projection; - m4f jittered; }; -void Lighting::init(Device* dev, int w, int h) { +void Lighting::init(Device* dev) { int i; Sampler_State ss{}; - gpu_lights.init( + lights.init( dev, "Light buffer", max_lights * sizeof(GPU_Light), Buffer_Flags::storage_buffer ); - gpu_casters.init( + casters.init( dev, "Caster buffer", max_shadows * sizeof(GPU_Caster), @@ -46,14 +43,10 @@ void Lighting::init(Device* dev, int w, int h) { shadow_res, 1, 1, - shadowmap_count, + max_shadows, 0 ); - zero(ss_shadows, sizeof ss_shadows); - zero(ss_shadow_slices, sizeof ss_shadow_slices); - zero(occlusion, sizeof occlusion); - recreate(dev, w, h); - for (i = 0; i < shadowmap_count; i++) { + for (i = 0; i < max_shadows; i++) { cameras[i] = 0; shadow_slices[i] = dev->alias_texture( shadows, @@ -84,81 +77,14 @@ void Lighting::init(Device* dev, int w, int h) { void Lighting::destroy(Device* dev, Renderer& r) { int i; - gpu_lights.destroy(dev); - gpu_casters.destroy(dev); + lights.destroy(dev); + casters.destroy(dev); dev->destroy_sampler(shadow_sampler); - for (i = 0; i < shadowmap_count; i++) { + for (i = 0; i < max_shadows; i++) { dev->destroy_texture(shadow_slices[i]); r.destroy_camera(cameras[i]); } dev->destroy_texture(shadows); - destroy_ss(dev); -} - -void Lighting::destroy_ss(Device* dev) { - int i, j; - for (i = 0; i < 2; i++) { - for (j = 0; j < max_shadows; j++) - if (ss_shadow_slices[i][j]) - dev->destroy_texture(ss_shadow_slices[i][j]); - if (ss_shadows[i]) - dev->destroy_texture(ss_shadows[i]); - if (occlusion[i]) - dev->destroy_texture(occlusion[i]); - } -} - -void Lighting::recreate(Device* dev, int w, int h) { - int i, j; - destroy_ss(dev); - for (i = 0; i < 2; i++) { - ss_shadows[i] = dev->create_texture( - "Shadow accumulation buffer", - texture_format_r16f, - Texture_Flags::sampleable | Texture_Flags::colour_target, - w, - h, - 1, - 1, - max_shadows, - 0 - ); - for (j = 0; j < max_shadows; j++) - ss_shadow_slices[i][j] = dev->alias_texture( - ss_shadows[i], - "Shadow accumulation buffer slice", - texture_format_r16f, - Texture_Flags::colour_target, - w, - h, - 1, - 1, - 1, - 0, - j - ); - occlusion[i] = dev->create_texture( - "Occlusion buffer", - texture_format_r32f, - Texture_Flags::sampleable | Texture_Flags::colour_target, - w, - h, - 1, - 1, - 1, - 0 - ); - } -} - -Camera_Id Lighting::gm_cam(Renderer& r) { - int id = cam_count++; - Camera_Id cid = cameras[id]; - if (!cid) { - cid = r.create_camera(); - cameras[id] = cid; - } - return cid; } void Lighting::write_bufs( @@ -171,10 +97,6 @@ void Lighting::write_bufs( GPU_Light* ldst = (GPU_Light*)lptr; GPU_Caster* cdst = (GPU_Caster*)cptr; int count = 0, ccount = 0; - cam_count = 0; - std::random_device dev; - std::mt19937 rng(dev()); - std::uniform_real_distribution dist6(-0.01f, 0.01f); for (auto v : w.view()) { GPU_Light gl; Sun_Light& l = v.get(); @@ -186,22 +108,15 @@ void Lighting::write_bufs( gl.colour = l.colour; gl.dir = l.dir; if (l.caster && ccount < max_shadows) { - Camera* cam[2]; int cid = ccount++; - Caster& caster = casters[cid]; - GPU_Caster& gc = cdst[cid]; - v3f jitter( - dist6(rng), - dist6(rng), - dist6(rng) - ); - caster = Caster { gm_cam(r), gm_cam(r) }; - cam[0] = &r.get_camera(caster.reality); - cam[1] = &r.get_camera(caster.jittered); - cam[0]->init_shadow(l.dir, s.bound.min, s.bound.max); - cam[1]->init_shadow(l.dir + jitter, s.bound.min, s.bound.max); - gc.projection = cam[0]->get_proj() * cam[0]->get_view(); - gc.jittered = cam[1]->get_proj() * cam[1]->get_view(); + GPU_Caster& c = cdst[cid]; + Camera_Id camid = cameras[cid]; + if (!camid) + camid = r.create_camera(); + Camera& cam = r.get_camera(camid); + cam.init_shadow(l.dir, s.bound.min, s.bound.max); + c.projection = cam.get_proj() * cam.get_view(); + cameras[cid] = camid; gl.caster_id = cid; } else gl.caster_id = -1; @@ -219,10 +134,10 @@ void Lighting::update( Model_Scene& s ) { light_count = 0; - write_bufs(gpu_lights.map(dev), gpu_casters.map(dev), w, r, s); - gpu_casters.unmap(dev); - gpu_lights.unmap(dev); - gpu_lights.update(ctx); - gpu_casters.update(ctx); + write_bufs(lights.map(dev), casters.map(dev), w, r, s); + casters.unmap(dev); + lights.unmap(dev); + lights.update(ctx); + casters.update(ctx); } diff --git a/lighting.hpp b/lighting.hpp index ac2d2c5..ccd08d3 100644 --- a/lighting.hpp +++ b/lighting.hpp @@ -11,32 +11,19 @@ struct Model_Scene; struct Renderer; struct World; -struct Caster { - Camera_Id reality; - Camera_Id jittered; -}; - struct Lighting { static constexpr int max_lights = 128; static constexpr int max_shadows = 16; - static constexpr int shadowmap_count = max_shadows * 2; static constexpr int shadow_res = 2048; - Staged_Buffer gpu_lights; - Staged_Buffer gpu_casters; + Staged_Buffer lights; + Staged_Buffer casters; Texture_Id shadows; - Texture_Id shadow_slices[shadowmap_count]; - Texture_Id ss_shadows[2]; - Texture_Id ss_shadow_slices[2][shadowmap_count]; - Texture_Id occlusion[2]; + Texture_Id shadow_slices[max_shadows]; Sampler_Id shadow_sampler; - Caster casters[max_shadows]; - Camera_Id cameras[shadowmap_count]; - int light_count, caster_count, cam_count; - void init(Device* dev, int w, int h); - void destroy_ss(Device* dev); - void recreate(Device* dev, int w, int h); + Camera_Id cameras[max_shadows]; + int light_count, caster_count; + void init(Device* dev); void destroy(Device* dev, Renderer& r); - Camera_Id gm_cam(Renderer& r); void update( Device* dev, Context& ctx, diff --git a/model.cpp b/model.cpp index aa65898..f24c0eb 100644 --- a/model.cpp +++ b/model.cpp @@ -386,9 +386,9 @@ void Model_Instance::render( } else { pb.depth(true, false, Depth_Mode::equal); pb.shader(mesh.shader); - pb.sbuffer(mesh.light_binding, lighting->gpu_lights.gpuonly); - pb.sbuffer(mesh.casters_binding, lighting->gpu_casters.gpuonly); - pb.texture(mesh.shadowmaps_binding, res.shadows, res.sampler); + pb.sbuffer(mesh.light_binding, lighting->lights.gpuonly); + pb.sbuffer(mesh.casters_binding, lighting->casters.gpuonly); + pb.texture(mesh.shadowmaps_binding, lighting->shadows, lighting->shadow_sampler); mesh.material->use(pb, res.sampler, dev->get_shader(mesh.shader)); pb.cbuffer( mesh.mat_binding, diff --git a/model.hpp b/model.hpp index 022ec27..7417e51 100644 --- a/model.hpp +++ b/model.hpp @@ -97,7 +97,6 @@ struct Material_Loader : public Asset_Loader { struct Model_Resources { Texture_Id env_cubemap; - Texture_Id shadows; Sampler_Id sampler; Buffer_Id vp; Buffer_Id globals; 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 - 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 = [&](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); -} diff --git a/renderer.hpp b/renderer.hpp index 20c7f98..c49c804 100644 --- a/renderer.hpp +++ b/renderer.hpp @@ -10,11 +10,8 @@ enum { FORWARD, SHADOW_MAP_START, SHADOW_MAP_END = SHADOW_MAP_START + Lighting::max_shadows, - SHADOW_JIT_START = SHADOW_MAP_END, - SHADOW_JIT_END = SHADOW_JIT_START + Lighting::max_shadows, - drawlist_count = SHADOW_JIT_END }; + drawlist_count = SHADOW_MAP_END }; -struct Asset_Arena; struct Model_Instance; struct Renderer; @@ -35,62 +32,26 @@ struct Drawlist { ); }; -struct Fullscreen_Quad { - Buffer_Id vb; - - void init(Device* d); - void destroy(Device* d); - void render( - Context& ctx, - Pipeline& pip, - Render_Pass& pass, - int bind - ); -}; - struct Renderer { static constexpr int max_cameras = 16; Hash_Map cameras; Drawlist drawlists[drawlist_count]; Staged_Buffer globals; - Fullscreen_Quad quad; int camera_count; int frame; - Shader* ts_shader; - int ts_shadowmap_binding; - int ts_depthmap_binding; - int ts_prev_binding; - int ts_vert_binding; - int ts_config_binding; - int ts_caster_config_binding; - int ts_casters_binding; - int ts_globals_binding; - int ts_prev_occlusion_binding; - Sampler_Id ts_sampler; - Staged_Buffer ts_config, ts_config2; - - m4f prev_vp; - Sampler_Id clamped_linear; Texture_Id env_cubemap; - void init(Arena* arena, Device* d, Asset_Arena& assets); + void init(Arena* arena, Device* d); void destroy(Device* d); void set_camera(Camera_Id cam, int drawlist); - void make_ts_sampler(Device* d); void render( Device* dev, Arena* a, Texture_Id hdr_target, const Lighting* l ); - void temporal_shadows( - Device* dev, - Context& ctx, - const Lighting* l, - Pipeline_Builder& pb - ); void add_model(int drawlist, Model_Instance* m); void rem_model(int drawlist, Model_Instance* m); diff --git a/sc/sc.cpp b/sc/sc.cpp index 1f7ccba..9232e10 100644 --- a/sc/sc.cpp +++ b/sc/sc.cpp @@ -601,7 +601,7 @@ struct Desc { size_t i, l = trgts.size(); for (i = 0; i < l; i++) { auto& attr = trgts[i]; - ss << "layout (location = " << i << ") out "; + ss << "layout (location = 0) out "; ss << attr.tname << " "; ss << attr.name << ";\n"; } diff --git a/src/guy.blend b/src/guy.blend deleted file mode 100644 index a3b14ce..0000000 Binary files a/src/guy.blend and /dev/null differ diff --git a/video.cpp b/video.cpp index 3e960be..fa98813 100644 --- a/video.cpp +++ b/video.cpp @@ -1386,7 +1386,7 @@ void Device_Vk::create_depth(int w, int h) { destroy_texture(depth); depth = create_texture( "default depth", - texture_format_d32, + texture_format_d24s8, Texture_Flags::sampleable | Texture_Flags::depth_stencil_target, w, h, @@ -1628,8 +1628,8 @@ void Renderpass_Vk::init( const Rpo_Key& rpk ) { VkRenderPassCreateInfo ri{}; - VkAttachmentDescription ads[max_colour_attachments + 1]; - VkAttachmentReference cars[max_colour_attachments], dar; + VkAttachmentDescription ads[2]; + VkAttachmentReference car, dar; VkSubpassDescription sd{}; VkResult r; auto& rp = rpk.rpo; @@ -1637,12 +1637,10 @@ void Renderpass_Vk::init( bool has_depth = rp.depth.id; int count = 0, i, c = rp.colour_count; zero(ads, sizeof ads); - zero(cars, sizeof cars); for (i = 0; i < c; i++) { int index = count++; auto& colour = rp.colours[i]; auto& ad = ads[index]; - auto& car = cars[index]; ad.format = get_vk_format(colour.fmt); ad.samples = VK_SAMPLE_COUNT_1_BIT; ad.loadOp = load_op_from_mode(colour.mode); @@ -1679,7 +1677,7 @@ void Renderpass_Vk::init( sd.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; sd.colorAttachmentCount = rp.colour_count; - sd.pColorAttachments = cars; + sd.pColorAttachments = &car; sd.pDepthStencilAttachment = has_depth? &dar: 0; ri.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; @@ -1706,7 +1704,7 @@ void Framebuffer_Vk::init( ) { bool has_depth = rp.depth.id; int i, count = 0; - VkImageView atts[max_colour_attachments + 1]; + VkImageView atts[2]; VkResult r; VkFramebufferCreateInfo fbi{}; for (i = 0; i < rp.colour_count; i++) { @@ -2882,11 +2880,12 @@ void Pipeline_Vk::init_blending( zero(&bi, sizeof bi); if (rp.colour_count) { int i, c = rp.colour_count; - abs = (VkPipelineColorBlendAttachmentState*)arena_alloc( + abs = + (VkPipelineColorBlendAttachmentState*)arena_alloc( &scope, - sizeof *abs * c + sizeof abs * c ); - zero(abs, sizeof *abs * c); + zero(abs, sizeof *abs); for (i = 0; i < c; i++) { auto& ab = abs[i]; ab.colorWriteMask = diff --git a/video.hpp b/video.hpp index 4289685..5aa25bc 100644 --- a/video.hpp +++ b/video.hpp @@ -553,7 +553,6 @@ struct Context { void submit(const Render_Pass& rp); void copy(Buffer_Id dst, Buffer_Id src); void copy(Texture_Id dst, Buffer_Id src); - void copy(Texture_Id dst, Texture_Id src); void transition(Texture_Id id, Resource_State state); void debug_push(const char* name); void debug_pop(); -- cgit v1.2.3-54-g00ecf