From 0461669e1395a70720f4c9e274a80c315d165f3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20L=C3=BCbe=C3=9F?= Date: Sun, 21 Feb 2021 14:45:50 +0100 Subject: [PATCH] Added rudimentary DepthStencilTarget --- .../DX11/Renderer/Dx11DepthStencilTarget.bf | 38 +++++++++++++++++++ .../DX11/Renderer/Dx11GraphicsContext.bf | 10 ++++- .../Platform/DX11/Renderer/Dx11RendererAPI.bf | 7 ++++ .../src/Renderer/DepthStencilTarget.bf | 29 ++++++++++++++ GlitchyEngine/src/Renderer/RenderCommand.bf | 14 +++++++ GlitchyEngine/src/Renderer/RendererAPI.bf | 2 + 6 files changed, 98 insertions(+), 2 deletions(-) create mode 100644 GlitchyEngine/src/Platform/DX11/Renderer/Dx11DepthStencilTarget.bf create mode 100644 GlitchyEngine/src/Renderer/DepthStencilTarget.bf diff --git a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11DepthStencilTarget.bf b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11DepthStencilTarget.bf new file mode 100644 index 0000000..fa262c0 --- /dev/null +++ b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11DepthStencilTarget.bf @@ -0,0 +1,38 @@ +using DirectX.D3D11; +using internal GlitchyEngine.Renderer; + +namespace GlitchyEngine.Renderer +{ + extension DepthStencilTarget + { + internal ID3D11DepthStencilView* nativeView ~ _?.Release(); + + protected override void PlatformCreate() + { + Texture2DDescription desc = .(); + desc.Format = .D32_Float; + desc.ArraySize = 1; + desc.BindFlags = .DepthStencil; + desc.Width = _width; + desc.Height = _height; + desc.SampleDesc = .(1, 0); + + ID3D11Texture2D* tex = ?; + _context.nativeDevice.CreateTexture2D(ref desc, null, &tex); + + _context.nativeDevice.CreateDepthStencilView(tex, null, &nativeView); + + tex.Release(); + } + + public override void Bind() + { + _context.SetDepthStencilTarget(this); + } + + public override void Clear(float depthValue, uint8 stencilValue, DepthStencilClearFlag clearFlags) + { + _context.nativeContext.ClearDepthStencilView(nativeView, (.)clearFlags, depthValue, stencilValue); + } + } +} diff --git a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf index 97990c6..b19cbc5 100644 --- a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf +++ b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf @@ -92,8 +92,14 @@ namespace GlitchyEngine.Renderer } - + + private ID3D11DepthStencilView* _depthStencilTarget; private ID3D11RenderTargetView*[MaxRTVCount] _renderTargets; + + internal void SetDepthStencilTarget(DepthStencilTarget target) + { + _depthStencilTarget = target?.nativeView; + } public override void SetRenderTarget(RenderTarget renderTarget, int slot = 0) { @@ -109,7 +115,7 @@ namespace GlitchyEngine.Renderer public override void BindRenderTargets() { - nativeContext.OutputMerger.SetRenderTargets(MaxRTVCount, &_renderTargets, null); + nativeContext.OutputMerger.SetRenderTargets(MaxRTVCount, &_renderTargets, _depthStencilTarget); } public override void ClearRenderTarget(RenderTarget renderTarget, ColorRGBA color) diff --git a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11RendererAPI.bf b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11RendererAPI.bf index bdaa2cd..814c705 100644 --- a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11RendererAPI.bf +++ b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11RendererAPI.bf @@ -1,5 +1,7 @@ using GlitchyEngine.Math; +using internal GlitchyEngine.Renderer; + namespace GlitchyEngine.Renderer { extension RendererAPI @@ -24,6 +26,11 @@ namespace GlitchyEngine.Renderer _context.ClearRenderTarget(renderTarget, clearColor); } + public override void Clear(DepthStencilTarget target, float depthValue, uint8 stencilValue, DepthStencilClearFlag clearFlags) + { + _context.nativeContext.ClearDepthStencilView(target.nativeView, (.)clearFlags, depthValue, stencilValue); + } + public override void DrawIndexed(GeometryBinding geometry) { _context.DrawIndexed(geometry.IndexCount, geometry.IndexByteOffset, 0); diff --git a/GlitchyEngine/src/Renderer/DepthStencilTarget.bf b/GlitchyEngine/src/Renderer/DepthStencilTarget.bf new file mode 100644 index 0000000..9497b0b --- /dev/null +++ b/GlitchyEngine/src/Renderer/DepthStencilTarget.bf @@ -0,0 +1,29 @@ +using System; +namespace GlitchyEngine.Renderer +{ + // TODO: add all features. + public class DepthStencilTarget : RefCounted + { + protected internal GraphicsContext _context ~ _?.ReleaseRef(); + + protected uint32 _width, _height; + + public uint32 Width => _width; + public uint32 Height => _height; + + public this(GraphicsContext context, uint32 width, uint32 height) + { + _context = context..AddRef(); + _width = width; + _height = height; + + PlatformCreate(); + } + + protected extern void PlatformCreate(); + + public extern void Bind(); + + public extern void Clear(float depthValue, uint8 stencilValue, DepthStencilClearFlag clearFlags); + } +} diff --git a/GlitchyEngine/src/Renderer/RenderCommand.bf b/GlitchyEngine/src/Renderer/RenderCommand.bf index f7569fd..aa91ca3 100644 --- a/GlitchyEngine/src/Renderer/RenderCommand.bf +++ b/GlitchyEngine/src/Renderer/RenderCommand.bf @@ -3,6 +3,13 @@ using GlitchyEngine.Math; namespace GlitchyEngine.Renderer { + public enum DepthStencilClearFlag + { + None = 0, + Depth = 1, + Stencil = 2 + } + public static class RenderCommand { private static RendererAPI _rendererAPI; @@ -24,6 +31,13 @@ namespace GlitchyEngine.Renderer { _rendererAPI.Clear(renderTarget, color); } + + + [Inline] + public static void Clear(DepthStencilTarget target, float depthValue, uint8 stencilValue, DepthStencilClearFlag clearFlags) + { + _rendererAPI.Clear(target, depthValue, stencilValue, clearFlags); + } [Inline] public static void DrawIndexed(GeometryBinding geometry) diff --git a/GlitchyEngine/src/Renderer/RendererAPI.bf b/GlitchyEngine/src/Renderer/RendererAPI.bf index 8c1a03b..5c328cc 100644 --- a/GlitchyEngine/src/Renderer/RendererAPI.bf +++ b/GlitchyEngine/src/Renderer/RendererAPI.bf @@ -19,6 +19,8 @@ namespace GlitchyEngine.Renderer public extern void Clear(RenderTarget renderTarget, ColorRGBA clearColor); + public extern void Clear(DepthStencilTarget target, float depthValue, uint8 stencilValue, DepthStencilClearFlag clearFlags); + public extern void DrawIndexed(GeometryBinding geometry); } }