@@ -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
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 ] = ~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
80828095GUEST_FUNCTION_STUB (sub_8254D598); // BeginConditional
80838096GUEST_FUNCTION_STUB (sub_8254D7B0); // BeginConditional
0 commit comments