Merge pull request #11612 from unknownbrackets/cullmode

GPU: Properly flip cull on simple triangle lists
This commit is contained in:
Henrik Rydgård 2018-11-30 07:26:40 +01:00 committed by GitHub
commit 3531284623
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 1 deletions

View File

@ -218,7 +218,7 @@ void IndexGenerator::TranslateList(int numInds, const ITypeLE *inds, int indexOf
indexOffset = index_ - indexOffset;
// We only bother doing this minor optimization in triangle list, since it's by far the most
// common operation that can benefit.
if (sizeof(ITypeLE) == sizeof(inds_[0]) && indexOffset == 0) {
if (sizeof(ITypeLE) == sizeof(inds_[0]) && indexOffset == 0 && clockwise) {
memcpy(inds_, inds, numInds * sizeof(ITypeLE));
inds_ += numInds;
count_ += numInds;

View File

@ -1627,8 +1627,13 @@ void GPUCommon::Execute_Prim(u32 op, u32 diff) {
break;
}
case GE_CMD_VADDR:
gstate.cmdmem[data >> 24] = data;
gstate_c.vertexAddr = gstate_c.getRelativeAddress(data & 0x00FFFFFF);
break;
case GE_CMD_IADDR:
gstate.cmdmem[data >> 24] = data;
gstate_c.indexAddr = gstate_c.getRelativeAddress(data & 0x00FFFFFF);
break;
case GE_CMD_OFFSETADDR:
gstate.cmdmem[GE_CMD_OFFSETADDR] = data;
gstate_c.offsetAddr = data << 8;
@ -1646,8 +1651,10 @@ void GPUCommon::Execute_Prim(u32 op, u32 diff) {
// flip face by indices for triangles
cullMode = data & 1;
break;
case GE_CMD_TEXFLUSH:
case GE_CMD_NOP:
case GE_CMD_NOP_FF:
gstate.cmdmem[data >> 24] = data;
break;
case GE_CMD_BONEMATRIXNUMBER:
gstate.cmdmem[GE_CMD_BONEMATRIXNUMBER] = data;
@ -1690,6 +1697,12 @@ void GPUCommon::Execute_Prim(u32 op, u32 diff) {
break;
}
case GE_CMD_TEXBUFWIDTH0:
case GE_CMD_TEXADDR0:
if (data != gstate.cmdmem[data >> 24])
goto bail;
break;
default:
// All other commands might need a flush or something, stop this inner loop.
goto bail;