summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/screen.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/screen.cpp')
-rw-r--r--src/emu/screen.cpp49
1 files changed, 43 insertions, 6 deletions
diff --git a/src/emu/screen.cpp b/src/emu/screen.cpp
index 8b4bcfa0cff..63004cc4978 100644
--- a/src/emu/screen.cpp
+++ b/src/emu/screen.cpp
@@ -558,7 +558,8 @@ screen_device::screen_device(const machine_config &mconfig, const char *tag, dev
m_xscale(1.0f),
m_yscale(1.0f),
m_screen_vblank(*this),
- m_palette(*this, finder_base::DUMMY_TAG),
+ m_palette(nullptr),
+ m_palette_tag(nullptr),
m_video_attributes(0),
m_svg_region(nullptr),
m_container(nullptr),
@@ -727,7 +728,7 @@ void screen_device::static_set_screen_update(device_t &device, screen_update_rgb
void screen_device::static_set_palette(device_t &device, const char *tag)
{
- downcast<screen_device &>(device).m_palette.set_tag(tag);
+ downcast<screen_device &>(device).m_palette_tag = tag;
}
@@ -785,10 +786,23 @@ void screen_device::device_validity_check(validity_checker &valid) const
osd_printf_error("Invalid (zero) refresh rate\n");
texture_format texformat = !m_screen_update_ind16.isnull() ? TEXFORMAT_PALETTE16 : TEXFORMAT_RGB32;
- if (m_palette == nullptr && texformat == TEXFORMAT_PALETTE16)
+ if (m_palette_tag != nullptr)
+ {
+ if (texformat == TEXFORMAT_RGB32)
+ osd_printf_warning("Screen does not need palette defined\n");
+
+ device_t *paldev = owner()->subdevice(m_palette_tag);
+ if (paldev == nullptr)
+ osd_printf_error("Nonexistent device '%s' specified as palette\n", m_palette_tag);
+ else
+ {
+ device_palette_interface *palintf;
+ if (!paldev->interface(palintf))
+ osd_printf_error("Device '%s' specified as palette, but it has no palette interface\n", m_palette_tag);
+ }
+ }
+ else if (texformat == TEXFORMAT_PALETTE16)
osd_printf_error("Screen does not have palette defined\n");
- if (m_palette != nullptr && texformat == TEXFORMAT_RGB32)
- osd_printf_warning("Screen does not need palette defined\n");
}
@@ -821,7 +835,8 @@ void screen_device::device_start()
m_screen_vblank.resolve_safe();
// if we have a palette and it's not started, wait for it
- if (m_palette != nullptr && !m_palette->started())
+ resolve_palette();
+ if (m_palette != nullptr && !m_palette->device().started())
throw device_missing_dependencies();
// configure bitmap formats and allocate screen bitmaps
@@ -1470,6 +1485,28 @@ void screen_device::register_screen_bitmap(bitmap_t &bitmap)
//-------------------------------------------------
+// resolve_palette - find the specified palette
+//-------------------------------------------------
+
+void screen_device::resolve_palette()
+{
+ if (m_palette_tag != nullptr && m_palette == nullptr)
+ {
+ // find our palette as a sibling device
+ device_t *palette = owner()->subdevice(m_palette_tag);
+ if (palette == nullptr)
+ fatalerror("Screen '%s' specifies nonexistent device '%s' as palette\n",
+ tag(),
+ m_palette_tag);
+ if (!palette->interface(m_palette))
+ fatalerror("Screen '%s' specifies device '%s' as palette, but it has no palette interface\n",
+ tag(),
+ m_palette_tag);
+ }
+}
+
+
+//-------------------------------------------------
// vblank_begin - call any external callbacks to
// signal the VBLANK period has begun
//-------------------------------------------------