summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/render/drawbgfx.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/modules/render/drawbgfx.cpp')
-rw-r--r--src/osd/modules/render/drawbgfx.cpp174
1 files changed, 100 insertions, 74 deletions
diff --git a/src/osd/modules/render/drawbgfx.cpp b/src/osd/modules/render/drawbgfx.cpp
index 8f0bc447d6e..35a50609cf4 100644
--- a/src/osd/modules/render/drawbgfx.cpp
+++ b/src/osd/modules/render/drawbgfx.cpp
@@ -60,10 +60,8 @@ class renderer_bgfx : public osd_renderer
{
public:
renderer_bgfx(osd_window *w)
- : osd_renderer(w, FLAG_NONE), m_blittimer(0),
- m_blit_dim(0, 0),
- m_last_hofs(0), m_last_vofs(0),
- m_last_blit_time(0), m_last_blit_pixels(0)
+ : osd_renderer(w, FLAG_NONE),
+ m_dimensions(0,0)
{}
virtual int create() override;
@@ -78,41 +76,18 @@ public:
virtual void destroy() override;
virtual render_primitive_list *get_primitives() override
{
-#ifdef OSD_WINDOWS
- RECT client;
- GetClientRect(window().m_hwnd, &client);
- window().target()->set_bounds(rect_width(&client), rect_height(&client), window().aspect());
- return &window().target()->get_primitives();
-#else
osd_dim wdim = window().get_size();
window().target()->set_bounds(wdim.width(), wdim.height(), window().aspect());
return &window().target()->get_primitives();
-#endif
}
- // void render_quad(texture_info *texture, const render_primitive *prim, const int x, const int y);
-
- //texture_info *texture_find(const render_primitive &prim, const quad_setup_data &setup);
- //texture_info *texture_update(const render_primitive &prim);
-
- INT32 m_blittimer;
-
- //simple_list<texture_info> m_texlist; // list of active textures
-
- osd_dim m_blit_dim;
- float m_last_hofs;
- float m_last_vofs;
-
- // Stats
- INT64 m_last_blit_time;
- INT64 m_last_blit_pixels;
-
bgfx::ProgramHandle m_progQuad;
bgfx::ProgramHandle m_progQuadTexture;
bgfx::ProgramHandle m_progLine;
bgfx::UniformHandle m_s_texColor;
-
+ bgfx::FrameBufferHandle fbh;
// Original display_mode
+ osd_dim m_dimensions;
};
@@ -152,39 +127,68 @@ int drawbgfx_init(running_machine &machine, osd_draw_callbacks *callbacks)
static void drawbgfx_exit(void)
{
+ // Shutdown bgfx.
+ bgfx::shutdown();
}
//============================================================
// renderer_bgfx::create
//============================================================
bgfx::ProgramHandle loadProgram(const char* _vsName, const char* _fsName);
+
+
+#ifdef OSD_SDL
+static void* sdlNativeWindowHandle(SDL_Window* _window)
+{
+ SDL_SysWMinfo wmi;
+ SDL_VERSION(&wmi.version);
+ if (!SDL_GetWindowWMInfo(_window, &wmi))
+ {
+ return NULL;
+ }
+
+# if BX_PLATFORM_LINUX || BX_PLATFORM_BSD
+ return (void*)wmi.info.x11.window;
+# elif BX_PLATFORM_OSX
+ return wmi.info.cocoa.window;
+# elif BX_PLATFORM_WINDOWS
+ return wmi.info.win.window;
+# endif // BX_PLATFORM_
+}
+#endif
+
int renderer_bgfx::create()
{
// create renderer
+ osd_dim wdim = window().get_size();
+ if (window().m_index == 0)
+ {
#ifdef OSD_WINDOWS
- RECT client;
- GetClientRect(window().m_hwnd, &client);
-
- bgfx::winSetHwnd(window().m_hwnd);
- bgfx::init();
- bgfx::reset(rect_width(&client), rect_height(&client), video_config.waitvsync ? BGFX_RESET_VSYNC : BGFX_RESET_NONE);
+ bgfx::winSetHwnd(window().m_hwnd);
#else
- osd_dim wdim = window().get_size();
- bgfx::sdlSetWindow(window().sdl_window());
- bgfx::init();
- bgfx::reset(wdim.width(), wdim.height(), video_config.waitvsync ? BGFX_RESET_VSYNC : BGFX_RESET_NONE);
+ bgfx::sdlSetWindow(window().sdl_window());
#endif
-
- // Enable debug text.
- bgfx::setDebug(BGFX_DEBUG_TEXT); //BGFX_DEBUG_STATS
+ bgfx::init();
+ bgfx::reset(wdim.width(), wdim.height(), video_config.waitvsync ? BGFX_RESET_VSYNC : BGFX_RESET_NONE);
+ // Enable debug text.
+ bgfx::setDebug(BGFX_DEBUG_TEXT); //BGFX_DEBUG_STATS
+ m_dimensions = osd_dim(wdim.width(), wdim.height());
+ }
+ else {
+#ifdef OSD_WINDOWS
+ fbh = bgfx::createFrameBuffer(window().m_hwnd, wdim.width(), wdim.height());
+#else
+ fbh = bgfx::createFrameBuffer(sdlNativeWindowHandle(window().sdl_window()), wdim.width(), wdim.height());
+#endif
+ bgfx::touch(window().m_index);
+ }
// Create program from shaders.
m_progQuad = loadProgram("vs_quad", "fs_quad");
m_progQuadTexture = loadProgram("vs_quad_texture", "fs_quad_texture");
m_progLine = loadProgram("vs_line", "fs_line");
m_s_texColor = bgfx::createUniform("s_texColor", bgfx::UniformType::Int1);
- osd_printf_verbose("Leave drawsdl2_window_create\n");
return 0;
}
@@ -194,18 +198,15 @@ int renderer_bgfx::create()
void renderer_bgfx::destroy()
{
- // free the memory in the window
-
- // destroy_all_textures();
- //
+ if (window().m_index > 0)
+ {
+ bgfx::destroyFrameBuffer(fbh);
+ }
bgfx::destroyUniform(m_s_texColor);
// Cleanup.
bgfx::destroyProgram(m_progQuad);
bgfx::destroyProgram(m_progQuadTexture);
bgfx::destroyProgram(m_progLine);
-
- // Shutdown bgfx.
- bgfx::shutdown();
}
@@ -216,11 +217,11 @@ void renderer_bgfx::destroy()
#ifdef OSD_SDL
int renderer_bgfx::xy_to_render_target(int x, int y, int *xt, int *yt)
{
- *xt = x - m_last_hofs;
- *yt = y - m_last_vofs;
- if (*xt<0 || *xt >= m_blit_dim.width())
+ *xt = x;
+ *yt = y;
+ if (*xt<0 || *xt >= m_dimensions.width())
return 0;
- if (*yt<0 || *yt >= m_blit_dim.height())
+ if (*yt<0 || *yt >= m_dimensions.height())
return 0;
return 1;
}
@@ -738,23 +739,48 @@ static inline void copyline_yuy16_to_argb(UINT32 *dst, const UINT16 *src, int wi
}
int renderer_bgfx::draw(int update)
{
- initVertexDecls();
-
+ initVertexDecls();
+ int index = window().m_index;
// Set view 0 default viewport.
- int width, height;
+ osd_dim wdim = window().get_size();
+ int width = wdim.width();
+ int height = wdim.height();
+ if (index == 0)
+ {
+ if ((m_dimensions != osd_dim(width, height))) {
+ bgfx::reset(width, height, video_config.waitvsync ? BGFX_RESET_VSYNC : BGFX_RESET_NONE);
+ m_dimensions = osd_dim(width, height);
+ }
+ }
+ else {
+ if ((m_dimensions != osd_dim(width, height))) {
+ bgfx::reset(window().m_main->get_size().width(), window().m_main->get_size().height(), video_config.waitvsync ? BGFX_RESET_VSYNC : BGFX_RESET_NONE);
+ if (bgfx::isValid(fbh))
+ {
+ bgfx::destroyFrameBuffer(fbh);
+ }
#ifdef OSD_WINDOWS
- RECT client;
- GetClientRect(window().m_hwnd, &client);
- width = rect_width(&client);
- height = rect_height(&client);
+ fbh = bgfx::createFrameBuffer(window().m_hwnd, width, height);
#else
- osd_dim wdim = window().get_size();
- width = wdim.width();
- height = wdim.height();
+ fbh = bgfx::createFrameBuffer(sdlNativeWindowHandle(window().sdl_window()), width, height);
#endif
- bgfx::setViewSeq(0, true);
- bgfx::setViewRect(0, 0, 0, width, height);
- bgfx::reset(width, height, video_config.waitvsync ? BGFX_RESET_VSYNC : BGFX_RESET_NONE);
+ bgfx::setViewFrameBuffer(index, fbh);
+ m_dimensions = osd_dim(width, height);
+ bgfx::setViewClear(index
+ , BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH
+ , 0x000000ff
+ , 1.0f
+ , 0
+ );
+ bgfx::touch(index);
+ bgfx::frame();
+ return 0;
+ }
+ }
+ if (index != 0) bgfx::setViewFrameBuffer(index, fbh);
+ bgfx::setViewSeq(index, true);
+ bgfx::setViewRect(index, 0, 0, width, height);
+
// Setup view transform.
{
float view[16];
@@ -766,9 +792,9 @@ int renderer_bgfx::draw(int update)
float bottom = height;
float proj[16];
bx::mtxOrtho(proj, left, right, bottom, top, 0.0f, 100.0f);
- bgfx::setViewTransform(0, view, proj);
+ bgfx::setViewTransform(index, view, proj);
}
- bgfx::setViewClear(0
+ bgfx::setViewClear(index
, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH
, 0x000000ff
, 1.0f
@@ -777,7 +803,7 @@ int renderer_bgfx::draw(int update)
// This dummy draw call is here to make sure that view 0 is cleared
// if no other draw calls are submitted to view 0.
- bgfx::touch(0);
+ bgfx::touch(index);
window().m_primlist->acquire_lock();
// Draw quad.
@@ -815,7 +841,7 @@ int renderer_bgfx::draw(int update)
u32Color(prim->color.r * 255, prim->color.g * 255, prim->color.b * 255, prim->color.a * 255),
1.0f);
bgfx::setState(flags);
- bgfx::submit(0, m_progLine);
+ bgfx::submit(index, m_progLine);
break;
case render_primitive::QUAD:
@@ -826,7 +852,7 @@ int renderer_bgfx::draw(int update)
screenQuad(prim->bounds.x0, prim->bounds.y0, prim->bounds.x1, prim->bounds.y1,
u32Color(prim->color.r * 255, prim->color.g * 255, prim->color.b * 255, prim->color.a * 255), uv);
bgfx::setState(flags);
- bgfx::submit(0, m_progQuad);
+ bgfx::submit(index, m_progQuad);
}
else {
screenQuad(prim->bounds.x0, prim->bounds.y0, prim->bounds.x1, prim->bounds.y1,
@@ -926,7 +952,7 @@ int renderer_bgfx::draw(int update)
}
bgfx::setTexture(0, m_s_texColor, m_texture);
bgfx::setState(flags);
- bgfx::submit(0, m_progQuadTexture);
+ bgfx::submit(index, m_progQuadTexture);
bgfx::destroyTexture(m_texture);
}
break;
@@ -939,7 +965,7 @@ int renderer_bgfx::draw(int update)
window().m_primlist->release_lock();
// Advance to next frame. Rendering thread will be kicked to
// process submitted rendering primitives.
- bgfx::frame();
+ if (index==0) bgfx::frame();
return 0;
}