소스 검색

add a pitch variable

32x is still broken
notaz 10 년 전
부모
커밋
9cdfc191b6
11개의 변경된 파일59개의 추가작업 그리고 46개의 파일을 삭제
  1. 10 6
      platform/common/emu.c
  2. 1 0
      platform/common/emu.h
  3. 23 20
      platform/common/menu_pico.c
  4. 8 6
      platform/common/plat_sdl.c
  5. 1 0
      platform/gp2x/plat.c
  6. 1 1
      platform/libpicofe
  7. 8 8
      platform/linux/emu.c
  8. 4 2
      platform/linux/io.c
  9. 1 1
      platform/pandora/menu.c
  10. 1 1
      platform/pandora/plat.c
  11. 1 1
      platform/win32/plat.c

+ 10 - 6
platform/common/emu.c

@@ -42,6 +42,7 @@ void *g_screen_ptr;
 
 int g_screen_width  = 320;
 int g_screen_height = 240;
+int g_screen_ppitch = 320; // pitch in pixels
 
 const char *PicoConfigFile = "config2.cfg";
 currentConfig_t currentConfig, defaultConfig;
@@ -730,12 +731,12 @@ void name(int x, int y, const char *text)				\
 	}								\
 }
 
-mk_text_out(emu_text_out8,      unsigned char,    0xf0, g_screen_ptr, 1, g_screen_width)
-mk_text_out(emu_text_out16,     unsigned short, 0xffff, g_screen_ptr, 1, g_screen_width)
+mk_text_out(emu_text_out8,      unsigned char,    0xf0, g_screen_ptr, 1, g_screen_ppitch)
+mk_text_out(emu_text_out16,     unsigned short, 0xffff, g_screen_ptr, 1, g_screen_ppitch)
 mk_text_out(emu_text_out8_rot,  unsigned char,    0xf0,
-	(char *)g_screen_ptr  + (g_screen_width - 1) * g_screen_height, -g_screen_height, 1)
+	(char *)g_screen_ptr  + (g_screen_ppitch - 1) * g_screen_height, -g_screen_height, 1)
 mk_text_out(emu_text_out16_rot, unsigned short, 0xffff,
-	(short *)g_screen_ptr + (g_screen_width - 1) * g_screen_height, -g_screen_height, 1)
+	(short *)g_screen_ptr + (g_screen_ppitch - 1) * g_screen_height, -g_screen_height, 1)
 
 #undef mk_text_out
 
@@ -751,7 +752,7 @@ void emu_osd_text16(int x, int y, const char *text)
 	for (h = 0; h < 8; h++) {
 		unsigned short *p;
 		p = (unsigned short *)g_screen_ptr
-			+ x + g_screen_width * (y + h);
+			+ x + g_screen_ppitch * (y + h);
 		for (i = len; i > 0; i--, p++)
 			*p = (*p >> 2) & 0x39e7;
 	}
@@ -1204,8 +1205,11 @@ static void mkdir_path(char *path_with_reserve, int pos, const char *name)
 void emu_cmn_forced_frame(int no_scale, int do_emu)
 {
 	int po_old = PicoIn.opt;
+	int y;
 
-	memset32(g_screen_ptr, 0, g_screen_width * g_screen_height * 2 / 4);
+	for (y = 0; y < g_screen_height; y++)
+		memset32((short *)g_screen_ptr + g_screen_ppitch * y, 0,
+			 g_screen_width * 2 / 4);
 
 	PicoIn.opt &= ~POPT_ALT_RENDERER;
 	PicoIn.opt |= POPT_ACC_SPRITES;

+ 1 - 0
platform/common/emu.h

@@ -16,6 +16,7 @@ extern void *g_screen_ptr;
 
 extern int g_screen_width;
 extern int g_screen_height;
+extern int g_screen_ppitch; // pitch in pixels
 
 #define EOPT_EN_SRAM      (1<<0)
 #define EOPT_SHOW_FPS     (1<<1)

+ 23 - 20
platform/common/menu_pico.c

@@ -107,7 +107,7 @@ static void make_bg(int no_scale)
 		(g_menuscreen_w / 2 - w / 2);
 
 	// darken the active framebuffer
-	for (; h > 0; dst += g_menuscreen_w, src += g_screen_width, h--)
+	for (; h > 0; dst += g_menuscreen_w, src += g_screen_ppitch, h--)
 		menu_darken_bg(dst, src, w, 1);
 }
 
