Merge branch 'master' of https://github.com/86Box/86Box.git into EngiNerd

This commit is contained in:
EngiNerd89
2021-01-23 19:03:36 +01:00
29 changed files with 2233 additions and 99 deletions

View File

@@ -514,6 +514,12 @@ static void voodoo_writel(uint32_t addr, uint32_t val, void *p)
if (voodoo->initEnable & 0x01)
{
voodoo->fbiInit0 = val;
thread_wait_mutex(voodoo->force_blit_mutex);
voodoo->can_blit = (voodoo->fbiInit0 & FBIINIT0_VGA_PASS) ? 1 : 0;
if (!voodoo->can_blit)
voodoo->force_blit_count = 0;
thread_release_mutex(voodoo->force_blit_mutex);
if (voodoo->set->nr_cards == 2)
svga_set_override(voodoo->svga, (voodoo->set->voodoos[0]->fbiInit0 | voodoo->set->voodoos[1]->fbiInit0) & 1);
else
@@ -877,6 +883,24 @@ static void voodoo_speed_changed(void *p)
// voodoo_log("Voodoo read_time=%i write_time=%i burst_time=%i %08x %08x\n", voodoo->read_time, voodoo->write_time, voodoo->burst_time, voodoo->fbiInit1, voodoo->fbiInit4);
}
static void voodoo_force_blit(void *p)
{
voodoo_set_t *voodoo_set = (voodoo_set_t *)p;
thread_wait_mutex(voodoo_set->voodoos[0]->force_blit_mutex);
if(voodoo_set->voodoos[0]->can_blit) {
voodoo_set->voodoos[0]->force_blit_count++;
}
thread_release_mutex(voodoo_set->voodoos[0]->force_blit_mutex);
if(voodoo_set->nr_cards == 2) {
thread_wait_mutex(voodoo_set->voodoos[1]->force_blit_mutex);
if(voodoo_set->voodoos[1]->can_blit) {
voodoo_set->voodoos[1]->force_blit_count++;
}
thread_release_mutex(voodoo_set->voodoos[1]->force_blit_mutex);
}
}
void *voodoo_card_init()
{
int c;
@@ -1014,6 +1038,10 @@ void *voodoo_card_init()
voodoo->disp_buffer = 0;
voodoo->draw_buffer = 1;
voodoo->force_blit_count = 0;
voodoo->can_blit = 0;
voodoo->force_blit_mutex = thread_create_mutex_with_spin_count(MUTEX_DEFAULT_SPIN_COUNT);
return voodoo;
}
@@ -1128,6 +1156,10 @@ void *voodoo_2d3d_card_init(int type)
voodoo->disp_buffer = 0;
voodoo->draw_buffer = 1;
voodoo->force_blit_count = 0;
voodoo->can_blit = 0;
voodoo->force_blit_mutex = thread_create_mutex_with_spin_count(MUTEX_DEFAULT_SPIN_COUNT);
return voodoo;
}
@@ -1241,6 +1273,9 @@ void voodoo_card_close(voodoo_t *voodoo)
free(voodoo->tex_mem[1]);
free(voodoo->tex_mem[0]);
}
thread_close_mutex(voodoo->force_blit_mutex);
free(voodoo);
}
@@ -1386,6 +1421,6 @@ const device_t voodoo_device =
NULL,
{ NULL },
voodoo_speed_changed,
NULL,
voodoo_force_blit,
voodoo_config
};

View File

@@ -645,7 +645,16 @@ skip_draw:
{
if (voodoo->line == voodoo->v_disp)
{
if (voodoo->dirty_line_high > voodoo->dirty_line_low)
int force_blit = 0;
thread_wait_mutex(voodoo->force_blit_mutex);
if(voodoo->force_blit_count) {
force_blit = 1;
if(--voodoo->force_blit_count < 0)
voodoo->force_blit_count = 0;
}
thread_release_mutex(voodoo->force_blit_mutex);
if (voodoo->dirty_line_high > voodoo->dirty_line_low || force_blit)
svga_doblit(0, voodoo->v_disp, voodoo->h_disp, voodoo->v_disp-1, voodoo->svga);
if (voodoo->clutData_dirty)
{