Skip to content

Commit 0e11a30

Browse files
authored
Merge pull request #15 from squidbus/pixel-dirty
Restore pixel constants dirty state handling.
2 parents 7c02de6 + d0447d5 commit 0e11a30

1 file changed

Lines changed: 24 additions & 11 deletions

File tree

MarathonRecomp/gpu/video.cpp

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4313,8 +4313,8 @@ static void FlushRenderStateForMainThread(GuestDevice* device, LocalRenderComman
43134313
dirtyFlags = device->dirtyFlags[1].get();
43144314
if (dirtyFlags != 0)
43154315
{
4316-
int startRegister = std::min(56, std::countr_zero(dirtyFlags));
4317-
int endRegister = std::min(56, 64 - std::countl_zero(dirtyFlags));
4316+
int startRegister = std::countl_zero(dirtyFlags);
4317+
int endRegister = std::min(56, 64 - std::countr_zero(dirtyFlags));
43184318

43194319
uint32_t index = startRegister * 16;
43204320
uint32_t size = (endRegister - startRegister) * 64;
@@ -8066,18 +8066,31 @@ int D3DDevice_EndTiling(GuestDevice* device, uint32_t flags, Rect* pResolveRects
80668066
}
80678067

80688068
GUEST_FUNCTION_HOOK(sub_82559480, D3DDevice_EndTiling);
8069-
static uint32_t g_ringBuffer;
8070-
// It's actually easier to return a buffer here than to implement BeginShaderConstantF4, then BeginShaderConstantF4 will do all the work for us and it seems fast enough on modern hardware
8071-
uint32_t BeginRingBig(GuestDevice* device, int32_t count) {
8072-
if (!g_ringBuffer) {
8073-
g_ringBuffer = g_memory.MapVirtual(g_userHeap.AllocPhysical((size_t)0x1000, 16));
8069+
8070+
int D3DDevice_BeginShaderConstantF4(GuestDevice* device, uint32_t isPixelShader, uint32_t startRegister, be<uint32_t>* cachedConstantData, be<uint32_t>* writeCombinedConstantData, uint32_t vectorCount) {
8071+
uint32_t* constants;
8072+
be<uint64_t>* dirtyFlags;
8073+
if (isPixelShader) {
8074+
constants = &device->pixelShaderFloatConstants[startRegister * 4];
8075+
dirtyFlags = &device->dirtyFlags[1];
8076+
} else {
8077+
constants = &device->vertexShaderFloatConstants[startRegister * 4];
8078+
dirtyFlags = &device->dirtyFlags[0];
80748079
}
8075-
device->dirtyFlags[0] = ~0ull; // copy all
8076-
device->dirtyFlags[1] = ~0ull;
8077-
return g_ringBuffer;
8080+
8081+
const uint32_t addr = g_memory.MapVirtual(constants);
8082+
*cachedConstantData = addr;
8083+
*writeCombinedConstantData = addr;
8084+
8085+
const uint32_t startBit = startRegister >> 2;
8086+
const uint32_t endBit = (startRegister + vectorCount - 1) >> 2;
8087+
const uint64_t dirtyFlag = ~0ull << startBit >> startBit >> (63 - endBit) << (63 - endBit);
8088+
*dirtyFlags = dirtyFlags->get() | dirtyFlag;
8089+
8090+
return 0;
80788091
}
80798092

8080-
GUEST_FUNCTION_HOOK(sub_8253E260, BeginRingBig);
8093+
GUEST_FUNCTION_HOOK(sub_825466E8, D3DDevice_BeginShaderConstantF4);
80818094

80828095
GUEST_FUNCTION_STUB(sub_8254D598); // BeginConditional
80838096
GUEST_FUNCTION_STUB(sub_8254D7B0); // BeginConditional

0 commit comments

Comments
 (0)