use data queque when loading cover

This commit is contained in:
Alexander Eckart committed 2012-03-14 22:26:20 +01:00
1 parent a78b61bbe7
commit 0d9033d21e
9 files changed
+237 -44

No files matched your search

+4 -2
View File
@@ -1008,7 +1008,7 @@ namespace Vocaluxe.Base
result = true;
reader.Read();
byte[] data = GetBytes(reader);
tex = CDraw.AddTexture(w, h, ref data);
tex = CDraw.QuequeTexture(w, h, ref data);
}
}
else
@@ -1053,7 +1053,7 @@ namespace Vocaluxe.Base
Graphics g = Graphics.FromImage(bmp);
g.DrawImage(origin, new Rectangle(0, 0, w, h));
g.Dispose();
tex = CDraw.AddTexture(bmp);
byte[] data = new byte[w * h * 4];
BitmapData bmp_data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
@@ -1061,6 +1061,8 @@ namespace Vocaluxe.Base
bmp.UnlockBits(bmp_data);
bmp.Dispose();
tex = CDraw.QuequeTexture(w, h, ref data);
command.CommandText = "INSERT INTO Cover (Path, width, height) " +
"VALUES (@path, " + w.ToString() + ", " + h.ToString() + ")";
command.Parameters.Add("@path", System.Data.DbType.String, 0).Value = CoverPath;
+5
View File
@@ -156,6 +156,11 @@ namespace Vocaluxe.Base
return _Draw.AddTexture(W, H, ref Data);
}
public static STexture QuequeTexture(int W, int H, ref byte[] Data)
{
return _Draw.QuequeTexture(W, H, ref Data);
}
public static bool UpdateTexture(ref STexture Texture, ref byte[] Data)
{
return _Draw.UpdateTexture(ref Texture, ref Data);
+1 -1
View File
@@ -133,7 +133,7 @@ namespace Vocaluxe.Base
sizeB = TextRenderer.MeasureText(g, chr.ToString(), fo, new Size(int.MaxValue, int.MaxValue), flags);
//size = g.MeasureString(chr.ToString(), fo);
float h_style = sizeB.Height;
g.Dispose();
return h_normal / h_style;
}
}
+21
View File
@@ -826,11 +826,32 @@ namespace Vocaluxe.Base
CLog.StopBenchmark(2, "Sort Songs");
Category = -1;
_SongsLoaded = true;
if (CConfig.Renderer == ERenderer.TR_CONFIG_OPENGL)
{
CLog.StartBenchmark(2, "Load Cover");
for (int i = 0; i < _Songs.Count; i++)
{
CSong song = _Songs[i];
song.ReadNotes();
STexture texture = song.CoverTextureSmall;
song.CoverTextureBig = texture;
_CoverLoadIndex++;
}
_CoverLoaded = true;
CDataBase.CommitCovers();
CLog.StopBenchmark(2, "Load Cover");
}
CLog.StopBenchmark(1, "Load Songs ");
}
public static void LoadCover(long WaitTime, int NumLoads)
{
if (CConfig.Renderer == ERenderer.TR_CONFIG_OPENGL)
return; //should be removed as soon as the other renderer are ready for queque
if (!SongsLoaded)
return;
+5
View File
@@ -625,6 +625,11 @@ namespace Vocaluxe.Lib.Draw
return AddTexture(W, H , ref PointerData);
}
public STexture QuequeTexture(int W, int H, ref byte[] Data)
{
return AddTexture(W, H, ref Data);
}
public STexture AddTexture(int W, int H, ref byte[] Data)
{
STexture texture = new STexture(-1);
+5
View File
@@ -400,6 +400,11 @@ namespace Vocaluxe.Lib.Draw
return new STexture(-1);
}
public STexture QuequeTexture(int W, int H, ref byte[] Data)
{
return AddTexture(W, H, ref Data);
}
public STexture AddTexture(int W, int H, ref byte[] Data)
{
Bitmap bmp = new Bitmap(W, H);
+189 -39
View File
@@ -18,14 +18,21 @@ using Vocaluxe.Menu;
namespace Vocaluxe.Lib.Draw
{
public struct SClientRect
struct SClientRect
{
public Point location;
public int width;
public int height;
};
struct STextureQueque
{
public int ID;
public int width;
public int height;
public byte[] data;
}
class COpenGL : Form, IDraw
{
#region private vars
@@ -40,14 +47,18 @@ namespace Vocaluxe.Lib.Draw
private bool _fullscreen = false;
private List<STexture> _Textures;
private List<int> _IDs;
private List<int> _GLList;
private List<STextureQueque> _Queque;
private Object MutexTexture = new Object();
private int h = 1;
private int w = 1;
private int y = 0;
private int x = 0;
private bool _UsePBO = true;
private bool _UsePBO = false;
#endregion private vars
@@ -57,6 +68,13 @@ namespace Vocaluxe.Lib.Draw
_Textures = new List<STexture>();
_GLList = new List<int>();
_Queque = new List<STextureQueque>();
_IDs = new List<int>();
for (int i = 1; i < 1000000; i++)
{
_IDs.Add(i);
}
//Check AA Mode
CConfig.AAMode = (EAntiAliasingModes)CheckAntiAliasingMode((int)CConfig.AAMode);
@@ -454,6 +472,8 @@ namespace Vocaluxe.Lib.Draw
if ((CSettings.bFullScreen && !_fullscreen) || (!CSettings.bFullScreen && _fullscreen))
ToggleFullScreen();
CheckQueque();
if (CTime.IsRunning())
delay = (int)Math.Floor(CConfig.CalcCycleTime() - CTime.GetMilliseconds());
@@ -513,7 +533,7 @@ namespace Vocaluxe.Lib.Draw
int id = GL.GenTexture();
GL.BindTexture(TextureTarget.Texture2D, id);
texture.index = id;
texture.ID = id;
texture.width = w;
texture.height = h;
@@ -537,21 +557,27 @@ namespace Vocaluxe.Lib.Draw
// Add to Texture List
texture.color = new SColorF(1f, 1f, 1f, 1f);
texture.rect = new SRectF(0f, 0f, texture.width, texture.height, 0f);
_Textures.Add(texture);
lock (MutexTexture)
{
texture.index = _IDs[0];
_IDs.RemoveAt(0);
_Textures.Add(texture);
}
return texture;
}
public void CopyScreen(ref STexture Texture)
{
if (!_TextureExists(Texture) || (Texture.width != GetScreenWidth()) || (Texture.height != GetScreenHeight()))
if (!_TextureExists(ref Texture) || (Texture.width != GetScreenWidth()) || (Texture.height != GetScreenHeight()))
{
RemoveTexture(ref Texture);
Texture = CopyScreen();
}
else
{
GL.BindTexture(TextureTarget.Texture2D, Texture.index);
GL.BindTexture(TextureTarget.Texture2D, Texture.ID);
GL.CopyTexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, 0, 0,
(int)Texture.width, (int)Texture.height);
@@ -658,10 +684,6 @@ namespace Vocaluxe.Lib.Draw
if (bmp.Height == 0 || bmp.Width == 0)
return texture;
int id = GL.GenTexture();
GL.BindTexture(TextureTarget.Texture2D, id);
texture.index = id;
int MaxSize;
switch (CConfig.TextureQuality)
{
@@ -700,6 +722,10 @@ namespace Vocaluxe.Lib.Draw
h = MaxSize;
}
int id = GL.GenTexture();
GL.BindTexture(TextureTarget.Texture2D, id);
texture.ID = id;
texture.width = w;
texture.height = h;
@@ -711,7 +737,8 @@ namespace Vocaluxe.Lib.Draw
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.DrawImage(bmp, new Rectangle(0, 0, bmp2.Width, bmp2.Height));
g.Dispose();
texture.width_ratio = 1f;
texture.height_ratio = 1f;
@@ -742,6 +769,12 @@ namespace Vocaluxe.Lib.Draw
texture.color = new SColorF(1f, 1f, 1f, 1f);
texture.rect = new SRectF(0f, 0f, texture.width, texture.height, 0f);
texture.TexturePath = String.Empty;
lock (MutexTexture)
{
texture.index = _IDs[0];
_IDs.RemoveAt(0);
}
_Textures.Add(texture);
return texture;
@@ -768,7 +801,7 @@ namespace Vocaluxe.Lib.Draw
int id = GL.GenTexture();
GL.BindTexture(TextureTarget.Texture2D, id);
texture.index = id;
texture.ID = id;
texture.width = W;
texture.height = H;
@@ -801,6 +834,12 @@ namespace Vocaluxe.Lib.Draw
texture.color = new SColorF(1f, 1f, 1f, 1f);
texture.rect = new SRectF(0f, 0f, texture.width, texture.height, 0f);
texture.TexturePath = String.Empty;
lock (MutexTexture)
{
texture.index = _IDs[0];
_IDs.RemoveAt(0);
}
_Textures.Add(texture);
return texture;
@@ -828,7 +867,7 @@ namespace Vocaluxe.Lib.Draw
int id = GL.GenTexture();
GL.BindTexture(TextureTarget.Texture2D, id);
texture.index = id;
texture.ID = id;
texture.width = W;
texture.height = H;
@@ -861,14 +900,41 @@ namespace Vocaluxe.Lib.Draw
texture.color = new SColorF(1f, 1f, 1f, 1f);
texture.rect = new SRectF(0f, 0f, texture.width, texture.height, 0f);
texture.TexturePath = String.Empty;
lock (MutexTexture)
{
texture.index = _IDs[0];
_IDs.RemoveAt(0);
}
_Textures.Add(texture);
return texture;
}
public STexture QuequeTexture(int W, int H, ref byte[] Data)
{
STexture texture = new STexture(-1);
STextureQueque queque = new STextureQueque();
queque.data = Data;
queque.height = H;
queque.width = W;
lock (MutexTexture)
{
texture.index = _IDs[0];
_IDs.RemoveAt(0);
queque.ID = texture.index;
_Queque.Add(queque);
_Textures.Add(texture);
}
return texture;
}
public bool UpdateTexture(ref STexture Texture, IntPtr Data)
{
if (_TextureExists(Texture))
if (_TextureExists(ref Texture))
{
if (_UsePBO)
{
@@ -884,7 +950,7 @@ namespace Vocaluxe.Lib.Draw
GL.UnmapBuffer(BufferTarget.PixelUnpackBuffer);
GL.BindTexture(TextureTarget.Texture2D, Texture.index);
GL.BindTexture(TextureTarget.Texture2D, Texture.ID);
GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, (int)Texture.width, (int)Texture.height,
OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero);
@@ -899,7 +965,7 @@ namespace Vocaluxe.Lib.Draw
}
}
GL.BindTexture(TextureTarget.Texture2D, Texture.index);
GL.BindTexture(TextureTarget.Texture2D, Texture.ID);
GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, (int)Texture.width, (int)Texture.height,
OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, Data);
@@ -923,7 +989,7 @@ namespace Vocaluxe.Lib.Draw
public bool UpdateTexture(ref STexture Texture, ref byte[] Data)
{
if (_TextureExists(Texture))
if (_TextureExists(ref Texture))
{
if (_UsePBO)
{
@@ -936,7 +1002,7 @@ namespace Vocaluxe.Lib.Draw
GL.UnmapBuffer(BufferTarget.PixelUnpackBuffer);
GL.BindTexture(TextureTarget.Texture2D, Texture.index);
GL.BindTexture(TextureTarget.Texture2D, Texture.ID);
GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, (int)Texture.width, (int)Texture.height,
OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero);
@@ -952,7 +1018,7 @@ namespace Vocaluxe.Lib.Draw
}
}
GL.BindTexture(TextureTarget.Texture2D, Texture.index);
GL.BindTexture(TextureTarget.Texture2D, Texture.ID);
GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, (int)Texture.width, (int)Texture.height,
OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, Data);
@@ -978,30 +1044,41 @@ namespace Vocaluxe.Lib.Draw
{
if ((Texture.index > 0) && (_Textures.Count > 0))
{
for (int i = 0; i < _Textures.Count; i++)
{
if (_Textures[i].index == Texture.index)
lock (MutexTexture)
{
for (int i = 0; i < _Textures.Count; i++)
{
GL.DeleteTexture(Texture.index);
if (Texture.PBO > 0)
GL.DeleteBuffers(1, ref Texture.PBO);
_Textures.RemoveAt(i);
Texture.index = -1;
break;
if (_Textures[i].index == Texture.index)
{
_IDs.Add(Texture.index);
GL.DeleteTexture(Texture.ID);
if (Texture.PBO > 0)
GL.DeleteBuffers(1, ref Texture.PBO);
_Textures.RemoveAt(i);
Texture.index = -1;
Texture.ID = -1;
break;
}
}
}
}
}
private bool _TextureExists(STexture Texture)
private bool _TextureExists(ref STexture Texture)
{
if ((Texture.index > 0) && (_Textures.Count > 0))
lock (MutexTexture)
{
for (int i = 0; i < _Textures.Count; i++)
{
if (_Textures[i].index == Texture.index)
if (Texture.index == _Textures[i].index)
{
return true;
if (_Textures[i].ID > 0)
{
Texture = _Textures[i];
return true;
}
break;
}
}
}
@@ -1044,14 +1121,14 @@ namespace Vocaluxe.Lib.Draw
if (bounds.Y > rect.Y + rect.H || bounds.Y + bounds.H < rect.Y)
return;
if (_TextureExists(Texture))
if (_TextureExists(ref Texture))
{
int list = GL.GenLists(1);
_GLList.Add(list);
GL.NewList(list, ListMode.Compile);
{
GL.BindTexture(TextureTarget.Texture2D, Texture.index);
GL.BindTexture(TextureTarget.Texture2D, Texture.ID);
float x1 = (bounds.X - rect.X) / rect.W * Texture.width_ratio;
float x2 = (bounds.X + bounds.W - rect.X) / rect.W * Texture.width_ratio;
@@ -1149,14 +1226,14 @@ namespace Vocaluxe.Lib.Draw
public void DrawTexture(STexture Texture, SRectF rect, SColorF color, float begin, float end)
{
if (_TextureExists(Texture))
if (_TextureExists(ref Texture))
{
int list = GL.GenLists(1);
_GLList.Add(list);
GL.NewList(list, ListMode.Compile);
{
GL.BindTexture(TextureTarget.Texture2D, Texture.index);
GL.BindTexture(TextureTarget.Texture2D, Texture.ID);
GL.Enable(EnableCap.Blend);
GL.Color4(color.R, color.G, color.B, color.A * CGraphics.GlobalAlpha);
@@ -1200,14 +1277,14 @@ namespace Vocaluxe.Lib.Draw
if (height > bounds.H)
height = bounds.H;
if (_TextureExists(Texture))
if (_TextureExists(ref Texture))
{
int list = GL.GenLists(1);
_GLList.Add(list);
GL.NewList(list, ListMode.Compile);
{
GL.BindTexture(TextureTarget.Texture2D, Texture.index);
GL.BindTexture(TextureTarget.Texture2D, Texture.ID);
float x1 = (bounds.X - rect.X) / rect.W * Texture.width_ratio;
float x2 = (bounds.X + bounds.W - rect.X) / rect.W * Texture.width_ratio;
@@ -1291,6 +1368,79 @@ namespace Vocaluxe.Lib.Draw
{
return _Textures.Count;
}
private void CheckQueque()
{
lock (MutexTexture)
{
if (_Queque.Count == 0)
return;
STextureQueque q = _Queque[0];
STexture texture = new STexture(-1);
int index = -1;
for (int i = 0; i < _Textures.Count; i++)
{
if (_Textures[i].index == q.ID)
{
texture = _Textures[i];
index = i;
break;
}
}
if (texture.index < 1)
return;
if (_UsePBO)
{
try
{
GL.GenBuffers(1, out texture.PBO);
GL.BindBuffer(BufferTarget.PixelUnpackBuffer, texture.PBO);
GL.BufferData(BufferTarget.PixelUnpackBuffer, (IntPtr)q.data.Length, IntPtr.Zero, BufferUsageHint.StreamDraw);
GL.BindBuffer(BufferTarget.PixelUnpackBuffer, 0);
}
catch (Exception)
{
//throw;
_UsePBO = false;
}
}
int id = GL.GenTexture();
GL.BindTexture(TextureTarget.Texture2D, id);
texture.ID = id;
texture.width = q.width;
texture.height = q.height;
texture.w2 = (float)MathHelper.NextPowerOfTwo(texture.width);
texture.h2 = (float)MathHelper.NextPowerOfTwo(texture.height);
texture.width_ratio = texture.width / texture.w2;
texture.height_ratio = texture.height / texture.h2;
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, (int)texture.w2, (int)texture.h2, 0,
OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero);
GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, q.width, q.height,
OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, q.data);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
GL.BindTexture(TextureTarget.Texture2D, 0);
// Add to Texture List
texture.color = new SColorF(1f, 1f, 1f, 1f);
texture.rect = new SRectF(0f, 0f, texture.width, texture.height, 0f);
texture.TexturePath = String.Empty;
_Textures[index] = texture;
_Queque.RemoveAt(0);
}
}
#endregion Textures
#endregion implementation
+5 -2
View File
@@ -67,6 +67,7 @@ namespace Vocaluxe.Lib.Draw
{
public int index;
public int PBO;
public int ID;
public string TexturePath;
@@ -85,10 +86,11 @@ namespace Vocaluxe.Lib.Draw
{
index = Index;
PBO = 0;
ID = -1;
TexturePath = String.Empty;
width = 0f;
height = 0f;
width = 1f;
height = 1f;
rect = new SRectF(0f, 0f, 1f, 1f, 0f);
w2 = 2f;
@@ -136,6 +138,7 @@ namespace Vocaluxe.Lib.Draw
STexture AddTexture(Bitmap Bitmap);
STexture AddTexture(int W, int H, IntPtr Data);
STexture AddTexture(int W, int H, ref byte[] Data);
STexture QuequeTexture(int W, int H, ref byte[] Data);
bool UpdateTexture(ref STexture Texture, ref byte[] Data);
bool UpdateTexture(ref STexture Texture, IntPtr Data);
+2
View File
@@ -135,6 +135,7 @@ namespace Vocaluxe.Screens
}
CLog.StartBenchmark(3, "Load Cover");
_SongLoaderThread.IsBackground = true;
_SongLoaderThread.Start();
_timer.Start();
@@ -306,6 +307,7 @@ namespace Vocaluxe.Screens
_Finished = CVideo.VdFinished(_VideoStream);
STexture tex = new STexture(-1);
tex.height = 0f;
CVideo.VdGetFrame(_VideoStream, ref tex, VideoTime, ref VideoTime);
if (tex.height > 0)