aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Vulkan/BufferUsageBitmap.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Graphics.Vulkan/BufferUsageBitmap.cs')
-rw-r--r--src/Ryujinx.Graphics.Vulkan/BufferUsageBitmap.cs19
1 files changed, 12 insertions, 7 deletions
diff --git a/src/Ryujinx.Graphics.Vulkan/BufferUsageBitmap.cs b/src/Ryujinx.Graphics.Vulkan/BufferUsageBitmap.cs
index a8ff7c28..19dcaccd 100644
--- a/src/Ryujinx.Graphics.Vulkan/BufferUsageBitmap.cs
+++ b/src/Ryujinx.Graphics.Vulkan/BufferUsageBitmap.cs
@@ -6,6 +6,7 @@
private readonly int _size;
private readonly int _granularity;
private readonly int _bits;
+ private readonly int _writeBitOffset;
private readonly int _intsPerCb;
private readonly int _bitsPerCb;
@@ -14,7 +15,11 @@
{
_size = size;
_granularity = granularity;
- _bits = (size + (granularity - 1)) / granularity;
+
+ // There are two sets of bits - one for read tracking, and the other for write.
+ int bits = (size + (granularity - 1)) / granularity;
+ _writeBitOffset = bits;
+ _bits = bits << 1;
_intsPerCb = (_bits + (BitMap.IntSize - 1)) / BitMap.IntSize;
_bitsPerCb = _intsPerCb * BitMap.IntSize;
@@ -22,7 +27,7 @@
_bitmap = new BitMap(_bitsPerCb * CommandBufferPool.MaxCommandBuffers);
}
- public void Add(int cbIndex, int offset, int size)
+ public void Add(int cbIndex, int offset, int size, bool write)
{
if (size == 0)
{
@@ -35,32 +40,32 @@
size = _size - offset;
}
- int cbBase = cbIndex * _bitsPerCb;
+ int cbBase = cbIndex * _bitsPerCb + (write ? _writeBitOffset : 0);
int start = cbBase + offset / _granularity;
int end = cbBase + (offset + size - 1) / _granularity;
_bitmap.SetRange(start, end);
}
- public bool OverlapsWith(int cbIndex, int offset, int size)
+ public bool OverlapsWith(int cbIndex, int offset, int size, bool write = false)
{
if (size == 0)
{
return false;
}
- int cbBase = cbIndex * _bitsPerCb;
+ int cbBase = cbIndex * _bitsPerCb + (write ? _writeBitOffset : 0);
int start = cbBase + offset / _granularity;
int end = cbBase + (offset + size - 1) / _granularity;
return _bitmap.IsSet(start, end);
}
- public bool OverlapsWith(int offset, int size)
+ public bool OverlapsWith(int offset, int size, bool write)
{
for (int i = 0; i < CommandBufferPool.MaxCommandBuffers; i++)
{
- if (OverlapsWith(i, offset, size))
+ if (OverlapsWith(i, offset, size, write))
{
return true;
}