added the ability to reinterpret Textures
This commit is contained in:
parent
e777e9d9ff
commit
2eb8733fa5
3 changed files with 59 additions and 1 deletions
|
@ -9,6 +9,8 @@ namespace Ryujinx.Graphics.Gal
|
||||||
|
|
||||||
void Create(long Key, byte[] Data, GalImage Image);
|
void Create(long Key, byte[] Data, GalImage Image);
|
||||||
|
|
||||||
|
void Reinterpret(long Key, GalImage NewImage);
|
||||||
|
|
||||||
bool TryGetImage(long Key, out GalImage Image);
|
bool TryGetImage(long Key, out GalImage Image);
|
||||||
|
|
||||||
void Bind(long Key, int Index, GalImage Image);
|
void Bind(long Key, int Index, GalImage Image);
|
||||||
|
|
|
@ -132,6 +132,62 @@ namespace Ryujinx.Graphics.Gal.OpenGL
|
||||||
return Format > GalImageFormat.Astc2DStart && Format < GalImageFormat.Astc2DEnd;
|
return Format > GalImageFormat.Astc2DStart && Format < GalImageFormat.Astc2DEnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Reinterpret(long Key, GalImage NewImage)
|
||||||
|
{
|
||||||
|
if (!TryGetImage(Key, out GalImage OldImage))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NewImage.Width == OldImage.Width &&
|
||||||
|
NewImage.Height == OldImage.Height &&
|
||||||
|
NewImage.Format == OldImage.Format)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//The buffer should be large enough to hold the largest texture.
|
||||||
|
int BufferSize = Math.Max(ImageUtils.GetSize(OldImage),
|
||||||
|
ImageUtils.GetSize(NewImage));
|
||||||
|
|
||||||
|
if (!PboCache.TryReuseValue(0, BufferSize, out int Handle))
|
||||||
|
{
|
||||||
|
Handle = GL.GenBuffer();
|
||||||
|
|
||||||
|
GL.BindBuffer(BufferTarget.PixelPackBuffer, Handle);
|
||||||
|
|
||||||
|
GL.BufferData(BufferTarget.PixelPackBuffer, BufferSize, IntPtr.Zero, BufferUsageHint.StreamCopy);
|
||||||
|
|
||||||
|
PboCache.AddOrUpdate(0, BufferSize, Handle, BufferSize);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GL.BindBuffer(BufferTarget.PixelPackBuffer, Handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!TryGetImageHandler(Key, out ImageHandler CachedImage))
|
||||||
|
{
|
||||||
|
throw new ArgumentException(nameof(Key));
|
||||||
|
}
|
||||||
|
|
||||||
|
(_, PixelFormat Format, PixelType Type) = OGLEnumConverter.GetImageFormat(CachedImage.Format);
|
||||||
|
|
||||||
|
GL.BindTexture(TextureTarget.Texture2D, CachedImage.Handle);
|
||||||
|
|
||||||
|
GL.GetTexImage(TextureTarget.Texture2D, 0, Format, Type, IntPtr.Zero);
|
||||||
|
|
||||||
|
GL.BindBuffer(BufferTarget.PixelPackBuffer, 0);
|
||||||
|
GL.BindBuffer(BufferTarget.PixelUnpackBuffer, Handle);
|
||||||
|
|
||||||
|
GL.PixelStore(PixelStoreParameter.UnpackRowLength, OldImage.Width);
|
||||||
|
|
||||||
|
CreateFromPboOrEmpty(Key, ImageUtils.GetSize(NewImage), NewImage);
|
||||||
|
|
||||||
|
GL.PixelStore(PixelStoreParameter.UnpackRowLength, 0);
|
||||||
|
|
||||||
|
GL.BindBuffer(BufferTarget.PixelUnpackBuffer, 0);
|
||||||
|
}
|
||||||
|
|
||||||
public bool TryGetImage(long Key, out GalImage Image)
|
public bool TryGetImage(long Key, out GalImage Image)
|
||||||
{
|
{
|
||||||
if (TextureCache.TryGetValue(Key, out ImageHandler CachedImage))
|
if (TextureCache.TryGetValue(Key, out ImageHandler CachedImage))
|
||||||
|
|
|
@ -104,7 +104,7 @@ namespace Ryujinx.Graphics
|
||||||
{
|
{
|
||||||
if (Gpu.Renderer.Texture.TryGetImage(Position, out GalImage CachedImage) && CachedImage.SizeMatches(NewImage))
|
if (Gpu.Renderer.Texture.TryGetImage(Position, out GalImage CachedImage) && CachedImage.SizeMatches(NewImage))
|
||||||
{
|
{
|
||||||
Gpu.Renderer.RenderTarget.Reinterpret(Position, NewImage);
|
Gpu.Renderer.Texture.Reinterpret(Position, NewImage);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue