Workaround for 86box dynarec design allowing the riva to overwrite old graphics objects.

This commit is contained in:
starfrost013
2025-03-11 17:56:25 +00:00
parent 255aea8e4d
commit ca6a7c4f37
3 changed files with 22 additions and 3 deletions

View File

@@ -127,7 +127,14 @@ uint32_t nv3_mmio_read32(uint32_t addr, void* priv)
}
return nv3_mmio_arbitrate_read(addr);
ret = nv3_mmio_arbitrate_read(addr);
// This may get around the riva shredding its own cache
//nv3_pfifo_cache0_pull();
//nv3_pfifo_cache1_pull();
return ret;
}
// Write 8-bit MMIO
@@ -206,6 +213,10 @@ void nv3_mmio_write32(uint32_t addr, uint32_t val, void* priv)
}
nv3_mmio_arbitrate_write(addr, val);
// This may get around the riva shredding its own cache
//nv3_pfifo_cache0_pull();
//nv3_pfifo_cache1_pull();
}
// PCI stuff

View File

@@ -267,7 +267,7 @@ uint32_t nv3_pfifo_read(uint32_t address)
break;
/* Cache1 is handled below */
/* Cache1 is handled below - cache0 only has one entry */
case NV3_PFIFO_CACHE0_CTX:
ret = nv3->pfifo.cache0_settings.context[0];
break;
@@ -293,7 +293,7 @@ uint32_t nv3_pfifo_read(uint32_t address)
{
nv_log("PFIFO Cache0 Read\n");
if (address & 4)
if (address & 4)
return nv3->pfifo.cache0_entry.data;
else
return nv3->pfifo.cache0_entry.method | (nv3->pfifo.cache0_entry.subchannel << NV3_PFIFO_CACHE1_METHOD_SUBCHANNEL);
@@ -545,8 +545,12 @@ void nv3_pfifo_write(uint32_t address, uint32_t val)
}
else if (address >= NV3_PFIFO_CACHE0_METHOD_START && address <= NV3_PFIFO_CACHE0_METHOD_END)
{
// 3104 always written after 3100
if (address & 4)
{
nv3->pfifo.cache0_entry.data = val;
nv3_pfifo_cache0_pull(); // immediately pull out
}
else
nv3->pfifo.cache0_entry.method = (val & 0x1FFC);
nv3->pfifo.cache0_entry.subchannel = (val >> NV3_PFIFO_CACHE1_METHOD_SUBCHANNEL) & 0x07;

View File

@@ -66,4 +66,8 @@ uint32_t nv3_user_read(uint32_t address)
void nv3_user_write(uint32_t address, uint32_t value)
{
nv3_pfifo_cache1_push(address, value);
// This isn't ideal, but otherwise, the dynarec causes the GPU to write so many objects into CACHE1, it starts overwriting the old objects
// This basically makes the fifo not a fifo, but oh well
nv3_pfifo_cache1_pull();
}