summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/render/bgfx/chainmanager.cpp
diff options
context:
space:
mode:
author MooglyGuy <therealmogminer@gmail.com>2019-10-22 09:55:15 +0200
committer MooglyGuy <therealmogminer@gmail.com>2019-10-22 09:55:28 +0200
commit6c6b0f86a8ed5e40ead04e824dc8dbde13d1a846 (patch)
tree734b788c845ac88acfb74cddfad74c8e812c292f /src/osd/modules/render/bgfx/chainmanager.cpp
parent9c64307ba8ea8d2b67ff50dd994a969d32aec4be (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.cpp189
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);