summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/render/bgfx/chainmanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/modules/render/bgfx/chainmanager.cpp')
-rw-r--r--src/osd/modules/render/bgfx/chainmanager.cpp52
1 files changed, 47 insertions, 5 deletions
diff --git a/src/osd/modules/render/bgfx/chainmanager.cpp b/src/osd/modules/render/bgfx/chainmanager.cpp
index 458a45d449c..80934ed073a 100644
--- a/src/osd/modules/render/bgfx/chainmanager.cpp
+++ b/src/osd/modules/render/bgfx/chainmanager.cpp
@@ -48,7 +48,7 @@ chain_manager::chain_manager(running_machine& machine, osd_options& options, tex
, m_slider_notifier(slider_notifier)
, m_screen_count(0)
{
- find_available_chains(options.bgfx_path());
+ refresh_available_chains();
parse_chain_selections(options.bgfx_screen_chains());
}
@@ -57,12 +57,41 @@ chain_manager::~chain_manager()
destroy_chains();
}
-void chain_manager::find_available_chains(std::string path)
+void chain_manager::refresh_available_chains()
{
m_available_chains.clear();
m_available_chains.push_back("none");
- osd_directory *directory = osd_opendir((path + "/chains").c_str());
+ find_available_chains(std::string(m_options.bgfx_path()) + "/chains");
+
+ destroy_unloaded_chains();
+}
+
+void chain_manager::destroy_unloaded_chains()
+{
+ // O(shaders*available_chains), but we don't care because asset reloading happens rarely
+ for (int i = 0; i < m_chain_names.size(); i++)
+ {
+ std::string name = m_chain_names[i];
+ if (name.length() > 0)
+ {
+ for (std::string available_name : m_available_chains)
+ {
+ if (available_name == name)
+ {
+ delete m_screen_chains[i];
+ m_chain_names[i] = "";
+ m_current_chain[i] = CHAIN_NONE;
+ break;
+ }
+ }
+ }
+ }
+}
+
+void chain_manager::find_available_chains(std::string path)
+{
+ osd_directory *directory = osd_opendir(path.c_str());
if (directory != nullptr)
{
for (const osd_directory_entry *entry = osd_readdir(directory); entry != nullptr; entry = osd_readdir(directory))
@@ -85,6 +114,14 @@ void chain_manager::find_available_chains(std::string path)
}
}
}
+ else if (entry->type == ENTTYPE_DIR)
+ {
+ std::string name = entry->name;
+ if (!(name == "." || name == ".."))
+ {
+ find_available_chains(path + PATH_SEPARATOR + name);
+ }
+ }
}
osd_closedir(directory);
@@ -144,6 +181,7 @@ void chain_manager::parse_chain_selections(std::string chain_str)
while (m_current_chain.size() != chain_names.size())
{
m_screen_chains.push_back(nullptr);
+ m_chain_names.push_back("");
m_current_chain.push_back(CHAIN_NONE);
}
@@ -161,10 +199,12 @@ void chain_manager::parse_chain_selections(std::string chain_str)
if (chain_index < m_available_chains.size())
{
m_current_chain[index] = chain_index;
+ m_chain_names[index] = m_available_chains[chain_index];
}
else
{
m_current_chain[index] = CHAIN_NONE;
+ m_chain_names[index] = "";
}
}
}
@@ -201,7 +241,8 @@ void chain_manager::load_chains()
{
if (m_current_chain[chain] != CHAIN_NONE)
{
- m_screen_chains[chain] = load_chain(m_available_chains[m_current_chain[chain]], uint32_t(chain));
+ m_chain_names[chain] = m_available_chains[m_current_chain[chain]];
+ m_screen_chains[chain] = load_chain(m_chain_names[chain], uint32_t(chain));
}
}
}
@@ -245,7 +286,7 @@ void chain_manager::process_screen_quad(uint32_t view, uint32_t screen, render_p
tex_width, tex_height, prim->texture.rowpixels, prim->texture.palette, prim->texture.base);
std::string full_name = "screen" + std::to_string(screen);
- bgfx_texture *texture = new bgfx_texture(full_name, bgfx::TextureFormat::RGBA8, tex_width, tex_height, mem, BGFX_TEXTURE_MIN_POINT | BGFX_TEXTURE_MAG_POINT | BGFX_TEXTURE_MIP_POINT);
+ bgfx_texture *texture = new bgfx_texture(full_name, bgfx::TextureFormat::RGBA8, tex_width, tex_height, mem, BGFX_TEXTURE_U_CLAMP | BGFX_TEXTURE_V_CLAMP | BGFX_TEXTURE_MIN_POINT | BGFX_TEXTURE_MAG_POINT | BGFX_TEXTURE_MIP_POINT);
m_textures.add_provider(full_name, texture);
m_targets.update_target_sizes(screen, tex_width, tex_height, TARGET_STYLE_GUEST);
@@ -293,6 +334,7 @@ void chain_manager::update_screen_count(uint32_t screen_count)
while (m_screen_chains.size() < m_screen_count)
{
m_screen_chains.push_back(nullptr);
+ m_chain_names.push_back("");
m_current_chain.push_back(CHAIN_NONE);
}