diff --git a/gx/gx_video.c b/gx/gx_video.c index ca35dca66e..c2d1426d49 100644 --- a/gx/gx_video.c +++ b/gx/gx_video.c @@ -32,15 +32,8 @@ #include #include -#ifdef HW_RVL -#define GX_OPTS -#endif - -#ifdef GX_OPTS #include "gx_video_inl.h" -#endif - #define SYSMEM1_SIZE 0x01800000 @@ -101,10 +94,8 @@ void gx_set_video_mode(void *data, unsigned fbWidth, unsigned lines) bool progressive; gx_video_t *gx = (gx_video_t*)data; (void)level; -#ifdef GX_OPTS struct __gx_regdef *__gx = (struct __gx_regdef*)__gxregs; _CPU_ISR_Disable(level); -#endif VIDEO_SetBlack(true); VIDEO_Flush(); viHeightMultiplier = 1; @@ -235,23 +226,22 @@ void gx_set_video_mode(void *data, unsigned fbWidth, unsigned lines) VIDEO_Flush(); GX_SetViewport(0, 0, gx_mode.fbWidth, gx_mode.efbHeight, 0, 1); - GX_SetDispCopySrc(0, 0, gx_mode.fbWidth, gx_mode.efbHeight); + __GX_SetDispCopySrc(__gx, 0, 0, gx_mode.fbWidth, gx_mode.efbHeight); f32 y_scale = GX_GetYScaleFactor(gx_mode.efbHeight, gx_mode.xfbHeight); u16 xfbWidth = VIDEO_PadFramebufferWidth(gx_mode.fbWidth); u16 xfbHeight = GX_SetDispCopyYScale(y_scale); - GX_SetDispCopyDst(xfbWidth, xfbHeight); + (void)xfbHeight; + __GX_SetDispCopyDst(__gx, xfbWidth, xfbHeight); GX_SetCopyFilter(gx_mode.aa, gx_mode.sample_pattern, (gx_mode.xfbMode == VI_XFBMODE_SF) ? GX_FALSE : GX_TRUE, gx_mode.vfilter); GX_SetCopyClear((GXColor) { 0, 0, 0, 0xff }, GX_MAX_Z24); 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_InvalidateTexAll(__gx); GX_Flush(); -#ifdef GX_OPTS _CPU_ISR_Restore(level); -#endif RARCH_LOG("GX Resolution: %dx%d (%s)\n", gx_mode.fbWidth, gx_mode.efbHeight, (gx_mode.viTVMode & 3) == VI_INTERLACE ? "interlaced" : "progressive"); @@ -328,9 +318,7 @@ static void setup_video_mode(void *data) static void init_texture(void *data, unsigned width, unsigned height) { -#ifdef GX_OPTS struct __gx_regdef *__gx = (struct __gx_regdef*)__gxregs; -#endif width &= ~3; height &= ~3; gx_video_t *gx = (gx_video_t*)data; @@ -352,7 +340,7 @@ static void init_texture(void *data, unsigned width, unsigned height) GX_InitTexObjFilterMode(&g_tex.obj, g_filter, g_filter); GX_InitTexObj(&menu_tex.obj, 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_InvalidateTexAll(); + __GX_InvalidateTexAll(__gx); } static void init_vtx(void *data) @@ -889,9 +877,7 @@ static bool gx_frame(void *data, const void *frame, const char *msg) { gx_video_t *gx = (gx_video_t*)driver.video_data; -#ifdef GX_OPTS struct __gx_regdef *__gx = (struct __gx_regdef*)__gxregs; -#endif u8 clear_efb = GX_FALSE; (void)data; @@ -941,16 +927,16 @@ static bool gx_frame(void *data, const void *frame, DCFlushRange(menu_tex.data, rgui->width * rgui->height * 2); } - GX_InvalidateTexAll(); + __GX_InvalidateTexAll(__gx); - GX_SetCurrentMtx(GX_PNMTX0); + __GX_SetCurrentMtx(__gx, GX_PNMTX0); GX_LoadTexObj(&g_tex.obj, GX_TEXMAP0); GX_CallDispList(display_list, display_list_size); GX_DrawDone(); if (gx->rgui_texture_enable) { - GX_SetCurrentMtx(GX_PNMTX1); + __GX_SetCurrentMtx(__gx, GX_PNMTX1); GX_LoadTexObj(&menu_tex.obj, GX_TEXMAP0); GX_CallDispList(display_list, display_list_size); GX_DrawDone(); @@ -986,7 +972,7 @@ static bool gx_frame(void *data, const void *frame, clear_efb = GX_TRUE; } - GX_CopyDisp(g_framebuf[g_current_framebuf], clear_efb); + __GX_CopyDisp(__gx, g_framebuf[g_current_framebuf], clear_efb); GX_Flush(); VIDEO_SetNextFramebuffer(g_framebuf[g_current_framebuf]); VIDEO_Flush(); diff --git a/gx/gx_video_inl.h b/gx/gx_video_inl.h index d8f3456c22..388a70a907 100644 --- a/gx/gx_video_inl.h +++ b/gx/gx_video_inl.h @@ -1,5 +1,23 @@ #define STRUCT_REGDEF_SIZE 1440 +#define GX_LOAD_BP_REG(x) \ + wgPipe->U8 = 0x61; \ + asm volatile ("" ::: "memory" ); \ + wgPipe->U32 = (u32)(x); \ + asm volatile ("" ::: "memory" ) + +#define WGPIPE (0xCC008000) + +#define FIFO_PUTU8(x) *(vu8*)WGPIPE = (u8)(x) +#define FIFO_PUTS8(x) *(vs8*)WGPIPE = (s8)(x) +#define FIFO_PUTU16(x) *(vu16*)WGPIPE = (u16)(x) +#define FIFO_PUTS16(x) *(vs16*)WGPIPE = (s16)(x) +#define FIFO_PUTU32(x) *(vu32*)WGPIPE = (u32)(x) +#define FIFO_PUTS32(x) *(vs32*)WGPIPE = (s32)(x) +#define FIFO_PUTF32(x) *(vf32*)WGPIPE = (f32)(x) + +#define XY(x, y) (((y) << 10) | (x)) + extern u8 __gxregs[]; struct __gx_regdef @@ -117,54 +135,75 @@ static GXTexRegion* __GXDefTexRegionCallback(GXTexObj *obj,u8 mapid) } #endif -#define GX_LOAD_BP_REG(x) \ - wgPipe->U8 = 0x61; \ - asm volatile ("" ::: "memory" ); \ - wgPipe->U32 = (u32)(x); \ - asm volatile ("" ::: "memory" ) +#define __GX_SetDispCopySrc(__gx, left, top, wd, ht) \ +__gx->dispCopyTL = (__gx->dispCopyTL&~0x00ffffff)|XY(left,top); \ +__gx->dispCopyTL = (__gx->dispCopyTL&~0xff000000)|(_SHIFTL(0x49,24,8)); \ +__gx->dispCopyWH = (__gx->dispCopyWH&~0x00ffffff)|XY((wd-1),(ht-1)); \ +__gx->dispCopyWH = (__gx->dispCopyWH&~0xff000000)|(_SHIFTL(0x4a,24,8)) -#define GX_InvalidateTexAll() \ +#define __GX_SetDispCopyDst(__gx, wd, ht) \ +__gx->dispCopyDst = (__gx->dispCopyDst&~0x3ff)|(_SHIFTR(wd,4,10)); \ +__gx->dispCopyDst = (__gx->dispCopyDst&~0xff000000)|(_SHIFTL(0x4d,24,8)) + +static inline void __GX_CopyDisp(struct __gx_regdef *__gx, void *dest,u8 clear) +{ + u8 clflag; + u32 val; + + if(clear) + { + val= (__gx->peZMode&~0xf)|0xf; + GX_LOAD_BP_REG(val); + val = (__gx->peCMode0&~0x3); + GX_LOAD_BP_REG(val); + } + + clflag = 0; + if(clear || (__gx->peCntrl&0x7)==0x0003) + { + if(__gx->peCntrl&0x40) + { + clflag = 1; + val = (__gx->peCntrl&~0x40); + GX_LOAD_BP_REG(val); + } + } + + GX_LOAD_BP_REG(__gx->dispCopyTL); // set source top + GX_LOAD_BP_REG(__gx->dispCopyWH); + + GX_LOAD_BP_REG(__gx->dispCopyDst); + + val = 0x4b000000|(_SHIFTR(MEM_VIRTUAL_TO_PHYSICAL(dest),5,24)); + GX_LOAD_BP_REG(val); + + __gx->dispCopyCntrl = (__gx->dispCopyCntrl&~0x800)|(_SHIFTL(clear,11,1)); + __gx->dispCopyCntrl = (__gx->dispCopyCntrl&~0x4000)|0x4000; + __gx->dispCopyCntrl = (__gx->dispCopyCntrl&~0xff000000)|(_SHIFTL(0x52,24,8)); + + GX_LOAD_BP_REG(__gx->dispCopyCntrl); + + if(clear) + { + GX_LOAD_BP_REG(__gx->peZMode); + GX_LOAD_BP_REG(__gx->peCMode0); + } + + if(clflag) + { + GX_LOAD_BP_REG(__gx->peCntrl); + } +} + + +#define __GX_InvalidateTexAll(__gx) \ GX_LOAD_BP_REG(__gx->tevIndMask); \ GX_LOAD_BP_REG(0x66001000); \ GX_LOAD_BP_REG(0x66001100); \ GX_LOAD_BP_REG(__gx->tevIndMask) -#define GX_SetCurrentMtx(mtx) \ +#define __GX_SetCurrentMtx(__gx, mtx) \ __gx->mtxIdxLo = (__gx->mtxIdxLo&~0x3f)|(mtx&0x3f); \ __gx->dirtyState |= 0x04000000 -#if defined(HW_RVL) -#define GX_CopyDisp(dest,clear) \ - u8 clflag; \ - u32 val; \ - if(clear) { \ - val= (__gx->peZMode&~0xf)|0xf; \ - GX_LOAD_BP_REG(val); \ - val = (__gx->peCMode0&~0x3); \ - GX_LOAD_BP_REG(val); \ - } \ - clflag = 0; \ - if(clear || (__gx->peCntrl&0x7)==0x0003) { \ - if(__gx->peCntrl&0x40) { \ - clflag = 1; \ - val = (__gx->peCntrl&~0x40); \ - GX_LOAD_BP_REG(val); \ - } \ - } \ - GX_LOAD_BP_REG(__gx->dispCopyTL); \ - GX_LOAD_BP_REG(__gx->dispCopyWH); \ - GX_LOAD_BP_REG(__gx->dispCopyDst); \ - val = 0x4b000000|(_SHIFTR(MEM_VIRTUAL_TO_PHYSICAL(dest),5,24)); \ - GX_LOAD_BP_REG(val); \ - __gx->dispCopyCntrl = (__gx->dispCopyCntrl&~0x800)|(_SHIFTL(clear,11,1)); \ - __gx->dispCopyCntrl = (__gx->dispCopyCntrl&~0x4000)|0x4000; \ - __gx->dispCopyCntrl = (__gx->dispCopyCntrl&~0xff000000)|(_SHIFTL(0x52,24,8)); \ - GX_LOAD_BP_REG(__gx->dispCopyCntrl); \ - if(clear) { \ - GX_LOAD_BP_REG(__gx->peZMode); \ - GX_LOAD_BP_REG(__gx->peCMode0); \ - } \ - if(clflag) GX_LOAD_BP_REG(__gx->peCntrl) -#endif - #define GX_LoadTexObj(obj,mapid) GX_LoadTexObjPreloaded(obj,(__GXDefTexRegionCallback(obj,mapid)),mapid)