mirror of
https://github.com/aharabada/glitchy-engine-beef.git
synced 2026-09-05 21:01:52 +00:00
Added Backbuffer to Swapchain + RenderCommand API changes
This commit is contained in:
@@ -15,11 +15,6 @@ namespace GlitchyEngine.Renderer
|
||||
{
|
||||
internal ID3D11BlendState* nativeBlendState ~ _?.Release();
|
||||
|
||||
public override void Bind(ColorRGBA blendFactor)
|
||||
{
|
||||
NativeContext.OutputMerger.SetBlendState(nativeBlendState, blendFactor);
|
||||
}
|
||||
|
||||
protected override void PlatformCreateBlendState()
|
||||
{
|
||||
BlendDescription nativeDesc = .Default;
|
||||
|
||||
@@ -41,6 +41,8 @@ namespace GlitchyEngine.Renderer
|
||||
nativeWindowHandle = windowHandle;
|
||||
|
||||
_swapChain = new SwapChain(this);
|
||||
|
||||
s_GraphicsContext = this;
|
||||
}
|
||||
|
||||
public ~this()
|
||||
@@ -112,20 +114,13 @@ namespace GlitchyEngine.Renderer
|
||||
_depthStencilTarget = target?.nativeView;
|
||||
}
|
||||
|
||||
public override void SetRenderTarget(RenderTarget2D renderTarget, int slot = 0)
|
||||
public override void SetRenderTarget(RenderTarget2D renderTarget, int slot, bool setDepthTarget)
|
||||
{
|
||||
if(renderTarget == null || renderTarget.Description.IsSwapchainTarget)
|
||||
{
|
||||
_renderTargets[slot] = _swapChain.nativeBackBufferTarget;
|
||||
}
|
||||
else
|
||||
{
|
||||
_renderTargets[slot] = renderTarget._nativeRenderTargetView;
|
||||
}
|
||||
_renderTargets[slot] = (renderTarget ?? _swapChain.BackBuffer)._nativeRenderTargetView;
|
||||
|
||||
if(slot == 0)
|
||||
if(slot == 0 && setDepthTarget)
|
||||
{
|
||||
SetDepthStencilTarget(renderTarget?.DepthStencilTarget);
|
||||
SetDepthStencilTarget((renderTarget ?? _swapChain.BackBuffer).DepthStencilTarget);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -136,14 +131,7 @@ namespace GlitchyEngine.Renderer
|
||||
|
||||
public override void ClearRenderTarget(RenderTarget2D renderTarget, ColorRGBA color)
|
||||
{
|
||||
if(renderTarget == null)
|
||||
{
|
||||
NativeContext.ClearRenderTargetView(_swapChain.nativeBackBufferTarget, color);
|
||||
}
|
||||
else
|
||||
{
|
||||
NativeContext.ClearRenderTargetView(renderTarget._nativeRenderTargetView, color);
|
||||
}
|
||||
NativeContext.ClearRenderTargetView((renderTarget ?? _swapChain.BackBuffer)._nativeRenderTargetView, color);
|
||||
}
|
||||
|
||||
public override void SetVertexBuffer(uint32 slot, Buffer buffer, uint32 stride, uint32 offset = 0)
|
||||
@@ -168,11 +156,6 @@ namespace GlitchyEngine.Renderer
|
||||
NativeContext.InputAssembler.SetIndexBuffer(buffer.nativeBuffer, indexFormat == .Index32Bit ? .R32_UInt : .R16_UInt, byteOffset);
|
||||
}
|
||||
|
||||
protected override void SetRasterizerStateImpl()
|
||||
{
|
||||
NativeContext.Rasterizer.SetState(_currentRasterizerState.nativeRasterizerState);
|
||||
}
|
||||
|
||||
public override void SetViewports(uint32 viewportsCount, GlitchyEngine.Renderer.Viewport* viewports)
|
||||
{
|
||||
NativeContext.Rasterizer.SetViewports(viewportsCount, (.)viewports);
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
using DirectX.Common;
|
||||
using DirectX.D3D11;
|
||||
using GlitchyEngine.Platform.DX11;
|
||||
using DirectX.DXGI.DXGI1_2;
|
||||
|
||||
using internal GlitchyEngine.Platform.DX11;
|
||||
|
||||
@@ -41,6 +42,18 @@ namespace GlitchyEngine.Renderer
|
||||
|
||||
PlatformCreateTexture();
|
||||
|
||||
if(_description.IsSwapchainTarget)
|
||||
{
|
||||
// TODO: if the engine supports multiple windows it has to support multiple swap chains.
|
||||
|
||||
// kinda dirty...
|
||||
var context = GraphicsContext.Get();
|
||||
|
||||
context.SwapChain.GetBackbuffer(out _nativeTexture);
|
||||
|
||||
CreateViews();
|
||||
}
|
||||
|
||||
if(_description.DepthStencilFormat != .None)
|
||||
{
|
||||
_depthStenilTarget = new DepthStencilTarget(_description.Width, _description.Height, _description.DepthStencilFormat);
|
||||
|
||||
@@ -27,21 +27,67 @@ namespace GlitchyEngine.Renderer
|
||||
|
||||
}
|
||||
|
||||
public override void Clear(RenderTarget2D renderTarget, ColorRGBA clearColor)
|
||||
private mixin RtOrBackbuffer(RenderTarget2D renderTarget)
|
||||
{
|
||||
_context.ClearRenderTarget(renderTarget, clearColor);
|
||||
renderTarget ?? _context.SwapChain.BackBuffer
|
||||
}
|
||||
|
||||
public override void Clear(DepthStencilTarget target, float depthValue, uint8 stencilValue, DepthStencilClearFlag clearFlags)
|
||||
public override void Clear(RenderTarget2D renderTarget, ColorRGBA color)
|
||||
{
|
||||
NativeContext.ClearDepthStencilView(target.nativeView, (.)clearFlags, depthValue, stencilValue);
|
||||
NativeContext.ClearRenderTargetView(RtOrBackbuffer!(renderTarget)._nativeRenderTargetView, color);
|
||||
}
|
||||
|
||||
public override void Clear(RenderTarget2D renderTarget, float depthValue, uint8 stencilValue, DepthStencilClearFlag clearFlags)
|
||||
public override void Clear(DepthStencilTarget target, ClearOptions clearOptions, float depth, uint8 stencil)
|
||||
{
|
||||
NativeContext.ClearDepthStencilView(renderTarget._depthStenilTarget.nativeView, (.)clearFlags, depthValue, stencilValue);
|
||||
if(target == null)
|
||||
return;
|
||||
|
||||
DirectX.D3D11.ClearFlag flags = default;
|
||||
|
||||
if(clearOptions.HasFlag(.Depth))
|
||||
{
|
||||
flags |= .Depth;
|
||||
}
|
||||
|
||||
if(clearOptions.HasFlag(.Stencil))
|
||||
{
|
||||
flags |= .Stencil;
|
||||
}
|
||||
|
||||
NativeContext.ClearDepthStencilView(target.nativeView, flags, depth, stencil);
|
||||
}
|
||||
|
||||
public override void SetRenderTarget(RenderTarget2D renderTarget, int slot, bool setDepthBuffer)
|
||||
{
|
||||
_context.SetRenderTarget(renderTarget, slot, setDepthBuffer);
|
||||
}
|
||||
|
||||
public override void SetDepthStencilTarget(DepthStencilTarget target)
|
||||
{
|
||||
_context.SetDepthStencilTarget(target);
|
||||
}
|
||||
|
||||
public override void BindRenderTargets()
|
||||
{
|
||||
_context.BindRenderTargets();
|
||||
}
|
||||
|
||||
private RasterizerState _currentRasterizerState ~ _?.ReleaseRef();
|
||||
|
||||
public override void SetRasterizerState(RasterizerState rasterizerState)
|
||||
{
|
||||
SetReference!(_currentRasterizerState, rasterizerState);
|
||||
NativeContext.Rasterizer.SetState(_currentRasterizerState.nativeRasterizerState);
|
||||
}
|
||||
|
||||
private BlendState _currentBlendState ~ _?.ReleaseRef();
|
||||
|
||||
public override void SetBlendState(BlendState blendState, ColorRGBA blendFactor)
|
||||
{
|
||||
SetReference!(_currentBlendState, blendState);
|
||||
NativeContext.OutputMerger.SetBlendState(_currentBlendState.nativeBlendState, blendFactor);
|
||||
}
|
||||
|
||||
public override void DrawIndexed(GeometryBinding geometry)
|
||||
{
|
||||
if(geometry.IsIndexed)
|
||||
|
||||
@@ -12,47 +12,9 @@ namespace GlitchyEngine.Renderer
|
||||
{
|
||||
public extension SwapChain
|
||||
{
|
||||
private GraphicsContext _context;
|
||||
|
||||
private bool _changed;
|
||||
|
||||
private uint32 _width, _height;
|
||||
|
||||
internal DirectX.DXGI.IDXGIDevice* nativeDxgiDevice;
|
||||
internal IDXGISwapChain1* nativeSwapChain;
|
||||
|
||||
internal ID3D11RenderTargetView* nativeBackBufferTarget;
|
||||
|
||||
public override uint32 Width
|
||||
{
|
||||
get => _width;
|
||||
|
||||
set
|
||||
{
|
||||
if(_width == value)
|
||||
return;
|
||||
|
||||
_width = value;
|
||||
_changed = true;
|
||||
}
|
||||
}
|
||||
|
||||
public override uint32 Height
|
||||
{
|
||||
get => _height;
|
||||
|
||||
set
|
||||
{
|
||||
if(_height == value)
|
||||
return;
|
||||
|
||||
_height = value;
|
||||
_changed = true;
|
||||
}
|
||||
}
|
||||
|
||||
public override GraphicsContext Context => _context;
|
||||
|
||||
public this(GraphicsContext context)
|
||||
{
|
||||
_context = context;
|
||||
@@ -64,7 +26,6 @@ namespace GlitchyEngine.Renderer
|
||||
{
|
||||
nativeDxgiDevice?.Release();
|
||||
nativeSwapChain?.Release();
|
||||
nativeBackBufferTarget?.Release();
|
||||
}
|
||||
|
||||
void SetResolutionFromWindow()
|
||||
@@ -101,7 +62,8 @@ namespace GlitchyEngine.Renderer
|
||||
|
||||
if(nativeSwapChain != null)
|
||||
{
|
||||
nativeBackBufferTarget.Release();
|
||||
//nativeBackBufferTarget.Release();
|
||||
_backBuffer.ReleaseRef();
|
||||
|
||||
var resizeResult = nativeSwapChain.ResizeBuffers(backBufferCount, _width, _height, backBufferFormat, .None);
|
||||
if(resizeResult.Failed)
|
||||
@@ -122,7 +84,7 @@ namespace GlitchyEngine.Renderer
|
||||
swDesc.Height = _height;
|
||||
swDesc.Format = backBufferFormat;
|
||||
swDesc.SampleDescription = .(1, 0);
|
||||
swDesc.BufferUsage = .RenderTargetOutput;
|
||||
swDesc.BufferUsage = .RenderTargetOutput | .ShaderInput;
|
||||
swDesc.BufferCount = backBufferCount;
|
||||
swDesc.SwapEffect = .FlipDiscard;
|
||||
|
||||
@@ -138,14 +100,20 @@ namespace GlitchyEngine.Renderer
|
||||
factory.Release();
|
||||
}
|
||||
|
||||
nativeSwapChain.GetBuffer<ID3D11Texture2D>(0, let backBuffer);
|
||||
|
||||
RenderTargetViewDescription rtvDesc = .(backBuffer, .Texture2D, backBufferViewFormat);
|
||||
NativeDevice.CreateRenderTargetView(backBuffer, &rtvDesc, &nativeBackBufferTarget);
|
||||
RenderTarget2DDescription desc = .(backBufferFormat, _width, _height);
|
||||
desc.DepthStencilFormat = _depthStencilFormat;
|
||||
desc.IsSwapchainTarget = true;
|
||||
|
||||
// Todo: perhaps just update the render target
|
||||
_backBuffer = new RenderTarget2D(desc);
|
||||
|
||||
_backBufferViewport = GlitchyEngine.Renderer.Viewport(0, 0, _width, _height, 0.0f, 1.0f);
|
||||
}
|
||||
|
||||
backBuffer.Release();
|
||||
internal void GetBackbuffer(out ID3D11Texture2D* texture)
|
||||
{
|
||||
var result = nativeSwapChain.GetBuffer<ID3D11Texture2D>(0, out texture);
|
||||
Log.EngineLogger.Assert(result.Succeeded, "Failed to get backbuffer.");
|
||||
}
|
||||
|
||||
public override void Present()
|
||||
|
||||
Reference in New Issue
Block a user