mirror of
https://github.com/holub/mame
synced 2025-06-20 19:26:42 +03:00
Palettes are now copied during get_primlist. This should fix
multithreading related palette issues. Along the way also - added constructors to SDL osd structs - changed related malloc to global_alloc - added a copyfrom routine to dynamic_array - minor code simplifications.
This commit is contained in:
parent
f0b06a5c84
commit
fde220f4a7
276
src/emu/render.c
276
src/emu/render.c
@ -201,6 +201,54 @@ inline item_layer get_layer_and_blendmode(const layout_view &view, int index, in
|
||||
return item_layer(layer);
|
||||
}
|
||||
|
||||
//**************************************************************************
|
||||
// render_texinfo
|
||||
//**************************************************************************
|
||||
|
||||
render_texinfo &render_texinfo::operator=(const render_texinfo &src)
|
||||
{
|
||||
free_palette();
|
||||
base = src.base;
|
||||
rowpixels = src.rowpixels;
|
||||
width = src.width;
|
||||
height = src.height;
|
||||
seqid = src.seqid;
|
||||
osddata = src.osddata;
|
||||
m_palette = src.m_palette;
|
||||
if (m_palette != NULL)
|
||||
{
|
||||
m_palette->ref_count++;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
void render_texinfo::set_palette(const dynamic_array<rgb_t> *source)
|
||||
{
|
||||
free_palette();
|
||||
if (source != NULL)
|
||||
{
|
||||
m_palette = global_alloc(render_palette_copy);
|
||||
m_palette->palette.copyfrom(*source);
|
||||
m_palette->ref_count = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_palette = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void render_texinfo::free_palette()
|
||||
{
|
||||
if (m_palette != NULL)
|
||||
{
|
||||
m_palette->ref_count--;
|
||||
if (m_palette->ref_count == 0)
|
||||
{
|
||||
global_free(m_palette);
|
||||
}
|
||||
}
|
||||
m_palette = NULL;
|
||||
}
|
||||
|
||||
|
||||
//**************************************************************************
|
||||
@ -214,7 +262,25 @@ inline item_layer get_layer_and_blendmode(const layout_view &view, int index, in
|
||||
|
||||
void render_primitive::reset()
|
||||
{
|
||||
memset(&type, 0, FPTR(&texcoords + 1) - FPTR(&type));
|
||||
// public state
|
||||
type = INVALID;
|
||||
bounds.x0 = 0;
|
||||
bounds.y0 = 0;
|
||||
bounds.x1 = 0;
|
||||
bounds.y1 = 0;
|
||||
color.a = 0;
|
||||
color.r = 0;
|
||||
color.g = 0;
|
||||
color.b = 0;
|
||||
flags = 0;
|
||||
width = 0.0f;
|
||||
// texcoords; FIXME
|
||||
|
||||
// do not clear m_next!
|
||||
// memset(&type, 0, FPTR(&texcoords + 1) - FPTR(&type));
|
||||
|
||||
texture.set_palette(NULL);
|
||||
texture = render_texinfo();
|
||||
}
|
||||
|
||||
|
||||
@ -447,7 +513,7 @@ void render_texture::hq_scale(bitmap_argb32 &dest, bitmap_argb32 &source, const
|
||||
// get_scaled - get a scaled bitmap (if we can)
|
||||
//-------------------------------------------------
|
||||
|
||||
bool render_texture::get_scaled(UINT32 dwidth, UINT32 dheight, render_texinfo &texinfo, render_primitive_list &primlist)
|
||||
void render_texture::get_scaled(UINT32 dwidth, UINT32 dheight, render_texinfo &texinfo, render_primitive_list &primlist)
|
||||
{
|
||||
// source width/height come from the source bounds
|
||||
int swidth = m_sbounds.width();
|
||||
@ -460,7 +526,6 @@ bool render_texture::get_scaled(UINT32 dwidth, UINT32 dheight, render_texinfo &t
|
||||
texinfo.osddata = m_osddata;
|
||||
|
||||
// are we scaler-free? if so, just return the source bitmap
|
||||
const rgb_t *palbase = (m_format == TEXFORMAT_PALETTE16 || m_format == TEXFORMAT_PALETTEA16) ? m_bitmap->palette()->entry_list_adjusted() : NULL;
|
||||
if (m_scaler == NULL || (m_bitmap != NULL && swidth == dwidth && sheight == dheight))
|
||||
{
|
||||
// add a reference and set up the source bitmap
|
||||
@ -469,63 +534,65 @@ bool render_texture::get_scaled(UINT32 dwidth, UINT32 dheight, render_texinfo &t
|
||||
texinfo.rowpixels = m_bitmap->rowpixels();
|
||||
texinfo.width = swidth;
|
||||
texinfo.height = sheight;
|
||||
texinfo.palette = palbase;
|
||||
// will be set later
|
||||
texinfo.set_palette(NULL);
|
||||
texinfo.seqid = ++m_curseq;
|
||||
return true;
|
||||
}
|
||||
|
||||
// make sure we can recover the original argb32 bitmap
|
||||
bitmap_argb32 dummy;
|
||||
bitmap_argb32 &srcbitmap = (m_bitmap != NULL) ? downcast<bitmap_argb32 &>(*m_bitmap) : dummy;
|
||||
|
||||
// is it a size we already have?
|
||||
scaled_texture *scaled = NULL;
|
||||
int scalenum;
|
||||
for (scalenum = 0; scalenum < ARRAY_LENGTH(m_scaled); scalenum++)
|
||||
else
|
||||
{
|
||||
scaled = &m_scaled[scalenum];
|
||||
// make sure we can recover the original argb32 bitmap
|
||||
bitmap_argb32 dummy;
|
||||
bitmap_argb32 &srcbitmap = (m_bitmap != NULL) ? downcast<bitmap_argb32 &>(*m_bitmap) : dummy;
|
||||
|
||||
// we need a non-NULL bitmap with matching dest size
|
||||
if (scaled->bitmap != NULL && dwidth == scaled->bitmap->width() && dheight == scaled->bitmap->height())
|
||||
break;
|
||||
// is it a size we already have?
|
||||
scaled_texture *scaled = NULL;
|
||||
int scalenum;
|
||||
for (scalenum = 0; scalenum < ARRAY_LENGTH(m_scaled); scalenum++)
|
||||
{
|
||||
scaled = &m_scaled[scalenum];
|
||||
|
||||
// we need a non-NULL bitmap with matching dest size
|
||||
if (scaled->bitmap != NULL && dwidth == scaled->bitmap->width() && dheight == scaled->bitmap->height())
|
||||
break;
|
||||
}
|
||||
|
||||
// did we get one?
|
||||
if (scalenum == ARRAY_LENGTH(m_scaled))
|
||||
{
|
||||
int lowest = -1;
|
||||
|
||||
// didn't find one -- take the entry with the lowest seqnum
|
||||
for (scalenum = 0; scalenum < ARRAY_LENGTH(m_scaled); scalenum++)
|
||||
if ((lowest == -1 || m_scaled[scalenum].seqid < m_scaled[lowest].seqid) && !primlist.has_reference(m_scaled[scalenum].bitmap))
|
||||
lowest = scalenum;
|
||||
assert_always(lowest != -1, "Too many live texture instances!");
|
||||
|
||||
// throw out any existing entries
|
||||
scaled = &m_scaled[lowest];
|
||||
if (scaled->bitmap != NULL)
|
||||
{
|
||||
m_manager->invalidate_all(scaled->bitmap);
|
||||
global_free(scaled->bitmap);
|
||||
}
|
||||
|
||||
// allocate a new bitmap
|
||||
scaled->bitmap = global_alloc(bitmap_argb32(dwidth, dheight));
|
||||
scaled->seqid = ++m_curseq;
|
||||
|
||||
// let the scaler do the work
|
||||
(*m_scaler)(*scaled->bitmap, srcbitmap, m_sbounds, m_param);
|
||||
}
|
||||
|
||||
// finally fill out the new info
|
||||
primlist.add_reference(scaled->bitmap);
|
||||
texinfo.base = &scaled->bitmap->pix32(0);
|
||||
texinfo.rowpixels = scaled->bitmap->rowpixels();
|
||||
texinfo.width = dwidth;
|
||||
texinfo.height = dheight;
|
||||
// will be set later
|
||||
texinfo.set_palette(NULL);
|
||||
texinfo.seqid = scaled->seqid;
|
||||
}
|
||||
|
||||
// did we get one?
|
||||
if (scalenum == ARRAY_LENGTH(m_scaled))
|
||||
{
|
||||
int lowest = -1;
|
||||
|
||||
// didn't find one -- take the entry with the lowest seqnum
|
||||
for (scalenum = 0; scalenum < ARRAY_LENGTH(m_scaled); scalenum++)
|
||||
if ((lowest == -1 || m_scaled[scalenum].seqid < m_scaled[lowest].seqid) && !primlist.has_reference(m_scaled[scalenum].bitmap))
|
||||
lowest = scalenum;
|
||||
assert_always(lowest != -1, "Too many live texture instances!");
|
||||
|
||||
// throw out any existing entries
|
||||
scaled = &m_scaled[lowest];
|
||||
if (scaled->bitmap != NULL)
|
||||
{
|
||||
m_manager->invalidate_all(scaled->bitmap);
|
||||
global_free(scaled->bitmap);
|
||||
}
|
||||
|
||||
// allocate a new bitmap
|
||||
scaled->bitmap = global_alloc(bitmap_argb32(dwidth, dheight));
|
||||
scaled->seqid = ++m_curseq;
|
||||
|
||||
// let the scaler do the work
|
||||
(*m_scaler)(*scaled->bitmap, srcbitmap, m_sbounds, m_param);
|
||||
}
|
||||
|
||||
// finally fill out the new info
|
||||
primlist.add_reference(scaled->bitmap);
|
||||
texinfo.base = &scaled->bitmap->pix32(0);
|
||||
texinfo.rowpixels = scaled->bitmap->rowpixels();
|
||||
texinfo.width = dwidth;
|
||||
texinfo.height = dheight;
|
||||
texinfo.palette = palbase;
|
||||
texinfo.seqid = scaled->seqid;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@ -534,7 +601,7 @@ bool render_texture::get_scaled(UINT32 dwidth, UINT32 dheight, render_texinfo &t
|
||||
// palette for a texture
|
||||
//-------------------------------------------------
|
||||
|
||||
const rgb_t *render_texture::get_adjusted_palette(render_container &container)
|
||||
const dynamic_array<rgb_t> *render_texture::get_adjusted_palette(render_container &container)
|
||||
{
|
||||
// override the palette with our adjusted palette
|
||||
switch (m_format)
|
||||
@ -546,7 +613,7 @@ const rgb_t *render_texture::get_adjusted_palette(render_container &container)
|
||||
|
||||
// if no adjustment necessary, return the raw palette
|
||||
if (!container.has_brightness_contrast_gamma_changes())
|
||||
return m_bitmap->palette()->entry_list_adjusted();
|
||||
return m_bitmap->palette()->entry_list_adjusted_darray();
|
||||
|
||||
// otherwise, return our adjusted palette
|
||||
return container.bcg_lookup_table(m_format, m_bitmap->palette());
|
||||
@ -582,7 +649,8 @@ render_container::render_container(render_manager &manager, screen_device *scree
|
||||
m_manager(manager),
|
||||
m_screen(screen),
|
||||
m_overlaybitmap(NULL),
|
||||
m_overlaytexture(NULL)
|
||||
m_overlaytexture(NULL),
|
||||
m_bcglookup256(0x400)
|
||||
{
|
||||
// make sure it is empty
|
||||
empty();
|
||||
@ -722,7 +790,7 @@ float render_container::apply_brightness_contrast_gamma_fp(float value)
|
||||
// given texture mode
|
||||
//-------------------------------------------------
|
||||
|
||||
const rgb_t *render_container::bcg_lookup_table(int texformat, palette_t *palette)
|
||||
const dynamic_array<rgb_t> *render_container::bcg_lookup_table(int texformat, palette_t *palette)
|
||||
{
|
||||
switch (texformat)
|
||||
{
|
||||
@ -736,12 +804,12 @@ const rgb_t *render_container::bcg_lookup_table(int texformat, palette_t *palett
|
||||
recompute_lookups();
|
||||
}
|
||||
assert (palette == &m_palclient->palette());
|
||||
return m_bcglookup;
|
||||
return &m_bcglookup;
|
||||
|
||||
case TEXFORMAT_RGB32:
|
||||
case TEXFORMAT_ARGB32:
|
||||
case TEXFORMAT_YUY16:
|
||||
return m_bcglookup256;
|
||||
return &m_bcglookup256;
|
||||
|
||||
default:
|
||||
return NULL;
|
||||
@ -1726,24 +1794,28 @@ void render_target::add_container_primitives(render_primitive_list &list, const
|
||||
int height = (finalorient & ORIENTATION_SWAP_XY) ? (prim->bounds.x1 - prim->bounds.x0) : (prim->bounds.y1 - prim->bounds.y0);
|
||||
width = MIN(width, m_maxtexwidth);
|
||||
height = MIN(height, m_maxtexheight);
|
||||
if (curitem->texture()->get_scaled(width, height, prim->texture, list))
|
||||
{
|
||||
// set the palette
|
||||
prim->texture.palette = curitem->texture()->get_adjusted_palette(container);
|
||||
|
||||
// determine UV coordinates and apply clipping
|
||||
prim->texcoords = oriented_texcoords[finalorient];
|
||||
clipped = render_clip_quad(&prim->bounds, &cliprect, &prim->texcoords);
|
||||
curitem->texture()->get_scaled(width, height, prim->texture, list);
|
||||
// set the palette
|
||||
#if 1
|
||||
const dynamic_array<rgb_t> *adjusted_pal = curitem->texture()->get_adjusted_palette(container);
|
||||
prim->texture.set_palette(adjusted_pal);
|
||||
#else
|
||||
prim->texture.palette = curitem->texture()->get_adjusted_palette(container);
|
||||
#endif
|
||||
|
||||
// apply the final orientation from the quad flags and then build up the final flags
|
||||
prim->flags = (curitem->flags() & ~(PRIMFLAG_TEXORIENT_MASK | PRIMFLAG_BLENDMODE_MASK | PRIMFLAG_TEXFORMAT_MASK)) |
|
||||
PRIMFLAG_TEXORIENT(finalorient) |
|
||||
PRIMFLAG_TEXFORMAT(curitem->texture()->format());
|
||||
if (blendmode != -1)
|
||||
prim->flags |= PRIMFLAG_BLENDMODE(blendmode);
|
||||
else
|
||||
prim->flags |= PRIMFLAG_BLENDMODE(PRIMFLAG_GET_BLENDMODE(curitem->flags()));
|
||||
}
|
||||
// determine UV coordinates and apply clipping
|
||||
prim->texcoords = oriented_texcoords[finalorient];
|
||||
clipped = render_clip_quad(&prim->bounds, &cliprect, &prim->texcoords);
|
||||
|
||||
// apply the final orientation from the quad flags and then build up the final flags
|
||||
prim->flags = (curitem->flags() & ~(PRIMFLAG_TEXORIENT_MASK | PRIMFLAG_BLENDMODE_MASK | PRIMFLAG_TEXFORMAT_MASK)) |
|
||||
PRIMFLAG_TEXORIENT(finalorient) |
|
||||
PRIMFLAG_TEXFORMAT(curitem->texture()->format());
|
||||
if (blendmode != -1)
|
||||
prim->flags |= PRIMFLAG_BLENDMODE(blendmode);
|
||||
else
|
||||
prim->flags |= PRIMFLAG_BLENDMODE(PRIMFLAG_GET_BLENDMODE(curitem->flags()));
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1778,21 +1850,20 @@ void render_target::add_container_primitives(render_primitive_list &list, const
|
||||
width = render_round_nearest(prim->bounds.x1) - render_round_nearest(prim->bounds.x0);
|
||||
height = render_round_nearest(prim->bounds.y1) - render_round_nearest(prim->bounds.y0);
|
||||
|
||||
bool got_scaled = container.overlay()->get_scaled(
|
||||
container.overlay()->get_scaled(
|
||||
(container_xform.orientation & ORIENTATION_SWAP_XY) ? height : width,
|
||||
(container_xform.orientation & ORIENTATION_SWAP_XY) ? width : height, prim->texture, list);
|
||||
if (got_scaled)
|
||||
{
|
||||
// determine UV coordinates
|
||||
prim->texcoords = oriented_texcoords[container_xform.orientation];
|
||||
|
||||
// set the flags and add it to the list
|
||||
prim->flags = PRIMFLAG_TEXORIENT(container_xform.orientation) |
|
||||
PRIMFLAG_BLENDMODE(BLENDMODE_RGB_MULTIPLY) |
|
||||
PRIMFLAG_TEXFORMAT(container.overlay()->format()) |
|
||||
PRIMFLAG_TEXSHADE(1);
|
||||
}
|
||||
list.append_or_return(*prim, !got_scaled);
|
||||
// determine UV coordinates
|
||||
prim->texcoords = oriented_texcoords[container_xform.orientation];
|
||||
|
||||
// set the flags and add it to the list
|
||||
prim->flags = PRIMFLAG_TEXORIENT(container_xform.orientation) |
|
||||
PRIMFLAG_BLENDMODE(BLENDMODE_RGB_MULTIPLY) |
|
||||
PRIMFLAG_TEXFORMAT(container.overlay()->format()) |
|
||||
PRIMFLAG_TEXSHADE(1);
|
||||
|
||||
list.append_or_return(*prim, false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1830,21 +1901,20 @@ void render_target::add_element_primitives(render_primitive_list &list, const ob
|
||||
height = MIN(height, m_maxtexheight);
|
||||
|
||||
// get the scaled texture and append it
|
||||
bool clipped = true;
|
||||
if (texture->get_scaled(width, height, prim->texture, list))
|
||||
{
|
||||
// compute the clip rect
|
||||
render_bounds cliprect;
|
||||
cliprect.x0 = render_round_nearest(xform.xoffs);
|
||||
cliprect.y0 = render_round_nearest(xform.yoffs);
|
||||
cliprect.x1 = render_round_nearest(xform.xoffs + xform.xscale);
|
||||
cliprect.y1 = render_round_nearest(xform.yoffs + xform.yscale);
|
||||
sect_render_bounds(&cliprect, &m_bounds);
|
||||
|
||||
// determine UV coordinates and apply clipping
|
||||
prim->texcoords = oriented_texcoords[xform.orientation];
|
||||
clipped = render_clip_quad(&prim->bounds, &cliprect, &prim->texcoords);
|
||||
}
|
||||
texture->get_scaled(width, height, prim->texture, list);
|
||||
|
||||
// compute the clip rect
|
||||
render_bounds cliprect;
|
||||
cliprect.x0 = render_round_nearest(xform.xoffs);
|
||||
cliprect.y0 = render_round_nearest(xform.yoffs);
|
||||
cliprect.x1 = render_round_nearest(xform.xoffs + xform.xscale);
|
||||
cliprect.y1 = render_round_nearest(xform.yoffs + xform.yscale);
|
||||
sect_render_bounds(&cliprect, &m_bounds);
|
||||
|
||||
// determine UV coordinates and apply clipping
|
||||
prim->texcoords = oriented_texcoords[xform.orientation];
|
||||
bool clipped = render_clip_quad(&prim->bounds, &cliprect, &prim->texcoords);
|
||||
|
||||
// add to the list or free if we're clipped out
|
||||
list.append_or_return(*prim, clipped);
|
||||
|
@ -167,7 +167,6 @@ class layout_view;
|
||||
// texture scaling callback
|
||||
typedef void (*texture_scaler_func)(bitmap_argb32 &dest, bitmap_argb32 &source, const rectangle &sbounds, void *param);
|
||||
|
||||
|
||||
// render_bounds - floating point bounding rectangle
|
||||
struct render_bounds
|
||||
{
|
||||
@ -210,15 +209,45 @@ struct render_quad_texuv
|
||||
|
||||
|
||||
// render_texinfo - texture information
|
||||
struct render_texinfo
|
||||
|
||||
|
||||
struct render_palette_copy
|
||||
{
|
||||
int ref_count;
|
||||
dynamic_array<rgb_t> palette;
|
||||
};
|
||||
|
||||
class render_texinfo
|
||||
{
|
||||
private:
|
||||
render_texinfo(const render_texinfo &src) {}
|
||||
public:
|
||||
render_texinfo()
|
||||
: base(NULL), rowpixels(0), width(0), height(0),
|
||||
seqid(0), osddata(0), m_palette(NULL)
|
||||
{}
|
||||
~render_texinfo()
|
||||
{
|
||||
free_palette();
|
||||
}
|
||||
|
||||
render_texinfo &operator=(const render_texinfo &src);
|
||||
|
||||
void * base; // base of the data
|
||||
UINT32 rowpixels; // pixels per row
|
||||
UINT32 width; // width of the image
|
||||
UINT32 height; // height of the image
|
||||
const rgb_t * palette; // palette for PALETTE16 textures, LUTs for RGB15/RGB32
|
||||
UINT32 seqid; // sequence ID
|
||||
UINT64 osddata; // aux data to pass to osd
|
||||
|
||||
const rgb_t * palette() const { return ((m_palette == NULL) ? NULL : &m_palette->palette[0]); }
|
||||
|
||||
void set_palette(const dynamic_array<rgb_t> *source);
|
||||
|
||||
private:
|
||||
void free_palette();
|
||||
|
||||
render_palette_copy *m_palette; // palette for PALETTE16 textures, LUTs for RGB15/RGB32
|
||||
};
|
||||
|
||||
|
||||
@ -433,8 +462,8 @@ public:
|
||||
|
||||
private:
|
||||
// internal helpers
|
||||
bool get_scaled(UINT32 dwidth, UINT32 dheight, render_texinfo &texinfo, render_primitive_list &primlist);
|
||||
const rgb_t *get_adjusted_palette(render_container &container);
|
||||
void get_scaled(UINT32 dwidth, UINT32 dheight, render_texinfo &texinfo, render_primitive_list &primlist);
|
||||
const dynamic_array<rgb_t> *get_adjusted_palette(render_container &container);
|
||||
|
||||
static const int MAX_TEXTURE_SCALES = 8;
|
||||
|
||||
@ -524,7 +553,7 @@ public:
|
||||
bool has_brightness_contrast_gamma_changes() const { return (m_user.m_brightness != 1.0f || m_user.m_contrast != 1.0f || m_user.m_gamma != 1.0f); }
|
||||
UINT8 apply_brightness_contrast_gamma(UINT8 value);
|
||||
float apply_brightness_contrast_gamma_fp(float value);
|
||||
const rgb_t *bcg_lookup_table(int texformat, palette_t *palette = NULL);
|
||||
const dynamic_array<rgb_t> *bcg_lookup_table(int texformat, palette_t *palette = NULL);
|
||||
|
||||
private:
|
||||
// an item describes a high level primitive that is added to a container
|
||||
@ -576,7 +605,7 @@ private:
|
||||
render_texture * m_overlaytexture; // overlay texture
|
||||
auto_pointer<palette_client> m_palclient; // client to the screen palette
|
||||
dynamic_array<rgb_t> m_bcglookup; // full palette lookup with bcg adjustments
|
||||
rgb_t m_bcglookup256[0x400]; // lookup table for brightness/contrast/gamma
|
||||
dynamic_array<rgb_t> m_bcglookup256; // lookup table for brightness/contrast/gamma
|
||||
};
|
||||
|
||||
|
||||
|
@ -130,6 +130,7 @@ private:
|
||||
|
||||
static inline UINT32 get_texel_palette16(const render_texinfo &texture, INT32 curu, INT32 curv)
|
||||
{
|
||||
const rgb_t *palbase = texture.palette();
|
||||
if (_BilinearFilter)
|
||||
{
|
||||
INT32 u0 = curu >> 16;
|
||||
@ -144,16 +145,16 @@ private:
|
||||
const UINT16 *texbase = reinterpret_cast<const UINT16 *>(texture.base);
|
||||
texbase += v0 * texture.rowpixels + u0;
|
||||
|
||||
UINT32 pix00 = texture.palette[texbase[0]];
|
||||
UINT32 pix01 = texture.palette[texbase[u1]];
|
||||
UINT32 pix10 = texture.palette[texbase[v1]];
|
||||
UINT32 pix11 = texture.palette[texbase[u1 + v1]];
|
||||
UINT32 pix00 = palbase[texbase[0]];
|
||||
UINT32 pix01 = palbase[texbase[u1]];
|
||||
UINT32 pix10 = palbase[texbase[v1]];
|
||||
UINT32 pix11 = palbase[texbase[u1 + v1]];
|
||||
return rgb_bilinear_filter(pix00, pix01, pix10, pix11, curu >> 8, curv >> 8);
|
||||
}
|
||||
else
|
||||
{
|
||||
const UINT16 *texbase = reinterpret_cast<const UINT16 *>(texture.base) + (curv >> 16) * texture.rowpixels + (curu >> 16);
|
||||
return texture.palette[texbase[0]];
|
||||
return palbase[texbase[0]];
|
||||
}
|
||||
}
|
||||
|
||||
@ -165,6 +166,7 @@ private:
|
||||
|
||||
static inline UINT32 get_texel_palette16a(const render_texinfo &texture, INT32 curu, INT32 curv)
|
||||
{
|
||||
const rgb_t *palbase = texture.palette();
|
||||
if (_BilinearFilter)
|
||||
{
|
||||
INT32 u0 = curu >> 16;
|
||||
@ -179,16 +181,16 @@ private:
|
||||
const UINT16 *texbase = reinterpret_cast<const UINT16 *>(texture.base);
|
||||
texbase += v0 * texture.rowpixels + u0;
|
||||
|
||||
UINT32 pix00 = texture.palette[texbase[0]];
|
||||
UINT32 pix01 = texture.palette[texbase[u1]];
|
||||
UINT32 pix10 = texture.palette[texbase[v1]];
|
||||
UINT32 pix11 = texture.palette[texbase[u1 + v1]];
|
||||
UINT32 pix00 = palbase[texbase[0]];
|
||||
UINT32 pix01 = palbase[texbase[u1]];
|
||||
UINT32 pix10 = palbase[texbase[v1]];
|
||||
UINT32 pix11 = palbase[texbase[u1 + v1]];
|
||||
return rgba_bilinear_filter(pix00, pix01, pix10, pix11, curu >> 8, curv >> 8);
|
||||
}
|
||||
else
|
||||
{
|
||||
const UINT16 *texbase = reinterpret_cast<const UINT16 *>(texture.base) + (curv >> 16) * texture.rowpixels + (curu >> 16);
|
||||
return texture.palette[texbase[0]];
|
||||
return palbase[texbase[0]];
|
||||
}
|
||||
}
|
||||
|
||||
@ -912,7 +914,7 @@ private:
|
||||
|
||||
static void draw_quad_yuy16_none(const render_primitive &prim, _PixelType *dstdata, UINT32 pitch, quad_setup_data &setup)
|
||||
{
|
||||
const rgb_t *palbase = prim.texture.palette;
|
||||
const rgb_t *palbase = prim.texture.palette();
|
||||
INT32 dudx = setup.dudx;
|
||||
INT32 dvdx = setup.dvdx;
|
||||
INT32 endx = setup.endx;
|
||||
@ -1082,7 +1084,7 @@ private:
|
||||
|
||||
static void draw_quad_rgb32(const render_primitive &prim, _PixelType *dstdata, UINT32 pitch, quad_setup_data &setup)
|
||||
{
|
||||
const rgb_t *palbase = prim.texture.palette;
|
||||
const rgb_t *palbase = prim.texture.palette();
|
||||
INT32 dudx = setup.dudx;
|
||||
INT32 dvdx = setup.dvdx;
|
||||
INT32 endx = setup.endx;
|
||||
@ -1252,7 +1254,7 @@ private:
|
||||
|
||||
static void draw_quad_rgb32_add(const render_primitive &prim, _PixelType *dstdata, UINT32 pitch, quad_setup_data &setup)
|
||||
{
|
||||
const rgb_t *palbase = prim.texture.palette;
|
||||
const rgb_t *palbase = prim.texture.palette();
|
||||
INT32 dudx = setup.dudx;
|
||||
INT32 dvdx = setup.dvdx;
|
||||
INT32 endx = setup.endx;
|
||||
@ -1390,7 +1392,7 @@ private:
|
||||
|
||||
static void draw_quad_argb32_alpha(const render_primitive &prim, _PixelType *dstdata, UINT32 pitch, quad_setup_data &setup)
|
||||
{
|
||||
const rgb_t *palbase = prim.texture.palette;
|
||||
const rgb_t *palbase = prim.texture.palette();
|
||||
INT32 dudx = setup.dudx;
|
||||
INT32 dvdx = setup.dvdx;
|
||||
INT32 endx = setup.endx;
|
||||
@ -1536,7 +1538,7 @@ private:
|
||||
|
||||
static void draw_quad_argb32_multiply(const render_primitive &prim, _PixelType *dstdata, UINT32 pitch, quad_setup_data &setup)
|
||||
{
|
||||
const rgb_t *palbase = prim.texture.palette;
|
||||
const rgb_t *palbase = prim.texture.palette();
|
||||
INT32 dudx = setup.dudx;
|
||||
INT32 dvdx = setup.dvdx;
|
||||
INT32 endx = setup.endx;
|
||||
@ -1655,7 +1657,7 @@ private:
|
||||
|
||||
static void draw_quad_argb32_add(const render_primitive &prim, _PixelType *dstdata, UINT32 pitch, quad_setup_data &setup)
|
||||
{
|
||||
const rgb_t *palbase = prim.texture.palette;
|
||||
const rgb_t *palbase = prim.texture.palette();
|
||||
INT32 dudx = setup.dudx;
|
||||
INT32 dvdx = setup.dvdx;
|
||||
INT32 endx = setup.endx;
|
||||
|
@ -99,6 +99,14 @@ public:
|
||||
void resize_and_clear(int count, UINT8 data = 0) { resize(count); clear(data); }
|
||||
void resize_keep_and_clear_new(int count, UINT8 data = 0) { int oldcount = m_count; resize_keep(count); if (oldcount < m_count) clear_internal(oldcount, m_count - oldcount, data); }
|
||||
|
||||
// batch operations
|
||||
void copyfrom(const dynamic_array<_ElementType> &source)
|
||||
{
|
||||
resize(source.count());
|
||||
for (int i=0; i < source.count(); i++)
|
||||
m_array[i] = source[i];
|
||||
}
|
||||
|
||||
private:
|
||||
// internal helpers
|
||||
void expand_internal(int count)
|
||||
|
@ -170,7 +170,8 @@ public:
|
||||
|
||||
// entry list getters
|
||||
const rgb_t *entry_list_raw() const { return m_entry_color; }
|
||||
const rgb_t *entry_list_adjusted() const { return m_adjusted_color; }
|
||||
const dynamic_array<rgb_t> *entry_list_adjusted_darray() const { return &m_adjusted_color; }
|
||||
const rgb_t *entry_list_adjusted() const { return m_adjusted_color; }
|
||||
const rgb_t *entry_list_adjusted_rgb15() const { return m_adjusted_rgb15; }
|
||||
|
||||
// group adjustments
|
||||
|
@ -53,47 +53,47 @@ INLINE UINT32 pixel_ycc_to_rgb_pal(UINT16 *pixel, const rgb_t *palette)
|
||||
#define OP_RGB32_ARGB32(_src) ((_src) | 0xff000000)
|
||||
|
||||
#define OP_RGB32PAL_ARGB32(_src) \
|
||||
(texsource->palette[0x200 + (((_src) >> 16) & 0xff) ] | \
|
||||
texsource->palette[0x100 + (((_src) >> 8) & 0xff) ] | \
|
||||
texsource->palette[((_src) & 0xff) ] | 0xff000000)
|
||||
(palbase[0x200 + (((_src) >> 16) & 0xff) ] | \
|
||||
palbase[0x100 + (((_src) >> 8) & 0xff) ] | \
|
||||
palbase[((_src) & 0xff) ] | 0xff000000)
|
||||
|
||||
#define OP_PAL16_ARGB32(_src) (0xff000000 | texsource->palette[_src])
|
||||
#define OP_PAL16_ARGB32(_src) (0xff000000 | palbase[_src])
|
||||
|
||||
#define OP_PAL16A_ARGB32(_src) (texsource->palette[_src])
|
||||
#define OP_PAL16A_ARGB32(_src) (palbase[_src])
|
||||
|
||||
#define OP_RGB15_ARGB32(_src) (0xff000000 | ((_src & 0x7c00) << 9) | ((_src & 0x03e0) << 6) | ((_src & 0x001f) << 3) | \
|
||||
((((_src & 0x7c00) << 9) | ((_src & 0x03e0) << 6) | ((_src & 0x001f) << 3) >> 5) & 0x070707))
|
||||
|
||||
#define OP_RGB15PAL_ARGB32(_src) (0xff000000 | texsource->palette[0x40 + ((_src >> 10) & 0x1f)] | \
|
||||
texsource->palette[0x20 + ((_src >> 5) & 0x1f)] | texsource->palette[0x00 + ((_src >> 0) & 0x1f)])
|
||||
#define OP_RGB15PAL_ARGB32(_src) (0xff000000 | palbase[0x40 + ((_src >> 10) & 0x1f)] | \
|
||||
palbase[0x20 + ((_src >> 5) & 0x1f)] | palbase[0x00 + ((_src >> 0) & 0x1f)])
|
||||
|
||||
#define OP_ARGB32_RGB32(_pixel) premult32(_pixel)
|
||||
|
||||
#define OP_PAL16A_RGB32(_src) premult32(texsource->palette[_src])
|
||||
#define OP_PAL16A_RGB32(_src) premult32(palbase[_src])
|
||||
|
||||
#define OP_PAL16_ARGB1555(_src) ((texsource->palette[_src]&0xf80000) >> 9 | \
|
||||
(texsource->palette[_src]&0x00f800) >> 6 | \
|
||||
(texsource->palette[_src]&0x0000f8) >> 3 | 0x8000)
|
||||
#define OP_PAL16_ARGB1555(_src) ((palbase[_src]&0xf80000) >> 9 | \
|
||||
(palbase[_src]&0x00f800) >> 6 | \
|
||||
(palbase[_src]&0x0000f8) >> 3 | 0x8000)
|
||||
|
||||
#define OP_RGB15_ARGB1555(_src) ((_src) | 0x8000)
|
||||
|
||||
#define OP_RGB15PAL_ARGB1555(_src) ((texsource->palette[(_src) >> 10] & 0xf8) << 7 | \
|
||||
(texsource->palette[((_src) >> 5) & 0x1f] & 0xf8) << 2 | \
|
||||
(texsource->palette[(_src) & 0x1f] & 0xf8) >> 3 | 0x8000)
|
||||
#define OP_RGB15PAL_ARGB1555(_src) ((palbase[(_src) >> 10] & 0xf8) << 7 | \
|
||||
(palbase[((_src) >> 5) & 0x1f] & 0xf8) << 2 | \
|
||||
(palbase[(_src) & 0x1f] & 0xf8) >> 3 | 0x8000)
|
||||
|
||||
#define OP_YUV16_UYVY(_src) (_src)
|
||||
|
||||
#define OP_YUV16PAL_UYVY(_src) ((texsource->palette[((_src) >> 8) & 0xff] << 8) | ((_src) & 0x00ff))
|
||||
#define OP_YUV16PAL_UYVY(_src) ((palbase[((_src) >> 8) & 0xff] << 8) | ((_src) & 0x00ff))
|
||||
|
||||
#define OP_YUV16PAL_YVYU(_src) ((texsource->palette[((_src) >> 8) & 0xff] & 0xff) | ((_src & 0xff) << 8))
|
||||
#define OP_YUV16PAL_YVYU(_src) ((palbase[((_src) >> 8) & 0xff] & 0xff) | ((_src & 0xff) << 8))
|
||||
|
||||
#define OP_YUV16_YVYU(_src) ((((_src) >> 8) & 0xff) | ((_src & 0xff) << 8))
|
||||
|
||||
#define OP_YUV16_YUY2(_src) ( ((_src) & 0xff00ff00) | \
|
||||
(((_src)>>16)&0xff) | (((_src)<<16)&0xff0000) )
|
||||
|
||||
#define OP_YUV16PAL_YUY2(_src) ( (texsource->palette[((_src)>>8) & 0xff]) | \
|
||||
(texsource->palette[((_src)>>24) & 0xff]<<16) | \
|
||||
#define OP_YUV16PAL_YUY2(_src) ( (palbase[((_src)>>8) & 0xff]) | \
|
||||
(palbase[((_src)>>24) & 0xff]<<16) | \
|
||||
(((_src)<<8)&0xff00ff00) )
|
||||
|
||||
#define OP_YUV16_ARGB32(_src) \
|
||||
@ -101,12 +101,12 @@ INLINE UINT32 pixel_ycc_to_rgb_pal(UINT16 *pixel, const rgb_t *palette)
|
||||
| ((UINT64)ycc_to_rgb(((_src) >> 24) & 0xff, (_src) & 0xff , ((_src)>>16) & 0xff) << 32)
|
||||
|
||||
#define OP_YUV16PAL_ARGB32(_src) \
|
||||
(UINT64)ycc_to_rgb(texsource->palette[((_src) >> 8) & 0xff], (_src) & 0xff , ((_src)>>16) & 0xff) \
|
||||
| ((UINT64)ycc_to_rgb(texsource->palette[((_src) >> 24) & 0xff], (_src) & 0xff , ((_src)>>16) & 0xff) << 32)
|
||||
(UINT64)ycc_to_rgb(palbase[((_src) >> 8) & 0xff], (_src) & 0xff , ((_src)>>16) & 0xff) \
|
||||
| ((UINT64)ycc_to_rgb(palbase[((_src) >> 24) & 0xff], (_src) & 0xff , ((_src)>>16) & 0xff) << 32)
|
||||
|
||||
#define OP_YUV16_ARGB32ROT(_src) pixel_ycc_to_rgb(&(_src))
|
||||
|
||||
#define OP_YUV16PAL_ARGB32ROT(_src) pixel_ycc_to_rgb_pal(&(_src), texsource->palette)
|
||||
#define OP_YUV16PAL_ARGB32ROT(_src) pixel_ycc_to_rgb_pal(&(_src), palbase)
|
||||
|
||||
//============================================================
|
||||
// Copy and rotation
|
||||
@ -114,6 +114,7 @@ INLINE UINT32 pixel_ycc_to_rgb_pal(UINT16 *pixel, const rgb_t *palette)
|
||||
|
||||
#define TEXCOPY_M( _name, _src_type, _dest_type, _op, _len_div) \
|
||||
INLINE void texcopy_##_name (texture_info *texture, const render_texinfo *texsource) { \
|
||||
const rgb_t *palbase = texsource->palette(); \
|
||||
int x, y; \
|
||||
/* loop over Y */ \
|
||||
for (y = 0; y < texsource->height; y++) { \
|
||||
@ -133,6 +134,7 @@ INLINE void texcopy_##_name (texture_info *texture, const render_texinfo *texsou
|
||||
|
||||
#define TEXROT( _name, _src_type, _dest_type, _op) \
|
||||
INLINE void texcopy_rot_##_name (texture_info *texture, const render_texinfo *texsource) { \
|
||||
const rgb_t *palbase = texsource->palette(); \
|
||||
int x, y; \
|
||||
quad_setup_data *setup = &texture->setup; \
|
||||
int dudx = setup->dudx; \
|
||||
|
@ -60,6 +60,10 @@ enum
|
||||
|
||||
struct quad_setup_data
|
||||
{
|
||||
quad_setup_data()
|
||||
: dudx(0), dvdx(0), dudy(0), dvdy(0), startu(0), startv(0),
|
||||
rotwidth(0), rotheight(0)
|
||||
{}
|
||||
INT32 dudx, dvdx, dudy, dvdy;
|
||||
INT32 startu, startv;
|
||||
INT32 rotwidth, rotheight;
|
||||
@ -90,6 +94,12 @@ struct copy_info {
|
||||
/* texture_info holds information about a texture */
|
||||
struct texture_info
|
||||
{
|
||||
texture_info()
|
||||
: next(NULL), hash(0), flags(0), rawwidth(0), rawheight(0), format(0),
|
||||
pixels(NULL), pitch(0), pixels_own(0), texture_id(NULL), copyinfo(NULL),
|
||||
sdl_access(0), sdl_blendmode(SDL_BLENDMODE_NONE), is_rotated(0), last_access(0)
|
||||
{
|
||||
}
|
||||
texture_info * next; // next texture in the list
|
||||
|
||||
HashT hash; // hash value for the texture (must be >= pointer size)
|
||||
@ -117,6 +127,12 @@ struct texture_info
|
||||
/* sdl_info is the information about SDL for the current screen */
|
||||
struct sdl_info
|
||||
{
|
||||
sdl_info()
|
||||
: blittimer(0), extra_flags(0), sdl_renderer(NULL), texlist(NULL),
|
||||
texture_max_width(0), texture_max_height(0), last_hofs(0), last_vofs(0),
|
||||
resize_pending(0), resize_width(0), resize_height(0),
|
||||
last_blit_time(0), last_blit_pixels(0)
|
||||
{}
|
||||
INT32 blittimer;
|
||||
UINT32 extra_flags;
|
||||
|
||||
@ -441,7 +457,7 @@ static int RendererSupportsFormat(SDL_Renderer *renderer, Uint32 format, Uint32
|
||||
|
||||
static void add_list(copy_info **head, copy_info *element, Uint32 bm)
|
||||
{
|
||||
copy_info *newci = (copy_info *) osd_malloc(sizeof(copy_info));
|
||||
copy_info *newci = global_alloc(copy_info);
|
||||
*newci = *element;
|
||||
|
||||
newci->bm_mask = bm;
|
||||
@ -515,7 +531,7 @@ static void drawsdl2_exit(void)
|
||||
(int) bi->perf);
|
||||
freeme = bi;
|
||||
bi = bi->next;
|
||||
osd_free(freeme);
|
||||
global_free(freeme);
|
||||
}
|
||||
}
|
||||
|
||||
@ -543,12 +559,10 @@ static void drawsdl2_attach(sdl_draw_info *info, sdl_window_info *window)
|
||||
static int drawsdl2_window_create(sdl_window_info *window, int width, int height)
|
||||
{
|
||||
// allocate memory for our structures
|
||||
sdl_info *sdl = (sdl_info *) osd_malloc(sizeof(*sdl));
|
||||
sdl_info *sdl = global_alloc(sdl_info);
|
||||
|
||||
osd_printf_verbose("Enter drawsdl2_window_create\n");
|
||||
|
||||
memset(sdl, 0, sizeof(*sdl));
|
||||
|
||||
window->dxdata = sdl;
|
||||
|
||||
sdl->extra_flags = (window->fullscreen() ?
|
||||
@ -819,7 +833,7 @@ static void drawsdl2_window_destroy(sdl_window_info *window)
|
||||
|
||||
SDL_DestroyWindow(window->sdl_window);
|
||||
|
||||
osd_free(sdl);
|
||||
global_free(sdl);
|
||||
window->dxdata = NULL;
|
||||
}
|
||||
|
||||
@ -879,8 +893,7 @@ static texture_info *texture_create(sdl_window_info *window, const render_texinf
|
||||
texture_info *texture;
|
||||
|
||||
// allocate a new texture
|
||||
texture = (texture_info *) osd_malloc(sizeof(*texture));
|
||||
memset(texture, 0, sizeof(*texture));
|
||||
texture = global_alloc(texture_info);
|
||||
|
||||
// fill in the core data
|
||||
texture->hash = texture_compute_hash(texsource, flags);
|
||||
@ -897,7 +910,7 @@ static texture_info *texture_create(sdl_window_info *window, const render_texinf
|
||||
texture->format = SDL_TEXFORMAT_ARGB32;
|
||||
break;
|
||||
case TEXFORMAT_RGB32:
|
||||
texture->format = texsource->palette ? SDL_TEXFORMAT_RGB32_PALETTED : SDL_TEXFORMAT_RGB32;
|
||||
texture->format = texsource->palette() ? SDL_TEXFORMAT_RGB32_PALETTED : SDL_TEXFORMAT_RGB32;
|
||||
break;
|
||||
case TEXFORMAT_PALETTE16:
|
||||
texture->format = SDL_TEXFORMAT_PALETTE16;
|
||||
@ -906,7 +919,7 @@ static texture_info *texture_create(sdl_window_info *window, const render_texinf
|
||||
texture->format = SDL_TEXFORMAT_PALETTE16A;
|
||||
break;
|
||||
case TEXFORMAT_YUY16:
|
||||
texture->format = texsource->palette ? SDL_TEXFORMAT_YUY16_PALETTED : SDL_TEXFORMAT_YUY16;
|
||||
texture->format = texsource->palette() ? SDL_TEXFORMAT_YUY16_PALETTED : SDL_TEXFORMAT_YUY16;
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -940,7 +953,7 @@ static texture_info *texture_create(sdl_window_info *window, const render_texinf
|
||||
|
||||
if ( (texture->copyinfo->func != NULL) && (texture->sdl_access == SDL_TEXTUREACCESS_STATIC))
|
||||
{
|
||||
texture->pixels = osd_malloc_array(texture->setup.rotwidth * texture->setup.rotheight * texture->copyinfo->dst_bpp);
|
||||
texture->pixels = malloc(texture->setup.rotwidth * texture->setup.rotheight * texture->copyinfo->dst_bpp);
|
||||
texture->pixels_own=TRUE;
|
||||
}
|
||||
/* add us to the texture list */
|
||||
@ -1135,7 +1148,7 @@ static void drawsdl2_destroy_texture(sdl_info *sdl, texture_info *texture)
|
||||
SDL_DestroyTexture(texture->texture_id);
|
||||
if ( texture->pixels_own )
|
||||
{
|
||||
osd_free(texture->pixels);
|
||||
free(texture->pixels);
|
||||
texture->pixels=NULL;
|
||||
texture->pixels_own=FALSE;
|
||||
}
|
||||
@ -1147,7 +1160,7 @@ static void drawsdl2_destroy_texture(sdl_info *sdl, texture_info *texture)
|
||||
sdl->texlist = NULL;
|
||||
else
|
||||
p->next = texture->next;
|
||||
osd_free(texture);
|
||||
global_free(texture);
|
||||
}
|
||||
|
||||
static void drawsdl2_destroy_all_textures(sdl_window_info *window)
|
||||
|
@ -161,6 +161,25 @@ struct texture_info;
|
||||
/* texture_info holds information about a texture */
|
||||
struct texture_info
|
||||
{
|
||||
texture_info()
|
||||
: hash(0), flags(0), rawwidth(0), rawheight(0),
|
||||
rawwidth_create(0), rawheight_create(0),
|
||||
type(0), format(0), borderpix(0), xprescale(0), yprescale(0), nocopy(0),
|
||||
texture(0), texTarget(0), texpow2(0), mpass_dest_idx(0), pbo(0), data(NULL),
|
||||
data_own(0), texCoordBufferName(0)
|
||||
{
|
||||
for (int i=0; i<2; i++)
|
||||
{
|
||||
mpass_textureunit[i] = 0;
|
||||
mpass_texture_mamebm[i] = 0;
|
||||
mpass_fbo_mamebm[i] = 0;
|
||||
mpass_texture_scrn[i] = 0;
|
||||
mpass_fbo_scrn[i] = 0;
|
||||
}
|
||||
for (int i=0; i<8; i++)
|
||||
texCoord[i] = 0.0f;
|
||||
}
|
||||
|
||||
HashT hash; // hash value for the texture (must be >= pointer size)
|
||||
UINT32 flags; // rendering flags
|
||||
render_texinfo texinfo; // copy of the texture info
|
||||
@ -198,6 +217,36 @@ struct texture_info
|
||||
/* sdl_info is the information about SDL for the current screen */
|
||||
struct sdl_info
|
||||
{
|
||||
sdl_info()
|
||||
: blittimer(0), extra_flags(0),
|
||||
#if (SDLMAME_SDL2)
|
||||
gl_context_id(0),
|
||||
#else
|
||||
sdlsurf(NULL),
|
||||
#endif
|
||||
initialized(0),
|
||||
last_blendmode(0),
|
||||
texture_max_width(0),
|
||||
texture_max_height(0),
|
||||
texpoweroftwo(0),
|
||||
usevbo(0), usepbo(0), usefbo(0), useglsl(0), glsl(NULL),
|
||||
glsl_program_num(0),
|
||||
glsl_program_mb2sc(0),
|
||||
usetexturerect(0),
|
||||
init_context(0),
|
||||
last_hofs(0.0f),
|
||||
last_vofs(0.0f),
|
||||
surf_w(0),
|
||||
surf_h(0)
|
||||
{
|
||||
for (int i=0; i < HASH_SIZE + OVERFLOW_SIZE; i++)
|
||||
texhash[i] = NULL;
|
||||
for (int i=0; i < 2*GLSL_SHADER_MAX; i++)
|
||||
glsl_program[i] = 0;
|
||||
for (int i=0; i < 8; i++)
|
||||
texVerticex[i] = 0.0f;
|
||||
}
|
||||
|
||||
INT32 blittimer;
|
||||
UINT32 extra_flags;
|
||||
|
||||
@ -487,8 +536,7 @@ static int drawogl_window_create(sdl_window_info *window, int width, int height)
|
||||
int has_and_allow_texturerect = 0;
|
||||
|
||||
// allocate memory for our structures
|
||||
sdl = (sdl_info *) osd_malloc(sizeof(*sdl));
|
||||
memset(sdl, 0, sizeof(*sdl));
|
||||
sdl = global_alloc(sdl_info);
|
||||
|
||||
window->dxdata = sdl;
|
||||
|
||||
@ -1612,7 +1660,7 @@ static void drawogl_window_destroy(sdl_window_info *window)
|
||||
}
|
||||
#endif
|
||||
|
||||
osd_free(sdl);
|
||||
global_free(sdl);
|
||||
window->dxdata = NULL;
|
||||
}
|
||||
|
||||
@ -1654,7 +1702,7 @@ static void texture_compute_type_subroutine(sdl_info *sdl, const render_texinfo
|
||||
if ( texture_copy_properties[texture->format][SDL_TEXFORMAT_SRC_EQUALS_DEST] &&
|
||||
!texture_copy_properties[texture->format][SDL_TEXFORMAT_SRC_HAS_PALETTE] &&
|
||||
texture->xprescale == 1 && texture->yprescale == 1 &&
|
||||
!texture->borderpix && !texsource->palette &&
|
||||
!texture->borderpix && !texsource->palette() &&
|
||||
texsource->rowpixels <= sdl->texture_max_width )
|
||||
{
|
||||
texture->nocopy = TRUE;
|
||||
@ -2068,8 +2116,7 @@ static texture_info *texture_create(sdl_window_info *window, const render_texinf
|
||||
texture_info *texture;
|
||||
|
||||
// allocate a new texture
|
||||
texture = (texture_info *) malloc(sizeof(*texture));
|
||||
memset(texture, 0, sizeof(*texture));
|
||||
texture = global_alloc(texture_info);
|
||||
|
||||
// fill in the core data
|
||||
texture->hash = texture_compute_hash(texsource, flags);
|
||||
@ -2107,7 +2154,7 @@ static texture_info *texture_create(sdl_window_info *window, const render_texinf
|
||||
texture->format = SDL_TEXFORMAT_ARGB32;
|
||||
break;
|
||||
case TEXFORMAT_RGB32:
|
||||
if (texsource->palette != NULL)
|
||||
if (texsource->palette() != NULL)
|
||||
texture->format = SDL_TEXFORMAT_RGB32_PALETTED;
|
||||
else
|
||||
texture->format = SDL_TEXFORMAT_RGB32;
|
||||
@ -2119,7 +2166,7 @@ static texture_info *texture_create(sdl_window_info *window, const render_texinf
|
||||
texture->format = SDL_TEXFORMAT_PALETTE16A;
|
||||
break;
|
||||
case TEXFORMAT_YUY16:
|
||||
if (texsource->palette != NULL)
|
||||
if (texsource->palette() != NULL)
|
||||
texture->format = SDL_TEXFORMAT_YUY16_PALETTED;
|
||||
else
|
||||
texture->format = SDL_TEXFORMAT_YUY16;
|
||||
@ -2143,7 +2190,7 @@ static texture_info *texture_create(sdl_window_info *window, const render_texinf
|
||||
{
|
||||
if ( texture_shader_create(window, texsource, texture, flags) )
|
||||
{
|
||||
free(texture);
|
||||
global_free(texture);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
@ -2229,7 +2276,7 @@ static texture_info *texture_create(sdl_window_info *window, const render_texinf
|
||||
sdl->texhash[i] = texture;
|
||||
break;
|
||||
}
|
||||
assert(i < HASH_SIZE + OVERFLOW_SIZE);
|
||||
assert_always(i < HASH_SIZE + OVERFLOW_SIZE, "texture hash exhausted ...");
|
||||
}
|
||||
|
||||
if(sdl->usevbo)
|
||||
@ -2561,23 +2608,23 @@ static void texture_set_data(texture_info *texture, const render_texinfo *texsou
|
||||
switch (PRIMFLAG_GET_TEXFORMAT(flags))
|
||||
{
|
||||
case TEXFORMAT_PALETTE16:
|
||||
copyline_palette16((UINT32 *)dst, (UINT16 *)texsource->base + y * texsource->rowpixels, texsource->width, texsource->palette, texture->borderpix, texture->xprescale);
|
||||
copyline_palette16((UINT32 *)dst, (UINT16 *)texsource->base + y * texsource->rowpixels, texsource->width, texsource->palette(), texture->borderpix, texture->xprescale);
|
||||
break;
|
||||
|
||||
case TEXFORMAT_PALETTEA16:
|
||||
copyline_palettea16((UINT32 *)dst, (UINT16 *)texsource->base + y * texsource->rowpixels, texsource->width, texsource->palette, texture->borderpix, texture->xprescale);
|
||||
copyline_palettea16((UINT32 *)dst, (UINT16 *)texsource->base + y * texsource->rowpixels, texsource->width, texsource->palette(), texture->borderpix, texture->xprescale);
|
||||
break;
|
||||
|
||||
case TEXFORMAT_RGB32:
|
||||
copyline_rgb32((UINT32 *)dst, (UINT32 *)texsource->base + y * texsource->rowpixels, texsource->width, texsource->palette, texture->borderpix, texture->xprescale);
|
||||
copyline_rgb32((UINT32 *)dst, (UINT32 *)texsource->base + y * texsource->rowpixels, texsource->width, texsource->palette(), texture->borderpix, texture->xprescale);
|
||||
break;
|
||||
|
||||
case TEXFORMAT_ARGB32:
|
||||
copyline_argb32((UINT32 *)dst, (UINT32 *)texsource->base + y * texsource->rowpixels, texsource->width, texsource->palette, texture->borderpix, texture->xprescale);
|
||||
copyline_argb32((UINT32 *)dst, (UINT32 *)texsource->base + y * texsource->rowpixels, texsource->width, texsource->palette(), texture->borderpix, texture->xprescale);
|
||||
break;
|
||||
|
||||
case TEXFORMAT_YUY16:
|
||||
copyline_yuy16_to_argb((UINT32 *)dst, (UINT16 *)texsource->base + y * texsource->rowpixels, texsource->width, texsource->palette, texture->borderpix, texture->xprescale);
|
||||
copyline_yuy16_to_argb((UINT32 *)dst, (UINT16 *)texsource->base + y * texsource->rowpixels, texsource->width, texsource->palette(), texture->borderpix, texture->xprescale);
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -2650,7 +2697,7 @@ static int compare_texture_primitive(const texture_info *texture, const render_p
|
||||
texture->texinfo.width == prim->texture.width &&
|
||||
texture->texinfo.height == prim->texture.height &&
|
||||
texture->texinfo.rowpixels == prim->texture.rowpixels &&
|
||||
texture->texinfo.palette == prim->texture.palette &&
|
||||
/* texture->texinfo.palette() == prim->texture.palette() && */
|
||||
((texture->flags ^ prim->flags) & (PRIMFLAG_BLENDMODE_MASK | PRIMFLAG_TEXFORMAT_MASK)) == 0)
|
||||
return 1;
|
||||
else
|
||||
@ -3041,40 +3088,40 @@ static void drawogl_destroy_all_textures(sdl_window_info *window)
|
||||
sdl->texhash[i] = NULL;
|
||||
if (texture != NULL)
|
||||
{
|
||||
if(sdl->usevbo)
|
||||
{
|
||||
pfn_glDeleteBuffers( 1, &(texture->texCoordBufferName) );
|
||||
texture->texCoordBufferName=0;
|
||||
}
|
||||
if(sdl->usevbo)
|
||||
{
|
||||
pfn_glDeleteBuffers( 1, &(texture->texCoordBufferName) );
|
||||
texture->texCoordBufferName=0;
|
||||
}
|
||||
|
||||
if(sdl->usepbo && texture->pbo)
|
||||
{
|
||||
pfn_glDeleteBuffers( 1, (GLuint *)&(texture->pbo) );
|
||||
texture->pbo=0;
|
||||
}
|
||||
if(sdl->usepbo && texture->pbo)
|
||||
{
|
||||
pfn_glDeleteBuffers( 1, (GLuint *)&(texture->pbo) );
|
||||
texture->pbo=0;
|
||||
}
|
||||
|
||||
if( sdl->glsl_program_num > 1 )
|
||||
{
|
||||
assert(sdl->usefbo);
|
||||
pfn_glDeleteFramebuffers(2, (GLuint *)&texture->mpass_fbo_mamebm[0]);
|
||||
glDeleteTextures(2, (GLuint *)&texture->mpass_texture_mamebm[0]);
|
||||
}
|
||||
if( sdl->glsl_program_num > 1 )
|
||||
{
|
||||
assert(sdl->usefbo);
|
||||
pfn_glDeleteFramebuffers(2, (GLuint *)&texture->mpass_fbo_mamebm[0]);
|
||||
glDeleteTextures(2, (GLuint *)&texture->mpass_texture_mamebm[0]);
|
||||
}
|
||||
|
||||
if ( sdl->glsl_program_mb2sc < sdl->glsl_program_num - 1 )
|
||||
{
|
||||
assert(sdl->usefbo);
|
||||
pfn_glDeleteFramebuffers(2, (GLuint *)&texture->mpass_fbo_scrn[0]);
|
||||
glDeleteTextures(2, (GLuint *)&texture->mpass_texture_scrn[0]);
|
||||
}
|
||||
if ( sdl->glsl_program_mb2sc < sdl->glsl_program_num - 1 )
|
||||
{
|
||||
assert(sdl->usefbo);
|
||||
pfn_glDeleteFramebuffers(2, (GLuint *)&texture->mpass_fbo_scrn[0]);
|
||||
glDeleteTextures(2, (GLuint *)&texture->mpass_texture_scrn[0]);
|
||||
}
|
||||
|
||||
glDeleteTextures(1, (GLuint *)&texture->texture);
|
||||
if ( texture->data_own )
|
||||
{
|
||||
free(texture->data);
|
||||
texture->data=NULL;
|
||||
texture->data_own=FALSE;
|
||||
}
|
||||
free(texture);
|
||||
glDeleteTextures(1, (GLuint *)&texture->texture);
|
||||
if ( texture->data_own )
|
||||
{
|
||||
free(texture->data);
|
||||
texture->data=NULL;
|
||||
texture->data_own=FALSE;
|
||||
}
|
||||
global_free(texture);
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
@ -656,6 +656,7 @@ static OSDWORK_CALLBACK( sdlwindow_update_cursor_state_wt )
|
||||
|
||||
sdlwindow_update_cursor_state(wp->machine(), wp->window());
|
||||
|
||||
osd_free(wp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -940,7 +940,7 @@ int shaders::create_resources(bool reset)
|
||||
texture.rowpixels = shadow_bitmap.rowpixels();
|
||||
texture.width = shadow_bitmap.width();
|
||||
texture.height = shadow_bitmap.height();
|
||||
texture.palette = NULL;
|
||||
texture.set_palette(NULL);
|
||||
texture.seqid = 0;
|
||||
|
||||
// now create it
|
||||
|
@ -528,7 +528,7 @@ void texture_manager::create_resources()
|
||||
texture.rowpixels = m_default_bitmap.rowpixels();
|
||||
texture.width = m_default_bitmap.width();
|
||||
texture.height = m_default_bitmap.height();
|
||||
texture.palette = NULL;
|
||||
texture.set_palette(NULL);
|
||||
texture.seqid = 0;
|
||||
|
||||
// now create it
|
||||
@ -545,7 +545,7 @@ void texture_manager::create_resources()
|
||||
texture.rowpixels = m_vector_bitmap.rowpixels();
|
||||
texture.width = m_vector_bitmap.width();
|
||||
texture.height = m_vector_bitmap.height();
|
||||
texture.palette = NULL;
|
||||
texture.set_palette(NULL);
|
||||
texture.seqid = 0;
|
||||
|
||||
// now create it
|
||||
@ -2580,28 +2580,28 @@ void texture_info::set_data(const render_texinfo *texsource, UINT32 flags)
|
||||
switch (PRIMFLAG_GET_TEXFORMAT(flags))
|
||||
{
|
||||
case TEXFORMAT_PALETTE16:
|
||||
copyline_palette16((UINT32 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, m_xborderpix);
|
||||
copyline_palette16((UINT32 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette(), m_xborderpix);
|
||||
break;
|
||||
|
||||
case TEXFORMAT_PALETTEA16:
|
||||
copyline_palettea16((UINT32 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, m_xborderpix);
|
||||
copyline_palettea16((UINT32 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette(), m_xborderpix);
|
||||
break;
|
||||
|
||||
case TEXFORMAT_RGB32:
|
||||
copyline_rgb32((UINT32 *)dst, (UINT32 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, m_xborderpix);
|
||||
copyline_rgb32((UINT32 *)dst, (UINT32 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette(), m_xborderpix);
|
||||
break;
|
||||
|
||||
case TEXFORMAT_ARGB32:
|
||||
copyline_argb32((UINT32 *)dst, (UINT32 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, m_xborderpix);
|
||||
copyline_argb32((UINT32 *)dst, (UINT32 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette(), m_xborderpix);
|
||||
break;
|
||||
|
||||
case TEXFORMAT_YUY16:
|
||||
if (m_texture_manager->get_yuv_format() == D3DFMT_YUY2)
|
||||
copyline_yuy16_to_yuy2((UINT16 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, m_xborderpix);
|
||||
copyline_yuy16_to_yuy2((UINT16 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette(), m_xborderpix);
|
||||
else if (m_texture_manager->get_yuv_format() == D3DFMT_UYVY)
|
||||
copyline_yuy16_to_uyvy((UINT16 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, m_xborderpix);
|
||||
copyline_yuy16_to_uyvy((UINT16 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette(), m_xborderpix);
|
||||
else
|
||||
copyline_yuy16_to_argb((UINT32 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette, m_xborderpix);
|
||||
copyline_yuy16_to_argb((UINT32 *)dst, (UINT16 *)texsource->base + srcy * texsource->rowpixels, texsource->width, texsource->palette(), m_xborderpix);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
Loading…
Reference in New Issue
Block a user