diff --git a/HISTORY.txt b/HISTORY.txt index a51c80c..271c3ae 100644 --- a/HISTORY.txt +++ b/HISTORY.txt @@ -95,6 +95,7 @@ Genesis Plus GX 1.7.5 (xx/xx/xxxx) (Eke-Eke) * improved Mode 5 sprites rendering timings (fixes "Overdrive" demo) * improved FIFO timings accuracy (fixes "Overdrive" Demo) * improved H-Counter accuracy in H32 mode +* improved VDP status timing accuracy * improved accuracy of Master System color palette brightness range (verified against real hardware) * fixed misaligned buffer writes in Mode 4 when -DALIGN_LONG option is used * fixed alpha channel for 15-bit (RGB555) and 32-bit (RGB888) color support diff --git a/builds/genesis_plus_gx_libretro.dll b/builds/genesis_plus_gx_libretro.dll index 698ea03..1f14af4 100644 Binary files a/builds/genesis_plus_gx_libretro.dll and b/builds/genesis_plus_gx_libretro.dll differ diff --git a/builds/genplus_cube.dol b/builds/genplus_cube.dol index 8052dcf..845c73a 100644 Binary files a/builds/genplus_cube.dol and b/builds/genplus_cube.dol differ diff --git a/builds/genplus_wii.dol b/builds/genplus_wii.dol index 4c5890f..be09e68 100644 Binary files a/builds/genplus_wii.dol and b/builds/genplus_wii.dol differ diff --git a/core/cart_hw/md_cart.c b/core/cart_hw/md_cart.c index 61152fa..6e143f7 100644 --- a/core/cart_hw/md_cart.c +++ b/core/cart_hw/md_cart.c @@ -2,7 +2,7 @@ * Genesis Plus * Mega Drive cartridge hardware support * - * Copyright (C) 2007-2015 Eke-Eke (Genesis Plus GX) + * Copyright (C) 2007-2016 Eke-Eke (Genesis Plus GX) * * Many cartridge protections were initially documented by Haze * (http://haze.mameworld.info/) @@ -44,7 +44,6 @@ #include "shared.h" #include "eeprom_i2c.h" #include "eeprom_spi.h" -#include "gamepad.h" /* Cart database entry */ typedef struct @@ -674,7 +673,7 @@ void md_cart_init(void) } else if (cart.romsize > 0x400000) { - /* assume linear ROM mapper without bankswitching (max. 10MB) */ + /* assume linear ROM mapping by default (max. 10MB) */ for (i=0x40; i<0xA0; i++) { m68k.memory_map[i].base = cart.rom + (i<<16); @@ -1614,15 +1613,22 @@ static uint32 mapper_radica_r(uint32 address) static void default_time_w(uint32 address, uint32 data) { + /* enable multi-game cartridge mapper by default */ if (address < 0xa13040) { - /* unlicensed cartridges mapper (default) */ mapper_64k_multi_w(address); return; } - /* official cartridges mapper (default) */ - mapper_sega_w(data); + /* enable "official" cartridge mapper by default */ + if (address > 0xa130f1) + { + mapper_512k_w(address, data); + } + else + { + mapper_sega_w(data); + } } diff --git a/core/cart_hw/md_cart.h b/core/cart_hw/md_cart.h index d60672a..04d048b 100644 --- a/core/cart_hw/md_cart.h +++ b/core/cart_hw/md_cart.h @@ -2,7 +2,7 @@ * Genesis Plus * Mega Drive cartridge hardware support * - * Copyright (C) 2007-2015 Eke-Eke (Genesis Plus GX) + * Copyright (C) 2007-2016 Eke-Eke (Genesis Plus GX) * * Most cartridge protections were initially documented by Haze * (http://haze.mameworld.info/) @@ -76,12 +76,12 @@ typedef struct /* Cartridge type */ typedef struct { - uint8 rom[MAXROMSIZE]; /* ROM area */ uint8 *base; /* ROM base (saved for OS/Cartridge ROM swap) */ uint32 romsize; /* ROM size */ uint32 mask; /* ROM mask */ - uint8 special; /* Lock-On, J-Cart or SMS 3-D glasses hardware */ - cart_hw_t hw; /* Extra mapping hardware */ + uint8 special; /* custom external hardware (Lock-On, J-Cart, 3-D glasses, Terebi Oekaki,...) */ + cart_hw_t hw; /* cartridge internal hardware */ + uint8 rom[MAXROMSIZE]; /* ROM area */ } md_cart_t; diff --git a/core/cd_hw/cd_cart.c b/core/cd_hw/cd_cart.c index b036305..09e84df 100644 --- a/core/cd_hw/cd_cart.c +++ b/core/cd_hw/cd_cart.c @@ -2,7 +2,7 @@ * Genesis Plus * CD compatible ROM/RAM cartridge support * - * Copyright (C) 2012-2015 Eke-Eke (Genesis Plus GX) + * Copyright (C) 2012-2016 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: diff --git a/core/cd_hw/cd_cart.h b/core/cd_hw/cd_cart.h index 2ee7b25..8a21ba2 100644 --- a/core/cd_hw/cd_cart.h +++ b/core/cd_hw/cd_cart.h @@ -2,7 +2,7 @@ * Genesis Plus * CD compatible ROM/RAM cartridge support * - * Copyright (C) 2012-2015 Eke-Eke (Genesis Plus GX) + * Copyright (C) 2012-2016 Eke-Eke (Genesis Plus GX) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: @@ -40,7 +40,7 @@ /* CD compatible ROM/RAM cartridge */ typedef struct { - uint8 area[0x840000]; /* cartridge ROM/RAM area (max. 8MB ROM / 64KB backup memory + Pro Action Replay 128KB ROM / 64KB RAM) */ + uint8 area[0x840080]; /* cartridge ROM/RAM area (max. 8MB ROM + 64KB backup memory + Pro Action Replay 128KB ROM / 64KB RAM + cartridge infos) */ uint8 boot; /* cartridge boot mode (0x00: boot from CD with ROM/RAM cartridge enabled, 0x40: boot from ROM cartridge with CD enabled) */ uint8 id; /* RAM cartridge ID (related to RAM size, 0 if disabled) */ uint8 prot; /* RAM cartridge write protection */ diff --git a/core/m68k/s68kcpu.c b/core/m68k/s68kcpu.c index 40ff145..0df6054 100644 --- a/core/m68k/s68kcpu.c +++ b/core/m68k/s68kcpu.c @@ -257,7 +257,7 @@ void s68k_run(unsigned int cycles) REG_IR = m68ki_read_imm_16(); /* Execute instruction */ - m68ki_instruction_jump_table[REG_IR](); + m68ki_instruction_jump_table[REG_IR](); USE_CYCLES(CYC_INSTRUCTION[REG_IR]); /* Trace m68k_exception, if necessary */ diff --git a/core/system.c b/core/system.c index e6b4e20..5c3f6e6 100644 --- a/core/system.c +++ b/core/system.c @@ -423,6 +423,9 @@ void system_frame_gen(int do_skip) bitmap.viewport.y = (config.overscan & 1) * 24 * (vdp_pal + 1); } + /* active screen width */ + bitmap.viewport.w = 256 + ((reg[12] & 0x01) << 6); + /* check viewport changes */ if (bitmap.viewport.h != bitmap.viewport.oh) { @@ -478,12 +481,6 @@ void system_frame_gen(int do_skip) /* refresh inputs just before VINT (Warriors of Eternal Sun) */ osd_input_update(); - /* delay between VINT flag & Vertical Interrupt (Ex-Mutants, Tyrant) */ - m68k_run(588); - - /* set VINT flag */ - status |= 0x80; - /* delay between VBLANK flag & Vertical Interrupt (Dracula, OutRunners, VR Troopers) */ m68k_run(788); if (zstate == 1) @@ -495,6 +492,9 @@ void system_frame_gen(int do_skip) Z80.cycles = 788; } + /* set VINT flag */ + status |= 0x80; + /* Vertical Interrupt */ vint_pending = 0x20; if (reg[1] & 0x20) @@ -792,6 +792,9 @@ void system_frame_scd(int do_skip) bitmap.viewport.y = (config.overscan & 1) * 24 * (vdp_pal + 1); } + /* active screen width */ + bitmap.viewport.w = 256 + ((reg[12] & 0x01) << 6); + /* check viewport changes */ if (bitmap.viewport.h != bitmap.viewport.oh) { @@ -847,12 +850,6 @@ void system_frame_scd(int do_skip) /* refresh inputs just before VINT */ osd_input_update(); - /* delay between VINT flag & Vertical Interrupt (Ex-Mutants, Tyrant) */ - m68k_run(588); - - /* set VINT flag */ - status |= 0x80; - /* delay between VBLANK flag & Vertical Interrupt (Dracula, OutRunners, VR Troopers) */ m68k_run(788); if (zstate == 1) @@ -864,6 +861,9 @@ void system_frame_scd(int do_skip) Z80.cycles = 788; } + /* set VINT flag */ + status |= 0x80; + /* Vertical Interrupt */ vint_pending = 0x20; if (reg[1] & 0x20) @@ -1180,7 +1180,10 @@ void system_frame_sms(int do_skip) } } } - + + /* active screen width */ + bitmap.viewport.w = 256 + ((reg[12] & 0x01) << 6); + /* check viewport changes */ if (bitmap.viewport.h != bitmap.viewport.oh) { diff --git a/core/vdp_ctrl.c b/core/vdp_ctrl.c index 9cdbf80..f630765 100644 --- a/core/vdp_ctrl.c +++ b/core/vdp_ctrl.c @@ -1134,6 +1134,9 @@ unsigned int vdp_68k_ctrl_r(unsigned int cycles) { unsigned int temp; + /* Cycle-accurate VDP status read (68k read cycle takes four CPU cycles i.e 28 Mcycles) */ + cycles += 4 * 7; + /* Update FIFO status flags if not empty */ if (fifo_write_cnt) { @@ -1160,14 +1163,25 @@ unsigned int vdp_68k_ctrl_r(unsigned int cycles) /* Clear SOVR & SCOL flags */ status &= 0xFF9F; - /* Display OFF: VBLANK flag is set */ + /* VBLANK flag is set when display is disabled */ if (!(reg[1] & 0x40)) { temp |= 0x08; } - /* HBLANK flag (Sonic 3 and Sonic 2 "VS Modes", Lemmings 2, Mega Turrican, V.R Troopers, Gouketsuji Ichizoku,...) */ - /* NB: this is not 100% accurate and need to be verified on real hardware */ + /* Cycle-accurate VINT flag (Ex-Mutants, Tyrant / Mega-Lo-Mania) */ + /* this allows VINT flag to be read just before vertical interrupt is being triggered */ + if ((v_counter == bitmap.viewport.h) && (cycles >= (mcycles_vdp + 788))) + { + /* check Z80 interrupt state to assure VINT has not already been triggered (and flag cleared) */ + if (Z80.irq_state != ASSERT_LINE) + { + temp |= 0x80; + } + } + + /* Cycle-accurate HBLANK flag (Sonic 3 & Sonic 2 "VS Modes", Bugs Bunny Double Trouble, Lemmings 2, Mega Turrican, V.R Troopers, Gouketsuji Ichizoku,...) */ + /* NB: this is not 100% accurate (see hvc.h for horizontal events timings in H32 and H40 mode) but is close enough to make no noticeable difference for games */ if ((cycles % MCYCLES_PER_LINE) < 588) { temp |= 0x04; @@ -1932,8 +1946,8 @@ static void vdp_reg_w(unsigned int r, unsigned int d, unsigned int cycles) /* Update clipping */ window_clip(reg[17], 1); - /* Update active display width & max sprite pixels per line*/ - max_sprite_pixels = bitmap.viewport.w = 320; + /* Update max sprite pixels per line*/ + max_sprite_pixels = 320; } else { @@ -1949,15 +1963,30 @@ static void vdp_reg_w(unsigned int r, unsigned int d, unsigned int cycles) /* Update clipping */ window_clip(reg[17], 0); - /* Update active display width & max sprite pixels per line*/ - max_sprite_pixels = bitmap.viewport.w = 256; + /* Update max sprite pixels per line*/ + max_sprite_pixels = 256; } - /* Active display width modified during HBLANK (Bugs Bunny Double Trouble) */ - if ((v_counter < bitmap.viewport.h) && (reg[1] & 0x40) && (cycles <= (mcycles_vdp + 860))) + if (v_counter >= bitmap.viewport.h) { - /* Redraw entire line */ - render_line(v_counter); + /* Active screen width modified during VBLANK will be applied on upcoming frame */ + bitmap.viewport.w = max_sprite_pixels; + } + else if ((v_counter == 0) && (cycles <= (mcycles_vdp + 860))) + { + /* Active screen width modified during first line HBLANK (Bugs Bunny in Double Trouble) */ + bitmap.viewport.w = max_sprite_pixels; + + /* Redraw first line */ + render_line(0); + } + else + { + /* Screen width changes during active display (Golden Axe 3 intro, Ultraverse Prime) */ + /* should be applied on next frame since backend rendered framebuffer width is fixed */ + /* and can not be modified mid-frame. This is not 100% accurate but games generally */ + /* do this where the screen is blanked so it is likely unnoticeable. */ + bitmap.viewport.changed |= 2; } } break; diff --git a/gx/gui/font.c b/gx/gui/font.c index 1b26d0e..8e34456 100644 --- a/gx/gui/font.c +++ b/gx/gui/font.c @@ -3,7 +3,7 @@ * * IPL font engine (using GX rendering) * - * Copyright Eke-Eke (2009-2015) + * Copyright Eke-Eke (2009-2016) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: @@ -52,6 +52,7 @@ typedef struct _yay0header { static u8 *fontImage; static u8 *fontTexture; +static GXTexObj fontTexObj; static void *ipl_fontarea; static sys_fontheader *fontHeader; static u8 font_size[256]; @@ -205,12 +206,7 @@ static void GetFontTexel(s32 c,void *image,s32 pos,s32 stride) static void DrawChar(unsigned char c, int xpos, int ypos, int size, GXColor color) { - /* reintialize texture object */ - GXTexObj texobj; - GX_InitTexObj(&texobj, fontTexture, fontHeader->cell_width, fontHeader->cell_height, GX_TF_I4, GX_CLAMP, GX_CLAMP, GX_FALSE); - GX_LoadTexObj(&texobj, GX_TEXMAP0); - - /* reinitialize font texture data */ + /* get font texture data */ memset(fontTexture,0,fontHeader->cell_width * fontHeader->cell_height / 2); GetFontTexel(c,fontTexture,0,fontHeader->cell_width/2); DCStoreRange(fontTexture, fontHeader->cell_width * fontHeader->cell_height / 2); @@ -290,6 +286,9 @@ int FONT_Init(void) return 0; } + /* initialize texture object */ + GX_InitTexObj(&fontTexObj, fontTexture, fontHeader->cell_width, fontHeader->cell_height, GX_TF_I4, GX_CLAMP, GX_CLAMP, GX_FALSE); + return 1; } @@ -305,6 +304,8 @@ int FONT_write(char *string, int size, int x, int y, int max_width, GXColor colo { int w, ox; + GX_LoadTexObj(&fontTexObj, GX_TEXMAP0); + x -= (vmode->fbWidth / 2); y -= (vmode->efbHeight / 2); @@ -336,6 +337,8 @@ int FONT_writeCenter(char *string, int size, int x1, int x2, int y, GXColor colo int i = 0; int w = 0; + GX_LoadTexObj(&fontTexObj, GX_TEXMAP0); + while (string[i] && (string[i] != '\n')) { w += (font_size[(u8)string[i++]] * size * vmode->fbWidth) / (fontHeader->cell_height * vmode->viWidth); @@ -370,6 +373,8 @@ int FONT_alignRight(char *string, int size, int x, int y, GXColor color) int i = 0; int w = 0; + GX_LoadTexObj(&fontTexObj, GX_TEXMAP0); + while (string[i] && (string[i] != '\n')) { w += (font_size[(u8)string[i++]] * size * vmode->fbWidth) / (fontHeader->cell_height * vmode->viWidth); diff --git a/gx/gui/font.h b/gx/gui/font.h index 3d0eb21..c9ea91e 100644 --- a/gx/gui/font.h +++ b/gx/gui/font.h @@ -3,7 +3,7 @@ * * IPL font engine (using GX rendering) * - * Copyright Eke-Eke (2009-2015) + * Copyright Eke-Eke (2009-2016) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: diff --git a/gx/gx_video.c b/gx/gx_video.c index 95179e0..93186ef 100644 --- a/gx/gx_video.c +++ b/gx/gx_video.c @@ -3,7 +3,7 @@ * * Genesis Plus GX video & rendering support * - * Copyright Eke-Eke (2007-2015), based on original work from Softdev (2006) + * Copyright Eke-Eke (2007-2016), based on original work from Softdev (2006) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: @@ -77,6 +77,7 @@ static u8 gp_fifo[GX_FIFO_MINSIZE] ATTRIBUTE_ALIGN(32); static u32 vwidth, vheight; static gx_texture *crosshair[2]; static gx_texture *cd_leds[2][2]; +static GXTexObj screenTexObj; /*** Framebuffers ***/ static u32 *xfb; @@ -342,7 +343,7 @@ static camera cam = }; /*** GX Display List ***/ -static u8 d_list[32] ATTRIBUTE_ALIGN(32) = +static u8 screenDisplayList[32] ATTRIBUTE_ALIGN(32) = { GX_QUADS | GX_VTXFMT0, /* textured quad rendering (Vertex Format 0) */ 0x00, 0x04, /* one quad = 4x vertex */ @@ -434,9 +435,6 @@ static void gxStart(void) guLookAt(view, &cam.pos, &cam.up, &cam.view); GX_LoadPosMtxImm(view, GX_PNMTX0); GX_Flush(); - - /* GX rendering callback */ - GX_SetDrawDoneCallback(gx_callback); } /* Reset GX rendering */ @@ -462,6 +460,9 @@ static void gxResetRendering(u8 type) GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0); GX_SetNumTexGens(1); GX_SetNumChans(1); + + /* disable GX rendering callback */ + GX_SetDrawDoneCallback(NULL); } else { @@ -480,6 +481,9 @@ static void gxResetRendering(u8 type) GX_SetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLORNULL); GX_SetNumTexGens(1); GX_SetNumChans(0); + + /* enable GX rendering callback */ + GX_SetDrawDoneCallback(gx_callback); } GX_Flush(); @@ -704,10 +708,7 @@ static void gxDrawCrosshair(gx_texture *texture, int x, int y) y = (((y + bitmap.viewport.y) * ywidth) / (bitmap.viewport.h+2*bitmap.viewport.y)) + square[7] - h/2; /* load texture object */ - GXTexObj texObj; - GX_InitTexObj(&texObj, texture->data, texture->width, texture->height, GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE); - GX_InitTexObjLOD(&texObj,GX_LINEAR,GX_LIN_MIP_LIN,0.0,10.0,0.0,GX_FALSE,GX_TRUE,GX_ANISO_4); - GX_LoadTexObj(&texObj, GX_TEXMAP0); + GX_LoadTexObj(&texture->texObj, GX_TEXMAP0); GX_InvalidateTexAll(); /* Draw textured quad */ @@ -746,10 +747,7 @@ static void gxDrawCdLeds(gx_texture *texture_l, gx_texture *texture_r) int y = (((bitmap.viewport.y + bitmap.viewport.h - 4) * ywidth) / vheight) + square[7] - h; /* load left screen texture */ - GXTexObj texObj; - GX_InitTexObj(&texObj, texture_l->data, texture_l->width, texture_l->height, GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE); - GX_InitTexObjLOD(&texObj,GX_LINEAR,GX_LIN_MIP_LIN,0.0,10.0,0.0,GX_FALSE,GX_TRUE,GX_ANISO_4); - GX_LoadTexObj(&texObj, GX_TEXMAP0); + GX_LoadTexObj(&texture_l->texObj, GX_TEXMAP0); GX_InvalidateTexAll(); /* Draw textured quad */ @@ -769,9 +767,7 @@ static void gxDrawCdLeds(gx_texture *texture_l, gx_texture *texture_r) GX_End(); /* load right screen texture */ - GX_InitTexObj(&texObj, texture_r->data, texture_r->width, texture_r->height, GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE); - GX_InitTexObjLOD(&texObj,GX_LINEAR,GX_LIN_MIP_LIN,0.0,10.0,0.0,GX_FALSE,GX_TRUE,GX_ANISO_4); - GX_LoadTexObj(&texObj, GX_TEXMAP0); + GX_LoadTexObj(&texture_r->texObj, GX_TEXMAP0); GX_InvalidateTexAll(); /* Draw textured quad */ @@ -839,10 +835,7 @@ void gxDrawTexture(gx_texture *texture, s32 x, s32 y, s32 w, s32 h, u8 alpha) if (texture->data) { /* load texture object */ - GXTexObj texObj; - GX_InitTexObj(&texObj, texture->data, texture->width, texture->height, GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE); - GX_InitTexObjLOD(&texObj,GX_LINEAR,GX_LIN_MIP_LIN,0.0,10.0,0.0,GX_FALSE,GX_TRUE,GX_ANISO_4); /* does this really change anything ? */ - GX_LoadTexObj(&texObj, GX_TEXMAP0); + GX_LoadTexObj(&texture->texObj, GX_TEXMAP0); GX_InvalidateTexAll(); /* vertex coordinate */ @@ -874,10 +867,7 @@ void gxDrawTextureRotate(gx_texture *texture, s32 x, s32 y, s32 w, s32 h, f32 an if (texture->data) { /* load texture object */ - GXTexObj texObj; - GX_InitTexObj(&texObj, texture->data, texture->width, texture->height, GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE); - GX_InitTexObjLOD(&texObj,GX_LINEAR,GX_LIN_MIP_LIN,0.0,10.0,0.0,GX_FALSE,GX_TRUE,GX_ANISO_4); - GX_LoadTexObj(&texObj, GX_TEXMAP0); + GX_LoadTexObj(&texture->texObj, GX_TEXMAP0); GX_InvalidateTexAll(); /* vertex coordinate */ @@ -961,9 +951,7 @@ void gxDrawScreenshot(u8 alpha) if (!rmode) return; /* get current game screen texture */ - GXTexObj texobj; - GX_InitTexObj(&texobj, bitmap.data, vwidth, vheight, GX_TF_RGB565, GX_CLAMP, GX_CLAMP, GX_FALSE); - GX_LoadTexObj(&texobj, GX_TEXMAP0); + GX_LoadTexObj(&screenTexObj, GX_TEXMAP0); GX_InvalidateTexAll(); /* get current aspect ratio */ @@ -1010,9 +998,7 @@ void gxDrawScreenshot(u8 alpha) void gxCopyScreenshot(gx_texture *texture) { /* retrieve gamescreen texture */ - GXTexObj texobj; - GX_InitTexObj(&texobj, bitmap.data, vwidth, vheight, GX_TF_RGB565, GX_CLAMP, GX_CLAMP, GX_FALSE); - GX_LoadTexObj(&texobj, GX_TEXMAP0); + GX_LoadTexObj(&screenTexObj, GX_TEXMAP0); GX_InvalidateTexAll(); /* scale texture to EFB width */ @@ -1054,7 +1040,7 @@ void gxCopyScreenshot(gx_texture *texture) /* GX_PixModeSync is only useful if GX_ command follows */ /* we use dummy GX commands to stall CPU execution */ GX_PixModeSync(); - GX_LoadTexObj(&texobj, GX_TEXMAP0); + GX_LoadTexObj(&screenTexObj, GX_TEXMAP0); GX_InvalidateTexAll(); GX_Flush(); DCStoreRange(texture->data, texture->width * texture->height * 4); @@ -1228,7 +1214,7 @@ gx_texture *gxTextureOpenPNG(const u8 *png_data, FILE *png_file) png_destroy_read_struct(&png_ptr, &info_ptr, NULL); free(row_pointers); - /* initialize texture */ + /* allocate texture */ gx_texture *texture = (gx_texture *)memalign(32, sizeof(gx_texture)); if (!texture) { @@ -1236,7 +1222,7 @@ gx_texture *gxTextureOpenPNG(const u8 *png_data, FILE *png_file) return NULL; } - /* initialize texture data */ + /* allocate texture data */ texture->data = memalign(32, stride * height); if (!texture->data) { @@ -1245,11 +1231,15 @@ gx_texture *gxTextureOpenPNG(const u8 *png_data, FILE *png_file) return NULL; } + /* initialize texture */ memset(texture->data, 0, stride * height); texture->width = width; texture->height = height; texture->format = GX_TF_RGBA8; + /* initialize GX texture object */ + GX_InitTexObj(&texture->texObj, texture->data, width, height, GX_TF_RGBA8, GX_CLAMP, GX_CLAMP, GX_FALSE); + /*GX_InitTexObjLOD(&texture->texObj,GX_LINEAR,GX_LIN_MIP_LIN,0.0,10.0,0.0,GX_FALSE,GX_TRUE,GX_ANISO_4);*/ /* encode to GX_TF_RGBA8 format (4x4 pixels paired titles) */ u16 *dst_ar = (u16 *)(texture->data); u16 *dst_gb = (u16 *)(texture->data + 32); @@ -1732,17 +1722,16 @@ int gx_video_Update(int status) } /* initialize texture object */ - GXTexObj texobj; - GX_InitTexObj(&texobj, bitmap.data, vwidth, vheight, GX_TF_RGB565, GX_CLAMP, GX_CLAMP, GX_FALSE); + GX_InitTexObj(&screenTexObj, bitmap.data, vwidth, vheight, GX_TF_RGB565, GX_CLAMP, GX_CLAMP, GX_FALSE); /* configure texture filtering */ if (!config.bilinear) { - GX_InitTexObjLOD(&texobj,GX_NEAR,GX_NEAR_MIP_NEAR,0.0,10.0,0.0,GX_FALSE,GX_FALSE,GX_ANISO_1); + GX_InitTexObjLOD(&screenTexObj,GX_NEAR,GX_NEAR_MIP_NEAR,0.0,10.0,0.0,GX_FALSE,GX_FALSE,GX_ANISO_1); } /* load texture object */ - GX_LoadTexObj(&texobj, GX_TEXMAP0); + GX_LoadTexObj(&screenTexObj, GX_TEXMAP0); /* update rendering mode */ if (config.render) @@ -1775,7 +1764,7 @@ int gx_video_Update(int status) drawDone = 0; /* render textured quad */ - GX_CallDispList(d_list, 32); + GX_CallDispList(screenDisplayList, 32); /* on-screen display */ if (osd) @@ -1838,14 +1827,7 @@ int gx_video_Update(int status) } /* restore texture object */ - GXTexObj texobj; - GX_InitTexObj(&texobj, bitmap.data, vwidth, vheight, GX_TF_RGB565, GX_CLAMP, GX_CLAMP, GX_FALSE); - if (!config.bilinear) - { - GX_InitTexObjLOD(&texobj,GX_NEAR,GX_NEAR_MIP_NEAR,0.0,10.0,0.0,GX_FALSE,GX_FALSE,GX_ANISO_1); - } - GX_LoadTexObj(&texobj, GX_TEXMAP0); - GX_InvalidateTexAll(); + GX_LoadTexObj(&screenTexObj, GX_TEXMAP0); /* restore GX rendering */ gxResetRendering(0); diff --git a/gx/gx_video.h b/gx/gx_video.h index 60922bb..956096e 100644 --- a/gx/gx_video.h +++ b/gx/gx_video.h @@ -3,7 +3,7 @@ * * Genesis Plus GX video support * - * Copyright Eke-Eke (2007-2015), based on original work from Softdev (2006) + * Copyright Eke-Eke (2007-2016), based on original work from Softdev (2006) * * Redistribution and use of this code or any derivative works are permitted * provided that the following conditions are met: @@ -84,6 +84,7 @@ /* image texture */ typedef struct { + GXTexObj texObj; u8 *data; u16 width; u16 height;