emu/render.cpp: Consider that screens can be hidden when choosing a default view.

This commit is contained in:
Vas Crabb 2020-10-03 04:52:06 +10:00
parent c0754c36cd
commit ae3560c57c
6 changed files with 49 additions and 47 deletions

View File

@ -1082,13 +1082,14 @@ unsigned render_target::configured_view(const char *viewname, int targetindex, i
screen_device const &screen = screens[index() % screens.size()]; screen_device const &screen = screens[index() % screens.size()];
for (unsigned i = 0; !view && (m_views.size() > i); ++i) for (unsigned i = 0; !view && (m_views.size() > i); ++i)
{ {
for (screen_device const &viewscreen : m_views[i].first.get().screens()) for (layout_view::item &viewitem : m_views[i].first.get().items())
{ {
if (&viewscreen == &screen) screen_device const *const viewscreen(viewitem.screen());
if (viewscreen == &screen)
{ {
view = &m_views[i].first.get(); view = &m_views[i].first.get();
} }
else else if (viewscreen)
{ {
view = nullptr; view = nullptr;
break; break;
@ -1103,9 +1104,8 @@ unsigned render_target::configured_view(const char *viewname, int targetindex, i
for (unsigned i = 0; !view && (m_views.size() > i); ++i) for (unsigned i = 0; !view && (m_views.size() > i); ++i)
{ {
layout_view &curview = m_views[i].first; layout_view &curview = m_views[i].first;
if (curview.screen_count() >= screens.size()) if (std::find_if(screens.begin(), screens.end(), [&curview] (screen_device &screen) { return !curview.has_screen(screen); }) == screens.end())
if (std::find_if(screens.begin(), screens.end(), [&curview] (screen_device &screen) { return !curview.has_screen(screen); }) == screens.end()) view = &curview;
view = &curview;
} }
} }
} }
@ -1467,7 +1467,7 @@ bool render_target::map_point_container(s32 target_x, s32 target_y, render_conta
std::swap(target_f.first, target_f.second); std::swap(target_f.first, target_f.second);
// try to find the right container // try to find the right container
auto const &items(current_view().screen_items()); auto const &items(current_view().visible_screen_items());
auto const found(std::find_if( auto const found(std::find_if(
items.begin(), items.begin(),
items.end(), items.end(),
@ -1905,20 +1905,17 @@ void render_target::load_additional_layout_files(const char *basename, bool have
int viewindex(0); int viewindex(0);
for (layout_view *view = nth_view(viewindex); need_tiles && view; view = nth_view(++viewindex)) for (layout_view *view = nth_view(viewindex); need_tiles && view; view = nth_view(++viewindex))
{ {
if (view->screen_count() >= screens.size()) bool screen_missing(false);
for (screen_device &screen : iter)
{ {
bool screen_missing(false); if (!view->has_screen(screen))
for (screen_device &screen : iter)
{ {
if (!view->has_screen(screen)) screen_missing = true;
{ break;
screen_missing = true;
break;
}
} }
if (!screen_missing)
need_tiles = false;
} }
if (!screen_missing)
need_tiles = false;
} }
} }
if (need_tiles) if (need_tiles)
@ -3089,7 +3086,7 @@ bool render_manager::is_live(screen_device &screen) const
if (!target.hidden()) if (!target.hidden())
{ {
layout_view const *view = &target.current_view(); layout_view const *view = &target.current_view();
if (view->has_screen(screen)) if (view->has_visible_screen(screen))
return true; return true;
} }
} }

View File

@ -901,16 +901,17 @@ public:
// getters // getters
item_list &items() { return m_items; } item_list &items() { return m_items; }
bool has_screen(screen_device &screen);
const std::string &name() const { return m_name; } const std::string &name() const { return m_name; }
size_t screen_count() const { return m_screens.size(); } size_t visible_screen_count() const { return m_screens.size(); }
float effective_aspect() const { return m_effaspect; } float effective_aspect() const { return m_effaspect; }
const render_bounds &bounds() const { return m_bounds; } const render_bounds &bounds() const { return m_bounds; }
bool has_screen(screen_device &screen) const; bool has_visible_screen(screen_device &screen) const;
const item_ref_vector &screen_items() const { return m_screen_items; } const item_ref_vector &visible_screen_items() const { return m_screen_items; }
const item_ref_vector &interactive_items() const { return m_interactive_items; } const item_ref_vector &interactive_items() const { return m_interactive_items; }
const edge_vector &interactive_edges_x() const { return m_interactive_edges_x; } const edge_vector &interactive_edges_x() const { return m_interactive_edges_x; }
const edge_vector &interactive_edges_y() const { return m_interactive_edges_y; } const edge_vector &interactive_edges_y() const { return m_interactive_edges_y; }
const screen_ref_vector &screens() const { return m_screens; } const screen_ref_vector &visible_screens() const { return m_screens; }
const visibility_toggle_vector &visibility_toggles() const { return m_vistoggles; } const visibility_toggle_vector &visibility_toggles() const { return m_vistoggles; }
u32 default_visibility_mask() const { return m_defvismask; } u32 default_visibility_mask() const { return m_defvismask; }
bool has_art() const { return m_has_art; } bool has_art() const { return m_has_art; }

View File

@ -3446,7 +3446,18 @@ layout_view::~layout_view()
// the given screen // the given screen
//------------------------------------------------- //-------------------------------------------------
bool layout_view::has_screen(screen_device &screen) const bool layout_view::has_screen(screen_device &screen)
{
return std::find_if(m_items.begin(), m_items.end(), [&screen] (auto &itm) { return itm.screen() == &screen; }) != m_items.end();
}
//-------------------------------------------------
// has_visible_screen - return true if this view
// has the given screen visble
//-------------------------------------------------
bool layout_view::has_visible_screen(screen_device &screen) const
{ {
return std::find_if(m_screens.begin(), m_screens.end(), [&screen] (auto const &scr) { return &scr.get() == &screen; }) != m_screens.end(); return std::find_if(m_screens.begin(), m_screens.end(), [&screen] (auto const &scr) { return &scr.get() == &screen; }) != m_screens.end();
} }

View File

@ -21,29 +21,22 @@ license:CC0
</element> </element>
<view name="Default"> <view name="Default">
<!-- workaround for MAME selecting a 2-screen view by default --> <collection name="Diagnostics" visible="no">
<screen tag="ioboard:screen"><bounds left="0" top="0" right="1" bottom="1" /></screen> <element ref="background">
<bounds x="0" y="0" width="512" height="419" />
</element>
<screen tag="ioboard:screen">
<bounds left="8" top="392" right="129" bottom="411" />
</screen>
<element name="led_comm_err" ref="led_red">
<bounds x="141" y="399" width="5" height="5" />
</element>
<element ref="text_comm_err">
<bounds x="145" y="398" width="40" height="7" />
</element>
</collection>
<screen tag="screen"> <screen tag="screen">
<bounds left="0" top="0" right="4" bottom="3" /> <bounds left="0" top="0" right="512" bottom="384" />
</screen> </screen>
</view> </view>
<view name="Diagnostic">
<element ref="background">
<bounds x="0" y="0" width="496" height="419" />
</element>
<screen tag="screen">
<bounds left="0" top="0" right="496" bottom="384" />
</screen>
<screen tag="ioboard:screen">
<bounds left="8" top="392" right="129" bottom="411" />
</screen>
<element name="led_comm_err" ref="led_red">
<bounds x="141" y="399" width="5" height="5" />
</element>
<element ref="text_comm_err">
<bounds x="145" y="398" width="40" height="7" />
</element>
</view>
</mamelayout> </mamelayout>

View File

@ -81,7 +81,7 @@ void bgfx_chain::process(chain_manager::screen_prim &prim, int view, int screen,
screen_device_iterator screen_iterator(window.machine().root_device()); screen_device_iterator screen_iterator(window.machine().root_device());
screen_device* screen_device = screen_iterator.byindex(screen); screen_device* screen_device = screen_iterator.byindex(screen);
uint16_t screen_count(window.target()->current_view().screen_count()); uint16_t screen_count(window.target()->current_view().visible_screen_count());
uint16_t screen_width = prim.m_quad_width; uint16_t screen_width = prim.m_quad_width;
uint16_t screen_height = prim.m_quad_height; uint16_t screen_height = prim.m_quad_height;
uint32_t rotation_type = uint32_t rotation_type =

View File

@ -2431,7 +2431,7 @@ void uniform::update()
} }
case CU_SCREEN_COUNT: case CU_SCREEN_COUNT:
{ {
int screen_count = win->target()->current_view().screen_count(); int screen_count = win->target()->current_view().visible_screen_count();
m_shader->set_int("ScreenCount", screen_count); m_shader->set_int("ScreenCount", screen_count);
break; break;
} }