mirror of
https://github.com/holub/mame
synced 2025-10-06 09:00:04 +03:00
-core: Removed TEXFORMAT_PALETTEA16. [Ryan Holtz]
This commit is contained in:
parent
e8eb6bab4a
commit
1604863c07
@ -92,8 +92,7 @@ laserdisc_device::laserdisc_device(const machine_config &mconfig, device_type ty
|
|||||||
m_videopalette(nullptr),
|
m_videopalette(nullptr),
|
||||||
m_overenable(false),
|
m_overenable(false),
|
||||||
m_overindex(0),
|
m_overindex(0),
|
||||||
m_overtex(nullptr),
|
m_overtex(nullptr)
|
||||||
m_overlay_palette(*this, finder_base::DUMMY_TAG)
|
|
||||||
{
|
{
|
||||||
// initialize overlay_config
|
// initialize overlay_config
|
||||||
m_orig_config.m_overposx = m_orig_config.m_overposy = 0.0f;
|
m_orig_config.m_overposx = m_orig_config.m_overposy = 0.0f;
|
||||||
@ -157,7 +156,7 @@ uint32_t laserdisc_device::screen_update(screen_device &screen, bitmap_rgb32 &bi
|
|||||||
{
|
{
|
||||||
// handle the overlay if present
|
// handle the overlay if present
|
||||||
screen_bitmap &overbitmap = m_overbitmap[m_overindex];
|
screen_bitmap &overbitmap = m_overbitmap[m_overindex];
|
||||||
if (overbitmap.valid() && (!m_overupdate_ind16.isnull() || !m_overupdate_rgb32.isnull()))
|
if (overbitmap.valid() && !m_overupdate_rgb32.isnull())
|
||||||
{
|
{
|
||||||
// scale the cliprect to the overlay size
|
// scale the cliprect to the overlay size
|
||||||
rectangle clip(m_overclip);
|
rectangle clip(m_overclip);
|
||||||
@ -167,10 +166,7 @@ uint32_t laserdisc_device::screen_update(screen_device &screen, bitmap_rgb32 &bi
|
|||||||
clip.max_y = (cliprect.max_y + 1) * overbitmap.height() / bitmap.height() - 1;
|
clip.max_y = (cliprect.max_y + 1) * overbitmap.height() / bitmap.height() - 1;
|
||||||
|
|
||||||
// call the update callback
|
// call the update callback
|
||||||
if (!m_overupdate_ind16.isnull())
|
m_overupdate_rgb32(screen, overbitmap.as_rgb32(), clip);
|
||||||
m_overupdate_ind16(screen, overbitmap.as_ind16(), clip);
|
|
||||||
else
|
|
||||||
m_overupdate_rgb32(screen, overbitmap.as_rgb32(), clip);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// if this is the last update, do the rendering
|
// if this is the last update, do the rendering
|
||||||
@ -218,10 +214,6 @@ uint32_t laserdisc_device::screen_update(screen_device &screen, bitmap_rgb32 &bi
|
|||||||
|
|
||||||
void laserdisc_device::device_start()
|
void laserdisc_device::device_start()
|
||||||
{
|
{
|
||||||
// if we have a palette and it's not started, wait for it
|
|
||||||
if (m_overlay_palette != nullptr && !m_overlay_palette->started())
|
|
||||||
throw device_missing_dependencies();
|
|
||||||
|
|
||||||
// initialize the various pieces
|
// initialize the various pieces
|
||||||
init_disc();
|
init_disc();
|
||||||
init_video();
|
init_video();
|
||||||
@ -278,9 +270,6 @@ void laserdisc_device::device_reset()
|
|||||||
|
|
||||||
void laserdisc_device::device_validity_check(validity_checker &valid) const
|
void laserdisc_device::device_validity_check(validity_checker &valid) const
|
||||||
{
|
{
|
||||||
texture_format texformat = !m_overupdate_ind16.isnull() ? TEXFORMAT_PALETTE16 : TEXFORMAT_RGB32;
|
|
||||||
if (m_overlay_palette == nullptr && texformat == TEXFORMAT_PALETTE16)
|
|
||||||
osd_printf_error("Overlay screen does not have palette defined\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------------------------------------------
|
//-------------------------------------------------
|
||||||
@ -741,19 +730,12 @@ void laserdisc_device::init_video()
|
|||||||
if (m_overenable)
|
if (m_overenable)
|
||||||
{
|
{
|
||||||
// bind our handlers
|
// bind our handlers
|
||||||
m_overupdate_ind16.bind_relative_to(*owner());
|
|
||||||
m_overupdate_rgb32.bind_relative_to(*owner());
|
m_overupdate_rgb32.bind_relative_to(*owner());
|
||||||
|
|
||||||
// configure bitmap formats
|
|
||||||
bitmap_format format = !m_overupdate_ind16.isnull() ? BITMAP_FORMAT_IND16 : BITMAP_FORMAT_RGB32;
|
|
||||||
texture_format texformat = !m_overupdate_ind16.isnull() ? TEXFORMAT_PALETTEA16 : TEXFORMAT_ARGB32;
|
|
||||||
|
|
||||||
// allocate overlay bitmaps
|
// allocate overlay bitmaps
|
||||||
for (auto & elem : m_overbitmap)
|
for (auto & elem : m_overbitmap)
|
||||||
{
|
{
|
||||||
elem.set_format(format, texformat);
|
elem.set_format(BITMAP_FORMAT_RGB32, TEXFORMAT_ARGB32);
|
||||||
if (format==BITMAP_FORMAT_IND16)
|
|
||||||
elem.set_palette(m_overlay_palette->palette());
|
|
||||||
elem.resize(m_overwidth, m_overheight);
|
elem.resize(m_overwidth, m_overheight);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,48 +117,29 @@ public:
|
|||||||
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||||
|
|
||||||
// configuration
|
// configuration
|
||||||
bool overlay_configured() const { return (m_overwidth > 0 && m_overheight > 0 && (!m_overupdate_ind16.isnull() || !m_overupdate_rgb32.isnull())); }
|
bool overlay_configured() const { return (m_overwidth > 0 && m_overheight > 0 && (!m_overupdate_rgb32.isnull())); }
|
||||||
void get_overlay_config(laserdisc_overlay_config &config) { config = static_cast<laserdisc_overlay_config &>(*this); }
|
void get_overlay_config(laserdisc_overlay_config &config) { config = static_cast<laserdisc_overlay_config &>(*this); }
|
||||||
void set_overlay_config(const laserdisc_overlay_config &config) { static_cast<laserdisc_overlay_config &>(*this) = config; }
|
void set_overlay_config(const laserdisc_overlay_config &config) { static_cast<laserdisc_overlay_config &>(*this) = config; }
|
||||||
|
|
||||||
// configuration helpers
|
// configuration helpers
|
||||||
template <typename... T> void set_get_disc(T &&... args) { m_getdisc_callback = get_disc_delegate(std::forward<T>(args)...); }
|
template <typename... T> void set_get_disc(T &&... args) { m_getdisc_callback = get_disc_delegate(std::forward<T>(args)...); }
|
||||||
template <typename... T> void set_audio(T &&... args) { m_audio_callback = audio_delegate(std::forward<T>(args)...); }
|
template <typename... T> void set_audio(T &&... args) { m_audio_callback = audio_delegate(std::forward<T>(args)...); }
|
||||||
template <class FunctionClass>
|
|
||||||
// FIXME: these should be aware of current device for resolving the tag
|
// FIXME: these should be aware of current device for resolving the tag
|
||||||
void set_overlay(uint32_t width, uint32_t height, u32 (FunctionClass::*callback)(screen_device &, bitmap_ind16 &, const rectangle &), const char *name)
|
|
||||||
{
|
|
||||||
set_overlay(width, height, screen_update_ind16_delegate(callback, name, nullptr, static_cast<FunctionClass *>(nullptr)));
|
|
||||||
}
|
|
||||||
template <class FunctionClass>
|
template <class FunctionClass>
|
||||||
void set_overlay(uint32_t width, uint32_t height, u32 (FunctionClass::*callback)(screen_device &, bitmap_rgb32 &, const rectangle &), const char *name)
|
void set_overlay(uint32_t width, uint32_t height, u32 (FunctionClass::*callback)(screen_device &, bitmap_rgb32 &, const rectangle &), const char *name)
|
||||||
{
|
{
|
||||||
set_overlay(width, height, screen_update_rgb32_delegate(callback, name, nullptr, static_cast<FunctionClass *>(nullptr)));
|
set_overlay(width, height, screen_update_rgb32_delegate(callback, name, nullptr, static_cast<FunctionClass *>(nullptr)));
|
||||||
}
|
}
|
||||||
template <class FunctionClass>
|
template <class FunctionClass>
|
||||||
void set_overlay(uint32_t width, uint32_t height, const char *devname, u32 (FunctionClass::*callback)(screen_device &, bitmap_ind16 &, const rectangle &), const char *name)
|
|
||||||
{
|
|
||||||
set_overlay(width, height, screen_update_ind16_delegate(callback, name, devname, static_cast<FunctionClass *>(nullptr)));
|
|
||||||
}
|
|
||||||
template <class FunctionClass>
|
|
||||||
void set_overlay(uint32_t width, uint32_t height, const char *devname, u32 (FunctionClass::*callback)(screen_device &, bitmap_rgb32 &, const rectangle &), const char *name)
|
void set_overlay(uint32_t width, uint32_t height, const char *devname, u32 (FunctionClass::*callback)(screen_device &, bitmap_rgb32 &, const rectangle &), const char *name)
|
||||||
{
|
{
|
||||||
set_overlay(width, height, screen_update_rgb32_delegate(callback, name, devname, static_cast<FunctionClass *>(nullptr)));
|
set_overlay(width, height, screen_update_rgb32_delegate(callback, name, devname, static_cast<FunctionClass *>(nullptr)));
|
||||||
}
|
}
|
||||||
void set_overlay(uint32_t width, uint32_t height, screen_update_ind16_delegate &&update)
|
|
||||||
{
|
|
||||||
m_overwidth = width;
|
|
||||||
m_overheight = height;
|
|
||||||
m_overclip.set(0, width - 1, 0, height - 1);
|
|
||||||
m_overupdate_ind16 = std::move(update);
|
|
||||||
m_overupdate_rgb32 = screen_update_rgb32_delegate();
|
|
||||||
}
|
|
||||||
void set_overlay(uint32_t width, uint32_t height, screen_update_rgb32_delegate &&update)
|
void set_overlay(uint32_t width, uint32_t height, screen_update_rgb32_delegate &&update)
|
||||||
{
|
{
|
||||||
m_overwidth = width;
|
m_overwidth = width;
|
||||||
m_overheight = height;
|
m_overheight = height;
|
||||||
m_overclip.set(0, width - 1, 0, height - 1);
|
m_overclip.set(0, width - 1, 0, height - 1);
|
||||||
m_overupdate_ind16 = screen_update_ind16_delegate();
|
|
||||||
m_overupdate_rgb32 = std::move(update);
|
m_overupdate_rgb32 = std::move(update);
|
||||||
}
|
}
|
||||||
void set_overlay_clip(int32_t minx, int32_t maxx, int32_t miny, int32_t maxy) { m_overclip.set(minx, maxx, miny, maxy); }
|
void set_overlay_clip(int32_t minx, int32_t maxx, int32_t miny, int32_t maxy) { m_overclip.set(minx, maxx, miny, maxy); }
|
||||||
@ -172,7 +153,6 @@ public:
|
|||||||
m_orig_config.m_overscalex = m_overscalex = scalex;
|
m_orig_config.m_overscalex = m_overscalex = scalex;
|
||||||
m_orig_config.m_overscaley = m_overscaley = scaley;
|
m_orig_config.m_overscaley = m_overscaley = scaley;
|
||||||
}
|
}
|
||||||
template <typename T> void set_overlay_palette(T &&tag) { m_overlay_palette.set_tag(std::forward<T>(tag)); }
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// timer IDs
|
// timer IDs
|
||||||
@ -297,7 +277,6 @@ private:
|
|||||||
uint32_t m_overwidth; // overlay screen width
|
uint32_t m_overwidth; // overlay screen width
|
||||||
uint32_t m_overheight; // overlay screen height
|
uint32_t m_overheight; // overlay screen height
|
||||||
rectangle m_overclip; // overlay visarea
|
rectangle m_overclip; // overlay visarea
|
||||||
screen_update_ind16_delegate m_overupdate_ind16; // overlay update delegate
|
|
||||||
screen_update_rgb32_delegate m_overupdate_rgb32; // overlay update delegate
|
screen_update_rgb32_delegate m_overupdate_rgb32; // overlay update delegate
|
||||||
|
|
||||||
// disc parameters
|
// disc parameters
|
||||||
@ -351,7 +330,6 @@ private:
|
|||||||
screen_bitmap m_overbitmap[2]; // overlay bitmaps
|
screen_bitmap m_overbitmap[2]; // overlay bitmaps
|
||||||
int m_overindex; // index of the overlay bitmap
|
int m_overindex; // index of the overlay bitmap
|
||||||
render_texture * m_overtex; // texture for the overlay
|
render_texture * m_overtex; // texture for the overlay
|
||||||
optional_device<palette_device> m_overlay_palette; // overlay screen palette
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// iterator - interface iterator works for subclasses too
|
// iterator - interface iterator works for subclasses too
|
||||||
|
@ -361,7 +361,7 @@ void render_texture::set_bitmap(bitmap_t &bitmap, const rectangle &sbounds, text
|
|||||||
assert(bitmap.cliprect().contains(sbounds));
|
assert(bitmap.cliprect().contains(sbounds));
|
||||||
|
|
||||||
// ensure we have a valid palette for palettized modes
|
// ensure we have a valid palette for palettized modes
|
||||||
if (format == TEXFORMAT_PALETTE16 || format == TEXFORMAT_PALETTEA16)
|
if (format == TEXFORMAT_PALETTE16)
|
||||||
assert(bitmap.palette() != nullptr);
|
assert(bitmap.palette() != nullptr);
|
||||||
|
|
||||||
// invalidate references to the old bitmap
|
// invalidate references to the old bitmap
|
||||||
@ -501,7 +501,6 @@ const rgb_t *render_texture::get_adjusted_palette(render_container &container)
|
|||||||
switch (m_format)
|
switch (m_format)
|
||||||
{
|
{
|
||||||
case TEXFORMAT_PALETTE16:
|
case TEXFORMAT_PALETTE16:
|
||||||
case TEXFORMAT_PALETTEA16:
|
|
||||||
|
|
||||||
assert(m_bitmap->palette() != nullptr);
|
assert(m_bitmap->palette() != nullptr);
|
||||||
|
|
||||||
@ -684,7 +683,6 @@ const rgb_t *render_container::bcg_lookup_table(int texformat, palette_t *palett
|
|||||||
switch (texformat)
|
switch (texformat)
|
||||||
{
|
{
|
||||||
case TEXFORMAT_PALETTE16:
|
case TEXFORMAT_PALETTE16:
|
||||||
case TEXFORMAT_PALETTEA16:
|
|
||||||
if (m_palclient == nullptr) // if adjusted palette hasn't been created yet, create it
|
if (m_palclient == nullptr) // if adjusted palette hasn't been created yet, create it
|
||||||
{
|
{
|
||||||
m_palclient = std::make_unique<palette_client>(*palette);
|
m_palclient = std::make_unique<palette_client>(*palette);
|
||||||
@ -2866,7 +2864,7 @@ void render_target::add_clear_and_optimize_primitive_list(render_primitive_list
|
|||||||
case render_primitive::QUAD:
|
case render_primitive::QUAD:
|
||||||
{
|
{
|
||||||
// stop when we hit an alpha texture
|
// stop when we hit an alpha texture
|
||||||
if (PRIMFLAG_GET_TEXFORMAT(prim.flags) == TEXFORMAT_ARGB32 || PRIMFLAG_GET_TEXFORMAT(prim.flags) == TEXFORMAT_PALETTEA16)
|
if (PRIMFLAG_GET_TEXFORMAT(prim.flags) == TEXFORMAT_ARGB32)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
// if this quad can't be cleanly removed from the extents list, we're done
|
// if this quad can't be cleanly removed from the extents list, we're done
|
||||||
|
@ -795,102 +795,6 @@ private:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
//**************************************************************************
|
|
||||||
// 16-BIT ALPHA PALETTE RASTERIZERS
|
|
||||||
//**************************************************************************
|
|
||||||
|
|
||||||
//-------------------------------------------------
|
|
||||||
// draw_quad_palettea16_alpha - perform
|
|
||||||
// rasterization using standard alpha blending
|
|
||||||
//-------------------------------------------------
|
|
||||||
|
|
||||||
static void draw_quad_palettea16_alpha(const render_primitive &prim, _PixelType *dstdata, u32 pitch, quad_setup_data &setup)
|
|
||||||
{
|
|
||||||
s32 dudx = setup.dudx;
|
|
||||||
s32 dvdx = setup.dvdx;
|
|
||||||
s32 endx = setup.endx;
|
|
||||||
|
|
||||||
// ensure all parameters are valid
|
|
||||||
assert(prim.texture.palette != nullptr);
|
|
||||||
|
|
||||||
// fast case: no coloring, no alpha
|
|
||||||
if (prim.color.r >= 1.0f && prim.color.g >= 1.0f && prim.color.b >= 1.0f && is_opaque(prim.color.a))
|
|
||||||
{
|
|
||||||
// loop over rows
|
|
||||||
for (s32 y = setup.starty; y < setup.endy; y++)
|
|
||||||
{
|
|
||||||
_PixelType *dest = dstdata + y * pitch + setup.startx;
|
|
||||||
s32 curu = setup.startu + (y - setup.starty) * setup.dudy;
|
|
||||||
s32 curv = setup.startv + (y - setup.starty) * setup.dvdy;
|
|
||||||
|
|
||||||
// loop over cols
|
|
||||||
for (s32 x = setup.startx; x < endx; x++)
|
|
||||||
{
|
|
||||||
u32 pix = get_texel_palette16a(prim.texture, curu, curv);
|
|
||||||
u32 ta = pix >> 24;
|
|
||||||
if (ta != 0)
|
|
||||||
{
|
|
||||||
u32 dpix = _NoDestRead ? 0 : *dest;
|
|
||||||
u32 invta = 0x100 - ta;
|
|
||||||
u32 r = (source32_r(pix) * ta + dest_r(dpix) * invta) >> 8;
|
|
||||||
u32 g = (source32_g(pix) * ta + dest_g(dpix) * invta) >> 8;
|
|
||||||
u32 b = (source32_b(pix) * ta + dest_b(dpix) * invta) >> 8;
|
|
||||||
|
|
||||||
*dest = dest_assemble_rgb(r, g, b);
|
|
||||||
}
|
|
||||||
dest++;
|
|
||||||
curu += dudx;
|
|
||||||
curv += dvdx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// alpha and/or coloring case
|
|
||||||
else
|
|
||||||
{
|
|
||||||
u32 sr = u32(256.0f * prim.color.r);
|
|
||||||
u32 sg = u32(256.0f * prim.color.g);
|
|
||||||
u32 sb = u32(256.0f * prim.color.b);
|
|
||||||
u32 sa = u32(256.0f * prim.color.a);
|
|
||||||
|
|
||||||
// clamp R,G,B and inverse A to 0-256 range
|
|
||||||
if (sr > 0x100) { if (s32(sr) < 0) sr = 0; else sr = 0x100; }
|
|
||||||
if (sg > 0x100) { if (s32(sg) < 0) sg = 0; else sg = 0x100; }
|
|
||||||
if (sb > 0x100) { if (s32(sb) < 0) sb = 0; else sb = 0x100; }
|
|
||||||
if (sa > 0x100) { if (s32(sa) < 0) sa = 0; else sa = 0x100; }
|
|
||||||
|
|
||||||
// loop over rows
|
|
||||||
for (s32 y = setup.starty; y < setup.endy; y++)
|
|
||||||
{
|
|
||||||
_PixelType *dest = dstdata + y * pitch + setup.startx;
|
|
||||||
s32 curu = setup.startu + (y - setup.starty) * setup.dudy;
|
|
||||||
s32 curv = setup.startv + (y - setup.starty) * setup.dvdy;
|
|
||||||
|
|
||||||
// loop over cols
|
|
||||||
for (s32 x = setup.startx; x < endx; x++)
|
|
||||||
{
|
|
||||||
u32 pix = get_texel_palette16a(prim.texture, curu, curv);
|
|
||||||
u32 ta = (pix >> 24) * sa;
|
|
||||||
if (ta != 0)
|
|
||||||
{
|
|
||||||
u32 dpix = _NoDestRead ? 0 : *dest;
|
|
||||||
u32 invsta = (0x10000 - ta) << 8;
|
|
||||||
u32 r = (source32_r(pix) * sr * ta + dest_r(dpix) * invsta) >> 24;
|
|
||||||
u32 g = (source32_g(pix) * sg * ta + dest_g(dpix) * invsta) >> 24;
|
|
||||||
u32 b = (source32_b(pix) * sb * ta + dest_b(dpix) * invsta) >> 24;
|
|
||||||
|
|
||||||
*dest = dest_assemble_rgb(r, g, b);
|
|
||||||
}
|
|
||||||
dest++;
|
|
||||||
curu += dudx;
|
|
||||||
curv += dvdx;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//**************************************************************************
|
//**************************************************************************
|
||||||
// 16-BIT YUY RASTERIZERS
|
// 16-BIT YUY RASTERIZERS
|
||||||
//**************************************************************************
|
//**************************************************************************
|
||||||
@ -1884,10 +1788,6 @@ private:
|
|||||||
draw_quad_palette16_add(prim, dstdata, pitch, setup);
|
draw_quad_palette16_add(prim, dstdata, pitch, setup);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PRIMFLAG_TEXFORMAT(TEXFORMAT_PALETTEA16) | PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA):
|
|
||||||
draw_quad_palettea16_alpha(prim, dstdata, pitch, setup);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PRIMFLAG_TEXFORMAT(TEXFORMAT_YUY16) | PRIMFLAG_BLENDMODE(BLENDMODE_NONE):
|
case PRIMFLAG_TEXFORMAT(TEXFORMAT_YUY16) | PRIMFLAG_BLENDMODE(BLENDMODE_NONE):
|
||||||
case PRIMFLAG_TEXFORMAT(TEXFORMAT_YUY16) | PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA):
|
case PRIMFLAG_TEXFORMAT(TEXFORMAT_YUY16) | PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA):
|
||||||
draw_quad_yuy16_none(prim, dstdata, pitch, setup);
|
draw_quad_yuy16_none(prim, dstdata, pitch, setup);
|
||||||
|
@ -33,8 +33,7 @@ enum screen_type_enum
|
|||||||
enum texture_format
|
enum texture_format
|
||||||
{
|
{
|
||||||
TEXFORMAT_UNDEFINED = 0, // require a format to be specified
|
TEXFORMAT_UNDEFINED = 0, // require a format to be specified
|
||||||
TEXFORMAT_PALETTE16, // 16bpp palettized, alpha ignored
|
TEXFORMAT_PALETTE16, // 16bpp palettized, no alpha
|
||||||
TEXFORMAT_PALETTEA16, // 16bpp palettized, alpha respected
|
|
||||||
TEXFORMAT_RGB32, // 32bpp 8-8-8 RGB
|
TEXFORMAT_RGB32, // 32bpp 8-8-8 RGB
|
||||||
TEXFORMAT_ARGB32, // 32bpp 8-8-8-8 ARGB
|
TEXFORMAT_ARGB32, // 32bpp 8-8-8-8 ARGB
|
||||||
TEXFORMAT_YUY16 // 16bpp 8-8 Y/Cb, Y/Cr in sequence
|
TEXFORMAT_YUY16 // 16bpp 8-8 Y/Cb, Y/Cr in sequence
|
||||||
|
@ -322,8 +322,6 @@ void alg_state::alg_r1(machine_config &config)
|
|||||||
m_laserdisc->set_screen("screen");
|
m_laserdisc->set_screen("screen");
|
||||||
m_laserdisc->set_overlay(512*2, 262, FUNC(amiga_state::screen_update_amiga));
|
m_laserdisc->set_overlay(512*2, 262, FUNC(amiga_state::screen_update_amiga));
|
||||||
m_laserdisc->set_overlay_clip((129-8)*2, (449+8-1)*2, 44-8, 244+8-1);
|
m_laserdisc->set_overlay_clip((129-8)*2, (449+8-1)*2, 44-8, 244+8-1);
|
||||||
m_laserdisc->set_overlay_palette(m_palette);
|
|
||||||
|
|
||||||
|
|
||||||
PALETTE(config, m_palette, FUNC(alg_state::amiga_palette), 4097);
|
PALETTE(config, m_palette, FUNC(alg_state::amiga_palette), 4097);
|
||||||
|
|
||||||
|
@ -163,17 +163,16 @@ private:
|
|||||||
DECLARE_READ8_MEMBER(sound_status_r);
|
DECLARE_READ8_MEMBER(sound_status_r);
|
||||||
DECLARE_WRITE8_MEMBER(decold_sound_cmd_w);
|
DECLARE_WRITE8_MEMBER(decold_sound_cmd_w);
|
||||||
virtual void machine_start() override;
|
virtual void machine_start() override;
|
||||||
uint32_t screen_update_rblaster(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
uint32_t screen_update_rblaster(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||||
INTERRUPT_GEN_MEMBER(sound_interrupt);
|
INTERRUPT_GEN_MEMBER(sound_interrupt);
|
||||||
void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t *spriteram, uint16_t tile_bank );
|
void draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect, uint8_t *spriteram, uint16_t tile_bank );
|
||||||
void rblaster_map(address_map &map);
|
void rblaster_map(address_map &map);
|
||||||
void rblaster_sound_map(address_map &map);
|
void rblaster_sound_map(address_map &map);
|
||||||
};
|
};
|
||||||
|
|
||||||
void deco_ld_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, uint8_t *spriteram, uint16_t tile_bank )
|
void deco_ld_state::draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect, uint8_t *spriteram, uint16_t tile_bank )
|
||||||
{
|
{
|
||||||
gfx_element *gfx = m_gfxdecode->gfx(1);
|
gfx_element *gfx = m_gfxdecode->gfx(1);
|
||||||
int i,spr_offs,x,y,col,fx,fy;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
[+0] ---- -x-- flip X
|
[+0] ---- -x-- flip X
|
||||||
@ -184,68 +183,67 @@ void deco_ld_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect
|
|||||||
[+3] x coord
|
[+3] x coord
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for(i=0;i<0x20;i+=4)
|
for (int i = 0; i < 0x20; i += 4)
|
||||||
{
|
{
|
||||||
if(~spriteram[i+0] & 1)
|
if (~spriteram[i] & 1)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
spr_offs = spriteram[i+1]|tile_bank;
|
int spr_offs = spriteram[i + 1] | tile_bank;
|
||||||
x = spriteram[i+3];
|
int x = spriteram[i + 3];
|
||||||
y = spriteram[i+2];
|
int y = spriteram[i + 2];
|
||||||
col = 6; /* TODO */
|
int col = 6; /* TODO */
|
||||||
fx = (spriteram[i+0] & 0x04) ? 1 : 0;
|
int fx = (spriteram[i] & 0x04) ? 1 : 0;
|
||||||
fy = (spriteram[i+0] & 0x02) ? 1 : 0;
|
int fy = (spriteram[i] & 0x02) ? 1 : 0;
|
||||||
|
|
||||||
gfx->transpen(bitmap,cliprect,spr_offs,col,fx,fy,x,y,0);
|
gfx->transpen(bitmap, cliprect, spr_offs, col, fx, fy, x, y, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(i=0x3e0;i<0x400;i+=4)
|
for (int i = 0x3e0; i < 0x400; i += 4)
|
||||||
{
|
{
|
||||||
if(~spriteram[i+0] & 1)
|
if (~spriteram[i] & 1)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
spr_offs = spriteram[i+1]|tile_bank;
|
int spr_offs = spriteram[i + 1] | tile_bank;
|
||||||
x = spriteram[i+3];
|
int x = spriteram[i + 3];
|
||||||
y = spriteram[i+2];
|
int y = spriteram[i + 2];
|
||||||
col = 6; /* TODO */
|
int col = 6; /* TODO */
|
||||||
fx = (spriteram[i+0] & 0x04) ? 1 : 0;
|
int fx = (spriteram[i] & 0x04) ? 1 : 0;
|
||||||
fy = (spriteram[i+0] & 0x02) ? 1 : 0;
|
int fy = (spriteram[i] & 0x02) ? 1 : 0;
|
||||||
|
|
||||||
gfx->transpen(bitmap,cliprect,spr_offs,col,fx,fy,x,y,0);
|
gfx->transpen(bitmap, cliprect, spr_offs, col, fx, fy, x, y, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t deco_ld_state::screen_update_rblaster(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
uint32_t deco_ld_state::screen_update_rblaster(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||||
{
|
{
|
||||||
gfx_element *gfx = m_gfxdecode->gfx(0);
|
gfx_element *gfx = m_gfxdecode->gfx(0);
|
||||||
int y,x;
|
|
||||||
|
|
||||||
bitmap.fill(0, cliprect);
|
bitmap.fill(0, cliprect);
|
||||||
|
|
||||||
draw_sprites(bitmap,cliprect,m_vram1,0x000);
|
draw_sprites(bitmap, cliprect, m_vram1, 0x000);
|
||||||
draw_sprites(bitmap,cliprect,m_vram0,0x100);
|
draw_sprites(bitmap, cliprect, m_vram0, 0x100);
|
||||||
|
|
||||||
for (y=0;y<32;y++)
|
for (int y = 0; y < 32; y++)
|
||||||
{
|
{
|
||||||
for (x=0;x<32;x++)
|
for (int x = 0; x < 32; x++)
|
||||||
{
|
{
|
||||||
int attr = m_attr0[x+y*32];
|
int attr = m_attr0[x + y * 32];
|
||||||
int tile = m_vram0[x+y*32] | ((attr & 3) << 8);
|
int tile = m_vram0[x + y * 32] | ((attr & 3) << 8);
|
||||||
int colour = (6 & 0x7); /* TODO */
|
int colour = (6 & 0x7); /* TODO */
|
||||||
|
|
||||||
gfx->transpen(bitmap,cliprect,tile|0x400,colour,0,0,x*8,y*8,0);
|
gfx->transpen(bitmap, cliprect, tile | 0x400, colour, 0, 0, x * 8, y * 8, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (y=0;y<32;y++)
|
for (int y = 0; y < 32; y++)
|
||||||
{
|
{
|
||||||
for (x=0;x<32;x++)
|
for (int x = 0; x < 32; x++)
|
||||||
{
|
{
|
||||||
int attr = m_attr1[x+y*32];
|
int attr = m_attr1[x + y * 32];
|
||||||
int tile = m_vram1[x+y*32] | ((attr & 3) << 8);
|
int tile = m_vram1[x + y * 32] | ((attr & 3) << 8);
|
||||||
int colour = (6 & 0x7); /* TODO */
|
int colour = (6 & 0x7); /* TODO */
|
||||||
|
|
||||||
gfx->transpen(bitmap,cliprect,tile,colour,0,0,x*8,y*8,0);
|
gfx->transpen(bitmap, cliprect, tile, colour, 0, 0, x * 8, y * 8, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -478,7 +476,6 @@ void deco_ld_state::rblaster(machine_config &config)
|
|||||||
SONY_LDP1000(config, m_laserdisc, 0);
|
SONY_LDP1000(config, m_laserdisc, 0);
|
||||||
m_laserdisc->set_overlay(256, 256, FUNC(deco_ld_state::screen_update_rblaster));
|
m_laserdisc->set_overlay(256, 256, FUNC(deco_ld_state::screen_update_rblaster));
|
||||||
//m_laserdisc->set_overlay_clip(0, 256-1, 8, 240-1);
|
//m_laserdisc->set_overlay_clip(0, 256-1, 8, 240-1);
|
||||||
m_laserdisc->set_overlay_palette(m_palette);
|
|
||||||
m_laserdisc->add_route(0, "lspeaker", 1.0);
|
m_laserdisc->add_route(0, "lspeaker", 1.0);
|
||||||
m_laserdisc->add_route(1, "rspeaker", 1.0);
|
m_laserdisc->add_route(1, "rspeaker", 1.0);
|
||||||
|
|
||||||
|
@ -128,7 +128,7 @@ private:
|
|||||||
virtual void machine_start() override;
|
virtual void machine_start() override;
|
||||||
virtual void machine_reset() override;
|
virtual void machine_reset() override;
|
||||||
void dleuro_palette(palette_device &palette) const;
|
void dleuro_palette(palette_device &palette) const;
|
||||||
uint32_t screen_update_dleuro(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
uint32_t screen_update_dleuro(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||||
DECLARE_WRITE_LINE_MEMBER(write_speaker);
|
DECLARE_WRITE_LINE_MEMBER(write_speaker);
|
||||||
|
|
||||||
void dleuro_io_map(address_map &map);
|
void dleuro_io_map(address_map &map);
|
||||||
@ -220,16 +220,18 @@ void dlair_state::dleuro_palette(palette_device &palette) const
|
|||||||
*
|
*
|
||||||
*************************************/
|
*************************************/
|
||||||
|
|
||||||
uint32_t dlair_state::screen_update_dleuro(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
uint32_t dlair_state::screen_update_dleuro(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||||
{
|
{
|
||||||
// redraw the overlay
|
// redraw the overlay
|
||||||
for (int y = 0; y < 32; y++)
|
for (int y = 0; y < 32; y++)
|
||||||
|
{
|
||||||
for (int x = 0; x < 32; x++)
|
for (int x = 0; x < 32; x++)
|
||||||
{
|
{
|
||||||
uint8_t const *const base = &m_videoram[y * 64 + x * 2 + 1];
|
uint8_t const *const base = &m_videoram[y * 64 + x * 2 + 1];
|
||||||
// TODO: opaque?
|
// TODO: opaque?
|
||||||
m_gfxdecode->gfx(0)->opaque(bitmap,cliprect, base[0], base[1], 0, 0, 10 * x, 16 * y);
|
m_gfxdecode->gfx(0)->opaque(bitmap, cliprect, base[0], base[1], 0, 0, 10 * x, 16 * y);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -782,7 +784,6 @@ void dlair_state::dleuro(machine_config &config)
|
|||||||
|
|
||||||
PHILIPS_22VP932(config, m_22vp932, 0);
|
PHILIPS_22VP932(config, m_22vp932, 0);
|
||||||
m_22vp932->set_overlay(256, 256, FUNC(dlair_state::screen_update_dleuro));
|
m_22vp932->set_overlay(256, 256, FUNC(dlair_state::screen_update_dleuro));
|
||||||
m_22vp932->set_overlay_palette(m_palette);
|
|
||||||
m_22vp932->add_route(0, "lspeaker", 1.0);
|
m_22vp932->add_route(0, "lspeaker", 1.0);
|
||||||
m_22vp932->add_route(1, "rspeaker", 1.0);
|
m_22vp932->add_route(1, "rspeaker", 1.0);
|
||||||
|
|
||||||
|
@ -90,7 +90,6 @@ private:
|
|||||||
/* VIDEO GOODS */
|
/* VIDEO GOODS */
|
||||||
uint32_t esh_state::screen_update_esh(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
uint32_t esh_state::screen_update_esh(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||||
{
|
{
|
||||||
int charx, chary;
|
|
||||||
const uint8_t pal_bank = m_ld_video_visible == true ? 0x10 : 0x00;
|
const uint8_t pal_bank = m_ld_video_visible == true ? 0x10 : 0x00;
|
||||||
const uint32_t trans_mask = m_ld_video_visible == true ? 0 : -1;
|
const uint32_t trans_mask = m_ld_video_visible == true ? 0 : -1;
|
||||||
gfx_element *gfx;// = m_gfxdecode->gfx(0);
|
gfx_element *gfx;// = m_gfxdecode->gfx(0);
|
||||||
@ -100,9 +99,9 @@ uint32_t esh_state::screen_update_esh(screen_device &screen, bitmap_rgb32 &bitma
|
|||||||
|
|
||||||
|
|
||||||
/* Draw tiles */
|
/* Draw tiles */
|
||||||
for (charx = 0; charx < 32; charx++)
|
for (int charx = 0; charx < 32; charx++)
|
||||||
{
|
{
|
||||||
for (chary = 0; chary < 32; chary++)
|
for (int chary = 0; chary < 32; chary++)
|
||||||
{
|
{
|
||||||
int current_screen_character = (chary*32) + charx;
|
int current_screen_character = (chary*32) + charx;
|
||||||
|
|
||||||
@ -372,7 +371,6 @@ void esh_state::esh(machine_config &config)
|
|||||||
PIONEER_LDV1000(config, m_laserdisc, 0);
|
PIONEER_LDV1000(config, m_laserdisc, 0);
|
||||||
m_laserdisc->command_strobe_callback().set(FUNC(esh_state::ld_command_strobe_cb));
|
m_laserdisc->command_strobe_callback().set(FUNC(esh_state::ld_command_strobe_cb));
|
||||||
m_laserdisc->set_overlay(256, 256, FUNC(esh_state::screen_update_esh));
|
m_laserdisc->set_overlay(256, 256, FUNC(esh_state::screen_update_esh));
|
||||||
m_laserdisc->set_overlay_palette(m_palette);
|
|
||||||
m_laserdisc->add_route(0, "lspeaker", 1.0);
|
m_laserdisc->add_route(0, "lspeaker", 1.0);
|
||||||
m_laserdisc->add_route(1, "rspeaker", 1.0);
|
m_laserdisc->add_route(1, "rspeaker", 1.0);
|
||||||
|
|
||||||
|
@ -257,35 +257,32 @@ void firefox_state::video_start()
|
|||||||
|
|
||||||
uint32_t firefox_state::screen_update_firefox(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
uint32_t firefox_state::screen_update_firefox(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||||
{
|
{
|
||||||
int sprite;
|
|
||||||
int gfxtop = screen.visible_area().top();
|
int gfxtop = screen.visible_area().top();
|
||||||
|
|
||||||
bitmap.fill(m_palette->pen_color(256), cliprect);
|
bitmap.fill(m_palette->pen_color(256), cliprect);
|
||||||
|
|
||||||
for( sprite = 0; sprite < 32; sprite++ )
|
for (int sprite = 0; sprite < 32; sprite++)
|
||||||
{
|
{
|
||||||
uint8_t *sprite_data = m_spriteram + ( 0x200 * m_sprite_bank ) + ( sprite * 16 );
|
uint8_t *sprite_data = m_spriteram + (0x200 * m_sprite_bank) + (sprite * 16);
|
||||||
int flags = sprite_data[ 0 ];
|
int flags = sprite_data[0];
|
||||||
int y = sprite_data[ 1 ] + ( 256 * ( ( flags >> 0 ) & 1 ) );
|
int y = sprite_data[1] + (256 * ((flags >> 0) & 1));
|
||||||
int x = sprite_data[ 2 ] + ( 256 * ( ( flags >> 1 ) & 1 ) );
|
int x = sprite_data[2] + (256 * ((flags >> 1) & 1));
|
||||||
|
|
||||||
if( x != 0 )
|
if (x != 0)
|
||||||
{
|
{
|
||||||
int row;
|
for (int row = 0; row < 8; row++)
|
||||||
|
|
||||||
for( row = 0; row < 8; row++ )
|
|
||||||
{
|
{
|
||||||
int color = ( flags >> 2 ) & 0x03;
|
int color = (flags >> 2) & 0x03;
|
||||||
int flipy = flags & 0x10;
|
int flipy = flags & 0x10;
|
||||||
int flipx = flags & 0x20;
|
int flipx = flags & 0x20;
|
||||||
int code = sprite_data[ 15 - row ] + ( 256 * ( ( flags >> 6 ) & 3 ) );
|
int code = sprite_data[15 - row] + (256 * ((flags >> 6) & 3));
|
||||||
|
|
||||||
m_gfxdecode->gfx( 1 )->transpen(bitmap,cliprect, code, color, flipx, flipy, x + 8, gfxtop + 500 - y - ( row * 16 ), 0 );
|
m_gfxdecode->gfx(1)->transpen(bitmap, cliprect, code, color, flipx, flipy, x + 8, gfxtop + 500 - y - (row * 16), 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_bgtiles->draw(screen, bitmap, cliprect, 0, 0 );
|
m_bgtiles->draw(screen, bitmap, cliprect, 0, 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -693,7 +690,6 @@ void firefox_state::firefox(machine_config &config)
|
|||||||
PHILIPS_22VP931(config, m_laserdisc, 0);
|
PHILIPS_22VP931(config, m_laserdisc, 0);
|
||||||
m_laserdisc->set_overlay(64*8, 525, FUNC(firefox_state::screen_update_firefox));
|
m_laserdisc->set_overlay(64*8, 525, FUNC(firefox_state::screen_update_firefox));
|
||||||
m_laserdisc->set_overlay_clip(7*8, 53*8-1, 44, 480+44);
|
m_laserdisc->set_overlay_clip(7*8, 53*8-1, 44, 480+44);
|
||||||
m_laserdisc->set_overlay_palette(m_palette);
|
|
||||||
m_laserdisc->add_route(0, "lspeaker", 0.50);
|
m_laserdisc->add_route(0, "lspeaker", 0.50);
|
||||||
m_laserdisc->add_route(1, "rspeaker", 0.50);
|
m_laserdisc->add_route(1, "rspeaker", 0.50);
|
||||||
m_laserdisc->add_ntsc_screen(config, "screen");
|
m_laserdisc->add_ntsc_screen(config, "screen");
|
||||||
|
@ -1802,7 +1802,6 @@ void gottlieb_state::g2laser(machine_config &config)
|
|||||||
m_laserdisc->set_audio(FUNC(gottlieb_state::laserdisc_audio_process), this);
|
m_laserdisc->set_audio(FUNC(gottlieb_state::laserdisc_audio_process), this);
|
||||||
m_laserdisc->set_overlay(GOTTLIEB_VIDEO_HCOUNT, GOTTLIEB_VIDEO_VCOUNT, FUNC(gottlieb_state::screen_update));
|
m_laserdisc->set_overlay(GOTTLIEB_VIDEO_HCOUNT, GOTTLIEB_VIDEO_VCOUNT, FUNC(gottlieb_state::screen_update));
|
||||||
m_laserdisc->set_overlay_clip(0, GOTTLIEB_VIDEO_HBLANK-1, 0, GOTTLIEB_VIDEO_VBLANK-8);
|
m_laserdisc->set_overlay_clip(0, GOTTLIEB_VIDEO_HBLANK-1, 0, GOTTLIEB_VIDEO_VBLANK-8);
|
||||||
m_laserdisc->set_overlay_palette("palette");
|
|
||||||
m_laserdisc->add_route(0, "speaker", 1.0);
|
m_laserdisc->add_route(0, "speaker", 1.0);
|
||||||
m_laserdisc->set_screen(m_screen);
|
m_laserdisc->set_screen(m_screen);
|
||||||
/* right channel is processed as data */
|
/* right channel is processed as data */
|
||||||
@ -1868,7 +1867,6 @@ void gottlieb_state::cobram3(machine_config &config)
|
|||||||
m_laserdisc->set_audio(FUNC(gottlieb_state::laserdisc_audio_process), this);
|
m_laserdisc->set_audio(FUNC(gottlieb_state::laserdisc_audio_process), this);
|
||||||
m_laserdisc->set_overlay(GOTTLIEB_VIDEO_HCOUNT, GOTTLIEB_VIDEO_VCOUNT, FUNC(gottlieb_state::screen_update));
|
m_laserdisc->set_overlay(GOTTLIEB_VIDEO_HCOUNT, GOTTLIEB_VIDEO_VCOUNT, FUNC(gottlieb_state::screen_update));
|
||||||
m_laserdisc->set_overlay_clip(0, GOTTLIEB_VIDEO_HBLANK-1, 0, GOTTLIEB_VIDEO_VBLANK-8);
|
m_laserdisc->set_overlay_clip(0, GOTTLIEB_VIDEO_HBLANK-1, 0, GOTTLIEB_VIDEO_VBLANK-8);
|
||||||
m_laserdisc->set_overlay_palette("palette");
|
|
||||||
m_laserdisc->add_route(0, "speaker", 1.0);
|
m_laserdisc->add_route(0, "speaker", 1.0);
|
||||||
m_laserdisc->set_screen(m_screen);
|
m_laserdisc->set_screen(m_screen);
|
||||||
/* right channel is processed as data */
|
/* right channel is processed as data */
|
||||||
|
@ -508,7 +508,6 @@ void gpworld_state::gpworld(machine_config &config)
|
|||||||
|
|
||||||
PIONEER_LDV1000(config, m_laserdisc, 0);
|
PIONEER_LDV1000(config, m_laserdisc, 0);
|
||||||
m_laserdisc->set_overlay(512, 256, FUNC(gpworld_state::screen_update));
|
m_laserdisc->set_overlay(512, 256, FUNC(gpworld_state::screen_update));
|
||||||
m_laserdisc->set_overlay_palette(m_palette);
|
|
||||||
m_laserdisc->add_route(0, "lspeaker", 1.0);
|
m_laserdisc->add_route(0, "lspeaker", 1.0);
|
||||||
m_laserdisc->add_route(1, "rspeaker", 1.0);
|
m_laserdisc->add_route(1, "rspeaker", 1.0);
|
||||||
|
|
||||||
|
@ -77,24 +77,21 @@ private:
|
|||||||
/* VIDEO GOODS */
|
/* VIDEO GOODS */
|
||||||
uint32_t istellar_state::screen_update_istellar(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
uint32_t istellar_state::screen_update_istellar(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||||
{
|
{
|
||||||
int x, y;
|
|
||||||
|
|
||||||
/* clear */
|
/* clear */
|
||||||
bitmap.fill(0, cliprect);
|
bitmap.fill(0, cliprect);
|
||||||
|
|
||||||
/* Draw tiles */
|
/* Draw tiles */
|
||||||
for (y = 0; y < 32; y++)
|
for (int y = 0; y < 32; y++)
|
||||||
{
|
{
|
||||||
for (x = 0; x < 32; x++)
|
for (int x = 0; x < 32; x++)
|
||||||
{
|
{
|
||||||
int tile = m_tile_ram[x+y*32];
|
int tile = m_tile_ram[x + y * 32];
|
||||||
int attr = m_tile_control_ram[x+y*32];
|
int attr = m_tile_control_ram[x + y * 32];
|
||||||
|
|
||||||
m_gfxdecode->gfx(0)->transpen(bitmap,cliprect,tile,attr & 0x0f,0, 0, x*8, y*8, 0);
|
m_gfxdecode->gfx(0)->transpen(bitmap, cliprect, tile, attr & 0x0f, 0, 0, x * 8, y * 8, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Draw sprites */
|
/* Draw sprites */
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -298,7 +295,6 @@ void istellar_state::istellar(machine_config &config)
|
|||||||
|
|
||||||
PIONEER_LDV1000(config, m_laserdisc, 0);
|
PIONEER_LDV1000(config, m_laserdisc, 0);
|
||||||
m_laserdisc->set_overlay(256, 256, FUNC(istellar_state::screen_update_istellar));
|
m_laserdisc->set_overlay(256, 256, FUNC(istellar_state::screen_update_istellar));
|
||||||
m_laserdisc->set_overlay_palette(m_palette);
|
|
||||||
m_laserdisc->add_route(0, "lspeaker", 1.0);
|
m_laserdisc->add_route(0, "lspeaker", 1.0);
|
||||||
m_laserdisc->add_route(1, "rspeaker", 1.0);
|
m_laserdisc->add_route(1, "rspeaker", 1.0);
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
// screen updates
|
// screen updates
|
||||||
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||||
void konblands_palette(palette_device &palette) const;
|
void konblands_palette(palette_device &palette) const;
|
||||||
DECLARE_READ8_MEMBER(ldp_r);
|
DECLARE_READ8_MEMBER(ldp_r);
|
||||||
DECLARE_WRITE8_MEMBER(ldp_w);
|
DECLARE_WRITE8_MEMBER(ldp_w);
|
||||||
@ -102,19 +102,18 @@ void konblands_state::video_start()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t konblands_state::screen_update( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect )
|
uint32_t konblands_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||||
{
|
{
|
||||||
gfx_element *gfx = m_gfxdecode->gfx(0);
|
gfx_element *gfx = m_gfxdecode->gfx(0);
|
||||||
int y,x;
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
|
||||||
for (y=0;y<32;y++)
|
for (int y = 0; y < 32; y++)
|
||||||
{
|
{
|
||||||
for (x=0;x<64;x++)
|
for (int x = 0; x < 64; x++)
|
||||||
{
|
{
|
||||||
uint8_t tile = m_vram[count];
|
uint8_t tile = m_vram[count];
|
||||||
|
|
||||||
gfx->opaque(bitmap,cliprect,tile,0,0,0,x*8,y*8);
|
gfx->opaque(bitmap, cliprect, tile, 0, 0, 0, x * 8, y * 8);
|
||||||
|
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
@ -289,7 +288,6 @@ void konblands_state::konblands(machine_config &config)
|
|||||||
m_laserdisc->command_strobe_callback().set(FUNC(konblands_state::ld_command_strobe_cb));
|
m_laserdisc->command_strobe_callback().set(FUNC(konblands_state::ld_command_strobe_cb));
|
||||||
// TODO: might be different
|
// TODO: might be different
|
||||||
m_laserdisc->set_overlay(512, 256, FUNC(konblands_state::screen_update));
|
m_laserdisc->set_overlay(512, 256, FUNC(konblands_state::screen_update));
|
||||||
m_laserdisc->set_overlay_palette("palette");
|
|
||||||
|
|
||||||
/* video hardware */
|
/* video hardware */
|
||||||
m_laserdisc->add_ntsc_screen(config, "screen");
|
m_laserdisc->add_ntsc_screen(config, "screen");
|
||||||
|
@ -124,8 +124,6 @@ private:
|
|||||||
/* VIDEO GOODS */
|
/* VIDEO GOODS */
|
||||||
uint32_t lgp_state::screen_update_lgp(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
uint32_t lgp_state::screen_update_lgp(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||||
{
|
{
|
||||||
int charx, chary;
|
|
||||||
|
|
||||||
/* make color 0 transparent */
|
/* make color 0 transparent */
|
||||||
m_palette->set_pen_color(0, rgb_t(0,0,0,0));
|
m_palette->set_pen_color(0, rgb_t(0,0,0,0));
|
||||||
|
|
||||||
@ -133,18 +131,18 @@ uint32_t lgp_state::screen_update_lgp(screen_device &screen, bitmap_rgb32 &bitma
|
|||||||
bitmap.fill(0, cliprect);
|
bitmap.fill(0, cliprect);
|
||||||
|
|
||||||
/* Draw tiles */
|
/* Draw tiles */
|
||||||
for (charx = 0; charx < 32; charx++)
|
for (int charx = 0; charx < 32; charx++)
|
||||||
{
|
{
|
||||||
for (chary = 0; chary < 32; chary++)
|
for (int chary = 0; chary < 32; chary++)
|
||||||
{
|
{
|
||||||
int current_screen_character = (chary*32) + charx;
|
int current_screen_character = (chary * 32) + charx;
|
||||||
|
|
||||||
/* Somewhere there's a flag that offsets the tilemap by 0x100*x */
|
/* Somewhere there's a flag that offsets the tilemap by 0x100*x */
|
||||||
/* Palette is likely set somewhere as well (tile_control_ram?) */
|
/* Palette is likely set somewhere as well (tile_control_ram?) */
|
||||||
m_gfxdecode->gfx(0)->transpen(bitmap,cliprect,
|
m_gfxdecode->gfx(0)->transpen(bitmap, cliprect,
|
||||||
m_tile_ram[current_screen_character],
|
m_tile_ram[current_screen_character],
|
||||||
0,
|
0,
|
||||||
0, 0, charx*8, chary*8, 0);
|
0, 0, charx * 8, chary * 8, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -426,7 +424,6 @@ void lgp_state::lgp(machine_config &config)
|
|||||||
PIONEER_LDV1000(config, m_laserdisc, 0);
|
PIONEER_LDV1000(config, m_laserdisc, 0);
|
||||||
m_laserdisc->command_strobe_callback().set(FUNC(lgp_state::ld_command_strobe_cb));
|
m_laserdisc->command_strobe_callback().set(FUNC(lgp_state::ld_command_strobe_cb));
|
||||||
m_laserdisc->set_overlay(256, 256, FUNC(lgp_state::screen_update_lgp));
|
m_laserdisc->set_overlay(256, 256, FUNC(lgp_state::screen_update_lgp));
|
||||||
m_laserdisc->set_overlay_palette(m_palette);
|
|
||||||
m_laserdisc->add_route(0, "lspeaker", 1.0);
|
m_laserdisc->add_route(0, "lspeaker", 1.0);
|
||||||
m_laserdisc->add_route(1, "rspeaker", 1.0);
|
m_laserdisc->add_route(1, "rspeaker", 1.0);
|
||||||
|
|
||||||
|
@ -82,15 +82,13 @@ private:
|
|||||||
/* VIDEO GOODS */
|
/* VIDEO GOODS */
|
||||||
void segald_state::astron_draw_characters(bitmap_rgb32 &bitmap,const rectangle &cliprect)
|
void segald_state::astron_draw_characters(bitmap_rgb32 &bitmap,const rectangle &cliprect)
|
||||||
{
|
{
|
||||||
uint8_t characterX, characterY;
|
for (uint8_t character_x = 0; character_x < 32; character_x++)
|
||||||
|
|
||||||
for (characterX = 0; characterX < 32; characterX++)
|
|
||||||
{
|
{
|
||||||
for (characterY = 0; characterY < 32; characterY++)
|
for (uint8_t character_y = 0; character_y < 32; character_y++)
|
||||||
{
|
{
|
||||||
int current_screen_character = (characterY*32) + characterX;
|
int current_screen_character = (character_y * 32) + character_x;
|
||||||
m_gfxdecode->gfx(0)->transpen(bitmap,cliprect, m_fix_ram[current_screen_character],
|
m_gfxdecode->gfx(0)->transpen(bitmap, cliprect, m_fix_ram[current_screen_character],
|
||||||
1, 0, 0, characterX*8, characterY*8, 0);
|
1, 0, 0, character_x * 8, character_y * 8, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -107,15 +105,11 @@ void segald_state::astron_draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cl
|
|||||||
/* const uint8_t SPR_GFXOFS_LO = 6;*/
|
/* const uint8_t SPR_GFXOFS_LO = 6;*/
|
||||||
/* const uint8_t SPR_GFXOFS_HI = 7;*/
|
/* const uint8_t SPR_GFXOFS_HI = 7;*/
|
||||||
|
|
||||||
int sx,sy;
|
for (int spr_number = 0; spr_number < 32; spr_number++)
|
||||||
int spr_number;
|
|
||||||
int spr_base;
|
|
||||||
|
|
||||||
for (spr_number = 0; spr_number < 32; spr_number++)
|
|
||||||
{
|
{
|
||||||
spr_base = 0x10 * spr_number;
|
int spr_base = 0x10 * spr_number;
|
||||||
sy = m_obj_ram[spr_base + SPR_Y_TOP];
|
int sy = m_obj_ram[spr_base + SPR_Y_TOP];
|
||||||
sx = m_obj_ram[spr_base + SPR_X_LO];
|
int sx = m_obj_ram[spr_base + SPR_X_LO];
|
||||||
|
|
||||||
if (sx != 0 || sy != 0)
|
if (sx != 0 || sy != 0)
|
||||||
logerror("Hey! A sprite's not at 0,0 : %d %d", sx, sy);
|
logerror("Hey! A sprite's not at 0,0 : %d %d", sx, sy);
|
||||||
@ -387,7 +381,6 @@ void segald_state::astron(machine_config &config)
|
|||||||
|
|
||||||
PIONEER_LDV1000(config, m_laserdisc, 0);
|
PIONEER_LDV1000(config, m_laserdisc, 0);
|
||||||
m_laserdisc->set_overlay(256, 256, FUNC(segald_state::screen_update_astron));
|
m_laserdisc->set_overlay(256, 256, FUNC(segald_state::screen_update_astron));
|
||||||
m_laserdisc->set_overlay_palette(m_palette);
|
|
||||||
m_laserdisc->add_route(0, "lspeaker", 1.0);
|
m_laserdisc->add_route(0, "lspeaker", 1.0);
|
||||||
m_laserdisc->add_route(1, "rspeaker", 1.0);
|
m_laserdisc->add_route(1, "rspeaker", 1.0);
|
||||||
|
|
||||||
|
@ -346,7 +346,6 @@ void superdq_state::superdq(machine_config &config)
|
|||||||
|
|
||||||
PIONEER_LDV1000(config, m_laserdisc, 0);
|
PIONEER_LDV1000(config, m_laserdisc, 0);
|
||||||
m_laserdisc->set_overlay(256, 256, FUNC(superdq_state::screen_update_superdq));
|
m_laserdisc->set_overlay(256, 256, FUNC(superdq_state::screen_update_superdq));
|
||||||
m_laserdisc->set_overlay_palette(m_palette);
|
|
||||||
m_laserdisc->add_route(0, "lspeaker", 1.0);
|
m_laserdisc->add_route(0, "lspeaker", 1.0);
|
||||||
m_laserdisc->add_route(1, "rspeaker", 1.0);
|
m_laserdisc->add_route(1, "rspeaker", 1.0);
|
||||||
|
|
||||||
|
236
src/osd/modules/render/bgfx/shaders/chains/lottes/fs.sc
Normal file
236
src/osd/modules/render/bgfx/shaders/chains/lottes/fs.sc
Normal file
@ -0,0 +1,236 @@
|
|||||||
|
//
|
||||||
|
// PUBLIC DOMAIN CRT STYLED SCAN-LINE SHADER
|
||||||
|
//
|
||||||
|
// by Timothy Lottes
|
||||||
|
//
|
||||||
|
// This is more along the style of a really good CGA arcade monitor.
|
||||||
|
// With RGB inputs instead of NTSC.
|
||||||
|
// The shadow mask example has the mask rotated 90 degrees for less chromatic aberration.
|
||||||
|
//
|
||||||
|
// Left it unoptimized to show the theory behind the algorithm.
|
||||||
|
//
|
||||||
|
// It is an example what I personally would want as a display option for pixel art games.
|
||||||
|
// Please take and use, change, or whatever.
|
||||||
|
|
||||||
|
//Comment these out to disable the corresponding effect.
|
||||||
|
//#define VERTICAL //rotates shadow mask effect to fix vertical games on landscape monitors
|
||||||
|
//#define CURVATURE //Screen curvature effect.
|
||||||
|
#define YUV //Tint and Saturation adjustments. You adjust the settings in Lottes_CRT.vsh now...
|
||||||
|
#define GAMMA_CONTRAST_BOOST //Expands contrast and makes image brighter but causes clipping.
|
||||||
|
#define BLOOM //enables a bloom effect
|
||||||
|
//#define MASK_APERTURE_GRILL //Only uncomment one of the MASK patterns at a time...
|
||||||
|
#define MASK_TV
|
||||||
|
//#define MASK_VGA
|
||||||
|
//#define ORIGINAL_SCANLINES //Enable to use the original scanlines.
|
||||||
|
//#define ORIGINAL_HARDPIX //Enable to use the original hardPix calculation.
|
||||||
|
|
||||||
|
//Normal MAME GLSL Uniforms
|
||||||
|
uniform sampler2D color_texture;
|
||||||
|
uniform vec2 color_texture_sz; // size of color_texture
|
||||||
|
uniform vec2 color_texture_pow2_sz; // size of color texture rounded up to power of 2
|
||||||
|
uniform vec2 screen_texture_sz; // size of output resolution
|
||||||
|
uniform vec2 screen_texture_pow2_sz; // size of output resolution rounded up to power of 2
|
||||||
|
|
||||||
|
//CRT Filter Variables
|
||||||
|
const float hardScan=-20.0; //-8,-12,-16, etc to make scalines more prominent.
|
||||||
|
const vec2 warp=vec2(1.0/64.0,1.0/48.0); //adjusts the warp filter (curvature).
|
||||||
|
const float maskDark=0.4; //Sets how dark a "dark subpixel" is in the aperture pattern.
|
||||||
|
const float maskLight=1.5; //Sets how dark a "bright subpixel" is in the aperture pattern.
|
||||||
|
const float hardPix=-6.0; //-1,-2,-4, etc to make the upscaling sharper.
|
||||||
|
const float hardBloomScan=-2.5;
|
||||||
|
const float hardBloomPix=-1.75;
|
||||||
|
const float bloomAmount=1.0/12.0; //Lower this if there is too much bloom!
|
||||||
|
const float blackClip = 0.02;
|
||||||
|
const float brightMult = 1.2;
|
||||||
|
const float maskStrength = 0.6; //This sets the strength of the shadow mask effect
|
||||||
|
const vec3 gammaBoost = vec3(1.0/1.15, 1.0/1.15, 1.0/1.15);
|
||||||
|
varying vec3 YUVr;
|
||||||
|
varying vec3 YUVg;
|
||||||
|
varying vec3 YUVb;
|
||||||
|
|
||||||
|
//CRT Filter Functions
|
||||||
|
|
||||||
|
// sRGB to Linear.
|
||||||
|
// Assuing using sRGB typed textures this should not be needed.
|
||||||
|
float ToLinear1(float c){return(c<=0.04045)?c/12.92:pow((c+0.055)/1.055,2.4);}
|
||||||
|
vec3 ToLinear(vec3 c){return vec3(ToLinear1(c.r),ToLinear1(c.g),ToLinear1(c.b));}
|
||||||
|
|
||||||
|
// Linear to sRGB.
|
||||||
|
// Assuing using sRGB typed textures this should not be needed.
|
||||||
|
float ToSrgb1(float c){return(c<0.0031308?c*12.92:1.055*pow(c,0.41666)-0.055);}
|
||||||
|
vec3 ToSrgb(vec3 c){return vec3(ToSrgb1(c.r),ToSrgb1(c.g),ToSrgb1(c.b));}
|
||||||
|
|
||||||
|
// Nearest emulated sample given floating point position and texel offset.
|
||||||
|
// Also zero's off screen.
|
||||||
|
vec3 Fetch(vec2 pos,vec2 off){
|
||||||
|
pos=(floor(pos*color_texture_pow2_sz+off)+0.5)/color_texture_pow2_sz;
|
||||||
|
//if(max(abs(pos.x-0.5),abs(pos.y-0.5))>0.5)return vec3(0.0,0.0,0.0);
|
||||||
|
return ToLinear(texture2D(color_texture,pos.xy).rgb);}
|
||||||
|
|
||||||
|
// Distance in emulated pixels to nearest texel.
|
||||||
|
vec2 Dist(vec2 pos){pos=pos*color_texture_pow2_sz;return -((pos-floor(pos))-vec2(0.5));}
|
||||||
|
|
||||||
|
// 1D Gaussian.
|
||||||
|
float Gaus(float pos,float scale){return exp2(scale*pos*pos);}
|
||||||
|
|
||||||
|
// 3-tap Gaussian filter along horz line.
|
||||||
|
vec3 Horz3(vec2 pos,float off){
|
||||||
|
vec3 b=Fetch(pos,vec2(-1.0,off));
|
||||||
|
vec3 c=Fetch(pos,vec2( 0.0,off));
|
||||||
|
vec3 d=Fetch(pos,vec2( 1.0,off));
|
||||||
|
float dst=Dist(pos).x;
|
||||||
|
// Convert distance to weight.
|
||||||
|
#ifdef ORIGINAL_HARDPIX
|
||||||
|
float scale=hardPix;
|
||||||
|
#else
|
||||||
|
float scale=hardPix * max(0.2, 1.5-color_texture_sz.x/512.0);
|
||||||
|
#endif
|
||||||
|
float wb=Gaus(dst-1.0,scale);
|
||||||
|
float wc=Gaus(dst+0.0,scale);
|
||||||
|
float wd=Gaus(dst+1.0,scale);
|
||||||
|
// Return filtered sample.
|
||||||
|
return (b*wb+c*wc+d*wd)/(wb+wc+wd);}
|
||||||
|
|
||||||
|
// 5-tap Gaussian filter along horz line.
|
||||||
|
vec3 Horz5(vec2 pos,float off){
|
||||||
|
vec3 a=Fetch(pos,vec2(-2.0,off));
|
||||||
|
vec3 b=Fetch(pos,vec2(-1.0,off));
|
||||||
|
vec3 c=Fetch(pos,vec2( 0.0,off));
|
||||||
|
vec3 d=Fetch(pos,vec2( 1.0,off));
|
||||||
|
vec3 e=Fetch(pos,vec2( 2.0,off));
|
||||||
|
float dst=Dist(pos).x;
|
||||||
|
// Convert distance to weight.
|
||||||
|
#ifdef ORIGINAL_HARDPIX
|
||||||
|
float scale=hardPix;
|
||||||
|
#else
|
||||||
|
float scale=hardPix * max(0.2, 1.5-color_texture_sz.x/512.0);
|
||||||
|
#endif
|
||||||
|
float wa=Gaus(dst-2.0,scale);
|
||||||
|
float wb=Gaus(dst-1.0,scale);
|
||||||
|
float wc=Gaus(dst+0.0,scale);
|
||||||
|
float wd=Gaus(dst+1.0,scale);
|
||||||
|
float we=Gaus(dst+2.0,scale);
|
||||||
|
// Return filtered sample.
|
||||||
|
return (a*wa+b*wb+c*wc+d*wd+e*we)/(wa+wb+wc+wd+we);}
|
||||||
|
|
||||||
|
vec3 Horz7(vec2 pos,float off){
|
||||||
|
vec3 a=Fetch(pos,vec2(-3.0,off));
|
||||||
|
vec3 b=Fetch(pos,vec2(-2.0,off));
|
||||||
|
vec3 c=Fetch(pos,vec2(-1.0,off));
|
||||||
|
vec3 d=Fetch(pos,vec2( 0.0,off));
|
||||||
|
vec3 e=Fetch(pos,vec2( 1.0,off));
|
||||||
|
vec3 f=Fetch(pos,vec2( 2.0,off));
|
||||||
|
vec3 g=Fetch(pos,vec2( 3.0,off));
|
||||||
|
float dst=Dist(pos).x;
|
||||||
|
// Convert distance to weight.
|
||||||
|
float scale=hardBloomPix* max(0.5, 1.5-color_texture_sz.x/512.0);
|
||||||
|
float wa=Gaus(dst-3.0,scale);
|
||||||
|
float wb=Gaus(dst-2.0,scale);
|
||||||
|
float wc=Gaus(dst-1.0,scale);
|
||||||
|
float wd=Gaus(dst+0.0,scale);
|
||||||
|
float we=Gaus(dst+1.0,scale);
|
||||||
|
float wf=Gaus(dst+2.0,scale);
|
||||||
|
float wg=Gaus(dst+3.0,scale);
|
||||||
|
// Return filtered sample.
|
||||||
|
return (a*wa+b*wb+c*wc+d*wd+e*we+f*wf+g*wg)/(wa+wb+wc+wd+we+wf+wg);}
|
||||||
|
|
||||||
|
// Return scanline weight.
|
||||||
|
float Scan(vec2 pos,float off){
|
||||||
|
float dst=Dist(pos).y;
|
||||||
|
#ifdef ORIGINAL_SCANLINES
|
||||||
|
return Gaus(dst+off,hardScan);}
|
||||||
|
#else
|
||||||
|
vec3 col=Fetch(pos,vec2(0.0));
|
||||||
|
return Gaus(dst+off,hardScan/(dot(col,col)*0.25+1.0));} //Modified to make scanline respond to pixel brightness
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Return scanline weight for bloom.
|
||||||
|
float BloomScan(vec2 pos,float off){
|
||||||
|
float dst=Dist(pos).y;
|
||||||
|
return Gaus(dst+off,hardBloomScan);}
|
||||||
|
|
||||||
|
// Allow nearest three lines to effect pixel.
|
||||||
|
vec3 Tri(vec2 pos){
|
||||||
|
vec3 a=Horz3(pos,-1.0);
|
||||||
|
vec3 b=Horz5(pos, 0.0);
|
||||||
|
vec3 c=Horz3(pos, 1.0);
|
||||||
|
float wa=Scan(pos,-1.0);
|
||||||
|
float wb=Scan(pos, 0.0);
|
||||||
|
float wc=Scan(pos, 1.0);
|
||||||
|
return a*wa+b*wb+c*wc;}
|
||||||
|
|
||||||
|
// Small bloom.
|
||||||
|
vec3 Bloom(vec2 pos){
|
||||||
|
vec3 a=Horz5(pos,-2.0);
|
||||||
|
vec3 b=Horz7(pos,-1.0);
|
||||||
|
vec3 c=Horz7(pos, 0.0);
|
||||||
|
vec3 d=Horz7(pos, 1.0);
|
||||||
|
vec3 e=Horz5(pos, 2.0);
|
||||||
|
float wa=BloomScan(pos,-2.0);
|
||||||
|
float wb=BloomScan(pos,-1.0);
|
||||||
|
float wc=BloomScan(pos, 0.0);
|
||||||
|
float wd=BloomScan(pos, 1.0);
|
||||||
|
float we=BloomScan(pos, 2.0);
|
||||||
|
return a*wa+b*wb+c*wc+d*wd+e*we;}
|
||||||
|
|
||||||
|
// Distortion of scanlines, and end of screen alpha.
|
||||||
|
vec2 Warp(vec2 pos){
|
||||||
|
pos=pos*2.0-1.0;
|
||||||
|
pos*=vec2(1.0+(pos.y*pos.y)*warp.x,1.0+(pos.x*pos.x)*warp.y);
|
||||||
|
return pos*0.5+0.5;}
|
||||||
|
|
||||||
|
// Shadow mask.
|
||||||
|
|
||||||
|
vec3 Mask(vec2 pos){
|
||||||
|
#ifdef VERTICAL
|
||||||
|
pos.xy=pos.yx;
|
||||||
|
#endif
|
||||||
|
#ifdef MASK_VGA
|
||||||
|
pos.x+=pos.y*3.0;
|
||||||
|
vec3 mask=vec3(maskDark,maskDark,maskDark);
|
||||||
|
pos.x=fract(pos.x/6.0);
|
||||||
|
if(pos.x<0.333)mask.r=maskLight;
|
||||||
|
else if(pos.x<0.666)mask.g=maskLight;
|
||||||
|
else mask.b=maskLight;
|
||||||
|
#endif
|
||||||
|
#ifdef MASK_TV
|
||||||
|
float line=maskLight;
|
||||||
|
float odd=0.0;
|
||||||
|
if(fract(pos.x/6.0)<0.5)odd=1.0;
|
||||||
|
if(fract((pos.y+odd)/2.0)<0.5)line=maskDark;
|
||||||
|
pos.x=fract(pos.x/3.0);
|
||||||
|
vec3 mask=vec3(maskDark,maskDark,maskDark);
|
||||||
|
if(pos.x<0.333)mask.r=maskLight;
|
||||||
|
else if(pos.x<0.666)mask.g=maskLight;
|
||||||
|
else mask.b=maskLight;
|
||||||
|
mask*=line;
|
||||||
|
#endif
|
||||||
|
#ifdef MASK_APERTURE_GRILL
|
||||||
|
pos.x=fract(pos.x/3.0);
|
||||||
|
vec3 mask=vec3(maskDark,maskDark,maskDark);
|
||||||
|
if(pos.x<0.333)mask.r=maskLight;
|
||||||
|
else if(pos.x<0.666)mask.g=maskLight;
|
||||||
|
else mask.b=maskLight;
|
||||||
|
#endif
|
||||||
|
return mask;}
|
||||||
|
|
||||||
|
void main(void){
|
||||||
|
#ifdef CURVATURE
|
||||||
|
vec2 pos=Warp(gl_TexCoord[0].xy);
|
||||||
|
#else
|
||||||
|
vec2 pos=gl_TexCoord[0].xy;
|
||||||
|
#endif
|
||||||
|
gl_FragColor.a=texture2D(color_texture,pos.xy).a;
|
||||||
|
gl_FragColor.rgb=Tri(pos)*mix(vec3(1.0),Mask(gl_FragCoord.xy),maskStrength);
|
||||||
|
#ifdef BLOOM
|
||||||
|
gl_FragColor.rgb+=Bloom(pos)*bloomAmount;
|
||||||
|
#endif
|
||||||
|
#ifdef YUV
|
||||||
|
gl_FragColor.rgb = vec3(dot(YUVr,gl_FragColor.rgb),dot(YUVg,gl_FragColor.rgb),dot(YUVb,gl_FragColor.rgb));
|
||||||
|
gl_FragColor.rgb=clamp(gl_FragColor.rgb,0.0,1.0);
|
||||||
|
#endif
|
||||||
|
#ifdef GAMMA_CONTRAST_BOOST
|
||||||
|
gl_FragColor.rgb=brightMult*pow(gl_FragColor.rgb,gammaBoost )-vec3(blackClip);
|
||||||
|
#endif
|
||||||
|
gl_FragColor.rgb=clamp(ToSrgb(gl_FragColor.rgb),0.0,1.0);
|
||||||
|
}
|
236
src/osd/modules/render/bgfx/shaders/chains/lottes/fs_vert.sc
Normal file
236
src/osd/modules/render/bgfx/shaders/chains/lottes/fs_vert.sc
Normal file
@ -0,0 +1,236 @@
|
|||||||
|
//
|
||||||
|
// PUBLIC DOMAIN CRT STYLED SCAN-LINE SHADER
|
||||||
|
//
|
||||||
|
// by Timothy Lottes
|
||||||
|
//
|
||||||
|
// This is more along the style of a really good CGA arcade monitor.
|
||||||
|
// With RGB inputs instead of NTSC.
|
||||||
|
// The shadow mask example has the mask rotated 90 degrees for less chromatic aberration.
|
||||||
|
//
|
||||||
|
// Left it unoptimized to show the theory behind the algorithm.
|
||||||
|
//
|
||||||
|
// It is an example what I personally would want as a display option for pixel art games.
|
||||||
|
// Please take and use, change, or whatever.
|
||||||
|
|
||||||
|
//Comment these out to disable the corresponding effect.
|
||||||
|
#define VERTICAL //rotates shadow mask effect to fix vertical games on landscape monitors
|
||||||
|
#define CURVATURE //Screen curvature effect.
|
||||||
|
#define YUV //Tint and Saturation adjustments. You adjust the settings in Lottes_CRT.vsh now...
|
||||||
|
#define GAMMA_CONTRAST_BOOST //Expands contrast and makes image brighter but causes clipping.
|
||||||
|
#define BLOOM //enables a bloom effect
|
||||||
|
//#define MASK_APERTURE_GRILL //Only uncomment one of the MASK patterns at a time...
|
||||||
|
#define MASK_TV
|
||||||
|
//#define MASK_VGA
|
||||||
|
//#define ORIGINAL_SCANLINES //Enable to use the original scanlines.
|
||||||
|
//#define ORIGINAL_HARDPIX //Enable to use the original hardPix calculation.
|
||||||
|
|
||||||
|
//Normal MAME GLSL Uniforms
|
||||||
|
uniform sampler2D color_texture;
|
||||||
|
uniform vec2 color_texture_sz; // size of color_texture
|
||||||
|
uniform vec2 color_texture_pow2_sz; // size of color texture rounded up to power of 2
|
||||||
|
uniform vec2 screen_texture_sz; // size of output resolution
|
||||||
|
uniform vec2 screen_texture_pow2_sz; // size of output resolution rounded up to power of 2
|
||||||
|
|
||||||
|
//CRT Filter Variables
|
||||||
|
const float hardScan=-20.0; //-8,-12,-16, etc to make scalines more prominent.
|
||||||
|
const vec2 warp=vec2(1.0/64.0,1.0/48.0); //adjusts the warp filter (curvature).
|
||||||
|
const float maskDark=0.4; //Sets how dark a "dark subpixel" is in the aperture pattern.
|
||||||
|
const float maskLight=1.5; //Sets how dark a "bright subpixel" is in the aperture pattern.
|
||||||
|
const float hardPix=-5.0; //-1,-2,-4, etc to make the upscaling sharper.
|
||||||
|
const float hardBloomScan=-2.5;
|
||||||
|
const float hardBloomPix=-1.75;
|
||||||
|
const float bloomAmount=1.0/12.0; //Lower this if there is too much bloom!
|
||||||
|
const float blackClip = 0.02;
|
||||||
|
const float brightMult = 1.2;
|
||||||
|
const float maskStrength = 0.6; //This sets the strength of the shadow mask effect
|
||||||
|
const vec3 gammaBoost = vec3(1.0/1.15, 1.0/1.15, 1.0/1.15);
|
||||||
|
varying vec3 YUVr;
|
||||||
|
varying vec3 YUVg;
|
||||||
|
varying vec3 YUVb;
|
||||||
|
|
||||||
|
//CRT Filter Functions
|
||||||
|
|
||||||
|
// sRGB to Linear.
|
||||||
|
// Assuing using sRGB typed textures this should not be needed.
|
||||||
|
float ToLinear1(float c){return(c<=0.04045)?c/12.92:pow((c+0.055)/1.055,2.4);}
|
||||||
|
vec3 ToLinear(vec3 c){return vec3(ToLinear1(c.r),ToLinear1(c.g),ToLinear1(c.b));}
|
||||||
|
|
||||||
|
// Linear to sRGB.
|
||||||
|
// Assuing using sRGB typed textures this should not be needed.
|
||||||
|
float ToSrgb1(float c){return(c<0.0031308?c*12.92:1.055*pow(c,0.41666)-0.055);}
|
||||||
|
vec3 ToSrgb(vec3 c){return vec3(ToSrgb1(c.r),ToSrgb1(c.g),ToSrgb1(c.b));}
|
||||||
|
|
||||||
|
// Nearest emulated sample given floating point position and texel offset.
|
||||||
|
// Also zero's off screen.
|
||||||
|
vec3 Fetch(vec2 pos,vec2 off){
|
||||||
|
pos=(floor(pos*color_texture_pow2_sz+off)+0.5)/color_texture_pow2_sz;
|
||||||
|
//if(max(abs(pos.x-0.5),abs(pos.y-0.5))>0.5)return vec3(0.0,0.0,0.0);
|
||||||
|
return ToLinear(texture2D(color_texture,pos.xy).rgb);}
|
||||||
|
|
||||||
|
// Distance in emulated pixels to nearest texel.
|
||||||
|
vec2 Dist(vec2 pos){pos=pos*color_texture_pow2_sz;return -((pos-floor(pos))-vec2(0.5));}
|
||||||
|
|
||||||
|
// 1D Gaussian.
|
||||||
|
float Gaus(float pos,float scale){return exp2(scale*pos*pos);}
|
||||||
|
|
||||||
|
// 3-tap Gaussian filter along horz line.
|
||||||
|
vec3 Horz3(vec2 pos,float off){
|
||||||
|
vec3 b=Fetch(pos,vec2(-1.0,off));
|
||||||
|
vec3 c=Fetch(pos,vec2( 0.0,off));
|
||||||
|
vec3 d=Fetch(pos,vec2( 1.0,off));
|
||||||
|
float dst=Dist(pos).x;
|
||||||
|
// Convert distance to weight.
|
||||||
|
#ifdef ORIGINAL_HARDPIX
|
||||||
|
float scale=hardPix;
|
||||||
|
#else
|
||||||
|
float scale=hardPix * max(0.2, 1.5-color_texture_sz.x/512.0);
|
||||||
|
#endif
|
||||||
|
float wb=Gaus(dst-1.0,scale);
|
||||||
|
float wc=Gaus(dst+0.0,scale);
|
||||||
|
float wd=Gaus(dst+1.0,scale);
|
||||||
|
// Return filtered sample.
|
||||||
|
return (b*wb+c*wc+d*wd)/(wb+wc+wd);}
|
||||||
|
|
||||||
|
// 5-tap Gaussian filter along horz line.
|
||||||
|
vec3 Horz5(vec2 pos,float off){
|
||||||
|
vec3 a=Fetch(pos,vec2(-2.0,off));
|
||||||
|
vec3 b=Fetch(pos,vec2(-1.0,off));
|
||||||
|
vec3 c=Fetch(pos,vec2( 0.0,off));
|
||||||
|
vec3 d=Fetch(pos,vec2( 1.0,off));
|
||||||
|
vec3 e=Fetch(pos,vec2( 2.0,off));
|
||||||
|
float dst=Dist(pos).x;
|
||||||
|
// Convert distance to weight.
|
||||||
|
#ifdef ORIGINAL_HARDPIX
|
||||||
|
float scale=hardPix;
|
||||||
|
#else
|
||||||
|
float scale=hardPix * max(0.2, 1.5-color_texture_sz.x/512.0);
|
||||||
|
#endif
|
||||||
|
float wa=Gaus(dst-2.0,scale);
|
||||||
|
float wb=Gaus(dst-1.0,scale);
|
||||||
|
float wc=Gaus(dst+0.0,scale);
|
||||||
|
float wd=Gaus(dst+1.0,scale);
|
||||||
|
float we=Gaus(dst+2.0,scale);
|
||||||
|
// Return filtered sample.
|
||||||
|
return (a*wa+b*wb+c*wc+d*wd+e*we)/(wa+wb+wc+wd+we);}
|
||||||
|
|
||||||
|
vec3 Horz7(vec2 pos,float off){
|
||||||
|
vec3 a=Fetch(pos,vec2(-3.0,off));
|
||||||
|
vec3 b=Fetch(pos,vec2(-2.0,off));
|
||||||
|
vec3 c=Fetch(pos,vec2(-1.0,off));
|
||||||
|
vec3 d=Fetch(pos,vec2( 0.0,off));
|
||||||
|
vec3 e=Fetch(pos,vec2( 1.0,off));
|
||||||
|
vec3 f=Fetch(pos,vec2( 2.0,off));
|
||||||
|
vec3 g=Fetch(pos,vec2( 3.0,off));
|
||||||
|
float dst=Dist(pos).x;
|
||||||
|
// Convert distance to weight.
|
||||||
|
float scale=hardBloomPix* max(0.5, 1.5-color_texture_sz.x/512.0);
|
||||||
|
float wa=Gaus(dst-3.0,scale);
|
||||||
|
float wb=Gaus(dst-2.0,scale);
|
||||||
|
float wc=Gaus(dst-1.0,scale);
|
||||||
|
float wd=Gaus(dst+0.0,scale);
|
||||||
|
float we=Gaus(dst+1.0,scale);
|
||||||
|
float wf=Gaus(dst+2.0,scale);
|
||||||
|
float wg=Gaus(dst+3.0,scale);
|
||||||
|
// Return filtered sample.
|
||||||
|
return (a*wa+b*wb+c*wc+d*wd+e*we+f*wf+g*wg)/(wa+wb+wc+wd+we+wf+wg);}
|
||||||
|
|
||||||
|
// Return scanline weight.
|
||||||
|
float Scan(vec2 pos,float off){
|
||||||
|
float dst=Dist(pos).y;
|
||||||
|
#ifdef ORIGINAL_SCANLINES
|
||||||
|
return Gaus(dst+off,hardScan);}
|
||||||
|
#else
|
||||||
|
vec3 col=Fetch(pos,vec2(0.0));
|
||||||
|
return Gaus(dst+off,hardScan/(dot(col,col)*0.25+1.0));} //Modified to make scanline respond to pixel brightness
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Return scanline weight for bloom.
|
||||||
|
float BloomScan(vec2 pos,float off){
|
||||||
|
float dst=Dist(pos).y;
|
||||||
|
return Gaus(dst+off,hardBloomScan);}
|
||||||
|
|
||||||
|
// Allow nearest three lines to effect pixel.
|
||||||
|
vec3 Tri(vec2 pos){
|
||||||
|
vec3 a=Horz3(pos,-1.0);
|
||||||
|
vec3 b=Horz5(pos, 0.0);
|
||||||
|
vec3 c=Horz3(pos, 1.0);
|
||||||
|
float wa=Scan(pos,-1.0);
|
||||||
|
float wb=Scan(pos, 0.0);
|
||||||
|
float wc=Scan(pos, 1.0);
|
||||||
|
return a*wa+b*wb+c*wc;}
|
||||||
|
|
||||||
|
// Small bloom.
|
||||||
|
vec3 Bloom(vec2 pos){
|
||||||
|
vec3 a=Horz5(pos,-2.0);
|
||||||
|
vec3 b=Horz7(pos,-1.0);
|
||||||
|
vec3 c=Horz7(pos, 0.0);
|
||||||
|
vec3 d=Horz7(pos, 1.0);
|
||||||
|
vec3 e=Horz5(pos, 2.0);
|
||||||
|
float wa=BloomScan(pos,-2.0);
|
||||||
|
float wb=BloomScan(pos,-1.0);
|
||||||
|
float wc=BloomScan(pos, 0.0);
|
||||||
|
float wd=BloomScan(pos, 1.0);
|
||||||
|
float we=BloomScan(pos, 2.0);
|
||||||
|
return a*wa+b*wb+c*wc+d*wd+e*we;}
|
||||||
|
|
||||||
|
// Distortion of scanlines, and end of screen alpha.
|
||||||
|
vec2 Warp(vec2 pos){
|
||||||
|
pos=pos*2.0-1.0;
|
||||||
|
pos*=vec2(1.0+(pos.y*pos.y)*warp.x,1.0+(pos.x*pos.x)*warp.y);
|
||||||
|
return pos*0.5+0.5;}
|
||||||
|
|
||||||
|
// Shadow mask.
|
||||||
|
|
||||||
|
vec3 Mask(vec2 pos){
|
||||||
|
#ifdef VERTICAL
|
||||||
|
pos.xy=pos.yx;
|
||||||
|
#endif
|
||||||
|
#ifdef MASK_VGA
|
||||||
|
pos.x+=pos.y*3.0;
|
||||||
|
vec3 mask=vec3(maskDark,maskDark,maskDark);
|
||||||
|
pos.x=fract(pos.x/6.0);
|
||||||
|
if(pos.x<0.333)mask.r=maskLight;
|
||||||
|
else if(pos.x<0.666)mask.g=maskLight;
|
||||||
|
else mask.b=maskLight;
|
||||||
|
#endif
|
||||||
|
#ifdef MASK_TV
|
||||||
|
float line=maskLight;
|
||||||
|
float odd=0.0;
|
||||||
|
if(fract(pos.x/6.0)<0.5)odd=1.0;
|
||||||
|
if(fract((pos.y+odd)/2.0)<0.5)line=maskDark;
|
||||||
|
pos.x=fract(pos.x/3.0);
|
||||||
|
vec3 mask=vec3(maskDark,maskDark,maskDark);
|
||||||
|
if(pos.x<0.333)mask.r=maskLight;
|
||||||
|
else if(pos.x<0.666)mask.g=maskLight;
|
||||||
|
else mask.b=maskLight;
|
||||||
|
mask*=line;
|
||||||
|
#endif
|
||||||
|
#ifdef MASK_APERTURE_GRILL
|
||||||
|
pos.x=fract(pos.x/3.0);
|
||||||
|
vec3 mask=vec3(maskDark,maskDark,maskDark);
|
||||||
|
if(pos.x<0.333)mask.r=maskLight;
|
||||||
|
else if(pos.x<0.666)mask.g=maskLight;
|
||||||
|
else mask.b=maskLight;
|
||||||
|
#endif
|
||||||
|
return mask;}
|
||||||
|
|
||||||
|
void main(void){
|
||||||
|
#ifdef CURVATURE
|
||||||
|
vec2 pos=Warp(gl_TexCoord[0].xy);
|
||||||
|
#else
|
||||||
|
vec2 pos=gl_TexCoord[0].xy;
|
||||||
|
#endif
|
||||||
|
gl_FragColor.a=texture2D(color_texture,pos.xy).a;
|
||||||
|
gl_FragColor.rgb=Tri(pos)*mix(vec3(1.0),Mask(gl_FragCoord.xy),maskStrength);
|
||||||
|
#ifdef BLOOM
|
||||||
|
gl_FragColor.rgb+=Bloom(pos)*bloomAmount;
|
||||||
|
#endif
|
||||||
|
#ifdef YUV
|
||||||
|
gl_FragColor.rgb = vec3(dot(YUVr,gl_FragColor.rgb),dot(YUVg,gl_FragColor.rgb),dot(YUVb,gl_FragColor.rgb));
|
||||||
|
gl_FragColor.rgb=clamp(gl_FragColor.rgb,0.0,1.0);
|
||||||
|
#endif
|
||||||
|
#ifdef GAMMA_CONTRAST_BOOST
|
||||||
|
gl_FragColor.rgb=brightMult*pow(gl_FragColor.rgb,gammaBoost )-vec3(blackClip);
|
||||||
|
#endif
|
||||||
|
gl_FragColor.rgb=clamp(ToSrgb(gl_FragColor.rgb),0.0,1.0);
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 0.0, 1.0);
|
||||||
|
vec2 v_texcoord0 : TEXCOORD0 = vec2(0.0, 0.0);
|
||||||
|
vec2 v_texcoord1 : TEXCOORD1 = vec2(0.0, 0.0);
|
||||||
|
vec2 v_texcoord2 : TEXCOORD2 = vec2(0.0, 0.0);
|
||||||
|
vec2 v_texcoord3 : TEXCOORD3 = vec2(0.0, 0.0);
|
||||||
|
|
||||||
|
vec3 a_position : POSITION;
|
||||||
|
vec4 a_color0 : COLOR0;
|
||||||
|
vec2 a_texcoord0 : TEXCOORD0;
|
26
src/osd/modules/render/bgfx/shaders/chains/lottes/vs.sc
Normal file
26
src/osd/modules/render/bgfx/shaders/chains/lottes/vs.sc
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
varying float saturation;
|
||||||
|
varying float tint;
|
||||||
|
varying float U; //U and W are for the tint/saturation calculations
|
||||||
|
varying float W;
|
||||||
|
varying vec3 YUVr;
|
||||||
|
varying vec3 YUVg;
|
||||||
|
varying vec3 YUVb;
|
||||||
|
#define PI 3.141592653589
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
//gl_TexCoord[0] = gl_MultiTexCoord0;
|
||||||
|
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
|
||||||
|
gl_Position = ftransform();
|
||||||
|
|
||||||
|
//Had to move the YUV calculations to the vertex shader for space
|
||||||
|
saturation = 1.1; // 1.0 is normal saturation. Increase as needed.
|
||||||
|
tint = 0.0; //0.0 is 0.0 degrees of Tint. Adjust as needed.
|
||||||
|
U = cos(tint*PI/180.0);
|
||||||
|
W = sin(tint*PI/180.0);
|
||||||
|
YUVr=vec3(0.701*saturation*U+0.16774*saturation*W+0.299,0.587-0.32931*saturation*W-0.587*saturation*U,-0.497*saturation*W-0.114*saturation*U+0.114);
|
||||||
|
YUVg=vec3(-0.3281*saturation*W-0.299*saturation*U+0.299,0.413*saturation*U+0.03547*saturation*W+0.587,0.114+0.29265*saturation*W-0.114*saturation*U);
|
||||||
|
YUVb=vec3(0.299+1.24955*saturation*W-0.299*saturation*U,-1.04634*saturation*W-0.587*saturation*U+0.587,0.886*saturation*U-0.20321*saturation*W+0.114);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
26
src/osd/modules/render/bgfx/shaders/chains/lottes/vs_vert.sc
Normal file
26
src/osd/modules/render/bgfx/shaders/chains/lottes/vs_vert.sc
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
varying float saturation;
|
||||||
|
varying float tint;
|
||||||
|
varying float U; //U and W are for the tint/saturation calculations
|
||||||
|
varying float W;
|
||||||
|
varying vec3 YUVr;
|
||||||
|
varying vec3 YUVg;
|
||||||
|
varying vec3 YUVb;
|
||||||
|
#define PI 3.141592653589
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
//gl_TexCoord[0] = gl_MultiTexCoord0;
|
||||||
|
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
|
||||||
|
gl_Position = ftransform();
|
||||||
|
|
||||||
|
//Had to move the YUV calculations to the vertex shader for space
|
||||||
|
saturation = 1.1; // 1.0 is normal saturation. Increase as needed.
|
||||||
|
tint = 0.0; //0.0 is 0.0 degrees of Tint. Adjust as needed.
|
||||||
|
U = cos(tint*PI/180.0);
|
||||||
|
W = sin(tint*PI/180.0);
|
||||||
|
YUVr=vec3(0.701*saturation*U+0.16774*saturation*W+0.299,0.587-0.32931*saturation*W-0.587*saturation*U,-0.497*saturation*W-0.114*saturation*U+0.114);
|
||||||
|
YUVg=vec3(-0.3281*saturation*W-0.299*saturation*U+0.299,0.413*saturation*U+0.03547*saturation*W+0.587,0.114+0.29265*saturation*W-0.114*saturation*U);
|
||||||
|
YUVb=vec3(0.299+1.24955*saturation*W-0.299*saturation*U,-1.04634*saturation*W-0.587*saturation*U+0.587,0.886*saturation*U-0.20321*saturation*W+0.114);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -31,9 +31,6 @@ const bgfx::Memory* bgfx_util::mame_texture_data_to_bgfx_texture_data(uint32_t f
|
|||||||
case PRIMFLAG_TEXFORMAT(TEXFORMAT_PALETTE16):
|
case PRIMFLAG_TEXFORMAT(TEXFORMAT_PALETTE16):
|
||||||
copy_util::copyline_palette16(dst_line, src_line16, width, palette);
|
copy_util::copyline_palette16(dst_line, src_line16, width, palette);
|
||||||
break;
|
break;
|
||||||
case PRIMFLAG_TEXFORMAT(TEXFORMAT_PALETTEA16):
|
|
||||||
copy_util::copyline_palettea16(dst_line, src_line16, width, palette);
|
|
||||||
break;
|
|
||||||
case PRIMFLAG_TEXFORMAT(TEXFORMAT_YUY16):
|
case PRIMFLAG_TEXFORMAT(TEXFORMAT_YUY16):
|
||||||
copy_util::copyline_yuy16_to_argb(dst_line, src_line16, width, palette, 1);
|
copy_util::copyline_yuy16_to_argb(dst_line, src_line16, width, palette, 1);
|
||||||
break;
|
break;
|
||||||
|
@ -24,15 +24,6 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void copyline_palettea16(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++ = (srcpixel.a() << 24) | (srcpixel.b() << 16) | (srcpixel.g() << 8) | srcpixel.r();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void copyline_rgb32(uint32_t *dst, const uint32_t *src, int width, const rgb_t *palette)
|
static inline void copyline_rgb32(uint32_t *dst, const uint32_t *src, int width, const rgb_t *palette)
|
||||||
{
|
{
|
||||||
int x;
|
int x;
|
||||||
|
@ -144,7 +144,6 @@ private:
|
|||||||
void compute_size_subroutine(int texwidth, int texheight, int* p_width, int* p_height);
|
void compute_size_subroutine(int texwidth, int texheight, int* p_width, int* p_height);
|
||||||
|
|
||||||
inline void copyline_palette16(uint32_t *dst, const uint16_t *src, int width, const rgb_t *palette, int xborderpix);
|
inline void copyline_palette16(uint32_t *dst, const uint16_t *src, int width, const rgb_t *palette, int xborderpix);
|
||||||
inline void copyline_palettea16(uint32_t *dst, const uint16_t *src, int width, const rgb_t *palette, int xborderpix);
|
|
||||||
inline void copyline_rgb32(uint32_t *dst, const uint32_t *src, int width, const rgb_t *palette, int xborderpix);
|
inline void copyline_rgb32(uint32_t *dst, const uint32_t *src, int width, const rgb_t *palette, int xborderpix);
|
||||||
inline void copyline_argb32(uint32_t *dst, const uint32_t *src, int width, const rgb_t *palette, int xborderpix);
|
inline void copyline_argb32(uint32_t *dst, const uint32_t *src, int width, const rgb_t *palette, int xborderpix);
|
||||||
inline void copyline_yuy16_to_yuy2(uint16_t *dst, const uint16_t *src, int width, const rgb_t *palette);
|
inline void copyline_yuy16_to_yuy2(uint16_t *dst, const uint16_t *src, int width, const rgb_t *palette);
|
||||||
|
@ -705,9 +705,6 @@ texture_info::texture_info(renderer_sdl2 *renderer, const render_texinfo &texsou
|
|||||||
case TEXFORMAT_PALETTE16:
|
case TEXFORMAT_PALETTE16:
|
||||||
m_format = SDL_TEXFORMAT_PALETTE16;
|
m_format = SDL_TEXFORMAT_PALETTE16;
|
||||||
break;
|
break;
|
||||||
case TEXFORMAT_PALETTEA16:
|
|
||||||
m_format = SDL_TEXFORMAT_PALETTE16A;
|
|
||||||
break;
|
|
||||||
case TEXFORMAT_YUY16:
|
case TEXFORMAT_YUY16:
|
||||||
m_format = texsource.palette ? SDL_TEXFORMAT_YUY16_PALETTED : SDL_TEXFORMAT_YUY16;
|
m_format = texsource.palette ? SDL_TEXFORMAT_YUY16_PALETTED : SDL_TEXFORMAT_YUY16;
|
||||||
break;
|
break;
|
||||||
|
@ -2011,7 +2011,7 @@ texture_info::texture_info(d3d_texture_manager *manager, const render_texinfo* t
|
|||||||
{
|
{
|
||||||
format = m_texture_manager->get_yuv_format();
|
format = m_texture_manager->get_yuv_format();
|
||||||
}
|
}
|
||||||
else if (PRIMFLAG_GET_TEXFORMAT(flags) == TEXFORMAT_ARGB32 || PRIMFLAG_GET_TEXFORMAT(flags) == TEXFORMAT_PALETTEA16)
|
else if (PRIMFLAG_GET_TEXFORMAT(flags) == TEXFORMAT_ARGB32)
|
||||||
{
|
{
|
||||||
format = D3DFMT_A8R8G8B8;
|
format = D3DFMT_A8R8G8B8;
|
||||||
}
|
}
|
||||||
@ -2229,21 +2229,6 @@ inline void texture_info::copyline_palette16(uint32_t *dst, const uint16_t *src,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//============================================================
|
|
||||||
// copyline_palettea16
|
|
||||||
//============================================================
|
|
||||||
|
|
||||||
inline void texture_info::copyline_palettea16(uint32_t *dst, const uint16_t *src, int width, const rgb_t *palette, int xborderpix)
|
|
||||||
{
|
|
||||||
if (xborderpix)
|
|
||||||
*dst++ = palette[*src];
|
|
||||||
for (int x = 0; x < width; x++)
|
|
||||||
*dst++ = palette[*src++];
|
|
||||||
if (xborderpix)
|
|
||||||
*dst++ = palette[*--src];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//============================================================
|
//============================================================
|
||||||
// copyline_rgb32
|
// copyline_rgb32
|
||||||
//============================================================
|
//============================================================
|
||||||
@ -2457,10 +2442,6 @@ void texture_info::set_data(const render_texinfo *texsource, uint32_t flags)
|
|||||||
copyline_palette16((uint32_t *)dst, (uint16_t *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, m_xborderpix);
|
copyline_palette16((uint32_t *)dst, (uint16_t *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, m_xborderpix);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TEXFORMAT_PALETTEA16:
|
|
||||||
copyline_palettea16((uint32_t *)dst, (uint16_t *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, m_xborderpix);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TEXFORMAT_RGB32:
|
case TEXFORMAT_RGB32:
|
||||||
copyline_rgb32((uint32_t *)dst, (uint32_t *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, m_xborderpix);
|
copyline_rgb32((uint32_t *)dst, (uint32_t *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, m_xborderpix);
|
||||||
break;
|
break;
|
||||||
|
@ -1908,9 +1908,6 @@ ogl_texture_info *renderer_ogl::texture_create(const render_texinfo *texsource,
|
|||||||
case TEXFORMAT_PALETTE16:
|
case TEXFORMAT_PALETTE16:
|
||||||
texture->format = SDL_TEXFORMAT_PALETTE16;
|
texture->format = SDL_TEXFORMAT_PALETTE16;
|
||||||
break;
|
break;
|
||||||
case TEXFORMAT_PALETTEA16:
|
|
||||||
texture->format = SDL_TEXFORMAT_PALETTE16A;
|
|
||||||
break;
|
|
||||||
case TEXFORMAT_YUY16:
|
case TEXFORMAT_YUY16:
|
||||||
if (texsource->palette != nullptr)
|
if (texsource->palette != nullptr)
|
||||||
texture->format = SDL_TEXFORMAT_YUY16_PALETTED;
|
texture->format = SDL_TEXFORMAT_YUY16_PALETTED;
|
||||||
@ -2066,30 +2063,6 @@ static inline void copyline_palette16(uint32_t *dst, const uint16_t *src, int wi
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
//============================================================
|
|
||||||
// copyline_palettea16
|
|
||||||
//============================================================
|
|
||||||
|
|
||||||
static inline void copyline_palettea16(uint32_t *dst, const uint16_t *src, int width, const rgb_t *palette, int xborderpix, int xprescale)
|
|
||||||
{
|
|
||||||
int x;
|
|
||||||
|
|
||||||
assert(xborderpix == 0 || xborderpix == 1);
|
|
||||||
if (xborderpix)
|
|
||||||
*dst++ = palette[*src];
|
|
||||||
for (x = 0; x < width; x++)
|
|
||||||
{
|
|
||||||
int srcpix = *src++;
|
|
||||||
uint32_t dstval = palette[srcpix];
|
|
||||||
for (int x2 = 0; x2 < xprescale; x2++)
|
|
||||||
*dst++ = dstval;
|
|
||||||
}
|
|
||||||
if (xborderpix)
|
|
||||||
*dst++ = palette[*--src];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//============================================================
|
//============================================================
|
||||||
// copyline_rgb32
|
// copyline_rgb32
|
||||||
//============================================================
|
//============================================================
|
||||||
@ -2359,10 +2332,6 @@ static void texture_set_data(ogl_texture_info *texture, const render_texinfo *te
|
|||||||
copyline_palette16((uint32_t *)dst, (uint16_t *)texsource->base + y * texsource->rowpixels, texsource->width, texsource->palette, texture->borderpix, texture->xprescale);
|
copyline_palette16((uint32_t *)dst, (uint16_t *)texsource->base + y * texsource->rowpixels, texsource->width, texsource->palette, texture->borderpix, texture->xprescale);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TEXFORMAT_PALETTEA16:
|
|
||||||
copyline_palettea16((uint32_t *)dst, (uint16_t *)texsource->base + y * texsource->rowpixels, texsource->width, texsource->palette, texture->borderpix, texture->xprescale);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TEXFORMAT_RGB32:
|
case TEXFORMAT_RGB32:
|
||||||
copyline_rgb32((uint32_t *)dst, (uint32_t *)texsource->base + y * texsource->rowpixels, texsource->width, texsource->palette, texture->borderpix, texture->xprescale);
|
copyline_rgb32((uint32_t *)dst, (uint32_t *)texsource->base + y * texsource->rowpixels, texsource->width, texsource->palette, texture->borderpix, texture->xprescale);
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user