@@ -8066,18 +8066,31 @@ int D3DDevice_EndTiling(GuestDevice* device, uint32_t flags, Rect* pResolveRects
80668066}
80678067
80688068GUEST_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
80828095GUEST_FUNCTION_STUB (sub_8254D598); // BeginConditional
80838096GUEST_FUNCTION_STUB (sub_8254D7B0); // BeginConditional
0 commit comments