diff options
Diffstat (limited to 'src/osd/modules/render/drawbgfx.cpp')
-rw-r--r-- | src/osd/modules/render/drawbgfx.cpp | 94 |
1 files changed, 65 insertions, 29 deletions
diff --git a/src/osd/modules/render/drawbgfx.cpp b/src/osd/modules/render/drawbgfx.cpp index 11801fd800d..d42f4739d26 100644 --- a/src/osd/modules/render/drawbgfx.cpp +++ b/src/osd/modules/render/drawbgfx.cpp @@ -90,6 +90,7 @@ uint32_t renderer_bgfx::s_current_view = 0; bool renderer_bgfx::s_bgfx_library_initialized = false; uint32_t renderer_bgfx::s_width[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; uint32_t renderer_bgfx::s_height[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; +uint32_t renderer_bgfx::s_max_texture_size = 16384; // Relatively safe default on modern GPUs //============================================================ // renderer_bgfx - constructor @@ -108,6 +109,8 @@ renderer_bgfx::renderer_bgfx(std::shared_ptr<osd_window> w) , m_chains(nullptr) , m_ortho_view(nullptr) , m_max_view(0) + , m_view_width(1) + , m_view_height(1) , m_avi_view(nullptr) , m_avi_writer(nullptr) , m_avi_target(nullptr) @@ -207,6 +210,9 @@ void renderer_bgfx::init_bgfx_library() bool bgfx_debug = m_options.bgfx_debug(); bgfx::setDebug(bgfx_debug ? BGFX_DEBUG_STATS : BGFX_DEBUG_TEXT); + const bgfx::Caps* caps = bgfx::getCaps(); + s_max_texture_size = caps->limits.maxTextureSize; + ScreenVertex::init(); imguiCreate(); @@ -297,8 +303,10 @@ int renderer_bgfx::create() { std::shared_ptr<osd_window> win = assert_window(); osd_dim wdim = win->get_size(); - s_width[win->index()] = wdim.width(); - s_height[win->index()] = wdim.height(); + const uint32_t width = wdim.width(); + const uint32_t height = wdim.height(); + s_width[win->index()] = width; + s_height[win->index()] = height; m_dimensions = wdim; if (s_bgfx_library_initialized) @@ -350,11 +358,12 @@ int renderer_bgfx::create() m_ortho_view->set_backbuffer(m_framebuffer); } - m_chains = new chain_manager(win->machine(), m_options, *m_textures, *m_targets, *m_effects, win->index(), *this); + const uint32_t max_prescale_size = std::min(2u * std::max(width, height), s_max_texture_size); + m_chains = new chain_manager(win->machine(), m_options, *m_textures, *m_targets, *m_effects, win->index(), *this, win->prescale(), max_prescale_size); m_sliders_dirty = true; uint32_t flags = BGFX_SAMPLER_U_CLAMP | BGFX_SAMPLER_V_CLAMP | BGFX_SAMPLER_MIN_POINT | BGFX_SAMPLER_MAG_POINT | BGFX_SAMPLER_MIP_POINT; - m_texture_cache = m_textures->create_texture("#cache", bgfx::TextureFormat::BGRA8, CACHE_SIZE, CACHE_SIZE, nullptr, flags); + m_texture_cache = m_textures->create_texture("#cache", bgfx::TextureFormat::BGRA8, CACHE_SIZE, 0, CACHE_SIZE, nullptr, flags); memset(m_white, 0xff, sizeof(uint32_t) * 16 * 16); m_texinfo.push_back(rectangle_packer::packable_rectangle(WHITE_HASH, PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32), 16, 16, 16, nullptr, m_white)); @@ -402,7 +411,7 @@ void renderer_bgfx::record() else { m_avi_writer->record(m_options.bgfx_avi_name()); - m_avi_target = m_targets->create_target("avibuffer", bgfx::TextureFormat::BGRA8, s_width[0], s_height[0], TARGET_STYLE_CUSTOM, false, true, 1, 0); + m_avi_target = m_targets->create_target("avibuffer", bgfx::TextureFormat::BGRA8, s_width[0], s_height[0], 1, 1, TARGET_STYLE_CUSTOM, false, true, 1, 0); m_avi_texture = bgfx::createTexture2D(s_width[0], s_height[0], false, 1, bgfx::TextureFormat::BGRA8, BGFX_TEXTURE_BLIT_DST | BGFX_TEXTURE_READ_BACK); if (m_avi_view == nullptr) @@ -491,15 +500,6 @@ void renderer_bgfx::put_packed_quad(render_primitive *prim, uint32_t hash, Scree float u[4] = { u0, u1, u0, u1 }; float v[4] = { v0, v0, v1, v1 }; - if (bgfx::getRendererType() == bgfx::RendererType::Direct3D9) - { - for (int i = 0; i < 4; i++) - { - u[i] += 0.5f / size; - v[i] += 0.5f / size; - } - } - if (PRIMFLAG_GET_TEXORIENT(prim->flags) & ORIENTATION_SWAP_XY) { std::swap(u[1], u[2]); @@ -540,7 +540,7 @@ void renderer_bgfx::vertex(ScreenVertex* vertex, float x, float y, float z, uint vertex->m_v = v; } -void renderer_bgfx::render_post_screen_quad(int view, render_primitive* prim, bgfx::TransientVertexBuffer* buffer, int32_t screen) +void renderer_bgfx::render_post_screen_quad(int view, render_primitive* prim, bgfx::TransientVertexBuffer* buffer, int32_t screen, int window_index) { auto* vertices = reinterpret_cast<ScreenVertex*>(buffer->data); @@ -565,6 +565,15 @@ void renderer_bgfx::render_post_screen_quad(int view, render_primitive* prim, bg uint32_t blend = PRIMFLAG_GET_BLENDMODE(prim->flags); bgfx::setVertexBuffer(0,buffer); bgfx::setTexture(0, m_screen_effect[blend]->uniform("s_tex")->handle(), m_targets->target(screen, "output")->texture(), texture_flags); + + bgfx_uniform* inv_view_dims = m_screen_effect[blend]->uniform("u_inv_view_dims"); + if (inv_view_dims) + { + float values[2] = { -1.0f / s_width[window_index], 1.0f / s_height[window_index] }; + inv_view_dims->set(values, sizeof(float) * 2); + inv_view_dims->upload(); + } + m_screen_effect[blend]->submit(m_ortho_view->get_index()); } @@ -574,7 +583,7 @@ void renderer_bgfx::render_avi_quad() m_avi_view->setup(); bgfx::setViewRect(s_current_view, 0, 0, s_width[0], s_height[0]); - bgfx::setViewClear(s_current_view, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH, 0x00000000, 1.0f, 0); + bgfx::setViewClear(s_current_view, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH, 0x000000ff, 1.0f, 0); bgfx::TransientVertexBuffer buffer; bgfx::allocTransientVertexBuffer(&buffer, 6, ScreenVertex::ms_decl); @@ -595,11 +604,21 @@ void renderer_bgfx::render_avi_quad() bgfx::setVertexBuffer(0,&buffer); bgfx::setTexture(0, m_gui_effect[PRIMFLAG_GET_BLENDMODE(BLENDMODE_NONE)]->uniform("s_tex")->handle(), m_avi_target->texture()); - m_gui_effect[PRIMFLAG_GET_BLENDMODE(BLENDMODE_NONE)]->submit(s_current_view); + + bgfx_effect* effect = m_gui_effect[PRIMFLAG_GET_BLENDMODE(BLENDMODE_NONE)]; + bgfx_uniform* inv_view_dims = effect->uniform("u_inv_view_dims"); + if (inv_view_dims) + { + float values[2] = { -1.0f / s_width[0], 1.0f / s_height[0] }; + inv_view_dims->set(values, sizeof(float) * 2); + inv_view_dims->upload(); + } + + effect->submit(s_current_view); s_current_view++; } -void renderer_bgfx::render_textured_quad(render_primitive* prim, bgfx::TransientVertexBuffer* buffer) +void renderer_bgfx::render_textured_quad(render_primitive* prim, bgfx::TransientVertexBuffer* buffer, int window_index) { auto* vertices = reinterpret_cast<ScreenVertex*>(buffer->data); uint32_t rgba = u32Color(prim->color.r * 255, prim->color.g * 255, prim->color.b * 255, prim->color.a * 255); @@ -636,7 +655,7 @@ void renderer_bgfx::render_textured_quad(render_primitive* prim, bgfx::Transient else { texture = m_textures->create_or_update_mame_texture(prim->flags & PRIMFLAG_TEXFORMAT_MASK - , tex_width, tex_height, prim->texture.rowpixels, prim->texture.palette, prim->texture.base, prim->texture.seqid + , tex_width, prim->texture.width_margin, tex_height, prim->texture.rowpixels, prim->texture.palette, prim->texture.base, prim->texture.seqid , texture_flags, prim->texture.unique_id, prim->texture.old_id); } @@ -645,6 +664,15 @@ void renderer_bgfx::render_textured_quad(render_primitive* prim, bgfx::Transient uint32_t blend = PRIMFLAG_GET_BLENDMODE(prim->flags); bgfx::setVertexBuffer(0,buffer); bgfx::setTexture(0, effects[blend]->uniform("s_tex")->handle(), texture); + + bgfx_uniform* inv_view_dims = effects[blend]->uniform("u_inv_view_dims"); + if (inv_view_dims) + { + float values[2] = { -1.0f / s_width[window_index], 1.0f / s_height[window_index] }; + inv_view_dims->set(values, sizeof(float) * 2); + inv_view_dims->upload(); + } + effects[blend]->submit(m_ortho_view->get_index()); if (is_screen) @@ -950,12 +978,21 @@ int renderer_bgfx::draw(int update) } } - buffer_status status = buffer_primitives(atlas_valid, &prim, &buffer, screen); + buffer_status status = buffer_primitives(atlas_valid, &prim, &buffer, screen, window_index); if (status != BUFFER_EMPTY && status != BUFFER_SCREEN) { - bgfx::setVertexBuffer(0,&buffer); + bgfx::setVertexBuffer(0, &buffer); bgfx::setTexture(0, m_gui_effect[blend]->uniform("s_tex")->handle(), m_texture_cache->texture()); + + bgfx_uniform* inv_view_dims = m_gui_effect[blend]->uniform("u_inv_view_dims"); + if (inv_view_dims) + { + float values[2] = { -1.0f / s_width[window_index], 1.0f / s_height[window_index] }; + inv_view_dims->set(values, sizeof(float) * 2); + inv_view_dims->upload(); + } + m_gui_effect[blend]->submit(m_ortho_view->get_index()); } @@ -1050,7 +1087,7 @@ bool renderer_bgfx::update_dimensions() bgfx::setViewFrameBuffer(s_current_view, m_framebuffer->target()); } - bgfx::setViewClear(s_current_view, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH, 0x00000000, 1.0f, 0); + bgfx::setViewClear(s_current_view, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH, 0x000000ff, 1.0f, 0); bgfx::setViewMode(s_current_view, bgfx::ViewMode::Sequential); bgfx::touch(s_current_view); bgfx::frame(); @@ -1098,7 +1135,7 @@ render_primitive_list *renderer_bgfx::get_primitives() return &win->target()->get_primitives(); } -renderer_bgfx::buffer_status renderer_bgfx::buffer_primitives(bool atlas_valid, render_primitive** prim, bgfx::TransientVertexBuffer* buffer, int32_t screen) +renderer_bgfx::buffer_status renderer_bgfx::buffer_primitives(bool atlas_valid, render_primitive** prim, bgfx::TransientVertexBuffer* buffer, int32_t screen, int window_index) { int vertices = 0; @@ -1140,18 +1177,18 @@ renderer_bgfx::buffer_status renderer_bgfx::buffer_primitives(bool atlas_valid, { #if SCENE_VIEW setup_view(s_current_view, true); - render_post_screen_quad(s_current_view, *prim, buffer, screen); + render_post_screen_quad(s_current_view, *prim, buffer, screen, window_index); s_current_view++; #else setup_ortho_view(); - render_post_screen_quad(m_ortho_view->get_index(), *prim, buffer, screen); + render_post_screen_quad(m_ortho_view->get_index(), *prim, buffer, screen, window_index); #endif return BUFFER_SCREEN; } else { setup_ortho_view(); - render_textured_quad(*prim, buffer); + render_textured_quad(*prim, buffer, window_index); return BUFFER_EMPTY; } } @@ -1232,7 +1269,7 @@ void renderer_bgfx::process_atlas_packs(std::vector<std::vector<rectangle_packer uint16_t pitch = rect.width(); int width_div_factor = 1; int width_mul_factor = 1; - const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgfx_texture_data(dst_format, rect.format(), rect.rowpixels(), rect.height(), rect.palette(), rect.base(), pitch, width_div_factor, width_mul_factor); + const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgfx_texture_data(dst_format, rect.format(), rect.rowpixels(), 0, rect.height(), rect.palette(), rect.base(), pitch, width_div_factor, width_mul_factor); bgfx::updateTexture2D(m_texture_cache->texture(), 0, 0, rect.x(), rect.y(), (rect.width() * width_mul_factor) / width_div_factor, rect.height(), mem, pitch); } } @@ -1285,8 +1322,7 @@ bool renderer_bgfx::check_for_dirty_atlas() atlas_dirty = true; m_texinfo.push_back(rectangle_packer::packable_rectangle(hash, prim.flags & PRIMFLAG_TEXFORMAT_MASK, - prim.texture.width, prim.texture.height, - prim.texture.rowpixels, prim.texture.palette, prim.texture.base)); + prim.texture.width, prim.texture.height, prim.texture.rowpixels, prim.texture.palette, prim.texture.base)); acquired_infos[hash] = m_texinfo[m_texinfo.size() - 1]; } } |