Use volatile read/writes for GAL threading (#4327)

This commit is contained in:
riperiperi 2023-01-21 19:49:55 +00:00 committed by GitHub
parent 6adf15e479
commit 423dbc8888
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -135,7 +135,7 @@ namespace Ryujinx.Graphics.GAL.Multithreading
// The other thread can only increase the command count. // The other thread can only increase the command count.
// We can assume that if it is above 0, it will stay there or get higher. // We can assume that if it is above 0, it will stay there or get higher.
while (_commandCount > 0 && Volatile.Read(ref _interruptAction) == null) while (Volatile.Read(ref _commandCount) > 0 && Volatile.Read(ref _interruptAction) == null)
{ {
int commandPtr = _consumerPtr; int commandPtr = _consumerPtr;
@ -169,7 +169,7 @@ namespace Ryujinx.Graphics.GAL.Multithreading
internal ref T New<T>() where T : struct internal ref T New<T>() where T : struct
{ {
while (_producerPtr == (_consumerPtr + QueueCount - 1) % QueueCount) while (_producerPtr == (Volatile.Read(ref _consumerPtr) + QueueCount - 1) % QueueCount)
{ {
// If incrementing the producer pointer would overflow, we need to wait. // If incrementing the producer pointer would overflow, we need to wait.
// _consumerPtr can only move forward, so there's no race to worry about here. // _consumerPtr can only move forward, so there's no race to worry about here.