summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/osdwindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/modules/osdwindow.cpp')
-rw-r--r--src/osd/modules/osdwindow.cpp162
1 files changed, 122 insertions, 40 deletions
diff --git a/src/osd/modules/osdwindow.cpp b/src/osd/modules/osdwindow.cpp
index 64b6528f5f3..38b86e652e0 100644
--- a/src/osd/modules/osdwindow.cpp
+++ b/src/osd/modules/osdwindow.cpp
@@ -9,50 +9,132 @@
#include "emu.h"
#include "osdwindow.h"
-#include "render/drawnone.h"
-#include "render/drawbgfx.h"
-#if (USE_OPENGL)
-#include "render/drawogl.h"
-#endif
-#if defined(OSD_WINDOWS)
-#include "render/drawgdi.h"
-#include "render/drawd3d.h"
-#elif defined(OSD_SDL)
-#include "render/draw13.h"
-#include "render/drawsdl.h"
-#endif
+// osd/modules
+#include "lib/osdobj_common.h"
+#include "monitor/monitor_module.h"
+#include "render/render_module.h"
+
+// emu
+#include "main.h"
+#include "render.h"
+
+
+osd_window::osd_window(
+ running_machine &machine,
+ render_module &renderprovider,
+ int index,
+ const std::shared_ptr<osd_monitor_info> &monitor,
+ const osd_window_config &config) :
+ m_target(nullptr),
+ m_primlist(nullptr),
+ m_win_config(config),
+ m_index(index),
+ m_fullscreen(false),
+ m_prescale(1),
+ m_machine(machine),
+ m_renderprovider(renderprovider),
+ m_monitor(std::move(monitor)),
+ m_renderer(nullptr),
+ m_title(
+ util::string_format(
+ (video_config.numscreens > 1)
+ ? "%3$s [%4$s] screen %5$d - %1$s %2$s (%6$s%7$sP%8$d)"
+ : "%3$s [%4$s] - %1$s %2$s (%6$s%7$sP%8$d)",
+ emulator_info::get_appname(),
+ emulator_info::get_bare_build_version(),
+ machine.system().type.fullname(),
+ machine.system().name,
+ index,
+ (sizeof(int) == sizeof(void *)) ? "I" : "",
+ (sizeof(long) == sizeof(void *)) ? "L" : (sizeof(long long) == sizeof(void *)) ? "LL" : "",
+ sizeof(void *) * 8))
+{
+}
+
+osd_window::~osd_window()
+{
+}
float osd_window::pixel_aspect() const
{
return monitor()->pixel_aspect();
}
-std::unique_ptr<osd_renderer> osd_renderer::make_for_type(int mode, std::shared_ptr<osd_window> window, int extra_flags)
-{
- switch(mode)
- {
-#if defined(OSD_WINDOWS) || defined(OSD_UWP)
- case VIDEO_MODE_NONE:
- return std::make_unique<renderer_none>(window);
-#endif
- case VIDEO_MODE_BGFX:
- return std::make_unique<renderer_bgfx>(window);
-#if (USE_OPENGL)
- case VIDEO_MODE_OPENGL:
- return std::make_unique<renderer_ogl>(window);
-#endif
-#if defined(OSD_WINDOWS)
- case VIDEO_MODE_GDI:
- return std::make_unique<renderer_gdi>(window);
- case VIDEO_MODE_D3D:
- return std::make_unique<renderer_d3d9>(window);
-#elif defined(OSD_SDL)
- case VIDEO_MODE_SDL2ACCEL:
- return std::make_unique<renderer_sdl2>(window, extra_flags);
- case VIDEO_MODE_SOFT:
- return std::make_unique<renderer_sdl1>(window, extra_flags);
-#endif
- default:
- return nullptr;
- }
+bool osd_window::swap_xy() const
+{
+ bool orientation_swap_xy =
+ (machine().system().flags & ORIENTATION_SWAP_XY) == ORIENTATION_SWAP_XY;
+ bool rotation_swap_xy =
+ (target()->orientation() & ORIENTATION_SWAP_XY) == ORIENTATION_SWAP_XY;
+ return orientation_swap_xy ^ rotation_swap_xy;
+};
+
+bool osd_window::keepaspect() const
+{
+ if (m_target != nullptr)
+ return m_target->keepaspect();
+ else
+ return false;
+}
+
+std::shared_ptr<osd_monitor_info> osd_window::monitor_from_rect(const osd_rect *proposed) const
+{
+ std::shared_ptr<osd_monitor_info> monitor;
+
+ if (fullscreen() || !m_monitor) // in full screen, just use the configured monitor
+ monitor = m_monitor;
+ else if (proposed) // in window mode, find the nearest
+ monitor = m_monitor->module().monitor_from_rect(*proposed);
+ else
+ monitor = m_monitor->module().monitor_from_window(*this);
+
+ return monitor;
+}
+
+void osd_window::create_target()
+{
+ // load the layout
+ m_target = m_machine.render().target_alloc();
+
+ // set the specific view
+ osd_options &options = downcast<osd_options &>(m_machine.options());
+ set_starting_view(m_index, options.view(), options.view(m_index));
+}
+
+bool osd_window::renderer_interactive() const
+{
+ return m_renderprovider.is_interactive();
+}
+
+bool osd_window::renderer_sdl_needs_opengl() const
+{
+ return m_renderprovider.sdl_needs_opengl();
+}
+
+void osd_window::renderer_create()
+{
+ m_renderer = m_renderprovider.create(*this);
+}
+
+void osd_window::set_starting_view(int index, const char *defview, const char *view)
+{
+ // choose non-auto over auto
+ if ((!*view || !strcmp(view, "auto")) && (*defview && strcmp(defview, "auto")))
+ view = defview;
+
+ // query the video system to help us pick a view
+ int viewindex = m_target->configured_view(view, index, video_config.numscreens);
+
+ // set the view
+ m_target->set_view(viewindex);
+}
+
+void osd_window::destroy()
+{
+ // free the textures etc
+ complete_destroy();
+
+ // free the render target, after the textures!
+ m_machine.render().target_free(m_target);
+ m_target = nullptr;
}