mirror of
https://github.com/libretro/RetroArch
synced 2025-04-16 08:43:10 +00:00
(GX) Video inlining cleanups
This commit is contained in:
parent
6a4cfc7271
commit
c8f73d46f9
@ -32,15 +32,8 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#ifdef HW_RVL
|
|
||||||
#define GX_OPTS
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef GX_OPTS
|
|
||||||
#include "gx_video_inl.h"
|
#include "gx_video_inl.h"
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SYSMEM1_SIZE 0x01800000
|
#define SYSMEM1_SIZE 0x01800000
|
||||||
|
|
||||||
|
|
||||||
@ -101,10 +94,8 @@ void gx_set_video_mode(void *data, unsigned fbWidth, unsigned lines)
|
|||||||
bool progressive;
|
bool progressive;
|
||||||
gx_video_t *gx = (gx_video_t*)data;
|
gx_video_t *gx = (gx_video_t*)data;
|
||||||
(void)level;
|
(void)level;
|
||||||
#ifdef GX_OPTS
|
|
||||||
struct __gx_regdef *__gx = (struct __gx_regdef*)__gxregs;
|
struct __gx_regdef *__gx = (struct __gx_regdef*)__gxregs;
|
||||||
_CPU_ISR_Disable(level);
|
_CPU_ISR_Disable(level);
|
||||||
#endif
|
|
||||||
VIDEO_SetBlack(true);
|
VIDEO_SetBlack(true);
|
||||||
VIDEO_Flush();
|
VIDEO_Flush();
|
||||||
viHeightMultiplier = 1;
|
viHeightMultiplier = 1;
|
||||||
@ -235,23 +226,22 @@ void gx_set_video_mode(void *data, unsigned fbWidth, unsigned lines)
|
|||||||
VIDEO_Flush();
|
VIDEO_Flush();
|
||||||
|
|
||||||
GX_SetViewport(0, 0, gx_mode.fbWidth, gx_mode.efbHeight, 0, 1);
|
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);
|
f32 y_scale = GX_GetYScaleFactor(gx_mode.efbHeight, gx_mode.xfbHeight);
|
||||||
u16 xfbWidth = VIDEO_PadFramebufferWidth(gx_mode.fbWidth);
|
u16 xfbWidth = VIDEO_PadFramebufferWidth(gx_mode.fbWidth);
|
||||||
u16 xfbHeight = GX_SetDispCopyYScale(y_scale);
|
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_SetCopyFilter(gx_mode.aa, gx_mode.sample_pattern, (gx_mode.xfbMode == VI_XFBMODE_SF) ? GX_FALSE : GX_TRUE,
|
||||||
gx_mode.vfilter);
|
gx_mode.vfilter);
|
||||||
GX_SetCopyClear((GXColor) { 0, 0, 0, 0xff }, GX_MAX_Z24);
|
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_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_SetPixelFmt(GX_PF_RGB8_Z24, GX_ZC_LINEAR);
|
||||||
GX_InvalidateTexAll();
|
__GX_InvalidateTexAll(__gx);
|
||||||
GX_Flush();
|
GX_Flush();
|
||||||
#ifdef GX_OPTS
|
|
||||||
_CPU_ISR_Restore(level);
|
_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");
|
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)
|
static void init_texture(void *data, unsigned width, unsigned height)
|
||||||
{
|
{
|
||||||
#ifdef GX_OPTS
|
|
||||||
struct __gx_regdef *__gx = (struct __gx_regdef*)__gxregs;
|
struct __gx_regdef *__gx = (struct __gx_regdef*)__gxregs;
|
||||||
#endif
|
|
||||||
width &= ~3;
|
width &= ~3;
|
||||||
height &= ~3;
|
height &= ~3;
|
||||||
gx_video_t *gx = (gx_video_t*)data;
|
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_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_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_InitTexObjFilterMode(&menu_tex.obj, g_filter, g_filter);
|
||||||
GX_InvalidateTexAll();
|
__GX_InvalidateTexAll(__gx);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void init_vtx(void *data)
|
static void init_vtx(void *data)
|
||||||
@ -889,9 +877,7 @@ static bool gx_frame(void *data, const void *frame,
|
|||||||
const char *msg)
|
const char *msg)
|
||||||
{
|
{
|
||||||
gx_video_t *gx = (gx_video_t*)driver.video_data;
|
gx_video_t *gx = (gx_video_t*)driver.video_data;
|
||||||
#ifdef GX_OPTS
|
|
||||||
struct __gx_regdef *__gx = (struct __gx_regdef*)__gxregs;
|
struct __gx_regdef *__gx = (struct __gx_regdef*)__gxregs;
|
||||||
#endif
|
|
||||||
u8 clear_efb = GX_FALSE;
|
u8 clear_efb = GX_FALSE;
|
||||||
|
|
||||||
(void)data;
|
(void)data;
|
||||||
@ -941,16 +927,16 @@ static bool gx_frame(void *data, const void *frame,
|
|||||||
DCFlushRange(menu_tex.data, rgui->width * rgui->height * 2);
|
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_LoadTexObj(&g_tex.obj, GX_TEXMAP0);
|
||||||
GX_CallDispList(display_list, display_list_size);
|
GX_CallDispList(display_list, display_list_size);
|
||||||
GX_DrawDone();
|
GX_DrawDone();
|
||||||
|
|
||||||
if (gx->rgui_texture_enable)
|
if (gx->rgui_texture_enable)
|
||||||
{
|
{
|
||||||
GX_SetCurrentMtx(GX_PNMTX1);
|
__GX_SetCurrentMtx(__gx, GX_PNMTX1);
|
||||||
GX_LoadTexObj(&menu_tex.obj, GX_TEXMAP0);
|
GX_LoadTexObj(&menu_tex.obj, GX_TEXMAP0);
|
||||||
GX_CallDispList(display_list, display_list_size);
|
GX_CallDispList(display_list, display_list_size);
|
||||||
GX_DrawDone();
|
GX_DrawDone();
|
||||||
@ -986,7 +972,7 @@ static bool gx_frame(void *data, const void *frame,
|
|||||||
clear_efb = GX_TRUE;
|
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();
|
GX_Flush();
|
||||||
VIDEO_SetNextFramebuffer(g_framebuf[g_current_framebuf]);
|
VIDEO_SetNextFramebuffer(g_framebuf[g_current_framebuf]);
|
||||||
VIDEO_Flush();
|
VIDEO_Flush();
|
||||||
|
@ -1,5 +1,23 @@
|
|||||||
#define STRUCT_REGDEF_SIZE 1440
|
#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[];
|
extern u8 __gxregs[];
|
||||||
|
|
||||||
struct __gx_regdef
|
struct __gx_regdef
|
||||||
@ -117,54 +135,75 @@ static GXTexRegion* __GXDefTexRegionCallback(GXTexObj *obj,u8 mapid)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define GX_LOAD_BP_REG(x) \
|
#define __GX_SetDispCopySrc(__gx, left, top, wd, ht) \
|
||||||
wgPipe->U8 = 0x61; \
|
__gx->dispCopyTL = (__gx->dispCopyTL&~0x00ffffff)|XY(left,top); \
|
||||||
asm volatile ("" ::: "memory" ); \
|
__gx->dispCopyTL = (__gx->dispCopyTL&~0xff000000)|(_SHIFTL(0x49,24,8)); \
|
||||||
wgPipe->U32 = (u32)(x); \
|
__gx->dispCopyWH = (__gx->dispCopyWH&~0x00ffffff)|XY((wd-1),(ht-1)); \
|
||||||
asm volatile ("" ::: "memory" )
|
__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(__gx->tevIndMask); \
|
||||||
GX_LOAD_BP_REG(0x66001000); \
|
GX_LOAD_BP_REG(0x66001000); \
|
||||||
GX_LOAD_BP_REG(0x66001100); \
|
GX_LOAD_BP_REG(0x66001100); \
|
||||||
GX_LOAD_BP_REG(__gx->tevIndMask)
|
GX_LOAD_BP_REG(__gx->tevIndMask)
|
||||||
|
|
||||||
#define GX_SetCurrentMtx(mtx) \
|
#define __GX_SetCurrentMtx(__gx, mtx) \
|
||||||
__gx->mtxIdxLo = (__gx->mtxIdxLo&~0x3f)|(mtx&0x3f); \
|
__gx->mtxIdxLo = (__gx->mtxIdxLo&~0x3f)|(mtx&0x3f); \
|
||||||
__gx->dirtyState |= 0x04000000
|
__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)
|
#define GX_LoadTexObj(obj,mapid) GX_LoadTexObjPreloaded(obj,(__GXDefTexRegionCallback(obj,mapid)),mapid)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user