Use FB_R_SOF2 only to detect direct FB writes

Fixes flashing video in Virtua Fighter 3tb
This commit is contained in:
Flyinghead 2019-05-19 19:45:05 +02:00
parent 74844c8940
commit 05f461c3c5
3 changed files with 8 additions and 18 deletions

View File

@ -88,10 +88,8 @@ cResetEvent rs, re;
int max_idx,max_mvo,max_op,max_pt,max_tr,max_vtx,max_modt, ovrn;
static bool render_called = false;
u32 fb1_watch_addr_start;
u32 fb1_watch_addr_end;
u32 fb2_watch_addr_start;
u32 fb2_watch_addr_end;
u32 fb_watch_addr_start;
u32 fb_watch_addr_end;
bool fb_dirty;
TA_context* _pvrrc;
@ -558,10 +556,8 @@ void rend_vblank()
void check_framebuffer_write()
{
u32 fb_size = (FB_R_SIZE.fb_y_size + 1) * (FB_R_SIZE.fb_x_size + FB_R_SIZE.fb_modulus) * 4;
fb1_watch_addr_start = FB_R_SOF1 & VRAM_MASK;
fb1_watch_addr_end = fb1_watch_addr_start + fb_size;
fb2_watch_addr_start = FB_R_SOF2 & VRAM_MASK;
fb2_watch_addr_end = fb2_watch_addr_start + fb_size;
fb_watch_addr_start = FB_R_SOF2 & VRAM_MASK;
fb_watch_addr_end = fb_watch_addr_start + fb_size;
}
void rend_cancel_emu_wait()

View File

@ -61,10 +61,8 @@ Renderer* rend_GL4();
Renderer* rend_norend();
Renderer* rend_softrend();
extern u32 fb1_watch_addr_start;
extern u32 fb1_watch_addr_end;
extern u32 fb2_watch_addr_start;
extern u32 fb2_watch_addr_end;
extern u32 fb_watch_addr_start;
extern u32 fb_watch_addr_end;
extern bool fb_dirty;
void check_framebuffer_write();

View File

@ -233,9 +233,7 @@ void DYNACALL pvr_write_area1_8(u32 addr,u8 data)
void DYNACALL pvr_write_area1_16(u32 addr,u16 data)
{
u32 vaddr = addr & VRAM_MASK;
if (!fb_dirty
&& ((vaddr >= fb1_watch_addr_start && vaddr < fb1_watch_addr_end)
|| (vaddr >= fb2_watch_addr_start && vaddr < fb2_watch_addr_end)))
if (!fb_dirty && vaddr >= fb_watch_addr_start && vaddr < fb_watch_addr_end)
{
fb_dirty = true;
}
@ -244,9 +242,7 @@ void DYNACALL pvr_write_area1_16(u32 addr,u16 data)
void DYNACALL pvr_write_area1_32(u32 addr,u32 data)
{
u32 vaddr = addr & VRAM_MASK;
if (!fb_dirty
&& ((vaddr >= fb1_watch_addr_start && vaddr < fb1_watch_addr_end)
|| (vaddr >= fb2_watch_addr_start && vaddr < fb2_watch_addr_end)))
if (!fb_dirty && vaddr >= fb_watch_addr_start && vaddr < fb_watch_addr_end)
{
fb_dirty = true;
}