Removed second texture list in D3D (needed to check for GC disposal of CTexture)

This commit is contained in:
Flamefire committed 2013-05-10 15:23:12 +02:00
1 parent 2ca2af6ea6
commit 5587a322be
2 files changed
+48 -58

No files matched your search

+32 -53
View File
@@ -51,10 +51,9 @@ namespace Vocaluxe.Lib.Draw
private Size _OldSize;
private Size _SizeBeforeMinimize;
private readonly Dictionary<int, CTexture> _Textures;
private readonly Dictionary<int, Texture> _D3DTextures;
private readonly List<STextureQueue> _Queue;
private readonly Queue<int> _IDs;
private readonly Dictionary<int, Texture> _D3DTextures = new Dictionary<int, Texture>();
private readonly List<STextureQueue> _Queue = new List<STextureQueue>();
private readonly Queue<int> _IDs = new Queue<int>();
private readonly Object _MutexTexture = new Object();
@@ -68,9 +67,9 @@ namespace Vocaluxe.Lib.Draw
private CTexture _BlankTexture;
private readonly Queue<STexturedColoredVertex> _Vertices;
private readonly Queue<Texture> _VerticesTextures;
private readonly Queue<SlimDX.Matrix> _VerticesRotationMatrices;
private readonly Queue<STexturedColoredVertex> _Vertices = new Queue<STexturedColoredVertex>();
private readonly Queue<Texture> _VerticesTextures = new Queue<Texture>();
private readonly Queue<SlimDX.Matrix> _VerticesRotationMatrices = new Queue<SlimDX.Matrix>();
private readonly bool _NonPowerOf2TextureSupported;
#endregion private vars
@@ -81,19 +80,11 @@ namespace Vocaluxe.Lib.Draw
public CDirect3D()
{
Icon = new Icon(Path.Combine(Environment.CurrentDirectory, CSettings.Icon));
_Textures = new Dictionary<int, CTexture>();
_D3DTextures = new Dictionary<int, Texture>();
_Queue = new List<STextureQueue>();
_IDs = new Queue<int>();
//Fill Queue with 100000 IDs
for (int i = 0; i < 100000; i++)
_IDs.Enqueue(i);
_Vertices = new Queue<STexturedColoredVertex>();
_VerticesTextures = new Queue<Texture>();
_VerticesRotationMatrices = new Queue<SlimDX.Matrix>();
_Keys = new CKeys();
try
{
@@ -691,7 +682,6 @@ namespace Vocaluxe.Lib.Draw
texture.Index = _IDs.Dequeue();
_D3DTextures.Add(texture.Index, tex);
_Textures[texture.Index] = texture;
return texture;
}
}
@@ -901,57 +891,55 @@ namespace Vocaluxe.Lib.Draw
private CTexture _AddTexture(CTexture texture, int w, byte[] data)
{
Texture t = _CreateTexture(texture, w, data);
Texture t = _CreateTexture(texture.W2, texture.H2, w, data);
lock (_MutexTexture)
{
_D3DTextures.Add(_IDs.Peek(), t);
texture.Index = _IDs.Dequeue();
_Textures[texture.Index] = texture;
_D3DTextures.Add(texture.Index, t);
}
return texture;
}
private Texture _CreateTexture(CTexture texture, int w, byte[] data)
private Texture _CreateTexture(int textureW, int textureH, int w, byte[] data)
{
//Create a new texture in the managed pool, which does not need to be recreated on a lost device
//because a copy of the texture is hold in the Ram
Texture t = null;
try
Texture t;
using (t = new Texture(_Device, textureW, textureH, 0, Usage.AutoGenerateMipMap, Format.A8R8G8B8, Pool.Managed))
_WriteDataToTexture(t, w, data);
return t;
}
private static void _WriteDataToTexture(Texture t, int w, byte[] data)
{
//Lock the texture and fill it with the data
DataRectangle rect = t.LockRectangle(0, LockFlags.Discard);
int rowWidth = 4 * w;
if (rowWidth == rect.Pitch)
rect.Data.Write(data, 0, data.Length);
else
{
t = new Texture(_Device, texture.W2, texture.H2, 0, Usage.AutoGenerateMipMap, Format.A8R8G8B8, Pool.Managed);
//Lock the texture and fill it with the data
DataRectangle rect = t.LockRectangle(0, LockFlags.Discard);
int rowWidth = 4 * w;
for (int i = 0; i + rowWidth <= data.Length; i += rowWidth)
{
rect.Data.Write(data, i, rowWidth);
//Go to next row
rect.Data.Position = rect.Data.Position - rowWidth + rect.Pitch;
}
t.UnlockRectangle(0);
}
catch (Exception)
{
if (t != null)
t.Dispose();
throw;
}
return t;
t.UnlockRectangle(0);
}
public CTexture EnqueueTexture(int w, int h, byte[] data)
{
CTexture texture = _GetNewTexture(w, h);
STextureQueue queue = new STextureQueue {Data = data, Height = h, Width = w};
lock (_MutexTexture)
{
_D3DTextures.Add(_IDs.Peek(), null);
texture.Index = _IDs.Dequeue();
queue.Index = texture.Index;
_D3DTextures.Add(texture.Index, null);
STextureQueue queue = new STextureQueue(texture.Index, texture.W2, texture.H2, w, h, data);
_Queue.Add(queue);
_Textures[texture.Index] = texture;
}
return texture;
}
@@ -978,15 +966,7 @@ namespace Vocaluxe.Lib.Draw
return false;
lock (_MutexTexture)
{
DataRectangle rect = _D3DTextures[texture.Index].LockRectangle(0, LockFlags.Discard);
int rowWidth = 4 * w;
for (int i = 0; i + rowWidth <= data.Length; i += rowWidth)
{
rect.Data.Write(data, i, rowWidth);
//Go to next row
rect.Data.Position = rect.Data.Position - rowWidth + rect.Pitch;
}
_D3DTextures[texture.Index].UnlockRectangle(0);
_WriteDataToTexture(_D3DTextures[texture.Index], w, data);
}
return true;
}
@@ -1011,7 +991,7 @@ namespace Vocaluxe.Lib.Draw
{
lock (_MutexTexture)
{
return texture != null && _Textures.ContainsKey(texture.Index);
return texture != null && _D3DTextures.ContainsKey(texture.Index);
}
}
@@ -1027,7 +1007,6 @@ namespace Vocaluxe.Lib.Draw
{
_D3DTextures[texture.Index].Dispose();
_D3DTextures.Remove(texture.Index);
_Textures.Remove(texture.Index);
_IDs.Enqueue(texture.Index);
}
}
@@ -1295,11 +1274,11 @@ namespace Vocaluxe.Lib.Draw
{
STextureQueue q = _Queue[0];
_Queue.RemoveAt(0);
CTexture texture;
if (!_Textures.TryGetValue(q.Index, out texture))
Texture t;
if (_D3DTextures.TryGetValue(q.Index, out t) && t != null)
continue;
Texture t = _CreateTexture(texture, q.Width, q.Data);
t = _CreateTexture(q.TextureWidth, q.TextureHeight, q.DataWidth, q.Data);
_D3DTextures[q.Index] = t;
}
}
@@ -1311,7 +1290,7 @@ namespace Vocaluxe.Lib.Draw
/// <returns>The amount of textures</returns>
public int GetTextureCount()
{
return _Textures.Count;
return _D3DTextures.Count;
}
#endregion Textures
+16 -5
View File
@@ -66,9 +66,21 @@ namespace Vocaluxe.Lib.Draw
struct STextureQueue
{
public int Index;
public int Width;
public int Height;
public int TextureWidth;
public int TextureHeight;
public int DataWidth;
public int DataHeight;
public byte[] Data;
public STextureQueue(int index, int textureWidth, int textureHeight, int dataWidth, int dataHeight, byte[] data)
{
Index = index;
TextureWidth = textureWidth;
TextureHeight = textureHeight;
DataWidth = dataWidth;
DataHeight = dataHeight;
Data = data;
}
}
class COpenGL : Form, IDraw
@@ -811,12 +823,11 @@ namespace Vocaluxe.Lib.Draw
public CTexture EnqueueTexture(int w, int h, byte[] data)
{
CTexture texture = _GetNewTexture(w, h);
STextureQueue queue = new STextureQueue {Data = data, Height = h, Width = w};
lock (_MutexTexture)
{
texture.Index = _IDs.Dequeue();
queue.Index = texture.Index;
STextureQueue queue = new STextureQueue(texture.Index, texture.W2, texture.H2, w, h, data);
_Queue.Add(queue);
_Textures[texture.Index] = texture;
}
@@ -1183,7 +1194,7 @@ namespace Vocaluxe.Lib.Draw
if (!_Textures.TryGetValue(q.Index, out texture))
continue;
_CreateTexture(texture, q.Width, q.Height, q.Data);
_CreateTexture(texture, q.DataWidth, q.DataHeight, q.Data);
}
}
}