rpcsx/rpcs3/Emu/RSX/GL/GLResolveHelper.h

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);
}
};
}