@@ -167,8 +167,8 @@ static void load_progress_cb(int percent)
 		len = g_menuscreen_w;
 
 	menu_draw_begin(0, 1);
-	dst = (unsigned short *)g_menuscreen_ptr + g_menuscreen_w * me_sfont_h * 2;
-	for (ln = me_sfont_h - 2; ln > 0; ln--, dst += g_menuscreen_w)
+	dst = (unsigned short *)g_menuscreen_ptr + g_menuscreen_pp * me_sfont_h * 2;
+	for (ln = me_sfont_h - 2; ln > 0; ln--, dst += g_menuscreen_pp)
 		memset(dst, 0xff, len * 2);
 	menu_draw_end();
 }
@@ -179,17 +179,18 @@ static void cdload_progress_cb(const char *fname, int percent)
 	unsigned short *dst;
 
 	menu_draw_begin(0, 1);
-	dst = (unsigned short *)g_menuscreen_ptr + g_menuscreen_w * me_sfont_h * 2;
-	memset(dst, 0xff, g_menuscreen_w * (me_sfont_h - 2) * 2);
+	dst = (unsigned short *)g_menuscreen_ptr + g_menuscreen_pp * me_sfont_h * 2;
+
+	menuscreen_memset_lines(dst, 0xff, me_sfont_h - 2);
 
 	smalltext_out16(1, 3 * me_sfont_h, "Processing CD image / MP3s", 0xffff);
 	smalltext_out16(1, 4 * me_sfont_h, fname, 0xffff);
-	dst += g_menuscreen_w * me_sfont_h * 3;
+	dst += g_menuscreen_pp * me_sfont_h * 3;
 
 	if (len > g_menuscreen_w)
 		len = g_menuscreen_w;
 
-	for (ln = (me_sfont_h - 2); ln > 0; ln--, dst += g_menuscreen_w)
+	for (ln = (me_sfont_h - 2); ln > 0; ln--, dst += g_menuscreen_pp)
 		memset(dst, 0xff, len * 2);
 	menu_draw_end();
 
@@ -848,13 +849,15 @@ static void debug_menu_loop(void)
 				break;
 			case 2: pemu_forced_frame(1, 0);
 				make_bg(1);
-				PDebugShowSpriteStats((unsigned short *)g_menuscreen_ptr + (g_menuscreen_h/2 - 240/2)*g_menuscreen_w +
-					g_menuscreen_w/2 - 320/2, g_menuscreen_w);
+				PDebugShowSpriteStats((unsigned short *)g_menuscreen_ptr
+					+ (g_menuscreen_h/2 - 240/2) * g_menuscreen_pp
+					+ g_menuscreen_w/2 - 320/2, g_menuscreen_pp);
 				break;
-			case 3: memset(g_menuscreen_ptr, 0, g_menuscreen_w * g_menuscreen_h * 2);
-				PDebugShowPalette(g_menuscreen_ptr, g_menuscreen_w);
-				PDebugShowSprite((unsigned short *)g_menuscreen_ptr + g_menuscreen_w*120 + g_menuscreen_w/2 + 16,
-					g_menuscreen_w, spr_offs);
+			case 3: menuscreen_memset_lines(g_menuscreen_ptr, 0, g_menuscreen_h);
+				PDebugShowPalette(g_menuscreen_ptr, g_menuscreen_pp);
+				PDebugShowSprite((unsigned short *)g_menuscreen_ptr
+					+ g_menuscreen_pp * 120 + g_menuscreen_w / 2 + 16,
+					g_menuscreen_pp, spr_offs);
 				draw_text_debug(PDebugSpriteList(), spr_offs, 6);
 				break;
 			case 4: tmp = PDebug32x();
@@ -974,23 +977,23 @@ static void menu_main_draw_status(void)
 		return;
 
 	/* battery info */
