(GX) Cleanups

This commit is contained in:
twinaphex 2015-11-18 12:18:43 +01:00
parent fecdc86475
commit 3b7e53bf58
1 changed files with 90 additions and 83 deletions

View File

@ -233,6 +233,8 @@ static void gx_free_overlay(gx_video_t *gx)
static void gx_set_video_mode(void *data, unsigned fbWidth, unsigned lines, static void gx_set_video_mode(void *data, unsigned fbWidth, unsigned lines,
bool fullscreen) bool fullscreen)
{ {
f32 y_scale;
u16 xfbWidth, xfbHeight;
bool progressive; bool progressive;
unsigned modetype, level, viHeightMultiplier, viWidth, tvmode, unsigned modetype, level, viHeightMultiplier, viWidth, tvmode,
max_width, max_height, i; max_width, max_height, i;
@ -248,6 +250,7 @@ static void gx_set_video_mode(void *data, unsigned fbWidth, unsigned lines,
viWidth = settings->video.viwidth; viWidth = settings->video.viwidth;
#if defined(HW_RVL) #if defined(HW_RVL)
progressive = CONF_GetProgressiveScan() > 0 && VIDEO_HaveComponentCable(); progressive = CONF_GetProgressiveScan() > 0 && VIDEO_HaveComponentCable();
switch (CONF_GetVideo()) switch (CONF_GetVideo())
{ {
case CONF_VIDEO_PAL: case CONF_VIDEO_PAL:
@ -267,6 +270,7 @@ static void gx_set_video_mode(void *data, unsigned fbWidth, unsigned lines,
progressive = VIDEO_HaveComponentCable(); progressive = VIDEO_HaveComponentCable();
tvmode = VIDEO_GetCurrentTvMode(); tvmode = VIDEO_GetCurrentTvMode();
#endif #endif
switch (tvmode) switch (tvmode)
{ {
case VI_PAL: case VI_PAL:
@ -369,13 +373,13 @@ static void gx_set_video_mode(void *data, unsigned fbWidth, unsigned lines,
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); y_scale = GX_GetYScaleFactor(gx_mode.efbHeight, gx_mode.xfbHeight);
u16 xfbWidth = VIPadFrameBufferWidth(gx_mode.fbWidth); xfbWidth = VIPadFrameBufferWidth(gx_mode.fbWidth);
u16 xfbHeight = GX_SetDispCopyYScale(y_scale); xfbHeight = GX_SetDispCopyYScale(y_scale);
(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,
@ -400,8 +404,6 @@ static void gx_set_video_mode(void *data, unsigned fbWidth, unsigned lines,
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;
@ -432,7 +434,7 @@ static void gx_set_video_mode(void *data, unsigned fbWidth, unsigned lines,
video_viewport_reset_custom(); video_viewport_reset_custom();
g_current_framebuf = 0; g_current_framebuf = 0;
for( int i=0; i < GX_RESOLUTIONS_LAST; i++) for(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;
RARCH_LOG("GX Resolution Index: %d\n", menu_current_gx_resolution); RARCH_LOG("GX Resolution Index: %d\n", menu_current_gx_resolution);
@ -518,6 +520,7 @@ static void init_texture(void *data, unsigned width, unsigned height)
static void init_vtx(void *data, const video_info_t *video) static void init_vtx(void *data, const video_info_t *video)
{ {
Mtx44 m;
gx_video_t *gx = (gx_video_t*)data; gx_video_t *gx = (gx_video_t*)data;
GX_SetCullMode(GX_CULL_NONE); GX_SetCullMode(GX_CULL_NONE);
@ -527,7 +530,6 @@ static void init_vtx(void *data, const video_info_t *video)
GX_SetColorUpdate(GX_TRUE); GX_SetColorUpdate(GX_TRUE);
GX_SetAlphaUpdate(GX_FALSE); GX_SetAlphaUpdate(GX_FALSE);
Mtx44 m;
guOrtho(m, 1, -1, -1, 1, 0.4, 0.6); guOrtho(m, 1, -1, -1, 1, 0.4, 0.6);
GX_LoadProjectionMtx(m, GX_ORTHOGRAPHIC); GX_LoadProjectionMtx(m, GX_ORTHOGRAPHIC);
@ -554,8 +556,7 @@ static void init_vtx(void *data, const video_info_t *video)
GX_SetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_SetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA,
GX_BL_INVSRCALPHA, GX_LO_CLEAR); GX_BL_INVSRCALPHA, GX_LO_CLEAR);
if (gx->scale != video->input_scale || if (gx->scale != video->input_scale || gx->rgb32 != video->rgb32)
gx->rgb32 != video->rgb32)
{ {
RARCH_LOG("[GX] reallocate texture\n"); RARCH_LOG("[GX] reallocate texture\n");
free(g_tex.data); free(g_tex.data);
@ -584,10 +585,13 @@ static void init_vtx(void *data, const video_info_t *video)
static void build_disp_list(void) static void build_disp_list(void)
{ {
unsigned i;
DCInvalidateRange(display_list, sizeof(display_list)); DCInvalidateRange(display_list, sizeof(display_list));
GX_BeginDispList(display_list, sizeof(display_list)); GX_BeginDispList(display_list, sizeof(display_list));
GX_Begin(GX_TRIANGLESTRIP, GX_VTXFMT0, 4); GX_Begin(GX_TRIANGLESTRIP, GX_VTXFMT0, 4);
for (unsigned i = 0; i < 4; i++)
for (i = 0; i < 4; i++)
{ {
GX_Position1x8(i); GX_Position1x8(i);
GX_Color1x8(i); GX_Color1x8(i);
@ -608,7 +612,7 @@ static void gx_efb_screenshot(void)
{ {
int x, y; int x, y;
uint8_t tga_header[] = {0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0xE0, 0x01, 0x18, 0x00}; uint8_t tga_header[] = {0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0xE0, 0x01, 0x18, 0x00};
RFILE *out = retro_fopen("/screenshot.tga", RFILE_MODE_WRITE, -1); RFILE *out = retro_fopen("/screenshot.tga", RFILE_MODE_WRITE, -1);
if (!out) if (!out)
return; return;
@ -639,12 +643,13 @@ static void gx_efb_screenshot(void)
static void *gx_init(const video_info_t *video, static void *gx_init(const video_info_t *video,
const input_driver_t **input, void **input_data) const input_driver_t **input, void **input_data)
{ {
void *gxinput = NULL;
gx_video_t *gx = (gx_video_t*)calloc(1, sizeof(gx_video_t)); gx_video_t *gx = (gx_video_t*)calloc(1, sizeof(gx_video_t));
if (!gx) if (!gx)
return NULL; return NULL;
void *gxinput = input_gx.init(); gxinput = input_gx.init();
*input = gxinput ? &input_gx : NULL; *input = gxinput ? &input_gx : NULL;
*input_data = gxinput; *input_data = gxinput;
VIInit(); VIInit();
@ -655,10 +660,10 @@ static void *gx_init(const video_info_t *video,
init_vtx(gx, video); init_vtx(gx, video);
build_disp_list(); build_disp_list();
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 = gx_old_height = 0;
return gx; return gx;
} }
@ -741,7 +746,7 @@ static void update_texture_asm(const uint32_t *src, const uint32_t *dst,
#define BLIT_LINE_16(off) \ #define BLIT_LINE_16(off) \
{ \ { \
const uint32_t *tmp_src = src; \ const uint32_t *tmp_src = src; \
uint32_t *tmp_dst = dst; \ uint32_t *tmp_dst = dst; \
for (unsigned x = 0; x < width2 >> 1; x++, tmp_src += 2, tmp_dst += 8) \ for (unsigned x = 0; x < width2 >> 1; x++, tmp_src += 2, tmp_dst += 8) \
{ \ { \
tmp_dst[ 0 + off] = BLIT_LINE_16_CONV(tmp_src[0]); \ tmp_dst[ 0 + off] = BLIT_LINE_16_CONV(tmp_src[0]); \
@ -753,7 +758,7 @@ static void update_texture_asm(const uint32_t *src, const uint32_t *dst,
#define BLIT_LINE_32(off) \ #define BLIT_LINE_32(off) \
{ \ { \
const uint16_t *tmp_src = src; \ const uint16_t *tmp_src = src; \
uint16_t *tmp_dst = dst; \ uint16_t *tmp_dst = dst; \
for (unsigned x = 0; x < width2 >> 3; x++, tmp_src += 8, tmp_dst += 32) \ for (unsigned x = 0; x < width2 >> 3; x++, tmp_src += 8, tmp_dst += 32) \
{ \ { \
tmp_dst[ 0 + off] = tmp_src[0] | 0xFF00; \ tmp_dst[ 0 + off] = tmp_src[0] | 0xFF00; \
@ -802,13 +807,14 @@ static void convert_texture16_conv(const uint32_t *_src, uint32_t *_dst,
unsigned width, unsigned height, unsigned pitch) unsigned width, unsigned height, unsigned pitch)
{ {
unsigned i, tmp_pitch, width2; unsigned i, tmp_pitch, width2;
width &= ~3;
height &= ~3;
tmp_pitch = pitch >> 2;
width2 = width >> 1;
const uint32_t *src = (const uint32_t*)_src; const uint32_t *src = (const uint32_t*)_src;
uint32_t *dst = (uint32_t*)_dst; uint32_t *dst = (uint32_t*)_dst;
width &= ~3;
height &= ~3;
tmp_pitch = pitch >> 2;
width2 = width >> 1;
for (i = 0; i < height; i += 4, dst += 4 * width2) for (i = 0; i < height; i += 4, dst += 4 * width2)
{ {
#define BLIT_LINE_16_CONV(x) (0x80008000 | (((x) & 0xFFC0FFC0) >> 1) | ((x) & 0x001F001F)) #define BLIT_LINE_16_CONV(x) (0x80008000 | (((x) & 0xFFC0FFC0) >> 1) | ((x) & 0x001F001F))
@ -824,13 +830,14 @@ static void convert_texture32(const uint32_t *_src, uint32_t *_dst,
unsigned width, unsigned height, unsigned pitch) unsigned width, unsigned height, unsigned pitch)
{ {
unsigned i, tmp_pitch, width2; unsigned i, tmp_pitch, width2;
const uint16_t *src = (uint16_t *) _src;
uint16_t *dst = (uint16_t *) _dst;
width &= ~3; width &= ~3;
height &= ~3; height &= ~3;
tmp_pitch = pitch >> 1; tmp_pitch = pitch >> 1;
width2 = width << 1; width2 = width << 1;
const uint16_t *src = (uint16_t *) _src;
uint16_t *dst = (uint16_t *) _dst;
for (i = 0; i < height; i += 4, dst += 4 * width2) for (i = 0; i < height; i += 4, dst += 4 * width2)
{ {
BLIT_LINE_32(0) BLIT_LINE_32(0)
@ -842,7 +849,10 @@ static void convert_texture32(const uint32_t *_src, uint32_t *_dst,
static void gx_resize(void *data) static void gx_resize(void *data)
{ {
unsigned degrees;
unsigned width, height; unsigned width, height;
Mtx44 m1, m2;
float top = 1, bottom = -1, left = -1, right = 1;
int x = 0, y = 0; int x = 0, y = 0;
gx_video_t *gx = (gx_video_t*)data; gx_video_t *gx = (gx_video_t*)data;
settings_t *settings = config_get_ptr(); settings_t *settings = config_get_ptr();
@ -922,13 +932,9 @@ static void gx_resize(void *data)
GX_SetViewportJitter(x, y, width, height, 0, 1, 1); GX_SetViewportJitter(x, y, width, height, 0, 1, 1);
Mtx44 m1, m2;
float top = 1, bottom = -1, left = -1, right = 1;
guOrtho(m1, top, bottom, left, right, 0, 1); guOrtho(m1, top, bottom, left, right, 0, 1);
GX_LoadPosMtxImm(m1, GX_PNMTX1); GX_LoadPosMtxImm(m1, GX_PNMTX1);
unsigned degrees;
switch(g_orientation) switch(g_orientation)
{ {
case ORIENTATION_VERTICAL: case ORIENTATION_VERTICAL:
@ -956,6 +962,8 @@ static void gx_resize(void *data)
static void gx_blit_line(unsigned x, unsigned y, const char *message) static void gx_blit_line(unsigned x, unsigned y, const char *message)
{ {
unsigned width, height, h;
bool double_width = false;
driver_t *driver = driver_get_ptr(); driver_t *driver = driver_get_ptr();
gx_video_t *gx = (gx_video_t*)driver->video_data; gx_video_t *gx = (gx_video_t*)driver->video_data;
@ -972,14 +980,13 @@ static void gx_blit_line(unsigned x, unsigned y, const char *message)
.a = 0xff .a = 0xff
}; };
unsigned h;
if (!*message) if (!*message)
return; return;
bool double_width = gx_mode.fbWidth > 400; double_width = gx_mode.fbWidth > 400;
unsigned width = (double_width ? 2 : 1); width = (double_width ? 2 : 1);
unsigned height = FONT_HEIGHT * (gx->double_strike ? 1 : 2); 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);
@ -993,19 +1000,18 @@ static void gx_blit_line(unsigned x, unsigned y, const char *message)
while (*message) while (*message)
{ {
for (unsigned j = 0; j < FONT_HEIGHT; j++) unsigned i, j;
for (j = 0; j < FONT_HEIGHT; j++)
{ {
for (unsigned i = 0; i < FONT_WIDTH; i++) for (i = 0; i < FONT_WIDTH; i++)
{ {
GXColor c;
uint8_t rem = 1 << ((i + j * FONT_WIDTH) & 7); uint8_t rem = 1 << ((i + j * FONT_WIDTH) & 7);
unsigned offset = (i + j * FONT_WIDTH) >> 3; unsigned offset = (i + j * FONT_WIDTH) >> 3;
bool col = (bitmap_bin[FONT_OFFSET((unsigned char) *message) + offset] & rem); bool col = (bitmap_bin[FONT_OFFSET((unsigned char)*message) + offset] & rem);
GXColor c = b;
if (col) if (col)
c = w; c = w;
else
c = b;
if (!gx->double_strike) if (!gx->double_strike)
{ {
@ -1028,7 +1034,7 @@ static void gx_blit_line(unsigned x, unsigned y, const char *message)
} }
} }
for (unsigned h = 0; h < height; h++) for (h = 0; h < height; h++)
{ {
GX_PokeARGB(x + (FONT_WIDTH * width), y + h, b); GX_PokeARGB(x + (FONT_WIDTH * width), y + h, b);
if (double_width) if (double_width)
@ -1174,6 +1180,7 @@ static bool gx_frame(void *data, const void *frame,
{ {
unsigned x = 7 * (gx->double_strike ? 1 : 2); unsigned x = 7 * (gx->double_strike ? 1 : 2);
unsigned y = gx->vp.full_height - (35 * (gx->double_strike ? 1 : 2)); unsigned y = gx->vp.full_height - (35 * (gx->double_strike ? 1 : 2));
gx_blit_line(x, y, msg); gx_blit_line(x, y, msg);
clear_efb = GX_TRUE; clear_efb = GX_TRUE;
} }
@ -1268,13 +1275,13 @@ static void gx_set_texture_enable(void *data, bool enable, bool full_screen)
(void)full_screen; (void)full_screen;
if (gx) if (!gx)
{ return;
gx->menu_texture_enable = enable;
/* need to make sure the game texture is the right pixel gx->menu_texture_enable = enable;
* format for menu overlay. */ /* need to make sure the game texture is the right pixel
gx->should_resize = true; * format for menu overlay. */
} gx->should_resize = true;
} }
static void gx_apply_state_changes(void *data) static void gx_apply_state_changes(void *data)
@ -1366,6 +1373,7 @@ static bool gx_overlay_load(void *data, const void *image_data, unsigned num_ima
for (i = 0; i < num_images; i++) for (i = 0; i < num_images; i++)
{ {
struct gx_overlay_data *o = (struct gx_overlay_data*)&gx->overlay[i]; struct gx_overlay_data *o = (struct gx_overlay_data*)&gx->overlay[i];
GX_InitTexObj(&o->tex, images[i].pixels, images[i].width, GX_InitTexObj(&o->tex, images[i].pixels, images[i].width,
images[i].height, images[i].height,
GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE); GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE);
@ -1384,35 +1392,31 @@ static bool gx_overlay_load(void *data, const void *image_data, unsigned num_ima
static void gx_overlay_tex_geom(void *data, unsigned image, static void gx_overlay_tex_geom(void *data, unsigned image,
float x, float y, float w, float h) float x, float y, float w, float h)
{ {
gx_video_t *gx = (gx_video_t*)data; gx_video_t *gx = (gx_video_t*)data;
struct gx_overlay_data *o; struct gx_overlay_data *o = NULL;
o = NULL;
if (gx) if (gx)
o = (struct gx_overlay_data*)&gx->overlay[image]; o = (struct gx_overlay_data*)&gx->overlay[image];
if (o) if (!o)
{ return;
o->tex_coord[0] = x;
o->tex_coord[1] = y; o->tex_coord[0] = x;
o->tex_coord[2] = x + w; o->tex_coord[1] = y;
o->tex_coord[3] = y; o->tex_coord[2] = x + w;
o->tex_coord[4] = x; o->tex_coord[3] = y;
o->tex_coord[5] = y + h; o->tex_coord[4] = x;
o->tex_coord[6] = x + w; o->tex_coord[5] = y + h;
o->tex_coord[7] = y + h; o->tex_coord[6] = x + w;
} o->tex_coord[7] = y + h;
} }
static void gx_overlay_vertex_geom(void *data, unsigned image, static void gx_overlay_vertex_geom(void *data, unsigned image,
float x, float y, float w, float h) float x, float y, float w, float h)
{ {
gx_video_t *gx = (gx_video_t*)data; gx_video_t *gx = (gx_video_t*)data;
struct gx_overlay_data *o; struct gx_overlay_data *o = NULL;
o = NULL;
/* Flipped, so we preserve top-down semantics. */ /* Flipped, so we preserve top-down semantics. */
y = 1.0f - y; y = 1.0f - y;
h = -h; h = -h;
@ -1426,17 +1430,17 @@ static void gx_overlay_vertex_geom(void *data, unsigned image,
if (gx) if (gx)
o = (struct gx_overlay_data*)&gx->overlay[image]; o = (struct gx_overlay_data*)&gx->overlay[image];
if (o) if (!o)
{ return;
o->vertex_coord[0] = x;
o->vertex_coord[1] = y; o->vertex_coord[0] = x;
o->vertex_coord[2] = x + w; o->vertex_coord[1] = y;
o->vertex_coord[3] = y; o->vertex_coord[2] = x + w;
o->vertex_coord[4] = x; o->vertex_coord[3] = y;
o->vertex_coord[5] = y + h; o->vertex_coord[4] = x;
o->vertex_coord[6] = x + w; o->vertex_coord[5] = y + h;
o->vertex_coord[7] = y + h; o->vertex_coord[6] = x + w;
} o->vertex_coord[7] = y + h;
} }
static void gx_overlay_enable(void *data, bool state) static void gx_overlay_enable(void *data, bool state)
@ -1454,11 +1458,14 @@ static void gx_overlay_full_screen(void *data, bool enable)
static void gx_overlay_set_alpha(void *data, unsigned image, float mod) static void gx_overlay_set_alpha(void *data, unsigned image, float mod)
{ {
gx_video_t *gx = (gx_video_t*)data; gx_video_t *gx = (gx_video_t*)data;
gx->overlay[image].alpha_mod = mod;
if (gx)
gx->overlay[image].alpha_mod = mod;
} }
static void gx_render_overlay(void *data) static void gx_render_overlay(void *data)
{ {
unsigned i;
gx_video_t *gx = (gx_video_t*)data; gx_video_t *gx = (gx_video_t*)data;
GX_SetCurrentMtx(GX_PNMTX1); GX_SetCurrentMtx(GX_PNMTX1);
@ -1466,7 +1473,7 @@ static void gx_render_overlay(void *data)
GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT); GX_SetVtxDesc(GX_VA_TEX0, GX_DIRECT);
GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT); GX_SetVtxDesc(GX_VA_CLR0, GX_DIRECT);
for (unsigned i = 0; i < gx->overlays; i++) for (i = 0; i < gx->overlays; i++)
{ {
GX_LoadTexObj(&gx->overlay[i].tex, GX_TEXMAP0); GX_LoadTexObj(&gx->overlay[i].tex, GX_TEXMAP0);