diff options
Diffstat (limited to 'src/osd/modules/render/drawbgfx.cpp')
-rw-r--r-- | src/osd/modules/render/drawbgfx.cpp | 174 |
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; } |