-	bp += (me_mfont_h * 2 + 2) * g_screen_width + g_screen_width - me_mfont_w * 3 - 3;
+	bp += (me_mfont_h * 2 + 2) * g_screen_ppitch + g_screen_width - me_mfont_w * 3 - 3;
 	for (i = 0; i < me_mfont_w * 2; i++)
 		bp[i] = menu_text_color;
 	for (i = 0; i < me_mfont_w * 2; i++)
-		bp[i + g_screen_width * bat_h] = menu_text_color;
+		bp[i + g_screen_ppitch * bat_h] = menu_text_color;
 	for (i = 0; i <= bat_h; i++)
-		bp[i * g_screen_width] =
-		bp[i * g_screen_width + me_mfont_w * 2] = menu_text_color;
+		bp[i * g_screen_ppitch] =
+		bp[i * g_screen_ppitch + me_mfont_w * 2] = menu_text_color;
 	for (i = 2; i < bat_h - 1; i++)
-		bp[i * g_screen_width - 1] =
-		bp[i * g_screen_width - 2] = menu_text_color;
+		bp[i * g_screen_ppitch - 1] =
+		bp[i * g_screen_ppitch - 2] = menu_text_color;
 
 	w = me_mfont_w * 2 - 1;
 	wfill = batt_val * w / 100;
 	for (u = 1; u < bat_h; u++)
 		for (i = 0; i < wfill; i++)
-			bp[(w - i) + g_screen_width * u] = menu_text_color;
+			bp[(w - i) + g_screen_ppitch * u] = menu_text_color;
 }
 
 static int main_menu_handler(int id, int keys)

+ 8 - 6
platform/common/plat_sdl.c

@@ -158,19 +158,19 @@ void plat_video_flip(void)
 
 		SDL_LockYUVOverlay(plat_sdl_overlay);
 		rgb565_to_uyvy(plat_sdl_overlay->pixels[0], shadow_fb,
-				g_screen_width * g_screen_height);
+				g_screen_ppitch * g_screen_height);
 		SDL_UnlockYUVOverlay(plat_sdl_overlay);
 		SDL_DisplayYUVOverlay(plat_sdl_overlay, &dstrect);
 	}
 	else if (plat_sdl_gl_active) {
-		gl_flip(shadow_fb, g_screen_width, g_screen_height);
+		gl_flip(shadow_fb, g_screen_ppitch, g_screen_height);
 	}
 	else {
 		if (SDL_MUSTLOCK(plat_sdl_screen))
 			SDL_UnlockSurface(plat_sdl_screen);
 		SDL_Flip(plat_sdl_screen);
 		g_screen_ptr = plat_sdl_screen->pixels;
-		PicoDrawSetOutBuf(g_screen_ptr, g_screen_width * 2);
+		PicoDrawSetOutBuf(g_screen_ptr, g_screen_ppitch * 2);
 	}
 }
 
@@ -204,13 +204,13 @@ void plat_video_menu_end(void)
 
 		SDL_LockYUVOverlay(plat_sdl_overlay);
 		rgb565_to_uyvy(plat_sdl_overlay->pixels[0], shadow_fb,
-				g_menuscreen_w * g_menuscreen_h);
+				g_menuscreen_pp * g_menuscreen_h);
 		SDL_UnlockYUVOverlay(plat_sdl_overlay);
 
 		SDL_DisplayYUVOverlay(plat_sdl_overlay, &dstrect);
 	}
 	else if (plat_sdl_gl_active) {
-		gl_flip(g_menuscreen_ptr, g_menuscreen_w, g_menuscreen_h);
+		gl_flip(g_menuscreen_ptr, g_menuscreen_pp, g_menuscreen_h);
 	}
 	else {
 		if (SDL_MUSTLOCK(plat_sdl_screen))
@@ -237,7 +237,7 @@ void plat_video_loop_prepare(void)
 			SDL_LockSurface(plat_sdl_screen);
 		g_screen_ptr = plat_sdl_screen->pixels;
 	}
