Optimize P96 32-bit modes
This commit is contained in:
parent
a32471cab1
commit
44ade8a34a
2 changed files with 116 additions and 213 deletions
|
@ -178,8 +178,8 @@ static int display_thread(void *unused)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rgb_mode = VC_IMAGE_ARGB8888;
|
|
||||||
display_depth = 32;
|
display_depth = 32;
|
||||||
|
rgb_mode = VC_IMAGE_RGBA32;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -763,8 +763,8 @@ static void open_screen(struct uae_prefs* p)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pixel_format = SDL_PIXELFORMAT_BGRA32;
|
|
||||||
display_depth = 32;
|
display_depth = 32;
|
||||||
|
pixel_format = SDL_PIXELFORMAT_RGBA32;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (amiberry_options.rotation_angle == 0 || amiberry_options.rotation_angle == 180)
|
if (amiberry_options.rotation_angle == 0 || amiberry_options.rotation_angle == 180)
|
||||||
|
|
|
@ -202,17 +202,17 @@ extern addrbank gfxmem_bank;
|
||||||
extern addrbank* gfxmem_banks[MAX_RTG_BOARDS];
|
extern addrbank* gfxmem_banks[MAX_RTG_BOARDS];
|
||||||
extern int rtg_index;
|
extern int rtg_index;
|
||||||
|
|
||||||
void lockrtg(void)
|
//void lockrtg(void)
|
||||||
{
|
//{
|
||||||
if (currprefs.rtg_multithread && render_pipe)
|
// if (currprefs.rtg_multithread && render_pipe)
|
||||||
EnterCriticalSection(&render_cs);
|
// EnterCriticalSection(&render_cs);
|
||||||
}
|
//}
|
||||||
|
//
|
||||||
void unlockrtg(void)
|
//void unlockrtg(void)
|
||||||
{
|
//{
|
||||||
if (currprefs.rtg_multithread && render_pipe)
|
// if (currprefs.rtg_multithread && render_pipe)
|
||||||
LeaveCriticalSection(&render_cs);
|
// LeaveCriticalSection(&render_cs);
|
||||||
}
|
//}
|
||||||
|
|
||||||
STATIC_INLINE void endianswap(uae_u32* vp, int bpp)
|
STATIC_INLINE void endianswap(uae_u32* vp, int bpp)
|
||||||
{
|
{
|
||||||
|
@ -228,8 +228,6 @@ STATIC_INLINE void endianswap(uae_u32* vp, int bpp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void** gwwbuf[MAX_RTG_BOARDS];
|
|
||||||
static int gwwbufsize[MAX_RTG_BOARDS], gwwpagesize[MAX_RTG_BOARDS], gwwpagemask[MAX_RTG_BOARDS];
|
|
||||||
//extern uae_u8* natmem_offset;
|
//extern uae_u8* natmem_offset;
|
||||||
|
|
||||||
static uae_u8 GetBytesPerPixel(uae_u32 RGBfmt)
|
static uae_u8 GetBytesPerPixel(uae_u32 RGBfmt)
|
||||||
|
@ -661,7 +659,7 @@ static int doskip (void)
|
||||||
return p96_framecnt > 0;
|
return p96_framecnt > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void picasso_trigger_vblank ()
|
static void picasso_trigger_vblank ()
|
||||||
{
|
{
|
||||||
TrapContext* ctx = nullptr;
|
TrapContext* ctx = nullptr;
|
||||||
if (!ABI_interrupt || !uaegfx_base || !interrupt_enabled)
|
if (!ABI_interrupt || !uaegfx_base || !interrupt_enabled)
|
||||||
|
@ -693,7 +691,7 @@ static void rtg_render ()
|
||||||
bool full = vidinfo->full_refresh > 0;
|
bool full = vidinfo->full_refresh > 0;
|
||||||
if (uaegfx_active) {
|
if (uaegfx_active) {
|
||||||
if (!currprefs.rtg_multithread)
|
if (!currprefs.rtg_multithread)
|
||||||
picasso_flushpixels(gfxmem_banks[uaegfx_index]->start + regs.natmem_offset, state->XYOffset - gfxmem_banks[uaegfx_index]->start, true);
|
picasso_flushpixels(gfxmem_banks[uaegfx_index]->start + regs.natmem_offset, static_cast<int>(state->XYOffset) - gfxmem_banks[uaegfx_index]->start, true);
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
if (vidinfo->full_refresh < 0)
|
if (vidinfo->full_refresh < 0)
|
||||||
|
@ -867,7 +865,7 @@ static int getconvert (int rgbformat, int pixbytes)
|
||||||
|
|
||||||
static void setconvert()
|
static void setconvert()
|
||||||
{
|
{
|
||||||
lockrtg();
|
//lockrtg();
|
||||||
struct picasso_vidbuf_description* vidinfo = &picasso_vidinfo;
|
struct picasso_vidbuf_description* vidinfo = &picasso_vidinfo;
|
||||||
struct picasso96_state_struct* state = &picasso96_state;
|
struct picasso96_state_struct* state = &picasso96_state;
|
||||||
|
|
||||||
|
@ -887,7 +885,7 @@ static void setconvert()
|
||||||
vidinfo->orgbformat = state->RGBFormat;
|
vidinfo->orgbformat = state->RGBFormat;
|
||||||
}
|
}
|
||||||
vidinfo->full_refresh = 1;
|
vidinfo->full_refresh = 1;
|
||||||
unlockrtg();
|
//unlockrtg();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool picasso_is_active()
|
bool picasso_is_active()
|
||||||
|
@ -911,16 +909,16 @@ void picasso_refresh()
|
||||||
|
|
||||||
if (!ad->picasso_on)
|
if (!ad->picasso_on)
|
||||||
return;
|
return;
|
||||||
lockrtg();
|
//lockrtg();
|
||||||
vidinfo->full_refresh = 1;
|
vidinfo->full_refresh = 1;
|
||||||
setconvert();
|
setconvert();
|
||||||
rtg_clear();
|
rtg_clear();
|
||||||
|
|
||||||
if (currprefs.rtgboards[0].rtgmem_type >= GFXBOARD_HARDWARE) {
|
//if (currprefs.rtgboards[0].rtgmem_type >= GFXBOARD_HARDWARE) {
|
||||||
picasso_refresh();
|
//picasso_refresh();
|
||||||
unlockrtg();
|
//unlockrtg();
|
||||||
return;
|
//return;
|
||||||
}
|
//}
|
||||||
|
|
||||||
/* Make sure that the first time we show a Picasso video mode, we don't blit any crap.
|
/* Make sure that the first time we show a Picasso video mode, we don't blit any crap.
|
||||||
* We can do this by checking if we have an Address yet.
|
* We can do this by checking if we have an Address yet.
|
||||||
|
@ -954,7 +952,7 @@ void picasso_refresh()
|
||||||
} else {
|
} else {
|
||||||
write_log(_T("ERROR - picasso_refresh() can't refresh!\n"));
|
write_log(_T("ERROR - picasso_refresh() can't refresh!\n"));
|
||||||
}
|
}
|
||||||
unlockrtg();
|
//unlockrtg();
|
||||||
}
|
}
|
||||||
|
|
||||||
static int p96hsync;
|
static int p96hsync;
|
||||||
|
@ -981,8 +979,8 @@ void picasso_handle_vsync()
|
||||||
|
|
||||||
int state = vidinfo->picasso_state_change;
|
int state = vidinfo->picasso_state_change;
|
||||||
|
|
||||||
if (state)
|
//if (state)
|
||||||
lockrtg();
|
//lockrtg();
|
||||||
if (state & PICASSO_STATE_SETDAC) {
|
if (state & PICASSO_STATE_SETDAC) {
|
||||||
atomic_and(&vidinfo->picasso_state_change, ~PICASSO_STATE_SETDAC);
|
atomic_and(&vidinfo->picasso_state_change, ~PICASSO_STATE_SETDAC);
|
||||||
rtg_clear();
|
rtg_clear();
|
||||||
|
@ -1016,17 +1014,17 @@ void picasso_handle_vsync()
|
||||||
atomic_and(&vidinfo->picasso_state_change, ~PICASSO_STATE_SETDISPLAY);
|
atomic_and(&vidinfo->picasso_state_change, ~PICASSO_STATE_SETDISPLAY);
|
||||||
// do nothing
|
// do nothing
|
||||||
}
|
}
|
||||||
if (state)
|
//if (state)
|
||||||
unlockrtg();
|
//unlockrtg();
|
||||||
|
|
||||||
getvsyncrate(currprefs.chipset_refreshrate, &mult);
|
//getvsyncrate(currprefs.chipset_refreshrate, &mult);
|
||||||
if (vsync && mult < 0) {
|
//if (vsync && mult < 0) {
|
||||||
vsynccnt++;
|
//vsynccnt++;
|
||||||
if (vsynccnt < 2)
|
//if (vsynccnt < 2)
|
||||||
thisisvsync = 0;
|
//thisisvsync = 0;
|
||||||
else
|
//else
|
||||||
vsynccnt = 0;
|
//vsynccnt = 0;
|
||||||
}
|
//}
|
||||||
|
|
||||||
p96_framecnt++;
|
p96_framecnt++;
|
||||||
|
|
||||||
|
@ -1038,20 +1036,20 @@ void picasso_handle_vsync()
|
||||||
if (!ad->picasso_on)
|
if (!ad->picasso_on)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (uaegfx && uaegfx_active)
|
//if (uaegfx && uaegfx_active)
|
||||||
if (setupcursor_needed)
|
//if (setupcursor_needed)
|
||||||
setupcursor();
|
//setupcursor();
|
||||||
mouseupdate();
|
//mouseupdate();
|
||||||
|
|
||||||
if (thisisvsync) {
|
//if (thisisvsync) {
|
||||||
rtg_render();
|
rtg_render();
|
||||||
//frame_drawn();
|
//frame_drawn();
|
||||||
}
|
//}
|
||||||
|
|
||||||
if (uaegfx) {
|
//if (uaegfx) {
|
||||||
if (thisisvsync)
|
//if (thisisvsync)
|
||||||
picasso_trigger_vblank();
|
picasso_trigger_vblank();
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1426,16 +1424,16 @@ d7: RGBFTYPE RGBFormat
|
||||||
*/
|
*/
|
||||||
static uae_u32 REGPARAM2 picasso_SetSpritePosition(TrapContext* ctx)
|
static uae_u32 REGPARAM2 picasso_SetSpritePosition(TrapContext* ctx)
|
||||||
{
|
{
|
||||||
struct picasso96_state_struct* state = &picasso96_state;
|
//struct picasso96_state_struct* state = &picasso96_state;
|
||||||
uaecptr bi = trap_get_areg(ctx, 0);
|
//uaecptr bi = trap_get_areg(ctx, 0);
|
||||||
boardinfo = bi;
|
//boardinfo = bi;
|
||||||
int x = (uae_s16)trap_get_word(ctx, bi + PSSO_BoardInfo_MouseX) - state->XOffset;
|
//int x = (uae_s16)trap_get_word(ctx, bi + PSSO_BoardInfo_MouseX) - state->XOffset;
|
||||||
int y = (uae_s16)trap_get_word(ctx, bi + PSSO_BoardInfo_MouseY) - state->YOffset;
|
//int y = (uae_s16)trap_get_word(ctx, bi + PSSO_BoardInfo_MouseY) - state->YOffset;
|
||||||
newcursor_x = x;
|
//newcursor_x = x;
|
||||||
newcursor_y = y;
|
//newcursor_y = y;
|
||||||
if (!hwsprite)
|
//if (!hwsprite)
|
||||||
return 0;
|
return 0;
|
||||||
return 1;
|
//return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1453,19 +1451,19 @@ This function changes one of the possible three colors of the hardware sprite.
|
||||||
*/
|
*/
|
||||||
static uae_u32 REGPARAM2 picasso_SetSpriteColor(TrapContext* ctx)
|
static uae_u32 REGPARAM2 picasso_SetSpriteColor(TrapContext* ctx)
|
||||||
{
|
{
|
||||||
uaecptr bi = trap_get_areg(ctx, 0);
|
//uaecptr bi = trap_get_areg(ctx, 0);
|
||||||
uae_u8 idx = trap_get_dreg(ctx, 0);
|
//uae_u8 idx = trap_get_dreg(ctx, 0);
|
||||||
uae_u8 red = trap_get_dreg(ctx, 1);
|
//uae_u8 red = trap_get_dreg(ctx, 1);
|
||||||
uae_u8 green = trap_get_dreg(ctx, 2);
|
//uae_u8 green = trap_get_dreg(ctx, 2);
|
||||||
uae_u8 blue = trap_get_dreg(ctx, 3);
|
//uae_u8 blue = trap_get_dreg(ctx, 3);
|
||||||
boardinfo = bi;
|
//boardinfo = bi;
|
||||||
idx++;
|
//idx++;
|
||||||
if (!hwsprite)
|
//if (!hwsprite)
|
||||||
return 0;
|
return 0;
|
||||||
if (idx >= 4)
|
//if (idx >= 4)
|
||||||
return 0;
|
//return 0;
|
||||||
cursorrgb[idx] = (red << 16) | (green << 8) | (blue << 0);
|
//cursorrgb[idx] = (red << 16) | (green << 8) | (blue << 0);
|
||||||
return 1;
|
//return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC_INLINE uae_u16 rgb32torgb16pc(uae_u32 rgb)
|
STATIC_INLINE uae_u16 rgb32torgb16pc(uae_u32 rgb)
|
||||||
|
@ -1829,9 +1827,10 @@ compensate for this when accounting for hotspot offsets and sprite dimensions.
|
||||||
*/
|
*/
|
||||||
static uae_u32 REGPARAM2 picasso_SetSpriteImage(TrapContext* ctx)
|
static uae_u32 REGPARAM2 picasso_SetSpriteImage(TrapContext* ctx)
|
||||||
{
|
{
|
||||||
uaecptr bi = trap_get_areg(ctx, 0);
|
return 0;
|
||||||
boardinfo = bi;
|
//uaecptr bi = trap_get_areg(ctx, 0);
|
||||||
return setspriteimage(ctx, bi);
|
//boardinfo = bi;
|
||||||
|
//return setspriteimage(ctx, bi);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1845,19 +1844,19 @@ This function activates or deactivates the hardware sprite.
|
||||||
*/
|
*/
|
||||||
static uae_u32 REGPARAM2 picasso_SetSprite(TrapContext* ctx)
|
static uae_u32 REGPARAM2 picasso_SetSprite(TrapContext* ctx)
|
||||||
{
|
{
|
||||||
uae_u32 result = 0;
|
//uae_u32 result = 0;
|
||||||
uae_u32 activate = trap_get_dreg(ctx, 0);
|
//uae_u32 activate = trap_get_dreg(ctx, 0);
|
||||||
if (!hwsprite)
|
//if (!hwsprite)
|
||||||
return 0;
|
return 0;
|
||||||
if (activate) {
|
//if (activate) {
|
||||||
picasso_SetSpriteImage(ctx);
|
//picasso_SetSpriteImage(ctx);
|
||||||
cursorvisible = true;
|
//cursorvisible = true;
|
||||||
} else {
|
//} else {
|
||||||
cursordeactivate = 2;
|
//cursordeactivate = 2;
|
||||||
}
|
//}
|
||||||
result = 1;
|
//result = 1;
|
||||||
|
|
||||||
return result;
|
//return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2067,14 +2066,6 @@ static void init_alloc (TrapContext *ctx, int size)
|
||||||
}
|
}
|
||||||
picasso96_amemend = picasso96_amem + size;
|
picasso96_amemend = picasso96_amem + size;
|
||||||
write_log (_T("P96 RESINFO: %08X-%08X (%d,%d)\n"), picasso96_amem, picasso96_amemend, size / PSSO_ModeInfo_sizeof, size);
|
write_log (_T("P96 RESINFO: %08X-%08X (%d,%d)\n"), picasso96_amem, picasso96_amemend, size / PSSO_ModeInfo_sizeof, size);
|
||||||
#ifdef AMIBERRY
|
|
||||||
write_log("setting gwwpagesize to something...\n");
|
|
||||||
gwwpagesize[0] = 1024 * 1024 * 4; // FIXME:...
|
|
||||||
|
|
||||||
gwwbufsize[0] = gfxmem_bank.allocated_size / gwwpagesize[0] + 1;
|
|
||||||
gwwpagemask[0] = gwwpagesize[0] - 1;
|
|
||||||
gwwbuf[0] = xmalloc(void*, gwwbufsize[0]);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int p96depth (int depth)
|
static int p96depth (int depth)
|
||||||
|
@ -2422,7 +2413,7 @@ static uae_u32 REGPARAM2 picasso_InitCard(TrapContext* ctx)
|
||||||
*/
|
*/
|
||||||
static uae_u32 REGPARAM2 picasso_SetSwitch(TrapContext* ctx)
|
static uae_u32 REGPARAM2 picasso_SetSwitch(TrapContext* ctx)
|
||||||
{
|
{
|
||||||
lockrtg();
|
//lockrtg();
|
||||||
struct picasso96_state_struct *state = &picasso96_state;
|
struct picasso96_state_struct *state = &picasso96_state;
|
||||||
struct amigadisplay *ad = &adisplays;
|
struct amigadisplay *ad = &adisplays;
|
||||||
struct picasso_vidbuf_description *vidinfo = &picasso_vidinfo;
|
struct picasso_vidbuf_description *vidinfo = &picasso_vidinfo;
|
||||||
|
@ -2441,7 +2432,7 @@ static uae_u32 REGPARAM2 picasso_SetSwitch(TrapContext* ctx)
|
||||||
write_log (_T("SetSwitch() - %s\n"), flag ? p96text : _T("amiga"));
|
write_log (_T("SetSwitch() - %s\n"), flag ? p96text : _T("amiga"));
|
||||||
|
|
||||||
/* Put old switch-state in D0 */
|
/* Put old switch-state in D0 */
|
||||||
unlockrtg();
|
//unlockrtg();
|
||||||
return !flag;
|
return !flag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2516,10 +2507,10 @@ static uae_u32 REGPARAM2 picasso_SetColorArray(TrapContext* ctx)
|
||||||
uaecptr clut = boardinfo + PSSO_BoardInfo_CLUT;
|
uaecptr clut = boardinfo + PSSO_BoardInfo_CLUT;
|
||||||
if (start > 256 || count > 256 || start + count > 256)
|
if (start > 256 || count > 256 || start + count > 256)
|
||||||
return 0;
|
return 0;
|
||||||
lockrtg();
|
//lockrtg();
|
||||||
if (updateclut(ctx, clut, start, count))
|
if (updateclut(ctx, clut, start, count))
|
||||||
vidinfo->full_refresh = 1;
|
vidinfo->full_refresh = 1;
|
||||||
unlockrtg();
|
//unlockrtg();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2575,7 +2566,7 @@ static void init_picasso_screen()
|
||||||
*/
|
*/
|
||||||
static uae_u32 REGPARAM2 picasso_SetGC(TrapContext* ctx)
|
static uae_u32 REGPARAM2 picasso_SetGC(TrapContext* ctx)
|
||||||
{
|
{
|
||||||
lockrtg();
|
//lockrtg();
|
||||||
struct picasso96_state_struct *state = &picasso96_state;
|
struct picasso96_state_struct *state = &picasso96_state;
|
||||||
struct picasso_vidbuf_description *vidinfo = &picasso_vidinfo;
|
struct picasso_vidbuf_description *vidinfo = &picasso_vidinfo;
|
||||||
/* Fill in some static UAE related structure about this new ModeInfo setting */
|
/* Fill in some static UAE related structure about this new ModeInfo setting */
|
||||||
|
@ -2598,7 +2589,7 @@ static uae_u32 REGPARAM2 picasso_SetGC(TrapContext* ctx)
|
||||||
state->HostAddress = NULL;
|
state->HostAddress = NULL;
|
||||||
|
|
||||||
atomic_or(&vidinfo->picasso_state_change, PICASSO_STATE_SETGC);
|
atomic_or(&vidinfo->picasso_state_change, PICASSO_STATE_SETGC);
|
||||||
unlockrtg();
|
//unlockrtg();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2637,7 +2628,7 @@ static void picasso_SetPanningInit (struct picasso96_state_struct *state)
|
||||||
|
|
||||||
static uae_u32 REGPARAM2 picasso_SetPanning(TrapContext* ctx)
|
static uae_u32 REGPARAM2 picasso_SetPanning(TrapContext* ctx)
|
||||||
{
|
{
|
||||||
lockrtg();
|
//lockrtg();
|
||||||
struct picasso96_state_struct *state = &picasso96_state;
|
struct picasso96_state_struct *state = &picasso96_state;
|
||||||
struct picasso_vidbuf_description *vidinfo = &picasso_vidinfo;
|
struct picasso_vidbuf_description *vidinfo = &picasso_vidinfo;
|
||||||
uae_u16 Width = trap_get_dreg(ctx, 0);
|
uae_u16 Width = trap_get_dreg(ctx, 0);
|
||||||
|
@ -2676,7 +2667,7 @@ static uae_u32 REGPARAM2 picasso_SetPanning(TrapContext* ctx)
|
||||||
|
|
||||||
atomic_or(&vidinfo->picasso_state_change, PICASSO_STATE_SETPANNING);
|
atomic_or(&vidinfo->picasso_state_change, PICASSO_STATE_SETPANNING);
|
||||||
|
|
||||||
unlockrtg();
|
//unlockrtg();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4703,7 +4694,16 @@ static void copyall(uae_u8* src, uae_u8* dst, int pwidth, int pheight, int srcby
|
||||||
if (vidinfo->pixbytes == 2)
|
if (vidinfo->pixbytes == 2)
|
||||||
copy_screen_32bit_to_16bit(dst, src, state->Width * state->Height * 4);
|
copy_screen_32bit_to_16bit(dst, src, state->Width * state->Height * 4);
|
||||||
else
|
else
|
||||||
copy_screen_32bit_to_32bit(dst, src, state->Width * state->Height * 4);
|
{
|
||||||
|
//copy_screen_32bit_to_32bit(dst, src, state->Width * state->Height * 4);
|
||||||
|
const auto w = pwidth * vidinfo->pixbytes;
|
||||||
|
for (auto y = 0; y < pheight; y++)
|
||||||
|
{
|
||||||
|
memcpy(dst, src, w);
|
||||||
|
dst += dstbytesperrow;
|
||||||
|
src += srcbytesperrow;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//int y, bytes;
|
//int y, bytes;
|
||||||
|
@ -4794,11 +4794,7 @@ static void picasso_flushpixels(uae_u8* src, int off, bool render)
|
||||||
uae_u8* src_start;
|
uae_u8* src_start;
|
||||||
uae_u8* src_end;
|
uae_u8* src_end;
|
||||||
uae_u8* dst = nullptr;
|
uae_u8* dst = nullptr;
|
||||||
#ifdef AMIBERRY
|
|
||||||
uintptr_t gwwcnt;
|
|
||||||
#else
|
|
||||||
ULONG_PTR gwwcnt;
|
|
||||||
#endif
|
|
||||||
int pwidth = state->Width > state->VirtualWidth ? state->VirtualWidth : state->Width;
|
int pwidth = state->Width > state->VirtualWidth ? state->VirtualWidth : state->Width;
|
||||||
int pheight = state->Height > state->VirtualHeight ? state->VirtualHeight : state->Height;
|
int pheight = state->Height > state->VirtualHeight ? state->VirtualHeight : state->Height;
|
||||||
|
|
||||||
|
@ -4817,9 +4813,9 @@ static void picasso_flushpixels(uae_u8* src, int off, bool render)
|
||||||
if (pheight > vidinfo->height)
|
if (pheight > vidinfo->height)
|
||||||
pheight = vidinfo->height;
|
pheight = vidinfo->height;
|
||||||
|
|
||||||
src_start = src + (off & ~gwwpagemask[0]);
|
src_start = src + off;
|
||||||
src_end = src + ((off + state->BytesPerRow * pheight + gwwpagesize[0] - 1) & ~gwwpagemask[0]);
|
src_end = src + (off + state->BytesPerRow * pheight);
|
||||||
if (!vidinfo->extra_mem || !gwwbuf[0] || src_start >= src_end) {
|
if (!vidinfo->extra_mem || src_start >= src_end) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4827,50 +4823,11 @@ static void picasso_flushpixels(uae_u8* src, int off, bool render)
|
||||||
vidinfo->full_refresh = -1;
|
vidinfo->full_refresh = -1;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
bool dofull;
|
|
||||||
|
|
||||||
gwwcnt = 0;
|
|
||||||
|
|
||||||
if (doskip() && p96skipmode == 1) {
|
if (doskip() && p96skipmode == 1) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (overlay_vram && overlay_active) {
|
dst = gfx_lock_picasso(true, vidinfo->rtg_clear_flag != 0);
|
||||||
unsigned long ps;
|
|
||||||
gwwcnt = gwwbufsize[0];
|
|
||||||
uae_u8* ovr_start = src + (overlay_vram_offset & ~gwwpagemask[0]);
|
|
||||||
uae_u8* ovr_end = src + ((overlay_vram_offset + overlay_src_width * overlay_src_height * overlay_pix + gwwpagesize[0] - 1) & ~gwwpagemask[0]);
|
|
||||||
#ifdef AMIBERRY
|
|
||||||
#else
|
|
||||||
mman_GetWriteWatch(ovr_start, ovr_end - ovr_start, gwwbuf[index], &gwwcnt, &ps);
|
|
||||||
#endif
|
|
||||||
overlay_updated = gwwcnt > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (vidinfo->full_refresh < 0 || overlay_updated) {
|
|
||||||
gwwcnt = (src_end - src_start) / gwwpagesize[0] + 1;
|
|
||||||
vidinfo->full_refresh = 1;
|
|
||||||
for (int i = 0; i < gwwcnt; i++)
|
|
||||||
gwwbuf[0][i] = src_start + i * gwwpagesize[0];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
unsigned long ps;
|
|
||||||
gwwcnt = gwwbufsize[0];
|
|
||||||
#ifdef AMIBERRY
|
|
||||||
#else
|
|
||||||
if (mman_GetWriteWatch(src_start, src_end - src_start, gwwbuf[index], &gwwcnt, &ps))
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
matchcount += gwwcnt;
|
|
||||||
|
|
||||||
if (gwwcnt == 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
dofull = gwwcnt >= ((src_end - src_start) / gwwpagesize[0]) * 80 / 100;
|
|
||||||
|
|
||||||
dst = gfx_lock_picasso(dofull, vidinfo->rtg_clear_flag != 0);
|
|
||||||
if (vidinfo->rtg_clear_flag)
|
if (vidinfo->rtg_clear_flag)
|
||||||
vidinfo->rtg_clear_flag--;
|
vidinfo->rtg_clear_flag--;
|
||||||
if (dst == nullptr)
|
if (dst == nullptr)
|
||||||
|
@ -4881,13 +4838,6 @@ static void picasso_flushpixels(uae_u8* src, int off, bool render)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dofull) {
|
|
||||||
//if (flashscreen != 0)
|
|
||||||
// copyallinvert(src + off, dst, pwidth, pheight,
|
|
||||||
// state->BytesPerRow, state->BytesPerPixel,
|
|
||||||
// vidinfo->rowbytes, vidinfo->pixbytes,
|
|
||||||
// state->RGBFormat == vidinfo->host_mode, vidinfo->picasso_convert);
|
|
||||||
//else
|
|
||||||
copyall(src + off, dst, pwidth, pheight,
|
copyall(src + off, dst, pwidth, pheight,
|
||||||
state->BytesPerRow, state->BytesPerPixel,
|
state->BytesPerRow, state->BytesPerPixel,
|
||||||
vidinfo->rowbytes, vidinfo->pixbytes,
|
vidinfo->rowbytes, vidinfo->pixbytes,
|
||||||
|
@ -4899,53 +4849,6 @@ static void picasso_flushpixels(uae_u8* src, int off, bool render)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < gwwcnt; i++) {
|
|
||||||
uae_u8* p = (uae_u8*)gwwbuf[0][i];
|
|
||||||
|
|
||||||
if (p >= src_start && p < src_end) {
|
|
||||||
int y, x, realoffset;
|
|
||||||
|
|
||||||
if (p >= src + off) {
|
|
||||||
realoffset = p - (src + off);
|
|
||||||
} else {
|
|
||||||
realoffset = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
y = realoffset / state->BytesPerRow;
|
|
||||||
if (y < pheight) {
|
|
||||||
int w = gwwpagesize[0] + state->BytesPerPixel - 1 / state->BytesPerPixel;
|
|
||||||
x = (realoffset % state->BytesPerRow) / state->BytesPerPixel;
|
|
||||||
if (x < pwidth) {
|
|
||||||
copyrow(src + off, dst, x, y, pwidth - x,
|
|
||||||
state->BytesPerRow, state->BytesPerPixel,
|
|
||||||
x, y, vidinfo->rowbytes, vidinfo->pixbytes,
|
|
||||||
state->RGBFormat == vidinfo->host_mode, vidinfo->picasso_convert, p96_rgbx16);
|
|
||||||
flushlines++;
|
|
||||||
}
|
|
||||||
w = (gwwpagesize[0] - (state->BytesPerRow - x * state->BytesPerPixel) + state->BytesPerPixel - 1) / state->BytesPerPixel;
|
|
||||||
if (y < miny)
|
|
||||||
miny = y;
|
|
||||||
y++;
|
|
||||||
while (y < pheight && w > 0) {
|
|
||||||
int maxw = w > pwidth ? pwidth : w;
|
|
||||||
copyrow(src + off, dst, 0, y, maxw,
|
|
||||||
state->BytesPerRow, state->BytesPerPixel,
|
|
||||||
0, y, vidinfo->rowbytes, vidinfo->pixbytes,
|
|
||||||
state->RGBFormat == vidinfo->host_mode, vidinfo->picasso_convert, p96_rgbx16);
|
|
||||||
w -= maxw;
|
|
||||||
y++;
|
|
||||||
flushlines++;
|
|
||||||
}
|
|
||||||
if (y > maxy)
|
|
||||||
maxy = y;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (overlay_vram && overlay_active && (flushlines || overlay_updated)) {
|
if (overlay_vram && overlay_active && (flushlines || overlay_updated)) {
|
||||||
if (dst == NULL) {
|
if (dst == NULL) {
|
||||||
dst = gfx_lock_picasso(false, false);
|
dst = gfx_lock_picasso(false, false);
|
||||||
|
@ -4977,7 +4880,7 @@ static void picasso_flushpixels(uae_u8* src, int off, bool render)
|
||||||
if (dst || render)
|
if (dst || render)
|
||||||
gfx_unlock_picasso(true);
|
gfx_unlock_picasso(true);
|
||||||
|
|
||||||
if (dst && gwwcnt) {
|
if (dst) {
|
||||||
vidinfo->full_refresh = 0;
|
vidinfo->full_refresh = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4993,13 +4896,13 @@ static int render_thread(void* v)
|
||||||
|
|
||||||
struct amigadisplay *ad = &adisplays;
|
struct amigadisplay *ad = &adisplays;
|
||||||
if (ad->picasso_on && ad->picasso_requested_on) {
|
if (ad->picasso_on && ad->picasso_requested_on) {
|
||||||
lockrtg();
|
//lockrtg();
|
||||||
if (ad->picasso_requested_on) {
|
if (ad->picasso_requested_on) {
|
||||||
struct picasso96_state_struct *state = &picasso96_state;
|
struct picasso96_state_struct *state = &picasso96_state;
|
||||||
picasso_flushpixels(gfxmem_banks[idx]->start + regs.natmem_offset, state->XYOffset - gfxmem_banks[idx]->start, false);
|
picasso_flushpixels(gfxmem_banks[idx]->start + regs.natmem_offset, state->XYOffset - gfxmem_banks[idx]->start, false);
|
||||||
ad->pending_render = true;
|
ad->pending_render = true;
|
||||||
}
|
}
|
||||||
unlockrtg();
|
//unlockrtg();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
render_thread_state = -1;
|
render_thread_state = -1;
|
||||||
|
@ -5716,7 +5619,7 @@ static void picasso_reset(int hardreset)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lockrtg();
|
//lockrtg();
|
||||||
|
|
||||||
//rtg_index = -1;
|
//rtg_index = -1;
|
||||||
if (savestate_state != STATE_RESTORE) {
|
if (savestate_state != STATE_RESTORE) {
|
||||||
|
@ -5739,7 +5642,7 @@ static void picasso_reset(int hardreset)
|
||||||
struct amigadisplay *ad = &adisplays;
|
struct amigadisplay *ad = &adisplays;
|
||||||
ad->picasso_requested_on = false;
|
ad->picasso_requested_on = false;
|
||||||
|
|
||||||
unlockrtg();
|
//unlockrtg();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void picasso_free(void)
|
static void picasso_free(void)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue