Overlay-Next: Move wireframe depth buffer copy before rendering

This avoid renderpass splitting and make overlay follow
the overlay interface.

Also fix the infront wireframe not copying the correct depth
buffer.
This commit is contained in:
Clément Foucault
2024-11-26 21:14:20 +01:00
parent ebcc3dbc41
commit badedb204a
2 changed files with 24 additions and 16 deletions

View File

@@ -454,7 +454,7 @@ void Instance::draw_v3d(Manager &manager, View &view)
auto draw_line = [&](OverlayLayer &layer, Framebuffer &framebuffer) {
layer.bounds.draw_line(framebuffer, manager, view);
layer.wireframe.draw_line_ex(framebuffer, resources, manager, view);
layer.wireframe.draw_line(framebuffer, manager, view);
layer.cameras.draw_line(framebuffer, manager, view);
layer.empties.draw_line(framebuffer, manager, view);
layer.axes.draw_line(framebuffer, manager, view);
@@ -516,6 +516,12 @@ void Instance::draw_v3d(Manager &manager, View &view)
infront.prepass.draw_line(resources.overlay_line_in_front_fb, manager, view);
}
{
/* Copy depth at the end of the prepass to avoid splitting the main render pass. */
/* TODO(fclem): Better get rid of it. */
regular.wireframe.copy_depth(resources.depth_target_tx);
infront.wireframe.copy_depth(resources.depth_target_in_front_tx);
}
{
/* Line only pass. */
outline.draw_line_only_ex(resources.overlay_line_only_fb, resources, manager, view);

View File

@@ -229,29 +229,31 @@ class Wireframe : Overlay {
manager.generate_commands(wireframe_ps_, view);
}
/* TODO(fclem): Remove dependency on Resources. */
void draw_line_ex(Framebuffer &framebuffer, Resources &res, Manager &manager, View &view)
void copy_depth(TextureRef &depth_tx)
{
if (!enabled_ || !do_depth_copy_workaround_) {
return;
}
eGPUTextureUsage usage = GPU_TEXTURE_USAGE_SHADER_READ | GPU_TEXTURE_USAGE_ATTACHMENT;
int2 render_size = int2(depth_tx.size());
tmp_depth_tx_.acquire(render_size, GPU_DEPTH24_STENCIL8, usage);
/* WORKAROUND: Nasty framebuffer copy.
* We should find a way to have nice wireframe without this. */
GPU_texture_copy(tmp_depth_tx_, depth_tx);
}
void draw_line(Framebuffer &framebuffer, Manager &manager, View &view) final
{
if (!enabled_) {
return;
}
if (do_depth_copy_workaround_) {
eGPUTextureUsage usage = GPU_TEXTURE_USAGE_SHADER_READ | GPU_TEXTURE_USAGE_ATTACHMENT;
int2 render_size = int2(res.depth_tx.size());
tmp_depth_tx_.acquire(render_size, GPU_DEPTH24_STENCIL8, usage);
/* WORKAROUND: Nasty framebuffer copy.
* We should find a way to have nice wireframe without this. */
GPU_texture_copy(tmp_depth_tx_, res.depth_tx);
}
GPU_framebuffer_bind(framebuffer);
manager.submit_only(wireframe_ps_, view);
if (do_depth_copy_workaround_) {
tmp_depth_tx_.release();
}
tmp_depth_tx_.release();
}
private: