diff options
Diffstat (limited to 'src/osd/modules/render/drawbgfx.cpp')
| -rw-r--r-- | src/osd/modules/render/drawbgfx.cpp | 227 |
1 files changed, 145 insertions, 82 deletions
diff --git a/src/osd/modules/render/drawbgfx.cpp b/src/osd/modules/render/drawbgfx.cpp index ab1985a6898..d955f8c76f2 100644 --- a/src/osd/modules/render/drawbgfx.cpp +++ b/src/osd/modules/render/drawbgfx.cpp @@ -61,6 +61,7 @@ const char* renderer_bgfx::WINDOW_PREFIX = "Window 0, "; //============================================================ #define GIBBERISH (0) +#define SCENE_VIEW (0) //============================================================ // STATICS @@ -300,8 +301,13 @@ void renderer_bgfx::put_packed_quad(render_primitive *prim, UINT32 hash, ScreenV v0 += 0.5f / float(CACHE_SIZE); UINT32 rgba = u32Color(prim->color.r * 255, prim->color.g * 255, prim->color.b * 255, prim->color.a * 255); - float x[4] = { prim->bounds.x0, prim->bounds.x1, prim->bounds.x0, prim->bounds.x1 }; - float y[4] = { prim->bounds.y0, prim->bounds.y0, prim->bounds.y1, prim->bounds.y1 }; + const float x0 = prim->bounds.x0; + const float x1 = prim->bounds.x1; + const float y0 = prim->bounds.y0; + const float y1 = prim->bounds.y1; + + float x[4] = { x0, x1, x0, x1 }; + float y[4] = { y0, y0, y1, y1 }; float u[4] = { u0, u1, u0, u1 }; float v[4] = { v0, v0, v1, v1 }; @@ -406,28 +412,6 @@ void renderer_bgfx::render_post_screen_quad(int view, render_primitive* prim, bg float u[4] = { prim->texcoords.tl.u, prim->texcoords.tr.u, prim->texcoords.bl.u, prim->texcoords.br.u }; float v[4] = { prim->texcoords.tl.v, prim->texcoords.tr.v, prim->texcoords.bl.v, prim->texcoords.br.v }; - if (false)//PRIMFLAG_GET_TEXORIENT(prim->flags) & ORIENTATION_SWAP_XY) - { - std::swap(u[1], u[2]); - std::swap(v[1], v[2]); - } - - if (false)//PRIMFLAG_GET_TEXORIENT(prim->flags) & ORIENTATION_FLIP_X) - { - std::swap(u[0], u[1]); - std::swap(v[0], v[1]); - std::swap(u[2], u[3]); - std::swap(v[2], v[3]); - } - - if (false)//PRIMFLAG_GET_TEXORIENT(prim->flags) & ORIENTATION_FLIP_Y) - { - std::swap(u[0], u[2]); - std::swap(v[0], v[2]); - std::swap(u[1], u[3]); - std::swap(v[1], v[3]); - } - vertex[0].m_x = x[0]; vertex[0].m_y = y[0]; vertex[0].m_z = 0; @@ -476,7 +460,7 @@ void renderer_bgfx::render_post_screen_quad(int view, render_primitive* prim, bg m_screen_effect[blend]->submit(view); } -void renderer_bgfx::render_textured_quad(int view, render_primitive* prim, bgfx::TransientVertexBuffer* buffer) +void renderer_bgfx::render_textured_quad(render_primitive* prim, bgfx::TransientVertexBuffer* buffer) { ScreenVertex* vertex = reinterpret_cast<ScreenVertex*>(buffer->data); @@ -543,7 +527,7 @@ void renderer_bgfx::render_textured_quad(int view, render_primitive* prim, bgfx: UINT32 blend = PRIMFLAG_GET_BLENDMODE(prim->flags); bgfx::setVertexBuffer(buffer); bgfx::setTexture(0, effects[blend]->uniform("s_tex")->handle(), texture); - effects[blend]->submit(view); + effects[blend]->submit(m_ui_view); bgfx::destroyTexture(texture); } @@ -843,63 +827,29 @@ int renderer_bgfx::draw(int update) s_current_view = 0; } - handle_screen_chains(); - int view_index = s_current_view; + m_ui_view = -1; // Set view 0 default viewport. osd_dim wdim = window().get_size(); m_width[window_index] = wdim.width(); m_height[window_index] = wdim.height(); - if (window_index == 0) + handle_screen_chains(); + + bool skip_frame = update_dimensions(); + if (skip_frame) { - if ((m_dimensions != osd_dim(m_width[window_index], m_height[window_index]))) - { - bgfx::reset(m_width[window_index], m_height[window_index], video_config.waitvsync ? BGFX_RESET_VSYNC : BGFX_RESET_NONE); - m_dimensions = osd_dim(m_width[window_index], m_height[window_index]); - } + return 0; } - else - { - if ((m_dimensions != osd_dim(m_width[window_index], m_height[window_index]))) - { - bgfx::reset(window().m_main->get_size().width(), window().m_main->get_size().height(), video_config.waitvsync ? BGFX_RESET_VSYNC : BGFX_RESET_NONE); - delete m_framebuffer; -#ifdef OSD_WINDOWS - m_framebuffer = m_targets->create_backbuffer(window().m_hwnd, m_width[window_index], m_height[window_index]); -#else - m_framebuffer = m_targets->create_backbuffer(sdlNativeWindowHandle(window().sdl_window()), m_width[window_index], m_height[window_index]); -#endif - bgfx::setViewFrameBuffer(view_index, m_framebuffer->target()); - m_dimensions = osd_dim(m_width[window_index], m_height[window_index]); - bgfx::setViewClear(view_index - , BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH - , 0x00ff00ff - , 1.0f - , 0 - ); - bgfx::touch(view_index); - bgfx::frame(); - return 0; - } - bgfx::setViewFrameBuffer(view_index, m_framebuffer->target()); + if (s_current_view > m_max_view) + { + m_max_view = s_current_view; + } + else + { + s_current_view = m_max_view; } - - bgfx::setViewSeq(view_index, true); - bgfx::setViewRect(view_index, 0, 0, m_width[window_index], m_height[window_index]); - - // Setup view transform. - float proj[16]; - bx::mtxOrtho(proj, 0.0f, m_width[window_index], m_height[window_index], 0.0f, 0.0f, 100.0f); - bgfx::setViewTransform(view_index, nullptr, proj); - - bgfx::setViewClear(view_index - , BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH - , 0x000000ff - , 1.0f - , 0 - ); window().m_primlist->acquire_lock(); @@ -915,7 +865,7 @@ int renderer_bgfx::draw(int update) bgfx::TransientVertexBuffer buffer; allocate_buffer(prim, blend, &buffer); - int32_t screen = 0; + int32_t screen = -1; if (PRIMFLAG_GET_SCREENTEX(prim->flags)) { for (screen = 0; screen < screens.size(); screen++) @@ -931,13 +881,13 @@ int renderer_bgfx::draw(int update) } } - buffer_status status = buffer_primitives(view_index, atlas_valid, &prim, &buffer, screen); + buffer_status status = buffer_primitives(atlas_valid, &prim, &buffer, screen); if (status != BUFFER_EMPTY && status != BUFFER_SCREEN) { bgfx::setVertexBuffer(&buffer); bgfx::setTexture(0, m_gui_effect[blend]->uniform("s_tex")->handle(), m_texture_cache->texture()); - m_gui_effect[blend]->submit(view_index); + m_gui_effect[blend]->submit(m_ui_view); } if (status != BUFFER_DONE && status != BUFFER_PRE_FLUSH) @@ -950,7 +900,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(view_index); + bgfx::touch(s_current_view > 0 ? s_current_view - 1 : 0); // Advance to next frame. Rendering thread will be kicked to // process submitted rendering primitives. @@ -959,12 +909,113 @@ int renderer_bgfx::draw(int update) bgfx::frame(); } - s_current_view++; - return 0; } -renderer_bgfx::buffer_status renderer_bgfx::buffer_primitives(int view, bool atlas_valid, render_primitive** prim, bgfx::TransientVertexBuffer* buffer, int32_t screen) +bool renderer_bgfx::update_dimensions() +{ + const uint32_t window_index = window().m_index; + const uint32_t width = m_width[window_index]; + const uint32_t height = m_height[window_index]; + + if (window_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); + m_dimensions = osd_dim(width, height); + + delete m_framebuffer; +#ifdef OSD_WINDOWS + m_framebuffer = m_targets->create_backbuffer(window().m_hwnd, width, height); +#else + m_framebuffer = m_targets->create_backbuffer(sdlNativeWindowHandle(window().sdl_window()), width, height); +#endif + + bgfx::setViewFrameBuffer(s_current_view, m_framebuffer->target()); + bgfx::setViewClear(s_current_view, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH, 0x000000ff, 1.0f, 0); + bgfx::touch(s_current_view); + bgfx::frame(); + return true; + } + } + return false; +} + +void renderer_bgfx::setup_view(uint32_t view_index, bool screen) +{ + const uint32_t window_index = window().m_index; + const uint32_t width = m_width[window_index]; + const uint32_t height = m_height[window_index]; + + if (window_index != 0) + { + bgfx::setViewFrameBuffer(view_index, m_framebuffer->target()); + } + + bgfx::setViewSeq(view_index, true); + bgfx::setViewRect(view_index, 0, 0, width, height); + +#if SCENE_VIEW + if (view_index == m_max_view) +#endif + { + bgfx::setViewClear(view_index, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH, 0x00000000, 1.0f, 0); + } + + setup_matrices(view_index, screen); +} + +void renderer_bgfx::setup_matrices(uint32_t view_index, bool screen) +{ + const uint32_t window_index = window().m_index; + const uint32_t width = m_width[window_index]; + const uint32_t height = m_height[window_index]; + + float proj[16]; + float view[16]; + if (screen) + { + static float offset = 0.0f; + offset += 0.5f; + float up[3] = { 0.0f, -1.0f, 0.0f }; + float cam_z = width * 0.5f * (float(height) / float(width)); + cam_z *= 1.05f; + float eye_height = height * 0.5f * 1.05f; + float at[3] = { width * 0.5f, height * 0.5f, 0.0f }; + float eye[3] = { width * 0.5f, eye_height, cam_z }; + bx::mtxLookAt(view, eye, at, up); + + bx::mtxProj(proj, 90.0f, float(width) / float(height), 0.1f, 5000.0f); + } + else + { + bx::mtxIdentity(view); + bx::mtxOrtho(proj, 0.0f, width, height, 0.0f, 0.0f, 100.0f); + } + + bgfx::setViewTransform(view_index, view, proj); +} + +void renderer_bgfx::init_ui_view() +{ + if (m_ui_view < 0) + { + m_ui_view = s_current_view; + setup_view(m_ui_view, false); + s_current_view++; + } +} + +renderer_bgfx::buffer_status renderer_bgfx::buffer_primitives(bool atlas_valid, render_primitive** prim, bgfx::TransientVertexBuffer* buffer, int32_t screen) { int vertices = 0; @@ -974,6 +1025,7 @@ renderer_bgfx::buffer_status renderer_bgfx::buffer_primitives(int view, bool atl switch ((*prim)->type) { case render_primitive::LINE: + init_ui_view(); put_line((*prim)->bounds.x0, (*prim)->bounds.y0, (*prim)->bounds.x1, (*prim)->bounds.y1, 1.0f, u32Color((*prim)->color.r * 255, (*prim)->color.g * 255, (*prim)->color.b * 255, (*prim)->color.a * 255), (ScreenVertex*)buffer->data + vertices, 1.0f); vertices += 30; break; @@ -981,6 +1033,7 @@ renderer_bgfx::buffer_status renderer_bgfx::buffer_primitives(int view, bool atl case render_primitive::QUAD: if ((*prim)->texture.base == nullptr) { + init_ui_view(); put_packed_quad(*prim, WHITE_HASH, (ScreenVertex*)buffer->data + vertices); vertices += 6; } @@ -989,6 +1042,7 @@ renderer_bgfx::buffer_status renderer_bgfx::buffer_primitives(int view, bool atl const UINT32 hash = get_texture_hash(*prim); if (atlas_valid && (*prim)->packable(PACKABLE_SIZE) && hash != 0 && m_hash_to_entry[hash].hash()) { + init_ui_view(); put_packed_quad(*prim, hash, (ScreenVertex*)buffer->data + vertices); vertices += 6; } @@ -1001,12 +1055,21 @@ renderer_bgfx::buffer_status renderer_bgfx::buffer_primitives(int view, bool atl if (PRIMFLAG_GET_SCREENTEX((*prim)->flags) && m_screen_chains.size() > window().m_index && screen < m_screen_chains[window().m_index].size()) { - render_post_screen_quad(view, *prim, buffer, screen); +#if SCENE_VIEW + setup_view(s_current_view, true); + render_post_screen_quad(s_current_view, *prim, buffer, screen); + s_current_view++; + m_ui_view = -1; +#else + init_ui_view(); + render_post_screen_quad(m_ui_view, *prim, buffer, screen); +#endif return BUFFER_SCREEN; } else { - render_textured_quad(view, *prim, buffer); + init_ui_view(); + render_textured_quad(*prim, buffer); return BUFFER_EMPTY; } } |
