Campari/src/RefreshDevice.cs

74 lines
2.1 KiB
C#
Raw Normal View History

2021-01-14 08:31:03 +00:00
using System;
using System.Collections.Generic;
2021-01-15 01:25:15 +00:00
using System.Runtime.InteropServices;
2021-01-14 08:31:03 +00:00
using System.Text;
using RefreshCS;
namespace Campari
{
public class RefreshDevice : IDisposable
{
public IntPtr Handle { get; }
public bool IsDisposed { get; private set; }
public RefreshDevice(
Refresh.PresentationParameters presentationParameters,
bool debugMode
) {
Handle = Refresh.Refresh_CreateDevice(
2021-01-15 01:25:15 +00:00
ref presentationParameters,
2021-01-14 08:31:03 +00:00
(byte) (debugMode ? 1 : 0)
);
}
2021-01-15 01:25:15 +00:00
/* FIXME: pool this */
public CommandBuffer AcquireCommandBuffer()
{
var commandBufferHandle = Refresh.Refresh_AcquireCommandBuffer(Handle, 0);
return new CommandBuffer(this, commandBufferHandle);
}
public void Submit(CommandBuffer[] commandBuffers)
{
var commandBufferHandle = GCHandle.Alloc(commandBuffers, GCHandleType.Pinned);
Refresh.Refresh_Submit(
Handle,
(uint) commandBuffers.Length,
commandBufferHandle.AddrOfPinnedObject()
);
commandBufferHandle.Free();
}
2021-01-14 08:31:03 +00:00
protected virtual void Dispose(bool disposing)
{
if (!IsDisposed)
{
if (disposing)
{
// TODO: dispose managed state (managed objects)
}
Refresh.Refresh_DestroyDevice(Handle);
IsDisposed = true;
}
}
// TODO: override finalizer only if 'Dispose(bool disposing)' has code to free unmanaged resources
~RefreshDevice()
{
// Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
Dispose(disposing: false);
}
public void Dispose()
{
// Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method
Dispose(disposing: true);
GC.SuppressFinalize(this);
}
}
}