-	PicoDrawSetOutBuf(g_screen_ptr, g_screen_width * 2);
+	PicoDrawSetOutBuf(g_screen_ptr, g_screen_ppitch * 2);
 }
 
 void plat_early_init(void)
@@ -265,6 +265,7 @@ void plat_init(void)
 
 	g_menuscreen_w = plat_sdl_screen->w;
 	g_menuscreen_h = plat_sdl_screen->h;
+	g_menuscreen_pp = g_menuscreen_w;
 	g_menuscreen_ptr = NULL;
 
 	shadow_size = g_menuscreen_w * g_menuscreen_h * 2;
@@ -280,6 +281,7 @@ void plat_init(void)
 
 	g_screen_width = 320;
 	g_screen_height = 240;
+	g_screen_ppitch = 320;
 	g_screen_ptr = shadow_fb;
 
 	in_sdl_init(&in_sdl_platform_data, plat_sdl_event_handler);

+ 1 - 0
platform/gp2x/plat.c

@@ -208,6 +208,7 @@ void plat_init(void)
 
 	g_menuscreen_w = 320;
 	g_menuscreen_h = 240;
+	g_menuscreen_pp = g_menuscreen_w;
 	gp2x_memset_all_buffers(0, 0, 320*240*2);
 
 	gp2x_make_fb_bufferable(1);

+ 1 - 1
platform/libpicofe

@@ -1 +1 @@
-Subproject commit 21082d0b2b9910727770674cef9b68b9e97a3155
+Subproject commit 2b27288eb44ef9247d2a948a207d3ac9b835421a

+ 8 - 8
platform/linux/emu.c

@@ -67,7 +67,7 @@ static void draw_cd_leds(void)
 void pemu_finalize_frame(const char *fps, const char *notice)
 {
 	if (currentConfig.renderer != RT_16BIT && !(PicoIn.AHW & PAHW_32X)) {
-		unsigned short *pd = (unsigned short *)g_screen_ptr + 8 * g_screen_width;
+		unsigned short *pd = (unsigned short *)g_screen_ptr + 8 * g_screen_ppitch;
 		unsigned char *ps = Pico.est.Draw2FB + 328*8 + 8;
 		unsigned short *pal = Pico.est.HighPal;
 		int i, x;
@@ -94,7 +94,7 @@ static void apply_renderer(void)
 	case RT_16BIT:
 		PicoIn.opt &= ~POPT_ALT_RENDERER;
 		PicoDrawSetOutFormat(PDF_RGB555, 0);
-		PicoDrawSetOutBuf(g_screen_ptr, g_screen_width * 2);
+		PicoDrawSetOutBuf(g_screen_ptr, g_screen_ppitch * 2);
 		break;
 	case RT_8BIT_ACC:
 		PicoIn.opt &= ~POPT_ALT_RENDERER;
@@ -108,7 +108,7 @@ static void apply_renderer(void)
 	}
 
 	if (PicoIn.AHW & PAHW_32X)
-		PicoDrawSetOutBuf(g_screen_ptr, g_screen_width * 2);
+		PicoDrawSetOutBuf(g_screen_ptr, g_screen_ppitch * 2);
 }
 
 void plat_video_toggle_renderer(int change, int is_menu)
@@ -127,8 +127,8 @@ void plat_video_toggle_renderer(int change, int is_menu)
 
 void plat_status_msg_clear(void)
 {
-	unsigned short *d = (unsigned short *)g_screen_ptr + g_screen_width * g_screen_height;
-	int l = g_screen_width * 8;
+	unsigned short *d = (unsigned short *)g_screen_ptr + g_screen_ppitch * g_screen_height;
+	int l = g_screen_ppitch * 8;
 	memset32((int *)(d - l), 0, l * 2 / 4);
 }
 
@@ -143,7 +143,7 @@ void plat_status_msg_busy_next(const char *msg)
 
 void plat_status_msg_busy_first(const char *msg)
 {
-//	memset32(g_screen_ptr, 0, g_screen_width * g_screen_height * 2 / 4);
+//	memset32(g_screen_ptr, 0, g_screen_ppitch * g_screen_height * 2 / 4);
 	plat_status_msg_busy_next(msg);
 }
 
