mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-04-28 13:28:01 +03:00
rsx/overlays: Support disabling vertex-snap on a per-draw-call basis
This commit is contained in:
parent
af6db7d895
commit
dc8652806e
7 changed files with 65 additions and 12 deletions
|
@ -432,6 +432,11 @@ namespace gl
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rsx::overlays::vertex_options vert_opts;
|
||||||
|
program_handle.uniforms["vertex_config"] = vert_opts
|
||||||
|
.disable_vertex_snap(cmd.config.disable_vertex_snap)
|
||||||
|
.get();
|
||||||
|
|
||||||
rsx::overlays::fragment_options draw_opts;
|
rsx::overlays::fragment_options draw_opts;
|
||||||
program_handle.uniforms["fragment_config"] = draw_opts
|
program_handle.uniforms["fragment_config"] = draw_opts
|
||||||
.texture_mode(texture_mode)
|
.texture_mode(texture_mode)
|
||||||
|
|
|
@ -960,6 +960,7 @@ namespace rsx
|
||||||
{
|
{
|
||||||
auto& config = draw_cmd.config;
|
auto& config = draw_cmd.config;
|
||||||
config.color = back_color;
|
config.color = back_color;
|
||||||
|
config.disable_vertex_snap = true;
|
||||||
config.pulse_glow = pulse_effect_enabled;
|
config.pulse_glow = pulse_effect_enabled;
|
||||||
config.pulse_sinus_offset = pulse_sinus_offset;
|
config.pulse_sinus_offset = pulse_sinus_offset;
|
||||||
config.pulse_speed_modifier = pulse_speed_modifier;
|
config.pulse_speed_modifier = pulse_speed_modifier;
|
||||||
|
|
|
@ -83,6 +83,7 @@ namespace rsx
|
||||||
|
|
||||||
color4f color = { 1.f, 1.f, 1.f, 1.f };
|
color4f color = { 1.f, 1.f, 1.f, 1.f };
|
||||||
bool pulse_glow = false;
|
bool pulse_glow = false;
|
||||||
|
bool disable_vertex_snap = false;
|
||||||
f32 pulse_sinus_offset = 0.0f; // The current pulse offset
|
f32 pulse_sinus_offset = 0.0f; // The current pulse offset
|
||||||
f32 pulse_speed_modifier = 0.005f;
|
f32 pulse_speed_modifier = 0.005f;
|
||||||
|
|
||||||
|
|
|
@ -20,14 +20,28 @@ layout(%push_block) uniform Configuration
|
||||||
vec4 albedo;
|
vec4 albedo;
|
||||||
vec4 viewport;
|
vec4 viewport;
|
||||||
vec4 clip_bounds;
|
vec4 clip_bounds;
|
||||||
|
uint vertex_config;
|
||||||
};
|
};
|
||||||
#else
|
#else
|
||||||
uniform vec4 ui_scale;
|
uniform vec4 ui_scale;
|
||||||
uniform vec4 albedo;
|
uniform vec4 albedo;
|
||||||
uniform vec4 viewport;
|
uniform vec4 viewport;
|
||||||
uniform vec4 clip_bounds;
|
uniform vec4 clip_bounds;
|
||||||
|
uniform uint vertex_config;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
struct config_t
|
||||||
|
{
|
||||||
|
bool no_vertex_snap;
|
||||||
|
};
|
||||||
|
|
||||||
|
config_t unpack_vertex_options()
|
||||||
|
{
|
||||||
|
config_t result;
|
||||||
|
result.no_vertex_snap = bitfieldExtract(vertex_config, 0, 1) != 0;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
vec2 snap_to_grid(const in vec2 normalized)
|
vec2 snap_to_grid(const in vec2 normalized)
|
||||||
{
|
{
|
||||||
return floor(fma(normalized, viewport.xy, vec2(0.5))) / viewport.xy;
|
return floor(fma(normalized, viewport.xy, vec2(0.5))) / viewport.xy;
|
||||||
|
@ -53,8 +67,15 @@ void main()
|
||||||
tc0.xy = in_pos.zw;
|
tc0.xy = in_pos.zw;
|
||||||
color = albedo;
|
color = albedo;
|
||||||
clip_rect = ndc_to_window(clip_to_ndc(clip_bounds));
|
clip_rect = ndc_to_window(clip_to_ndc(clip_bounds));
|
||||||
|
|
||||||
vec4 pos = vec4(clip_to_ndc(in_pos).xy, 0.5, 1.);
|
vec4 pos = vec4(clip_to_ndc(in_pos).xy, 0.5, 1.);
|
||||||
pos.xy = snap_to_grid(pos.xy);
|
config_t config = unpack_vertex_options();
|
||||||
|
|
||||||
|
if (!config.no_vertex_snap)
|
||||||
|
{
|
||||||
|
pos.xy = snap_to_grid(pos.xy);
|
||||||
|
}
|
||||||
|
|
||||||
gl_Position = (pos + pos) - 1.;
|
gl_Position = (pos + pos) - 1.;
|
||||||
}
|
}
|
||||||
)"
|
)"
|
||||||
|
|
|
@ -56,5 +56,22 @@ namespace rsx
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class vertex_options
|
||||||
|
{
|
||||||
|
u32 value = 0;
|
||||||
|
|
||||||
|
public:
|
||||||
|
vertex_options& disable_vertex_snap(bool enable)
|
||||||
|
{
|
||||||
|
value = enable ? 1 : 0;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 get() const
|
||||||
|
{
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -370,7 +370,7 @@ namespace vk
|
||||||
fs_src = fmt::replace_all(fs_src,
|
fs_src = fmt::replace_all(fs_src,
|
||||||
{
|
{
|
||||||
{ "%preprocessor", "// %preprocessor" },
|
{ "%preprocessor", "// %preprocessor" },
|
||||||
{ "%push_block_offset", "layout(offset=64)" },
|
{ "%push_block_offset", "layout(offset=68)" },
|
||||||
{ "%push_block", "push_constant" }
|
{ "%push_block", "push_constant" }
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -542,12 +542,12 @@ namespace vk
|
||||||
{
|
{
|
||||||
.stageFlags = VK_SHADER_STAGE_VERTEX_BIT,
|
.stageFlags = VK_SHADER_STAGE_VERTEX_BIT,
|
||||||
.offset = 0,
|
.offset = 0,
|
||||||
.size = 64
|
.size = 68
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT,
|
.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT,
|
||||||
.offset = 64,
|
.offset = 68,
|
||||||
.size = 16
|
.size = 12
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -559,9 +559,10 @@ namespace vk
|
||||||
// 16: vec4 albedo;
|
// 16: vec4 albedo;
|
||||||
// 32: vec4 viewport;
|
// 32: vec4 viewport;
|
||||||
// 48: vec4 clip_bounds;
|
// 48: vec4 clip_bounds;
|
||||||
// 64: uint fragment_config;
|
// 64: uint vertex_config;
|
||||||
// 68: float timestamp;
|
// 68: uint fragment_config;
|
||||||
// 72: float blur_intensity;
|
// 72: float timestamp;
|
||||||
|
// 76: float blur_intensity;
|
||||||
|
|
||||||
f32 push_buf[32];
|
f32 push_buf[32];
|
||||||
// 1. Vertex config (00 - 63)
|
// 1. Vertex config (00 - 63)
|
||||||
|
@ -578,6 +579,12 @@ namespace vk
|
||||||
push_buf[14] = m_clip_region.x2;
|
push_buf[14] = m_clip_region.x2;
|
||||||
push_buf[15] = m_clip_region.y2;
|
push_buf[15] = m_clip_region.y2;
|
||||||
|
|
||||||
|
rsx::overlays::vertex_options vert_opts;
|
||||||
|
const auto vert_config = vert_opts
|
||||||
|
.disable_vertex_snap(m_disable_vertex_snap)
|
||||||
|
.get();
|
||||||
|
push_buf[16] = std::bit_cast<f32>(vert_config);
|
||||||
|
|
||||||
// 2. Fragment stuff
|
// 2. Fragment stuff
|
||||||
rsx::overlays::fragment_options frag_opts;
|
rsx::overlays::fragment_options frag_opts;
|
||||||
const auto frag_config = frag_opts
|
const auto frag_config = frag_opts
|
||||||
|
@ -586,10 +593,9 @@ namespace vk
|
||||||
.pulse_glow(m_pulse_glow)
|
.pulse_glow(m_pulse_glow)
|
||||||
.get();
|
.get();
|
||||||
|
|
||||||
std::memcpy(push_buf + 16, &frag_config, 4);
|
push_buf[17] = std::bit_cast<f32>(frag_config);
|
||||||
//push_buf[16] = std::bit_cast<f32>(frag_config);
|
push_buf[18] = m_time;
|
||||||
push_buf[17] = m_time;
|
push_buf[19] = m_blur_strength;
|
||||||
push_buf[18] = m_blur_strength;
|
|
||||||
|
|
||||||
vkCmdPushConstants(cmd, m_pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 80, push_buf);
|
vkCmdPushConstants(cmd, m_pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 80, push_buf);
|
||||||
}
|
}
|
||||||
|
@ -670,6 +676,7 @@ namespace vk
|
||||||
m_blur_strength = static_cast<f32>(command.config.blur_strength) * 0.01f;
|
m_blur_strength = static_cast<f32>(command.config.blur_strength) * 0.01f;
|
||||||
m_clip_enabled = command.config.clip_region;
|
m_clip_enabled = command.config.clip_region;
|
||||||
m_clip_region = command.config.clip_rect;
|
m_clip_region = command.config.clip_rect;
|
||||||
|
m_disable_vertex_snap = command.config.disable_vertex_snap;
|
||||||
|
|
||||||
vk::image_view* src = nullptr;
|
vk::image_view* src = nullptr;
|
||||||
switch (command.config.texture_ref)
|
switch (command.config.texture_ref)
|
||||||
|
|
|
@ -137,6 +137,7 @@ namespace vk
|
||||||
color4f m_color;
|
color4f m_color;
|
||||||
bool m_pulse_glow = false;
|
bool m_pulse_glow = false;
|
||||||
bool m_clip_enabled = false;
|
bool m_clip_enabled = false;
|
||||||
|
bool m_disable_vertex_snap = false;
|
||||||
rsx::overlays::texture_sampling_mode m_texture_type;
|
rsx::overlays::texture_sampling_mode m_texture_type;
|
||||||
areaf m_clip_region;
|
areaf m_clip_region;
|
||||||
coordf m_viewport;
|
coordf m_viewport;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue