Skip to content

Commit d0447d5

Browse files
committed
Replace BeginRingBig with D3DDevice_BeginShaderConstantF4.
1 parent 1c3bfc4 commit d0447d5

1 file changed

Lines changed: 22 additions & 9 deletions

File tree

MarathonRecomp/gpu/video.cpp

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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] = ~0xFFull;
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)