mirror of
https://github.com/RPCSX/rpcsx.git
synced 2025-12-31 13:50:46 +01:00
130 lines
2.6 KiB
C++
130 lines
2.6 KiB
C++
#pragma once
|
|
|
|
#include "GLCompute.h"
|
|
#include "GLOverlays.h"
|
|
|
|
namespace gl
|
|
{
|
|
void resolve_image(gl::command_context& cmd, gl::viewable_image* dst, gl::viewable_image* src);
|
|
void unresolve_image(gl::command_context& cmd, gl::viewable_image* dst, gl::viewable_image* src);
|
|
void clear_resolve_helpers();
|
|
|
|
struct cs_resolve_base : compute_task
|
|
{
|
|
gl::viewable_image* multisampled = nullptr;
|
|
gl::viewable_image* resolve = nullptr;
|
|
bool is_unresolve = false;
|
|
|
|
u32 cs_wave_x = 1;
|
|
u32 cs_wave_y = 1;
|
|
|
|
cs_resolve_base()
|
|
{}
|
|
|
|
virtual ~cs_resolve_base()
|
|
{}
|
|
|
|
void build(const std::string& format_prefix, bool unresolve);
|
|
|
|
void bind_resources() override;
|
|
|
|
void run(gl::command_context& cmd, gl::viewable_image* msaa_image, gl::viewable_image* resolve_image);
|
|
};
|
|
|
|
struct cs_resolve_task : cs_resolve_base
|
|
{
|
|
cs_resolve_task(const std::string& format_prefix)
|
|
{
|
|
build(format_prefix, false);
|
|
}
|
|
};
|
|
|
|
struct cs_unresolve_task : cs_resolve_base
|
|
{
|
|
cs_unresolve_task(const std::string& format_prefix)
|
|
{
|
|
build(format_prefix, true);
|
|
}
|
|
};
|
|
|
|
struct ds_resolve_pass_base : overlay_pass
|
|
{
|
|
gl::viewable_image* multisampled = nullptr;
|
|
gl::viewable_image* resolve = nullptr;
|
|
|
|
struct
|
|
{
|
|
bool resolve_depth = false;
|
|
bool resolve_stencil = false;
|
|
bool is_unresolve = false;
|
|
color2i sample_count;
|
|
} m_config;
|
|
|
|
void build(bool depth, bool stencil, bool unresolve);
|
|
|
|
void update_config();
|
|
|
|
void run(gl::command_context& cmd, gl::viewable_image* msaa_image, gl::viewable_image* resolve_image);
|
|
};
|
|
|
|
struct depth_only_resolver : ds_resolve_pass_base
|
|
{
|
|
depth_only_resolver()
|
|
{
|
|
build(true, false, false);
|
|
}
|
|
};
|
|
|
|
struct depth_only_unresolver : ds_resolve_pass_base
|
|
{
|
|
depth_only_unresolver()
|
|
{
|
|
build(true, false, true);
|
|
}
|
|
};
|
|
|
|
struct stencil_only_resolver_base : ds_resolve_pass_base
|
|
{
|
|
virtual ~stencil_only_resolver_base() = default;
|
|
|
|
void build(bool is_unresolver)
|
|
{
|
|
ds_resolve_pass_base::build(false, true, is_unresolver);
|
|
}
|
|
|
|
void emit_geometry(gl::command_context& cmd) override;
|
|
};
|
|
|
|
struct stencil_only_resolver : stencil_only_resolver_base
|
|
{
|
|
stencil_only_resolver()
|
|
{
|
|
build(false);
|
|
}
|
|
};
|
|
|
|
struct stencil_only_unresolver : stencil_only_resolver_base
|
|
{
|
|
stencil_only_unresolver()
|
|
{
|
|
build(true);
|
|
}
|
|
};
|
|
|
|
struct depth_stencil_resolver : ds_resolve_pass_base
|
|
{
|
|
depth_stencil_resolver()
|
|
{
|
|
build(true, true, false);
|
|
}
|
|
};
|
|
|
|
struct depth_stencil_unresolver : ds_resolve_pass_base
|
|
{
|
|
depth_stencil_unresolver()
|
|
{
|
|
build(true, true, true);
|
|
}
|
|
};
|
|
}
|