mirror of
https://github.com/holub/mame
synced 2025-10-06 09:00:04 +03:00
(nw) keep a persistent temporary palette buffer in bgfx chain manager, back out some unintentional screen changes
This commit is contained in:
parent
17d95ecab5
commit
b0ffbe067c
@ -531,12 +531,7 @@ void screen_device::svg_renderer::rebuild_cache()
|
|||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
|
|
||||||
screen_device::screen_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
|
screen_device::screen_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
|
||||||
: screen_device(mconfig, SCREEN, tag, owner, clock)
|
: device_t(mconfig, SCREEN, tag, owner, clock)
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
screen_device::screen_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
|
|
||||||
: device_t(mconfig, type, tag, owner, clock)
|
|
||||||
, m_type(SCREEN_TYPE_RASTER)
|
, m_type(SCREEN_TYPE_RASTER)
|
||||||
, m_orientation(ROT0)
|
, m_orientation(ROT0)
|
||||||
, m_phys_aspect(0U, 0U)
|
, m_phys_aspect(0U, 0U)
|
||||||
|
@ -186,7 +186,7 @@ public:
|
|||||||
set_type(type);
|
set_type(type);
|
||||||
set_color(color);
|
set_color(color);
|
||||||
}
|
}
|
||||||
virtual ~screen_device();
|
~screen_device();
|
||||||
|
|
||||||
// configuration readers
|
// configuration readers
|
||||||
screen_type_enum screen_type() const { return m_type; }
|
screen_type_enum screen_type() const { return m_type; }
|
||||||
@ -228,7 +228,7 @@ public:
|
|||||||
/// \param [in] vbstart Index of first line in vertical blanking
|
/// \param [in] vbstart Index of first line in vertical blanking
|
||||||
/// period after visible lines.
|
/// period after visible lines.
|
||||||
/// \return Reference to device for method chaining.
|
/// \return Reference to device for method chaining.
|
||||||
virtual screen_device &set_raw(u32 pixclock, u16 htotal, u16 hbend, u16 hbstart, u16 vtotal, u16 vbend, u16 vbstart)
|
screen_device &set_raw(u32 pixclock, u16 htotal, u16 hbend, u16 hbstart, u16 vtotal, u16 vbend, u16 vbstart)
|
||||||
{
|
{
|
||||||
assert(pixclock != 0);
|
assert(pixclock != 0);
|
||||||
m_clock = pixclock;
|
m_clock = pixclock;
|
||||||
@ -393,7 +393,7 @@ public:
|
|||||||
|
|
||||||
// beam positioning and state
|
// beam positioning and state
|
||||||
int vpos() const;
|
int vpos() const;
|
||||||
virtual int hpos() const;
|
int hpos() const;
|
||||||
DECLARE_READ_LINE_MEMBER(vblank) const { return (machine().time() < m_vblank_end_time) ? 1 : 0; }
|
DECLARE_READ_LINE_MEMBER(vblank) const { return (machine().time() < m_vblank_end_time) ? 1 : 0; }
|
||||||
DECLARE_READ_LINE_MEMBER(hblank) const { int const curpos = hpos(); return (curpos < m_visarea.left() || curpos > m_visarea.right()) ? 1 : 0; }
|
DECLARE_READ_LINE_MEMBER(hblank) const { int const curpos = hpos(); return (curpos < m_visarea.left() || curpos > m_visarea.right()) ? 1 : 0; }
|
||||||
|
|
||||||
@ -407,14 +407,14 @@ public:
|
|||||||
u64 frame_number() const { return m_frame_number; }
|
u64 frame_number() const { return m_frame_number; }
|
||||||
|
|
||||||
// pixel-level access
|
// pixel-level access
|
||||||
virtual u32 pixel(s32 x, s32 y);
|
u32 pixel(s32 x, s32 y);
|
||||||
virtual void pixels(u32* buffer);
|
void pixels(u32* buffer);
|
||||||
|
|
||||||
// updating
|
// updating
|
||||||
int partial_updates() const { return m_partial_updates_this_frame; }
|
int partial_updates() const { return m_partial_updates_this_frame; }
|
||||||
virtual bool update_partial(int scanline);
|
bool update_partial(int scanline);
|
||||||
virtual void update_now();
|
void update_now();
|
||||||
virtual void reset_partial_updates();
|
void reset_partial_updates();
|
||||||
|
|
||||||
// additional helpers
|
// additional helpers
|
||||||
void register_vblank_callback(vblank_state_delegate vblank_callback);
|
void register_vblank_callback(vblank_state_delegate vblank_callback);
|
||||||
@ -428,9 +428,7 @@ public:
|
|||||||
static constexpr int DEFAULT_FRAME_RATE = 60;
|
static constexpr int DEFAULT_FRAME_RATE = 60;
|
||||||
static const attotime DEFAULT_FRAME_PERIOD;
|
static const attotime DEFAULT_FRAME_PERIOD;
|
||||||
|
|
||||||
protected:
|
private:
|
||||||
screen_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
|
|
||||||
|
|
||||||
class svg_renderer;
|
class svg_renderer;
|
||||||
|
|
||||||
// timer IDs
|
// timer IDs
|
||||||
|
@ -38,7 +38,6 @@ constexpr int MAX_FRAMESKIP = FRAMESKIP_LEVELS - 2;
|
|||||||
class video_manager
|
class video_manager
|
||||||
{
|
{
|
||||||
friend class screen_device;
|
friend class screen_device;
|
||||||
friend class variable_width_screen_device;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// movie format options
|
// movie format options
|
||||||
|
@ -476,9 +476,9 @@ uint32_t chain_manager::update_screen_textures(uint32_t view, render_primitive *
|
|||||||
{
|
{
|
||||||
uint16_t palette_width = (uint16_t)std::min(prim.m_palette_length, 256U);
|
uint16_t palette_width = (uint16_t)std::min(prim.m_palette_length, 256U);
|
||||||
uint16_t palette_height = (uint16_t)std::max((prim.m_palette_length + 255) / 256, 1U);
|
uint16_t palette_height = (uint16_t)std::max((prim.m_palette_length + 255) / 256, 1U);
|
||||||
uint8_t palette_temp[palette_width * palette_height * 4];
|
m_palette_temp.resize(palette_width * palette_height * 4);
|
||||||
memcpy(palette_temp, prim.m_prim->texture.palette, prim.m_palette_length * 4);
|
memcpy(&m_palette_temp[0], prim.m_prim->texture.palette, prim.m_palette_length * 4);
|
||||||
const bgfx::Memory *palmem = bgfx::copy(palette_temp, palette_width * palette_height * 4);
|
const bgfx::Memory *palmem = bgfx::copy(&m_palette_temp[0], palette_width * palette_height * 4);
|
||||||
palette = new bgfx_texture(palette_name, bgfx::TextureFormat::BGRA8, palette_width, palette_height, palmem, BGFX_SAMPLER_U_CLAMP | BGFX_SAMPLER_V_CLAMP | BGFX_SAMPLER_MIN_POINT | BGFX_SAMPLER_MAG_POINT | BGFX_SAMPLER_MIP_POINT, palette_width * 4);
|
palette = new bgfx_texture(palette_name, bgfx::TextureFormat::BGRA8, palette_width, palette_height, palmem, BGFX_SAMPLER_U_CLAMP | BGFX_SAMPLER_V_CLAMP | BGFX_SAMPLER_MIN_POINT | BGFX_SAMPLER_MAG_POINT | BGFX_SAMPLER_MIP_POINT, palette_width * 4);
|
||||||
m_textures.add_provider(palette_name, palette);
|
m_textures.add_provider(palette_name, palette);
|
||||||
}
|
}
|
||||||
@ -498,9 +498,9 @@ uint32_t chain_manager::update_screen_textures(uint32_t view, render_primitive *
|
|||||||
|
|
||||||
if (prim.m_prim->texture.palette)
|
if (prim.m_prim->texture.palette)
|
||||||
{
|
{
|
||||||
uint8_t palette_temp[palette->width() * palette->height() * 4];
|
m_palette_temp.resize(palette->width() * palette->height() * 4);
|
||||||
memcpy(palette_temp, prim.m_prim->texture.palette, prim.m_palette_length * 4);
|
memcpy(&m_palette_temp[0], prim.m_prim->texture.palette, prim.m_palette_length * 4);
|
||||||
const bgfx::Memory *palmem = bgfx::copy(palette_temp, palette->width() * palette->height() * 4);
|
const bgfx::Memory *palmem = bgfx::copy(&m_palette_temp[0], palette->width() * palette->height() * 4);
|
||||||
palette->update(palmem);
|
palette->update(palmem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -148,6 +148,7 @@ private:
|
|||||||
std::vector<bgfx_texture*> m_screen_palettes;
|
std::vector<bgfx_texture*> m_screen_palettes;
|
||||||
std::vector<bgfx_effect*> m_converters;
|
std::vector<bgfx_effect*> m_converters;
|
||||||
std::vector<screen_prim> m_screen_prims;
|
std::vector<screen_prim> m_screen_prims;
|
||||||
|
std::vector<uint8_t> m_palette_temp;
|
||||||
|
|
||||||
static const uint32_t CHAIN_NONE;
|
static const uint32_t CHAIN_NONE;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user