4using SharpDX.Direct3D11;
6using Silk.NET.OpenGLES;
8using System.Runtime.InteropServices;
10using SixLabors.ImageSharp;
11using SixLabors.ImageSharp.PixelFormats;
19 public RenderTargetView m_colorTextureView;
21 public SharpDX.Direct3D11.Texture2D m_depthTexture;
23 public DepthStencilView m_depthTextureView;
56 public void GetData<T>(T[] target,
int targetStartIndex,
Rectangle sourceRectangle) where T : unmanaged {
58 GCHandle gCHandle = GCHandle.Alloc(target, GCHandleType.Pinned);
61 GetDataInternal(gCHandle.AddrOfPinnedObject() + targetStartIndex * num, sourceRectangle);
71 image.DangerousTryGetSinglePixelMemory(out Memory<Rgba32> memory);
73 return new Image(image);
84 Texture2DDescription texture2DDescription =
new() {
86 BindFlags = BindFlags.None,
87 CpuAccessFlags = CpuAccessFlags.Read,
90 OptionFlags = ResourceOptionFlags.None,
91 SampleDescription =
new SampleDescription(1, 0),
92 Usage = ResourceUsage.Staging,
94 Height = sourceRectangle.Height
96 using (SharpDX.Direct3D11.Texture2D texture2D =
new(
DXWrapper.
Device, texture2DDescription)) {
97 ResourceRegion resourceRegion =
new(
101 sourceRectangle.Left + sourceRectangle.
Width,
102 sourceRectangle.Top + sourceRectangle.
Height,
106 DataStream dataStream =
null;
108 DataBox dataBox =
DXWrapper.
Context.MapSubresource(texture2D, 0, MapMode.Read, SharpDX.Direct3D11.MapFlags.None, out dataStream);
110 for (
int i = 0; i < sourceRectangle.
Height; i++) {
111 dataStream.Position = i * dataBox.RowPitch;
112 dataStream.Read(target, num * size, sourceRectangle.
Width * size);
113 num += sourceRectangle.
Width;
117 dataStream?.Dispose();
124 sourceRectangle.
Left,
126 (uint)sourceRectangle.
Width,
127 (uint)sourceRectangle.
Height,
129 PixelType.UnsignedByte,
141 GLWrapper.
GL.GenerateMipmap(TextureTarget.Texture2D);
151 base.HandleDeviceReset();
160 Texture2DDescription texture2DDescription =
new() {
162 BindFlags = BindFlags.DepthStencil,
163 CpuAccessFlags = CpuAccessFlags.None,
166 OptionFlags = ResourceOptionFlags.None,
167 SampleDescription =
new SampleDescription(1, 0),
168 Usage = ResourceUsage.Default,
172 m_depthTexture =
new SharpDX.Direct3D11.Texture2D(
DXWrapper.
Device, texture2DDescription);
173 m_depthTextureView =
new DepthStencilView(
DXWrapper.
Device, m_depthTexture);
176 GLWrapper.
GL.GenFramebuffers(1u, out uint frameBuffer);
180 FramebufferTarget.Framebuffer,
181 FramebufferAttachment.ColorAttachment0,
182 TextureTarget.Texture2D,
187 GLWrapper.
GL.GenRenderbuffers(1u, out uint depthBuffer);
189 GLWrapper.
GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, depthBuffer);
191 RenderbufferTarget.Renderbuffer,
197 FramebufferTarget.Framebuffer,
198 FramebufferAttachment.DepthAttachment,
199 RenderbufferTarget.Renderbuffer,
203 FramebufferTarget.Framebuffer,
204 FramebufferAttachment.StencilAttachment,
205 RenderbufferTarget.Renderbuffer,
211 FramebufferTarget.Framebuffer,
212 FramebufferAttachment.DepthAttachment,
213 RenderbufferTarget.Renderbuffer,
217 FramebufferTarget.Framebuffer,
218 FramebufferAttachment.StencilAttachment,
219 RenderbufferTarget.Renderbuffer,
223 GLEnum framebufferErrorCode =
GLWrapper.
GL.CheckFramebufferStatus(FramebufferTarget.Framebuffer);
224 if (framebufferErrorCode != GLEnum.FramebufferComplete) {
225 throw new InvalidOperationException($
"Error creating framebuffer ({framebufferErrorCode.ToString()}).");
232 Utilities.Dispose(ref m_colorTextureView);
234 Utilities.Dispose(ref m_depthTextureView);
238 GLWrapper.
GL.DeleteRenderbuffers(1, in depthBuffer);
251 for (
int i = 0; i < array.Length; i++) {
254 renderTarget2D.
SetData(0, array);
255 return renderTarget2D;
261 if (mipLevelsCount > 1) {
266 GLWrapper.
GL.GenerateMipmap(TextureTarget.Texture2D);
269 return renderTarget2D;
272 public new static RenderTarget2D Load(Stream stream,
bool premultiplyAlpha =
false,
int mipLevelsCount = 1) {
274 if (premultiplyAlpha) {
277 return Load(image, mipLevelsCount);
280 public new static RenderTarget2D Load(
string fileName,
bool premultiplyAlpha =
false,
int mipLevelsCount = 1) {
282 return Load(stream, premultiplyAlpha, mipLevelsCount);
287 throw new InvalidOperationException(
"Unsupported color format.");
294 throw new InvalidOperationException(
"Unsupported color format.");
301 Save(renderTarget, stream, format, saveAlpha);
317 ArgumentNullException.ThrowIfNull(target);
319 throw new ArgumentException(
"Target array element size is larger than pixel size.");
321 if (size % num != 0) {
322 throw new ArgumentException(
"Pixel size is not an integer multiple of target array element size.");
324 if (sourceRectangle.Left < 0
325 || sourceRectangle.Width <= 0
326 || sourceRectangle.Top < 0
327 || sourceRectangle.Height <= 0
328 || sourceRectangle.Left + sourceRectangle.Width >
Width
329 || sourceRectangle.Top + sourceRectangle.Height >
Height) {
330 throw new ArgumentOutOfRangeException(nameof(sourceRectangle));
332 if (targetStartIndex < 0
333 || targetStartIndex >= target.Length) {
334 throw new ArgumentOutOfRangeException(nameof(targetStartIndex));
336 if ((target.Length - targetStartIndex) * num < sourceRectangle.Width * sourceRectangle.Height * size) {
337 throw new InvalidOperationException(
"Not enough space in target array.");
343 if (target == IntPtr.Zero) {
344 throw new ArgumentNullException(nameof(target));
346 if (sourceRectangle.
Left < 0
347 || sourceRectangle.
Width <= 0
348 || sourceRectangle.
Top < 0
349 || sourceRectangle.
Height <= 0
352 throw new ArgumentOutOfRangeException(nameof(sourceRectangle));
357 if (renderTarget1 ==
null) {
358 throw new ArgumentNullException(nameof(renderTarget1));
360 if (renderTarget2 ==
null) {
361 throw new ArgumentNullException(nameof(renderTarget2));
static DeviceContext2 Context
static Format TranslateDepthFormat(DepthFormat depthFormat)
static Format TranslateColorFormat(ColorFormat colorFormat)
static void DeleteFramebuffer(int framebuffer)
static void BindFramebuffer(int framebuffer)
static void BindTexture(TextureTarget target, int texture, bool forceBind)
static InternalFormat TranslateDepthFormat(DepthFormat depthFormat)
static void VerifyParametersSwap(RenderTarget2D renderTarget1, RenderTarget2D renderTarget2)
static void Save(RenderTarget2D renderTarget, string fileName, ImageFileFormat format, bool saveAlpha)
static void Save(RenderTarget2D renderTarget, Stream stream, ImageFileFormat format, bool saveAlpha)
void InitializeRenderTarget2D(int width, int height, int mipLevelsCount, ColorFormat colorFormat, DepthFormat depthFormat)
void GetData(nint target, Rectangle sourceRectangle)
unsafe Image GetData(Rectangle sourceRectangle)
static new RenderTarget2D Load(Color color, int width, int height)
override void HandleDeviceReset()
static Image Save(RenderTarget2D renderTarget)
override int GetGpuMemoryUsage()
void VerifyParametersGetData< T >(T[] target, int targetStartIndex, Rectangle sourceRectangle)
void VerifyParametersGetData(nint target, Rectangle sourceRectangle)
DepthFormat m_depthFormat
override void HandleDeviceLost()
static new RenderTarget2D Load(string fileName, bool premultiplyAlpha=false, int mipLevelsCount=1)
void DeleteRenderTarget()
static new RenderTarget2D Load(Image image, int mipLevelsCount=1)
void GetDataInternal(nint target, Rectangle sourceRectangle)
static new RenderTarget2D Load(Stream stream, bool premultiplyAlpha=false, int mipLevelsCount=1)
RenderTarget2D(int width, int height, int mipLevelsCount, ColorFormat colorFormat, DepthFormat depthFormat)
void AllocateRenderTarget()
void GetData< T >(T[] target, int targetStartIndex, Rectangle sourceRectangle)
virtual void SetData(int mipLevel, nint source)
static Stream OpenFile(string path, OpenFileMode openFileMode)