diff --git a/gx/gx_video.c b/gx/gx_video.c index 5eb47a341a..f5220db14e 100644 --- a/gx/gx_video.c +++ b/gx/gx_video.c @@ -240,7 +240,7 @@ void gx_set_video_mode(void *data, unsigned fbWidth, unsigned lines) GX_SetFieldMode(gx_mode.field_rendering, (gx_mode.viHeight == 2 * gx_mode.xfbHeight) ? GX_ENABLE : GX_DISABLE); GX_SetPixelFmt(GX_PF_RGB8_Z24, GX_ZC_LINEAR); __GX_InvalidateTexAll(__gx); - GX_Flush(); + __GX_Flush(__gx); _CPU_ISR_Restore(level); RARCH_LOG("GX Resolution: %dx%d (%s)\n", gx_mode.fbWidth, gx_mode.efbHeight, (gx_mode.viTVMode & 3) == VI_INTERLACE ? "interlaced" : "progressive"); @@ -337,16 +337,16 @@ static void init_texture(void *data, unsigned width, unsigned height) struct __gx_texobj *fb_ptr = (struct __gx_texobj*)&g_tex.obj; struct __gx_texobj *menu_ptr = (struct __gx_texobj*)&menu_tex.obj; __GX_InitTexObj(fb_ptr, g_tex.data, width, height, (gx->rgb32) ? GX_TF_RGBA8 : gx->rgui_texture_enable ? GX_TF_RGB5A3 : GX_TF_RGB565, GX_CLAMP, GX_CLAMP, GX_FALSE); - GX_InitTexObjFilterMode(&g_tex.obj, g_filter, g_filter); + __GX_InitTexObjFilterMode(fb_ptr, g_filter, g_filter); __GX_InitTexObj(menu_ptr, menu_tex.data, rgui_w, rgui_h, GX_TF_RGB5A3, GX_CLAMP, GX_CLAMP, GX_FALSE); - GX_InitTexObjFilterMode(&menu_tex.obj, g_filter, g_filter); + __GX_InitTexObjFilterMode(menu_ptr, g_filter, g_filter); __GX_InvalidateTexAll(__gx); } -static void init_vtx(void *data) +static void init_vtx(struct __gx_regdef *__gx, void *data) { - GX_SetCullMode(GX_CULL_NONE); - GX_SetClipMode(GX_CLIP_DISABLE); + __GX_SetCullMode(__gx, GX_CULL_NONE); + __GX_SetClipMode(GX_CLIP_DISABLE); GX_SetPixelFmt(GX_PF_RGB8_Z24, GX_ZC_LINEAR); GX_SetZMode(GX_ENABLE, GX_ALWAYS, GX_ENABLE); GX_SetColorUpdate(GX_TRUE); @@ -380,7 +380,7 @@ static void init_vtx(void *data) DCFlushRange(g_tex.data, 4 * 4 * 4); init_texture(data, 4, 4); // for menu texture - GX_Flush(); + GX_Flush(__gx); } static void build_disp_list(void) @@ -439,6 +439,7 @@ static void gx_restart(void) { } static void *gx_init(const video_info_t *video, const input_driver_t **input, void **input_data) { + struct __gx_regdef *__gx = (struct __gx_regdef*)__gxregs; g_vsync = video->vsync; if (driver.video_data) @@ -476,7 +477,7 @@ static void *gx_init(const video_info_t *video, GX_Init(gx_fifo, sizeof(gx_fifo)); setup_video_mode(gx); - init_vtx(gx); + init_vtx(__gx, gx); build_disp_list(); gx->vp.full_width = gx_mode.fbWidth; @@ -976,7 +977,7 @@ static bool gx_frame(void *data, const void *frame, } __GX_CopyDisp(__gx, g_framebuf[g_current_framebuf], clear_efb); - GX_Flush(); + __GX_Flush(__gx); VIDEO_SetNextFramebuffer(g_framebuf[g_current_framebuf]); VIDEO_Flush(); diff --git a/gx/gx_video_inl.h b/gx/gx_video_inl.h index 388cacc1a6..b2c5384f42 100644 --- a/gx/gx_video_inl.h +++ b/gx/gx_video_inl.h @@ -119,6 +119,8 @@ __gx->dispCopyWH = (__gx->dispCopyWH&~0xff000000)|(_SHIFTL(0x4a,24,8)) __gx->dispCopyDst = (__gx->dispCopyDst&~0x3ff)|(_SHIFTR(wd,4,10)); \ __gx->dispCopyDst = (__gx->dispCopyDst&~0xff000000)|(_SHIFTL(0x4d,24,8)) +#define __GX_SetClipMode(mode) GX_LOAD_XF_REG(0x1005,(mode&1)) + static inline void __GX_CopyDisp(struct __gx_regdef *__gx, void *dest,u8 clear) { u8 clflag; @@ -517,6 +519,20 @@ static void __GX_SendFlushPrim(struct __gx_regdef *__gx) __gx->xfFlush = 1; } +#define __GX_InitTexObjFilterMode(ptr, minfilt, magfilt) \ +{ \ + static u8 GX2HWFiltConv[] = {0x00,0x04,0x01,0x05,0x02,0x06,0x00,0x00}; \ + ptr->tex_filt = (ptr->tex_filt&~0x10)|(_SHIFTL((magfilt==GX_LINEAR?1:0),4,1)); \ + ptr->tex_filt = (ptr->tex_filt&~0xe0)|(_SHIFTL(GX2HWFiltConv[minfilt],5,3)); \ +} + +#define __GX_SetCullMode(__gx, mode) \ +{ \ + static u8 cm2hw[] = { 0, 2, 1, 3 }; \ + __gx->genMode = (__gx->genMode&~0xC000)|(_SHIFTL(cm2hw[mode],14,2)); \ + __gx->dirtyState |= 0x0004; \ +} + #define __GX_CallDispList(__gx, list, nbytes) \ if(__gx->dirtyState) \ { \ @@ -529,3 +545,16 @@ static void __GX_SendFlushPrim(struct __gx_regdef *__gx) FIFO_PUTU8(0x40); /*call displaylist */ \ FIFO_PUTU32(MEM_VIRTUAL_TO_PHYSICAL(list)); \ FIFO_PUTU32(nbytes) + +#define __GX_Flush(__gx) \ + if(__gx->dirtyState) \ + __GX_SetDirtyState(__gx); \ + wgPipe->U32 = 0; \ + wgPipe->U32 = 0; \ + wgPipe->U32 = 0; \ + wgPipe->U32 = 0; \ + wgPipe->U32 = 0; \ + wgPipe->U32 = 0; \ + wgPipe->U32 = 0; \ + wgPipe->U32 = 0; \ + ppcsync() diff --git a/gx/ppc_asm.h b/gx/ppc_asm.h index 311661a9fa..3adedf1f0c 100644 --- a/gx/ppc_asm.h +++ b/gx/ppc_asm.h @@ -18,6 +18,29 @@ __asm__ volatile ("stwbrx %0,%1,%2" : : "r"(value), "b%"(index), "r"(base) : "memory") #endif +#ifndef _sync +#define _sync() asm volatile("sync") +#endif + +#ifndef _nop +#define _nop() asm volatile("nop") +#endif + +#ifndef ppcsync +#define ppcsync() asm volatile("sc") +#endif + +#ifndef ppchalt +#define ppchalt() ({ \ + asm volatile("sync"); \ + while(1) { \ + asm volatile("nop"); \ + asm volatile("li 3,0"); \ + asm volatile("nop"); \ + } \ +}) +#endif + #ifdef GEKKO #ifndef _CPU_ISR_Enable