summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/modules')
-rw-r--r--src/osd/modules/render/bgfx/chainentry.cpp11
-rw-r--r--src/osd/modules/render/bgfx/chainentry.h1
-rw-r--r--src/osd/modules/render/bgfx/shaders/fs_deconverge.sc11
-rw-r--r--src/osd/modules/render/bgfx/shaders/fs_defocus.sc3
-rw-r--r--src/osd/modules/render/bgfx/shaders/fs_distortion.sc41
-rw-r--r--src/osd/modules/render/bgfx/shaders/fs_ntsc_decode.sc3
-rw-r--r--src/osd/modules/render/bgfx/shaders/fs_post.sc7
-rw-r--r--src/osd/modules/render/bgfx/shaders/fs_prescale.sc2
-rw-r--r--src/osd/modules/render/bgfx/shaders/varying.def.sc1
-rw-r--r--src/osd/modules/render/bgfx/shaders/vs_deconverge.sc9
-rw-r--r--src/osd/modules/render/bgfx/shaders/vs_post.sc7
-rw-r--r--src/osd/modules/render/drawbgfx.cpp42
-rw-r--r--src/osd/modules/render/drawbgfx.h1
13 files changed, 90 insertions, 49 deletions
diff --git a/src/osd/modules/render/bgfx/chainentry.cpp b/src/osd/modules/render/bgfx/chainentry.cpp
index f3bbbb42378..be836ba33e5 100644
--- a/src/osd/modules/render/bgfx/chainentry.cpp
+++ b/src/osd/modules/render/bgfx/chainentry.cpp
@@ -146,6 +146,16 @@ void bgfx_chain_entry::setup_quaddims_uniform(render_primitive* prim) const
}
}
+void bgfx_chain_entry::setup_screenindex_uniform(int32_t screen) const
+{
+ bgfx_uniform* screen_index = m_effect->uniform("u_screen_index");
+ if (screen_index != nullptr)
+ {
+ float values[1] = { float(screen) };
+ screen_index->set(values, sizeof(float));
+ }
+}
+
void bgfx_chain_entry::setup_auto_uniforms(render_primitive* prim, texture_manager& textures, uint16_t screen_width, uint16_t screen_height, uint32_t rotation_type, bool swap_xy, int32_t screen)
{
setup_screensize_uniforms(textures, screen_width, screen_height, screen);
@@ -153,6 +163,7 @@ void bgfx_chain_entry::setup_auto_uniforms(render_primitive* prim, texture_manag
setup_rotationtype_uniform(rotation_type);
setup_swapxy_uniform(swap_xy);
setup_quaddims_uniform(prim);
+ setup_screenindex_uniform(screen);
}
bool bgfx_chain_entry::setup_view(int view, uint16_t screen_width, uint16_t screen_height, int32_t screen) const
diff --git a/src/osd/modules/render/bgfx/chainentry.h b/src/osd/modules/render/bgfx/chainentry.h
index a80fc8656c0..69fbb34d7e8 100644
--- a/src/osd/modules/render/bgfx/chainentry.h
+++ b/src/osd/modules/render/bgfx/chainentry.h
@@ -49,6 +49,7 @@ private:
void setup_rotationtype_uniform(uint32_t rotation_type) const;
void setup_swapxy_uniform(bool swap_xy) const;
void setup_quaddims_uniform(render_primitive* prim) const;
+ void setup_screenindex_uniform(int32_t screen) const;
bool setup_view(int view, uint16_t screen_width, uint16_t screen_height, int32_t screen) const;
void put_screen_buffer(render_primitive* prim, bgfx::TransientVertexBuffer* buffer) const;
diff --git a/src/osd/modules/render/bgfx/shaders/fs_deconverge.sc b/src/osd/modules/render/bgfx/shaders/fs_deconverge.sc
index d58e1bf6df9..b23e24951c3 100644
--- a/src/osd/modules/render/bgfx/shaders/fs_deconverge.sc
+++ b/src/osd/modules/render/bgfx/shaders/fs_deconverge.sc
@@ -1,4 +1,4 @@
-$input v_color0, v_texcoord0, v_texcoord1, v_texcoord2
+$input v_color0, v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3
// license:BSD-3-Clause
// copyright-holders:Ryan Holtz,ImJezze
@@ -13,8 +13,9 @@ SAMPLER2D(s_tex, 0);
void main()
{
- float r = texture2D(s_tex, v_texcoord0).r;
- float g = texture2D(s_tex, v_texcoord1).g;
- float b = texture2D(s_tex, v_texcoord2).b;
- gl_FragColor = vec4(r, g, b, 1.0) * v_color0;
+ float a = texture2D(s_tex, v_texcoord0).a;
+ float r = texture2D(s_tex, v_texcoord1).r;
+ float g = texture2D(s_tex, v_texcoord2).g;
+ float b = texture2D(s_tex, v_texcoord3).b;
+ gl_FragColor = vec4(r, g, b, a) * v_color0;
}
diff --git a/src/osd/modules/render/bgfx/shaders/fs_defocus.sc b/src/osd/modules/render/bgfx/shaders/fs_defocus.sc
index 44ca7a93612..c9e76990f3f 100644
--- a/src/osd/modules/render/bgfx/shaders/fs_defocus.sc
+++ b/src/osd/modules/render/bgfx/shaders/fs_defocus.sc
@@ -46,5 +46,6 @@ void main()
vec4 blurred = (d0 + d1 + d2 + d3 + d4 + d5 + d6 + d7 + d8) / 9.0;
- gl_FragColor = vec4(blurred.rgb, 1.0) * v_color0;
+ blurred.a = blurred.a + d0.a;
+ gl_FragColor = blurred * v_color0;
}
diff --git a/src/osd/modules/render/bgfx/shaders/fs_distortion.sc b/src/osd/modules/render/bgfx/shaders/fs_distortion.sc
index 1b93578a2cf..8f4efa04cd3 100644
--- a/src/osd/modules/render/bgfx/shaders/fs_distortion.sc
+++ b/src/osd/modules/render/bgfx/shaders/fs_distortion.sc
@@ -188,33 +188,36 @@ void main()
// Color
vec4 BaseColor = texture2D(s_tex, BaseCoord);
- BaseColor.a = 1.0;
// Clamp
if (BaseCoord.x > 1.0 || BaseCoord.y > 1.0 || BaseCoord.x < 0.0 || BaseCoord.y < 0.0)
- BaseColor.rgb = vec3(0.0, 0.0, 0.0);
-
- // Vignetting Simulation
- vec2 VignetteCoord = BaseCoordCentered;
+ {
+ gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
+ }
+ else
+ {
+ // Vignetting Simulation
+ vec2 VignetteCoord = BaseCoordCentered;
- float VignetteFactor = GetVignetteFactor(VignetteCoord, u_vignetting.x);
- BaseColor.rgb *= VignetteFactor;
+ float VignetteFactor = GetVignetteFactor(VignetteCoord, u_vignetting.x);
+ BaseColor.rgb *= VignetteFactor;
- // Light Reflection Simulation
- vec3 LightColor = vec3(1.0, 0.90, 0.80); // color temperature 5.000 Kelvin
+ // Light Reflection Simulation
+ vec4 LightColor = vec4(1.0, 0.90, 0.80, 1.0); // color temperature 5.000 Kelvin
- vec2 SpotCoord = BaseCoordCentered;
- vec2 NoiseCoord = BaseCoordCentered;
+ vec2 SpotCoord = BaseCoordCentered;
+ vec2 NoiseCoord = BaseCoordCentered;
- float SpotAddend = GetSpotAddend(SpotCoord, u_reflection.x);
- float NoiseFactor = GetNoiseFactor(SpotAddend, rand(NoiseCoord));
- BaseColor.rgb += SpotAddend * NoiseFactor * LightColor;
+ float SpotAddend = GetSpotAddend(SpotCoord, u_reflection.x);
+ float NoiseFactor = GetNoiseFactor(SpotAddend, rand(NoiseCoord));
+ BaseColor += SpotAddend * NoiseFactor * LightColor;
- // Round Corners Simulation
- vec2 RoundCornerCoord = BaseCoordCentered;
+ // Round Corners Simulation
+ vec2 RoundCornerCoord = BaseCoordCentered;
- float roundCornerFactor = GetRoundCornerFactor(RoundCornerCoord, u_round_corner.x, u_smooth_border.x);
- BaseColor.rgb *= roundCornerFactor;
+ float roundCornerFactor = GetRoundCornerFactor(RoundCornerCoord, u_round_corner.x, u_smooth_border.x);
+ BaseColor.rgb *= roundCornerFactor;
- gl_FragColor = BaseColor;
+ gl_FragColor = BaseColor;
+ }
}
diff --git a/src/osd/modules/render/bgfx/shaders/fs_ntsc_decode.sc b/src/osd/modules/render/bgfx/shaders/fs_ntsc_decode.sc
index dda326cd692..1c6a53fba29 100644
--- a/src/osd/modules/render/bgfx/shaders/fs_ntsc_decode.sc
+++ b/src/osd/modules/render/bgfx/shaders/fs_ntsc_decode.sc
@@ -28,6 +28,7 @@ uniform vec4 u_jitter_amount;
// Samplers
SAMPLER2D(s_tex, 0);
+SAMPLER2D(s_screen, 1);
//-----------------------------------------------------------------------------
// Constants
@@ -35,7 +36,7 @@ SAMPLER2D(s_tex, 0);
void main()
{
- vec4 BaseTexel = texture2D(s_tex, v_texcoord0.xy);
+ vec4 BaseTexel = texture2D(s_screen, v_texcoord0.xy);
vec4 zero = vec4(0.0, 0.0, 0.0, 0.0);
vec4 quarter = vec4(0.25, 0.25, 0.25, 0.25);
diff --git a/src/osd/modules/render/bgfx/shaders/fs_post.sc b/src/osd/modules/render/bgfx/shaders/fs_post.sc
index eab3b909909..27c71a61eba 100644
--- a/src/osd/modules/render/bgfx/shaders/fs_post.sc
+++ b/src/osd/modules/render/bgfx/shaders/fs_post.sc
@@ -1,4 +1,4 @@
-$input v_color0, v_texcoord0, v_texcoord1
+$input v_color0, v_texcoord0
// license:BSD-3-Clause
// copyright-holders:Ryan Holtz,ImJezze
@@ -101,7 +101,6 @@ void main()
// Color
vec4 BaseColor = texture2D(s_tex, BaseCoord);
- BaseColor.a = 1.0;
if (BaseCoord.x < 0.0 || BaseCoord.y < 0.0)
{
@@ -123,7 +122,7 @@ void main()
// Color Compression
// increasing the floor of the signal without affecting the ceiling
BaseColor.rgb = u_floor.rgb + (vec3(1.0, 1.0, 1.0) - u_floor.rgb) * BaseColor.rgb;
-
+
// Color Power
BaseColor.r = pow(BaseColor.r, u_power.r);
BaseColor.g = pow(BaseColor.g, u_power.g);
@@ -155,5 +154,5 @@ void main()
BaseColor.rgb *= HumBrightness;
}
- gl_FragColor = vec4(BaseColor.rgb * v_color0.rgb, 1.0);
+ gl_FragColor = vec4(BaseColor.rgb * v_color0.rgb, BaseColor.a);
}
diff --git a/src/osd/modules/render/bgfx/shaders/fs_prescale.sc b/src/osd/modules/render/bgfx/shaders/fs_prescale.sc
index 48d177b19fa..1d8370dacf4 100644
--- a/src/osd/modules/render/bgfx/shaders/fs_prescale.sc
+++ b/src/osd/modules/render/bgfx/shaders/fs_prescale.sc
@@ -26,5 +26,5 @@ void main()
vec2 TexCoord = (i + f) / u_source_dims.xy;
- gl_FragColor = texture2D(s_tex, TexCoord) * v_color0;
+ gl_FragColor = texture2D(s_tex, v_texcoord0.xy) * v_color0;
}
diff --git a/src/osd/modules/render/bgfx/shaders/varying.def.sc b/src/osd/modules/render/bgfx/shaders/varying.def.sc
index 95b607539a7..4bbc09efebe 100644
--- a/src/osd/modules/render/bgfx/shaders/varying.def.sc
+++ b/src/osd/modules/render/bgfx/shaders/varying.def.sc
@@ -2,6 +2,7 @@ vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0);
vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0);
vec2 v_texcoord1 : TEXCOORD1 = vec2(0.0, 0.0);
vec2 v_texcoord2 : TEXCOORD2 = vec2(0.0, 0.0);
+vec2 v_texcoord3 : TEXCOORD3 = vec2(0.0, 0.0);
vec3 v_pos : TEXCOORD3 = vec3(0.0, 0.0, 0.0);
vec3 a_position : POSITION;
diff --git a/src/osd/modules/render/bgfx/shaders/vs_deconverge.sc b/src/osd/modules/render/bgfx/shaders/vs_deconverge.sc
index 6e13814c89b..b714f84e4a6 100644
--- a/src/osd/modules/render/bgfx/shaders/vs_deconverge.sc
+++ b/src/osd/modules/render/bgfx/shaders/vs_deconverge.sc
@@ -1,5 +1,5 @@
$input a_position, a_texcoord0, a_color0
-$output v_color0, v_texcoord0, v_texcoord1, v_texcoord2
+$output v_color0, v_texcoord0, v_texcoord1, v_texcoord2, v_texcoord3
// license:BSD-3-Clause
// copyright-holders:Dario Manesku
@@ -23,9 +23,10 @@ void main()
vec2 half_value = vec2(0.5, 0.5);
- v_texcoord0 = (a_texcoord0 - half_value) * (1.0 + u_radial_converge_red.xy ) + half_value + u_converge_red.xy * (vec2(1.0, 1.0) / u_source_size.xy);
- v_texcoord1 = (a_texcoord0 - half_value) * (1.0 + u_radial_converge_green.xy) + half_value + u_converge_green.xy * (vec2(1.0, 1.0) / u_source_size.xy);
- v_texcoord2 = (a_texcoord0 - half_value) * (1.0 + u_radial_converge_blue.xy ) + half_value + u_converge_blue.xy * (vec2(1.0, 1.0) / u_source_size.xy);
+ v_texcoord0 = a_texcoord0;
+ v_texcoord1 = (a_texcoord0 - half_value) * (1.0 + u_radial_converge_red.xy ) + half_value + u_converge_red.xy * (vec2(1.0, 1.0) / u_source_size.xy);
+ v_texcoord2 = (a_texcoord0 - half_value) * (1.0 + u_radial_converge_green.xy) + half_value + u_converge_green.xy * (vec2(1.0, 1.0) / u_source_size.xy);
+ v_texcoord3 = (a_texcoord0 - half_value) * (1.0 + u_radial_converge_blue.xy ) + half_value + u_converge_blue.xy * (vec2(1.0, 1.0) / u_source_size.xy);
v_color0 = a_color0;
}
diff --git a/src/osd/modules/render/bgfx/shaders/vs_post.sc b/src/osd/modules/render/bgfx/shaders/vs_post.sc
index fcc643b4c8f..fd37320eefb 100644
--- a/src/osd/modules/render/bgfx/shaders/vs_post.sc
+++ b/src/osd/modules/render/bgfx/shaders/vs_post.sc
@@ -1,19 +1,14 @@
$input a_position, a_texcoord0, a_color0
-$output v_texcoord0, v_texcoord1, v_color0
+$output v_texcoord0, v_color0
// license:BSD-3-Clause
// copyright-holders:Dario Manesku
#include "../../../../../../3rdparty/bgfx/examples/common/common.sh"
-// Autos
-uniform vec4 u_source_dims;
-uniform vec4 u_screen_dims;
-
void main()
{
gl_Position = mul(u_viewProj, vec4(a_position.xy, 0.0, 1.0));
v_texcoord0 = a_texcoord0;
- v_texcoord1 = a_texcoord0.xy * u_source_dims.xy / u_screen_dims.x;
v_color0 = a_color0;
}
diff --git a/src/osd/modules/render/drawbgfx.cpp b/src/osd/modules/render/drawbgfx.cpp
index d955f8c76f2..8389d59cfad 100644
--- a/src/osd/modules/render/drawbgfx.cpp
+++ b/src/osd/modules/render/drawbgfx.cpp
@@ -763,17 +763,33 @@ int renderer_bgfx::handle_screen_chains()
// Determine how many post-processing passes are needed
int screens = 0;
+ int total_screen_textures = 0;
+ std::vector<void*> bases;
while (prim != nullptr)
{
if (PRIMFLAG_GET_SCREENTEX(prim->flags))
{
- screens++;
+ total_screen_textures++;
+ bool found = false;
+ for (void* base : bases)
+ {
+ if (base == prim->texture.base)
+ {
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ {
+ screens++;
+ bases.push_back(prim->texture.base);
+ }
}
prim = prim->next();
}
const uint32_t available_chains = m_screen_chains[window().m_index].size();
- screens = screens >= available_chains ? available_chains: screens;
+ screens = screens >= available_chains ? available_chains : screens;
if (screens > 0)
{
@@ -827,6 +843,7 @@ int renderer_bgfx::draw(int update)
s_current_view = 0;
}
+ m_seen_views.clear();
m_ui_view = -1;
// Set view 0 default viewport.
@@ -857,7 +874,7 @@ int renderer_bgfx::draw(int update)
bool atlas_valid = update_atlas();
render_primitive *prim = window().m_primlist->first();
- std::vector<screen_device*> screens;
+ std::vector<void*> sources;
while (prim != nullptr)
{
UINT32 blend = PRIMFLAG_GET_BLENDMODE(prim->flags);
@@ -868,16 +885,16 @@ int renderer_bgfx::draw(int update)
int32_t screen = -1;
if (PRIMFLAG_GET_SCREENTEX(prim->flags))
{
- for (screen = 0; screen < screens.size(); screen++)
+ for (screen = 0; screen < sources.size(); screen++)
{
- if (screens[screen] == prim->container->screen())
+ if (sources[screen] == prim->texture.base)
{
break;
}
}
- if (screen == screens.size())
+ if (screen == sources.size())
{
- screens.push_back(prim->container->screen());
+ sources.push_back(prim->texture.base);
}
}
@@ -966,8 +983,17 @@ void renderer_bgfx::setup_view(uint32_t view_index, bool screen)
#if SCENE_VIEW
if (view_index == m_max_view)
-#endif
{
+#else
+ while ((view_index + 1) > m_seen_views.size())
+ {
+ m_seen_views.push_back(false);
+ }
+
+ if (!m_seen_views[view_index])
+ {
+ m_seen_views[view_index] = true;
+#endif
bgfx::setViewClear(view_index, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH, 0x00000000, 1.0f, 0);
}
diff --git a/src/osd/modules/render/drawbgfx.h b/src/osd/modules/render/drawbgfx.h
index 823472f5c4a..30976a7fb76 100644
--- a/src/osd/modules/render/drawbgfx.h
+++ b/src/osd/modules/render/drawbgfx.h
@@ -115,6 +115,7 @@ private:
bgfx_effect* m_gui_effect[4];
bgfx_effect* m_screen_effect[4];
std::vector<std::vector<bgfx_chain*>> m_screen_chains;
+ std::vector<uint32_t> m_seen_views;
std::map<UINT32, rectangle_packer::packed_rectangle> m_hash_to_entry;
std::vector<rectangle_packer::packable_rectangle> m_texinfo;