static int *amiga2aspect_line_map, *native2amiga_line_map;
static int native2amiga_line_map_height;
-static uae_u8 **row_map;
static uae_u8 *row_map_genlock_buffer;
static uae_u8 row_tmp8[MAX_PIXELS_PER_LINE * 32 / 8];
static uae_u8 row_tmp8g[MAX_PIXELS_PER_LINE * 32 / 8];
static int max_drawn_amiga_line;
-uae_u8 **row_map_genlock;
uae_u8 *row_map_color_burst_buffer;
static uae_sem_t write_sem, read_sem;
}
}
-#if 0
- struct vidbuf_description *vidinfo = &adisplays[0].gfxvidinfo;
- struct vidbuffer *vb = vidinfo->inbuffer;
- if (!vb->locked || !vb->bufmem || row_map[0] == NULL) {
- write_log("read_denise_line_queue: buffer cleared!\n");
- }
- for (int i = 0; i < vb->inheight; i++) {
- uae_u8 *p = row_map[i];
- *p = 0x12;
- }
-#endif
-
atomic_inc(&rga_queue_read);
uae_sem_post(&read_sem);
struct vidbuf_description *vidinfo = &adisplays[0].gfxvidinfo;
struct vidbuffer *vb = vidinfo->inbuffer;
static uae_u8 *oldbufmem;
- static struct vidbuffer *oldvb;
static int oldheight_alloc, oldheight, oldpitch;
static bool oldgenlock, oldburst;
- int i, j;
if (vb->height_allocated > max_uae_height) {
write_log(_T("Resolution too high, aborting\n"));
abort();
}
- if (!row_map) {
- row_map = xmalloc(uae_u8 *, max_uae_height + 1);
- row_map_genlock = xmalloc(uae_u8 *, max_uae_height + 1);
- }
- if (oldbufmem && oldbufmem == vb->bufmem &&
- oldvb == vb &&
- oldheight_alloc == vb->height_allocated &&
+ if (oldheight_alloc == vb->height_allocated &&
oldheight == vb->outheight &&
oldpitch == vb->rowbytes &&
oldgenlock == init_genlock_data &&
if (currprefs.cs_color_burst) {
row_map_color_burst_buffer = xcalloc(uae_u8, vb->height_allocated + 2);
}
- for (i = 0, j = 0; i < vb->height_allocated; i++, j += vb->rowbytes) {
- if (i < vb->outheight) {
- row_map[i] = vb->bufmem + j;
- } else {
- row_map[i] = row_tmp8;
- }
- if (init_genlock_data) {
- row_map_genlock[i] = row_map_genlock_buffer + vb->width_allocated * (i + 1);
- } else {
- row_map_genlock[i] = NULL;
- }
- }
- while (i < max_uae_height + 1) {
- row_map[i] = row_tmp8;
- row_map_genlock[i] = row_tmp8g;
- i++;
- }
- oldvb = vb;
- oldbufmem = vb->bufmem;
oldheight_alloc = vb->height_allocated;
oldheight = vb->outheight;
oldpitch = vb->rowbytes;
*p = c8;
}
+static uae_u8 *get_row(int monid, int line)
+{
+ struct vidbuf_description *vidinfo = &adisplays[monid].gfxvidinfo;
+ // Surface allocation may be still pending due to resolution change, make sure current size is large enough
+ if (!vidinfo->inbuffer || line < 0 || line >= vidinfo->inbuffer->height_allocated) {
+ return row_tmp8;
+ }
+ if (vidinfo->inbuffer->outwidth > vidinfo->inbuffer->width_allocated) {
+ return row_tmp8;
+ }
+ if (vidinfo->inbuffer->outheight > vidinfo->inbuffer->height_allocated) {
+ return row_tmp8;
+ }
+ uae_u8 *p = vidinfo->inbuffer->bufmem + line * vidinfo->inbuffer->rowbytes;
+ return p;
+}
+uae_u8 *get_row_genlock(int monid, int line)
+{
+ struct vidbuf_description *vidinfo = &adisplays[monid].gfxvidinfo;
+
+ if (!row_map_genlock_buffer) {
+ return NULL;
+ }
+ if (!vidinfo->inbuffer || line < 0 || line >= vidinfo->inbuffer->height_allocated) {
+ return row_tmp8g;
+ }
+ if (vidinfo->inbuffer->outwidth > vidinfo->inbuffer->width_allocated) {
+ return row_tmp8g;
+ }
+ if (vidinfo->inbuffer->outheight > vidinfo->inbuffer->height_allocated) {
+ return row_tmp8g;
+ }
+ return row_map_genlock_buffer + vidinfo->inbuffer->width_allocated * (line + 1);
+}
+
static void setxlinebuffer(int monid, int line)
{
struct vidbuf_description* vidinfo = &adisplays[monid].gfxvidinfo;
line += thisframe_y_adjust_real;
if (line < 0 || line >= max_uae_height) {
- xlinebuffer = row_map[max_uae_height - 1];
+ xlinebuffer = get_row(monid, -1);
xlinebuffer_genlock = NULL;
xlinebuffer_start = xlinebuffer;
xlinebuffer_end = xlinebuffer + (vidinfo->inbuffer->outwidth * sizeof(uae_u32));
} else {
- xlinebuffer = row_map[line];
+ xlinebuffer = get_row(monid, line);
xlinebuffer_start = xlinebuffer;
xlinebuffer_end = xlinebuffer + (vidinfo->inbuffer->outwidth * sizeof(uae_u32));
- xlinebuffer_genlock = row_map_genlock[line];
+ xlinebuffer_genlock = get_row_genlock(monid, line);
if (xlinebuffer_genlock) {
xlinebuffer_genlock_start = xlinebuffer_genlock;
xlinebuffer_genlock_end = xlinebuffer_genlock + (vidinfo->inbuffer->outwidth);
int y;
y = line - (vidinfo->inbuffer->outheight - TD_TOTAL_HEIGHT);
- xlinebuffer = row_map[line];
- xlinebuffer_genlock = row_map_genlock[line];
+ xlinebuffer = get_row(monid, line);
+ xlinebuffer_genlock = get_row_genlock(monid, line);
return xlinebuffer;
}
static void draw_debug_status_line(int monid, int line)
{
struct vidbuf_description *vidinfo = &adisplays[monid].gfxvidinfo;
- xlinebuffer = row_map[line];
- xlinebuffer_genlock = row_map_genlock[line];
+ xlinebuffer = get_row(monid, line);
+ xlinebuffer_genlock = get_row_genlock(monid, line);
#ifdef DEBUGGER
debug_draw(xlinebuffer, xlinebuffer_genlock, line, vidinfo->inbuffer->outwidth, vidinfo->inbuffer->outheight, xredcolors, xgreencolors, xbluecolors);
#endif
}
}
-static void get_line(int gfx_ypos, enum nln_how how, int lol_shift_prev)
+static void get_line(int monid, int gfx_ypos, enum nln_how how, int lol_shift_prev)
{
- struct vidbuf_description *vidinfo = &adisplays[0].gfxvidinfo;
+ struct vidbuf_description *vidinfo = &adisplays[monid].gfxvidinfo;
struct vidbuffer *vb = vidinfo->inbuffer;
int eraselines = 0;
int yadjust = currprefs.gfx_overscanmode < OVERSCANMODE_ULTRA ? minfirstline_linear << currprefs.gfx_vresolution : 0;
struct vidbuf_description* vidinfo = &adisplays[0].gfxvidinfo;
int l = 0;
while (l < vb->inheight) {
- uae_u8* b = row_map[l];
+ uae_u8* b = get_row(monid, l);
memset(b, 0, vb->inwidth * vb->pixbytes);
l++;
}
buf2 = debug_buf;
}
- if (!row_map) {
- return;
- }
-
if (startcycle == 0) {
- get_line(gfx_ypos, how, denise_lol_shift_prev);
+ get_line(0, gfx_ypos, how, denise_lol_shift_prev);
//write_log("# %d %d\n", gfx_ypos, vpos);
set_strlong();
}
- get_line(gfx_ypos, how, ls->lol_shift_prev);
+ get_line(0, gfx_ypos, how, ls->lol_shift_prev);
if (!buf1 && !ls->blankedline && denise_planes > 0) {
resolution_count[denise_res]++;
set_strlong();
}
- get_line(gfx_ypos, how, ls->lol_shift_prev);
+ get_line(0, gfx_ypos, how, ls->lol_shift_prev);
//write_log("* %d %d\n", gfx_ypos, vpos);
static int monitor;
extern uae_u16 bplcon0;
-extern uae_u8 **row_map_genlock;
static uae_u8 graffiti_palette[256 * 4];
if (yoff >= src->inheight)
continue;
uae_u8 *line = src->bufmem + yoff * src->rowbytes;
- uae_u8 *line_genlock = row_map_genlock[yoff];
+ uae_u8 *line_genlock = get_row_genlock(0, yoff);
uae_u8 *dstline = dst->bufmem + (((y * 2 + oddlines) - dst->yoffset) / vdbl) * dst->rowbytes;
uae_u8 *vramline = sm_frame_buffer + (fc24_y + oddlines) * SM_VRAM_WIDTH * SM_VRAM_BYTES + bufferoffset;
fc24_x = 0;
if (yoff >= src->inheight)
continue;
uae_u8 *line = src->bufmem + yoff * src->rowbytes;
- uae_u8 *line_genlock = row_map_genlock[yoff];
+ uae_u8 *line_genlock = get_row_genlock(0, yoff);
uae_u8 *dstline = dst->bufmem + (((y * 2 + oddlines) - dst->yoffset) / vdbl) * dst->rowbytes;
bool getpalette = false;
bool ztoggle = false;
uae_u8 *line = src->bufmem + yoff * src->rowbytes;
uae_u8 *dstline = dst->bufmem + (((y * 2 + oddlines) - dst->yoffset) >> vdbl) * dst->rowbytes;
- uae_u8 *line_genlock = row_map_genlock[yoff];
+ uae_u8 *line_genlock = get_row_genlock(0, yoff);
int gy = (((y * 2 + oddlines) - src->yoffset + offsety - gen_yoffset) >> vdbl) * deltay / 65536;
if (genlock_image_upsidedown)
gy = (genlock_image_height - 1) - gy;
int yoff = (((y * 2 - oddlines) - src->yoffset) / vdbl);
if (yoff >= 0 && yoff < src->inheight) {
line = src->bufmem + yoff * src->rowbytes;
- line_genlock = row_map_genlock ? row_map_genlock[yoff] : NULL;
+ line_genlock = get_row_genlock(0, yoff);
dstline = dst->bufmem + (((y * 2 - oddlines) - dst->yoffset) / vdbl) * dst->rowbytes;
if (y >= yimgstart) {
ydisp = y - yimgstart;