diff --git a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf index f796393..cb73c2d 100644 --- a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf +++ b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11GraphicsContext.bf @@ -102,7 +102,7 @@ namespace GlitchyEngine.Renderer _depthStencilTarget = target?.nativeView; } - public override void SetRenderTarget(RenderTarget renderTarget, int slot = 0) + public override void SetRenderTarget(RenderTarget2D renderTarget, int slot = 0) { if(renderTarget == null) { @@ -110,7 +110,7 @@ namespace GlitchyEngine.Renderer } else { - Runtime.NotImplemented(); + _renderTargets[slot] = renderTarget.nativeRenderTargetView; } } @@ -119,7 +119,7 @@ namespace GlitchyEngine.Renderer nativeContext.OutputMerger.SetRenderTargets(MaxRTVCount, &_renderTargets, _depthStencilTarget); } - public override void ClearRenderTarget(RenderTarget renderTarget, ColorRGBA color) + public override void ClearRenderTarget(RenderTarget2D renderTarget, ColorRGBA color) { if(renderTarget == null) { @@ -127,7 +127,7 @@ namespace GlitchyEngine.Renderer } else { - Runtime.NotImplemented(); + nativeContext.ClearRenderTargetView(renderTarget.nativeRenderTargetView, color); } } @@ -187,7 +187,7 @@ namespace GlitchyEngine.Renderer for(let entry in shader.Textures) { - _textures[entry.Index] = entry.Texture?.nativeView; + _textures[entry.Index] = entry.Texture?.nativeResourceView; _samplers[entry.Index] = entry.Texture?.SamplerState?.nativeSamplerState; if(entry.Index >= _textureCount) diff --git a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11RenderTarget.bf b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11RenderTarget.bf new file mode 100644 index 0000000..5c4c69a --- /dev/null +++ b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11RenderTarget.bf @@ -0,0 +1,22 @@ +using DirectX.D3D11; + +namespace GlitchyEngine.Renderer +{ + using internal GlitchyEngine.Renderer; + + extension RenderTarget2D + { + protected internal ID3D11RenderTargetView* nativeRenderTargetView ~ _?.Release(); + + protected override void CreateRenderTargetPlatform(Texture2DDesc desc) + { + nativeRenderTargetView?.Release(); + nativeRenderTargetView = null; + + CreateTexturePlatform(desc, true, null, 0); + + var result = _context.nativeDevice.CreateRenderTargetView(nativeTexture, null, &nativeRenderTargetView); + Log.EngineLogger.Assert(result.Succeeded, scope $"Failed to create render target view. Error ({result.Underlying}): {result}"); + } + } +} diff --git a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11RendererAPI.bf b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11RendererAPI.bf index e671217..3b192f4 100644 --- a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11RendererAPI.bf +++ b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11RendererAPI.bf @@ -23,7 +23,7 @@ namespace GlitchyEngine.Renderer } - public override void Clear(RenderTarget renderTarget, ColorRGBA clearColor) + public override void Clear(RenderTarget2D renderTarget, ColorRGBA clearColor) { _context.ClearRenderTarget(renderTarget, clearColor); } diff --git a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11Texture.bf b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11Texture.bf index db6679e..d1c76c5 100644 --- a/GlitchyEngine/src/Platform/DX11/Renderer/Dx11Texture.bf +++ b/GlitchyEngine/src/Platform/DX11/Renderer/Dx11Texture.bf @@ -13,12 +13,12 @@ namespace GlitchyEngine.Renderer { extension Texture { - protected internal ID3D11ShaderResourceView* nativeView ~ _?.Release(); + protected internal ID3D11ShaderResourceView* nativeResourceView ~ _?.Release(); protected override void ImplBind(uint32 slot) { - _context.nativeContext.VertexShader.SetShaderResources(slot, 1, &nativeView); - _context.nativeContext.PixelShader.SetShaderResources(slot, 1, &nativeView); + _context.nativeContext.VertexShader.SetShaderResources(slot, 1, &nativeResourceView); + _context.nativeContext.PixelShader.SetShaderResources(slot, 1, &nativeResourceView); } /** \brief Loads the texture from the specified path. @@ -29,17 +29,17 @@ namespace GlitchyEngine.Renderer protected bool LoadResourcePlatform(StringView path, ref T* texture) where T : ID3D11Resource { ((ID3D11Resource*)texture)?.Release(); - nativeView?.Release(); + nativeResourceView?.Release(); HResult loadResult = DDSTextureLoader.CreateDDSTextureFromFile(_context.nativeDevice, path.ToScopedNativeWChar!(), - (.)&texture, &nativeView); + (.)&texture, &nativeResourceView); if(loadResult.Failed) { Log.EngineLogger.Error($"Failed to load texture \"{path}\". Error({(int)loadResult}): {loadResult}"); ReleaseAndNullify!(texture); - ReleaseAndNullify!(nativeView); + ReleaseAndNullify!(nativeResourceView); return false; } @@ -64,6 +64,7 @@ namespace GlitchyEngine.Renderer desc.SampleDesc = .(1, 0); desc.Usage = (.)Usage; desc.BindFlags = .ShaderResource; + desc.CpuAccessFlags = (.)CpuAccess; desc.MiscFlags = .None; @@ -93,21 +94,10 @@ namespace GlitchyEngine.Renderer nativeTexture.GetDescription(out nativeDesc); } - protected override void CreateTexturePlatform(Texture2DDesc desc, void* data, uint32 linePitch) + protected override void CreateTexturePlatform(Texture2DDesc desc, bool isRenderTarget, void* data, uint32 linePitch) { - nativeTexture?.Release(); - nativeView?.Release(); - - nativeDesc = (NativeTex2DDesc)desc; - SubresourceData resData = .(data, linePitch, 0); - - var result = _context.[Friend]nativeDevice.CreateTexture2D(ref nativeDesc, &resData, &nativeTexture); - - Log.EngineLogger.Assert(result.Succeeded, scope $"Failed to create texture 2D. Error ({result.Underlying}): {result}"); - - result = _context.[Friend]nativeDevice.CreateShaderResourceView(nativeTexture, null, &nativeView); - - Log.EngineLogger.Assert(result.Succeeded, scope $"Failed to create texture view. Error ({result.Underlying}): {result}"); + PrepareTexturePlatform(desc, isRenderTarget); + InternalCreateTexture(data, linePitch, 0); } private void InternalCreateTexture(void* data, uint32 linePitch, uint32 slicePitch) @@ -120,17 +110,21 @@ namespace GlitchyEngine.Renderer var result = _context.nativeDevice.CreateTexture2D(ref nativeDesc, resDataPtr, &nativeTexture); Log.EngineLogger.Assert(result.Succeeded, scope $"Failed to create texture 2D. Error ({result.Underlying}): {result}"); - result = _context.[Friend]nativeDevice.CreateShaderResourceView(nativeTexture, null, &nativeView); + result = _context.[Friend]nativeDevice.CreateShaderResourceView(nativeTexture, null, &nativeResourceView); Log.EngineLogger.Assert(result.Succeeded, scope $"Failed to create texture view. Error ({result.Underlying}): {result}"); } - protected override void PrepareTexturePlatform(Texture2DDesc desc) + protected override void PrepareTexturePlatform(Texture2DDesc desc, bool isRenderTarget) { nativeTexture?.Release(); nativeTexture = null; - nativeView?.Release(); + nativeResourceView?.Release(); + nativeResourceView = null; nativeDesc = (NativeTex2DDesc)desc; + + if(isRenderTarget) + nativeDesc.BindFlags |= .RenderTarget; } // TODO: Update Texture Arrays! diff --git a/GlitchyEngine/src/Renderer/GraphicsContext.bf b/GlitchyEngine/src/Renderer/GraphicsContext.bf index 9297bdd..13014cb 100644 --- a/GlitchyEngine/src/Renderer/GraphicsContext.bf +++ b/GlitchyEngine/src/Renderer/GraphicsContext.bf @@ -3,8 +3,6 @@ using System; namespace GlitchyEngine.Renderer { - public class RenderTarget; - public class GraphicsContext : RefCounted { private RasterizerState _currentRasterizerState; @@ -25,7 +23,7 @@ namespace GlitchyEngine.Renderer * @remarks When @RenderTarget is null the backbuffer will be bound. * @BindRenderTargets has to be called in order to bind the rendertargets. */ - public extern void SetRenderTarget(RenderTarget renderTarget, int slot = 0); + public extern void SetRenderTarget(RenderTarget2D renderTarget, int slot = 0); /** * Binds all. @@ -41,7 +39,7 @@ namespace GlitchyEngine.Renderer * @param color The color to clear the render target with. * @remarks When @renderTarget is null the backbuffer will be cleared. */ - public extern void ClearRenderTarget(RenderTarget renderTarget, ColorRGBA color); + public extern void ClearRenderTarget(RenderTarget2D renderTarget, ColorRGBA color); //public abstract void SetViewport(Viewport viewport); diff --git a/GlitchyEngine/src/Renderer/RenderCommand.bf b/GlitchyEngine/src/Renderer/RenderCommand.bf index bafbb04..c81b071 100644 --- a/GlitchyEngine/src/Renderer/RenderCommand.bf +++ b/GlitchyEngine/src/Renderer/RenderCommand.bf @@ -27,7 +27,7 @@ namespace GlitchyEngine.Renderer } [Inline] - public static void Clear(RenderTarget renderTarget, ColorRGBA color) + public static void Clear(RenderTarget2D renderTarget, ColorRGBA color) { _rendererAPI.Clear(renderTarget, color); } diff --git a/GlitchyEngine/src/Renderer/RenderTarget.bf b/GlitchyEngine/src/Renderer/RenderTarget.bf new file mode 100644 index 0000000..afc40d1 --- /dev/null +++ b/GlitchyEngine/src/Renderer/RenderTarget.bf @@ -0,0 +1,25 @@ +using System; +namespace GlitchyEngine.Renderer +{ + public class RenderTarget2D : Texture2D + { + public this(GraphicsContext context, uint32 width, uint32 height, Format format, uint32 arraySize = 1, uint32 mipLevels = 1, CPUAccessFlags cpuAccess = .None) + : base(context) + { + Texture2DDesc desc; + + desc.Width = width; + desc.Height = height; + desc.Format = format; + desc.ArraySize = arraySize; + desc.MipLevels = mipLevels; + // RenderTargets only can do default (I think) + desc.Usage = .Default; + desc.CpuAccess = cpuAccess; + + CreateRenderTargetPlatform(desc); + } + + protected extern void CreateRenderTargetPlatform(Texture2DDesc desc); + } +} diff --git a/GlitchyEngine/src/Renderer/RendererAPI.bf b/GlitchyEngine/src/Renderer/RendererAPI.bf index af7b46a..54b3830 100644 --- a/GlitchyEngine/src/Renderer/RendererAPI.bf +++ b/GlitchyEngine/src/Renderer/RendererAPI.bf @@ -17,7 +17,7 @@ namespace GlitchyEngine.Renderer public extern void Init(); - public extern void Clear(RenderTarget renderTarget, ColorRGBA clearColor); + public extern void Clear(RenderTarget2D renderTarget, ColorRGBA clearColor); public extern void Clear(DepthStencilTarget target, float depthValue, uint8 stencilValue, DepthStencilClearFlag clearFlags); diff --git a/GlitchyEngine/src/Renderer/Texture.bf b/GlitchyEngine/src/Renderer/Texture.bf index a26f079..3df0afb 100644 --- a/GlitchyEngine/src/Renderer/Texture.bf +++ b/GlitchyEngine/src/Renderer/Texture.bf @@ -78,7 +78,7 @@ namespace GlitchyEngine.Renderer public this(GraphicsContext context, Texture2DDesc desc) : base(context) { - PrepareTexturePlatform(desc); + PrepareTexturePlatform(desc, false); } public void SetData(T* data, uint32 arraySlice = 0, uint32 mipSlice = 0) @@ -98,12 +98,12 @@ namespace GlitchyEngine.Renderer protected extern void LoadTexturePlatform(); - protected extern void CreateTexturePlatform(Texture2DDesc desc, void* data, uint32 linePitch); + protected extern void CreateTexturePlatform(Texture2DDesc desc, bool isRenderTarget, void* data, uint32 linePitch); /** * Prepares the texture so that a call to SetData can successfully upload the data to the gpu. */ - protected extern void PrepareTexturePlatform(Texture2DDesc desc); + protected extern void PrepareTexturePlatform(Texture2DDesc desc, bool isRenderTarget); protected extern Result PlatformSetData(void* data, uint32 elementSize, uint32 destX, uint32 destY, uint32 destWidth, uint32 destHeight, uint32 arraySlice, uint32 mipLevel, GlitchyEngine.Renderer.MapType mapType);