diff options
author | 2019-10-22 09:55:15 +0200 | |
---|---|---|
committer | 2019-10-22 09:55:28 +0200 | |
commit | 6c6b0f86a8ed5e40ead04e824dc8dbde13d1a846 (patch) | |
tree | 734b788c845ac88acfb74cddfad74c8e812c292f /src/osd/modules/render/bgfx/chainmanager.cpp | |
parent | 9c64307ba8ea8d2b67ff50dd994a969d32aec4be (diff) |
-bgfx: Rework chain updating to minimize primlist locking, nw
Diffstat (limited to 'src/osd/modules/render/bgfx/chainmanager.cpp')
-rw-r--r-- | src/osd/modules/render/bgfx/chainmanager.cpp | 189 |
1 files changed, 103 insertions, 86 deletions
diff --git a/src/osd/modules/render/bgfx/chainmanager.cpp b/src/osd/modules/render/bgfx/chainmanager.cpp index eb22cb1d253..aa16e075bda 100644 --- a/src/osd/modules/render/bgfx/chainmanager.cpp +++ b/src/osd/modules/render/bgfx/chainmanager.cpp @@ -298,75 +298,9 @@ bgfx_chain* chain_manager::screen_chain(uint32_t screen) } } -void chain_manager::process_screen_quad(uint32_t view, uint32_t screen, render_primitive* prim, osd_window& window) +void chain_manager::process_screen_quad(uint32_t view, uint32_t screen, screen_prim &prim, osd_window& window) { - uint16_t tex_width(prim->texture.width); - uint16_t tex_height(prim->texture.height); - - bgfx_texture* texture = screen < m_screen_textures.size() ? m_screen_textures[screen] : nullptr; - bgfx_texture* palette = screen < m_screen_palettes.size() ? m_screen_palettes[screen] : nullptr; - - const uint32_t src_format = (prim->flags & PRIMFLAG_TEXFORMAT_MASK) >> PRIMFLAG_TEXFORMAT_SHIFT; - const bool needs_conversion = m_converters[src_format] != nullptr; - std::string screen_index = std::to_string(screen); - std::string source_name = "source" + screen_index; - std::string screen_name = "screen" + screen_index; - std::string palette_name = "palette" + screen_index; - std::string full_name = needs_conversion ? source_name : screen_name; - if (texture && (texture->width() != tex_width || texture->height() != tex_height)) - { - m_textures.add_provider(full_name, nullptr); - delete texture; - texture = nullptr; - - if (palette) - { - m_textures.add_provider(palette_name, nullptr); - delete palette; - palette = nullptr; - } - } - - bgfx::TextureFormat::Enum dst_format = bgfx::TextureFormat::RGBA8; - uint16_t pitch = tex_width; - const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgfx_texture_data(dst_format, prim->flags & PRIMFLAG_TEXFORMAT_MASK, - tex_width, tex_height, prim->texture.rowpixels, prim->texture.palette, prim->texture.base, &pitch); - - if (texture == nullptr) - { - bgfx_texture *texture = new bgfx_texture(full_name, dst_format, tex_width, tex_height, mem, BGFX_SAMPLER_U_CLAMP | BGFX_SAMPLER_V_CLAMP | BGFX_SAMPLER_MIN_POINT | BGFX_SAMPLER_MAG_POINT | BGFX_SAMPLER_MIP_POINT, pitch); - m_textures.add_provider(full_name, texture); - - if (prim->texture.palette) - { - uint16_t palette_width = (uint16_t)std::min(prim->texture.palette_length, 256U); - uint16_t palette_height = (uint16_t)std::max(prim->texture.palette_length / 256, 1U); - const bgfx::Memory *palmem = bgfx::copy(prim->texture.palette, palette_width * palette_height * 4); - palette = new bgfx_texture(palette_name, bgfx::TextureFormat::BGRA8, palette_width, palette_height, palmem, BGFX_SAMPLER_U_CLAMP | BGFX_SAMPLER_V_CLAMP | BGFX_SAMPLER_MIN_POINT | BGFX_SAMPLER_MAG_POINT | BGFX_SAMPLER_MIP_POINT, palette_width); - m_textures.add_provider(palette_name, palette); - } - - if (screen >= m_screen_textures.size()) - { - m_screen_textures.push_back(texture); - if (palette) - { - m_screen_palettes.push_back(palette); - } - } - } - else - { - texture->update(mem, pitch); - - if (prim->texture.palette) - { - const bgfx::Memory *palmem = bgfx::copy(prim->texture.palette, palette->width() * palette->height() * 4); - palette->update(palmem); - } - } - - const bool any_targets_rebuilt = m_targets.update_target_sizes(screen, tex_width, tex_height, TARGET_STYLE_GUEST); + const bool any_targets_rebuilt = m_targets.update_target_sizes(screen, prim.m_tex_width, prim.m_tex_height, TARGET_STYLE_GUEST); if (any_targets_rebuilt) { for (bgfx_chain* chain : m_screen_chains) @@ -379,25 +313,26 @@ void chain_manager::process_screen_quad(uint32_t view, uint32_t screen, render_p } bgfx_chain* chain = screen_chain(screen); - if (needs_conversion && !chain->has_converter()) - { - chain->prepend_converter(m_converters[src_format], *this); - } - chain->process(prim, view, screen, m_textures, window, bgfx_util::get_blend_state(PRIMFLAG_GET_BLENDMODE(prim->flags))); + chain->process(prim, view, screen, m_textures, window, bgfx_util::get_blend_state(PRIMFLAG_GET_BLENDMODE(prim.m_flags))); view += chain->applicable_passes(); } -std::vector<render_primitive*> chain_manager::count_screens(render_primitive* prim) +uint32_t chain_manager::count_screens(render_primitive* prim) { - std::vector<render_primitive*> screens; - - int screen_count = 0; + uint32_t screen_count = 0; while (prim != nullptr) { if (PRIMFLAG_GET_SCREENTEX(prim->flags)) { + if (screen_count < m_screen_prims.size()) + { + m_screen_prims[screen_count] = prim; + } + else + { + m_screen_prims.push_back(prim); + } screen_count++; - screens.push_back(prim); } prim = prim->next(); } @@ -408,7 +343,12 @@ std::vector<render_primitive*> chain_manager::count_screens(render_primitive* pr m_targets.update_screen_count(screen_count); } - return screens; + if (screen_count < m_screen_prims.size()) + { + m_screen_prims.resize(screen_count); + } + + return screen_count; } void chain_manager::update_screen_count(uint32_t screen_count) @@ -487,19 +427,96 @@ void chain_manager::create_selection_slider(uint32_t screen_index) m_core_sliders.push_back(std::move(state)); } -uint32_t chain_manager::handle_screen_chains(uint32_t view, render_primitive *starting_prim, osd_window& window) +uint32_t chain_manager::update_screen_textures(uint32_t view, render_primitive *starting_prim, osd_window& window) { - std::vector<render_primitive*> screens = count_screens(starting_prim); + if (!count_screens(starting_prim)) + return 0; - if (screens.size() == 0) + for (int screen = 0; screen < m_screen_prims.size(); screen++) { - return 0; + screen_prim &prim = m_screen_prims[screen]; + uint16_t tex_width(prim.m_tex_width); + uint16_t tex_height(prim.m_tex_height); + + bgfx_texture* texture = screen < m_screen_textures.size() ? m_screen_textures[screen] : nullptr; + bgfx_texture* palette = screen < m_screen_palettes.size() ? m_screen_palettes[screen] : nullptr; + + const uint32_t src_format = (prim.m_flags & PRIMFLAG_TEXFORMAT_MASK) >> PRIMFLAG_TEXFORMAT_SHIFT; + const bool needs_conversion = m_converters[src_format] != nullptr; + std::string screen_index = std::to_string(screen); + std::string source_name = "source" + screen_index; + std::string screen_name = "screen" + screen_index; + std::string palette_name = "palette" + screen_index; + std::string full_name = needs_conversion ? source_name : screen_name; + if (texture && (texture->width() != tex_width || texture->height() != tex_height)) + { + m_textures.add_provider(full_name, nullptr); + delete texture; + texture = nullptr; + + if (palette) + { + m_textures.add_provider(palette_name, nullptr); + delete palette; + palette = nullptr; + } + } + + bgfx::TextureFormat::Enum dst_format = bgfx::TextureFormat::RGBA8; + uint16_t pitch = tex_width; + const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgfx_texture_data(dst_format, prim.m_flags & PRIMFLAG_TEXFORMAT_MASK, + tex_width, tex_height, prim.m_rowpixels, prim.m_prim->texture.palette, prim.m_prim->texture.base, &pitch); + + if (texture == nullptr) + { + bgfx_texture *texture = new bgfx_texture(full_name, dst_format, tex_width, tex_height, mem, BGFX_SAMPLER_U_CLAMP | BGFX_SAMPLER_V_CLAMP | BGFX_SAMPLER_MIN_POINT | BGFX_SAMPLER_MAG_POINT | BGFX_SAMPLER_MIP_POINT, pitch); + m_textures.add_provider(full_name, texture); + + if (prim.m_prim->texture.palette) + { + uint16_t palette_width = (uint16_t)std::min(prim.m_palette_length, 256U); + uint16_t palette_height = (uint16_t)std::max(prim.m_palette_length / 256, 1U); + const bgfx::Memory *palmem = bgfx::copy(prim.m_prim->texture.palette, palette_width * palette_height * 4); + palette = new bgfx_texture(palette_name, bgfx::TextureFormat::BGRA8, palette_width, palette_height, palmem, BGFX_SAMPLER_U_CLAMP | BGFX_SAMPLER_V_CLAMP | BGFX_SAMPLER_MIN_POINT | BGFX_SAMPLER_MAG_POINT | BGFX_SAMPLER_MIP_POINT, palette_width); + m_textures.add_provider(palette_name, palette); + } + + if (screen >= m_screen_textures.size()) + { + m_screen_textures.push_back(texture); + if (palette) + { + m_screen_palettes.push_back(palette); + } + } + } + else + { + texture->update(mem, pitch); + + if (prim.m_prim->texture.palette) + { + const bgfx::Memory *palmem = bgfx::copy(prim.m_prim->texture.palette, palette->width() * palette->height() * 4); + palette->update(palmem); + } + } + + bgfx_chain* chain = screen_chain(screen); + if (needs_conversion && !chain->has_converter()) + { + chain->prepend_converter(m_converters[src_format], *this); + } } + return m_screen_prims.size(); +} + +uint32_t chain_manager::process_screen_chains(uint32_t view, osd_window& window) +{ // Process each screen as necessary uint32_t used_views = 0; uint32_t screen_index = 0; - for (render_primitive* prim : screens) + for (screen_prim &prim : m_screen_prims) { if (m_current_chain[screen_index] == CHAIN_NONE || screen_chain(screen_index) == nullptr) { @@ -507,8 +524,8 @@ uint32_t chain_manager::handle_screen_chains(uint32_t view, render_primitive *st continue; } - uint16_t screen_width(floorf(prim->get_full_quad_width() + 0.5f)); - uint16_t screen_height(floorf(prim->get_full_quad_height() + 0.5f)); + uint16_t screen_width = prim.m_screen_width; + uint16_t screen_height = prim.m_screen_height; if (window.swap_xy()) { std::swap(screen_width, screen_height); |