(GX) move variables to gx_video_t

This commit is contained in:
twinaphex 2015-11-15 20:44:30 +01:00
parent 1009f12939
commit 37b4735c4c

View File

@ -64,16 +64,21 @@ typedef struct gx_video
bool overlay_full_screen; bool overlay_full_screen;
#endif #endif
void *framebuf[2]; void *framebuf[2];
unsigned current_framebuf;
uint32_t orientation;
bool vsync;
uint8_t fifo[256 * 1024] ATTRIBUTE_ALIGN(32);
unsigned old_width;
unsigned old_height;
uint8_t display_list[1024] ATTRIBUTE_ALIGN(32);
size_t display_list_size;
GXRModeObj mode;
} gx_video_t; } gx_video_t;
#define SYSMEM1_SIZE 0x01800000 #define SYSMEM1_SIZE 0x01800000
unsigned g_current_framebuf;
bool g_vsync;
OSCond g_video_cond; OSCond g_video_cond;
volatile bool g_draw_done; volatile bool g_draw_done;
uint32_t g_orientation;
static struct static struct
{ {
@ -89,12 +94,6 @@ static struct
GXTexObj obj; GXTexObj obj;
} menu_tex ATTRIBUTE_ALIGN(32); } menu_tex ATTRIBUTE_ALIGN(32);
uint8_t gx_fifo[256 * 1024] ATTRIBUTE_ALIGN(32);
uint8_t display_list[1024] ATTRIBUTE_ALIGN(32);
uint16_t gx_width, gx_height;
size_t display_list_size;
GXRModeObj gx_mode;
unsigned gx_old_width, gx_old_height;
static u8 _gxtexmode0ids[8] = {0x80,0x81,0x82,0x83,0xA0,0xA1,0xA2,0xA3}; static u8 _gxtexmode0ids[8] = {0x80,0x81,0x82,0x83,0xA0,0xA1,0xA2,0xA3};
static u8 _gxtexmode1ids[8] = {0x84,0x85,0x86,0x87,0xA4,0xA5,0xA6,0xA7}; static u8 _gxtexmode1ids[8] = {0x84,0x85,0x86,0x87,0xA4,0xA5,0xA6,0xA7};
@ -312,97 +311,100 @@ static void gx_set_video_mode(void *data, unsigned fbWidth, unsigned lines,
if (fbWidth > max_width) if (fbWidth > max_width)
fbWidth = max_width; fbWidth = max_width;
gx_mode.viTVMode = VI_TVMODE(tvmode, modetype); gx->mode.viTVMode = VI_TVMODE(tvmode, modetype);
gx_mode.fbWidth = fbWidth; gx->mode.fbWidth = fbWidth;
gx_mode.efbHeight = min(lines, 480); gx->mode.efbHeight = min(lines, 480);
if (modetype == VI_NON_INTERLACE && lines > max_height / 2) if (modetype == VI_NON_INTERLACE && lines > max_height / 2)
gx_mode.xfbHeight = max_height / 2; gx->mode.xfbHeight = max_height / 2;
else if (modetype != VI_NON_INTERLACE && lines > max_height) else if (modetype != VI_NON_INTERLACE && lines > max_height)
gx_mode.xfbHeight = max_height; gx->mode.xfbHeight = max_height;
else else
gx_mode.xfbHeight = lines; gx->mode.xfbHeight = lines;
gx_mode.viWidth = viWidth; gx->mode.viWidth = viWidth;
gx_mode.viHeight = gx_mode.xfbHeight * viHeightMultiplier; gx->mode.viHeight = gx->mode.xfbHeight * viHeightMultiplier;
gx_mode.viXOrigin = (max_width - gx_mode.viWidth) / 2; gx->mode.viXOrigin = (max_width - gx->mode.viWidth) / 2;
gx_mode.viYOrigin = gx->mode.viYOrigin =
(max_height - gx_mode.viHeight) / (2 * viHeightMultiplier); (max_height - gx->mode.viHeight) / (2 * viHeightMultiplier);
gx_mode.xfbMode = modetype == VI_INTERLACE ? VI_XFBMODE_DF : VI_XFBMODE_SF; gx->mode.xfbMode = modetype == VI_INTERLACE ? VI_XFBMODE_DF : VI_XFBMODE_SF;
gx_mode.field_rendering = GX_FALSE; gx->mode.field_rendering = GX_FALSE;
gx_mode.aa = GX_FALSE; gx->mode.aa = GX_FALSE;
for (i = 0; i < 12; i++) for (i = 0; i < 12; i++)
gx_mode.sample_pattern[i][0] = gx_mode.sample_pattern[i][1] = 6; {
gx->mode.sample_pattern[i][0] = 6;
gx->mode.sample_pattern[i][1] = 6;
}
if (modetype == VI_INTERLACE) if (modetype == VI_INTERLACE)
{ {
gx_mode.vfilter[0] = 8; gx->mode.vfilter[0] = 8;
gx_mode.vfilter[1] = 8; gx->mode.vfilter[1] = 8;
gx_mode.vfilter[2] = 10; gx->mode.vfilter[2] = 10;
gx_mode.vfilter[3] = 12; gx->mode.vfilter[3] = 12;
gx_mode.vfilter[4] = 10; gx->mode.vfilter[4] = 10;
gx_mode.vfilter[5] = 8; gx->mode.vfilter[5] = 8;
gx_mode.vfilter[6] = 8; gx->mode.vfilter[6] = 8;
} }
else else
{ {
gx_mode.vfilter[0] = 0; gx->mode.vfilter[0] = 0;
gx_mode.vfilter[1] = 0; gx->mode.vfilter[1] = 0;
gx_mode.vfilter[2] = 21; gx->mode.vfilter[2] = 21;
gx_mode.vfilter[3] = 22; gx->mode.vfilter[3] = 22;
gx_mode.vfilter[4] = 21; gx->mode.vfilter[4] = 21;
gx_mode.vfilter[5] = 0; gx->mode.vfilter[5] = 0;
gx_mode.vfilter[6] = 0; gx->mode.vfilter[6] = 0;
} }
gx->vp.full_width = gx_mode.fbWidth; gx->vp.full_width = gx->mode.fbWidth;
gx->vp.full_height = gx_mode.xfbHeight; gx->vp.full_height = gx->mode.xfbHeight;
gx->double_strike = (modetype == VI_NON_INTERLACE); gx->double_strike = (modetype == VI_NON_INTERLACE);
gx->should_resize = true; gx->should_resize = true;
VIConfigure(&gx_mode); VIConfigure(&gx->mode);
VIDEO_ClearFrameBuffer(&gx_mode, gx->framebuf[0], COLOR_BLACK); VIDEO_ClearFrameBuffer(&gx->mode, gx->framebuf[0], COLOR_BLACK);
VIDEO_ClearFrameBuffer(&gx_mode, gx->framebuf[1], COLOR_BLACK); VIDEO_ClearFrameBuffer(&gx->mode, gx->framebuf[1], COLOR_BLACK);
VISetNextFrameBuffer(gx->framebuf[0]); VISetNextFrameBuffer(gx->framebuf[0]);
VISetPostRetraceCallback(retrace_callback); VISetPostRetraceCallback(retrace_callback);
VISetBlack(false); VISetBlack(false);
VIFlush(); VIFlush();
GX_SetViewportJitter(0, 0, gx_mode.fbWidth, gx_mode.efbHeight, 0, 1, 1); GX_SetViewportJitter(0, 0, gx->mode.fbWidth, gx->mode.efbHeight, 0, 1, 1);
GX_SetDispCopySrc(0, 0, gx_mode.fbWidth, gx_mode.efbHeight); GX_SetDispCopySrc(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 = VIPadFrameBufferWidth(gx_mode.fbWidth); u16 xfbWidth = VIPadFrameBufferWidth(gx->mode.fbWidth);
u16 xfbHeight = GX_SetDispCopyYScale(y_scale); u16 xfbHeight = GX_SetDispCopyYScale(y_scale);
(void)xfbHeight; (void)xfbHeight;
GX_SetDispCopyDst(xfbWidth, xfbHeight); GX_SetDispCopyDst(xfbWidth, xfbHeight);
GX_SetCopyFilter(gx_mode.aa, gx_mode.sample_pattern, GX_SetCopyFilter(gx->mode.aa, gx->mode.sample_pattern,
(gx_mode.xfbMode == VI_XFBMODE_SF) ? GX_FALSE : settings->video.vfilter, (gx->mode.xfbMode == VI_XFBMODE_SF) ? GX_FALSE : settings->video.vfilter,
gx_mode.vfilter); gx->mode.vfilter);
GXColor color = { 0, 0, 0, 0xff }; GXColor color = { 0, 0, 0, 0xff };
GX_SetCopyClear(color, GX_MAX_Z24); GX_SetCopyClear(color, GX_MAX_Z24);
GX_SetFieldMode(gx_mode.field_rendering, GX_SetFieldMode(gx->mode.field_rendering,
(gx_mode.viHeight == 2 * gx_mode.xfbHeight) ? GX_ENABLE : GX_DISABLE); (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_Flush(); GX_Flush();
_CPU_ISR_Restore(level); _CPU_ISR_Restore(level);
RARCH_LOG("GX Resolution: %dx%d (%s)\n", gx_mode.fbWidth, RARCH_LOG("GX Resolution: %dx%d (%s)\n", gx->mode.fbWidth,
gx_mode.efbHeight, (gx_mode.viTVMode & 3) == VI_INTERLACE gx->mode.efbHeight, (gx->mode.viTVMode & 3) == VI_INTERLACE
? "interlaced" : "progressive"); ? "interlaced" : "progressive");
{ {
size_t new_fb_pitch; size_t new_fb_pitch;
unsigned new_fb_width; unsigned new_fb_width;
unsigned new_fb_height = (gx_mode.efbHeight / (gx->double_strike ? 1 : 2)) & ~3; unsigned new_fb_height = (gx->mode.efbHeight / (gx->double_strike ? 1 : 2)) & ~3;
if (new_fb_height > 240) if (new_fb_height > 240)
new_fb_height = 240; new_fb_height = 240;
new_fb_width = (gx_mode.fbWidth / (gx_mode.fbWidth < 400 ? 1 : 2)) & ~3; new_fb_width = (gx->mode.fbWidth / (gx->mode.fbWidth < 400 ? 1 : 2)) & ~3;
if (new_fb_width > 400) if (new_fb_width > 400)
new_fb_width = 400; new_fb_width = 400;
@ -431,7 +433,7 @@ static void gx_set_video_mode(void *data, unsigned fbWidth, unsigned lines,
/* custom viewports for older resolutions will most likely be corrupted, reset them */ /* custom viewports for older resolutions will most likely be corrupted, reset them */
video_viewport_reset_custom(); video_viewport_reset_custom();
g_current_framebuf = 0; gx->current_framebuf = 0;
for( int i=0; i < GX_RESOLUTIONS_LAST; i++) for( int i=0; i < GX_RESOLUTIONS_LAST; i++)
if(fbWidth == menu_gx_resolutions[i][0] && lines == menu_gx_resolutions[i][1]) if(fbWidth == menu_gx_resolutions[i][0] && lines == menu_gx_resolutions[i][1])
menu_current_gx_resolution = i; menu_current_gx_resolution = i;
@ -474,12 +476,12 @@ static void setup_video_mode(gx_video_t *gx)
memalign(32, 640 * 576 * VI_DISPLAY_PIX_SZ)); memalign(32, 640 * 576 * VI_DISPLAY_PIX_SZ));
} }
g_current_framebuf = 0; gx->current_framebuf = 0;
g_draw_done = true; g_draw_done = true;
g_orientation = ORIENTATION_NORMAL; gx->orientation = ORIENTATION_NORMAL;
OSInitThreadQueue(&g_video_cond); OSInitThreadQueue(&g_video_cond);
VIDEO_GetPreferredMode(&gx_mode); VIDEO_GetPreferredMode(&gx->mode);
gx_set_video_mode(gx, 0, 0, true); gx_set_video_mode(gx, 0, 0, true);
} }
@ -582,10 +584,10 @@ static void init_vtx(void *data, const video_info_t *video)
GX_Flush(); GX_Flush();
} }
static void build_disp_list(void) static void build_disp_list(gx_video_t *gx)
{ {
DCInvalidateRange(display_list, sizeof(display_list)); DCInvalidateRange(gx->display_list, sizeof(gx->display_list));
GX_BeginDispList(display_list, sizeof(display_list)); GX_BeginDispList(gx->display_list, sizeof(gx->display_list));
GX_Begin(GX_TRIANGLESTRIP, GX_VTXFMT0, 4); GX_Begin(GX_TRIANGLESTRIP, GX_VTXFMT0, 4);
for (unsigned i = 0; i < 4; i++) for (unsigned i = 0; i < 4; i++)
{ {
@ -594,7 +596,7 @@ static void build_disp_list(void)
GX_TexCoord1x8(i); GX_TexCoord1x8(i);
} }
GX_End(); GX_End();
display_list_size = GX_EndDispList(); gx->display_list_size = GX_EndDispList();
} }
#if 0 #if 0
@ -648,17 +650,18 @@ static void *gx_init(const video_info_t *video,
*input_data = gxinput; *input_data = gxinput;
VIInit(); VIInit();
GX_Init(gx_fifo, sizeof(gx_fifo)); GX_Init(gx->fifo, sizeof(gx->fifo));
g_vsync = video->vsync; gx->vsync = video->vsync;
setup_video_mode(gx); setup_video_mode(gx);
init_vtx(gx, video); init_vtx(gx, video);
build_disp_list(); build_disp_list(gx);
gx->vp.full_width = gx_mode.fbWidth; gx->vp.full_width = gx->mode.fbWidth;
gx->vp.full_height = gx_mode.xfbHeight; gx->vp.full_height = gx->mode.xfbHeight;
gx->should_resize = true; gx->should_resize = true;
gx_old_width = gx_old_height = 0; gx->old_width = 0;
gx->old_height = 0;
return gx; return gx;
} }
@ -859,13 +862,13 @@ static void gx_resize(void *data)
#endif #endif
GX_SetDispCopyGamma(global->console.screen.gamma_correction); GX_SetDispCopyGamma(global->console.screen.gamma_correction);
if (gx->keep_aspect && gx_mode.efbHeight >= 240) /* ignore this for custom resolutions */ if (gx->keep_aspect && gx->mode.efbHeight >= 240) /* ignore this for custom resolutions */
{ {
float desired_aspect = video_driver_get_aspect_ratio(); float desired_aspect = video_driver_get_aspect_ratio();
if (desired_aspect == 0.0) if (desired_aspect == 0.0)
desired_aspect = 1.0; desired_aspect = 1.0;
if (g_orientation == ORIENTATION_VERTICAL || if (gx->orientation == ORIENTATION_VERTICAL ||
g_orientation == ORIENTATION_FLIPPED_ROTATED) gx->orientation == ORIENTATION_FLIPPED_ROTATED)
desired_aspect = 1.0 / desired_aspect; desired_aspect = 1.0 / desired_aspect;
if (settings->video.aspect_ratio_idx == ASPECT_RATIO_CUSTOM) if (settings->video.aspect_ratio_idx == ASPECT_RATIO_CUSTOM)
@ -929,7 +932,7 @@ static void gx_resize(void *data)
GX_LoadPosMtxImm(m1, GX_PNMTX1); GX_LoadPosMtxImm(m1, GX_PNMTX1);
unsigned degrees; unsigned degrees;
switch(g_orientation) switch(gx->orientation)
{ {
case ORIENTATION_VERTICAL: case ORIENTATION_VERTICAL:
degrees = 90; degrees = 90;
@ -950,7 +953,8 @@ static void gx_resize(void *data)
GX_LoadPosMtxImm(m1, GX_PNMTX0); GX_LoadPosMtxImm(m1, GX_PNMTX0);
init_texture(data, 4, 4); init_texture(data, 4, 4);
gx_old_width = gx_old_height = 0; gx->old_width = 0;
gx->old_height = 0;
gx->should_resize = false; gx->should_resize = false;
} }
@ -977,9 +981,10 @@ static void gx_blit_line(unsigned x, unsigned y, const char *message)
if (!*message) if (!*message)
return; return;
bool double_width = gx_mode.fbWidth > 400; bool double_width = gx->mode.fbWidth > 400;
unsigned width = (double_width ? 2 : 1); unsigned width = (double_width ? 2 : 1);
unsigned height = FONT_HEIGHT * (gx->double_strike ? 1 : 2); unsigned height = FONT_HEIGHT * (gx->double_strike ? 1 : 2);
for (h = 0; h < height; h++) for (h = 0; h < height; h++)
{ {
GX_PokeARGB(x, y + h, b); GX_PokeARGB(x, y + h, b);
@ -1070,21 +1075,21 @@ static bool gx_frame(void *data, const void *frame,
clear_efb = GX_TRUE; clear_efb = GX_TRUE;
} }
while (((g_vsync || gx->menu_texture_enable)) && !g_draw_done) while (((gx->vsync || gx->menu_texture_enable)) && !g_draw_done)
OSSleepThread(g_video_cond); OSSleepThread(g_video_cond);
width = min(g_tex.width, width); width = min(g_tex.width, width);
height = min(g_tex.height, height); height = min(g_tex.height, height);
if (width != gx_old_width || height != gx_old_height) if (width != gx->old_width || height != gx->old_height)
{ {
init_texture(data, width, height); init_texture(data, width, height);
gx_old_width = width; gx->old_width = width;
gx_old_height = height; gx->old_height = height;
} }
g_draw_done = false; g_draw_done = false;
g_current_framebuf ^= 1; gx->current_framebuf ^= 1;
if (frame) if (frame)
@ -1129,13 +1134,13 @@ static bool gx_frame(void *data, const void *frame,
__GX_SetCurrentMtx(__gx, GX_PNMTX0); __GX_SetCurrentMtx(__gx, GX_PNMTX0);
__GX_LoadTexObj(&g_tex.obj, GX_TEXMAP0); __GX_LoadTexObj(&g_tex.obj, GX_TEXMAP0);
__GX_CallDispList(__gx, display_list, display_list_size); __GX_CallDispList(__gx, gx->display_list, gx->display_list_size);
if (gx->menu_texture_enable) if (gx->menu_texture_enable)
{ {
__GX_SetCurrentMtx(__gx, GX_PNMTX1); __GX_SetCurrentMtx(__gx, GX_PNMTX1);
GX_LoadTexObj(&menu_tex.obj, GX_TEXMAP0); GX_LoadTexObj(&menu_tex.obj, GX_TEXMAP0);
__GX_CallDispList(__gx, display_list, display_list_size); __GX_CallDispList(__gx, gx->display_list, gx->display_list_size);
} }
#ifdef HAVE_OVERLAY #ifdef HAVE_OVERLAY
@ -1178,9 +1183,9 @@ static bool gx_frame(void *data, const void *frame,
clear_efb = GX_TRUE; clear_efb = GX_TRUE;
} }
__GX_CopyDisp(__gx, gx->framebuf[g_current_framebuf], clear_efb); __GX_CopyDisp(__gx, gx->framebuf[gx->current_framebuf], clear_efb);
__GX_Flush(__gx); __GX_Flush(__gx);
VISetNextFrameBuffer(gx->framebuf[g_current_framebuf]); VISetNextFrameBuffer(gx->framebuf[gx->current_framebuf]);
VIFlush(); VIFlush();
retro_perf_stop(&gx_frame); retro_perf_stop(&gx_frame);
@ -1190,8 +1195,10 @@ static bool gx_frame(void *data, const void *frame,
static void gx_set_nonblock_state(void *data, bool state) static void gx_set_nonblock_state(void *data, bool state)
{ {
(void)data; gx_video_t *gx = (gx_video_t*)data;
g_vsync = !state;
if (gx)
gx->vsync = !state;
} }
static bool gx_alive(void *data) static bool gx_alive(void *data)
@ -1242,7 +1249,7 @@ static void gx_free(void *data)
static void gx_set_rotation(void *data, unsigned orientation) static void gx_set_rotation(void *data, unsigned orientation)
{ {
gx_video_t *gx = (gx_video_t*)data; gx_video_t *gx = (gx_video_t*)data;
g_orientation = orientation; gx->orientation = orientation;
if (gx) if (gx)
gx->should_resize = true; gx->should_resize = true;