Fix debug crash with bgfx screen chains

This commit is contained in:
therealmogminer@gmail.com 2016-05-26 21:53:48 +02:00
parent 87429e74d9
commit 1f1ccd9b7d
7 changed files with 50 additions and 20 deletions

View File

@ -93,7 +93,7 @@
{ "type": "float", "name": "scanline_height", "text": "Individual Scanline Scale", "default": 1.00, "max": 4.00, "min": 0.0, "step": 0.01, "format": "%1.2f", "screen": "crt" },
{ "type": "float", "name": "scanline_variation", "text": "Scanline Variation", "default": 1.00, "max": 4.00, "min": 0.0, "step": 0.01, "format": "%1.2f", "screen": "crt" },
{ "type": "float", "name": "scanline_bright_scale", "text": "Scanline Brightness Scale", "default": 2.00, "max": 4.00, "min": 0.0, "step": 0.01, "format": "%1.2f", "screen": "crt" },
{ "type": "float", "name": "scanline_bright_offset", "text": "Scanline Brightness Offset", "default": 4.00, "max": 4.00, "min": 0.0, "step": 0.01, "format": "%1.2f", "screen": "crt" },
{ "type": "float", "name": "scanline_bright_offset", "text": "Scanline Brightness Offset", "default": 1.50, "max": 4.00, "min": 0.0, "step": 0.01, "format": "%1.2f", "screen": "crt" },
{ "type": "float", "name": "scanline_jitter_amount", "text": "Scanline Jitter Amount", "default": 0.00, "max": 4.00, "min": 0.0, "step": 0.01, "format": "%1.2f", "screen": "crt" },
{ "type": "float", "name": "scanline_variation", "text": "Scanline Variation", "default": 1.00, "max": 4.00, "min": 0.0, "step": 0.01, "format": "%1.2f", "screen": "crt" },

View File

@ -34,10 +34,11 @@ bgfx_chain::bgfx_chain(std::string name, std::string author, bool transform, tar
, m_current_time(0)
, m_screen_index(screen_index)
{
for (bgfx_slider* slider : m_sliders)
{
m_slider_map[slider->name()] = slider;
}
for (bgfx_target* target : m_target_list)
{
m_target_map[target->name()] = target;
m_target_names.push_back(target->name());
}
}
bgfx_chain::~bgfx_chain()
@ -60,6 +61,17 @@ bgfx_chain::~bgfx_chain()
}
}
void bgfx_chain::repopulate_targets()
{
for (size_t i = 0; i < m_target_names.size(); i++)
{
bgfx_target* target = m_targets.target(m_screen_index, m_target_names[i]);
if (target != nullptr) {
m_target_list[i] = target;
}
}
}
void bgfx_chain::process(render_primitive* prim, int view, int screen, texture_manager& textures, osd_window& window, uint64_t blend)
{
screen_device_iterator screen_iterator(window.machine().root_device());

View File

@ -32,6 +32,7 @@ public:
~bgfx_chain();
void process(render_primitive* prim, int view, int screen, texture_manager& textures, osd_window &window, uint64_t blend = 0L);
void repopulate_targets();
// Getters
std::vector<bgfx_slider*>& sliders() { return m_sliders; }
@ -48,7 +49,8 @@ private:
std::vector<bgfx_parameter*> m_params;
std::vector<bgfx_chain_entry*> m_entries;
std::vector<bgfx_target*> m_target_list;
std::map<std::string, bgfx_slider*> m_slider_map;
std::vector<std::string> m_target_names;
std::map<std::string, bgfx_target*> m_target_map;
int64_t m_current_time;
uint32_t m_screen_index;
};

View File

@ -295,7 +295,14 @@ void chain_manager::process_screen_quad(uint32_t view, uint32_t screen, render_p
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);
const bool any_targets_rebuilt = m_targets.update_target_sizes(screen, tex_width, tex_height, TARGET_STYLE_GUEST);
if (any_targets_rebuilt)
{
for (bgfx_chain* chain : m_screen_chains)
{
chain->repopulate_targets();
}
}
bgfx_chain* chain = screen_chain(screen);
chain->process(prim, view, screen, m_textures, window, bgfx_util::get_blend_state(PRIMFLAG_GET_BLENDMODE(prim->flags)));
@ -440,8 +447,14 @@ uint32_t chain_manager::handle_screen_chains(uint32_t view, render_primitive *st
std::swap(screen_width, screen_height);
}
m_targets.update_target_sizes(screen_index, screen_width, screen_height, TARGET_STYLE_NATIVE);
process_screen_quad(view + used_views, screen_index, prim, window);
const bool any_targets_rebuilt = m_targets.update_target_sizes(screen_index, screen_width, screen_height, TARGET_STYLE_NATIVE);
if (any_targets_rebuilt) {
for (bgfx_chain* chain : m_screen_chains) {
chain->repopulate_targets();
}
}
process_screen_quad(view + used_views, screen_index, prim, window);
used_views += screen_chain(screen_index)->applicable_passes();
screen_index++;

View File

@ -54,14 +54,14 @@ public:
int32_t chain_changed(int32_t index, std::string *str, int32_t newval);
// Getters
running_machine& machine() { return m_machine; }
osd_options& options() { return m_options; }
texture_manager& textures() { return m_textures; }
target_manager& targets() { return m_targets; }
effect_manager& effects() { return m_effects; }
slider_dirty_notifier& slider_notifier() { return m_slider_notifier; }
uint32_t window_index() { return m_window_index; }
uint32_t screen_count() { return m_screen_count; }
running_machine& machine() const { return m_machine; }
osd_options& options() const { return m_options; }
texture_manager& textures() const { return m_textures; }
target_manager& targets() const { return m_targets; }
effect_manager& effects() const { return m_effects; }
slider_dirty_notifier& slider_notifier() const { return m_slider_notifier; }
uint32_t window_index() const { return m_window_index; }
uint32_t screen_count() const { return m_screen_count; }
bgfx_chain* screen_chain(uint32_t screen);
bgfx_chain* load_chain(std::string name, uint32_t screen_index);
bool has_applicable_chain(uint32_t screen);

View File

@ -86,9 +86,9 @@ bgfx_target* target_manager::target(uint32_t screen, std::string name)
return target;
}
void target_manager::update_target_sizes(uint32_t screen, uint16_t width, uint16_t height, uint32_t style)
bool target_manager::update_target_sizes(uint32_t screen, uint16_t width, uint16_t height, uint32_t style)
{
if (style == TARGET_STYLE_CUSTOM) return;
if (style == TARGET_STYLE_CUSTOM) return false;
std::vector<osd_dim>& sizes = style == TARGET_STYLE_GUEST ? m_guest_dims : m_native_dims;
@ -102,7 +102,10 @@ void target_manager::update_target_sizes(uint32_t screen, uint16_t width, uint16
{
sizes[screen] = osd_dim(width, height);
rebuild_targets(screen, style);
return true;
}
return false;
}
void target_manager::rebuild_targets(uint32_t screen, uint32_t style)

View File

@ -34,7 +34,7 @@ public:
void destroy_target(std::string name, uint32_t screen = -1);
bgfx_target* create_backbuffer(void *handle, uint16_t width, uint16_t height);
void update_target_sizes(uint32_t screen, uint16_t width, uint16_t height, uint32_t style);
bool update_target_sizes(uint32_t screen, uint16_t width, uint16_t height, uint32_t style);
void update_screen_count(uint32_t count);
// Getters