@@ -153,7 +153,7 @@ void plat_update_volume(int has_changed, int is_up)
 
 void pemu_forced_frame(int no_scale, int do_emu)
 {
-	PicoDrawSetOutBuf(g_screen_ptr, g_screen_width * 2);
+	PicoDrawSetOutBuf(g_screen_ptr, g_screen_ppitch * 2);
 	PicoDrawSetCallbacks(NULL, NULL);
 	Pico.m.dirtyPal = 1;
 
@@ -174,7 +174,7 @@ void plat_debug_cat(char *str)
 void emu_video_mode_change(int start_line, int line_count, int is_32cols)
 {
 	// clear whole screen in all buffers
-	memset32(g_screen_ptr, 0, g_screen_width * g_screen_height * 2 / 4);
+	memset32(g_screen_ptr, 0, g_screen_ppitch * g_screen_height * 2 / 4);
 }
 
 void pemu_loop_prep(void)

+ 4 - 2
platform/linux/io.c

@@ -134,7 +134,7 @@ static void xlib_update(void)
 	XLockDisplay(xlib_display);
 
 	xstatus = XPutImage(xlib_display, xlib_window, DefaultGC(xlib_display, 0), ximage,
-		0, 0, 0, 0, g_screen_width, g_screen_height);
+		0, 0, 0, 0, g_screen_ppitch, g_screen_height);
 	if (xstatus != 0)
 		fprintf(stderr, "XPutImage %d\n", xstatus);
 
@@ -260,6 +260,7 @@ static void realloc_screen(void)
 	int size = scr_w * scr_h * 2;
 	g_screen_width = g_menuscreen_w = scr_w;
 	g_screen_height = g_menuscreen_h = scr_h;
+	g_screen_ppitch = g_menuscreen_pp = scr_w;
 	g_screen_ptr = realloc(g_screen_ptr, size);
 	g_menubg_ptr = realloc(g_menubg_ptr, size);
 	memset(g_screen_ptr, 0, size);
@@ -275,7 +276,7 @@ void plat_video_flip(void)
 	if (ximage == NULL)
 		return;
 
-	pixel_count = g_screen_width * g_screen_height;
+	pixel_count = g_screen_ppitch * g_screen_height;
 	image = (void *)ximage->data;
 
 	if (current_bpp == 8)
@@ -332,6 +333,7 @@ void plat_init(void)
 		exit(1);
 	g_screen_width = g_menuscreen_w = w;
 	g_screen_height = g_menuscreen_h = h;
+	g_screen_ppitch = g_menuscreen_pp = w;
 	g_menubg_ptr = realloc(g_menubg_ptr, w * g_screen_height * 2);
 #else
 	realloc_screen();

+ 1 - 1
platform/pandora/menu.c

@@ -18,7 +18,7 @@ static int menu_loop_cscaler(int id, int keys)
 	for (;;)
 	{
 		menu_draw_begin(0, 1);
-		memset(g_menuscreen_ptr, 0, g_menuscreen_w * g_menuscreen_h * 2);
+		menuscreen_memset_lines(g_menuscreen_ptr, 0, g_menuscreen_h);
 		text_out16(2, 480 - 18, "%dx%d | d-pad to resize, R+d-pad to move", g_layer_cw, g_layer_ch);
 		menu_draw_end();
 

+ 1 - 1
platform/pandora/plat.c

@@ -488,7 +488,7 @@ void plat_init(void)
 		exit(1);
 	}
 
-	g_menuscreen_w = w;
+	g_menuscreen_w = g_menuscreen_pp = w;
 	g_menuscreen_h = h;
 	g_menuscreen_ptr = vout_fbdev_flip(main_fb);
 

+ 1 - 1
platform/win32/plat.c

@@ -75,7 +75,7 @@ void pemu_validate_config(void)
 void pemu_loop_prep(void)
 {
 	PicoDrawSetOutFormat(PDF_RGB555, 1);
-	PicoDrawSetOutBuf(g_screen_ptr, g_screen_width * 2);
+	PicoDrawSetOutBuf(g_screen_ptr, g_screen_ppitch * 2);
 	pemu_sound_start();
 }