summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author MooglyGuy <MooglyGuy@users.noreply.github.com>2021-08-19 19:07:28 +0200
committer GitHub <noreply@github.com>2021-08-20 03:07:28 +1000
commit190f50e0a44d1fecdc7c9e442030cd5fe4ed434f (patch)
tree32032b66f7e8cc1d37db55e8c3bca29b5d48c83e
parent70264c9e45a91393d1adc2be3658cf8ce754ecd4 (diff)
BGFX fixes for various backends (#8469) [Ryan Holtz]
* Fixed palette and UYVY conversion in all backends. Fixes MT07760. * Fixed a typo in targetmanager.cpp, thanks LN for the heads-up.
-rw-r--r--bgfx/effects/misc/blit_palette16.json2
-rw-r--r--bgfx/effects/misc/texconv_palette16.json2
-rw-r--r--bgfx/shaders/dx11/chains/misc/fs_blit_palette16.binbin672 -> 1020 bytes
-rw-r--r--bgfx/shaders/dx11/chains/misc/fs_blit_yuy16.binbin1396 -> 1118 bytes
-rw-r--r--bgfx/shaders/dx9/chains/misc/fs_blit_palette16.binbin481 -> 805 bytes
-rw-r--r--bgfx/shaders/dx9/chains/misc/fs_blit_yuy16.binbin869 -> 771 bytes
-rw-r--r--bgfx/shaders/essl/chains/misc/fs_blit_palette16.binbin445 -> 1063 bytes
-rw-r--r--bgfx/shaders/essl/chains/misc/fs_blit_yuy16.binbin1723 -> 1587 bytes
-rw-r--r--bgfx/shaders/glsl/chains/misc/fs_blit_palette16.binbin422 -> 1000 bytes
-rw-r--r--bgfx/shaders/glsl/chains/misc/fs_blit_yuy16.binbin1645 -> 1520 bytes
-rw-r--r--bgfx/shaders/metal/chains/misc/fs_blit_palette16.binbin958 -> 1476 bytes
-rw-r--r--bgfx/shaders/metal/chains/misc/fs_blit_yuy16.binbin1872 -> 1815 bytes
-rw-r--r--bgfx/shaders/spirv/chains/misc/fs_blit_palette16.binbin1660 -> 2628 bytes
-rw-r--r--bgfx/shaders/spirv/chains/misc/fs_blit_yuy16.binbin2764 -> 2838 bytes
-rw-r--r--src/osd/modules/render/bgfx/chain.cpp2
-rw-r--r--src/osd/modules/render/bgfx/chainmanager.cpp8
-rw-r--r--src/osd/modules/render/bgfx/inputpair.cpp5
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_palette16.sc21
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_yuy16.sc22
-rw-r--r--src/osd/modules/render/bgfx/target.cpp15
-rw-r--r--src/osd/modules/render/bgfx/target.h5
-rw-r--r--src/osd/modules/render/bgfx/targetmanager.cpp22
-rw-r--r--src/osd/modules/render/bgfx/targetreader.cpp2
-rw-r--r--src/osd/modules/render/bgfx/texture.cpp13
-rw-r--r--src/osd/modules/render/bgfx/texture.h8
-rw-r--r--src/osd/modules/render/bgfx/texturehandleprovider.h1
-rw-r--r--src/osd/modules/render/bgfx/texturemanager.cpp19
-rw-r--r--src/osd/modules/render/bgfxutil.cpp24
-rw-r--r--src/osd/modules/render/bgfxutil.h4
-rw-r--r--src/osd/modules/render/copyutil.h115
-rw-r--r--src/osd/modules/render/drawbgfx.cpp23
31 files changed, 233 insertions, 80 deletions
diff --git a/bgfx/effects/misc/blit_palette16.json b/bgfx/effects/misc/blit_palette16.json
index 99d849ddd23..1f1e1747b78 100644
--- a/bgfx/effects/misc/blit_palette16.json
+++ b/bgfx/effects/misc/blit_palette16.json
@@ -118,6 +118,8 @@
"values": [ 1.0 ]
},
{ "name": "s_pal", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_inv_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
{ "name": "u_inv_tex_size1", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
]
} \ No newline at end of file
diff --git a/bgfx/effects/misc/texconv_palette16.json b/bgfx/effects/misc/texconv_palette16.json
index 4fc8e169d0e..57d95e91fce 100644
--- a/bgfx/effects/misc/texconv_palette16.json
+++ b/bgfx/effects/misc/texconv_palette16.json
@@ -21,6 +21,8 @@
"uniforms": [
{ "name": "s_tex", "type": "int", "values": [ 1.0 ] },
{ "name": "s_pal", "type": "int", "values": [ 1.0 ] },
+ { "name": "u_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
+ { "name": "u_inv_tex_size0", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] },
{ "name": "u_inv_tex_size1", "type": "vec4", "values": [ 1.0, 1.0, 0.0, 0.0 ] }
]
} \ No newline at end of file
diff --git a/bgfx/shaders/dx11/chains/misc/fs_blit_palette16.bin b/bgfx/shaders/dx11/chains/misc/fs_blit_palette16.bin
index 3f7949c9e32..c32a68b09a6 100644
--- a/bgfx/shaders/dx11/chains/misc/fs_blit_palette16.bin
+++ b/bgfx/shaders/dx11/chains/misc/fs_blit_palette16.bin
Binary files differ
diff --git a/bgfx/shaders/dx11/chains/misc/fs_blit_yuy16.bin b/bgfx/shaders/dx11/chains/misc/fs_blit_yuy16.bin
index f3e17c242ff..c5c1a04503b 100644
--- a/bgfx/shaders/dx11/chains/misc/fs_blit_yuy16.bin
+++ b/bgfx/shaders/dx11/chains/misc/fs_blit_yuy16.bin
Binary files differ
diff --git a/bgfx/shaders/dx9/chains/misc/fs_blit_palette16.bin b/bgfx/shaders/dx9/chains/misc/fs_blit_palette16.bin
index ea5991e396f..136f81cdd47 100644
--- a/bgfx/shaders/dx9/chains/misc/fs_blit_palette16.bin
+++ b/bgfx/shaders/dx9/chains/misc/fs_blit_palette16.bin
Binary files differ
diff --git a/bgfx/shaders/dx9/chains/misc/fs_blit_yuy16.bin b/bgfx/shaders/dx9/chains/misc/fs_blit_yuy16.bin
index 5f6e1dd1c30..ff4eb14787c 100644
--- a/bgfx/shaders/dx9/chains/misc/fs_blit_yuy16.bin
+++ b/bgfx/shaders/dx9/chains/misc/fs_blit_yuy16.bin
Binary files differ
diff --git a/bgfx/shaders/essl/chains/misc/fs_blit_palette16.bin b/bgfx/shaders/essl/chains/misc/fs_blit_palette16.bin
index e0af67bf014..5ce09d13b32 100644
--- a/bgfx/shaders/essl/chains/misc/fs_blit_palette16.bin
+++ b/bgfx/shaders/essl/chains/misc/fs_blit_palette16.bin
Binary files differ
diff --git a/bgfx/shaders/essl/chains/misc/fs_blit_yuy16.bin b/bgfx/shaders/essl/chains/misc/fs_blit_yuy16.bin
index 6b413551651..9eb3444235e 100644
--- a/bgfx/shaders/essl/chains/misc/fs_blit_yuy16.bin
+++ b/bgfx/shaders/essl/chains/misc/fs_blit_yuy16.bin
Binary files differ
diff --git a/bgfx/shaders/glsl/chains/misc/fs_blit_palette16.bin b/bgfx/shaders/glsl/chains/misc/fs_blit_palette16.bin
index 952107ab982..f9a7910a249 100644
--- a/bgfx/shaders/glsl/chains/misc/fs_blit_palette16.bin
+++ b/bgfx/shaders/glsl/chains/misc/fs_blit_palette16.bin
Binary files differ
diff --git a/bgfx/shaders/glsl/chains/misc/fs_blit_yuy16.bin b/bgfx/shaders/glsl/chains/misc/fs_blit_yuy16.bin
index 27e3b6b515b..f3624bdabb0 100644
--- a/bgfx/shaders/glsl/chains/misc/fs_blit_yuy16.bin
+++ b/bgfx/shaders/glsl/chains/misc/fs_blit_yuy16.bin
Binary files differ
diff --git a/bgfx/shaders/metal/chains/misc/fs_blit_palette16.bin b/bgfx/shaders/metal/chains/misc/fs_blit_palette16.bin
index b08396630f2..b541e7f9cb6 100644
--- a/bgfx/shaders/metal/chains/misc/fs_blit_palette16.bin
+++ b/bgfx/shaders/metal/chains/misc/fs_blit_palette16.bin
Binary files differ
diff --git a/bgfx/shaders/metal/chains/misc/fs_blit_yuy16.bin b/bgfx/shaders/metal/chains/misc/fs_blit_yuy16.bin
index d1a60d6f578..8ba7e23dfe1 100644
--- a/bgfx/shaders/metal/chains/misc/fs_blit_yuy16.bin
+++ b/bgfx/shaders/metal/chains/misc/fs_blit_yuy16.bin
Binary files differ
diff --git a/bgfx/shaders/spirv/chains/misc/fs_blit_palette16.bin b/bgfx/shaders/spirv/chains/misc/fs_blit_palette16.bin
index ec938478045..c3afa18867a 100644
--- a/bgfx/shaders/spirv/chains/misc/fs_blit_palette16.bin
+++ b/bgfx/shaders/spirv/chains/misc/fs_blit_palette16.bin
Binary files differ
diff --git a/bgfx/shaders/spirv/chains/misc/fs_blit_yuy16.bin b/bgfx/shaders/spirv/chains/misc/fs_blit_yuy16.bin
index 38de3733131..c4e6b56eb8c 100644
--- a/bgfx/shaders/spirv/chains/misc/fs_blit_yuy16.bin
+++ b/bgfx/shaders/spirv/chains/misc/fs_blit_yuy16.bin
Binary files differ
diff --git a/src/osd/modules/render/bgfx/chain.cpp b/src/osd/modules/render/bgfx/chain.cpp
index 6ff13cffebb..8dbd72a0067 100644
--- a/src/osd/modules/render/bgfx/chain.cpp
+++ b/src/osd/modules/render/bgfx/chain.cpp
@@ -169,5 +169,5 @@ void bgfx_chain::insert_effect(uint32_t index, bgfx_effect *effect, std::string
const uint32_t screen_width = chains.targets().width(TARGET_STYLE_GUEST, m_screen_index);
const uint32_t screen_height = chains.targets().height(TARGET_STYLE_GUEST, m_screen_index);
m_targets.destroy_target("screen", m_screen_index);
- m_targets.create_target("screen", bgfx::TextureFormat::RGBA8, screen_width, screen_height, TARGET_STYLE_GUEST, true, false, 1, m_screen_index);
+ m_targets.create_target("screen", bgfx::TextureFormat::BGRA8, screen_width, screen_height, TARGET_STYLE_GUEST, true, false, 1, m_screen_index);
}
diff --git a/src/osd/modules/render/bgfx/chainmanager.cpp b/src/osd/modules/render/bgfx/chainmanager.cpp
index 43bc463a5e1..26cba0d4f94 100644
--- a/src/osd/modules/render/bgfx/chainmanager.cpp
+++ b/src/osd/modules/render/bgfx/chainmanager.cpp
@@ -47,6 +47,7 @@ chain_manager::chain_manager(running_machine& machine, osd_options& options, tex
, m_slider_notifier(slider_notifier)
, m_screen_count(0)
{
+ m_converters.clear();
refresh_available_chains();
parse_chain_selections(options.bgfx_screen_chains());
init_texture_converters();
@@ -462,14 +463,15 @@ uint32_t chain_manager::update_screen_textures(uint32_t view, render_primitive *
}
}
- bgfx::TextureFormat::Enum dst_format = bgfx::TextureFormat::RGBA8;
+ bgfx::TextureFormat::Enum dst_format = bgfx::TextureFormat::BGRA8;
uint16_t pitch = prim.m_rowpixels;
+ int convert_stride = 1;
const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgfx_texture_data(dst_format, prim.m_flags & PRIMFLAG_TEXFORMAT_MASK,
- prim.m_rowpixels, tex_height, prim.m_prim->texture.palette, prim.m_prim->texture.base, &pitch);
+ prim.m_rowpixels, tex_height, prim.m_prim->texture.palette, prim.m_prim->texture.base, pitch, convert_stride);
if (texture == nullptr)
{
- bgfx_texture *texture = new bgfx_texture(full_name, dst_format, tex_width, tex_height, mem, BGFX_SAMPLER_U_CLAMP | BGFX_SAMPLER_V_CLAMP | BGFX_SAMPLER_MIN_POINT | BGFX_SAMPLER_MAG_POINT | BGFX_SAMPLER_MIP_POINT, pitch, prim.m_rowpixels);
+ bgfx_texture *texture = new bgfx_texture(full_name, dst_format, tex_width, tex_height, mem, BGFX_SAMPLER_U_CLAMP | BGFX_SAMPLER_V_CLAMP | BGFX_SAMPLER_MIN_POINT | BGFX_SAMPLER_MAG_POINT | BGFX_SAMPLER_MIP_POINT, pitch, prim.m_rowpixels, convert_stride);
m_textures.add_provider(full_name, texture);
if (prim.m_prim->texture.palette)
diff --git a/src/osd/modules/render/bgfx/inputpair.cpp b/src/osd/modules/render/bgfx/inputpair.cpp
index 9b430607cb8..4f185db86ab 100644
--- a/src/osd/modules/render/bgfx/inputpair.cpp
+++ b/src/osd/modules/render/bgfx/inputpair.cpp
@@ -42,6 +42,7 @@ bgfx_input_pair::bgfx_input_pair(int index, std::string sampler, std::string tex
bgfx_input_pair::~bgfx_input_pair()
{
+ m_slider_state.reset();
}
void bgfx_input_pair::bind(bgfx_effect *effect, const int32_t screen) const
@@ -58,14 +59,14 @@ void bgfx_input_pair::bind(bgfx_effect *effect, const int32_t screen) const
bgfx_uniform *tex_size = effect->uniform("u_tex_size" + std::to_string(m_index));
if (tex_size && provider)
{
- float values[2] = { float(provider->width()), float(provider->height()) };
+ float values[2] = { float(provider->rowpixels()), float(provider->height()) };
tex_size->set(values, sizeof(float) * 2);
}
bgfx_uniform *inv_tex_size = effect->uniform("u_inv_tex_size" + std::to_string(m_index));
if (inv_tex_size && provider)
{
- float values[2] = { 1.0f / float(provider->width()), 1.0f / float(provider->height()) };
+ float values[2] = { 1.0f / float(provider->rowpixels()), 1.0f / float(provider->height()) };
inv_tex_size->set(values, sizeof(float) * 2);
}
diff --git a/src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_palette16.sc b/src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_palette16.sc
index 82236d954a3..c152bfa8fe3 100644
--- a/src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_palette16.sc
+++ b/src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_palette16.sc
@@ -9,11 +9,28 @@ $input v_color0, v_texcoord0
SAMPLER2D(s_tex, 0);
SAMPLER2D(s_pal, 1);
+uniform vec4 u_tex_size0;
+uniform vec4 u_inv_tex_size0;
uniform vec4 u_inv_tex_size1;
void main()
{
- vec2 palette_uv = texture2D(s_tex, v_texcoord0).rg;
- palette_uv.xy = (palette_uv.xy * vec2(256.0, 256.0)) * u_inv_tex_size1.xy;
+ // Logic taken from fs_blit_yuy16.sc - we need to do this, because
+ // the D3D9 BGFX backend claims to support RG8, but does so in
+ // a faulty way by using A8L8, which is not an appropriate format
+ // for representing an RG8 texture.
+
+ vec2 half_texel = u_inv_tex_size0.xy * vec2(0.5, 0.5);
+
+ vec2 original_uv = v_texcoord0.xy * u_tex_size0.xy;
+ float mod_val = mod(original_uv.x, 2.0);
+ vec2 rounded_uv = vec2(original_uv.x - mod_val, original_uv.y);
+ vec4 srcpix = texture2D(s_tex, rounded_uv * u_inv_tex_size0.xy + half_texel.x);
+
+ vec2 palette_uv = (srcpix.ra * vec2(256.0, 256.0)) * u_inv_tex_size1.xy;
+ if (mod_val < 1.0)
+ palette_uv = (srcpix.bg * vec2(256.0, 256.0)) * u_inv_tex_size1.xy;
+
gl_FragColor = vec4(texture2D(s_pal, palette_uv).rgb, 1.0) * v_color0;
+ //gl_FragColor = texture2D(s_tex, v_texcoord0) * v_color0;
}
diff --git a/src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_yuy16.sc b/src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_yuy16.sc
index 21f3b8816fc..91e3c3ed462 100644
--- a/src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_yuy16.sc
+++ b/src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_yuy16.sc
@@ -8,8 +8,6 @@ $input v_color0, v_texcoord0
// Samplers
SAMPLER2D(s_tex, 0);
-#define round(X) floor((X)+0.5)
-
uniform vec4 u_tex_size0;
uniform vec4 u_inv_tex_size0;
@@ -23,17 +21,17 @@ vec3 ycc_to_rgb(float y, float cb, float cr)
void main()
{
- vec2 size_minus_one = u_tex_size0.xy - vec2(1.0, 1.0);
- vec2 original_uv = round(v_texcoord0.xy * size_minus_one);
+ vec2 half_texel = u_inv_tex_size0.xy * vec2(0.5, 0.5);
+
+ vec2 original_uv = v_texcoord0.xy * u_tex_size0.xy;
float mod_val = mod(original_uv.x, 2.0);
- vec2 rounded_uv = round(vec2(original_uv.x - mod_val, original_uv.y));
- vec2 next_uv = rounded_uv + vec2(1.0, 0.0);
- vec2 srcpix0 = texture2D(s_tex, rounded_uv / size_minus_one).rg;
- vec2 srcpix1 = texture2D(s_tex, next_uv / size_minus_one).rg;
- float cr = srcpix1.r;
- float cb = srcpix0.r;
+ vec2 rounded_uv = vec2(original_uv.x - mod_val, original_uv.y);
+ vec4 srcpix = texture2D(s_tex, rounded_uv * u_inv_tex_size0.xy + half_texel.x);
+
+ float cr = srcpix.r;
+ float cb = srcpix.b;
if (mod_val < 1.0)
- gl_FragColor = vec4(ycc_to_rgb(srcpix0.g, cb, cr), 1.0) * v_color0;
+ gl_FragColor = vec4(ycc_to_rgb(srcpix.g, cb, cr), 1.0) * v_color0;
else
- gl_FragColor = vec4(ycc_to_rgb(srcpix1.g, cb, cr), 1.0) * v_color0;
+ gl_FragColor = vec4(ycc_to_rgb(srcpix.a, cb, cr), 1.0) * v_color0;
}
diff --git a/src/osd/modules/render/bgfx/target.cpp b/src/osd/modules/render/bgfx/target.cpp
index cb912aba9ef..ff814ed649a 100644
--- a/src/osd/modules/render/bgfx/target.cpp
+++ b/src/osd/modules/render/bgfx/target.cpp
@@ -30,16 +30,24 @@ bgfx_target::bgfx_target(std::string name, bgfx::TextureFormat::Enum format, uin
{
m_width *= m_scale;
m_height *= m_scale;
+
uint32_t wrap_mode = BGFX_SAMPLER_U_CLAMP | BGFX_SAMPLER_V_CLAMP;
uint32_t filter_mode = filter ? (BGFX_SAMPLER_MIN_ANISOTROPIC | BGFX_SAMPLER_MAG_ANISOTROPIC) : (BGFX_SAMPLER_MIN_POINT | BGFX_SAMPLER_MAG_POINT | BGFX_SAMPLER_MIP_POINT);
+ uint32_t depth_flags = wrap_mode | (BGFX_SAMPLER_MIN_POINT | BGFX_SAMPLER_MAG_POINT | BGFX_SAMPLER_MIP_POINT);
- m_textures = new bgfx::TextureHandle[m_page_count];
+ m_textures = new bgfx::TextureHandle[m_page_count * 2];
m_targets = new bgfx::FrameBufferHandle[m_page_count];
for (int page = 0; page < m_page_count; page++)
{
m_textures[page] = bgfx::createTexture2D(m_width, m_height, false, 1, format, wrap_mode | filter_mode | BGFX_TEXTURE_RT);
assert(m_textures[page].idx != 0xffff);
- m_targets[page] = bgfx::createFrameBuffer(1, &m_textures[page], false);
+
+ m_textures[m_page_count + page] = bgfx::createTexture2D(m_width, m_height, false, 1, bgfx::TextureFormat::D24, depth_flags | BGFX_TEXTURE_RT);
+ assert(m_textures[m_page_count + page].idx != 0xffff);
+
+ bgfx::TextureHandle handles[2] = { m_textures[page], m_textures[m_page_count + page] };
+ m_targets[page] = bgfx::createFrameBuffer(2, handles, false);
+
assert(m_targets[page].idx != 0xffff);
}
@@ -64,7 +72,7 @@ bgfx_target::bgfx_target(void *handle, uint16_t width, uint16_t height)
, m_page_count(0)
{
m_targets = new bgfx::FrameBufferHandle[1];
- m_targets[0] = bgfx::createFrameBuffer(handle, width, height);
+ m_targets[0] = bgfx::createFrameBuffer(handle, width, height, bgfx::TextureFormat::Count, bgfx::TextureFormat::D24);
// No backing texture
}
@@ -81,6 +89,7 @@ bgfx_target::~bgfx_target()
for (int page = 0; page < m_page_count; page++)
{
bgfx::destroy(m_targets[page]);
+ bgfx::destroy(m_textures[m_page_count + page]);
bgfx::destroy(m_textures[page]);
}
delete [] m_textures;
diff --git a/src/osd/modules/render/bgfx/target.h b/src/osd/modules/render/bgfx/target.h
index be6e5884d22..15a12731c4f 100644
--- a/src/osd/modules/render/bgfx/target.h
+++ b/src/osd/modules/render/bgfx/target.h
@@ -44,11 +44,12 @@ public:
uint32_t screen_index() const { return m_screen; }
// bgfx_texture_handle_provider
+ virtual bgfx::TextureHandle texture() const override;
+ virtual bool is_target() const override { return true; }
virtual uint16_t width() const override { return m_width; }
virtual uint16_t height() const override { return m_height; }
virtual uint16_t rowpixels() const override { return m_width; }
- virtual bgfx::TextureHandle texture() const override;
- virtual bool is_target() const override { return true; }
+ virtual int convert_stride() const override { return 1; }
private:
std::string m_name;
diff --git a/src/osd/modules/render/bgfx/targetmanager.cpp b/src/osd/modules/render/bgfx/targetmanager.cpp
index adc2ca5acee..3cc90e1fa84 100644
--- a/src/osd/modules/render/bgfx/targetmanager.cpp
+++ b/src/osd/modules/render/bgfx/targetmanager.cpp
@@ -47,11 +47,14 @@ target_manager::~target_manager()
bgfx_target* target_manager::create_target(std::string name, bgfx::TextureFormat::Enum format, uint16_t width, uint16_t height, uint32_t style, bool double_buffer, bool filter, uint16_t scale, uint32_t screen)
{
- auto* target = new bgfx_target(name, format, width, height, style, double_buffer, filter, scale, screen);
std::string full_name = name + std::to_string(screen);
- m_targets[full_name] = target;
+ auto iter = m_targets.find(full_name);
+ if (iter != m_targets.end())
+ destroy_target(name, screen);
+ bgfx_target *target = new bgfx_target(name, format, width, height, style, double_buffer, filter, scale, screen);
+ m_targets[full_name] = target;
m_textures.add_provider(full_name, target);
return target;
@@ -60,10 +63,10 @@ bgfx_target* target_manager::create_target(std::string name, bgfx::TextureFormat
void target_manager::destroy_target(std::string name, uint32_t screen)
{
std::string full_name = (screen < 0) ? name : (name + std::to_string(screen));
- if (m_targets[full_name] != nullptr)
+ if (m_targets.find(full_name) != m_targets.end())
{
delete m_targets[full_name];
- m_targets[full_name] = nullptr;
+ m_targets.erase(full_name);
m_textures.remove_provider(full_name);
}
}
@@ -78,12 +81,11 @@ bgfx_target* target_manager::create_backbuffer(void *handle, uint16_t width, uin
bgfx_target* target_manager::target(uint32_t screen, std::string name)
{
std::string full_name = name + std::to_string(screen);
- bgfx_target* target = m_targets[full_name];
- if (target == nullptr)
+ if (m_targets.find(full_name) != m_targets.end())
{
osd_printf_verbose("Warning: Attempting to retrieve a nonexistent target '%s' for screen %d\n", name, screen);
}
- return target;
+ return m_targets[full_name];
}
bool target_manager::update_target_sizes(uint32_t screen, uint16_t width, uint16_t height, uint32_t style)
@@ -133,8 +135,8 @@ void target_manager::rebuild_targets(uint32_t screen, uint32_t style)
const uint16_t scale = target->scale();
const uint16_t width(sizes[screen].width());
const uint16_t height(sizes[screen].height());
- delete target;
+ destroy_target(name, screen);
create_target(name, format, width, height, style, double_buffered, filter, scale, screen);
}
}
@@ -165,7 +167,7 @@ void target_manager::create_target_if_nonexistent(uint32_t screen, std::string n
{
if (style == TARGET_STYLE_CUSTOM) return;
- if (m_targets[name + std::to_string(screen)] != nullptr)
+ if (m_targets.find(name + std::to_string(screen)) != m_targets.end())
{
return;
}
@@ -174,7 +176,7 @@ void target_manager::create_target_if_nonexistent(uint32_t screen, std::string n
uint16_t width(sizes[screen].width());
uint16_t height(sizes[screen].height());
- create_target(name, bgfx::TextureFormat::RGBA8, width, height, style, double_buffered, filter, 1, screen);
+ create_target(name, bgfx::TextureFormat::BGRA8, width, height, style, double_buffered, filter, 1, screen);
}
uint16_t target_manager::width(uint32_t style, uint32_t screen)
diff --git a/src/osd/modules/render/bgfx/targetreader.cpp b/src/osd/modules/render/bgfx/targetreader.cpp
index 71b82383a59..e201f3c5f6e 100644
--- a/src/osd/modules/render/bgfx/targetreader.cpp
+++ b/src/osd/modules/render/bgfx/targetreader.cpp
@@ -60,7 +60,7 @@ bgfx_target* target_reader::read_from_value(const Value& value, std::string pref
break;
}
- return chains.targets().create_target(target_name, bgfx::TextureFormat::RGBA8, width, height, mode, double_buffer, bilinear, scale, screen_index);
+ return chains.targets().create_target(target_name, bgfx::TextureFormat::BGRA8, width, height, mode, double_buffer, bilinear, scale, screen_index);
}
bool target_reader::validate_parameters(const Value& value, std::string prefix)
diff --git a/src/osd/modules/render/bgfx/texture.cpp b/src/osd/modules/render/bgfx/texture.cpp
index 85f1d3645fb..34efd738679 100644
--- a/src/osd/modules/render/bgfx/texture.cpp
+++ b/src/osd/modules/render/bgfx/texture.cpp
@@ -15,6 +15,8 @@ bgfx_texture::bgfx_texture(std::string name, bgfx::TextureFormat::Enum format, u
, m_format(format)
, m_width(width)
, m_height(height)
+ , m_rowpixels(width)
+ , m_convert_stride(1)
{
bgfx::TextureInfo info;
bgfx::calcTextureSize(info, width, height, 1, false, false, 1, format);
@@ -32,17 +34,18 @@ bgfx_texture::bgfx_texture(std::string name, bgfx::TextureFormat::Enum format, u
}
}
-bgfx_texture::bgfx_texture(std::string name, bgfx::TextureFormat::Enum format, uint16_t width, uint16_t height, const bgfx::Memory* data, uint32_t flags, uint16_t pitch, uint16_t rowpixels)
+bgfx_texture::bgfx_texture(std::string name, bgfx::TextureFormat::Enum format, uint16_t width, uint16_t height, const bgfx::Memory* data, uint32_t flags, uint16_t pitch, uint16_t rowpixels, int convert_stride)
: m_name(name)
, m_format(format)
, m_width(width)
, m_height(height)
, m_rowpixels(rowpixels ? rowpixels : width)
+ , m_convert_stride(convert_stride)
{
bgfx::TextureInfo info;
- bgfx::calcTextureSize(info, m_rowpixels, height, 1, false, false, 1, format);
- m_texture = bgfx::createTexture2D(m_rowpixels, height, false, 1, format, flags, nullptr);
- bgfx::updateTexture2D(m_texture, 0, 0, 0, 0, m_rowpixels, height, data, pitch);
+ bgfx::calcTextureSize(info, m_rowpixels / m_convert_stride, height, 1, false, false, 1, format);
+ m_texture = bgfx::createTexture2D(m_rowpixels / m_convert_stride, height, false, 1, format, flags, nullptr);
+ bgfx::updateTexture2D(m_texture, 0, 0, 0, 0, m_rowpixels / m_convert_stride, height, data, pitch);
}
bgfx_texture::~bgfx_texture()
@@ -52,5 +55,5 @@ bgfx_texture::~bgfx_texture()
void bgfx_texture::update(const bgfx::Memory *data, uint16_t pitch)
{
- bgfx::updateTexture2D(m_texture, 0, 0, 0, 0, m_width, m_height, data, pitch);
+ bgfx::updateTexture2D(m_texture, 0, 0, 0, 0, m_rowpixels / m_convert_stride, m_height, data, pitch);
}
diff --git a/src/osd/modules/render/bgfx/texture.h b/src/osd/modules/render/bgfx/texture.h
index dc96e9acd77..4a5d6636f5b 100644
--- a/src/osd/modules/render/bgfx/texture.h
+++ b/src/osd/modules/render/bgfx/texture.h
@@ -21,7 +21,7 @@ class bgfx_texture : public bgfx_texture_handle_provider
{
public:
bgfx_texture(std::string name, bgfx::TextureFormat::Enum format, uint16_t width, uint16_t height, uint32_t flags, void* data);
- bgfx_texture(std::string name, bgfx::TextureFormat::Enum format, uint16_t width, uint16_t height, const bgfx::Memory* data, uint32_t flags = BGFX_SAMPLER_U_CLAMP | BGFX_SAMPLER_V_CLAMP, uint16_t pitch = UINT16_MAX, uint16_t rowpixels = 0);
+ bgfx_texture(std::string name, bgfx::TextureFormat::Enum format, uint16_t width, uint16_t height, const bgfx::Memory* data, uint32_t flags = BGFX_SAMPLER_U_CLAMP | BGFX_SAMPLER_V_CLAMP, uint16_t pitch = UINT16_MAX, uint16_t rowpixels = 0, int convert_stride = 1);
virtual ~bgfx_texture();
// Getters
@@ -29,11 +29,12 @@ public:
bgfx::TextureFormat::Enum format() const { return m_format; }
// bgfx_texture_handle_provider
+ virtual bgfx::TextureHandle texture() const override { return m_texture; }
+ virtual bool is_target() const override { return false; }
virtual uint16_t width() const override { return m_width; }
virtual uint16_t height() const override { return m_height; }
virtual uint16_t rowpixels() const override { return m_rowpixels; }
- virtual bgfx::TextureHandle texture() const override { return m_texture; }
- virtual bool is_target() const override { return false; }
+ virtual int convert_stride() const override { return m_convert_stride; }
void update(const bgfx::Memory *data, uint16_t pitch = UINT16_MAX);
@@ -43,6 +44,7 @@ protected:
uint16_t m_width;
uint16_t m_height;
uint16_t m_rowpixels;
+ int m_convert_stride;
bgfx::TextureHandle m_texture;
};
diff --git a/src/osd/modules/render/bgfx/texturehandleprovider.h b/src/osd/modules/render/bgfx/texturehandleprovider.h
index b4b3f561d44..03387040d7c 100644
--- a/src/osd/modules/render/bgfx/texturehandleprovider.h
+++ b/src/osd/modules/render/bgfx/texturehandleprovider.h
@@ -25,6 +25,7 @@ public:
virtual uint16_t width() const = 0;
virtual uint16_t height() const = 0;
virtual uint16_t rowpixels() const = 0;
+ virtual int convert_stride() const = 0;
};
#endif // __DRAWBGFX_TEXTURE_HANDLE_PROVIDER__
diff --git a/src/osd/modules/render/bgfx/texturemanager.cpp b/src/osd/modules/render/bgfx/texturemanager.cpp
index d0bcbcb476d..6c760c10203 100644
--- a/src/osd/modules/render/bgfx/texturemanager.cpp
+++ b/src/osd/modules/render/bgfx/texturemanager.cpp
@@ -87,7 +87,7 @@ bgfx_texture* texture_manager::create_png_texture(std::string path, std::string
{
texture_name += std::to_string(screen);
}
- bgfx_texture* texture = create_texture(texture_name, bgfx::TextureFormat::RGBA8, width, height, data, flags);
+ bgfx_texture* texture = create_texture(texture_name, bgfx::TextureFormat::BGRA8, width, height, data, flags);
delete [] data;
@@ -122,8 +122,9 @@ bgfx::TextureHandle texture_manager::create_or_update_mame_texture(uint32_t form
{
bgfx::TextureFormat::Enum dst_format = bgfx::TextureFormat::BGRA8;
uint16_t pitch = width;
- const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgfx_texture_data(dst_format, format, rowpixels, height, palette, base, &pitch);
- bgfx::updateTexture2D(handle, 0, 0, 0, 0, (uint16_t)width, (uint16_t)height, mem, pitch);
+ int convert_stride = 1;
+ const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgfx_texture_data(dst_format, format, rowpixels, height, palette, base, pitch, convert_stride);
+ bgfx::updateTexture2D(handle, 0, 0, 0, 0, (uint16_t)(rowpixels / convert_stride), (uint16_t)height, mem, pitch);
return handle;
}
}
@@ -150,8 +151,9 @@ bgfx::TextureHandle texture_manager::create_or_update_mame_texture(uint32_t form
{
bgfx::TextureFormat::Enum dst_format = bgfx::TextureFormat::BGRA8;
uint16_t pitch = width;
- const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgfx_texture_data(dst_format, format, rowpixels, height, palette, base, &pitch);
- bgfx::updateTexture2D(handle, 0, 0, 0, 0, (uint16_t)width, (uint16_t)height, mem, pitch);
+ int convert_stride = 1;
+ const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgfx_texture_data(dst_format, format, rowpixels, height, palette, base, pitch, convert_stride);
+ bgfx::updateTexture2D(handle, 0, 0, 0, 0, (uint16_t)(rowpixels / convert_stride), (uint16_t)height, mem, pitch);
return handle;
}
}
@@ -161,9 +163,10 @@ bgfx::TextureHandle texture_manager::create_or_update_mame_texture(uint32_t form
bgfx::TextureFormat::Enum dst_format = bgfx::TextureFormat::BGRA8;
uint16_t pitch = width;
- const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgfx_texture_data(dst_format, format, rowpixels, height, palette, base, &pitch);
+ int convert_stride = 1;
+ const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgfx_texture_data(dst_format, format, rowpixels, height, palette, base, pitch, convert_stride);
handle = bgfx::createTexture2D(width, height, false, 1, dst_format, flags, nullptr);
- bgfx::updateTexture2D(handle, 0, 0, 0, 0, (uint16_t)width, (uint16_t)height, mem, pitch);
+ bgfx::updateTexture2D(handle, 0, 0, 0, 0, (uint16_t)(rowpixels / convert_stride), (uint16_t)height, mem, pitch);
m_mame_textures[key] = { handle, seqid, width, height };
return handle;
@@ -201,6 +204,6 @@ void texture_manager::remove_provider(std::string name, bool delete_provider)
{
delete m_textures[name];
}
- m_textures[name] = nullptr;
+ m_textures.erase(name);
}
}
diff --git a/src/osd/modules/render/bgfxutil.cpp b/src/osd/modules/render/bgfxutil.cpp
index 9d2bef27901..f0d01e4fa86 100644
--- a/src/osd/modules/render/bgfxutil.cpp
+++ b/src/osd/modules/render/bgfxutil.cpp
@@ -14,29 +14,29 @@
#include "render.h"
-const bgfx::Memory* bgfx_util::mame_texture_data_to_bgfx_texture_data(bgfx::TextureFormat::Enum &dst_format, uint32_t src_format, int rowpixels, int height, const rgb_t *palette, void *base, uint16_t *out_pitch)
+const bgfx::Memory* bgfx_util::mame_texture_data_to_bgfx_texture_data(bgfx::TextureFormat::Enum &dst_format, uint32_t src_format, int rowpixels, int height, const rgb_t *palette, void *base, uint16_t &out_pitch, int &convert_stride)
{
bgfx::TextureInfo info;
switch (src_format)
{
case PRIMFLAG_TEXFORMAT(TEXFORMAT_PALETTE16):
case PRIMFLAG_TEXFORMAT(TEXFORMAT_YUY16):
- dst_format = bgfx::TextureFormat::RG8;
- if (out_pitch)
- *out_pitch = rowpixels * 2;
+ dst_format = bgfx::TextureFormat::BGRA8;
+ convert_stride = 2;
+ out_pitch = rowpixels * 2;
break;
case PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32):
case PRIMFLAG_TEXFORMAT(TEXFORMAT_RGB32):
dst_format = bgfx::TextureFormat::BGRA8;
- if (out_pitch)
- *out_pitch = rowpixels * 4;
+ convert_stride = 1;
+ out_pitch = rowpixels * 4;
break;
}
- bgfx::calcTextureSize(info, rowpixels, height, 1, false, false, 1, dst_format);
+ bgfx::calcTextureSize(info, rowpixels / convert_stride, height, 1, false, false, 1, dst_format);
return bgfx::copy(base, info.storageSize);
}
-const bgfx::Memory* bgfx_util::mame_texture_data_to_argb32(uint32_t src_format, int width, int height, int rowpixels, const rgb_t *palette, void *base)
+const bgfx::Memory* bgfx_util::mame_texture_data_to_bgra32(uint32_t src_format, int width, int height, int rowpixels, const rgb_t *palette, void *base)
{
const bgfx::Memory* mem = bgfx::alloc(rowpixels * height * 4);
auto* dst = reinterpret_cast<uint32_t*>(mem->data);
@@ -48,19 +48,19 @@ const bgfx::Memory* bgfx_util::mame_texture_data_to_argb32(uint32_t src_format,
switch (src_format)
{
case PRIMFLAG_TEXFORMAT(TEXFORMAT_PALETTE16):
- copy_util::copyline_palette16(dst, src16, width, palette);
+ copy_util::copyline_palette16_to_bgra(dst, src16, width, palette);
src16 += rowpixels;
break;
case PRIMFLAG_TEXFORMAT(TEXFORMAT_YUY16):
- copy_util::copyline_yuy16_to_argb(dst, src16, width, palette, 1);
+ copy_util::copyline_yuy16_to_bgra(dst, src16, width, palette, 1);
src16 += rowpixels;
break;
case PRIMFLAG_TEXFORMAT(TEXFORMAT_ARGB32):
- copy_util::copyline_argb32(dst, src32, width, palette);
+ copy_util::copyline_argb32_to_bgra(dst, src32, width, palette);
src32 += rowpixels;
break;
case PRIMFLAG_TEXFORMAT(TEXFORMAT_RGB32):
- copy_util::copyline_rgb32(dst, src32, width, palette);
+ copy_util::copyline_rgb32_to_bgra(dst, src32, width, palette);
src32 += rowpixels;
break;
default:
diff --git a/src/osd/modules/render/bgfxutil.h b/src/osd/modules/render/bgfxutil.h
index 2f961f6551e..010321bd6bd 100644
--- a/src/osd/modules/render/bgfxutil.h
+++ b/src/osd/modules/render/bgfxutil.h
@@ -11,8 +11,8 @@
class bgfx_util
{
public:
- static const bgfx::Memory* mame_texture_data_to_bgfx_texture_data(bgfx::TextureFormat::Enum &dst_format, uint32_t format, int width, int height, const rgb_t *palette, void *base, uint16_t *out_pitch = nullptr);
- static const bgfx::Memory* mame_texture_data_to_argb32(uint32_t src_format, int width, int height, int rowpixels, const rgb_t *palette, void *base);
+ static const bgfx::Memory* mame_texture_data_to_bgfx_texture_data(bgfx::TextureFormat::Enum &dst_format, uint32_t format, int rowpixels, int height, const rgb_t *palette, void *base, uint16_t &out_pitch, int &convert_stride);
+ static const bgfx::Memory* mame_texture_data_to_bgra32(uint32_t src_format, int width, int height, int rowpixels, const rgb_t *palette, void *base);
static uint64_t get_blend_state(uint32_t blend);
};
diff --git a/src/osd/modules/render/copyutil.h b/src/osd/modules/render/copyutil.h
index 715fcba0dca..295b5a10200 100644
--- a/src/osd/modules/render/copyutil.h
+++ b/src/osd/modules/render/copyutil.h
@@ -24,6 +24,15 @@ public:
}
}
+ static inline void copyline_palette16_to_bgra(uint32_t *dst, const uint16_t *src, int width, const rgb_t *palette)
+ {
+ for (int x = 0; x < width; x++)
+ {
+ rgb_t srcpixel = palette[*src++];
+ *dst++ = 0xff000000 | (srcpixel.r() << 16) | (srcpixel.g() << 8) | srcpixel.b();
+ }
+ }
+
static inline void copyline_rgb32(uint32_t *dst, const uint32_t *src, int width, const rgb_t *palette)
{
int x;
@@ -49,6 +58,32 @@ public:
}
}
+ static inline void copyline_rgb32_to_bgra(uint32_t *dst, const uint32_t *src, int width, const rgb_t *palette)
+ {
+ int x;
+
+ // palette (really RGB map) case
+ if (palette != nullptr)
+ {
+ for (x = 0; x < width; x++)
+ {
+ rgb_t srcpix = *src++;
+ uint32_t val = 0xff000000 | palette[0x200 + srcpix.b()] | palette[0x100 + srcpix.g()] | palette[srcpix.r()];
+ *dst++ = (val & 0xff00ff00) | ((val & 0x000000ff) << 16) | ((val & 0x00ff0000) >> 16);
+ }
+ }
+
+ // direct case
+ else
+ {
+ for (x = 0; x < width; x++)
+ {
+ rgb_t srcpix = *src++;
+ *dst++ = 0xff000000 | (srcpix.r() << 16) | (srcpix.g() << 8) | srcpix.b();
+ }
+ }
+ }
+
static inline void copyline_argb32(uint32_t *dst, const uint32_t *src, int width, const rgb_t *palette)
{
int x;
@@ -73,6 +108,31 @@ public:
}
}
+ static inline void copyline_argb32_to_bgra(uint32_t *dst, const uint32_t *src, int width, const rgb_t *palette)
+ {
+ int x;
+ // palette (really RGB map) case
+ if (palette != nullptr)
+ {
+ for (x = 0; x < width; x++)
+ {
+ rgb_t srcpix = *src++;
+ uint32_t val = (srcpix & 0xff000000) | palette[0x200 + srcpix.b()] | palette[0x100 + srcpix.g()] | palette[srcpix.r()];
+ *dst++ = (val & 0xff00ff00) | ((val & 0x000000ff) << 16) | ((val & 0x00ff0000) >> 16);
+ }
+ }
+
+ // direct case
+ else
+ {
+ for (x = 0; x < width; x++)
+ {
+ rgb_t srcpix = *src++;
+ *dst++ = (srcpix.a() << 24) | (srcpix.r() << 16) | (srcpix.g() << 8) | srcpix.b();
+ }
+ }
+ }
+
static inline uint32_t ycc_to_rgb(uint8_t y, uint8_t cb, uint8_t cr)
{
/* original equations:
@@ -116,14 +176,12 @@ public:
static inline void copyline_yuy16_to_argb(uint32_t *dst, const uint16_t *src, int width, const rgb_t *palette, int xprescale)
{
- int x;
-
assert(width % 2 == 0);
// palette (really RGB map) case
if (palette != nullptr)
{
- for (x = 0; x < width / 2; x++)
+ for (int x = 0; x < width / 2; x++)
{
uint16_t srcpix0 = *src++;
uint16_t srcpix1 = *src++;
@@ -139,7 +197,7 @@ public:
// direct case
else
{
- for (x = 0; x < width; x += 2)
+ for (int x = 0; x < width; x += 2)
{
uint16_t srcpix0 = *src++;
uint16_t srcpix1 = *src++;
@@ -152,6 +210,55 @@ public:
}
}
}
+
+ static inline void copyline_yuy16_to_bgra(uint32_t *dst, const uint16_t *src, int width, const rgb_t *palette, int xprescale)
+ {
+ assert(width % 2 == 0);
+
+ // palette (really RGB map) case
+ if (palette != nullptr)
+ {
+ for (int x = 0; x < width / 2; x++)
+ {
+ uint16_t srcpix0 = *src++;
+ uint16_t srcpix1 = *src++;
+ uint8_t cb = srcpix0 & 0xff;
+ uint8_t cr = srcpix1 & 0xff;
+ for (int x2 = 0; x2 < xprescale; x2++)
+ {
+ uint32_t val = ycc_to_rgb(palette[0x000 + (srcpix0 >> 8)], cb, cr);
+ *dst++ = (val & 0xff00ff00) | ((val & 0x000000ff) << 16) | ((val & 0x00ff0000) >> 16);
+ }
+ for (int x2 = 0; x2 < xprescale; x2++)
+ {
+ uint32_t val = ycc_to_rgb(palette[0x000 + (srcpix1 >> 8)], cb, cr);
+ *dst++ = (val & 0xff00ff00) | ((val & 0x000000ff) << 16) | ((val & 0x00ff0000) >> 16);
+ }
+ }
+ }
+
+ // direct case
+ else
+ {
+ for (int x = 0; x < width; x += 2)
+ {
+ uint16_t srcpix0 = *src++;
+ uint16_t srcpix1 = *src++;
+ uint8_t cb = srcpix0 & 0xff;
+ uint8_t cr = srcpix1 & 0xff;
+ for (int x2 = 0; x2 < xprescale; x2++)
+ {
+ uint32_t val = ycc_to_rgb(srcpix0 >> 8, cb, cr);
+ *dst++ = (val & 0xff00ff00) | ((val & 0x000000ff) << 16) | ((val & 0x00ff0000) >> 16);
+ }
+ for (int x2 = 0; x2 < xprescale; x2++)
+ {
+ uint32_t val = ycc_to_rgb(srcpix1 >> 8, cb, cr);
+ *dst++ = (val & 0xff00ff00) | ((val & 0x000000ff) << 16) | ((val & 0x00ff0000) >> 16);
+ }
+ }
+ }
+ }
};
#endif // __RENDER_COPYUTIL__
diff --git a/src/osd/modules/render/drawbgfx.cpp b/src/osd/modules/render/drawbgfx.cpp
index 5695e4a2c7c..3f99bfc09f0 100644
--- a/src/osd/modules/render/drawbgfx.cpp
+++ b/src/osd/modules/render/drawbgfx.cpp
@@ -108,8 +108,7 @@ renderer_bgfx::renderer_bgfx(std::shared_ptr<osd_window> w)
renderer_bgfx::~renderer_bgfx()
{
bgfx::reset(0, 0, BGFX_RESET_NONE);
- //bgfx::touch(0);
- //bgfx::frame();
+
if (m_avi_writer != nullptr && m_avi_writer->recording())
{
m_avi_writer->stop();
@@ -125,6 +124,9 @@ renderer_bgfx::~renderer_bgfx()
}
// Cleanup.
+ if (m_ortho_view)
+ delete m_ortho_view;
+
delete m_chains;
delete m_effects;
delete m_shaders;
@@ -349,7 +351,7 @@ int renderer_bgfx::create()
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::RGBA8, CACHE_SIZE, CACHE_SIZE, nullptr, flags);
+ m_texture_cache = m_textures->create_texture("#cache", bgfx::TextureFormat::BGRA8, CACHE_SIZE, 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));
@@ -391,8 +393,8 @@ void renderer_bgfx::record()
else
{
m_avi_writer->record(m_options.bgfx_avi_name());
- m_avi_target = m_targets->create_target("avibuffer", bgfx::TextureFormat::RGBA8, m_width[0], m_height[0], TARGET_STYLE_CUSTOM, false, true, 1, 0);
- m_avi_texture = bgfx::createTexture2D(m_width[0], m_height[0], false, 1, bgfx::TextureFormat::RGBA8, BGFX_TEXTURE_BLIT_DST | BGFX_TEXTURE_READ_BACK);
+ m_avi_target = m_targets->create_target("avibuffer", bgfx::TextureFormat::BGRA8, m_width[0], m_height[0], TARGET_STYLE_CUSTOM, false, true, 1, 0);
+ m_avi_texture = bgfx::createTexture2D(m_width[0], m_height[0], false, 1, bgfx::TextureFormat::BGRA8, BGFX_TEXTURE_BLIT_DST | BGFX_TEXTURE_READ_BACK);
if (m_avi_view == nullptr)
{
@@ -599,9 +601,9 @@ void renderer_bgfx::render_textured_quad(render_primitive* prim, bgfx::Transient
bgfx::TextureHandle texture = BGFX_INVALID_HANDLE;
if (is_screen)
{
- const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_argb32(prim->flags & PRIMFLAG_TEXFORMAT_MASK
+ const bgfx::Memory* mem = bgfx_util::mame_texture_data_to_bgra32(prim->flags & PRIMFLAG_TEXFORMAT_MASK
, tex_width, tex_height, prim->texture.rowpixels, prim->texture.palette, prim->texture.base);
- texture = bgfx::createTexture2D(tex_width, tex_height, false, 1, bgfx::TextureFormat::RGBA8, texture_flags, mem);
+ texture = bgfx::createTexture2D(tex_width, tex_height, false, 1, bgfx::TextureFormat::BGRA8, texture_flags, mem);
}
else
{
@@ -1164,10 +1166,11 @@ void renderer_bgfx::process_atlas_packs(std::vector<std::vector<rectangle_packer
continue;
}
m_hash_to_entry[rect.hash()] = rect;
- bgfx::TextureFormat::Enum dst_format = bgfx::TextureFormat::RGBA8;
+ bgfx::TextureFormat::Enum dst_format = bgfx::TextureFormat::BGRA8;
uint16_t pitch = rect.width();
- 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);
- bgfx::updateTexture2D(m_texture_cache->texture(), 0, 0, rect.x(), rect.y(), rect.width(), rect.height(), mem, pitch);
+ int convert_stride = 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, convert_stride);
+ bgfx::updateTexture2D(m_texture_cache->texture(), 0, 0, rect.x(), rect.y(), rect.width() / convert_stride, rect.height(), mem, pitch);
}
}
}