diff options
Diffstat (limited to 'src/osd/modules')
| -rw-r--r-- | src/osd/modules/render/bgfx/chainentry.cpp | 11 | ||||
| -rw-r--r-- | src/osd/modules/render/bgfx/chainentry.h | 1 | ||||
| -rw-r--r-- | src/osd/modules/render/bgfx/shaders/fs_deconverge.sc | 11 | ||||
| -rw-r--r-- | src/osd/modules/render/bgfx/shaders/fs_defocus.sc | 3 | ||||
| -rw-r--r-- | src/osd/modules/render/bgfx/shaders/fs_distortion.sc | 41 | ||||
| -rw-r--r-- | src/osd/modules/render/bgfx/shaders/fs_ntsc_decode.sc | 3 | ||||
| -rw-r--r-- | src/osd/modules/render/bgfx/shaders/fs_post.sc | 7 | ||||
| -rw-r--r-- | src/osd/modules/render/bgfx/shaders/fs_prescale.sc | 2 | ||||
| -rw-r--r-- | src/osd/modules/render/bgfx/shaders/varying.def.sc | 1 | ||||
| -rw-r--r-- | src/osd/modules/render/bgfx/shaders/vs_deconverge.sc | 9 | ||||
| -rw-r--r-- | src/osd/modules/render/bgfx/shaders/vs_post.sc | 7 | ||||
| -rw-r--r-- | src/osd/modules/render/drawbgfx.cpp | 42 | ||||
| -rw-r--r-- | src/osd/modules/render/drawbgfx.h | 1 |
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; |
