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:
@@ -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);
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user